星期四, 6月 29, 2006

公孫策說唐詩故事

小時候,我應該也是很喜歡聽故事的。

只是,隨著年歲漸長,越來越少看到精彩的故事,也漸漸地沒有了夢想。

然而,中國的歷史故事,其實是相當精采的。只是,在自己的求學時期,似乎很少碰到會講故事、會解說故事的老師。對於一般陳述歷史的書籍,自己通常看過了也沒有什麼特別的感受、看過了也摸索不到故事的精華。

前些時日,在書店看到一本「公孫策說唐詩故事」,隨手翻了幾頁,卻也因而喚起內心深處的渴望。雖然看過了之後,對許多書中介紹的唐詩還是「有看沒有懂」(這本書並沒有解說唐詩 --- 連翻成白話文都沒有!),但閱讀公孫策介紹說明的歷史故事(以及偶而加入的提示或評論)後,自己卻似乎對於人生的起落、戰爭或政治鬥爭的黑暗,隱隱有了更深一層體會。

對我來說,這是一本值得閱讀的書。它讓我再次回味許多「似曾相識」的歷史故事、再次旁觀古時名人將相的精彩人生(雖然許多故事的主角都是以悲慘的結局收場),也似乎讓自己對時局、環境、乃至生活際遇,感受到不一樣的厚度。

星期一, 6月 26, 2006

數獨 (Su DoKu) 的程式解

據說,靈長類的動物,都喜歡玩遊戲。

或許是出於天性,自己一直對於益智遊戲頗感興趣。而設計程式,不也是為了解決某個問題嗎?因此,從某種角度觀看,也可以將「不算複雜的程式設計」,當作一種益智遊戲。如此一來,程式設計與實作,就相當於發展出「如何找出遊戲答案」的方法了。

或許是由於媒體的炒作與推波助瀾,數獨 (Su DoKu) 在這幾個月裡,似乎吸引了不少閒暇排遣的大眾目光。上網路書店博客來查了一下,光是書名包含「數獨」的資料,就有 45 筆呢。

數獨的遊戲規則很簡單,就是在一個 9x9 的方陣中,給定一些 1~9 的數字;然後遊戲玩家必須在其他的空格裡填入 1~9 的數字,讓方陣的每一行、每一列、以及(將方陣切分為 9 個) 3x3 的小方陣裡,都不重覆地出現 1 到 9 的數字。

例如,下圖左方就是一個數獨問題的盤面,而右方則是這個問題的(唯一)解答。


解解數獨,就像是以往令人懷念的填字遊戲,可以在閒暇時鍛鍊自己的腦力。不過,對關心程式設計的人來說,怎樣寫出一個「能夠自動解數獨」的程式,或許才是有趣點。

這個問題並不難,網路上也已經有豐富的相關資源。用 Google 搜尋 Su Doku,很快就可以找到許多數獨相關的網站,有的提供線上遊戲,有的則連程式的原始碼都附上了。

但說實在地,在看過答案(程式原始碼)之前,自己思考、設計與實作這樣的程式,還是有趣得多(雖然,花時間做這樣的思考與實作,沒能得到什麼實質上的回饋)。而我不是也想整理些有趣的小程式嗎?數獨或許是一個不錯的主題吧。

因此,花了些時間,自己用 PHP 開發了一份解數獨的程式。貫穿程式的演算法,是 number-of-choices(可能的選擇數目;或者說是可能性)的想法,以及 backtracking(回溯)的機制。 Number-of-choices 的意思,是找出每個空格裡,有多少種可能的數字;而 backtracking 則是當程式發覺某條路走不下去時,回溯到先前的狀態,換另外一條路走。

對於上圖左方的問題,每個空格「可能出現的數字」總數(可能性),就如右圖紅色字體所示。例如,從左邊數來第三格、上邊數來第三格,原本可以填 1~9 的任意數字;但因為同一列 (row)已經出現數字 1, 2, 3, 7, 8,同一行 (column) 已經有數字 2, 3, 4, 5, 6,且同一個 3x3 子方陣已經填有 2, 3, 5, 7,因此這個格子裡,不可能填 1~8 的數字,它的可能性(用紅色數字表示)只剩下 1。

可能性為 1 的方格,表示已經可以決定這個方格內的數字。因此程式可以將這個數字找出來,填寫進去,然後產生一份新的盤面。接下來,重覆運用可能性的觀念,計算這個新盤面裡每個空格的可能性,可以算出更多可能性為 1 的方格數字;如此反覆計算,最後就可以得到解答。

