Morgan's profile巴别塔上的雇工PhotosBlogListsMore Tools Help

Morgan Cheng

Custom HTML


本空间访问计数
Web Page Traffic Counter
Photo 1 of 766
感谢访问!
Please wait...
Sorry, the comment you entered is too long. Please shorten it.
You didn't enter anything. Please try again.
Sorry, we can't add your comment right now. Please try again later.
To add a comment, you need permission from your parent. Ask for permission
Your parent has turned off comments.
Sorry, we can't delete your comment right now. Please try again later.
You've exceeded the maximum number of comments that can be left in one day. Please try again in 24 hours.
Your account has had the ability to leave comments disabled because our systems indicate that you may be spamming other users. If you believe that your account has been disabled in error please contact Windows Live support.
Complete the security check below to finish leaving your comment.
The characters you type in the security check must match the characters in the picture or audio.
Morgan Chengwrote:
Welcome, my friend!
Nov. 22
Nov. 22

巴别塔上的雇工

一个计算机程序员眼里的生活、工作和学习
July 03

豪华版桌上足球

在不少桌上足球台子上打过,手感有好坏,外形有差异,质量有优劣,但是哪一个都比不上Jim家的这个豪华版Foosball。

foosball

June 25

Sometimes Bug, Sometimes Comments

//Sometimes, something doesn't work, bla, bla, bla. So, we do something to workaround it.
 
/*
在写代码的时候,最怕看见上面这样的注释,sometimes到底是什么time?
看到这样注释就知道这段code上下有个hack,既然有hack,那就有可能带来新的bug,
或者会让我这样的后来人维护起来很痛苦。
*/
 
/*
写javascript代码,经常可以看见这些sometimes commments,这都是前人们fix一些sometimes bug的遗迹。
倒不是因为javascript不好,而是因为DOM is mess,非javascript之罪也。
*/
 
/*
虽然我很不喜欢这样的sometimes comments,但是至少还要感谢前人留了comments,要是连sometimes comments
都不留,那就更惨了。
*/
 
/*
不过,我还是希望处理sometimes bug时,尽量写清楚什么是sometimes,什么浏览器,什么操作系统上的sometimes
什么样的操作导致了这样的sometimes。当hack不可避免时,提供的信息越多,越有利于代码的维护。
*/
June 21

拍摄过程也要直播?

拍新版《红楼梦》,居然还要直播拍摄过程,这挺有意思。谚语说,喜欢吃香肠的人不要去了解香肠是怎么做出来的,不知道喜欢《红楼梦》的人应不应该看这个电视剧的拍摄过程。当然,这个活动就是一个公关宣传,俗称炒作,要不是这么一直播,谁还想得起来还有这么一个电视剧在拍呢。

直播我没看上 ,就看了几个貌似录播的场面,一个平移镜头扫过几个装模作样写毛笔字的角色的脸,演员是拿着毛笔在想象中的桌子上写字,当然拍摄镜头不能拍下这个“想象中的”桌子,为了光线充足,每个演员一出镜头,就要蹲下来让反光板推进。我不知道别人看了什么感受,我看了之后的感觉就是,原来这是演戏啊,下次真的看到这个镜头只会想到这就是演戏。

June 15

改变历史

看了《终结者4》,又思考了一下时间旅行中是否有可能改变历史的问题。

之前我说过有两种时间线观念,“可以改变过去”和“不可改变过去”。在《终结者》系列中,故事是“不可改变过去”的,但是故事中的人物(包括机器人)则是相信“可以改变过去”的,一方面无论天网派出多少生猛的机器人杀手,就是无法阻止反抗领袖的诞生,另一方面,人类则担心机器人的努力真的生效,不敢怠慢,所以也派保护者到过去。

按说,能够制造出时间机器,应该对时间理论有很深的理解,按照《终结者》的故事,时间机器应该是天网制造出来的,天网之所以做这样的努力,肯定是认准了时间机器是可以改变历史的,但是咋就不好使呢???也许天网对时间模型的理解还是有错误,有错误还能制造可以工作的时间机器,真是不容易。

也许一切都是命运,时间只是错觉,历史、现在和未来,都像一盒录制好的录影带一样,只是看你放映到哪里而已,一切主观企图改变历史的行为,只是让命运往既定方向发展而已,一切主观不作为的行为......一样让命运往既家定方向发展。这样想真让人悲观,好像没什么好努力的,反正一切都是注定的。在《终结者4》中,如果John Conner“勇敢”一点,故意不去救比他年纪还小的老爸Kyle,我想,就和《Lost》里一样,命运之手也不会让Kyle死掉的。

