少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明。

2007年4月29日星期日

罗斯特罗波维奇逝世

虽然大师已经80岁了,但是听到这个消息还是感到很意外。
罗斯特罗波维奇是俄罗斯伟大的大提琴家,指挥家。不仅如此,他是一位勇于参与社会和政治的艺术家。下面附上一个简单的介绍来缅怀这位人类的斗士:
世界著名的俄罗斯大提琴家兼指挥家姆斯季斯拉夫·罗斯特罗波维奇(Mstislav Rostropovich)于2007年4月27日下午在莫斯科的一间诊所内逝世,享年80岁。罗斯特罗波维奇死于肠癌。这一消息是由他的发言人Natalya Dolezhal公布的。今年2月份,大提琴家就被送往医院,做了肾肿瘤切除手术。在他3月27日的80岁大寿庆典中,罗斯特罗波维奇在俄罗斯总统普金的搀扶下在电视中看上去脸色苍白,步履蹒跚。

大提琴家的遗体将安葬在莫斯科16世纪的诺沃德维奇公墓,那里也是许多其他俄罗斯和苏联文化与政治巨匠的葬身之处,诸如罗斯特罗波维奇的恩师兼战友,作曲家肖斯塔科维奇、男低音歌唱家夏里亚宾和作曲家斯克里亚宾等。苏联解体后的第一任民选总统,4月25日逝世的鲍里斯·叶利钦就安葬在那里。罗斯特罗波维奇与叶利钦是好友。1991年8月,大提琴家就只身飞往莫斯科,支持叶利钦对苏联军人政权的反抗。那距离苏联解体仅有数月。罗斯特罗波维奇为反对苏联政权的人们在直面莫斯科KGB总部的Dzerzhinsky广场举办了声援音乐会。在一张背景是杜马大厦的著名照片上,罗斯特罗波维奇与民主的支持者们走在一起,手里握的不是大提琴,而是一把来复枪。1989年,大提琴家也在柏林墙倒塌当晚在柏林墙下开办即兴演奏会。柏林墙的倒塌标志着冷战的结束。

罗斯特罗波维奇是本世纪公认的继卡萨尔斯之后最伟大的大提琴家。他对大提琴乐器音色和表现力的探索和实践至今无人可比。此外他对大提琴曲目的扩充也作出极大贡献。肖斯塔科维奇、普罗科菲耶夫、卡巴列夫斯基、米亚斯科夫斯基、卢托斯拉夫斯基、坎切利、施尼特凯、蒂迪厄(Dutilleux)、潘德列茨基、帕特和布里顿等作曲家都纷纷为他创作大提琴曲。他的大部分唱片均由EMI Classics和DG出版。

罗斯特罗波维奇1927年3月27日生于现今阿塞拜疆巴库的一个音乐家庭。他天生拥有绝对辨音能力,4岁起弹钢琴,7岁起拉大提琴,1940年当他只有13岁时首次作为大提琴家举办音乐会,演奏圣-桑的A小调大提琴协奏曲。之后他进入莫斯科音乐学院学习。上世纪40年代就获得了莫斯科的两项音乐大赛桂冠。60年代他已响彻大江南北。1968年,他首次以指挥身份登上舞台,在莫斯科大剧院指挥了柴科夫斯基的《叶甫根尼·奥涅金》。1970年10月31日,他给《真理报》写了一封公开信,信中声援被流放的作者亚历山大·索尔仁尼琴。索尔仁尼琴因为接受了象征西方的诺贝尔文学奖而被当局视为眼中钉。几十年后,罗斯特罗波维奇回忆往事时提到:“我做过的最优秀的事迹并不是音乐,而是那封给《真理报》的信。从那以后我就问心无愧了。”但那封从未在国家所有的公开媒体刊登,却出现在西方报纸上的信使罗斯特罗波维奇成为众矢之的。他被莫斯科大剧院禁演,禁止出国演出,也不允许指挥乐团。1974年,他带着妻子和两个女儿使用同年批下的有效期两年的地旅行签证逃离苏联前往巴黎,后定居美国。1977年,他接替安泰尔·多拉蒂出任美国国家交响乐团音乐总监的职位,一干就是17年。1978年,罗斯特罗波维奇夫妇双双被剥夺苏联国籍。之后他们使用由瑞士政府签发的特别文件进行国际差旅。1990年1月,音乐家夫妇被恢复俄罗斯国籍。大提琴家曾于2000年后与指挥家小泽征尔与祖宾·梅塔数次来到中国开办大师班。

