星期六, 12月 31, 2005

年底的簡單回顧

今天是 2005 年的最後一天呢。想了想自己在這一年,到底做了些什麼?

嗯,和前幾年相比,我覺得成長了不少。說得確切些,應該是前幾年幾乎都沒有學到什麼。今年前半年,在舊公司進行了一項「品質改善」的專案,從軟體工程的角度思考與執行後,才慢慢讓自己對軟體專案的開發,有了不一樣的角度與看法。

九月離開公司,回頭再做博士後研究。除了「臨時性」與「薪資不高」之外,我覺得若是好好地「享受」一下,博士後研究也實在不壞:

  • 上下班相當自由。偶而心情好,可以不上班,陪寶寶玩一天。

  • 目前的工作內容,可主要是在延續自己讀博士班時,「尚未完成」的一篇 paper 與 prototype 實作。我覺得,或許也是因緣。

當然啦,自己因為一頭栽入論文寫作、程式實作中,就沒有力氣能夠整理些「曾感到興趣的一些主題」了。對此,我其實還是頗感愧疚的。

過幾個月,把 paper 與 prototype 弄得差不多了,就得準備下一份工作了吧。現代人,如果沒有工作,似乎相當容易顯得失落;親朋好友善意的問候與建議,也很容易令人難以招架。對 MPH 的短期計畫,決定再休息個半年,我是帶點羨慕與祝福的(其實不該羨慕的,自己這幾個月也可以說是在休息,應該知足)。

星期五, 12月 30, 2005

SQL Server 的全文檢索

從 MySQL 將資料轉到 SQL Server 後,接下來當然就是嘗試全文檢索的功能。

大致上,效能果然比 MySQL 好上許多(大約有十倍以上的效能提升吧)。這或許可以說明,MySQL 的全文檢索,可能只是「虛晃一招」,沒有好好認真去做。

即使是檢索「劉銘傳」,回傳 2407 篇文件也不會吃掉太多效能。但... 等等,印象中,在 MySQL 下用「海山口」來查詢,會取得 25 篇文件,但 SQL Server 怎麼只檢索出 23 篇?

雖然頗覺事有蹊蹺,但又有些懶:既然只是 prototype,這又頗明顯是 SQL Server 的問題,況且「大多數的查詢結果與 MySQL 的查詢結果是相同的」,不講大概也沒有人會發現。那麼,「假裝沒看到」又何妨?

不過,隔了一陣子還是忍耐不住,想了解究竟是怎麼回事。(哎,這該算是個性上的優點還是缺點多啊?)

最先浮上心頭的想法,是懷疑「海山口」的前後文,是否在 big-5 或者 unicode 中,含有特殊的字元;而這樣的字元,導致 SQL Server 在做全文索引時弄錯了。調出一篇沒有被檢索出來的文件,相關內容是這樣的:

...比臺北海山口最上之米。一石僅低十錢...

嗯,看起來好像沒有什麼問題?

這下子有點傷腦筋了。懷疑是否 SQL Server 的全文檢索有參數可以設定。然而,搜尋網路與相關文件後,卻只找到 stop words 的檔案;但即使將 stop words 通通拿掉,也還是檢索不出這篇文件。

不信邪,用「海山」找找看。喔,可以找到數百筆資料,但怎麼就是不含這一篇?改用「山口」試試看好了 --- 咦,這回可以檢索到耶。這究竟是怎麼回事啊?

嘗試了一些查詢後,我覺得 SQL Server 好像把「北海」「山口」斷詞斷開(當成是兩個片語)了。想到前同事 Tim 曾提到,Microsoft Word 有類似的斷詞判斷能力,就把上面框起來的那些字拷貝到 Word 裡...

結果還真的頗有趣。當我在「北」或者「海」上頭 double click 時,Word 會 highlight 選出「北海」,在「山」或「口」上雙按,則會選出「山口」。看來,Microsoft 在 Windows 的某個地方,確實有個「斷詞」的程式模組,而 SQL Server 的全文檢索,則「笨笨地」誤用斷詞了。

找不到如何取消這類「自作聰明」舉動的地方,只好用類似於在 MySQL 上檢索中文的方式,在每個中文字間,加上空白,然後用「片語檢索」的方式,查詢 "海 山 口" (在字與字之間加上空白)--- 這下終於成功地檢索出 25 篇文件了。

