2008年12月26日 星期五

英雄傳說 空之軌跡 FC 的手機版!

從 herbage 那聽來的,《英雄傳說 空之軌跡 FC》 在 i-mode 推出手機版。沒想到現在的手機已這麼強大。資訊硬體的前進真是日新月異啊,為什麼軟體的發展不會讓人有這麼強的驚豔感呢?也許是因為比較常接觸吧。

我到是從來沒想過在手機上可以做到這麼複雜的遊戲,轉念想想,PSP、 NDSL 可以做到的,為啥手機不行?只是以前沒想過結合起來會有商機,總覺得分開使用是很自然的事。未來的各項電器設備都會愈來愈複雜啊,也許那天馬筒和遊戲機或電子書整合也說不定,如此一來上廁所時多些事可做。

2008年12月25日 星期四

又回到了研究生活

當我做好準備踏入業界加深工程師能力時,沒想到只晃了一小圈,又回到半年前的研究環境。唯一不同的是,這回不再是研究和生活混在一起,而是規律地到公司做研究,下班回家過生活。沒有學位,多一些薪水。

看著 Wikipedia 上的一堆數學式子,腦裡許多思緒翻滾著,回想起學生時代在宿舍的事,拼命地唸書、拼命地看動畫、考前到浩然閉關 K 書,還有和朋友們一同讀書玩樂的大小往事。往事不斷地浮上心頭,我忽然明白,從前那個 Just for fun 的自己,不會再回來了。現在的我,無法再單純地讚嘆數學式子堆砌出的結晶世界,而是不斷地想到這式子對現況有幫助嗎?而難以將數學看入腦裡。

想到許多朋友的近況,自己也該振作努力才是。一陣一陣的消沉,就隨 Blog 的記錄而褪去吧。

2008年12月22日 星期一

成功嶺新訓心得

若要說當兵最大好處為何,我想大概是讓人可以滿懷感激地服替代役為社會服務吧。總要有很糟的屎缺存在,才會讓人愉快「自願」地去做辛苦卻必要的事。

到成功嶺新訓後才發現,和不同背景的陌生人要找共通話題真是困難,不同研究所形同不同的世界,難怪一群男人聚會時免不了重聊當兵的事,那是唯一所有人的共通話題。既然是共通話題,也沒啥新的感受,不外乎是無腦的操練,精髓全在「一個口令,一個動作」裡,別多想多做,拿捏尺度偷吃步,一切就會過得很順。若要說有什麼受益,除了重新回歸規律作息外(沒想到冬天早上六點起床是如此容易的事!),就是認識許多不同背景的人。只可惜明明空閒時間很多,卻得消磨在折綿被、出公差裡,所以也無法和大家做太多深入認識。

嘗試過幾次後,我發現大部份人聊專業的意願也不高,大部份的話題也是東拉西扯,遇到背景雷同度高的人時,話題就多一些。對我來說,我是比較想多了解不同專業的特點,可惜沒聊到太多,挺多發現不管是化學物理生物電子等系所,都會用到電腦摸擬。還有,這些人都會寫程式,可是對軟體開發的理解很淺。像是某公司有各種不同版本的程式,用在有細微差異的產品上,可是沒用版本管理系統,而是用不同檔名區分。

除專業能力外,帶部隊的技巧也很有意思。整隊點人數的流程很讚〔*1〕,快速確實掌握全體人數和不在的人員為何,不過到是想不到這類技巧能延用到什麼地方。既然整隊和行進的流程都一樣,照理說帶隊的情況應該差不多,但由不同人帶部隊行走或整隊,情況卻差很多,這才注意到技巧差異,關鍵在於有沒有花心思肅立形象,以及和部隊交心〔*2〕。說來說去還是那些與人相處的大道理,不管從事什麼行業,為人處事、態度這類老掉牙的東西,確實仍是最重要的。

備註

  1. 整隊流程是先請全員蹲下,再請各分隊排頭站著點人,點齊就蹲下,於是指揮者等個十秒看那些人站著,依序口頭詢問立即可掌握各分隊(班)缺少的人員。接著全員合併成 5 * n 的隊形,第五列最後一員負責指揮前面的人回補,確實補成每行 5 員,於是第一列人員依序報數,掌握行數(n = ?),待報數完,第五列最後一員再報告最後一行缺 k 人,於是 5 * n - k 就是全隊人數。得知全隊人數的流程不用三十秒吧。
  2. 除平常要打好基礎外,開罵時也是有技巧啦。如同音樂一樣,要有高低起伏,有平靜和忽然大聲的語氣反差,以及運用適當的沉默制造壓力。觀摩隊長們罵人的情況,也許可以吸收,化為和人談判時的技巧。

2008年12月21日 星期日

冬至吃湯圓

瓶子裡沒開水已拖了一天,於是問了室友們要不要一起出去加水,組成了週日晚上加水團。

現在住的附近生活機能挺不錯的,走沒幾步路就有個加水站,礦泉水20公升40元。全家、萊爾富、超市、7-11、書局,應有盡有。早上為了買湖池屋洋芋片,連跑了附近的全家和萊爾富,都沒著落,到是意外發現旁邊一家超商,貨滿多的,也有比市面價便宜一點,最重要的是有賣《愛之味》「鮮採蔬果汁 100%」,而池田屋洋芋片則是 30g 包裝16元!...似乎完全離題了。

加完水回家後,聊到今天是冬至,說要不要來吃湯圓,他有買芝麻口味,素食可食。為了應景,就這麼開始了超快結束的湯圓團。

首先由羊貢獻食材:湯圓六顆,接著是大廚黃哥加入剛剛才加回來的開水,放入六顆湯圓,煮一下下,撈起。一人兩顆,啪啪,不到一分鐘全員用餐完畢,由我殿後洗碗。就這麼確實速決地結束了冬至湯圓團,似乎少了點聊天打牌的氣氛啊。

備註:是黃哥提到昨天夢到大家在打牌,大頭也在,而且牌的玩法還變了。沒想到成員中打牌興致最低的黃哥,卻會忍耐不住先夢到打牌的事,真是意外。

2008年12月7日 星期日

Firefox 無法開啟新分頁 (New Tab)

最近不知為何,升上 Firefox 3 後變得不能用中鍵開新分頁,這樣一來 Firefox 等於殘廢一大半,根本不能用。試了一陣子終於找到解法。

重裝 Firefox 也沒用,原本想降回去用 Firefox 2,但官方公告說不久後不會支援 Firefox 2,只好打消這個念頭。網路上的文章大多指出是 Google Toolbar 新版的問題,不過我 disable 或 uninstall 後也沒效。後來索性用 Safe Mode 關掉所有 Add-on,結果就好了。於是再換回一般模式關掉所有 Add-on,也是好的。再把 Google Toolbar 3.1.20081127W 裝回去,仍是好的,怪哉。

Anyway,總之 Firefox 能用後就方便多啦。

備註

移除 Google Toolbar 的方法是在開著 Google Toolbar 的情況下,按 Setting -> Help -> Uninstall。

2008年11月16日 星期日

伊蘇 - 起源 (YsO)

趁著前陣子週末的空檔,終於買了 YsO 來玩。

YsO

YsO 的操作方式和 3D 畫面看來和前兩作 YsF、Ys6 差不多,但娛樂性是更上一層樓。 Ys 系列最大賣點的魔王戰,更是大勝前作。如同前作,魔王戰時玩家會不斷重覆「被KO -> 找出破綻拆招 -> 魔王換招」的循環,直到看透王的所有招式,以最少的損血擊敗王,或是拼到最後一滴險勝魔王。更棒的是, YsO 多了新的戰鬥方式,有時要跳到魔王身上攻擊,特別是打蜈蚣時得在魔王身上跳上跳下的,超有打魔王的感覺!而且也大幅減少之前的彈幕問題,降低玩 STG 的錯覺。加上雙主角 + 隱藏主角的三角色模式,可以享受三種不同的戰鬥方式,有戰士 Yunica、法師 Hugo、以及反派角色 Thor (魔人化吸血超威!)。

