python 的 private method

純粹記錄一下,讓自己知道曾經犯過這個錯。類別裡的 method 名稱加上 __ 就是 private,所以,子類別並不會知道有這個 method,也不會發生 Method overriding

class Rectangle:
def __init__(self):
self.parse()
self.__parse()
def parse(self):
print("parse(): Rectangle")
def __parse(self):
print("__parse(): Rectangle")
class BoxType(Rectangle):
def parse(self):
print("parse(): BoxType")
# 不會被執行到!!
def __parse(self):
print("__parse(): BoxType")
b = BoxType()
# Output:
# parse(): BoxType
# __parse(): Rectangle

就這樣…

gtk.RecentChooserMenu

本來預期可以在 glade 裡就可以拉出這個元件,然後程式就不用寫,結果是不行。網路上範例不多,所以紀錄一下。
在 glade 裡,你要先預放一個 menuitem,假設命名為 mi_recent_items,你在程式裡就得先取出這個 menuitem,取得 RecentManager 然後建立 RecentChooserMenu,再用 mi_recent_items.set_submenu() 來設定。
RecentManager 是全系統的最近存取文件,這也是為什麼後續會要 RecentFilter 的原因,因為只要顯示需要的文件。當選取的時候,會觸發 item-activated 這個 signal。
代碼:

self.recent = gtk.RecentManager()
menu_recent = gtk.RecentChooserMenu(self.recent)
menu_recent.set_limit(10) # 設定要出現幾個
# 只取需要的檔案
self.file_filter = gtk.RecentFilter()
self.file_filter.add_pattern("*.pdb")
self.file_filter.add_pattern("*.updb")
menu_recent.set_filter(self.file_filter)
# 選取以後要做的事情
menu_recent.connect("item-activated", self.select_recent_cb)
# 取得在 glade 裡建立的 menuitem,然後用 set_submenu 設定。
menuitem_recent = self.builder.get_object("mi_recent_items")
menuitem_recent.set_submenu(menu_recent)

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

SALT

  • Salt(IMDB, Wikipedia),中譯:特務間諜。很適合Angelina Jolie的動作片,也難怪劇本會特別為她而修改。女主角的確就是諜中諜,不過到頭來,還是為了救她所愛的男人,把培養她的祖國間諜給幹掉了,同時也把潛伏在跟她同單位的諜中諜也解決掉,解除了核武危機。從片尾看起來,似乎還會有續集的樣子~
  • Hot Tub Time Machine(IMDB, Wikipedia),中譯:扭轉時光機。說到扭轉時光,應該就可以想見到故事會怎麼走了吧。這個故事其實也差不了多少,4個人現實生活的不如意,讓他們決定去度假,結果在浴缸裡喝個爛醉,不小心啟動了浴缸,讓他們回到70年代。為了避免改變未來,他們必須再做一次跟當年一樣的事情,但是並沒有完全一樣,最後4個人只有3個人回去,說起來,他們還是改變了未來,讓未來變得不一樣了。3個人回去以後,生活就變得如意了。我覺得不是很合理的設定,但算了,就當作喜劇片看看就好啦~
  • 一頁台北(IMDB, Wikipedia)。普普通通,坦白說,我覺得故事沒有拍出很好的fu,而且時間的設定上,好像有瑕疵,到底是一個晚上,還是多個晚上?捷運的路線設定好像也不太對。小凱的女友去了法國,這段期間,小凱認識了在書店工作的女孩Susie,Susie對他很有好感。遠距離導致了小凱跟霏霏的分手,小凱想挽回,所以去找了阿洪的老闆借錢要去法國,老闆答應小凱,但要小凱幫忙辦事情,陰錯陽差地小凱跟Susie被阿洪追著跑,幾乎跑遍了台北的南區,最後小凱還是去了法國,當然,這段感情是挽救不回來的了,回台北以後,跟Susie展開新戀情。我最喜歡最後的那個 slow motion跟跳舞的畫面,另外就是那個演阿洪的柯宇綸,他實在是蠻搶戲的。

python的class attribute

前兩天被這個東西給陰到了,只怪我沒搞清楚,這在 Learning python 2nd 裡的 21.1 裡寫的很清楚。不過我想,從Java/C++/C#跳槽過來的人應該都會搞糊塗吧~

以C++舉例,下面的code:
[cpp]class Object {
private:
int id;
};
[/cpp]

到了 python,應該都會很自然的寫成:
[python]# 例A
class Object:
id=0
[/python]

看起來沒錯,對吧~
不過,事實上,應該要寫成這樣才對:
[python]# 例 B
class Object:
def init(self):
self.id=0
[/python]

