2008年10月26日星期日

虬江路淘宝

自从我的磐正8RDA3G主板抽风之后,我的老电脑一直处于待业状态。我一直没有考虑好给它一个什么名份。上次为同事拍了结婚照之后,我觉得该有一台专门处理照片的机器了,我原先的配置基本不用动,只要换块主板,加个特丽珑的显示器就行了。我的CPU是Athlon XP1800+,搭配的主板可以用KT400,KT600和NF2芯片组。但我不想在上面投资太多,因此从一开始就打定主意要买二手的,花最小的代价,获得最大的利益。

原先想在pchome和pconline,taobao上面买的,但是每次都被人抢走了。于是只能瞄准上海滩最大的二手市场--虬江路。

买二手最重要是心态,就跟炒股一样。同时要做功课,认准自己要买的东西,任凭JS怎么忽悠你,都不能跟着他们走。

我在虬江路花了大概2个小时不到的时间,逛完了几乎所有的店,终于买到了一块成色非常新的工包微星K7N2主板,价格95块。可以说是非常超值。据老板说,这块板是全新的,工包批量出货拿的,我特意看了电容,散热片,PCI和AGP插槽,的确是没有用过。简直太超值了。


事实上整个虬江路NF2的主板也寥寥无几,我所有的店都兜了一下,加起来也不会超过30片。而且很多都是硕泰克,映泰之类的垃圾板子。我的原则是,二手的主板绝对不能买二流厂家的主板,要买只能买一线大厂的。为什么,因为那些二线厂家的主板寿命也就是2,3年。我的磐正主板就是活生生的例子。因此场子里面还有人推荐我磐正的,我说什么都不要。场子里面还有一块非常棒的ASUS的A7NX,可惜要150,从性价比来说不及我这块。

我这块板子是在赛格快关门前5分钟才掏到的,说来也算运气了。我之前几乎绝望了,因为场子里面基本都是754的板子了,462的板子在二手市场基本上也淘汰了。而我要的还是一线大场的NF2芯片的462主板,更是难上加难。不过我来买二手就是想买以前一手买不起的好东西的,比如可以算AGP的王者的1950PRO蓝宝石,当年2000多块的显卡,现在就布满灰尘躺在橱柜里面,罗技的蓝牙耳机之类的,这些东西看得我心痒啊。不过正事要紧,下次再来。

总的来说,在虬江路淘宝是很有意思的事情,我今年来已经很少关注硬件了,这次过去兜了一下,感觉自己还蛮喜欢这种事情的。与JS斗,其乐无穷啊。同时还能看到很多平时不知道的东西。比如我一直想买个激光打印机,全新的起码2K,而这里一个HP2015D才600;还有一套DIY的工具,包括网络工具,电工工具,都是进口的,质地看上去就不一样,开价80,感觉还行。另外就是我关注的特丽珑和钻石珑,居然让我看到一个EIZO的原膜T962,要知道这是EIZO旗舰机型,特丽珑超强色彩还原,比SONY的G520还高出一筹的极品啊。本来跟老板讲好了,可惜买好主板已经天黑,只能作罢。

2008年10月22日星期三

游戏不是这么玩的

我一向对时事很迟钝,特别是对于有微软,盗版,反黑等关键词的新闻,我从来都是略过的。但是现在我的同事已经开始用“今天你黑屏了没有?”来打招呼了,我再后知后觉也感觉到了一些不同。吗啡写了篇《整个民族心理有毛病》,仍旧秉承他一向的风格,语言尖锐,但是仔细想来的确是有道理。吗啡用的是一个IT行业从业者,受过高等教育,站在时代前端的身份来看待这件事的。而我,接触了很多不懂电脑的人,我想试着站在他们的立场上看看这件事的因果。

我在想,这件事是否是微软自食其果呢?或者是中国人自食其果呢?
在微软刚进入中国市场的时候,为了迅速扩大市场份额,他们默认了盗版的存在。反正你要用我的就成,只要不去用别人的,随你盗版还是正版。他打得好算盘,慢慢地用office 挤掉了WPS,IE挤掉了netscape,他或许想着,等到他一家独大的时候,还不是想怎么样就怎么样。他制定了这个游戏的规则。人们顺着他的规则玩了这么多年,突然,他改变规则了,那些玩游戏的还不跳起来!

当人们买电脑的时候,店里面的伙计帮他们装好了Windows,进去能看到五颜六色的界面。然后他们付钱走人。在他们付钱的时候,他们下意识的认为,这一堆铁疙瘩和里面五颜六色的界面都已经包括在他付的那点钱里面了。或许,很多人还不知道什么叫正版,什么叫盗版,版权对他们来说还是一个陌生而抽象的词语。只知道,要装软件,就去买盘。对他们来说,去街边买盘就和去菜场买菜一样。This is the way. 甚至很多人,连软件这个术语都不知道,他们可以叫出Word,IE,QQ,但是不知道这些就是软件,但这并不妨碍他们用电脑。其实美国人也这样,但是他们一开始就规定了一个正常秩序的游戏环境。

这就是这么多年来孕育出来的一种环境。这种环境的形成,政府和微软一样的领军软件企业难辞其咎。试想如果一开始,软件就是放在商店的橱窗里面出售,买电脑的时候装机店会明确告诉你价格不包含软件价格。久而久之,人们自然会习惯这样的模式。这种模式下,民众还是不用了解什么是盗版,什么是正版。有时候,你只要告诉别人,什么是对的,不用说什么是错的。这就是秩序,政府和大型软件企业在这时候就是强有力的秩序维护者。

别跟我说Windows太贵,买不起,三、四百的东西有时候还不及你一次拍拖花的钱呢。实在没钱,可以,用免费的操作系统,Linux, FreeBSD等。或许有人会说Linux,FreeBSD难用。我想说的是,这是因为在这样一个畸形的市场下面没法得到发展造成的。更何况,现在的Linux在可用性上面跟Windows相差也不多了。

或许,在这样一个环境中,不同的操作系统都能够发展起来,Windows, Linux大家各取所需,造成双赢的局面。为了构造一个独裁,垄断的环境,微软通过这种默认盗版的方式来打压其他对手,结果搬起石头砸自己的脚。政府默认这种畸形的市场不断扩大,最后不知道扼杀了多少创新成果。

有人说,就是因为盗版,中国的软件行业才能发展的这么快,我不敢苟同。我觉得正是因为盗版,中国的软件行业才发展的这么低层次,永远用别人的东西,为别人打工,我们促进了微软的发展,却限制了自己的发展。如同温水中的青蛙一样。

没必要指责那些骂微软的人,我们要骂就骂那些制定这个游戏规则的人吧。或者,像我一样,尽量离这个游戏远些。

PS: 吗啡骂那些不要脸的JS,我120%赞同。因为刚才看到有名人博客上写着“有理由相信,中国用户是全世界最热爱微软的用户”, 这句话就和“中国没有妓女”,“陈良宇没有贪污”一样可笑。

2008年10月16日星期四

Placement New的用法

