Posts RSS Comments RSS  

Archive for March, 2007

謝謝大家

我們回到了台北,儀式結束,肉身焚歸塵土。

再次與上海結緣,這卻是我最不願啟程的一趟旅行。母親說我們或許也是全球化的一個註腳,心靜,則無處不能落腳安息。

我父親走得平靜,這幾天的過程也萬幸有何叔叔一家人、父親公司同事、慈濟諸師兄姐、父親在上海的大學同學們等的出力,在追著時間賽跑的手續和文件工作中,得以平安順利完成。

因此,對於那些因為親愛的人過世而深陷於悲傷和絕望的人,我衷心的忠告是祈求幫助、力量和恩典。祈禱你要活下去,並從你現在所處的新生命中發掘最豐富的意義。不要佯裝堅強,要能接受憂傷,要有勇氣,要有耐心。總之,透視你的生命,去發現你能把你的愛更深刻地與別人分享的方法。

索甲仁波切,《西藏生死書》

大家關心給了我們很多的支持和力量,再次謝謝各位朋友的關心。

此情此景不復

Father and Son

My father, Liu Chien-ming, passed away in his sleep, in the morning of last Friday, March 23, 2007, in Shanghai, China, aged 59 (that of lunar calendar).

I’m in Shanghai now, along with mom and sister. The farewell ritual and cremation will be held on Tuesday, March 27, 2007, and we are flying back in Taipei on the same day. A memorial ritual (追思法會) should be held a few days later.

工作機會:OLPC徵PM(波士頓地區)

在紐約的Dr. Shan給的消息:OLPC (One Laptop per Child, 先前台灣媒體稱的「百元電腦計劃」) 在徵 Product Manager ,工作地點在麻州的劍橋(MIT、哈佛……),而且「會說華語,以及有在台灣及/或中國的工作經驗者佳」。

工作內容的描述以及聯絡方法請參考這裡

旅行、苦勞 Travel and Travail

英文的 travel 字源是法文的 travail ,這個字在法文的原義為「勞動」,尤其是辛苦的勞動。Travail 這個母詞從法文進入英文時,只剩下了辛苦那一層的意思,而 travel 卻在進入現代後,隨著餘遐與有閒階級的出現,漸漸地脫去了「苦行、遠行」的涵義(註1)。

最近因為一位朋友提起了多年前的旅行,以及多年前的旅行寫作,讓我也聯想起許多和旅行有關的事。國際旅行在我們這個時代,雖然還不是完全屬於人人可得的事,但只要略具經濟能力,倒也不是完全做不到(聲響度小於旅行、荒逸度高於出國、又足以浪費金錢的事,所在多有)。

關於旅行與經濟能力(連帶而生的是旅行與階級)的關係還有很多能講的事,這個容後再表。旅行的普及有一個隨之而來的結果卻是明顯可見的:那就是旅行經驗的普及化。這件事情對想要撰寫旅行跟想要閱讀旅行的人來說,或許都會是一種困擾。起碼對我來說,閱讀的困難度變高了:因為能夠寫的東西,結構和情節都太相像,情況之慘連電視也被波及到。Travel Channel的Ian Wright表情誇張,而台灣自製的各種台灣/中國/世界尋奇節目則多半在販賣異國或少數民族風情。日本的電車美食節目可能是例外,但那是因為它們販賣的是不可取代性很高的名食店,而不是旅行經驗,因此反而逸出了旅行報導的框限。至於以購物為目的的旅行報導(在台灣以早一點的《流行追蹤》或後來各種學得不三不四的變種為主),後來對我來說則是一個常年的不解:在有網路的時代,以及在名牌開得跟Starbucks一樣全世界大城市都有的年代,到底辛苦專程去人家旗艦店的目的何在?(註2)

而這件事對我來說,所造成的一個私人的困擾是:我不知道該怎麼去閱讀所謂的旅行文類。如果閱讀旅行是為了求取哪裡好吃、哪裡好玩的資訊,那麼閱讀旅行寫作是一種相當沒有效率且可信度令人存疑的方式,那種附有人頭照片「台北 Stacy 女 23 歲 資訊業」「高雄 Steven 男 20 歲大學生」的報紙 50 字短評有效率多了:「老闆用料好。『每次去老闆都很慷慨地灑大把的蔥,雖然是小吃卻感覺很實在』」。感覺這樣的事情,則除非那種旅行經驗實在太特別(不管是好事還是壞事),否則很難脫出趨同的框限,特別是BBS個人板/個人新聞台/blog如此盛行的今天。結果反而是「假的」(小說)異地寫作更吸引我的目光。