June 13

终结者4:谁来救赎这个系列电影

看完《终极者4:救赎》,又让我想起杜琪峰借刘德华之口说的那句台词:“再烂的电影,预告片都一样的精彩”,每次被预告片骗进电影院出来我都回想起这句话。

当年导演詹姆斯.卡梅隆生病发低烧的时候做了一个梦,未来的机器人通过时间机器穿越到现代来刺杀人类反抗军的领袖,于是就创作出《终结者》,当时这个故事给观众的震撼何其大。到了《终结者4》,已经不能靠故事情节震撼观众了,只能靠场面,情节则是千疮百孔一塌糊涂。

故事无论如何胡扯,只要情节安排足够紧凑,也总能让观众忽视故事中的漏洞。《终结者4》走的也是这条路线,蝙蝠侠从坠毁的飞机中爬出来抬头看核爆的蘑菇云,观众正想,为什么会有一次核爆呢?只剩下上半截的T600机器人就跳出来和蝙蝠侠一顿神打,让观众没时间去想蘑菇云这种小问题;当天网和马克思同学说,你成功诱骗John Conner上钩,以后和我混吧,观众又在想,如果天网一开始放马克思出去就是有企图的,那为什么不让他见到Kyle和John的时候就干掉他们呢?不过观众还是没有时间多想,已经改行当州长的终结者机器人又全裸出战,观众的注意力又被转移去猜想阿诺怎么有工夫拍电影。

虽然被电影的紧凑场面耍得团团转,当电影结束之后,观众还是会想,Kyle是John他爹,所以终结者要干掉他,从而John也就不会出现,但是我们都知道John肯定是收编了Kyle之后(在2018年此片故事之后)才有机会派他去上世纪保护自己的母亲(同时让自己的母亲生下自己),那么天网怎么可能在此片中(2018年)知道Kyle就是John他爹,从而要寻找并杀死他呢?

据说此片最早的构思是,马克思同志一直听John的无线广播,深知John是人类反抗军的精神领袖,所以在最后关头,John死了,他将John的遗体做成人皮面具,化成John的模样继续领导人类反抗天网,Oh,卖糕的,领导人类反抗机器人的领袖居然自己就是一个机器人!如果此片按照这个构思拍,给观众带来的震撼要远大于现在的故事情节。

June 10

国家的Content Filtering

cc20090609005

我在Microsoft的Content Filtering项目工作期间,和同事们经常唏嘘,同样都是做内容过滤的,人家“金盾”要没有顾忌得多,既不用考虑法律问题,也不会被错误得屏蔽投诉骚扰。不过人家金盾说到底还是在服务器和网关上进行过滤,没有侵入每个用户自己的电脑无关,好歹还是给Content Filtering留了点生存空间:-)

不过时过境迁,现在已经有国家级的Content Filtering填补这一领域的空白,这就是“绿坝”,第一次听说还以为是“绿霸”。对这个软件产品现在颇有争议,我无法不判定其是好是坏,只是说说以前做Content Filtering的情况吧。

Microsoft的Content Filtering(下面简写为CF)一开始就明确原则不是为了“堵”小孩上不良网站,而是防止小孩“无意中”浏览不良网页,所以客户端实现是相当的松。CF没有绞尽脑汁做一个让小孩无论如何都没法绕过的客户端,因为这样没有多大用处,而且有可能会激发小孩的逆反心理,和小孩斗,往往就是个输。我不大清楚“绿坝”这方面怎么样,据说可以卸载,但是我想卸载肯定也是需要权限的,家长和老师可以选择不卸载,这样小孩还是在“坝”内。

据说“绿坝”将自带一个不良网站列表,不知道是不是明文方式在客户端存贮,如果是,那这个“绿坝”倒是成了想上不良网站人士的指路灯。成魔还是成佛,就在一念之间。

不管是CF还是“绿坝”,到底有没有积极意义呢?我开始干CF的时候已经非常成年了,一开始也无法想象一个十岁左右小孩看到Playboy会不会被毒害,这个问题之后同事们也讨论过,从历史案例看来,不良内容的确有将小孩引入歧途的先例,所以进行内容过滤还是恰当的。所以CF有一条不成文的原则,宁可错杀一千,不可使一各黄色网站漏网,一些著名的国内门户网站,主页上都是一些打擦边球的暧昧文字,被CF无情地判为不良网站,这样保护了不少天真的孩童。我希望“绿坝”对这些门户网站也一样不要手软,不然所谓保护小孩就是一句假话。


June 07

Natal真是酷

