星期三, 4月 19, 2006

typo

今天發現最近常把thunderbird打錯為thunbird,英文叫typo。雖然用谷歌查詢時會顯示 您是不是要查: thunderbird 但是同時也發現還真的不少人和我一樣typo。

讓我想到手腦不協調的一種假設,大腦同時送訊息給左右手,因為負責左手的部份速度太慢,產生race condition,還沒輸入der這3個字時又收到輸入bird,因此就變成thunbird。

早期的Win95,有遇到CPU太快而發生錯誤,必須下載一個修正程式。這表示我的腦子比手快?

最近看到IE7應該會加入防止因typo而連結到錯誤網站的功能,對我而言希望Firefox也加入這種功能。

重點是,有看到我又typo時,請告訴我吧。

星期日, 4月 16, 2006

銀子彈的迷思

前兩天在公車上遇到學弟,看到他買了一本蔡先生翻譯的書,在介紹一些新時代的程式語言。
當中有最近火熱的Ruby。我最近剛好有看到許多Blog在介紹RubyOnRails,所以很快的翻了一下。回來後稍微看了一下RubyOnRails,感謝上仍然是以script為主的程式語言。
我們已經有PerlPythonPHP這些script language,再出現Ruby也不能改變什麼。我學習超過十種程式語言,相信我這間公司不可能有人會比我更多種PL;但這是沒用的,良好的分析和架構,嚴謹的程式寫作才是好程式的關鍵;每天在想用很炫的Design Pattern卻不懂什麼叫Test的人是寫不出好程式的。我花了半年左右讓自己習慣JUnit,難道我是白痴?

RubyOnRails確實很炫,但要熟悉那些API做到像他Demo的15分鐘寫一個Blog出來,背後是多少的學習時間和API的熟悉度呢?同樣的,若有人用Java寫了一套Framework出來,要15分鐘做出一個像他那樣的Blog也不是難事。若考慮分層、Cache和Access Control等等,那樣的Blog根本不堪用呀~

PerlPython開檔案比起Java、C#方便太多,但背後付出的代價是效率。最近有稍微再摸一下C++,感覺更是明顯。程式語言沒有所謂的銀子彈,只有Syntax Sugar,還是學好演算法、資料結構和系統分析比較重要吧!

星期一, 4月 10, 2006

.Net 2.0 CLR 相容性

最近,同事在測試Crystal Reports的網頁是否能升級成asp.net 2.0,結果卻相當令人失望,因為.net 2.0的CLR並不能向下相容.net 1.1的程式,所以必須買新版的Crystal Reports才能再試著改版,這其中若有API的變化還要另外考量。

在GotDotNet的 Compatibility Considerations and Version Changes裏有提到:
"Backward compatibility means an application written for the .NET Framework version 1.0 can execute on version 1.1. The .NET Framework provides the highest degree of support for backward compatibility. Most applications that work on the current version of the .NET Framework will work on the next version of the .NET Framework. "

所以1.1版應該是向下相容1.0版的程式,但對2.0版與1.1版的相容性完全查不到,只有beta版的相容性列表。而根據我實測的結果,.net 1.1的程式在.net 2.0的CLR執行時,若沒有指定CLR版本是可以執行的。

但有指定版本則會去找.net 1.1的CLR來執行,若找不到,則會跳出畫面顯示找不到1.1版的CLR。
所以一般的exe檔確實有向下相容,但問題還在後面;我另外有個舊的dll則不能執行,因為那個dll有指定版本。

而Crystal Reports這些商用軟體或元件都有把RunTime版本寫死在dll裏,自然是沒辦法使用;就算沒有指定,要把所有相關的dll找出來,放在bin裏手動reference也是很痛苦的事。這種時候,就覺得Java好很多...

星期三, 4月 05, 2006

UML工具

雖然說UML 2.0出來很久,但我還是只會幾種UML 1.3的舊圖。
今天想看看ArgoUML有沒有新版本,順便找找有沒有其他的工具,結果發現Objects by Design
因此才知道,Java發展十年,果然不同凡響,工具都非常多;像Fujaba這個德國大學所開發的工具,雖然說使用上不如ArgoUML那麼方便,但功能相當強,而且也是OpenSource。
另外有兩個輕量級的工具VioletUMLet都可以做為Eclipse的Plugin或stand alone使用。

我偏好OpenSource的工具,像EclipseUML、Poseidon的CE版其實也很不錯,只是沒有Open就不爽用。

比較起來,.Net的免費工具就真的少很多,畢竟平台侷限在Windows,發展時間也短。

個人是覺得Java會繼續生存下去,無論.Net再怎麼好;畢竟現有環境太成熟,這些資源沒有人願意放棄的,就像Fortran到現在還出了Fortran 2003 。Orz

星期一, 4月 03, 2006

.Net 的Unit Test

在Java陣營的Unit Test當然首推JUnit,當然也有像TestNG這些,TestNG就是使用JDK 5 Annotations,現在JUnit也有,所以在選擇framework時不會傷腦筋。

而在.Net這邊,最早有csUnitNUnit兩個,後來似乎是NUnit勝出,畢竟叫csUnit的話,用VB.Net的人就不想用 現在進度也是NUnit快一些,先支援.Net 2.0。
目前VS2005的Team System有內建的Unit Test,但還不是每個Team版都有,詳見比較 Visual Studio 2005 Team System Software EditionsNUnit的語法和csUnit差不多,用[TestFixture]與[Test]表示Test Class與Test Method;但MS的叫[TestClass]與[TestMethod],就是故意和現在的框架不同。已經寫的好Test程式要改不少,在NUnit內部有加上與csUnitVSTS的相容。所以在.Net想要用Unit Test又想與多些人合作,還是乖乖的用NUnit吧!

星期日, 4月 02, 2006

JUnit 4.0


JUnit這 個Unit Test的始祖,自從3.8.1版在2002年推出後,進入一個很穩定的狀態,連續三年都沒有更新,在2006年3月忽然推出JUnit 4.0,接著推出3.8.2版。在3.8.2版只是小修改和一些bug fix,但4.0版是一個大改版,寫法完全改變。
主要是.net版的UnitTest->nUnit,在推出之時就使用Annotation的技巧,使得JUnit的使用方法看起來醜陋不堪,現在Java 5之後,終於可以用相同的方法,讓Kent Beck扳回一城。

在JUnit 3.8.2及之前的版本,必須繼承TestCase,在method取名為testXXXX或寫一個TestSuite將自定的方法寫進去;還有準備resource及釋放resource的方法一定要叫setUp及tearDown。

在JUnit 4.0版,必須使用JDK 5,測試class不再需要繼承TestCase,所以可以寫在原class裡(不建議啦~很醜)。Test method在前面加上@Test即可;資源的部份有@BeforeClass、@AfterClass及@Before、@After,前兩者是整個 class的,後兩者是進行每個test method時會做的動作,方便吧!

參考資料:10分鐘學會JUnit

星期六, 4月 01, 2006

Java 5 Annotation


前 幾篇有提到在不需要使用泛型的部份可以加上 @SuppressWarnings("unchecked"),這也可寫成 @SuppressWarnings(value="unchecked") 或@SuppressWarnings(value={"unchecked"}),所以若再加上不提醒"過時"API就要寫成 @SuppressWarnings({"unchecked","deprecation"}) 或@SuppressWarnings(value={"unchecked","deprecation"})

另外,在自己的程式裡用@Override或@Deprecated也是很好的習慣。
參考資料自訂Annotation

註:在參考資料裡的
@Deprecated位置目前版本的JDK5已經沒有問題,寫在上一行或method前都可以。