電影流水帳(2011/2/23~2011/4/7)

脫逃出現在的世界吧…follow this link

  • Sorcerer’s apprentice(IMDB, Wikipedia),中譯:魔法師的學徒。不難看的電影。一開始就交代了魔法師的故事,一切從梅林開始。梅林在死後,大弟子勾結外面的惡魔法師要搶奪一個咒語,與梅林另外兩個徒弟打起來,後來兩個趁著惡魔法師沒注意,將她封了起來。封起來的代價就是大家都變成俄羅斯娃娃,只剩下尼可演的魔法師。在攸長的歲月裡,俄羅斯娃娃外面因為又封印了許多魔法師的緣故,陸續套上愈來愈多的娃娃。時間很快就到了現代,主角在小時候不小心遇到了魔法師,被梅林的遺物選為繼承者。他不小心放出了大弟子,導致魔法師為了阻止他,自我封印,兩人都到了瓶子裡。時間很快,過了十年,主角長大了,魔法師也因為咒語失效陸續被放出來,然後就展開了訓練、打鬥的過程,最後當然是主角變得很powerful,將壞蛋都收拾掉。主角是一整個弱掉,因為演魔法師的都是大咖,太搶眼了。
  • 涼宮ハルヒの消失(IMDB, Wikipedia),中譯:涼宮春日的消失。我是先看過小說才來看電影。電影的節奏有點悶,不過整個氛圍相當微妙,帶有淡淡的愛情感覺,還不錯。故事大致就是照著小說來演,這裡就不破梗了。總之,時間機器的設定真的是很好用啊!!(咦?這樣算破梗嗎?)

gcin筆記(2)

看了 gcin 的程式,覺得頗亂,命名跟檔名是有其規則,例如 pp 是指詞音、pho 是注音、gtab 是亂倉打鳥、倉頡…等,不過,對於要新增輸入法,並沒有 interface讓人知道說該實作些什麼。看到這裡有點想放棄了說~
連線的部份是 socket,但 event 的處理則是用 glib 的 io_channel (g_io_add_watch)。
當 client 第一次跟 server 建立連線,是在 cb_new_gcin_clients(),gcin_clients 在 cb_new_gcin_client() 被配置出來,這邊是在超過預先配置好的 gcin_clients 的時候,才以 trealloc() 去重配置。在一開始如果有太頻繁的client過來(仔細想想,好像不太可能),每次都重新配置,是不太有利的。但是如果改用 g_list 或 g_array 來做,感覺上又不是很划算。
server 收到 client request 的點是在 im-srv.cpp 裡的 cb_read_gcin_client(),裏面會去執行 process_client_req()。process_client_req() 在 im-dispatch.cpp 裡,拿到 fd,直接用之前在 cb_new_gcin_client() 預配置的陣列 gcin_clients 去做判斷、處理。裏面會根據 req_no 再去看要呼叫 ProcessKeyPress()/ProcessKeyRelease()…等函數 (在 eve.cpp 裡)。
參考 anthy 日文輸入法,好像比較好,因為同樣也是外部的library
下面是掃過 eve.cpp 以後,得到的一些東西:

  • feedkey_anthy()
  • feedkey_anthy_release()
  • hide_win_anthy()
  • show_win_anthy() => init_in_method() 會用到
  • move_win_anthy()
  • get_win_anthy_geom()
  • anthy_visible() => 給 win_is_visible() 用
  • init_win_anthy() => init_in_method() 會用到
  • anthy_get_preedit()
  • gcin_anthy_reset() => 給 gcin_reset() 用
  • flush_anthy_input => 給 flush_edit_buffer 用

看起來是要實作這些部份。
init_win_anthy(): anthy 是用 dlopen 的方式載入,這樣也對,可以省掉一開始不必要的配置。

gcin筆記

gcin輸入法以 INMD 定義,在 gtab-list.cpp 裡載入,從 gtab.list 載入,裏面決定了檔名、方法…
如果要加新酷音,

  • 在 method_codes[] 裡增加一個項目, !CHEWING
  • gtab.list 裡增加一個新的項目,新酷音 ] !CHEWING chewing.png
  • MAX_GTAB_NUM_KEY 也要再加1
  • load_gtab_list 一開頭把 method_type 寫死了,所以這邊也要加,inmd[16].method_type=method_type_CHEWING
  • 加 method_type_CHEWING

