聆听东方的罗密欧与朱丽叶

2001年4月写的一篇文章,是给当时我们自己几个朋友创办的音乐小报《白桦林》的稿件。

==============

1958年冬天,在上海音乐学院诞生了一部划时代的中国交响乐作品——《梁山伯与祝英台小提琴协奏曲》,它的作者是当时上海音乐学院的两名学生——何占豪、陈钢。

这部作品取材于中国民间故事,综合运用了西洋交响乐与中国民间戏曲的表现手法,把梁山伯与祝英台之间真挚的感情与祝英台对封建势力的顽强反抗精神淋漓尽致的表现了出来,表达了在封建势力压迫下人们对美好生活的向往。

这部乐曲采用了带标题的单乐章结构,按照《梁祝》故事中的主要情节分为三个部分——草桥结拜、英台抗婚、化蝶。

在弦乐震音的背景上,竖琴拨出五个淡淡的音符,随后出现由长笛独奏的一个引子,描绘了一副春光明媚、鸟语花香的美丽景色。引子过后,乐曲开始了由独奏小提琴担任的呈示部主部主题——爱情主题的呈示。随之,大提琴以潇洒的音调与小提琴形成了悄声细语的对答乐段,描绘了梁山伯与祝英台草桥结拜的情景。在独奏小提琴的华彩乐段后,乐曲进入了副部主题——同窗共读。欢快的回旋曲描绘了梁山伯与祝英台同窗三载快乐的时光。可是好景不长,他俩很快就得在长亭分别,小提琴与大提琴情意绵绵的对话声再次响起。乐曲用八个简洁的音符形象的描绘了梁山伯一步三回头与祝英台依依不舍的分别情景。呈示部最后在一句简短、惋惜的乐句后结束。

展开部由抗婚、楼台相会、投坟三个小部分组成。音乐由前面的优美与安详急转为阴暗低沉。定音鼓等低音乐器不安的音调预示着不祥兆头的到来,随之而来的便是铜管乐器的封建势力主题和小提琴和奏的抗婚乐段,强烈的切分节奏与小提琴的散板节奏交织在一起,反映了祝英台与封建势力顽强抗争的画面。最祝,祝英台不抵封建势力的压迫,抗婚失败,乐曲转到了楼台会片段。小提琴与大提琴对答场景再次出现,它们的声音时分时合,表现了梁山伯与祝英台在楼台相会的百感交集的情绪。很快,梁山伯暴病去世,乐曲使用了中国戏曲音乐的表现手法把祝英台寻坟、哭坟的情景充分的表现了出来。在小提琴一句强音绝唱后,祝英台纵身投坟,此时,乐队鼓乐齐鸣,全曲达到了最高潮。

高潮很快过去,长笛声再次响起,在竖琴的刮奏后,加上弱音器的小提琴再次奏响了爱情主题,为听众描绘了一副朦胧的仙境的美丽景色。很快,第一小提琴在钢琴的配合下,以轻盈的旋律与一个婉转的波音,形象的表现了男女主人公在去世后双双化为彩蝶在丛中自由飞舞的情景。最后乐队齐奏爱情主题,音乐庞大的气势与优美的曲调寄托了人们对梁祝爱情故事的同情与祝愿。乐曲在小提琴淡淡的结尾句后结束,给人以意犹未尽的感受,引发人们的无限的暇思……

终于解决了上网和休眠两大难题

这两天刚收到了邮购的《程序员》合订本,上面一篇有关用好Google解决难题的文章吸引了我的眼球,看了它,我顺利解决了一个困扰我好几天的问题,很神奇是吗?

那篇文章说穿了也没什么大不了的,关键的一句话就是网上的信息很多,我们不用担心因为被过滤掉太多的信息而失去了找到有用信息的机会。文章推荐用很精确的搜索关键词代替模糊的关键词来搜索信息。

我新买的本本遇到了一个比较奇怪的问题,在“电源管理”中无法启用“休眠”的功能,选上这个功能后确定就会弹出一个对话框:标题是:能源策略管理器无法保留休眠文件。内容是:另一个程序正在使用此文件,进程无法访问。 当然我的机器上装的英文版的系统,所以弹出的框框内容是:Title: Power policy manager unable to reserve hibernate file. Content: The process cannot access the file because it is in use by another process.

