2010年10月25日 星期一

16W羊膜穿刺柯滄銘

早早就預約滿16週後要去作羊膜穿刺。雖然未達高齡,第一孕期唐氏症篩檢結果機率也好幾千分之一,就連產檢醫師也沒主動建議我去作,只是語帶保留地說:如果擔心就去作沒關係。由於家人多持反對態度,自己又信心不足,直到檢查前一天都還在猶豫,拚命找理由說服自己。後來上網找了許多有關羊膜穿刺的資料,也看了很多網友經驗分享,我知道以目前醫療技術,羊穿是安全性很高的一種產檢,只要找對醫生,就不用過度擔心。我選擇去柯滄銘婦產科作羊穿,早有耳聞他的快、狠、準穿刺技術是公認的一流,連我的產檢醫師聽到我要作羊穿,也直接問我是不是去柯滄銘那裡。

羊膜穿刺當天,我電話預約掛號是下午3點20,我一直問護士需要下午門診時間一開始就去現場排隊嗎?因為網路上許多媽媽都強烈建議要提早到現場用健保卡排隊掛號,以免等太久,但是護士說不用,就照他幫我掛的時間去即可。於是當天我只提早10分鐘到,填完資料約再等10分鐘就輪到我了。當天是週六,理應人很多才對,但是我到現場發現人超少,只有2-3對夫妻在等。跟網路上說的完全不一樣,櫃檯掛完號後要先付清費用才作檢查,總共7850元。

進診間後,護士稍作說明羊膜穿刺是針對染色體作檢查,我只問她:作完要在家裡躺個三天嗎?護士回問我,羊膜穿刺就像抽血一樣,你抽血會在家裡躺三天嗎?我懂她的意思,就是我想太多啦!

躺在檢查床上後,老公可以陪同進去,護士再解說一次作羊膜穿刺是很安全的,一直教我放輕鬆,越放輕鬆越不會痛。柯醫師進來後,先照超音波,告知我懷孕週數、胎兒性別、體重身長、預產期後,護士開始在肚皮上塗碘酒消毒,他們會一直跟你聊天,轉移你的注意力,我只記得醫師下針時說:肥胖是一切疾病的根源。我想他會這麼說是因為:我太胖啦! 他可能很少看過才16週就這麼胖的孕婦,醫師一直說並不是媽媽吃多少,胎兒就吸收多少。雖然我眼前有液晶螢幕可看到抽羊水過程,但是我根本無心在看,我怕越看越緊張,好像不到一分鐘就抽完羊水,我又問一次醫師,需要在家裡躺個三天休息嗎?醫師說不用,還一派輕鬆地叫我去逛街。護士有提醒不要提重物,但可以抱小孩,他說抱小孩用腹肌肌肉,跟子宮無關。

整個過程連同等待時間約莫30分鐘,真的不覺得痛,只覺得內褲被碘酒黏在肚皮上,有點癢。建議穿深色衣褲,因為會塗很多碘酒在肚皮上。離開診所時還不到四點,跟我預計要花費的時間快很多。

護士說報告約要7-10個工作天才會出來,我真的等了2週才等到報告,收到報告前1-2天,如果無異常現象,診所會先用手機簡訊通知,短短幾個字-「正常男性染色體」,讓我一解等報告時的焦慮。

2010年10月21日 星期四

寫驅動程式的工作流程

常聽別人說寫驅動程式很簡單,但自己卻偶而才有這種感覺,因此整理至今為止,
在寫驅動程式可能需要注意,檢查的部份,若有新的心得再繼續更新修正與補充。

standard operating procedure(sop), work flow to write a device driver:

hardware
1. power on? reset timing sequence. study device spec, platform cpu/soc spec.
2. bus interface: host and device part, study bus spec
3. clock for device or device interface bus, study bus spec
4. power pin voltage in device datasheet spec?, study device spec

use multimeter(三用電表) to check voltage, current or resistance
use oscilloscope (示波器) to study and check clock timing, signal sequence and timing,
use Logic Analyzer(邏輯分析儀) to study and check bus protocol

software

5. board initial code:
struct machine_desc in arch/arm/include/asm/mach/arch.h
for example:
arch/arm/mach-s3c64xx/mach-smdk6410.c
search for MACHINE_START()
.init_irq for irq initialization
.map_io for memory mapped address space
.init_machine for board initial startup code and some early driver power on

6. gpio setting or multi-function pin, study soc spec, device spec

gpio_request() to reserve our gpio pins to prevent other drivers' disturbance

memory mapped i/o chip select timing setting, study device read/write timing
and SoC memory mapped timing sequence, memory mapped address space
assignment (resource in platform device)

use iotable_init() to define .virtual, .pfn, .length, .type in struct map_desc
irq(interrupt pin) from gpio pin (use gpiolib and resource in platform device)

use gpio_to_irq(), set_irq_handler(), enable platform interrupt vectors
assign platform_driver name to corresponding platform_device

use platform_add_devices() to add platform device drivers

7. device power/reset sequence, study device spec

8. device initial command, study device spec, sample driver reference

9. device register read/write verify, device register interace
(memory mapped i/o chip select setting, bus procotol spec, device init
command)

10. device setting command, study device spec

11. device driver export device node in /dev, information in /sys, /proc

12. make device nodes in /dev, by driver or mknod
check device file major/minor number in ~linux/Documentation/devices.txt

13. library cross compile, setting matched to /dev path?
export CC=/path/to/cross/tools; ./configure --build=x86-linux,
--host=arm-linux

14. application cross compile, set correct link path to library(prefix)
export CC=/path/to/cross/tools; ./configure --build=x86-linux,
--host=arm-linux --with_lib=/path/to/cross/compiled/lib

inspired by jserv: 分享是最好的記憶

希望人人都會寫驅動程式,只要有硬體設備,Linux 都可以支援。

2010年9月14日 星期二

Android 在高解析度畫面的處理方式

Samsung Galaxy Tab 採用 Android 作業系統後引起鄉民的廣大迴響,也值得 Android 開發者好好警惕,主要原因是 Android 原本就不是設計給平板電腦這類裝置使用,令人安心的大多數的應用程式仍然可以直接套用,潛在的問題也很容易解決。以下我們提出一個不只適用於平板電腦,也可以應用在各式各樣產品的解決方案:

這個平板電腦規格如下:
畫面解析度 1024x600,第一個有超過上千畫素的解析度大多數人都會抓住他的兩旁,橫著使用。

我們建議開發者花時間仔細研讀 supporting multiple screens 一文,我們也將會在持續改善該文章內容。Dan Morrill 的One Screen Turn Deserves Another 博客文章,也可以適用於直立式使用的情況。

像素密度的意義

當要開發應用程式的外觀時,主要是設計版面跟使用的圖資,而這兩項外觀重要原素就牽扯到螢幕的像素密度、尺吋大小、橫放或直立使用三因素。如果想要設及時髦又漂亮的外觀設計,則必須要完全理解這三個元素。

在三星的這個例子中有另一個意外的地方是他採用遠超過 Android 設定的 170 DPI,當然這是為了在該平板電腦上有更好畫面的設定。在大螢幕上如果設計不良很容易讓螢幕空曠區太大,中等解析度時按鍵與圖標之間距離太遠,但在高解析度時 Android 框架的擴展方式讓該產品畫面更漂亮。

身為業餘攝影師我想到拍照時的光圈、ISO、快門設定問題。當你想拍攝一位舞者,就必須加大光圈、ISO 調得更敏銳、快門加速等技巧。同樣的三星的 Galaxy Tab 使用較大螢幕就必須用更高解析度。

好消息是 Android 框架的程式碼判斷足夠判斷出該產品的最佳畫面,LifeSaver2 的應用程式畫面表現很棒,上面是在 Nexus One 下圖則是Galaxy Tab:




只要你確保提供三種不同解析度圖資,Android 框架就可以找到適合的擴展方式。
可能出錯的地方(你無法預期應用程式跑在哪一種螢幕上)

採用絕對值的 layout
採用絕對值畫素而非無關像素密度的設定
自行計算螢幕大小、自行載入圖資、而非經由框架載入

參考 supports-screens 我們建議你採用以下設定:

<supports-screens android:largeScreens="true" android:anyDensity="true" />

在 API 版本 4 以前的預設值都是 false,如此設定後在大多情況下都可以得到理想的畫面輸出。

測試

如果要確保畫面輸出,最好還是用模擬器輸出測試過,三星也有提供相關的外掛(add-on)讓你更容易測試。

幹嘛管這麼多?

主要是因為 Android 本來就只是設計給手機用的平台,為了因應現在的應用變化,才加入後續的調整與應用。但也拓展了你的應用程式可以應用在各種產品上的可能性。

原文網址:

Screen Geometry Fun

2010年9月11日 星期六

訓練你的自信心

回顧成長的過程中,除了技術與知識的學習漸漸瞭解該如何持續成長外,如何鍛練自信則一直是靠斷斷續續的座右銘,成功人士自傳與撰稿者事後諸葛的猜測與自我合理化,心理低潮時找家人朋友同學尋求慰藉...等方式。

要說有可以訓練自信的系統化科學方法,請參考神經語言規劃 (NLP),輕鬆一點的話,底下這類文章也對訓練自信有效。

摘譯如下:

自信是日常生活中的必備良藥,除了讓我們不會一直自我質疑,管理自己的恐懼,最重要的是可以花更多的時間去做對真自己真正重要的事。

但很少人知道心理上的自信心,就像生理上訓練身體肌肉一樣,只要有練就會累積更多自信心。不常常使用、展現你的自信心的話,將會失去自信。以下列出 63 種訓練自信心的方法,期待你成為擁有強大自信心的人。

1. 學習是好事,有任何新奇有趣的事物,就去報名或在家自學吧。

2. 暫時脫離自我,問問你的親朋好友有什麼需要你幫忙的事情。

3. 上健身房或保持運動習慣,鍛練強壯的身體才能做為自信最穩固的基礎。

4. 放下擔心的事物,看看網路上有什麼事件,想想你可以如何幫助別人?

5. 列出清單,釐清哪些是真正對你重要的事。跟你生活無關的就丟掉。

6. 列出你必須容忍的非必要事物,並記下如何降低這些事物對你的影響。

7. 回顧自己以前的成就、成功經驗,肯定自己以前付出的努力。這不是要你對別人感到自負驕傲,而是你對自己能力與信心的肯定。

8. 在社交場合不只跟熟悉的人打招呼,多去認識新面孔,去發掘更多新鮮有趣的人事物。

9. 下次當你想放棄某件事,或逃避某人、事物對你的挑戰時,記得改變想法,去做就對了。

10. 每天至少做一件讓你物質或心理上感到由衷高興的事。

11. 找尋讓你自我懷疑、猶疑不定的模式與想法來源;想像這是你最好的朋友經歷其中,並且準備放棄,你希望如何做出改變?

12. 邀約心中的夢中情人﹝前提是你還單身,我並不想讓你陷入麻煩﹞

13. 照顧好你的心靈,列出二十項可以滋養心靈的人事物,記得在心中保留空間給這些人事物。

14. 不要一直去猜想別人希望你做什麼,專注在自己身上。

15. 當每次出現"你不能擁有","你得不到","你不夠格得到"這類關鍵否定想法時,馬上丟棄,專注在如何得到、擁有的想法與行動上。

