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

Archive for the 'tekhnologia 技術或者藝術' Category

最近遇到的各種疑難雜症

以前遇到各種程式的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 開始。

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

如何辨別時尚與過氣

gcc提供了一組供函數/型別/變數用的宣告屬性,其中 __attribute__ ((deprecated)) 對開發API/程式庫的人,是上好的好物。只要在函數/型別/變數宣告後頭加上 __attribute__((deprecated)) ,程式在使用到這些函式/型別/變數的時候,就會顯示警告,跟你說這個函數/型別/變數已經被討厭了(事實上deprecate是個意思蠻負面的字)。

最近覺得所謂API這種事,就是一連串新寵與老梗的混合與鬥爭啊……

不過Objective-C的API作者們,得等到Objective-C 2.0才能在objc method後面加上這個屬性。說了快六年才終於看到,唔,總是「更好遲到比絕不」吧。

(最後那一句是「我不能同意更多」式類語…… XD)。

PS. 重看該討論串,這個gcc功能似乎源起自Apple的需求。

這個描述實在太超過了

有人這麼形容用Cocoa寫程式的感覺:

It’s as though you have .NET 3 on every machine, only it’s been shipping since ‘99, and you program in something like Smalltalk, only it’s fast, and in your installer, you can replace files without having to reboot.

碳與C語言的重要

WWDC 2006的相關影片前陣子陸續發布到了iTMS上,WWDC的與會者可以下載回來看。

雖然說OS X裡有越來越多Cocoa相關的程式庫,但是大多數 Core- 開頭的東西還是以 C 言為基礎的 API。意思是說,任何想在OS X深入一點的開法者,起碼還是得了解 CFRelease、NS- 與 CF- 開頭的資料結構的免費橋接 (“toll-free” bridging),這一類 CoreFoundation 的基礎。

有人曾經問我:到底 OS X 上能不能用 C++ 來開發?更進一步的問題是:難道一定得在 C (Carbon) 和 Objective-C (Cocoa) 間做選擇?

我本來還真找不到什麼好的說法,結果意外在 survey Managed C++ 的時候,讀到這一段 Microsoft 的人寫於 2001 年的話,我笑了:

Unfortunately, as powerful and flexible as managed C++ is, it’s not the native language of .NET, which means that books, articles, courses, code samples, and so on, are not going to be written in managed C++—they’re going to be written in C#. But this should come as no surprise. C++ has never been the native language of any popular platform. Unix and Win32® have C. The Mac has Pascal. NeXT had Objective C (of all things). COM has Visual Basic. Only the BeOS has C++ as its native language, and when was the last time you wrote any BeOS code? The fact that .NET favors C# merely means that another language will be translated into the C++ equivalent, as has been done since 1983.

斜體是我加的。NeXT “had” Objective C. Now OS X has Objective-C. :)

人生的解答(與簡報的藝術)

配樂和圖表方式非常德國(讓人想到Der Spiegel)。看就是了。Via Presentation Zen.

(No, I won’t embed Youtube Flash in my blog.)

看完心情變得蠻好的。唔,居然看圖表看到心情會好。也許我快變成 PC 了。標題 Le grand content 除了「大內容」外似乎還有弦外之音,無法確定。

兩個需要豹仔的 2.0 軟體

TextMateDelicious Library 兩套知名的 Mac 軟體已經宣佈它們的 2.0 版將只支援 OS X 10.5 ,暱稱為 “Leopard” 的作業系統。

至於當初被請上台去為 Objective-C 2.0 背書的 OmniGroup,看來還沒決定是否要這麼做。但是 OmniFocus 的延宕似乎透露了點什麼,um-hum。

OS X 10.5 到底對開發者來說有什麼好處?至少對我來說,有三件大事:Objective-C 2.0、CoreText、新的輸入法架構。其中又以 Objective-C 2.0 最令人期待。畢竟,如果有 gc 支援,那麼 Objective-C 總算可以走進「現代」語言的行列──而且它仍然是個compiled language!

比起從Panther到Tiger,似乎有更多人願意為Leopard割捨舊版的支援。

這陣子以來我寫的 blog 都和技術有關。有在考慮是否分割成兩個 blog,一個寫技術性的東西,另一個寫所有跟技術無關的事情呢……

OpenVanilla的酷音輸入法發佈新版:徵求測試

(2007-01-13 16:51 GMT+8: OpenFoundry回神,原始碼已更新。)

相信對許多Mac使用者來說,OpenVanilla所提供的酷音輸入法模組,是輸入中文絕不可少的工具。我們終於要發佈「OV酷音」的新版本了!

本次發佈的測試模組,是酷音輸入法最新版本。在此徵求beta用戶。

不過請注意!目前的版本真的是「測試版」,可能並不適合需要大量文字輸入的場合使用(有截稿壓力的朋友請不要雞蛋放在這個籃子裡)。

Beta版安裝說明

安裝新版「酷音輸入法」模組的步驟如下:

  1. 請從openvanilla.org下載「酷音輸入法模組」檔案,下載連結在此
  2. 由於新模組與舊的酷音模組(SpaceChewing 2004年版本)使用相同的識別碼(identifier),因此必須要將舊版搬走,新版才能使用。OV預裝的輸入法模組都放在 /Library/OpenVanilla/0.7.2/Modules 裡面,請將 OVIMSpaceChewing.dylib 和 OVIMSpaceChewing/ 目錄這兩個東西拷貝一份後刪除。
  3. 解開第一步下載的 .zip 檔案,解開後是一個名為 OVIMSpaceChewing.bundle 檔案,這就是本次更新的模組。本版本僅供 OS X 10.4 的使用者使用。OS X 10.3 不再支援。
  4. 將 OVIMSpaceChewing.bundle 拷貝到 /Library/OpenVanilla/0.7.2/Modules/ 裡面。或者您也可以拷貝至 OV 0.7.0 之後的新位置: ~/Library/OpenVanilla/0.7.2/Modules/ (亦即在您家目錄下的 OV 資源庫中)。
  5. 為了安全,請登出系統(不需重新開機,僅需登出)。
  6. 再次登入後,請試試看開啟 TextEdit.app ,進入 OV 選單,如果輸入法選單拉下來長這個樣子(以下範例為中文),便表示成功安裝最新版的酷音輸入法。

這個版本在詞庫正確性上相信較舊版來得高。但可能有一些原本 SpaceChewing 的功能在這版有不太一樣的地方。因為我本身不是酷音的使用者,可能會有疏忽。如果有這樣的問題,請直接在本則 blog 上留言告知。留言時請您告知您使用的機型(請務必標明Intel或PowerPC)、作業系統版本、在使用哪個應用程式時出問題,以及測試版的版號(例如酷音 0.3.091)。

新版本的酷音詞庫檔改名為 uhash.dat ,因此不會與舊有的 hash.dat 衝突到。不過我自己試用到目前,加詞的功能似乎還是不太靈光。這一點可能要請各位酷音的使用者再確認這樣是否正常了。另外先前SpaceChewing的「漢音符號表」功能(CTRL-OPT-[英數字鍵])這個版本是不提供的。

Beta發佈順利的話,就會包裝發佈正式版本。謝謝大家!

供開發者參考的Technical Note

以下是這一次beta測試版本的技術說明,供輸入法開發者以及關心技術內容的朋友參考。

Continue Reading »

« Prev - Next »