在《C++中控制对象的创建》一文中,我曾经提到Placement New的一些用法。最近一段时间很碰巧用到了这个技术,因此有了更深刻的一些理解。

Placement New的原型很简单:


inline void* operator new (size_t t, void* p) {
return p;
}


可以看出,它仅仅就是返回传给他的那个指针地址,大小t不使用。
因此,我们一般先申请一块内存,然后用placement new在初始化一个对象。这里的初始化的意思就是先把那块内存映射成对象地址空间,然后再起始地址调用对象的构造函数。例如:


class Window
{
int width_, height_;
public:
....
Window(){}; // default ctor
Window(int w, int h){...}; // ctor with predefined height and width
}

void* p = (Window*)malloc(sizeof(Window));
Window* pWin = new(p) Window();
.... //use pWin
pWin->~Window();
free(p);

在上面的代码中,最后第二行很重要。一般来说,析构函数是当自动变量离开作用域时自动调用或者使用delete时调用。但是使用placement new时,不能在该对象上面使用delete操作,因此析构函数不会被自动调用。我们必须使用一种比较少见的方式——手动调用析构函数来释放在构造函数中获取的资源。

Placement new还常常用于对象数组的创建上。一般使用new[](读作array new)来创建对象数组的时候有一个缺点,就是只能调用其默认构造函数。这有时候非常不方便。

Window* pArrayWin = new Window[20]; //default ctor is called

但是使用placement new就可以让我们获得调用其他构造函数的能力。代码如下:

Window* pArrayWin = (Window*)(operator new(sizeof(Window)*20)); //
i = -1;
while( i <20){
Window* pTemp = new(&pArrayWin[i++])Window(i*i,i*i*i);
}


这里就可以使用Window类的另外一个构造函数了。在每一个Window类构造的时候就可以给其设置长和宽。
这里的Window类只有两个整型成员,这种情况下,可以不用调用其析构函数,直接delete分配的内存。因此用placement new来处理这种小型连续数据在某种程度上可以提高效率。

2008年10月11日星期六

The Big Bang Theory不太敬业

最近一直在看《The big bang theory》,因为风趣幽默,所以我反反复复的看了快第三遍了。但是今天看到一个场景,让我感觉有点失望,看看图中的包包。有没有看出来什么问题?

是的,太假了。连商标都在,宝宝里面这种鼓起来的样子一看就知道是放在商店里面展示用的,因此里面塞满了泡漠塑料,废报纸等。我估计是剧组资金不够,所以问旁边的商场借的吧,等演出结束就立刻送回去。看来美国经济大萧条已经影响很深了,连这样一个平常的包剧组都买不起了。但是我要说,这还是不太敬业,买不起就不要背包,拿演员自己的包也可以么,反正是生活喜剧。真不知道他们怎么想的。。。

2008年10月8日星期三

My VS2005 Color Scheme

我今天花了点时间改了改VS2005的配色和字体方案,把原来整体白色的效果改成了现在的灰暗的效果。主要原因是保护眼睛。白色虽然明快,对比度高,但是会反射所有的光线,而黑色则相反,可以保护程序员的视力,至少不会看着很吃力。不相信可以自己试一下,把液晶显示器的亮度调高,盯着看一段时间,然后再调暗,眼睛是不是轻松很多。

然后字体从原来的Courier New改成了现在Monaco,这个字体非常好看。也是网上很多人推荐的编程用字体。效果图如下:


我个人不太喜欢花里胡哨的配色,所以颜色看起来不是很鲜艳。这样的好处就是让眼睛少受刺激。颜色太多,眼睛受到的刺激也会增加,长时间盯着看反而会吃力。

我的配色方案如下:
Font: Monaco (size 10)
Background : RGB(25, 25, 25) Not completely black

Plain Text : White
Line Number: RGB(43, 145,175 )
Comment : RGB(135,206,235 ) bold
Identifier: RGB(207, 207, 207 ) bold
Keyword: RGB( 68, 68, 255 ) bold
Number: RGB( 0, 128, 128 ) bold
Preprocessor Keyword: RGB ( 175, 96, 255)
String: RGB(252, 71, 39) bold



在《Monospace/Fixed Width Programmer's Fonts》一文中,作者列出了他认为写程序用的字体,应该具备哪些条件:

  • Crisp clear characters.
  • Extended characterset.
  • Good use of whitespace.
  • 'l', '1' and 'i' are easily distinguished
  • '0', 'o' and 'O' are easily distinguished
  • forward quotes from back quotes are easily distinguished -prefer mirrored appearance
  • Clear punctuation characters, especially braces, parenthesis and brackets

简单的说,首先要清晰,然后才是美观。总的来说,我觉得还是有道理的。我以前一直使用Courier New就是因为这个字体很清晰,在VS2005中如果更改字体,那些加粗的都是等宽字体,也是写代码首选的字体。网上讨论的比较多的是三款字体,分别是Bitstream,Monaco,Consolas,分别是Linux,Mac,Windows三个平台上的代表字体。我选择了Monaco,这块字体乍看之下不怎么样,但是仔细看看还是很有味道的。有兴趣的朋友可以试试。

另外,这几个配色方案也是我比较推荐的:
Dark Visual Studio
Scott Hanselman's color scheme
Slimcode
Jeff Atwood

相关文章:
Programmer 最佳用字型 Monaco font
Best font for programming is...?

2008年10月5日星期日

《星球大战》中的Jedi职业级别

参考了很多RPG的规则,比如D&D,星球大战中也有职业的升级。当然这些在Wiki中都有,我当时是在看了片子之后慢慢推测出来的,后来看了Wiki之后才有了一个完整的了解。(Wiki中的条目为Jedi Rank)。这里仅限于Jedi,Sith过于神秘,影片中提到的也较少,我还没有看出明显的区别,可能游戏中有提及吧。

Youngling
拥有Force潜力的孩子,在被任何一个Jedi knight收为徒弟之前,在Jedi temple接受统一的训练(学龄前训练)。在EP2中有一段就是Yoda在训练一群孩子,Obi-Wan过去请教那颗消失的行星。在Revenge of the Sith中,Anakin残忍的杀害了所有的Youngling,另Obi悲痛不已。

Padawan
Jedi Knight或者Master的学徒,Jedi们喜欢用Padawan称呼自己的学徒,Sith则用Apprentise。在这方面,Jedi的叫法显得更加亲切。Padawan称呼自己的老师为Master。Jedi采用的是一对一的授业方式,只有Padawan通过试炼,成为了Jedi Knight之后Master才能再次申请一个Padawan。

Jedi的训练和武术、内功等一样,最好从小学起。相信大家还记得在《魅影危机》中Qui-Gon Jinn提出训练Anakin的时候,Obi-Wan说:“The boy will not pass the council's test, Master. He's too old”。那时Anakin才9岁,这说明一般的Jedi开始他们的训练要早得多。最后Qui-Gon Jinn临死前要Obi-Wan答应训练Anakin。于是在Obi-Wan的强硬要求下,Master Yoda才同意让Anakin成为Obi-Wan的学徒。