16. 不要把生活當作隨機、訴諸命運,每件事都是你清楚知覺,想要,喜歡去做的。

17. 下次面對風險、挑戰時,傾聽內心的聲音與對話,想想如何改善。要怎麼更簡單、容易處理這件事的方式。

18. 害怕別人覺得你很蠢、看到你犯錯嗎?其實這並不重要,每個人都曾經歷過,重點是不要因此停止努力,繼續把事情完成。

19. 停止為自己貼上沒自信的標籤與話語。事實上每個人都可以在日常生活中找到足夠的自信支持你的心靈,只要你留心注意就會得到,每個人都會有不消自我懷疑、完全自信的領域。

20. 自我懷疑有時候並非壞事,這也告訴你自己該在哪方面多加準備、努力付出。正面思考每件原本認為負面的人事物。

21. 回想你全力以赴、完全專注的經驗,想想你當在做什麼?是什麼原因讓你如此認真投入其中。

22. 每個人都會有許多過時的規則去決定自己可以做什麼?什麼不可以做?該做與不該做的事?正是這些規則限制了自己的思考與行為。捨棄這些過時的規則與限制,然後你才能做出真正自由的決定。

23. 你是否曾經因為放棄某個機會,或是不敢全心全力投入某件事而後悔不已?別再因此自責,這只會陷入惡性循環。狠下心面對已經造成的過錯與悔恨,你學到了什麼?下次你會如何思考?如何回應?

24. 當在做任何一件你感到害怕,不確定有足夠自信的事時,代表你正將自己推向新的境界,正在提升自己到另一個層次。

25. 如果曾經有人故意讓你難堪,或貶低你,要知道這是你欠自己一個公道,下次遇到同樣情況,別再讓人有機會再貶低、欺負你。你值得別人對你更好。

26. 調情是與別人連接的無害舉動,也很有趣。

27. 在人際關係中適時表露強烈的感情。

28. 承認並歡迎所有好與壞的遭遇。這讓你的內心不再因為不敢面對過去的遭遇而持續衝突。

29. 不論情況有多糟,永遠都要知道你有能力完善的處理好。

30. 不要對任何發生在自己身上的事大驚小怪,找出真正可以處理、解決生活問題的方法。

31. 不要一有利可圖就讓步,這通常表示你賤賣自己。

32. 當感到想跺腳發洩忿怒時,退一步並對自己說"我值得更好的"

33. 自信有時表現在勇於認錯,永遠做好承認錯誤,立即改正的準備。

34. 相信你的直覺。

35. 做某件事會感到恐懼是因為知道自己將接近現有極限,也是自信成長的良機。

36. 想像理想中的自己,充滿自信、成功、迷人、生氣勃勃的你,會想要給現在的自己什麼樣的建議?

37. 不要一直想攬下全部的事情自己做,尋求協助也是表現自信。

38. 明天試試一件值得冒險的事,不管大小,試試自己的極限。

39. 你需要跟支持、樂於鼓勵你的人在一起,而非一直低估你的人。

40. 別再掙扎於生活中令人討厭的事物,創造一個與你相稱、可以表現自我的環境。

41. 沒有人適合孤獨,我們必須藉由參與感才能有自信。想想你可參加哪些團體活動培養自信?

42. 當面臨挑戰與恐懼時,不要猶疑於優劣分析,勇於挑戰自己的恐懼。

43. 專注訓練能夠幫你贏得對你有意義事物的技能上,如果要大幅增進你獲勝的機率,最有幫助的訓練是什麼?

44. 身心是一體兩面。當你改善身體狀態也會獲得更有自信的心靈。

45. 當你已經灰心喪志、失去動機與鬥志時,不要放棄,因為這表示你已經完成事情最難的部份,只剩最後 10% 就能成功了。

46. 不要再拿自己跟別人比較。昨天的你就是今天要超越的指標。

47. 抬頭挺胸,唸出可以再改進的部份,唸出瞬間即逝的靈感。

48. 如果你苦思良久仍無法理解某件事物,先停止嘗試理解,但要全心全意的接受並將這件事銘記於心。

49. 對陌生人感到害羞也沒關係,這不影響你的自信。不要執著於你的害羞,當你不再去想害羞這件事,就是展現完全自信的時機。

50. 環境會影響你的心靈,找個早晨時間將凌亂、垃圾、文件資料做個整理,井然有序的桌面與工作環境讓你能夠保持心靈的純淨。

51. 列出這一生最讓你驚喜的項目,從最吸引你注意的前兩項,並努力地實現。

52. 別將你的快樂、幸福、自我價值建立在某種關係的角色,或是交由他人決定。先找出你最重視的價值,然後你的人際關係跟自信就自然而然的大幅增進。

53. 你的能力足以克任何弱點。人人都有弱點,但除非你允許,沒有人可以傷害你。

54. 將你人生中最重要的事延遲越久,越會讓你精疲力盡,也會讓你以為越來越難完成,趕緊處理並解放心裡的禁錮。

55. 讓你生命中最輝煌的時期、主軸、熱情、模式是什麼?如果發現失落了哪些部份,就該是改變價值觀回到輝煌時期的時候了。

56. 身體健康狀況很重要,因為當你的心靈跟身體無法同步改善時,當中的斷層會讓你無法維持自信。如果需要的話就該鍛鍊自己的身材,確保你的體態也能為自己帶來自信。

57. 自信是一件持續的過程,並沒有完結的終點。自信不是某項目標或終點可以讓你到達後就停止。持續全力以赴展示自己能力,你的自信就會適時的讓你更上一層樓。

58. 嘗試新的路逕、領域。過去已熟悉的平鋪之路會讓你暮氣沉沉,失去自信,挑戰新事物會激起更多自信。

59. 別因為怕麻煩就一味的答應別人的要求。你可以有禮貌的拒絕無理的要求,告之以理,也無需編造理由塘塞。

60. 觀察你尊重的,有自信的人,不要只是模仿他們,而是要去辨識出他們的言行跟你或一般沒自信的人有什麼差異,可以從中學到什麼?

61. 做事要預做規劃,從容不迫的順勢完成工作。觀察事情進展可以反饋給你的自信。

62. 當警覺陷入對自己的疑惑與恐懼時,轉移注意力到外界你可以銜接並進行互動的事物。

63. 失敗或搞砸事情時仍會自責嗎?雖然很難開懷面對,但自責絕對沒有用。要認知任何事情或好或壞,全繫於你是否實際的付出全力活出精彩的生活。

相關連結:

63 Ways to Build Self-Confidence
63 種建立自信心的方式

2010年7月29日 星期四

自製鹽酥雞


周末經過市區看到繼光街香香雞,買一份大的解解饞,ssh看到也搶著吃,我看他一塊接一塊,一下子100元的鹽酥雞就吃光了。想起我曾在這個部落格,carol自在生活,看過如何做鹽酥雞,於是自己動手做做看。

為了要炸鹽酥雞,我特地去買純葡萄仔油,因為炸物用油要找冒煙點高的,家裡的橄欖油不適合。整個食譜我都照carol部落格上來做,除了醃料我沒放米酒,因為我怕ssh吃了含酒的炸雞會太興奮睡不著覺。

第一次炸雞手忙腳亂,整個廚房搞得都是地瓜粉,瀝油盤又來不及買,先用電鍋用的蒸盤放在盤子上代替,只是我炸的過久,炸雞顏色不像繼光街香香雞那麼金黃,吃起來過硬。有了經驗後,我第二次再作時就縮短時間,果然炸雞比第一次好吃些,只是色澤還是達不到完美金黃色。

2010年7月1日 星期四

Flash 會繼續存活

YouTube API Blog: Flash and the HTML5 <video> tag

雖然蘋果電腦的 Steve Jobs 演講功力了得,可以說服信眾,但 Google 工程師 John Harding 在 Youtube API Blog 提出說明 HTML5 不錯,但仍無法滿足所有使用者需求,Flash 會繼續存活。

Youtube 的 html5 網頁中用到的影片。

影片編碼問題:

目前 Flash player 跟其他手機平台上都可以支援 Youtube 提供的 H.264 編碼影片。但是專利與授權問題導致某些瀏灠器無法支援 H.264,也因 HTML5 的標準中無法納入支援某些檔案格式的規範。Google 需要力推開放標準的 WebM 縮減 Youtube 使用的檔案編碼種類,裡面使用的編碼就是 Google 先前釋出的 VP8 codec,Adobe Flash player 也將會支援 VP8 codec。

檔案串流播放問題:
HTML5 中並未規定到檔案播放的緩衝存取與動態傳輸品質控管,而 Flash Player 中已可透過 ActionScript 控制透過 HTTP 或 RTMP 串流協定解決這個問題。而這類協定至今無統一的標準。

內容保護問題:
Flash 平台已經有 RTMPE 協定可以讓使用者在得到授權狀況下才可以播放影片內容。

封裝與內嵌功能:
Youtube 能夠內嵌影片到其他網站上,也可以允許 Google 封裝字幕、評比、廣告到影片中,目前大多數網站只允許透過 Flash 內嵌檔案,而 HTML5 的沙盒封裝與訊息傳遞仍未被廣泛使用。

全螢幕播放問題:
Flash 已經可以放大全螢幕播放,並支援硬體加速功能,而單靠瀏灠器時因 Javascript 受限,常無法使用瀏灠器的全螢幕功能。

相機與麥克風問題:
目前只有 Flash 可以支援直接從 WebCam 錄影上傳到 youtube, 撇開網頁不談相機也是許多手機軟體、視訊通話、視訊會議的必備功能。HTML5 才剛開始制定標準,但 Flash 早已有運行多年的完整解決方案。

相對來說 HTML5 雖然可以提供大多數影像播放功能,但只有 Flash 才有辦法提供 Youtube 播影片的完整功能。

2010年6月22日 星期二

彰化一日遊-吳晟書屋

五月中旬看到公視播出有關吳晟書屋的新聞後,就一直計畫前往。鄉土詩人吳晟在彰化溪州自家老宅前蓋了一棟新宅院,專門給書住。看到公視新聞時,sj很興奮地說,學生時代國文課有讀過吳晟老師的詩作「甜蜜的負荷」,很想找時間去這棟書屋看看,在吳晟blog上查到確切地址後便立即規劃彰化行程。

離開埤頭鄉-「稻米博物館」後,照著在地人指示路線走,轉往溪州鄉-「吳晟書屋」。從埤頭鄉到溪州鄉很近,我們沿路欣賞稻田,快到目的地時居然轉錯彎迷路了。都市人在鄉下迷路真的很緊張,很怕開車開到最後沒有路可開,不然就是開進稻田裡。還好路邊有個阿公騎摩托車跟田裡農夫在聊天,我只跟他說我要找吳晟的老家,也沒講住址,他馬上用手比著某個宅院說,那間就是吳晟的家。我一臉茫然,他說的方向有一堆房子,我根本不知道哪間三合院才是我要找的。阿公看我臉上寫著「聽無」兩個字,立刻發揮鄉下人熱情友善的一面,很豪邁地說要騎車在前面帶路,就這樣我們開車跟著好心在地人後面走,一下子就找到目的地了。

