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

2009年12月27日 星期日

相同旋律的 ABC Song 跟一閃一閃亮晶晶

今天艾媽跟我說才知道 ABC song一閃一閃亮晶晶是同旋律,
而一閃一閃亮晶晶是 Stars 英文兒歌的翻唱板。

A B C D E F G~
一閃一閃亮晶晶~

從開頭第一句的對應就是這樣。

相關連結:

56 首 flash 兒歌

2009年12月15日 星期二

鎖定免費的行銷策略

免費大放送,並堅持到底的行銷策略。下一家 netscape, yahoo,
microsoft 已經上線,並且正在營運中,他們的行銷策略便是免
費大放送。只要你找到這種行銷模式,就可以鎖定持續追蹤。
特徵是:
一、只有額外附加服務才要收費
二、一般使用下好像永遠免費
三、會員制
四、爽快的推出免費服務
使用類似的免費網路效應,都可以有機會成功。

相關連結:

Follow the free, Strategies: Pinpoint where value is being given
out

2009年12月6日 星期日

如何提高生產力

這是由 Aaron Swartz's Raw Thought 的 Blog 文章:摘譯 HOWTO: Be more productive 

「與其花時間看電視」他說道,「同樣花這些時間你都可以寫一本小說了」。
這個論點很難去反駁,寫小說也許是比看電視更有時間價值,但較有時間價值
這個論點沒有明言的是什麼?這種論點隱含著時間是可替代的,任何時間寫小
說都比看電視更有價值。可惜的是事實上並非如此。

時間品質有不同的層次。如果我走進地鐵車站才發現忘記帶筆記本,這時候就
很難寫上一兩段文章。同樣的,如果你一直被打斷思緒,根本就沒辦法專心。
還有心理層面要考量:有時候自我感覺良好,充滿動力,已經準備好可以進行
某件事務,但有時候就是很累或是感到悲傷,只想看電視。

如果你想提高生產力,就要認清並處理這些影響你使用時間背後的種種因素。
首先,你要善用在某段時間最適合做的事,第二步是提高同樣時間內生產力的
品質。

有效率的使用時間

選擇好的問題
人生苦短(據說是這樣),為何要花時間做些蠢事呢?如果做某件事情很方便的
話,就很容易先去做容易的事,但你要持續的質疑自己這種想法。是不是有更
重要的事要做?為什麼不做另一件事?這些自我質疑的步驟都很難讓人面對
﹝如果你真照我說的這樣子想,最後可能會變成為什麼我不解決世界上最重要的
問題﹞,但每一小步都讓你更有生產力。

當然這並不是真的要你去解決世界上最重要的問題,至少我不是﹝不然也不會寫
這篇短文﹞。但這的確是我用來衡量自己生活時間運用的標準。

蒐集足夠多的問題
另一個常見的迷思是,如果我找到那個最重要的問題,就把全部心力放在上面
,其他問題都排除不管,這樣一定可以提高效率。我發現這種想法通常導致失
敗。比如現在,我就想要改變一下坐姿、運動增加肌肉、喝點飲料、清理桌面
、跟我哥即時通,以及寫這篇文章。但是在一天下來,我實際做的是寫了這篇
文章,讀本書、吃點食物、回了一些郵件、跟朋友聊天、買了些東西、寫了其
他文章、將硬碟備份、整理我的書單。上星期我在多個不同的軟體專案工作、
讀了許多不同的書,研究了不同的程式語言,以及搬動一些東西之類的事。

有多樣的問題與事情做,可以讓你充份運用在不同品質的時間。此外你在某件
事情上卡住時,也還有其他事情可以做﹝這可以讓你暫時抽離煩惱的事務。﹞

多件事務切換也讓你更有創意。創造力來自於你將另一個領域的知識或技能
運用在工作上。如果你在不同領域都各有一堆不同的專案在進行,就會發現
自己有運用不完的創新點子。

列出清單
想出要進行的多件事務並不難,大部份的人都有一堆想完成的事務與夢想。但
如果你同時塞到腦子裡,一定會崩潰。想記住所有事物的心理壓力會讓你發瘋
。解決方法很簡單:寫下來列出清單。

當你列完清單就可以分門別類進行組織。比如我的清單,依照重要順序會是
程式設計、寫作、思考、確定任務使命、閱讀、聆聽、觀察。

大多數的主要專案都有一堆不同的任務。比如寫這篇文章就需要:閱讀其他較
不重要的文章、思考新的文章段落、簡化文句、寫郵件詢問他人等的工作,
這些都是除了真正執行寫作外需要做的事務。每個任務都可以分門別類,讓你
善用各種適當的時間處理這些工作任務。

整合清單到生活中
當你列出清單後,問題變成是要記得去看這份清單。最好的方法就是放在你
無論如何都看得到的地方。比如我的書桌有一大疊書,一定把目前在看的書
保留在最上面。當我想讀書就直接拿最上面那本。

對於電視/電影也是如此,我會把想要看的所有電視/電影都放在電腦中固定的
檔案夾中,當我想看電視或是電影時,就直接打開那個檔案夾開始觀賞。

