Tail call

簡單的說是遞迴的特例,好處是可以避免call stack的損耗。Stack Overflow上的回答蠻清楚的,還附了python範例:algorithm – What is tail-recursion?,英文維基百科上的說明:Tail call比中文維基百科上的來的好。
跟遞迴比較大的差別,目前我認知到的是會利用另外一個參數來傳遞結果,實際應用上應該只要是遞迴都可以改寫成Tail call吧,再想想可以怎麼應用。

Mining the Social Web – Example 1-3

實作這個範例時,出現錯誤:TwitterHTTPError: Twitter sent status 404 for URL: trends.json using parameters: ()

有人回報給作者:Example 1-3 fails with 404 errors,也有人去 StackOverflow 上問:Problem with Twitter package by sixohsix,可是都沒有解決問題的答案。

答案在twitter API -GET trends上:因為deprecated了。要改用GET trends/:woeid,也就是像這樣的網址 http://api.twitter.com/1/trends/1.json 才可以取得。

換言之,程式要改為:
[python]import twitter
t=twitter.Twitter(api_version=’1′)
t.trends(id=1)
[/python]

Greasemonkey-輔助續借學校圖書

還是忍不住寫了,畢竟每次要為十幾本書打勾還是蠻累的。基本上就是多加兩個按鈕,一個幫我全打勾,一個幫我取消打勾。不過第二個按鈕好像永遠都用不到,這就是所謂的 over design 嗎? :-p

“How to install Ubuntu on Android”觀後感

看完還是順手紀錄一下,要不然就白花這25分鐘看了。
簡單的說,要先 root 並且裝上 busybox,接著下載 bootubuntu,這是預先編譯好的 ARM Ubuntu image,放到 SD Card 上的 ubuntu目錄下。然後用 adb shell 連上,執行 su,到 SD Card 的 ubuntu 目錄下,執行 bootubuntu,就進 ubuntu 環境了。有了 ubuntu 環境,就能執行 apt-get,立馬就可以裝上 openssh-server、tightvncserver,openssh-server 是為了有更好的終端機環境可用,因為 Windows 的命令提示字元不夠理想。tightvncserver 則是要給 market 上的 vnc client 用的,執行 vnc client 連到本機上的 vnc server,就有 Ubuntu 畫面跑出來了。

CentOS 5裝Python 2.6

先確定有EPEL,然後:
$sudo yum install python26
再裝 python26-virtualenv python-pip:
$yum install python26-virtualenv python-pip
製作環境:
$mkdir -p python-envs
$cd python-envs
$virtualenv-2.6 –no-site-packages –distribute myenv
$pip-python install -E myenv yolk
啟用:
$source myenv/bin/activate
$yolk -l

電影流水帳(2011/5/26~2011/10/7)

快年底了…

  • 奶奶強盜團(IMDB)。3個奶奶好不容易攢了錢,要去夏威夷玩,很開心的去預約了行程,然後要付款,可是旅行社卻告訴她們要把錢存到戶頭去才可以。去到銀行存款,卻遇到搶案,存摺陰錯陽差地沒有刷到,銀行經理就跳出來說,不算,你們怎麼證明有拿八百萬來存款?於是,一番哭天搶地之後,還是沒能拿回錢。她們決心自己去找到搶匪,把錢要回來。很幸運,她們找到其中一個,不過這傢伙手上沒有錢,因為他被背叛了。這下絕望了,本想說再撐幾年繼續攢錢的,可是其中有一個人已經沒有時間了,她得了癌症。沒辦法,只能靠武力解決了,於是她們就要脅搶匪教她們搶銀行。經過一番訓練之後,她們要出擊了。第一次被呼弄,第二次真的就搶了,也順利搶到,可是來不及逃出,就被警察包圍了。她們跟人質訴說了她們遇到的情況後,人質深感同情,反過來幫她們逃出去(斯德哥爾摩症候群?!)。展開一段追逐之後,最後還是在機場被逮,瑯噹入獄。在獄中,得癌症的那個奶奶就病死了。後面真的很感人,眼淚差點就流下來,相當好看的片子。
  • Piranha 3D(IMDB, Wikipedia),中譯:3D食人魚。超簡單的劇情,可是看起來很爽,有辣妹、有裸體、有殺戮、有血也有肉。食人魚因為地震的關係從原本與世隔絕的洞窟中被放了出來,開始肆虐。在河邊發現片頭老人的屍體之後,下水探勘的生物學家也被幹掉,活著的人趕緊走人,然後運氣不錯,有逮到一隻魚,就去找魚類博士(這是演”回到未來”的那個怪博士!!)鑑定,說是遠古時代的超級食人魚。媽呀~太可怕了,警長就趕緊去疏散湖邊的人,沒人鳥…想當然爾,食人魚展開一場殺戮。警長的兒子情竇初開,不想幫警長媽媽(警長是女生,是好久沒出來演的伊莉莎白蘇)帶孩子,就用錢收買妹妹,叫弟弟妹妹們乖乖待在家裡,自己就跑出去看有料的了。弟弟妹妹不安份,也跟著跑出去,後來被困在島上。警長的兒子跟拍寫真的大叔與正妹們,後來也遇到食人魚了,就趕快逃走。路上遇到困在島上的弟弟妹妹,就要脅拍寫真的大叔說,我媽是警長,快過去救人~然後就救人,救完人,船就觸礁了。該死,食人魚也來了,又是一場殺戮。警長兒子的女友被困住,該死的人都死了,警長兒子趕緊向老媽求救,最後警長就救了她的兒女,炸死一堆魚。最後的最後,那個魚類博士又打電話來,說你們抓到的這隻還不是成魚喔,應該還有爸爸媽媽在活動,接著,我被嚇到從椅子上彈起來。

