2010年2月20日星期六

ibus-faft 開發日誌

FreeArray for Test for the Input Bus 是基於 ibus 輸入法架構所製作之行列輸入法引擎,其結合來自 libchewing 的斷詞模組實作智慧選字功能,並利用「行列定符」改進原行列的符號輸入。此外,對 dvorak 鍵盤具有完整支援。

在開發過程中,除了引用大量 libchewing 的程式碼外,也參考了 ibus-array, ibus-chewing 的程式碼才得以完成。

時間大約是在 2010 年 2 月初直到 2 月中,連續而密集的開發。

libchewing

研究 libchewing 其實已經頗久了,直到現在對它的了解也才只是剛好得以把斷詞模組和一部分的輸入處理拿來用而已。為了配合 faft,而對 libchewing 做了些改動,主要是把 Phone 換成 ArrayCode,但也對一部分行為做了小修改,程式碼的改動應該都有用#ifndef FAFT_CHEWING / #ifdef FAFT_CHEWING包了起來,所以應該頗好追蹤的。

詞樹資料的創建是用了一系列工具轉換出來的,不過因為寫的時候是基於 C++ 版的 libfreearray,而且很亂沒整理,所以並沒有放在 ibus-faft 之中。檔案很大的一部分原因是同一個字有很多行列碼的表示方法,並且文字編碼長度比原新酷音長,另外,不小心把特別碼也轉進去了,不過一直提不起勁來重新轉換 XD。

資料處理

行列碼和中文字以及鍵盤排列轉換的處理,是從 libfreearray 中 C++ 的版本改過來的,處理中文字、行列定符、詞彙輸入的詞庫、特別碼及簡碼,都是由這部分負責,透過 SQLite 來存取資料。而斷詞用的詞庫,以及簡易符號輸入,則是用 libchewing 的檔案格式,詞彙輸入的詞庫和斷詞的詞庫我並沒有統一資料。另外,我把 libchewing 中使用者詞庫的功能移除以降低開發的複雜度。

對於 SQLite 其實還不是很熟悉,設了一些 index 也不知是否有必要。主要的參考書藉是《The Definitive Guide to SQLite》,以及官方文件《SQLite Documents》

核心輸入模組

其實原本我想把輸入處理全寫到 ibus-faft-engine 中的 process_key_event(),然後呼叫一些 libchewing 的,或自己寫的函式。想不到後來慢慢把很多東西都移進 faft 中,再由 ibus-faft-engine 來呼叫 faft 裡的函式,所以 ibus-faft 就不用呼叫 libchewing 的函式了。事實上是,現在要把 faft 拿出來,放進 scim 或其它輸入法架構,都變成一件有可能的事。我也因此得以寫了一支 faft-test 程式,配合 gdb 偵錯,對 ibus-faft 的開發有很大幫助。

對於輸入法資料 FAFTContext 其實改動很多次,本來還另外寫了 FAFTData, FAFTOutput,再試圖引進 libchewing 之中,但最後變得非常複雜,所以還是直接改動 ChewingData, ChewingOutput,再把它們引進 faft 之中。faft 的介面曾改動過非常多次才變成現在的樣子,所以其實在某些地方可能會有一些功能重複或沒有用到的遺跡。另外就是一些狀態變數設了很多,最後好像也不見得有用。

與 ibus 的介面程式,絕大多數都是參考 ibus-chewing 所做,一部分則是從 ibus-array 而來。

關於 Settings

在製作 Settings 介面時,我選擇和 ibus-array 一樣,透過 Python 來做,一方面是因為覺得可能比較簡單,二方面是正想學 Python,不能放過每一個機會。過程中比較有趣的是,正值沒有網路的寒假,我又沒有用過 GTK+,在電腦裡只找到一份以前想學 GTK+ 時下載的文件,只是那份寫的是 C,所以跟 Python 又有點不一樣,所以其實很多地方都得「猜猜看」,還得常常用 dir() 之類的。原本製作時是想拿 ibus-array 的來改一下即可,不過最後似乎重寫了絕大部分,順便也是在練習 Python,並一邊閱讀著《Python documentation》

Autotools

在初期,是自己寫 Makefile 來編譯 ibus-faft 的,直到末期才把 Autotools 的部分補了上去。主要是參考 ibus-tmpl 的檔案,以及《Autotools: a practitioner's guide to Autoconf, Automake and Libtool》,才得以完成。

2010年2月15日星期一

簡介自由行列專案

本持自由軟體,Release Early, Release Often 之精神,我實在應該趕快把自由行列的程式碼公開出來。不過覺得程式碼實在太醜,而且其實根本也還沒寫出什麼,再者我現在其實是一邊寫一邊學 OOP,因此程式碼常有大幅改動,再者又覺 SVN 操作好麻煩,所以遲遲未發。

不過為了避免自由行列的想法消失在歷史之中。於是決定,先把自由行列專案的簡介發出。

簡易使用

行列輸入法雖然是用字根組字的輸入法,然而由於其字根的特性,需要花的記憶心力其實是比較小的,只是為了求快或者避免選字,時常必須記憶特別碼或簡碼。並且因為有些組字必須選字,而有些則不用,使得要時常注意螢幕或者把它的行為強記下來。

