2009年12月10日

檢查 Google 未讀訊息的 Google Chrome 外掛

粒粒分明組

節省空間組

不過根據 LiveScience 的文章1,應該完全不要裝這些通知外掛才對。 :p


  1. Workers Should Turn Off Visual Alerts, Study Finds | LiveScience

2009年11月25日

Gmail 與 Google Reader 近日更新

離線版 Gmail 支援附檔

原本離線使用 Gmail 的時候無法上傳附件1,但最近加上了這項支援。
所以要寄檔案時不必先注意自己是不是處於連線狀態了。

還沒有開啟離線功能的人,可以從這裡開啟。

消息來源Official Gmail Blog: Send attachments while offline

Google 閱讀器(Google Reader)可顯示 favicon

一圖勝千文:

消息來源Let your subscriptions' personality come through


  1. 我沒有實際試過,這是轉述官方文章的內容。

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)

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

昨天在 Plurk 上面回了 fcamel 一段話(*1):
我以為 "template method" 改用組合就是 "strategy" 了 :p
不過我想會分成兩種 pattern ㄧ部分也是因為靜態語言的特性使然吧
由於 Plurk 會限制字數,不太適合發表長篇大論。所以我打算透過這系列文章把想說的東西表達清楚一點,並且討論一下這兩個 pattern。

Design Patterns 對這兩個 pattern 的描述如下:
Template method
defines the skeleton of an algorithm as an abstract class, allowing its subclasses to provide concrete behavior.
Strategy
allows one of a family of algorithms to be selected on-the-fly at runtime.
在這樣的定義下,如果採用組合(composition)的形式,自然不會是 Template Method Pattern。而不論在靜態或動態語言中組合關係都是可以在執行時期才決定的。所以我認為(在上述的定義下):「"template method" 改用組合就是 "strategy" 了」。

在靜態語言中,類別的內容必須在執行時期前就確定。因此提供 Template Method Pattern 中具體行為的子類別自然不會落在 Strategy Pattern 的範疇中。反之,由於動態語言允許執行時期修改類別定義,而讓一個類別有可能同時被用來實現這兩個 pattern。這是我回文後半段所沒說清楚的部分。

當然,前面論述採用了比較狹義的 pattern 定義;而且我只討論了 pattern 的形式,而忽略套用 pattern 的動機(也就是 pattern 所想解決的問題)。但這些已經超過原本 Plurk 回文想說的內容,所以我將這部分留在後續文章中討論。(謎之音:擺明就是要拖稿嘛)


1. 這則 plurk 在

2009年7月20日

利用 Posterous 記錄閱讀網站時的筆記與心得

這次要來介紹一個 blog 系統—Posterous

它主打的特點是:不用註冊,只要發 E-mail 就可以張貼網誌。詳細步驟與功能介紹請參考重灌狂人的<Posterous 用Email寫部落格,自動貼圖、嵌入音樂、影片>

我只補充一個比較少被提到的功能:書籤列小工具(bookmarklet)。它可以將你選取(或是它自己偵測到)的圖片、影片、文字加到你要張貼的文章中。所以我現在都利用它在瀏覽網頁時作筆記或整理心得。

不過 Posterous 的 bookmarklet 連結與說明有一點難找,懶得找的人可以直接點這裡

如果你不知道怎麼把 bookmarklet 加到你的瀏覽器,請參考該頁右邊綠色區塊的說明;
實際使用方式,請點該頁左邊三個「Show me how」。
(請原諒我懶得製作圖文並茂的教學 :P)

因為 Posterous 實在太方便了,我又懶得把我放在 Posterous 的內容再整理到這邊來,所以看來這邊又要乾一陣子了。 :P

2009年7月11日

網頁瀏覽紀錄 7/8 ~ 7/10

嗯...我懶得分類。我盡量把類似的主題放在比較靠近的地方。

2009年7月8日

[書摘] Don't make me think - 如何設計好網站