YsO
( 圖片來源 4Game.net

全破後出現的競技場也很有趣,享受英雄一打全的刺激,像 Yunica 可以帥氣的放出不死鳥掃台,Hugo 可以開防護罩龜到角落放魔法,Thor 可以超兇猛地殺進魔獸群中拼命吸血,無視敵方的圍毆。多樣化的戰鬥,讓我 YsO 硬是比 YsF 多玩了十多小時。三線合一的劇情也做得不錯,為了了解劇情的真相,一定得先用兩位主角全破,了解劇情大概的面貌,再用隱藏角色全破,了解背後真相。YsO 從各方面來看,都有不少突破。遊戲操作也很順暢,也保留 YsF 的傳送到各個已拜訪過地點的機制,減少因劇情事件得浪費時間在各地奔跑。

YsO - Goddesses

講了這麼多優點,YsO 也是有不少缺點啦,像是場景完全限制在塔內,比前兩作規模小很多,靠著三角色玩三次撐場,才補足遊戲太短的問題,三線合一有部份是平行世界,若能完全做到三個觀點同一世界就更棒了。音樂雖然比 Ys6 好,但比 YsF 差多了,Hugo 的劇情簡陋又無趣(幸好 Epona 的傲嬌很萌,補正了一點),Thor 的 CG 圖有點像硬塞進劇情裡,銜接的不順。

整體來說,我心目中的評價是 YsO = YsF >> Ys6。YsF 贏在畫面和音樂,遊戲性也不錯,YsO 小缺點一堆,但三種玩法和三線劇情會合的作法,很有意思。

2008年10月23日 星期四

Reverse linked-list

剛才看了《The Guerrilla Guide to Interviewing (version 3.0)》,立即想重寫 Joel 提到的兩題面試關鍵題:“reversing a linked list” 和 “detect loops in a tree structure.”。後者很簡單,前者要更動指標內容,記得初學 C 時讓我奮鬥了很久,想來看看自己現況如何。

完成的程式如下(全文見這裡,記得用 gcc -std=c99 編譯):

Node* reverse(Node *node) { if (!node || !node->next) return node; Node* head = reverse(node->next); node->next->next = node; node->next = 0; return head; }

若是以前的話,大概不能這麼自然地寫出簡潔的 code,看來學過 scheme 果然有差,變得較能從高階觀點堆砌程式,也就是將 function 看成基本單位,如此一來,遞迴是自然而然的事。得找個時間練練 functional language,這計畫不能放棄。

2008年10月16日 星期四

中翻英,線上翻譯測試 - Google Strikes Back!

剛才無聊看看 Google Analytics ,發現本站最熱門的文章還是那篇《中翻英,線上翻譯測試》,我不知該說什麼,這不是件令人高興的事啊。總之,一時興起又來測看看。

最近 Google 翻譯似乎變強了,果然有在學習啊!輸入問題如下:

我要代替月亮來懲罰你

兩年前 Google 的回報令我很失望:

I want to punish you replace Moon

沒想到現在 Google 幾乎翻對了

I want to punish you in place of the moon

google 一下會發現有不少人提到類似的句子,附帶一提,個人心目中最完美的翻譯是:

In the name of the moon, I will punish you!

其它家翻譯結果沒什麼變,就不再貼了。

另外再測了之前亂測的中文詩詞,有些變化,不過說不上是變好變壞,都很糟就是了。看來博大精測的中文仍是機器翻譯無法跨越的高牆,也是國高中生們無法跨越的牆啦

2008年10月13日 星期一

碩士研究生涯回顧 (4)

最近週末都在打 YsO,不小心就拖稿了。

上回提到碩一上的結束,我終於確定研究方向為 social bookmark。碩一下修指導老師開的 Data Mining 和必修課 Formal Language。由於我兩門課都有些背景知識,沒花太多時間在課業上。學期初滿認真地做研究,也在 delicious 的 tag 裡找到一些有趣的訊息,像是人們提到 usb 時,容易聯想到 portable [*1],我猜這是因為隨身碟是最熱門的 USB 產品而帶來的印象。後來斷斷續續想了些相關點子,可惜沒足夠的時間做進一步的研究。

結果後來被會長拐去參加比賽,加上專題生的比賽,同一時間報了五六個比賽吧。原本想亂槍打鳥,看那些發展較好就做下去,結果都有過初賽,搞得寫完初賽報告就不想比了(一口氣寫太多報告把參加整個比賽的力氣用完了)。最後大多爛掉了,幸好還有一兩個有好成績,像是去西安參加微軟思源競賽,是滿有趣的經驗。這算是我參加過的比賽裡,自認為做得最有成就感的,開發速度快,demo 效果不壞,報告也滿成功的。我們做的產品 BNW (Brand New World)用來比較公司品牌或產品。輸入公司或產品名稱後,BNW 會彙集網路上的直述句,再計算出分數。

Brand New Wrold

上圖是其中一個 demo 例子,比較四家公司的品牌。資料只是 web 上的一小部份取樣,不見得能反映實際情況,但不管怎麼說,我們是去向主辦單位 Microsoft 報告,這個結果還挺尷尬的,最後決定在簡報時快速帶過這張,免得被人誤認為是去拆台的。另外,當時看了相關研究「Opinion Mining」,主要是看 Bing Liu 的論文和書,滿有意思的。比賽結束後老師問我是否有意延伸這方面的研究,不過我覺得資料難以取得(比賽時有 MSRA 支援),而且我比較想做 social bookmark 的研究,就結束掉這個小插曲,而碩一下也這麼結束了。之後是碩士兩年裡最發光發熱的暑假衝刺時期,後來完成的兩篇論文,都是在這暑假內完成一半以上的內容。

ps

*1 我用 association rule,發現”usb” -> “portable” with confidence 80%,”portable” -> “usb” with 60%。

2008年9月30日 星期二

碩士研究生涯回顧 (3)

前回,仗著大學時抵掉四門選修,碩一上我只選了一門課。多出來的時間...又被雜事耗掉了。

當時 Web 2.0 風潮正在快速成長,引起我的興趣,開始試著自己架 wiki 管理知識、架 Blog 寫文章、從 delicious 中找不同的知識。當時覺得 web mining 很有趣,資料容易取得(就 crawl 嘛),又貼近生活,若研究有所發現,樂趣更多。當時已有一大票人發表 Blog 相關 paper,但不知為何,bookmark 相關的 paper 到不多,而我覺得 bookmark 的知識價值很高,於是就選定 delicious 做為奮鬥目標,試著從中找點子。於是碩一上就這麼結束了。

那麼這個只修一門課的學期,我到底在做啥?

OpenHouse 資訊組組長(這網址每年都會變,舊的大概都不會留)、當 DS 助教、帶專題生、在教研所打工、看閒書、思考人生以及寫 Blog,這段時間也是我學生時期事最雜(一堆會和待做小事,還特地找了記事工具)、閒書看最多和Blog 寫最多的時期。這段生活很有意思,不過研究產能只算過得去吧。寒假時先參加一個有趣的英文營隊,兩週就沒了。看看小說,接 case 學 Rails,花一週 Ruby 特訓,就碩一下了。

唔...名為研究生涯回顧,結果這個時期都在做管理和 coding。

2008年9月28日 星期日

碩士研究生涯回顧 (2)

前回,從兩年前的暑假(2006/07)開始,我的研究方向轉為交通相關的 data mining / data management。想想,我覺得解決塞車問題似乎最有趣也最實用,老師也對這很有興趣,之前有專題生做過簡化版問題,於是就朝此方向前進。

CS 領域內,解決塞車的 paper 到沒很多,不過在 Operation Research 和一些不清楚分類的領域裡,有不少相關作品。塞車相關的研究滿有趣的,像有一篇討論塞車有多糟,或從另一角度來看,我們能解決塞車到什麼程度。印象中這篇 paper 估計,最糟的情況下,無管制的行車時間會是有管制的兩倍慢。另外也有看到其它領域如何解決塞車,像倫敦用塞車稅(congestion road tax)的作法很有意思。我個人是認為經濟學(?)的作法比較實際,以價治量是合理且有效的作法。不過反正問題還沒徹底解決,也可以想想自己的做法。

理想的作法是大家都聽政府或某有公信力的單位指示開車,假設 server (central or distributed) 算得夠快,理論上塞車量會降到最低。於是我將問題切成如下三個部份,準備各個擊破:

1. 若我們有部份車子的車速和位置,如何將這些資料轉為表示即時車速的 graph?
2. 若有表示即時車速的 graph,當我們告知駕駛人如何前進時,如何即時更新 graph,以避免大家走同一條,造成一段時間後的新塞車點?
3. 若有表示即時車速的 graph,也知道如何依駕駛人選的路徑來更新它,要如何在極短時間內算出大量不同需求的最短路徑?

當一切規劃差不多後,我發現這問題很難,三個月顯然作不完,但這題目還沒有趣到讓我想和它奮鬥兩年,於是又找老師商量,可不可以換題目啊...。幸好開明的老師又讓我換方向,但要求我帶新的專題生接手做下去,這是個有趣的插曲,待日後分享心得。

隨著我再度更改研究方向,第一個暑假也差不多結束了,即將邁入正式的碩一。這個暑假到沒做太多研究,被一些「外務」耗掉時間,例如:

  • 花了整整一週寫 Wow! Dice War!!
  • 看完十季的 Friends。一開始還有一邊切換無字幕、英文字幕、中 + 英字幕,後來乾脆都用中文字幕了。
  • 摸索 Web 2.0 相關東西,像 Blog、Wiki、Online Bookmark 等,這大概是和研究唯一有關的外務,後來我轉往這方向找研究點子。

另外還有協助將 lab 學長的論文投出去。我滿喜歡這篇的,完整版的內容比較多,可說是讓有的點都做到了,學長想出兩個新方法,一個可快速找到近似解,另一個可找到最佳解,且效率大勝暴力法。實驗結果說明前者的效率大勝後者,且和後者最佳解的誤差極小。後來論文投上了 DASFAA 2007,老師原本希望我去報告,可藉機認識學術研討會,也許可激發我做研究的熱情。不過我覺得自己不是第一作者,熱情不足,若研討會上有人提出討論,我大概也會興致缺缺,這樣似乎不太好。結果最後老師自己衝去,兩三天內來回的樣子,辛苦老師啦。

2008年9月22日 星期一

碩士研究生涯回顧 (1)

大四上申請上研究所後,花了許多心力找老師,當時我不確定自己對什麼最有興趣,最後挑和 AI 稍微相關的 data mining 做為研究方向,結果發展到後來,沒用到太多 AI 的東西,挺多看別人論文時可以嘴炮一下自己懂的 AI 知識(比方說 Simulated annealingA*之類的)。

無視於大學時期 20% 達成率的偉大計畫,升上碩士前,我又給自己定了一個偉大目標:在碩士結束後,要投上三篇好的 Conference,並且至少要有一篇是 ACM 的。雖說做研究不是為了投論文,研究成果也不是要就會順利出來,當時想說,這樣至少畢業時能投上一篇吧?多少能逼自己更用心地體會學術生活,以便日後決定是否要讀博班。結果在老師的協助上,算有三篇第一作者的論文,不過都只是過得去的成果而已,只有一篇和 ACM 差到邊,和以往的計畫一樣,沒 100% 達成,但也差強人意地可接受啦。

這兩年多內,研究方向轉換超大,大致上的轉換流程如下:

  1. sensor network related problems
  2. social network / graph mining
  3. solve the traffic congestion
  4. social bookmark related problems: focus on tags
  5. social bookmark related problems: focus on bookmarks (URLs)
  6. joint clustering with the connected constraint
  7. social bookmark related problems: focus on users

回顧起來,真是亂七八糟啊...

一開始是大四寒假前夕時,指導老師要我看看 sensor network 裡的 multi-path 問題,類似 network routing 問題,印象中目的是在 sensor network 內傳輸資料,並要省 energy、減少 latency,而且不要過渡消耗特定的 sensors,並免沒電就不通了。但我對網路相關的研究興致不大,也不太能接受 sensor network 的研究方式(或說是前提假設),在和老師反映後,老師建議改看看 social network 或是 graph mining。結果看了一篇 graph mining 的 survey paper,和翻了一些書後,感覺太抽象太難懂,當時又對 social network 有些反感,所以也提不起勁做研究。加上大四下修課花不少時間,就這樣不知不覺地進入升碩一的暑假,並且題目換成交通相關的研究。

老師看我一直換題目,開始擔心我會不會耐不住性子做完一個題目,希望我這回試久一點。想想也對,這次我就試比較久,待下回再來細細分曉。

2008年9月15日 星期一

終於畢業了

隨著碩士生涯的結束,我短暫的學術生活也到一段落。

我一直覺得碩士是很難得的機會,一生一次,長時間投入自己感興趣的事,不用在意是否能成為產品、使用者是否覺得好用,只要自己覺得這解這問題有意義,就已足夠。大學生課業繁重;博士生畢業門檻高,做起論文難免會有得失心,相對來說,碩士簡單多了,可以丟掉學界的包袱,放手一摶。當然這一切的前提都是要找到一個肯讓學生放手試的指導老師啦。我當初找老師時就以此點為第一考量,結果也還不錯。回顧做研究的過程,當真是九彎十八拐,之後再來一一回顧這兩年的心得(連關西行在內,欠一堆稿了...)。

碩士時的生活作息也很難忘,由於我沒什麼課,有課大概也沒去上,我大多是在家做正事一兩小時,休息一兩小時,有時則連續做個三五小時不等,週一到週日維持差不多的生活型態,我滿享受這種生活週期,把做正事和休閒的時間切成許多小循環。可惜上班後就難以維持了(除非能在家工作)。對我來說,一天八小時實在是沒效率的做法,依過去經驗,一天只能全神慣注地做六小時,一天四小時比較不會累,剩下的時間只能做些簡單的事。

除生活作息外,和朋友間的互動也很有趣,可惜的是,當初想多了解各實驗室的研究領域,結果沒能達成。一但專心切入自己的題目,訂好一些時程後,就會開始沒止盡的衝刺,而沒心思顧及其它不相干的研究。

2008年8月31日 星期日

近兩個月使用 Python 心得 + 從 Ruby 對照的心得

最近兩個月都在寫 Python,反而 Ruby 快忘光了...

由於先前有 Ruby 的底子,轉學 Python 的進入門檻低了許多,一年前我和 Scott 聊過,我提些 Ruby 功能,Scott 就提 Python 要怎麼寫;或是反過來進行。當時就覺得這兩個語言的功能很像。經過兩個月的練習,現在我反而比較熟 Python,真是諷刺啊。

個人覺得 Python 和 Ruby 的主要不同是哲學層次的,Ruby 講求人性,給予使用者 (programmer) 極大的彈性;Python 則是有個明確的規則在,講求一致性。「Form is liberating」,我並不討厭 Python 的做法。舉例來說,Ruby 會提供許多別名方法 (alias method),讓使用者可以憑直覺用對功能,比方加一個元素到陣列裡,在 Ruby 裡有以下的寫法:

a = [] a.push 3 a.push(3) a << 3

但在 Python 裡,就只有 a.append(3) 一種。並且,Ruby 讓使用者可以在任何時刻改變任意物件的內容。所以 Ruby 的使用者不用擔心拿不到 third party library 的 source code,反正有啥難處理的地方,在 runtime 直接修改即可。方便歸方便,在大型專案裡意味著寫完函式庫後,作者無法保證使用該函式庫的人會讓函式庫元件照規矩運作,這使得程式碼協同運作充滿危機。

相較於 Ruby 強調直覺帶來的便利,Python 則是制定好最佳規則,照規則辦事。以 exception 來說,Python 遵從有意外就用 exception 的規則,除以零是 exception,dictionary (即 hash table)取用不存在的 key 也是 exception,取用不存在的變數也是 exception。反觀 Ruby,以人性的角度出發,這三者狀況的反應分別為:exception、nil (Ruby 的 null)、exception。從這可看出 Ruby 對 hash table 取用不存在的 key 的行為不一致,但這麼做確實比較方便,省去先查 key 是否存在再取值的動作。另外以查 method 為例,Ruby 的查法很直接(直覺):

[].methods.grep /push/

[].methods 就會顯示 [] 所有方法; methods.grep 就會對 methods 做字串比對。反觀 Python 則是透過 __dict__ 的機制達成:

[s for s in dir([]) if "p" in s] # dir() 會傳回 [].__dict__ 和 [] 父類別的 __dict__

Python 另對 __dict__ 有許多有趣的設計,像是 hasattr(),還有讓 __dict__ 替 function 帶來許多好處 (如 cache,可做到類似 C 裡 function 的 static variable 的效果),這部份太細了,不在此談論。

另一方面,兩者都強調 Everything is object,但對 object 的定義不同,Python 對 object 的定義可參見:《Python Types and Objects》:The Object Within。Ruby 的 OO 很強,Python 沒有 private/protected/package-private/public 這類流行的 OO scope 字眼,反而用變數命名前加底線,暗示使用者有底線開頭的物件是 private/protected,但使用者仍能直接存取。對我來說,我認為 private/protected/package-private/public 實在太難設了,若非經驗豐富的程式設計師,很難訂對,所以不訂也還過得去,省下煩惱 scope 的時間。

除 Unicode 支援良好外,Python 另一令我激賞的特性是 self-document。Python 規定 module、class、function 的文件必須寫在 module 的開頭、class 的下一行、function 的下一行。造成的結果是,許多工具如 ipython 能輕易地將程式碼內的文件顯示出來。只有有些寫程式和文件經驗的人就能明白,將文件和程式分開寫是多麻煩的事,通常下場是文件漏寫,或是文件過期。所以文件和程式愈能合為一體,愈有助於程式碼品質 (code quality)。

其它如 thread 的差異,和 C/C++ 結合的容易度,我還沒碰到無法比較,到是 interpreter 部份值得一提。個人認為好的入門書、好的文件和 interpreter 可大幅減低入門門檻,是否有好書取決於作者功力,這部份兩邊都有不錯的書;文件部份如前所述,Python 的設計相當棒,;而 interpreter 部份,ipython 實在太強了,像 Scott 是直接在 ipython 上寫,再存成 script 檔。經過這兩個月的洗禮,我決定先投向 Python 陣營,只好忍痛割捨 Ruby 寫碼的爽快感。

2008年7月29日 星期二

右腳只是輔助的 (2)

距受傷的日子正好四週整。

上週末照慣例又去讓中醫師複檢,這回可以動的幅度又進步了。回家後開始練習走路,雖然走久了會痛,但腳踝能動的幅度一天比一天多,真難想像兩週前會痛到無法站,一起床腳踝又會因為血往傷口流而超痛。現在雖然右腳走起來相當地不靈敏,至少可以一拐一拐地走了,只不過走路速度比用拐杖還慢...。週圍的人看到我能走後,都用神奇的眼光看著我,這...只是普通的走路,我本來就可以走的啊!

2008年7月15日 星期二

Python class mthod

Python 原本沒有 class method,只有 instance method,這在一些情況下不方便,比方 factory method。後來 Python 的改版做了修正,詳細的說明見 static methods,以及後來的改良語法 decorators,兩篇文章的說明淺顯易懂,我就不在這轉述了。感謝 Aethanyc 介紹。

decorator 不只可改善 classmethod 語法,還可以協助當 function wrapper,用來做 log、檢查參數。官網的例子很讚,值得一看,這裡摘錄一段 singleton 的做法:

def singleton(cls): instances = {} def getinstance(): if cls not in instances: instances[cls] = cls() return instances[cls] return getinstance @singleton class MyClass: ...

有興趣的話可以對照 Ruby 版的 cache,Python 應該也能寫出類似的東西。我很喜歡這種由外包裝的寫法,寫起來很乾淨,完全不會影響到原 function 以及 call function 的 code。

2008年7月13日 星期日

查 Python 函式的方法

學程式語言的首要問題就是如何查函式,個人認為有良好的查函式介面,才容易推廣程式語言。

像 Java 有 JavaDoc,可從 Sun 官網查詢(個人喜歡用別人包好的 Windows Help 檔);PHP 官網也有便利的查詢介面;C 在 Unix 上可用 man page(硬漢工程師才用 C,啃點 man page 不是問題!); 個人覺得Ruby的官網文件不怎麼好查,不過用 Ruby 直接查到是滿快的。比方我記得有個 p 開頭的函式可以消掉陣列最後一個元素,開個 irb(interactive interpreter)這麼打即可:

[].methods.grep /p/

查到正確名稱後,再用 ri 查詳細用法,相當順手。

Python 在這方面弱了一些,這裡整理一下我目前的做法(從 Scott 那學來的)。首先,一定要裝 ipython(功能強大的 interactive interpreter),之後就可以利用 code completion 來查名稱,例如:

n [2]: a = “”

In [3]: a.sp
a.split a.splitlines

In [3]: a.split?
Type: builtin_function_or_method
Base Class:
String Form:
Namespace: Interactive
Docstring:
S.split([sep [,maxsplit]]) -> list of strings

Return a list of the words in the string S, using sep as the
delimiter string. If maxsplit is given, at most maxsplit
splits are done. If sep is not specified or is None, any
whitespace string is a separator.

注意,直接打 “”.sp 再按 TAB 是沒用的,因為 ipython 要按下 ENTER 後才能猜測先前輸入過的變數型別為何。名稱後加「?」可以叫出 __doc__ 內的說明。

若想像 Ruby 那樣搜尋特定函式名稱,得透過 __dict__ 或直接用 built-in function dir(),__dict__ 位存有 class 內的 methods 和 fields,下面的效果和 Ruby 相同:

print [s for s in dir([]) if "p" in s]

2008年7月11日 星期五

右腳只是輔助的

昨天老媽多事 (多事的總是老媽) 幫我在腳指擦膏藥,說是退瘀血,如果一直抗拒試藥的話,老媽會生氣。只好討價還價,像是要擦的話只能擦腳指,別擦腳踝;或是能不能明天再擦,別今天擦。結果又擦太多藥,害我午夜12點時腳指燙到得爬到浴室沖泠水,有擦過按摩膏藥的人,也許有體會過這種涼到發燙的神祕感覺。至於腳指發燙的唯一的好處,大概是燙得我感受不到韌帶的傷吧...。

今早去給中醫復檢,腳踝的可活動範圍又變大了,腫也有消,只不過傷最重的韌帶卻變痛了。不知道是不是因為上面的腫消了,它才可以開始發威(韌帶吶喊:「終於看到我了吧!!」),還是保養不當,所以變嚴重了,反正就相信醫生囉。

由於復原情況是正面的,今天除了推瘀血外,另給我 BONUS:「足背按摩。」痛得我微微冒汗,醫生說是穴道的痛,可以消炎。我覺得痛的程度可和韌帶最痛處相比,難怪綜藝節目裡的腳底按摩都痛得哭爹喊娘的,絕對不是節目效果,真的是言語無法描述,沒體會過無法相信的痛。另外醫生說我藥膏貼太久了,皮膚紅腫有過敏,得暫時少貼藥膏。

晚上回家後韌帶還是一樣痛,不太能碰地,這幾天有時可站,有時不能站,不過感覺上目前應該是有變好吧。希望明天可以站,這樣左腳的負擔會少一些,不過在左腳受傷前,我想右手手掌會先受傷吧,今天就有一點小狀況了。總之,目前唯一的心願是八月初可以不用拐杖走路,這樣行動就輕鬆多啦。

備註

雖說多事的總是老媽,母親也是最偉大的。在老媽細心的照料,大幅減輕少隻腳的不便。我可不是怕老媽看到這篇賭氣不幫我拿東西煮飯,才在這補好話的哦。

2008年7月10日 星期四

急性腸胃炎

才剛回台北,一週就生一種病。

前天中午開始發燒,最高燒到 38.9,間間段段地退燒又燒,原以為是腳傷引起的,但後來又覺得好像是胃,昨天晚上爸媽帶我去長庚看內科,陳碩為醫生說是急性腸胃炎,回想前天中午吃了夜市的水餃,可能是這樣吃壞肚子吧。雖然說醫生很有耐心,問了一些問題,不過光憑問診,簡單地聽一下腹部,就判斷是急性腸胃炎,感覺滿不踏實的,加上我胸腔很悶,心臟無力會痛,這部份醫生沒給什麼建議,只說胃漲消了後應該會好。另外醫生說可以喝舒跑加溫水,舒跑太濃了,加水稀釋後效果和打點滴差不多。我試的結果,滿有效的,肚子稍微餓就喝一些。另外要注意的是,水喝太多會導致電解質失衡,可以靠稀釋的運動飲料適度地補充,。

回家後先吃一次藥,飯前吃消漲止吐的藥,飯後吃消炎藥,結果有好一些。西藥真是神奇,一吃下去身體馬上有反應。以前吃西藥雖然會減輕症狀,但副作用也很明顯,像是頭昏、胃不舒服,這次吃的是胃藥,一吃下去心跳馬上加快,不太舒服。洗澡用熱水沖背時發現胸腔有舒服一些,深呼吸時比較不會痛,就用熱毛巾敷了一陣子,感覺好多了。我懷疑是前幾天撐拐杖背太酸,請家人幫我按摩,按太多次結果有點受傷,所幸熱敷一陣子,睡一覺後就好了。

睡覺期間出了不少汗,早上起來已好得差不多了,至少有精神和老哥說些沒營養的屁話。中午已有食慾吃稀飯,目前感覺滿好的,倒是右腳踝又開始痛,大概是昨天為了方便右腳碰地太久,又受傷了吧,腳背到是消腫了,在小指和無名指處可看到滲過去的瘀血,只剩下最嚴重的部份是腫的。

雖說回台北後就一直不順,不過換個角度想,在台北生病有家人照料,比照新竹方便多了。加上是剛口試完生病,這個時間點正是最佳生病時間。接下來還不少延遲的事要處理,但應該會愈來愈好吧。

2008年7月6日 星期日

理論與現實

這篇只是描述剛遇到的小例子,不是要探討什麼大道理。

這段話說得太有道理了,先引用一下:

In theory, there is no difference between theory and practice. But, in practice, there is.

By Jan L. A. van de Snepscheut 

剛才很快樂地實作別人的方法來補我的碩論實驗,結果遇到一個作者沒考慮到的情況,於是程式就噴了。理論上這是不會發生的,但實務上因為浮點數的誤差,造成這個 bug。看來得用強硬的方式解掉。

舉個類似的例子說明我的情況,用 Quadtree 存地理性資料時,當一個 region 內的資料數量超過上限時(比方每個 region 不要超過五個點),會把該 region 切成四個 sub-region,理論上可以無限地切下去直到所有 region 的數量都小於給定值。

事實上,當一部份點很散(造成起始 region 空間很大),而大部份點極為密集時,切到後來會因為 region 空間過小,浮點數不精確,而使得某些點「不屬於」任何 sub-region。比方說 region 左上角的 x 變成 296.999999999988,寬度則切為 1.82751591637498e-11,結果四個 sub-region 拼不回原來的 region。

幸好我有加 assertion 檢查是不是所有點都在切開的 sub-region 內(如同廢話般的檢查),不然寫到後面 debug 時就慘了。隨手養成的好習慣,總會在無形之中救了自己。

2008年7月5日 星期六

用左腳踩踏板的日子

今天來了久違的試彈,五音不全。

若要把錯歸在左腳踩踏板沒fu,似乎有些牽強,主要還是太久沒練,連基本的音都丟三落四。而且還是彈不出感覺,《夏影》在夏日環境威能加持下,有好一點,可是重覆彈第三、四次時,又彈回從前的死樣子。琴彈得順的話,會覺得左右手是連在一起的,有種音符波浪層層串起的舒暢感,分不出是左手在動還是右手在動,像彈《Tifa’s Theme》、FFX OP 和《Memory of Mother》時就有這種感覺,但《夏影》怎麼彈都沒輒,各段的味道抓不出來。

題外話,早上起來背部上方很酸,右手掌有點痛,看來是撐拐杖的影響,至今已用了三天,昨天用得量也較高。右腳快好啊,至少也要能站,這樣可以減輕不少負荷。說腳的力量是手的三倍,看來是一點也沒錯,右腳歷經二十年寒暑的功夫,不是雙手可以輕易替代的。反過來說,右腳再練個數十年也不能敲鍵盤,各有所長。...真是廢話般的感觸。

2008年7月3日 星期四

邁向單腳的日子

別看錯字啊,不是「身」,是「腳」。

前晚打籃球時,穿慢跑鞋又求好心切,守太賣力結果在空中絆到攻方的腳,跌下來時腦袋一片空白,右腳踝超痛,請旁邊的人扶我到旁邊休息。幸好在場有些人有受過救生員訓練,急救措施滿好的,立刻冰敷、用繃帶固定。休息一會兒後爸媽來載我,到國泰看急診(掛號時間過了...),外科醫師照了 X 光後說看來沒問題,三天後再回來看骨科。接著去給熟識的中醫師(有國術底)看,國中時脊椎側彎給他橋過,滿有效的。中醫師說有點錯位,待後天消腫後再來橋回去。

結果這兩天腳一下消一下腫,交替地抬腳和冰敷,中途最好的情況可以雙腳站立,但後來又變更嚴重。因為右腳沒法站,在家裡得用雙腳拐杖撐著,用單腳跳移動。武俠小說裡什麼鐵拐武林前輩,把拐杖當手腳輕鬆使用,騙鬼!單腳加拐杖真是超難移動的,深刻體會到平時的無障礙空間有多重要,在醫院使用身心障礙用的廁所,感受到這些設備的必要性。有些事沒親身體驗過,不了解它的重要性。

這幾天看著我的腳消腫過程,老媽比我還急。初期我看著腳腫起來,覺得還滿新奇的,大的時候有右腳踝腫到半個拳頭大吧,腳背也會變胖。後來看到麻痺了,反正沒腫到一個程度也不會痛,別碰地就好。今早起床後腳又變腫,老媽急著叫老哥送我去國泰看骨科。再多照兩張 X 光後,醫生說有輕微骨頭裂傷,要打石膏,不然怕之後會移位。由於晚上要找中醫師復診,所以先回絕西醫的建議,簽個單子表示西醫已建議我要打石膏,但我仍在考慮。

晚上給中醫師看,中醫師聽我們說 X 光指出有裂傷,他說錯位不急,待骨頭復原後再看看。中醫師幫我輕輕地推幾下腫脹處,腳踝神奇地消腫,我終於看到久違的腳背凹槽,之前都是圓滾滾一片。不過待中醫師弄好藥膏後,腳踝又腫回去,又看不到腳背凹槽。後來敷好藥,拿了幾片藥膏,就回家了。說先吃幾天消炎藥,之後再開長骨頭的藥給我。

想想還是先用繃帶固定腳就好,打石膏太不方便了,又重又悶熱,腳養又不能抓,很難想像這樣包一個月會有多不舒服。總之先聽中醫師的建議,過幾天再看看。照目前的情況來看,說最好一週後才能站,一個月後才能走,不過實際情況也得視復原狀況,希望明天開始不要再腫了。還有,在右腳康復前,不知道左腳和雙手撐不撐得下去,兩天下來左腳超累的,真難想像少一隻腳的影響有這麼大。

2008年6月22日 星期日

交大畢業典禮 2008

吃完午餐在家休息時,接到 989 的同學打來的電,約三點拍照,後來兩點時再接到 yulong 的通知,說現在大家已在工三拍照,我打給阿德,看阿德要不要一起來。原本我是沒什麼勁,想說拍不拍都OK啦,難得台北有人下來,去和大家照照面吧。

結果今天還挺 high 的,先是看到會長、Hubert等人,後來也有看到阿志。台北下來的 95 級不少,有 dregs、BlueCat、K男、小蘋果,清大來的有熊、Jalamorm、阿德、KJ,交大這裡一大堆,有我、羊、大頭、yulong、try、講義、輔國、阿伯、姿樺、skylight、黃哥、bc、也有看到 Cu,沒看到桶哥他們 lab、還有看到 lions 他們。

好心的阿德哥哥帶了清大畢業服來借我們這些忘了借畢業服的人,讓我有機會穿到全套碩士畢業服。最最棒的是,除背面外,看來就和交大的一樣。會長和 Hubert 一直勸說當兵一年很快啦,別去服研發替代役了,真是糟糕的學長啊。dregs 看來和以前一樣,沒有 bbs 描述的那麼慘,偉哉,dregs!但三番兩次說我像外勞,這...這樣的話黃哥怎麼辦?skylight 換髮型了,有人說看來像 ABC,不過說話還是和以前一樣沒口德,不禁想起說話最沒口德的邱大神。意外地看到羊的父母,小學一二年級時偶而會去他們家玩,看到羊媽媽時有些印象,記憶真是奇妙。

一開始大家在工三一樓拍照,累了就到系計中吹冷氣聊天。中途我去找 89人 拍照,問問近況,有看到土穎、歪忠、Gosh、剃、陳仲豪,不過和高中同學還是不夠熟,沒有待在大學朋友群裡自在,沒辦法,高中的大半歲月都待在社團。途中有去活動中心找奶蘇,結果他在當司儀,只好喝幾口科法所準備的冰奶茶,合照一張證明有來找過他,就走了。

89 團散會後,回到工三遇到 Young 和 kuby,結果 Young 比我們還熟心拍照,帶著yulong、講義和我四處拍照,外加最佳路人阿德,還有在中正堂外看移帽穗,Young 看來很感動的樣子,也許碩班的無法體會吧。再回工三後,已五點多了,95級的開始重新聚集,討論晚餐去那吃。晚上大家到食品路吃飯,有個 18 人吧,名副其實的大食團,而且其中三人吃素,酷!聚餐差不多結束時發現會長有打電話來,原來是問要不要一起看煙火,我們完全忘了有放煙火這回事。

飯後討論續第二攤要做什麼時,理所當然的,BoardGame 小組提議打 BoardGame,於是一部份人回家、一部份人先載台大幫的去坐車,最後八、九個人一起到我和 yulong 的住家續攤,用桌子打正港的 BoardGame。原本想玩無腦的矮人礦坑,適合人多又不用腦力,而且嘴炮樂趣十足,結果羊把它放在台北了。只好玩最多人懂的 「Bang!」。

第一場我為了好看拿警徽,當大警長,一開局差點被打死,後來慢慢好轉,先幹掉兩個歹徒大頭和羊,再誤殺一個副警長 skylight。都是我和其它人協力打到剩一滴,由別人補刀。副警長 skylight 的遺言是:「大警長的東西就是我的東西。」在搶了我兩張牌後被我和歹徒姿樺聯手擊斃。由於我錯信姿樺是副警長,不小心誤傷第一輪搶我牌就黑掉的副警長講義,後來被別人擊弊,而形成一歹徒姿樺,一叛徒安泰,和我這大警長的三國鼎立。由於我滿手 miss,加上能力是在我回合外用牌後可以抽一張牌,導至我 miss 連連,可說是史上閃躲力最強(最峱?)的大警長。

歹徒和叛徒圍攻我,我一直打姿樺,但安泰又幫她補血,在 miss 牌幾近耗盡的局面,終於擊敗姿樺,開始和安泰 PK。PK到一半變羊接手,難度提高一些。最後還是仗著 miss 連技的優勢獲勝。這場打了兩小時之久吧,結束時羊下了中肯的評語,「這樣大家就知道,『Bang!』是多為令人討厭的遊戲。」在大家不滿意話多的大警長獲勝的情況下,又打第二輪,還強迫我當大警長。開局沒多久在忠誠副警長大頭的協助下,手牌被他搶光又被大家一直 bang, 三輪後就掛了。讓大家了解,「Bang!」也是可以玩很快的

最後大家開始聊各 lab 的事,滿有趣的。好久沒大家聚在一起,聊得這麼開心了!後來大家都累了,一樣等級的笑點,幾小時前大家會哈哈大笑,最後是無聲地一臉倦容。於是大家趁著大頭去上廁所時散會了,留下有義氣的講義,等大頭載他回宿舍。

仔細想想,除了穿清大的畢業服外,今天和畢典一點關係也沒有啊!

2008年6月21日 星期六

關西行:抵達京都、前往洛西

5/23 Fri.

早上起床吃個早餐看看電視,看到《阿爾卑斯山的少女》的動畫,我竟然覺得女主角也滿萌的,看來最近真的離動畫太遠了。

check out 後拖著行李箱前往京都,慘的是,從 PAKDD 那領來的東西,加重行李重量,就這樣拖著行李搭地鐵到梅田站,走到 JR 大阪站。JR 的電車是依目的地定價,和大阪地鐵不同的是,有不同車種可選,有點像台灣火車有自強、莒光、複興、普通,不過票價都一樣,搭車時要注意月台上的指示,像去京都的話,搭特急只會停兩三站,半小時就到了。去的時候運氣不錯有位置坐,旁邊還坐著香港正妹。斜對角可看到另一個正妹,不過睡相有點...。出了京都站,在看站內地圖時被一對香港情侶叫住,說他們在大阪環球影城時弄丟了旅遊書,碰巧剛才在車上看到我在看的旅遊書和他們的一樣,想和我借來抄些資訊。

京都車站相當大,功能和台北車站很像,但至少有台北車站的六倍大吧,站內有眾多店家,甚至還有飯店,站外一堆公車站。出車站後沒多久找到我住的地點:京都 APA Hotel,看來頗不錯的,住這樣的旅館才有旅遊的心情嘛。櫃檯人員會說英文,詢問附近的生活機能很方便。之前在京都車站內繞時,覺得不好找路,記得 BlueCat 說他在京都遊玩時差點迷路,想說先買個指南針,結果便利商店沒賣,不知去那買。後來剛好在路上聽到兩個女上班族用中文聊天,就問她們指南針上那買,得知在京都 Tower 二樓的百元商店有賣。一個人旅行很簡單,就是厚臉皮地一直問,配合充裕的時間就天下無敵啦!雖然找到了指南針,而且附上口睄、放大鏡、溫度計後,四物合一只要一百日元,但...那裡放著的四個指南針指向四個不同的方位,實在不知該相信那個好。在試了半天,最後選一個看起來最穩的指南針,事後也證明是...完全沒屁用的指南針。所以說,出國前就要買好可靠的指南針。


( 夜裡的京都 Tower )

京都 Tower 前紅綠燈在綠燈時會放音樂,常在動畫裡看到這樣的紅綠燈(比方《草莓棉花糖》),真有趣。還有在京都 Tower 看到一堆年輕女生穿和服,這種熱天真是服了她們,不過這也是我來三天內唯一一次看到年輕女生穿和服,後來看到的都是中年婦女,唉呀呀。

來京都當然要參拜四方大神,首先開始第一站觀光地點:Kyoto 手塚治虫 World,準備先參拜漫畫之神。京都車站有超多指示,一下就可找到地點,不過店到是出乎意料外的小,有點掃興。


( 說到手塚,當然會先想到 Black Jack 啊!還是小金鋼比較紅? )

在商店內逛了一下就離開了,得先解決惱人的午餐問題。沒想到一離開馬上看到店的隔壁有家義式餐廳,和店員溝通了一下,願意幫我做素食義大利麵,果然先來參拜漫畫之神是對的!這樣一來,這三天的午餐問題就解決了。

下午第一站是金閣寺,看起來挺不錯的,門票是一張符,很有創意。像金閣寺這樣的熱門景點都會有四國語言指示,包含日、韓、英、簡中,韓語的指示還是比中文多啊,可見韓國觀光客的量是最多的。

路途中都有明確的指示,可以很輕鬆地繞完全程,附帶一提,金閣寺的指示牌看來最美觀,整體氣氛弄得很合。出來後我才發現入口有擋但出口沒擋,若想省錢的話,只要從出口進去,逆著順路牌走到入口,再順著走出來,就不用付門票錢了...。不過我一次也沒這樣幹過啦,到每個景點還是乖乖地從門口付錢進去。

接著搭巴士前往龍安寺,規模小了點,不過有不錯看。我滿喜歡龍安寺的庭院。


( 龍安寺的庭院 )

最後到了仁和寺,一進門就看到熟悉的景象,這這...不是 GANTZ 嗎!搞不好作者有來這裡取材過,太有意思了!


( GANTZ 裡的大雜兵,出場沒多久就被幹掉了 )


( 仁和寺大門 )

搭回京都的路上,我在巴士上睡著了,走了一整天真是超累的,今天的行程還算OK。晚上看到頗有趣的節目,有個機器相撲的研究社團,說明他們怎麼改良一代代的機器相撲,像是在底座加裝磁鐵強化防禦力,還有超華麗的閃身側身攻擊,以及放出混淆機器判斷目標的旗子。

2008年6月9日 星期一

關西行:PAKDD第二天

5/22 Thu.

早上搭車前往會場時,又遇到昨天那兩位大陸女學生和她們朋友,不過她們明天才要報告,今天要去京都。

到會場後,參加今天唯一一場 Invited Talk,這回是歐美人士,英語很標準,講如何結合創意和 data mining,找出隱藏的規則,嗯,一聽就知道會被攻得很慘的講題。講得過程提了相當多想法,也舉了些例子,還有附他們做的系統的樣子,但是無法驗證的東西,說服力極低,Q&A時被猛烈的攻擊,攻防的問答都是老話題了,就此略過。

今天 GREENS 沒開,中午請會場人員協助,在飯店餐廳裡吃素義大利麵,雖然又貴料又少,反正是用會場提供的餐券,無所謂。附帶一提,這次的午晚餐處理方式似乎比較高明,發給每人九張日幣500元的餐券,讓大家在附近自己找餐廳吃。由於天保山一帶是規劃成娛樂中心,可選擇的餐廳滿多的,當然沒有素食就是了。

下午的出遊是參觀奈良的鹿公園和東大寺,考量到身體不舒服,加上在團體內沒伴又不方便行動,決定下午不參加出遊,傍晚再回會場搭車前往晚宴。後來聽去的人說,似乎不錯玩,可惜。既定行程取消後,來日本前也沒時間規劃,下午不知道要做什麼。想了一會,還是先去日本橋看看吧。

東京的秋葉原、大阪的日本橋和名古屋的大須,可是人稱 ACG 的三大聖地。但實地走訪後,感覺輸秋葉原太多了。店少規模也小,像 Animate 秋葉原分店有七層樓,日本橋這裡只有三層。大概逛了兩小時半,看過旅遊書提個幾個重要地點後,差不多要回會場搭車了。

來得時候我是搭到惠美須町站下車,往日本橋站的方向走,原以為走一走會走到日本橋站,結果一直沒看到。後來問路人最近的車站在那,對方說是難波。想想覺得怪怪的,還是照路人的指示前往難波站,才發現是南海本線的難波站!當初若從機場搭南海電鐵的話,就是坐到這裡...,離其它主線超遠的,幸好當初有改選巴士。

到難波站後,摸索了一下才弄清楚要搭車到新今宮,再轉 JR 線,搭到弁天町,再轉地下鐵,搭回會場地點大阪港,過程中搭了三家不同業者的車,習得轉乘經驗!在新今宮時月台太多,指示也不太清楚,超怕一搭就搭去不知名的地方,雖然一定回得來,但會趕不上前往晚宴的車。更慘的是,月台上空無一人,想問也沒人可問,這可說是這次日本行的唯一危機。幸好後來向車掌求救,才解除這次危機。事後才發現我太天真了,惠美須町站和日本橋站兩站間距離超遠,幸好當時有問路人,不然再走個半小時也到不了吧。

到大阪港後離搭車時間還有一段距離,剛好可以去摩天輪旁確認搭巴士回機場的流程。晚宴在奈良的餐廳,好像叫 Japan Garden,沒聽清楚,像是高級的渡假中心,餐廳外有個稍具規模的庭園,布置的很漂亮,於是看到一堆人開始殺 SD 空間(這年頭大家都用數位相機的啦)。

晚宴會場門口還有招待員,不愧是日幣 5,000 的行程啊!

我到得太晚了,只能匆忙地照個幾場,聽說之前還有不少人和她們合照。

晚餐有特別弄桌素食桌,連我在內有六人,應該有上十道菜以上吧,吃到一半就飽了(六人吃十人份的菜啊),沒想到後來還一道接一道的來。中途服務生端錯桌,把真的生魚片放到我們桌上,大家都傻眼了,幸好沒有人動筷,後來另一位服務生把它端走了。中途有聽到其他人在聊這是什麼菜,滿多菜我知道是什麼,像蒟蒻做的「生魚片」,蕎麥麵等,但這方面的英文字彙懂得太少,沒法解釋,真可惜。

晚宴途中還有表演,這張是 Prof. Christos Faloutsos 上去參與活動的照片。

後來我都在和旁邊的德國人聊天,她今年剛拿到博士學位,在同一個地方繼續做 post-doc,她說做的事沒什麼差,只是改個名稱而已。在德國讀博士收入和工作一樣,應該說,對德國人來說,讀博士就是一種工作,在美國也是類似情況,相對來說,台灣讀博士真的很慘啊。

聽她介紹德國的學制滿好玩的,像他們高中比我們長,但大學就和研究所一樣,是修主科的,不像我們大學要修一堆課。以她的情況來說,大學是 Computer Science and Mathematics,研究所再選 Computer Science 某個方向發展。她做的領域是提昇資料庫的處理速度,我問她 real data 怎麼取得,情況也差不多,公司不會給,所以要派一兩人去公司內做 part time,請「內應」在公司內部用 real data 做實驗;還有驗證也是令人苦惱,看來只要是學術研究,驗證一直都是難關啊。令我呀異的是,她說和公司合作的情況下,效能有提昇,公司挺滿意的。事後想想,或許是領域的差異吧,資料庫效能對公司來說確實有明確地幫助,但像 data mining 之類,很難令公司滿意,那離現實應用太遠了,沒有立即成效。另外她還有提到,她高中時有到美國讀一年書,讀博士時有到東京待兩個月做學術交流!交流的途中當然會跑到日本各個地點參訪參訪,真好啊!

晚宴結束後,搭車回旅館的途中,我和一位陳銘憲老師的學生聊關於學界和業界的事,他是大我十屆的交大學長。來晚宴時和學長閒聊時發現我和學長的想法極為相似,學長是畢業後先工作,等工作穩了才回來讀博班的,他把讀博士當成一種自我實現,也對學界和業界的反差有些困惑。愈聊愈投機,還發現學長也有比 ACM ICPC,不過名次比我好看太多了。

聊的結果沒什麼新觀念的突破,只能說我看到我往下走後,也許會落入類似的情況。兩天下來,想法沒什麼改變,但藉由今天以及昨天和學長們的閒聊,我似乎又看得更明白了些。

回到旅館後,想到就在這裡和大家分離,感覺有些落寞。洗完澡洗完衣服後,照例轉個電視看有無動畫可看,結果看到一部能登麻美子配的作品,劇情頗老梗的,但還不錯看,回來後查查,才知道是《艾莉森與莉莉亞》。來日本的這幾天都沒動畫可看,今天終於稍微解解癮了。

2008年6月4日 星期三

關西行:PAKDD 上台報告

5/21 Wed. 前半天行程見這裡

演講結束後,在走道上碰到曾新穆老師,閒聊個幾句後,曾老師趕著準備後面的行程。照行程來看,接下來我要上台報告,但我看錯門外貼的時間異動,差點以為我改到隔天報告,幸好陳老師的學生發現我搞錯了,趕緊趕到會場,剛好開始第一人的報告,我是最後一個,想必上台時大家大概會一臉「快讓我去吃午餐!」的表情。

由於我沒帶筆電,在報告會場開始找台灣人借筆電,後來找到曾老師的學生,也請他們幫我照一下在台上報告的樣子。會場內大概一二十人,氣氛滿輕鬆的,沒什麼壓力地上台報告,也順利地結束,就這樣結束我的第一次英文報告。幫我照相的學長說我 Motivation (動機) 報得不錯,這部份正是我花最多心血的地方,哈哈。

由於昨天沒吃好外加早上喝牛奶的影響,早上拉肚子。報告結束後,立刻趕到 GREENS 吃午餐,這可是素食者在日本想好好地吃一餐的唯一機會啊!午餐還不錯,由於昨天開始就沒吃到熱騰騰的菜,吃起來格外感動。接著回會場參加演講,結果講者日本腔太重,聽不懂在說什麼,Q&A 時也沒人發問就結束了。

等著聽下個 session 時,在休息的座位上看到陳老師的學生們,我大概看了學姊要報的論文,疑惑太多,想說直接問作者吧,就這樣和學長姊們聊起來。從學長姊那獲得不少工作和研究的經驗,也有聊到像 Prof. Christos Faloutsos 的研究方式,先分析再利用分析獲得的知識提新方法,感覺是很好的研究流程。還有聽到 subspace clustering 的精神,即在處理 high dimensional data 時,試各種可能的 subset of dimension 來做 clustering。原本我想說在資料高維的情況下,clustering 前先用 PCA 之類的方法降維不就得了,又有數學分析支持它的有效性,為什麼會有 subspace clustering 這樣的方法?原因是 PCA 轉完的 feature 無法解釋,而 subspace 仍保有原有的 feature 名稱,就人類理解面來看,subspace clustering 比較有用,可以了解那些 feature 較有用。所以又是一個「有用就好」和「為何有用」之爭,就看應用的情況決定要用那種解法吧。

由於我有做過 clustering 的研究,聊起來還滿順的,令我意外的是,學長說 clustering 難以驗證,投論文時常會遇到審的人不滿意某些觀點,而難以進行。可是做 clustering 的人眾多,同意和不同意的部份分歧極大。我原以為 information retrieval 這方面的問題較大,看來家家有本難唸的經。仔細想想也對,提個新方法快了兩倍,準度掉了多少,又有誰知道?換一批 dataset 結果又如何呢?做研究真是在黑暗的荒野裡開闢出前進的道路啊!還有聊到業界和學界合作的事,如同大部份人的觀點,台灣學界對業界的幫助似乎有限,所以在隔天 (5/22 Thu.) 聽到德國學者說他們的研究有幫到企業時令我有點驚呀。中途曾老師的學生和梁婷老師的學生有過來和我們閒聊,結果到除報告外,到現在還是在講中文。

和學長聊太久錯過我想聽的部份,想說索性之後的時間在附近繞繞吧,到 Suntory Museum 看了場 3D IMAX,類似 Discovery 的節目,介紹海洋生物,有附英文耳機,還算不錯,可是太貴了,一場 1,000 日幣,看兩場 1,600,有海洋生物和恐龍的片子可選。接著在附近繞繞,看看海港吹海風,終於有期待旅行的心情。

今天有個小插曲,之前提到那位英文流利的日本女教授,真是超熱心的,每次遇到她都會聽到她主動提供新資訊,像是「旅館櫃台可以領日幣 2,000 補償費」、「coin locker 很好用,東西不用帶著走」、「甚至可以把東西放在 coin locker 過夜」。

晚餐在天保山 Market 繞了好幾圈,找不到能吃的,而且店員說飯裡都摻了海鮮,沒法弄素餐給我。在日本想找到白飯 + 青菜真是超難的,青菜超少,便利商店和自動販賣機裡卻一堆 100% 蔬果汁。只好回旅館吃稀飯配素肉鬆了。

2008年6月3日 星期二

關西行:PAKDD Opening!

5/21 Wed.

清晨五點時聽到鈴聲大作,還以為是隔壁的 morning call 太大聲,閉眼繼續睡。六點時又響一次,還是沒理它,後來聽到不明所以的日文廣播,還有人跑來到處敲門,才意識到,該不會有啥緊急事故吧?出門一看,樓梯間有一點煙,看來是火災。睡前我只有換睡褲而已,上衣就是外出服,而且我習慣在睡前整理好東西。換個褲子穿上鞋襪,背包一拿,逃難去。

走到樓梯間時,看到一堆人拿著行李逃生,想想我也回去拿好了。回到房間,行李箱拉鏈一拉,一提就走。這時煙開始變大了,有點嗆鼻,雖然有想到火災時要低著爬行,避免被煙嗆傷,可是往下走樓梯要怎麼爬行,還是快點跑下去吧。

到一樓旅館外後,看到一堆人,兩三分鐘後第一台消房車來了,接著每隔幾分鐘又來一台,再過一會兒記者也來了。


(其實煙很小,因為背光,看起來好像很濃)

旅館工作人員看來相當狼狽,有些旅客穿著日本的睡衣,來不及換。幸好之前去東京時試穿過覺得不方便,這回沒什麼興致試,使得我全身整齊家當全在地出來。大概近八點時,現場確定沒有問題,開始依樓層讓一批批的旅客回房。回房後也沒啥事好做,放下行李,到一樓問櫃台今天還能住嗎?以我破爛的日語,想當然爾,溝通上一定有問題,結果櫃台人員拿了一個信封給我,我想拒收,他還是遞給我,只好收下了。我只是想確認今晚能不能住,不是來要精神賠償費的啊!後來我才知道,有個日本的女教授(精通三國語言!)和他們抗議,信封裡裝的兩千日圓是賠償沒吃到早餐。

到會場搭車的途中,遇到兩位大陸女學生,分別是碩二碩一的樣子,其中一位目前在做 MSRA Intern。好像都是北大的,之前她們不認識,事先約好來參加 PAKDD 時住同一間房。住會場外的旅館就有這種好處,搭電車時可以多認識人,一期一會。

準時到會場後,卻看到告示牌寫因為我們住的旅館失火,本日行程全部順延一小時。站在那也沒事幹,繼續找人認識。先和一位疑似台灣人實際上是日本人打招呼後,結識了他身旁的大陸人Tian Xia,是中科院的博士生,也在 MRSR 做 Intern。聽他說最近 MSRA 收太多人了,報名的人愈來愈多,競爭愈來愈激烈了。還有,大陸博士畢業後工作機會很多,對比之下,台灣真慘啊(詳見 ptt PhD 版)。他們實驗室做 video labeling,用 machine learning 的方法對影片內的物件做分類,聽起來超有趣的,而且極有實用性,諸如搜尋、廣告都仰賴這個技術。由於我對 AI、ML 之類的很有興趣,也稍有涉獵,聊起來滿順的,來這裡第一次覺得有明確的收獲。聊的結果,SVM 仍然是最常用的 classification 技術,他們也是用台大維護的 libsvm。至於要選什麼 feature 做為輸入,他說他們領域裡有固定常用的 feature,聽起來他像用固定的 feature,專注在方法改進。至於怎麼選 feature 呢,看來不管那個領域都一樣,憑直覺想胡亂試,總會找到一些好一點的。之前和 Huangs 聊過這點,我比較同意 Huangs 的看法,要請該領域的專家協助,才能選到有意義的 feature。不過這說來容易做來難,領域差異極大時,溝通難度很高。如同 soft computing 的人,我想大部份 ML 的人大概也不在意 feature 的意義吧,有用就好。

和Tian Xia聊聊後,提到台灣參加者的事,才發現坐我左邊的人們是陳銘憲老師的學生,來這裡講了這麼久的中文,終於找到台灣人了!剛好昨晚遇到的北大研究員來找人聊天,我讓出位子,坐到陳銘憲老師的學生們旁聊天。大家都很親切,大概有五人吧,其中兩位現在已是老師了,陳老師真是桃李滿天下啊!我和大家也算師出同門,很好找共通話題。接著到了開幕時間,和大家一起進會場。結果到日本一天了,我都在講中文,仍然沒有身處異地的感受。

開幕時介紹了投稿數據、參加者國藉分佈之類的,畢竟是亞太的 KDD,參加者以亞洲人居多。接著是本次的重頭戲,Prof. Christos Faloutsos 的演講,主題是 Graph Mining,由於我之前有報過他的兩篇論文,大致上有些概念,一場演講內含了一堆論文,量太大了也沒吸收到什麼新概念。Q&A時超熱烈的,一個接一個問問題,講者也答得佷順,我有點狀況外,講者似乎都有回答到問的點。

(未完待續)

2008年6月1日 星期日

關西行:抵達日本

5/28 Mon.

第一次自助旅行沒想到就是在國外,對我這鮮少出外遊玩的人來說,真是諷刺。

ptt HsinChu 版看到的資訊,從新竹前往中正機場有三種方式:包車、搭客運、搭高鐵。包車最方便,價錢大概台幣 1,300,搭客運最便宜,可是中途要在休息站轉搭往機場的車,班次少,時間不好掌控。大部份人較推高鐵,實際試過後確實滿方便的。

高鐵的班次多,新竹到桃園100元,十分左右到,時刻表見這裡。從市區到新竹高鐵站可搭接駁車,班次表和停靠站見這裡。從桃園高鐵桃園站可搭統聯的直接中正機場車(701的樣子),投零錢30元,搭20 ~ 30分鐘到機場,班次也滿多的,到高鐵站後跟著指示牌走很容易就找到了。

但我家離接駁站有段距離,所以我最後的做法是:搭計程車到新竹高鐵站(265元、20分鐘內) -> 高鐵 (100元、10分)-> 統聯701 (30元、20分) -> 機場,中間加上等車,從家裡到機場一小時多就到了。回來也是一樣的坐法。計程車方面,一樣可從 ptt HsinChu 版 查到資訊,不過各家都有人說他好或壞,最後還是得自己試了才知道。由於我搭 10:30 的飛機,六點多從家裡出發,台灣大車隊說要看附近的車況才敢保證有車,建議可早半小時叫車,第一無線說任何地方任何時間 5 分鐘內到達,所以去的時候我選第一無線,試的結果也真的 5 分鐘內就到。

ptt 上有人說第一無線的司機會亂說話,搭了後才明白什麼叫亂說話,司機一路上想辦法和我說搭高鐵划不來,總之,人在車上就先「相信」他啦。回程時我搭台灣大車隊,感覺不錯,司機較親切,也不會亂說話。去回的車價剛好都 265 元,大概差不多這個價吧。值得一提的是,去的時候,第一無線的司機開超猛的,在速限60的一般道路上開到100,結果十分鐘多就到車站,讓我在高鐵站多等了一會兒車。

中間搭飛機過程就省啦,第一次自己搭有點擔心,試過後就覺得也沒什麼特別的,電子機票換成機票時記得和對方要收據,方便報帳,領機票和劃位時記得和對方確認素食餐。到日本後,從關西機場到大阪市區有多種方法,建議事先看旅遊書查好。我後來是搭 3 號巴士到天保山(海遊館)站,在摩天輪那下車,走路到大阪港站只要五分鐘,而且是直線超易認的。在摩天輪附近馬上看到一家素食餐廳 GREENS,運氣超好!結果只營業午餐,今天已打烊了,只好明日再來。

走往地鐵站的途中和路人問路,才剛指著地圖開口「すみません」,對方就說「地圖拿來我看」,結果是對台灣情侶。對方說看我的服裝就知道是台灣來的,這和之前聽一位工作中的學長說看我的樣子就知道讀交大的一樣,真是親切地令人難過啊。此後我有特意注意日本人的穿著,年輕人穿得真的很講究,配件一堆。

搭巴士從關西機場前往大阪市中途拍的
(搭巴士從關西機場前往大阪市中途拍的)

接著搭地鐵時也是問路人,憑著一點日語加上比手劃腳,成功地自己搭了第一次地鐵,之後愈搭愈順手。要注意的是大阪地鐵營運公司有好幾家,有三家都有「難波」站,可是互相距離可能不近。機場可以搭南海電鐵到南海難波站,可是那一站可能沒直接接上其它線,去日本前就在想這幾站到底有沒有相車,幸好我沒嘗試,不然拖著行李在不熟的地方找路可是很要命的。

在大阪的地鐵時常會看到「痴漢は犯罪です」,小站標語貼得比較多,還有類似「拿出勇氣來,發出聲音來」激勵女性自保的標語。難道因為痴漢電車遊戲的影響,真的有那麼多色狼嗎?或是因為熱門,才有這樣的遊戲?

在旅館 check-in 後,趕往 PAKDD 會場參加招待會,去的路上看到兩個人帶著 PAKDD 的袋子,就上前打招呼,結果是清華商管院的學生和北大的老師,那位老師可是發了五篇 SIGKDD 的強者啊!其中幾篇是在美國唸 PostDoc 時發的。兩人都挺親切的,沒想到我到日本後,一直都在說中文,真沒身處異鄉的真實感。

招待會

招待會本身挺虛的,三五人成群聊天,菜一下就空了,而且不知為何沒有椅子。在會場沒事好做,只好提早前開。回程時在會場旅館門口看到一位華人,我又上前打招呼。反正一期一會嘛,多打招呼不會有損失。結果是北大的研究員,說要去大阪城觀光,路上聊了些研究的事,像是評量積效,生存壓力,有家庭難以專心衝論文之類的。回飯店後看看明天的行程,早早上床睡了。今天一路從家裡到中正機場、到關西機場、到大阪市區、到旅館的行程,真像玩 RPG 一樣,有種突破一層層關卡的成就感,事先查些必要資訊,到地點後問就是了,會一丁點日文就能通行無阻啦!

研究有感

現在就來寫心得似乎太早了,比賽還沒結束,還有一段時間可以和自己的研究奮鬥。也許是去 PAKDD 的影響開始發酵了,回來後做了一陣子研究,忽然想通一些事,也許我多領悟了一些正確的研究態度。只是我仍無法判斷自己是正視問題,還是逃避?是前進呢,還是後退?和以前同樣的感觸,同樣的回答,「進化的相反詞是什麼?」,「不是退步,而是沒有改變」,隨時在改變,意謂著不斷地進化。

放棄是很簡單的事,堅持下去才是困難的,在此引用伴隨我多日的無名進版文字,表達我的感觸。

「當你真心渴望某樣東西時,
整個宇宙都會聯合起來幫助你完成。」
from 牧羊少年奇幻之旅(El Alquimista)  

我仍相信如此,只是我不夠渴望罷了。人能找到自己一心向往的路,真的是很幸福的事。究竟是結合現實考量的做法好,還是堅持自己理想的方式好呢?摻雜雜質的半成品好,還是純粹卻離完成遙遙無期的作品好呢?做研究應該要一小步一小步的前進,只是每一小步的距離和方向,該如何斟酌?

「這是給我的試煉嗎?如果是!那我接受了!
人要戰勝不成熟的過去!才會成長!」
by 克里姆王,from JoJo 

挑戰自我,自我實現一直是我過去的生活方式,相信未來也會如此。

「所謂的覺悟,並不是抱著必死的決心;
而是在黑暗的荒野裡開闢出前進的道路。」
by 喬魯諾.喬巴拿,from JoJo 

用來看做研究的情況,再貼切不過了。真的是在黑暗的荒野裡開闢出前進的道路。不知想法對錯,甚至無法判別驗證方法的對錯。經由不斷嘗試和猜測,試圖拼湊出那麼一點也許正確的資訊。

「 我並沒有忘記升等考的傳言,只是因為比賽太令我開心了,
所以覺得太早划到終點很可惜。
我想要慢慢地,以我自己的方式,朝著獨當一面的境界邁進。
是的...反正都要做,就開心地做。」
by Akari, from ARIA comic 01 

不論如何,這個心境是最重要的。拉雜的感觸打完後,心情也痛快多了。在正視自己脆弱之後,就是回頭再戰個數天數夜啊!

2008年5月31日 星期六

關西行:旅館比較

在關西的九天裡,我共住了三家旅館,感想如下。

由於我是一人旅行,旅行社說一般機票加旅館(俗稱機+酒)是雙人床,單人沒有這類服務,只好自己另外找。我住的旅館依序是 New Oriental Hotel、APA HOTELToyoko-inn。其實三家旅館有的東西差不多,出門在外基本的需求都有,像是吹風機、熱水壺、moring call、個人衛浴、小冰箱、電視、房內免費上網、大廳電腦上網、早餐。而且設備還都差不多,morning call的用法不同,但語音都是一樣的,馬筒也都長得一樣,旅館業背後的供應商大概都是同一家吧。稍微不同的地方是,APA Hotel是觀光飯店,沒有提供投幣式洗衣機,但有可以使用者付費幫你叫按摩師...。旅館內的餐廳也較高級,早餐是buffet。APA Hotel之外的兩家是商務旅館,費用較低,有提供投幣式洗衣機和烘衣機,以下個別說明之。

New Oriental Hotel 是 PAKDD 指定的四家飯店裡,最便宜的一家,一晚含稅日幣5,500,位於阿波座站一號出口對面,交通便利。雖然有的東西和另兩家差不多,可是看起來很簡陋,一進房間我就覺得自己是來大阪出差的(雖說本來就是如此啦),觀光的心情瞬間消散。特別的是地下室有大澡堂,原本想說可以泡看看,結果住的第一天清晨失火,隔天就不能用了...。

之後到京都時住 APA Hotel 京都站前店,離京都車站很近,走路三分鐘內可到,到車站途中有家小便利商店。旅館服務員會說英文,不知是APA Hotel的人都會,還是因為京都站有特別安排過人手。單人房一晚官方價是10,000日幣,我透過旅行社訂,台幣2,500,有便宜一些。由於我太晚訂旅館了(出發前一週),週末京都的旅館都客滿,剛好旅行社能代訂到房間,省了些工夫。另外不知算不算加分,電視有附雙語功能,看洋片時可以切回原聲道,不用看著一堆金髮人自然地說著日語,違和感超重的。況且,我的日聽沒有英聽好啊!

Toyoko-inn 是從 herbage 那聽來的,日本的商務連鎖旅館,原本以為會和一開始住的 New Oriental Hotel 一樣糟,沒想到擺設不輸 APA Hotel,可惜工作人員不會說英文,而且 APA Hotel 的人比較年輕(這...也算加分項目吧)。但 Toyoko-inn 一晚單人房只要 6,000 多,提供免費的熱水、冷水、冰塊、早餐,還有一樓大廳的電腦可以免費隨意使用,不像 APA Hotel 是 100 日幣 10 分鐘又有一堆限制(只能開一個 IE,無法執行其它程式)。整體來說,我很喜歡 Toyoko-inn,物美價廉。附帶一提,青年旅館大概 4,000,民宿可以壓到 2,000,可是要和多人共住一間,據 BlueCat 說,睡眠品質不好。

APA Hotel 和 Toyoko-inn 在許多地點都有分店,有些就在地鐵站出口,相當方便。價位上 APA Hotel 稍微貴了點,不過格調也高一些。而 Toyoko-inn 生活機能較完備(洗衣、烘衣,好像還有熨斗),擺設也不會差,作為觀光旅館也OK。對了,兩家店 check-in 時間前和 check-out 時間後都能借放行李,不過我猜一般旅館應該都可以吧? Toyoko-inn 的線上預約系統有點爛,不過有中文介面,而且預約的話,會有些特惠,像我去的時候是送小禮物,指甲剪、一雙襪子和某個忘記的東西給你選。對於 Toyoko-inn 只有一點小擔心,早上離開時,櫃檯人員會問你要不要清理房間,若要的話,要把鑰匙交給她。我問她回來時怎麼拿回鑰匙,她和我說說房號和姓名就行了。我回來時照做也的確拿回鑰匙,感覺管制有點鬆,至少也對個護照吧。

2008年5月30日 星期五

琴之森劇場版

琴之森劇場版

「一緒にいこう...森へ!」(一起前往森林吧!)

「琴之森」是「花田少年史」的作者一色真人目前連載中的漫畫作品,目前日本出到15集,台灣是14集。劇場版取出前段劇情,完整地呈現一之瀨海的小學時代,以雨宮轉學到鄉下為始,轉回東京為終,光看劇場版的話,搞不好會有「雨宮在鄉下遇到森林的妖精,從而真正愛上鋼琴,最終成為世界一流的鋼琴家」的錯覺,這個說法也沒什麼不對,只是這位森林妖精日後的發展才是主線,劇場版呈現的故事,是一切的開端。

閱讀原作漫畫的最大遺憾是,鋼琴演奏得自行想像,對像我這種對古典樂不熟的人來說,大多場合只能看著畫面,而少了音樂。劇場版將此點遺憾補足了,還加了相當出色的原創曲「Forest of the Piano」,在關鍵劇情下蘊釀氣氛。整體來說,不論是畫面還是音樂,都佈置得相當貼切。

相較於「交響情人夢」的搞笑情節和戀愛故事,「琴之森」以寫實優美的手法表現,配合文字描述,時常感動的不能自己。森林裡的鋼琴已夠優美了,還適時地再灑落一片日光,真是美得太過份了!

琴之森劇場版

我相當喜歡一之瀨海自在玩鋼琴的神情,以及他坦率地生活方式。如同雨宮在海身上看到了自己的缺失,我也找回自己遺失的單純。阿字野這麼對雨宮說:「你能更喜歡自己的鋼琴的話會更好,如此一來一定能明白,沒有和別人比較的必要。」礙於現實考量,不斷地自問自己的優勢何在時,漸漸迷失了追求知識和技術的純粹樂趣,以及忙裡偷閒的自在。不知不覺地,時間變自由了,經濟壓力減低了,我卻不像以前那樣過著平衡又充實的生活。接下的日子,要好好地迎向憧憬的生活啊!

廁所公主在劇中的表現也很棒,原作該有的點,劇場版都完美地呈現,可惜漫畫裡廁所公主的劇情不多,我很喜歡這個角色的說。

琴之森劇場版 - 廁所公主

琴之森劇場版 - 廁所公主和海

最後,介紹一下劇中的主題曲,可以從官網聽到主題曲「Forest of the Piano」,非常的有感覺。唯一的遺憾是,以劇情的走向來說,這首曲子只能適時作為背景樂,不能作為關鍵時的演出曲,畢竟在漫畫進度裡,都是演奏古典樂而非自創曲。若想彈的話,《ピアノの森 CD BOOK》有附 「Forest of the Piano (simple version)」 的譜。

關西行:素食

日本吃素很不方便,而且他們對素食的觀念和我們不同,有些人會認為魚可以吃,或是可以含動物性成份,要特別注意。這次要在大阪京都一帶待九天,對我來說是一大挑戰啊!我事先在背包客俴的素食討論區和 ptt 的 love-vegetal 版查了些資訊,滿受用的。

大阪可以找到幾家素食餐廳,可是都只作午餐而己;京都某幾個寺廟有精進料理,但太貴了我都沒去試。或是到義式餐廳點義大利麵,請店員做成素食可食的,聽說印式料理店也可以,我沒試過。找不到時就到便利商店買白飯或稀飯配自己帶的素肉鬆,便利商店也會有幾碟小菜,像是醃茄子和小黃瓜,成份看起來好像能吃的樣子。白飯比較難買到,而 7-11 和 Family Mart 會有稀飯,一包日幣 150 左右,量有點少,我都一次買兩包,買回來用熱水泡五分鐘撕開封口就能吃了。記得帶好泡麵碗筷,大潤發有賣,蓋子、碗、筷和湯匙合起來一組好像台幣50還是100元,沖泡麵和熱稀飯都很方便。

另外,記得印好 IVU 提供的素食說明文,可以拿給店家看,看他們能不能幫你處理,不過傳統日式餐廳大概不會受理。我在海遊館旁的餐廳繞了一圈問了幾家店,他們都說飯裡本來就有摻了,沒辦法提供素食餐。

在大阪時我是到 Greens 或 Green Earth 用餐,京都時則是在京都車站內,京都劇場旁的義式餐廳吃義大利麵,晚餐則是稀飯配自己帶的素肉鬆或是自己帶的素泡麵。

以下介紹大阪的這兩家餐廳:

Greens

位於大阪港摩天輪對面,很好找。週四週日休息,只作午餐,日幣 800 元。


Greens 是 buffet 式的,除固定的生菜沙拉、麵包和湯外,每天會有不同的兩道菜以及點心。有些菜會加蛋或奶製品,記得一一確認。

Green Earth

位於大阪市本町站15號出口附近,有點不好找,見後面的照片,有地圖。週日休息,只作午餐,八人以上可以預約宴會,晚上亦可。老闆英文說得很流利,另有一位店員聽得懂也會說一點英文,還會說一點點中文。

上圖是某天的午餐套餐,我吃了一口後才想到要照相。還有許多餐可點,而且不同天的形式不同,中西日式都有。這家店以健康為主,在台灣都很難找到作得這麼健康的餐,味道也不錯。

Green Earth 的地圖。

在大阪時,只要不怕花時間,大可搭地下鐵去素食餐廳用餐,感覺挺安心的。但京都就慘了一些,所以我都是早上走洛中的景點(如東本願寺、二条城),回京都車站吃義大利麵,下午再到遠一些的地區走連續的行程。雖然有些花錢,反正出門在外,吃得好玩得愉快是最重要的!

2008年5月29日 星期四

關西行:行前準備

在5/20去日本前,有一堆雜事待處理,特別是碩論最花時間。只好到日本後才仔細規劃旅遊行程,去之前只想好一個點日本橋而已...,個人嗜好嘛。

我在大概15天前開始準備,機票旅館都還沒訂。先看完BlueCat先前去關西11天的心得,即使看了兩遍,還是什麼都不懂。到書店翻了各式的旅遊書,稍微清楚了一點。接著直接用電話問BlueCat有什麼建議。BlueCat說可以參考背包客俴,裡面有超多資料,還有可以先買一本關西旅遊總覽的書,再挑定點買詳細點的書,我後來照做,發現超有用的。

一開始我滿排斥買旅遊書的,總覺得照著別人規劃的行程中,似乎不夠「自助旅行」,也不想多花幾百元。實地走了幾天後,我才想通,就像我們到台灣一個未拜訪的城市,沒有旅遊書,無法在幾天內亂走「塞」到值得去的景點。事先在網路上查的資料也以文字居多,不方便做為指引。其實和日後在日本花的錢比起來,花不到一千元台幣買兩本旅遊書,真是值回票價,容易規劃行程,回來也方便回顧。重點是,要買提供各種旅遊路線的書,之後可以自行參考融合成自己的路線。像在京都走完三天後,我發現各地值得去的點就那麼一兩個,沒必要硬為了順路,而在一個地區一路參觀次熱門景點。所以在大阪市區時,我反而是各個點只走一小段,滿足後就換下個點,不再繞路看附近其它點。

我買的書分別是這《京都 大阪+神戶 名古屋 奈良 和歌山食玩買終極天書08 ~ 09全新Update版》《京都散步地圖》。用前者規劃大阪行程和了解交通路線,書裡有附大阪鐵路圖,和來返機場的各種方式,相當受用。後者以京都東西南北中五個地區分別介紹,在各區把可以用走路連起來的景點串成一日行程,並附詳細地圖說明如何搭巴士或地鐵到達,如何從一個景點走到下一個。兩本書都提供眾多行程,可以自己挑有興趣的整合在一起。

除了書外,我有開一個文字檔案,依食行住行樂和證件等分類,想到什麼就寫上去,查過後再加註OK。就這樣滿順利地在15天內想到就補一下地完成必要的規劃,有什麼不懂的上「Yahoo!奇摩知識+」查,很方便。舉凡如何到機場、登機流程、住宿等應有盡有。當然,背包客俴也很方便。另外,近日氣溫可以到 天気予報 - ウェザーニュース查,介面超方便的。

日本關西行總篇

世界很大,人很多種。

一直以來,我不喜歡旅行。之前有機會去北京和西安各一次,也只參觀了一天:在北京看紫禁城,在西安看兵馬俑。後來看到桶哥他們去華山,才覺得可惜,當初至少也該多去長城和華山看看才是。所以這次有機會去日本關西,我決定試著旅行看看,也許十次裡有九次試之前就知道沒興趣了,至少,第一次的嘗試是值得的。

於是我在5/20到了大阪,於昨天5/28從大阪回來,今早維持在日本的作息醒來,難得在早晨遇到室友。大刁問我,日本好玩嗎?我側頭想了一下,回答沒特別好玩的,我本來就不喜歡旅行,只是,這回我用雙腳證實了!雖然如此,這仍是值回票價的單人自助旅行,之後會陸續補上下列心得:

比起參觀各式景點來說,一個人的自助旅行,以及旅途中遇到各式各樣的旅人,反而是最有價值的部份。感到自己可以活得多幾分色彩,少一些自我設限。我打破了一些框框,也看到更多的框框,事在人為,不試一下不會明白的。

趕碩論之餘,看能不能每天寫一些吧。

2008年5月6日 星期二

學習的方式不斷地在改變

記得小學時得到圖書館找資料,順便看看劉欽興漫畫。高中時開始學著用網路找資料,但仍維持國中時自己手寫筆記整理的習慣。大學後會交錯使用電子書、實體書、網路找資料,上過的課,會把投影片整理好,待要查時再拿出來用,有了投影片,似乎已可很快地溫故知新,再適當地用 BBS 整理零亂資料,一切似乎很順暢。

研究所開始,漸漸發現看 WikiPedia 的比例愈來愈高,有時乾脆直接上 WikiPedia 找,結果剛才要找 fragmentation 的定義,回頭看 OS投影片,看不到什麼有用的知訊,WikiPedia 一查,完整又詳細的說明馬上出來,文字組織明確,定義和例子兼具,實在想不到比這更方便的查法了。

小學時當興趣閱讀的兒童大百科,曾幾何時,已變為占空間難以使用,又容易過時的存在呢?

隨著獲取的資訊愈來愈雜,深度廣度都在急遽變化,開始架 Wiki 整理零散的知識,偶而用 Blog 較有系統地寫下心得,開始覺得,永遠不會有完美的方法。資訊不斷成長,學習的方式也跟著在改變,不只要學新東西,也要適時學習新的學習方式,拘泥於過去學習方式的人,相對來說是愈學愈慢,終會跟不上前進的腳步。對於這樣的變化,我感到的不是恐懼,而是有趣!

五年前有誰想得到,WikiPedia 或 QA 系統 (e.g. Yahoo!知識家),有可能如此發達?社群書籤 (Social Bookmarking) 也帶來新的使用方式,在許多層面上來看,它們是搜尋引擎無法取代的。找資料和管理資料的方式將會漸漸地多元化,只懂得 google 終會跟不上時代的。若對此有所疑問,不妨用同樣的關鍵字到 GoogleWikipediaYahoo! Answersdel.icio.us搜尋,看看出來的結果,略加分析,就會發現這四者有很大不同的特色,視要找的資料而定,各自有擅長的領域。

也許未來仍會有更快的找資料方法,比方說根本不用找,資料全都被記錄下來,看過的東西永遠不會忘,只要索引一下立即取回。以現今硬碟空間的成長速度和個人化工具發展來看,這樣的遠景似乎不用五年就有可能達成吧。

2008年5月4日 星期日

深夜,聽琴聲

好久沒有深夜聽音樂的感動了,剛好交大公用琴房漸漸地衰老,原本打算搬新家後,再買電鋼琴來規律練琴,結果最近幾個月卻和音樂愈離愈遠,少了一些感動。

這幾天重聽 YsF 的片頭曲 - 「預感」,聽著聽著,重燃當時的哀傷不捨,YsF 的劇情其實沒特別引人入勝,和 Ys6 一樣,只算中規中矩的小品,可是 YsF 的音樂相當有感情,加深劇情的影響。像這樣的日常生活,配上一些偶然的小感動,也沒什麼好挑剔的。

追求自我實現,挑戰新難關的我,總會和渴望平淡生活的自己,互相衝突。雖然沒有任何根據,我相信漸漸地,兩著會愈來愈近,直到有那麼一天,合而為一之時,也是一切走向最圓滿的時刻吧。

喔,還有身體健康的自己,也期望他和以上兩者共向美好的未來。不知為何,這類幸福的小感動,總在夜深人靜時才會浮現。

最後,補上深夜聽琴聲後,第一次留下的感動文字:

即使是夏天的夜晚,如果不是很熱的話,我寧願關掉風扇睡覺。

讓透徹的琴聲能更純粹地展現,享受黑白相間,點點滴滴落下的雨滴聲。
2007/08/22  

在那之前還有許多感動的時刻,只有等到感動隨年紀增長減弱後,才驚覺應該要留下些什麼,提醒自己失去了什麼。也許當初怕寫下去之後,就無法繼續靜靜地欣賞吧。

2008年5月3日 星期六

騎車去看「鋼鐵人」

今天打完球後,忽然有人提議要去看電影,擇期不如撞日,當然是今天就去比較容易成行。至上次和老人茶會會友們去看電影,沒想到已隔了一年半。在那之後,只有和 Ambuscade 去看「變形金鋼」,至今也差不多一年沒進電影院了。

今天的成員有阿德、姿樺、yulong、黃哥和Jalamorm,少了每次都在的前.客服小王子有些可惜,不過人生就是這樣啦,大家都過得快樂就好。這部片的劇情不錯,兩小時完全沒有冷場。事實上,我是回來看電影板的討論才知道片長有到兩小時之久。除了有電影院必備的聲光效果,喜感也是十足,劇情的鋪陳也很順,沒有一絲冷場,初期主角遇難那段轉折,讓我有些感動。硬要挑毛病的話,大概是女主角的演技不夠好,劇情緊張時的聲音聽起來有些不合。

看電影前,我忽然想起過去和固定班底去看電影時,只有看「頂尖對決」那次是好片,其它像「世界大戰」、「惡靈古堡」第二集等,真是看得超悶的。所以在進電影前一刻我追問了一下,這次是誰提議要看「鋼鐵人」的,結果心虛的阿德說是黃哥講的,他只是附議而已,還補上這樣的發言「若不好看是黃哥的錯,不過我對他有信心」。沒想到還挺不錯的,嗯,看來以後挑片要給黃哥挑,打球放槍和挑好片是互無影響的。

結束時我本來想聽完片尾曲再走,照慣例大家沒什麼興趣,所以又提早離場了。沒想到回來看電影版才知道結束後還有一小段,類似為續集鋪路吧。看來電影之神有托念給我,只是我們無緣注意到它啊!

備註

以一個理工人的角度來說,看到片中主角動手打造機器的場景,勾起高中時期給自己許下的夢想。如今的我雖然實力提昇不少,但明白自己的能力後,反而以為離目標又更遠了些。仔細想想,其實是熱情不如高中時的自己而已,喚醒過去的熱血,持續前進吧!

2008年5月1日 星期四

初始化 graph 的教訓,不熟的語法別亂用

昨晚跑了個程式,今天醒來不久接到york的電話,說連swap 在內資源都被我吃光了。

這個程式有三個步驟:

  1. 從資料庫裡取出一些資料轉成 graph G(V, E)
  2. 將 G(V, E) 轉成 G’(V, E’),E’ = { (u, v) | (v, u) in E }
  3. 利用 G, G’ 算HITS

原以為是 graph 大小超出我的預料,做了一些縮減後就重跑,吃完午餐回來看,不對,怎麼又停在產生 G’ 的部份。接著在一些錯誤的地方最佳化,最後找到問題的源頭。

在初始graph時, 我以前是這麼寫的:

ur = (1..user_ids.size).map { {} }

產生一個長度為 user_ids.size 的陣列,並在每一個元素內填入一個 hash table (i.e. {}),也就是類似 adjacency list 的存法,擁有 adjacency matrix 和 adjacency list 的好處。這可是過去試了許久找到最滿意的存法,改天再補上遲遲沒寫的 graph 表示法的心得吧。

上面那段程式以前用得好好的,後來我想試試新語法,改成這麼寫:

ur = [{}] * user_ids.size

這個寫法是原自下面這個 idiom code:

array = [0] * n

一般初始陣列時可以這麼寫,會得到一個長度為 n ,初始值為 0 的陣列。

可是 [{}] * n 表示所有元素都指向同一個 hash table (這行程式只產生了一個 hash table),於是災難發生了,超大的 hash table 導至超糟的效率,更糟的是,我又用這個 graph 產生 G’,使得 G’ 變成幾乎 complete graph,然後 memory 就爆了 ( |V| 很大,但原本是 sparse graph)。

附帶一提, Ruby Cookbook 裡有提過這問題,當時有看懂,但沒完成參透啊!比方說當 hash 內元素不存在時,要自動產生一個陣列的話,標準錯誤寫法如下:

table = Hash.new([])

因為陣列只有被初始化一次,存在 table 內,當 table[key] 不存在時, 不管 key 為何,table 都會傳回那一個陣列。詳見以下的例子:

irb(main):088:0> table = Hash.new([]) irb(main):089:0> p table {} irb(main):090:0> table[0].push 5 irb(main):091:0> table[1].push 10 irb(main):092:0> p table {} irb(main):093:0> p table[2] [5, 10]

正確寫法如下:

table = Hash.new { |h,k| h[k] = [] }

這故事告訴我們,語法要學熟,不然等痛過後就會記熟了。

2008年4月13日 星期日

IR and DM algorithms codes

http://www.igvita.com/。好站一推,不止有code教學,連觀念的講解都超清楚的。比方說這兩篇:

看來以後用Ruby寫code會愈來愈方便啊!不過愈是了解Ruby運作的方式,愈是不敢對它的效率抱以期望。

2008年4月7日 星期一

module_eval: dynamic code generation

Ruby的動態性真是超乎想像的炫,先看一個簡單的例子,code改自 “10 Things Every Java Programmer Should Know About Ruby”裡的“Item #7 Ruby is Way More Dynamic Than You Expect”

irb(main):001:0> puts 3.even? NoMethodError: undefined method `even?' for 3:Fixnum from (irb):1 irb(main):002:0> 3.class.module_eval "def even?() (self & 1).zero? end" irb(main):003:0> puts 3.even? false

第二行即時塞入數字class一個method,更炫的是,你甚至不用知道數字的 class 叫做 Integer,Item #7有太多神祕的功能,目前還不能理解它們的價值有多高。

再來這個例子很實用,但比較複雜,改自《Programming Ruby 2/e》p402。有時我們想將某些方法改用lazy initialization,這些值只會算一次。一般的做法,就是另設個private field,先檢查該field是否已設值,是的話就直接傳回,否的話先算再傳回,像singleton就是一個例子。

若有10個method想改怎麼辦?若改完後有特殊需求想改回來怎麼辦?若用C/C++、Java,自然是得改source code再重編譯code。先不提程式必須停止的影響,至少要反覆改code就不太方便。Ruby的話,可以寫兩個method,一個叫 once(),一個叫 unonce(),接著要做的,就是執行 once/unonce 即可,程式碼見這裡,說明如下:

  1. once接受任意數量的參數,參數是instance method name,once會將instance method加上一個cache,使得該method只會計算一次。
  2. 所有class都是Module的subclass,如此一來,所有新舊class都多了一個method once()。
  3. 對Ruby來說,class內的code等同於「執行」,所以 line 36 的 once :r 並不是什麼神奇的語法,而是在 class T 的內部,執行 method once 和參數 :r。
  4. line 40 顯示出,method r() 已被改變了,只會算一次 4. line 43 和 line 36 執行相反的行為。
  5. line 6 ~ 10 是核心程式,line 9 的 “[0]” 是用來處理 method 傳回多個值的情況,傳回多個值時,若 ‘=’ 左方只有一個變數,傳回值會自動變成陣列。

以上的例子說明了什麼呢?

這個例子揭露了Ruby強大的動態能力,原本我們想將method改成有cache或沒cache,得修改原始碼才行,若有10個method就要改10次,而透過module_eval的技巧,只要寫一次 once(),用一行code執行一次 once(),全部搞定!程式相當地有彈性,其它類似的雜事像 setVariable/getVariable也可以透過類似的技巧解決。Ruby內建的 attr_reader/attr_writer/attr_accessor 應該是類似的產物。

其它附帶的好處是程式可以在執行中即時修改既有的任何程式碼,而不用停止程式,事先寫好一些操作的話,除ruby interpreter更新外,程式不需要停止。

2008年3月26日 星期三

Learn To Program

Learn To Program這個站真是超酷的,由一個 ruby program 寫成的 CGI,用來即時產生書的內容(見” About the Original Tutorial”),好處是確保範例code不會有錯,亂數或時間之類的還可以每次看到不同內容。更炫的是,code、code執行結果可以自動產生,有興趣可以對照看一下“Flow Control”裡Branching 開頭的code,包含source code、兩個執行結果和中間的remark,是由下面這段code產生的:

run1 = {:input => ['Chris']} run2 = {:input => ['Chewbacca'], :remark => 'But if we put in a different name...'} progN run1, run2 do <<-END_CODE puts 'Hello, what\\'s your name?' name = gets.chomp puts 'Hello, ' + name + '.' if name == 'Chris' puts 'What a lovely name!' end END_CODE end

至至於內文寫得好不好,我就沒注意啦。花點時間看這份code挺有收獲的。

2008年3月16日 星期日

Google File System

最近 Google 在推 MapReduce 這個平行計算 framework,讀完 paper 後,覺得滿有意思的,若有些 network programming 和 functional language 的基礎,讀起來應該滿輕鬆的。除了好奇之外,一方面也是想讀點技術性的論文,看看和平常讀的 data mining、information retrieval 論文有什麼差,又找了 GFS 的 paper 來讀,結果還滿有趣的。

先提個技術無關的事,這篇的 Acknowledgments 最後一句寫著:

Many of our colleagues at Google bravely trusted their data to a new file system and gave us useful feedback.

令人會心一笑。

這篇論文一開始先說明作者的需求。依他們的使用環境,提了些使用上的假設,像是硬碟常壞掉、設備不可靠,可是 file system 的可靠度是首要目標;random write 少、append 多;還有 small random read、large sequential read。接著依這些操作特性,自訂需要的 file system,對我這類看重實務面的人來說,這種開頭很合我的喜好,有些學術性論文討論的是尚未存在的需求,較難接受作者的假設。描述整篇論文太累了,這裡摘要一些我認為有趣的設計:

  • GFS 是架在 Linux file system 之上的 file system,這樣做的好處是善用Linux既有開發,簡省開發時間。雖然作者也提到因為Linux kernel bug,使得系統有些不穩,逼迫他們自行改 Linux kernel,整體來說,作者認為這個決定是正確的。我原本還以為GFS會自己重弄一個file system。
  • GFS的主要目的是穩定和處理大量資料,所以分散式系統是理所當然的設計。但有趣的是,GFS 採用 single master server,理由是設計簡單
  • GFS由 one master、many chunkservers、many GFS clients組成。
  • 為了達到single master,整體設計做了許多對應措施,如盡可能減少master的負擔,GFS client直接和chukserver拿資料;要寫入資料時,也是chunkserver之間互傳,master只記meta data。
  • 為了讓 meta data能全塞入memory,metadata格式很簡單,並有做 file path 的 prefix compression。實驗部份指出上百TB的data,meta data只占數十MB
  • 沒有「目錄」的存在,所有檔案的是用絕對路徑表示,這樣做的好處有:省下目錄的資料結構;可以同時多個client新增同一目錄下的檔案,沒有目錄,自然不需要對目錄要write lock(但「目錄」仍然有 read/write lock,用在別的場合)。
  • 整體採用duplicate data確保availability,chunkserver有存各個data block的checksum,送出資料時有先確認沒有損毀,確保reliability。
  • 不同檔案可以有不同的replication factor,預設值為3;常被使用的執行檔可以設為上百,避免同時多個application client用到而造成bottleneck。
  • 寫入檔案時,為確保各個replication一致,做起來不簡單;master會指派一個chunkserver負責資料更新。值得注意的是,由於寫入動作的複雜度,有時會先等一會,再批次處理對同一檔案的不同寫入。
  • 更新資料分兩部份:資料流會依chunkserver相對位置傳,並把資料切成數小塊,行成一直線的pipeline傳資料,減少傳輸的lantency
  • 接著由master指派的chunkserver指示所有有關的chunkserver用同一順序寫入資料,確保即使同時有多種寫入同一資料的操作,寫入完後同一份資料在不同chunkserver上仍然一致。
  • replicate data時,不止要考慮放在不同chunkserver,還要放在不同rack,使得swtich壞了或某機房停電時,仍能保證資料的存取。
  • master待load較輕時,會在background簡查metadata的正確性、data replication是否有達到正確的數量,並依確少的程度補救,比方只剩一份replication的優先性比剩兩份大很多。
  • master若掛了,外部的monitor會發現,重新開一個master (一分鐘內即能完成)
  • 為了確保master掛了也沒問題,所有master的操作都是先將log寫入disk後,才正式執行。加上log很精簡,master重新啟動載入log不需多少時間。
  • 事實上,不管是master還是chunkserver,都沒有「停止」的指令,直接kill即可。它們都是設計成可以隨時掛掉,隨時快速複活
  • 刪除檔案即在master內將檔名改為特殊名稱並隱藏起來,仍可讀取和復原;待一段時間(三天)後,master會在background執行的garbage collection中正式清掉標記為刪除的檔案,好處是減少master短時間的high load,還有避免使用者犯錯,壞處是disk space可能實際上夠卻無法拿來使用。
  • chunkserver若發現檔案無法在master內查到meta data,即表示檔案已被砍了,減少master和chunkserver互相sync meta data的問題。master則是在新啟動時,向所有chunkserver要資料,減少master記錄的負擔。
  • 雖然GFS沒實作POSIX,卻有另外提供特殊功能:append record和snapshot
  • append record常用在 many-to-one producer-consumer queues。append可以同時對同一檔案操作,write則需要指定offset,不能同時執行。
  • snapshot指複製某個namespace下的所有檔案 (e.g. /home/www ),snapshot採用類似 copy-on-write 的設計,沒被寫入的data chunk不會被複製
  • chunk有reference count,當chunkserver發現reference count > 1又被寫入時,就會先複製一個新chunk,再把reference拆開,並更新各自的reference count。透過reference count達成copy-on-write的設計很漂亮,為了避免snapshot途中檔案有變(e.g. 多了新檔案),執行snapshot時會要求該namespace下的write lock。
  • shadow master以慢一點點的時間達到和master一樣的狀態,當作 read-only master,減輕master負擔。

整體來說,這篇論文相當有意思,許多設計都是簡單易懂,概念看來也很實用。唯一奇怪的是,實驗部份的表現看來不太好,還有我看不懂部份實驗說明,概念和設計細節都懂,反而是實驗看不懂,這到是很少碰到的情況,怪哉。

2008年2月28日 星期四

引爆趨勢

書藉基本資料: 引爆趨勢 (The Tipping Point)

前陣子在研究 social network,想說應該要了解一下社會學者的觀點,找了些書來看。網路上找了一下,以《社會學的想像》和《見樹不見林》較為有名,可是前者太硬了些,借回來兩個月還是看不完,後者資料少,不知道是不是絕版了,圖書館也沒進。後來意外找到《引爆趨勢》這本,易讀許多,如同導讀所言,時下大量的科普書中,這本是少數和社會人文相關的科普書,好處是易讀,壞處是不夠嚴謹。反正是科普書,入門和推廣比較重要,嚴僅的事就留給那些難啃的論文吧。

本書透過眾多個案研究,跨越不同時空背景,強調一個簡化的觀念:「什麼情況下才會造成流行?」流行的對象可能是一句話、商品、節目、疾病。作者假設流行與否,取決於三個要素:少數原則 (The Law of the Few)、定著因素 (The Stickiness Factor)、環境力量 (The Power of Context)。只要三個條件滿足後,趨勢就會以指數方式廣散,一發不可收拾。後兩者滿容易理解的,作者提了很多案例,藉此說服讀者,它們的重要性比我們想得還高。像環境力量部份,最有名的例子是紐約地鐵的復興,還有犯罪率的下降,起因是全力洗刷地鐵裡的塗鴉,以及抓搭車逃票的人。心理學上對應的原理稱為「破窗效應」,相信這已是耳熟能詳的名詞,有興趣的人不妨google一下,很有意思。除了抓逃票犯意外抓到通輯犯的比率意外的高外,它傳達了另一個訊息:警察連逃票這種小事都慎重地查緝,你還敢犯比這嚴重的罪嗎?若用中國文化的說法,紐約市的作法可視為「勿以惡小而為之」的實戰版。

少數原則則是我認為全書最精彩之處,像如今 Web 2.0 網站興起,每個起步網站都面臨湊不到初期會員 (First 1000),無法發揮分享的好處就倒站,如何行銷獲得初期會員是關鍵之處。本書借用少數原則告訴我們,行銷的錢不必多,初期會員不用多,而是要找到關鍵人物。Small World 為例,作者藉用一則實驗結果,認為我們能透過五位人士找到全世界的人,不是隨機找到的,而是先找到關鍵人士,由他們當轉接者,才找到全世界的人。

備註:引用 Small world experiment, 2.2 Results 對實驗的描述:

In an experiment where 160 letters were mailed out, 24 reached the target in his Sharon, MA home. Of those 24, 16 were given to the target person by the same person Milgram calls “Mr. Jacobs”, a clothing merchant. Of those that reached him at his office, more than half came from two other men.

作者稱這些關鍵人士為連結者 (Connector),他們的特色是認識的人很雜,分佈的社群很廣。不仿回想一下自己認識各個人的起因,也許會意外發現自己身邊的連結者,自己是透過他加入了其他社群。書中同時引用許多有趣的實驗數據,說明任何人一生中能認識的人差異不會太大,挺多一百多位。然而,認識的社群差異,就是他們影響力的主要差別,只有連結者可以跨社群影響,帶起社群之間的聯繫。還有,藉由找工作的問卷調查,書中提出泛泛之交的重要性 (the strength of weak ties),說明朋友社群分佈廣度的重要性。另兩種關鍵人士為專家和推銷員,前者用專業知識說服人,後者用個人魅力,也可說成前者是理性手段,後者是感性手段。

備註:引用 Interpersonal ties 內對 weak ties 的描述:

Specifically, more novel information flows to individuals through weak rather than strong ties. Because our close friends tend to move in the same circles that we do, the information they receive overlaps considerably with what we already know.

本書後半有些觀點滿有趣的,像是一個團體最多只能有150人,超過的話會使同儕間相處的完美合協度破裂,因為人類似乎最多只能和這麼多人熟悉,若希望一個單位能同心協力發揮團隊力量,最好的做法就是不要讓他們人數超過150人,這個神祕數字在不同的個案裡被重覆發現,像是軍方或公司。其它有趣的例子,還有以吸煙為例,討論如何逆用少數原則和定著因素,來降低青少年吸煙的方法。

現今網際網路大為流行,許多社交方式將興起改變。比方書中以問卷調查數據說明,我們交往的朋友,大多是因為所處的地理位置相近,而不是興趣相投;或是前述提到的最多認識且有維持連繫的人數只有一百多位。這些現象都有可能因為線上社交網站的興起而有變化,比方說透過網路,我們更容易找到興趣相投的人,也不見得要和對方長期碰面亦能連繫;透過 FaceBook,我們可以更簡單地記下一百位朋友並和他們連繫, FaceBook 也提供一個更方便進行 Small World 或 Six Degrees of Separation 的實驗。就像飛機和船發明後,改變人類生活方式,網路的發達亦會如此,不知道有沒有社會學家進行相關的研究。

2008年2月21日 星期四

與成功有約

書藉基本資料: 與成功有約(The seven habits of highly effective people : restoring the character ethic)

中文譯名有點鳥,英文的書名可能不會那麼排斥。

講大道理的書滿街都是,偶而經過書攤我會挑個一兩本翻一下目錄,若目錄裡列的道理看一眼沒能體會又有興趣的話,就翻到該段掃一遍內文,領會到背後精神後就把書合起。印象中這類書小故事一堆,廢話也多,可能不用半小時就能掌握80%有用的內容,或是不看也沒差。

《與成功有約》到是出乎意料之外,第一章我愈看愈仔細,到後來變成用讀一般書的方式來看。作者舉了許多好例子,規則也整理得很清析,打破我以前對這類人生道理書的偏見,這本書值得花多一點時間看,反而是看個幾頁,合起書來想想,去忙別的事,改天再回來翻後幾頁。

作者強調要以和別人分享書中心得的方式來讀此書,如此才能達到讀書的最大功效,我相當認同這個觀點,寫心得文除了和大家分享外,一方面也是讓自己整理思緒,確認是否真的領會到書中的觀念。俗話說得好,「唯有用自己的話說出來時,你才真的懂了」,我完全同意這個觀點,光憑作者的這項要求,就能明白作者不是普通的大道理作家,只會說些空泛的言辭,而懂得如何實踐。

還有一些有趣的例子,前面提到要由內而外全面造就自己,像是父母管教孩子,有時不是管不好孩子,而是以為為孩子好,其實是為自己的面子。當孩子成績不如意時,真的是擔心他未來前途,還是擔心和親友聊天時的負擔?唯有看清自己,才能放下自己的成見來教導孩子,也唯有這樣,孩子才會接受父母的協助,而不是認為被管教。

提到時間管理時,作者請讀者先想想,不管是個人生活還是工作方面,有那些事是認為重要,但遲遲沒有執行的事?接著,作者依重要和緊急分成四種類型的事,即:重要且緊急、重要卻不緊急、不重要但緊急、不重要也不緊急。回想一下日常生活,會發現不論重要與否,自己卻被緊急的事搞得精疲力盡。於是,剛才想到的重要卻不緊急的事,就一直都沒有執行,直到有天發現不做不行,或是做了也來不及時,才來後悔。對我來說,我高一時就明白數學和英文很重要,應該一天各花一小時學習。遺憾的是,我一直沒落實這想法,偶而落實一陣子,也感受到它的成效,卻又被其它緊急事情打破,最後不了了之。

另外像主動積極的觀念,描述的很清楚,這個想法是相當重要的第一步。關於主動積極部份,可以參考《李開復給中國學生的信:做個積極主動的你》,李開復文中的說法和本書很像,印象中李開復演講時提到的參考書藉好像有本書。可以觀察一下身邊的朋友,找出符合這想法的人,透過身教更能感受到主動積極的優點。大學前我只能算普通積極的人,後來認識skylight、會長這些人,從他們身上學了不少,漸漸地改變自己,做事的成果也確實改善許多。

總結來說,本書強調「依賴 -> 獨立 -> 互賴」的成長過程,言簡易駭。用例子來說,想要有可靠的同伴,唯有自己先成為可靠的同伴;想要別人尊重自己,唯有自己先尊重別人。類似的例子俯拾皆是,配合親身經歷後,感受更深。

2008年2月16日 星期六

研究科學的第一步 - 初步心得

書藉基本資料: 研究科學的第一步-給年輕探索的建議

有趣的是,一開始作者提到,天才不用人教,我們只能教一般人,而且做研究的方法千百種,每個人自成一格推論方式,除了大家都懂的大原則外,學一堆方法沒有用。那麼,寫這種教人家做研究的書有啥用?作者在搬石頭砸自腳後,說明教理論方法是沒用的,但勸告是有用的。導讀裡也提到這本書的重點在培養各種個性(如耐性),而非研究理論。網路上也可找不到不少大師分享培養個性的文章,不知是否時機成熟,現在看這本感覺特別受用

這本書意外的好讀,沒太多障礙就讀了不少內容,收獲不少。目前剛看完第二章提到坑殺新手的陷阱,對我來說意外的受用,剛好自己進行研究一段時間後才來看,感受更深;第三章提到需要何種心智能力也是鞭辟入裡。作者強調做研究只需要平凡的智能,加上培養好個性即可,書裡有詳細的說明,作者的諸多譬喻相當生動易懂,值得一看。像說明專注時,作者以長期曝光拍攝原本看不見的星星為例,說明專注帶來的效果。原本想寫些什麼心得,可是重點太多了,寫起來又很像一般廢話,大家還是自己看書吧。

Java Puzzlers

書藉基本資料: Java Puzzler中文版-陷阱、錯誤與死角

《Effective Java》類似,這本在講Java的特性。不同的是,這本著重在以易犯的錯誤例子來說明正確的準則,而《Effective Java》是直述守則。本書在說明錯誤時,常引用別處文獻說明進一步資訊上那找,其中大部份的參考文獻出自《Effective Java》。另外不同的一點,本書的述說語氣比較風趣,偶而還有有趣的爛解答。哦,還有附一堆相當傷眼的錯覺圖,我時常用手遮住它們,以方便我能舒服地閱讀文字。然而兩本相較之一下,《Effective Java》較值得看。

不過相較於《Effective Java》直接說怎麼做較好,這本書到是相當成功地說服讀者,為什麼不要那麼做,例子舉得相當漂亮,帶來不少衝擊。本書不宜長時間連續閱讀,讀起來相當傷腦,一堆看似正常的程式碼,卻常發生不可思議的結果,或是不知所云的編譯錯誤訊息。或許,當Java寫到一定程度時,看這本書可以協助除錯。以下簡單直述部份心得,若對解謎有興趣的話,就別看下面的心得,自己慢慢翻書也是種樂趣。

  1. final對於method和field的含意不同,field的final是指只能設值一次,所以
    final int a;
    a = 3;

    是合法的。但也因這個特性,會有些潛在問題,例如:物件因為初始化順序不同,而讀到未初始化的final field。解法:lazy initialization。

  2. 除非之前有執行 System.exit(),finally一定會被執行到,這意味著在finally之前的return和throws exception會被finally給蓋過!
  3. constructor內不要呼叫被覆寫的method,有可能因物件初始順序而讀到未初始化的欄位。可用lazy initialization解決。
  4. 一些計算機組織的知識,像是 IEEE 754對浮點數的定義,使得太小的小數無法加進去,例如:

    float a = 2.0E20f;
    a += 1.0; // 結果仍是2.0E20f

    還有因為負數用二補數表示,負的MIN_VALUE不存在對應的正數,abs(MIN_VALUE)結果仍是負的MIN_VALUE。

  5. 要分清楚overriding、overloading、hiding、shadowing、obscuring。Java 5.0後,override時記得加 @override 避免 method 寫錯宣告時變成 overloading。還有別用參數數同一樣且有父子關係的 overloading,例如下面是個不好的 overloading,由於 JVM 會找最接近型態的,而可能呼叫到非你想要的:

    public boolean equals(Object o) {return true; }
    public boolean equals(String o) {return true; }

  6. method的覆寫 (override)不能變得更限制(例如public不能變protected),但field可以,此時稱為 hiding(亦有其它情況會發生 hiding),例如下面的例子是合法的:

    class A { public static String s = “A”; }
    class B extends A { private static String s = “B”; }
    A o = new B();
    System.out.println(o.s); // 結果為:A

  7. 用class method時,使用class名稱呼叫,避免呼叫錯誤。注意:((Math)null).PI 是合法的,JVM不會理會object,而會直接找它的class。
  8. Java 5.0支援泛型後,盡量不要使用原始類型(例如 List),那是向下相容的必要之惡;改使用參數化類型(例如 List<T>)。千萬不要混用原始類型和參數化類型,#88會給你滿意的理由,為何不要這麼做。
  9. 不要在一個運算式裡改變一個變數多次,這牽涉到實作細節,比方 x^=y^=x^=y 這個有名的例子,在 Java 裡不會成功的 swap。
  10. 不要在一個運算式裡將型態自動向上向下轉型(例如 int 變 long或反過來),這之間有很多潛在問題,詳情參閱前面的puzzles。
  11. char是無號型態,其它byte、int等都是有號的;16進位沒有正負號,它直接以二補數解讀;< <、>>等只看最低的5 bits數,a < < 31和a << 63意思一樣(小心負數的情況)。

2008年2月11日 星期一

重看心靈補手有感

剛才重看一次《心靈補手》,忽然有些感觸,特別是主角在賣弄完他的聰明才智後,卻回答不出一句”What do you want”;還有MIT教授和心理醫生兩位老友吵架那段,提到自己認定的成功,被別人「可憐」的失敗;還有主角的好友說他已獲得了百萬元獎卷,卻窩囊的不敢兌現。想到我小時候嚮往的學院生活,想到自己的缺點。對於自己適合做什麼,將來想做什麼,似乎又更明確了些,剩下的就是實踐計畫,再看看是否真的如此吧。

現階段我唯一確定的是,我不如自己想像般地了解自己想做什麼。先能承認自己的缺失,才有改正的可能。我明白我老是想太多,太害怕而不敢踏大步一點。想要的太多,卻沒耐性一步步執行,或著是不明白自己最想要的為何。比較可取之處,則是跌倒了爬得起來,而且敢再嘗試。接下來我得先學會的,是慎重緊密的思考後,從容地放下,一鼓做氣大膽地執行到底。首先,我得再多花點時間,繞個小圈,來看看我想做什麼。

勇闖資訊新未來:打造資訊科技的幕後英雄

書藉基本資料: 勇闖資訊新未來:打造資訊科技的幕後英雄 (Out of their minds : the lives and discoveries of 15 great computer scientists)

前幾個月對於是否要讀博班、是否要從事研究工作感到困惑,就找了這本書來看,看看大師們怎麼說。中譯名稱不太好,這本書收錄了15位Computer Science 界大師的傳記,並穿插和大師們的訪談。從軟體到硬體;從計算機結構、演算法到人工智慧,包含諸多CS子領域。最後的後記分析大師們成功原因的異同。這本書的中譯相當不順,如果可以的話,或許讀原文較好。

總結來說,大師們相似部份很少,令我驚呀的是,包含發明BNF的John Backus在內,有幾位大師是年輕時不知做什麼好,先去當個幾年兵回來,才找到人生方向。遺憾的是,究竟是什麼讓他們找到目標,書裡沒有進一步的說明,似乎男人當個兵回來就能發現方向。仔細地分析,演算法、學術型的大師,大多是學生時代就表現過人,可能不是在CS領域發光發熱,總之就是優於一般水平的學生。至於對研究的看法,看法差異很大,Dijkstra說找最難的做;提出planar graph快速解法、network maximum flow的Robert E. Tarjan說要挑對問題,從實際應用面下手;然而對分散性系統有深入研究的Leslie Lamport(提出bakery algorithm)說要找有興趣的問題,他甚至這麼說:

我也很懷疑別人會因為某項問題非常重要,覺得此項研究非常有趣。好的研究來自於你認為某項研究是有趣的,然後想要好好和它玩一玩。

其它像讀到Fred Brooks的故事滿高興的,我很喜歡他寫的《人月神話》,這本大概是我做筆記最認真的一本書。還有Douglas Lenat提的Automated Mathematician和Cyc也很有趣。沒有絕對的正確,我們有許多認知相互衝突,現實世界不如數學,能用一個完美式子推衍含蓋,人工智慧的研究也該接受現實的亂象,才有可能實現。人類在判斷時會依自己的認知,潛意識地在不同的前提做出正確的判斷,比方書中提的例子,「德古拉是誰?我們會回答「吸血鬼」;世上有吸血鬼嗎?我們會回答「沒有」。即使上述兩個問句和答案,邏輯上令機器感到困惑,卻不會造成我們任何困擾,因為問答時的背景不同。

若對研究感到一些疑問,讀這本書只會得到更分歧的答案。不過就像讀個案研究一般,讀到一個程度後,會對於整個時代背景有些感覺,而明白一件事,我所處的時代和他們不同,他們的故事無法給我明確的指引,我得自己走一遍,才知道自己的路在那。之前問一些教授他們當時要出國讀博士,才發現他們的環境和現在不同,所以老教授們的回答差不多:他們是不得不出國。現在學校的選擇變多,工作的可能性也變雜,使自己過於煩惱要怎麼選。經過這些談話,以及讀過這本書後,我體驗到時代背景差異的重要性,事前準備已夠了,我得多花點時間在自己的嘗試上。

2008年1月27日 星期日

用automata的path做為memory

最近想整理一下過去修課時散落的心得,就這樣隨時間過去而忘記挺可惜的。

在讀 DFA/NFA 時就有這種感覺,利用 state 的連結方式或某種 path 的展開,可以表示特定記憶狀態,比方若 language 的 size 為有限個,可以把每個 string 以一個 state sequence 表示,於是這些 state sequences 的聯集會成為 state tree,藉此記下整個 language。

這概念運用到 PDA 更有效果,如果想記住 stack 最上層有限個元素,可以在PDA裡加入由2^k個state表示的 tree,記下 stack 裡 top k 元素,像下圖所示:

由 state s 連出的上面那條 path 表示 stack 最上面的元素是 0,下面則表示 1。即使被 pop 掉了,由此延伸,就能同時「多看」幾個 stack 內的元素,比方比較 stack 最上面 3 個和 最下面 3 個是否一樣。由於 PDA 的 state 數是有限個,所以這個做法無法記下無限長的 input string,並且,在建立 state 時就要設計好要記憶多長的內容,比方我們假設最多記 k 個 input,萬一輸入多了一個,這個做法就失效了。所以,在記憶的功能上,這個做法同樣地比不上 Turing Machine,這是先天架構的限制。

以實例來看,FA 和 PDA 都可以判斷部份 ww 類型的字串,只要事先建好長度為 1 ~ k 的 ”state path”,配合 Non-deterministic 的做法 [1],即可判斷。但我們無法處理任意長度的 w,當 |w| > k時,就無法處理了。

由此想法發展, 我想到 Neural network (NN) 用 node、link、link weight 表示memory,類似的概念在 NN 裡已被提過:linking structure 表示 memory,training 就是將資料記到 linking structure 裡,所以 training 的同時也會破壞 memory。

這個想法很有趣,也能類推到人腦運作,不過不管從正反面來看都有用也有問題。可以說新 input 會造成舊的 knowledge (memory) 被破壞,但也不知道是那個 knowledge 被破壞,也可能是重組成新的 knowledge,隱含可以推論出包含舊有功能和新功能的 knowledge。唯一可以確定的是,link structure 的大小決定了記憶容量。在 FA 和 NN 之間,應該還有更深入的關聯性可以思考,或許可以有系統地分析 NN,從而改進 NN 的不足。

ps

做法:

  1. 假設 |w| = i,讀入 i 個 input,並將其「記在」state 裡,舉例來說,s1001表示先前讀到的順序為 1、0、0、1。
  2. 往後讀 i 個 input,若讀入的順序和先前「記住」的順序相同,且讀完 i 個 input 後剛好到字串結尾,Accept。

配合 Non-deterministic 的特性,從起點開始會有 k 條叉路,只要有一條猜對|w|,就能正確判斷。

2008年1月25日 星期五

減少操作實驗浪費的時間

分享一下之前做實驗時發展出的小技巧,我這裡指的是跑程式的實驗。花點時間研究一些工具,可以剩下不少重覆執行的動作。

首先,畫圖方面 gnuplot 是最好的選擇,用法很簡單,google一下學個基本,之後要用什麼特殊指令,去 Demos and Screenshots 裡找符合的圖,將範例code抓下來試一試,改一改就會用了。看到常用的指令或參數,就到 DocumentsIndex 裡找詳細說明(比方查 xrange 的用法),減少試誤的時間。

gnuplot 最大的好處在於批次處理,初期費些工夫寫出滿意格式的 gnuplot code,接著就可以把所有圖表套用一樣的格式,想變更格式時,比方加格線或放大字型,只要改一份 code,所有圖表可以一同更新,這是 Excel 難以做到的,也許 VBScript可以,但學習代價應該會比 gnuplot 高。若會寫 shell script或scripting language如Perl、Python、Ruby、PHP,可以配合script和寫好的gnuplot code,執行一個程式讀入不同的資料檔,即可重畫所有圖表,這點 Excel 更不方便達成。配合 script 還可以自動轉成 LaTeX 用的圖檔格式。若不滿意 gnuplot 預設 EPS 的風格,像我較喜歡預設 PNG 的話,可以配合圖檔轉檔軟體,可以輕易地批次處理,像 Linux、FreeBSD上可以用 convert。做實驗時常要重畫圖表,很少能一次搞定,初期投資些時間在 gnuplot 和批次處理程式上,絕對會回本的。

若想再進一步自動化的話,可以將實驗結果存到資料庫裡,不要存到普通檔案裡。花點時間研究如何用 scripting language 或自己慣用的程式語言操作DBMS(如MySQL),看要在實驗結束時程式直接將結果寫入資料庫,或是先寫入暫存檔再另用別的語言 (例如直接用 MySQL script)將結果寫入資料庫。於是,透過 DBMS 網頁介面的軟體(如phpMyAdmin),可以輕易地觀察實驗結果,像是依時間排序資料、依數據大小排序,或要算平均、標準差等,都輕而易舉;要輸出成 gnuplot 或其它程式的輸入格式,也是非常容易。

最後,跑實驗的程式最好寫成從命令列讀參數,或讀一個設定檔設定參數,減少重新編譯的動作,也方便批次實驗不同參數。

總結一下,我自己的做法是:

  1. 實驗用的程式從命令列讀參數。
  2. 其中一個參數決定要將實驗結果直接輸出(STDOUT) 或寫入 MySQL。有時候做些小更動想看看實驗有什麼差別,不想塞太多資料進資料庫弄亂原有資料,可以下參數讓程式不要寫入資料庫。
  3. 用 shell script 寫好測試用的批次檔,會輸入不同參數給實驗用的程式,產生所有要的結果。
  4. 裝 phpMyAdmin,方便分析實驗情形,以及輸出 gnuplot 要求的輸入格式(用TAB分隔)。
  5. 寫好 gnuplot 的 code,我不知道怎麼在 gnuplot 裡使用變數,讓它能配合shell script對畫圖作細部調整(如更改輸出檔檔名),所以我改用笨一點的做法,將gnuplot code存成字串,用Ruby配合不同變數產生有點不同的 gnuplot code 到文字檔裡,再執行 gnuplot 讀入新產生的 code 以符合細部調整。
  6. 寫個簡單網頁顯示 gnuplot 輸出的 PNG 檔,方便用圖形觀察各組數據的差異。再寫個 script 利用 convert 把所有 PNG 檔轉成 EPS,確保論文裡的圖檔和我想要的樣子一致,但會犠牲向量圖檔任意放大的優點。

上述的方式我試過幾次,幫我省下不少時間,第一次試用時間投資就有回本,更不用說第二次之後的收益了。舉例來說,我其中一個實驗要求是記錄演算法各段落執行的時間,想配合各種不同資料量,判斷演算法的子項目平均時間差多少。但用 profiler 會拖慢執行速度,我只想記錄幾個主要步驟而已。這時輸入到 MySQL 變得相當順手,執行一次批次檔,上床睡覺,隔天早上下個 SQL 做平均,就可以看出差異。找出關鍵的部份後,再下 SQL 選出關鍵資料的細項,看看資料分佈的情況,有助於了解情況。想想看,若不用自動化實驗和資料庫來呈現數據,前述動作有多麼冗長無味,你會想重覆幾次這樣的事?更不用說集中精神分析結果和思考改進方式了。

漫步在冬夜

我很喜歡冬天的氣息,朝晨刺骨的寒氣、午後陽光的溫暖、深夜輕風的寧靜,各有不同韻味。我也喜歡在一般的小街小巷裡散步,隨意而行,一邊欣賞普通街道的日凡景色,一邊沉浸在自己的思考世界裡。

不知道為什麼,冬天總讓我有懷念的感覺,時常憶起冬天的事,特別是夜裡的事。想起小時候縮在被窩裡看書、想起大學和室友們衝到樓下全家買宵夜。或許,這些微不足道的日常反映出我嚮往的生活,和我追求的挑戰人生達到平衡,形成最適合我的生活方式。於是我選在晚餐幾小時後徒步到小街上的7-11,為的不是宵夜,而是走路的這段時間。

透過今天這樣寒冷的夜,我聯想起兩年多前,踏上中國大陸土地的第一次。出發前一天的下午衝去台北報名碩士推甄,傍晚趕回新竹參加期中考,隔天一早出發前往北京。對照這樣緊湊的生活,在北京無憂無慮地漫步,如夢幻一般。我想起一個人在北大校園內散步的事,想起大家一起在北大校園內散步的事。一個人散步的孤寂感是種享受,配合寒冷的北方氣息、人生地不熟卻熱鬧非凡的場景,感觸倍增。相對來說,一群人散步時帶來的安穩感,亦是筆墨無法描述,讓人想永遠停留在那短暫的時光內。即使是平淡的旅程,一個人、一群人在北大的夜裡走著,反而成為最深的回憶,很想再一次在那樣的夜裡隨意散步。

對照回憶起北京行的日記,上次投稿WWW 2008前,感到的是做研究的孤寂感,當時想趁結束研究後休息一陣子,沉澱思緒再來思考未來方向。轉眼間,將近三個月過去,和很多朋友聊過,靜下心來思考了許久,未來一樣地未知。然而,相較於去年十月底的落寞焦慮,如今卻是莫名的自在,憶起一樣的事,卻振盪出不同的思緒。不急不徐,願我能保留如此心境,迎接往後的日子。

2008年1月22日 星期二

能者多勞?

以前曾寫過類似的心得,當時看了「別給優秀人才過多的工作」這句話,深有同感,過去一年剛好有不少管理的經驗,配合自己和別人的情況來看,卻發現這個觀念難以實現。

可能任何地方都有一樣的問題,緊急重要的事不得不交給信任的人,而且這類事永遠不會少,於是有能力的人手邊工作只會愈做愈多,主管在必須達成上級要求的前提下,很難做到工作量平衡,大家都忙著為眼前的情況解套,自顧不暇,那來的時間培育人才?

唯一的解套方式就是讓組內有一群優秀人才,自然不會發生能者多勞的慘狀。於是,人才多的組織愈來愈強;人才少的組織,人才沒時間充實自己,失去前瞻競爭力,漸漸被操到不是人才。像是「多做多學」、「態度決定高度」之類的話,在這種場合只是不得已的精神慰藉罷了。

2008年1月20日 星期日

comparison decision tree和延伸想法

Algo裡提到由 sort 的 comparison decision tree 可得知,任一 decision tree 都存在worst case,其下界為Omega(N*lgN)。

證明的想法很簡單,一個sorting algorithm對 n 個elements來說,會形成一個decision tree,inner nodes是比較的過程,一個由 root 往 leaf 的過程,就是一個排序演算法經歷的步驟。於是,任一 decision tree 對 n 個不同的數來說,至少會有 n! 個 leaves (因為有 n! 種排法)。依tree的性質,有 n! 個 leaves的話,高度至少為 lg(n!),而對於任意的input來說,這個 decision tree 的高度即為比較次數的 worst case。所以 worst case比較次數的下界是:

Omega(lg(n!)) = Omega(n*lg(n))

記得我第一次看到這證明時,對 decision tree 的想法相當感動,沒想到重讀 Algo 再看到這想法時,還是一樣感動,而且發現我並沒有懂得很透徹。做過習題 8-1 後,我才覺得自己似乎又多了解一些 decision tree 的想法。

若反向思考的話,decision tree 自然也存在最矮的 leaves,也就是當每次比較剛好都能利用到上回的結果時,只要比 n-1 次即可,例如:

第一次拿到最小和次小的數、第二次拿次小和第三小的數比、...

那麼,有沒有可能對於任意輸入,找到最佳的比較方式呢?也就是說,這顆 decision tree 並不是固定的形式,而會依輸入的過程改變比法。比方在讀入數字後,以O(n)的時間猜測數字可能的分佈方式,來調整 decision tree 的樣子(即 sorting algorithm 的流程)。在這個想法之下,是否有較高的機率走入較短的 sorting path,而加快排序速度呢?

若能想出借用 Evolutionary Computation 或其它做法在 comparison based 下找出新解法,應該很有趣,先暫記一下這極可能失敗的想法。

或是放鬆使用的限制,在得知資料分佈下,預測比較的方式,比方預測要拿那兩個數來比,就有較高的機率找到較好的比較方式,比方一開始就找到最小和次小的數,那麼,接下來就假定不用拿最小的數來比,於是問題就變成排 n-1 個數,用數學來描述的話,就是做到:

T(n) = T(n-1) + c

上面這式子成立的話,time complexity只有 O(n) 而已。當然,加號後面要猜中才會是常數,也許有可能配合機率分析,了解比成功的機會,我想這是不錯的練習 Randomized Algorihm 的機會,有空來想看看。

ps.

  1. 雖然非 comparison based 在給定數值範圍的情況下可打破 worst case的下界,但卻多了 value range 的假設,純comparison based的使用範圍更廣,畢竟只要滿足能比較兩數大小的條件而已。
  2. 剛讀大學時,我對 halting problem 或這類證極限的定理有些反感,因為它們證明了「對所有情況來說,不可能有萬能解」,那麼,若對「所有情況減一」呢?很多時候我們不需要考慮所有情況。而以前思考較不清析,讀到這類問題時會被搞混,而弄錯焦點。現在看來,自己似乎有那麼一點成長,可喜可賀。
  3. 習題 8.1 告訴我們,透過 comparison decision tree 的分析,符合O(n)的輸入非常少,甚至不到 n!/(2^n) 種。

重讀Dijkstra’s Algorithm有感

首先是確認了Dijkstra的發音,依Wikipedia的定義,要唸[ˈdɛɪkstra]。

以前我一直有兩個疑問:

  1. O(E*logV)不是比O(V^2)大嗎?為啥變成O(E*logV)後較好?
  2. 當heap內的元素會被更動值時,做起來不是很麻煩嗎?time complexity的影響為何沒有被認真討論?連帶使我懷疑那堆怪異的數字,O(V*logV + E*logV) 之類的。

愚笨的我在重讀Algo時終於想通上面兩件事了,

  1. sparse graph的定義:|E| = o(|V|^2),注意,是small-o,也就是說當 n 趨近於無限大時,|E|/(|V|^2) = 0,於是,E*logV還是比V^2小。若對此感到疑惑的話,不妨想想當|E| = |V|^k,其中 k 可以是比 2 小的任意正實數,也就是說,|V|^(1.9)的情況下,E*logV仍比V^2小。

    小時候自以為有讀懂small-o,第三遍讀到這個符號時,才真的體會到它的含義。如同我以前把worst case和Big-O弄混一樣,Big-O只是方便表示上界的符號,不等同於worst case。所以,average case的Big-O、best case的Big-O都很合理,沒有認合奇怪的地方。

  2. 我被heap的insert/delete動作限制住想法,自以為只有insert/delete時才適合做heapify,但當我們更新heap內任一元素時,可以從這被更新的元素開始做heapify,所以heap內的元素可以任意被更新,僅需 O(logV) 的代價。事先用個 array/hash table 就可以記好 heap 內的元素,當要更新特定元素時 (e.g. 某個vertex),O(1)的時間即能完成值的更新。

    沒想到到今天我才真的弄懂Dijkstra, MST的運作細節,以前碰到 priority queue 的更新維護細節時,都下意識地含糊帶過。也許下次再重讀Algo時,又會發現我還沒真的弄懂吧?

另外最近讀《勇闖資訊新未來:打造資訊科技的幕後英雄》時有讀到Dijkestra的介紹,順便記一下他給年輕科學家的建議:

1.別和你的同事競爭。
2.嘗試你能作的最困難議題。
3.選擇對科學發展有益切題的研究方向,不要與科學界妥協。

現階段來說,第三點可能是我最需要的,要能保有自己的價值觀而不與大環境妥協,相當困難。然而,我想一個可貴且稀少的學者,應該具有這樣的氣魄。若我的觀念錯了,也只不過是少一個一般學者,對大環境來說沒什麼損失。不管前述看法是否正確,目前我還太嫩了,仍需要經驗來確認或修正自己的想法。

2008年1月15日 星期二

近日練琴情況

今天彈得很過癮,一首接一首,照慣例先彈《夏影》,上回彈的感覺還在,狀況不錯,因此又多彈一遍。接著彈了《Memory of Mother》(from Snow Sugar),《Tifa’s Theme》,《FFX Opening》。

彈完可以背譜的這四首後,仍不滿足,拿出西村的譜,彈《i.no.ri》,雖然有點小不順,感覺還OK。再拿《約束》出來練,愈來愈順了,彈《鳥之詩》前兩頁,嗯…不太順。

後來胡亂彈了一陣,又回頭彈夏影,彈到中間一個合弦時 (降A Maj7),忽然有點靈感,作出了8小節創作曲,靈感就斷了,無法編下去,唉呀呀。回家的路上一直哼著主弦律,看看能否有所突破,最後又哼回夏影,發現我的創作和夏影比起來遜太多了,沒完成的遺憾小了不少。

再度重聽夏影的演奏,Re-feel的演奏者真的彈太棒了,雖然我終於彈出了自己的《夏影》,仍和原奏者等級差了一大截。我有彈出曲子中的動感,卻彈不出動感中的寧靜。

2008年1月6日 星期日

social network推薦機制

最近在做 social network 的研究,進度相當緩慢,心力被分散到一堆雜事上,這就是沒壓力的下場啊。

這篇文章與該blog裡和facebook相關的文章都很有意思,了解現今最紅的 social network site 如何獲利。看了幾篇介紹後,發現都是相當簡單的推銷機制,我原本也和Mr. Saturday想的一樣,以為facebook會分析使用者的資料,再做出推薦,這也是我現在著手的研究。也許這些學術方法太耗計算資源 ,又無法明確地證明其有效程度,所以 facebook 採最簡單的做法吧?相較於Google極力避開人的因素浮上台面,facebook大辣辣地挑明人的存在,雖然直觀上能讓使用者相信推薦系統,卻更難過隱私權一關。

去除隱私權的問題從研究的角度來看,只使用既有的 social network 發揮的效力有限,只能找到使用者週遭的人,無法找到「沒有直接關聯,但特徵相當相似」的人,大幅減弱龐大資源背後的金礦。但要找出隱藏的金礦,方法不只要算得準,更要算得快,scalability 是首當其衝的問題,這要長時間的研究、試驗、修正,才會有好成果。考量到日後的發展,比較「高深」的方法應該會在日後再漸漸導入吧。

2008年1月1日 星期二

一個投機者的告白

書籍基本資料: 一個投機者的告白

有時覺得每看過一本書就寫篇心得,似乎有點浪費時間。轉念一想,若那是本值得一看的好書,就算寫個一小段,留個影子供自己日後回頭探索,總比什麼都沒留下得好。趁還有點記憶時,來寫數個月前讀的好書。

看這本書,就相當於是聽一位投資界的大師從他年輕時的事蹟一路臭屁到底,讀起來很順沒有負擔。像我這樣不懂投資理財的人,從中學到一些觀念,像是賺錢的方法很多,甚至用公債也有可能賺大錢。作者提到他從時事新聞判斷沙皇時代的俄國公債勢必會被蘇聯償還,從而購入大量價格如廢紙的公債券,等了幾年,蘇聯為了發展國家,和外國交涉借款時,承諾償還這筆費用,結果債券金額大漲,成為作者得意的大交易之一。

投資獲利的祕訣除了不斷的思考和觀察外,耐心相當重要。如同作者幽默的說法,買股票的獲利方式,就是選個好股票,買幾瓶安眠藥睡個十多年。所以投資的錢不能有壓力,不要讓自己處於借錢投資的局面,那會使得自己沉不住氣。作者也提到你得先賠點錢獲得經驗才能學會投資(作者稱這為「投機」),這種事是別人教不會的,要自己做過才懂。還有要敢逆向操作、相信自己,才有可能在投資市場大豐收,一些準則有些人生哲學的味道。