为了解决这个问题,我前面已经用相关的关键字(什么电源啦,休眠啦之类的)在网上搜索了一段时间,但一无所获,很多查到的资料与我的问题都不完全一致,看了《程序员》的文章,我受启发干脆用这样长长的出错提示来搜搜看,于是乎,我就用“能源策略管理器无法保留休眠文件”作为关键字在Google上搜索,果然,非常幸运,第一条查询结果就解决了我的问题,它说:“把虚拟光驱软件卸载,然后再启用休眠”。我机器上确实安装了daemon,卸载后启用休眠,一次成功!

呵呵,我之所以上面把出错提示中英文都打全了,我希望这篇文章能被搜索引擎所发现,以后有朋友如果遇到相同的问题也可以在这里找到帮助。从我的Blog的外部链接统计中可以看到,这里的大部分文章都被Baidu等搜索引擎所发现过。

这两天解决的另外一个问题不是依靠网络,不过这个问题的解决的确很让我高兴,因为它很实用。

我们的机房是通过需要验证用户口令的http代理上网的,于是乎,Outlook收发邮件就是个问题,加上国际流量的高昂价格,在机房上网总是不太爽。在同学的介绍下,我学会了两个很实用的软件:

CCProxy:把自己的机器变成代理服务器,在CCProxy中把现有的代理设置为它的二级代理,然后自己的机器设置为通过自己的CCProxy代理上网,这样就顺利的解决了大部分由于http代理的限制而不能正常使用的软件,CCProxy为我通过http代理模拟出了SOCK/POP3/SMTP等代理。

E-Border Driver:仅仅通过CCProxy无法解决国际流量的问题,我们希望找一个外网的免费的国内的代理来出国访问,这样的代理很好找但我无法使用,因为IE里已经设置了是通过本机的代理上网的,没法设置二级的代理。E-Border Driver就是解决这个问题的,它可以把本机的网络流量都默认转发到一个代理上。安装它后,把它的Proxy设置为本机,并设置CCProxy不通过它走。这样设置后,IE等软件中不设置代理即表示通过本机CCProxy代理走。这时,就可以在IE中设置其它国内的代理,然后,呵呵,上网省钱的目的也就达到了。

关注2005维也纳新年音乐会

偷闲上网,突然想起了每年一次的维也纳新年音乐会,去官方网站看看,发现CD/DVD已经开始预售,自然,节目单也就公布了出来。

然而,相比节目单而言,也许更能引吸我的还是这次音乐会的指挥——洛林·马泽尔。

在平望中学上初中的时候,在钱小强老师的推荐下,1996年,我生平第一次收看了维也纳新年音乐会,很快我就被施特劳斯家族的音乐作品所吸引。而那一年的指挥,正好也就是今年的指挥:马泽尔。96年的新年音乐会上,中国的乐迷们第一次在新年音乐会中听到了中国的声音:马泽尔在用了很多种语言向全世界的听众致以新年的问候,最后一句就是中文“新年好!”。1999年,他再次指挥维也纳新年音乐会时,又说了“新年快乐!”。不知道今年他还会说什么。

也许是进口的CD太贵,也许是对音乐的追求还不够高,也许是DIY的精神过于强烈,1997年开始,我就自己开始录制维也纳新年音乐会,1997年是里卡尔多·穆蒂的指挥,我记得我是特地清洗了录像机的磁头,并买了一盒很贵的TDK的录象带来录制,后来又转录到两盒SONY的磁带上反复听(好像真得很土!)。

1998年是祖宾·梅塔的指挥,我同样录了下来,后来终于买到了一盒D版的CD,才结束了听磁带的历史。

1999年又是马泽尔的指挥,由于正好是高三的时候,这一次音乐会似乎没有能给我留下太多的印象。

2000年,又是里卡尔多·穆蒂的指挥,由于97他的指挥没能给我留下太好的印象,觉得他有点呆板,所以也就没有太多的关注,这一年开始,我开始把音乐的声音录成MP3。