看Microsoft的Project Natal,虽然现在还没有正式公布发布日期和价格,但是一旦发布,肯定是一个UI控制的革命。Microsoft为了在家庭客厅抢占一席之地而不断投入XBox/360,从亏了很多钱到终于赚钱,到现在可以引领潮流,就连竞争对手Google的Blog上也介绍了这个项目,不得不说是非常有远见的坚持。

 
June 06

6月6日

今天和老婆出门,看到有不少娶新娘子的花车,老婆问我:“今天难道是什么好日子吗?这么多人结婚。”我掐指一算,今天是6月6日,啊哦,今天非但是黄道吉日,而且实际上还是我俩结婚三周年。我俩居然都忘记了,相视大笑。

别让ToString函数改变对象的状态

几天前在Debug的时候碰上一件让人抓狂的事情,为了分析一个bug,我用Visual Studio连上目标进程,在一个函数上设了断点(breakpoint),然后按F10一行一行地看程序状态,很快就发现程序状态不正确,但是又看不出来状态怎么突然不对了。将Visual Studio和目标进程断开,程序状态就恢复正常了,奇怪!难不成薛定锷的猫理论又出现了?Debugger会影响到程序的行为,但是我没有通过Debugger做任何改变程序状态的事情啊。

重复操作了一遍,还是这个现象,只要用Debugger去看一眼,就会出错,但是没有Debugger就没事,这几乎要让人疯掉了!

后来终于想明白是怎么回事,原因就是某个类的作者让ToString()函数改变了对象的状态,这,编译器是容许的,但是相当不应该的,是一个Worst Practice

   1: class Foo
   2: {
   3:     private string _msg;
   4:  
   5:     public int ToStringCount
   6:     {
   7:         get;
   8:         set;
   9:     }
  10:  
  11:     public Foo(string msg)
  12:     {
  13:         _msg = msg;
  14:     }
  15:  
  16:     public override string ToString()
  17:     {
  18:         ++ToStringCount;
  19:         return _msg;
  20:     }
  21:  
  22: }
  23:  
  24: class Program
  25: {
  26:     static void Main(string[] args)
  27:     {
  28:         Foo foo = new Foo("foo");
  29:         Console.WriteLine(foo);
  30:         Console.WriteLine(foo.ToStringCount);
  31:         Console.ReadLine();
  32:     }
  33: }

 

上面的code,在Visual Studio里面按Ctrl+F5直接运行,输出是

foo

1

这在意料之中,但是如果你在Main函数第一行设上断点,F5进入Debug状态,然后一行一行走,走后的结果是什么?这取决于你的Locals Debug Window有没有打开,如果Locals打开了,每Step Over一次,Debugger都会去调用Local Variable的ToString()函数,这样ToString()函数调用的次数就比没有Debugger的调用要多。这就是我碰到问题的根源。

也许你会说,只要不用Debugger不就没问题了吗。但是,从一个类的角度来说,它并不知道自己的实例会在什么场合下如何使用,它也没发知道,所以必须保证自己public出去的方法不管怎么折腾行为都是正确的,让ToString()改变对象的行为违背了这个原则。很可惜C#并没有强制一个函数不能改变对象状态的语法,所以只能靠程序员自己注意了。

June 02

Live这把是真的要Dead了吗

这次微软推出Bing搜索引擎,普遍反映是——至少不差,可以一用。我已经把浏览器的缺省搜索引擎设为Bing,试用几周看看怎么样,目前看来还比较让我满意。

虽然之前官方说法说6月4号Bing才会正式上线,但是至少中国地区Bing已经迫不及待地替换了Live了,访问live.com会redirect到http://cn.bing.com上去。于是,就有人说Live商标被微软放弃了,要改为树bing的大旗了。

就我所知,微软在线业务虽然经历了很多的re-org,但是事实上还是清晰地分为三大部分:

  • MSN,虽然国人一说MSN都首先想到的是一款聊天工具(也就是Live Messenger),实际上现在MSN只管内容相关的东东。
  • Live Search,搜索业务,只不过现在换了个马甲叫Bing。
  • Windows Live,除了搜索之外的一切在线服务,包括聊天的Live Messenger、管理图片的Live Photo Gallery,还有我现在正在写这篇文章的Live Writer,还有其他很多东西。

这么一看就很清楚,光是带Live的品牌就不是只有搜索才有,Live Search被Bing替代了,Live还Live着。

有说Bing是Bing Is Not Google的缩写,但是官方的说法是,Bing就是一个拟声词,表示搜索中了的那灵光一现。所以,我想Windows Live也不打可能改名为Windows Bing。