大提琴家生前受誉无数。他是大英帝国的荣誉骑士勋章、法国文化与艺术十字勋章、希腊凤凰勋章和联邦德国优异服务大十字勋章的获得者。1987年他从当时的美国总统里根手里接过象征美国民间最高级别的总统自由勋章,1992年获得美国对艺术界人士最高级别奖励的肯尼迪勋章。他在苏联和俄罗斯获得的荣誉包括列宁勋章、1951年的斯大林奖章、1956年的苏联人民艺术家称号和1993年的俄罗斯自由战士勋章。此外他还在全球各地超过30所大学拥有荣誉学位和职称,包括哈佛、耶鲁、普林斯顿、牛津、剑桥、乔治城、特拉维夫大学,以及科蒂斯音乐学校等。

他于1955年迎娶的著名俄罗斯女高音歌唱家加琳娜·维什涅夫斯卡娅和他们的两个女儿奥尔加与埃琳娜都健在。

2007年4月27日星期五

GUI库

昨天看了Crend的开发关于BT++的开发心得。他提及没有找到成熟好用的GUI库,因此暂时不打算开发BT++的界面。

关于界面,因为最近开发的需要,所以还是有不少的体会,这里分享一下。

我觉得从本质上来说,界面是软件不可或缺的一部分。很多人对此不以为然。可现代计算机的发展已经告诉我们,显示器和显示卡已经成为了大多数不可或缺的部分。用户都希望能够操作系统和应用程序能够提供易用漂亮的界面。有一些人用命令行和图形界面来区分高级用户和低级用户,这在我看来简直有一点逻辑混乱。

事实上却是,使用命令行有时候并不是宗教信仰问题,也不是高级低级的问题,而是被逼无奈。如果任何一个系统之下都有类似Visual Studio这样的开发工具,我不相信还有很多人去写生硬难懂的make文件 。

被逼迫的原因之一可能就是像Crend一样没有找到一个成熟好用的GUI库来构建应用程序,不得以只能使用命令行形式。那么我就来说说GUI库,拿Windows下的图形库举例。

Windows 有原生的API支持图形界面,包括窗体的创建、按钮的创建等等。这一点毫无疑问。问题就是拿这套东西去构建一个比较完整的图形界面,相信复杂度与你正要开发的应用程序相当,甚至还要更高。也就是说,如果Crend使用原生Windows API去构建图形界面,他还需要在他已有的程序基础上,多写5000-10000行代码。而我相信现在的BT++也未必能有这么多代码。

微软的MFC库倒是一个不错的选择。有各种类型图形元素的封装,从按钮到对话框。其实,大多数Windows下的应用程序都是选择MFC作为界面框架的。可是仔细考察以后就会发现,要使用MFC来构建一个类似uTorrent的界面(Crend鼎立推崇的一款BT软件)还是需要颇费一番功夫的。

首先,整个界面外观就需要布局。其次,界面中的布局可以根据鼠标拖动更改大小,并且做到大小自适应。这一点不太容易。然后就是下面的多标签(Tab)显示。每一个标签里面都是完全不同的控件布局。其中还有一个标签里面是下载和上传速度的动态显示。这在MFC里是不能够直接支持的,需要代码绘制。

当然,类似菜单Preference里面的左右分栏的效果也不是直接支持的。

我想说的是,uTorrent的界面元素看上去并不是太复杂,甚至是很基本的。然而,要想使用MFC构建这样的界面,需要的是对MFC比较熟悉,并且还可能需要写500-1000行代码左右。

如果是类似Office那样的界面呢?还增加一些透明效果,光影效果?

