2009年6月3日 星期三

三庫連走。活著真好

時間:2009/06/01

端午節連假結束的第一天,請假。

上次騎車是什麼時候?如果扣掉一兩次的寶二練習,應該是年初的峨眉湖吧。很久很久以前的事了。

原本預計要騎苗栗仙山,一起床就很墮落地打了一整個早上的電動。下午臨時改成水庫連騎。

本日心得:對水庫要存敬畏之心!不要看到水庫就想環它,不是每個水庫都像寶二,繞一圈輕輕鬆鬆十公里就打發了。運氣不好沒頭沒腦看到石門水庫就要去環,還只準備一小時的時間,在羅馬公路上是會哭出來的。

幸好,永和山水庫不是石門水庫。

早上大致規劃了一下路線,中興路轉學府路上寶山水庫,走竹40接竹43,到峨眉湖,然後接台三線,到三灣時接苗17-3,然後接苗5繞永和山水庫一圈,接回台3;回程時走苗20,接苗20-2,接竹41,從峨眉出來接台3,到達北埔時再上寶二,然後很快樂地回家。

事。情。不。會。這。麼。順。利。的!

到峨眉湖的路上次走過,不會迷路。但是一到峨眉湖後就開始認路之旅。原本預計是竹43接竹81接苗竹18,然後接台3,結果查地圖時,一時疏忽,沒注意到竹81,所以竹43就一直走下去接台3,大埔水庫只走到一點點就從台3線冒出來了。

 

IMG_1267 路邊某間廢棄廠房,好久不見的標語

 

到了三灣後,原本一直在找苗17-3,看到有老街的路標,直接右轉進去,走了一段後,看到三灣國小的… 不知道是不是校門口;旁邊有一間五穀廟,再往前的一個交叉路口,看到永和山水庫往右的路標,可是沒看到苗17-3,姑且相信路標,右轉後看到一座橋,現在應該是枯水期,橋下的溪水只有一點點,河床大部份都是小石頭。原本以為這就是永和山水庫,預計往前騎個十分鐘就可以回頭了。

十分鐘?太天真了!

這條只是中港溪,要看到永和山水庫,還得上上下下幾段山路。

 

IMG_1269 三灣老街… 看起來好像就是一般的小街道 …

 

無知是幸福的,當時所能做的,只是埋著頭一直往前騎,中間有個地方在做拓寬工程,但不影響單車行進。

到達一個叉路口,上面的路標有點複雜,在這裡停了一下,判斷應該是繼續沿著苗17-3走沒錯。

再往前走五分鐘左右,看到了遠方的水庫現身了,確定路線沒有走錯。路邊正好有個地圖,靠過去一看,咦?這個路線怎麼沒有環湖? @@ 先照起來,說不定待會兒派得上用場。

 

IMG_1298 導覽地圖,不過沒有環完整個湖

 

接著又騎了六七分鐘,就看到永和山水庫的標誌了。往下看,可以看到水庫的大壩。仔細看,大壩上有很多很多的「水」字。

IMG_1308

接著就是一大段下坡,兩分鐘後就可以看到永和山水庫的大門了。

接著,如之前所規劃的,要找苗5了。騎著騎著,咦?東興橋?啥?過頭了過頭了。趕緊把剛剛路邊拍下來的地圖打開來看,回頭以後,要找到福德祠,然後右轉。瞪大眼睛一直在找福德祠,在右手邊找到了,小小的。再往前走一段,在一家OK旁找到了路,不過,那個路標被徹底遮住了,很難發現苗5就是這條。

右轉後,就開始折磨人的上上下下之旅,在此可以深刻瞭解到,為什麼之前那張導覽圖沒有這條看起來似乎是環水庫的道路;回來看地圖後才發現,去程6公里,回程變成10公里,而且一直都在山裡轉,從OK上山一直到下山,時間大約半小時多一點而已,但不確定有沒有走對路及天黑時間一直逼近的壓力,感覺時間似乎過了很久。

 

