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

Archive for August, 2004

香草輸入法0.06版新增倉頡、簡易輸入法

一開始開發香草輸入法,是為了能在Mac OS X上用倚天排列打要選字的傳統注音。0.06版的香草輸入法,則加入了倉頡和簡易輸入法。(注音輸入法一直是支援傳統排列的)。在使用者介面上,除了感謝Zonble提供的香草logo,所有的功能終於都可以在輸入法選單裡選取了。不再有煩人的CTRL-OPT-I和CTRL-OPT-K組合鍵了。

vanillainput006-screencapture.jpg

由於我一直使用注音輸入法,「香草」在注音上若是有任何缺陷或我不滿的地方,修訂的速度一定比較快。我不知道「香草倉頡」或「香草簡易」是否能符合這兩種輸入法使用者的需要,如果您有任何想要增加的功能,或是發現了任何急於修正的軟體缺陷,請不吝和我聯絡,或者(更建議您)試試看OpenFoundry的回報系統來參與軟體的bug tracking和功能討論。

您可以在這個頁面中取得香草輸入法0.06版

在發佈0.05 preview版的時候,我說0.05版應該是最後一個奠基於Apple BasicInputMethod(BIM)的版本了。我這陣子除了忙於工作,也花了時間在研究如何將BIM重寫成C++的版本。只是最近時間實在有限,0.06版的許多功能添加,幾乎是在一種令人快崩潰的絕望中完成的,程式碼已經亂到慘不忍睹了,尤其是BIM顯然是舊時代(ancien régime)的產物,很多時候,我只能把所有程式碼丟在一起,然後祈禱能執行(often, I was so desperate, that I could only throw all codes together, and pray that they would compile)…… 看起來最早在一些地方下工夫還是值得的,至少注音模組一直都相當地穩定。不過,如果香草還要再繼續發展下去,一定不能再這樣胡亂堆程式碼了。Refactoring in urgent need!

最後希望在這裡和大家討論一個問題,那就是香草要怎麼加入香港字集、甚或是簡體字的支援?因為,Apple的Carbon模組,內部的Unicode支援,只有UTF-16,然而,許多香港字集(BIG5-HKSCS)對應到Unicode時,卻是在字碼0×10000以外的字(也就是4-byte的UTF-8 code)。當然,另一個我很想加入的功能,是使用者自訂輸入法資料,甚至,是仿傚xcin,寫做一套「通用輸入法模組」,這樣一來,xcin的大易、行列等資料檔,應該就都可以拿來利用了……。

喔,對了,這篇blog同時載於#osxchat blog這個園地,歡迎大家一起來分享OS X的使用經驗、參與OS X的相關討論!

香草輸入法0.05(preview release)

香草輸入法0.05版可以從Open Foundry下載取得

其實這個程式一直沒有固定的中文名字。我自己經常在「香草輸入法」和「香草注音輸入法」之間變換。不過,這個preview release的0.05版(2004/7/31)或許真的可以稱為「香草輸入法」或者就簡稱「香草輸入」了。不不,我並沒有真的「研發」了什麼新的輸入法,只是在0.05版裡,把倉頡輸入法加了進去,而且可以穩定運轉了。

那麼,這樣的模式既然被證明行得通,要再加入新的輸入法,應該難度(difficulty)不會更高。現在的問題是複雜度(complexity)和藕合度(coupling)。這樣就涉及到一個問題,即現有的「香草」,仍然是在匆忙草率的狀況下寫完的。我一直沒有擺脫「對Apple Developer Connection提供的Basic Input Method做最小補丁修改」的原則。如果「香草」要繼續長大,那麼架構上勢必要有一番重整,包括有很大一部份程式,等於要scrape(作廢丟棄)掉,重新寫過。這種感覺就跟辛苦寫完兩萬字中篇,才發現一開始的人物心理狀態就錯了,走不到尾巴,最後只能全部重寫一樣(我沒有太多其他類型的藝術經驗,只能拿寫作作為類比),對任何一個作者來說,這絕對都是極痛苦的決定。我一個禮拜以來沒有再對「香草」做什麼新動作,除了(感謝老天!)嚴重的bug幾乎沒有,因此沒有新的debugging要做之外,一方面也是我自己在拖延這件應該要做的事。

講完了感想,竟然還沒講怎麼使用。我多了一個功能鍵,CTRL-OPI-I是用來切換注音/倉頡的。這一版「香草」的倉頡輸入法資料,同樣取材自xcin的cj.cin。xcin的倉頡輸入法據朋友b6s的分析,應該是第三代倉頡(「香草」下載區的emucj.zip有個小perl程式,可以用來敲入倉頡鍵碼,來搜尋cj.cin的內容,同時敲進第三代和第五代的倉頡碼,只有第三代有搜尋結果)。再怎麼說,這應該都比OS X內建的倉頡輸入法要來的合理得多。根據mjhsieh轉來的資料,OS X的倉頡雖然可以用五代倉頡碼輸入字,但竟還保留了許多早年不可思議的特色,像是用「重」字碼來挑選重覆字等等(我不會倉頡,這裡講的細節可能有誤)。Autrijus和我作一偈云:「牧遙宣宣岸,倉頡重重難」,希望「香草倉頡」能為大家減輕一點「重重難」。