我最近使用.NET Framework来开发C#应用程序,用Windows.Forms来构建界面。应该说,比MFC要方便了不少,起码类似uTorrent这样的界面并不需要太多的编码就可以完成。可问题就是,当我还想更深走一步的时候,就遇到重重困难。比方说,我想自己做一个Textbox控件,来支持更多的功能,然而,要想在现有的一些界面控件上重新安排绘制过程,或者增加绘制代码,就显得很困难。然后还需要自己处理消息循环,而这些又都是在.NET Framework中去处理原生API,就更显得隔了一层。

好了,我的例子就说到这里。我的意思已经很明确了,就是说,一个所谓成熟的GUI库要具备哪些要素呢?

首先,提供基础的界面元素控件,比方说按钮,菜单,工具条。不能让开发者使用代码去构建这些基础的东西。

其次,要提供方便的布局方案。在开发系统的设计器中布局固然重要,但是很多情况下,软件在运行一开始,并不知道布局情况,或是在运行中,希望能够方便改变布局。因此,界面的布局方案是很重要的。MFC没有布局方案。Windows.Forms有专门的布局控件,但是这还不够。

第三点,处理消息或者叫事件要简单。要能够很容易去处理一些消息或者事件。MFC可能都需要使用一大堆生硬的宏。而Windows.Forms不需要这些,但也没有给开发者提供更多的处理事件的机会。除了标准的控件事件,Windows.Forms里面的不少控件都不能处理其他非标准的控件事件,需要挂接原生API。

第四,能够容易扩展。界面元素的绘制过程和方案能够进行重构。比方说,我可以通过继承或者其他的方式,改变标准按钮的绘制过程,从而得到新的按钮控件。而且,这种扩展应该是容易的。我仅仅希望改变按钮的外轮廓,我就处理外轮廓就行了,我不想管按钮内部的情况。你不能让我扩展轮廓还要从头画,这不行。

第五,界面和代码逻辑的集成性。这一点不太好理解。传统上,界面元素是没有语义的,按钮就是按钮,菜单就是菜单。和代码逻辑的集成,都是通过我们程序员来实现的。什么叫代码逻辑的集成?举例说,一个按钮代表了提取银行帐户里的前。那么,余额充足的时候,这个按钮应该是可用的;不足的时候就不可用。问题在于,这样的功能,只能通过我们用程序去判断余额,然后更改按钮的状态。一个小小的按钮没有问题,可是有时候,在一个系统中,某一个操作可能带来很多界面元素状态的改变,而且这种改变不是每一个元素都一样。通过程序,我们可能很难去收集现在这些元素的状态。更不要说如果是一个有插件的系统,我们也许都不知道有哪些元素需要去改变。所以,界面框架应该解决这样的问题,我只需要指明某个控件的什么状态与我的哪个逻辑是关联的,界面框架就自动去处理状态问题。

第六点,跨平台性。界面框架应该可以跨平台。这里指的平台不单单是操作系统,还有编程模型,比如Java、.NET、原生C/C++。不过这一点不太容易。

这是我归纳的六点关于GUI库的要求。现阶段普通的GUI库大多数都停留在第一个层次(如wxWidget,QT,GTK),仅仅是提供控件。当然,也有一些库提供了其他的功能。比方说Mozilla的XUL,提供了界面布局(XML),扩展性(使用类似HTML的方式,把界面元素和样式分离开,这样就可以通过样式来扩展元素的外观)。不过遗憾的是Mozilla只能使用C++开发,而且其依赖于Mozilla并不通用的框架模型XPCOM(类似微软的COM)。这多少有一点讨厌。

微软的Windows Presentation Foundation不错。基本控件、布局、扩展性都解决了不少,事件不知道如何。还增加了多媒体功能。不过跨平台性几乎没有。

Java的JFace也是使用XML进行布局。只是界面效果差强人意。Java在桌面应用程序上要走更远的话,界面的问题必须解决。

说了那么多,对Crend没有太多帮助:) 他还是只能暂时开发控制台程序,至少现在是这样的。

2007年4月26日星期四

我看开源

本来开源不开源是软件行业内的一件事情。然而最近王开源在微软创新大会上的举动则把软件业的很多问题抛向了整个社会,再加上很多不理性的思考,使得开源这件事情承载了太多它本不该承受的东西。

这里,我仅仅想谈论一下开源和闭源的一些关系。

