« October 2006 | 主頁面 | December 2006 »

November 29, 2006

Internet Explorer 的 CSS Rendering Bug

IE6_CSS_Wired.png

昨天把 Movable Type 更新到 3.33 版, 想裝上 EnhancedEntryEditing 這個 plugin, 讓我們寫文章的時候可以用比較方便的編輯器來輸入. EnhancedEntryEditing 是一個利用 TinyMCE當作 Movable Type 編輯器的 plug in, 而 TinyMCE 則是一個用 JavaScript 寫的編輯器, 它可以讓網頁上的輸入區有像 Word 般的編輯能力.

幾年前開始用 So-net 的 web mail 時, 就覺得它的編輯區很神奇, 現在終於知道是怎麼一回事了, 原來都是 JavaScript 的功勞.

不過當我把 EnhancedEntryEditing 裝好後, 我的文章編輯頁 layout 居然跑掉了. 本來應該在功能表右邊的編輯區, 居然被擠到下面去了...

 

更有趣的是, 我在 Firefox 裡開同一個頁面, 沒有問題, 正確顯示, 像這樣:

Forefox_CSS_OK.png 

這突然讓我想起一個老問題: 微軟的 IE 在計算 CSS 裡的寬度屬性時, 沒有照標準來. 我用一張圖來說明這個問題好了, 這張圖是從微軟的 MSDN 網站來的, 出處在這裡.

 IE6_Width_Rendering.gif

微軟自己招了, 在 IE 5.5 之前, 它的 browser 計算 "width" 這個 CSS 屬性時, 連 border 跟 padding 的寬度都一起算進去了, 但是照 CSS 的標準, width 指的是 block 物件本身的寬度.

這會造成的問題就是: 如果我設計一個 div, 設定它的寬度是 200px, border 是 50px, 在 IE 裡面我會得到一個大小是 100px, 連 border 總共寬 200px 的 div. 但是在 Firefox 裡, 我會得到一個連邊框總共寬 300px 的 div.

我猜是這問題造成 EnhencedEntryEditing 的版面 layout 混亂. 從圖上看來, 應該是編輯區在 rendering 時, 算出來的寬度超過它的 container 寬度, 放不下, 所以整個 container 就被往下擠了. 在 Movable Type 附的標準 CSS 裡, 針對 IE 的這個問題有一堆修正的 code.

靠近一點來看:

  

編輯區右邊的細框看起來比上面搜索文章的 banner 要凸出去一點點, 可能就是因為這個原因讓它的 layout 爆掉的. 在 Firefox 裡, 右邊界看起來是完全對齊的.

這種時候, Firefox 內建的 DOM Inspector 就超好用的, 它可以用來觀察版面上的每一個物件對應到 CSS 裡的哪個物件, 是什麼 ID 或是哪個 CLASS, 還可以直接看到 CSS 裡設定的屬性, 以及自動計算出來的屬性.

我用 DOM Inspector 從 <body> 一路往下找, 先找出整個 Movable Type 的畫面是被包在一個 class 是 .body-wrap 的 DIV 裡, 寬度是 750px. 這就是整個畫面的寬度.

.body-wrap  下面有兩個 DIV, 左邊的功能表用的 ID selector 是 #nav, 寬度是 110px; 右邊的的編輯區是一個 class 叫 .body-nav 的 DIV, 寬度是 625px. #nav 沒有設 margin, .body-nav 的 margin-left 是 15px, 所以這兩個東西中間空白的 15px 是算在 .body-nav 的帳上, 加起來剛好 750px, 不多不少. 所以只要有人出了一點點錯, 版面一定會亂掉.

IE 跟 Firefox 還有一個不一樣的地方是, 如果我設定一個 DIV 寬度是 625px, 但是它裡面包住的東西大於 625px, IE 會自動把外面的 DIV 變大, 但是 Firefox 不會. 我現在遇到的似乎是這個問題, 在 IE 裡面, 編輯區看起來明顯地 625px 多了一點點. 也就是說, 雖然 .body-nav 在 CSS 裡設的 width 是 625px, 但是因為裡面的東西比較大, 所以 IE 就把 .body-nav 的 width 調大了.

是誰把它撐爆了的 ? 應該是 EnhancedEntryEditing 的編輯區, 因為編輯區的大小在 IE 跟 Firefox 裡看起來不一樣. 我本來以為在 EnhancedEntryEditing 的 script 裡, 寬度是設死的, 我可以在 script 裡直接改它的寬度, 把它改小就好了. 沒想到去挖了 EnhancedEntryEditing.pl 後, 情況遠比我想像的複雜. 它似乎會去問 container 的寬度, 然後來決定自己的寬度.

如果是這樣的話, 它在 IE 問到的寬度, 就會跟在 Firefox 裡不一樣囉. 如果有設 padding 的話, 同樣的 width 設定下, 在 Firefox 裡問到的寬度是 width 減去左右 padding, 會比在 IE 裡問到的要小. 如果 script 在 IE 裡問到了比真正需要還大的寬度, 它就會把自己設得太寬, 讓 container 爆掉.

以上只是我的猜測, 因為 EnhancedEntryEditing 的 JavaScript 實在太複雜了, 我沒辦法搞懂它決定寬度的方法. 不過既然知道是 padding/border 計算方式不同惹的禍, 那就好辦多了, 我直接把編輯區 container 的 padding 縮小:

MT_stylesheet_vi.PNG

這樣左右各少 5 點, 總共少了 10 點, 果然塞得下了, 版面的問題解決啦.

另外根據微軟自己的說法, IE6 會根據 HTML 裡的 !DOCTYPE 宣告來決定要用哪種方法去計算 CSS 的寬度, 下次再來試試這個解法.

November 27, 2006

Movable Type 驚魂記

我們的部落格是放在家裡的 server 上跑, 而且還是在 server 上的 VMware 裡, 因此總是覺得它的速度不夠快. 再家上 Movable Type 是用 Perl 寫的, 所有的動作都是即時解譯的, 想也知道很沒效率. 架設這個部落格時, 我為了省麻煩, 就直接用 Linux 裡內建的 Berkeley DB 當作資料庫後端, 沒有另外架別的資料庫. 昨天聽信了一帖偏方, 聽說把資料庫換成 MySQL 會讓 Movable Type 的效能大大提升, 就動手試了.

沒想到這是一場惡夢的開始...

事情是這樣開始的: 要用 MySQL 當資料庫, 當然就要先裝 MySQL. 我用 apt-get 去抓 MySQL:

[bird@www bird]$ apt-get install mysql

但是 apt-get 告訴我說, 我的系統裡面同時存在兩套版本不一樣的 db4 套件, 要我先解決這個版本衝突的問題再裝 MySQL. 這個 db4 就是 Berkeley DB 的套件名稱啦, 為什麼會有兩套呢? 我用 rpm 看了一下:

[bird@www bird]$ rpm -qa | grep db4

結果真的看到兩到 db4:

db4-4.1.25-0.rh73.3.1
db4-4.0.14-20

我依稀記得那時裝 Movable Type 時, 去抓了一個 db4 的 rpm 套件回來裝, 後來才發現原來 Linux 裡面原來就有 db4, 而且 rpm 是靠 db4 在運作的. 不過既然這兩個套件並存在系統裡安然無事, 我也就沒有再去管它.

apt-get 還告訴我, 可以用 apt-get instll 後面不加任何套件名稱來嘗試修復這個問題, 我那時沒有很仔細看完它的說明, 就照著打.

這是我犯下最大的錯...

apt-get 不知道拔掉了我系統裡什麼跟資料庫有關的東西, 但一定不是 db4. 因為我等 apt-get 跑完後, 再用 rpm -qa 看一次, 發現還是有兩套 db4, 而更糟的是, Movable Type 不能跑了.

當我執行 mt.cgi 時, 它會自動 redirect 到 mt-upgrade.cgi, 而且不管我用什麼帳號密碼, 都是 invalid login. 也就是說, 我進不了 MT 的管理畫面了.

***

我開始覺得, 事情有點大條. 如果無法登入 MT 的管理畫面, 我什麼事都不能做. 我甚至不知道 MT 賴以工作的資料庫還是不是好的.

幸好我還有整個 /var/www/html 目錄的備份, 而且還是新鮮的. 我先把目前的 html 目錄 mv 成別的名字, 再從 tarball 裡把 html 目陸解過去.

MT 還是不能跑.

所以不會是資料庫損毀的問題, 一定是系統層面的問題. 我試著跑 mt-check.cgi, 看看有沒有什麼 MT 需要的套件掛掉了. 不過它告訴我一切安好. 不過我很意外的發現, mt-check.cgi 並沒有去檢查系統裡有沒有 db4, 它只 check 一個叫 DB_File 的套件. 我查了一下, DB_File 全名叫 perl-DB-File, 它是 db4 對 Perl 的前端.

[bird@www bird]$ rpm -qa | grep perl-DB_File
perl-DB_File-1.804-88.3

我的系統裡面有這個 perl-DB_File 套件, mt-check.cgi 也告訴我沒有問題.

但是 MT 還是不能跑.

***

這時有個小插曲. Sharon 從 MSN 上捎來訊息, 說阿爽日記的留言功能不能用. 因為 MT 產生的頁面基本上是靜態的, 所以已經產生的頁面都還看得到. 但是迴響會用到 mt-comment 這隻 CGI, 也會動到資料庫, 所以會沒辦法跑.

我決定來挖挖看資料庫到底有沒有問題. 問了一下 Google, 有個套件叫 db4-utils, 是 db4 的 command line utility, 有一些工具可以 dump 資料庫的內容. 但是 db4-utils 也有不同的版本, 我的系統裡有兩個 db4, 我該裝哪一版的呢 ? 我叫 apt-get 幫我決定, 結果它抓了 db4-utils-4.0.14-20, 比較舊的那一個. 我開始懷疑我當初到底是怎麼把 db4-4.1.25 那個套件裝上去的...

我用 db4-utils 裡的 db_dump 去看 MT 產生的 .db 檔, 沒想到它給我一個錯誤訊息, 說版的 db4-utils 不支援這個資料庫的 btree 版本. Oh my god, 到底是誰太舊, 誰太新呢 ? 我記得在 MT 的討論區上有看到有人在討論不同版本的 db4 產生的資料庫檔案, 彼此之間不能相容的問題.

開始有一線曙光了. 看來是兩個不同版本的 db4 打架的問題.

我把 db4-utils-4.0.14.20 拔掉, 另外去抓了 db4-utils-4.1.25 裝上. 果然用這個版本的 db4-utils 就可以看到資料庫的內容. 所以至少我確定, 原來我的 MT 用的是 db4-4.1.25 來產生資料庫. 為了確定我的想法正確, 我試著用 rpm 把 db4-4.0.14-20 拔掉, 但是我發現這似乎不可能, 因為這一版的 db4 有一大堆的 dependency, 包括 rpm 在內都是靠它運作的, 因此根本拔不掉.

但是我的系統裡還有一套 4.1.25 版的 db4, 我怎麼知道 MT 會用哪一版的 db4 呢 ? 它是怎麼決定要用哪一版的 db4 呢 ?

***

我突然想到剛剛在跑 mt-check.cgi 時, 它顯示的那個 perl-DB_File 套件, 它是 Perl 用來乎叫 db4 的界面, 會不會是由它決定的呢 ?

我上網路去查 rpm search, 看一下我目前用的這個 perl-DB_File-1.804-88.3 有哪些 dependency. 啊哈! 被我抓到了, 它的 dependency 裡有一個

libdb-4.0.so

看名字也知道這是 db4 4.0 版的 shared object. Shared object 是 Linux 上的動態連結 library, 就像 Windows 的 DLL 一樣. 不過 Linux 的 shared object 除了檔名外, 還用到 soname 這個屬性來識別相容性, 如果不同檔名的 so 檔之間有同樣的 soname, 它們在動態連結時還是可以互相替代的.

[bird@www lib]$ cd /lib
[bird@www lib]$ ls -l libdb*
-r-xr-xr-x 1 root root 5512945 2月 6 2003 libdb-4.0.so
-rwxr-xr-x 1 root root 823045 7月 11 2003 libdb-4.1.so

我的系統裡真的有兩個 libdb, 來看看它們的 soname:

[bird@www lib]$ objdump -p libdb-4.0.so | grep SONAME
SONAME libdb-4.0.so

[bird@www lib]$ objdump -p libdb-4.1.so | grep SONAME
SONAME libdb-4.1.so

好, 這兩個 shared object 的 soname 是不一樣的, 我現在可以合理, 強烈, 高度懷疑, DB_File 乎叫的是 4.0 的這個, 而原來的資料庫是用 4.1 版的建立的. 從 db_dump 4.0 版不能讀 4.1 版的資料庫檔案來推斷, 這兩個版本的資料庫是不相容的.