看到跟電視上一樣的書屋時,終於放下心中大石頭,我們找到了。當天有四、五部車停在三合院前,我心想今天來看書屋的人真多。奇怪的是,怎麼書屋裡沒半個人? 我問sj到底可不可以進去裡面參觀? 他說新聞上報導歡迎愛書人共襄盛舉,所以應該可以進去吧?!我看書屋沒上鎖,就大膽地走進瞧瞧。

書屋比我想像要大很多,感覺有三層樓高,屋子裡藏書豐富,經過歸納整理擺設整齊,看得出吳晟老師的用心,這些書都是無價之寶,ssh在書屋裡興奮地跑跳,我得小心他不要在這裡發揮撕書的功力。參觀書屋後準備離開時,三合院主人出現了,是吳晟老師的太太。我向師母說明我們的來意後才知道,原來書屋不是給像我們這種觀光客參觀的。一開始看到三合院前停了好幾部車也不是遊客的車。師母說,那些車都是他們自家人的車,兒子媳婦孫子全家大小都在三合院裡睡午覺。我聽完後開始緊張,這麼說來,我們是私闖民宅。新聞上的報導原意應該不是邀請大家去書屋參觀。我們大剌剌地把車開進別人家,又走進去逛了一圈,真是白目極了。鄉下地方有些人家是門戶不上鎖的,但不上鎖不代表你可以進去。搞清楚真相後,趕緊跟師母道歉,表明我們沒有歹念,不是小偷,只是把事情想的太簡單的都市傻子。

正連忙表示道歉之意時,吳晟老師也從三合院走了出來,他請我們到書屋泡茶聊聊天,過程中,他看到ssh很怕踩到樹葉,就跟我們聊到「標籤理論」。如果你在孩子面前一直說他很怕樹葉,或是說他就是不愛讀書.....等等話語,這就是給孩子貼上標籤,這樣孩子就會漸向大人貼的負面標籤發展,相反地,若是我們以正面鼓勵方式,常對孩子說,你好棒,肯定孩子的學習熱情與信心,孩子自然會充滿更多正面能量,滋養他在人生過程中面對各種挑戰的勇氣、耐心與毅力。

此外老師也提到對於母語保存的重要性,提醒我們在家裡多說母語,讓小孩從小在多語環境中成長,可以增強對於母語文化的保存。對於上幼稚園前是否自己帶小孩或是交給保姆帶?老師也偏好我們能夠在孩子上學前,多培養親子感情,給孩子更健全的兒時身心發展。

實際與在學時課文作者聊天談心的經驗,讓人感覺補滿了生命中原本缺少的某一塊,很高興有這個機會與吳晟老師一家人談天。

2010年6月21日 星期一

彰化一日遊-中興穀堡

終於等到週末好天氣,驅車前往彰化,此行有二個參訪目標,一是埤頭鄉「中興穀堡」,二是溪州鄉「吳晟書屋」。

中興穀堡位於彰化縣埤頭鄉,2010年1月中旬正式營運,是一座由民間企業成立的稻米博物館,歐式風格的城堡建築就蓋在稻米工廠內。進入博物館搭電梯從二樓開始參觀,二樓展區規劃完善,展示各種稻米農具與製米機具,細說稻米歷史,分辨稻米種類,告訴你哪一種米是由哪位農夫種植,什麼米能夠為國爭光外銷到日本去,從二樓窗戶往下看就是米倉現場作業,館方也提供各種米食DIY課程,只要預約就可以自己動手碾米、爆米香、做三角飯糰或客家麻糬,凡是跟米有關知識,這裡都學得到。像我這種都市裡的「莊腳俗」,參觀過稻米博物館後才懂得何謂「粒粒皆辛苦」。

一樓是販賣各種與米相關的商品,個人覺得米漿口味冰淇淋不錯吃,一隻40元,純米冰淇淋則不推薦,沒有米的味道,很像香草冰淇淋。糙米米麩跟米製牛軋糖是我覺得值得買的伴手禮,牛軋糖現場可以試吃,不仿吃過後再決定是否購買,我看SSH連吃兩塊,原來米製牛軋糖質地偏軟,小朋友也咬得動,才決定買回家解解饞。

耳熟能詳的「有點黏又不會太黏」,就是中興米的招牌廣告。聯米企業將事業重心北移至樹林,並成功行銷品牌「中興米」後,又回鄉彰化埤頭設廠,以濁水溪流域的優良稻米為原料,用心經營台灣傳統米文化,也逐步邁向年營業額高達20億的米食王國。

離開前,詢問館方人員如何前往溪州,在地人指引一條直達路線,不需再從北斗交流道上國道,因為埤頭鄉與溪州鄉相鄰,中興穀堡大門前那條路往左直直開就到溪州鄉。館員還教我們,北斗其實應該唸成「寶斗」,如果你念「北斗」,人家就知道你是外地來的,買東西會買貴。這種只有在地人才懂得知識,我們很幸運地學到了。


博物館入口處


二層高歐式城堡建築


自費體驗各種米食DIY,採預約制


員工辦公室


拍張照留念


一樓戶外庭園


買支米漿冰淇淋坐在這裡樂活一下


一樓庭園出口








園區處處都是可愛裝飾

2010年6月10日 星期四

別當自作聰明的程式設計師(我認錯)

Bruce Sterling 轉貼了一篇標題為 Mea Culpa (我認錯) 的程式設計師反省文。並重新定標題為別當自作聰明的程式設計師。原作者是從 1969 年就開始進入程式設計領域,已有超過四十年程式設計經驗的 Jonathan Edwards。Bruce Sterling 認為文中的反省並不只是作為單一程式設計師的反省文,而是整個軟體產業需要一起面對的共業。

摘譯如下:

程式設計因為需要高度的分析能力,常常讓我們陷入一個誤區,為了提高程式設計能力,而不斷讓優秀的程式設計師擁有強大的優越感,自認為高人很多等,特別是相對於平庸的程式設計師,我們都希望盡情炫耀自己的聰明才智,得到同儕的仰慕眼光。但在之後的大半輩子裡,我痛苦的領悟到程式設計的重點在於態度、而非聰明才智。

現實問題的磨難最容易激發出聰明才智的創意靈感,但結果的表象雖然讓人驚喜於充滿創意的解決方案,實際上卻是後續長期維護災難的開端。一個讓人眼睛一亮的程式設計方式,但卻可能深藏著無數的深層炸彈,在日後一一引爆。

而在日後維護過程中,可能我們又會自我優越的認為,只有我才能解決其他平庸者無法解決的精密設計疏失,比如特製的資料庫系統,多線程(multi-threaded)的作業系統。

後來我把整個系統轉移到新框架上,解決掉讓人困擾了二十年的長期維護工作。這痛苦的領悟與經驗讓我瞭解,程式設計不是當最聰明的人,程式設計告訴我的是軟體是如此的複雜,讓全世界最聰明的菁英都顯得微不足道;不要想單靠一己之力解決所有複雜的問題。程式設計的重點在於簡化與慣例。把這句話倒著刺青到你的額頭上,這樣每次看到螢幕中的你都可以提醒自己這項原則。其中最重要的是態度:努力工作、負責任、專注在實際問題,而非未經驗證的猜測。

程式設計其實跟其他的工程與設計不盡相同。其中的主流文化常常陷在前面說的自我感覺良好誤區。就像是格列佛遊記般,只是多了大括號,中括號,縮排位置,要不要加小括號等議題。我們唯一同意的是其他程式設計師有多愚蠢,但我們應該自己試著 Google 一下"愚蠢的程式設計師",就會看到自己也名列其中。

程式設計技術的提升仰賴於文化的提升,我們能做的就是在自己的工作中耐心、持續的付出、分享交流我們學習到的經驗與心得。

參考文獻:

  1. Programmers should stop being such smart-alecks
  2. Mea Culpa

2010年6月6日 星期日

OpenBSD 開發與版本控管流程

要如何做才能真正在每次版本發行時,能夠不再因為重大軟體瑕疵
而延遲、改變時程?

OpenBSD 的開發流程,告訴我們的是開發流程與軟體品質的密切關
係,OpenBSD 團隊如何克服開發、測試時人性懶惰的弱點?以及他
們考量哪些重點?做了什麼?80 位開發成員如何互動來確保軟體品
質。

首先是對發行版本這項工程的定義:用科學方法設計、開發結構、
機械、裝置或製造過程;不論是處理個別單一項工作,或是整合成
一體的工作;也是對於建構、操作有完整認知的過程;在特定控制
變因內預測行為;所有針對特定功能、經濟運作、保全生命財產安
全等都算是工程的定義。

一般商業公司有足夠的人力、資金、時間可以同時有開發、測試團
隊一起運作,但是開放源碼軟體在這種執行模式下會有問題...發行
的軟體版本通常是未經完整測試的產品,需要持續修正。

發行版本的理想程序是:全部程式碼都經過測試、經過最多人測試
、最短的測試時間、最少的痛苦除錯...當然實際上我們只能取到折
衷方案。

完美的發行理想程序可以帶給我們:沒有重大錯誤造成使用者退回
上一版、大部份的新開發功能都可正常使用、開發者開心、使用者
歡喜、可以在發行版本後快速回到功能開發。

但實際上常是發行版本後,進入維護版本的除錯無間地獄...

最常見的流程就是:開發 --> 準備發行版本放慢開發腳步 -->
Tag/branch release tree --> Test & Fix --> Product N
通常是在 branch 之後交由發行版本的團隊進行 build/test,然後發
現錯誤需要 bug fix merge 回 trunk,或需要由 trunk merge 到發
行的 branch,就一直循環....直到真正修完錯誤,或是大家都精疲力
盡,結果通常是:好吧,只能出這版了!

其中的問題點在於:
一、只有少數人在測試
二、開發者在要發行版本的 branch 除錯修改程式
三、發行後的重點變成維護產品 branch
四、流程容易拖延
五、許多開發者陣亡(指對這個產品的心靈已死)

OpenBSD 進入 Tag/branch 之前的開發流程:

減慢開發速度,進行回歸測試-->鎖定 API/ABI 不再變更-->
早期套件 build test -->鎖定 tree(需經認可後才能再更動)-->
開發者執行測試工作-->Tag/Branch-->解除鎖定-->修改細項-->
正常開發步調-->重大更新-->六月個的開發週期-->減慢開發速度

1.
其中的發行版本修改,都只需要做到微調的動作。並且我們會使
用自己的產品來進行開發(Eat our own dog food)。

2.
鎖定 API/ABI 的原因:此時上層軟體套件才可以編譯,並可同時
發現影響版本發行的重大議題。每天都會編譯程式碼。Daily snapshot.
在編譯軟體套件時發現的回歸測試錯誤,在此時就已經開始修正。
修正完畢後才進行 tag/branch, 接著 unlock 後就可以回到 mainline
持續開發。

3.
鎖定的動作是不預警的,因為人們容易忽略行事曆中的例行事項,
針對測試週期的結果,降低過多錯誤的開發者修改程式的權利。

4.
所有工程師都會參與發行版本時的每一步流程。這可以避免短缺的
測試人力。

5.
作者也承認是因為 OpenBSD 的管理作風比較接近獨裁(theo),因
此其他開放源碼專案可能無法直接套用這個方法,但是對於軟體開
發公司就相當有用了。

相關連結:

The OpenBSD release process, A success story

2010年6月4日 星期五

Ylian Saint-hilaire 在 Intel 的成功方程式

