前兩年有使用過,可是最近想起來時,卻發現什麼記憶都不剩,只記得好像是解決 cross domain 的方案。上網找了一下,終於讓我給想起來了,下面用我懂的話來寫,這樣下次又忘記時,可以很快想起來。
在利用 xmlhttp(或form) post/get 時,目標的網址(action)跟目前網頁的網址必須是在同一個網域上,否則會無法post/get。該怎麼解決呢?就要利用所謂的 jsonp。jsonp 是利用動態安插 script tag 的方式來繞過 cross domain 的限制,script tag 裡的 src 不受 cross domain 的限制,一般來說,src 裡的網址會多加一個參數 callback (當然,不一定要叫作callback),也就是說,後端收到這個 request 時,會去進行處理(一般會處理為json資料),最後輸出時,會輸出 javascript ,並且將 json 資料傳入你指定的 callback並執行,這樣就完成了。
本來以為 PIXNET API 可以直接利用 jsonp,就不需要另外刻後台來拉資料,結果今天去看時,發現沒有,大概是之前眼花了吧…
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 的話,可以直接從這裡下載。
chromium/chrome 裡的flash收不到space key
就不要用internal 的 flash。
啟動 chromium/chrome 時,加上 –disable-internal-flash 參數。
AlbiteReader的字型處理
org.albite.font.AlbiteFont
- ctor 開啟字型檔以後,就開始處理 (這邊是開 .alf)
- 格式
- 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)
- 讀完 .alf(字型資訊),接著開啟 .ali,這邊是真正的字型資料,先把整個 .ali 讀取到記憶體裡 (由 AlbiteImageMono 處理,同樣也有檔頭,但較簡單,前4個bytes是magic number,接著的兩個bytes是width,然後再來的兩個bytes是height)
- 把必要的字元先處理起來,像是 ‘ ‘, ‘?’, ‘-‘
- 其他的字元都是畫的時候,依據 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 的方式才能達成。