現在我剩下一個問題: 要去哪裡找可以用 4.1 版資料庫的 DB_File ? 我要找一個會去呼叫 libdb-4.1.so 的 DB_File, 而不是現在這個. 我上 rpm search 去一個一個看, 看看哪一個 perl-DB_File 有 libdb-4.1.so 的 dependency.

有這個 dependency 的 perl-DB_File 還蠻多的, 但是都不是 RedHat 用的, 我裝了 Mandrake 的上來, 發現不能用, MT 根本就認為我沒裝 DB_File. 最後在某個網頁的角落找到 perl-DB_File-1.804-88.4, 而我原來用的是 perl-DB_File-1.804-88.3, 它們真的只差小數點後很多位的一位, 但是卻決定了 Movable Type 的生死.

我把 1.804.88.3 版的 DB_File 拔掉, 裝上 1.804.88.4, MT 就可以跑了.

***

但是我還是沒搞懂的是, 為什麼我的系統裡只剩下 perl-DB_File-1.804.88.3 呢 ? 那原來的資料庫是誰建出來的呢 ? 應該是 apt-get 搞的鬼吧...

November 19, 2006

我的 Geotagging 方法 之二

昨天我們用 WWMX Location Stamper 把經緯度寫到照片的 EXIF 裡了, 今天要來看看怎麼玩它.

先來確定一下, GPS 的經緯度有寫到 EXIF 裡. Windows 的檔案瀏覽功能不認得 GPS 的 EXIF tag, 所以看不到, 要用 ACDSee 之類比較厲害的軟體來看:


ACDSee-1.PNG

如果有的話, 在 ACDSee 的 EXIF 頁面上為看到有 GPS 的資訊.

今天的主角其實是 Picasa, 這是 Google 出的照片管理軟體. Picasa 的官方版目前還是 2.0, 但是英文版的 2.5 已經到處在流傳了, 而且多了很多很棒的功能, 其中有我最想要的, 跟 Google Earth 結合的 geotagging 功能.

目前知道的下載點在這裡, 我抓下來的版本是 V.2.5.0, Build 32.97, 0. 它還是英文版的.

Picasa 裝好以後一定要搜一搜你的電腦, 建立關於電腦裡所有照片的基本資料. 你可以讓它去搜整台電腦, 也可以只搜 My Documents 跟桌面, 就是不能不讓它搜...

進入 Picasa 後, 所有它找到的照片會依照日期排好, 一個一個 album 出現在它的瀏覽器裡. 用日期找一下我昨天用 Location Stampler 標過的照片, 找到了:


Picasa-1.PNG

跟其它的照片不太一樣, 它的右下角有一個長得像準星的圓圈, 那就對了. 這個符號代表這張照片的 EXIF 裡面包含有 geotagging 的資訊.

按右鍵選 Property, 看一下這張照片的資料:


Picasa-1b.PNG

果然它裡面有 GPS 的經緯度和高度. 因為 tagging 時的 GPS 航跡是用 eTrex Vista TC 記的, 所以這個高度是氣壓高度計量出來的, 還蠻準的. 如果是 GPS V 記下來的航跡, 那個高度是 GPS 算出來的橢球高, 就沒什麼參考價值.

最棒的功能來啦, 在 [Tools] -> [Geotag] -> {View in Google Earth], 點下去後 Picasa 會把 Google Earth 叫出來, 當然前提是電腦裡已經裝好 Google Earth 了.


Picasa-2.PNG

Google Earth 啟動並 login 完成後, 衛星空照圖的畫面就會出來:


GE-1.PNG

剛剛 Picasa 裡面有 geotag 的照片一一出現在 Google Earth 上, 照著它們的經緯度排排站. 而且當你 zoom out 地圖的時候, 只要 Picasa 裡的照片有出現在 Google Earth 的視野內, 它們都會一張一張跳出來. 顯然這不是一個 KMZ 或 KML 檔做得到的, 我們來看看 Picasa 放了什麼東西到 Google Earth 裡:


GE-2.PNG

原來它是一個 Network Link, 透過在某個 lcoal port 上的 HTTP 協定跟 Picasa 拿資料呀, 難怪可以動態更新. 這個方法比 RoboGEO 等軟體產生一個把照片鑲在裡面的 KMZ 檔要好太多了, 最大的好處是不管照片再多, 都不會有一個肥大無比的 KMZ 檔在那邊佔空間.

照片點下去會出現比較大的視窗, 讓你看清楚一點:


GE-3.PNG

另外也有連結讓你點, 可以到 Picasa 裡看原圖.

我個人是認為這樣的組合比 RoboGEO 用產生 KMZ 檔的方法要好太多了. 當照片越來越多的時候, KMZ 檔的管理會變成很大的問題, 如果把照片嵌到 KMZ 檔中, 檔案的 size 會變得很大, 產生 KMZ 檔的時間也會變得很長.

Picasa 也有產生內嵌圖檔 KMZ 的功能, 在 [Tools] -> [Geotag] -> [Export to Google Earth File], 它會把目前所選取的圖檔包在一個 KMZ 中, 吐給 Google Earth.

目前 Picasa 2.5 版還在 beta, 不知道有沒有穩定性的問題, 希望中文版 final 趕快出來.

November 18, 2006

我的 Geotagging 方法

因為前幾天老爸問到如何在照片中標示 GPS 記錄下來的經緯度, 因此我決定把我現在用的方法寫下來.

定義: geotagging, 有時候又叫 geocoding, 是一種將地理資訊 (通常是經緯度或大地座標之類的資訊) 標示在照片或其它媒體上的程序, 以使媒體本身跟地理資訊產生實質上的關聯. 詳見 Wikipedia 的這一條.

現在很多 GPS 都有航跡記錄的功能, 我的 Garmin 全系列: eTrex, eTrex Vista TC, GPS V 跟 Edge 305, 以及 WBT-100, 都可以單機記錄航跡, 再用軟體下載航跡到電腦, 產生 GPX 檔. GPX 其實是 XML, 它算是 GPS 的標準交換格式, 裡面可以儲存航點, 航跡, 跟路徑.

中文不太容易區分 "航跡" (track) 跟 "路徑" (route) 的不同, 在英文裡的定義, 航跡是你走過所留下的痕跡, 而路徑是你還沒走就預先規劃要怎麼走的路線. 所以通常 track 是從 GPS 裡傳到電腦, 而 route 是在電腦上畫好後傳到 GPS 上.