IMG_1324 苗五山腳山下的草屋

 

在老銃櫃登山步道旁,停下來照相時,雙腳的膝蓋出現抽筋的前兆,趕緊坐下來休息一下,幸好沒有抽起來。

自此,一直到回到目的地,雙腳都不敢太用力,深怕真的抽起來,我還在苗栗啊,要怎麼回三十公里外的新竹。

接到台3線後,在一家7-11旁看到苗20的路標,騎進去一段路後,看到苗20-1的路標,右轉後又騎了一段路,沿路都沒再看到路標,此時膝蓋又開始隱約要抽筋,停下來休息一下,慢慢牽了一小段上坡,再往前騎一小段,看到前方不遠有個大上坡,馬上決定更改行程,回頭沿著熟悉的台3線回家。

這應該是今天所做最正確的決定了;我走的那條路根本就是錯的!

地圖上畫的是苗20-2,我記成苗20-1,照地圖上所畫,我最後會騎到沒路,不會接到竹41去。

況且,在那個時間點和膝蓋的狀況,就算我真的找對路,也不一定能在天黑前離開山區。

接上台3線後,雖然還是有上上下下的坡,不過跟山裡面的坡比起來,算是有人性多了。

晚上六點半左右,到達北埔預備上寶二的叉路口,這裡決定直接放棄,繼續走台3回家。寶二那段路騎了非常多次了,沒必要在膝蓋狀況如此糟糕的情況下逞強。

回到出發的地方,晚上七點整,整個天色剛好暗下來,非常幸運。

 

計劃 原本預計要走的路線

 

實際 實際走的路線

 

 

騎乘距離:87.2 KM
騎乘時間:4:54:35
平均時速:17.75 km/h

2009年2月24日 星期二

為什麼有些書無法產生共鳴

昨天晚上,終於把去年買的《隱字書》 (原書名 Emdymion Spring, Matthew Skelton著) 讀完了。

這篇不是讀書心得報告,要交作業的可以跳過 XD

書背的折頁寫著,愛爾蘭獨立報的評價是,「這本書將威脅《達文西密碼》的賣座地位……真讓人愛不釋手。」

不論是達文西密碼,還是隱字書,不知道為什麼,看完以後總覺得少了什麼。
書本身不算難看,但總覺得失落,無法產生共鳴,似乎不明白為什麼評價會如此高。

剛剛洗澡的時候,突然領悟到一點:也許是文化的差異。

聖經對於西方人來說,是從小就深深刻印在腦子裡的既成印象,是真理,是與挑戰、質疑絕緣的事物。

也許在西方的國小國中歷史課本,就有教 Gutenberg 是活字印刷的發明人,是為了考試死背下來就對了的人名。

沒有相同文化背景的我們,在看這些書的時候,其實跟看銀河英雄傳說之類的架空小說,感覺並無兩樣。

換個位置想,今天你拿本火鳳燎原給外國人看,他可能分不出來跟北斗神拳的差別。

什麼?沒看過火鳳燎原?那換個例子。

如果有這麼一篇小說,裡面描述那些武將其實都是未來的機器人,劉備曹操孫權其實是坐時光機過去的未來人,諸葛亮是台超級電腦,華陀是一群爆肝死RD組成的團隊,幫關羽刮骨療毒只是售後服務,換根手臂而已。

任何一個中國人都看得出上面這個故事在惡搞,但是如果寫的夠生動,有創意,偶爾再抓幾個梗出來跟史實相呼應,說不定也可以大賣。

如果拿給一個沒讀過三國的外國人看,他會有什麼反應? "關羽? Who is he?"

當你好不容易把三國的歷史介紹完後,他會怎麼寫讀後心得?

"Sango is an advanced dynasty. There are many strong robot generals."

最後說不定還以為楊威利也是三國的人。

另一個無法產生共鳴的原因是,我們國小的課本教的是,發明印刷術的是中國人。

Gutenberg? 誰啊? Coaster? 那是誰? Emdymion Spring? 那又是誰?

