2007年1月31日 星期三

WordPress Plugin:SyntaxHighlighter

官網

安裝、設定、使用都很容易,可是測試結果有問題,so sad。

Ruby

#!/usr/local/bin/ruby exit if ARGV.length < 2 # read stop words stop = File.new(ARGV[0]) stop_words = Hash.new() while line = stop.gets line.split.each { |e| stop_words[e] = 1} end stop.close # read text text = File.new(ARGV[1]) count = Hash.new(0) while line = text.gets line.split.each { |e| count[e] += 1 if stop_words[e] == nil } end text.close # dump results count.keys.each { |key| puts "#{count[key]} #{key}" }

Java

Table stopTable = buildStopWordTable(args[0]); // store String Table doc = new HashTableLL(); // store Count BufferedReader br = openFile(args[1]); String s; while ((s=br.readLine()) != null) { StringTokenizer stk = new StringTokenizer(s); while (stk.hasMoreTokens()) { s = stk.nextToken(); if (s.length() == 0 || stopTable.find(s) != null) continue; Count nc = new Count(s); Count c = (Count)doc.find(nc); if (c != null) c.count++; else { doc.add(nc); } } } br.close(); Iterator iterator = doc.getIterator(); while(iterator.hasNext()) { System.out.println(iterator.next()); }

2007年1月30日 星期二

DokuWiki推廣

兩個半月前寫了這篇”Wiki推廣,安裝PmWiki”,近來學Ruby時要貼些表格和example code,發現PmWiki不夠方便,評估了一下,決定改用DokuWiki

google一下發現TWiki和DokuWiki的評價都滿高的,但進TWiki首頁找了一下,沒看到syntax example,就不試TWiki啦。

Updated

看了一下權限配制namespace無限階層結構(和實體目錄對應)、Performance考量(像是cache的處理),預設的DokuWiki看來相當完美,有了DokuWiki,PmWiki存在的目的只是突顯DokuWiki的強大吧!

Ruby初試心得,以統計單字數為例

Problem Definition

大致來說,就是輸入兩個檔案,一個stop word list,表示不想統計的單字;一個text file,統計的文本。任何以空白分隔的字元就是單字。從參數列讀入stop word list和text file的檔名,最後輸出每個單字出現的次數。

用C style寫成的Ruby

#!/usr/local/bin/ruby if ARGV.length < 2 exit end # read stop words stop = File.new(ARGV[0]) stop_words = Hash.new() while line = stop.gets for e in line.split stop_words[e] = 1 end end stop.close # read text text = File.new(ARGV[1]) count = Hash.new(0) while line = text.gets for e in line.split count[e] += 1 if stop_words[e] == nil end end text.close # dump results for key in count.keys print count[key], ' ', key, "\n" end

使用Code Block + Iterator的Ruby

這種特色是稱為Closure吧?

#!/usr/local/bin/ruby exit if ARGV.length < 2 # read stop words stop = File.new(ARGV[0]) stop_words = Hash.new() while line = stop.gets line.split.each { |e| stop_words[e] = 1} end stop.close # read text text = File.new(ARGV[1]) count = Hash.new(0) while line = text.gets line.split.each { |e| count[e] += 1 if stop_words[e] == nil } end text.close # dump results count.keys.each { |key| puts "#{count[key]} #{key}" }

結論

Ruby把一些loop的動作簡化為method call,寫起來更快,可讀性更好。效率測試上聽說不會輸Java太多,我自己的例子是差不多啦。另外內建的文件查詢程式 ri 很好用,好比可以用 man 查 C function,可以用 perldoc 查 perl ,初用的感覺比這兩者更方便,最重要的是有例子。好的文件查詢系統可以大幅增加初學者留下來的機率。

Programming Ruby 2nd裡強調,這不單單是把code block傳入callback裡,而是”互讓” ( yeild ),至於互讓隱含的好處,我還不能參透。

書裡對yeild的說明範例如下,yeild若有參數的話,就是對應到 |PARAMETER| 裡。code:

def call_block puts "Start of method" yield yield puts "End of method" end call_block { puts "In the block" }

produces:

Start of method In the block In the block End of method

2007年1月29日 星期一

牧羊少年奇幻之旅(El Alquimista)

書藉基本資料: 牧羊少年奇幻之旅

世界名著童話,我強烈懷疑小孩子真的看得懂「小王子」和這本嗎?但小時候看這類書也不壞,光看表層故事也有趣,長大後再看會更有意思。我還沒看完「小王子」,我會找個機會看。

「牧羊少年奇幻之旅」講的是很平凡的道理,一堆早已熟知的道理,只是隨著歲月增長,我們忘了這些事,而這本書幫我們喚回沉睡的知識。裡面的格言真是多得數不清,就像在看寓言百科全書一樣,每幾頁就是一個衝擊和一陣沉思。但若為此而忽略故事的樂趣,那就太可惜了,如同書裡提到欣賞城堡,也別忘了湯匙裡的油。當然,這則小故事另有深層意思。

這本書很薄,不用三小時就能讓讀者改變世界,閱畢全書走出圖書館的我,看著沿路的樹木和建築物,好像走到一個新地方,而不是待了四年半的交大。會認為世界一成不變,只是因為我們沒用心看;會認為無法達成夢想,只是因為我們害怕失敗。

我有預感,有天我會再翻一次,而那天的我,將有不同的體會。傾聽己心,活在當下。

ps.

這本書亦有些宗教意味,像是每個人心裡都有佛,每個人都能成佛,主角和風、太陽、註寫一切的手的對話,化為風的那段最明確。

整本書最有名的一句:

當你真心渴望某樣東西時,整個宇宙都會聯合起來幫助你完成。

中文版封底的描述:

當我真心在追尋著我的夢想時,每一天都是繽紛的,因為我知道每一個小時都是在實現夢想的一部分。當我真實地在追尋著夢想時,一路上我都會發現從未想過的東西,如果當初我沒有勇氣去嘗試看來幾乎不可能的事,如今我就還只是個牧羊人而已。

2007年1月28日 星期日

不得中行而與之,必也狂狷乎?

中庸之道太難行,有時選擇其中一個極端,亦是一種解法。另外,我相信勢必要在兩端走過一遭,才能到達真正的中庸。雖然和我最近的煩惱無關,看到這句後令我豁然開朗。