Ylian Saint-hilaire 在 Intel 創新未來部門決定哪些事情該做,又該
放下哪些工作的判斷方法上,提出了一套方程式。當然他也謙稱許
多教導人們成功的書籍都提出類似的方程式,而這只是個粗略的概
念,如果讀者想要套用數據進去,請自行負責判斷後果 :P

主要判斷的依據是看產出的智慧價值扣除花費的心力後,還有多少
價值的觀念為出發點:

智慧價值 - 花費的心力 = 創意 X 市場優勢 X 通路 X 商業利益

其中又把市場優勢細分為:

市場優勢 = 平台優勢 + 技術優勢 + 地位(品牌)優勢

商業利益的判斷也可以細分為:

商業利益 = 平台軟體服務 + 直接收入 + 產品附加價值

依此再配合個人或公司的情況代入數據後,也許下次做判斷,你
可以有更客觀的數據佐證,而非每每猶疑不定,決定了又怕後悔。

相關連結:

Intel Software Network Blogs: My formula for success by Ylian Saint-hilaire

2010年6月1日 星期二

巨無霸小黃瓜

老爸時常拿他用心栽培的蔬菜水果跟我細說園藝的樂趣。我是有聽沒有懂,因為不管是種花種草,還是種蔬菜種水果,我都沒有興趣,我討厭泥土裡的小蟲,任何活的植物到我手裡也一定變枯木。
熱愛種植的老爸,把陽台種滿蔬菜水果,最近,老爸細心呵護,為避免光害蟲害還特別套上紙袋的小黃瓜也陸續成熟。我帶ssh體驗如何收成,只是沒想到居然有一條長成這個樣,剛摘下拿給ssh時,他嚇的立刻躲開。這種 king size應該沒人敢吃吧。


跟30*30 cm磁磚格比較


跟光碟片比較


跟原子筆比較


再比一次


拿尺一量......35cm


正常小黃瓜跟巨無霸一比.....甘拜下風

2010年5月29日 星期六

linux USB hid driver cypress_m8.c

參考 USB Device Class Definition for Human Interface Devices(HID)
firmware spec version 1.11,範例 driver 是 USB Cypress M8 driver
~linux/drivers/usb/serial/cypress_m8.c,source code 中說有
文件就在 ~linux/Documentation/usb/usb-serial.txt。

主要是看 DeLorme Earthmate USB 的 usb hid 如何設定,她使用的
是 feature report 的方式,在 control pipe 傳送 5 bytes 資料。
對應到 USB HID spec 的 7.2 Class-specific Requests 裡面的 7.2.1
Get_Report Request 跟 7.2.2 Set_Report Request,透過 control
pipe 傳送 host <-> device 資料。

呼叫 usb_control_msg(),定義在 USB core 的實作中
~linux/drivers/usb/core/message.c:


/**
* usb_control_msg - Builds a control urb, sends it off and waits for completion
* @dev: pointer to the usb device to send the message to
* @pipe: endpoint "pipe" to send the message to
* @request: USB message request value
* @requesttype: USB message request type value
* @value: USB message value
* @index: USB message index value
* @data: pointer to the data to send
* @size: length in bytes of the data to send
* @timeout: time in msecs to wait for the message to complete before timing
* out (if 0 the wait is forever)
*
* Context: !in_interrupt ()
*
...
*/
int usb_control_msg(struct usb_device *dev, unsigned int pipe, __u8 request,
__u8 requesttype, __u16 value, __u16 index, void *data,
__u16 size, int timeout)



有兩種用法,差異在於傳輸方向,是以 host 為主體而有 in/out, set/get 不同。
一個是 host 傳到 device(out/set),另一個是 device 到 host(in/get)。

host->device 是 USB_DIR_OUT,使用 HID_REQ_SET_REPORT request
建立 send endpoint pipe 是用 usb_sndctrlpipe()

device->host 是 USB_DIR_IN,使用 HID_REQ_GET_REPORT request
建立 receive endpoint pipe 是用 usb_rcvctrlpipe()


retval = usb_control_msg(port->serial->dev,
usb_sndctrlpipe(port->serial->dev, 0),
HID_REQ_SET_REPORT,
USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
0x0300, 0, feature_buffer,
feature_len, 500);

retval = usb_control_msg(port->serial->dev,
usb_rcvctrlpipe(port->serial->dev, 0),
HID_REQ_GET_REPORT,
USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,
0x0300, 0, feature_buffer,
feature_len, 500);


第一個參數就是 struct usb_device *dev,probe 時就可以取到
第二個是利用 MACRO 從 usb device 找到 usb device 的 endpoint pipe
第三個參數是 message request value,HID_REQ_SET_REPORT 或
HID_REQ_GET_REPORT
第四個是 message request type value,
USB_DIR_OUT | USB_RECIP_INTERFACE | USB_TYPE_CLASS, 或
USB_DIR_IN | USB_RECIP_INTERFACE | USB_TYPE_CLASS,

第五個參數是 message value 看 device hard code: 0x0300
第六個參數是 message index value hard code: 0

因為採用的是 feature report 的方式傳送 5 bytes 資料存在
第七個參數 feature_buffer 中,
第八個參數是 feature_len 是資料長度。
第九個參數是 500 micro seconds 的 timeout。

相關文章:

TI OMAP3 DM3730 USB host controller high full low speed?



相關連結:

http://www.usb.org/developers/devclass_docs/HID1_11.pdf

~linux/drivers/usb/serial/cypress_m8.c

~linux/drivers/usb/core/message.c

2010年5月28日 星期五

linux kernel read_proc() in procfs

在 ~linux/fs/proc/generic.c 中找 __proc_file_read() 的實作可以看到相關說明:
/*
* How to be a proc read function
* ------------------------------
* Prototype:
* int f(char *buffer, char **start, off_t offset,
* int count, int *peof, void *dat)
*
* Assume that the buffer is "count" bytes in size.
*
裡面有三種讀 read_proc 的方式說明,底下就是說明的程式碼,
也可以搜尋其他 driver使用 read_proc 的範例。
比如 ~linux/drivers/char/efirtc.c。
*/
n = dp->read_proc(page, &start, *ppos,
count, &eof, dp->data);
...
這邊是當 kernel 讀取 proc 檔呼叫 driver read_proc callback 的地方,也就是用法。因此可以倒推回去我們的 callback function 如何實作:

第一種是 driver 要回傳的資料量小於 read_proc 中的 buffer size(PAGE_SIZE)。
此時不管 *start,將 driver 要傳給 filesystem 的資料擺在 buffer 的 offset 位置,我們只看 offset 跟上次 callback 讀到的 buffer size, n 的差值,在接到的 offset 跟剩餘要傳的 n 差值(n - offset) 為零時,告知 filesystem 我們的 driver 已經傳完資料,才設定 *peof = 1; 否則繼續 callback。

第二種是當你有大量資料要傳輸時使用。
將 *start 設定為介於 buffer 跟零 之間的值,資料是從 buffer 起始位址開始填,return 每次要填的資料長度,如果你的資料還沒填完,第二次進入 read_proc 時 offset 值會增加 *start 的長度,直到你填完資料後再設定 *peof = 1; 就可以完成傳輸大量資料了。

第三種跟第一種一樣,只是把 offset 代換成 *start

參考文獻:
  1. procfs-guide.pdf 3.1 Reading data
  2. linux kernel source: ~linux/fs/proc/generic.c, ~linux/drivers/char/efirtc.c
  3. Linux Modules (3) - procfs

2010年5月27日 星期四

Google 的十項工作哲學

據說 Google 在面對未來的展望時,會以下列十項原則做為行動基準,摘譯如下。

我們奉為真理的十項行動準則:
一、 專注在使用者經驗上,接下來該做的事情自然清楚明白
二、最好是聚焦在一件事情上,然後做到最、最、最好
三、快比慢好,當有技術突破時,我們的搜尋速度每每創新紀錄。
四、民主機制在網路上行得通
五、不一定要在辦公桌才能得到答案,這是行動計算的時代。
六、不一定要黑心才能賺錢
七、永遠有更多的資訊供你去發現
八、對於資訊的渴求沒有 國界 之分
九、不一定要穿西裝才能認真。成功不是因為表面功夫做得好,強調團隊成果與個人成就感、自尊心才是重點。
十、 偉大仍不夠好。把某件事情做得偉大隻是起點,而非終點。我們總是設定超出目前能力範圍的工作目標,如此我們才能讓自己永續成長茁壯。

參考文獻:

boot code, bootloader, and Linux Kernel entry points

菠蘿麵包整理了 Android 開機流程 boot sequence
給個 boot rom, bootloader, Linux kernel, Android Init, Zygote, Dalvik,, System Server, 最後發出
ACTION_BOOT_COMPLETED 的 braodcast intent 觸發需要知道開機啟動的服務,其中從
硬體到使用者接觸到的應用程式的完整流程。

我們關注的是前面這段觀念:
硬體平台上的 boot ROM 儲存了 boot code,boot rom 本身也是在記憶體上執行,arm cpu
藉由 reset 0x0000, 0000 由 chip select 線路連結的開機媒介決定到哪一種 storage (Nor flash,
 Nand flash) 去讀取 boot loader。 將 boot loader 載入到實體記憶體後開始執行 boot loader ...

booting sequence documentation 則提到在 bootloader 到 linux kernel 端的開機介面
與流程:

ARM Linux kernel 對 bootloader 所需要的,就是藉由 bootloader 將 Linux kernel 從
storage 讀出載入到記憶體,設定某些暫存器,並呼叫 Linux kernel entry point,此
時還不需要啟動 MMU。

 Linux kernel 的 zImage 壓縮檔,就必須要跳到 arch/arm/boot/compressed/head.S
會使用  arch/arm/boot/compressed/misc.c (抄自 gzip 的某些函式介面) 裡面的
decompress_kernel() 其中會呼叫 arch_decomp_setup() 設定 debug FF/ST uart port,
或特殊的 Chip Select memory mapping,接著在開機印出 "Uncompressing Linux..."
字串後進行解壓縮。

ARM Linux boot sequence

另外關於 arm linux 的開機流程也有人寫了程式碼分析文:
ARM Linux boot sequence

zImage 解壓縮階段:
從跟 boot loader 串接,關閉 cpu cache, MMU, 設定 stack, kernel entry point 在實體
記憶體位置,設定 cpu 型號辨識,啟用 cpu cache, MMU, 設定 MMU page table
將 kernel zImage 解壓縮並載入到 RAM,進入 kernel start...

ARM 相關的 kernel code:
查詢 cpu 型號,啟用多核心支援,查詢(主機)板子的 machine 型號,MACHINE_DESC
macro 的定義。建立 MMU 的 page table,enable MMU,初始化 cache, write buffer。
繼續 enable MMU,設定 page table pointer (TTB),找到 page table 起始點,切換
MMU 進入 virtual address space, 回到已經過 mmap 過的 switch data。

複製 data segment 到 RAM
清空 BSS(寫零)
跳到 start_kernel 開始執行 Linux kernel 開機程序。也就是接 Intel 文件中的 C 程式碼
起始點。 

Linux kernel entry points

Intel 的 device driver debugging 可以找到幾個 Linux kernel source entry point。

開發新平台(OS Adaptation, OS bring up, customize core components)
其中一項重要的工作就是寫驅動程式,有些多媒體編解碼的最佳化,
也是在驅動程式端實作。