Geotagging 做法很簡單, 出去玩的時候把相機的時間調成跟 GPS 一樣 (上次有個天才問我, 為什麼不能把 GPS 的時間調成跟相機一樣, 呃... 我叫他回去自己調調看), 一路拍照一路記錄航跡. 回來以後用軟體比對航跡裡的時間跟照片裡 EXIF 所記錄的拍攝時間, 就可以把那個時刻的經緯度寫到照片的 EXIF 裡.

做法很簡單, 但是我在找適當的軟體時還傷了不少腦筋.

最有名的軟體當然是 RoboGEO, 堪稱 geotagging 天字第一號軟體, 功能強大, 介面漂亮, 但是... 沒註冊的話, 它會在 geotagging 時引入隨機誤差, 讓你的照片偏離航道去撞山. 貴森森. 要價三十五塊美金就算了, 還鎖電腦的序號, 在一台機器上註冊的軟體還不能拿到另一台電腦上用. 所以我決定不甩它.

後來又找到另外一個: JetPhoto Studio. 它的網站上大剌辣地說它是免費的, 結果實際用下去發現沒有註冊的話, 它只讓你用 GPS 航跡標 100 張照片. 註冊要多少錢呢 ? 25 塊美金...

實在不知道這些 geotagging 軟體在跩什麼, 所有的功能都 free, 只要一牽涉到 geotagging 就要收錢. 不知道是這個功能真的很難做, 還是它的附加價值真的很高呢 ?

***

我後來用的是 WWMX: World Wide Medix Exchange 提供的工具. WWMX 是微軟支持的一個計劃, 它鼓勵大家將 geotagging 過的照片上傳給 WWMX, 它會以地理位置去管理這些照片, 目標是成為一個全世界最大的, 以地理位置為索引的照片資料庫. 看來有點跟 Flickr 對抗的味道.

WWMX 提供了幾個工具, 包含上傳照片用的 client 端和 GPS 管理的工具, 其中我用它的 WWMX Location Stamper (可以在這裡下載) 來將 GPX 檔裡的經緯度標到照片的 EXIF 中.

這個 Stamper 需要 .Net Framework 1.1 才能跑, 所以安裝前要先去微軟這裡抓 .NET Framework V.1.1 Redistributable Package 回來裝.

裝好 WWMX Location Stamper 後, 啟動它, 會看到它的主視窗:


WLS-01.PNG

畫面左半邊是用來顯示地圖的地方, 右半邊是顯示照片的地方.

接下來, 先把要 tagging 的照片統統丟到一個目錄. 我將上星期六攻五指山的照片放在 D:\temp\gtag 下, 然後在 Location Stamper 裡選 [Photos] -> [Add Photos], 把 D:\temp\gtag 裡的所有照片都加進去. 這個開啟檔案的對話框可以同時選取很多檔案, 所以可以用 Ctal-A 全選, 或是按住 Ctrl 鍵或 Shift 鍵再用滑鼠去點, 來選取多個檔案.


WLS-02.PNG

照片加進來後, 會出現在 Location Stamper 的右半邊. 視窗下面的 sliding bar 可以用來改變照片顯示的比例.


WLS-03.PNG

我在做 geotagging 拍照時, 一定會對著 GPS 的螢幕拍一張時間, 而且要顯示出秒. 這張照片等一下要來做時間校正. 畫面上這一張就是我那天騎車時, 對著 Edge 305 的螢幕拍的, 可以看到 GPS 當時的時間是下午兩點二十四分四十秒.

接著把滑鼠指標停在照片上一秒鐘, Location Stamper 會浮出一個泡泡視窗, 告訴你這張照片的幾項資訊: 拍攝相機, 拍攝的日期時間, 跟有沒有 geocode 標在上面. 以這張照片來說, 我是用 Minolta 的 X20 拍的, 時間是 11/18 下午兩點二十二分五十八秒, 而照片的 EXIF 資訊裡目前沒有 geocode.

重點來了, 我們發現相機的時間比照片中 GPS 的時間慢了一點點. 用另一個說法就是, 拍照的那一瞬間, GPS 的時間 (也就是地表上你能夠取得一致性同步的, 最準的時間) 是 2:24:40, 但相機的時鐘是 2:22:58. 所以我們要將照片的時間調快一點點, 調多少呢 ? 兩者的時間差是一分四十二秒, 就調這麼多.

因為 GPS 的時間跟相機的時間差了一分四十二秒, 所以所有的照片時間都跟 GPS 差了這麼多, 而我們是以這一張照片當作計算的基準. 因此要調整照片的時間時, 所有的照片都要一起調.


WLS-04.PNG

把右邊視窗的顯示比例縮小, 用滑鼠把所有的照片框起來, 變成選取的狀態.


WLS-05.png

按右鍵, 選 Adjust Timestamps, 來調整這批照片的拍攝時間.


WLS-06.PNG

接下來帶出的是 Timestamp Adjustment 對話框. Add 是把時間調晚, Substract 是把時間調早. 在我的例子裡, 因為相機的時間比 GPS 的時間早, 所以我們要用 Add, 加上一分四十二秒.


WLS-07.PNG

調完時間後, 可以再把滑鼠游標移到拍攝 GPS 畫面那一張上, 看看照片的拍攝時間是不是已經變成跟畫面中的 GPS 一樣, 兩點二十四分四十秒. 其它的照片應該也全部一起加上一分四十二秒了, 但是我們只能用這張拍攝 GPS 畫面的照片來確認, 因此剛剛那個全選的動作非常重要. 如果你調了某幾張, 事後除了有 GPS 畫面那張以外, 你根本不知道到底哪一張是調過的, 哪一張是沒調過的.

時間對了之後, 我們就可以來載入 GPX 檔了. 這個功能在 [Tracks] -> [Add Tracks]. 我用它載入了當天騎五指山的 GPS log 檔.


WLS-08.PNG

GPX 檔載入後, 航跡會顯示在 Location Stamper 左半邊, 如果電腦有連上網路的話, Location Stamper 也會去微軟的 MapPoint 伺服器下載航跡附近的地圖, 把航跡顯示在地圖上. 這是微軟的計劃, 所以就不用肖想它會去抓 Google Earth 的衛星影像來當底圖啦, 也許過一陣子它會有選項讓你去抓微軟的 Virtual Earth 吧.