2009年2月16日 星期一

Demo 之 Murphy’s Law

"Anything that can go wrong, will"

“如果有件事有可能會出錯,它就一定會出錯。”

 

不只!就連不太可能會出錯的,在關鍵時刻也會出錯!!

 

星期四到台北 Demo,之前已經演練了非常多次,測試了很久的時間,整個影像就是很順。真正到了 Demo 現場,機器架好,很有信心地把程式跑起來。

喵喵樂!為什麼昨天下午還跑得好好的程式,現在開始抖起來了!我的心也跟著抖起來了。

原本很順的畫面,現在變成會回頭;換句話說,就是人往前走,會後退抽一下,再往前走,再後退抽一下;嚴重的時候還會來回抽動好幾下。

把所有的設定全部檢查過,無誤;重新 reboot 再 run,照抖;全部的線重新接過,再抖。

火大換 CODEC,換成原本因為效能考量不 demo 的 H.264,咦?不抖了。見鬼了。

再換回 H.263,咦?又抖了,哪有這樣的啦!

在現場以為前一天 H.263 改到什麼東西,導致整個影像不正常。馬上決定改 demo 會卡卡的 H.264,至少畫面不會跳來跳去。

 

回到新竹後,開始查原因。查出來的時候差點飆淚:原因出在光線。

我們測試的環境,一向是在日光燈底下;當天 demo 現場是鵝黃色美術燈那種燈光,導致 webcam 認為環境很暗;又很巧,webcam 會自動隨著環境的光線調整光量;調整進光量的兩個因素,一個是快門,一個是光圈;webcam 的光圈已經固定,所以能動的只有快門;也就是說,光線越暗,快門的時間越長;快門越長,我們從下指令要從 webcam capture 一張畫面等待的時間要越久。

在每秒鐘 10 張 frame 的情況下,display 每 100ms 就會跑一次,只要 capture 並 encode 一張 frame 的時間超過 100 ms,就有可能發生 capture 一張,display 兩張以上的情況。也就是說,display 跑了兩次,會拿到同樣的東西。

照這麼說來,理論上畫面只會停在最後一個畫面,為什麼會跳來跳去?原因在於,實作 display 的同事,參考的 sample code,使用了 ping-pong buffer;簡單地說,buffer 有兩個,分別存了最後一張和倒數第二張的 frame;display 在存取時,會照著 buffer 1, buffer 2, buffer 1, buffer 2 的順序不斷抓 frame 出來 play。當 decoder 沒有資料寫入,把 buffer 更新時, display 就會一直抓到上一張、上上一張、上一張、上上一張;最後結果就是變成我們看到的,我又跳過來啦,我又跳過去啦,我又跳過來啦,打我啊笨蛋的情況。

 

所以,天時、地利、人和,缺一不可,在 demo 的時候,集所有不可能於一身的情況發生了,它就開始抖了。

 

再次證明了 Murphy’s Law 的真理。

2009年1月23日 星期五

在 Linux 下寫組語, 透過 int 0x80 使用 system call

使用環境:

  • Linux 2.6.24.1
  • yasm 0.7.1.2093
  • GNU ld 2.15.92.0.2 20040927

 

在 Linux 下,要使用 system call,可以透過 int 0x80 來完成。

首先,要先找出 system call 對應的號碼,後面會用到;號碼可以在 sys/syscall.h 中找到。如果看到 syscall.h 裡只有 include 其他 header file,請繼續追著這些 header file 往下找。例如,在我使用的機器上,sys/syscall.h include 了 asm/unistd.h,asm/unistd.h 又呼叫了 asm/unistd_32.h,最後在 asm/unistd_32.h 內找到了如下列的號碼

#define __NR_restart_syscall      0
#define __NR_exit                 1
#define __NR_fork                 2
#define __NR_read                 3
#define __NR_write                4
#define __NR_open                 5
#define __NR_close                6

..... (以下還有好多,省略)