所谓开源就是指开放源代码。众所周知,软件,作为计算机硬件上运行的程序,其核心就是有成千上万行的源代码组成的(这么说,仅仅是为了通俗易懂,其实,可以运行的大多数软件都是二进制代码,并不是可以被容易理解的程序源代码)。软件要作为商品,软件要成为知识产权保护的对象,其核心也就是在谈论源代码的归属问题。

软件作为商品,传统上是指二进制形式的可执行状态的软件。也就是说,用户仅仅需要执行这些软件,使用这些软件就行了,并不需要知道或者查看软件的源代码。源代码作为软件开发商的“财产”,由软件开发商自己维护。

软件作为知识产权保护的对象,源代码就是其最终的形式。也就是说,知识产权保护的就是源代码,二进制形式相对来说并不重要。因为源代码记录了软件的结构和行为。通过源代码,很容就能够重新建立二进制形式的软件。因此,对软件知识产权的保护,从某种意义上来说,就是对软件源代码及其文档的保护。

问题出现在哪儿呢?问题在于软件同时又是人类知识的一部分。作为人类的知识来说,需要传播、共享和发展。因此,作为商品,作为知识产权保护对象的软件形式就和这一目标有一定的矛盾。矛盾在于,软件开发商要想使用软件盈利,就必须保护源代码不被外界所知晓,就必须以种种形式保护那些区别于别的开发商的算法和功能,不被其他开发商所使用。然而,这种做法又严重影响了软件业的发展,不利于知识的传播,不利于软件技术的发展。

有一些很容易被理解的例子。比如,几乎每一代的微软Office产品都会推出新的界面风格,然而这些界面风格的具体实现方法并不被外界所知道,这也就造成了大多数软件开发商无法使用这种界面风格。要想实现这些效果,有时候非常困难,甚至是不可能的。

再比如,Windows操作系统功能强大,但是因为不清楚其内部结构和具体的实现方法,研究和学习操作系统的人都无法学习到其先进之处,也不能够继续发展。

例子很多。所以就有人开始提倡开放源代码,能够促进知识共享和发展。典型的案例就是Linux操作系统的兴起。这里我不想探讨Linux操作系统如何兴起的,我也不想讨论开源带来的后果,但有一点是肯定的,借着Linux的东风,开源运动蓬勃兴起。

但是,并不是开放了源代码就解决了一切问题。也并不是所有开放源代码的人肚子里面都是一个想法。事实上,开放源代码现在成为了掩盖很多问题的挡箭牌。

最开始的问题就是,开放源代码和软件是否免费是不是一回事情。很多人理解开放源代码就是免费软件的意思。的确,很多开源软件都是免费软件。所以,现在很多人推崇开源软件的真实原因在于这些软件免费。

然而,仔细想一想就知道了,免费就意味着,软件的开发者和使用者之间的天然契约——消费关系不存在了。那么,又如何约束双方的行为呢?使用者如何不非法利用源代码,开发者又如何承担相应的义务呢?

在现实中,大多数免费的开源软件都没有明确这方面的信息。开发者对提供的开源软件不符任何责任,也不承担提供技术支持的义务。使用者也有可能非法使用这些软件,比如在商业软件中使用这些开源的代码。或者是使用源代码来对其他用户进行攻击。

第二方面的问题就是知识产权的问题。开放了源代码,那么,软件这一智慧结晶怎么保护呢?假设,一个公司花了很大的人力和财力开发一个软件,一旦公开了源代码之后,怎么能够通过这个产品来盈利,来进行发展呢?微软就是因为这个原因拒绝提供其大多数软件的源代码。

当然,现实中有很多变通的例子。比方说,IBM和Sun公司,都是很重要的商业软件公司,但同时又是开源运动的支持者。两家公司捐献了很多产品的源代码给开源社区,如Eclipse、Solaris、Java Platform,堪称开源的典范。可是,两家公司又都从开源中得到了不小的好处。IBM通过开源Eclipse,为自己的闭源产品WebSphere、DB2打开了销路。Sun通过开放Solaris和Java Platform,吸引了更多人关注其服务器套件产品。通俗地讲,这是放长线钓大鱼。这些商业公司的初衷和提倡开源运动的某些死硬份子的想法是迥然不同的。

