ping permission何時被更改?

在out目錄下看到的,會是正常的 755,那到了裝置裡為什麼變成 2755??

我是在 mydroid/system/core/include/private/android_filesystem_config.h 裡找到 system/bin/ping,那麼有誰引用呢?相當多程式,像是 make_ext4fs, genext2fs, cpio, mkyaffs2image…等等。換言之,是在製作 .img 時,去變更 ping 權限的。

因此如果要加自己的程式,然後不想在 init.rc 裡改權限的話,就得在 android_filesystem_config.h 裡加,然後記得不要加在 android_files 陣列的後面,加到後面,會因為陣列後面都是 * 的關係,而被忽略掉。

電影流水帳(2012/2/25~2012/3/5)

Toy Story 3

  • 葉問前傳(IMDB, Wikipedia)。就某天剛好在第四台看到,就順便看完了。前半部還蠻好看的,就葉問跟他的義兄怎麼拜師學詠春,跟永成認識,去香港唸書遇到師叔學招。到了後面,就有點莫名其妙。原來他的義兄天賜原來是日本人,到中國來是來滲透,這個滲透的方法跟原因相當的牽強,總之,天賜在日本人協助下很順利的當上了精武會會長,高潮在此展開,原來的會長則在天賜結婚後被天賜與日本人殺了,葉問被冤獄,後來,天賜在美慧知道內情後,說服美慧跟他一起逃走,這邊沒交代清楚天賜的前因後果,所以美慧其實沒理由跟他一起走。逃走的途中,被日本人攔住,美慧被抓住,用來要脅天賜去殺了也知道了內情的大師兄。一行人就浩浩蕩蕩去殺大師兄,此時,永成以名節作假供,救出了葉問。葉問在給了永成承諾後,就跑去救人了。一場亂打之後,變成了兄弟單挑,天賜打輸,葉問知道內情後,趕去救美慧。天賜後來自殺,葉問則以盲打打贏了只有一人的日本人會長(太莫名其妙了,怎麼會只有一人?!),最後就以大團圓收尾,但是沒交代後來美慧去了哪裡。真的,我個人覺得後面收尾收爛掉了,好可惜。
  • Toy story 3(IMDB, Wikipedia),中譯:玩具總動員3。隨著Andy的長大,玩具也失去了生存的意義。Andy要上大學了,媽媽吩咐他把該收的收一收,該丟的丟一丟,一群玩具在陰錯陽差之下,到了Sunny side幼稚園。幼稚園其實是一個恐怖的地方,由Lotso統治。Lotso因為被遺棄,而喪失了對人的信任,到了Sunny side則變成偽善的獨裁者。在幼稚園裡的玩具發現了真相,無法忍受,決定逃出。此時,Woody也回來幫他們逃離,展開冒險。最後是皆大歡喜,Andy以依依不捨的心情,將心愛的玩具送給了另外一個愛惜玩具的小女孩,讓玩具能繼續快樂過日子,算是為玩具總動員畫下了句點。應該不會再有續集了吧?!

續借學校圖書2

學校圖書館換新系統了,所以,又懶得打勾。這次修正兩個網頁,一個是強制一次顯示出30筆資料,要不然一次只有10筆,還要翻頁才能繼續。另外一個就根據原來的稍稍調整名字,碰到問題的是,上下有兩個「續借」,想要在兩個的旁邊都加上”Check all”跟”Uncheck all”,可是卻只能加上一個。後來追蹤以後才發現,當我加了第一次”Check all”與”Uncheck all”以後,getElementsByTagName()傳回的陣列(elements)居然自動也跟著變大了,所以後面的「續借」按鈕就沒找到。我的解法就先用 list 把這兩個「續借」按鈕都紀錄起來,後續再用另外一個迴圈去一次處理。

PUK解鎖畫面的開發

基本的思路是想在解鎖畫面的地方,緊鄰緊急電話按鈕的旁邊加上一個按鈕,用以解鎖,並且可以參考緊急電話的程序,來撥打上面提到的特殊電話號碼來解鎖。

依據這篇:Android中PIN和PUK碼解鎖研究的追蹤過程進行追蹤,可以知道:

  1. KeyguardViewMediator.java 的 onSimStateChanged() 裡有對 PUK_REQUIRED 做處理,dokeyguard()會顯示鎖定畫面,而dokeyguard()裡則是先檢查是不是被鎖住,是的話,就送訊息出去,表明該要顯示鎖定的畫面,送出去以後,handleShow()會收到並處理。
  2. handleShow()裡會先播放音效,然後呼叫mKeyguardViewManager.show(),這裡會去建View,並設置View相關Layout參數。從這邊可以追蹤到LockPatternKeyguardView.createLockScreen(),這個函數就直接回傳LockScreen,LockScreen是在frameworks/base/policy/src/com/android/internal/policy/impl/LockScreen.java。
  3. LockScreen則是去解析frameworks/base/core/res/res/layout 下的 keyguard_screen_tab_unlock 與 Keyguard_screen_tab_unlock_land 其中之一(依橫或直來決定)。裡面的emergencyCallButton有註解說在sim card為PUKd時,才顯示。至此,已經知道該改哪個畫面才可以多一個按鈕出來。