困難些的數獨問題,會讓盤面裡的每個空格,可能性都超過 1。例如,下圖左方的盤面,每個空格的可能填寫的的數字總數,就都大於 1(用紅色字體標示於下圖右方):


遇到這樣的盤面,我的程式會尋找目前具有最小可能性的方格(如果有數個方格有相同的最小可能性,就選擇「填入數字後,能夠降低最多其他方格可能性」的空格來填),猜測一個可能的數字,然後看看填入這個數字後,是不是能夠找到解答。如果最後失敗了(有某個空格可能性小於或等於零,意味著找不到解答),就表示這個數字猜錯了;這時程式會退回猜測前的狀態,重新選一個數字,然後繼續找尋問題的答案。

有時,一個數獨盤面也可能得出多種解答。至於上圖那個「比較困難」的數獨問題,很容易用程式算出唯一解:


雖然想要藉由這類的益智問題,來介紹、討論程式設計的一些相關課題,但還是懷疑自己是否有足夠的能力、毅力、與恆心來完成。既然對自己這麼沒有把握,那麼先利用 Blog 記錄一些目前的想法與結果,或許也是個不錯的作法吧。

後記:原先我把 number-of-choices 寫成 degree-of-freedom(自由度)。雖然「有多少種可能出現的選擇」(number-of-choices) 多少也代表「可自由變化的程度」,但 degree of freedom 是一個廣被接受的 well-defined term,還是不要錯用、亂用比較好。

星期五, 6月 23, 2006

還是想整理些什麼...

這一份 post doctor 工作,轉眼已經從事將近九個月了。

回想當初,本來是想在四十歲左右,嘗試整理一些曾感興趣的程式設計題目、並寫寫相關的技術文章。然而,過沒多久,因為發覺這份工作有兩件值得去做的事情(寫一篇多年前未完成的論文、設計實作 THDL 檢索系統的 prototype),因而就把「想整理些有趣問題」的事情給忽略、耽擱了。

這一陣子,論文已經寫完一篇,prototype 也經設計、實作、並轉交給實驗室學弟妹們。此外,上個星期也度過一個愉快的旅遊假期。因此,似乎是是時候,想想自己接下來,該做些什麼了。

雖然工作上的正經事大致上都告了個段落,但最近自己其實也都沒有閒著。其中一件與實驗室相關的事,是「指導」學弟做研究。MPH 在他的 Blog「標準差」裡,曾提到他以一個局外人的身份,在口試當天發覺一位碩士畢業生對於基本觀念的誤解。他覺得頗不可思議(畢竟,台大資工還是執台灣學術界資訊領域的牛耳),但我卻覺得,類似的研究品質,目前應該是「相當普遍而常見」的。

對實驗室的某位學弟,雖然他的碩士論文已經撰寫了數十頁,而學校的畢業典禮也已經結束,但自己對那些「研究成果」實在看不太過去。因此,這兩個星期,藉由討論作為起點,我建議學弟從不同的角度來看待他的那些研究、「指導」他調整研究焦點與聚焦方式。

但一有空閒,整理「小而有趣的程式設計專題」的念頭,就還是會不時浮現出來。也因此,自己最近也花了不少時間,寫寫一些小程式。這些程式雖然體積不大,但撰寫除錯還是很耗時間與精神。有時,我真不禁懷疑,自己在寫程式上的「生產力」,是不是下降了許多呢。

星期一, 6月 19, 2006

收心

遊玩了一週,似乎是該收收心,回到日常生活(工作)了。

其實,把「幸福」和「收心」等等世俗貪戀與用語拿來記錄生活,就較高的理論層次來說,類似於「此地無銀三百兩」,可說是一種恐懼心理的反應。

就如同阿尼所說,「你放棄了一切希望,不再有目標和慾望,也不在口中談論幸福。此時, 世上的辛苦,都不在你心頭,你的心才得到歇息。」真正的幸福、實際的收心,是不需要說、也不需要寫的。

然而,或許世俗的人,就是需要世俗的提醒,才能夠在修習與實踐中,找到自我的覺醒。也就是說,我承認自己並沒有什麼自覺,也沒有什麼實踐力,因而偶而需要「賣弄」、需要「世俗羈絆」、需要經常的自我記錄與反省、更需要身邊親友的支持與鼓勵,才能夠讓自己的心靈,有著那麼些微不足道的提昇。

