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 的方式才能達成。

GNU IceCat Privacy extension安裝總是失敗

之前都沒注意,直到GreaseMonkey升級,跑不起來,才發現這事情的嚴重性。
上網找了一下,果然已經有人跳腳:http://osdir.com/ml/bug-gnuzilla-gnu/2010-12/msg00057.html
就follow裏面的提供的網址:http://kb.mozillazine.org/Installing_extensions#Global_installation ,照裏面的指示去手動解壓縮 /usr/lib/icecat/extensions/privacy_ext.xpi 到 /usr/lib/icecat/extensions/privacy_features@gnuzilla.gnu.org 就行了。

DDMS抓圖

會看這個,是因為抓圖失敗…
ddms 會開啟本地的port 5037,這是由host端的adbd所listen的。接著寫入”framebuffer:” (AdbHelper.getFrameBuffer)。
target端的adbd收到以後,會建立一個thread,thread跑的是framebuffer_service.c裡的code。裏面很簡單,就開啟/dev/graphics/fb0,然後取 fb_var_screeninfo 的值,再根據得到的值來決定要讀多少bytes,寫回去到host端,最後寫完就關閉。
為什麼會抓不到圖呢?不知道,還找不到原因。

加快linux開機速度

1 second Linux boot to Qt! 看到的,標題超聳動,不過實際看到影片,真的是很嚇人,根本就是瞬間就開好了。投影片在這裡:The Right Approach to Minimal Boot Times
這個 topic 前兩年很熱門,當然啦,現在因為 Android 的關係,應該會更熱。下面是我看完的一些紀錄跟想法:

  • 使用 Arjan van de Ven 對 kernel aync 的 patch
  • 把不重要的 module 改成 loadable
  • 修改init/do_mounts.c以提早mount root
  • 修改init/main.c裡的init_post,看了以後,我想應該是避免掉open /dev/console還有移掉不必要的步驟以提速。
  • improve memcpy (這我不知道是哪裡的,要再查看看)
  • reduce kernel size:這可以加快 u-boot 載入時間。一般手段就移掉不必要的driver/module。
  • reduce u-boot delay time:u-boot 預設有 delay time,這可以改掉
  • kernel 壓縮或不壓縮:用zImage的話可以減少kernel大小,可是要評估解壓縮時間跟載入時間的平衡來決定壓縮或不壓縮。
  • 利用 gcc 的 –finstrument-functions –function-sections 去 profile function 的時間 (簡報說加了這兩個 argument,就可以在 __cyg_profile_func_enter/__cyg_profile_func_exit 裡放 code,這個要鑽研 gcc 試試看。)
  • 利用ubootchart/bootchart.org工具來測時間。

參考資料:

Lex 練習

看 lex & yacc 第一章的練習,然後改用 glib 的 GList 來做:

Lex 是用來 tokenize 輸入用的,也就是用來辨識說輸入裡有哪些東西是你要的。這個例子書上沒針對怎麼使用做解說,乍看之下,不容易懂。其實使用上就是打 verb is,表明說 is 是 verb,你可以一直輸入 verb read、verb write、noun book、noun dog….程式就會把你輸入的這些內容分類、放到list裏面去,之後你輸入 read、write、book 時,程式就會告訴你 read、write 是 verb,book 是 noun 。

改用 glib,是因為想練習 glib。g_list_find_custom令人意外地沒範例,不過用法挺簡單,主要變化在第二個參數,第二個參數是一個 function。該 function 第一個參數是 list 裡的元素,第二個參數就是 g_list_find_custom 裡的第二個參數,你可以參考 compare_word,應該是不難懂。
參考資料:

vold小記

  • 根據 /system/etc/vold.fstab 去monitor可移除裝置。dev_mount label 掛載點 auto或第n個partition /sys下的路徑,要扣掉/sys
  • NetlinkManager以netlink和kernel建立溝通管道以取得裝置insert/remove事件並做處置(NetlinkHandler)。
  • NetlinkHandler內實際上是呼叫VolumeManager做進一步處理
  • VolumeManager
    1. 管理的是Volume,DirectVolume是其子類別,這裡用了template pattern
    2. 負責mount/umount/share/unshare/format以及secure container
  • 以CommandListener去listen以接收指令,也就是跟上層溝通的管道。(CommandListener, VoldCommand, Process, ResponseCode)。
  • Volume/DirectVolume::mountVol 看來是個適合填 android usb gadget 所需資訊的地方。因為
    1. 有檢查狀態
    2. 可知道是哪一個partition或disk
    3. 可得知insert/remove狀態
  • 需要/dev/device-mapper,所以kernel要把此部份打勾。這邊的設定還蠻多的:
    CONFIG_MD=y
    CONFIG_BLK_DEV_DM=y
    CONFIG_DM_DEBUG=y
    CONFIG_DM_CRYPT=y
    CONFIG_DM_UEVENT=y
    CONFIG_CRYPTO_AEAD=y
    CONFIG_CRYPTO_AUTHENC=y
    CONFIG_CRYPTO_CBC=y
    CONFIG_CRYPTO_PCBC=y
    CONFIG_CRYPTO_HMAC=y
    CONFIG_CRYPTO_MD5=y
    CONFIG_CRYPTO_DES=y
    CONFIG_CRYPTO_TWOFISH=y
    CONFIG_CRYPTO_TWOFISH_COMMON=y