最后一个问题也是最关键的问题就是,对于用户来说,开放源代码重要吗?

你是否因为不知道电视机的内部结构和实现过程就对使用电视机没有自信了呢?你是否因为不清楚短信收发的过程和编码技术就不敢使用手机了呢?

同样的道理,任何用户都不清楚Windows的源代码,但是这妨碍Windows成为最普及的操作系统吗?

答案很明显。换个角度,你让一个普通用户使用Linux和Windows,然后让其选择一个其更喜欢的系统,答案应该也是很显然的。

我一直坚信,对于普通用户,开放源代码实际上是很危险的。任何用户如果都能够很容易接触到操作系统的源代码,则要安全使用操作系统基本上就是不可能的了。即便是对专业人士来说,除开工作需要和研究,很少有人愿意去了解其使用的每一款软件的源代码,这不符合人们的习惯。

开源不开源现在来说,其重要性仅仅是对某些软件开发者而言,对于普通用户现在还看不出优势和劣势。同时,开源更和国家利益没有必然的联系,更不是什么支持民族产业的理由。希望大家理性看待开源的软件和运动。

2007年4月24日星期二

叶利钦,伟人



1999年12月31日,时任俄罗斯总统的叶利钦宣布辞去总统职位。其闪电般的速度和做出决定后的果敢都让世人为之惊讶和钦佩。

7年多后,叶利钦又离开了人世,大家又一次感受到了突然。


很多年前,我看过一部叶利钦的传记,还看过其自己的自传作品。我非常欣赏其敢作敢为的作风和态度。虽然很多人对叶利钦褒贬不一,虽然很多人把叶利钦当作苏联的掘墓人,但是,没有人会否认这个改变了历史的人物在历史中所起到的重要作用。


建议看看叶利钦的个人传记《午夜日记》。很少有领导人有那么多的魄力,更不要忘了,叶利钦是苏联培养下的人物,很多事情能够去做,就更显得难能可贵。

2007年4月17日星期二

微软的产品线

昨天试用了一下微软最新的一个软件:Office Accounting。这是一个为小型企业量身定做的管理和财务软件。试用这个软件一方面是因为柳最近在一个公司实习,而那个公司基本没有信息系统,所以我想看看信息系统对公司的管理到底有多大的帮助,是不是因为现在的软件都不合适;另一方面,我也想看看微软如何扩展自己的产品线,从一个单纯的平台软件开发商过渡到企业级解决方案提供商。

应该说,微软做得还是相当不错。很多人以为Google就是微软潜在的对手。应该说,从某个方面是这样的。但是,Google目前的产品线还非常有限,仅仅局限在互联网领域。不管是桌面还是企业级应用,Google都没有完整的产品线。微软的对手其实是像IBM,SUN,Oracle这样的平台厂商,他们都有这丰富的产品线,能够提供从开发到应用的完整链条。

几年前,我对微软的印象还是Windows和Office,外加开发所用的Visual Stuido。今天,仔细浏览微软的网站,我们会发现,微软已经为IT人员,商务人员,开发者提供了不同的产品链条。在每一个链条中,微软还提供了不同层次的产品,比如对于商务应用,微软针对不同规模的企业有着完全不同的解决方案。这使得用户在选择的时候,能够有的放矢。

再加上操作系统这一个先天的优势,微软目前已经迈入了一个新的,高速发展的时期。我们常常定住一些传统的产品,却忽视了整个产品线的认知。

相比起来,国内很难找到一个软件商,能够谈得上有产品线。没有产品的链条,就很难把客户捆绑在自己的某个产品上,进而也就很难做到真正能够循环发展。

2007年4月16日星期一

曾子墨