有一个细节很重要,Padawan会在脑后留一簇头发下来,就像一根小辫子。当被正式授予Jedi Knight称号之后,这个小辫子会被剪下,标志着自己的成长(当然,限于有头发的物种)。
看看下面两张图的对比,Obi-Wan在EP1:The Phantom Menance中的学徒打扮和EP2,EP3中的Master打扮。注意到第一张图中的小辫子没?


我第一次看时就有疑惑,为什么会有这个小辫子,难道是流行?那时候上海的确流行给小孩子留个小辫子,因为看起来好看。但是之后我看了The Clone War Animation之后,我才知道,这个小辫子是Padawan的标志。

用Star War Clone War中Anakin成为Jedi Knight的场景来说明一下。

经过一番激烈争论,Jedi Council终于同意Anakin Skywalker成为Jedi Knight。Kenobi对Anakin说,It's time we became BROTHERS.


进入Council,出现了激动人心的一幕。是不是特别像某些游戏中的转职的场景啊。


Yoda: Step forward, Padawan.
Anakin Skywalker,
By the right of council.
By the will of the Force.
Dub thee I do, Jedi ... Knight of the Public.

天行者阿纳金,
以议会之权,
以原力之志,
授予汝--共和国绝地武士称号!


小辫子被剪掉,Padawan正式升级成Jedi Knight。

Jedi Knight
Padawan通过一些考验,就能正式宣誓成为Jedi Knight。考验多种多样,有的是关于智力的,有的是关于技术的,有的则是心智上的。心智上的最难,一般称为“Facing the mirror”。例如Master Yoda让Luke Skywalker去面对他的父亲Darth Vader。第一次Luke失败了,第二次成功之后,Luke成为了真正的Jedi Knight。另外像Obi-Wan在EP1中击败了杀死他老师的Darth Maul而成为了Jedi Knight。总之这是一个最普遍的级别。在对外的时候,Padawan也可以自称Jedi,为了避免在称呼上的麻烦。

Jedi Master

当一个Jedi Knight成功训练了一个Padawan成为Knight,他就可以成为Master。但是如果Jedi Council觉得一个Jedi Knight已经积累了足够的经验,知识和力量,也可以提出一个考验,一旦通过此考验,就可以成为Master。

Jedi Council Member
实际上我认为这不是一个级别,而是一个职位。加入Jedi议会当然会有更多的权利,但相伴的也是更多的义务。当Council中一旦有位置空出,Council就会着手挑选合适的人进入,来填补空缺。

Jedi Grand Master
更正式的叫法是“Grand Master of the Jedi Force”。在影片中并没有提及。只出现在小说和游戏中。
只有最智慧的Master才能被推举为Grand Master。在新的Jedi Order时,Luke Skywalker也被推举为Grand Master,因为他是旧议会时代最后两个Jedi,Obi-Wan和Yoda的学生,同时创建了新的Jedi Order,以及新的议会。在整个历史上,也只有三个Jedi获此殊荣Nomi Sunrider,Yoda 和Luke Skywalker。

《The Big Bang Theory》

自从《远古入侵》结束(夭折)之后,我一直在找有意思的美剧/英剧。《老爸老妈的浪漫史》只能做开胃的小菜,但是正餐一直没有着落。

不过今天无意中看到了一个片子《The Big Bang Theory》(生活大爆炸),讲述的是四个高智商的年轻小伙子遇到了一个美女房客的故事。显然,这种故事中的美女基本上是胸大无脑,但是太过愚蠢也不招人喜欢。高智商的小伙子们也不可能情商<0。下了几集看了下,还真是有意思,尤其是美女是我喜欢的邻家女孩的类型,挺温柔的,绝对不是乱来来的那种。想想也只有这种女孩才能打动才子的心。后来看到编剧是Bill Prady我才放心,他是Gilmore Girl的编剧,擅长生活中的小幽默加上一些会心一笑,再加上一些小小的温馨,感觉不咸不淡,口味正合适。

P.S. 我终于看到比Ross更搞笑的书呆子了,而且还是4个!!!

以下摘自verycd
--------------------------------------------------------------
(译自CBS官方新闻发布稿)这是一部以 "科学天才" 为背景的情景喜剧,这倒非常罕见。主人公Leonard (Johnny Galecki, "Roseanne") 和 Sheldon (Jim Parsons "Judging Amy") 是一对好朋友,他们的智商绝对高人一等,因为他们对量子物理学理论可以倒背如流,无论你问他们什么问题,都难不倒他们。但是说到日常生活,这两个不修边幅 的男孩就彻底没了脾气--生活中柴米油盐这些看似简单的事情,却让他们有迷失在太空里一样的感觉,他们所掌握的那些科学原理在这里根本没有用武之地。
直到 有一天……隔壁搬来一位美貌性感的女孩Penny (Kaley Cuoco, "8 Simple Rules..."),顿时吸引了两人的目光。Penny是个剧作家,平时还在饭店打工,她个性开朗,待人友善,最重要的是--她最近刚刚变成单身。
但 令Leonard和Sheldon失望的是,美女对两人都没有意思,反而对花花公子Howard Wolowitz(Simon Helberg, "Studio 60 on the Sunset Strip")产生了好感。Howard绝对是那种可以俘获女人芳心的帅男,他甚至称自己是加州理工学院的"卡萨诺瓦"(1725-1798,意大利冒险 家,以所写的包括他的许多风流韵事的《自传》而著称,后来该词被引申为"风流浪子,好色之徒")。喜欢有事没事围着别人转悠,大谈特谈相对论的 Rajesh Koothrappali (Kunal Nayyar, "NCIS")也引起了Penny的兴趣。

一个美女和四个科学怪才的故事就这样在笑声中悄然开始上演……







2008年9月30日星期二

名人译书要慎读

最近我在看《C++语言的设计与演化》(英文名:The design and evolution of C++ )一书。我买技术书,只要有原版的,我基本上都是买原版,宁愿看得吃力点也要买。为什么,就是怕了那些胡乱翻译的中文版,知识没学到不说,还有可能曲解原文,把我往错误的方向上领。那我自己看原文一定就能理解正确?非也,我的英文虽说还可以,但是老实说,比起那些成天译书的人总是要差些的。但是就算我自己理解错误,那也是我自己的事,怪不得别人,但我却不希望别人来误导我。

以前,我对一些有名的学者翻译的书还是比较认可的,语句通顺,用词准确规范,还会顺带纠正些原文的错误,从实际效果看的确能加快阅读和学习的速度。一般性这些人的名字也保证了译文的质量,让我比较放心。但是现在,在这种浮躁的社会气氛下,名人也开始擦烂污了。