一些有用的 kernel 資訊如:active kernel threads, loaded kernel modules

x86 開機流程中 BIOS->OS boot loader --start_kernel()-->OS

sched_init() 是 scheduler initialization

mwait_idle() 是 OS 主要的迴圈(就像 micro controller 的 main loop)


相關連結:

Device Driver Debugging on Intel Atom processor based devices (pdf)

2010年5月24日 星期一

電影:超速先生

週末尾聲全家看著 MOD 的電影,超速先生,轉到時已經開播不知多久,但因為是安東尼霍普金斯主演,才繼續看下去。結局也不出所望的是部好電影,並且是根據真人真事改編而成的電影。

要說劇中主角的人生觀,可以套用安東尼霍普金斯在幕後花絮的一句話代表:現在的我可以掌控自己的人生,並且是一個非常快樂的人。

在完全無預期下看完本片,只能用驚奇連連來形容本片的劇情鋪設,每每以為伯特蒙羅即將因為某些挫折、困難而打道回府,但都在他的堅持、毅力,與樂觀不懈的態度、實際嘗試後迎刃而解,也因為他不斷的累積並一步一步改進自己的愛車,而在年屆 68 歲,騎著 47 年車齡的 Indian 達到世界最速車的紀錄頭銜,他在 1967 年創下的 1000cc 最速紀錄至今無人能破。

伯特蒙羅在家鄉期間,花了 20 年針對在 1920 年買的 Indian 重機進行改裝提升性能,1938 年起就陸續在紐西蘭創下八項紀錄,並在後續遠渡重洋到 Bonneville Salt Flats 位在美國猶它州的波尼維鹽原創下世界紀錄。他在鹽原十次參賽中,總共創下三項紀錄,其中的 1000cc 最速紀錄仍然高掛在榜首位置。

參考文獻:
  1. 超速先生 電影中文網站
  2. Burt Munro 維基百科

2010年5月8日 星期六

cross compile Android native C code

當需要建立一些指令列工具,需要自行 build code 在 Android
command line 上執行,或供應用程式透過 JNI 呼叫的函式庫時,
需要 cross compile android native C program

1. agcc, 一個幫你搞定 cross compile 所需複雜參數的 perl script,依照
Compiling for Android wiki 上的步驟,應該就可以成功

2. 如果幸運的話,你可以不用往下看,不然就繼續吧,假如 agcc
不能達要你的需求,網路上也有神人已經寫了 Makefile 再加上 1. 裡
面的其他設定設好,以及你所使用平台的 C runtime library,在
~android/bionic/libc/arch-arm/bionic 底下 copy crtbegin_dynamic.S,
crtend.S 到你的 utility source 目錄,一起 link 就可以從正確的 entry symbol
__start 執行。否則直接拿 x86 cross compile 給 arm 平台的程式時
會有類似以下的警告訊息:

warning: cannot find entry symbol _start; defaulting to 000082c8

3. add scripts to ease rebuild native C code and installation,要將 utility
包 到 system.img 時需要先移除 ~android/out/target/product/arm/system.img
再將新加的 utility 放到 ~android/out/target/product/arm/system/bin
重新 build android,因為前面已經將其他 object files build 完,所以只剩下
archive system.img 的工作。

因此再借用神人的 my_command_line utility Makefile 改成如下:


# ripped from http://forum.xda-developers.com/archive/index.php/t-623976.html
AR = arm-eabi-ar
AS = arm-eabi-as
CC = arm-eabi-gcc
CXX = arm-eabi-c++
LD = arm-eabi-ld

ANDROID_SOURCE_ROOT = /path/to/your/androidsource
NDK_KIT = $(ANDROID_SOURCE_ROOT)/ndk/
PLATF_KIT = build/platforms/android-4

ARM_INC = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/include
ARM_LIB = $(NDK_KIT)/$(PLATF_KIT)/arch-arm/usr/lib

PLATF_INC = $(NDK_KIT)/$(PLATF_KIT)/common/include

OUT_DIR = $(ANDROID_SOURCE_ROOT)/out/target/product/arm
OUT_SYSTEM_BIN = $(OUT_DIR)/system/bin/
ALL_SYSTEM_IMG = $(OUT_DIR)/system.img $(OUT_DIR)/obj/PACKAGING/systemimage_unopt_intermediates/system.img

PROJECT = my_command_line
SRCS = $(PROJECT).c util.c
OBJS = $(PROJECT).o util.o crtbegin_dynamic.o crtend.o
EXES = $(PROJECT)

all: $(EXES)
file $(EXES)

install: $(EXES)
cp -afv my_command_line $(OUT_SYSTEM_BIN)
cd ../; rm -fv $(ALL_SYSTEM_IMG)
@echo "Please re-run build_android.sh to rebuild system.img"

$(EXES): $(OBJS)
$(LD) \
--entry=_start \
--dynamic-linker /system/bin/linker -nostdlib \
-rpath /system/lib -rpath $(ARM_LIB) \
-L $(ARM_LIB) -lc $(OBJS) -o $(EXES)

$(OBJS): $(SRCS)
$(CC) -I $(ARM_INC) -I $(PLATF_INC) -c $(SRCS)
$(CC) -mthumb-interwork -o crtbegin_dynamic.o -c crtbegin_dynamic.S
$(CC) -mthumb-interwork -o crtend.o -c crtend.S
#crtbegin_dynamic.S and crtend.S copy from bionic/libc/arch-arm/bionic

clean:
rm -f $(OBJS) $(EXES)


另外寫程式要注意的是 ~android/bionic/libc/README 提到跟 standard C
library 差異處與特性:
- no support for locales
- no support for wide chars (i.e. multi-byte characters)
- its own smallish implementation of pthreads based on Linux futexes
- support for x86, ARM and ARM thumb CPU instruction sets and kernel interfaces

4. Thinker 發表的 Android Build System 分析一文相當值得細讀,善用
Android makefile 的 build system 可以省掉去瞭解這些編譯的細節。

5. Android Source Code 中的 NDK 也詳細介紹了使用 Android Java VM
的 JNI 介面與實作 shared library 的建議,在
~android/ndk/docs/OVERVIEW.TXT 中有說明,Google 一下也可以找到
中文翻譯資料,我就不翻了。 :P

結論是網路上神人很多,Google 搜尋跟這些神人也很熟。:P

相關連結:

Android 原生(Native) C 開發之八: Toolchain 環境搭建篇

從 gpio & I2C 硬體線路對應到檔案讀寫

0. 硬體電路的 schema
找到電路圖上的 gpio, i2c 線路圖上的 block 是接到 datasheet 上哪一個 slot

1. datasheet 中的 gpio chapter
針對 gpio controller 的 register 值依照 in/out, pull up/down, data 值設定

2. board initial entry point,比如 Samsung s3c6410
~linux/arch/arm/mach-s3c64xx/mach-smdk6410.c
MACHINE_START macro 定義 board information
可以看到註冊的 .init_machine 進入點 function 是 smdk6410_machine_init

Qualcomm 的 arm board initial 檔案則是在
~linux/arch/arm/mach-msm/board-msm7x27.c
定義了 QCT MSM7x2x (7225)
~linux/arch/arm/mach-msm/board-msm7x30.c
定義了 QCT MSM7x30
~linux/arch/arm/mach-msm/board-qsd8x50.c
定義了 QCT QSD8X50 (8250)

3. i2c
關於 i2c 參考 Documentation/i2c/instantiating-devices,可以看到 mach-smdk6410.c 定義兩個 i2c slot 0, 1 為 struct i2c_board_info,裡面定義這個 bus 上接的 i2c slave device(s) 名稱與 slave address 資訊,透過 S3C_EINT 對應到外部中斷 12,然後在 smdk6410_machine_init():

i2c_register_board_info(0, i2c_devs0, ARRAY_SIZE(i2c_devs0));
i2c_register_board_info(1, i2c_devs1, ARRAY_SIZE(i2c_devs1));

註冊兩個 i2c bus,0 跟 1。接下來 i2c device 的具體化由 i2c core 完成。

kernel driver 可以在 ~linux/drivers/i2c 目錄找到,可以使用 i2c-dev,直接 sudo modprobe -a i2c-dev,就可以在 /dev/i2c-0 存取 i2c bus。

參考 ~linux/Documentation/i2c/dev-interface 可以針對 /dev/i2c-0[1] 的 device file 使用 user space driver 的 ioctl 控制 i2c 設定與傳輸。

最簡單的動作是 ioctl(file, I2C_SLAVE, addr),就直接對 file read(), write() 就可以讀寫 i2c device 資料。

4. gpio
關於取得需要使用的 gpio 方式如下:

gpio_request(S3C64XX_GPN(5), "LCD power");
gpio_request(S3C64XX_GPF(13), "LCD power");
gpio_request(S3C64XX_GPF(15), "LCD power");

這是指取用 GPN pin 5 跟 GPF pin 13, pin 15 操作 LCD power

~linux/Documentation/gpio.txt 可以用 /sys/class/gpio/ 底下針對 gpiochip (controller) 或是 gpioXX (pin) 進行 user driver 的控制 in/out, high/low, trigger mode /sys/class/gpio/gpiochip0/ 中的 label 可以對應到 datasheet 的 controller 名稱,參考 arch/arm/mach-s3c64xx/include/mach/gpio.h 可以找到 S3C64XX_GPA, S3C64XX_GPB 等 gpio controller

S3C64XX_GPIO_A_NR (8) 定義 Bank A 有 8 根 gpio 腳位,依此類推對於 /sys/class/gpio/gpioXX/value read/write 就可以讀取 gpio 腳位high/low 或設定 high/low


2010年5月7日 星期五

Keil C C51 語法

1. 加上記憶體型態的變數宣告順序:

變數型態 記憶體型態 變數名稱;

變數型態指一般 C 語言的 int, char 等

記憶體型態指 code, data, bdata, xdata, pdata 等六種記憶體位置
,各型態記憶體位置,以 Silicon Labs C8051F320/1 為例:

內部記憶體:
0x00~0xFF 都可使用間接定址存取資料的 data 記憶體

data 記憶體內:
0x00 ~ 0x1F 是一般暫存器 0x20~0x2F 給 bit/bytes 直接定址 bdata
0x30~0x7F 是直接定址記憶體
0x80~0xFF 是給 sfr(special function register) 只能間接定址 Stack
Pointer 可以是在 data 記憶體內定址的 256 bytes 區塊

外部記憶體:pdata
0x0000~0x03FF 是 1K 的 pdata
0x0400~0x07FF 是 1K 的 USB FIFO

16K Flash 記憶體:xdata, code

0x0000~0x3DFF 是 16K 的 In-System Programmable 記憶體
也是 firmware update 使用區,參考 PSCTL 暫存器的 PSWE、
PSEE 位元保護寫入與讀取的動作。

0x3DFF~0x3E00 是 Security Lock Byte,理論上可以鎖定 64K
bytes 的連續記憶體

Security Lock Byte 可以指定要鎖定的 512 bytes
(page 0 = 0x0000~0x01FF)

鎖定的區塊比未鎖定區塊有較高優先權,可以讀、寫、刪鎖定與未鎖定的記憶體區塊。鎖定是防止透過 C2 interface 讀寫 flash 的燒錄器讀取韌體機密,但無法防止其他介面的讀寫,因此韌體在其他介面溝通時,如果有機密資料需要做加密傳輸。