我還沒真正看過《Don't make me think - 如何設計好網站》這本書,
以下內容是節錄自 10 Usability Lessons from Steve Krug’s Don’t Make Me Think
  • 易用性(usability)代表的是...
    確保某樣事物可以正常地運作,讓經驗與能力在平均水準的人可以沒有困難地使用它並且達到被預期的功效。

  • 網站(web application)要能自我詮釋
    網站的作用與使用方法應該要能夠不言自明、顯而易見。

  • 不要讓我思考
    不要讓使用者去猜你的網站上有哪些功能、或是該怎麼用。

  • 不要浪費我的時間
    多數人是為了節省時間而使用網路。

  • 使用者依戀著「上一頁」按鈕
    使用者在網站做了錯誤的操作,他們不會覺得有什麼大不了的,而會試著按幾次「上一頁」來修正錯誤。

  • 我們是習慣的動物
    找到一個有效的方法,就算還有更好的方法也不要去改變。

  • 沒有閒聊的時間
    使用者不是來閒聊的,使用者只想要立刻找到他們要的東西。

  • 不要忘了搜尋功能
    有些使用者進到新網站的第一件事情就是找搜尋框在哪。

  • 提供概念上的網站地圖(site-map)
    使用者不在乎網站上的功能與內容實際上放在哪裡;
    他們只想知道他們自己在概念上/流程上的哪個位置。

  • 讓回到首頁變得容易
    這樣使用者迷路時才知道可以從哪邊從頭來過。

延伸閱讀

網頁瀏覽紀錄 7/4 ~ 7/7

