2012年3月24日星期六

這都是災難的起頭

只因不法的事增多,許多人的愛心才漸漸冷淡了。
惟有忍耐到底的,必然得救。
 ── 馬太福音 24:12

2012年3月20日星期二

乜春乜乸

小時候家裏經營雞場,雞農有術語謂「雞項」(項讀若「三行」的 hong2 音,即「旱有」的「旱」加鼻音),意即未曾生蛋的母雞,或套用祖母的解釋,「雞項呢,係人嘅話,即係女仔囉」,也就是花樣年華的少女雞也。生過蛋的雞,才稱為「雞乸」。

雞春 (雞蛋)、雞項、雞乸,仍是雞農甚至是港人的常用詞,但大部份人已不知當中「春 、項、乸」的本字。此三字的構成,其實非常簡單明瞭:


未成肉 = 「春」= 膥 (U+81A5);
未成母 = 「項」=  (本字未收入 Unicode,有些作業系統編作 U+ECBB);
已成母 = 「乸」= ?(本字未收入 Unicode)。

除了上述三個「×成×」之外,還有「未成人」(仔/崽)及其他類似構字,包括禾成毋 (U+23AFD)、米成母 (U+23AFF)、來成母 (U+23800)、未成田 (U+24CE1)、丰成母 (U+26523)、未成耳 (U+265F1) 等等,但我也懶翻字典了。有興趣的讀者可查《字海》,找出各字的意思。