我甚至想過更融貫在自己生活的方式。比如當我想讀一些網誌時,就會自動
跳出一個網頁,裡面紀錄我想要閱讀的所有網誌。甚至是一個軟體會在我恍神
太久時,自動跳出視窗告訴我還有什麼重要的工作要完成。

提高使用時間的質量。

盡力善用你的時間就只能讓你有目前的成就。更重要的問題是要為自己創造
更多高品質的時間。大部份的人時間都被工作跟課業佔住了。很明顯的,要
提高時間品質只能翹課、翹班,但除此之外呢?

擺脫實體限制 隨身帶紙筆
大多數善用時間的人,都有隨時隨身攜帶筆記本或類似事物的習慣。紙筆幾乎
在任何時刻都可以發揮很大的作用。比如當你需要為別人寫下什麼,記錄事物
感想,寫下靈機一動的點子等等。我甚至曾經在坐地鐵時,寫完一篇文章。
(註 1)

﹝我以前常這麼做,但現在都是隨身帶智慧型手機,時刻閱讀電子郵件。我沒
辦法當面給別人資訊,但有需要時可以透過電子郵件把資訊傳遞出去。﹞

避免思緒被中斷
當在處理需要全神灌注的任務時,就需要避免思緒被中斷。其中一個方法是
到別人找不到的地方。另一個方法是跟週遭的人達成協議:房門關上時請勿
打擾,我戴耳機時請用即時通跟我溝通。這時候你只要假裝沒看到即時通就
好了。:P

當然這個方法要適可而止,有時候我們沒辦法專注變成在浪費時間,因此適度
的被打斷也可能是有益的。比如坐在電腦前讀新聞,不如去幫別人解決問題。
這也是跟週遭的人達成協議的重要原因,當你不是真正專注時,是可以被打擾的。

舒解心靈 飲食、睡眠、運動
當你饑餓、疲憊、焦躁不安,時間品質是相當低落的。解決方法很簡單,吃飯、
睡覺、運動。其實我自己有時候也是連這點都做不好,我不喜歡去買吃的,
所以常常工作到錯過用餐時間,最後累到沒辦法去買食物吃。(註 2)

「我知道很累了,但是為了工作,我不能打瞌睡!」這種想法很容易讓人虛榮。
事實上你如果真的打個瞌睡再繼續工作,會更有效率,因為你可以讓今天剩餘
的時間都更有生產力。而且你最終還是需要上床睡的。

我並不是很常運動的人,因此比較沒有立場說服別人去運動。但是當有機會時
我會運動。躺著閱讀時我會做仰臥起坐,需要移動時我會找機會小跑步。

跟樂觀的朋友聊天
要舒解心靈是較困難的事,其中一項較有幫助的是找天性樂觀的朋友聊天。比如
我常常在跟 Paul Graham 或 Dan Connolly 聊天後就想投入工作中,他們身上散發
強烈的能量。人們在心靈鬱悶時很容易傾向於遠離人群,想要獨自理出頭緒,但
事實上卻會因為越來越沒效率而失去鬥志。

工作分擔
即使你的朋友並不樂觀,單純的分擔工作就讓你感覺事情變容易,其一是每個人
的心理負擔變輕了,第二個原因是跟你共事的人會提醒你要專注在工作上,
較不容易分心。

因循茍且與心靈力場
事實上影響生產力的最大原因是逃避。人們面臨的生產力問題是因循茍且的心態。
這是每個人心中的小秘密,但每個人都常有茍且混過的心態。並不是只有你會想
因循茍且,但也不代表你就不需要改變這件事。

什麼是茍且混過的心態?對於觀察你的人,認為你只是在玩樂﹝玩遊戲或是讀新聞﹞
,而不是真正在工作﹝這讓旁觀者認為你懶惰,不認真﹞。但真正的問題是,我們的
腦袋裡到底在想什麼?

我花了許多時間在探討這個問題,所能想到最佳的描述就是:腦袋被某件任務的
心靈力場關住了。有玩過磁鐵吧,當你把兩個磁鐵轉到某個方向時,他們會發出
強烈的排斥力場,當你移動時就會發現有個磁鐵力場存在,當你想要把兩個磁鐵
靠近,就會感覺到強烈的力場把磁鐵推到遠離的方向。

心靈的運作就跟磁鐵很像,並非實體可見的。但是你可以去感覺出來這個力場的
存在。當你越逼近就越感覺到被推開的力場,因此不意外的你思緒就會轉到別的
地方。(註 3)

就像你不能把兩個互斥的磁鐵硬結合在一起,但是當你停止拉近磁鐵時,他們
就會回到原位。我沒辦法用意志力強硬控制這種心靈力量,相反的你必須悄悄
的進行,將磁鐵轉向。

這種心靈力場的來源是什麼?通常就是工作很困難,或者工作是經由命令指派。

困難的問題
分解後各個擊破

第一種困難的問題是,這是個大問題。比如你想要建立食譜分類程式,但沒有人
能坐下來就寫出一個食譜分類程式。太大的問題是目標,而非任務,任務是你要
完成的目標中可以實際執行的某一步驟。比如在畫出螢幕上的食譜分類模型畫面
,這就是你馬上可以做的事。(註 4)