因此,「收心」也只是告訴自己,雖然上週的度假旅遊令人迷戀;但接下來,是該提醒自己,回頭專注日常工作的事務了。

星期六, 6月 17, 2006

墾丁四日遊

這幾天離開台北,來個四天三夜的墾丁遊。

不過,並沒有照片留下來,因為相機在海洋生物博物館遺失了。我懷疑是被扒走的 --- 坐在長凳上觀看大洋池餵食,坐姿幾乎都沒有改變,但在短短數分鐘內相機就不見了。這讓我花了許多時間才調適好心情,並繼續讓小傢伙在戶外的親水區戲水遊玩。(由於遺失相機,我問寶寶這下該怎麼辦。小傢伙說,再買一台就好啦。看來,她比我還看得開呢。)

因為現在的旅館幾乎都有提供無線上網,出門前曾考慮要不要帶筆記型電腦。最後,我還是決定把電腦留在家裡,因為這樣子可以讓自己與網路世界斷隔數天,因而更有休閒旅遊的感覺。

長途開車是有些累。更糟的是,對於初次到訪的旅客來說,台灣的高速公路號誌,還真是不友善。去程應該在高雄的五甲系統轉接 88 號快速道路,但一不留神就錯過了。此外,回程在台南附近也走錯了一小段路,因為號誌與出口離得太近,等看到號誌時,已經來不及切換車道了。

大致上,我覺得恆春半島的景致相當好,處處洋溢著南國的氣息。墾丁的天氣雖然炎熱,但卻不會覺得黏溼不舒服。此外,我們旅遊的時段屬於「非假日」,交通也相當舒暢。

今早一覺醒來,自己似乎還有著些微醺的奇妙感覺。旅遊,也是一種幸福。

星期一, 6月 12, 2006

幸福,可以是個動詞

幸福,要懂得把握,也值得珍惜。

記得當學生時,就聽老師們說過,當學生是人生最幸福的時期。從前聽不甚懂這些話,雖然同意學生的生活單純,但是單純就代表幸福嗎?

或許,學生們之所以幸福,是在於目標很單純。只要把書讀好(考試得到好成績?),就算是漂亮地完成任務。今早在報紙上,看到「威爾許談致勝」專欄裡,Jack Welch 說,「出人頭地之道,就是要超額付出... 過去老師交你只要回答問題就可以得到 A+,但在企業界要得到 A+ 的評語,你得突破公司期待,讓公司喜出望外;你要回答問題,還要回答老師沒想到的問題。」

說得真是漂亮!或許自己從前一直以為,以自己的想法來「做好事情」就好了,但其實這樣是不夠的。事情真的有被「做好」了嗎?自己是不是因為現實層面的各種牽絆,很容易就妥協、很容易就降低標準了呢?

真實生活的問題,通常複雜而難解。要看出複雜面向背後的一致性,並且了解如何利用這種一致性來取得大眾的認同,或許才更有價值。那麼,自己是真的能夠感受這些問題、分析過這些問題的各種面向、也腳踏實地去解決它們嗎?

這是否就是所謂的「活在當下」呢?過去的以如雲煙,未來卻遙遠而不可知,能夠把握的,就是現在而已。或許問題的癥結點,正在於「說的比做的多」,在於缺乏將思想轉為行動的勇氣,缺乏實踐的恆心毅力。

珍惜幸福的感覺,這幸福是個形容詞。然而,若用動詞的角度來詮釋,幸福其實也是需要去「做」、需要去實踐的。經過實踐,幸福才有生命,才流露世間溫暖、才彰顯人性光輝。

我覺得,幸福可以、也應該是個動詞。

星期五, 6月 09, 2006

當電腦介入生活

不知不覺間,自己的清醒時間,多半被電腦給佔據了。

電腦與軟體應用,真的已經深深地介入我的日常生活。早上帶著 Notebook 出門,工作時緊盯著螢幕看(寫程式、製作文件、上網瀏覽、檢查電子郵件),就連晚上回家的空閒時間,都似乎被電腦給綁住了。

這個情形,我想自己的寶寶最是清楚。她會說,「爸爸,陪我玩嘛,不要看電腦啦~」。雖然驚覺似乎不該如此,但卻仍難以抗拒「寫程式、製作文件、上網瀏覽、檢查電子郵件」的誘惑。

今早 Blogger 出現了一些狀況:


Blogger 服務出現網路壅塞,連線不上,已經是個「頗常碰到」的問題了。現在竟然還會刊登一份「unexpected technical problem」的訊息,強調「our engineer is working hard...」,這是不是也說明了「做好網路服務」的困難性(至少,軟體必須有足夠的容量與能力,來處理如此大量的訊息處理)?

習慣使用網路的服務後,對於軟體的品質的要求,似乎不知不覺提高了。Ankh 前些時日在他的 Blog 裡,聊到對於 Google 出現了一些負面聲音。在回應裡,我也提到最近 Gmail 在郵件編碼的處理上,似乎顯得不夠周全(對使用者的顧慮不足)。

能夠享有這些應用服務,其實是世界上很多人,經過長時間努力的結果。可是,人在適應後,往往會忘記應該對此「感恩惜福」。或許,在現今重視功利的資本主義下,人們因為激烈的社會競爭、因為承受著過度的資訊負載,早已不能(也無力)把這些服務視為「享受」了。只是,如此一來,我們的生活品質,真的有因為前人的努力,而得到良好的提升嗎?

星期三, 6月 07, 2006

古契書的亂碼問題

這一陣子比較空閒,幫實驗室繼續處理一些「古契書檢索應用」的工作。

去年十一月,在「談古契書資料處理:之一」與「談古契書資料處理:之二」的 posts 裡,我曾提到「古契書中文編碼」的一些問題。

當時的問題之一,是「編碼標準」的衝突:將古籍數位化的人員,寫程式的人員、MySQL 資料庫、M$ 資料庫...,經常使用不同的編碼格式(常見的格式是 Big5, Unicode Little Endian, Unicode Big Endian, 與UTF-8),因而造成後續資料處理的困難。

經過一些討論後,實驗決定統一用 UTF-16LE 來儲存「文件數位化後的純文字檔案」。因為我的 THDL Retrieval Prototype 當初所用的文獻集(corpus)只含「明清檔案」的部分,而明清檔案的內容不像古契書那麼「古怪」,所以制訂好儲存的編碼格式後,似乎就解決了一大部分的問題。

這兩天處理古契書,又遇到「亂碼」的問題 --- 某些文件中,大概有超過三分之一的亂碼。為什麼會有亂碼呢?一部份的原因,是有些古契書是用日文書寫的(不要忘了,日本人曾統治台灣許多年);而有些古契書裡用的字,在編碼表上找不到對應(像是台大八魚社,四條魚組成一個字,就好像找不到對應的編碼)。另外,還有一部份的原因,則是因為數位化的人員想保存契書的書寫樣式,因而引用了多個 Microsoft Word 的物件,讓自動擷取文字的工具「誤判」而產生亂碼。

看個例子好了(因為剪貼也會經過轉碼的處理,所以許多原本「更古怪」的亂碼,在此已經被轉成問號了):

立遺囑鬮分書字人陳金山娶業林氏生水兄弟七人長曰杉奇次曰賜਍ഀ
能三曰勳珍四曰允固五曰五港六曰六賽七曰七子□母續世□詣子凜਍ഀ
命營鶯俱以完娶各齊承受繩繩是心之所欣慰也有積餘資創建各਍ഀ
處等業但余罕਍ὔ浵䅥⑾停쵠ὓ챵饚粖ᑑ텎蚏鍏൱上進數被宗਍ഀ
□侵漁難以總理似應分爨爰請房親姻戚共相酌議將兄弟鬮分應਍ഀ
份及已置山場山茶水田物業先抽起਍඙贊業段又抽起長孫田業其餘山場茶਍ഀ
畬水田物業以及家□往來賬項公仝配踏作七房均分至公無私禱神拈鬮਍ഀ
為定各應安分照鬮掌管自今日既約之后務各立志恢宏永敦和睦各自經਍ഀ
營創建各業各管਍靎ⵟ睲ㆁ豙⍔䙬偏⦆⅓酱왡쭢空톐⹖ڛ൒
਍坦͛᥎}⍎歛ћ綾㡘恬몐杰㥱⪋螂푸ї啔䎆涅⹩ڛ鵒땨ᝫ๒蹦൝

亂碼就亂碼,有什麼好大驚小怪?問題出在,亂碼轉來轉去,經過多次處理後,會變得越來越莫名其妙(非常符合「Garbage in, garbage out」的原理),而這樣會增加檢索前置處理的困難(有時,經由 regular expression 處理後會產生「原本不預期」的結果;有時,MySQL 會拒絕寫入資料)。

看來,項老師想做 Histoinformatics 的研究,要走的路還頗長呢!

