Time of Update: 2018-12-07
最近在公司裡嘗試著組織一些技術talk,活躍一下氣氛。已經做了兩期,一期是《C# 3.0新特性》,二期是《Write clean code》,反響還不錯。
Time of Update: 2018-12-07
這麼多人討論我的動機.動機甚至超過了我文中實際內容的討論.無語.我的動機很簡單,就是研究學習,發現問題指出問題.代碼開源了就是給人看的, 拿實習生說,我招過實習生,如果產品代碼這種樣子review我是不會讓過的. 至於讀代碼是應當帶著批判還是學習的眼光,我認為都應該有,不可偏廢.我曾經讀過一些Nunit, Dlinq, JDK, Rails, Spring, Junit, DBUnit, Ibatis, tomcat,
Time of Update: 2018-12-07
一. 用更多的搜尋字詞更準確的表達目的 搜qq,排名靠前的都是聊天工具qq,但如果你關心的是奇瑞的汽車qq呢,那就搜 奇瑞 汽車 qq, Google會預設這幾個搜尋字詞之間是and的關係。你告訴google的越具體,google給你的結果越準確。 二. 用-排除不需要的結果 我們搜尋的詞彙通常都具有二義性或多義性。例如vc, 是Visual C++, Venture Captital還是Vitamin C? 搜尋vc,可能出來的結果是這些內容的混合體,但如果你只關心Visual
Time of Update: 2018-12-07
下面來看ReentrantLock.unlock,嘗試在當前鎖的鎖定計數即state值上減1,而lock每次把鎖定計數加1,這也是為什麼lock和unlock必須成對出現,否則鎖定計數就不能正常恢複到0,其它線程就不能嘗試擷取鎖ReentrantLock.unlock()Code highlighting produced by Actipro CodeHighlighter
Time of Update: 2018-12-07
學會用junit在eclipse下跑測試了,下一步就是產生測試覆蓋報告。java和.net最大的不同就是開源的東西太多,好處是選擇多,出問題了還能自己動手改。壞處就是沒有vs這種傻瓜化的什麼都整合但不見得好用的東西,很多工具都要自己摸索配置。 產生測試覆蓋報告,我首先想到的是找個eclipse外掛程式能做這事就好了。但coverlipse在Eclipse Galileo上裝上了用不起來,無奈,轉向coberbura。幾經周折,終於產生測試覆蓋報告了。記載如下,以備日後參考。 1 去http:
Time of Update: 2018-12-07
部落格園的Jeffrey Zhao的一個文章裡列出了一段有問題的代碼。 群眾的眼睛是雪亮的。區區半天,就發現了這麼多問題。 注釋和代碼不匹配 參數未檢查 浮點數精度問題 返回對象可能為原對象也可能為建立對象的不確定性 極端情況下可能產生映像寬高為零的異常。這裡是老趙的總結
Time of Update: 2018-12-07
原作者 Robert C. Martin 原文:http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf 引用頁:http://www.objectmentor.com/resources/publishedArticles.html 二:物件導向設計原則 1 The Open-Close Principle(開閉原則) A module should be open for extension
Time of Update: 2018-12-07
一個新公司,尋一名技術負責人。待遇優厚。要求如下:1 有責任心,做事認真負責,敢於接受挑戰。2 有很強的解決問題能力。3 有大型軟體公司的項目經驗,熟悉軟體開發週期和品質控制。4 有專案管理經驗5 熟悉C/C++6 熟悉資料庫技術。 有意者請附詳細簡曆,回郵箱pengfeng2000 a###t gmail.com 。
Time of Update: 2018-12-07
比沒有文檔更糟糕的是什嗎?文檔過時。沒有文檔你會自己試圖通過其它途徑把事情搞清楚,而過時的文檔則會誤導你。如何才能保持文檔與代碼/資料庫結構同步?寄希望於開發人員自己去維護文檔?估計難度僅小於中國難豬拿世界盃。怎麼辦?自動產生文檔。程式員寫軟體不是為了幫使用者提高工作效率,當然也能用工具解決自己的問題。SchemaSpy就是這樣一個能從資料庫Schema自動產生文檔的工具。 部落格園上有篇文章《用SchemaSpy製作資料庫文檔》講的很仔細,我就不贅述了。下面講一講我使用中遇到的幾個問題:
Time of Update: 2018-12-07
ReentrantLock.lockInterruptibly允許在等待時由其它線程調用等待線程的Thread.interrupt方法來中斷等待線程的等待而直接返回,這時不用擷取鎖,而會拋出一個InterruptedException。而ReentrantLock.lock方法不允許Thread.interrupt中斷,即使檢測到Thread.isInterrupted,一樣會繼續嘗試擷取鎖,失敗則繼續休眠。只是在最後擷取鎖成功後再把當前線程置為interrupted狀態。那lockInterr
Time of Update: 2018-12-07
msi log清理工具http://download.microsoft.com/download/e/9/d/e9d80355-7ab4-45b8-80e8-983a48d5e1bd/msicuu2.exe 批處理中用系統內建的timeout小程式實現延時 要對設定檔中的某些變數統一配置的話可以將這些變數寫成環境變數的格式connectionString="Server=%dbserver%;user
Time of Update: 2018-12-07
最近在看java,第一次認真的學一門電腦語言。原來很懵懂,不知道一門語言有啥好學的,只要知道if,else,for,switch,瞭解一些API,拿起來能寫程式就成了,湊合著也能糊弄人。 過了而立之年,才知道要學習一門語言,象這樣是不行的,必須深入瞭解語言底層實現,文法痛點,記憶體模型,執行緒模式,常用架構,常用應用等才算是學懂了。
Time of Update: 2018-12-07
微軟亞洲研究院的鄒欣老師招實習生,說找到http://libra.msra.cn 上三個bug者即可考慮。抱著對MSRA的無限嚮往,開始了找bug之旅.下面是我找出的一些問題。其中一些也許不是嚴格bug,但或許可以有所改進。 Bug1: http://libra.msra.cn/Author/2275176.aspx 這個作者資訊太out了 Bug2: 搜尋某個關鍵詞如Harry
Time of Update: 2018-12-07
Effective C#中看來的。 只管理記憶體,非託管資源,如檔案控制代碼,GDI資源,資料庫連接等還需要使用者去管理 循環參考,網狀結構等的實現會變得簡單。GC的標誌也壓縮演算法能有效檢測這些關係,並將不再被引用的網狀結構整體刪除。 GC通過從程式的根對象開始遍曆來檢測一個對象是否可被其他對象訪問,而不是用類似於COM中的引用計數方法。 GC在一個獨立的線程中運行來刪除不再被引用的記憶體 GC每次運行時會壓縮託管堆
Time of Update: 2018-12-07
原作者 Robert C. Martin 原文:http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf 引用頁:http://www.objectmentor.com/resources/publishedArticles.html 4 Interface Segregation Principle(ISP,介面隔離原則)Many client specific interfaces are
Time of Update: 2018-12-07
這兩天因為要調用另外一個項目組的WebService,去讀了他們的實現。不讀罷了,一讀發現一堆問題: SVN check-in沒有注釋 參數沒有檢查 調用函數的傳回值沒有檢查 邏輯錯誤很驚訝.因為專案經理是我挖過來的,對他的能力我有信心,有他帶著不至於出現這種低級錯誤.於是和專案經理溝通,指出這些問題.他說這些問題其實他也發現了,只是不想給下屬太多壓力,想讓他們專心把手頭的項目先做完,下一步再強調規範. 我覺得這裡混淆了一個問題:品質上的嚴格要求不等於給壓力.什麼是增加工作壓力?
Time of Update: 2018-12-07
做程式開發的人都知道版本控制的重要性, 代碼的管理好說,TFS/SVN/VSS/CVS,哪個都能用。但涉及到資料庫的版本控制,就不是太好做的。有的team是定期把資料庫的備份放到伺服器上,但一來Database Backup太大,而來二進位的備份檔案沒有簡單的diff工具來比較變化。一個比較好的實踐是把資料庫的架構用指令碼來表示。相關的討論可以Google之,前面幾篇文章,如 Coding Horror: Is Your Database Under Version Control?,
Time of Update: 2018-12-07
使用robocopy時不小心把目標檔案夾放在源檔案夾的子目錄下,然後…...就出現了恐怖的遞迴,建立了一個超級長的檔案夾。嘗試著刪除,資源管理員,或者命令列下rd,del都用了,還是搞不定。最終想到解鈴還需系鈴人,試著建立了一個空目錄t1,然後Robocopy /MIR t1 longlongpath在一陣瘋狂滾屏之後,longlongpath變成了一個空目錄,cool! 注: MIR會在目標檔案夾下建立和源檔案夾完全一樣的目錄結構,如果某個子檔案夾僅在目標檔案夾下存在則會被刪除。
Time of Update: 2018-12-07
大名鼎鼎的BoundsChecker和SoftIce的作者之一,現在是IT諮詢公司Wintellect的創始人之一,被公司請來給我們做Debug的培訓。很好的一個人,培訓前他在教室裡閑逛,發現我筆記本電源沒有插好,彎下腰去幫俺給接好了。受寵若驚啊。閑聊了幾句,他說俺們這教室太老了,電源太少了,不是為筆記本設計的。俺告訴他明年下半年我們就要搬到新的辦公室了,僅僅一英裡以西,他下次過來就可以去我們的新樓了。他很高興,告訴俺他大概每兩年左右會來中國/印度一次,因為公司每年都會有很多新員工需要培訓。但
Time of Update: 2018-12-07
使用到的軟體 ruby186-27_rc2.exe mysql-5.1.44-win32.msi libmysql.dll 安裝和配置rails不是一帆風順,為了不再重複痛苦經曆,把安裝過程寫到批處理裡再發到部落格上似乎是個不錯的做法 call gem update --systems call gem install rails call gem install mysql copy libmysql.dll d:\ruby\bin 關於最後一句命令的解釋,參見這篇文章。