當你做好第一項任務時,接下來的步驟就比較清楚了,你必須決定食譜裡面要有
什麼,需要什麼搜尋方式,如何建構食譜資料庫等事項。當動力產生後,每個
任務都會導引你去做下一個任務,當腦袋專心處理這些訊息,就更容易解決這個
主題的相關問題。

我做的每一個大案子,都會想著所有我接下來能夠做的,並把接下來能做的事都
分門別類到待做事項清單﹝參考列出清單﹞。當我把某項任務完成,就繼續把下一步
驟的可能任務都列到待做事項清單中。

簡化
另一種困難的問題是太複雜的問題,或是太大膽的目標。寫本書可能很嚇人,但是
從寫篇文章開始就還好。如果寫篇文章太難,那就先寫一個段落摘要,重點是要
馬上開始做出一些東西。

當你開始有成果,就更能精確的判斷、瞭解問題。改善一篇既有的文章也比面對
空白頁簡單多了。如果段落寫的不錯,也許就可以慢慢的寫出一篇文章,最後
累積成一本書。這樣一路寫下來就可以寫出完美的書籍了。

認真去思考
通常解決困難問題的關鍵是得到靈感。如果你完全不懂這個領域,那就開始研究,
看別人是怎麼做的,瞭解整個脈絡。坐下來開始嘗試,並完整瞭解這個領域。
試試看能不能解決一些比較小的問題。

被指派的工作
被指派的工作問題在於這是別人叫你做的。許多心理實驗發現,當你想「誘發」
別人去做某些事情,他們通常不會去做,或是做出很糟糕的結果。外來的誘發,
包括紅利獎賞跟處罰,都會扼殺心理學上說的自覺動機,也就是你對這個問題
原本自然會產生的興趣﹝特別是在社會心理學,超過七十個研究發現獎賞扼殺任務
中的樂趣﹞(註 5)。人們的腦袋裡似乎有更深一層的意識避免被叫去做事。(註 6)

詭異的是被命令去做事不只發生在不同人之間,就算是你要求自己去做某件事
﹝我應該先做 X,這是目前最重要的事情﹞,也有同樣的負作用。X 現在變成你在
世界上最難完成的工作。但是當另一件被指派的 Y 工作變重要時,X 的工作忽然
又變得簡單。

建立虛擬的指派
最後描述道出了這個問題的解答:如果你需要做 X,告訴你自己去做 Y。不幸的是
,這很難做到,因為你終究知道自己在做什麼(註 7),因此我們需要一些技巧完成。

其中一種方式是要求別人指派另一個工作給你。一個經典的例子就是要求研究生
必須完成一篇極為龐大的困難工作,撰寫論文才能畢業的這種工作指派。因此為了
逃避寫論文這件事,研究生便會甘願於做任何其他難以達成的艱困工作。

這項任務不但看來重要﹝寫出論文才能畢業!﹞並且龐大﹝要寫出幾百頁你能力所及內
最好文章!﹞,但實際上如果逃避寫論文並不會帶來災難。

不要指派任務給自己
「好吧!那我就不管其他一切工作,專心寫好這篇文章。」這種自我指派任務也許
聽起來很酷。更糟的是想用「好吧,等我寫完這篇文章就吃點甜食慰勞自己。」
自我激勵法來做一件工作。最糟糕的是要別人指派任務,嘗試逼迫你做某件事。

這些方法乍聽之下很好,我也都嘗試過了,但是卻都是完全沒有生產力的工作指派。
這三種方法的最後結果就跟你指派任務給自己一樣。你的腦袋會往相反心靈的力場
去逃避它。

把要做的任務變得有趣
我們常聽到一種觀念,艱難的工作一定不好玩不有趣。但事實上我做過最有趣、
最樂在其中的都是困難的工作。不只是在面對困難的問題時,為了解開難題你會
願意貫注全部心力在其中,並且你在完成艱巨任務後的成就感,也會帶來優秀、
偉大的感受。

因此要讓你自己做某件事的秘密,就是不要說服自己去做這件事,而是要說服自己
相信做這件事帶來的樂趣。如果是本來就無聊的事務,你就更需要去找出樂趣來做
這件事。

我第一次這麼認真找出樂趣時,是為了學院寫文章。寫文章本身並不難,但如果是
指派去寫一篇文章可能就很難。試想有誰會自願去撰寫找出某兩本書籍之間關聯的
文章?因此我決定把這篇文章當成笑料,比如我決定每個段落有自己的格式,盡力
去模仿各種型式的演講﹝這樣做也有增加文章篇幅的益處﹞(註 8)。

另一個找出更多樂趣的方式,是嘗試解答原問題中更抽象層次的問題。如果要寫一
個網頁應用程式,就試著去寫出一個網頁程式框架來達到原本的目標。你不只會在
工作時更樂在其中,也會讓你最後寫出來的成果更有效用。

結論
關於生產力有許多迷思,包括時間的可替代性、專心的益處、自我賞罰以追求效率
、難的工作很無聊、因循茍且是不自然的等等觀念,但事實上這些觀念都在闡述一
點:在面對真實工作時會違反你原本有的好奇、樂趣等自然天性。