接下來, 就要讓它幫照片標座標了. 很簡單, 按下畫面右下方 [Apply Tracks] 的按鈕, 會出現一個看起來很複雜的 Apply Tracks to Photos 對話框:


WLS-09.PNG

看起來很複雜, 不過其實只有一件事: 處理 Tricky Cases 的原則. 所謂 Tricky Cases 就是 "顯而易見的問題", 根據 Location Stamper 的說法, 通常是照片的時間沒有對應到航跡上的任何點時, 或是對應到一個 GPS 收訊不良而定位明顯有問題的點. 四個選項分別是:


  • 遇到這種狀況時, 不去動這張照片.

  • 將有問題的照片移到一個叫 "Tricky Cases" 的分類, 但是不去設定它.

  • 照著可能有問題的座標設定, 但是也將照片移到 "Tricky Cases" 分類下, 以便等一下再檢查.

  • 不管它, 就照 GPS log 裡的座標設下去

通常 Trick Cases 會發生在 GPS 進入室內但沒有關機的狀況, 或是航跡沒有包括該張照片的時間. 我試著加了一張不同日期的照片進去, 再跑 Apply Tracks, 結果會顯示成這樣:


WLS-10.PNG

阿爽的這張照片被歸類到 Tricky Cases 下, 表示它的定位可能是有問題的.

另外 "Always prefer existing location information" 這個選項的意思是, 如果照片的 EXIF 裡已經有 GPS 資料了, 就不要動它. 因此如果是拿標錯的照片來重標的話, 這個勾勾不能打, 不然它怎麼樣都不會幫你重標.

跑完 Apply Tracks 後, 畫面長這樣:


WLS-11.PNG

如果畫面右半邊被選取的照片帶有 GPS 座標資訊, 左半邊地圖上就會出現對應的小圓點, 可以用來大致 check 一下位置是否正確. 可惜 Microsoft MapPoint 沒有五指山的地圖, 所以我這批照片標在這個航跡上沒辦法用地圖來 check. 不過看端點的位置, 應該是正確的.

此時 GPS 的經緯度已經寫到照片檔案的 EXIF 裡了, 由於 EXIF tag 跟 JPEG 編碼無關, 所以 Location Stamper 雖然動了圖檔, 但是不會影響到圖檔的品質.

照片的座標標完了, 接下來要幹嘛呢 ? 明天再說.

November 14, 2006

單車訓練之科學化

MT_MAP.jpg

從九月三十日第一次攻上五指山開始, 一個星期大概都維持三天左右在上班前去騎一趟五指山. 每次騎車我都有將 GPS log 留下來, 做為分析自己騎車進步狀況之用.

不過因為上班前騎車的時間並不夠將五指山整趟騎完, 而且根據每天阿爽把我們叫起來以及賴床的時間不定, 我出門騎車的時間也不一定, 因此每天騎的折返點也不太一樣. 我大致上是設定在八點十五分折返, 這樣回到家不會超過八點半, 洗個澡再去上班剛剛好.

如果七點半出發的話, 大概可以騎到伯爵山莊的大門再折返. 七點四十五出門的話, 大概只能騎到八連路的岔路口就得折返了. 因為折返點不一樣, GPS log 要分析比較就沒那麼容易.

要知道自己體能進步的狀況, 最好的方法就是比較同一個路段騎車的速度. 我把上週日騎完五指山全程的 log 跟第一次騎五指山的 log 在 MapSource 裡稍維修正, 把起點調成差不多的位置, 再把回程砍掉, 得到兩個都差不多是九公里多的 GPS log 檔, 丟給 GPS Visualizer 畫圖, 得到一些結果.

Profile.png

這張是速度對距離的 profile. 紅線是第一次騎五指山的 log, 綠線是最近一次騎的.

可以看到紅線有許多速度掉到 0 的地坊, 特別是在前面兩公里內. 那就是我第一次騎五指山時, 因為不懂得配速, 騎到實在踩不動而停下來喘的記錄. 綠線的部份, 停下來的次數明顯少得多, 應該是停下來喝水的記錄.

在剛過兩公里的地方有一段速度飆上去的航跡, 可以飆到 20km/h 左右, 這是在過了土地公廟後, 有一段緩下坡的路段. 騎到這裡的時候一定要小飆一下, 發洩一下前面爬陡坡的怨氣. 在 3.5km 附近, 綠線有第二個小飆的路段, 這是在長青山莊裡面的一段平路. 紅線騎到這裡並沒有飆車, 因為第一次騎五指山時, 騎到長青山莊時已經累趴了, 趁平路休息.

特別值得一提的是, 記錄紅線時我還沒改 Dual Drive 變速系統, 因此可以看到在很多路段紅線的速度都比綠線快, 但是速度變化比較大, 忽快忽慢, 這是變速系統的限制, 那時候是騎不動還得硬騎. 綠線的速度就穩定多了.

再來看一張:

Elevation.png

這張是高程圖. 其實從這張看不出來什麼訓練的狀況, 我要說的是, 記錄紅線的時候用的是 WBT-100, 沒有氣壓高度計, 而綠線用的是 eTrex Vista C, 有氣壓高度計, 因此綠線的高度應該會比較準.

***

單從騎車的速度能得知自己體能狀況的變化資訊其實有限, 除非真的體能有大幅進步, 可以用更快的速度攻上去. 要知道比較細微的差異還是要從心跳錶得知. 可惜我目前用的 Echowell 心跳錶沒有記錄的功能, 我無法在事後知道我騎每個路段時心跳的狀況. 關於體能狀況最直接的資訊應該是速度, 坡度, 對心跳的數值.

現在最想買的是 Garmin 的 Edge 305, GPS 加上有連續記錄的心跳錶和迴轉速錶. 有了這個, 我就可以知道在哪個路段什麼坡度時, 用什麼檔位踩踏, 心跳的速度是多少, 再配上 PC Coach 之類的訓練軟體就可以做更有效的訓練分析跟計劃.

目前正在跟老婆申請 Edge 305 的購買許可中...


November 12, 2006

鑄鐵鍋之牛排初體驗

IMG_8003.JPG

昨天 BJ 在我們家對面的高級儲具店買了一個一千多塊的鑄鐵鍋, 打算以後煎牛排用. 今天一時手癢, 決定來試試它的威力.

我去松青買了兩塊 199 元的澳洲牛肉, 每公克的單價是 0.65 元, 當然是遠不及上次吃的 Costo 牌美國牛啦, 那個一公克要一塊錢.