子曰:「不得中行而與之,必也狂狷乎?狂者進取,狷者有所不為也。」

2007年1月27日 星期六

讀心術

在「奇諾之族」(小說、動畫)和「Code Geass」(動畫)裡都有出現讀心術,結果都是造成擁有者精神不穩,接受太多負面情緒。當我們說出負面情緒時,就算聽者不是當事人,也會被情緒感染不太好受,可以想見擁有讀心能力的精神壓力。

諷刺的是從小我們被教導誠實,社會上又有一堆怪習俗要我們用虛假的禮貌性相處。小時候沒自信也不懂獨立思考,常常就這麼接受社會習俗,但我不怎麼喜歡,總覺得太多規則很沒道理,但說太多只會被貼上標籤,得視對象決定聊的程度。

忽然想到,如果一出生大家都有讀心術的話,那將是完全不同的世界,不會有「奇諾之族」和「Code Geass」提到的問題,說謊不可能存在,誠實也稱不上美德,而是只能如此。這樣的世界裡,大家不會有精神壓力,不過很難建立朋友關係吧,少了一層容忍和表面工夫,缺少足夠的時間建立情誼;但也可能更輕易地建立情誼。有時候很難從另一個立場裡猜中相反的立場,就像不同生活背景的人,互相懷疑另一邊過得很苦。

真想看用這設定寫成的奇幻故事。

用簡訊保持連繫

一個多月前寫了這篇”什麼樣才叫保持連繫呢?”,今天看到12月的Advanced,提到芬蘭國內有98%使用手機,只有一半使用固定式電話 (landline) 。有一位語言教師,用傳簡訊和親友保持連繫,週六時她通常要收發100封簡訊,並在晚餐時間左右再發40封,相當驚人,她個人則覺得沒有比這更好的連絡方式。的確,使用非同步式溝通,可以省去冗長的起頭和結束話,也不會不小心聊離題。

看到這個例子時,我想到的是大家都來寫Blog就好了,每個人都在對所有人說話,溝通效率更好 XD 。可能是熱於分享的性格所致,總覺得一再地對別人重覆同樣的話很浪費時間,到不如寫出來就能給所有人看到,有興趣的人來回言,其他有興趣的人也會看到,資訊通透對大家都好。唯一的缺點是不方便講悄悄話,有些話就是在小圈子裡才會吐出來 :P

恭喜恭喜的英文歌詞

今天的英文營,Magar要我們把有名的中文歌詞翻成英文唱出來,我們這組剛好有兩位英文強者,翻出了不錯的詞。

中文歌詞如下:

每條大街小巷,
每個人的嘴裡,
見面第一句話,
就是恭喜恭喜。

恭喜恭喜,恭喜你啊,
恭喜恭喜,恭喜你。

我們翻出的英文歌詞,還有押韻哦:

In every street and corner,
When everyone encounters,
The first word being uttered
is congratulations.

What we say is congratulations.
What we say is congratulations.

人生劇場 - 中場休息

又到了哎呦喂呦的時間了,最近聽到Manic和Gene的認命說法,也就是找最適合自己的路,盡管做就是,別羨慕和自己不合的事,恰巧兩人一個要去業界,一個想走學界,不錯的例子。

雖然很早就明白這點,但我總懷疑這是灑脫自在,還是失敗者的認命說法。當然,事情不會那麼極端,沒人是完全灑脫,也沒人是全然地自我安慰,找到適合自己的路是很重要的想法,活得不快樂就是過於奢望屬性不合的事,但我還是會想,看著別人做到自己可能做到的事,又懷疑自己該不該做。

Paul Graham喜歡選較難的路走,擁有這樣態度的人,希望過什麼人生,羨慕什麼,自然就能做到,不擔心吃苦。有時我感到自己抗壓力太弱,但Manic覺得抗壓力弱又如何?沒必要強走屬性不合的路。

從來沒準備過大考試的我,滿懷疑是否能為了出國唸博士而考GRE、考TOFET,加上需要大量時間專注做研究和經濟壓力,難度顯然高很多,苦悶事也多;相較之下,和我最合的屬性,就是別管目的,每天專心的玩技術、看動畫,四處亂學,單純的增加技術廣度沒有深度,就這樣畢業可能不會非常滿意,但待遇不會差到那去吧。只是每當看到別人的成功,就會羨慕一下,羨慕別人能到更好的環境,能遇到更厲害的人,再回頭自怨自艾一番,為什麼我做不到,為什麼我不肯下苦工。

兩者比較之下,還是隨興而為較理想,但就在剛才,看到大中查默斯理工大學碩士畢業present的相片,看到大中身上已顯出國際化的樣子。我想,我還是羨慕這種生活,踏向國際舞台,認識更多厲害的人,和他們聊天共事。記得有人說過,人生只有一次,所以更要看看自己的極限在那,才會甘心。

踏向安穩輕鬆的路很容易,也許有天後悔遠大於日常幸福時,那時的空虛感就再也補不回來。只是我還不明白什麼時候我才敢賭單一目標,毫不停滯地往前衝。

2007年1月26日 星期五

超越Java(Beyond Java)

書藉基本資料:超越Java(Beyond Java)

讀完全書後,回頭來補寫這是什麼樣的書。

這本書穿插資深programmer的訪談,融合作者的經驗,從實務和理論層面分析好的語言該有的特性,再說明各個語言的情況。我對語言的實務能力較理論能力好,讀起來感覺作者的介紹以實務層面居多(不懂的東西自然略過...),可能有些偏頗。

作者本身是 Java 長期支持者,並寫了幾本暢銷書,在本書裡用大量篇幅說明為什麼 Java 不行了,為什麼 Ruby 是他最看好的接班人。另外有一章介紹「延續伺服器」(continuation server),說明在 stateless server 上開發 web 的瓶頸,該用什麼樣新的 server 和 framework 來改善。

對學語言有興趣的人、 Java 的愛好者或寫網站的工程師可以看看這本書。我的背景則是七年前學會C,認真寫了三年,四年前學會Java,這四年內以寫Java和C居多,這七年來有寫些 PHP,用 C# 寫大學專題,和一點點的C++、Perl 、Scheme、Python。既對學語言有興趣,也喜歡寫Java,並且以寫網站賺生活費 XD

看這本書時,我的心態挺爽快的,沒任何抵抗就想試別的語言,我一直都覺得不同場合要用不同語言,沒有萬能的語言。