對於大多數人所面對的大部份工作可能都是如此。要你自願去寫篇無聊的文章,或是
歸檔一些無意義的備忘錄本來就毫無意義。但如果在社會上生存就是要求你做這些事
,那你就只能想辦法讓自己負面的逃避思考停止下來。

但是如果你是要去做一件很值得做、很有創意的事,就根本不會出現這些逃避的想法
。真正創造力的秘訣不是外來的,相反的是:聆聽來自心靈與身體的訊息。餓了就吃
,累了就睡,無聊的時候就暫停手邊工作,先去做目前找得到樂趣的工作與專案。

這樣說來生產力的秘訣其實簡單的很,不需要你去死背一些縮寫字,不需要你下天大
的決心,也不需要聆聽成功生意人的成功証言。生產力幾乎簡單得像是常識般。
但社會上對於工作的成見已經讓我們完全往相反方向走去。如果要提高生產力,
就轉個彎,不要被別人對工作的成見侷限,找出樂趣。

進階閱讀

如果想瞭解更多關於心理學的動機理論,可以去搜尋關於 Alfe Kohn,他寫了
很多相關文章,還有一本我很推薦的書,由 Rewards 出版

我希望在將來寫一篇如何退學的文章,但其實你可以直接去看青少年自我解放手冊
如果你學的是電子資訊科技,要辭掉工作的方法就是去向 Y combinator 申請資助。
同時 Mickey Z 針對藝術家和行動主義者寫的我那被謀殺的歲月,也有教你如何同時
達到社會要求,並且依循自己志趣。

作者注 1~8:

1. 信不信由你,我真的在地鐵完成一篇文章。當你沒有在工作時,很容易找到藉口
,比如來不及趕下一個約會,樓下的人很吵,但我發現,當靈感來時,即使外面
環境很吵,或再過幾分鐘後我就要走出車廂下車,坐在地鐵車廂內也可以寫一篇
文章。

2. 睡眠跟飲食有同樣的問題,累過頭又睡不著是最糟糕的感覺,像殭屍一樣。

3. 對於害羞我也有同樣的問題,我並不想打電話給陌生人,在派對上跟別人聊天,
我也會有同樣的力場想遠離他人。我發覺害羞通常是兒童時期有過困難的經歷﹝見
被指派任務一段﹞,當然這些都只是我的猜想。

4. 這裡的用詞﹝「下一步驟」﹞是從 David Allen 的把事情做好中摘錄出來的,文章中
提到的許多規則﹝許多甚至是潛意識的﹞,都應用在極限程式設計模式(XP)。極限程式
設計的系統目標是寫出有組織的程式,但我發現他裡面許多方法也可以避免我們因
循茍且,拖延進度。

比如配對程式設計(pair programming)特別適合在效率低落時,自動分擔了程式設計時
的心理負擔,也較能寫出有意義的程式。把困難的事物拆解也是極限程式設計的重要
步驟,可以馬上就改善﹝「簡化」﹞一段程式碼,這些都可以應用在程式設計以外的
事物。

5. Alfie Kohn 的獎勵帶來的逞罰,對這件事有完整的概觀。這個特別的論點摘自於他
的文章挑戰行為主義的教條:金錢與動機的迷思

6. 我原本以為這是生物的本能,但 Paul Graham 指出這比較可能是後天學習而來。
小的時候父母可能用盡心思擺佈控制你。父母只會教你努力用功讀書,而你的心卻
渴望自由蠢蠢欲動,並不想把心思放在課業上。最後這種蠢蠢欲動的心變成習慣。
不論原因為何,到最後這都將成為難解的問題。我已經放棄改變這種習慣,而是
改採如何周旋應付這些習性。

7. Richard Feynman 用一個故事說明他是如何探索夢境,很像是我在探索自己因循
茍且心態的歷程。每晚他會嘗試在睡著時,觀察自己的感官:

某晚我和平常一樣做夢,進行觀察...我察覺到自己的頭顱後方貼著黃銅棍子,我的
手墊在自己的頭顱後就感覺比較柔軟。我想到「阿哈!這就是我能夠在夢境中進行
觀察的原因;黃銅棍子刺激了視覺腦皮層。因此我想要觀察自己睡眠時,就只需要
把這根棍子卡在頭顱下方,我可以隨意控制自己是否要在睡眠時進行觀察。然後我
就想到自己可以停止這種感覺,擁有較深層的睡眠。

人腦的能力遠超乎自己的想像。

8. 比如,我不會寫「相反的,Riis 並沒有引用許多文獻」,我會寫「然而因為 Riis
個人欠缺將人的聽覺接收到以個人為中心的民族志,同時轉換為紙本出版資訊的能力
,或者只是單純不喜歡當以社群為主題的新聞記者,明顯地成了一個徹底的失敗者。」

而跟我一對一校對論文寫作的教授,完全不知道我這樣寫只是在開玩笑,只是麻木而
嚴肅的評論這段文章寫得不好。

相關文章:

找到讓你專心的絕對領域

成功的十項必備技能

程式設計的文藝復興

C++ 之父 Bjarne Stroustrup 談軟體教育

相關連結:

HOWTO: Be more productive