軟體設計與開發
  • Forgotten Refactoring
    • 重構是好事,但是請先確定你要修改的程式碼有對應的測試。
    • 否則你不是在 "重構",只是在 "change some shit" (這有沒有比較好的中文翻譯?)
  • A Basic Lesson in Password Hashing
    • 不要只對明碼做編碼動作,請記得加鹽(salt)
    • 不要整個系統都用一樣的 salt,請每次都以亂數方式產生。
    • 把 salt 跟編碼後的密碼合在一起,不要存在分開的位置。
    • 結合方式最好可以有變化(例如:由明碼程度決定 salt 的插入位置)。
    網站開發
    網頁設計
    Ruby
    Java
    JavaScript
    Scala
    其他程式語言
    • Lazarus - Free Pascal 的 IDE,簡單說就是 "偽-Delphi"
    • SharpDevelop - 免費的 .NET IDE,支援 C#、VB.NET、IronPython、F#、Boo
    • Fan - 有人說比 Scala 好的語言(出處找不到了...)
    • P-99 - 專為練習 logic programming (Prolog) 而設計的題目
      軟體介紹
      工具網站
      其他
      --
      終於,我把我的未讀文章清完了!!

      2009年7月1日

      乾淨程式碼的 4 個小秘訣

      原文-Tiago Fernandez: 4 Tips For Clean Code
      1. 寫短而簡潔的函式

        程式碼太長的後果是沒人知道這一大段東西到底在幹嘛,因而不敢(或不願意)去修正它。要怎麼判斷一個函式是否太長了呢?有個我很喜歡的簡單準則,大家可以參考一下:

        一個函式的長度不應該超過螢幕能顯示的範圍。

      2. 可以自我詮釋的變數與函式名稱

        變數或是函式的名稱應該要清楚地說出變數與函式的用途。現在的編輯器都支援名稱提示自動完成的功能。不要為了想少打幾個字,而取那種過了一個星期之後連你自己都不知道是什麼意思的式名稱。

      3. 只寫恰當的註解

        註解裡面只要指出程式碼裡面沒有的東西(參數格式、呼叫此函式前應該被滿足的條件等...)就好了。最好可以搭配一些文件產生工具(如 javadoc)自動地產生說明文件。

      4. 保持程式碼易讀好懂

        不要用一些奇技淫巧來賣弄你的程度,因為日後可能連你自己都看不懂你在寫什麼。遵守 "KISS" (Keep It Simple and Stupid)"DRY" (Don't Repeat Yourself) 這兩個原則,自然就可以寫出易讀好懂的程式碼。

      --
      繼續用轉錄翻譯文章來充版面...

      2009年6月17日

      Haskell 版分贓程式

      剛剛把黑暗執行緒分贓程式改用 Haskell 重寫。
      演算法其實很簡單,就是不要先除完再來調整,而是一次算一個整數出來就好了。我覺得還蠻適合用 list 的概念來做所以拿來當作練習題目。
      另外,我也嘗試在這段程式碼中練習 Tail Recursion

      一開始的版本因為少了那兩個 toRational 害我花了好多時間除錯...應該要花時間好好研讀一下 Haskell 的型別系統了。

      程式碼如下:

      2009年6月9日

      本部落格的 feed 搬家

      基於我個人的潔癖,這個部落格的 feed 將換到 http://feeds2.feedburner.com/wancw/blog
      舊的 feed 預計在 6 月底停用。

      2009年6月7日

      命名的準則:關連性

      以下是 Name that method: Symmetry 的摘要:

      我們已經知道要把相關的程式碼或概念放在相關的地方。
      所以我們會把程式切成類別與模組,也用相同的準則去管理程式檔案與目錄。
      然而比較少被提及的是:命名 method 時也可以依循類似的準則。

      文章中以 Merb、Rails 3 作例子。
      同樣的一組功能在 Merb 叫作 provides/display
      在 Rails 3 中則是 respond_to/respond_with
      若你從沒用過這兩個 method,
      Rails 3 的命名方式應該可以讓你一眼就看出兩個函式是相關的。
      所以請替相關的 method 取相關的名稱

      文章中還有提到另一種不好的命名方式:
      Camping 提供兩個同名的 method 作相反的事情。

      註:上述 MerbRailsCamping 都是 Ruby 的網頁應用程式框架。

      --
      後記:
      最近這個 Blog 好像都靠轉錄或翻譯文章來充數。
      另外,硬要全部都寫中文實在太痛苦了,
      以後還是不要做這種蠢事好了。

      2009年6月4日

      HTML 5 的新東西

      以下是從 Nelson 的 Google I/O 2009 筆記()歸納出的要點:
      1. <canvas><video>
        讓使用者不必再為了畫面效果裝一大堆瀏覽器外掛,
        開發者也可以用更優雅的方式寫出好用或華麗的網頁應用程式。
      2. Geo locationDatabase and app cache
        強化了 mobile web app 可發展的空間。
      3. Web workers
        多緒的 Javascrpit,太過複雜的運算就可以丟到背景去執行,而不會影響使用者使用上的流暢度。
      結論就是開發者以後只要透過 Javascript 就可以做到現在要搭配一大堆技術才能做到的效果。不要猶豫了,趕快去學好 Javascript 吧!同時這也表示網站創業技術門檻又降低了,好的創意與使用者介面也就更重要了。

      這樣一來,以後一般使用者打開電腦應該只會用到瀏覽器了吧?XD
      (但是不知道什麼時候主流瀏覽器才能都完整支援?)

      --
      我發現我真是愛硬下結論。

      2009年5月1日

      有效率會議的 7 個秘訣

      原文:WebWorkerDaily » Archive 7 Tips for Efficient Meetings «
      1. Decide if the meeting is required
        - 請先判斷有沒有必要開這個會議
      2. Decide what type of meeting you are holding
        - 確定會議的形式是記者會(公告)型、討論型或是決策(談判)型。
      3. Have an agenda and stick to it
        - 建立議程,並且遵守它。
      4. Only invite people to the meeting who need to be there
        - 只找必要的人參與會議。
      5. Have someone chair the meeting
        - 找個人當主席(主持會議),負責維持議程。
      6. Start on time and do not overrun
        - 準時開始,準時結束。
      7. Follow up afterwards
        - 會議結束後的相關應對。
        (好吧,這段我抓不太到正確的意思。)
      --
      說實在,我覺得議事規則應該要加到通識課裡面去呀。
      (這篇竟然放了快兩個月...)

      建立「全新」的 Git 分支

      GitHub Pages 看到的
      cd /path/to/project git symbolic-ref HEAD refs/heads/new-branch-name rm .git/index git clean -fdx # create some files git add . git commit
      這樣會建立一個沒有 parent 的新 branch.