work-731198_640

我曾寫過一篇小說,關於城市與雪山,事實上一直沒寫完,即使曾那麼多次想提起筆來。

我曾,寫起一個故事,關於我的故事,我的世界,它的骨架現今仍堆在浮光掠影裡。

我曾,寫過一篇小說,關於天龍之鑰,關於闇與亮,只寫了一章就停筆,後來只是用個很怪的變體動畫出來。

我曾,想做一個 Flash 上的 RPG 遊戲,還請姊姊幫了 CG ,卻只做了走路系統就把它丟到現在。

我曾,學起了畫來,倒反畫、純輪廓畫、陰形、陽形,用奇怪的方式學習,結果還真的留下了幾張作品,上了高中,甚至畫起了長篇分支劇情的謎樣青春動畫(?),不過再一次的被堆進電腦深處,而上了大學更是從未提起過畫筆。

我曾,弄起了數位音樂,還任性的買了頗貴的麥克風,結果現在除了留下了一個很難聽的歌外,下一次的創作可能永不到來。

「夢,數學」、「迎風廊」、「開放學習網」、「交織夢想」……還有更多更多寫在筆記本卻從未實行的想法。

 

「自由行列」的想法從構思,然後寫下第一行程式、到現在至少也有四年以上了,原以為它也會慢慢退居幕後。但很開心的,第一個動的起來的自由行列實驗品誕生了!

ibus-faft : FreeArray for Test for the Input Bus.

由於 Freearray 和我的程式設計之路有太密切的關聯,值得寫一篇文章來寫它和我背後的故事。

忘記最早是在哪看到行列輸入法了,時間大概是 2005 還是 2004 左右吧,只記得有在 Jedi 的網誌上看到行列和 Dvorak 的介紹,便開始同時練習這兩種輸入方式,是從那時起我才學會了盲打。不過正如 Jedi 所寫,行列的符號輸入不太方便,所以行列並沒有成為我的標準輸入法。

後來對行列的接觸則是斷斷續續的,非常有趣的是,對我而言,在 Linux 平台之下的 scim-array,似乎比 Windows 下的行列輸入法帶給我更好的使用經驗,所以在 Linux 之下我偶爾還是會練練行列,在 Windows 下則是以新酷音為主。至少根據《Dvorak: 另一種鍵盤排列》 所述,直至 2007 年的 7 月,行列依然不是我的主要輸入法。

我一直認為行列輸入法很不錯,覺得因為符號等小問題而放棄它太可惜了。在 2006 年升高中的暑假,我帶著想改進行列輸入法和成為 Linux 程式開發者的憧憬,開始學起了 C++,踏入了程式設計的道路。當時甚至研究起 SCIM 和新酷音的程式碼,只是一直沒有什麼進展。進入高中後,開始寫起 ACM 之類的程式題,一開始還試著用從 C++ 學來的 class 等等在解問題呢。只是後來為了求快,就只用些 C++ 中的 C 了。當時,我用 C++ 大概就是在解這些問題了,算是在鍛鍊解決問題的基本功吧,對於程式開發的研究則很少。我曾試過要學 Shell Programming,也曾試著看《Beginning Linux Programming》,不過都學的不深。

高二進入資訊社,和同伴一起努力參加資訊競賽,那時遇到很多很厲害的人呢。另一方面,帶著想回歸實務的心情,重啟了改進行列的專案,雖然沒有寫下多少程式,不過在那時我發展出了行列定符的粗略概念。

2008 年 3 月,我在新酷音的開發討論群組上詢問了輸入法開發的入門方法,得到 jserv 熱心的回應。不過接下來,我得先開始全力準備學測才行。

2009 年 4 月,我透過 scim-array 把行列定符化為現實,自己覺得相當實用,之後在 Linux 下的標準輸入法也漸漸轉為行列。而隨著我使用 Linux 的時間愈來愈長,使用 Windows 的時間愈來愈少,行列幾乎可說變成我的主要輸入法。或許正因在 Windows 下再也沒有同樣方便的符號輸入方式可與行列定符相比,所以進一步把我推向 Linux 吧。

(這下 ibus-faft 一出,Windows 和 Linux 的輸入法鴻溝又更大了 XD)

後來,決定要為這專案取個名字,原本叫做 ArrayPlus,後來也考慮過「開放行列」,不過搜尋一下才發現原來早就有人想過類似的專案,所以就決定是「自由行列」啦。