時間管理 Jamyy's Weblog 介紹紀錄時間的應用軟體:
1. Rescue Time web with ap on windows,
2. Hamster-applet on linux
他說:"我花了 28 分鐘完成這篇 Blog。" :P

2009年11月30日 星期一

Sony PS3 將可升級韌體玩 3D 遊戲

Sony PS3 將可以透過韌體更新後玩 3D 遊戲。

Sony 在向投資者展示未來發展方向時,提到了廣泛的主題,其中
包括影像技術、家庭劇院,其中除了電影產業的發展,也提到遊
戲產業的發展。其中最引人注目之一的就是三維空間的視覺效果
,特別是在 PS3 上的 3D 遊戲主題。

比如 James Cameron's Avatar: The Game 就是其中一款將會提供
3D 視覺效果的遊戲。Sony 預計在 2010 年提供新的韌體讓玩家更
新,而不需要遊戲光碟上特別的程式就能全程玩到 3D 遊戲。

然而Sony 並沒有說明清楚 PS3 上觀賞藍光電影時,是否也能提供
3D 電影劇院效果。但提出了一系列即將提供 3D 立體視覺效果的
產品線:專業 3D 攝影機、3D 編輯功能、3D 投影電視、3D 藍光
播放機等。

之前到世貿逛發明展時,記得已經看到 Philips 的立體電視,視覺
效果我們全家都覺得相當逼真,身歷其境,相信 Sony 的一系列立
體 3D 產品效果應該不會比 Philips 差。:P

相關連結:

Sony Confirms 3D Gaming Firmware Update for PS3

Sony Media/Investor Conference 2009/11/19 7.21MB pdf files

2009年11月26日 星期四

HDMI 線材新標示

今後要買 HDMI 傳輸線的話,會有新的標準規範線材命名規則。
將不在採用 HDMI 1.3a, HDMI 1.3b, HDMI 1.4 ...等 spec 版本的
命名方式。

新 HDMI 線材有以下五項分類:
基本傳輸線:支援畫質是 720p, 1080i 解析度
1. HDMI standard
2. HDMI standard with Ethernet
專門給衛星電視,數位廣播高畫質電視,以及有支援 upscaling
的 DVD player (DVD 的 spec 最高支援到 480p) 使用。

汽車專用:
3. HDMI standard automotive

高階線材:支援 1080p 畫質以上的解析度,以及先進的 4k, 3D,
Deep color 等顯示技術。
4. HDMI high speed
5. HDMI high speed with Ethernet

可以預期 HDMI 線材廠商會藉由這次的命名標準轉變,針對
民眾預期的高階 high speed 線材調漲。但詭異的是,現在大部
份買 HDMI 線材,通常都是為了看藍光光碟影片等 1080p 以
上解析度的人,為何還要再往下開新的 standard 系列較低解析
度的 HDMI 傳輸線材?原因是為了找理由漲價嗎?:P

相關文章:

HDMI 介面的擴大機

相關連結:

HDMI Drops Version Numbers - Adds 1080i Only Cables

HDMI Licensing, LLC 發佈新版的採用商標和標幟使用指引

HDMI 產品將依功能貼上不同的標籤

2009年11月17日 星期二

Trace Code with vim, ctags, cscope, taglist

在 console 下沒有 sourceinsight 的強大 reference, Class relation 圖的功能好用,但是加上 ctagscscope 可以達到部份的功能,主要是差在沒有 Class relation 之類的關係圖。

cd ~linux; ctag -R *; cscope -bR

cscope 沒有加 -b 預設會進入互動模式 CTRL-d 離開,如果要看 kernel 或是 standard library 本身的程式碼,可加 -k

cscope -bkR

減少不必要的 standard inclusion

linux-2.6.31.5 的 source code 建的 index 差異是 ctags 的 tags

119,529,496 bytes cscope 的 cscope.out 227,247,709 bytes,約多出一倍

100MB的索引資料。其實在 linux kernel 解開後下 make help 也可以看到

make tags, make cscope 兩種分別建立 ctags 與 cscope 資料檔案的方式。

再抓以下檔案

http://cscope.sourceforge.net/cscope_maps.vim

到 ~/.vim/plugin,這個 cscope 設定檔會覆蓋 ctags 預設讀取的 tags 檔,ctags 裡跳到定義的 Ctrl + ] 改為讀取 cscope.out 檔案,而非 tags 檔案

(Ctrl + t 或 Ctrl + o 退回原游標,Ctrl + i 到下一遊標)。

如果還是習慣有 ctags 的操作,可以在 ~/.vimrc 加上

" tags search path

set tags=tags,../tags,../../tags,../../../tags

另外把 cscope_maps.vim 裡面的 set cscopetag 加上 comment "

cscope 本身的功能鍵是:

Ctrl + \ + s 尋找使用目前游標 symbol 的 references
Ctrl + \ + g 尋找使用目前游標 symbol 的 global 定義
Ctrl + \ + c 尋找所有 call 到目前游標 function的 callers
Ctrl + \ + d 尋找目前游標 function的呼叫的所有 callees
Ctrl + \ + f 開啟目前游標所在的 include 檔
Ctrl + \ + t 尋找所有目前游標所在 instance/object 的 users
Ctrl + \ + e egrep 搜尋目前游標所在名稱
Ctrl + \ + i 尋找所有 include 目前游標檔名的所有 includers

