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

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

香草輸入法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與鼓勵,再次謝謝大家。

香草注音輸入法0.04版推出了

香草注音輸入法的0.04版已經發表了,從0.01版到0.04版以來,改進了許多地方不盡完美之處。核心部份則一直都很穩定。0.04版除了新增自動安裝程式(感謝Gugod提供相關知識)、改善「輸入法或視窗切換時,選字窗留駐不散」的舊問題外,說明文件也有大幅增補之處。新增的ui-schema.pdf則是從我當初分析注音輸入法的鍵盤行為草圖所整理出的文件。沒有意外或其他重大bug的話,這會是最後一個對Apple Basic Input Method做最小修訂的test run version。下一個版本將新建立Xcode project,程式碼也將有大幅整理,當然,那個小乳牛的icon也一定會換掉的。:) Zonble已經為香草注音提供了相當棒的logo design,下一版的香草注音,大家應該能看到zonble的icon design,出現在各位的桌面上。

另外我也一直在想,在後續的版本中,加入倉頡輸入法,讓「香草」能為更多被Mac中文輸入法所苦的朋友,帶來一點幫助。再次謝謝大家對香草注音的支持與協助。

香草注音輸入法發佈於OSSF的Open Foundry網站,相關訊息Wki在這裡,而軟體可由這裡下載

香草注音輸入法 0.01

2004/07/29:在許多朋友的協助下,香草注音輸入法已經出到0.04版了,請參閱本blog的這篇文章,取得與0.04版有關的最新訊息。

從PC跳船到麥金塔的使用者,另一個常碰到的問題是沒有好的中文輸入法可用。好比說像我這種還在用倚天注音排列法的奇怪化石來說,Mac上一直只有漢音可用,非常痛苦(因為我不習慣使用要選字的注音輸入法)。很奇怪的是蘋果這麼多年來,難到沒有想過,因為他們的「傳統注音」只支援標準排列法,不知道要讓多少PC使用者卻步?(倚天注音是很多長年使用PC的人唯一使用的注音排列法,甚至一些外國人也只會這一套,而不是「似乎很直觀,但其實很奇怪」的標準排列法。)

自從參與了由Gugod, mjhsieh, zonble等人發起的xcinicx計劃(唸作KSI-nix)後,開始對於改善Mac中文環境,有了更強烈的動機。和zonble一起研究SpaceChewing的原始碼,更是學到了不少東西。我利用xcin計劃中的phone.cin注音排列表,用C++寫了一個處理注音輸入的模組,並將xcin的資料轉成UTF-16,然後,再利用Apple所提供的範例程式BasicInputMethod,對其做最低限度的修改,一套合用的注音輸入法竟然也就完成了。我現在非常高興地能在Mac上恢復過往敲打中文字的感覺(而配上較軟的鍵盤,手感比過去的ThinkPad要更好,也更健康)。

目前這套名為「香草注音」(VanillaInput,開發代號暱稱為”gum”)為第一個公開release的測試版0.01,有許多來自Apple BasicInputMethod的程式碼還沒能清理乾淨,但核心部份已經可以順利運作了。「香草注音」的模組檔、安裝及使用說明,以及原始程式碼(還整理得不是很有至秩序),可以從Open Foundry取得計劃的摘要在這個網址而Wiki則可以在這裡找到

“hello, world!” and Urashima Taro (English)

In the Japanese folktale Urashima Taro, the young fisherman Taro was invited to the Ryugaku, or the Palace of the Sea Goddess, for his kindness that rescued a little turtle.

Continue Reading »

“hello, world!” 與浦島太郎

在日本民間故事《浦島太郎》(Urashima Taro) 裡,因好心救了落難的海龜,而被邀請入龍宮一遊的浦島太郎,渾然不知在龍宮的一晝夜間,陸上的世界已經悠悠過了三百年。在上岸前,龍宮公主給了太郎一個盒子,做為給太郎的紀念。太郎上岸後,打開了盒子,突然間,太郎從一位身強體壯的捕魚少年,變成了一位白髮蒼蒼的老人。

我最近就碰上了一件可以稱得上是浦島太郎般的事。

前一陣子我下載了新版的MinGW。這是一套奠基在 gcc (GNU C Compiler)、供Windows環境使用的C/C++編譯器。我好些年前就用過這套東西,用以取代先前流行的 djgpp

拿到新的編譯程式,想當然而,一定要拿個什麼程式來測試。拿什麼好呢?我的習慣還停留在寫一個 "hello, world!"。

然而,C++版的 "hello, world",竟然無法在新版的MinGW上編譯了。滿篇我完全看不懂的編譯時期錯誤,從我的 stdout(就是命令列模式的螢幕啦)上傾洩而出。