2001年尼克劳斯·哈农库特指挥,这是我第一次看他指挥,所以印象也比较深刻,2001我刚在学校里买了电脑,所以2001年的曲子听的次数比较多:) 这一年,哈农库特别出心裁的将《拉德斯基进行曲》以他认为合适的较慢的速度放在了音乐会开始的时候演奏,与结束时的“正常”版本遥相呼应,让人留下了很深的印象。

2002年,小泽征尔指挥,我第一次淘汰了录象机,因为它实在是老态龙钟,录下来的东东已经没有办法听了,这一年,我直接通过电脑上的电视卡,把声音录成了MP3,由于前几年一直是元旦也在学校,所以总是到春节才能看到录下来的音乐会,这次终于算是看了实况直播了。这一年还挺感动,小泽征尔指挥乐队,请各位艺术家用各种语言向听众问好,由于乐队中有日本人,所以日语就有人说过了,所以,最后是小泽征尔自己用中文说了“新年好!”。

2003年,尼克劳斯·哈农库特再次执棒新年音乐会,没问题,如法炮制的用电视卡录了下来,那一年,央视的前方队伍在采访哈农库特时送给他一把二胡,他居然拿起来就拉出个“匈牙利进行曲”来,虽然是疙疙瘩瘩的,但至少让人听出来是啥了,感觉他巨强。

2004年,本科毕业了,有电视卡的同学也毕业走了,而我还留在学校继续读研,没东西可以录了,没办法,找了和我关系不错的郑关胜老师,用他的DV把音乐会录了下来(当然是通过视频线录,不是直接拍下来,我还没有傻),花费了三盒DV带,转成AVI文件占满了一块硬盘,只好花N个晚上时间把它们接起来,再压缩成RMVB,太累了,以后再也不敢了~~~对了,2004年的指挥又是里卡尔多·穆蒂,这一年,我改变了对他的印象,感觉穆蒂的指挥确实不错。但似乎他对央视前方人员送给他的琵琶并不感兴趣,没有像哈农库特那样表现出极大的兴趣,表现极为冷淡,让我颇感遗憾。

2005年,马上就是我收看维也纳新年音乐会的第9个年头了,看着价值26.9欧元的DVD,看来DIY又是必不可少的了,真不知今年能用上什么样的设备。不过现在要买到D盗的CD或DVD似乎比以前要方便多了,网上BT下载的威力也是不可低估,也许,今年可以用不着DIY了……

2005年维也纳新年音乐会节目单

·上半场曲目

Johann Strauß  Indigo Marsch, op.349
约翰•施特劳斯  蓝色进行曲,作品349号
Johann Strauß  Haute volée Polka, op.155
约翰•施特劳斯  上流人物波尔卡,作品155号
Joseph Strauß  Lustschwärmer, Walzer op.91
约瑟夫•施特劳斯 兴趣盎然的圆舞曲,作品91号
Joseph Strauß  Winterlust, Polka schnell op.121
约瑟夫•施特劳斯 冬趣快速波尔卡,作品121号
Joseph Strauß  Die Emancipierte, Polka Mazur op.282
约瑟夫•施特劳斯 解放波尔卡—玛祖卡,作品282号
Johann Strauß  Tausendundeine Nacht, Walzer op.346
约翰•施特劳斯  一千零一夜圆舞曲,作品346号
Johann Strauß  Die Bajadere, Polka schnell op.351
约翰•施特劳斯  印度舞伎快速波尔卡,作品351号

·下半场曲目