我將鍋子熱了後, 放上一點點奶油. 上次煮咖哩時, 做洋蔥湯把奶油都用光了, 家裡只剩一小塊, 因此我得用不到 5g 的奶油來煎牛排.

肉放上去後, 我得用鍋鏟不斷把它移來移去, 以免它被鍋子黏住. 切記, 只能移動, 不能翻面. 煎牛排只能翻一次面, 絕對不能翻來翻去. 令我意外的是, 雖然這個鑄鐵鍋沒有任何表面處理, 既不是鐵氟龍, 也沒有陽極處理, 但是並沒有我想像中的那麼容易沾鍋.

鑄鐵鍋和之前用的炒鍋最大的不同就是它的熱容量非常大, 當你把鍋子熱好以後, 它本身蘊含著大量的熱. 因此當牛排下鍋時, 鍋子本身的溫度不會與因為冰冷的牛排接觸而降低太多. 這對我們用輸出不大的家用瓦斯爐來煎牛排來說是很重要的. 煎牛排要讓大量的熱迅速傳入肉中, 令牛肉的蛋白質凝結, 以將它的美味封在裡面.

煎出來的結果如何呢 ? 看照片.

IMG_8007.JPG

不錯吧, 外表不焦, 外皮薄薄一層全熟, 裡面粉紅色約七分熟. 以前用炒鍋很難煎成這樣, 因為要不斷開大火補熱, 所以很容易讓外皮焦得亂七八糟.

IMG_8005.JPG

不好意思, 因為實在是太好吃了, 吃到一半才決定要拿相機拍照, 所以只有吃一半的樣子.

IMG_8009.JPG

鍋子的下場呢 ? 煎的時候奶油沒有焦, 但反而是煎完後因為肉已經拿走了, 雖然火關掉了, 鍋子還是很熱, 所以留在鍋子上的奶油就慢慢變得焦黑. 不過洗鍋子的時候很容易就洗掉了.

下次來試試美國牛吧.


November 11, 2006

好吃的布丁

puting1.jpg

早上跟 BJ 騎腳踏車去攻五指山失敗, 遇雨折返. 回家後 BJ 決定來試試他在 NHK 看到的布丁做法.

材料: 全脂鮮奶 500ml, 雞蛋 3 個, 糖 100g, 焦糖醬適量

做法:

1. 將三個蛋打在一起. 打蛋的時候要注意不要將空氣打入, 以免等一下蒸的時候布丁內出現空洞.
2. 加入糖 100g 至蛋汁, 並用篩網將蛋汁內的固體去除.
3. 將鮮奶煮至微沸, 倒入蛋汁拌云.
4. 將焦糖醬倒入布丁容器底, 再倒入拌好的布丁液, 杯口蓋上鋁箔.
5. 將布丁容器放入陶鍋, 隔水加熱至布丁內達 80 度.
6. 熄火, 蓋上鍋蓋, 悶煮 25 分鐘即成.

原來節目上介紹的做法中, 還有加入香草香精. 但是我們去松青買材料的時候, 看到的香草香精是一小罐標示不明且工廠廠址在五股工業區的產品, 就決定不買了.

以下是製作過程的照片:

IMG_7950.JPG

篩過蛋汁後, 留在篩網上的東西. 應該是雞蛋裡最後會長出小雞的那個部份.

IMG_7942.JPG

分裝好在杯子中的布丁液. 我們用小茶杯當作布丁容器, 看起來像茶碗蒸.

IMG_7944.JPG

杯子底部有放焦糖醬. 不過我們用的是咖啡用的焦糖糖漿, 流動性太強, 因此在布丁液倒入時很難不將它沖散. 不過因為布丁液跟焦糖糖漿本身都蠻濃稠的, 所以還是可以讓焦糖保持在接近杯底的部份, 只是就沒辦法讓做出來的布丁長得像統一布丁那, 上面有一層黑黑的焦糖了.

IMG_7954.JPG

裝杯完成, 套上鋁箔紙, 放入陶鍋中準備蒸煮. 陶鍋中放入沸水少許, 用大火加熱.

IMG_7981.JPG

NHK 的節目說, 布丁在製作的過程中, 要加熱到 80 度後關火悶煮, 會變得最好吃. 我們做了一點小弊: 用溫度計直接去看布丁內的溫度. 在它到達八十度的時候關火.

IMG_7982.JPG

關火後蓋上鍋蓋, 開始悶煮 25 分鐘.

IMG_7984.JPG

噹噹噹... 好了. 外表當然看不出來有什麼不同, 但是在鋁箔下面, 到底是成功還是失敗呢 ?

IMG_7989.JPG

看起來還不錯, 非常像茶碗蒸, 用湯匙去挖也覺得彈性不錯.

IMG_7994.JPG

不過當我們想將它倒出來在盤子上時... 它就崩潰了. 顯然它的結構並沒有強到可以在離開容器後還能維持原來的形狀.

心得:

1. 用焦糖醬一定要用黏度夠的, 最好是焦糖. 如果用太稀的焦糖糖漿, 它會溶入布丁中, 讓整個布丁變得太甜, 會很膩.

2. 如果要讓布丁可以倒出來放在盤子上, 容器的形狀可能在用寬一點, 扁一點的.

3. 甜點裡的糖份真的很高. 我們總共做了 5 顆布丁, 用掉 100g 的糖, 平均一個人吃掉 20g, 大概是五六包糖包的份量吧. 這還不包括焦糖醬的部份.


November 10, 2006

超猛的 PC Magazine 阿拉伯文版

PICT0163.jpg

剛剛在辦公室的茶水間裡的書報架上看到的. 第一眼看到的時候還沒發現有什麼不對勁, 仔細一看發現是阿拉伯文版的 PC Magazine. 超猛的.

我想起, 中文版的 PC Magazine (叫做 "微電腦傳真") 已經停刊一段時間了, 這本該不會也是古董吧 ?

PICT0165.JPG

驗明正身, 是 2006 年 11 月號的, 剛出爐的哦.

來看看裡面.

PICT0166.JPG

阿拉伯文是從右到左寫的, 所有的段落都是右邊對齊的. 除此之外, 什麼鬼都看不懂. 不過文中多少會夾雜一些英文, 我想這樣對他們的閱讀習慣應該很困擾吧. 一下右往左, 一下左往右的...

PICT0168.JPG

