The Old Blog Archive (Traditional Chinese), 2004-2009

Archive for the 'tekhnologia 技術或者藝術' Category

WWDC Day 2: 關於參與會議以及Apple Design Award

今年Moscone比去年容納的人數多了近一千人,許多事明顯感覺得到差別。例如插座不夠用,或是吃飯排隊時間變長,熱門session得更早去排隊,洗手間變得很難用等等。這是外在的變化。

因為有了去年的經驗,今年知道今軟體要趕快裝起來、code sample要先看過,筆記要做,人要認識。這些都比「感受氣氛」來得重要而實際,而這每一項都花時間和力氣。這是內在的變化。

十個月就這樣過去,時間很快。去年在頒Apple Design Award時,對於TextMate得獎或F-Script入圍,感受還不那麼深。幾個月之後這兩項工具都成為我開發所需的軟體(尤其是TextMate)。今年的ADA做了過往回顧,然後才意識到說其實有這麼多的獎項都是那種一兩個人的作品,或者是規模不大的公司。從這一點來說ADA的精神是很鼓勵個人開發者和中小企業的吧。好比今年的遊戲類,得獎的是World of Warcraft,入圍的是Wacky Mini Golf。但是Apple今年在遊戲類給了入圍者special mention,因為WoW是大軟體公司的作品,他們的東西很讚很好,得獎固然理應,可是像Wacky Mini Golf這種個人作品對OS X平台的貢獻不會少,special mention也給了相當於半份得獎者獎勵的套件,算是某種鼓勵的表示吧。

今年更甚於去年的,是那種對軟體開發熱情的感受。這些人如此專注、如此有才華,把力氣投注在單一一套軟體上,然後在功能和user interface上投下如此多的心力。

很多啟示。去年的WWDC對我來說有幾個重要的life-changing moment(容或留待日後一一展陳)。ADA則像是某種標竿:告訴我們即使是個人開發者或小公司,熱情和精緻能到什麼樣的程度。

Update: 今天除了 ADA 外,最精采的(我沒去參加 Stump the Expert)應該是這個:

"I Love View..."

James Dempsey繼去年的 Little Endian 之歌後,今年再推力作 “I Love View”,把 NSView 的身世從頭到腳細數了一遍。其中唱到 contextual menu 時忘詞卡住,竟然叫樂隊和投影片全部 rollback 再來一遍,”because this is an unfinished version and will only release in October!” 。全場轟動+standing ovation。安可曲則是 “Hold me, use me, release me”,眾人合唱複歌。

WWDC Day 1

相當漫長而疲勞的一天,令人興奮的成份卻沒有太多。iPhone “no SDK” 一事是敗筆。John Gruber認為是對 developer 的 “insult”。我也這麼覺得。如果只要寫 web app 就好了,我們還來參加 WWDC 幹嘛?我們幹嘛還需要關心 OS X 的平台相關技術?這種說法相當 self-defeating。

WebKit 是 Apple 拿來應對 rich web app 的戰略武器,QuickTime 則顯然是想試圖藉 Apple 在 appliance 市場跟媒體生意的優勢,來向 Flash player 擠壓(no, no Flash for iPhone)。但是這兩者都有欠說服力的地方,好比說 SJ keynote 很不客氣地說 Safari 市佔率想再上層樓,然後直接把 Firefox 的餅給蓋掉,或者說在完全不提 Flash 的情況下希望大家多用 QuickTime plug-in,嗯,這,好像不是很客觀啊。

下午的 session 比較好,把主題拉回 OS X 做為一種平台的優勢(而且主要還是「開發者愛用」的平台)。儘管如此對於 web app 的應對還是太少,相對於 MS, Adobe, Sun 都想辦法在這一塊中間卡位,儘儘靠 WebKit 跨平台,似乎還不夠啊。還是那句話:Apple 或許表現還會更好,但是 OS X 似乎很難再像 10.3 – 10.4 這一段時間有更令人興奮的東西。10.5 delay 當然有差就是。

Gonna Take a Shot of These

WWDC Day 0

星期天去領了 WWDC 2007 的名牌,然後去參加sf/Mac indie soirée,見到了許多久仰其名的獨立軟體開發者。獨立軟體開發者也自稱”indie”,跟獨立製作的音樂人相呼應。討論技術、建立關係,更多的是一種中小企業的精神。

雖然說今年是Apple的好年(iPhone與如日中天的股價),我卻覺得對OS X平台來說可能才是嚴峻挑戰的開始:從今年竟然有某些我認為是「填料」的JavaScript Library tutorial session (what do Prototype and Dojo have to do with the OS X platform?),就覺得來自rich internet app的需求和挑戰,很大啊。

就看WWDC Day 1能端出什麼菜來了。

Moscone West on Sunday

一些 OpenVanilla 的近況