如果你要使用 read() 的 system call,號碼就是 3 號,要用 open(),號碼就是 5 號,其他以此類推。

知道了號碼之後,正式進入如何透過 int 80 來使用 system call 的主題。

先來個 C 的簡單範例。

#include <unistd.h>

int main(int argc, char *argv[])
{
    char str[] = "Hello World!\n";

    write(1, str, sizeof(str));

    return 0;
}

上例中,我們使用了 write,將 str 字串寫到 standard output (就是 write() 的那個 1) ,也就是螢幕上。這個程式可以將字串內的內容顯示在螢幕上。

接著,一模一樣的事,我們使用 assembly code 來實現。

 

section .text
    global _start

_start:
        mov     edx,len ;message length
        mov     ecx,msg ;message to write
        mov     ebx,1   ;file descriptor (stdout)
        mov     eax,4   ;system call number (sys_write)
        int       0x80    ;call kernel

        mov     eax,1   ;system call number (sys_exit)
        int       0x80    ;call kernel

section .data

msg     db      'Hello, world!',0xa,0xd,0       ;our string
len       equ     $ - msg                 ;length of our dear string

 

在使用 int 0x80 之前,必須要將我們剛查出來的號碼填到 eax 內;填好後,只要一使用 int 0x80,相對應的 system call 就會被呼叫。

另外,system call 的參數要依序被放在 ebx, ecx, edx, esi, edi, ebp 等 register 內;以此例來說,一開始,我們使用 sys_write,查表得到號碼是 4 號,於是將此號碼填入 eax;接著,我們要將三個參數搬到對應的 register 內;參考 C 程式,write 有三個參數,分別是 1, string buffer 的位址,及 string buffer 的長度;這三個參數在呼叫 0x80 之後,也必須分別擺到 ebx, ecx, edx 內。全部擺好後,最後使用 int 0x80,噹啷~ Hello, World! 就顯示在螢幕上了。

最後,程式要離開,我們使用了 sys_exit,也就是 1 號的 system call,離開程式。

 

Reference: http://asm.sourceforge.net//intro/hello.html#AEN86

2008年12月28日 星期日

忠孝橋上的腦殘遊覽車

差點就沒辦法在這裡打字了。

昨天開車,很悠閒地在忠孝橋上往西,我的目的地是五股新五路下去;就在前兩個出口,也就是下去到化成路附近的那個出口,原本要下去的一台遊覽車突然無預警直接左轉插到我這個車道來。

是的,完全沒有預警,就跟嗑藥到一半突然High翻天,想說大爺我腦殘了,又沒錢買藥嗑,不知道突然切出去被人撞到能不能領保險費再買一打藥來嗑一樣。

第一時間反應,手按著喇叭不放,腦殘遊覽車耳朵似乎還沒有藥力影響到完全退化,直接停在我和他原本的車道上,我的車道被吃掉二分之一;眼角瞄了左邊車道,左邊有一台車,再瞄了一下左後視鏡,再後方一台車大約有幾公尺距離,踩煞車減速,等並行那台過去,第二台還沒到,迅速左切再右切回原車道,以上動作在兩三秒之內一氣呵成,似毫不拖泥帶水。(拜託,我用命換來的,讓我崇拜一下自己幾秒鐘行嗎?)

切過去以後,我後面那台也被嚇到,又是一聲「叭~~~~~」長音從後方傳來,遊覽車繼續插在車道上不敢動,一直到幾百公尺後,我從後視鏡看不到遊覽車了,他還是插在車道上不敢動。

在開車的當下,切過去的瞬間還沒有任何感覺,只想大聲在公堂之上問候他老... ;等到過去一段距離了,手心才開始冒汗,驚死我了。生眼睛沒看過有人缺保險費缺成這樣子的。

2008年12月23日 星期二

2008/12/22 單騎。峨眉湖

彌勒佛_廟_Fuji 

今日路線:走中興路往竹東,接上台三,到達峨眉湖後進去閒逛,然後出來,走竹43,再接到竹40,然後走寶山水庫回來。