z4root

網路上可以找到很多文章,不過大多都是講怎麼用,而沒有提到原理,所以就想找找看。
最初找到的是這篇:Android adb setuid提权漏洞的分析,裡面就寫得很清楚了,他寫的不是 z4root,而是 RageAgainstTheCage,主要是靠著一直建 process,建到極限值,然後試著砍掉 adb,再靠 adb 程式沒有檢查 setuid 傳回值的漏洞來取得 root 權限。一般的 daemon 程式都是這樣子,一開始是 root,之後會用 setuid 切換身份,所以在 setuid 之前都是 root。而 setuid 通常不會失敗,但是因為可用的程序限制到了,才失敗 (參考 kernel/sys.c 裡的 set_user)。
好,那跟 z4root 又有什麼關係?還好 z4root 有源碼
z4root 裡就有用到 RageAgainstTheCage,z4root.java 是主要的 Activity,當你 click root 按鈕值,會啟動 Phase1 Activity,這邊就會把包成 resource 的 RageAgainstTheCage 寫到z4root的應用程式目錄下,然後變更其權限並且執行。噹噹,執行完以後,當然 adb 就有 root 權限了。
然後 Phase1 有 thread 去持續檢查執行 RageAgainstTheCage 的程序,如果成功了,會利用 Alarm 服務去啟動 Phase2。Phase2 這邊我有點不太明白,最後是將 su、busybox、SuperUser.apk 都搬到系統分割區了,然後就重開機,可是這個時候怎麼會有權限可以作這些事情呢? 如果照上面的 RageAgainstTheCage 來看,我猜想應該是在執行 RageAgainstTheCage 時,把程序數衝到最大限制,然後之後所執行的程序其實都是 root 啟動的,要切換使用者身份時失敗,所以之後的程序都是 root,也因此 Phase2 Activity 也有同等的 root 權限。這邊因為跟 java 的 thread 作法不是很熟,所以就不了了之。
z4root 最後是重開機,此時已經有埋必要的 su 跟 SuperUser.apk 在系統裡,也就有了可以 root 的可能。

老師的喪禮

在教師節談老師的喪禮,好像不是很適合。不過我上周六(9/24)的的確確去參加了導師的喪禮。
雖然相處只有一年,時間不是很長,但老師的笑聲跟爽朗讓我有很深的印象,另外,也因為導師的喪禮是以天主教/基督教(真的很抱歉,我實在搞不清楚)的形式來舉行,所以我就毅然決然地參加了。
時間是在13:00,喪禮很準時的開始了。一開始是唱詩、福音,然後是師丈、老師的哥哥跟老師的好朋友出來講話,在邊講話的同時,後面還放著老師的生平照片投影片,從小時候到高中、大學學生時代,再到結婚、出國玩的照片,這邊真的很感人、很催淚,我眼淚都盈框了。等到講完,是證道,邀請了主任牧師來證道,這邊我要跟老師說抱歉,我差點就睡著,因為證道只有兩個重點,第一個是要把握現在,珍惜生命,第二個,就是講老師在神的引領下,到了天國,信了神,以後就可以再見到老師。再來,就又是唱詩,然後追思。最後可以再去看老師最後一面,我沒去看。
這樣的喪禮我覺得除掉證道以外,我很能接受,所以我的喪禮以後就簡單舉行吧,沒有人上台講對我的懷念也沒關係,就大家看完投影片(投影片我看我自己在死前做好好了,才不會沒人做),一起默哀個三分鐘,然後把遺體丟去火葬就好。總之,這次的喪禮對我來說是一個很特別的體驗。

在Android直接以zxing去解碼圖檔

zxing的Android client 端,是直接不斷的進行自動對焦的動作,然後接 Camera 的 Preview,這時候接出來的影像是 YUV 格式的,然後就直接去做判讀。所以,我當下的想法是在這邊直接去讀取一個 YUV 格式的影像檔,讀完就給 zxing decoder 去判讀,但是失敗。我認為可能是我轉換出來的 YUV 有問題。我是這樣轉換的,先用 ImageMagick 的 convert 把 png 轉成 ppm,再用 ppmtoyuv 轉成 yuv。
後來去看了 zxing 的 JavaSE client,他是用 awt 去做影像轉換,就想,可以把 awt 移植到 Android 去嗎? 上網找了一下,還真的有人做,只是後來專案就沒再開發了。
最後還是 stackoverflow 的幫忙:android – Embed Zxing library without using Barcode Scanner app,原來 zxing 裡的 Android client 測試程式裡就已經有一個 import com.google.zxing.client.androidtest.RGBLuminanceSource 可以處理這件事情,所以就先用 BitmapFactory.decodeFile 把圖檔讀出,得到 Bitmap,再把 Bitmap 丟給 RGBLuminanceSource 裡,就可以再用 new BinaryBitmap(new HybridBinarizer(source)); 得到 BinaryBitmap,decode 就可以根據這個 BinaryBitmap 取到條碼了。詳細的程式可以參考Stack Overflow 文裡的程式碼。,這裡不再摘錄。