實作中文系統就是這樣,常常會遇到一堆莫名其妙的問題。為了交差,有時就難免得用到 work around 的解決方式;而既然是折衝繞路後的解決方案,深層根本的問題也就比較多。我想,這應該也部分說明了,為什麼中文的系統,(比單純的英語系統)感覺起來經常是「問題一籮筐」吧。

星期二, 12月 27, 2005

轉移焦點

「爸爸你討厭,把帕還給我,嗚嗚嗚..」

昨天幫寶寶「保管」她的手帕,卻忘了還給她。電話裡,小傢伙哭得很可憐。我在電話裡說好說歹,就是無法讓她停止啜泣與不滿。據說,太太後來是藉著「轉移焦點」的方式,讓她注意到衣服上的小動物,寶寶才破涕為笑的。

今早繼續閱讀「選擇的弔詭」。書中提到,「對不快樂的人來說,他們重視的是相互比較...快樂的人與不快樂的人,之所以會做出不同的反應,關鍵在於能否抽離思緒、還是反覆思考」。當不快樂時,如果能夠分心,轉向思考其他事物,那麼就不會沈浸在反覆的思考或懊悔中。

我想起從前失戀時的一些經歷。失戀時,難過的感覺往往會佔住生活中的大半空閒時間;而旁人的安慰,通常都沒有太大的助益。脫離失戀悲傷情緒的最好方法,就是趕快找到下一個戀愛的對象。

而小傢伙似乎天生就有「顧左右而言他」的轉移焦點能力。當我們數落她做錯了什麼事時,她經常會主動轉移話題與焦點,令人又好氣又好笑。我想,如果這種能力,能夠讓她生活得比較滿足與快樂,那也是一種很好的本領罷。

星期一, 12月 26, 2005

MySQL 到 SQL Server 的轉換

上週提到,使用 MySQL 全文檢索遇到的效能困境。

想起從前曾用過 Microsoft SQL Server 的全文檢索功能,而當初的感覺還不錯,所以就打算將雛型的資料庫改用 SQL Server 2000,來比對是否真的是 MySQL 的問題。

不過,字元編碼的問題又再度出現:MySQL 支援 UTF-8,但不支援 UTF-16 的字元編碼。M$ SQL Server 則正好相反,支援 UTF-16,卻不支援 UTF-8。當下嘆了口氣:看來,轉碼的功夫是省不了的...

找了幾個資料庫轉換的工具軟體,都無法在資料庫之間正確轉碼,所以就只好自己動手寫程式。不過,SQL Server 的 drivers 似乎很奇怪,大五碼(big-5)的字元可以正確地轉譯到 nvarchar 或者 ntext,但其他字元怎麼都會變成問號呢?

明明覺得「一定有辦法解決」,但怎麼總是有某個地方不對勁?又是一番冗長的手冊閱讀、網路搜尋、以及嘗試錯誤過程。頗幸運地,最後終於找到正確的轉碼方式了。

轉譯的過程,用到了 PHP COM 模組的 CP_UTF8 codepage,以及 SQL Server 指令的 "N" prefix。我想,這應該就是所謂的「know how」吧:明明知道必然有解,而最終也證明這個解相當簡單,但如果缺乏這個 know how,就怎麼也做不出來。

星期六, 12月 24, 2005

堅持

電視上訪問朱銘,問他如何能致現今的成功,朱銘的回答是:「堅持」。

從電視上,可以感受到朱銘是一個非常謙和,對自己的理念也非常堅持的人。他說,他堅持著自己的本性、規律生活、在生活中修行(他說,就是把雜念去除)。

堅持。短短兩個字,卻有力地道盡人世的滄桑。如果世界不是那麼現實,那又何需堅持?

想想舊公司竟然還有能力增資,也頗感驚訝。技術研發本來成本就高,舊公司開發的東西也理應有應用價值;只是,歷經一番大變化,看這些東西的角度竟也有了微妙的改變。公司能夠繼續生存,不管是因為賺錢、或者因為能夠找到金主,都是它的本領。只是,就像是政治人物常掛在嘴邊的「不逃避、不退縮」,這樣是否真算是「堅持」?

看來,堅持雖然令人嚮往,但箇中微妙之處,卻語言難以描述。而成王敗寇,就是現實的遊戲規則。或許,「馬後放砲,砲砲都響」,我們也真只能在事後,才能品茶論英雄。