就拿我手上的这本《C++语言的设计与演化》来说吧。译者为国内知名学者裘宗燕老师。裘老师译过很多书,在网上评价很高。但是很不巧,我就买过这一本,因此我也只能拿这本书说事。这本书语句还是很通顺的,用词也中规中矩,符合技术书籍的性质。而唯一让我气恼的是他也有名人的通病,喜欢自创术语。大家都知道,技术术语一般都是非正式的一种约定成俗的说法。但是时间长了,大家也熟悉了。一个大家都使用,都熟悉的术语就好比标准,有利于沟通,有利于教育和学习。然而,有部分人就喜欢标新立异,他的想法是什么,我不得而知,也不想过问,但是我最恨这种做法。在《C++语言的设计与演化》这本书中,一些约定成俗的术语,比如构造函数(constructor),类型转换(casting)等都被改头换面。比如构造函数变成建构函数,类型转换偏离愿意更多,变成了“强制”。老实说,我一开始还蒙了呢,当第一次看到这个术语,我在想,C++里面有叫“强制”的特性么?后来下了本原版pdf,才知道是casting。其实,在这里用强制则完全没有理解casting在C++中的意义。类型转换本身有强制转换和非强制转换之分,怎么能一棒打死全叫强制呢。其实这里翻成类型转换或者台湾术语转型都是可以的,至少是让人比较容易接受的。但总的来说,这本书其他地方翻的还行,没有明显的逻辑错误,可能就是这几个地方裘老头犯傻了一次吧。

我见过术语篡改最厉害,翻译的最过火的莫过于翻《UML精粹》第三版的徐家福老先生了。曾有人提到这位老先生的地位,似乎也是中国计算机界的泰山北斗了。不过我对这种一向不感冒,我喜欢看到实际的东西。而我看到的却是一本几乎翻成文言文的技术书,用时下流行的话说,我被雷到了。老先生文学功底自然不俗,但是用来翻译技术书籍,除了卖弄风骚,我想不出其他评价了。当然,里面的术语几乎都被重定义过了,还好老头子没有做绝,把原文单词放在那里,也幸好我比较熟悉,直接过滤中文,看英文,最后实在受不了了,下了本原本,嗯,martin fowler的英文的确不错。

另外要说的就是挂羊头,卖狗肉,也就是俗称的贴牌。我们从代加工行业熟悉了这个词,现在已经引用到翻译技术书籍上头来了。很多书,挂着名人的牌,实际都是别人翻译的。比如一些有名的教授挂名的书,实际上都是其研究生翻译的。这也算是一种潜规则吧。想想这些教授也一大把年纪了,犯得着挑灯夜战,一句一句去翻译技术书籍么。这点稿费还不及人家走个穴呢。不过有些教授还是有良心的,至少最后校审一下,有些就是黑了心,直接挂名就发书了。大家可以想象这个书的质量。我感受比较深的有几本书,barbara liskov的《程序开发原理--抽象、规格与面向对象设计》,bjarne stroustrup的《C++编程语言特别版》等。因为里面都有对原文的曲解和误解。不过这也难怪,我也是对着那几句话反复研究才搞懂作者的真正意思的。对于译者来说,那是有时间限制的,不可能像我那样逐字逐句地去斟酌。另外,这两本书,也是我看过的最难的书。但是,我觉得越是难的书,越应该买英文原版,好处么,自己去体会吧。

说了这么多,我觉得比较好的一个模式是,买本中文书,再下载个英文原版,或者买英文版,下载个中文版。目的就是对于那种不大可能错误的地方花最少的力气,用最快的速度通过。而比较有价值又比较困难的地方,则使用原版来保证质量。这也是我现在使用的模式。

2008年9月26日星期五

C++中控制对象的创建

在C++中,可以通过很多方法来定义对象的创建方式和地点。

1. 将构造函数设为私用,可以阻止直接创建。
这个方法是最常见的,恐怕我们最熟悉的就是单件模式(Singleton)。通过类的静态方法来创建对象,以达到控制对象个数的目的。
实际上,这种情况下也就直接阻止了派生。因为C++要求派生类要显示或隐式调用基类的构造函数。但是,真的没法派生了?当你要为这个类增加功能,又不想破坏现有的代码时,你会怎么做呢?
看看下面的代码:


class B{
friend D;
B(){};
}

class D{
public:
D();
D(int);
}

D d;

class DD:public D{}; // error, DD::DD() cannot access

是的,可以通过友元来获取访问权限,这样就可以在原来基类的基础上扩充功能了。而且这个派生类仍旧延续了之前的语义,无法被继承,因为DD无法访问在最上层的B::B()。

2. 利用私有的析构函数阻止派生,堆栈和全局分配。
析构函数声明为私用就可以避免堆栈和全局分配。这样做还能防止随便使用Delete,这种类的典型使用需要一个高度优化的自由存储分配系统。

析构函数声明为私用也可以用来阻止派生。这时候,构造函数最好也设计成私有,这样可以保证创建和销毁的语义相同。当然,取巧的方法也有,只要简单的重载delete操作符即可。但是这样恐怕只能通过编译,仍然无法访问基类的析构函数,因此可能会造成内存泄漏。

3.阻止复制的语义
把复制构造函数设为私用就可以防止复制构造,同理可以用在赋值操作符上面。按照Effective C++的建议,当显式提供了复制构造函数,最好也要提供赋值操作符,同时,他们两个在复制对象内容上有一致的语义。

4.用Placement new指定对象的内存地址
Placement new语义是用户自己指定一块内存,用来存放类的对象。
一般使用new来创建对象,对象的存放位置无法控制,只能由系统来确定。
而Placement new却可以控制对象的存放位置。

Class X{
//....
}

void * pv = malloc(sizeof(X) *1000);
X* pX = new(pv) X();

事实上这和一般的new区别不大。一般的new是先申请一块空间,大小为sizeof(X)+delta。(delta是cookie的大小。cookie是用来记录在自由存储区请求内存大小及其他信息的一个系统实现,隐藏在应用程序背后,我们看不到,也不需要管,在window和unix上cookie的大小略有不同。)然后再把这块空间的首地址转换成X*,接着在上面调用X的构造函数,填充这块区域,完成初始化。

Placement new只不过是自己决定了空间的大小,以及确定了起始位置。Placement new主要用于批量构造对象,比如1000个X连续排在一起。这样一方面减少了cookie数量(从1000->1),也能够使访问更迅速(在一块连续的存储上)。

但是注意使用placement new时可能会造成内存泄漏,也就是在Placement new所返回的内存中,如果有指针指向其他的自由内存的话,当调用构造函数之后,很可能把该指针覆盖掉,这样那块自由内存就“丢失”了。

2008年9月25日星期四

Track Active Item in Solution Explorer

我现在所在的项目规模很大,在solution中的源文件就有几千个。平时编辑的时候要全部展开是不可能的,特别是对于我这样的新进员工,一下子接触到这么大的Project还真有点摸不着头脑。

这几天我发现一个问题;当我在编辑某个文件的时候,我很希望看到Solution Explorer同时帮我定位到那个文件,这样我可以看到该文件在项目中的哪个项目的哪个子目录之下,这有助于我了解程序的逻辑结构。同时也因为这个项目中的文件的物理结构和逻辑结构完全对应不上,使我没法通过物理结构直接映射到逻辑结构(也就是在Solution Explorer中的树结构)。因此,Track Active Item这个功能对我而言很有必要了。然而,当默认安装好VS2005之后,这个功能是没有的。