超越Java(Beyond Java) - 4 (Java以外的語言)

書藉基本資料:超越Java(Beyond Java)

ch9討論其它語言,決定一個語言是否成為主流(或著說,取代Java),可分成話題性、時機、語言特性、殺手級應用來看,比方Smalltalk一直被認為是很美的語言,但30年過去仍未能成為主流,它的時機已過,未來也難以流行。Ruby興起很快,話題性夠、時機也對,語言特性好,近年來的Rails更是Web開發的殺手級應用,所以作者在本書花了大幅篇幅說明Ruby、說明Ruby on Rails,我經驗不足,看不懂Ruby更強的功能,不過寫個一陣子後會有所體會吧。

對語言有興趣的人,可以直接翻ch9看幾位專家的看法,很有意思。除了語言外,平台也需要討論,Ruby只是語言,不是平台,降低它的推廣力。提及Java時,或多或少在指JVM、J2EE、J2SE、J2ME,提及C#時也多少涉及.NET Framework、.NET Compact Framework。換句話說,我們說Java好時,其實同時指語言特性好(OOP、安全、規範多)和平台好(write once, run everywhere),JVM成功和重要的原因,可以參閱之前寫的”談JVM跨平台,卻不談scripting language跨平台的原因”

這代表其它語言也有機會參與這些優秀的平台,Microsoft一直積極(?)強調CLR(Common Language Runtime),Java也有些案例,但都不太成功,像是JythonJRuby,如果有組織積極推廣語言和Java平台、.NET平台整合,對這些語言是一大優勢。

下面節錄ch9一些有趣的內容:

Lisp

這是一個不簡單的傢伙。Lisp是世界級僅存的古老技術,人們不斷地重新發明或重新發現它,但是Lisp也是一大群家族,許多彼此不相容的設計和實踐,沒有任何一個看起來像是我們的家。當然,Common Lisp需要大修,但是由委員會來重新計計 Common Lisp 在此刻來說相當不恰當。Lisp需要一個仁慈的獨裁者,具有好的偉大的執行力,以及偉大行銷,才可能成功。
p168, by Steve Yegge 

作者另在p172提到 Lisp 的社群總由聰明的programmer組成,校園內也很流行,像MIT就強調用Lisp學習可以讓學生快地抽象思考。也許最後的語言都會回歸 Lisp,但Lisp太與眾不同,需要很多時間和精力學習。

PHP

2005 年最不可思議的一件事之一是,IBM 宣稱要支援 PHP,此舉無疑是針對意圖擁抱 PHP 的中小企業而來。
...
就和 Visual Basic 一樣,隨著開發者在錯誤的地方尋找簡單性,PHP 將會被利用在某些不適合的地方。
p170, by Bruce A.Tate (book author) 

相信許多人深有體會,我懷疑在資工學生裡,課餘寫PHP的機會搞不好比其它語言多,寫PHP是賺外快的最好機會。

Perl

某些 Perl 編程員寧願斷掉手指也不願意多打四個字元,才不管這些字元是否可以提升可讀性,畢竟難寫的程式應該也會難讀。
...
而 Perl 具有相當多火星文般的語法捷徑,簡直是神祕的溝通方式 (secret handshake )
...
說來有趣,但是對照起 Java 則是截然不同,還是別去用 Perl 吧 !
p170, by Bruce A.Tate (book author) 

這裡應該是比較開發大型多人專案的情況,有用過Perl的人都很享受快速用Perl解決瑣碎雜小事吧。

Smalltalk

早在 Java 尚未在 James Gosling (Java之父) 的眼中閃爍時,聰明的開發者就已經使用 Smalltalk建立成功的物件導向應用了。而「不是很聰明」的開發者用 Smalltalk 建立某些有史以來最醜的物件導向程式。
p171, by Bruce A.Tate (book author) 

作者認為Java的成功造成Smalltalk元氣大殺,它們都是良好的OOPL,Smalltalk語法特殊,主流的C++不願嘗試,選擇改良C++的Java則成為贏家。

Functional Language

用Haskell寫費氏數列(Fibonacci series):

fib 0 = 0 fib 1 = 1 fib n = fib (n-1) + fib(n-2)

Java

我沒說 Java 已死,或著 Ruby 即將接班,或著延續伺服器將會支配一切。我只知道:

  • 我現在很受傷,我的顧客也是。我愈來愈難叫我的顧客要滿意 Java 的一切。
  • ...

p174, by Bruce A.Tate (book author) 

讀了「Beyond Java」後,我覺得我又想學Common Lisp,但之前挑戰多次(包含Scheme在內)失敗,我真不懂為什麼Lisp要用這麼多括號,讀寫都很麻煩,最近會先玩Ruby和Haskell吧,哦,還有Python,別忘了Google內部喜歡用Python寫system management。

2007年1月25日 星期四

Winter Garden

官網位置WikiPedia介紹:ウィンターガーデン(看不懂)。短短兩集而已,很棒的小品。

討論的文章很少,不清楚這部的相關消息,這篇的描述很不錯,J.C. Staff雖然制作上常省工,但像Honey & Clover、Winter Garden這類劇情走向的日常生活故事,氣氛掌握得很好,笑點也有發揮出來。

這篇說「Winter Garden」是「DiGi Carat」第一章故事的十年後,原來這就是兩者之間的關聯性啊,難怪名稱裡有”from DiGi Carat”,這讓我想找「DiGi Charat」來看。

我喜歡這種看完心裡填得滿滿的幸福感,這類作品偶適合而會拿出來重看。「Winter Garden」名字取得好,結局也很有意思,第二集看到一半,覺得不管是走向Good End還是Bad End(其實不會讓人覺得是Bad End)都無所謂,劇情發展掌握得很妙。

2007年1月21日 星期日

科學家之路

(寫於2006-03-15,直至現在,數學能力仍長期停擺中,just for fun的心態回復不少,也發現經驗沒我想像中來得容易轉移,特別是思考得愈深的經驗,比方程式架構設計比程式語法難以轉移。)

這週終於認真地讀了graph theory,開啟基礎數學自修的第一步。看到一堆axiom,theorem,內心湧出大量排斥感,雖說不上無聊,但這玩意兒有用嗎?