換句話說,例A翻譯成C++的話,其實是類似 static 的用法,也就是說,id 會變成一個共用的 static 變數:
[cpp]class Object {
private:
static int id;
};
[/cpp]

電影流水帳(2010/8/10~2010/8/20)

原來要登入 flickr 以後,才能點選”分享此項目”…
summers wars

  • サマーウォーズ(IMDB, Wikipedia),中譯:夏日大作戰。網路一片好評的動畫,相當不錯的片子。主角冒充學姊男友回鄉下要幫奶奶慶生,可是卻遇到學姊叔叔開發的病毒作亂,把當時的社交網路環境-OZ搞得亂七八糟,甚至連奶奶都因此而來不及急救而走了,於是他們為了復仇,聯手解決這個病毒,挽救了世界。OZ 的存在不知道是不是影射 i-Mode 或 Facebook,如果真的是如此,那真的是相當的驚悚。不過現在人慢慢也注意到隱私權的事情,所以未必會走向如此。還是回頭說動畫吧,這真的是相當好看的動畫。
  • Bride Wars(IMDB, Wikipedia),中譯:新年大作戰。青梅竹馬從小就期盼著當新娘的時刻,等到長大了,卻陰錯陽差,結婚的日期在同一天,為了搶有限的資源,就吵翻了天。導演把焦點放在兩個人的戰爭,卻把真正的重點輕描淡寫地帶過。我覺得故事本身是想說,戀愛十年功,卻往往在婚前破了功,婚前能齊心解決問題的,才算是闖過一起過日子的第1關。所以,這也是常常有人說,婚前應該要兩人一起去旅行,看看是否能共同一起生活,甚至一起面對困境。片子的最後,有一方跟男方分手,並且跟好友重歸舊好,之後,還跟好友的哥哥結了婚,是個皆大歡喜的結局。

busybox 的 mdev

mdev 實際上算是 udev 的替代品,代碼看起來很簡單。
下 mdev -s 會 enumerate /sys/class 下的檔案,並據此去建立 /dev 下的 device 檔案。如果 /etc 下有 mdev.conf,它會先參考這裡的設定,來決定 device 的 permission 與 user/group owner。
雖然說是 /sys/class,但是 /sys/class 下的檔案實際上都是 symbolic link,指向 /sys/device 下的檔案。
也可以下這行

echo /sbin/mdev > /proc/sys/kernel/hotplug

,直接讓 kernel detect 到新裝置時,就請 /sbin/mdev 去 /dev 建立新的 device 檔案。
kernel 是怎麼傳遞資訊給 mdev 的呢?答案是透過環境變數,kernel 在執行 /sbin/mdev 之前,會先填好 ACTION、DEVPATH跟SUBSYSTEM 這3個環境變數之後,再去呼叫,所以 mdev 才會知道要做些什麼。這也就是在 shell 下輸入 /sbin/mdev 會印出使用說明的原因,因為沒有這3個環境變數,mdev 就只印出說明了。
kernel mode 下的呼叫,還牽涉到 FIRMWARE 的部份,不過這邊目前沒用到,只有大致看一下。大底來說,就是如果有 FIRMWARE 環境變數時,他會試著去讀取 /lib/firmware/xxx 的 firmware 檔案內容,然後檢查 /sys/$dev/loading 這檔案,有了這檔案以後,再寫入 1,接著再把讀到的內容寫到 /sys/$dev/data 這個檔案裡去,完成載入外部 firmware 的動作。
程式相當的精簡,有空再來看看 udev。

pyexiv2 裡的 Rational 與 GPSCoordinate

要存GPS的相關tag到圖片時,因為某些tag要求存Rational或GPSCoordinate,我不知道該怎麼轉換,所以花了不少功夫查。我基本上是參考 這個老先生的code,他主要是使用 GPS tracker,所以會要讀取 tracker 裡的紀錄,然後以時間跟照片做比對,再把 GPS 位置寫進圖片裡。

可是遇到兩個問題:

  1. 他的 code 是用 surd 處理 Rational,我找不到 surd 了。
  2. 算出來的度、分、秒不準確。

首先是解決Rational問題,python 2.6 已經有內置的 module – Fraction 可以解決了。

def R(f):
"""R(float) - get a Rational number for a float"""
from fractions import Fraction
from pyexiv2 import Rational
r = Fraction.from_float( float(f) )
return Rational( r.numerator, r.denominator )

再來就是轉換的問題,從 Google gear 那邊拿到的經緯度,要轉換成度分秒,我後來是參考 上河文化網站-座標轉換程式與 Google Maps 地圖定位裡的 javascript 來改寫,這才得到正確的度、分、秒:

def d(angle):
"""d(any) - get degrees from a number :eg d(33.41) = 33"""
return math.floor(angle)
def m(angle):
"""m(any) - get minutes from a number :eg d(33.41) = 24"""
return math.floor( (angle-d(angle))*60 )
def s(angle):
"""s(any) - get seconds from a number :eg s(33.41) = 36"""
return round((angle-d(angle)-m(angle)/60)*3600)
def degree2coordinate( lat, lon ):
"""Convert degree to coordinate string."""
latR    = 'N'
lonR    = 'E'
if lat  < 0:
lat = -lat
latR= 'S'
if lon  < 0:
lon = -lon
lonR= 'W'
slat = "%03d,%02d,%02d%s" % (d(lat),m(lat),s(lat),latR )
slon = "%03d,%02d,%02d%s" % (d(lon),m(lon),s(lon),lonR )
return (pyexiv2.GPSCoordinate.from_string( slat ), pyexiv2.GPSCoordinate.from_string( slon ) )

最後,記一下,Tag裡要存的資料型態:

  • Xmp.exif.GPSLatitude、Xmp.exif.GPSLongitude 裡存的是 pyexiv2.GPSCoordinate
  • Xmp.exif.GPSMapDatum、Exif.GPSInfo.GPSMapDatum裡存的是字串,我是用 WGS-84
  • Exif.GPSInfo.GPSLatitude、Exif.GPSInfo.GPSLongitude 裡存的是度、分、秒的tuple,要注意,度、分、秒都要轉成 Rational
  • Exif.GPSInfo.GPSLatitudeRef、Exif.GPSInfo.GPSLongitudeRef 裡存的是度、分、秒的表示字串,如:125.3,67.5,12E

Android 檔案系統用哪個好? ext3 或 ext4?

因為看到有人說 ext4 在 Android 裡的表現比 ext3 好,就想說來試試看。

本來是打算用 Quadrant 來評測,可是跑完以後,他會要上傳數據到網站上才能得到結果,我的 device 沒辦法連上網,所以只能放棄。後來改用 Linux 傳統的 iozone 來做,下載、解開 iozone tarball 以後,用

make CC=/opt/arm-2009q1/bin/arm-none-linux-gnueabi-gcc GCC=/opt/arm-2009q1/bin/arm-none-linux-gnueabi-gcc LDFLAGS=-static linux-arm

就可以編譯出來了。(我的ARM toolchain 放在 /opt/arm-2009q1 下)

丟到 device 上執行的時候跑了好幾次,都沒成功,只能降低最大 record size 跟最大 file size,然後就行了。我用的指令如下:

/bin/iozone -R -a -q 2048 -g 4096

從最後得到的報告看起來 ext4 是略優於 ext3 的,但是使用上的感覺並不是很明顯,可能是因為沒有用大檔案的關係吧,以後再仔細試試看。

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

生產力是什麼?可以吃嗎??

  • Solomon Kane(IMDB, Wikipedia),中譯:所羅門傳奇。原本我以為是小時候看的故事,所羅門王的寶藏,看了之後才知道不是,是改編自 Robert E. Howard 的系列小說。故事就是描述Solomon如何踏上除魔之路的故事,坦白說,電影不怎麼樣,小說可能會比較好看吧~
  • The A-Team(IMDB, Wikipedia),中譯:天龍特攻隊。翻拍自小時候很熱門的影集,不過小時候沒什麼在看台視,所以對裏面故事沒什麼印象,對霹靂遊俠倒是比較有印象。故事類型類同於 Mission impossible,就是團隊協同出任務的故事,電影裡多了計中計的鋪陳,The A-Team收到委託,並且算是成功地完成任務,卻被判刑、入獄。後來CIA幫助他們逃獄,讓他們洗刷恥辱,但卻想不到原來CIA就是幕後的黑手,幫他們逃出來,只是幫CIA找到黑吃黑的人。電影拍的不錯,很流暢,沒有冷場,愛看動作片的人,不要錯過。

XMP and Cell ID 之二

在之後打算要寫入 geotagging 到圖片的時候,才發現 python XMP toolkit 的不足,於是又踏上尋覓的路程。後來找到 pyexiv2,這個 library 更好用,不僅可以讀,也能寫,用法也不會太複雜。唯一的缺點是,ubuntu 10.04 包的是 1.x 版,好在,有人包了最新的版本在ppa裡
安裝:

sudo apt-add-repository ppa:pyexiv2-developers/ppa
sudo apt-get install python-pyexiv2

讀取跟寫入,基本上參考官方的tutorialAPI 文件就行了。Cell ID 資訊在這幾個tag裡:

  • Xmp.cell.mcc
  • Xmp.cell.mnc
  • Xmp.cell.lac
  • Xmp.cell.cellid