今天买了一本书,曾子墨的《墨记》。给柳买的。
很多年没有买、看这样的自传并且略带有一丝励志性质的书了。不过,我怀着很大的兴趣翻看了整本书,应该说,我还是被深深吸引。
在“豆瓣”上看了一些书评,发现很多人不以为然,甚至还有讽刺挖苦的。原因就在于曾子墨没有透露自己的感情生活;在于最后“炫耀”了自己喜好高跟鞋,喜好某名牌;在于没有书写自己的挫折......等等
其实,中国人的一大问题就是,心态不稳。那些所谓的问题其实在我看来都很简单,别人也仅仅是写一本介绍自己的书,给其他的人启发。生活是丰富多彩的,曾子墨是这样的人生,那么你呢?写那些书评的人,生活可能根本远没有曾子墨丰富。再说了,自己写的书就一定要透露自己生活的全部方面吗?很可笑。
更可笑的是,有人还说认识Morgen Stanley的某某人物,问曾子墨想不想听过去某个领导对她的评价,意思很明显,评价肯定不怎么样。我就觉得有一些好玩儿了,曾子墨干嘛要在乎一两个人对她的评价?如果在乎,恐怕她也不会离开众星闪耀的投资银行了。
看书,不去学习别人有什么地方可取,而对着别人评头论足,这显然很幼稚。事实上,曾子墨远比我们很多人都勇敢和优秀。
再说了,女性爱美,喜欢打扮,也没什么错误。在书中坦然说出,恐怕比一些人装模作样要好得多。
最后,建议想拥有精彩人生的人可以翻翻这本书。很普通的励志书籍,但是却告诉我们一个简单而有着丰富内涵的道理:人生,其实可以很美丽。

2007年4月15日星期日

来日方长

大学本科的生活还有两个月就要结束了。一切都是那么快,还清楚记得背着书包走进校园的那天。转眼,已经从风华少年变成了即将面对更大挑战的青年。
以前以为会越走越清楚,可是现在现在却还是很迷茫。但有一点,我不想做一个平凡的人,这一点丝毫没有改变,反而更加强烈。
四年北京的生活尽管辛苦但是充满了挑战和欣慰。收获的不仅仅是一点点生活的阅历,更多的是我终于能够对自己说,我是一个有独立思想和行为的人了。

2007年4月3日星期二

关于莉莉周的一切和德彪西

当我看了一部分后,我才回忆起多年前我曾经看过这部电影。里面的两个情节让我迅速记起来了,一个是一大群男孩下雨天在车站讨论女孩;一个是最后在演唱会的情景。

应该说我不能算太喜欢这部电影,但仍然感受到了青春的气息。其实,里面有很多事情看似也像自己的昨天。

我不想说影片太多,看了才知道,有没有共鸣完全取决于你自己的青春岁月。

引起我联想很多的倒是里面德彪西的钢琴曲。《阿拉伯风格》是两首,我都会弹。在曾经非常喜欢德彪西的时候,这两首小曲子是我每天都要弹的。很多年没有听,也很多年没有碰这两首了,再次听到突然觉得全身都像呼吸了新鲜空气一般。

影片中的演奏其实相当一般。如果你听过法国大师季雪金的演奏,那你才能知道什么是真正的德彪西。那种幻境,那种似水的风格。德彪西一定要像水,灵动,轻巧。演奏德彪西的技巧是和肖邦、贝多芬等人完全不一样的。细节非常多,必须要一点一点一丝不苟。

很想最近再弹弹这两首《阿拉伯风格》。

Google拼音

最近,Google中国发布了一个实验室产品——Google拼音。尽管市面上已经有了众多的输入法产品,但是Google拼音仍然迅速吸引了大家的眼球。众多网站争相发布试用信息。我也十分好奇下载了一个试用。

就目前而言,这款输入法让我感觉还不错。至少我的名字能够很轻松打出来,并且能够记住,这是不容易的。最新的微软输入法虽然能够输入我的名字,但是不能记忆,显得并不是很智能。

当然,这只是一个实验阶段的产品,仍然需要更进一步的试用才能发现问题。但是Google已经逐渐扩展自己的产品线,开始往传统的桌面发展,并且和自己的优势结合起来。这款Google拼音就能够使用Google账户同步词库信息,这是一个很酷的功能。

另外,我又重新使用了Google Desktop的本地搜索功能。虽然默认状况下不能更改索引的地址,但是网上有文章指导如何使用注册表来修改索引的地址。

我更改了索引的地址,又指定了一些目录排除在索引外。目前,我的索引有500多兆。但是查找文件信息十分方便。这还是我很中意的。

Google的脚步越来越快,不知道微软如何面对。:)

重新搭建工作环境

