XMP and Cell ID

去年就看到這篇文章:Cell ID Photo PC Tool 0.3,想試試看了。因為是c#寫的,照理來說,Linux 上的 mono 應該可以用才對,哪知道卻發現他用了 System.Windows.Media.Imaging 這個 mono 沒實作的類別庫。
沒辦法,於是就想說用 python 寫一個好了,當作練習。
首先遇到的問題就是 cell id 怎麼取得,原本以為是在 exif 裏面,用了 PIL 去撈,卻沒撈到。胡亂找了一陣,才知道這是放在 XMP metadata 裏面,得用 XML toolkit sdk 來撈才行,python 也是有 binding:Python XMP toolkit,只是得另外裝,ubuntu 沒有包進去。

是故,得先裝 libexempi3 (sudo apt-get install libexempi3),再下載 Python XMP toolkit,解開後,執行 sudo python setup.py install 來安裝。這樣就大功告成了。

程式很簡單,簡單到爆:

#!/usr/bin/env python
import sys
from libxmp import file_to_dict
CELL_NS="http://developer.sonyericsson.com/cell/1.0/"
if __name__ == '__main__':
xmp = file_to_dict( sys.argv[1] )
for prop_name, prop_value, prop_options in xmp[CELL_NS]:
print prop_name, prop_value

就這樣就可以把 Cell ID 相關的資訊都撈出來了。

電影流水帳(2010/7/8~2010/7/25)

現在一天只能看20分鐘左右,所以一部片要花一星期才能看完,這完完全全是讓我把電影當小說來看呢~

  • Ghost Town(IMDB, Wikipedia),中譯:超感應妙醫/通靈牙醫。這是我某天在HBO上看到的片子,劇情雖然是有點老套,但是男主角的演技讓人不會覺得無聊,我覺得很好看。男主角是個牙醫,因為麻醉的緣故有了短暫死亡的體驗,這導致他可以看到鬼魂。鬼魂都有未完的願望所以逗留在人間,正巧他可以看到他們,能跟他們溝通,所以大家就都跑去找他。可是男主角是個孤僻的人(這也許是我對這角色產生共鳴的原因),不希望跟人(鬼)有所接觸,因此通通拒絕,可是鬼魂還是糾纏著他,後來,女主角的丈夫(一開始就變成鬼)出來當說客,只要男主角幫他,他就願意讓他一勞永逸地不用再跟其他鬼接觸。男主角就出來幫他讓女主角遠離另外一個男人,可是他也因此墜入情網。最後結局是皆大歡喜的,男主角終於打開心防,願意幫助人(鬼),也因此跟女主角有更進一步的交流。
  • The Bad Lieutenant: Port of Call – New Orleans(IMDB, Wikipedia),中譯:爆裂警官。
    有點悶的片子。男主角一開始因為救人而有背傷,所以導致他後來依賴毒品來擺脫疼痛。他為了一件滅門慘案,展開調查,這件案子跟毒品有關係,他的前途也因為要買毒品、養女人而陷入困境,後來他不得已要跟毒梟合作,但想不到這卻是計中計,他反將了毒梟一軍,也因此獲得晉升。小悶歸小悶,但故事本身算是還不錯,可以看看的。
  • The Book of Eli(IMDB, Wikipedia),中譯:奪天書。很悶的片子,說是動作片,覺得又還好,我覺得不好看。故事發生在大災難之後,世界各地因為太陽變成荒漠,人們白天只能帶著太陽眼鏡,靠著地下水過日子,人類也變得很稀少。男主角因為上帝的聲音,所以獨自帶著聖經西行。西行的時候,途經一個城鎮,城鎮的老大是個識貨的人,所以知道他帶著是聖經以後,下手搶奪。後來是搶奪到手了,可卻是盲人版,男主角則是跟女主角到了San Francisco 的 Alcatraz Island,那兒是人類最後保存知識的地方,在那裡,他把內容都默了出來,原來他記下了整本聖經…

Json.Net serialization/deserialization

Json.Net 的 serialization/deserialization 其實不難,因為都內建了,我被卡到的原因,是因為我沒仔細看文件。我的類別裡有日期時間的屬性,但我一直以為不需要特別處理,但我錯了。


在用 JsonConvert.SerializeObject 時,得傳入 new IsoDateTimeConverter () 才行,要不然會導致之後 JsonConvert.DeserializeObject 時無法轉換日期時間。

var items = new List<Item>();
// other stuffs
File.WriteAllText (m_filename, JsonConvert.SerializeObject (items, Formatting.Indented, new IsoDateTimeConverter () ));
List<Item> objs = JsonConvert.DeserializeObject<List<Item>>(File.ReadAllText (m_filename));