于是我很愚蠢的花了3个多小时时间,研究了VS2005的宏编程,写了一个宏,当我选中某个文件的时候,Solution Explorer会自动定位到那个文件,必要时会自动展开。还洋洋得意的把这个宏发给同事。结果,同事告诉我,在VS2005中早已有这样的设置,我这是在重新发明轮子的傻事。

VS2005中的设置在Tools->Option里面,如下图



另外,这里也附上我写的宏,以纪念这次愚蠢的行动。


Public Sub LocateFileInSolutionExplorer()

' Get the UIHierarchy
Dim oUih As UIHierarchy = DTE.ToolWindows.SolutionExplorer

' Check if there is solution exists
If (oUih.UIHierarchyItems.Count = 0) Then
Return
End If

' Get the top level item in UIHierarchy.(solution)
Dim oUihSln As UIHierarchyItem = oUih.UIHierarchyItems.Item(1)

' Reverse finding corressponding parent until solution node.
Dim oItem As Object = DTE.ActiveDocument.ProjectItem
Dim oPath As String = oItem.Name

While Not (TypeOf oItem Is Project)
oItem = oItem.Collection.Parent
oPath = oItem.Name & "\" & oPath
End While

'Construct item path
oPath = oUihSln.Name & "\" & oPath
'Select this file
oUih.GetItem(oPath).Select(vsUISelectionType.vsUISelectionTypeSelect)
'Activate the solution window so the selected file is hilighted
DTE.Windows.Item(EnvDTE.Constants.vsWindowKindSolutionExplorer).Activate()

End Sub




这个事情给我的教训是,当遇到问题时,首先问问周围的人,然后Google一下,再去Usenet问一下,最后才自己动手。除非是想学习某样技术,否则没有必要浪费时间重新发明轮子。

2008年9月24日星期三

The Returns of Heroes -- SE3

英雄第三季悄声无息的突然出现了。我原来以为编剧已经编不下去了,也就放弃了追片。没想到在不经意间英雄回归了,而且一下子出来了两集。不过最近实在太多事情,先下了再说,等积累到3,4集再一起看。

看了看海报,几位主角都越发显得老练。啦啦队队长克莱尔显得成熟了许多,褪去了以前的青涩,充满了魅力。一直显得很初哥的Peter从海报上看起来也不太一样了,不过他的风格就是那样,能力再强还是一副懦弱的样子。最有看头的应该还是塞拉,深陷的眼窝,聪明的头脑,超强的邪恶力量,这次终于有能对抗正义的邪恶力量了。胖子警察Matt,老实说总给我一种有着很强的力量,却一直缺乏方向感的人。这种人根本没法发挥出应有的力量。

总的来说,英雄中的“英雄”们都是平民老百姓,每个人的性格都有缺陷,不过正是因为这样,才让人觉得有意思。否则弄成生来就知道自己的使命的超人或者美国上尉就俗套了。也许80年代还能这样搞搞,现在是21世纪,人们喜欢的就是多元化。

2008年9月18日星期四

与侯捷面对面

侯捷先生这两天来我们公司做C++培训,使我第一次有机会亲眼见见这位国内的大牛。

侯先生给我的第一感觉就是儒雅,平易近人,非常认真。知道侯先生已经是7,8年前的事了,侯先生对国内计算机教学最大的贡献就是引入了很多名著,当然主要在于C++和Java编程方面。我从各种侧面都了解到侯先生的为人非常令人钦佩。这次面对面聆听他的培训,更是感受颇深。


侯先生的教学态度是我遇到过的所有培训老师中最好的。9点钟开始的培训,我8:40到发现他已经在那里了。他非常喜欢和下面的人互动,鼓励我们多问问题。每天我们都会提出很多问题,有些问题他无法解答的,他会一一记下,晚上回去做功课,第二天给我们答案或者和我们更深入的讨论。侯先生不是圣人,所以他不可能什么都懂,我们有时会提出更好的或者相对来说更合适的解答,侯先生一定会欣然接受。第二天就会在他的slice里面反映出来。


侯先生的治学严谨其实在他以往的著作中可见一斑。我以前读《深入浅出MFC》的时候就相当佩服他能够将这么大的一个库剖析的这么清楚。我也看过很多源代码,但从来没有哪次能像他那样把思路理得这么清晰。这次他给我们讲了STL中的内存管理,也就是allocator。我有一次深刻的体会到他在这方面的功力。他能把一段指针满天飞的代码,不光读懂读透,还能画出非常直观,非常漂亮的示意图出来。把对象在内存中的布局,每一步的变化,像连环画一样画了出来。如果我这样说你觉得没什么,你可以试试,拿出几百行的代码,画画它们在内存中的变化,看看你能做到什么程度。侯先生不会放过任何一个小细节,有时候简单的一句话,却包含着非常深刻的意义。看代码,学代码,真正有价值的,其实就是这些。把这些搞懂,我们才能不断进步。否则,就算我们看过无数代码,还只能停留在表面。这就是他这几天教给我的东西。


侯先生的专注相当令人钦佩。侯先生自己也是一把年纪了,但是还能这么专注的研究技术,真是让我汗颜。现在搞技术的浮躁的人忒多,很多人做了一两年基本上就想转管理了,说做技术没有前途。有些人做了几年C++,看到.net流行了,就去做.net,过会儿又做做JAVA,最后年纪也大了,却一事无成。候先生这么多年来坚持不断的在这个领域内勤奋耕耘,才能有今天的成就。其实我也是经常会摇摆不定,有时候想放弃技术,但是不知道是幸运还是不幸,每次都有客观或者主观的原因把我拉回来。

天下无不散的宴席,和侯先生的接触也就是那短短的十几个小时,但是他给我展示了另外一个更有意思的世界。

2008年9月13日星期六

dev.chromium.org被封

Chromium一出来,我就一直关注着dev.chromium.org,我知道我的能力帮不上什么忙,但是我想学习一下。毕竟这是googler写出来的程序,无论怎么样,总比我这个半吊子要强的多了吧。


但是从前天开始似乎dev.chromium.org就进不去了。公司的路由是德国的,因此我能进去,发现第一个帖子就说dev.chromium.org被G××封了。G××真是越来越霸道,简直就像以前的东厂和西厂,封人没商量。事实上G××对google的产品总是青睐有加,是不是的去捏一把,推一下。就没见它对MS,Yahoo!的产品有什么动作,这背后到底有些什么呢?

2008年9月12日星期五

英国一所大学提供Jedi武士训练课程

从08年11月起,英国的Queen's University Belfast 将会提供一门非常有创意的公开课程,这门课程将会教授学生使用星球大战中的绝地(Jedi)武士的心理学来掌握交流和发展人际关系的技巧。课程的教材叫“Feel the Force: How to Train in the Jedi way”,教程中提供了在真实生活中隐藏在Jedi们的引导别人思维的把戏(Mind Tricks)之后的心理学技巧。并且保证能为学员介绍在星球大战中的很多概念,比如平衡,命运,二重性,父性,法西斯等。这门课程价格不贵,大多数学生都能承受的起。