鎖定區如果要強制讀取會透過電路先將 flash erase 才可以讀寫,可以做到保護鎖定區資料機密性的功能。在鎖定區的 loader,在進行韌體更新時,檢查是否是合法的 firmware,才進行更新,以防止燒錯 firmware,或是被 crack 修改到鎖定區內資料。

檢查是否是合法 firmware 可以用公開金鑰機制防護,在鎖定區內的 loader 存 private key,要燒錄到 flash 上的韌體存 public key。可以做到韌體加密與驗證合法韌體的功能。

0x3E00~0x3FFF 保留未使用

比如宣告

char xdata GPIO1 _at_ 0x100;

表示宣告為型態 char,在 external data memory 位置 0x100 的 GPIO1 變數

2. 宣告 register 與位元

sfr P0 = 0x80; // 宣告 P0 是 special function register,
// Port 0 位址在 0x80,8 bit constant, 位在 IDATA 型態的
// 0x80~0xFF 直接定址區
// 0x00 ~ 0x7F 位在 DATA 型態記憶體的直接定址區

sfr SCON = 0x98;
// 宣告 SCON 為 register,SCON register 值為 0x98

sbit B1 = SCON ^ 0;
//宣告B1 為 SCON sfr 的第0個位元( 1 byte = 0~7 bits)


3. 中斷函式宣告、註冊與定義

timer0_int() interrupt 1
{
// C codes
}


宣告函式名稱 timer0_int(),註冊在中斷 1,中斷 n 的向量(編號)

公式為 (中斷大小*n +3) + 中斷向量基底位址,中斷向量由 C51 compiler 計算。若一般中斷大小為 8,中斷向量基底位址為 0x4000,則宣告 timer0_int() 程式碼放在 code memory 位址 0x400B。

4. 在固定記憶體位置宣告 struct, memory mapped struct

struct MyStruct { char data;};

struct MyStruct xdata *sPtr;
// C51 依 xdata 配置視 sPtr 為指向一個 memory mapped struct

sPtr = (void xdata*) 0x8000;
// 這個 struct pointer map 到 0x8000 實體記憶體
// 類比 standard C lib 的 malloc heap memory


相關連結:

Silicon Labs C8051F320, C8051F321 Datasheet (pdf)

The C51 Primer (pdf)

SDCC small device C compiler Open Source 8051 C compiler

SDCC Open Knowledge Resource Open Source C libraries for 8051

Keil C51 第一家在 8051 平台推出 C compiler 的公司

8051 market in 2008

8051 C Compilers

http://o.keil.com/forum/docs/thread356.asp

2010年5月5日 星期三

2010宜蘭綠色博覽會

趕在這周末宜蘭綠博結束前,我帶著SSH去體驗一下大地之美。原來2010宜蘭綠色博覽會3/27就已開始,我根本不知道有這個活動,要不是老爸看電視得知且提議去走走,我可能就這麼錯過了。

非假日去的好處就是不塞車,門票又有優惠,刷中信卡還可打九折。如果你以為平常日遊客少,那可就大錯特錯。我們去的這一天,人還挺多的,很多幼稚園、小學生都是平常日到綠博來戶外教學。我覺得人多比較有玩的感覺。當天天氣晴空萬里,氣溫飆到33度,簡直熱到炸,才買好門票準備進園,就被烈陽曬得頭昏。

2010宜蘭綠色博覽會位於蘇澳鎮武荖坑風景區,依官網園區展示資訊來看,共九個主題館,若照著順序走,第一個是「水上人家」,以休閒農業傳遞出宜蘭的農村美,入口處有全台最大綠雕水車,園區還有一群鴨子悠遊水間,我這個天兵竟然鵝跟鴨子搞不清楚,大聲地叫SSH過來看鵝,後來聽到身旁小學生說:「怎麼鴨子這麼白?!」,我才知道我鬧了大笑話。本來買一包飼料要餵鴨子,希望把鴨子吸引過來靠近我們,結果SSH一拿到飼料就整袋丟進水裡,一群鴨子全嚇跑了,希望鴨子不要連塑膠袋也吃下去。

才逛完第一館,我們這群大人就熱到懶得走,只有SSH依然熱情不減,不畏酷陽,在大草坪上狂奔,後來看到有遊園車可坐,乾脆花個20元坐車直接殺到最後面,從後面玩回來。遊園車是直接開到最後面,中間的館不停,單程每人20元。但後來發現其實每個主題館之間距離並不遠,用走的當作散步應該還好,只是天氣太熱,我們偷懶不想走罷了。

坐車到最後區,一下車就有二個主題館-「綠色奧林匹克館」與「森活林場」,我都以視線帶過就當作參觀過,因為我們最有興趣的是「夢的迷宮」,這也是我們坐遊園車的主因。因為「夢的迷宮」位在最後區,這座以綠雕及花牆方式設計而成的大型花園迷宮,是將畢卡索的名畫-The Dream《夢》,放大4100倍,用各種花材布置,讓遊客走在花叢裡,也走進畢卡索的想像世界裡。剛開始我們一行人團體行動,後來漸漸走散,我跟著SSH後面走,看他走在迷宮裡,即使遇到叉路,也不加思索地憑直覺選定其中一條走,一下子就走到出口。倒是其他人真的迷失在花園裡,還靠手機聯絡才找到我們。原來畢卡索的抽象藝術,純真的二歲兒才懂。在迷宮前,有一以廢棄貨櫃改置成的觀景台,可讓遊客於平台上,欣賞整幅畫作。我們只在觀景台一樓買便當吃,因為當時不知道爬到最上層可以看整幅畫,以為那只是讓遊客休息吃東西的歇腳處,後來在綠博官網才知道,觀景台是主辦單位的用心,在最上層可以把整個「夢的迷宮」拍下來。

走完「夢的迷宮」,就跟烈陽投降,直接又坐遊園車回去,「開心牧場」與「蒲公英的悠活」就沒去參觀,以為這兩館很遠,其實後來看地圖,就在「夢的迷宮」附近,「開心牧場」是我很想去的其中一館,現場有擠羊乳活動,SSH很愛看動物,沒去成真的很可惜。

坐遊園車回到最前面,前區除了參觀過的「水上人家」,還有「幸福單車館」及「靓水旅域」,單車館展示各種年代單車,充分傳達綠博理念,講求環保,以騎單車代替開汽車。

「靓水旅域」則是以愛護水資源,認識水再生利用為主題。SSH應該是最不懂得水環保的小遊客,他在家超愛玩水,無形中很多水就被浪費掉。在SSH腦裡,水就是用來洗手、洗澡,他也已經會講水這個字,所以他在「靓水旅域」這個館倒是玩得挺愉快,看到水就把手伸進去洗一洗。

回家前去逛逛「綠色市集」,本來想買網友推薦的三星蔥,聽說一大把才80元,可惜沒看到在賣。市集裡有幾攤賣蘭花的,一小盆50元,喜歡園藝的倒是不錯選擇。

整個遊園時間大約2-3小時,看了六個主題館。我覺得有帶小朋友去要4小時才夠,因為總共九個館,我們有三個館沒去-「開心牧場」、「蒲公英的悠活」、「綠野舞台」。2010宜蘭綠博活動只到 5/9母親節,想去要快,母親節當天,媽媽免費喔!


藍天白雲正是遊綠博的好日子


2010宜蘭綠博3/27 ~ 5/9


第一館- 「水上人家」


綠雕水車


園區內處處可見花海


「水上人家」館內大水車


藍天 白雲 綠地


「綠色奧林匹克館」


「夢的迷宮」


「夢的迷宮」靈感來源


SSH努力走出迷宮

2010年4月23日 星期五

在 Facebook 該注意的七件事

1. 密碼的長度要夠長,至少取個八字元,複雜度要夠高,不要使用
依序或是字典可列舉的密碼。

2. 不詳列自己真實生日的年月日

3. Facebook 雖然之前有幾次洩露隱私的政策,但在部份人士抗議後
都有加了相對應可自保的隱私權設定,請花點時間去設定哪些要全
部公開,哪些只有朋友可以看,至於只有自己可以知道的,就不要
寫在網路上了 :-)

4. 不要將可愛的小朋友全名曝露在網路上,如果有好心的叔叔伯伯
阿姨哥哥姐姐幫小朋友可愛照片標上姓名,你可以移除標籤。

5. 不要公開宣告你即將離家遠行。即使忍不住要講也不要說出明確
日期。

6. 不要讓公開搜尋引擎找到你。你可以在隱私設定的部份改掉公開
搜尋,改為只讓朋友搜尋。

7. 不讓未成年子女私下玩臉書,臉書政策上限定未滿 13 歲不能單
獨使用,如果有未滿年限需要有家長監督帳號,隨時瞭解小朋友的
上網使用行為,以免小朋友被拐騙。

Seven Things You Need To Stop Doing On Facebook -- ChannelWeb

2010年4月21日 星期三

開放源碼的新方向(新希望?)

摘譯自 IBM Developers 後來中國好像有翻簡體版的,我就沒翻完了。

開放源碼不再只是硬核技客的專屬品。

摘要:雖然你不是管理階層,但還是需要降低生產成本。身為一個
軟體開發者,或是重量級使用者,或只是一個希望有足夠薪水支撐
生活的員工。這些是向你工作環境導入開放源碼的理想狀況。聽起
來好像是你要花上三個星期學寫程式與 makefile,但並不是這樣。
請你繼續閱讀,開放源碼可以讓你以更有彈性,更實際的方式提升
工作效率。

2010 年的開放源碼議題,不再是跟封閉源碼對立的關係。我們不會
鼓吹你全面使用 GNU 軟體,也不會教你詛咒 adobe 或 apple。

接下來要討論的是開放源碼可以為你解決的部份問題,當你需要解
決這些問題的時候,可以考慮採用開放源碼解決方案。比如你對於
微軟 IE 瀏灠器有意見,想找一個好用的整合開發環境(IDE),不想
付錢買 Photoshop,或只是想要有更快速回應的技術支援,我們都
建議你嘗試開放源碼軟體。

比較實際的做法通常是混搭的解決方案。如果你並不認同開放源碼
的哲學層次,而表示你是比較務實的解決自己面對的問題。你所使
用的大部份軟體可能都是封閉源碼的,有些是商業軟體,有些可能
是只有執行檔案的免費軟體,同時使用開放源碼跟封閉源碼並沒有
任何道德上的缺陷,也不需要有。

事實上混用開放源碼跟封閉源碼才是最佳的解決方案。比如使用微
軟視窗作業系統,但不使用 IE 而是採用開放源碼的 Firefox 瀏灠器
。開放源碼跟封閉源碼兩者並非水火不容。

你也可以隨意選擇要用多少開放源碼與封閉源碼軟體。你可能只會
用到 Firefox 單一項開放源碼軟體。也可能像 Ernie Ball 全面採用
開放源碼解決方案。不論是前者或後者,或是介於兩者之間,只要
能有效的解決問題都是很好的選擇。

開放源碼並非只跟開發者相關。許多開放源碼社群面對開發者外界
的使用者是很勢利眼的,如果在電子郵件論壇問了一個月前有人問
過並得到回應的問題,你會得到的回答是:菜鳥,請你回去搜尋郵
件論壇。就算是沒人回答過的問題,也會得到:這是開放源碼,你
自己可以改程式碼!這類的回答。這些都是開發者以自我為中心的
自大心態表現。

