Sensors in Android

拜請Google大神以後,找到這篇:阅读android有关sensor的源码总结,這篇寫的超級詳細,從上層到底層巨細靡遺的都描述出來了,但他並沒有描述當你有新的 sensor device 時,該怎麼做?
基本上,除了 Kernel driver 以外,還需要寫 library(sensor module),去實作 hardware/libhardware/include/hardware/sensors.h 所提出的介面,也就是上面文章最後面提到的 JNI 函數。這部份可以再參考這篇:Android Sensors Development對 HTC G1 Sensor的剖析。
對照著看,大致上就能了解了。Kernel sensor driver 被實作為一個 input system driver,當有事件時,會把 input event 發出去;sensor module 是被上層的 Sensor service 呼叫,主要是透過 _data_poll 函數詢問 input device 是否有事件並且取得數據。

NDK r4

跟 r3 比起來,這一版更方便了。
我的環境是 Ubuntu 10.04,所以我下載 for linux 的 zip 檔以後,解開放到 /opt 下,這樣就完成安裝了。
印象中,r3 Build 的方法,需要把程式放在 apps 下面,然後打 make APP=your_project 才能編譯,這一版可以允許你不放在指定目錄,你可以隨意放,像我放在 ~/NdkProjects/my_project 下,就可以直接打 /opt/android-ndk-r4/ndk-build 來進行編譯了。甚至我還意外發現,我不一定要在 ~/NdkProjects/my_project 下,只要在 ~/NdkProjects/my_project 的任意目錄下,都可以用 /opt/android-ndk-r4/ndk-build 來編譯。
此外,也可以用 /opt/android-ndk-r4/ndk-build -C ~/NdkProjects/my_project 來直接指定目錄,表示要編譯該目錄下的檔案,這樣就更容易整合到 Makefile 或 script 裡了。
gdb 現在也內建了,我還沒試過,要找時間試試看。然後也有限度的可以讀圖,不必再利用 Skia 硬幹了。
詳細的變動可以參考 /opt/android-ndk-r4/docs/CHANGES.TXT

電影流水帳(2010/6/11~2010/7/7)

到今天近一個月了,只看了三片,還有,另外回顧了之前的補完的EVA 25跟26,死與新生。
突然覺得今年要達成百片會有點難度了,我還沒去算,不過應該機率不高。
Toy Story 3 上映了,希望 DVD 趕緊出,這樣我就可以去百視達借來看了。

  • Percy Jackson & the Olympians: The Lightning Thief(IMDB, Wikipedia),中譯:波西傑克森-神火之賊。故事本身相當有趣,基本上就是把希臘神話的軼事搬到現代來,不過電影就拍的不怎麼樣,很趕,所以感覺上蠻多枝節都被砍了,書應該會比較好看,不過我想應該就跟哈利波特很相似吧,我想我是不會去借來看。波西是海神跟人類生下來的小孩,上高中的某天被誣賴偷了宙斯的神火,於是展開冒險與探索的歷程,最後發現小偷居然是曾經幫助自己的Luke。飾演雅典娜女兒的女主角Alexandra Daddario相當漂亮,有一種靈氣。
  • Nine(IMDB, Wikipedia),中譯:華麗年代。這是由舞台劇改編的電影,我沒看過,但裏面的歌倒是挺好聽的,特別是Kate Hudson唱的那首Cinema Italiano,很輕快,有機會要把原聲帶找來聽。故事是描述一個失去創意的導演要籌拍新片的心路歷程,在這個歷程裡經歷了數個女人,之後他心灰意冷,決定放棄拍攝,但是最後他還是重回導演椅,拍出他自己的這段歷程。這部片,我最喜歡的3個女人是飾演情婦的Penélope Cruz,飾演元配的Marion CotillardKate Hudson,Penélope跟Marion戲份很重,表演也很出色,深深覺得Marion之前拿到獎決非偶然。Kate戲份不重,但是她主唱的那首歌為她加了很多分。相當不錯看的片。
  • 新世紀福音戰士新劇場版:序(IMDB, Wikipedia)。劇情省略頗多,基本上第1部幾乎都是真嗣在唱獨角戲,而凌波零只是一個觸媒,讓真嗣願意上EVA的觸媒。

pywin32應用:刪Outlook過期郵件