那麼多了按鈕之後,能否再帶一個畫面出來輸入PUK與PIN呢?

這邊繼續參考takeEmergency()的部分,takeEmergency()是直接送帶有ACTION_EMERGENCY_DIAL的Intent出去。ACTION_EMERGENCY_DIAL是一個字串’com.android.phone.EmergencyDialer.DIAL’,以這個字串去搜索,可以在packages/apps/Phone/src/com/android/phone/EmergencyDialer.java與Phone app的AndroidManifest.xml中找到,那麼這就表示是由Phone app在處理。

因此,決定仿效這樣的方法,在Settings app裡加上輸入PUK、PIN的畫面,並且在AndroidManifest.xml裡該畫面activity的intent filter裡加上客製的Intent字串。

Framework 層,則先在畫面加上新的按鈕,並且在按鈕的處理裡,仿效takeEmergency(),加上送出客製的Intent字串,這樣就可以串到Settings app的畫面去了。

程式都撰寫好之後,進行測試,首先遇到的問題是,按下按鈕以後,位於Settings app的畫面並沒有顯示出來,利用 adb logcat 進行追蹤,發現的確有送出 Intent,要求 Settings app 裡的 activity 啟動,可是畫面卻出不來,參考EmergencyDialer.java,發現需要在 onCreate() 裡加上 getWindow().addFlags(WindowManager.LayoutParams.FLAG_SHOW_WHEN_LOCKED),這樣才可以在被鎖定時顯示出來。

第二個遇到的問題是,使用特殊的電話號碼去進行撥號,並沒有反應,也因此無法解鎖。這裡去搜索IccCard.java,發現有supplyPUK()函式,既然supplyPIN()是解鎖PIN,那麼supplyPUK()就應該是解鎖PUK。於是在畫面補上取得IccCard的必要程序,然後去試,這次根本連畫面都出不來了,參考 adb logcat,發現是 activity 啟動失敗,依據啟動失敗的錯誤訊息去搜索,發現是需要為activity加上android:process屬性,於是在 Settings app AndroidManifest.xml 新增的Activity tag上加上android:process=”com.android.phone”,就可以順利啟動並解鎖了。

電影流水帳(2012/2/15~2012/2/24)

3 IdiotsAshley Judd, movie actress

  • Flypaper (IMDB, Wikipedia),中譯:捕蠅紙。1990年也有部同名的Flypaper,然後裡面的演員有劉玉玲,真是讓我驚訝了一下,世界真是小,不過我不知道1990年的故事是否跟現在的一樣。這部片的故事,是講銀行同時被兩幫搶匪搶了,由於搶匪都沒預期到有另外一票人,所以很混亂。混亂的同時,有中情局的人死了。無法集中精神,可以同時注意很多事情的Tripp擔起偵探的角色,在銀行這個密室裡,試圖找出誰殺了中情局的人,在找出凶手的過程中,又死了一些人,最後還出人意料之外,結局不能說,說了就破梗了(是說,我也常破梗,這次就算了…)。整個故事有抽絲剝繭的推理,也不會拖泥帶水,節奏明快,真的不錯看。中間有一段,女主角Kaitlin強吻了Tripp,然後Tripp整個在地上打滾說我快死了那段,蠻有趣的,讓我印象很深刻啊。
  • 3 idiots (IMDB, Wikipedia),中譯:3個傻瓜。很多人大推的片,的確很好看,就不多說了。故事的表達跟某些情結是有點誇張了,但他想表達的東西很值得人去好好思考。然後裡面有印度的歌舞穿插,很好看!還有最後不知道是在哪裡取景的(Ladakh是真的有這麼漂亮嗎?),風景很漂亮!

電影流水帳(2012/2/8~2012/2/14)