引入智慧選字的功能之後,自由行列的新特性將是簡易。也許不再追求最快的輸入法,但是卻有機會成為組字輸入法中最易上手,選字機會最低的輸入法。每次出字時,不會再有依是否要選字而有的不一致行為,同時我也想將加上特定字尾才能輸出難字的功能去掉,而藏在「w」中的符號表,也被拿到「`」之下。如此一來,輸入的一致性將大為提高。

符號輸入

符號輸入是自由行列要改進的核心事項之一。除了符號表之外,還有從透過從行列字根發展出的「符根」輸出符號的「行列定符」,以及透過英文鍵盤,輸出全形中文符號的簡易符號輸入。

使用過行列輸入法的人,即使不用特別說明,只要看到以下符號表,就會明白行列定符的意義。由於和字根非常相似,幾乎不用什麼記憶。

1^	=	5^	」	8-	\
1-	─	5^5^	』	8v	‘
2^	「	5-	〉	8v8v	“
2^2^	『	5-5-	》	9^	※
2-	〈	5v	)	9-	/
2-2-	《	5v	)	9v	’
2v	(	5v5v	〕	9v9v	”
2v2v	〔	5v5v5v	】	0^	:
2v2v2v	【 	6-	、	0-	。
3-	!	7^	?	0-0-	·
4-	+	7-	,	0-0-0-	…
4-4-	#			0v	;

在輸入完符碼後,按下 Shift+「詞彙鍵」即可輸出符號。

簡易符號輸入則是像新注音或新酷音那樣,在全型模式下,可輸入英文符號而輸出中文符號。此外,各種符號都可在緩衝區中再按下選字鍵選擇類似的符號。關於簡易符號輸入其實還是有很多改進的方法,有待開發。

事實上,對於符號輸入的改進,一部分的原因是要完全解決 Jedi 在他文章中所提出的跨 qwerty/dvorak 鍵盤時會遇到的問題。透過行列定符,使用者可以在完全不知道英文鍵盤的符號在哪的情況下輸出符號,讓行列自成一體系。而特意加強的簡易符號輸入,則是可依不同鍵盤輸出對應的中/英文符號。

繁簡分離

行列輸入法的字根除了可以用來拆繁體字外,其實也可以輸人簡體字。原本的設計是在輸入特定字尾時輸出簡體,但我想將簡體輸入獨立出來做為簡體模式。也就是說,我想嘗試讓自由行列具有做為一個簡體中文輸入法的可能性。

不只是輸入法

在製作 libfreearray 時,我所考慮的其實不只是輸入法而已,而是要將其發展成自由行列的通用函式庫。例如 typing tutor 或查碼程式,或其他更多的應用,都可基於其上發展。特別是一個可以在 Linux 平台上執行的 typing tutor,更是我將來有機會想實行的方向。覺得行列輸入法實在是一個很好的輸入法,現在似乎不太多人學,實為可惜。

手機輸入法

行列輸入法做為一個用數字排列字根的輸入法,自然具有成為手機輸入法的潛力,甚至要做到只有十鍵輸入,且不看螢幕都有可能。libfreearray 既然想成為行列的通用函式庫,最後很可能會希望建立起一個具有原始拆字字根,而非減縮後的 30 字根,的文字資料庫。屆時,當可研究如何製作手機輸入法。想來,要把行列字根轉到手機上其實有很多種做法,優缺點也不一,有心人可細細研究。

也許後來手機的鍵盤將不再有十鍵的限制,但行列做作手機輸入法的可能性還是令人憧憬。

2009年3月29日星期日

Ubuntu 安裝筆記

Ubuntu UserDocumentation

螢幕解析度設定

sudo gedit /etc/X11/xorg.conf
Section "Monitor"
        ...
        HorizSync    60.0 - 60.0
        VertRefresh  60.0 - 60.0
        ...
EndSection


Section "Screen"
        ...
        SubSection "Display"
                Viewport   0 0
                Depth     24
                Modes    "1024x768@60"
#               Modes    "1024x768" "800x600"
        EndSubSection
EndSection

設定網路

設定網卡(ADSL):

sudo gedit /etc/network/interfaces
auto lo
iface lo inet loopback


auto dsl-provider
iface dsl-provider inet ppp
pre-up /sbin/ifconfig eth0 up mtu 1492 # line maintained by pppoeconf
provider dsl-provider

auto eth0
iface eth0 inet static
address 192.168.2.4
netmask 255.255.255.0
gateway 192.168.2.1
mtu 1492

設定 ADSL:

sudo pppoeconfig

防火牆:

sudo aptitude install firestarter

設定音效卡

http://ubuntuforums.org/showthread.php?t=789578

Specifying a preferred card with asoundconf

asoundconf list

lists your available sound cards, then

 asoundconf set-default-card NameOfCard

will create or make changes to ~/.asoundrc

設定佈景主題

Gartoon Redux Dogmastik
cd /usr/share/themes
cd /usr/share/icons

設定影片、特殊格式編碼

RestrictedFormats Medibuntu

設定由 mplayer 產生影片縮圖

Mplayer-video-thumb

Firefox 設定

sudo apt-get install sun-java5-jre sun-java5-plugin sun-java5-fonts

安裝 VirtualBox

VirtualBox

安裝 Miro

Miro

設定語言

設定字型

使用管理員權限,將字型檔複製到"/usr/share/fonts/truetype"中(建議自己新增一個子目錄),然後執行"sudo fc-cache -f -v"即可。

sudo aptitude install stardict vim-gnome p7zip-full p7zip-rar nautilus-gksu nautilus-open-terminal
sudo aptitude install smplayer isomaster screenlets filezilla pcmanx-gtk2  vlc audacious
sudo aptitude install gnome-mplayer gparted build-essential scim-dev
sudo aptitude install easytag

Install Longman Dictionary of Contemporary

sudo apt-get install libgtk1.2
把兩張光碟內容複製到同一資料夾
cd /CD Folder/linux/
sh installation.sh
sudo apt-get install mozilla-mplayer
sudo apt-get remove totem-mozilla

Install Ubnutu Studio Apps

https://help.ubuntu.com/community/UbuntuStudio

AutoFsck

AutoFsck