此時也開始有用 SQLite 來處理自由行列資料的想法,雖然看了些書研究,可是並無太多進展。在 Autotools 上也找不到方法入門,直接看文件總覺艱澀。這時候有學習 Django 的想法,不過大概是沒有實際的專案可寫,所以沒能學多少,倒是讓我對 Python 開始有了點興趣,稍微看了一下。

大學,在老師的帶領下,從頭開始學起 C,這時我也看完了《C Programming: A Modern Approach》,不過對於自由行列的開發還是沒什麼進展。此時我參加了 IBM 的比賽,在解決問題的時候,突然發現有時候,就是要動手做就對了,這樣學得最快,另外在操作 DB2 的時候也學了不少 SQL 的語法。於是,比賽結束時的我終於決心要再一次開始開發自由行列了,並且在那時重寫了一部分行列碼處理的模組。只可惜一個星期之內,發生了許多事,讓我的開發再次停擺。接下來又忙著期末考和社團的事,一直到期末考結束,最後要回家前的那幾天,才再次開始我的程式開發。

當時,我正看著《Head First - Design Patterns》,想說要在回家前看完,另外,下學期也要開始學物件導向了,此時的我才發現對於 C++ 我還是有很多不會,而且當年看的東西也都忘了。所以決定一邊預習 OOP 一邊寫 libfreearray,雖然沒看完《Design Patterns》,不過還是試著應用了裡頭的一部分技巧。回家後,看起了剛買下的《C++ Primer》,也看起《The Definitive Guide to SQLite》,補回了一些資料庫的基本概念,雖然還沒看完,不過倒是把自由行列處理行列碼查詢文字的介面完成了。這時也開始使用 gdb 來為程式除錯。接著,我試著寫起輸入法資料處理的核心,不過物件愈搞愈多愈複雜。

後來,寒假規畫在程式開發用的時間也差不多快用完了。覺得再這樣下去,不知何時才會看到自由行列的誕生。又剛好在研究新酷音程式碼的進度稍有突破,發現似乎用新酷音斷詞模組來實現自由行列的可能性還滿高的。想說就暫時停止 libfreearray,開個 ibus-faft 分支,做個暫時可用的輸入法,也不管程式碼好壞,只要動的起來就好。原本真的以為是個能快速完成的實驗品,想不到卻花了好多時間。最後雖然遠超過原本分給程式開發的時間了,我卻停不下來,因為每次,總覺得就差那麼一點了。

行列碼和文字的處理直接從原本 libfreearry 的成果修改而來,而輸入法的主要資料架構以及詞彙處理則由新酷音負責,至於處理使用者輸入的部分則是全部重寫了。過程中,還用到了 Python 配合 pygtk 來繪製修改設定的介面,很多東西是邊做邊學。原本以為只要把注音碼換成行列碼就可以把新酷音直接拿來用,想不到還是得修改許多地方的行為。

真的不敢相信,好幾次都想放棄了,結果竟然完成了!為了做出 ibus-faft,我真可說是把至今所學都用上了,而這也只是剛好到位而已。很多部分其實是參考其他類似專案才完成。

很矛盾的覺得最後那幾天這樣密集的寫程式不是件好事,但完成了又好開心。

由於參照計畫與真實情形還是很有趣,我再把升大學的備審資料中的讀書計畫拿出來一下:

plan

這邊的短程指的應該是升大學的暑假吧。當時是有看一下《Algorithm Design》沒錯,不過其實只是隨意看看。我把這本書帶去了大學,一個學期下來,連一頁都沒翻,決定還是拿回家裡放了。ACM 考古題似乎也沒寫多少,在大學裡更是完全沒寫。探索程式開發環境應指的是 gdb, Autotools, svn 等東西吧。一直以來都找不到入手的方法,這次開發 ibus-faft,終於算是踏進入口了!要不是有 gdb,有些程式錯誤還真難抓出來呢,雖然現在我也只是會它的基本功能。Autotools 則只是參考各專案使用,不過也算是入門了吧,發現一個不錯的資源:《Autotools: a practitioner’s guide to Autoconf, Automake and Libtool》,還有得研究呢。

雖然也許只是一個小程式,雖然只是一個中途實驗品,雖然程式碼也許很難看。

可是這是我第一個開發出來可以實用的 C 程式,這也是我第一個在 Linux 上的軟體。

程式開發的漫漫長路,這裡,是一個新的起點呢。