2007年5月31日 星期四

組字技術與手持式裝置的新機會

專注於中文技術的剎那搜尋工坊推出新版 (2007.05.26) 的「剎那字引」軟體,其概念相當特別,以「部件」來分析漢字 (泛指中日韓漢字) 進而可做出正向或反向的資訊化操作。就完整的中文處理系統來說,不僅要考慮畫面或裝置輸出,還有繁瑣的輸入法,但受限於異體字、錯別字,或可用性等考量 (特別是手持式裝置來說,得提供一定程度的「漢字容錯」處理),每每挑戰著設計者的技術水準,但這方面的議題並不是建立大量的state machine就可克服的,我們得從漢字本質去思考。

剎那字引」的執行畫面如下: (Win32/Delphi Application running via WINE/Linux)
我們可一目了然得知特定部件與其對應的漢字,這可用一致性的數學模式去表示,不過這裡就不贅述了,可參考Foxman前輩發表的一系列文章。對於手持式裝置來說,漢字的輸出與輸入之間即有一定程度的關聯,比方說手寫辨識就與組字在概念上有共通處,而漢字構形資料可作反拆或逆向查詢與推斷,意味著可運用於輸入法的輔助索引處理的機制,是此,即使是手寫辨識的操作,甚至可簡化為只需書寫偏旁,系統反推並決定候選字 (與其組合),大幅降低辨識的複雜度,或考慮到傳統的輸入法,這就是一個相當有效率的「過濾器」。

再來我們可回頭思考漢字系統長久以來的缺字問題,儘管桌面應用已經逐步改善此議題,對於手持裝置來說,仍是極大的衝擊。當然,國際大廠注意到這類需要對資源錙銖必較的裝置上,做完整中日韓多國語文處理的議題,本身就是兼顧技術、可用性、價格成本,與後端交換碼種種妥協的設計,所以IICore (International Ideograph Core) 標準被提出,預期成為手機、PDA等移動通訊產品的重要規格,原則上不超過一萬字,是Unicode的子集 (碼位大幅調整)。問題是,我們應著眼於深入更多觸角的移動通訊運算,不該僅用常用的表意文字來限制資訊系統的使用。人們都有使用行動通訊裝置的自由,卻往往受限於種種預設立場的桎梏,這是相當不合理的事情,勢必,技術上得有所突破。

基於以上考量,動態組字技術於手持式裝置的需求,越來越顯見其重要性,正如之前文章「紀錄:可攜式造字引擎專利釋放暨成果發表會」所提及的概念,我們可發現運算技術、文化需求,以及M化等因素的交錯即將邁入臨界點,未來將以何種方式呈現?不得而知,但我們實在有必要將基礎建設完善化。

2007年5月30日 星期三

GSM modem裝置模擬

系統模擬對於嵌入式系統開發來說,是相當重要的里程,不僅晶片層面如此,對於週邊來說,更可對應用程式開發帶來立即的效益,現在,OpenMoko-emulator也提供虛擬GSM modem的模擬。首先,依據之前的文章「透過USB連線與OpenMoko模擬裝置互動」,建立虛擬USB network連線,並透過ssh連線到虛擬硬體中,接下來就可以進行GSM modem的操作,畫面如下:(粗體字是打入的指令)

$ ssh root@192.168.0.202
root@192.168.0.202's password:
root@fic-gta01:~$ libgsmd-tool -m shell
libgsm-tool - (C) 2006 by Harald Welte
This program is Free Software and has ABSOLUTELY NO WARRANTY

O
# # Power-On
R
# Register
也可以不透過OpenMoko的工具,直接下AT command:(粗體字是打入的指令)
root@fic-gta01:~$ /etc/init.d/gsmd stop
Shutting down gsmd: Terminated
root@fic-gta01:~$ echo 1 >/sys/bus/platform/devices/gta01-pm-gsm.0/power_on
root@fic-gta01:~$ cu -E @ -l /dev/ttySAC0
Connected.

ATE1
OK
詳情可參考Marcin Juszkiewicz的文章 "How to check does GSM modem works",但對於openmoko-emulator也適用,甚至我們還可以模擬出各種不同的反應,卻不需要任何實體環境介入,這是相當有意思的手機軟體開發方式。

quilt - patch tools

quilt 是用來patch很多patches時使用,使用的方法是

quilt cmd
可以用
quilt cmd -h
來看可用的command有哪些。

因為是多個patch files,所以有一定的patch 順序,quilt會幫我們handle這些順序 (因為當初這些patch 也是由quilt 產生的呀)。就像stack操作一樣,push (apply) 一個patch;用pop 把sourcecode回到上一個沒patch的狀態。