我發現,世界變了。

好心的朋友跟我說,不不,程式已經不是這樣寫的了。"hello, world" 的現代版應該是長成這個樣子的:

01: #include <iostream>
02: using namespace std;
03: int main()
04: {
05:     cout << "hello, world!" << endl;
06:     return 0;
07: }

為了解釋方便,每行程式前面我加上了行號。首先,iostream.h 消失了,取而代之的是不需要 .h 的形式。02行的namespace 是新東西。雖然我好些年前就已經聽聞,沒想到已經是正式的標準了。而且,最重要的是──沒有這第02行的「使用命名空間」指令,第05行的 cout 物件,編譯器是不認的!

「你難道不知道嗎?自從STL (Standard Template Library) 成為標準後,由於太多人使用相同的名字,命名空間被用光了,所以才會把 iostream 的東西放 std 命名空間裡呀!」好心的朋友是這樣跟我解釋的。

我覺得不可思議。

以前覺得有些事情是不會變的。沒有想到連教科書上做為C++語言的第一個範例,那個被認為應該是恆久不變的入門教材,新版的編譯器竟然不認了。兒童相見不相識,怒問客人的code是從哪個時代弄來的,滿紙荒唐。

這個時候我才突然想到,我不再碰觸任何跟程式有關的東西,讓我算算…… 從1994年到現在,正好整整十年的時間。

十年了。我最後一個還需要用到 makefile 的「計劃」,是整整十年前的事情了。在這之間,雖然偶爾還會從堆滿灰塵的 .zip檔中,挖出舊的程式和編譯器,玩弄一些小東西,但大體上來說我是遠離了寫程式的世界。完完全全地遠離了。

如今,連最簡單的程式,面貌都變了。而我,像是浦島太郎那般,打開了MinGW的盒子,發現自己從當時一個高中快畢業的小毛頭,來到了現在這個奇異的階段。

十年可以改變的事情很多。Linux成熟了,而「正義的味方」不再只有gcc,還多出了Perl、PHP、Python等所謂的 "3P"。中土世界因為Java而多了許多不必要的困擾。至於「黑暗料理界」則多出了ASP、C# (唸做 "C Sharp")、.net,以及在它們之前,每一兩年就新推出、被人大似吹捧的新資料庫存取模型(族繁不及備載)。十年前大家都還在用榆樹 (elm)、松樹 (pine) 在閱讀電子郵件,如今只剩下極少數的人沒被「外觀快遞」給收服。這樣的事還有太多太多。更不用提那些十年來起起落落的火燄舌戰,以及依然有效的摩爾定律。可以確定的是:雖然正義的味方越來越茁壯,但人們卻還沒有看到黑暗料理界倒台的可能 [1]

我把我的故事說給了 ilya 聽。他說:「能夠自廢武功到你這種程度,也真算是不容易了。」

是啊。

ilya問我當初為什麼做了那樣的選擇,我說那是個難回答的問題。難回答,不是說答不出來,而是那是個需要花時間說明白的過程。而那過程實在是太私人了。叨叨絮絮的成份多,虛妄、愚昧、無力、嘔吐(存在主義式的)的經歷也有。總之我目前都還不認為那是個我有能力處理(而你可能有興趣想聽)的故事。至少在我明白那整個過程的意義之前是如此。

但,不管怎麼說,在看似感傷的敘事線後,最近我倒是有了新的啟示:就在我慢慢恢復、或者說重新點燃了對電腦和技術世界的胃口後,我突然發現像我這樣一個全無武功(或者誠實地講是武功全無,後面這個用法預設了「先前有武功、後來卻丟失」的前提)的人,竟然對著各種新奇的東西充滿了好奇和興趣。我簡直,如新手般,墜入了科技眩目的世界中:

Miranda [2]: O Wonder!
How many goodly creatures are there here!
How beauteous mankind is! O brave new world!
That has such people in’t! (Shakespeare, The Tempest, 5.I)
米蘭達:「人類多麼地美!啊!美麗的新世界,有這樣的人在裡頭!」
(莎士比亞,《暴風雨》,第5幕第1景)[3]

附註

  1. 誰知道呢?當年某個為錢眼開的傢伙,他如果當時把做為DOS前身的程式碼丟進毀滅之山,那麼一切可能早就結束了。
  2. 做為某種令人不安 (uncanny; unheimlich) 的巧合,我的第一台notebook就叫Miranda。
  3. 中譯是從http://www.bwmc.org.tw/Tfr/tfr_02/tfr-02-01.htm找來的。

« Prev