Franz von Suppé  Ouvertüre „Die schöne Galathée”
弗兰茨·冯·苏佩  美丽的加拉蒂亚序曲
Johann Strauß  Klipp-Klapp, Galopp op.466
约翰•施特劳斯  劈劈拍拍加洛普,作品466号
Johann Strauß  Nordseebilder, Walzer op.390
约翰•施特劳斯  北海风光圆舞曲,作品390号
Johann Strauß  Bauern-Polka, op.276
约翰•施特劳斯  农民波尔卡,作品276号
Johann Strauß  Fata Morgana, Polka Mazur op.330
约翰•施特劳斯  海市蜃楼,波尔卡—玛祖卡,作品330号
Johann Strauß  Vergnügungszug, Polka schnell op. 281
约翰•施特劳斯  游览列车快速波尔卡,作品281号
Joseph Hellmesberger jun.  Auf Wiener Art, Polka francaise
小约瑟夫·赫尔梅斯伯格  维也纳的艺术,波尔卡—法兰西对舞
Johann Strauß  Russische Marschphantasie, op.353
约翰•施特劳斯  俄罗斯幻想进行曲,作品353号
Johann Strauß  Ein Herz, ein Sinn, Polka Mazur op.323
约翰•施特劳斯  一心一意波尔卡—玛祖卡,作品323号
Johann und Joseph Strauß   Pizzicato Polka
约翰•施特劳斯和约瑟夫•施特劳斯  拨弦波尔卡
Johann Strauß   G’schichten aus dem Wienerwald, Walzer op.325
约翰•施特劳斯  维也纳森林的故事,作品325号
Eduard Strauß  Electrisch, Polka schnell o.op.
爱德华•施特劳斯  雷电波尔卡

·加演曲目

Johann Strauß   Auf der Jagd, Polka schnell op.373
约翰•施特劳斯   在猎场上快速波尔卡,作品373号
Johann Strauß   An der schönen blauen Donau, op.314
约翰•施特劳斯   蓝色多瑙河圆舞曲,作品314号
Johann Strauß Vater   Radetzky-Marsch, op.228
老约翰•施特劳斯   拉德斯基进行曲,作品228号

体验下一代微软平台开发Visual Studio 2005(3)

忙了好几天,终于又找到了一点空闲的时间来继续我们体验历程,今天我们要一起体验的是Visual C# 2005 Express Edition Beta。

Visual C# 2005 Express Edition Beta

Visual C# 2005 Express Edition Beta

可以说,打开VC#的界面,没有给我带来什么惊奇的感觉,但清新明快的启动页面还是吸引了我的目光。正如图所示,启动页上提供了一些对于体验者来说很实用的链接,其中有一项“Create a Screen Saver with the C# Starter Kit”恐怕能吸引很多像我这样的菜鸟级玩家,我们就从它开始!

按照提示,我们通过File>New>Project新建一个Screen Saver的项目,熟悉Visual Studio .NET 2003的朋友可能会很惊呀的发现新建项目时居然没有要求指定保存的路径。是的,在VC#2005中,采取了类似于Delphi、VB6的模式,只有在你要求保存项目时它才会让你指定路径,这样,对于我这样喜欢写写小测试程序的人来说是很方便的,不用担心在硬盘上留下越来越多的小垃圾项目。

好了,可以运行一下试试了,VC#2005已经为我们创建了一个可以运行的屏幕保护程序,这个程序还具有RSS新闻阅读的功能呢!程序默认的RSS地址是存放在app.config中的,您可以把它换成自己的Blog的地址试一下:)

自制RSS阅读器界面

自制RSS阅读器界面

从默认生成的项目中,我们可以看到,与VS2003相比,向导生成的代码把static void Main()从窗体类中独立了出来放到了一个名为Program的类中,这样结构对于刚上手的朋友来说可以说是更清晰了。除此之类,我们也已经可以从向导生成的代码中看到一些C#2.0的新特性。现在网上介绍C#2.0的文章已经相当的多,我在这里就不对它作全面的介绍,就看到多少说多少了。

先看生成的几个窗体的文件,VS2003中,通常一个窗体有两个文件组成.cs为代码,.resx为资源,在VC#2005中,通过运用C#2.0的Partial Class特性,把原来的.cs代码文件拆分成两个.cs文件,一个负责窗体界面构造代码的实现,一个负责其它代码的实现。所谓Partial Class特性,其实就是把一个类的的代码可以拆分写到两个.cs文件中,为实现这一特性,您仅仅需要在您想折分的类前加上partial关键字就可以了。这一小小改进实际上是有不少好处的,比如:用它就可以在窗体程序设计时实现了类似于ASP.NET的Code Behind技术。在多的个开发人员同时对一个类进行开发时,在Source Control方面也可以体现出优势:每个开发人员可以Check Out类的不同部分进行分别的同步的开发而不用担心与人它冲突。如果一个类的不同部分之间产生了冲突矛盾怎么办?一个类的元素可以有积累性和非积累性的两种,所谓积累性的,就是可以把多个部分组合起来的,比如实现的Interface,属性,方法,字段等等,非积累性的就是不可组合的元素,如可见性、基类等,要求类的每个部分对这些非积累性元素都作出一致的定义,当一个类的不同部分作出了不同的定义的时候,编译器将报错。