旅行的寫作容易趨同,旅行的城市也可能有相似的地景、商店,所能做的事情也大同小異(「買東西吃東西買東西吃東西」),用昆德拉在《不朽》中的無奈說法,這就叫「人多手勢少」──經驗的表述和行動的姿態有限,並不是什麼能值得特意張揚或據為已有、藉此洋洋得意的事。但這是就留下的足跡,然後把足跡放到集體歷史中而論。

經驗對個人來說,卻又是另一個不同的面向。一個簡單的事實:我們旅行經驗中,有許多城市,很可能我們這輩子絕無機會再涉足。然而任何一個城市的縱深都不可能在有限時間內看遍或經歷完畢,也因此我們總是在踏著不會再踏入第二次的河流,而與之而來那些對氣味和聲音的記憶也變成是唯一、難以對證(除非有著旅伴的扶持),然後褪色、一種接近徒勞的東西:已有的不會再有、已去的不會再去,在此意義上的遠行,沒想到變成了一種重於泰山、輕於鴻毛的東西。

經驗的普遍與趨同、手勢與姿態的有限,某種對個人來說的獨一與對集體來說只是其一的弔詭(註2)。這樣說來,旅行跟情熱、旅行寫作與愛情小說,似乎有著結構上的相似性。

但是這屬於概念上喃喃自語的遊戲,與實地身處的旅行經驗已經沒有關係了。而,最近讀到這樣一段話,倒是笑了(註3):

The older you get, the more boring travelling alone becomes. It’s different when you’re younger — whether you’re along or not, travelling can be a gas. But as you age, the fun factor declines. Only the first couple of days are enjoyable. After that, the scenery becomes annoying, and people’s voices start to grate. There’s no escape, for if you close your eyes to block these out, all kinds of unpleasant memories pop up. It gets to be too much trouble to eat in a restaurant, and you find yourself checking your watch over and over as you wait for buses that never seem to arrive. Trying to make yourself understood in a foreign language becomes a total pain.

但是我得趕快補充一句:總的來說,或許這並不是一件壞事。

註解

  1. 在此之前,必須而為卻難為的旅行稱為travel,上層階級的journey往往能成為遊記,而sojourn則或可說為日文的「滯在」,後兩者都與「一日之所行/止」的意義有關。
  2. 我相信一定程度上全球化加速了「旗艦店」概念的除魅。沒有總店紙袋的玫瑰不管在哪裡販賣,還是一樣地芬芳。如果靠的不是差異化的地域別販賣、限定特賣(主要是拉抬收藏價值),就得靠營造(偽)歷史等創造觀光景點的方式來創造出朝聖的必要。
  3. H. Murakami (村上春樹), “A Folklore for My Generation”, Blind Willow, Sleeping Woman, London: Harvill Secker, 2006. 我不知道這個短篇中文版叫什麼,就只cite英文版了。

駛Benru (開Benz)

某種 d -> r 的台灣語音變化。例如 oden 變成了黑輪 (oren),Benz (日文唸做 bentsu [du] ?) 變成了 benru 。

初學日文時有一次倒熱水,象印熱水器上的ここまで(/kokomade/, 注水線「到此為止」 ),長輩卻說那唸成 /kokomare/ ,好奇一問明明是 /de/ 怎麼會唸成 /re/ 呢,結果說是「小時候都是這麼聽說的」。

另一個從來不懂的是「男」為何要唸成 lâm ,猜想是不是也與此變化有關。

扶霸的家譜

Genealogical Tree of Herr Foobar von Laggard

我的 Coding Jam Proposal

為了四月的 coding jam,我準備了三個半的題目(為什麼有半個呢?因為半路殺出了程咬金 XD),準備挑一個利用 coding jam 的時間來完/玩成。排在前面的是我比較熟悉、做起來難度應該也不高的,越到後頭就需要越多 research ,而且我也就還沒那麼清楚的想法、能把這些題目做成什麼樣子。目前想做的如下:

1. Flickr emulation layer

在寫 Flickr 相關程式時,最麻煩的事情莫過沒網路可用,或者是遇到 Flickr 拉肚子、跑按摩院(Flickr 偶爾會出現 “Flickr is having a massage” 的訊息,此時所有的 API call 都會回傳 error block)。這樣對開發來說很麻煩。另一方面,web API 對 unit testing 也是個困擾:unit testing 變成要花時間在等網路(ObjectiveFlickr 就有這個問題),而且公開的程式又會遇到 API key 不知擺哪好的問題(要 unit test 總要有 API key 吧)?

