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

Archive for October, 2006

Odgaard先生太hi了



TextMate為了萬聖節特別發佈的update…

Update: r1324, 也就是2006-11-02發布的新update裡,已經回復原有的 icon 了。:p

入力快適感滿點!

我終於又有日文輸入法可以用了。

OS X 是有內建的日文輸入法 Kotoeri ,可是 OS X 只要裝一種以上的中日韓輸入法,輸入法切換的行為就變得相當惱人──這一點,在WWDC 2006上,已經被許多同樣需要多語輸入的與會者抱怨過了(顯然再次驗證了「什麼不孤,必有什麼鄰」這種顛撲不破、放諸四海而皆準的真理)。

也因為這樣,在 OV-UIM (Anthy) 開發出來後,我就一直很高興地用 Yatsu-san 包裝的 UIM.framework (附於 MacUIM 中)配合 OV-UIM (Anthy) 來輸入日文。同樣在 OpenVanilla 裡的好處是,可以使用 OV 的快速鍵來切換注音和日文,入力快適感滿點。

可是,因為 MacUIM / UIM.framework 仍是 PPC-only ,因此在 Intel Mac 上是無法使用的。為了這一點,困擾了我很久。在入力法燒鳥會上,Yatsu-san 說會努力(最近 MacUIM 出了 0.5.0 ,確實在 build system 上有些改變),我相信不久之後,我們一定會有 MacUIM 的 universal binary 版本的。

倒是,今天靈機一動,突然想到,其實 OV 是 universal binary ,意思是可以在 MS Office 這一類 PPC-only 的環境下執行。那麼,MS Office 顯然可以把 OV-UIM 以及 UIM.framework 給載進來(如果在 i386 環境下,因為 UIM.framework 沒有相對應的 binary,OS X 的 loader 會拒絕載入,使得 OV-UIM 載入連帶失敗)。

就是這樣。

用 Finder 在 Safari.app 上按 Command-I ,把 “Open using Rosetta” 選項打開,此時 Safari 就變成了一個 PPC application,然後開啟 OV ……

OV-UIM (Anthy) 復活了

啊,三個月了,終於又有好用的日文輸入法。先前偶爾還有跟日本友人書信或 instant messenger 往返的,其實都因為不喜歡在 OV 和 Kotoeri 間切換,頓時沒有了學習書寫日文、學著用日文說話的動機。

如今這些動機又都回來了,雖然必須用 Rosetta。

(是的,這時候覺得,OS X 上有那麼多種 browser ,其實是很幸福的──我把 Camino 撥過來變成「寫日文專用 browser」好了 XD)

註:在 OpenVanilla 裡的另一個好處是,可以透過 filter ,達到打日出簡(?)等奇怪的特技。至於入力娘嘛……

… 有比唱《北国の春》更重要的事 :~

以後如果我有小孩,小孩可能會怨我。興致還在想唱《北国の春》之中,結果竟然忘了昨天還有一件比唱歌更重要的事:

OpenVanilla兩歲了(2004/10/23)。

嗯,在秋天出生的程式嘛…… (rev 1的OpenVanilla.h)。

小孩三週大,蝦米攏毋驚:第一個能用的 POJ 模組

台北秋日和 / Zurückgekommen

雖然文不對題,不過確實蠻有引吭高歌《北国の春》的興致啊。

唔…… 也許唱《島唄》也行。真是亂七八糟的文化拼貼。

明體(明朝體、宋體)與基督教

摘自日文版Wikipedia (thanks gugod for pointing this out),原文是很長的一段:
Continue Reading »

ObjectiveFlickr Demo小更新

結果發現,PhotoSearch.app 竟然忘了建 PowerPC 版本了。已經更新(請重新下載同一個 ObjectiveFlickrDemo-latest.zip),造成大家困擾真是抱歉。m(_ _)m

關於學做人的書摘兩則

兩則摘錄。

一篇出自The Economist上看來的Obituary, Gyorgy Faludy (1910-2006):

… But when the Soviet tanks rolled in he fled west again: to Vienna, Florence, Malta, New York and Toronto, where he set up home with an American dancer called Eric Johnson.

The handsome young man had tracked him down in Malta after reading “My Happy Days in Hell”. Mr Faludy was living there after his wife died. He fell hard for Eric, writing sonnets to him. In Toronto they shared a tiny apartment with a pair of finches; the birds would perch on Mr Faludy’s typewriter, flying up each time he bell signalled the end of another line.

For more then 20 years, until 1920 when Communism fell, Mr Faludy stayed in Canada. He at last returned home, his books unbanned after four decades, to live in a spacious flat overlooking the Danube given to him by the city authorities. There, he went on shocking people. He dumped Eric for a lissom poetess more than 60 years his junior, maried her and appeared with her, almost naked, in the pages of the Hungarian edition Penthouse magazine…