搜尋完的結果頁可以使用 Enter 下一行, Spacebar 下一頁, q 離開,另外是同樣功能搜尋,但視窗切為水平/垂直兩種。連續兩次 Ctrl+ Space 鍵的切換,一般中文使用者會跟中文切換衝到,需要再修改 cscop_maps.vim

可以看 用 vim+scope linux kernel

Kernel Newbies 的 Kernel Hacking Tools 提到在沒有使用 vim 搜尋時的命令列搜尋方式:

find . -exec grep --with-filename myfunction '{}' \;
find . -name '*.[chS]' | xargs egrep -n "myregularexpression";
egrep -r --include "*.[chS]" "myregularexpression" .

另一個好用的 script 是 taglist plugin, :tlistopen 就可以開啟側邊,關於目前檔案的 tag list。也是用 Ctrl + w + {h,j,k,l} 移動。taglist 是倚賴 ctags 達成的 plugin.

為了方便使用我在 vimrc 也加入Tlist_File_Fold_Auto_Close 在我們切換到不同檔案時,自動關閉游標已離開 focus 的視窗。參考 c9s連結,及 TagList Manual 後加入 TagList 快速鍵 F8 設定切換開啟或關閉 TagList,並加入 Tlist_Exit_OnlyWindow 在只剩 TagList 視窗時自動關閉 Vim.

" TagList settings
let Tlist_File_Fold_Auto_Close = 1
" let Tlist_Auto_Open = 1
nnoremap :TlistToggle
let Tlist_Exit_OnlyWindow = 1

參考文獻:
  1. vim and linux Coding Style
  2. 用 vim+scope 看 linux kernel
  3. Vim/Cscope Tutorial
  4. vim source navigator use taglist
  5. vim taglist plugin manual taglist manual
  6. vim taglist download config and plugin for vim
  7. Setting up Ctags+Gvim in windows Taglist 快速鍵
  8. 打造自己的VIM:源碼追蹤(ctags+cscope)及預覽視窗SrcExpl
  9. vim script ratings

2009年10月24日 星期六

Real-Time Web 即時網頁(路)

Real-Time Web 照直譯是即時網頁,在維基百科的解釋中,是可
以在作者發表在網頁上的資料即時(Push資料)讓讀者閱讀,而不
是讀者手動或者讀者的閱讀軟體(RSS reader)定期去檢查有沒有
網頁資料更新。

即時網頁的資料類型通常是包括:簡短訊息、狀態更新、新聞、
警示、或是連往長篇大論的縮短網址(tinyurl)。

即時網頁的內容通常是軟性的,大多是網路社群資訊,包括人們
抒發己見,對事物的態度,個人思路,以及個人興趣,通常不是
關於事件的新聞或者是事實描述。

最成功的即時網頁包括 facebook 狀態更新,twitter. 這種技術現
在正廣泛運用在社群網路,搜尋,新聞網站;即時網頁讓上述的
這幾種網站功能,變成像即時通訊(MSN, Google talk)這類的軟
體,跟即時通不同的是對象通常是不設限的普羅大眾。最大的好
處是可以增加網友互動,降低伺服器負載。

未來我們可以期望即時網頁技術普及,成為各個網站、服務的基
本功能。

即時網頁的第一個大問題便是即時搜尋(Real-Time search),即
時搜尋指的是當網頁內容一產生,就可以由搜尋引擎搜索到相關
的網頁內容。藉由網頁搜尋技術的進步,以及社群網站的使用者
攀升,我們可以利用即時搜尋找到即時的網頁動態。傳統的網頁
搜尋是藉由建立索引,並定期掃瞄網站達到這項功能。

實作的方法,我們可以猜想是藉由發佈網站(twitter)方面在使用
者發表一則訊息時,觸發遠端搜尋引擎的新增、更新相關索引,
達到即時搜尋的功能。至於是由發佈網站去觸發搜尋引擎更新,
或者是由發佈者的瀏覽器觸發?這類詳細的溝通協定就看各家公
司決定。

第二個即時網頁的問題,就是我們要如何找出、理解這類即時網
頁的意義(context),這些即時網頁資料是有用的嗎?可以被理解
的嗎?容易被誤解的?當我們找到某一個即時網頁資訊,可能在
成千上萬個對話、新聞、事件(文本, context)中出現時,如何找
到他所對應的正確對話、新聞、事件?

相關連結:

Real-Time Web 維基百科

twitter 搜尋大戰開打

Explaining the Real-Time Web in 100 Words or Less

推特(twitter)全站廣告一天的價值:新台幣一千六百萬元

2009年10月23日 星期五

推特(Twitter)全站廣告一天的價值:新台幣一千六百萬元

正當新聞報導隨著全球股市上漲,開始報導景氣走向恢復之際,民眾的感受一定還是有點距離。但是看看推特 (Twitter) 的全站廣告行銷出價,也許會讓人有景氣走向復甦的想像空間。

uSocial 為推特的全站廣告出價五十萬美金,換算現在新台幣匯率 1:32 換算就是一千六百萬台幣,只買推特一天的網站廣告。

