2009年11月9日

什麼是 metaprogramming?

剛剛在 JavaScript的中介編程與反射能力示範 讀到兩個 metaprogramming 的範例。我覺得其中 foreach() 的例子怪怪的。

先來看看維基百科上對 metaprogramming 的定義:
Metaprogramming is the writing of computer programs that write or manipulate other programs (or themselves) as their data, ......
回過頭來看該篇文章所實作的 foreach():它接受並調用一個函數(f)以及存取一個物件(this.props),但是並未產生或是修改到任何「程式」。我不懂作者怎麼會拿它當作 metaprogramming 的例子。

不過文章中另外一個例子——accessor()——就是個很典型的 metaprogramming 範例。

2009年9月28日

[Android] 代辦事項(to-do)應用程式

最近買了新手機,第一件事情就是找好玩的遊戲趁手的工作事項管理軟體,若是針對 GTD 設計更好。以下是我這兩天的試用心得:

Astrid Task/Todo List - 單純的工作清單(task),可以設定 priority 與 tag。
優點
  • 支援工作時間預估與追蹤(time estimation/tracking)
  • 到期日分為軟性與硬性兩種(absolute/goal due)
  • 單一 task 除了特定時刻的提醒(reminder)外還可以有週期性提醒(periodic reminder)
  • 支援重複性 task
  • 可以跟 RTM 同步
缺點
  • 其實沒有什麼太大的缺點,只差在它不是專門針對 GTD 的概念設計。

OpenLoopz Free
優點
  • 位置、時間、聯絡人三種特別的情境(context),
    可以根據手機現在的時間地點調整工作項目(action)的顯示順序。
  • 支援階層式 action ,有子項目的 action 會自動被視為 project。
缺點
  • Action 是新增順序排列,且無法調整
  • 被刪除的 action 不會真正被清除,有時候會干擾正常操作

Shuffle - 典型的 GTD 工具,有 inbox、project、context 三種主要檢視模式。
優點
  • 會自動挑選 project 內到期日最早的項目為 next action,不必特別設定
  • 畫面比較好看,可以設定 context 的顏色與 icon,一目瞭然。
  • 「Due actions」 檢視模式,列出今天、一週內,一個月內的工作項目。
  • 「Save and new」可快速新增多筆 action
  • 可將資料同步到 Google Calendar
缺點
  • Project 只能用來作 action 的分類 ,沒有太多細節可以設定
  • 一個 action 只能指定一個 context。
  • 無法只設定 due date,一定要同時指定 start date。

最後是 Shuffle 以使用流暢性取勝!

另外還有兩套我沒有花很多時間試的:
ActionComplete - 還沒多人推薦的 GTD 軟體,搭配 AC Inbox 應該會很方便;但是我完全看不懂它介面上的中文詞彙,所以就放棄了。
myGTD - 介面太花,我連功能都沒試就關掉了。

這邊還有其他軟體的簡介。

2009年8月17日

政治指南針:政治偏左,經濟偏右

剛剛做了政治指南針這個測驗。
傾向跟我自己的認知差不多,不過程度比我想像中的低很多。


就某種意義來說,我其實是個騎牆派。 :p

2009年8月16日

[Plurk] 透過 MSN 收發噗浪

不知道為什麼 Plurk 把即時通訊機器人(IM Bot)的設定藏在很奇怪的地方。
我簡單地整理了一下,提供給有需要的人。 :)

首先點左上的的通知


然後切換到「提示2」


「現在就開始吧」!


選取一個即時通訊服務(MSN、Yahoo 即時通、Google Chat等)


選擇好後,別忘了輸入你的帳號,然後按下「Sign Up」!



一切沒問題的話,你會收到噗浪機器人加你為好友的通知。
將它加為好友,並告訴它你的噗浪帳號(以 MSN 送出你的 Plurk 帳號),就大功告成了!

以後你只要傳 MSN 訊息給這個機器人,它就會將你的訊息發佈到噗浪上;
有新的噗它人也會即時通知你。

後續使用細節可以參考:

2009年8月6日

[Design Patterns] 論 Template Method 與 Strategy (下)

前一篇文章提到:採用 Design Patterns 書中對 Template MethodStrategy 的(形式)定義,很難在動態語言中區隔兩者的不同。
是因為這兩個 pattern 在本質上是相同的呢,或者是有其他的判斷方式?讓我們回過頭去看看先前被我忽略掉的部分--pattern 的目標/意圖--能不能回答這個問題。

根據 C2 Wiki,Template Method 的目標為「定義一個演算法的骨架,將其中的某些步驟延遲到子類別才決定」(*1)。也就是說此 pattern 應該要具備「(固定的)演算法骨架」與「(未決定/可變動)的演算法步驟」兩個要素,其中「步驟」的主要作用在於實現該演算法,且其具體內容應該要遵循「骨架」的規範或限制。

Template Method 的「骨架」除了抽象類別的形式,也可以由定義了「步驟」規範的介面與使用該介面的 client 所組成;而原本由子類別提供的具體「步驟」內容則由實作該規範介面的類別提供。事實上,這樣的形式反而更接近 Wikipedia 上的描述(*2)。
那麼這種非抽象類別的形式,會不會也是 Strategy pattern 呢?

C2 Wiki 對於 Strategy 的目標描述是「定義多個演算法,各別封裝這些演算法,並讓它們可以互換」(*3)。所以其特徵為「一組彼此獨立且可互換的演算法」,至於使用這些演算法的 client 部分並不在此 pattern 討論的範圍內。

在前述非抽象類別形式的 Template Method pattern 中實作了「步驟」規範介面的類別其實可以視為 Strategy pattern 的一種;不過「骨架」部分則不在 Strategy pattern 範圍中。所以兩個 pattern 在這種形式下是互相合作,而非表示相同的概念。

結論呢?上面就寫了半天,我實在沒辦法做什麼有力的結論了。
簡單說一下心得:雖然 pattern 的說明與呈現通常著重在形式上,但在學習形式的同時,應該要瞭解其中每個部分所扮演的角色與具備的特性。最好可以再進一步瞭解 pattern 隱含的精神。就像張無忌學太極一樣,學到把招式都忘記你就成功了!!(開始亂掰了……)


1. Template Method Pattern (C2 Wiki)
2. Template Method Pattern (Wikipedia)
3. Strategy Pattern (C2 Wiki)