以上從 gcin-setup.cpp 的 cb_default_input_method() 開始追
callback 裡呼叫了 create_gtablist_window(),然後再呼叫 create_model()。從裏面的 add_items() 再看到 load_gtab_list() 而推導的。
從 GtkIMContextClass 的 filter_keypress 開始看: gtk_im_context_gcin_filter_keypress
大致上的架構是這樣子:
gtk_im_context -> gcin client <-> gcin server
eve.cpp 裡的 ProcessKeyPress 是處理 Key 的部份,所以這邊可以看到輸入法的切換、暫時切換為英文、選phrase…等等的處理。

好久沒用Vimana之gundo

因為看到了Gundo.vim,就想說來試用看看。
要安裝 vim 插件,當然就是用 vimana,於是就更新許久未用的vimana。依照vimana的readme,以cpanm來進行重安裝。但是卻無法安裝,cpanm告訴我有 “Can’t locate inc/Module/Install.pm”
太鳥了,去年有碰到此問題,但沒解決,果然有報應,該找出原因的還是該找出來,否則以後一直會遇到。亂找了一下,發現要安裝 libmodule-install-perl 才行,於是就立馬執行了 sudo apt-get install libmodule-install-perl。
接著再來安裝,是說,不知道為什麼,會有Test fail的情況,所以就省略掉測試,改用 cpanm –sudo –reinstall -n “Vimana的目錄” 這樣就大功告成了。

sis162u與ndiswrapper

原本以為linux的硬體相容性很高,至少好幾年前買的Asus USB無線網卡應該是要可以用的,結果,並不是我想的。不支援,就是不支援。
還好知道這支無線網卡的晶片是SiS162U,就上網Google了一下,發現大家都是用ndiswrapper來裝上Windows的驅動程式,然後讓它運作。
我裝的是ndisgtk這個GUI程式,安裝以後,執行ndisgtk,然後安裝sis162的windows驅動程式,就…大功告成了嗎?
不是,因為我用的sis162 windows驅動程式不知道有問題還是太舊,查了好久,後來我是去SiS官方網站抓了最新的105版的驅動程式下來裝,就沒問題了!!
所以碰到只有Windows驅動程式而Linux不支援的時候,可以用ndiswrapper + ndisgtk 試試看,也許就起死回生。

libchewing小記

libchewing的用法挺簡單的,我是先試 python 目錄下的範例,可是即便我把 Init() 裡的目錄改成對的了,還是不行。這邊要傳進去的目錄,要用 libchewing3-data 的安裝路徑,否則Init會出錯。
對照 test/testchewing.c 裡的程式以後,發現沒什麼太大的不同,可是就是不行,反正以後沒有要用 python 來寫,所以就算了。
最後是對照 test/testchewing.c 去寫一個小的程式,就可以運作了,test/testchewing.c 是一個很好的進入點。

讀Debian新維護人員手冊

Debian新維護人員手冊記下的:

  • 比較版本:dpkg –compare-versions ver1 op ver2
  • 添加環境變數到 .bashrc 以供識別:
    DEBEMAIL=your.email.address@example.org
    DEBFULLNAME="Firstname Lastname"
  • dh_make 可以快速的從一個 tarball 產生出 tarball 副本跟 debian 目錄,如:dh_make -f ../gentoo-0.9.12.tar.gz
  • control裡的內容,如分類、權重…等可參考 Debian Policy Manual
  • 可以用 dpkg-depcheck -d ./configure去檢查相依性,或者用 objdump -p foo | grep NEEDED 去看用了哪些 library
  • changelog 可以參考Debian Policy Manual, 4.4,是主要定版號的地方。
  • rules 可以用 fakeroot debian/rules target 來執行裏面的特定 target
  • 可以用 debuild 來自動化,在 .devscripts 裡添加
    • DEBSIGN_KEYID=”keyID”
    • DEBUILD_LINTIAN=yes
    • DEBUILD_LINTIAN_OPTS=”-i -I –show-overrides”

    ,然後 debuild -sa、debuild clean

  • 檢查套件:
    • debi xxxx_i386.changes
    • lintian -i -I –show-overrides xxx_i386.changes

AlbiteReader後續修正

J2ME裡的英文字型寬度不是固定的,所以顯示英文字的時候會怪怪的。利用 HashTable 去存英文字的寬度,至於中文字型還是固定,這樣英文顯示就比較漂亮一點了。
大致上就這樣,更新以後的檔案放在同一個地方,需要的人自己下載。
另記用 Sigil 的心得,儘量使用 p、blockquote 來做編排,段落的呈獻會比較漂亮,避免使用 br 來做斷行。簡單說,大致的編排就是儘量使用 html 搭配 css,而不要用硬幹的方式。