簡單 update 一下 OpenVanilla 的現狀。

  • 在 OS X 方面,zonble 的 blog最近介紹了不少進展。去年九月我們在北京輸入法廚房期間做出來的「web browser選字窗」雛型,最近由zonble和gugod起頭,做了新的theme(包括會翻滾的選字窗。我這邊也幫忙修改OS X Loader,希望能使開發測試更為便利。我們還蠻希望web browser選字窗能在未來版本的OV中扮演更吃重的角色。
  • zonble最近也相當認真在開發 OV 相關的工具程式,像是 OV filter widget、通用輸入法編輯工具(可用來創建新的輸入法或編輯現有的輸入法表格。
  • Windows 部份,b6s 最近釋出了測試版的 Windows OV build。我們在思考 Windows 版 OV 時,會比較傾向往 OV 的實驗性方向推展(例如一直還沒實作的辭彙管理工舉、UI 上的考量等等),這會和其他 open source 的 Windows 輸入法在此一階段以實用性及儘可能發布出去,有所不同。
  • 在募款活動方面,我們今年還沒開始任何正式的募款活動,OV fund也尚未動支(因為我們今年還沒有列出任何動支計劃)。我正在整理去年的募款清單,六月底預計再發布一次支用情形。這部份的延遲,我要負不少責任,要先跟大家說聲抱歉。
  • Leopard 的 InputMethodKit 前幾個月經歷了不少修改,我們去年九月在OV branches裡的LeopardVanilla已經不能build了,這一部份,我們(主要是我)會在這次 WWDC 2007 的 Input Method session 上,取得更新的資訊,然後把 LeopardVanilla 給 port 過去。
  • 在開發相關事務上,我們做了幾個重大的改變。OpenVanilla 的討論區,改用 Google Group。同時我們也將 OpenVanilla 的主要 source repository ,改用 Google Code Hosting(搬家這件事花了不少時間和力氣);OpenFoundry 的 svn 將變為 read-only mirror。我們同時徵求了各位開發者的同意,將 commit right 做了一點收整。更新過的 commiter 包括了 b6s 跟我 (admin)、gugod, zonble, mjhsieh 等人。

我個人這邊,這半年一方面是正職工作,另一方面是家裡的事情,對於 OV 的開發,確實是慢了下來。不過我也感覺到 OV 的 code 到了做下一輪更新、OV 的相關模組也到了該更新的時候了(例如 generic module 要加萬用字元、酷音應該選一個版本固定下來做 build 並修掉一些今年一月 test build 發布後所發現的 bug)。總之一定會繼續的努力。:)

Cocoa Tuesday: 2007/6/5 星期二 20:00在OP

每兩週一次的 Cocoa Tuesday ,這週照往例在 OPCafé 舉行。這週的話我打算講一個 2006 年時在 OSDC.tw 遠端講過的話題,就是 WebKit 與桌面應用程式的整合。例如用 JavaScript 來呼叫 Objective-C,或是用 Objective-C 呼叫 JavaScript。這個功能可以做到的邪惡事情太多了,連 OpenVanilla 最近開發中的 WebKit display server(對啦,就是 aka 「入力娘」的子計劃)也是有了它才得以完成的。

又,6/12 的 Ruby Tuesday 以及 6/19 的 Cocoa Tuesday 各暫停一次。這週二過後再下次為 6/26 星期二的 Ruby Tuesday。

Ruby Tuesday: 2007/5/29 (二) 在 OPCafé

每雙週二舉行的 Ruby Tuesday,5/29 (二) 同樣在新竹市中心的 OPCafé 舉行。

這次的 Ruby Tuesday ,我請來 b6s 來為我們客座講解 Apache Lucene 的基本原理。Lucene 是以 Java 寫成的全文搜尋程式庫,可說是最普遍的 search solution。由於 Ruby 的 Ferret 是根據 Lucene 的設計來實作,因此在基本概念、術語、特性上,都有和 Lucene 貼近的地方。b6s 對於全文搜尋──以及全文搜尋所根基的諸多自然語言處理的理論──瞭解深入。我想如果能讓大家對於 tokenizing, analysis, indexing 等概念有更清楚的認識,相信選用 web app 的搜尋方案時,會能更精準找到自己要的,以及做出正確的 trade-off 決定。

除了 b6s 主講 Lucene,我會補充說明 Ferret,尤其是 acts_as_ferret 這套 plug-in 的使用方法。

歡迎大家屆時來 OP !

Cocoa Tuesday: 2007/5/22 星期二 20:00在OP

這週二是 Cocoa Tuesday,打算來講一些 Cocoa 繪圖以及文字繪製的基礎,地點一樣是在OPCafé

acts_as_ferret: Rails全文搜尋快速上手(與中日韓文支援)

Here are some code snippets that I use to add CJK (Chinese, Japanese and Korean) characters support to Ferret and acts_as_ferret.

(Update: lingr.com has released their multilingual analyzer, see http://blog.lingr.com/2007/05/a_new_plugin.html for detail).

相信許多鐵道迷都聽過雪貂(Ferret)。雪貂是一套根據Lucene所開發的全文搜尋引擎。裝上了「化身為雪貂」(acts_as_ferret)這套plug-in之後就更厲害了,任何ActiveRecord model只要加上輕量之人最愛的神秘一行,瞬間就具有了全文搜尋能力。

Ferret是用C寫成的,用語和基本觀念與Lucene一致。因此對Lucene有認識的朋友應該很容易上手。雖然說化身為雪貂很好用,不過O’Reilly的Ferret一書仍有一讀的必要。該書最後還介紹如何配合其他plug-in來index諸如PDF, JPEG EXIF等metadata,幾乎可以寫一套小型的Mac OS X Spotlight。而該書對於Ferret的構成、內部運作原理、performance tuning的介紹,也相當實用(而且,不需要先學Lucene;我也還在研讀這一部份就是了……)。

以下是我用的 RegExpAnalyzer,僅僅很簡單的把歐語的單詞拆開、數字拆開,中日韓文則以字元方式來索引。這種簡單的中日韓文tokenizing在搜尋精確度不要求高的場合,大體能用。要更好的搜尋結果,或是要做到同音字搜尋、簡繁搜尋,當然就需要更複雜的 Analyzer。

請找個地方填入以下的 regex 跟 Analyzer:

GENERIC_ANALYSIS_REGEX = /([a-zA-Z]|[\\xc0-\xdf][\\x80-\\xbf])+|[0-9]+|[\\xe0-\\xef][\\x80-\\xbf][\\x80-\\xbf]/
GENERIC_ANALYZER = Ferret::Analysis::RegExpAnalyzer.new(GENERIC_ANALYSIS_REGEX, true)

然後在想要加入搜尋的 model 裡加入:

acts_as_ferret({:fields => [ FIELDS_YOU_WANT_TO_INDEX ] }, { :analyzer => GENERIC_ANALYZER })

之所以不把 GENERIC_ANALYZER 放在 acts_as_ferret 裡,除了可重用性的原因,另外還避免掉在 Mongrel + Rails development mode 時可能造成的 bus error / segmentation fault (原因不明)。

總之,只要做完這件事,就可以:

Model.find_by_contents("hola")

acts_as_ferret很聰明,如果是第一次使用,會幫你把這個data model所用table全部讀一遍,建立必要的全文索引。之後所有的 CRUD 動作只要透過這個 model ,「化身為雪貂」會幫你做完所有該做的 Ferret indexing 動作。

先前有一些中文論壇提到用 /./ 來處理中文斷字(說「斷詞」或「分詞」有誤導之嫌)。雖然 Ruby 的 regex engine 在 $KCODE 設為 utf-8 時,可以正確地以 /./ 來掃描 Unicode 字元,但是這樣的作法是有問題的。英文詞因此會被斷成一個字元一個字元。而,單純用 [a-zA-Z] 則忽略了歐語,這是不夠的。

偏偏 Ruby 的 Unicode 支援只做了一半,不像 Perl 可以用 /\x{80}-\x{7ff}/ 的方式來表達 Unicode range,所以我們得祭出 jcode.rb 裡處理 UTF-8 的 regex (也就是利用 UTF-8 的特性),來找出實際上為 U+80 ~ U+7FF 以及 U+800 ~ U+FFFF 的字元。當然,> U+FFFF 的字元這裡並沒有處理,而且這個方式其實過於簡化。

但總之這是可以用的方法。如果要測試或改善 regex ,可以使用Ferret一書中第65頁所列的以下方法來測試:

def test_token_stream(token_stream)
  puts "Start | End | PosInc | Text"
  while t = token_stream.next
    puts "%5d |%4d |%5d   | %s" % [t.start, t.end, t.pos_inc, t.text]
  end
end

然後在irb中:

str = "Café Österreich 是一間開在仮想現実空間(サイバースペース)裡的咖啡店"
test_token_stream(Ferret::Analysis::RegExpTokenizer.new(str, GENERIC_ANALYSIS_REGEX))

就可以看到 RegExpTokenizer 執行的效果。

OpenVanilla subversion repositoy搬家

昨天(台北時間 2007/5/15 中午)我們在 OpenVanilla 討論區中發布了 OpenVanilla subversion repository 的搬遷通知。今天早上全部的 subversion repository 已經搬遷完成。

我們新的 primary repository 位於 http://openvanilla.googlecode.com/svn/。新的計劃頁面在 Google Code Project Hosting上。

先前在 OpenFoundry 上的 repository 將改為 read only mirror。原先的計劃頁面也有進行整理的必要。

Google Code 的 subversion 為 1.4 版。配合最近版本的 svk (2.0.1),已經可以將全部的 revision history 同步到自己的 depot 中,先前在某幾個版本會斷掉的問題應不會再出現。

Ruby Tuesday的投影片和錄音: Build Your Own Gem

謝謝大家前來本次 Ruby Tuesday,投影片錄音已經可以下載了。不過有一個地方講錯了一定要修正,那就是 gem install 時是可以順便做 test 的,只是預設為關閉。

« Prev - Next »