寫了個小程式,來幫我把 outlook 寄件備份跟已刪除郵件的資料夾裡超過30天的郵件刪除掉。
主要使用python跟pywin32,雖然程式很短,但花了不少時間摸索。

首先是對 Office Outlook 的物件模型不了解,我參考了不少網路上的範例(例如:MG: Python for Windows)以及微軟提供的參考才摸索出來。
另外就是對時間的處理,OLE的日期時間跟python的日期時間不一樣,我參考了Converting OLE datetime values into Python datetime objects來作。
最後就是意外發現了 pywin32 有提供 makepy.py 這個工具,可以預先根據 COM Type Library 產生 code 出來,這就很類似 .Net framework 提供的 tlbimp。

#!/usr/bin/env python
# -*- coding: utf-8 -*-
import os, sys
import win32com.client
from datetime import datetime
from datetime import timedelta
import pywintypes
# Microsoft Outlook Constants
# http://msdn.microsoft.com/en-us/library/aa219371(office.11).aspx
olFolderDeletedItems=3
olFolderSentMail=5
# or you can use the following command to generate
# c:\python26\python.exe c:\Python26\lib\site-packages\win32com\client\makepy.py -d
# After generated, you can use win32com.client.constants.olFolderSentMail
# http://code.activestate.com/recipes/496683-converting-ole-datetime-values-into-python-datetim/
OLE_TIME_ZERO = datetime(1899, 12, 30, 0, 0, 0)
def ole2datetime(oledt):
return OLE_TIME_ZERO + timedelta(days=float(oledt))
if __name__ == '__main__':
app = win32com.client.Dispatch( "Outlook.Application" )
ns = app.GetNamespace( "MAPI" )
folders = [
ns.GetDefaultFolder(olFolderSentMail),
ns.GetDefaultFolder(olFolderDeletedItems)
]
for folder in folders:
print( "Processing %s" % folder.Name )
past30days=datetime.now()-timedelta(days=30)
mark2delete=[]
#If you use makepy.py, you have to use the following codes instead of "for item in folder.Items"
#for i in range(1,folder.Items.Count+1):
#    item = folder.Items[i]
for item in folder.Items:
if ole2datetime(item.LastModificationTime)<past30days:
mark2delete.append( item )
if len(mark2delete)>0:
for item in mark2delete:
print( "Removing %s" % item.Subject )
item.Delete()
else:
print("No matched mails.")

如何解救 u-boot bootdelay=0 的情況

昨天因為想避免serial port干擾,就把 bootdelay 設為 0,想不到這卻是悲劇的開始。因為 bootdelay=0,所以,根本無法進入 u-boot … (冏),不能進 u-boot,就不能 update。
請 HW 同事幫忙看是否有線路可以設定強制用 SD 開,但試的結果是不行,一整個陷入困境,只好回家。
晚上睡覺時想到,公司用的 OMAP solution,把 NAND 切成7個部份:

  1. x-loader
  2. u-boot
  3. env
  4. kernel
  5. system
  6. userdata
  7. cache

開機以後,會把後面3個部份掛載成檔案系統來使用,那麼,開機以後我是不是也可以如法泡製把env那一塊抹掉,這樣u-boot讀這塊時,就不是我之前燒錄進入的bootdelay=0,那麼就有機會進u-boot了。
所以我在開機之後,先試著去mount,結果是不行,因為它不是正常的檔案系統。所以改用dd,用dd if=/dev/zero of=/dev/block/mtdblock2 bs=1024 count=1就抹除掉了。接著重新開機,果然讓我有機會按下任意鍵停在u-boot prompt下了。

pygtk for win32

不知道為什麼,之前覺得這很麻煩,所以現在才來試,結果發現很簡單。
試的過程裡,還用了easy_install (setuptools),嘖嘖,這是自找麻煩啊~
步驟其實很簡單:

  1. 先到GTK+ – Download for Windows網頁,找All-in-one bundles,我用的是2.20,下載以後,解開放到 c:\gtk+ 下,然後在環境變數PATH加上c:\gtk+\bin。
  2. PyGTK下載網頁的PyGTK for Microsoft Windows一節裡,找到PyCairoPyGObjectPyGTK,然後下載。要注意的是,點進去你會看到目錄,要點入目錄後,再找最新版本的.exe檔案。下載以後依序安裝即可。