Kat DenningsThor真的是不怎麼樣的片,圖左是我覺得台詞很搶戲的女配角Kat Dennings,不算是很漂亮,但她在電影裡的獨特知性美吸引了我的目光。

  • Thor(IMDB, Wikipedia),中譯:雷神索爾。長不怎麼樣的片,感覺上跟「美國隊長」一樣,就是為了要幫「復仇者聯盟」鋪梗,Ironman2裡有一段發現大坑的,就是接到這裡,那個坑是雷神之鎚掉下來所出現的洞。Thor是北歐神話裡的雷神,小時候有看過,所以裡面講的一些神還算是熟悉,不過其實也只要知道Loki、Odin跟Thor就夠了。Marvel的Thor基本上就是延伸北歐神話,所以故事大致上就是這樣發展,只是加上Thor三不五時會到地球溜達。故事大致是這樣子的,Thor是個臭屁又驕傲,不會聽人講話的人,準備要登基接奧丁王位的時候,冰雪巨人來亂,雖然沒事,可是Thor就很衝動,說要殺到冰雪巨人那邊去,奧丁不准。後來就自己帶親信跑去,要不是奧丁去救,差點就沒命。奧丁把他的超能都拿走,放逐到地球去。丟到地球時,就遇到女主角一行人救了他。女主角一行人因為不小心撞到他,良心不安,就把他帶回去。這裡有一幕,Thor邊穿衣服,邊講話,秀出他壯碩的肌肉,是真的很讚。後來就帶到Loki,Loki是奧丁撿回來養的,他很不爽,不爽奧丁都不重視他,所以才會放冰雪巨人進來偷暴風之匣。然後他跟奧丁吵起來,奧丁因此昏倒,長眠不起。Loki暫時接任王位,並且跟冰雪巨人達成協議,要消滅Thor。Thor的同伴因為Loki掌權,又不讓他哥哥回來,不是很爽,就跑去地球找Thor。冰雪巨人剛巧也在這個時候去拜訪Thor,然後就是一場大戰,Thor因為沒有神力就很廢,被打趴,然後突然因為Thor改變了心境,就回復神力,雷神之鎚也回到他手上,喔喔喔!!一下子就把冰雪巨人幹掉,然後回到Asgard,跟他弟弟打起來。這裡很不合理的是,Thor突然同情起冰雪巨人,也不願意打Loki。為了阻止Loki毀了Jothuheim,他用雷神之鎚把彩虹橋打斷,也因此回不了地球。然後Thor跟Odin打到差點掉下去,Odin突然甦醒,救了他們兩人,可是Loki卻自己放手掉下去。片尾帶到Dr. Selvig去參觀神盾局,鏡子裡冒出Loki的身影,顯示還有後續的故事。
  • Underworld(IMDB, Wikipedia),中譯:決戰異世界。回味老片,趁第3集上映,趕緊看一下。狼人跟吸血鬼是世仇,吸血鬼Selene發現狼人怪怪的,就去調查,發現了狼人在找Michael Corvin,也發現了暫時攝政的Kraven跟狼人Lucian勾搭,要篡位。於是她就請出了Viktor,可是Viktor不是很相信她。之後真的確定了Kraven跟Lucian有勾結,Viktor就親率人要去把狼人幹掉,而Selene為了保護Michael也去救人,然後就打的亂七八糟,一踏糊塗。真相就隨之而出,狼人跟吸血鬼世仇,是因為Lucian愛上Viktor的女兒,可是Viktor不允許,就把他女兒給處刑解決掉了。而Kraven則告訴Selene,說她的父母並不是被狼人殺掉,而是被Viktor殺掉。Michael也陷入危機,他即將死去,Lucian告訴Selene趕緊咬他,讓他變成超越吸血鬼跟狼人的新品種,就可以救他。Michael被咬之後,就變成了新人種,跟Viktor展開決戰,最後在Selene跟Michael的聯手之下,Viktor被幹掉。

signalStrength.getGsmBitErrorRate() always return -1

用 PhoneStateListener.onSignalStrengthChanged() 來接signalStrength,就可以呼叫到signalStrength.getGsmBitErrorRate(),試了兩三台手機,都只拿到-1。上網查,很多人回報他的手機也是如此。查Android developer reference,這個要看 27.007 8.5,看了以後知道-1是不正常的值,也知道對Modem那邊是下AT+CSQ。

請同事幫忙看,他說直接對 Modem 下 AT+CSQ 有傳回值:”14,99″,這就怪了,所以就看了 Framework 層這邊,處理回來的 AT+CSQ 的地方是在 GsmServiceStateTracker.onSignalStrengthResult() ,這邊繞了一堆路,簡單的說,就只解析了第一個參數,存到 signalStrength 裡以後,就通知上面了,剛巧,signalStrength 裡 bit error rate 的預設值就是 -1,所以才會一直都拿到 -1。因此這邊加上解析第二個參數的程式以後,就可以順利取得99。

回頭再看 27.007 8.5,99 其實是 not known or not detectable,這還是沒辦法用,再加上 8.5 對 AT+CSQ 的說明是說 optional,不一定要實作完全,因此這就只能回頭問提供 modem 晶片的廠商了。

看原始碼的利器-gj