基於種種過去的經驗,我在想,如果能有一套 Flickr emulation layer ,會不會緩解這種痛苦?

一套 web API emulation layer 可以從 framework library 這端來做(例如把 ObjectiveFlickr 裡面的東西抽換掉)。可是如果有一套 web-based emulation layer ,可以在自己的 localhost 上執行,那麼突然所有的 Flickr 應用程式都可以改走 emulation layer 了。

當然 Flickr API 本身已經是龐然大物,emulation layer 的設計也許不能只有幾個「看 URL 丟不同 dummy data」的簡單操作,一定程度上還得 replicate 一套 Flickr 的 authentication, API signing 等機制才行。上傳也要花點力氣。當然,我們也可以藉此做一些像 API usage monitoring, throttling 的延伸主題……

說來這個題目的難度不高,主要都是在組織程式碼。Flickr 的 REST API 又是老派,沒有很 fancy 的「靠 HTTP method 來決定是否要 create/update/delete」這種事,所以用市面上任何一種語言、任何一種 web app framework 應該都寫得出來。

當然瘋狂一點的話,說不定一個新型態的照片應用程式或照片網站就跑出來了。我是沒想得這麼遠啦。

如果有興趣在 coding jam 做這個題目的朋友,請加入我們這一組。唔,我的話因為只會 Ruby 跟 Rails,所以我會用 Rails 來做這件事。

1.5. ActiveFlickr

如果 Ruby 版的 ObjectiveFlickr 是某種 web API library 極小化的代表(Flickr 有近百條 API method,OF/Ruby 主程式連註解只有 214 行),ActiveFlickr 倒是想推到另一個極端,就是 Flickr API library 的極大化,這樣我們就可以做到…

# 找到名叫 lukhnos 的使用者
@user = FlickrUser.find(:first, :conditions=>{:nick=>'lukhnos'})

# 把他每一位朋友的最近一週的照片都收進來
@photos = @user.contacts.collect { |c| c.photos[1.week.ago .. Time.now] }.flatten

# 如果是用 Canon 的相機就記一筆
@canon = 0
@photos.each { |p| @canon += 1 if p.exif.camera =~ /Canon/i }

# 經緯度在台北101座標方圓 50 km 的也來一下好了
@taipei = 0
@photos.each { |p| @taipei += 1 if p.geo.point.within?(@taipei_101, 50.km) }

(以上是純粹的幻想)

唔,至於為什麼說是 0.5 個題目呢,因為有人已經做了 FlickrFS,基本上已經把這事情做得差不多了…… (另外也可以看一下 Amit Singh 的 PicasaFS over MacFUSE,只有讚的啦)

當然,如果這個計劃改成用 Objective-C 來寫,應該會是個實地演練 Cocoa Key-Value Binding 的好題材。

看看有沒有人有興趣好了。:p

2. OpenVanilla 相關的語言服務

「詞彙管理的基礎建設」(glossary management infrastructure)是我三年前開始 OpenVanilla 計劃以來一直有的想法。現在比較知道 web app 怎麼做了之後,或許能夠利用 web service 來達成,嗯,好比說,「從網路上叫出 “unobtrusive JavaScript” 一詞中文該怎麼翻譯」,然後直接打字輸出,或是即時 digg/bury 人家的翻譯詞(例如我就很想 bury hlb 把上述詞翻成「不亂入的 JavaScript」 XD)。

另外 othree 和 gugod 去年弄了 web 版的 OV (as a proof of concept),其中輸入法資料服務這一端是由 gugod 用 Catalyst 三兩下就完成的東西。這個部份如果能變成泛用的 web service,甚至還能夠利用 REST 來提供提交 .cin 檔修正的功能,說不定不錯。

不過這個題目就沒有上述兩個那麼清楚了。

3. 某一種更好的身份認證服務

也許是某種 id/auth service proxy?總之還不清楚,因為還需要做一點 research。Open ID 最近很紅,然後我也看過有 blog 留言是需要 Flickr 認證的。一時三刻之間只知道自己對這個主題有興趣,能做什麼,就甚至比語言服務還要再模糊一些。

sqlite3搭配Rails 1.2.2會神秘爆炸的問題

最近發現某個在Rails 1.2.2環境下跑的應用程式會經不起疲勞轟炸,用一用就爛掉了。一開始以為是雜種狗(Mongrel)惹的禍,後來又開始懷疑是不是 Ruby 的 Io class 會 leak file handle (如果是,就嚴重了啊…)。