C#2.0另一个重要的特性就是匿名方法,很多时候,我们仅仅是为了使用一个委托,就不得不创建一个方法。比如说,我们在窗体上画个Button,双击一下,就生成了它的事件响应方法,VS其实做了不少事情,首先它得为Button.Click这个事件加一个委托:

this.button1.Click += new System.EventHandler(this.button1_Click);

然后生成相应的方法:

private void button1_Click(object sender, EventArgs e)
{
MessageBox.Show("Test");
}

当然这只是个例子,就像您现在看到的那样,这个方法也许只有几行代码,但委托还常常用于回调、异步调用、多线程等,这样的东东多了代码就会显得很拖沓。所以通过匿名方法的特性我们可以把上面的两部分代码组合起来,写成:

this.button1.Click += new System.EventHandler( delegate(object sender, EventArgs e)
{
MessageBox.Show("Test");
}
);

VC# 2005中的重构

VC# 2005中的重构

C#2.0的新特性先说这么多,VC#2005主菜单条上的一个单词——Refactor——也许很吸引人的目光,VC#2005首先在VS家族中引入了代码重构的功能,正像您看到的,它实现了Extract Method、Rename、Encapsulate Field等几个重构的模式。记得在南京的DevDays2004大会上,讲解者为了演示这个功能郁闷的试了很多次,但当时的Whidbey技术预览版就是不给面子,始终不愿意展示出它强大的功能。还好在这个Express Beta 1上,这个功能已经可以正常的使用了,以Encapsulate Field为例举个简单的例子吧:

public class Test
{
public int i;
public void f()
{
i = 3;
}
}

通过在i上右击选Encapsulate Field,就得到了:

public class Test
{
private int i;
public int I
{
get
{
return i;
}
set
{
i = value;
}
}
public int f()
{
I = 3;
}
}

它可以自动把public的成员重构为private成员并公开public的属性,并且更新所有对Test.i的引用,把它们改成对Test.I属性的使用。

说到属性,可以一提的是C#2.0中引入了属性和索引的可见性,比如,可以这样:

public class Test
{
private int i;
public int I
{
get
{
return i;
}
protected set
{
i = value;
}
}
}

这就表示了I这个属性具的get具有public的访问级别,而set则只有protected的访问级,当然,用在set和get上可见性范围是不能超过属性本身的可见性的,你不能让一个属性具有private级别而它的get却有public的访问级。

不小心又回到C#2.0的新特性了,继续来看VC#2005的特性,除了重构,VC#2005在原本已经很好用代码编辑器上又下了功夫,从图中您可以看到,它对代码实现了智能标签的功能,可以帮助程序员更好的修改代码。对于正在编辑的代码,左侧可以显示出编辑的状态,修改过存过盘的代码会标上绿线,修改过未存过盘的地方会标上黄线,此外,新的括号匹配也跟Eclipse中一样好看好用了。IntelliSense中也增加了自动跟据调用生成函数原型的Generate Method Stud功能(感觉用它实施TDD真是太好了)和插入代码片段、Surround With等功能。和VC++2005一样,VC#2005同样也增加了自动查看鼠标当前位置的符号定义的功能,同样通过称之为Code Definition View的窗口来显示。Windows Forms窗体设计器也同前面介绍的VC++2005中一样做了相应的改进,这些改进的特性都给程序员带来了很大的方便。

VC# 2005中的重构

VC# 2005中的重构

准备收笔了却发现我忘记介绍了C#2.0中的一个最为重要的新特性:泛型。其实真得不是忘了,而是我对它的了解还相当的少,建议感兴趣的朋友先去看看大师们的文章吧,我会在后面的文章中结合自己学习的心得专门介绍这一重要的特性。

体验下一代微软平台开发Visual Studio 2005(2)

今天我们一起来详细探索一下VC++2005中C++/CLI为我带来了哪些新的特性。