年紀愈大,對於時間就愈在意,變得沒耐性等待成長的時間,極切希望知道學了什麼會有多大的幫助,過去單純以學習為樂的心態,漸漸消失了。當然,數學這類東西,就是短期內,甚至一兩年內都感受不到它的用處,雖然我明白終有一天會因為沒學好它而後悔,就好比大四後發現自己大一微積分沒學好。

但最大的問題是,無法明白自己需要的是什麼樣的數學。

看著資工大三,大二的學弟,對於工程師終會被年輕的淘汰而有所體會。只要肯拼,全世界這麼多人,每年都在增加新進來的對手,光會寫程式很容易被取代掉。資深的工程師贏的是經驗,但也只是時間上的問題,肯拼的人可以用更短的時間縮短經驗的差距。教育的本質是忘掉所有東西後所遺留下來的,我覺得不管是工程師還是科學家都是如此,要培養的是學習的方法,思考的方法。

剩下的四個月裡,試著多逼自己一些,不要在意表層的東西,朝科學家的方向多踏幾步看看吧。

ps.

雖說交大資工不是如我想像中的理想學院(也許在台灣是不存在的),但也是很有意思的地方。我看到比我年長比我年輕的科學家們和工程師們,我的目光不遠,我需要既定目標的人做為量靶,才能刻出我想站的位置。

出路的轉變歷程

總結一下曾立過的出路方向,和它們被封殺的原因。我滿喜歡一個準則,

如果能毫無疑問地回答任何問題,那就是真心的選擇

我忘了原文是什麼,我描述得不太好,在每次的聊天和寫文章裡,一再地自省,對自己的選擇也更具自信,明白這真的是我要的,不會隨波逐流。

  • 國三:想當英文老師,因為可以用”口語用法”打掉所有答不出的問題,好混 ( 無意冒犯認真當英文老師的人,各行各業都有認真和混的人 )
  • 高一:做和Computer相關,寫程式就好,也許是寫Game?
  • 高三:第一次和朋友(孝銘、D2、TB、photo...)嘗試寫Game,Windows上用C/C++合寫了一萬多行的”人生遊戲”,遊戲名是HSNU Game,簡稱H-Game :P 。做到一半因為組織溝通不良,大家各有事在忙而失敗
  • 大一:和try做了Try Flying Bubble的企劃,想用Java寫”魔法氣泡”,企劃完成了,但只開發了一點點就因各有事要忙而失敗
  • 大二:和同年級的5位同學(邱、skylight、spearmint、crystal、rebangs)參加Hinet加值比賽,在Nokia7650上用J2ME寫養成遊戲,做出沒靈魂的作品 Orz。佳作,報酬相當於 $100/h,值得注意的是,這是第一次合力完成遊戲
  • 大二:觀察自己平時亂碰的東西,發現以軟體工程居多,決定要研究軟體工程
  • 大三:修了一年的遊戲課,由煜泉前研發長王銓彰上課,王老師不論實務還是理論都很強,我分別修了3D Game Programming(和小豬)和MMOG(和小豬、豆叔、TB、chucklee),寫了兩個遊戲後,覺得寫遊戲太累、台灣環境太糟(可以到巴哈Job版看),遊戲魂到此結束。
  • 大三:一方面是明白軟工不適合在學界混,它只是種概念無法證明,本質很務實,研究起來卻不夠務實;加上看了一些做軟工人的Blog,覺得這不是我要的生活,放棄專做軟體工程的路線
  • 大四:推上研究所要決定未來兩年的研究發向,觀察自己聊到什麼時會最high,發現是AI(人工智慧),但找不到適合的老師,或著我不敢賭,於是改做Data Mining。有趣的是,UCLA碩士剛畢業的學長,則是先讀AI,缺錢太凶而改做Data Mining,和我的抉擇相反。對於要去學界還是業界而迷惘,深怕碩士方向會封殺其中一邊的可能。這部份的考慮過程詳見”找指導老師心得””科學家之路”
  • 碩一:發覺自己的興趣其實是思考,AI只是目前最能發揮的題材,變得不太在意一定要做什麼領域,學界業界都可以,能盡量思考就好。唯一明確想做的事是「知識整合」,但還不懂要怎麼實際研究,希望能同時保有實務和理論的能力。

最重要的是保持Just for fun的心態,並且能做自己想做的事,再次引用這句:

If you find a job you love, you will never work a day in your life.

2007年1月19日 星期五

矛盾

不想用「反有規則必有例外」這種老套的話來說明矛盾,這句話沒任何含意。

或許可以這麼看,對不同事物的看法,只是程度之分,比方喜愛獨處,或與友同樂,不是這麼互斥的事。也可能它們差異甚大,但大腦裡有個丟骰子的傢伙,今天他決定用規則一:「自閉才是至高的愉悅」,於是享受自閉;但明天碰巧選到規則二:「獨樂樂不如眾樂樂」,於是融入人群。

這麼說可能很蠢,但自從明白程度之分和矛盾是自然的本質後,活得更自在,思緒也更清淅。重要的是正視自己的心,坦率地活著,自打嘴巴也無所謂,說是這麼說,具體實踐時真的很難,隨時看清自己真正的想法也很難。

現視研.電車男/現視研.蜂蜜與四葉草

《現視研》、《電車男》類似的作品還有《歡迎來到NHK》,但我對這部沒啥興趣,而且專注的部份差很多。

相較於知名度較高的《電車男》(日劇、電影、漫畫),《現視研》(漫畫、動畫)刻劃得較深,較能引起共鳴,《現視研》的角色像活著一樣,如同看著熟悉的朋友渡過大學生活。《蜂蜜與四葉草》也有相似的味道,看著這類作品,閱畢會久久不能自己,兩部作品都有令人羨慕的同窗情誼,在寫實的故事架構下,日常生活一點一滴構築的友誼,相當令人嚮往。確實,沒有事件的平穩人生,無法接起深厚的情誼,生性怕麻煩、盡力閃躲的我,避掉許多機會,反而回想起過去的患難事件,在述說時嘴角總會微微上揚。

《蜂蜜與四葉草》喚起我尋找人生目標的熱情,《現視研》則讓我陷入男女感情的思緒裡,也許是《現視研》裡和我相似的角色背景,讀起來感觸更深,心情隨之擺盪。