就這樣,超簡單,居然讓我摸了好一陣子,實在是太懶得看英文了,下次不能偷懶。

電影流水帳(2010/5/26~2010/6/10)

看完破讓我有股熱情想再把福音戰士重看一遍,另外,也讓我了解到為什麼會有人要看藍光片了,大螢幕真的是有魄力多了啊!! (握拳)

  • 新世紀福音戰士新劇場版:破(IMDB, Wikipedia)。這真是超有魄力的一片,雖說新劇場版是從頭再演一次,不過我建議還是看完之前的1~26話、電影版之後,再來看這新劇場版會比較好。這一集跟之前的電視版有改動,除了增加新人物之外,劇情也有改變,像是之前是真嗣同學冬二上了3號機,這裡卻是明日香,原本我還以為是我記錯了,上了Wikipedia看了以後,才發現改動真是不少。編寫這條目的人真的是神人!
  • Armored(IMDB, Wikipedia),中譯:運鈔車大盜。味道對了的片,不過我感覺到很多該鋪的劇情都沒有鋪到,導致在後面成員發生爭執的時候,讓人不明白這個人在那個當下所做出的決定,這相當可惜,如果可以拍成3~5集的電視劇,或許會比較好。劇情是以Ty為主軸去發展,Ty因為房貸的關係,很缺錢,他所屬的保全團隊就想吸收他進來一起搶。決定搶錢的前一天,Ty被教育單位的人逼急了,如果沒有錢,就沒辦法留住弟弟,於是他只能挺而走險。他事先就聲明了,如果有人傷亡,他就不幹了。原本應該是不會有什麼意外的,如果他們照原定計劃,假裝被搶,把錢藏起來的話。事情就是這樣,往往你覺得不會發生的意外,偏偏就是會發生。他們在藏錢的時候,不得不殺了人,Ty就火了,整個搶錢計劃因此翻盤。最後是Ty成功阻止他們,並且救了警察。
  • The Messenger(IMDB, Wikipedia),中譯:天堂信差。平淡、內斂的片子,幾乎都是描述感情跟人的變化,感覺上又是一個反戰的片子。Will是個War Hero,但是眼睛受了傷,所以後來就調回本土,改任專門通知家屬說死亡消息的人。故事就在他一次又一次通知死者家屬的經過發生,他從他的同袍兼上司Tony的荒唐生活裡了解了Tony;他接受了他的青梅竹馬改嫁的事實;他也遇到一個令他傾心的女人,雖然他是死者家屬的遺孀;故事大概就是這個樣子。

pythin tkinter

老闆要我幫 HW team 的同事開發一個工具,讓他們能比對線路圖。雖說是線路圖,但並不是真的去對圖,而是會先將圖轉為文字檔,再針對這個文字檔來做比對。文字檔的內容會描述線路經過哪些點,這樣實際上是可以自己做,但是問題在於第一次匯出跟第二次匯出的檔案內容並沒有順序性,也因此沒有辦法使用WinMerge之類的文字比對軟體來做。研究過匯出的文字檔內容以後,發覺並不難,只要用 python 很快就能處理完。輸出的結果就以我比較擅長的 HTML + jquery 來做,就可以達到動態的效果,同時也可以跨平台。只是對於 HW team 的同事來說,讓他們老是打指令來產生結果的HTML,是很麻煩的,所以我就在想 GUI 部份要怎麼做。
Python的GUI大致上有以下選擇,其實就涵蓋了主流的幾個知名 Framework:

  • pygtk
  • pyQt
  • wxPython
  • IronPython+Windows form+.Net framework
  • tkinter(tcl/tk)

pygtk、pyqt、wxpython、IronPython都需要安裝額外的runtime library,實在太麻煩,所以後來決定用 Windows python 就有內建的 tkinter 來做。python tkinter 實際上是 tcl/tk 的 binding,我不知道為什麼會包進去,不過既然有,那就方便多了。
教學可以參考PythonInfo 上的 TkInter,如果有碰過 pygtk,那麼,應該是不難。介面也大致跟 Windows 內建的相近,這邊我的心得就是其實可以不用 TopLevel,這會導致多一個多餘的視窗。