AlbiteReader的後續紀錄

AlbiteReader是一個可以在手機上閱讀 epub 電子書的軟體,原來只能看英文,下面是我改成可以看中文的紀錄。
原本很擔心怎麼build的問題,想不到下載 netbean 6.9.1 + J2ME 3.0 的版本就迎刃而解,先從AlbiteREADER的github網頁上把原始碼拉下來,接著用 netbean 開就行了,除了可以 build 也可以 debug (有emulator),這在後續追蹤問題上,給了我很大的協助。
netbean 這邊比較大的問題是在編輯主要畫面,就編輯 .midlet 檔時,如果選 flow 會整個當掉,我後來是根本沒機會看到,好在也不需要用到,其他的頁籤就都可以點,所以我就順手把主選單給中文化了。
之前有提到 Font 的問題,後來是整個翻掉,改成使用系統的中文字型,所以 AlbiteFont 類別其實是 J2ME Font 的 Adapter,作為一個中間的轉換,對原來的 AlbiteReader 來說,介面幾乎是一樣,只是底層顯示的方式改變了。
改了以後,根本沒辦法顯示,去 debug,才知道 Font.drawChar跟 netbean 給的提示不一樣,drawChar 的最後一個參數並不是 color,必須要給 Graphics.TOP、Graphics.LEFT…這些定位的參數才行,我後來是用 Graphics.TOP | Graphics.LEFT,簡單說,就是一個是上下的定位,一個是左右的定位,我就是固定靠左上角。
可以顯示之後,發現最右邊總是會出現半個字。原本以為是斷字出現的問題,大致追到TextPage,確定這裡是主要處理多少字為一頁的地方。再次利用了 debug,發現程式的思維跟我想的不一樣,程式的作法是根本不斷字,每行其實是一個 XXXRegion 的類別,Region 裡放的字串是好長一串,顯示的時候其實是這樣畫:12345678, 45678, 78…,所以根本跟斷字無關,一定會畫出半個字。我的處理方式是在 Font.drawChars 增加一個參數,在邊畫字的時候,就邊檢查,如果超出了這個值,就不畫了,這樣就避免了畫出半個字的問題。
整個改到這邊的時候,是很高興的,但是放到手機上,卻發現慢到一個不行。想了一個晚上,才想到,可能是取字寬度的問題,在看 TextPage 時,發現程式裡大量使用了取字寬度函數。因為我是呼叫 J2ME Font.charWidth(),每個字都去呼叫,而原來的處理,這些值都是固定的,而且字了不起也才 26 個英文字母 + 數字 + 標點符號,不會對程式有太大的負荷。但對中文字來說,如果每個字都去查,那肯定是很慢。這邊我的處理方法是在 initialize Font 的時候,就先把一個中文字的寬度記下來,假定每個中文字的寬度都一樣 (好在也都一樣),之後就用這個值去計算,這樣就恢復到原來的速度了。
回憶錄大概就記到這裡,如果有需要參考我的 code,可以到我 fork 出來的 github repository去拉。
要直接下載 .jar 的話,可以直接從這裡下載。

電影流水帳(2011/2/14~2011/2/22)

也是托網樂通的福。對遙控器的 play/pause 按鍵感到很火大,到底是為什麼在快轉/倒退時會那麼難按呢??

  • How to train your dragon(IMDB, Wikipedia),中譯:馴龍高手。維京男孩並不像一般的維京人,他打下了一條龍,並且發現了危害維京人的龍並不是單純因為想殘害他們而來搶食物,這個發現,不僅改變了部落的命運,也改變了龍的命運。我覺得很好看的動畫片,除了提醒自己當爸爸的要仔細聽懂兒子的話,也提醒自己要勇往直前,不要畏縮。
  • The Social Network(IMDB, Wikipedia),中譯:社群網戰。facebook網站創辦的經過,同時涉及了兩件訴訟案。被那兩個兄弟告,我覺得idea真的是先做先贏,這是有點沒道理,也不容易證明。但是被自己共同創辦人Eduardo Saverin告的那件訴訟,我就覺得Eduardo有點可憐了。不過最後都是以和解收場,算是皆大歡喜? 我覺得演那兩個兄弟的演員真的很帥又很壯,同事表示演Eduardo也很帥,只有主角比較不帥,不知道是不是導演故意的。