寫網址的時候也一樣. 還好他們沒有把網址左右倒過來寫...


November 7, 2006

220V 省電燈泡何處尋

IMG_7921.JPG

因為特殊的電源系統設計 (380V 三相 delta 饋線進來, 因為要推氣冷式空調冰水主機), 我們家所有的固定式燈具吃的都是 220V 的電. 自從搬進這間房子後, 我為這些 220V 的燈泡傷透了腦筋.

220V 的燈泡不是買不到, 只是比較難買, 而且絕對跟特價無緣. 每次看到特力屋的省電燈泡在特價, 心裡都覺得很 ooxx. 長久以來我都跟後車站的燈具行特別訂 220V 的, 貴森森的飛利浦省電燈泡, 直到有一次心血來潮把省電燈泡拆開來看, 發現裡面是個倍壓整流電路, 才解決了這個大難題.

倍壓整流電路長這樣:

Rectifier1.jpg

在 Vin 的地方給交流電, 輸出那邊就可以得到兩倍 Vin 的直流. 左邊串在一起的兩個電容器各自承受 Vin 的電壓, 右邊那個輸出的濾波電容要承受 2*Vin 的電壓.

因為發現了省電燈泡裡面的這個奧秘, 我就開始買 110V 的省電燈泡, 把它們拆開來, 將倍壓整流電路改為半波整流電路:

Rectifier2.jpg

超簡單的, 只要拿掉一個二極體, 再把輸入的一端改接在其中一個電容器的另一端就好了. 要特別注意的是, 由於改為半波整流後, 供電是直接給 220V, 因此那兩個濾波電容變成串在一起合力承受 220V 的電壓. 理想狀況是, 兩個電電容的容抗相等, 它們個自承受一半的輸入電壓, 但是在現實生活中這是不可能的, 零件一定有誤差.

因此要特別注意這兩個電容器的耐壓, 如果它們的耐壓是 160V, 在原來倍壓整流的狀況下算是有大的的餘裕, 但是改為半波整流後有可能因為容量誤差, 讓容抗比較大的那顆承受超過它原來設計的耐壓而爆掉.

所以如果原來的電容耐壓比較低, 改半波整流時就要一起跟著換掉, 也可以把兩顆換成一顆耐壓 240V 以上的, 就萬無一失了.

***

剛好最近客廳有一顆燈泡不亮了, 又要來改燈泡, 就趁這個機會把修改的過成拍拍照, 記錄下來.

IMG_7918.JPG

這是今天的主角, 特力屋超值 3U 電子式省電燈泡, E14 燈頭. 真的非常超值, 一顆不到一百塊. 不過我不知道它們寫上 "電子式" 是什麼意思, 難到還有 "機械式" 的嗎 ? 哈哈哈, 我想應該是指它裡面的安定器是電子式的吧, 應該不會有人在省電燈泡裡用鐵心式的安定器.

IMG_7919.jpg

驗明正身, E14 燈頭 110V/16W 省電燈泡, 效率是 59lm/W, 有一點遜, T5HO 都有 80lm/W 以上了. 不過彎管的效率確實會比直管的差, 電場要轉彎嘛.

IMG_7922.JPG

燈泡本身沒有任何螺絲, 只有三支卡勾, 從美工溝的地方用一字起子輕輕撬就可以把它打開. 燈殼用的塑膠有點軟, 會稍微被破壞, 不過如果是裝在燈具裡, 應該不影響美觀.

IMG_7923.JPG

安定器是一塊圓型的電路板, 單面電木板, 全插件式組裝, 有上防焊. 零件面朝向燈腳, 有幾顆比較大的零件像電解電容, 還特別用長腳包防火套管拉高, 充份利用空間.

IMG_7924.JPG

電路板的背面. 為了等一下施工方便, 我會先把跟燈腳連接的兩根線切斷, 讓電路板可以整塊抽出來. 看零件腳的狀況, 應該是用圓盤刀切腳機切腳, 再用波銲錫爐銲的. 我最後一次看到圓盤切腳機應該是國小畢業那年暑假, 在天網的瑞一廠看到的...

IMG_7935.JPG

紅線圈起來的部份就是被拿掉的那顆二極體. 我家的 220V 因為是從三相 380V 的 Y 接法來的, 其中有一條是地線, 因此兩條線對地的電位是不一樣的, 拿掉順向的二極體跟拿掉逆向的二極體, 會讓半波整流整出來的對地電壓不一樣, 不過如果是一般家庭的 220V, 由於是 110V 對地的兩個不同相位, 因此拿掉那個二極體並沒有差. 而且一般燈具很少在接地, 就不用細究這些小細節.

IMG_7939.JPG

這是安定器跟燈管連接的地方. 其實不管是 3U 4U 還是 大便燈, 都是一根燈管, 只是彎成不同的形狀而已. 這種燈管跟日光燈一樣是熱陰極燈管, 有燈絲的, 所以燈管的兩端各有兩隻腳接到電路板. 不知道這個安定器有沒有做到預熱啟動呢 ? 不過根據經驗, 省電燈泡掛掉的原因通常不是燈管的燈絲燒毀. 在燈絲燒掉之前, 安定器上那些劣質的電解電容就先爆漿了...

這次改的燈泡是 E14 燈頭的, 也是我最早改的一批燈泡之一. 因為 E27 燈頭的 220V 省電燈泡用訂的還買得到, 但是 E14 燈頭的, 又是 220V 的, 在台灣幾乎沒有人在賣. 之前還特別請秋刀魚從荷蘭幫我帶, 實在是太麻煩了, 所以逼得我另覓出路. 改成功後, 連其它 E27 的省電燈泡也統統被我抓來改 220V.

不過似乎只有這種便宜的省電燈泡是用這種電路結構. 有一次我買了飛利浦的 23W 省電燈泡, 拆開來發現裡面沒有倍壓整流電路, 而是把 110V 直接整流率波後就拿去推安定器, 沒得改, 只好乖乖把它裝回去, 拿來插在檯燈上用.

[特別聲明]

本篇僅為 DIY 心得的分享, 如果你看了想要照做, 請務必小心並自行負責. 萬一燈泡燒了, 你可以寫信來罵我, 但是房子燒了, 我也幫不了你.

November 6, 2006

榨到乾的鎳氫電池

PICT0145.JPG