Twitter 協同創辦人 Evan Williams 日前表示,twitter 的最大價值在於手機用戶平台,公司的重點仍在改進服務及提供更好的技術平台供手機用戶使用,而不會將重點擺在如何獲利。

Evan Williams 表示將來會對於品牌商在 twitter 上的商業行為收取費用。

這項高達新台幣一千六百萬的廣告交易,是繼 Twitter 在與 Google, Microsoft 簽約加入兩大搜尋引擎搜尋結果,成為即時訊息網路後,首次有廠商開價想在推特打廣告,建議使用者 follow 廣告主帳號。但這樣的廣告行為可能被大多數使用者認定是垃圾廣告。

參考文獻:
  1. Twitter offered $500,000 to run advert

2009年10月18日 星期日

PS3, Xbox 360 將提供動作感應附件

微軟跟 Sony 因應不景氣將主力遊戲主機 (console) 產品週期往
後延兩年
之後,現在又傳出延用原有 Xbox 360, PS3 的另一種獲
利方式,就是仿造任天堂的 Wii 動作感應賣點,附加額外的配件
達到跟 Wii 一樣可以由動作感應玩遊戲的方式,作為原有既定的
升級、但是又不用更換整台主機(Xbox 720, PS4?)情況下的最佳
解。

雖然就商業模式上兩家大廠就是 copy 任天堂的方式,不是很有
創意的做法,但在消費者的角度來看,我們可以預期有更多好玩
的動作感應遊戲可以玩。

相關連結:

The Changing Face of the Console Wars

The Motion Controller War - A Next-gen console war by any
other name

2009年10月15日 星期四

遠端移除電腦資料的程式

資料移失的問題,在筆記型電腦普及之後,變成常見的安全問題
,但在雲端運算這個名詞如此盛行的時代,也許我們該先想到的
是,資料該統一儲存在安全的遠端、雲端的伺服器裡就好,不需
要下載儲存在筆記型電腦。

但由於雲端計算的技術喊得大聲,實際上卻尚未普及(除非公司
員工都積極採用 Google 服務 :),這種隨著筆記型電腦移失衍生
的仍然時有耳聞。

英國 Lancashire Care NHS 基金會員工存有病患相關隱私資料
的筆記型電腦,在車上、家中、旅館房間中被竊賊偷走後,使
Absolute Software 軟體,將已移失的筆記型電腦中敏感資料
刪除免除了資料移失危險,並且定位出被竊筆記型電腦,成功
抓到竊賊。

相關連結:

Stolen NHS laptops recovered - no data breach thanks to remote
wiping

2009年9月28日 星期一

Randy Pausch 演講

Brick walls let us show our dedication
擋在前面的磚牆障礙,只是為了證明你有多執著於目標,他們是為
了區別我跟和那些並不真心想完成兒時夢想的人而存在。

2009年8月21日 星期五

閱讀:異數

這是另一本討論成功的書,除了本身能力、個性、努力之外,書
中以統計資料說明身家背景、貴人相助的重要性。

關於個人努力,可以控制的部份:
個人努力方面,是第二章的一萬個小時的努力,如果我們每天以花
8 小時學習、練習自己的專業技能,大概要花 4.8 年,也就是
假設
你每一天都花足八小時,扣掉周休二日的話,約 4.8 年,四年又九
個月半。而書中以不周休二日、每天平均三小時算,則需要 9.13
年之久。

講到家庭教育的部份:

家庭教育上,中產階級的父母會跟孩子講理,而不是單純以權威脅
迫來教育小孩
不介意孩子頂嘴、願意跟孩子商量、歡迎小孩向權
威挑戰,孩子成績不好會認為是老師的問題而出面干涉。
不要成為
害怕權威,不敢為孩子主動爭取的父母


這點在台灣社會的評價是:教改新亂象?會認為是家長有問題,因
為家長也需要自負責任,不能只是怪學校、怪老師。這點可以跟後
面作者說的文化背景束縛一起看。

但在稍後作者也提到:

協同式的培養來教育小孩,積極評估孩子的才華、意見、技能,然
後努力培養


當然你也可以採用自然放任的態度,會讓小孩比較乖巧、獨立、少
發牢騷、比較會創意的運用空閒時間


但是仍然建議密集時間安排、常接受不同經驗的刺激、找機會學習
團隊合作, 對壓力的適應力比較強,這樣的小孩知道如何跟大人
應對,如何為自己講話、抒發己見,比較有理所當然的感覺,講起
話來理直氣壯


這兩點作者列出時並沒有明確說哪一種教育下的小孩比較容易成功
,但是在後面會提到第二種教育,家庭背景好的小孩比較容易成功
。第二種教育的小孩比較會:

知道自己有權追求個人想要的東西,積極與他人互動分享是很自
然的事,也希望別人注意到他,瞭解社會的遊戲規則知道如何爭
取自己的權益,為了自己需求會對老師、醫生等權威人士提出合理
的特別要求


相反的第一種教育結果可能是:

與人保持距離、不信任別人、保守而拘謹,不知道如何得到自己想
要的東西,也不懂得順應環境