另外一件重要的事情就是你的類別必須有 default constructor,如果沒有的話,JsonConvert.DeserializeObject 也會丟例外出來給你。

initrd+busybox

kernel source 的 Documentation/initrd.txt 裡,把 initrd 、開機順序跟必要的程序講的很清楚,依法施為,大致就沒問題了。

雖然如此,我還是花了快一天的時間。這邊紀錄一下我的作法,我是用文件裡提到的 loop device 方法,也就是先用 dd if=/dev/zero of=initrd bs=4M count=1 製作出 initrd,再用 mke2fs 格式化,接著用 mount -o loop 把這檔案掛為檔案系統。

然後我 build BusyBox,參考 BusyBox 原始碼的 examples/bootfloppy/mkdevs.sh 裡的 code,把我要的 device 都建起來,然後把 BusyBox 的相關檔案放進去,再把 examples/boot/floopy/etc 放進去。接著修改 etc/init.d/rcS, etc/fstab, etc/inittab,調整成我要的樣子以後,就差不多了。

因為這份 initrd 在開機後,我就拋棄了,所以 etc/init.d/rcS 最後得掛上真正的 device,並且切換過去:

# mount your device to /newroot.
mkdir /newroot
mount -t ext3 /dev/your_device /newroot
cd /newroot
mkdir /initrd
/sbin/pivot_root . initrd
exec /usr/sbin/chroot . /init </dev/console >/dev/console 2>&1

最後,umount,再用 gzip -9 壓縮得到 initrd.gz 之後,大致上就是這樣子。

VirtualBox的VM啟動不了兒

好久沒啟動公司的VirtualBox OSE,就想說啟動起來,打算開個新VM,裝個Debian來玩玩兒,結果不知道是不是太久沒啟動,他鬧了脾氣,出現這樣的錯誤訊息:

VirtualBox can’t operate in VMX root mode. Please disable the KVM kernel extension, recompile your kernel and reboot.

這真是一個糟,所以我立馬就把所有視窗都關掉(天知道我關了多少),然後重新開機,再試試,居然還是不行。拜請Google大神,果然早有人回報到 https://bugs.launchpad.netBug #292588 in virtualbox-ose (Ubuntu): “VirtualBox can’t operate in VMX root mode.”
照看起來,只要用這指令 workaround 一下就行了:sudo modprobe -r kvm-intel
我想應該是昨天裝了 qemu 的關係,因為印象中有裝 qemu-kvm,應該跟他有關係。Bug #292588後面的 comment 也有人提到這點,不過看起來,這 bug 真的很久了啊~

添加自訂的類別

就我目前所知道的有兩種方法:

  1. 放在mydroid/frameworks/base下:在mydroid/frameworks/base下建立目錄,然後裏面放java的source(請記得建必要的目錄),如果有需要的話,也可以在這裡放jni,對,不需要放Android.mk,只有jni目錄下需要。然後修改mydroid/frameworks/base/Android.mk,在packages_to_document後,加上你的目錄名稱,就這樣。最後你的類別會被加到 android.jar 裡。
  2. 放在mydroid/vendors/your_vendor目錄下:建立frameworks目錄,然後裏面再放目錄、Android.mk,接著就跟上面很類似了。最後再修改mydroid/vendors/your_vendor/Android.mk去include frameworks目錄下的Android.mk即可。這部份可以參考mydroid/vendor/sample/。最後還要記得修改 init.rc 裡的 BOOTCLASSPATH,加上你編譯出來的 .jar。

不過以上的方法,在 make sdk 的時候,都不會被包到 SDK 裏面去,這邊我還沒找到方法。

ChangeLog and svn2cl

目前大部分的開放原始碼專案都是遵從 GNU 的Changelog 格式,基本上寫起來不難,只是有點煩。
所以有的開發工具,例如 monodevelop (Version Control Screencast),甚至把你 commit 的格式也固定下來,讓你省掉許多功夫。
好吧,其實只是我今天突然想到以前有用過 cvs2log 這個 perl script,還不錯用,可以直接把 cvs 裡的 log 轉出來成 Changelog,所以,就想到 svn 應該有類似的工具,之前好像有用過,但我忘了。於是我就用 svn2log 去找,嘿,當然有這工具,可是這工具的網站已經連不上了。我只好退而求其次,用 apt-cache 找找,但也沒找到,只是有 subversion-tools 這個 package。裝起來試試看吧,裏面有不少東西,有一個小程式叫作 svn2cl,試了一下,果然這就是我要的東西。
要使用 svn2cl 來產生 Changelog 的話,在你 commit 時,log 就不需要加什麼格式了,就儘可能地在一行之內把 log 寫完,然後不要一次修改很多檔案,這樣產生出來的 Changelog 就會很不錯了。svn2cl 有相當多選項,甚至可以產生 html、只產生某段期間的 log…等,有時間再來研究看看。

