一、入冬至今只下了兩天雪,近來天氣也在零上,過了個沒有雪的聖誕

二、但這個聖誕依然是白色聖誕,現在窗外又再一片白茫,能見度不知有沒有二十米

三、也弄了個不應節的 Beef stew,湯底是一罐啤酒一罐番茄,雖然味道很開胃,但每次弄完都覺賣相甚不討好

賣相不討好的 Beef Stew

四、這個學期的一科考試早已有肥佬之覺悟,但最後還是被合格了

五、近來還是在寫 code, 好像有點勾起兒時砌模型的感覺。可能是居住環境淺窄,每當完成就有浪費空間的感覺,不過寫 code 就不佔物理空間,而且自由度亦相當大

六、是日試做了個 Eclipse extension point,開始感受到 JUnit Plugin Test 的偉大。不過暫時還不懂得如何弄一個只有 OSGI 及 plugin management,沒有 UI 的 Eclipse

先前評閱學生之破蓆 (project),也閒聊幾句。本來是寫二三事,結果愈寫愈長,相信是這兒最長的一篇

一、前言

應該是學生第二或第三個軟件工程的科目,破蓆的形式乃四人一組,學期尾寫成一軟件。題目是開放式,只要求使用現有的框架 (Framework) 以及用戶間存在協作(collaborative) ,這樣的要求可以說是寫甚麼都可以

二、Ego

開放式破蓆是比較好看,沒有集體平庸的約制下,上游的學生是可以遠遠跑出。至於破蓆能跑得多遠,取決於學生的 Ego 有多大,有時在起跑線上已大約可預計結果 (當然也有跌眼鏡的時候,但通常也不會差太遠)

三、Mission Impossible

其實學生大約可用的時間為一個月﹐而且夾雜其他科的功課或破蓆,有組還是做了隻 3D 捲軸射擊遊戲。雖說網上素材充足,但遊戲編程畢竟麻煩鎖碎事甚多。完成品聲色方面弄得似模似樣,遊戲性雖有待改進,以技術門檻與時限來說,能完成已是不錯。須知某部分頹廢學生的 Final Year Project ,一年時間也遠不及這個水準

破蓆早就定了分,考試亦已完結,閒說這組同學依然在完美化這隻遊戲

四、意念

有說本港學生缺乏創意,但在下想說有意念的從來都是稀有的小眾。雖說題目是開放式,近三份一學生的題目還是可歸為同類

五、錢途

亦很坦白說,沒有驚喜,未能看見甚麼 “The Next XYZ”,或者是有潛力可幹一筆的破蓆。互聯網與實體世界的區別,在於互聯網是個貼近完全競爭的世界﹐全球人口均可進入這個鬥獸場,除非有如祖國動用網絡長城,否則即使未來是走去全球化之路(deglobalization),對純網上世界亦沒有影響。基本上現時可想像得到的純網絡服務,應該也有人做過。當然要學生破蓆與現有的網絡軟件 (Webapp) 相比是個不切實際的要求,但想有錢途的話,這是個基本門檻。而今年幹 Webapp 的,以學校破蓆的基準亦只是不過不失,距離「可以一戰」的門檻依然甚遠

意念上有潛力可以賺些茶錢的,感覺上有兩組,都是做小遊戲。其中一組意念上雖已有人做過,但現實上因地域語言及文化壁壘的存在而可以一試,但組員技術太差,不成氣候,浪費了意念。而另一組在下則覺得的確可以找些 Game hosting ,賺些少外快

六、分工

各人的工作量,粗略可從 Code Repository 的活動中,以不科學方法估計出來。據在下觀察所得,在大部分的小組裏,總有一位同學,所作出的貢獻約全組近半或以上。 4:2:2:1 乃在下最常見之分工比例,即工作量最高與最低的一位相差四倍,當然這個數字是不能作準

七、Free Rider

Free Rider 問題乃校園破蓆常見的問題,即某些組員對破蓆的貢獻近乎零甚至是負貢獻,以不費吹灰之力享有其他組員的成果,某程度上可說是高度理性的表現。慣常處理方法是要求各人對其組員評分,以達宣洩效果 (其實對最後分數的確影響有限,何況各人通常是比較仁慈)。評分中的其中一條問題是問「假如有一筆錢,閣下會如果與組員對分」,有位怨氣重的同學回應道「寜可捐給樂施會」

假如容許學生可以炒組員魷魚,遊戲規則就是另一回事。Free Rider 本身貢獻微乎其微,炒掉有助改善效率。而被炒者則可能成為人球,或落得一人成組的下場

八、網絡安全