雞膥巷(圖片來源:大洋社區
香港東北有離島名「鴨籮膥」,「籮」就是粵語「籮柚」(即屁股,本字待考)那個「籮」。鴨籮春,就是鴨尾的蛋,寓意該島乃鴨洲旁邊的小島。廣東番禺沙灣亦有地方名為「雞膥巷」,但網民多不明所以。「未成肉、未成母、已成母」三字,如本網誌以前提過的「穴出刀」(讀若「吉」,刺入意)一樣,其實都可以望文生義,比大陸力推的所謂「簡化字」(今稱簡體字)還要簡單,不過香港政府與學界也許無心,或者無力,除了搞出個既不完整又不規則的「香港增補字符集」外,對香港人於電腦上使用傳統中文或者粵字就沒有多少貢獻。「春 、項、乸」三個常用字的本字當中,竟有兩個不見於 Unicode,這是香港人於文字上遭邊緣化的危機。

有些古書會將「未成肉、未成母」當中的「未」字放在左邊,上「成」下「肉」就放在右邊(圖例)。「已成母」則有另一種變化:將「已」字的勾延長到「母」字下面,就好像「遠」字的辵部承載着「袁」字一樣。

現今香港人不寫「已成母」,代之以「乸」字。這個「乸」似乎是後起字,古書並無「也母」此構造,卻有「母也」的寫法。「母也」其實是「姐/姊」的異體字,《集韻》說「蜀謂母曰姐」,所以「母也」也是「已成母」之人。我懷疑舊時「已成母」一字失傳之後,有人記錯了「也母」的寫法,卻記得「已成母」有將「已」字一勾延長之例,才產生「乸」這個新字,不過此純屬猜測,也許永遠無法證實。

2012年3月18日星期日

Caltech's online ML course

繼 Stanford U. 與 UC Berkeley,今次輪到 Caltech 開辦網上課程,主題是 Learning From Data,是一個 Machine Learning course,四月開課,從三月廿六日起接受報名。課程網頁強調此乃真正的加州理工課程,會直播課堂,亦絕無將內容淺化:
Real Caltech course, not watered-down version
Broadcast live from the lecture hall at Caltech
整個課程為時兩月,共十八課,看來非常認真。據稱功課有深有淺,有理論性的題目,也有編程習作,學生成績會登在公開的分數版上,太介意分數者要三思。

2012年3月12日星期一

潮與苦

家住天水圍,每逢回南天,電腦總不時失靈。嚴重的時候,甚至好幾日開不了機。今年情況猶甚於去年,不止電腦有問題,連隔籬鄰舍也傳出開不了電燈,升降機無法關門等等消息。

兩週前急用電腦,但開不了機。我心想,若非開關掣太潮濕,就是火牛(變壓器)有問題。因今次不能乾等,唯有打開機殼,用風筒吹內籠,卻無效,只好死死氣問樓下的電腦舖老闆,開關有無得替換,答案亦一如所料 ── 無。心中正大呼不妙,打算為了一顆開關掣而更換整個機殼之際,老闆竟然吐出珍貴情報:

「你部機個 Reset 掣有無問題?」
「喔……無。」
「咁,掉轉開關同 Reset 兩條線來插咪得囉!」
「咦?乜 Reset 掣唔係三針嘅咩?」(我印象中如此)
「唔係!係兩針。你試下啦!」

多謝老闆,果然 work。

無驚無險過了兩星期,誰知剛才又出事 ── BIOS detect 唔到 harddisk!

這次情節嚴重得多,你知啦,電腦嘅嘢,最大鑊係壞 harddisk。無咗 data,比失去其他部件更無法彌補。

絕望之下,唯有一試老闆教落的「掉轉插」絕招。今次,我將 DVD drive 同 harddisk 兩條 SATA 線掉轉插。

你現在能看到這篇網誌,已經說明結果如何。記住啦,潮濕開唔到機,可以試下互換 cables 的插位!

2012年3月6日星期二

Ruby 初體驗

史丹福大學的網上課程出現問題,未能如期開辦,於是我唔嫁又嫁,上了兩星期 SaaS 的課。課堂乃 UC Berkeley 本科生課堂內容的錄影,完全是正宗名校課堂內容,只不知功課程度與本科生的差幾遠。沒有同學、助教或教授支援,實在有點吃力,結果,第一份功課已經覺得太難,搞到要上網抄功課。抄襲本是學生大忌,但這並非正規課程,而且根據課程簡介所述:
Those who submit homework 1 and receive a passing grade will receive a coupon good for 100 hours of small instances of EC2 for use on the remaining homework assignments plus a coupon to upgrade their free GitHub accounts to a Micro account (both good through the end of course).
有此物質誘因之下,我實在很想學曉如何在 Amazon 設置雲端應用,那管該應用是如何白癡。第三週的功課已經要求學生做 application deployment,真懷疑自己能否完成。

SaaS 課堂用的是 Ruby。Ruby 感覺上有些似 Smalltalk,是很徹底的 OOP(連 class 都是 Class 的一個 instance!)加 dynamic typing。猶如 Java 推出初期,C/C++ 與 Java 的用家之間有 language war 一樣,Ruby 與 Python 的粉絲之間,好像也有互相攻訐。有些粉絲將某些 features 吹噓到天下無敵,以求將對手比下去。我不熟悉 Ruby,對 Python 也只是知道一點點,不敢妄言,但感覺上,Ruby 某些所謂 killer features (例如 block)好像也不是那麼突出,反而是一些小處更有趣,例如 Ruby 的 method names 可以包含 ?(問號)或 !(嘆號)。前者用來表示該 method 乃是非題,會回傳布林值。譬如我想知道某變數 x 是否屬於整數類別,就可以說 x.kind_of? Integer,換了是其他語言,類似的表述就可能寫成 is_integer(x),儘管差不多同樣清晰,但是 method name 有一個問號,讀者就絕不會搞錯這個 method 的意圖。至於感嘆號,乃用來表示該 method 具破壞性,舉例如 y 是一個 array,那麼,呼叫 y.sort! 會作 in-place sort,亦即 y 本身經過排序之後,內容會改變。相比之下 y.sort 只會回傳一個經過排序的 y 的 copy,但 y 本身保持不變。比起 Python 用 y.sort()sorted(y) 來表示兩個版本,Ruby 明顯高出一籌。

初學一種新語言,難免有不習慣的地方。儘管 Ruby 與 Python 都有不少 functional programming 成份,但不知何故,我總覺得 Ruby 的 funcional programming 味道較濃。我唸大學時讀的是數理科目,基本上,除了覺得 lambda functions 相當有用之外(特別是做 numerical optimization 的時候),很少接觸其他 functional progamming 技巧。學了 Python 之後,也只是覺得 list comprehension 很厲害,但其他 functional programming 部份有乜用,我是很疑惑的。事實上,就連 Python 之父 Guido van Rossum 也說一些 functional programming 的程式很難明白,因此他設計 Python 3.x 時,一度想將 Python 2.x 之中的 lambda, map(), reduce(), filter() 除掉三個,只保留 reduce(),但他又說
So now reduce(). This is actually the one I've always hated most, because, apart from a few examples involving + or *, almost every time I see a reduce() call with a non-trivial function argument, I need to grab pen and paper to diagram what's actually being fed into that function before I understand what the reduce() is supposed to do.
當然,如著名開發者 Joel Spolsky 所講,MapReduce 可以是超有用的,不過若電腦的 interpreter 或 compiler 並不利用 map 或 reduce 作平行處理,又或者我們用到的迴圈有 side effect,那麼我覺得 map 或者 reduce 並不很有用場。利用它們,你也許可以將程式由幾行變成一行,但代價是對一般人來說,程式反而變得較難閱讀,而這也是我對 Ruby 感到最不習慣的地方 ── Ruby programmers 似乎有一種意識形態,就是愈少行數,即代表程式愈 elegant。老實說,我覺得這種想法不但搞混了 compactness 等同 conciseness 兩種概念,還太過精英主義,有些變態。