因為一直堅持消費型的數位相機要使用三號電, 所以從我最早的 Olympus C-2000 開始, 一路買的 Fuji Finepix 40i, Finepix 4700z, Minolta X20, X31, Sony W1, 統統都是吃三號電池的, 家裡也堆了一大堆三號的充電電池. 多半是鎳氫的, 有少數幾顆鎳鎘不知道是哪裡來的.

電池用久了會老, 容量會慢慢變小, 放電電流會越來越虛. 這些電池到後來通常不是放到充電器上不到五分鐘就紅燈變綠燈, 就是充飽放進數位相機裡連鏡頭蓋都打不開.

不過, 即使是這些已經風燭殘年的電池, 還是有不錯的用途: 拿來給無線鍵盤和無線滑鼠用.

這是我在 Sony 上班時偶然發現的. 那時公司在推 ISO 14000, 要大家帶廢電池去回收, 做做業積, 我也跟著帶了一堆差不多死掉的充電電池要去回收. 剛好那天我的無線滑鼠沒電了, 秘書那邊一時又找不到三號的金頂, 我就把本來要回收的鎳氫電池拿來裝在無線滑鼠裡, 沒想到這一用就用了好幾個月, 一直到我離開 Sony 時都還有電.

我也有點訝異, 我拿去的這幾顆電池都是那種連相機的鏡頭蓋都打不開的老電池, 沒想到他們在無線滑鼠裡還可以撐這麼久.

PICT0146.JPG

所以我就用標簽機在這兩顆電池上貼了紅色的 "MOUSE" 字樣, 表示它還是有點用的.

另外文章開頭的 GP 2500mAh 鎳氫電池也是後來被打入鍵盤滑鼠專用的電池, 而且我一直懷疑我買到的是假貨. 在 Sony 跟 Sanyo 都還在賣 2200mAh 的電池時, GP 就在賣 2500mAh 的, 這... 想想也覺得怪怪的. 鬼才相信它有 2500mAh. 這兩顆應該不是我自己花錢買的, 可能是不知道從哪裡 A 來的.

***

現役的滑鼠與鍵盤:

PICT0148.JPG

剛買不久的羅技 MX610 雷射滑鼠. 看上它是因為有 PS/2 介面, 可以給我原來的 KVM switch 用. 比較新的滑鼠都已經做成 USB only 的了. 它最炫的是上面有兩個按鍵, 分別可以用來啟動 Messenger 跟 e-mail 程式, 而且當 mail 送達或是有未讀的 MSN 訊息時, 燈會亮起來. 但是我後來發現這些特殊功能都過不了 KVM switch, 很失望. 所以現在是直接接在主機上用, 不經過 KVM switch.

PICT0147.JPG

因為 MX610 直接接接在常用的主機上, 所以 VAIO T26TP 就用這隻啦, VAIO 原廠的藍芽滑鼠. 外型好看, 功能堪用, 而且是經由特殊管道... 取得的.

PICT0149.JPG

陪我超過六年的羅技 Cordless iTouch Keyboard, 當年好像叫做無影手. 當時配的滑鼠還是用滾球的呢. 滑鼠的定位技術這幾年進步很多, 從滾球到光學再到雷射, 但是鍵盤沒什麼太大的變化. 好打就是好鍵盤.

PICT0151.JPG

最後, 躺在充電器裡這兩顆叫 "NEXCell" 的電池也是最近被打入鍵盤滑鼠專用的電池, 它們幾乎已經充不進去了, 放在 KOKA 的充電器裡用 300mA 充, 不到五分鐘就亮綠燈, 沒想到在 iTouch 鍵盤裡居然還能用一兩個星期.

不知道這些充電電池還可以這樣用多久 ? 它們真是被我榨到乾...


November 4, 2006

在自行車道遇到水深 30 公分的水坑

20061104GE.png

今天跟 BJ 還有熊一起去騎車, 路線是大稻埕 -> 關渡 -> 五股 -> 二重疏洪道 -> 板橋 -> 中和 -> 大稻埕. 跟前幾次七八十公里的路線比起來, 這次已經是算輕鬆騎了. 不過, 出發後沒多久, 就在百齡橋附近的基隆河北岸遇到蠢得不能再蠢的蠢事了.

下了百齡橋後, 我們沿著基隆河北岸往焚化爐的方向騎. 沿路自行車道跟草地交界的地方略有一些積水, 應該是連續一週的陰雨綿綿留下來的. 不久後, 我們看到一個大水坑, 佔據了自行車道的盡頭.

PICT0124.JPG
[這張是已經騎過才回頭拍的]

我們想, 自行車道上的水坑能多深 ? 只要維持定速不轉彎不煞車, 應該就可以騎過去. 於是就... 衝了.

沒想到, 進入水坑後不遠, 水深不斷地增加, 慢慢地水深超過輪胎, 淹沒輪框, 接著我們發現鞋子濕了, 踩踏的時候, 當踏板到達下死點的時候, 腳已經在水裡了. 熊騎租來的 26 吋車, 踏板對地的 clearance 比較高, 腳一樣也濕了. BJ 比較幸運, 雖然腳濕了, 但是他沒有落地騎過去了.

我最慘, 腳濕了之後沒多遠, 輪子就陷入水底的泥巴, 完全失去前進的動力, 為了不要摔車整個人掉進水裡, 我只好落地, 整隻腳踩進大概 30 公分深的水裡.

真的是太狼狽了, 才出發沒多久就雙腳濕透. 我還有點擔心我的 Dual Drive hub 有沒有進水呢.

PICT0126.JPG

我只好很不優雅地把襪子掛在車包上晾, 穿著濕濕的鞋子繼續騎.

***

其它照片:

PICT0132.JPG

在關渡自行車站, 看到謝長廷在造勢. 不過記者比參加的人多.

PICT0137.JPG

有個爸爸帶著小女孩騎尾車式的協力車. 在大車輪店裡看過這種附掛式尾車的照片, 但是實繼騎乘還是第一次看到. 看爸爸跟小女孩起步的樣子, 穩定性似乎不錯. 過幾年等阿爽大一點, 大概要來研究這種東西了...

PICT0143.JPG

回程經過華江橋, 這個自行車過橋的坡道大概已經做好快一年了, 居然還是圍起來不肯通車, 真是 ooxx...

Dual Drive 今天第一次騎自行車道, 充份試用高速端的檔位, 我覺得齒比的 range 變寬真是棒. 要爬坡有扭力, 要飆車有速度. 巡航的時候一檔一檔換上去, 輕輕鬆鬆就可以上到 30kph 以上的速度.