window=Tk()
window.title( "my_app" )
window.mainloop() # 直接呼叫 mainloop() 也可以

文字欄位的存取是用 Entry,Entry 內容的存取要透過 StringVar,也就是你要先產生一個 StringVar 物件,Assign 這個物件給 Entry 之後,才能用這個 StringVar 物件來存取。

filename_var=StringVar()
entry=Entry( window, width=100, textvariable=filename_var )
entry.pack()  # 一定要 pack 一下才會出現,要不然你什麼都看不到。
filename_var.set( "Hello" )  # 賦值
print filename_var.get() # 取值

寫到這裡,UI 已經悄然成型,但是字都…好小,找了好久,最後不得已,先產生 global font 物件之後,再一個一個控制項去設定字型:

global_font=("Arial",12)
entry=Entry( window, font=global_font, width=100, textvariable=filename_var )

好了,大致的 UI 有了,那麼怎麼選取檔案,原本以為要自己作一個 Dialog,後來仔細看過官方 TkInter文件之後,發現有提到一個 tkFileDialog,但卻沒提及用法。再根據 python tkFileDialog 關鍵字去找,發現 ActiveState Code上的這篇有使用範例,有了這個再去挖 source code,就可以知道有哪些 method 可以用,我只用到 tkFileDialog.askopenfilename()跟tkFileDialog.asksaveasfilename()。這個 Dialog 的底層是用到 Windows 內建的 Dialog,所以至少介面跟 Windows 接近一致了。

filename=tkFileDialog.askopenfilename( title="Select a file", filetypes=[
( 'JPEG files', '*.jpg' )
] )
output_html=tkFileDialog.asksaveasfilename( title="Save output as...", filetypes=[
( 'HTML files', '*.html' )
] )

dotplurk 筆記

Plurk Api Using C# 沒有提供文件,要自己轉。不過看了原始碼以後,你會發覺轉了也沒用,基本上就是參考 Plurk API
這裡幾點是看了以後的小紀錄:

  • PlurkApi.getPlurks(),傳兩個參數跟傳三個參數是不一樣的。傳兩個參數,使用的是 Polling/getPlurks;傳三個參數,使用的是 Timeline/getPlurks
  • PlurkApi.getResponses()/PlurkApi.getAllResponse() 都是取得某噗的回應,getResponses()可以指定從第幾則開始抓;getAllResponses()則是全部抓,底層是用迴圈搭配getResponses()去抓。
  • 官方 Responses/get 會取回三個部份:friends、responses_seen、responses,PlurkApi 只會傳回 responses 這部份,所以如果要知道 response 是哪個 user,得搭配 PlurkApi.getPublicProfile() 來取得,getPublicProfile()參數是字串,傳回的是 publicProfile,publicProfile 裡有屬性:user_info,可取得 user 資訊。

另外要注意的是,Plurk API有一天 50,000 次的限制,所以使用的時候要注意避免超過限制。

電影流水帳(2010/5/14~2010/5/25)

進度非常緩慢…
話說,Kick-Ass 真的是很容易不小心打成 Kiss-Ass,一下子場面就變成愛情動作片了(誤)~

  • 葉問2(IMDB, Wikipedia)。承續第一集的風格,還不錯看。這一集是描述葉問來到香港開武館以後所遇到的事情,最後則是以打洋人作為收尾,跟第一集比起來,稍嫌沒力了些。剛剛在找連結的時候,才發現釋小龍有演這部片,用 Google 找了圖片之後,才猛然發現真的有釋小龍啊~就是跟黃曉明一起拜師的其中一個,不仔細看,真的是看不出來。
  • Kick-Ass(IMDB, Wikipedia),中譯:特攻聯盟。網路一片好評的電影,果然是不錯看。不錯看的原因,我想是故事與眾不同,而且動作場面也夠力吧。一個平凡人試圖作超級英雄,他出名了,叫 Kick-Ass。想報仇的父女看到新聞正好藉此也扮成超級英雄來對壞蛋下手,結果使得壞蛋把目標設定為 Kick-Ass。為了找出 Kick-Ass,壞蛋的兒子扮成超級英雄,跟 Kick-Ass 聯繫上,混熟以後,吊出這對父女的下落。後來父親因此掛掉,女兒跟 Kick-Ass 聯手報仇,最後是皆大歡喜收場。