O/R Mapping 的流行,令 SQL injection 的機會大減,SQL 雖不能完全被取代,但在不少場合已經是不再必要。還在用 SQL 的小組,難得不是全部有 SQL injection 的問題。存在 Cross-site Scripting (XSS) 問題的應該有一堆;而登入密碼有機會被截取的,若該部部分是出自學生手筆的話,應該也是全數中招;至於 Cookie attack 之類在下就不懂了。安全性問題要注意的地方實在太多,假若在下要做 Webapp 在這方面也肯定要請教高手指點,沒有研究過安全性就隨手架站實屬高危行為

九、易用性 (usability)

長久以來這方面是學校破蓆的弱項,一來是吃力不討好,付出與回報不成比例,二來要留意的地方又是有很多 (又是博大精深,學海無崖),三來根本不少人對此毫無頭緒。其實易用性與美觀度有一定關係,美觀的不一定易用,但好用的通常也不難看

十、電腦語言

所用的語言是正常的大路,除了有組是用 Ruby。Java 佔最大比數,寫 XBox 遊戲的全用 C#,php 為數不少,法拉薯 (Flash) 也有幾組

在下依然鼓吹在學校破蓆使用動態語言,一來語言彈性較大,二來放在開發的時間可以縮短,三來寫 Test 也感覺上比較容易

十一、調試 (Testing)

也是吃力不討好,付出與回報不成比例的工作。基本的調試也是破蓆要求的一部分,當然最後在這方面相當認真的人不多 (但不是沒有)。而且一般 programmer 就是覺得寫 code 的時間是 productive,寫 test 的時間是 non-productive。學校破蓆就沒有所謂,反正是用完即棄一次性,至於象牙塔外是否如此,在有限時間內 coding 與 testing 的比重,大家心照吧

十二、內涵

以往用過其他人為了研究而寫成的軟件,得出學院出品必屬劣品的體會,先前氣侯門事件(climate gate) 洩漏出來的程式碼,被人發現是驚嚇級數。可能已經是第二至第三個軟件工程的科目,而且部分人已有 co-op (placement/internship) 經驗,整體上程式碼的可讀性算是不錯,code smell 不算嚴重,至少不見有神之物件(God Object)。 雖然現在已經有 document generator 如 Javadoc,緩和了 programmer 不願寫字的問題,但說明不足仍是普遍存在(其實也不算差﹐只是略嫌不足),尤其是神奇數字 (Magic Number) 幾乎是每組都出現的問題。Copy and Paste code 與 Hard code 的情況不算普遍。有興趣的可以留意維基 Anti-patterns 一項

十三、修辭

畢竟是軟件工程的破蓆,對測試與程式碼的質量還是有一定要求﹐在下還是要每組審閱程式碼,先前見過的一幅圖好好的總結了這個過程︰

讀 Code

有時就是覺得學編程不只要寫得多,好 code 值得多看一點。好 code 與爛 code 的分別,就好比兩位作者在表達同一個題材,好的一位在修辭技巧方面比另一位表達得清晰。學寫字會強調臨摹,學寫文也有範文,而閱 code 似乎一直也不被重視

溫城的天氣乃半年晴半年雨,是夜大霧,來幾張黑白的

至今 Shutter count 還是只有三千七,說來慚愧

Hungarian Gate

Main Mall

Agronomy Road

htop

似乎比 top 更好用

一、近來氣溫皆在零度以下,是日降雪,下了陣雪粉

二、個人偏見覺得住 House 是有閒階級的玩意,至少下雪是件麻煩事

三、若在下當日接收另一間大學的取錄,零下二三十度是閒事

四、住內陸地區的唯一好處,可能就是可以免費享用楓葉天然雪櫃

五、現時所住之處的廚房比舊居冷,開始懷疑雪櫃溫度與天氣有關,近日整理一下,手指很快有麻痺的感覺

六、考試溫書,是最能意識到自己愚笨的時刻,依家感覺好似考 GRE 前夕

七、宿舍下月要翻新,收到迫遷令,將會被移置某處近一週,麻煩的是要將傢俱離牆三尺…

續上文

假如 Penrose Triangle 其中一條邊是曲線的話,Penrose Triangle 在現實上是可能存在。但假設 Penrose Triangle 三條邊都是直線,就需要加多一筆

圖1: 不再 Impossible 的 Penrose Triangle

在其中一隻角加多一筆,看起來與原圖無異。雖然黃色的部分被分成兩截,但由於顏色一樣,而最右端的線條又是相連,感覺上這兩部份是處於同一平面之上。但由於這條線的出現,現實上三角形的左右兩邊是可以是分離的

圖2: Penrose Triangle 的立體模型

上圖是個由三根木棒組成的模型,從某個特別角度看,這個模型看起來是個 Penrose Triangle。話雖如此,人很難可以由圖1 推斷出圖 2 的構造