如同多數人的看法,我也認為斑目和笹原是刻劃最傳神的角色,看著兩位各別的感情發展,陷入淡淡的憂傷,又帶一絲喜悅。這樣說可能有點怪,我滿享受這種陷入低潮的情緒,一直在原地打轉,重覆回想著漫畫情節,刻意讓自己沈浸在另一個世界裡。跳出這種低潮的最好做法,就是寫出來,在寫作的過程裡,自然就回歸一般。

不到半小時的時間,久久醞釀的情緒已煙消雲散,寫到這裡,反而對跳出這種情緒有些不捨。像《香水》主角那般可以重覆回憶香味,回味同樣感受的能力很令人羨慕,我只能記錄發生過的時間點,無法抓回逝去的低潮,低潮這字眼不夠恰當,但我找不出適合的描述。

一年多前《電車男》的漫畫版(可愛畫風版本)給我一些想法,那怕是一點也好,想改變自己,但在走出漫畫店時已忘了這份衝擊。如今《現視研》帶給我新的契機,只是時機仍然不對,隨即想起眾多的興趣,想起不夠的時間,只能再對著停在國中時代的自己說:”再等一會,等我想做的事都結束後,就輪到你了”。

生锈的齒輪有在轉動,只是一點點,一點點地,在幾乎查覺不到的情況下動著。

2007年1月17日 星期三

寒冬洗冷水澡,勇!

也許是水壓不足的緣故,熱水器完全沒反應,平常天冷沒出門,遇到這種緊急情況還可以不洗,今天出外一整天,又被雨淋,不洗不行。

沒時間慢慢試熱水,也懶得用瓦斯煮好一桶水再洗,想著忍一下就過去了,爽快地開冷水給它洗下去,洗完精神抖擻,身體還微微發熱。偶而來一次還可以,明天不要再來一發啊 Orz

2007年1月15日 星期一

享受孤獨.熱愛自由

英文裡似乎只有loneliness一詞表示「孤獨」和「寂寞」,但在中文裡後者有負面情緒意味,前者卻能解釋成一種享受。

如果孤獨是一種享受,那應該鮮為人知才是,享受孤獨的人關在家裡一個人快樂就好,不明白的人一輩子也聽不到這種主張。享受孤獨不表示排斥與人相處,只是也熱愛自由。「人多嘴雜」是我喜歡用的話,人多壞處多,不是討厭熱鬧,只是它帶來的負面效果遠超過熱鬧帶給我的喜悅。相較之下,非同步地寫e-mail、寫Blog、寫BBS能排除這種困擾,同時保有孤獨和自由的優點,亦不會與人斷絕來往,另有一番樂趣。

rclrn跨年前夕寫了這段話,深得我心:

對我而言,獨處是難得的享受,

不用花精神說話,專心於自己。

我不排斥熱情,但我更嚮往寧靜。

不分節慶假日,抱著同樣的態度看待每一天。

每天都平靜,就等於每天都精采。

學習傾聽自己的內心,只讓內心影響自己,

不輕易為外物所動。

有時有相似的感動,心中澎湃的感動卻無渲瀉窗口。也許只是站在窗邊吹風,看著被夕陽暈染萬化的雲層;也許只是處在城市一角的樹林裡,聽著微風拂過樹葉的摩擦聲;也許只是踏在深夜森間的步道上,仰望雲間的月光時而灑透葉間。這需要專心傾聽一切,無雜念的融入其中,那怕只是一絲自滿,或是記錄的念頭,就會像投入池糖的巨石,瞬間擊碎情景,更別提身旁有朋友時,偶而要搭話或避免陷入沉默的尷尬中。

最後引用一段令人嚮往的獨處,也許有人把這解讀為自我中心,不理旁人,但我覺得亦能做到不阻礙別人,只是需要漫長歲月的磨練,才能磨出這等氣度。

(quote)(full text)

It is easy in the world to live after the world’s opinion; it is easy in solitude to live after our own; but the great man is he who in the midst of the crowd keeps with perfect sweetness the independence of solitude.

 

Ralph Waldo Emerson, Self-Reliance
US essayist & poet (1803 - 1882) 

網路上看到相似的中文說詞,少了原石磨成的味道,語氣強烈許多,另有一番韻味,可看成不同時期的感受:(出處)

隨著大家的意思去生活
是輕而易舉的事
在獨處時按照自己的意思去生活
也是輕而易舉的事
可是能在一大群人中間
極愉快地保持自身的獨立作風
才是了不起的事──
別人怎麼想與我無關,與我有關的
只有我必須要做的事

備註

適當時機以面對面或手機的方式溝通能補足非同步式的缺失,聲音和直接碰面還是有不同感受,現在有了Skype(網路電話),不論處於世界何處,還能免費五人同時對話,更方便即時對話。

久違的國中同學閒聊

剛才和國中同學用手機閒聊,大概六年沒說過話吧,之前因換手機失聯,幸好培根有用MSN和其他人連繫,才找回聯絡的方法,聽說國中同學們畢業後多少有用MSN在聯繫,看來MSN才是聯繫的主要方法,但是沒辦法,我還是不想用。

半年前和數年不見的小學同學聊天,雖然一起吃飯、喝飲料,雙方聊得滿開心的,可是有點違合感,出社會多年的朋友,和一直龜在學校的我,雙方的人生觀差太多了。

今天的聊天滿有趣的,聊起來沒什麼障礙,有時會有點對話平行交錯的微妙感,不過沒有影響談話的興致,聊天還是要聽到聲音才有意思。雙方必然變了許多,但能自然地聊天,就是最值得珍惜之處,最主要的是對生活的看法相似,有些話也許只是對方隨口一說,但那種霍然的生活態度,令人讚賞。我的本質不是能活得很率性的人,但想率性而為。於是在多年的擺盪中,找出最適合我的率性而為。”享受一切”、”做自己所愛的工作”說起來很容易,對天性不夠熱忱的人來說,很難實踐,總要在多次聊天中,漸漸建穩我的道路,每和朋友談過一次,信念又多堅定幾分。也許今天聊天的朋友看到這篇,會笑著搖頭說幹嘛想這麼複雜,反正你過得快樂就好,只不過最適合我的生活方式,就是在這樣辛苦的思考下,逐步建立出自在的心態。

話說回來,除了聊近況外,也想不到和老朋友的共通話題,我很有興趣知道大家在幹嘛,大家不見得想知道我在幹嘛 XD 。書讀愈多,愈少有通行的興趣,不過無所謂,我想,只要雙方有意維持聯繫,談話的內容並不重要,重要的是背後傳達的情意,自然就好。

