星期五, 6月 04, 2010

搖籃曲

最近再聽葉樹茵的《搖籃曲》,覺得很感動。


媽媽的搖籃曲
一遍遍唱著
不要哭我的小寶貝
不要哭的小小孩


好像只要不哭泣
一切就會很平安


媽媽的雙手
一遍遍搖著
快快睡我的小寶貝
快快睡我的小小孩


好像只要閉上眼
一切就會很平安

媽媽
其實我很怕一個人哭泣
一個人一輩子走一遭
我要面對自己的問題
媽媽
其實我很怕一個人哭泣
時間是條長長的道路
我會找到自己的路

媽媽的搖籃曲
一遍遍唱著
不要哭我的小寶貝
不要哭的小小孩

媽媽對小寶寶說:
『好像只要不哭泣,一切就會很平安。』
『好像只要閉上眼,一切就會很平安。』

小寶寶對他的媽媽說:
『媽媽!其實我很怕一個人哭泣。一個人一輩子走一遭,我要面對自己的問題。』
『媽媽!其實我很怕一個人哭泣。時間是條長長的道路,我會找到自己的路!』

不是要討論存在主義,只是借用他的術語,一個人「被拋擲到世上來」,便要「一個人一輩子走一遭」而且「我要面對自己的問題」。

「時間是條長長的道路」。

人生是條長長的道路。

有同事跟我說,他是家中長子,而他老婆第一胎又生了孖仔。所以他的兩個小 babies 真的是集萬千寵愛在一身。自小便得到家人的悉心照顧,傾力栽培。

《史記》記載『紇與顔氏女野合而生孔子』。孔子的老爸叔梁紇與顏姓女子「野合」而生孔子。有人就「野合」即是『打野戰』,而正統解釋則係老夫少妻的意思。孔子出生時,他老爸都六十幾七十歲。萬世師表、至聖先師,他的老爸偏偏,唉,偏偏,用廣東話說,『就係咁騎呢』。

有一BB他先天有缺憾,一出生便要做兩次大手術。再加上他的父母又無厘頭,令到身邊的人很不是味兒,甚至是覺得很丟臉。大家不喜歡這個BB,甚至討厭他,便不出奇了。

有一次,看著這個BB吃藥,他哭得厲害。我突然深深的感到,人生是苦。

既然一出生便在鬼門關徘徊了兩回,而他的成長之路,無論身、心都會比一般的小朋友難行。不要因為上一代無厘頭而岐視,甚至仇視這BB。黃臺之瓜,何堪再摘。就請別為他的人生加添不必要的傷害,不必要的傷害痛苦。

星期日, 2月 28, 2010

緣薄、緣淺

星期五(2010年2月25日)《信報》〈商心國是〉張立如是說:



能量要積聚


財富可以急速增長,知識、學問、道德、修養無法急速增長。你中大獎,或者得一筆巨額遺產,可以一夜致富。但你想有學識,必須要長期的積累與浸淫。

財富可以隨時消失,所以稱身外物。但學問與你共存、終身受用。正因為如此,人們會羨慕財富,但尊敬學識。

羨慕與尊敬是不同的概念,今天停留追求別人羨慕的層次的人,會炫耀財富,好像我們的「聰哥」,以為買私人飛機就可以換來「尊重」,其實只是換來廉價的「羨慕」;「羨慕」與「妒忌」與「憎恨」同在,君不見今天的地產商,儘管富可敵國,但已成為市民千夫所指的對象,因為他們雖富,但為富不仁。

沉澱及浸淫的是能量。現在陜西法門寺為供奉佛舍利,既完成很宏偉輝煌的建築物,但去法門寺參拜者,筆者都建議,他們要到舊法寶塔下的「地宮」去。因為地宮有一千二百年的積聚與沉澱,是自唐朝以來歷代祖師的心血,佛舍利在地宮「隱藏」了一千二百年,為真正的唐密曼陀羅之所在、「天龍八部擁大雄」之所在,故有巨大的能量,非堂煌建築可比。

有錢可以蓋很大的宮殿,但無法買到一千二百年的歷史。正如在伊斯蘭教中,杜拜與麥加無法相提並論。

黃陵同樣是歷史能量的積聚。包括明朝朱元璋,一三七一年祭,推翻明朝的李自成一六四三年也在黃陵叩頭,「昭告列祖,吾推翻明天朝,不是滅中華」。

清朝入關,也要祭黃陵,說「時代雖殊,繼治同道」。認祖歸宗,以推翻清朝為宗旨的同盟會也去黃陵祭祀。孫中山的祭黃陵詞三十二個字。

抗日戰爭起,國民黨去祭,共產黨也去祭,毛澤東親撰祭文。

何謂能量?這就叫能量。巨大的能量必須積累,而且無法速成,因為速成速敗。


星期五早上在車上讀到這篇文章,無限感嘆湧上心頭。

去年去西安,想要去法門寺看佛舍利,怎料神使鬼推,錯失了,沒去法門寺。