Sensors in Android

拜請Google大神以後,找到這篇:阅读android有关sensor的源码总结,這篇寫的超級詳細,從上層到底層巨細靡遺的都描述出來了,但他並沒有描述當你有新的 sensor device 時,該怎麼做?
基本上,除了 Kernel driver 以外,還需要寫 library(sensor module),去實作 hardware/libhardware/include/hardware/sensors.h 所提出的介面,也就是上面文章最後面提到的 JNI 函數。這部份可以再參考這篇:Android Sensors Development對 HTC G1 Sensor的剖析。
對照著看,大致上就能了解了。Kernel sensor driver 被實作為一個 input system driver,當有事件時,會把 input event 發出去;sensor module 是被上層的 Sensor service 呼叫,主要是透過 _data_poll 函數詢問 input device 是否有事件並且取得數據。

NDK r4

跟 r3 比起來,這一版更方便了。
我的環境是 Ubuntu 10.04,所以我下載 for linux 的 zip 檔以後,解開放到 /opt 下,這樣就完成安裝了。
印象中,r3 Build 的方法,需要把程式放在 apps 下面,然後打 make APP=your_project 才能編譯,這一版可以允許你不放在指定目錄,你可以隨意放,像我放在 ~/NdkProjects/my_project 下,就可以直接打 /opt/android-ndk-r4/ndk-build 來進行編譯了。甚至我還意外發現,我不一定要在 ~/NdkProjects/my_project 下,只要在 ~/NdkProjects/my_project 的任意目錄下,都可以用 /opt/android-ndk-r4/ndk-build 來編譯。
此外,也可以用 /opt/android-ndk-r4/ndk-build -C ~/NdkProjects/my_project 來直接指定目錄,表示要編譯該目錄下的檔案,這樣就更容易整合到 Makefile 或 script 裡了。
gdb 現在也內建了,我還沒試過,要找時間試試看。然後也有限度的可以讀圖,不必再利用 Skia 硬幹了。
詳細的變動可以參考 /opt/android-ndk-r4/docs/CHANGES.TXT

電影流水帳(2010/6/11~2010/7/7)

到今天近一個月了,只看了三片,還有,另外回顧了之前的補完的EVA 25跟26,死與新生。
突然覺得今年要達成百片會有點難度了,我還沒去算,不過應該機率不高。
Toy Story 3 上映了,希望 DVD 趕緊出,這樣我就可以去百視達借來看了。

  • Percy Jackson & the Olympians: The Lightning Thief(IMDB, Wikipedia),中譯:波西傑克森-神火之賊。故事本身相當有趣,基本上就是把希臘神話的軼事搬到現代來,不過電影就拍的不怎麼樣,很趕,所以感覺上蠻多枝節都被砍了,書應該會比較好看,不過我想應該就跟哈利波特很相似吧,我想我是不會去借來看。波西是海神跟人類生下來的小孩,上高中的某天被誣賴偷了宙斯的神火,於是展開冒險與探索的歷程,最後發現小偷居然是曾經幫助自己的Luke。飾演雅典娜女兒的女主角Alexandra Daddario相當漂亮,有一種靈氣。
  • Nine(IMDB, Wikipedia),中譯:華麗年代。這是由舞台劇改編的電影,我沒看過,但裏面的歌倒是挺好聽的,特別是Kate Hudson唱的那首Cinema Italiano,很輕快,有機會要把原聲帶找來聽。故事是描述一個失去創意的導演要籌拍新片的心路歷程,在這個歷程裡經歷了數個女人,之後他心灰意冷,決定放棄拍攝,但是最後他還是重回導演椅,拍出他自己的這段歷程。這部片,我最喜歡的3個女人是飾演情婦的Penélope Cruz,飾演元配的Marion CotillardKate Hudson,Penélope跟Marion戲份很重,表演也很出色,深深覺得Marion之前拿到獎決非偶然。Kate戲份不重,但是她主唱的那首歌為她加了很多分。相當不錯看的片。
  • 新世紀福音戰士新劇場版:序(IMDB, Wikipedia)。劇情省略頗多,基本上第1部幾乎都是真嗣在唱獨角戲,而凌波零只是一個觸媒,讓真嗣願意上EVA的觸媒。