百思不得其解之下,結果反而是在找和 Ruby / Rails 無關的討論中,想起來可以用 “lsof” 這個 UNIX 工具。結果一跑之下,妖魔就現了形:原來是 sqlite3 爆炸了,開了許多 DB file 卻佔著不放。怎麼會這樣呢?再繼續搜尋,原來竟然是 Rails 的 sqlite3 connection 沒有把 DB connection (對sqlite3來說就是file handle) 給釋放!這樣就算是鐵打的作業系統,也會山窮水盡吧…

根據這張TRAC ticket,問題早在2007年一月時就解決了。不過奇怪的是當時雖然標明是Edge,但patch過的程式卻完全沒進到tagged release,當然也就沒進到released package了。

Fix方法,要不就是改用Edge Rails(不過可能有其他風險),否則就是照著剛剛那張ticket的方法,自行修改ActiveRecord中的 connection_adapters/sqlite_adapter.rb ,在第 108 行附近,ActiveRecord#supports_reloading? 後面加上:

def disconnect!
  @connection.close rescue nil
end

藥到病除。

從這個故事我們可以知道:

  1. lsof 是你的好朋友
  2. 不要相信released package就一定把狗皮藥膏都貼過一遍
  3. 不要隨便懷疑雜種狗的忠誠度(雖然偶爾還是要來踢一下就是…)

[ANN] Lib-Formosa 0.1 (台灣語文程式庫集)

Update 1: 目前尚為 pre-packaged tar/zip ,必須從 svn checkout 出來,晚點來弄。
Update 2: 修正一個 typo, 應該是 khah chá pàng, TL寫成khah tsá pàng, tiânn-tiânn pàng

秉持 open source 要 “khah chá pàng, tiâⁿ-tiâⁿ pàng” (較早放,定定放: release early, release often)的精神,在此發布 Lib-Formosa 這個計劃。

Lib-Formosa 是從 OpenVanilla 的 Holo-POJ 模組 spin-off 出去的計劃,目的是希望提供一組能處理台灣語文的程式庫。

這個計劃是由 pektiong 和我在2006年年初,打算重構 OVIMPOJ 時所開始的構想。我們目前打算為台灣閩南語(Taiwanese Southern Min,又稱 Holo)撰寫可供程式使用的語音文法(phonetic grammar),以供驗證音節正確性,計劃進行得不快就是了。在此我們先行推出「音節組合」所需要的程式碼。我想有了這個程式庫,不管是撰寫台灣語文相關的處理、分析、UI frontend或者是輸入法,應該都會容易許多。

目前 Lib-Formosa 僅有一個稱為 LibHolo 的程式庫,提供取得標過音的台灣閩南語母音,以及提供可從字元串流(character stream)組合完整音節的物件類別。

程式庫目前為 C++ 所撰寫。裡面附有一個簡單的使用範例(將從 stdin 輸入的 ASCII-form POJ 音節轉換為標過音的 Unicode 台羅音節)以及 unit testing (需使用 CxxTest)。文件目前尚相當貧乏。

整個計劃是放在Google Code hosting上面,網址在:http://code.google.com/p/lib-formosa/ 。原始碼為使用New BSD License釋出。

最重要的設計概念和功能如下:

  • 支援 POJ 或 TL 做為輸入及輸出格式,內部資料結構為 TL 。
  • 有限度的支援 TLPA 及台語通用拼音做為輸入格式。台語通用拼音可能有自然調問題,這個程式庫本身不處理因音節在詞彙位置不同而產生的調性差異,因此是context-agnostic。
  • 支援標調的正規化(normalization),亦即在輸出前,將元音標號搬到正確的元音上,依循的規則是Holo的音響律(sonority rules),亦即調號要標在音節中響度最高的母音上。
  • HoloSymbol class 本身有內建的游標支援,方便輸入法撰寫(註)。
  • 同時支援「組字式」(composed form)及「查詢式」(query form)的輸出,所謂組字型是已經組好的Unicode音節,查詢型是諸於像「thiann5」這種經過正規化的ASCII form,可供資料庫查找(例如查詢 POJ-Holo.cin)使用。
  • 使用 C++ string (null-terminating byte string) 做為內部資料結構,因此可以很容易在任何平台上 deploy (encoding-agnostic)。

試以下面的例子說明 HoloSyllable 的使用方式:

#include "LibHolo.h"
using namespace LibHolo;