幸運的是現在這些心態上封閉的社群已經較少,或是面對使用者的
態度已經大幅改善。大部份的開放源碼社群現在有更多的使用者親
和力,甚至也結合 twitter, linkedin, Facebook 等社群網路和使用者
互動。軟體錯誤回報系統也是開放源碼社群必備的服務之一,你可
以在回報系統上回報錯誤,或者是提出新功能需求,而不用擔心受
到攻擊。事實上最成功的開放源碼系統,都極力擁抱錯誤回報系統
的運作,以確保軟體系統真的達到使用者需求。甚至可以接受使用
者建議的程式碼修改方式。

軟體社群的益處。這裡提到的軟體社群互動,已經可以用社群來形
容其活躍程度。當然這種回報系統可能得到丟了問題就消失無蹤的
使用者,但這是屬於少數狀況。大多數訂閱開放源碼計劃郵件論壇
的使用者都會一直持續觀注。這樣做可以發現遇到同樣問題的使用
者,或是在另一個層面遇到相同問題,得以進一步討論。

社群的意義就在於電子郵件論壇與支援網站的討論區上。你可以得
到許多程式好手,或資深使用者提供的珍貴意見,也可以分享自己
遇到的問題與解決方法。在討論共同問題時,如果你能先找到解決
方法,也可能藉由為別人提供解決方案得到些許收入。許多公司都
已經知道去關注開放源碼社群的主要問題,以提供解決方案獲利。

這些軟體社群活動帶來的經濟利益都是以前少有人注意的。不論是
開放的電子郵件論壇或因為得到眾人互動反饋,都讓開放源碼的發
展遠快於封閉的軟體開發環境。開放源碼社群另一個特點是使用者
之間的互動、不一定是使用者與開發者的互動,也帶動軟體快速發
展的趨勢。





Open Source in a new light?

比免費更好

也是摘譯,KK 的好文,網路上可以搜到蠻多摘譯版本,全翻完的不多。

網際網路像一台影印機。在網路最基礎的層次,會複製每個動作、字元,每一段我們
寫在網路上的思緒也都被複製著。為了要在網路兩端傳遞資訊,通訊協定需要經過中
間轉載點複製好幾次所要傳遞的資訊,才能完成這項任務。IT 公司倚靠販賣這些複
製資訊的主機設備賺了許多財富。每台主機要傳送的位元資料,最後都傳送到某個終
端。

數位經濟就在這些複製出來的資訊流中產生。跟工業時代不同的是,網路上複製的資
訊流都是免費的。

數位通訊網路的協定裡,會讓通訊資料封包找到最快速到達目的地的路徑,事實上你
可以把整個網際網路想像成一個超級大型派送系統。受歡迎的數位資料就像超導體中
的電力,會持續在網路上流傳不止。我們在現有的生活中就可以體驗到,當你把生活
上的資訊記錄在網路上,這些資料就會一直在網路上流傳,直到某天可能你會再收到
自己寫過的某些資訊。即使是一隻狗也知道他無法真正消除曾經放到網路上的資料。

這個超大的派送系統,已經成為我們經濟與財富的基礎。這些資料、想法、媒體支撐
鞏固了我們經濟體系中的每個角落。特別是跟出口相關的行業,這也是美國相對有優
勢的產業。我們的財富座落在一個龐大持續的全面複製機器上。

然而這個經濟體之前累積的財富,是基於販售稀有的資料拷貝上,因此網路的自由複
製本質相對的侵蝕原經濟體的財富秩序。如果我們努力的結晶被免費複製,要如何累
積財富呢?換句話說,怎麼靠賣免費的東西賺錢?

我有一個答案,我想到最簡單的說法如下:
當可以複製的資料拷貝數過剩,就沒有價值。
當可以複製的資料拷貝數過剩,那些無法被複製拷貝的資料,就更顯得稀有珍貴。

當資料都是免費複製拷貝,你必須賣那些無法被複製拷貝的事物。

 那麼有哪些事物無法複製呢?

有一些特質無法被複製,比如:信任。信任無法被複製,你也買不到信任。信任是需
要經由時間累積掙取得來。信任也無法被下載或假造、複製膺品(無法長久)。如果其
他方面都差不多,你會想要跟你信任的人事物打交道。因此信任就是在複製飽和的世
界中的無形資產。

還有一些類似信任無法被複製的特質,在網路經濟中更顯珍貴。我覺得檢驗這些特質
最好的方式,並非從製作人、製造廠商、或創造者眼光來看,而要從使用者的角度觀
察。我們可以從一個簡單的使用者問題開始:我們為什麼要為免費的事物付錢?當任
何人要買的東西都可以免費下載,他們會掏錢買什麼?

依我對網路經濟的研究,人們願意花錢購買可以免費取得事物的角度,大略可以分成
八種無形資產。

在現實中這八種無形資產比免費更好。八種無法被複製的價值。我稱為創造力
(generatives) 。一個必須要經由創造、成長、培養、灌溉的創造力價值特質或屬性。
創造力無法被複製、克隆、假造、複製、偽造、重製。 創造力是在特定地點隨著時
間獨特地產生。在數位的舞台,創造力的特質可以為免費的拷貝加值,因此成為可以
販賣的商品。

八種比免費更好的創造力

取得的即時性

產品客製化服務

解說演繹的服務

鑑別真實性的服務

提高可使用性

更高品質的具體解說演繹

互惠互利的資金贊助

可檢索取得的服務


比免費更好 Better than free

Better than free

3D 電影佔好萊烏2009 年營收 1/3

為何有這麼多公司對 3D 產業如此狂熱?這跟接下來要揭露的相關
數據有關。

根據國際 3D 協會的統計,3D 電影營收佔去年(2009)好萊塢的收
入的三分之一。今年將會再創新高。

當然大家印象最深的阿凡達功不可沒,為 3D 電影做了最大的宣傳
廣告,畢竟阿凡達是創電影史上營收新高的電影,也成為日後所有
3D 電影的先例,阿凡達開播首周票房中,3D 版本的營收佔八成。
阿凡達上映之後,觀眾更願意為 3D 立體效果花更多錢。

One Third of Hoolywood Revenue Comes from 3D

International 3D Society

3D Movie Fans Expand Box office Says Internation Society Study
(Opening Weekend Ticket Revenues in Millions 比較圖)

2010年4月5日 星期一

換喇叭鎖

這次是到 B&Q 買浴廁專用的安全鎖,換已經弄丟鑰匙的鎖頭,
以免 ssh 把自己鎖在房間內。

1. 先用新門鎖附的解勾鉗把原本鎖頭的門內握把卸下

2. 再用螺絲起子解下門內兩個螺絲就可以卸下門外握把,

3. 在門側邊用螺絲起子解下兩個螺絲起子就可以把鎖閂也
卸下

4. 把新鎖閂鎖上

5. 將新的門外手把靠上門,此時要按壓新鎖閂讓勾子伸出
勾住門外握把,要注意不要勾得太深,不然會發現新鎖閂
在門邊突出處不夠多,此時門關不起來,因為鎖閂不夠長

6. 門外手把跟鎖閂扣住,並試轉門把可以轉動鎖閂後,將
門內握把套盤組的螺絲鎖上,並扣上卡榫,最後握把順著
溝槽插入到底,並測試轉動可控制鎖閂。

大概是分這六個步驟就可以換喇叭鎖了。

各重要零件與名詞圖片

解勾鉗

解勾鉗

鎖閂

鎖閂

門外把手

門外握把

門內把手

門內握把

2010年3月17日 星期三

土地公生日快樂!

農曆二月二日是土地公生日,帶SSH到家附近的土地公廟拜拜。出門
前我就告訴他要去廟裡,他聽到拜拜兩個字,雙手就會十指交扣,像
是在跟你拜年恭喜的樣子,因為過年時教過他恭喜的手勢。以前他會
把拜拜跟掰掰搞混,現在則是恭喜跟拜拜動作一樣。

印象中,從小拜土地公拜到大。每月初一、十五,初二、十六都會拜
土地公。如果開店做生意,習俗上舊曆每月的初二、十六,商家都祭
拜財神爺(通常當地財神即為土地公),這種祭祀稱之「作牙」,又稱
「牙祭」、「作禡」。

土地,也可稱為福德正神,一般來說是基層的神明。民間常會自發
性地興建小型建築來供奉,算是分佈最廣的寺廟。

2010年3月14日 星期日

打理舊物付出行動

終於趁週末sjh有空,可以開車幫我一起把整理好的包包送到人本教育
基金會。我總共扛了五大袋,分兩次搬才順利把這一堆包包送達。沒
想到我年輕時還真能買,真愛買,有用的也買,沒用的也買,現在回
想起來真是後悔,如果這些包包能換成現金多好。

希望人本能努力用力把這些包包義賣出去,五月份義賣跳蚤市場開張
時,也歡迎大家共襄盛舉。

相關文章:

打理舊品不打小孩

2010年3月12日 星期五

開發電容式觸控螢幕的注意事項

1. iSupply 預測 2011 年底前會有 25% 的手機,會由原本電阻式觸控螢幕改採投射式電容觸控螢幕

2. 2010 年的電容觸控出貨量已由原本預估的一億,上修到一億八千八百萬片

3. 電容式觸控時產生的電容質約 0.5pF ~ 20pF

4. 精準度是看手指真實點到的位置,跟實際螢幕對應位置之間的誤差值大小而得。

5. 多指分辨度(Finger Separation)是判斷出兩指時,兩指相距的最短長度。有的以指尖中心點算,有的算觸碰表面邊緣最短距離。

6. 反應時間是手指碰到面板到控制器產生中斷訊號之間的延遲時間。其中包括:
    (1). X/Y 軸掃瞄速度
    (2). 偵測到手指觸碰
    (3). 判斷觸碰位置
    (4). 追蹤多指(finger tracking)
    (5). 中斷產生時間,通常小於 100 micro seconds (1/10^6)
    (6). 介面傳輸時間,I2C 約 400KHz,SPI 約 1 MHz

7. 更新(掃瞄)頻率是單位時間可以判斷出幾個點?關係到劃線時線條是否平滑?

8. 消耗功率是否節能減碳搶救地球暖化?通常是量測電流電壓來計算功率。在不同耗電模式可以只給足夠快的掃瞄頻率就好。

9. 手指電容值需要考慮玻璃厚度跟實驗量測統計數值。

10. 系統最低雜訊比是看沒有觸控時 ADC 會產生多少誤判?

11. 訊噪比(SNR)是真實觸控訊號與雜訊的比值

參考文獻:
  1. Not all touch screens are created equal: how to ensure you are
  2. developing a world-class capacitive touch product

2010年3月10日 星期三

打理舊品不打小孩

人本教育基金會2010義賣活動預計五月開市,跳蚤市場歡迎各位捐好
物。如果你也像我一樣,年少輕狂不懂事,衣服鞋子包包買一堆,捨
不得丟又好幾年沒在用,不妨打理一下,捐給人本作義賣吧!

以前超愛亂買東西,老爸常語重心長地說:喜歡不一定要擁有啊!!

我說:我知道啊! 喜歡不一定要擁有,是要 " 佔有 "

