Posts tagged with words

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 的倍數,可以自行在字串末端增減等號的數目以符合此條件。

“Mysophobia”

“Mysophobia” (by BCSEEATI)

Mysophobia 是我為了我另一個 blog 而隨便寫的 Theme , HTML 結構上是基於 Ochlophobia 作一些小修改, CSS 則是重新寫過。起初我是沒有很認真地想要設計另一個 Theme ,只想要找一個喜歡的 WordPress Theme 改過來就好,最後我找到了 DePo Clean

DePo Clean 有一些我不喜歡的地方,例如正文區太窄、字體太小、HTML 缺乏語意等,我覺得要修改 DePo Clean ,不如直接砍掉重練,所以 Mysophobia 事實上是完全沿用 DePo Clean 的版面設計,只有在字型選擇和其他一些小地方作了修改。

“Ochlophobia”

距離上次改版將近一年,沒想到 De Morgan 可以用這麼久 :p 這次改版有幾個原因:

  1. 我在某次更新時忘了備份標題圖片,而標題圖片對 De Morgan 來說是不可或缺的,所以在正式改版前,我還用了一段時間的 Binadamu ,用了之後才發現不使用 Grid 概念的話,看起來真的會很亂。
  2. 其實我大概半年前就開始想要改版了,只是一直作不出滿意的 Mockup。
  3. 最近 Proposal 剛結束,很閒 XD
Read More »

TweetSuite Plugin for Habari (pre-alpha)

前幾天看到了 TweetBacks 這個新 idea ,實用性可能很低,但相當有趣,因此今天趁著有空寫了給 Habari 用的版本。目前完成度還不高,不過 TweetBacks 的功能都有了。

為了讓此 Plugin 得以運作,我修改了 Habari Core ,請參閱安裝前須知。目前 Habari 暫時還沒有自訂 Comment 內容型態的功能, Post 則有,這個功能未來計畫會加入,因此現在只能用這種克難作法。

Things to Do Before Installation

請先修改 comment.php, comments.php 兩個檔案,方能使用此 Plugin 。

To use this plugin, please modify your comment.php and comments.php as below.

  1. comment.php

    const COMMENT = 0;
    const PINGBACK = 1;
    const TRACKBACK = 2;
    const TWEETBACK = 3; // Add this line
    
    public static function list_comment_types( $refresh = false )
    {
        if ( ( ! $refresh ) && ( ! empty( self::$comment_type_list ) ) ) {
            return self::$comment_type_list;
        }
        self::$comment_type_list = array(
            self::COMMENT => 'comment',
            self::PINGBACK => 'pingback',
            self::TRACKBACK => 'trackback',
            self::TWEETBACK => 'tweetback', // Add this line
        );
        return self::$comment_type_list;
    }
    
  2. comments.php

    private function sort_comments()
    {
        $type_sort = array(
            Comment::COMMENT => 'comments',
            Comment::PINGBACK => 'pingbacks',
            Comment::TRACKBACK => 'trackbacks',
            Comment::TWEETBACK => 'tweetbacks',  // Add this line
        );
    ...
    
    public function __get( $name )
    {
        switch ( $name ) {
            case 'count':
                return count( $this );
            case 'approved':
            case 'unapproved':
            case 'moderated':
            case 'comments':
            case 'pingbacks':
            case 'trackbacks':
            case 'tweetbacks':  // Add this line
                return new Comments( $this->only( $name ) );
        }
    }
    

Get it!

目前只能透過 SVN 取得。

You can get TweetSuite via SVN.

Known Issues

  1. 有時(或者該說是經常?)資料庫會儲存到重複的 Tweetbacks ,但這種情況是一次就出現很多重複的 Tweetbacks。
  2. 有些短網址是大小寫有別的,而 Twitter Search 不區分大小寫,於是可能會抓到一些無關的 Tweetbacks 。(尤其是 bit.ly 的短網址超容易發生這種事)

Notes

此 Plugin 的運作流程依序為:

  1. 使用者讀取單篇文章(Post)
  2. 讀取完畢時, TweetSuite 才開始執行,這有兩層考量:在讀取文章前執行可能導致讀取變得非常慢、讀取文章前還沒有 Post 物件能用 XD 但這種作法的缺點就是最新的 TweetBacks 會在第二次載入時才出現。
  3. TweetSuite 首先會讀取這篇文章的短網址資訊,如果資訊不存在,便會到各個短網址服務產生這篇文章的短網址,然後儲存到資料庫。如果是有缺漏,便只會重新嘗試產生遺漏的短網址。(寫這個的時候我發現 tr.im 這個服務,程式寫得不太好…… 因為它不會檢查資料庫中是否已經存在重複的網址,每次都將給你一個新產生的網址)
  4. 得到這些短網址後, TweetSuite 會將它們串接起來丟到 Twitter Search 作聯集搜尋,最後將得到的搜尋結果存入 comments 資料表。其實在執行 Twitter Search 之前, TweetSuite 會先取得這篇文章最近一次的 TweetBacks 的 ID ,然後就能加入 Twitter Search 的參數中,讓 Twitter Search 只回傳較新的 Tweets ,因此資料庫中的 TweetBacks 不會重複。
  5. TweetSuite 會紀錄這一次執行的時間,接下來一個小時內同樣的文章將不會重複執行。

No more backward compatibility

我最近突然覺得向下相容是一件錯誤的事。就因為網頁設計師總是向下相容到 IE 6 ,使用者才不願升級為 IE 7 —— 反正都可以用,當然選擇已經用得順手的舊版瀏覽器。所以本站下次的改版將無視 IE 6 使用者,版面爛掉就爛掉,我不要為 IE 6 作任何 Fix! XD (但 IE 7 使用者我還是會照顧一下)

Lvx ex Cælis 近半年訪客使用瀏覽器統計 (by BCSEEATI)

為了心安,我還是參考了一下本站的流量統計,結果令我相當驚喜——本站近一個月來的 IE 使用者只佔了 51% ,其中大約只有一半為 IE 6 ,而 Firefox 使用者竟然高達 40% 。不過近一個月可能太近,我又看了近半年的資料,其實沒差多少, IE 使用者只佔了 58% ,其中同樣大約一半為 IE 6 ,計算得精確一點的話,本站近半年來只有 32.35% 的訪客使用 IE 6 。雖然 IE 的數字仍然過半,但這比例與一般網站相較,差異已經相當懸殊。綜合以上資料,我認為本站主要客群並不是使用 IE 6 ,我可以安心地寫新時代的網頁 >ω<