android 裡面沒有提供 mkfs.ext3,雖然 android source code 裡面有e2fsprogs,但沒有 build 出來。
如果使用 android source code 裡提供的 1.40.x 版的e2fsprogs,cross compile 時,要用 LDFLAGS=-static ./configure –host=arm-none-linux-gnueabi –with-cc=arm-none-linux-gnueabi-gcc 才行,只用 –host 的話,是不行的。我試了好一陣子才試出來。
如果你自己下載 1.41.x版的e2fsprogs,編譯指令簡單多了,只要用 LDFLAGS=-static ./configure –host=arm-none-linux-gnueabi 就行了。
為什麼會提到 1.40.x 跟 1.41.x 呢?這是因為我拿 mkfs.ext3 到 android 環境下格式化分割區,在格式化以後卻發現無法 mount,mount 會出現 Invalid argument的錯誤。原本以為是版本的問題,可是試過1.40.8、1.40.9跟1.41.x以後,發現都不行。接著再試 busybox 提供的 mke2fs,也不行。
實在是沒辦法,只好用 dd 來做。不過 dd 速度真的是不快,而且為了要能把 image 放到 sd 卡上,我還用了 gzip 來壓縮。既要在 android 機器上解壓縮,又要做 dd,自然是慢到爆。 (指令是 gunzip -c xxx.img.gz | dd of=/dev/block/mmcblknpn)
最後的最後,終於想到要注意 mke2fs 關於 /etc/mtab 的警告訊息,它一直很盡責的告訴我,沒有 mtab,它沒辦法檢查分割區是否有 mount 起來。所以我在 /etc 加了一個空的 mtab,再去 mke2fs,完成以後再 mount,想不到就可以了耶~
追查 e2fsprogs 的原始碼,發現的確是有檢查 mtab,而且沒有 mtab 的時候,它不會去製作 journaling,換言之,也就是分割區的確格式化了,但是沒有 journaling 訊息,這也導致了無法 mount 的情況。
呼應主題,mtab有多重要呢? 拿 HTML 的 h1~h7 來比喻的話,mtab 大概有 h1 那麼重要!!!
wine的慘事
有用 wine 跑 win32 application 的人都知道,常常會遇到 .dll 缺東缺西的。這一天,我自作聰明地就想,反正裝的是雙系統,如果把 .wine/drive_c/windows 跟 .wine/drive_c/Program files 直接指向 windows 分割區裡的 windows 跟 Program files 資料夾的話,應該就萬無一失了吧~
所以立馬就先把 .wine/drive_c 下的 windows 跟 Program files 更名,做 symbolic link 連到 windows 分割區下的 windows 跟 Program files,接著就跑 excel 試試看。哈哈~我真是太聰明了,果然可以執行,但是有一些錯誤產生,後來想說還是照網路上的教學文件,用 winetricks 裝上必要的元件,然後直接裝 office 2003 好了。所以就把 symbolic link 移除掉,把之前更名的資料夾改回原名,進行安裝。這次就可以順利跑起來了,不過沒有詳細去試。
然後,就想說要回 windows 去收信,結果,悲劇就發生了,Windows 一直重開機、一直重開機…試著用安全模式開進去,不行,也是會重開機。我猜想,應該是某些檔案被覆蓋或被修改了,所以我重回到 Linux 下,把 .wine 更名,然後執行 wine,看 wine 到底在 .wine 下產生了什麼檔案。我根據這些產生的檔案,去另外一台完好的 windows 下把這些檔案複製回來,放到 windows 分割區對應的路徑下。哈,這次可以進安全模式了,可是如果以正常模式開機,還是會一直重開機。既然可以進安全模式了,那麼,系統還原就派上用場,不過,只有一次,因為在windows還活著的時候,我把保留給系統還原的空間砍到最少。不幸的是,還原的結果是….失敗。
啊!!!!!沒辦法了,重灌吧!!!鄉親啊,千萬不要學我這樣子啊!!!
omap36xx的vibrator
我是沒看原來 android 釋出的原始碼,不過按照 TI 釋出的這份code,vibrator 主要是對 /sys/class/timed_output/vibrator/enable 寫入時間,寫入以後,就會開始震動。時間的單位是 ms。
但是 kernel 的 code 就沒有這部份的 driver,唯一會在 /sys 建出這檔案的 driver 是 vib-omap-pwm.c ,可是,這檔案裏面只有操作硬體 timer ,跟震動一點關係都沒有。後來是從 2.6.35 那邊拿原本是 input driver 的 twl4030-vibra.c 來改。
改的時候遇到一點小 trouble,最初的想法是用 timer 來做,但是 kernel 裡的 timer 是用 soft interrupt 完成的,所以在 timer 被觸發的時候,如果用 i2c 去寫的話,會導致 kernel panic (因為i2c 也會利用 soft interrupt 去等),這時候就得利用 workqueue,在 timer 觸發的時候,不要第1時間用 i2c 去寫,而是丟到 workqueue 裡,kernel 會儘快安排時間去執行這部份。
於是,這樣就搞出 vibrator driver 了。
.desktop 的 icon
之前看了 terminator source code 裡的 .desktop 時,想說為什麼沒有寫 Icon 的完整路徑,於是就跳過這段,後來碰到問題,下去看了才知道。
根據 .desktop 的 specification,.desktop 裡的 Icon 不建議放完整路徑的檔名,只要放名稱就可以了,桌面環境會自動去 /usr/share/icons、/usr/share/pixmaps 下找。
所以如果你的程式要有 icon,那麼你應該在這些地方放你的 icon
- /usr/share/icons/hicolor/<size>/apps:
size: 16×16, 22×22, 24×24, 32×32, 48×48, scalable,除 scalable 是 svg 外,其他都是 png/jpg。 - /usr/share/pixmaps/ :這裡也是 png/jpg
照這樣放了以後,.desktop 裡就不需要放完整路徑的檔名,只要放名稱就可以了。
之前還笨笨的寫 sed 去替換說,可是用 sed 替換,在 launchpad build server 上,會遇到一些問題 (因為我是把 sed 這段寫在 setup.py 裡),不得已,回頭看 terminator 研究,才知道來龍去脈。
電影流水帳(2010/9/17~2010/9/30)
9月下半,看了兩部很對我胃口的片,好看!
- 第36個故事(IMDB)。這是朵兒跟薔兒兩姊妹的故事,年初的時候就一直在桂綸鎂的FB上看到介紹,當時並沒有注意到電影的主題是什麼,只是很好奇,怎麼一直在講富錦街的咖啡館。看了以後才知道,原來故事裡是姊姊朵兒開了咖啡館,而故事就發生在這個咖啡館,原本,咖啡館就是很單純的咖啡館,但是妹妹的無心帶來了變化,她讓這咖啡館有了一項特色,就是大家可以到這裡交換東西,但是必須以物易物。後來,張翰帶來了35塊從世界各地來的香皂,想要進行交換,但是香皂有什麼好交換的呢?張翰開始講出香皂背後的故事,而朵兒則把故事畫出來,想把這些香皂推銷出去。末了,在張翰說完第35個故事的時候,他反悔不想賣了,就把香皂跟朵兒的畫帶走。朵兒很失望,在旅行社的人來談合作事宜的時候,她提出了以她的股份來交換35張機票,出去各國旅行。就這樣,這就是第36個故事。這電影真的不錯看,媽媽跟兩姊妹的那個梗從頭穿插到尾,不會太悶。
- 千年女優(IMDB, Wikipedia)。從訪問女優開始,就開始不時穿插千代子的電影片斷以及她的回憶,她是在遇到他之後,才決定演電影的,因為演電影可以到中國東北去,她可以有機會遇到他,也為了讓他有機會找到她,她一直演出電影。這樣的故事表現很有意思,到最後末了,因為始終追尋不到她心目中的他,也擔心讓他看到她老去的模樣,她整個心灰意冷,就決定隱居,一直到他們來訪問,才跟他們見面。最後,要死的時候,她說,”或許我並不是在尋找他,而是在享受尋找他的過程吧~”這句話讓我印象很深刻,真的。
gtk.FontSelectionDialog
這個類別可以選字型,只是,選好再呼叫它提供的 get_font_name() 以後,只會得到一個字串,裏面有字型的名稱、尺寸以及樣式,而且,還沒什麼規則可言,這造成我的困擾。
上網找了一陣,發現一般解法有兩種,一種是存取在 gtk.FontSelectionDialog 裡的 FontSelection.get_font_face,另一種則是透過 pango.FontDescription 來轉,我後來是用 pango.FontDescription 來轉。
用 pango.FontDescription 來轉是沒問題的,只是取得 font size 的時候,又遇到問題,原來這裡取得的大小會乘上 pango.SCALE,所以呼叫 get_size() 以後,還要除以 pango.SCALE,才是正確的。
def get_font_tuple( font_name ): import pango fontdesc = pango.FontDescription( font_name ) font_name = fontdesc.get_family() font_size = fontdesc.get_size()/pango.SCALE return (font_name, font_size)
上傳 debian package 到 PPA
去年就試著想放東西到 PPA 上,可是受限於公司網路環境與個人鬼混的因素,導致今天才真正把東西放上去。這部份中文的資訊很少,可能大家看PPA說明就都搞定了吧。
你比較會遇到的幾個問題:一個是 PGP、一個是如何打包 debian package,這邊假設你都會了。(PGP 可以去 Jedi 那邊找介紹文)
以下,就開始。你必須要先有 PGP key,然後到 launchpad 註冊,成為會員。
照這篇:Personal Package Archives來做,我整理重點如下:
- 到profile頁,把 ppa 打開。
- 填 OpenPGP public key。
- Sign conduct:其實就下載文字檔,然後打指令,用gpg sign過(文章裡有指令),產生 .asc 檔案,再把檔案內容貼上去,送出即可。
上傳可參考這篇:Uploading a package to a PPA,package 有些要注意的事項,例如 changelog,在上面那一篇有說明,就是一般 debian changelog 裡是寫 unstable、experiment,在這裡要改為 lucid、hardy 等。
大致摘要如下:
- 準備好你要上傳的 package,用 dpkg-buildpage -S -k<your_gpg_private_key>,做出 source package。
- 到上一層目錄,找到 P_V-0_source.changes (P 表示你的 project name,V 表示版本)
- 上傳:輸入 dput ppa:your_ip-id/ppa P_V-0_source.changes
- 上傳順利的話,接下來就等回信了~
dput 預設是用 ftp 上傳,如果不行,可以試試 sftp:
- 到 profile 填 ssh key
- 新增 ~/.dput.cf ,裏面放:
[my-ppa-lucid] fqdn = ppa.launchpad.net method = sftp incoming = ~<your_launchpad_id>/<ppa_name>/ubuntu/<ubuntu_code_name> login = <your_launchpad_id> allow_unsigned_uploads = 0
,your_launchpad_id、ppa_name、ubuntu_code_name 不要忘了替換掉,ubuntu_code_name 就看你裝的 ubuntu 版本,填 lucid、hardy…等等的
- 上傳指令改用 dput my-ppa-lucid P_V-0_source.changes
回信不會那麼快,要稍微等一下,如果有問題,裏面會有錯誤訊息,不知道怎麼辦的話,很簡單,到 Questions for Soyuz 找答案。
最後成功的話,會有回信說 Accept,這時候再到你的 ppa 頁面,就會看到 package 了,不過這時候還在 building,需要等一陣子。
到這裡,應該就大功告成了。之後就可以很方便的用 add-apt-repository 來把自己 ppa 加進去,然後安裝、升級 package 啦~
自動分類pdf與shutil
這script主要是分類pdf用的,從謎之網站下載的 pdf 檔有規則,所以就可以寫code來自動分類。寫script時發現有shutil這個很方便的模組,可以用來複製、搬移檔案、目錄等,相當的方便,原本還以為要自己硬幹咧~
[python]#!/usr/bin/env python
–– coding: utf-8 ––
def main():
import glob
import os
import shutil
files = glob.glob( “*.pdf” )
for file_name in files:
parts = file_name.split(‘.’)
index = -2
while not parts[index].isdigit():
index = index + 1
dir_name = ” “.join(parts[:index])
if not os.path.exists(dir_name):
os.mkdir(dir_name)
try:
print(“Move ‘%s’ to ‘%s’.” % (
file_name, os.path.join(dir_name, file_name)))
shutil.move( file_name, os.path.join(dir_name, file_name))
except shutil.Error, e:
print(e)
if name == “main“:
main()
[/python]
電影流水帳(2010/9/8~2010/9/16)
好吧,找不到適合的圖來放,算了。好像又隔了太久,所以有點忘記自己看了什麼片了,從噗浪裡看來,應該是沒錯才對。
- Date Night(IMDB、Wikipedia),中譯:約會喔麥尬。片商宣傳成喜劇片真是太可惜了,看完以後我倒是覺得這部片很溫馨。一對失去熱情,生活已經快要公式化的夫妻,各自都不想讓自己的婚姻生活邁向終點,於是都試圖做出改變,一切的笑點就在他們試圖做出改變的約會夜中爆出。在經過一晚的烏龍事件之後,他們兩人的用心最後都讓彼此感受到,所以來了個我覺得很溫馨的結局。總之夫妻生活久了,難免都會慢慢公式化,要怎麼過出新鮮感,真的是需要用心經營,這部電影的故事真的有打中我心裡的某個點,讓我有不少感觸。
- 交響情人夢最終章前篇。當作日劇的濃縮版來看比較好,簡單說就是他們到了法國面對新的挑戰,千秋要馴服新的樂團,而野田妹則面對新的情敵與自己的未來,故事就這樣展開。看完以後只慶幸還好沒去電影院看,因為感覺上就是日劇的精簡版,下一部最終章應該才是主菜。
Yahoo Traffic Server
因為最近發現公司的 proxy 不理我 NB 上的 https request 了(我NB是走正常公司網路設定,也就是上網都會透過proxy),想到 COSCUP 2010 有介紹 Yahoo Traffic Server,想說架在另外一台不受限的機器上,讓 NB 透過這個 proxy 上網。
安裝不難,參考:Build instructions,三兩下就能 build 好,開發團隊好像就是在 Debian/Ubuntu 上開發的樣子,步驟寫的蠻仔細的。
設定倒是考倒我了,預設的設定是不 work 的。試了一陣,才找到這篇:Yahoo Traffic Server,裏面提到在 records.config 裡的兩個關鍵設定:
- proxy.config.reverse_proxy.enabled
- proxy.config.url_remap.remap_required
把這兩個設成 0,大致上就 ok 了。
我還有改到的設定:
- records.config
- proxy.config.cluster.ethernet_interface: 改 eth0
- proxy.config.cache.ram_cache.size: 改 256M
- storage.config: var/trafficserver 加大到 256M
事實上除了可以當類似 squid 的 proxy server 以外,也可以當 reverse proxy、Forward proxy(remap),同時也支援 cluster 架構、DNS cache…等,可以挖的功能相當多,以後有空再來挖好了。
其他可參考資料:Yahoo Traffic Server中文介紹以及for RHEL5 64bit/Gentoo 的 rpm檔