備註

我記性不好,又不習慣隱藏東西,寫到別人的事時都得想適不適合寫人名出來呢?徵求對方同意又麻煩,而且問起來很怪,不寫出來,可能過久些就忘了這些「代名詞」在指誰,還得費神回憶,個人隱私的尺度又很微妙,還是保守點較好。

2007年1月14日 星期日

超越Java(Beyond Java) - 3 (用code來看)

書藉基本資料:超越Java(Beyond Java)

作者提到Strong Typing、Dynamic Typing的比較,背景知識可以參閱這裡

Static Typing的優點是給compiler許多資訊,可在編譯期抓出錯誤,比執行時發現來得省時,也方便IDE做Code Completion(ex:列出class下的所有method)和Refactoring。缺點是programmer要打一堆冗長的資訊給compiler,這正是Java的情況。Static/Dynamic Typing都可以具有Strong Typing,像本書作者提倡的Ruby,作者認為它是Dynamic Typing and Strong Typing。Dynamic Typing適合快速開發,讓programmer更能專注在抽象思考,把想法轉為程式碼。比方取出陣列裡的每一元素做些事,Java裡常見的笨重程式如下:

ArrayList list = ...; ... for (i=0; i<list.size(); i++0) { MyNumber n = (MyNumber)list.get(i); int x += n.number; ... }

Java 1.5引入了泛型(generic type),可以省掉中間轉型(cast)那行,但使得宣告可讀性降低,並且不能存兩種以上的型別,比方同時存MyNumber和HisNumber。更大的問題是泛型是語言層級的實踐,不是JVM層級的實踐,破壞許多Java固有的優點。

前面提及Static Typing的優點,是否能在Dynamic Typing裡做補救呢?Code Completion和Refactoring目前仍有難度,但編譯期抓出錯誤的影響較小,作者認為Unit Test才是最重要的,目前Test Driven Development的概念已漸漸普及,有良好的Unit Test,測試成本很低,編譯期抓不出錯誤也無妨。

這裡引用修改書上的例子,以寫費氏數列為例,進一步指出Java笨重之處。

Java Version:

class Fib { public static void main(String args[]) { int x1 = 0; int x2 = 1; int total = 1; for (int i=0; i<10; i++) { System.out.println(total); total = x1 + x2; x1 = x2; x2 = total; } } }

Ruby Version:

x1 = 0 x2 = 1 10.times do puts x2 x1, x2 = x2, x1+x2 end

for loop的index variable有時是不必要的,foreach是不錯的替代方案,但有時不夠直接,不恰當的for loop寫起來有點冗,會降底可讀性( ex:for loop的 i 到底用處為何?)。

簡單的例子容易懂,但突顯的現象可能不夠強,冗長的程式碼降低可讀性和撰寫速度,程式碼的字數不是絕對的指標,但不可忽視它和思維之間的關聯,就像數學總是如此精簡。

Java為了安全性、擴充性、可讀性做了許多規範,像是static typing和exception,浪費太多時間在刀口之外,有時沒必要寫exception,乾脆草草了事:

try { ... } catch (Exception e) { e.printStackTrace(); }

相較於C++,Java做得不錯,但要小心這也許是錯誤前提下的最佳解法,是該換個起跑點了。

延伸閱讀:Omega

從大中那看來的,類似Haskell的language,大中寫了篇介紹Omega的文章:”Switch between static and dynamic type checking”,看不懂但看起來很神。

超越Java(Beyond Java) - 2

書藉基本資料:超越Java(Beyond Java)

我的眼界不廣,心得可能有錯,還請大家指正。ch3、4分析Java的成功原因和隱憂,作者一邊寫自己的看法,一邊引用數位資深Java Progarmmer的訪談做為引證,這本書的宣傳手法真的很高明,如果不是名為Beyond Java,很難吸引一堆Java支持者來看,並扭轉他們的看法,了解這世界上還有很多可能。


Java成功的一大原因是和Open Source族群合作良好,Open Source帶來大量使用者和library
,比方IDE eclipse、Ant、Tomcat。做為下世代的語言霸者,作者認為非政治性是語言的必要性,比方Ruby,反之C#具政治性,會阻礙和Open Source族群的合作。不過就算Java淡出市場,JVM仍會存活許久,JVM已建立良好平台和大量library,適合其它語言使用。

”簡單就是美”、”多個解決方法裡,最簡單的最好”,如果我們相信這樣的原則,那漸漸變笨重的Java,看來不適合開發application / web application,雖然以一個承接C++的角色來說,Java已盡善盡美了,Java確實展現許多優點,但錯誤 前提/架構 下的最佳解法沒有意義。例如Design Pattern,繼Paul Graham後,第二次看到書裡質疑Design Pattern的正確性,這可能是語言本身的缺陷,而使programmer要在實作層面用特定技巧彌補,增加維護的複雜度。我滿喜歡Design Pattern的思維,但一直覺得很難上手,進而懷疑學Design Pattern的方向是否有誤,問題可能在更根本的地方。

Java是很好學的語言,但要用Java真的做番事,要用許多framework和工具,但每個東西的熟悉時間都是以年為單位,我喜歡寫Java,但一直都很排斥學如J2EE、Structs這類framework,天知道真的投入開發時,這些東西是否還是最佳選擇,學習的代價太高了。兩年前還不少補習班廣告三個月十萬元學J2EE,現在卻愈來愈多人質疑它的必要性。

下篇引用一些書上的實例,說明Java language本身的不足。

2007年1月13日 星期六

效率分析的重要性

這篇是寫給修DS課的學弟,通常有經驗的人很少寫心得,可能是懶得寫,或是東西太多不知寫什麼好,太多資訊等於沒有資訊,讓讀的人無所適從。針對別人需求回答,反而能輕易寫出不錯的文章。


學DS、Algorithm最重要的是一開頭教的效率分析 (O(.),Theta(.),Omega(.)),現成的lib一堆,任何領域的人都能輕易使用,但要用對時機 就要懂得分析,還有懂得DS、Algorithm的特性,至於有能力設計DS、Algorithm,那是更之上的能力,效率分析是其根基。

以Bubble Sort來說,分析後會發現它是Theta(N^2),也就是最糟和最好都要做N^2次,更糟的是swap和comparasion都是O(N^2),selection sort的swap至少是O(N)。

