講到問答網站, 可能會想到的是Yahoo奇摩知識家, 如果是developer可能會想到StackOverflow

不過今年有另一個新型態的問答網站崛起, 就是以社群(Social network)為基礎的

這之中有一個由前Facebook CTO所創辦的Quora最近還蠻受注目的(至少是吸引到我的目光 :P)

最近看起來TechCrunch就很喜歡上Quora挖資料挖訊息:

詳見: Q: What Does Quora Mean For The Future Of Blogging? A: Business As Usual

Quora跟傳統問答網站不同的是, 它會依據你的興趣來列出關於你感興趣的主題的問題, 這樣一個好處是, 你會感興趣的東西通常會是你也會想知道答案, 或是你會知道答案, 這樣一來, 問出問題被有效回答的機率也會比較高

而他靠什麼來判斷呢?當你把你的Facebook帳號跟Quora帳號連結一起時, 它就會去Facebook找出所有你喜歡的, 建議相關的主題給你Follow, 還會自動Follow你Facebook上你也follow的朋友, 並且會根據朋友follow的主題來建議你, 這樣一來, 對於你喜好的精準度的掌握還算蠻高的, 你問的問題也有更大的機會讓真正對這主題專精的人回答

此外, 我最喜歡的功能是, 不但人, 主題可以follow, 你也可以去追蹤某個問題, 隨時可以得知有沒人對這個問題給一個不同的或是新的答案

有時候令人驚奇是, 出來回答你問題的人可能會跟這問題直接相關的人, 比如說你可能問一家公司的狀況或是相關問題, 搞不好這家公司的相關人士(甚至CXO)都跑出來回答你….

最近老爸常喊胸悶,可能天氣的原因讓他心臟比較負荷不來,但醫生做了幾個檢查又查不到原因,只好安排入院再做一次心導管檢查
昨天東元的張醫師在檢查完之後很詳細的跟我解釋觀察到的
之前裝上支架的前端一點的血管後來也有阻塞,但他說不至於有太大影響,最讓我覺得奇妙的事,右邊的血管長新分支到左邊已經損壞的血管支援
生命真是神奇,就像株羅記公園臺詞一樣

抓到Gingerbread之後本來要build一份給Nexus one的, 後來Build break後就懶得管它, 昨天稍微研究一下解法, 果然跟我想的差不多

Builde break的點在於libcameraservice, 主要是某H公司的camera driver並沒open source, 要build必須先從Nexus One取出binary來build, 但偏偏Gingerbread的libcameraservice跟camera driver的interface有變, 像是HAL_getNumberOfCameras, HAL_getCameraInfo在舊版的driver並不存在

解決的方法有兩種:

  1. 用dummy driver
  2. 加個wrapper給它

目前實驗出來的結果很…殘念..還是沒能讓它的camera可以正常使用… orz

第一個方法比較簡單, 只要改makefile: frameworks/base/services/camera/libcameraservice/Android.mk

把USE_CAMERA_STUB:=true變成always的true (就是把一些判斷都mark掉就好)

這樣build出來的就會是用camera stub

第二個方法可以參考這邊

這方法只是加個wrapper把需要的幾個function加上去, 並包裝舊的call

一樣要改frameworks/base/services/camera/libcameraservice/Android.mk, 只是多個目錄放wrapper

Cyanogenmod也是用同一招解決的, 不同的是, 它並沒多生出一個lib來放這warpper, 它是直接改在CameraService.cpp

其實是同一個方法, 由於它多生一個define : BOARD_USE_FROYO_LIBCAMERA來enable/disable這段code(畢竟Cyanogenmod不是只有for N1), 所以要在 device/htc/passion-common/BoardConfigCommon.mk 裡面加上 BOARD_USE_FROYO_LIBCAMERA := true 來把它打開

基本上, 兩種方法N1的Camera都等於廢了, 所以用哪一種都一樣 

 

Download now or watch on posterous
p450.mov (2000 KB)

如果使用過Google MapView你會發現G社會叫你用你的package signature去申請map key(參考這邊)

那MapView本身又是如何取得你的package signature的呢? 

其實很簡單, 可以透過目前的Context用Context.getPackageName()取得package name, 然後再利用package name去PackageManager.getPackageInfo()去查詢package的資訊(PackageInfo), 裡面有項資訊"signatures"就是我們所要的(一個package是可以被sign多次的)

Facebook Android SDK所提供的Single sign on (SSO)也是得先在server端註冊你的package signature, 這樣它可以避免別人偷用你的API key去做single sign on的動作(因為別人的AP可能不會跟你sign同一個signature)

但Facebook的SSO是透過Facebook for Android來做login的動作的, 你的application是透過startActivityForResult去叫Facebook for Android, 這牽涉到兩個不同的package, 如果依上面的例子的話, MapView其實是鑲嵌在你的UI上, 跟你的application是同一個package, 所以可以拿context來取得這資訊

Facebook for Android是如何取得call他的人的signature呢?

其實也是用PackageManager.getPackageInfo() 來取得, 但它如何知道呼叫他的人是哪個package的?

這只要組合兩個API就可以辦到了

第一個是Binder.getCallingUid() , 這可以讓你取得你的Calling process的UID

第二個是PackageManager.getPackagesForUid() , 這可以讓你取得屬於這UID的所有package

或許這邊你可能會有點疑問, 不是不同的package可以share UID嗎? 這樣取出來的package可能有很多個, 我怎知道用哪個? 我們目的只是要取得signature, 所以用哪個都一樣, 因為share UID的必要條件就是這些相同UID的package都是要sign同一把key, 所以只要找出所有package共通的signature就大功告成了