必須要說的是,xcin的cj.cin,是有包括香港Big5延伸字集的。但是我發現Perl的piconv似乎沒辦法把香港字集的字,完整地轉成UTF8。這個問題我還不是很瞭解原因在哪裡。目前的處理是,香草完全不用cj.cin後半部的香港字集,意思是說香草的倉頡只能打出台灣在用的Big5繁體字而已。

對於真正需要倉頡輸入法的朋友,CTRL-OPT-I當然是行不通的。因為每進一個新應用程式就得重設一遍輸入法(雖然一旦設好之後,在離開該應用程式前,設定會一直有效)。造成這樣的不便,只能說是我的偷懶。當然,一方面也更加證明了「對Basic Input Method做最小補丁」已經碰到了這個設計原則的玻璃天花板了(the glass ceiling of such design principle)。下一版的「香草」第一個要加的功能,一定會是「使用者偏好設定」。只有這樣才能一勞永逸解決切換輸入法的問題。

因為CTRL-OPT-I的問題,才想起「香草」引起了一些朋友的誤會。許多朋友一直以為「香草」只是「支援倚天排列的傳統注音輸入法」。事實上「香草」也有標準排列。當然,一方面排列必須用CTRL-OPT-K切換,同樣造成了極大的不便,另一方面,OS X裡的注音輸入法,本身就是標準排列的,這使得「香草」對於已經在使用標準排列的傳統注音使用者來說,意義不大。

倒是,有幾個地方值得努力的。例如,加入倚天26鍵和許氏注音排列,就是值得做的事情。另外,如果使用者能加字(例如我習慣的「呢」是一聲,但很多人在漢音和酷音,卻是習慣打輕聲的「呢」)、或者增補原來xcin的phone.cin的不足(例如加入「堃」這個原不在標準Big5範圍內的字),甚至,加入「用注音打簡體字」或「用注音打日文漢字」等功能…… 這些其實都只是在phone.cin資料層次上就可以解決的問題(可以用diff的方式來做patch)。但因為目前「香草」是把資料表編死,「編」進程式碼裡(這完全是偷懶和功力不足的表現),因此資料層次的擴充性很低–除非把phone.cin改完後,重新執行「香草」的mergecnv這道shell script,並重編整個程式碼。

最後講講這個”preview release”的0.05版有哪些東西。首先,在注音輸入法部份,新加入”<"和">“兩個換頁鍵,這是我從倚天中文(「飛碟一號」)以來就養成的習慣,看來真的是改不掉了。

另外,在原始碼層次上,我把注音輸入法的程式庫給拆開了,放在了vanillalib_phone這個目錄。倉頡輸入法則放在vanillalib_cj這個目錄。有了注音輸入法的經驗,倉頡的程式庫有了較新的設計。「香草」的倉頡(或許可以稱為「香草倉頡」)程式庫完全是以C++寫成的,在程式介面部份完全OO化–那是講好聽的說法,講難聽一點其實就只是「包裝得好看一點」。金玉其外,倉頡的搜尋部份,是用最偷懶的stdlib.h的bsearch()作完的。有了這樣的經驗,接下來要做的恐怕就是再高一層的抽象化(abstraction),例如寫作VanillaAbstractInputMethod這樣的class。哇,聽起來就很不優雅,很噁心。至於負起輸入法UI大任的VanillaEventHandler,程式還是一團糟,只能等待下一次重寫時一次清創完畢。

因為是”preview release”,相關的文件還來不及同步更新,就以這份簡單的文件,說明0.05版裡有的東西。

我實在不是個認真寫程式的傢伙,coding得少,感想卻寫了一大堆。只是覺得這是相當有趣且難得的學習經驗(必須要說是站在許多人的肩膀上)。如果沒有open source,我根本沒有機會為著自己本初的需要來「寫」一套輸入法。如果沒有open foundry,我可能得從頭建立網站、弄Wiki,而且不會有foundry那麼好的bug tracker。接下來要學的東西,除了Xcode之外,還有版本管理、研究open source licencing的問題(誠實說,一直到最近,我才真的逐條讀完GNU General Public License v2以及其Documentation License)。

最後講兩個延伸出去的話題。

首先,在clkao的提醒下,我在想IIIMF這個跨平台的輸入法計劃是個相當重要的方向,尤其該計劃的視野更大,涵蓋的輸入法不僅只有兩岸三地的中文,還有日、韓、泰文等。Clkao提到,IIIMF有”EIMIL”語言(XML-based),可以用來設計輸入法。新的輸入法應該是一個generic EIMIL processor,把使用者指定的輸入法行為翻譯出來,而不是針對各別輸入法做specific case。這個方向的確是重要的,且在X11和Windows上都有可以run的程式碼了。比較起來OS X反而是未開發的一塊地。

最後,在OS X的輸入法這邊,最近才發現到原來除了Carbon可以寫輸入法,Apple的新一代程式框架Cocoa也有自己的輸入法架構。範例程式在Xcode的/Developer/Examples/AppKit/HexInputServer,但是說明文件老舊有誤,實際執行起來,竟然只有用Cocoa寫的程式可以使用。可惜,因為Cocoa寫成的輸入法都是Objeictive-C模組,光是程式碼的漂亮程度,就比用C/Carbon寫的input component不知好上幾百倍。

這一個禮拜以來繼續有許多朋友給予他們的input, feedback與鼓勵,再次謝謝大家。