添加自訂的類別

就我目前所知道的有兩種方法:

  1. 放在mydroid/frameworks/base下:在mydroid/frameworks/base下建立目錄,然後裏面放java的source(請記得建必要的目錄),如果有需要的話,也可以在這裡放jni,對,不需要放Android.mk,只有jni目錄下需要。然後修改mydroid/frameworks/base/Android.mk,在packages_to_document後,加上你的目錄名稱,就這樣。最後你的類別會被加到 android.jar 裡。
  2. 放在mydroid/vendors/your_vendor目錄下:建立frameworks目錄,然後裏面再放目錄、Android.mk,接著就跟上面很類似了。最後再修改mydroid/vendors/your_vendor/Android.mk去include frameworks目錄下的Android.mk即可。這部份可以參考mydroid/vendor/sample/。最後還要記得修改 init.rc 裡的 BOOTCLASSPATH,加上你編譯出來的 .jar。

不過以上的方法,在 make sdk 的時候,都不會被包到 SDK 裏面去,這邊我還沒找到方法。

ChangeLog and svn2cl

目前大部分的開放原始碼專案都是遵從 GNU 的Changelog 格式,基本上寫起來不難,只是有點煩。
所以有的開發工具,例如 monodevelop (Version Control Screencast),甚至把你 commit 的格式也固定下來,讓你省掉許多功夫。
好吧,其實只是我今天突然想到以前有用過 cvs2log 這個 perl script,還不錯用,可以直接把 cvs 裡的 log 轉出來成 Changelog,所以,就想到 svn 應該有類似的工具,之前好像有用過,但我忘了。於是我就用 svn2log 去找,嘿,當然有這工具,可是這工具的網站已經連不上了。我只好退而求其次,用 apt-cache 找找,但也沒找到,只是有 subversion-tools 這個 package。裝起來試試看吧,裏面有不少東西,有一個小程式叫作 svn2cl,試了一下,果然這就是我要的東西。
要使用 svn2cl 來產生 Changelog 的話,在你 commit 時,log 就不需要加什麼格式了,就儘可能地在一行之內把 log 寫完,然後不要一次修改很多檔案,這樣產生出來的 Changelog 就會很不錯了。svn2cl 有相當多選項,甚至可以產生 html、只產生某段期間的 log…等,有時間再來研究看看。

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' )
] )