事实上,学校的初衷不是这门课本身,而是希望通过这种有趣的方式来传达给学生们一种持续学习的理念,使他们保持终身学习,因此学院把这门课设为公开课。学生们学习的不仅仅是星球大战的电影,还有电影中涉及到政治和社会学的问题。

在这门课之前,UK的第一个Jedi church也刚刚建成。你可能要问,什么是Jedi church,但事实上我也不知道什么意思。但它说明了一点,英国人也喜欢StarWars。否则为什么别的不选,而要选一个被称为boy film的商业电影作为研究对象呢?估计卢卡斯听到这个消息,开心的鼻子都要笑掉了。不过也可以说,Star Wars中的这种心理学技巧是简单而容易学习和应用的。该教的知识都有,书本不是枯燥的定义和文字而是电影,学院在引导人们快乐而持续的学习上真是煞费苦心了。

P.S.
Jedi的引导思维的把戏可能不一定有人注意,但是打过Star Wars游戏或者看电影比较仔细的人一定会注意到。比如在Ep 4,Qui-Gon Jinn在Tatooine上为Anakin赎身和Watto(那个会飞的丑陋奴隶主)打赌的时候就用了Mind Trick。在Eq 1,A new hope 中,Obi-wan Kenobi(老年)带着luke去飞机场时候也用了Mind Trick来控制帝国士兵躲过身份盘查。这项技巧在谈判时候特别有用。但是对于意志坚定的人(生物)是没用的。

消息引自:
http://idle.slashdot.org/idle/08/09/11/1648230.shtml
http://www.telegraph.co.uk/news/newstopics/politics/education/2798657/Star-Wars-Jedi-Knights-course-offered-by-Queens-University-Belfast.html

2008年9月10日星期三

不用stylish了

我一直使用stylish很久了,几乎把google, yahoo的很多产品都该了界面。今天,突然心血来潮想回到以前简单的界面看看。没想到这一看就出事了。

我尽然觉得意见简单的界面反而有浑然天成的美,难道是我的审美除了问题?等到我把reader, gmail, calendar等全部变回原样后,我才发现,google的产品的UI设计是真正的返璞归真,简单而和谐,感觉浑然一体,非常自然。

我决定,放弃浮华,接受朴素。再见了,stylish!

2008年8月28日星期四

马路杀手猖獗

今天我到公司又晚了,很巧的是,今天晚到的原因和我这个月第一天上班的原因一样。
我乘坐的大桥五线在花木路路口和小轿车零距离接触了一次。大桥五线是直行的,正打算进站,小轿车是打弯出来的,按照交规,小轿车应该让直行的巴士。可惜,开车的无一例外都是年轻气盛的小伙子,都妄想加速冲刺超过大桥五线展现自己的车技。结果两次都是小轿车撞到了大桥五线的尾部。这说明什么,说明大桥五线已经在很前面了,而且正在往边上靠,这时候有经验的驾驶员都不会蛮干,而往往就是这种志得意满的新晋车手会不顾一切的来上一下。这种人就是所谓的马路杀手!私家车越来越多,马路杀手也越来越多。

相撞后这种人马上就下车和巴士司机理论,就算警察来了也拖着司机不让走,搞得满满一车人气愤得直想给他两个巴掌。这时候大桥五线上的人大多是去张江上班的,大家都是算好时间坐车,这样一弄,势必要迟到,我们公司还无所谓,但是有些公司就会扣奖金。而且现在是上班高峰,坐过大桥五线的人都知道,这辆车在世界最挤的公交车中绝对能排进前三。前面一部车的人,起码后面来上十几辆车才有可能拉光。而且这个时候一辆出租车都不可能叫到,这条路上面也就大桥五线一辆公交车。这真是叫天天不应,叫地地不灵。

我是等了四辆车才勉强挤了上去。这个路口真是马路杀手高频出现地段,我一个人在24天内已经遇到两次,不知道以后的日子还会遇到多少次。我曾经搭同事的车时心里嘲笑他胆小,开车过于谨慎,要我肯定开得飞快,现在看来,如果我还有这样的想法,我势必也会成为一个马路杀手。

2008年8月25日星期一

海湾键盘再次报废

我的第三块BenQ海湾键盘终于报废了,寿命勉强超过1年。
还记得我一年前写的《海湾键盘,让我对你说爱还是恨》那时候是我第二块海湾键盘了,由于这个键盘的手感的确很好,我还是买了第三块,结果国货的质量还真是不能恭维,才一年,又坏了,先是某个键没了反应,接下去就是一大批键没反应。
BenQ键盘保证在一年内是包换的,可惜我这个键盘超过了20几天,不能换了。不过也好,让我对其死心了。BenQ键盘,就是一个绣花枕头,价格贵,要110块钱,都快赶上2块Dell标准键盘了,里面却是一包草。公司里面的Dell键盘,用了快3年了,一直好好的。家里的BenQ在使用时间上大概只有公司键盘的1/4,还一年就戈屁了。这种硬件厂商,奉劝大家还是不要去买了。
这次打算买罗技的标准键盘了,价格好像才79,除了insert,delete等键位是竖过来变成两列外,其他和标准键盘没什么两样,据说手感也不错。而且罗技的东西质量还是有目共睹的。

2008年8月20日星期三

vim很牛

新公司不能用盗版,对此我首先觉得烦恼的就是文本编辑器。Notepad是不可能了,以前一直用Emeditor,可惜也是盗版。没办法,只能重新找个替代品。正好以前一直想学习学习vim或者emacs,于是我选了Vim先学起来。这两天捣鼓了一下,弄了个模拟IDE的界面出来,在这里秀一下。

左上角是winmanager,用来浏览文件夹,创建文件/夹,增加删除文件,打开文件等。
左下角是taglist,用来显示当前文件中所有的tag,以函数,变量,宏,类等进行分类。
右边是源代码编辑窗口。

怎么样,看起来是不是和一个ide差不多。

2008年8月11日星期一

打算下NBC的奥运开幕式转播

在看完央视的开幕式之后,我总是觉得差强人意,这两天在网上逛,才发现是垃圾导播的问题。那个镜头切得烂啊,把无数人的心血弄成这样。虽然我不是张艺谋的饭,但是我也希望对他有公平的评价。全世界人民都说好的东西,不可能有如此平庸的表现。

据说NBC的转播做得非常棒,有很多我们没有通过央视看到的唯美画面。

nbc的版本可以通过bt下载,也可以在这里下载六个片断。

附上清华BBS的评论

