2008年11月19日星期三

文件搜索闪电侠

我一直很不满意Windows XP下的搜索,常常文件在那里也搜不到,每次还跑出来那只讨厌的小狗。可是公司里面不让装Google Desktop,MS自己出的MSN 搜索也不敢用,结果搜索就成了我一块心病。

前两天意外的发现了一个工具Everything, 我对其评价就如我题目写的--文件搜索闪电侠!

Everything是个小巧的工具,它能进行文件搜索,可以使用简单的正则表达式,而我最看重它的品质是,此软件小和快。小是指它的个头小,做的索引文件小,快是指做索引超快(我260G的硬盘几乎是立即完成,启动软件后就可以搜索了,官网写着速度为1分钟100万个文件),搜索文件速度快得令人发指!

其他的功能也很多,比如可以作为文件服务器,别人机器上开着这个服务,我就能去搜索他的电脑(牛逼)!

不过这个软件对我来说还有些不足,一是不能通过热键启动(就像金山词霸一样),而是不能进行全文检索。但是想想我做全文检索的几率也不大,这个就够了!

Everything的官网: http://www.voidtools.com/

另外有善用佳软小众软件对其的推荐。里面的介绍比我详细,有兴趣的人可以看看。

2008.11.28:
找到了热键启动的方法。
在Tool->Option的General标签页。设定好New window hotkey modifier 和New Window Hotkey key就可以了。

2008年11月14日星期五

有自己的域名啦!


在吗啡的多次,再三,不断地怂恿下,我终于买了一个自己的域名。

本来想买linghao.com的,可是被那种卖域名的人抢注了。而且还刚刚续了费,我只能放弃了。不过这个看起来也挺好。mog是moogle的简写,也是FinalFantasy里面飞天猪的名字,我99年一开始上网时所用的nick,挺有纪念意义的。

在吗啡的悉心帮助下(我发现我现在特懒-_-,而且对这种网络设置一窍不通,汗颜啊),一步一步把各种配置都搞好了。

以后我的blog地址变为:http://blog.mogling.com/
我的feed地址也随之变动:http://feeds.mogling.com/ (以前订阅过的朋友可以继续使用老地址,内容是一样的。)

2008年11月11日星期二

根据名字画出我的头像?

FriendFeed举办了一个24小时编程比赛Philipp的作品可以根据你的名字给你一个脸的图片。

网址:http://turnyournameintoaface.com/
 
我分别输入了我名字的拼音和中文和我最常用的网名,结果出来的是这副腾头死。

这张是linghao
这张是凌浩
 
这张是我常用的moogle
  是不是很惨,但是当我输入周杰伦,刘德华之流的名字之后,我发现我真TMD太帅了!

P.S. 2008/11/14
吗啡说用英文的没有好下场,我抱着科学的态度又求证了一下,用的是Mog,这个我最近刚捡起来的9年前刚上网时用的nick。感觉不错吧,不过就是奶油了点。

2008年11月7日星期五

File not found: ieframe.dll

When using Visual Basic 6 with Internet Explorer 7 installed, I encountered such a problem "File not found: c:\windows\system32\ieframe.dll\1" when loading a project.

Usually, the file does exist. Then why we get this problem? Well, the simplest answer is that some control referenced by your project has been replaced by ieframe.dll. I can not tell more since I am barely familiar with VB. Or to be frankly, I am neither not knowledgable of VB nor like it.

So the simplest way is to revert the reference from ieframe.dll to its ancestor. After google it, I find its ancestor is shdocvw.dll. It's in the same directory. Then register it:

regsvr32 c:\windows\system32\shdocvw.dll

Try to launch VB6.exe and load your project again, does the annoy error message disppear?

2008年11月5日星期三

pipe console program output to clipboard

I am making some demostration these days. I need run some console programs, get their output and put them into a nice slice as example. The trivial way is to redirect the output to a plain text file then open it, Ctrl+A to select all and copy, switch to PowerPoint, paste, which is exactly what I am doing.  Some days past, I feel I can't stand it anymore. A simple idea just jumped out of my mind, why not make a small tool the can read data from pipe and copy to clipboard? So I can do my jod like this(assume the program is called cmd2cb.exe):

dir|cmd2cb
type readme.txt|cmd2cb

thus, all output of dir command are read by cmd2cb and copy to clipboard. Then I simply switch to PowerPoint and Ctrl+V. Everything's done. Small tool, but cool!

When I share this tool to my colleages, it turns out that I am not the only one needs it.
So I decides to put it to my box. If you need, just download here. cmd2cb.exe (9k)
Chinese user can download from namipan(纳米盘): cmd2cb.exe (9k)

*This file can only be used in windows, console and after the pipe symbol and no warranty.
*If you're using Vista, you can use Clip.exe shipped with Vista.

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!