至於電腦能否判從圖1 判斷出左右兩邊並不相連,這要示乎所用之方法。假如是用 Radiometry 的方法,每塊平面的斜度 (Gradient) 均可測出,但圖1 黃色的兩部份斜度相同,故此法無法得知兩邊並不相連。但以限制規劃(Constraint Programming)的方法,這條新加的線條的確令 Penrose Triangle 由無解變成有解,故理論上應該可以測出圖 2 的建構

相關文章︰Penrose Triangle · 二之一

Computer Vision 微破蓆 (mini-project) 的其中一個題目,是找個 visual illusion 再以電腦的角度寫篇文

原本是打算寫 Spinning Dancer,但在拜見周公前想起 Penrose Triangle ….  有時也懷疑自己創作力在臨瞓時是比較高 … Penrose Triangle 值得寫的地方又的確是比 Spinner Dancer 多

Penrose Triangle

Penrose Triangle 乃其中一個著名的 Impossible Objects,而之所以是一個錯覺,仍由於知覺上覺得這個三角形是一個立體物件,而這件立體物件在現實上又不可能存在

分成三個部份的 Penrose Triangle

造成錯覺的其中一個解釋,乃對深度的知覺 (depth perception) 出現矛盾。上圖將三角形的三隻角分開,每隻角有兩度可推斷深度的線索。以 B 角為例,斜向的那支棍被打橫的那條覆蓋,打橫的應該比打斜的來得近,而線條所造成的透視效果亦支持這種推斷。雖然從三隻角可以分別推斷三條棍的深度關係,但這三個推斷的結果是互相矛盾

而以限制規劃(Constraint Programming)的觀點,一個立體的圖像,每條線是凹是凸,是近是遠,合理的可能變化不多,基本上是可以試出來。但 Penrose Triangle 的條線並不可能有合理的配置,電腦只會回答你 no solution。某程度上可以說電腦並沒有閣下的錯覺

相關文章︰Penrose Triangle · 二之二

“I can see Russia from my house” 乃去年南方的總統選舉所生產的金句之一,其實 Sarah Palin訪問中並沒有說過這番話,只是某諷刺節目太深入民心。當然亦有人計算過,如果 Palin 家中可看見俄羅斯的話,她應該是住在電離層

陋室當然看不見俄羅斯,不過見到 Tim Hortons

窗外的添記

添記乃楓葉國土產快餐店,在下想吃致癌食品時偏好 M 記,不想致癌時通常是添記

Ham & Swiss + double-double

添記主要賣的是冬甩及咖啡,但在下對北美甜到爆廠的冬甩毫無興趣…. 也佩服某些學生午餐只吃一個冬甩一杯咖啡,連食量少的在下也覺得少

在下 default 是一個烘過的 Ham & Swiss ,或者再加杯 double-double ,甚吸引 =p

前兩日作 debug ,算是把破蓆 coding 部份寫好,但 Memory leak 嚴重,一舉吃掉 40GB Ram

結果找來了 Valgrind 追蹤 Memory leak ,不過並不支援 OSX 10.6,結果放到 Linux 上跑

Valgrind 使用起上來還算很方便:

valgrind --leak-check=yes ./some_program

分析結果也算是人類可理解:

==2877== 62 (32 direct, 30 indirect) bytes in 1 blocks are definitely lost in loss record 15 of 61
==2877==    at 0x4C222A8: realloc (vg_replace_malloc.c:476)
==2877==    by 0x4E6947D: g_realloc (in /lib/libglib-2.0.so.0.2200.2)
==2877==    by 0x4E3C5F2: ??? (in /lib/libglib-2.0.so.0.2200.2)
==2877==    by 0x4E3CA21: g_array_append_vals (in /lib/libglib-2.0.so.0.2200.2)
==2877==    by 0x4030B0: __node_to_item (apriori_core.c:345)
==2877==    by 0x4E8C701: g_tree_foreach (in /lib/libglib-2.0.so.0.2200.2)
==2877==    by 0x4033FC: apriori_candidate_gen (apriori_core.c:357)
==2877==    by 0x402DCE: PAPRIORI_item_sets_create (apriori.c:152)
==2877==    by 0x4040B7: main (exec.c:17)

發覺全是由於在下對 Glib g_array_free 理解錯誤,結果每次自以為已經很有手尾地將記憶體回收,實質上並沒有做過 … 將參數由 FALSE 全改成 TRUE,記憶體用量變回數十Mb

想起某君曾以電郵詔告天下,說為健康與家庭著想,劈炮吾撈。聞者不禁感到其脫苦海之喜

近來又聽見友人以同一理由辭職,OT 至陪阿婆飲早茶,見閻王快過升職

連辭職也要恭喜道賀,真係乜鬼世界