星期三, 12月 21, 2005

逃避選擇

卸下「正式工作」後,總想能夠多看點書。

不過,自己看書的速度本來就屬烏龜等級,最近又為了古契書檢索的雛型傷腦筋;因此總難抽出足夠的時間,好好地讀上幾本書。

看看架上的圖書,都已經滿溢了,怎麼好意思再買書呢?在愧疚的心情下,挑選了一本「選擇的弔詭」,趁著早餐的時間,酌量閱讀。

這其實是一本嚴謹的科普著作。看看書後的參考書目,竟然有 138 條之多。想想自己近來想寫些東西,卻腸思枯竭無法動筆,就更欽佩作者的功力了。

在書中,作者提到「逃避選擇」:在許多狀況下,人們並不願意做選擇。如果在抉擇時被迫要面臨取捨,人不只會變得不快樂,還會顯得優柔寡斷 --- 如果實驗容許,人們甚至根本不想做決定。大家大概都曾聽過這樣的問題:

假想你的媽媽、太太、還有小孩掉入水裡,但你只能從中救一個人。你會選擇救誰?


就我來說, 自己從來都不肯正面去回答這個問題,因而通常就是採取「拖延、玩笑似地回答、或逃避選擇」的態度。此外,就工作的選擇方面,自己似乎也總顯得有些意興闌珊。這應該也是一種逃避吧?

有意思的是,從書上引述的研究來看,這種心理反應是「正常」的:大多數人都是如此,因此似乎也不必太在意。雖然,許多提倡積極進取的書籍,總是會鼓勵「仔細評估、勇於決定、貫徹選擇」。

想起當兵時聽過的話:「時間的過去,就是任務的完成」(這句話,其實是我在 Maryland 求學時,因室友 Pony 多次提及,才比較深刻地映入腦海)。也或許,「不選擇」就是最好的選擇?

星期日, 12月 18, 2005

MySQL 的全文搜尋效率

上個月才聲稱 MySQL 也支援全文檢索,但現在心裡卻頗有不滿。

怎麼回事?原來,MySQL 的全文搜尋效率並不好。當初的文件庫只有一萬多篇文件,效能還差強人意;但現在文件庫裡有了十幾萬篇文件,搜尋的時間竟然也是「直線上升」。那麼,做全文索引,還有什麼意義呢?

調了調幾項參數,都沒能改善效能。只好到網路上看看別人是否也有類似的經驗。喔,是了,確實有人做了些實驗,然後發現 MySQL 的全文效率,並不會比直接用 SQL 指令,下「WHERE content LIKE "% tag %"」來得好(其中,content 是資料庫儲存內容的欄位名稱,tag 是要搜尋的字串,% 表示任意字元都符合,而 tag 前後留有空白,是因為英文字是用空白來斷字的)。

這下子也真令人氣餒。雖說自己只是在做實驗性質的 prototype 或 demo,但尋找個「劉銘傳」、「海山口」竟也要花上半分鐘以上的時間,總讓人心裡不舒服。

於是,也強烈感覺到,強調互動的系統,「回應時間」是需要被關注的。 0.1 秒內取得檢索結果當然很好,但花個三秒鐘,也不會讓使用者覺得太難過。然而,如果需要超過五秒才有回應、甚至需要長達半分鐘的等待,那麼系統在「互動」上就顯得很不實際了。

星期三, 12月 14, 2005

談古契書資料處理:之四

古契書檢索系統,一般需要處理時間的問題。

什麼意思呢?一個提供全文檢索 (full-text retrieval) 的系統,難道還不夠嗎?

從某些層面來看,只有全文檢索的確不夠。例如,若我們只想查閱某些年代的資料,全文檢索因為無法辨識文件的年代,就無法提供「只搜尋清朝乾隆年間文件」的選項,因而回傳的結果,將會因為含有大量「非乾隆年間文件」而使檢索效率降低。

好吧,那我們怎麼提供全文以外的檢索呢?

一般來說,需要有詮釋資料 (metadata) 的配合。詮釋資料,就是用來說明資料特性的一些東西。例如,Windows 檔案系統有所謂的「延伸檔名」,它就算是一種詮釋資料。由於 .jpg、.gif、.wav、.doc、.xls 各表示不同的檔案格式,應用程式就能藉由這項資訊分辨處理的方式。

