The Old Blog Archive (Traditional Chinese), 2004-2009

Archive for February, 2007

最近遇到的各種疑難雜症

以前遇到各種程式的bug,只會想到要找人抱怨一下。後來把「要去file一張bug report」加到了to-do list上(雖然是 “long time ago, in a to-do list far, far away…”),最近桌面竟然長出了個叫 bug-report 的檔案夾,裡面檔案越來越多。

趁還記得的時候寫幾個最近遇到的疑難雜症,大多數都已經有了 workaround ,但要確實 reproduce 又要花時間寫 demo case ,總之先記下幾筆,留待火星近地點適合火箭發射時(?)再來一一file吧:

  • Cocoa: 在一個non-screen graphics context裡再開一個non-screen graphics context (e.g. 針對某NSImage object做lockFocus)可能會把堆疊上前一個graphics context的transform matrix搞爛掉。理論上應該可以再開一個thread來處理,但目前發現情況更糟,新thread開的graphics context似乎更爛。
  • IE 6 + prototype.js: Sortables依附的parent element,如果沒有明確設定position: relative,那些Sortables會被「釘」在該parent element上,於是該parent element捲動時,那些Sortable都像是吃了position:fixed的符咒,浮在固定位置上(唔,「浮在」跟「固定位置」好像是oxymoron)。
  • Firefox: 在某些還很難找出reproduce方式的情況下,text field的游標會不見。解決辦法:外面再包個div,設overflow: auto。據說是1.5時代的bug,但2.0偶爾還是會冒出來(確實成因和reproduce方法不詳)。
  • 最新發現,Safari 只要用了「一個」 non-opaque element 就會拖累整頁速度。先前的發現在此

在 PowerPC Mac 上拉火車頭要注意

鐵道迷都愛火車頭,不過最近一版的Locomotive (Jan 2007 bundle),卻驚傳裡面的雜種狗(mongrel)在 PowerPC Mac 上不會叫了,無論按多少次 CMD-R ,時刻表上的班車就是不會從指定的港口(port ??)開出來。奇怪的是 Intel Mac 無此現象。

這問題剛出現時,一度傳出的解決方法是…… 「請 PowerPC 使用者改用來踢 (lighttpd)」…… -_- 後來終於有人發現,原來是雜種狗的寶石項圈爛掉了,請隨便在火車頭的列車表上選一班次,按 CMD-T 進 Terminal 後,下達以下指令:

gem update mongrel

然後重新啟動火車頭,狗兒就會在 PowerPC 上回神了。

唔,雖然嚴格說來,來踢的速度比較快說……

據作者Raaum說,應該不久後就會有新的 bundle 了。

德政

Objective-C 有一個相當特別、被某藍同學稱為「德政」的設計:

送 message 給 nil ,就會得到nil

相較於其他語言(C++對null pointer call member function會爆炸、很多語言則會哇哇叫),Objective-C 的設計相當有意思。這個決定──”method returns nil when the receiver is nil”──隱含的意思是,「沒有例外事件」(no exception thrown),也就是Objective-C會沉默地忽略丟東西給nil所發生的事。

這樣有什麼好處呢?簡言之,就是節省了大量錯誤檢查所需的程式碼。而且,如果程式安排得宜,例如 C 依靠 B 的結果,B 依靠 A 的結果,那麼只要 A 這一步得到 nil 、B C 兩步的程式碼就一路等於變成了 no op,什麼事情都不會發生。只要最後再檢查 C 這一步的結果是否為 nil ,就知道 A B C 三步是否一次執行完畢。

唯一要注意的,那就是相較於 std c lib,printf(“%s”, NULL) 會看到 “(null)”,NSLog(nil) 或 NSLog([nil description])是什麼都看不到的。所以當 stderr 上面一片寂靜時,大概就得猜想是不是 A B C 一路 nop 到底了。

我目前唯一用到(也不得不用)exception handling的地方,只有檢查remote object是否還存在。如果丟了message給某個remote object,結果catch到奇怪的exception,就表示remote object已經不在了,要重新跟remote process要它對外販售的物件(vended object)。OS X 10.5的新輸入法架構,也相當依賴這一件事情的正確性。

AsiaBSDCon 2007, 3/8-11 東京開摧

原岡善行兄傳來的消息:AsiaBSDCon 2007(亞洲BSD會議)將於今年 3/8 (Thu) – 3/11 (Sun) 於東京大學舉行。今年的議程已經公布,報名從 2/12 開始。

大會網址在這裡(正體中文)、這裡(日文)這裡(英文)。

Suo Gan

因為今天的搜尋主題是John Williams,最開始是The Star Wars Main Title,然後想到Williams同時也是Empire of the Sun (1987)的配樂作曲。多年來一直的印象把開頭的曲名以為做Shô Gun──因為那是一部講述日軍戰俘營的電影。最後才發現原來曲子名叫Suo Gan,是一首威爾斯語的催眠曲。

同時間解決的疑惑(或者說,多年的懸念/執念?)還有同一部片的片尾曲Exsultate Justi。好了,如果能找到同樣是多年前BBC一部名為The Dream Machine的紀錄片(台灣當時的公視時段有放過)片頭曲是什麼就好了……