首先,C++/CLI引入了一些新的数据类型关键字:

ref class/ref struct、value class/value struct、interface class/interface struct、enum class/enum struct,在C++/CLI中class和struct不具有C#的语意,而是仍然保持在C++中的区别,即默认的访问级别不同。在C++/CLI中,ref class/ref struct具有C#中class的语意,而value class/value struct具有struct的语意。相应的interface class/interface struct和enum class/enum struct分别类同于C#中interface和enum的语意。在这里,以ref class为例,虽然它们是两个单词,但它们共同组成了一个关键字,也就是说,在C++/CLI中,关键字中可能会包含空格,就是要把多个单词合起来理解成是一个关键字,而不能把它们孤立开。

在C++/CLI中,关键字还分为上下文敏感和上下文不敏感的,前面提到的关键字都是上下文不敏感的,即它们无论出现在哪里,都表示是关键字,不能用作标识符。而上下文敏感的关键字则只在它们应当出现的地方才作为关键字,否则将不具备任何特殊的含义,包括可以作为标识符使用。

新加入的上下文敏感数据类型关键字有:property、delegate和event,它们基本上都对等于C#中的相应关键字。

除了数据类据关键字,C++/CLI还引入其它一些新的关键字:abstract、new、override、sealed、generic、where、finally、gcnew、initonly、literal、nullptr,它们与它们在C#中的含义基本一致,稍后我会对其中部分C#中没有关键字作介绍。

C++/CLI中还引入了两个新的运算符,^和%,它们用于支持C++/CLI中新的“名柄”的概念。除此以外,C++/CLI还引入了一些新语言构造,它们是以库的型式来实现的,不作为关键字出现。

在C++/CLI中,由于引入了托管堆,所以,内存分配方法除了C++原有的Native的栈分配和堆分配,又多出一种在托管堆上的分配,配合这一理念的语法特性就包括了句柄,^和%运算符,gcnew等关键字。

下面是一个代码片断,举例说明了在C++/CLI中使用托管代码的情况:

ref class R
{
private:
int m_value;
public:
property int Value
{
int get()
{
return m_value;
}
void set(int value)
{
m_value = value;
}
}
};
int main()
{
R ^ r = gcnew R();
r->Value = 6;
}

这里演示了ref class即托管类的用法,还有新的property关键字以及托管对象分配的方法。可以这样理解^符号,它就是一种托管的指针,相当于Managed C++中的__gc指针,用它可以指向一个托管的对象,语法上用起来与*一致,只不过得用gcnew而不是new才能返回一个^类型的指针(称为句柄)。与此同时,新增的%运算符其实就对应了C++原来的&运算符,只不过它是用于托管对象的。而新增的nullptr关键字则相当于在C#中的null关键盘,用于表示一个空的托管对象引用。从这个程序中可以看出C++/CLI从语法层面上要比Managed C++好看好用得多。

喜欢C++的人往往都是对性能很敏感,对内存分配也很敏感,虽然在托管的情况下,内存分配从来就不是一个大问题,不过很多情况下我们也希望对对象的释放作更多的控制。在C#中用using(…){}就可以保证在对象超出个区域时自动调用它的IDisposable.Dispose()方法释放资源,C++/CLI提供了更优雅的写法:

int main()
{
R r;
r.Value = 6;
}

这样就行了,注意,是个托管引用对象,所以它并不会在栈上生成,它仍会在托管堆生成,但在栈上有对它的引用,并保证在超出引用域时调用IDisposable::Dispose()方法。很遗憾,在我下载试用的Visual C++ 2005 Beta 1中,这个特性似乎并没有实现,上面的写法会出现语法错误,据说是要打上Update补丁才可以支持。

C++/CLI就先说这么多,VC的文档中Express Library for Visual Studio/Visual C++ Express Edition/Reference/C/C++ Languages/C++ Language Reference/New C++ Language Features一节中比较全面的列出了C++/CLI中的新特性,通过它可以迅速的帮助我们了解C++/CLI。

Visual C++ 2005为我们带来了C++/CLI,而Visual C# 2005同样也为我们带来了新东西,C# 2.0在C#的基础上作了很多的改进,尤其是引入了泛型,我们后面再一起来体会它吧。