可是,古契書本身是沒有詮釋資料的。要將它數位化,就已經會遇到一堆問題了,哪有資源來為每份契書額外加上詮釋資料呢?於是,就會有「從文件中,自動擷取時間資訊」的想法。

讓我們先看一份完整、加過標注的古契書:

od-ta_01516_000005
竹北二堡十寮庄土名七寮三五之二、三五之三

立截出山園字人周明盛兄弟等。緣因先年承買李家之山園,係叔侄兄弟人等備本,按作參股,每股備出本銀壹拾參元陸角正,盛備出本銀陸元捌角正。爰是族戚酌議,福叔姆邱氏備出本銀陸元捌角正,計共每壹股本銀壹拾參元陸角正,將此山園截出四至界址。東至貳鬮毗連種竹為界;南至路生屋角水壢透上;西至大龍種竹為界;北至糞箕窩分水為界。四至界址,即日經族面踏分明。愿將此山園壹處與叔姆邱氏前去掌管,收租納課,永為己業,日後子孫人等不敢異言生端等情。此乃二比甘愿,兩無迫勒。口恐無憑,今欲有憑,立截出山園字壹紙,付為執照。
即日批明:福叔姆邱氏備出本銀陸大元捌角正。立批照。

場見叔 元寶(印)
代筆人 廖青雲(花押)

明治丙申年捌月 日立截出山園字人 周明盛(花押)

其中,「明治丙申年捌月 日」就是很明顯的時間資訊。

當我們要從文件中擷取出這類資訊,會發覺正規表示式 (regular expression) 實在是一個方便的工具。例如,寫一個簡單的式子:

(明治|同治|光緒)\S{1,5}年\S{1,2}月.{1,3}日

就可以擷取出「明治丙申年捌月 日」、「同治拾貳年桂月 日」、「光緒丙子年拾貳月 日」等字串。其中,「\S」 代表任意的「非空白 (white-space) 字元」,「.」可以比對任意的字元,而「{m,n}」則表示符合的字元數目要在 m 與 n 之間。

當然啦,現實總不是那麼簡單與美好。和之前幾篇 posts 類似,總有些打錯的字、莫名其妙的斷行、以及更冗長的時間寫法(例如,「光緒八年歲次壬午拾壹月 日」之類)。此外,古時候中國是採用農曆,有時會有「潤八月」之類的字串出現。因此,要找出合用的正規表示式,就會複雜許多。

星期日, 12月 11, 2005

不願長大

「我沒有長大,我長小了。」

前一陣子告訴寶寶,她已經三歲多、長大了,要學會自己穿衣服、自己刷牙、自己吃飯、自己睡覺。小傢伙竟然說她「長小了」,令人不禁莞爾。

當然,三歲的小孩,經常連自己想表達什麼,都說不甚清楚。但這一陣子,我常覺得,自己是不是也「不願長大」呢?

有人說,中年的主要課題是,摒棄自己想像的一切安全庇蔭,練習對自己負起一切責任。只是,我真的準備好了嗎?

看(聯合報附贈的)紐約時報差不多也有半年的時間了,近來越發覺得自己的英文程度實在不好。有時真的很希望時光倒流:若是自己能夠從十幾年前,就開始閱讀,現在的程度是不是能夠好上許多?

也想起自己兩個月前,是想用一年左右的時間,好好地整理、寫出一些曾感興趣的東西。然而,最近卻幾乎都把時間花在「工作」上了。雖然頗為確定:現在的工作,都是在自己意願下去做的;但是,總是希望時光走得慢些,好讓自己有多些時間來喘息。

想起貓在 Blog 引村上春樹的話語:「四十歲是人生一個很大的轉捩點。那時,我將選擇一些什麼,並捨棄一些什麼。」我想,這應該是個困難、卻又無法逃避的選擇吧。

年近四十,對時光的飛逝,有時真會有股莫名的煩亂。雖感覺不出書上常說的恐懼(不願接受、想找方式來逃避),但卻常帶點無奈、有些悲傷(為逝去的青春感嘆)、更常感困惑:這些日子裡,自己究竟做了些什麼;而接下來的日子,我又想做些什麼、該做些什麼?

想擁有多些時間,來更了解自己。但歲月催人老,不願,卻也無法拒絕長大。

星期五, 12月 09, 2005

令人感動的童言童語

「爸爸你討厭,我要把你丟掉!」