多練習分析,就會分析的更順,多練習思考best case,worst case,average case,這不僅幫助效析,也能幫助設計test case來驗證程式。

很多推論不需要背,比方我之前說linked-list不適合sort,分析index的情況,就能明白不管是comparasion還是swap,linked-list都是O(N),遠遜於array表示的O(1)。

為何insertion sort搭linked-list就不錯? 可以練習一下,insertion sort是滿特別的sort,分析看看best case,worst case滿有趣的。

另外關於上篇推文提的bubble sort在 N < 10時滿快的,這個數據有兩個問題:

  1. N太小時,都是瞬殺,實務上時間搞不好是花在I/O或CPU的分工上,參考依據不足
  2. N太小時,再快也沒意義,最糟的方法還是很快結束

這也說明為何O(.)這些算法不考慮常數,N小時本來就不用在意,但別忘了N不大不小時就得小心常數,像做hash table時許多人把table size開太小,這是很明顯的錯誤,沒想到的話,表示分析做得不夠扎實。

2007年1月12日 星期五

談JVM跨平台,卻不談scripting language跨平台的原因

這篇的看法可能有錯,參照大三上計算機組織報告JVM的心得,重寫這篇說明,但我這方面的知識卻是不進反退 XD 。當時鍾伯伯聽完報告後,說內容有些錯誤,但沒說錯在那,我就繼續不求甚解下去啦。

點此下載報告用的slide

談到跨平台時,不知道為何大家只提JVM,卻不談scripting language也跨平台,也許是scripting language跨平台是天經地義的事吧。深入一點來分析,JVM有別於scripting language的差異為:

  • Java要用compiler轉成bytecode,再用Virtual Machine讀bytecode,而不是直接用Interpreter讀source code,少了parsing syntax的時間,效率較好。但這點在scripting language引入compiler後,不構成主要差異
  • 除了VM外,沒有廣大的library,無法流行起來,但廣大的library要都能跨平台,要下許多苦工,Java的做法是建立強大的圍牆,全部自己來,讓OS相依的功能減到最小。這種土法練剛的精神,不是想做就辦得到的。
  • bytecode是真正的instruction set,理論上可以依此做出CPU,用硬體直接執行;實際上也有這樣的CPU,只是一直沒成主流。要做到可支援硬體實作,不是隨便訂訂compiler的輸出就好,有別於單純地定義compiler的輸入輸出。
  • instruction set最主要的差異在於JVM是stack architecture,它沒有register file,因此不被單一register size和register數量所限制,效率有所犠牲,彈性卻大幅提升
  • Just-in-Time(JIT)的編譯技巧,提高JVM執行效率(正確來說,是減少效率的損失)

超越Java(Beyond Java)

書藉基本資料:超越Java(Beyond Java)

目前看到ch2,但是好書就是能讓讀者的靈感源源不絕,不用等到看完再寫想法。前面清楚的說明多學語言的好處,不同場合各有適合的語言,C/C++位在system level,拿來寫application不太恰當,很多時候我們並不在意記憶體用得有無效率,也許開發到極致時會,但用C/C++可能寫不到那個時刻就因過於複雜而結束開發。

粗略的分為system level、application、web application來看,Java適當的扮演一個有別於C/C++,又頗接近它們的好角色,libaray和framework日漸增長,各大廠持續推行,不愁找不到人材。但這些架構太複雜而不適合寫中小規模的application/web application,培訓人才學會寫Java不難,但對framework上手卻是曠日費時。用過scripting language的人可以體會快速開發的喜悅,熱門的Perl/Python/Ruby各有千秋,而《超越Java》是作者自身團隊用Java開發web application,並參用Ruby on Rail開發得來的心得,名為超越Java,介紹Ruby的意味深些。

受限於語言天生的能力,framework再怎麼強化,也會有限度,就像技巧高超的programmer可以用C寫出很OO的程式,但那只是費力成效又差的工作,也許是時候考慮看看不同語言,現在投入Ruby的時機正好,既不會太早而缺乏資源,也不會太晚而失去競爭優勢。別忘了Paul Graham所言,好的語言具有數十倍以上的競爭優勢,對他1995開創的網路公司來說,LISP就是祕密武器。

現今的application/web application,需要的是更高階、更彈性的語言,這正是PHP興起的主因,只是PHP有點髒,沒太大興趣學好PHP。作者相信Java仍是目前的霸者,但五年後就很難說,至少就我們的認知來說,Java對於更高階的開發需求,可能和C/C++對於system level以上的開發需求一樣地不適宜。Java的strong typing和許多保護措施使我相信用它來組合大程式,會愈組愈順,而不像在不穩的地基上蓋歪斜的高塔。雖然有不少實證表示Perl/Python/Ruby也能開發大型專案,但在試用寫較具規模的程式前,還是先保留看法。

相關閱讀:

推薦系列文章:”日本動畫產業舞台的前與後”

Blog推薦:IGT偵探趣味

應該不少人看過這個Blog,挑戰者月刊主編的個人Blog。常有許多擲地有聲的好文,最近站長開始介紹日本動畫產業,這麼簡單就能知道這些資訊,實在是很划算的事 :P

《日本動畫產業舞台的前與後:前言》:這篇前後有一系列文章,大家就自己翻翻吧。

2007年1月11日 星期四

驚險的Fuzzy期末考.DS監考.外文系公演

Fuzzy這回變closed book了,不知道會不會考證明,唸起來不太有方向。加上看完上篇提的棋靈王心得後,連續衝了100多回棋靈王,使原本就不夠的時間,更加不夠,原本這幾天有些想寫的東西,只好壓抑寫作的衝動 Orz。

由於住外面的緣故,稍微睡過頭就不想去上Fuzzy,時間上划不來,跟不上進度又更不想去上課,於是修課進度接近零。考前用力惡補,昨天讀到AM 2:30實在不行了,意識很清楚,但東西就是塞不進腦裡,效率愈來愈差,只好先睡,隔天7:00再起來看,AM 4:30還被蚊子吵醒。結果AM 9:40 Gene來敲門,才猛然驚醒,可是AM 10:10就要考了...