string example() {
    HoloSyllable syl;
    syl.setInputType(POJSyllable);  // 使用 POJ 輸入
    syl.insertCharacterAtCursor('t');
    syl.insertCharacterAtCursor('i');
    syl.insertCharacterAtCursor('a');
    syl.insertCharacterAtCursor('n');
    syl.insertCharacterAtCursor('n');
    syl.normalize(5);   // 第5聲

    // 如果使用這行,回傳的 composed form 為 TL: tiânn
    // return syl.covertToTLSyllable().composedForm(); 

    // 回傳 POJ composed form: tiâⁿ
    return syl.composedForm();
}

目前實作的規模至此,歡迎大家多多利用。

註:經過b6s指出,「游標」在資料結構上,其實就是iterator。

為Coding Jam 2007的宣傳開個頭

jam |jam| noun. (also jam session) an informal gathering of musicians improvising together, esp. in jazz or blues

–New Oxford American Dictionary

今年在OSDC.tw正式議程開始前兩天,有一場coding jam,我自己暫且譯為「程式隨興創作會」。這個活動的構想來自b6s,他想為今年Wikimania 2007的Hacking Days預先熱身,同時想在台灣辦公開的coding jam活動一直是我們的理想。

這次的Coding jam預定在4月12日、13日兩日舉行,地點快要決定了。活動進行兩個整天,大體上就是大家帶電腦來,針對某幾個事前帶來的材料,一起烹煮出程式,然後公開發布出去。

這一次的創作主題是 “web API” ,這個概念隨著因為(咳,所謂) “web 2.0″ 和 “mash-up” 而流行了起來。在技術上則是有 Flickr, delicious, Google Earth 這一些著名網站服務,打響、也證明了 web API 的價值(註)。

簡單地說,web API 是一套「可程式化的介面」,讓一個網站不再只是單純只能用瀏覽器來開啟、觀看、使用的服務,而變成了「可以拿來寫程式的東西」(”programmable web“)。就拿 Flickr 來說,沒有 web API 的 Flickr 其實只是個單純的相片分享網站(當然,是個頂級的相片分享網站),但是 Flickr 因為有 web API ,因而有了各種 3rd party 的上傳程式、有自動換桌面的程式、有螢幕保護程式、有各種奇怪的圖片或圖表產生網站、以及諸如像Moo一類的名片印製服務…… Flickr 儼然創造了某種「軟體鏈」(software chain, 如同產業鏈),也就是某種軟體的生態系,而這些又直接為 Flickr 的使用者帶來便利、創造價值──同時讓 Flickr 拉大與競爭對手的距離。

今年的 coding jam, b6s和我在想,除了推廣「web API的使用」──除了當人家web API的「消費者」外,我們還更想邀請有興趣的朋友,來提供新的web API──亦即轉變身份,來當web API的「生產者」。我們認為,如果大家身旁有更多能互通的網站(interoperable service),甚至把原來沒有web API的服務也套上一道中間層──例如為「教育部國語辭典」生一套web API,那麼我們說不定能為更多人帶來便利,同時也為網站創造價值。

我自己因為前陣子撰寫了Objective-C用的Flickr API library (ObjectiveFlickr),因而開始對Flickr產生了濃厚的興趣。這一定程度上限制了我的視野,不過說來Flickr真的是個有趣的網站。他們的大工程師Cal Henderson在一份2004的投影片上提到「什麼是Flickr?」時,很直接地說,Flickr是「分享照片」和「公開的API」──而Flickr的frontend本身就是自家API的消費者。同時Flickr對於規劃API的細膩──從身份認證、同時提供桌面軟體/web/手機的應用,到API key管理、流量監控、與開發者的交流,這中間有許多值得我們學來用的地方。

Coding jam圍繞在 “web API” 上,並不代表一定要圍繞在「Flickr的web API上」──我僅僅是就我參與這次活動,所準備的主題,以及我有興趣的方向,來舉例說明web API所可能帶來的好處。

跟這活動有關的消息,b6s和我會陸續更新。在此先起個頭。我今年想在coding jam上做的主題,免不了一定會跟 Flickr 有關。如果有朋友也對 Flickr API 的相關生產/消費/中介有興趣,歡迎到時候參加我這一組的 jam :)

註:當然這絕不是什麼新鮮的概念了。”Web service”的概念存在多時,有許多我並不熟悉的概念或通行的業界作法,諸如SOAP, WSDL, SOA等等。不過以Amazon來說(Flickr似乎也是),據稱2003年時85%的Amazon API消費者都使用REST式的API來存取服務。晚近在資料傳送上,則有以JSON取代XML的趨勢。

- Next »