參考資料:

Airplane mode

在追bug時,去Trace的結果,後來發現如果Phone的RIL層有問題的話,會造成看起來沒有進Airplane mode但實際上卻已經進去的奇怪現象 。Android裡,選Airplane mode以後會發生的事情:

  1. AirplaneModeEnabler送broadcast message出來。有3個人會收到:1.wifi 2.bluetooth 3.Phone。wifi 跟 bluetooth 裡收到訊息以後的處理都很簡單,Phone 裡主要是呼叫 phone.setRadioPower() 這行 (Packages/apps/Phone/src/com/android/phone/PhoneApp.java)。
  2. 這時候會呼叫 GSMPhone/CDMAPhone 的 setRadioPower,GSMPhone/CDMAPhone 都繼承自 ServiceStateTracker,所以是呼叫 ServiceStateTracker.setRadioPower。
  3. ServiceStateTracker.setRadioPower 會呼叫 setPowerStateToDesired (CdmaServiceStateTracker/GsmServiceStateTracker),實際上又是呼叫 cm.setRadioPower
  4. cm 的型別是 CommandsInterface,只有 RIL 有實作此 interface (frameworks/base/telephony/java/com/android/internal/telephony/RIL.java)。自此,訊息往下丟到 RIL daemon,參照 reference-ril 裡的 setRadioState,之後處理完會回傳 RIL_UNSOL_RESPONSE_RADIO_STATE_CHANGED。
  5. RIL.java 的 processUnsolicited() 會處理,這邊會呼叫 setRadioStateFromRILInt(),setRadioStateFromRILInt()裏面又再呼叫 setRadioState (frameworks/base/telephony/java/com/android/internal/telephony/BaseCommands.java),這裡會去 notify,所以根據 mRadioStateChangedRestrants 找 registerForRadioStateChanged()
  6. 找 registerForRadioStateChanged 的結果,可以看到 GsmServiceStateTracker/CdmaServiceStateTracker 有去呼叫。再看 ServiceStateTracker 裡的 handler 去處理 EVENT_RADIO_STATE_CHANGED 的部份:setPowerStateToDesired() => pollState() => pollStateDone(),pollStateDone() 裏面就可以看到有用 phone.notifyServiceStateChanged(),notifyServiceStateChange 又是呼叫父類別的 notifyServiceStateChangedP()。
  7. notifyServiceStateChangedP() 呼叫 mNotifier.notifyServiceState。mNotifier 則是 DefaultPhoneNotifier,再看 DefaultPhoneNotifier,裏面就有 registry.notifyServiceState() (TelephonyRegistry.java),這會再呼叫 broadcastServiceStateChanged()。從這裡的 TelephonyIntents.ACTION_SERVICE_STATE_CHANGED 去找,可以發現只有 PhoneStateIntentReceiver 有收這個 broadcast message。
  8. PhoneStateIntentReceiver 會再去 sendMessage。AirplaneModeEnabler 裡就有使用 PhoneStateIntentReceiver,並註冊了自己的 handler,所以 AirplaneModeEnabler 最後就會收到,並且改變項目的狀態。

這段過程幾乎都是以非同步的方式在傳遞,並不是平鋪直敘的,所以我看了好幾次才確定是這麼一回事…沒邊寫邊記的話,恐怕會多繞好幾天…

電影流水帳(2010/11/12~2010/12/31)

今年只看了 61.5 部片,很遺憾,沒達成百片的目標,”The Experiment”看到一半,就沒看了,明年要找時間來看完。

  • Akeelah and the Bee(IMDB, Wikipedia)。英文老師在課堂上放映的,主要是讓我們去學要怎麼背單字。裏面介紹很多背法,像是用節奏、玩cross word、語源、發音…等等,很值得參考。一個黑人的小女孩,因為死去的父親的關係,對於背單字相當的有興趣,在某次意外裡,被抓去參加學校拼字比賽,因此被發掘。後來就跟學校方面達成協議,繼續參加地區性的比賽。比賽跟練習的過程裡,他認識了志同道合的朋友,建立的自信心,也跟到了好老師,學到很多東西,後來幫老師解除了心裡的結。家裡的問題,差點讓她沒辦法繼續下去,在媽媽看到她的表現之後,化解了母女間的隔閡。最後當然是有了圓滿的結局,跟原本是對手的朋友一起得到了冠軍。

竹取js

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

fcrackzip

正愁不知道怎麼破解密碼,就丟 ubuntu brute zip password extract 這些字到 google 去找,想不到立馬就找到Ubuntu Geek上的這篇:Howto Crack Zip Files Password,用 apt-get 就可以裝好。
使用也很簡單 fcrackzip your_file.zip 就行了。要縮小範圍的話,可以參考 -h 的說明,指定參數來縮小範圍、加快解密的速度。