星期日, 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];