Posts written in 2009‒03

I don't know what is this pattern.

最近幾天每天都在寫 C#,寫的是某個自己要用的程式,由於只是自己用的,就只求速成,沒有花太多精神在設計上,直到這兩天才感覺到這樣不行,我實在重複了太多次相同的程式,因此決定改寫。

要描述我的需求太麻煩,直接看 code!我理想中的介面是長這樣:

Console.WriteLine(English.Hello());
Console.WriteLine(Chinese.Hello());
Console.WriteLine(Japanese.Hello());
Console.WriteLine(French.Hello());
  1. 上面的 EnglishChineseJapaneseFrench 都是 subclass,Hello() 是 static method,所以不需要實例就能直接呼叫,呼叫了之後就會回傳各國語言的 Hello。
  2. 同時我希望上述這些 subclass 只要繼承某個 class,就能有一個預設的 Hello(),當有必要時我再 override 這個 method。
Read More

ViewSonic VA1916w Color Profile for Mac

心血來潮,幫我的另一台螢幕也作了 Color Profile,我自己覺得這次做得還不錯。

ASUS PW101S Color Profile for Mac

網路上找不到,安裝光碟也沒附,只好憑肉眼自己作一份,好像還是有色偏(而且也是不難察覺的程度 XD),不過至少比預設值好很多了 :p

Using SQLite Aggregate Functions in C#

昨天遇到一個 System.Data.SQLite 的 bug,老實說我不是很肯定它是不是 bug,因為這個 bug 在 2005 年就有人提出,卻到現在都沒有解決,可能其實是個 feature 也不一定 :p

一般我們使用 SQLite 查詢資料後,會先用 HasRows 確定資料存在,然後用 Read() 開始讀,用 GetValue()GetString()GetDouble() 等方法取資料。但是當 SQL 查詢句中包含了 Aggregate Functions1 時,HasRows 便必為 true。如果實際上查詢結果是空的,GetValue() 取得的值就會是 DBNull.ValueGetString() 會取得空字串,而使用 GetDouble() 來取值則會發生錯誤,因為 null 無法隱含轉換為 double 型態。

這有許多 Workaround,例如用 GetValue() 取出後,先判斷是否為 DBNull.Value,不是的話再轉換為 double。最簡便的方法則是先使用 IsDBNull() 檢查欄位是否為 DBNull,不是的話才執行 GetDouble()


  1. 例如 avg、count、max、min、sum 等。