pixnetalbummaker(2)

GAEO 0.5 beta用的不順,再加上開發已經停止,所以還是用回文件相對比較多的0.3版。

之前從trunkly-python抄來的代碼不太適用於PIXNET API,所以稍做了改動,原本是這樣使用的:

print( pixnet.get_users_elleryq() )
print( pixnet.get_album_sets( {'user': 'elleryq' }) )

現在得這樣用:

print( pixnet.get_users( "elleryq", {} ) )
print( pixnet.get_album_sets( parameters={'user': 'elleryq' }) )

是說,應該要好好來研究一下cross domain的xmlhttp,這樣根本就不用寫後台了,直接呼叫PIXNET API就好~

好久沒用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的目錄” 這樣就大功告成了。

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 的話,可以直接從這裡下載。

AlbiteReader的字型處理

org.albite.font.AlbiteFont

  1. ctor 開啟字型檔以後,就開始處理 (這邊是開 .alf)
  2. 格式
    • byte 1: line spacing
    • byte 2: line height
    • byte 3-6: glyphs (character range)
    • byte 7-8: maxium width
    • byte 9-12: character count
    • 接下來就是循序讀出各字元的 x, y, w, h, xo, yo, xa
      • byte 1-2: character
      • byte 3-4: x
      • byte 5-6: y
      • byte 7-8: width
      • byte 9-10: height
      • byte 11-12: xoffset
      • byte 13-14: yoffset
      • byte 15-16: xadvance 下一個字元跟目前字元的間隔
    • 再放到對應 character 的 glyphs 陣列裡 (glyphs[character]=new Glyph(x, y, w, h, xo, yo, xa)
  3. 讀完 .alf(字型資訊),接著開啟 .ali,這邊是真正的字型資料,先把整個 .ali 讀取到記憶體裡 (由 AlbiteImageMono 處理,同樣也有檔頭,但較簡單,前4個bytes是magic number,接著的兩個bytes是width,然後再來的兩個bytes是height)
  4. 把必要的字元先處理起來,像是 ‘ ‘, ‘?’, ‘-‘
  5. 其他的字元都是畫的時候,依據 glyphs 資訊去存取記憶體裡的 buffer

照這樣看起來,如果要依樣畫葫蘆,將中文字型製作成 .ali 的話,會遇到的問題是記憶體問題。AlbiteFont 會將整個 .ali 載入到記憶體裡,製作出來的 .ali 會有多大呢? 假設字的大小是12×12,要完整收文泉驛的20932個字,那大約是3MB左右。依照 SE T700 的規格,內部記憶體只有 25MB。未知的是可用記憶體,所以必須考慮最壞的情況,記憶體會不足!!
會使用自己的字型,我想應該是考慮到平台相容的問題。

epub二三事

今天剛好看到這個百年千書計劃,裏面提供了一堆epub,於是就想說,可不可以放到我的手機SE T700上看呢?
就上getjar上找,就找到了Albite Reader。很高興地下載程式跟epub下來放到手機上,可以執行,但是結果卻都是一堆 ?
這到底怎麼回事,首先我試了軟體的編碼設置功能,沒有用。我懷疑 epub 裡的編碼是big5,而軟體的編碼選項裡卻沒有 big5,所以就上網找了一下,看要怎麼編輯 epub。看到這篇:Edit ePub eBooks with Your Favorite HTML Editor,才知道原來 epub 其實是個 zip 檔案,將副檔名更名為 zip 以後,就可以解開去看了。然後也發現了不錯的編輯工具:sigil。不過都沒有用,epub 裡的編碼是正確的。
那麼問題就出在軟體本身了,幸好軟體有開放原始碼而官方網站也有說明。大致看了官方網站的說明以後,才明白,問題出在字型上。軟體本身沒有包中文字!!!!這就麻煩了。官方網站也有說怎麼製作字型,不過他所使用的 Bitmap font generator 卻沒有支援中文字,因此無法產生出必要的 .png 跟 .xml 檔案,也沒辦法繼續後面的步驟,將 .png, .xml 轉成 .alf, .ali 了。
傷腦筋,看來如果要能用,一個方法就是寫程式去做出 Bitmap font generator 的功能,將字型轉成 .png, .xml,另外一個方法就是改寫 Reader 裡處理字型的部份了。
我想寫工具來轉字型應該是比較快的方法,在 AlbiteFontBuilder網頁裡有提到 .xml 的格式,看起來是將字型都顯示在 .png 以後,.xml 則是描述字(glyph)在 .png 裡的位置跟寬高。得到這個以後,應該就可以接著用 AlbiteFontBuilder 做出 .alf 與 .ali 了。

Google reader expanded/list hack

google reader
最近把Google reader的tag都設到書籤裡去,想說這樣會比較快。
可是卻遇到一個問題,某些tag要看的時候想用Expanded,但某些tag卻想用List。本想說Google reader是不是可以藉著設URL Parameter的方式來解決這問題,查了Unofficial 的 Google reader API,卻沒找到答案。
只能手動 Hack 了。
啟用神兵 Firebug 查看以後,Google reader要show Expanded/List,是送 POST 到 https://www.google.com/reader/api/0/preference/set?client=scroll ,然後帶上3個參數:T、k、v ,T 用途不明,k 總是 is-card-view,v 在 Expanded 時是 true,List 時則是 false。
所以,看來是沒辦法,除非是書籤改用 javascript,寫成 bookmarklet 的方式才能達成。

竹取js

雖然官方的網頁上是日文,我看不太懂,不過好在他提供的範例很容易了解,看來是不難用。
如果想要用 gtk+webkit+竹取js 來顯示直書,問題大概就會出在翻頁上了。用Space/Shift+Space 或 PgUp/PgDown 都可以翻頁,但如果想改變某些按鍵的行為,如 h/l 、Left/Right、Up/Down 來做翻頁的話,可能就要再找資料來看了。
想用這來改寫pymbook看看。

Lettering.js

剛好看到,就連上去 Lettering.js 看了一下,不覺得有什麼特別的。
看了原始碼,就只有看到呼叫 $(“.your_class”).lettering(); 而已,實在是很簡單,但是網頁上的效果卻又不是圖檔或是flash。再更仔細看網頁的 css 之後,發現有 .char1, .char2….或是 .word1, .word2…等的定義。啊~看來這就是關鍵了,只要你的 css 裡有定義這些 class,再呼叫 .lettering() 之後,lettering 就會幫你把這些 class 套用到 jquery selector 選取的字或詞(參數帶 ‘word’)上。
真的是挺方便的 jquery plugin。