不知道我現在對兩歲的SSH講這句話,他能否了解作媽媽的用心良苦
呢?我猜很難吧! 不然他也不會在賣場玩具區大哭賴著不走。

2010年3月8日 星期一

台中二日遊

週六一大早出發去台中,中午左右先到大甲鎮瀾宮,參拜完後走到附近的三級古蹟-大甲文昌祠,SSH因為太早起,拜完媽祖就夢周公去了。

下午三點,帶SSH二訪國美館,一年多前他才六個月,我揹著他看展覽,現在他快兩歲了,在館外的草坪上奔跑尖叫,我得小跑步才跟得上他。

館內有一展覽區是用浴缸設計而成,創意十足。SSH整個人貼在浴缸裡,不停地扭動,我猜他心裡可能在納悶,為什麼這個大澡盆裡面沒有水呢?後來上網查了才知道,原來這是國美館2010年度大展。

 觀點與「觀」點—2009亞洲藝術雙年展

 展覽日期: 2009/10/24 ~ 2010/02/28

這項大展邀請了來自亞太地區20個國家的56位藝術家,144件作品,包含繪畫、裝置藝術、雕塑、數位藝術、動畫及紀錄片。我們玩的浴缸是由台灣藝術家設計的,這個藝術團體-建築繁殖場,是由台南藝術大學副教授-呂理煌於1999年所建立,2004年還代表台灣至義大利威尼斯參展。

因為浴缸實在太好玩,SSH知道我要帶他離開時,就賴在浴缸裡不願出來,國美館的行程就在SSH的嚎啕大哭加抵死不從下,強硬地結束了。離開國美館原本計畫往下一個行程-勤美誠品綠園道,恰巧同行家人邀約就改往新天地吃晚餐。

晚餐後終於等到motel可以check in的時間。簡愛是這次台中遊的下榻地。入住感覺還不錯,房間大小中等,附近很熱鬧,唯一缺點就是冷氣好冷,不管調幾度都像住在冰庫裡。

浴室空間相當大,浴缸可以全家一起泡澡,就在一家三口泡得正高興時,SSH卻異於常態,平時他泡澡時總是high到最高點,今天卻懶洋洋地,臉紅得好像燒燙傷,狀似缺氧。

後來連我也漸覺得頭昏,呼吸困難。原來是我這個天兵媽媽,想說冷氣那麼冷,怕洗完澡會著涼,就把空調關掉,結果空氣不流通,全家差點泡澡泡出人命。離開浴室後,SSH還是昏沉沉地停不起勁,不敢讓他就這樣睡著,趕緊帶他外出透透氣,所幸在外面吹吹風後,狀況好多了,再回motel時,他又會恢復充飽電狀態,一直興奮尖叫,我好怕motel會把我們趕出去。

隔天吃完motel招待的簡便早餐後,立即出發去高美濕地。沒想到高美濕地這麼冷。一家大小都穿短袖,SSH臉頰被寒風吹得好冰,我真是失算,平常很會幫SSH準備衣服,這次卻完全沒帶禦寒衣物,回台北途中,去新竹吃小吃才發現,怎麼新竹也一樣冷,原來週日開始變天,氣溫驟降,我臨時給SSH買件鋪棉外套穿。回台北後覺得怎麼跟出發時差這麼多,週六還熱得要命,高溫超過30度,週日回來後竟然冷到剩十幾度。

SSH這兩天為了玩都ㄍㄧㄥ住不睡午覺,回家後累翻了連睡14個小時。

2010年2月12日 星期五

清除舊的 grub 開機選單

最近在 Ubuntu update 完 kernel 後, 發現舊的也都還在 XD
然後 grub 開機選單就越來越長, 快要超過一頁了
如果要除掉舊的 kernel
假設是要刪除 2.6.31-14 kernel option

cd /boot
sudo rm -rf *2.6.31-14*
sudo update-grub2

2010年2月10日 星期三

ckermit to access serial port (gsm/gprs modem) in (embedded) linux

sudo apt-get install ckermit
cat ~/.kermrc

set modem type none ; There is no modem
set line /dev/ttyS0 ; Specify device name
set carrier-watch off ; If DTR CD are not cross‐connected
set speed 115200 ; Or other desired speed
set flow rts/cts ; If RTS and CTS are cross‐connected

; the following equivalent to kermit -8
set terminal bytesize 8
set command bytesize 8
set parity none ; (or "mark" or "space", if necessary)

set stop-bits 1 ; (rarely necessary)
set flow xon/xoff ; If you can't use RTS/CTS
connect ; Enter Connect (terminal) state

如果是要存取 gsm/gprs modem 的話,也可以試

set modem type user ; User defined
set modem name my-gsm ; gsm/gprs modem with AT commands
set modem capabilities at
set modem carrier-watch off
set modem kermit-spoof off
set modem flow-control none
set input echo on

set line /dev/ttyS0 ; Specify device name
set carrier-watch off ; If DTR CD are not cross connected
set speed 115200 ; Or other desired speed

; the following equivalent to kermit -8
set terminal bytesize 8
set command bytesize 8
set parity none ; (or "mark" or "space", if necessary)
set stop-bits 1 ; (rarely necessary)
set flow none
set local-echo on

; output AT\13 ; modem expect carriage return (13 in decimal or 0xD in hex)
lineout AT ; lineout would add carriage return for you
connect ; Enter Connect (terminal) state, you should see AT response OK

最後 sudo kermit 就可以 access

另外在 windows 上也可以用 putty 連線到 serial port, 選 serial 設定 baud rate 就可以 connect, 比一些 dummy terminal 好用一點, 至少有 copy/paste 可以用 :P

要 cross compile ckermit 時,需要先 build host 版本的 wuart, 把 wuart 保留一份 host build 的版本,在 cross compile target 中 failed 時手動換回 host 版本 wuart,再繼續 build 出 wermit, 要自己 rename 為 kermit :P

2010年1月26日 星期二

獨立 session 的 xorg.conf 雙螢幕設定

垂直雙螢幕不同的地方是多一個 Device Section, 雙螢幕各自有一組 Device-> Monitor-> Screen, 並且兩個 Screen 的解析度是各自設定的 (modes), 沒有 Virtual Display 的設定, 依照 ServerLayout 可以讓 Input Device 在兩個螢幕間移動, 但視窗在雙螢幕間無法拖拉跨越, 是類似 KVM 的功能。

xorg.conf

Section "Monitor"
#DisplaySize 300 230 # mm
Identifier "VGA Monitor"
VendorName "SAM"
ModelName "SyncMaster"
HorizSync 30.0 - 60.0
VertRefresh 56.0 - 75.0
Option "PreferredMode" "1024x768"
Option "Position" "0 0"
Option "DPMS"
EndSection

Section "Monitor"
#DisplaySize 300 230 # mm
Identifier "DVI-0 Monitor"
VendorName "SAM"
ModelName "SyncMaster"
HorizSync 30.0 - 60.0
VertRefresh 56.0 - 75.0
Option "PreferredMode" "1280x1024"
Option "Position" "0 768"
Option "DPMS"
Option "below" "VGA-0"
EndSection

Section "Device"
Identifier "Card0"
Driver "radeon"
VendorName "ATI Technologies Inc"
BoardName "RV370 5B60 [Radeon X300 (PCIE)]"
BusID "PCI:5:0:0"
Screen 0
Option "monitor-VGA-0" "VGA Monitor"
Option "monitor-DVI-0" "DVI Monitor"
EndSection

Section "Device"
Identifier "Card1"
Driver "radeon"
VendorName "ATI Technologies Inc"
BoardName "RV370 5B60 [Radeon X300 (PCIE)]"
BusID "PCI:5:0:0"
Screen 1
Option "monitor-VGA-0" "VGA Monitor"
Option "monitor-DVI-0" "DVI Monitor"
EndSection

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "VGA Monitor"
SubSection "Display"
Depth 24
Modes "1024x768"
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "Card1"
Monitor "DVI Monitor"
SubSection "Display"
Depth 24
Modes "1280x1024"
EndSubSection
EndSection

Section "ServerLayout"
Identifier "X.org Configured"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" 0 768
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection

垂直雙螢幕的 xorg.conf 設定

備份 Ubuntu 9.10 設定垂直排列雙螢幕, 兩顆螢幕都是接在同一張顯示卡,小螢幕在上, 大螢幕在下, 小螢幕解析度 1024x768 接 VGA output, 大螢幕解析度 1280x1024 接 DVIoutput, 另外有使用 gnome GUI 工具調整螢幕設定,或是 xrandr 指令, 以介面來區分:

xrandr --output VGA-0 --mode 1024x768 --output DVI-0 --mode 1280x1024 --below VGA-0

xorg.conf 中各個 section 定義

Monitor -> 螢幕

Device -> 顯示卡

Screen -> 顯示卡跟螢幕透過 VGA/DVI 介面的組合, 所以至少要有跟螢幕同等數目的 Screen 設定, virtual display設定到 2048x2048 可塞下多螢幕的解析度

xorg.conf 檔案

Section "Monitor"
#DisplaySize 300 230 # mm
Identifier "VGA Monitor"
VendorName "SAM"
ModelName "SyncMaster"
HorizSync 30.0 - 60.0
VertRefresh 56.0 - 75.0
Option "Position" "0 0"
Option "DPMS"
EndSection

Section "Monitor"
#DisplaySize 300 230 # mm
Identifier "DVI-0 Monitor"
VendorName "SAM"
ModelName "SyncMaster"
HorizSync 30.0 - 60.0
VertRefresh 56.0 - 75.0
Option "Position" "0 768"
Option "DPMS"
Option "Below" "VGA Monitor"
EndSection

Section "Device"
Identifier "Card0"
Driver "ati"
VendorName "ATI Technologies Inc"
BoardName "RV370 5B60 [Radeon X300 (PCIE)]"
BusID "PCI:5:0:0"
Option "monitor-VGA-0" "VGA Monitor"
Option "monitor-DVI-0" "DVI Monitor"
EndSection

Section "Screen"
Identifier "Screen0"
Device "Card0"
Monitor "VGA Monitor"
SubSection "Display"
Depth 24
# Modes "1024x768"
Virtual 2048 2048
EndSubSection
EndSection

Section "Screen"
Identifier "Screen1"
Device "Card0"
Monitor "DVI Monitor"
SubSection "Display"
Depth 24
Modes "1280x1024" "1024x768"
EndSubSection
EndSection

Section "ServerLayout"
Identifier "X.org Configured"
Screen 0 "Screen0" 0 0
Screen 1 "Screen1" 0 768
InputDevice "Mouse0" "CorePointer"
InputDevice "Keyboard0" "CoreKeyboard"
EndSection

2010年1月19日 星期二

使用 SLAM 的掃地機器人

採用 SLAM (Simultaneous Localization And Mapping) 同時定位
與環境側寫技術的新清潔機器人,一般常見的 iRobot 清潔機器人
將出現新競爭對手,來自史丹佛大學人工智慧實驗室的新創公司
Neato Robotics,新的探測採用雷射掃描,將可以探測未知的環境
地型並仍能定位出家具,移動物,門的位置,判斷該往哪邊前去
吸塵。

相關連結:

Simultaneous localization and mapping 維基百科

基於全向式影像之機器人 同時定位與環境地圖建立 黃富聖 pdf

Neato Robotics