讀了Steve Wozniak的iWoz。奇異的是,不管台灣的商業雜誌怎麼寫,我還是對諸如iCon一類的書提不起興趣。Steve Wozniak的說話方式有趣多了。第一次看他的網站時,覺得這人怎麼總是起頭我我我,尤其是對於Apple I/II獨力完成一事(他書中有提到他在意的原因)。iWoz一書雖然是他人代筆,大體跟他網站上的文章差距不大。

我是跳著把書看完的,書中提到了他對越戰的看法,他的求學歷程,後來怎麼用賺來的錢辦演唱會,還有喜歡教書等等。我只是很意外讀到了這一大段話,而覺得,這本書不需要再摘錄其他任何地方了:

Ethics always mattered to me, and I still don’t really understand why he [Steve Jobs] would’ve gotten paid one thing and told me he’d gotten paid another. But, you know, people are different. And in no way do I regret the experience at Atari with Steve Jobs. [...]

Steve and I were the best of friends for a very, very long time. We had the same goals for a while. They jelled perfectly at forming Apple. But we were always different people, different people from the start.

You know, it’s strange, but right round the time I started working on what later became the Apple I board, this idea popped into my mind about two guys who die on the same day. [...]

In my head, the guy who’d rather laugh than control things is going to be the one who has the happier life. That’s just my opinion. I figure happines is the most important things in life, just how much you laugh. The guy whose head kind of floats, he’s so happy. That’s who I am, who I want to be and have always wanted to be.

加下來這一段是我劃的線:

And that’s why I never let stuff like what happened with Breakout bother me. Though you can disagree–you can even split from a relationship–you don’t have to hold it against the other. You’re just different. That’s the best way to live life and be happy.

And I figured this all out even before Steve and I started Apple.

(Steve Wozniak and Gina Smith, iWoz: Computer Geek to Cult Icon. London: Headline Publishing, 2006. pp. 148-149.)

ObjectiveFlickr新進度:PhotoSearch Demo

這個週末又繼續把ObjectiveFlickr往前推進。整個framework已經重寫過了,現在只剩下兩個class是需要的,一個叫OFFlickrContext,一個叫OFFlickrInvocation。大幅改名是為了讓class name更能反映實際的功能,但也因此讓過去的舊程式要大改才能使用ObjectiveFlickr了。

這一週新寫的demo是這樣子的。

Ruby on Rails是一套很強大的框架,人們為了推廣RoR,錄製了不少短片用以證明RoR有多容易寫web app。其中一個demo是利用RoR加上Flickr API來寫照片搜尋功能。

PhotoSearch.app模仿了那個RoR範例(事實上我連他們的CSS都抄來用了),用來證明,只要使用Objective-C、WebKit、ObjectiveFlickr,一樣可以很快寫出具有Flickr照片搜尋功能的… 嗯… desktop app。

我現在的blog theme不適合用來說明程式碼,我也還不會錄製說明短片。這些都再再說明,我該好好努力在presentation skill上精進了。

總之,有圖有真相:

Public Photo Search with ObjectiveFlickr

以上的 demo 可以這個網址取得。ObjectiveFlickr使用New BSD License公開,程式碼均存放在Google Code上。

附錄:如何用Objective-C寫ObjectiveFlickr的應用程式(草稿)

Warning: because my blog theme isn’t good for showing code, this is going to be an aesthetically unacceptable entry.

在ObjectiveFlickr的Demos group底下,有PhotoSearch這個示範程式。這個程式的構成相當簡單,首先,用Interface Builder拉出三個元件:搜尋欄位、進度風火輪、WebView,然後透過繼承NSWindowController創建出PhotoSearchController,把該連接delegation連接起來。

接著,生成程式碼,然後在 PhotoSearchController.h 中的開頭 #import 這兩個標頭檔:

#import <WebKit/WebKit.h>
#import <ObjectiveFlickr/ObjectiveFlickr.h>

然後在 PhotoSearchController class 中加入以下成員:

OFFlickrContext *context;
OFFlickrInvocation *invoc;

接著修改 PhotoSearchController.m。

首先,我們要加入 awakeFromNib 方法。沒錯,Objective-C 的特色之一是,增加method是不需要於標頭檔宣告的。我們在 awakeFromNib 裡,建立 context 和 invoc 物件:

context = [[OFFlickrContext contextWithAPIKey:OFDemoAPIKey sharedSecret:nil] retain];
invoc = [[OFFlickrInvocation invocationWithContext:context delegate:self] retain];

然後把包在 Resource/ 目錄下的 index.html 給呼叫出來:

[[webView mainFrame] loadRequest:
    [NSURLRequest requestWithURL:
        [NSURL fileURLWithPath:
            [[[NSBundle mainBundle] resourcePath] stringByAppendingPathComponent:@”index.html”]
        ]
    ]
];

(呼,有夠長!)

然後在開始搜尋的那一段 control action 中(method startSearch:),增加實際搜尋的程式碼。我們首先要把搜尋文字轉換成有 percent escape 的字串:

NSString *srchstr = [[sender stringValue] stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

(還是一樣有夠長!)

然後把風火輪轉起來:

[progressIndicator startAnimation:self];

接著就可以呼叫 Flickr method 啦。因為 OFFlickrInvocation 都幫你做好了,因此呼叫 flickr.photos.search 只要一行:

[invoc flickr_photos_search:nil text:srchstr selector:@selector(handleSearch:errorCode:data:)];

這句話的意思是說呢,呼叫flickr.photos.search方法,userinfo參數是nil,搜尋字串是srchstr,而callback selector則是 handleSearch:errorCode:data: 這個方法。

然後我們要建立一個同名的方法:

- (void)handleSearch:(id)userinfo errorCode:(int)errorcode data:(id)data
{
    // …
}

然後在裡面填上程式碼。我們直接取用 callback 收到的 data 物件,先將 XML 轉成 NSDictionary ,然後直接取出 photo array:

NSArray *photos = [[data flickrDictionaryFromDocument] valueForKeyPath:@”photos.photo”];

我們打算使用 WebKit 來顯示這些照片,因此準備一個字串來插入 HTML 程式碼:

NSMutableString *code = [NSMutableString string];

然後把照片通通串起來:

unsigned i, c = [photos count];
for (i = 0; i < c; i++) {
    NSString *url=[context photoURLFromDictionary:[photos objectAtIndex:i] size:@"s" type:nil];
    [code appendString:[NSString stringWithFormat:@"<img src=\"%@\" />", url]];
}

其中第三行,我們呼叫 OFFlickrContext 的 photoURLFromDictionary: 方法,將 photo object 轉成 URL string。

最後我們呼叫 WebKit 的 DOM 操作介面,把 photos element 取出來,然後改變裡面的 inner HTML,再呼叫script.aculo.us著名的Effect.BlindDown(為什麼著名?因為上述 RoR 範例也這麼用),為我們的範例勾芡:

DOMHTMLElement *e = (DOMHTMLElement*)[[[webView mainFrame] DOMDocument] getElementById:@”photos”];
[e setInnerHTML:code];
[webView stringByEvaluatingJavaScriptFromString:@"new Effect.BlindDown('photos')"];

大體如此。  

學做人

標題歸在avant lettre一類的原因是,我常常不知道該怎麼把從小學到、關於人格養成的詞彙,對應到英文裡。

例如,「做人處事的道理」。

曾經在一本寫給華人的法語學習書中讀過類似下面的句子:其實學語言跟學樂器是很像的,初學時是練習那幾個把位,學精了以後還是在練習那幾個把位。

最近聽到了一些絕交息遊的故事,那種「以後再也不想跟那種人往來」的話,溫度很是冷冽。即使日後大家在這麼小的世界見到面,還能維持成年人應該有的禮貌與哈哈,但是心裡面對絕交對象的尊重和溫度已經沒有了。

成年人說絕交,又何嘗不跟小朋友「以後再也不跟你好了」那樣,切巴斷,一刀兩斷,也許日後留待回憶時才追悔。不過,聽起來,成年人的絕交,即便很可能真的是為了對外人來說毫不足道的事,也絕對不會再有看待兒時的距離與輕鬆了──甚至更殘酷地說是不會再有生命的餘裕,來讓時間把傷害與裂痕給沖淡為平復與可笑。

放寬心來看,人與人的關係經常是在調整的。小村莊理論。然而新的關係建立困難,而太多垃圾關係太早佔滿位置絕對只是提早用掉quota。結果說來說去還是那句,交友要謹慎,慎始慎終慎獨,友直友諒友多聞。國中課本裡林良寫給孩子的交友守則依然是如此真確(現在還有收那一篇嗎?),但很不幸地因為是白話文,而大概沒什麼人有上到。

記得有種說法,朋友之間的嫌隙起於狎戲。狎戲不見得出於輕浮嬉鬧,也許更多是起於不在乎別人的在乎,或是「不明白你幹嘛生這麼大的氣」,於是對方就更火,覺得在你眼中已不把他當人看。聽起來很嚴重,但是說真的,我們對待生意上往來的顧客,可能真的還比朋友好,也難怪對方要生這麼大的氣了(顧客生氣時,我們起碼還會在話術層次上說,我們理解您的生氣云云呢)。

說多了。其實我只是好奇,西方人的人格養成,是怎麼教導這些東西的。雖然我的猜想,有許多來自《聖經》,要愛你的鄰人,要寬恕他人,而若你的右手叫你行惡,則刨去你的右手,等等、等等。

當然另外就是在那些人格養成外圍的潛規則。Somehow that’s not part of my language/ideologue, and perhaps that’s why I never understand the way it works.

回到最初的主題,我只是很好奇一個西方人會怎麼講述多年朋友惹到火大,因而起了絕交斷義,rant and curse半天,大表不滿,不吐不快,這樣的一件事而已。進場時要想到退場(”In my beginning is my end” — T. S. Eliot),或許從這些絕交息遊斷義的故事、話語、不爽與憤恨中,更能看出所隱含的對人的期待是什麼?

Update: 希臘人對朋友以及朋友之間的愛也說了很多,但是很好奇他們怎麼看待別離與斷義。看來似乎是不錯的讀書主題。