原來考慮要從寶二下北埔,接到台三到峨眉,看了一下,走到竹東接台三的路多幾百公尺而已,可以避開寶二的幾個陡坡,遂決定今日路線。有點可惜的是,原本計畫要走竹49接到峨眉湖,中間找不到竹49的叉路,直接台三一路騎到目的地了。

下午兩點多,從宿舍出發,天氣還不錯,有陽光,但氣溫低,風也很大,幾次被突如其來的側風襲擊,幸好把手都還握得蠻穩的,沒摔。

台三線一路上上下下的,不過坡度都不大,一路上慢慢騎,轉進竹43,到達峨眉湖旁的富興老街時,已經快四點了。

今天是非假日,整條街上冷冷清清,幾乎看不到人;峨眉湖也是,騎了一小段的環湖道路,除了一台遊覽車外,似乎沒其他的遊客了。

老街不大,隨意繞了一圈,回來後的印象只剩隆盛宮和富興國小。另外,從富興國小旁的一條小路直走,可以接到細茅埔吊橋,吊橋橫跨峨眉湖,景色很漂亮。

隆盛宮

 

細茅埔吊橋 
細茅埔吊橋

 

吊橋看峨眉湖 
吊橋上的景色

 

拔河 
富興國小旁,最後這個壓隊的表情很生動

到過峨眉湖的人,一定會對巨型彌勒佛有印象。彌勒佛旁有工程正在進行,看起來好像是寺廟,而且是間很大的廟。

彌勒佛 

彌勒佛有多大?我在回程的時候,走竹43,上山以後,走了一段距離了,在一個空曠處,還是可以很清楚地看到遠方彌勒佛的身影。

遠眺彌勒佛

今天出門時間太晚,在峨眉湖逛不到半小時就擔心,可能會天黑騎山路,決定返程。走到竹43和竹40的交界,才知道原來峨眉湖這麼近;之前騎過寶山水庫→雙溪國小→園區→回竹東這條路,在竹40和竹43的交界處,原本路線是右轉,其實左轉騎個三點多公里,就到峨眉了。

不過,今天出門的時候,忘了帶食物,原本習慣會攜帶的Energe In和小羊羹,一條都沒帶到。一彎進竹40以後,才警覺到血糖似乎開始降低,到了警察局和農會的那個交叉路,大上坡爬到一半就開始有點暈眩現象,手腳開始無力,頭一次體驗到血糖低到一個程度的感覺,原本看來平常的坡,不知怎麼,腳就是使不出力,後來乾脆下車牽這段陡坡,節省一些體力,以免剩下的一小段路躺在路邊。

過了寶山水庫,下山以後,剛好天黑,幸好這段路騎過很多次,否則在沒有補給品的情況下,天快黑了,氣溫低,如果再加上不知道路況的話,應該會很焦急。

下次早點出門,規劃個三水庫 (寶山、寶二、大埔) 之旅好了。慢慢騎,而且要記得帶食物。

峨嵋湖

峨嵋湖_高度圖

里程:46.34 KM
時間:2:22:35
平均時速:19.50 KM/H
最大時速:57.95 KM.H

2008年12月16日 星期二

尖山路上寶二

昨天請假。下午三點左右看天氣不錯,決定找找傳說中寶山水庫接到寶二水庫的小路。

竹東中興路走到二重埔,在7-11右轉接上學府路,接著就是一連串上坡,到了頂端,左手邊有一條尖山路,再往前一點點有一座廟。平常練車路線是繼續直行,今天則是左轉進尖山路。

尖山路

轉進尖山路以後,路變得窄窄的,而且一直到接上寶二水庫的環湖道路之前,路只會越來越窄。如果是四輪的就不要開進來受苦了。

往前走沒多久,出現一個叉路,右邊那條一路往下,左邊這條向上,且路面上有「往水庫」的白色噴漆,很明顯,選左邊走。

左邊上坡走了一段之後,右手邊可以看到寶山水庫一角。