好像是在看推還看噗的時候看到的,fcamel 大自己刻的工具gj,今天才在試,發現很方便,找關鍵字很快。使用方法很簡單,先安裝 id-utils (sudo apt-get install id-utils),然後在你要看原始碼的目錄下,輸入 mkid 先建立資料庫,之後就可以用gj keyword 列出有keyword的檔案並讓你選擇要看哪個檔案。如果你用 gj keyword keyword2 就表示要在有 keyword 的檔案裡再去找看有沒有 keyword2,依此類推。

預設是用 vi 去編輯檔案,要改的話,就稍微改一下 gj 即可,gj 是用python寫的喔~

 

電影流水帳(2012/1/27~2012/2/7)

E3 2010 Megamind demo area

  • Megamind(IMDB, Wikipedia),台譯:麥克邁-超能壞蛋。卡通片,還可以,當初要上片時,還有跟Zynga的Farmville合作打廣告,所以農場裡就有大大的Megamind雕像。Megamind跟Metroman從小就是宿敵,一直打到長大,一直打打打,打到有一天,Metroman不想玩了,就假藉一場爆炸逃走。Megamind接掌了城市,卻發現沒有了對手,生活失去意義,所以他就利用Metroman的DNA做出藥劑,並且不小心把女記者的攝影師變成了新的超人。在這段時間裡,他也不小心變成另外一個人跟女記者交往,一段時間下來,他們愛上了彼此。新的超人得到新的力量,發現事情跟他想的不一樣,沒有辦法順心如意,就決心為惡,然後跟Megamind槓了起來。Megamind被打的落花流水,去找了假死的Metroman,Metroman拒絕出來。後來Megamind就運用他的智慧跟手段,最終打敗了新的超人,成為新的真正的英雄。
  • Captain America(IMDB, Wikipedia),台譯:美國隊長。好莫名其妙然後理所當然的就結束了。Rogers 很希望從軍,無奈就是太瘦小。後來碰到神秘的博士,為了實驗品為了他的善良把他找進來。找進來觀察了一陣子,發現真不錯,就幫他注射了。噹噹,成功變成大隻佬,變身以後,並不是立刻投身戰場,而是被當作吉祥物來募款用。直到後來到了歐洲,他發現自己不受歡迎,然後自己朋友又被抓了,就毅然決然單身匹馬進去救人,一陣亂砍之後,救出了一堆人,跟紅骷髏結下樑子。接下來就是一陣亂打,最後知道紅骷髏要去轟炸美國各大城市了,就來個總決戰,不過沒有很歡樂的結局,紅骷髏被強大的力量轟碎,Rogers跟飛機一起掉到北極當冰粽子。到了現代,神盾局的人發現了他,就把他救了起來,準備成立復仇者聯盟。令我最有印象的地方是,Rogers、女主角跟Chester(Tommy Lee Jones)一起開車去追紅骷髏,Rogers要跳上飛機前,女主角跟Rogers親吻,然後Rogers再看著Chester,Chester說了一句很妙的話:「I’m not kissing you.」

Harbour Project – Hello world

The Harbour Project is a Free Open Source Software effort to build a multiplatform Clipper language compiler. Harbour consists of the xBase language compiler and the runtime libraries with different terminal plugins and different databases (not just DBF).

Harbour is a cross-platform compiler and is known to compile and run on MS-DOS, Windows (32 & 64), Windows CE, Pocket PC, OS/2, GNU/Linux and Mac OS X.

簡單的說,Harbour是Clipper的替代品,目前可以運行在很多平台上,雖然說跟Clipper/VFP同是xBase類的語言,但是還是有很大的差異,這些差異可以從文件裡看出來。不過Harbour有相當大的優勢,就是速度跟平台,它會先把 prg 轉譯為 C 語言,再編譯出執行檔,再者,它可以裝到很多平台上。對被拋棄的xBase語言的開發者來說,是可以考慮看看的。

Linux 上的安裝很簡單,就去Harbour下載網頁找到你的Linux版本,點進去,找到檔案下載即可,我是用Ubuntu,就到binaries-linux-ubuntu下,下載 .deb 檔案。下載以後,執行sudo dpkg -i harbour_3.0.0-1_i386_ubu_10.04-2.deb 就安裝好了。

接下來就寫程式,副檔名是.prg,就建立一個hello.prg,內容就像這樣

&& Output "hello world"
? "Hello world"

&& Create table,沒有VFP的create table,還真的有痛苦到。
local aDbf := {}
AADD(aDbf, { "Fld1", "N", 3, 0 })
AADD(aDbf, { "Fld2", "C", 4, 0 })
AADD(aDbf, { "Fld3", "C", 20, 0 })
DBCREATE("table1",aDbf)

use table1
browse()  && browse 不再是指令,而變成函式了。
close all

執行 hbrun hello.prg 就可以直接執行,看到結果。使用 hbmk2 hello.prg 就可以編譯出執行檔 hello,輸入 ./hello 就可以執行。