为了今后的需要,我重新搭建了工作环境。昨天去更新了硬盘和内存。目前就我这个笔记本来说,已经达到了极限的配置。我要这么做的原因还是在于想学习Linux。安装双系统不是一件很容易的事情,稍不留神就是两个系统都崩溃了。

这次安系统倒没有遇到太多的困难。Linux也成功安装上了。唯一碰到的小麻烦事情就是Linux的分区。我在Windows下使用PQ Magic把最后一个磁盘的大约30G化为了自由空间。按照某篇网上的介绍的方法,我又把这个自由空间完全从Windows的扩展分区中给划了出去。

结果,Linux的安装过程中就没法分区。后来发现,不应该把那块空间从Windows的扩展分区中给拿出去,于是又重新把空间调整了。这下Linux分区成功了。

Linux安装费了大约一个小时,启动速度很慢。进去逛了一圈,不会用,还需要好好学习。

今天还差点把资料给弄丢了,幸好只是简单格式化了,用Easy Recovery就很容易恢复了。天啊,要不然我要重新写那么多代码,疯了!

2007年4月1日星期日

高级“单件”(Advanced Singleton Pattern)

高级“单件”(Advanced Singleton Pattern)
单件模式应该是设计模式中应用非常广泛的一种模式。单件模式可以确保某些类仅拥有一个实例化的对象。在实际的应用程序中,诸如打印机,内核,窗体控制类都常常应用为单件模式。然而,我们又常常遇到这样的问题,一个应用程序中有很多类都是单件类,该如何管理这些单件类呢?
单件的实现方法不尽相同,在一个应用程序中,我们可能很难知道哪些类是单件模式,哪些类不是。如果能够给所有的单件类提供一个统一的入口,能够十分快捷地得到一个单件类的实例,对于一个大型的应用程序来说,无疑是十分必要的。
这里我们实现了一个单件管理类,用于管理整个程序的所有单件。部分内容参考了《设计模式》一书。
我们的设计目标有两个:
1.每个单件类都不能够显示地实例化。
2.每个单件类都仅能够通过单件管理类来访问,换句话说,直接访问单件类的实例也是不行的。
这样做的目的就是想整个程序仅有一个单件的入口。下面展示的就是事例代码,由C# 2.0写成,用到了.NET的泛型。
public interface ISingleton
{

}
public class SingletonManager where T : ISingleton
{
Dictionary _singletons;
public static readonly SingletonManager Instance = new SingletonManager();
private SingletonManager ( )
{
_singletons = new Dictionary();
}
public bool CheckInstance ( string name )
{
return _singletons.ContainsKey(name);
}
public void Add ( string name, ISingleton single )
{
if (_singletons.ContainsKey(name) == false)
_singletons.Add(name, single);
}
public T GetInstance ( string name )
{
if (_singletons.ContainsKey(name) == true)
return (T)_singletons[name];
return default(T);
}
}
这就是单件管理类的代码和单件的接口。值得注意的是,单件的接口是一个空的接口。下面我们看看一个单件类是如何实现的:
public class ABC:ISingleton
{
private static ABC _instance;

pviate ABC() { }
public static void Register()
{
if (_instance == null)
_instance = new ABC();
SingletonManager.Instance.Add("abc", _instance);
}
public void Print()
{
Console.WriteLine("Hello");
}
}
我们注意到ABC类实现了ISingleton接口。其实,ISingleton接口仅仅是想让单件类有一个统一的原型。同样可以使用一个abstract 类。我们注意到,ABC不能直接实例化,也不能通过直接访问ABC来得到ABC的实例。唯一可以直接访问ABC的是一个静态方法,即向单件管理类中注册当前ABC的实例。而ABC的实例化就是在注册的时候完成的。
要想得到ABC的实例必须通过访问单件管理类:
ABC a = SingletonManager.Instance.GetInstance("abc");
注意,我们这里使用泛型完全是为了客户端代码的类型安全而考虑的。SingletonManager中存放的是ISingleton的集合,但实际上我们想得到ABC的实例。于是通过泛型通知SingletonManager我们想得到的类型,从而免去了类型的强制转换。
这样我们可以很容易知道一个类究竟是不是单件类,也很容易去控制单件类的行为。