寶山水庫一景

中間那個細長的水塘就是寶山水庫,看起來似乎很小,寶山水庫確實不是很大,但也沒小到這種程度;其實寶山水庫並不是一大塊圓圓的湖,這裡看到的只是一小部份而已;看後面的軌跡圖,會對寶山水庫的形狀有個概念。

接著是一個大下坡,下到底會接到碧湖吊橋;寶山水庫有兩座吊橋,一座是寶湖吊橋,另一座就是這座碧湖吊橋。

碧湖吊橋
碧湖吊橋

IMG_1355 吊橋上的景色 (2009/06/03補拍)

過了吊橋以後,右轉會繞著寶山水庫走,左轉會到寶二水庫;今天的目標是寶二水庫,因此,選擇往左走。

從這裡開始,才是真正的主菜。一左轉,馬上就瞭解什麼叫做陡死人不償命,也體會到什麼是抓著把手用力踩踏,擔心隨時會後空翻的感覺。用力踩上去的時候,偷偷看了一下時速,用這麼大的力量,竟然只有時速 6.5 公里的速度,下來牽車說不定還比較快。

好不容易爬上去以後,馬下就是個下坡,這個下坡也很討厭,路不是很大條,也不是很平整的柏油面,不敢放手盡情滑下去,按煞車又有點煞不住的感覺,最後一小段乾脆下來用牽的;好久沒牽車了,竟然是在這種陡下坡破功。

後來回來看軌跡圖,才知道剛剛翻過了一座小山,而且是最近的直線距離,直上直下。

再繼續往前騎,會遇到一個豬舍,養了幾隻狗,在這裡我速度故意放很慢,狗也很配合地朝著遠方故意吠了幾聲;「看到有人來要盡責叫出聲來,可是對方這麼慢,又怕他隨時下車來揍我,只好對著遠方叫」;真是難為這幾條狗了。

再往前走,又出現叉路,沒有路標;判斷一下,覺得左邊的路比較像是主要的道路,選擇左走,回來查地圖,還真的走對了。

再往上騎一段,終於接到了比較大條的路,這裡是一個 T 字路口,路面是很平的柏油路,路旁圍牆下面就是水庫;在這裡遇到一男一女,問了一下這裡是不是就是寶二環湖道路,得到了肯定的答案;低頭看了碼表,才五公里多的距離,比平常的距離少了一半以上,果然是捷徑。

上了環湖道路後,回頭看了一下往鑽出來的路,如果不是從這裡冒出來,我可能騎了一百次的環湖道路,也不知道這條小路可以接到寶山水庫。這裡的位置在環湖道路 2.x 公里的地方。

寶山叉路

回程的時候偷懶,還沒到水庫管理局,在中間的竹45就彎走回家了。 :p

回程的路上,經過寶山水庫的標誌後,右手邊會看到有個小步道,往小步道彎進去一直走,會到寶湖吊橋,並且會接到碧湖吊橋,最後會從尖山路冒出來。順手照了張步道圖回來,下次有機會的時候再來走一次。

寶山水庫步道
寶山水庫步道圖

步道圖下方的種福堂就是我們今天起點的地方,從尖山路彎進去,會接到碧湖吊橋,過了碧湖吊橋後,如果右轉,就會照著步道圖繞一圈,最後從右邊有左字的地方接回馬路。

今天總里程才 15 公里而已,比平常少了六、七公里,但是卻累很多;主要是因為從尖山路彎進去以後,出現大量的上下坡,且坡度都不小,需衡量一下自己的體力,爬不上就下來牽吧,隨便一段陡坡都可以耗掉很多體力。另外,路不大條,路面偶爾也會不平,下坡請千萬小心。要練體力的,這條路倒是個不錯的選擇。

夕陽
回程的夕陽;對著強光照會出現不明紅塊狀 XD

軌跡

里程:15.27 公里
時間:55 分 44 秒
平均時速:16.44 KM/H
最大時速:46.07 KM/H