所以,quilt也可以當作是簡易的Version control system用。

quilt的操作,將所有的pacth檔都放在要patch的source directory中的"patches"目錄。 (可以是symbolic link)

剛剛講的patch stack (patch 順序) 就紀錄在 "patches/series" 這個file中。

所以openmoko 的bootloader patch apply 的方法就是:
  • download u-boot latest versio (svn checkout lateset version)
  • download openmoko u-boot patch (是一個folder)
  • 把這個patch folder copy 到 download 的u-boot folder中
  • run quilt push -就會依照應有的順序apply 所有的patch.
That's all.

2007年5月26日 星期六

GCC Visibility與軟體最佳化

以前在blog文章「Qt Library 的精簡」提到GCC的C++ Visibility,其實官方的wiki已經描述相當清楚,引述如下:

"Why is the new C++ visibility support so useful?

Put simply, it hides most of the ELF symbols which would have previously (and unnecessarily) been public. This means:

  • It very substantially improves load times of your DSO (Dynamic Shared Object). For example, a huge C++ template-based library which was tested (the TnFOX Boost.Python bindings library) now loads in eight seconds rather than over six minutes!

  • It lets the optimiser produce better code. PLT indirections (when a function call or variable access must be looked up via the Global Offset Table such as in PIC code) can be completely avoided, thus substantially avoiding pipeline stalls on modern processors and thus much faster code. Furthermore when most of the symbols are bound locally, they can be safely elided (removed) completely through the entire DSO. This gives greater latitude especially to the inliner which no longer needs to keep an entry point around "just in case".

  • It reduces the size of your DSO by 5-20%. ELF's exported symbol table format is quite a space hog, giving the complete mangled symbol name which with heavy template usage can average around 1000 bytes. C++ templates spew out a huge amount of symbols and a typical C++ library can easily surpass 30,000 symbols which is around 5-6Mb! Therefore if you cut out the 60-80% of unnecessary symbols, your DSO can be megabytes smaller!

  • Much lower chance of symbol collision. The old woe of two libraries internally using the same symbol for different things is finally behind us with this patch. Hallelujah! "


事實上,對於許多採用C語言撰寫的專案也適用,而且效果很不錯。嵌入式系統開發時常常得控制程式空間使用量,咱們就來看看具體的案例,包含Nokia 770/800與OpenMoko在內的許多專案,採用X Window System,server端的實做是KDrive,而client端雖然只要能跟X Protocol即可,不限定程式語言與實做,但往往我們會透過libX11。就如筆者之前的演講與blog提及,X本身的效率其實很好,但問題在於複雜的軟體實做,其中有許多改進的空間,libX11就是一例。

剛剛做了些hacking,發現光是利用GCC的C++ Visibility來隱藏非公開的API/ELF symbol,即可大幅降低空間使用量,並提昇載入應用程式速度。

在Ubuntu 7.04上進行測試,同樣的libX11套件,施加我的修改:libX11-visibility.patch後重新編譯,比較兩者的差異: (stripped)
  • /usr/lib/libX11.so.6.2.0 (原本) - 964K
  • dist/usr/lib/libX11.so.6.2.0 (修改過) - 839K
相當顯著的差異,接著比較兩者透過size指令的落差:
textures datatype bss_seg decided hexunfilenamefilename
966896 14496 1596 982988 effcc/usr/lib/libX11.so.6.2.0 (原本)

textures datatype bss_seg decided hexunfilename
827962 11336 1224 840522 cd34adist/usr/lib/libX11.so.6.2.0 (修改過)

於是乎,我們可參照wiki上對於DSO的描述,這之間的意義不僅是空間的降低,對於Code optimizer來說,也允許更多積極的處理方式,最重要的是,符號解析的速度提昇,也避免潛在的符號衝突。這是很簡單的修改,但影響卻相當顯著,我們也可看到整個Gtk+/GNOME的架構仍有最佳化的空間。

2007年5月25日 星期五

OpenMoko演講影片上線


psilotum的協助下,5/8在Tossug聚會所演講的「Free your phone! OpenMoko」過程都完整的錄影下來了,在 Google Video 上甚至還可以清楚看到簡報內容。請享用!

Credits:

Speakers: Sean Moss-Pultz/Harald Welte
Host: Tossug/Ping Yeh
Organizer: Rex Tsai
Producer: psilotum


備註: 我們不是在甚麼奇怪的地方,背景是天邊一朵雲的法國版海報,Cafe Lumiere 只是一家貼滿海報的咖啡店而已。


Source: http://people.debian.org.tw/~chihchun/2007/05/25/talk-of-openmoko-is-online/