Posts tagged with net

A Non-Free OpenType Font Pack

OpenTypeFontsSample (by BCSEEATI)

意外發現 MSDN 中有一包還不錯的 OpenType 字型。這包字型的本意只是用來展示 WPF 的 OpenType 處理能力,所以僅包含英文、數字及部份標點符號,版權則仍由 Ascender 持有,如果要用於其他用途,必須聯絡 Ascender。

這些字型的特色是它們分別支援了不同的 OpenType Features,例如 Small Caps、Ligatures、Old Style Figures、Swashes、Alternates 等,如果不在意以上所述缺點並想要玩玩看 OpenType Features 的話,可到 Using OpenType Fonts Sample 這一頁下載。

P.S. 如果想玩 OpenType Features,請找 Windows 7 中附帶的 Gabriola 字型會更好玩,實在很難得可以看到檔案大小這麼大的英文字型。

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 »

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 等。 

驗證 Base64 編碼字串

以往我以為驗證 Base64 編碼字串只要檢查它是由英文、數字、加號(+)、斜線(/)、等號(=)組成就好,但最近寫某個程式時踢到鐵板。我從原始資料中抓出一段 Base64 字串,無法使用 .NET 中的 Convert.FromBase64String() 對其進行轉換,但將同樣的字串交給 PHP 的 base64_decode() 卻又能正確處理。

經過我研究之後發現,Base64 編碼字串長度必為 4 的倍數,而等號的功能就是加在字串末端,確保其長度為 4 的倍數,因此等號也只會出現在字串末端,並不會出現在中間。此外,由於等號的功能只是要讓字串長度為 4 的倍數,故正確來說等號最多只能有 3 個,PHP 的 base64_decode() 則比較隨和,你高興的話,只要沒有 Out of Memory,要加幾個等號都沒關係 XD

最後整理一下驗證 Base64 編碼字串的方法:

  1. 字串由英文、數字、加號(+)、斜線(/)組成,末端可能還有 1–3 個等號(=)。
  2. 字串長度必為 4 的倍數,可以自行在字串末端增減等號的數目以符合此條件。