===============================================
附:NBC文字版(转载自水木清华)
发信人: lifeforever (如何度过这段岁月), 信区: Olympic标 题: 奥运会开幕式NBC 文字版发信站: 水木社区 (Sun Aug 10 00:45:29 2008), 站内
央视就不知道以人民群总喜闻乐见的方式直播奥运开幕?!?!
该童子应该是个在美华人,主要以美国主持人的角度几乎是做了个直播,呵呵。。我们这些无福欣赏NBC版本的,可以看这个解解馋。。
1.我日,震撼!震撼!震撼!震撼!美国NBC的2008 北京奥运的宣传片,花了几分钟全面介绍中国,长城,中国人,5000年历史,桂林山水,中国人的奥运梦想;那个音乐配的,靠!让我有看Michael Jackson - History开幕的感觉!
米国人,就是比加拿大强!希望坚持住,后面不要缩卵 + 阉割!!!
2.又开始介绍,北京的城市建设,回顾老毛,哈哈哈……
到现在为此,都是正面的声音,只关注在奥运,暂时还没废话!
现在开始大势宣传奥运火炬在法国受到的侮辱,说,全中国人民愤怒了!米国人,继续扇法国人的狗脸……呵呵
开始介绍四川大地震,介绍中国的地大物博!也开始说88事件,以及中国国内存在的一些抗议的事情,但是,给人感觉,是在叙述事实,不是加拿大那种,酸溜溜的口气……
3.主持人还在不断的介绍中国,show自己的中国的朋友如何说,等等……
采访运动员了,专注在体育和金牌,和老布的全家,不错,这才是大家想知道的内容……
我们想了解奥运会,而不是一边欣赏美丽的表演,一边却不时要吃那些**加拿大CBC主持人抛出来的苍蝇!
4.开始转播老布入场,挺好玩的,老布到处开始拍别人的肩膀!
日,开始的大钟,也没看到,该死的CBC!!!
5.米国的主持很到位,什么都懂,国歌,歌唱祖国,唱歌的小孩,来源,叫什么,56个小孩子,怎么选出来的!
唉,对比一下加拿大,米国真是不错,不错,表扬一下……
对了,升旗的时候,他们专门提到了56个孩子,和升旗的军人,军人保护孩子,就是保护国家的未来,米国人,你还真了解中国人的思维!
正在介绍世界上最大的LCD屏幕,就是地上的卷轴,总算知道那是什么回事了!
6.美国主持人太T M D五毛了,看到了竹简表演了,他们开始吹嘘说,强大的中国传统文化,2500年的历史,世界上还有谁能够说比这更强?还有4大发明,不好意思,4大发明的是中国人的……
我鸡动了!我被米国人给打动了了!靠……我日你,米国人!
7.刚看完活字印刷表演,表演到鲜花的时候,一个主持人说,“It’s unbelivalbe,不知他们到底怎么做到的?”另外一个主持人回答道:“Peoples!”
Visa, 可口可乐的广告,简直就是奥运宣传片!非常有格调,给Visa卡广告做背景解说的好像是The Dark Knight里面的Morgan Freeman。
8. 评价太高了,现在开始调侃,说现在很多人,肯定在北京的麦当劳里面,买一个Big MAC,然后,坐在里面看开幕式,呵呵呵,这两个主持人,YY的能力和TF不相上下…呵呵呵,日,第一个用非美国、奥运、或者中国作为广告的竟然是“联想 ”的Lenovo ThinkPad笔记本!
我日,哈哈哈,他用日本的相扑运动员做的广告创意!!!
谁说不是呢,中国人,很强,很暴力!
9.开始赞美太极,一个主持人说,“If you love the 太极 master, how about 2008 of them?” 呵呵呵
然后开始赞美,这2008个怎么表演的呢?这么圆,而且,看起来,地上还没有什么标记一样的东西。
还说,现在的表演,寓意着,中国将消除污染的重任交给了他们的孩子们,只有孩子们,加上太极的和谐,才是中国在未来几年内的希望。
10.主题曲听完了,五毛的美国主持人,又来了:
我认为,在接下来的比赛中,可能会有一些争论;但是,今天晚上的开幕式,我不认为,任何人,可以质疑这个开幕式,It’s stunning, stunning, stunning.连续用了3个stunning,呵呵呵!
有很长一段时间,两个主持人一句话都没说,看来是沉浸在表演中了。
11.入场式已经开始了,看看美国怎么弄。
然后,开始调侃中文排序,说,如果你看到一个 letter of A 的国家在 letter of R后面出来,不要惊讶,这就是中文的排序!
12.日本入场了,主持说,中国人主办的这个奥运会,是非常温暖(warm)的一届,看他们对待日本人和中华台北的入场,就能感受到他们的热情,虽然他们和日本之间,有很不愉快的经历,和台湾之间也有一些争执。
HK入场了,开始介绍HK回归的情况。呵呵呵
13.…鉴于中文排序,老美可能转不过来,所以NBC在屏幕下方加了一个彩条,上面有5个国家的英文名字,以正在入场的为第一个,这样的话,按英文排序的人,就容易了解了。
而且,上面有这个国家的全名,缩写,人口,多少运动员参加这次奥运会,入场的时候,专门介绍这个国家的运动员,国家背景,没有乱说一些有的没的,呵呵,挺好,很专业的感觉。
14.巴基斯坦入场,呵呵呵,全场欢呼声好清楚,这一次。
主持人介绍了一下巴基斯坦现在的情况,总统为啥没来,等等,就过了。
古巴进来了,主要谈刘翔和古巴小将罗伯斯之间的这一次的争斗!
15.印度人进场了,美国主持开始公开搞笑印度的运动,说对比印度的人口和中国的人口,再比比他们在奥运会上取得成绩,等等,呵呵呵。
印度尼西亚进来了,他们说,中国人应该给印度尼西亚热情的欢迎,因为在那里,有着第二大人口的Chinese生活着。呵呵呵
16.加拿大入场了,米国老大哥,完全不顾加拿大的面子,竟然说加拿大,这么大的国家,派这么多运动员,怎么连一块金牌也没拿过!
不会吧,加拿大怎么也拿过一块金牌吧?谁来confirm一下?
17.伊拉克入场,主持人,他们应该感谢一下中国奥运,本来是来不了的,后来国际奥委会努力,最后还是来了。然后,说,中国观众给了伊拉克很大的欢呼。然后,镜头切向小布夫妻,呵呵呵。
伊朗,他们说,可以很明显的感觉到观众对待伊拉克和伊朗的不同。(暗示,伊朗的欢呼明显少很多,不过感觉好像的确如此?)
18.苏#丹来了,他们主要集中在美国运动员因为苏丹的问题而被拒绝签证,说该运动员非常生气,表示自己是关心苏#丹的问题,不是要抵#制奥运,等等……
还是围绕运动员说事,没有扩大到国际关系话题,还行。
19.开始赞美我们的白衣XS妹妹们了,呵呵呵,终于找到机会说这些漂亮的妹妹了,说这些啦啦队的妹妹,已经跳了至少1个多小时了,还有至少20多个国家还要出来……
老米心疼XS妹妹了,兄弟们不能掉以轻心哦……
20.俄国来了,介绍完了队伍之后,开始大谈俄国入侵格鲁吉亚,说俺们的小布同志这次在北京,要好好的和小普通知好好的谈谈这个问题……哈哈哈
美国进来了,美国人大吹,说,听,观众们的欢呼声,多么响亮!哈哈哈,然后,开始吹美国以前的夏季奥运会的战绩,说今年,将会面临来之中国的强大的挑战。
接下来,开始介绍运动员,看来他们对NBA球员还是很感兴趣哦!
还在介绍米国队员,呵呵呵,恨不得一个个介绍……
21.荷兰入场,主持人说,自己的老婆是荷兰的,他老婆支持荷兰运动员,他支持美国运动员,现在,就是他们的孩子,被夹在中间,不知道该支持妈妈还是爸爸,呵呵呵,很人性化,是不是?
22.正在介绍斯洛文尼亚进场的时候,其中一个五毛主持,非常感慨,又开始说了:
在奥运前,很多人都大谈政治,争斗,人权,但是,请大家看看,就在现在(in this field),你看到全世界各个国家的运动员入场,互相握手,留影,打招呼,这才是真正奥运,应该如此(the things it should to be)
23.北朝鲜来了,主持人直接解说,这是世界上最最被孤立的国家(the most isolated country),但是,看中国现在是如何对待他们,接着提到了6国会谈;还提到了什么英雄什么的,一下没记住
24.蒙古来了,呵呵呵,主持说,他们是中国的一个邻居,good luck for them with their population,嫌他们人口太少了?呵呵呵
然后,开始说,据调查,中国北京的污染,很大一部分,都是外蒙古带来的,他们住在沙漠和戈壁滩上面,北京的dust,大部分都是从他们那边飘过来的,然后,还拿美国国内的相邻的两个洲(一个是的德克萨斯,另外一个没记住)打比方。
25.德国来了,除了评价旗手NBA球员的脑袋以外(一个五环图案在左边),然后就是说,德国合并后,奖牌数量大减,世界排名下滑的很厉害;所以,近年来,德国人开始使用原来东德的方法来训练他们的运动员,借以提高他们运动员获得奖牌的能力。
26.中国出场,主持人:
呵呵呵,德国虽然用了NBA球员作为旗手,但是,他怎么可能高的过中国的姚明呢?哈哈哈,姚明比他还高半尺。详细介绍四川地震中的小孩子,他如何救他的同学,如何被压,后来媒体采访他,为他为什么这么说,孩子说:“这是我的责任!”
赞扬中国,这是个伟大的国家,13亿人口住在这里,他们非常人性化。
赞扬中国在1984到美国参加洛杉矶奥运会,没有和苏联一样抵制!
看看,这些中国运动员,一个头挨着一个头,他们里面,有可能有多都是非常专业的专业运动员,这些运动员,都会去抢金牌!
接着介绍中国体育的优势和一些细节。
91000人正在为他们的国家欢呼,全部都站起来了,欢呼,为他们的国家!
这一届奥运会,有超过400个的中国运动员,今天他们中间的369都来到了现场!
一个主持人说,我需要告诉你们,你们要到现场来,才能感觉到现场的气氛,直到中国人进场,你才会感觉到,中国人的长时间对奥运会的期待,从2001年开始的长时间的等待,终于,在今天……
主持说,看着姚明和那个地震中生存下来的小孩子,无论是你黑,还是白,是高,还是矮,你看到这个情景,你都会为这个情景所感动……
虽然还没结束,但是,我们现在就可以这么说,直到现在为止,我可以很肯定的告诉你,这个开幕式,已经大大的超越了我们的期望值……
主持人学中文,说了一句不是很标准的普通话:“百年梦想!”
27.升奥运会旗,主持人:
镜头再次给了姚明和他肩膀上的小孩。
奥运会旗子进来,中间走棋过场直接删除!
解说:奥运会会歌,是希腊语。由孩子们演唱。
解说:中国承诺给我们一个和谐的奥运,在这一个,听着孩子们唱奥运会会歌,我们感觉到了,所有中国人聚集在一起,给了我们和谐的感觉!
28.最后的火炬传递开始,Olympic Flame来了:
介绍许海峰,第一个金牌获得者……
介绍李小双……
今天有16000多对,在北京,结婚……
我们很期待,到底会怎么点火呢?应该是很刺激的,还有几分钟,就知道了……
逐一介绍每一个传递火炬的运动员!
介绍孙晋芳,介绍中国女排,特别说明了,不能说是奥运金牌,是世界冠军。
火炬传给李宁……,李宁飞起来!!!
Wooow, woooooow… 两个主持人一起惊呼了!!!
下面直接翻译主持人的话:“我们都估计错了!我们设想的点火方式,统统不是!!!
我们谈了太多次了,怎么也没想到,他们会跑到主会场上面去跑步,点火!
呵呵呵,我真的不知道,这到底要训练多久,才能这样跑???
李宁要在上面跑整整一整圈!!!
李宁,6块金牌的获得者!
30分钟前,这个火炬都没有的,怎么现在跑出来了???
点火了!
Waaa, waaa, wooooooow, 哈哈哈!两个主持人一起惊呼大笑!
主持人长时间无语,我知道,他们都鸡动啦!!!
点火后的烟火
继续无语,只是做了很官方的介绍,说Games正式开始,等等……
29.点火完毕,记者下去采访:
采访姚明:你有啥米感觉?姚明:很兴奋,不仅仅是我,所有中国人!等等大话
采:你抱着这个孩子,对中国来说,有什么意义?姚:他代表了中国的未来,20年后,你仍然会记起今天,他代表了中国的孩子,中国的希望,等等大话
回到直播室:3个主持,开始大侃,
一个问:这是我第一次参加奥运转播,请告诉我,以往的每一届奥运,都和这一届一样!
另一个回答:不好意思,他们不一样,这一切,太完美了!
接着:感谢大家观看,Good night Beijing ..