硬是抱著遲到一點的決心,不吃早餐,多讀了20多分鐘,把自以為必考未讀的東西用兩倍速吸收進去(結果沒考出來 Orz)。到學校時看到手機有未接來電,好心的羊以為我又睡過頭了,打來叫我。考試題目不算簡單也不算難,大部份是選擇題,一題計算,兩三題畫圖。昨天和羊討論一個下午又不知所以然的Fuzzy Neural Network占滿多部份,憑著昨天下午的印象,寫得還算順(lucky),到是一些看似送分的記憶題,就是沒背。

有一題是三個選項三個空格的配對題,用寫完剩下的半小時,努力回溯腦裡四散的記憶碎片,想辦法拼出正確的配對,靠一堆沒啥自信的小撇步下判斷,最後把一開始寫的答案完全換掉。考完對講義的結果,原始寫法全錯,半小時重湊的結果全對(lucky x2)。昨天沒撐太晚,今早沒爬起來,睡個飽,預計多唸的東西又沒考出來,真是最佳結果(lucky x3),若改完有個好分數就更完美了!

考完Fuzzy,匆匆地吃完午餐就去監考DS,監考時間三小時多,監考快結束時有點無聊,在那裡拿答案本練起字來,練一會兒又沒勁了,羊下的中肯評語:”看吧,就是這樣你的字才一直寫不好。”監考完緊急召開期末考答案討論,過程還算順利,接著我到系計中把另一位助教寫好的答案scan起來,就算結束DS期末考前半的工作吧。

晚上和豬仔去看交大96外文系公演,在交大待這麼久,有些活動見識個一次也不壞,今年的時機正好。內容挺有趣的,發音也很標準,只是英聽太弱,結果還是看字幕。有位一人分飾四角還唸RAP的,獲得全場最多掌聲,第一男女主角的喝采聲反而少了些。

遇到不少認識的人,看到DMCC學弟的照片印在手冊上(音樂制作 :P ),不過最值得紀念的是,第二次騎到光復路的另一頭(感謝豬仔的朋友們開車帶路),並且記下西大路,騎過三次後,終於...,記憶差又沒方向感,認路還挺麻煩的。

2007年1月7日 星期日

推薦一系列棋靈王的評論

求道1 (評「棋靈王」)

這系列文章真是太強了!

看沒多久就想把棋靈王重看一遍,想起以前看棋靈王最注意的事,是進藤光的青梅竹馬出場愈來愈少,淪為路人,嗚…對不起,過去我沒好好看棋靈王,真是太委屈作品了。

認真來說,評論者是孤獨的,無法將自己窺見的道傳達給別人,我時常有類似感覺,想通許多道理,卻無法將其傳達給未了解的人,挺多和了解程度相近的人分享共通所知。若要寫在網路上,礙於讀者和自己共通背景差異甚大,無法掌握內容的範圍和深度,容易淪為過度抽象沒內容,或是過度強調細節,無法突現整體感受。

或許透過這《求道(評「棋靈王」)》系列的評論,作者才能一洩心中的失落吧。期待作者後來《麒麟考1 (評十二國記)》的後續,十二國記是我很喜愛的動畫和小說。

大潤發的促銷區

大潤發有時候會有人在中間擺攤,說話速度連珠炮般,配合流暢的示範,超吸引人的,之前因此買了一塊極細的海綿布,吸水效果超好,買一包200元含兩條來用,一條我自己擦頭髮,一條帶回家給老媽擦碗,老媽試用結果是很好用,但用久了容易破,沒想像中耐用,一般抹布大概30元一條,可以用比較久,但就得費力擰水,而且吸水力弱很多,費時費力。

今天看到”Astonish一路清”,超像街頭魔術,用火在鍋子現場燒出黑圈,用鋼刷用力刷也刷不掉,但用海綿沾Astonish輕輕一刷,氧化的痕跡不到10秒就去掉了,沾滿油汙的鍋也是如此,還可以讓玻璃有防霧效果,銷售員說外面一罐$399,大潤發平時賣$299,今天特價$229,買兩罐再送一瓶光學鏡片用的。打電話請示老媽的意願後,買了兩罐回來,再來等帶回家試抽油煙機。

google一下,發現Astonish還挺常在購物台和大賣場出現,網路上看到最低價是$399,還有人買到$500。這篇是別人的試用情況,看來實際情況下防霧防水滴的效果得打折扣。

旋文佑文法

旋文佑文法

一個半月前看到herbage在讀這本,似乎是大家都推上天的文法書,就和herbage借來看,可惜絕版買不到了。這本是寫給有一定文法基礎的人,我想有學到關係代名詞就算有文法基礎吧,我的學習背景一直以語感為主,不太想理文法,但讀得又不夠多,在重大危機時有小惡補一些文法,可說文法基礎薄弱。

作者融合多年的經驗和自己思考的結果,用他的方式重新統整一套文法系統,配合大量正反例子詳細說明,並偶而提及他的文法和傳統文法差在那,我大多跳過文法差異的段落,我不懂傳統文法,也不想看有點怨念的碎碎唸 XD

這本書真的如作者強調的,大部份內容都容易理解,要記的東西不多,又寫得很精簡,讀來很有效率。序提到作者學英文的過程,強調廣讀是不錯的方法,至少符合興趣學起來較能持續,很合我的想法。前幾章修正一些文法用詞,仔細說明補語為何。整本的例句超清楚的,章節又條理分明,掌握到文法大意後,後面章節我大多直接看例句對照,比方 A 句怎麼改成 B 句, C 句錯在那裡,需要讀的內文又更少了。

2007年1月3日 星期三

2006-01-03 Miscellaneous Information

Physics

Thoughts

  • 別給優秀人才過多的工作

    不優秀的人,當他空閒時,那僅僅是一段空閒時間,而所謂優秀的人,當他有空閒時,他會在有意或無意間把這當成「思考的時間」,而實際上,他必定會創造出一些新東西。(…中略…)沒有比給優秀人才「自由的時間」更高效的策略。好不容易網羅到優秀人才,業績卻不見增長的公司,就是因為不懂得這個道理。因為不懂,所以在分配工作時,「既然這傢伙能幹」就各種工作都壓到優秀人才頭上。結果,優秀人才忙於做好眼前的工作,也就無法創造新東西了。

    意思就是要放手給人才做,自己當手下時則要盡情打混 XD 。從以前就討厭別人用「能者多勞」要求多做事了,看過一些人在Blog上反擊這句,但這麼好的見解是頭一次看到。