書中也提到找工作的三項條件作為指標:能力、個性、關係。

商場上,
家世階級的不公平待遇,暗藏大好機會,能夠把握這個
機會的人,就可以成為成功的異數


作者觀察成功者的特質在別人不知道的領域裡,埋頭苦幹,完全
沒想到要名震天下,到了產業革命時代來臨,成功就這樣被引爆。


這裡的別人不知道的領域,是指未曾有人發現、預料會開創的新產
業機會。需要有判斷產業興衰的常識。
出生在人口數谷底期的好處:競爭少,機會多。這也是講下一代。

講到工作的選擇時:
工作自主權、手腦並用、一分耕耘一分收獲,有成就感,腦力努力
就能回饋的工作,有這些特質的工作就是好工作。夠努力、敢表達
自己的意見、好好利用頭腦跟想像力,就能掌握自己的世界。

講到突破困境,你需要有:有說服力、動機夠強,就能排除萬難


接下來講到榮辱心與成功的關係,這點讓我有點震驚,也是需要自
我警惕的地方,不管是自我管理,與人相處,給小孩
生活環境都
需要考慮:
如果生活的環境不能高枕無憂,常常提心吊膽,就常常會做出兇狠
的姿態,讓別人知道他不是軟弱的,好欺負的,即使只是受到一點
屈辱也忍受不了


書中這段對榮辱心是偏負面解讀的,對成功來說是負面。XD如何避免災難避免災難的溝通方式,明確而清楚的表達意見,這跟各個文化裡對
權力階級的強烈與否息息相關,權力階級差距越小的文化,比較能
夠集合眾人的能量與合作、溝通、協調避免災難發生,通常災難除
了一連串錯誤外,主要還是因為溝通協調上有重大問題才會引爆



最後回到個人可以控制的部份:

成功者的共通點就是努力,種稻的智慧就在從貧窮,困苦中找到意
義。學習的秘訣:除了能力以外,主要是在努力、認真、勤奮的態
度,只要願意花時間努力嘗試就會學好。


這些多花的時間,就是我們為了成功付出的部份,必須脫離部份的
身份,擺脫傳統、權威的束縛,而不墨守成規,得以臨機應變


再來是談到理想的學校教育,與教育目標:
學習除了耐力,還包括學習動機、誘因和回饋,課程設計是否有趣
,還有自律。學習如何撐下去,自我控制。要有充裕的時間思考,
老師可以慢慢解釋,學生也有時間思考、消化和複習,較慢的學習
腳步會比較有效果。
學生可以好好享受在學習中遊戲的樂趣。信念

人生有無限的可能,要挑戰極限。

亞買加短跑選手 Usain Bolt 在 2008 奧運 100m, 200m 短跑
除了
雙雙奪冠外並打破世界紀錄,也打破世人認為世界短跑紀錄已到
極限的迷思。 Usain Bolt 成了另一位超越人類極限的真超人。

心靈
感謝生命中的貴人,與機會。抱懷感恩的心。

總結呼應前言:
成功除了個人的努力以外,也受到歷史、社群、機運、文化優勢組
合而成的因素影響。

相關連結:

異數

相關文章:
找到讓你專心的絕對領域

成功的十項必備技能

失敗的力量

從跌倒的地方站起來

經營網路社群

給 startups 公司的十三項建議

2009年8月16日 星期日

來噗我吧 PlurkIt! Firefox 書籤工具

Maiio 米窩網站看到推文到 plurk 的連結,於是把她直接放到
Firefox 書籤工具列上,可以方便把瀏覽網站時看到想摘的文章放
到自己的 plurk 上

PlurkIt!
將上面的 PlurkIt! 拖拉到 toolbar 工具列後,只要逛到想噗的網頁
,或者是點到某一噗的網頁要 replurk,就點擊工具列上的
PlurkIt! 就可以跳新視窗到 Plurk 網頁,方便貼文。當然你可以改
成自己喜歡的字樣。

2010/02/11 update

鑑於有些網址多了很多純紀錄用的參數,在這裡新加另一個把單
純網址,消除問號以後的參數列,只是把原本的 PlurkIt! 稍加修
改。但有個問題是有些網址還是需要用參數來分辨不同網頁,這
時就還是要用原本的 PlurkIt!

PlurkIt!2


相關文章:

Plurk rss feeder api in python

Google Trends Website 工具列 GTW-js

Alexa traffic rank 工具列 Alexa-js

2009年8月6日 星期四

非洲的澆水冷卻系統 Zeer Pot

非洲當地人民沒有足夠的電力與財力來負擔現代人視為理所當然的電冰箱,他們倚靠的
是稱為 Zeer Pot 的母子雙層陶甕,兩層陶甕之間用砂子填滿,將需要保存的新鮮食物放
在裡面的小甕內,蓋上蓋子,再每天固定給兩層陶甕之間的沙子添加水,藉由水散發的
水蒸氣為內甕中的新鮮食物冷卻保鮮。

最多可以為食物保鮮長達 18 天。

這項古文明的冷卻技術直到 2005 年才開始廣為人知

相關連結:

The Zeer Pot (有 Zeer Pot 原圖)

Ancient technology preserves food

什麼是蒸發冷卻