其實更想去看看玄奘法師譯經的地方,埋葬的地方。在西安除了吃以外,思想最多的便是玄奘法師。別以為玄奘到印度取經是一來一回,給皇帝宅配佛經到家的事情。唐玄奘當年沒有孫悟空豬八戒,只是赤手空拳到印度,先要學習佛經義理,回到中國才能準確翻譯。為了要確保學到印度人的學問,沒有誤解,他努力學習,考進了當時印度最高學府 Nalanda 那爛陀寺修習,最終以第一名畢業,之後才回中國,在長安展開譯經工作。

我曾跟隨老師去過曲阜祭孔,也曾跟隨老師去過佛佗的出生地、成道地、初轉法輪地、涅槃地。亦到過那爛陀寺遺址。我們不是去許願祈福、進香拜神。是希望讀萬卷書,行萬里路,跟隨先賢的足跡,學習他們的學問。然而,這兩次旅遊都不能靜下心來,專心參學。每次回到家後都覺得如入寶山空手回。

緣薄。緣淺。

更可惜的是,這幾年,我的學問毫無寸進。

每一個人,出生到這世間,都是從頭起步,一點一滴累積學問。在生活中事上磨鍊,長養智慧。

既是緣淺,自當更大出力,精思力踐。熊十力先生說過,『學者求聖人之意,要當於文言之外,自下困功。所謂為仁由己,與仁者先難而後獲是也。必真積力久,庶幾於道有悟,而遙契聖心。否則只是讀書,畢竟不聞聖學。』

星期四, 2月 04, 2010

Programming 的 convergence

我以 C++ 為基地,遊走於 C#、Java、Objective-C、Ruby……都是在OOP的圈子轉呀轉。

可能是 Apple Mac OS X、iPhone OS 帶起了更多人去做 Cocoa 編程,愈來愈看到 Cocoa Objective-C 的哲學滲入 C++, Java, C# 的世界。

Objective-C 是一種 dynamic binding, typeless 的語言,而 C++, C#, Java 則是 typed 的 programming languages. C++ 的 Boost library 提供了 boost::bind 來盡量模擬 Objective-C 的 dynamic binding。我覺得 Cocoa frameworks 及其前身 NeXTSTEP, OpenSTEP 之所以成功(well, technically, not commercially...)就是因為他是活用 objective-C 語言的 dynamic binding。所以十多年前 Microsoft 在創製他的 MFC 時便引進了 DECLARE_DYNAMIC, DECLARE_DYNCREATE 之類的 macro 來扮演某程度的 dynamic binding.

當然,C++ 始終是 C++,他是 compile time binding 的,不是 runtime binding。所謂的 DYNCREATE 即 dynamic creation,就是今天我們熟識的 factory design pattern. 可是當年連 design pattern 這個 concept 還沒有呢。

在 Java 及 C# 的世界,可以用 reflection 來達成 runtime binding. 將此道運用得出神入化的應該是 Apple WebObjects 了吧。其實, WebObjects 1至4版是 Objective-C 的,5版是把他移殖到 Java,所以把大量的 Objective-C 的風格、編程哲學都帶到 Java 世界。

更有趣的要算是 POCO library。他開宗明義說要成為 C++ 中的 Cocoa frameworks。

可能是《Effective C++》書中所討論的 reference counting smart pointer 跟 std::auto_ptr 的「先入為主」,我一直都搞不清 Poco::AutoPtr 的用法。最近終於搞定了。

《Effective C++》中的 reference counting smart pointer 是自動做 reference counting,而 Poco::RefCountedObject 是手動的。

POCO 的 Poco::AutoPtr 和 Poco::RefCountedObject 是分工的,而且跟 std::auto_ptr 一點關係也沒有,雖然他們都是叫「auto pointer」。 POCO 的 auto pointer 意思是會 auto release 的 pointer。

跟 Cocoa 來作比較便很清楚:

C++:
class Xyz:public Poco::RefCountedObject
{...}

Xyz 是有 reference counting 的功能。Poco::RefCountedObject 只提供 reference counting 的功能。

要 create 一個 Xyz class 的 object instance,用 new:

Xyz *x=new Xyz;

要把 x 殺掉,當然可以用 delete,但也可以用 Poco::RefCountedObject::release()

x->release();

Look! 是不是跟 NSObject 的 retain, release 很像呢?

C++ POCO VS Cocoa:

Xyz *x=new Xyz; ~~~ x=[[Xyz alloc] init]; // reference count = 1
x->duplicate(); ~~~ [x retain]; // reference count = 2
x->duplicate(); ~~~ [x retain]; // reference count = 3

x->release(); ~~~ [x release]; // reference count = 2
x->release(); ~~~ [x release]; // reference count = 1
x->release(); ~~~ [x release]; // reference count = 0 => destroy the object.


而 Poco::AutoPtr 的用法就是要扮 Cocoa 中的 autorelease.

C++ POCO VS Cocoa:

Poco::AutoPtr x=new Xyz; ~~~ x=[[[Xyz alloc] init] autorelease];