後記:回家後發現這兩天與「古契書」奮戰的結果是:眼睛疲倦、肩膀痠痛。咦,我不是想好好地休息一下嗎,這麼辛苦做什麼啊?

星期一, 6月 05, 2006

林間的岔路

自己雖然文學的素養不怎麼樣,但有時對詩文還是有著難以言喻的感觸。

前些時日收到書商的廣告信,推介一套中譯的詩集。心想家裡的書都已經堆到地上啦,怎麼還有空間置放數十本的詩集呢?正要把廣告信扔進回收桶,卻一眼瞥見佛羅斯特(Robert Forrester)一首有名的詩:

黃樹林裡有兩條岔路,
很遺憾我不能都涉足。
我孤單地站立良久,
向其中一條極目望去,
看它彎沒在林蔭的深處。
多年後的某時某地,
我回憶此刻將輕聲嘆息。
樹林裡岔開兩條路。而我,
我走了人跡較少的那一條,
因此有了完全不同的人生。

這首詩寫景、寫實,卻又兼喻人生選擇的意境。每個人都有自己不同的人生、每個人也都有自己的路可以選擇。詩人選了人跡較少的路來走,但一般人多半難以抗拒社會的規範、渴望得到他人的認同,因而幾乎都是「跟著前人的腳步走」啊。

不同的林間路,有著不同的林間景致。不同的人生、工作選擇,會有著迥然不同的人生體驗。只是,此時此刻,自己的選擇,又是什麼呢?

星期五, 6月 02, 2006

「資訊超載」讀後感

這幾天重新閱讀一本多年前看過的書:「資訊超載」。

雖然中文的書名叫做「資訊超載」,但這本書的原文名稱是 "Data Smog",或許直譯為「資料煙霾」比較貼近原書的意旨。然而,如果譯者真的這樣直接翻譯,書名就顯得太過古板饒舌,無法吸引具有潛在興趣的閱書人罷。

這真是個飽食 (glut) 的年代啊。從許多年前,自己就深切地覺得,在現今的資訊社會下,龐大的資料與資訊,經常讓人注意力無法集中、讓人思考的品質下降。資訊過載 (information overload),就像是吃多了食物,自己不但感受不到餐點的精美、甚至被龐大的攝食量給噎到了。因此,會被這本書的書名所吸引,甚至在多年後重新溫習一遍,也似乎「有跡可尋」,而顯得理所當然。

坦白地說,我覺得這本書的論述,組織得並不是很好。不過,它的內容還是頗值得自己花些時間,靜靜地思考問題本質,與接下來的應對方式。

就像數個月前看過的「選擇的弔詭」,強調過多的選擇未必是件好事,「資訊超載」這本書也強調過多的資訊造成人們注意力不集中、鍛傷人們的理解力、危害人們思考的品質。資料與資訊的成長速度很快,但人類與生俱來的能力卻無法仿效莫爾定律,每一年半就成長兩倍。

大致上,這本書的論述,是在強調一些資訊超載所造成的問題:

  • 商人們藉著各類的「升級」來販賣資訊焦慮(不升級就無法處理新的檔案格式、不買就不上時代)。

  • 各門領域的專家大量發表結果衝突、讓人無所適從的研究報告(微波爐、基因改造食品是否有礙健康?廢止核四是否真的對台灣有利?)

  • 網際網路雖然有益於小眾媒體的興起,讓關心特殊議題的人們有聚集討論的場所,卻無法凝聚大眾的共識、無法增進大眾溝通的質與量。

  • 要能夠深入學習一項主題,需要的不是一連串的新聞快報,而是對情勢有詳細與周全的分析與評論。(因而,作者也建議媒體 -- 尤其是印刷媒體 -- 不僅要「告知」訊息,也要扮演「資訊守門員」的角色,甚至「教育」讀者。)

  • 所謂的「資訊窮人」,他們最需要的並不是網際網路,而是基礎的教育、以及好的老師。(這一點頗有趣,它似乎隱隱在說,US$100 的電腦其實並無法解決「資訊落後」地區的教育問題...)

或許是因為人類本就是在「未知前景的狀況下努力前行」,這本書最後所提的藥方,仍然離不開傳統的建議:追求簡單的生活、讓自己做自己的主人(不要過度信賴代理程式來過濾資訊)、關掉電視、每天多留一些時間看書...。看起來,要掙脫人類造成的資訊垃圾,需要的還是傳統的智慧,而不是「似乎越來越聰明」的軟體工具啊。