2008年8月1日星期五

static const integer member

在很多书上都对static const integer member的声明和定义做了介绍。这种常量常用来代替宏。一来,它可以被局限在类的范围之内,不会污染全局空间,也不用担心重名;二来,静态常量只有一份拷贝,不会占用太多地方。
一般来说,在类中可以使用in-class initialization的方式初始化静态整型常量,但是这还是被看作声明,因此在类声明外面,还需要对其进行定义。为了保证定义的唯一性,一般这种定义放在实现文件中(.cpp)。
比如:


test.h

class Category{
public:
static const int CATEGORY1 = 0x00000001;
//...
}

test.cpp

const int Category::CATEGORY1;

main.cpp

#include "test.h"
int main(){


//....
int _category = Category::CATEGORY1;
}


上述代码在几个编译器中的表现如下:
VC6 不支持该语法
VC8 编译通过,链接失败,报重定义
g++4.0 通过

VC6不支持该语法还情有可原,可是VC8竟然也会通不过,让我很是郁闷。为了使连接通过,只能不在test.cpp再对静态整型常量成员进行定义,我感觉这是编译器做了一些优化,使得在编译阶段,静态整型常量就已经分配了空间,并定义了符号,不再需要连接器去找了。以前看到一篇文章说VC8对C++标准的支持率已经达到了98%左右,但是很难相信如此简单又重要的一个特性,竟然也会不符合标准。可能VC编译器组的人都去忙重要的特性了吧。

写此文的目的是希望看到此文,而又不知道该问题的人能够少浪费差错的时间。这么一个小小的bug,浪费了我整整几个小时的时间去追查。你可能不以为然,但是当代码量多到一定程度时候,任何一个bug追查所花的代价都是巨大的。