雖然是負面的語言,從寶寶的口中講出來,卻格外感覺溫馨。小傢伙早晨起床,發現爸爸不在身邊,哭著訴說她的不滿。她要媽媽打電話,然後竭盡所能,對我說她僅知的負面詞彙:「爸爸上班,我不喜歡爸爸,爸爸討厭、小氣鬼!」

老實說,聽她這樣哭訴,心裡充滿著感動與不捨。我想,我會珍惜和三歲寶寶相處的歲月。這些日子的點點滴滴,終將伴隨著我,走過看似蒼茫的歲月。

星期三, 12月 07, 2005

Seeing through the distance

上週聯合報附贈的紐約時報,有一篇「捷克梅第的女人,訴說她們的故事」。

原文的標題是「Women Who Posed for Giacometti Tell the Tale」,大意是幾位曾讓藝術家 Giacometti 繪描、塑像的女性,回顧她們當模特兒擺姿勢的情景。原文還有附譯稿,可以讓英文程度不怎樣的我,更有機會一窺紐時報導的文采。

我很喜歡中間的許多描述。尤其是,它讓我對這位藝術家的「追求完美、挑戰不可能任務」產生極大的嚮往與敬意。

文中說,Giacometti 對自己雕塑出來的頭像,總是不滿意。而一位模特兒回顧說,她在擺姿勢時,有時會覺得自己好像是靜物,而旁邊的雕像才是活的。她說,Giacometti 的頭像,總是超越物體朝遠方看,總是「看著遠方」(seeing through the distance)。

好一句「seeing through the distance」。雖說被翻譯為「看著遠方」,但我總覺得有「看穿距離」、「洞察時空」的意涵。用它來形容藝術家的執著與追求,真有股力透紙背、畫龍點睛的效果。

星期日, 12月 04, 2005

淡水河岸的民俗藝品

也不知小傢伙是從哪得來的訊息,昨天寶寶吵著要到淡水坐船。

看看氣象預報,接下來一整個星期氣溫都會偏低,昨天算是不錯的天氣。想了想,淡水不好停車,還是開到左岸八里,坐渡船到淡水,走走逛逛好了。

在淡水捷運站旁,看到民俗藝人用吸管做飾品與玩具,維妙維肖。據說,除了毛毛蟲是用衛生紙做的之外,所有的東西都是用吸管做成的。寶寶年紀小,只能玩「蝸牛」,除了比較安全,還可以吹出笛音。

小傢伙當然很高興,拿著它一路吹著玩。看著她純真可愛的模樣,心裡有股形容不出的感動。

星期六, 12月 03, 2005

Obviously ..., so ...

那些東西是「不證自明」、「明顯不過」的呢?

前一陣子某篇post的回應裡,MPH 舉出「刻卜勒的猜想」這本書裡,提到知名數學家也會犯類似的 "Oh, it's obvious!" 錯誤(或可說是「傲慢」吧),看了真的頗有感觸。

也就像 Ankh 對同一篇 post 的回應,什麼樣的東西才算 "obvious"、才算 "trivial"、才算 "clear" 呢?

Papadimitriou 有一本很有名的課本「Computational Complexity」,已經接連著約十年,被台大資工所拿來作為理論課程的教本了。這本書內容廣泛、證明也多半相當漂亮。但是,有多少人會注意到,它有一個證明「應該」是錯誤的呢?

經過了這許多年,似乎沒有太多人注意到這個問題,而更正版也沒有修正。或許,因為這本書的主旨是在「Complexity」,不是在「Logic」,所以很少人在意吧。

說是「應該有錯誤」,是因為我認為它證明有誤。但是,人家可是大師級的理論學者啊,或許是我自己弄錯了呢!(問題出在哪裡呢?出在它前四行半的鋪陳,拉拉雜雜說明了許多沒錯的事實或推論;但這些並不能得到「So, ...」之後的結果。由此觀點來看,這和「芝諾的烏龜」,是不是也有異曲同工的味道?)

我想起時下的一些政治評論與財經報導。許多「看似有理」、「假借客觀方式論證」的文章,通常都會先東扯西扯地說許多沒什麼相關、但也沒怎麼錯的觀察(但通常有意無意地忽略了相反的意見),然後就突然跳到結論。

不甚明白:他們究竟是想說些什麼、是不是真的知道自己想說些什麼。還是,他們其實另有所指、別有所圖?