巴别塔上的雇工


印度神医
8月 30, 2006, 1:24 下午
Filed under: 电影电视
《越狱(Prison Break)》第二季出炉了,目前只有两集,延续了第一季情节紧张结构经凑的特点,不过现在故事背景不局限于一个监狱,故事发展有点天马行空,不知道编导收不收得住。

观众的反映再一次影响到了情节的发展,一是女主决V据说因为第一集中很不讨观众喜欢,第二季中一开始就挂了,而且还被肢解,真是够惨;还有一件就是第一季结尾被砍掉一只手的T-Bag成功突围,编导可能没有预料到这样个一个变态佬的角色这么受欢迎,所以第二季中还将有他大量戏份,但是T-Bag断了一只手可不好拍摄,所以还要想办法让他把手接上去。要说这接手,T-Bag真展现了PB第一猛男的本色,先从野营者那里偷来一箱冰把短手冷藏起来,然后找了一家兽医站,强迫唯一的医生(印度裔)给他接手,为了防止被麻翻,连麻药都不用,关公和国产零零漆还要用转移视线分心大法,T-Bag连分心都不用,算他猛。

就我所知,接断手是一项非常复杂的手术,不过居然让这个印度兽医一人完成,这不是兽医,明明就是神医!



图片上传程序
8月 29, 2006, 3:20 下午
Filed under: 技术体会
比较好的Online Photo Album比如Yahoo/flickr/zoto都提供了客户端的图片上传工具,一开始,觉得用这些上传工具比在网页上上传要快一些,猜测可能用到的方法是
1) 把图片压缩一下再上传;
2) 用多线程上传

用Process Explorer检测了一下flickr和zoto的上传程序的运行状况,都没有多线程上传的迹象,因为从头到尾只用了一个TCP连接;用本地的WinZip和WinRar试验压缩了一下JPEG文件,压缩比不大,JPEG已经做了压缩了,再压缩也榨不出什么油水来。再回头对比了一下用网页和工具上传的时间差别,Flickr的上传工具的确快一些,不过那是因为工具在客户端就把图片调整为1200*800分辨率了,zoto的工具老实的把原图上传,所以慢,和通过网页上传速度差不多,flickr是通过服务器80端口上传,zoto通过35001端口,要是客户端在防火墙之后,可能就不能正常工作了。这些客户端程序的主要作用是让用户能用Drag&Drop的方式上传图片,速度快只是一个错觉。



你最希望Windows Live增加一个什么样的功能?
8月 28, 2006, 12:52 下午
Filed under: 技术体会
据说以前Micorsoft有一道面试题是“你最希望Word增加一个什么样的功能?”,我不大用Word,而且Word又没有可匹敌的对手,实在不好回答,但是最近我用了不少Live的服务和其他公司的在线服务,也杜撰一题:“你最希望Windows Live增加一个什么样的功能?”

我最希望Live增加在线相册的服务,虽然Space中间也有相册功能,说老实话,那个相册真是相当的凑合,根本算不上相册服务。Live Space在中国访问本来就够慢的了,再者个基础上还要上传下载图片,就慢的受不了,而且功能也就简简单单那几样。没办法,虽然我支持东家的产品,到现在还是在Space上写blog,但是blog中的图片我还是用flickr吧,不过flickr每月限制上传图片总大小不能超过20M,这点不爽,可能过一阵子要盖用zoto,没有每月限制,感觉flickr的服务更加适合建立“图片社区”,但是像我只是在Blog上引用图片,zoto也满足需求。



城中田
8月 28, 2006, 5:49 上午
Filed under: 城市丛林
位于北三环和中关村东路交接处的农科院试验田,可能十北三环一线可以看到的最后的农田了,这块地是当年毛主席钦定给农科院的,所以直到今天,虽然四周全盖上了楼,这块地依然是一大片绿色。



野车无人草自生
8月 26, 2006, 2:44 下午
Filed under: 城市丛林
北京公安海淀刑侦支队门口停了几辆野车,不知道是赃车,还是有人发了以前老车扔掉不要了。
停的时间太久了,草都长出来了:)
这张逆光,效果不是很好

特写一下
forsaken_car1

另外一辆
forsaken_car2



Microsoft Helps Mozilla
8月 25, 2006, 8:37 上午
Filed under: 工作心情
前一整子研究Mozilla Plugin的时候发现最新的Mozilla/Firefox在Windows Vista上某些功能是无法工作的,这个问题估计能够得到解决,因为Microsoft向Mozilla伸出了援助之手,Mozila也欣然接受(现在的新闻就是喜欢用这样添油加醋的口气),这里是详细内容


近期的两个电影:《来电惊魂》和《狗咬狗》
8月 25, 2006, 4:47 上午
Filed under: 电影电视

电影局的大佬们又引进了一个美国大片《来电惊魂》,不过我看应该是大烂片,相比之下去电影院花几十块看《无极》都比看《来电》值得。片子一开始很酷的样子,老套路,杀手先做一案,体现其有多么多么厉害,以此体现之后主角能够搞定杀手多么不容易。在很多美国电影里都出现这样一段:某某经验丰富的警官驱车来到已经满是警察的凶案现场,下车,一路走向凶案发生的房间,在走廊、客厅、楼梯和碰面的警察胡扯一些和情节毫无关系的话,直道看到尸体,在《杀死比尔》《来电惊魂》中都有这样的段子,不知道这对整个电影有什么帮助。整个电影很闷,好不容易熬到杀手现身,还以为要大战三百个回合才分出胜负,结果被女主角在尖叫中轻松搞定,莫名其妙。不过这个电影没有一个香艳镜头,又不是特别的恐怖,还不涉及任何政治问题,嗯,电影局原因浪费一个引进电影名额在上面也就可以理解了:)

香港电影这几年算是引人注目的作品主体都比较冷酷,从《无间道》到《黑社会》到《杀破浪》,最近的《狗咬狗》继承了这一点,情节的残酷程度可比当年的《暗花》。陈冠希这个小白脸在这个电影里面演一个灰头土面和狼狗一样凶狠的柬埔寨杀手,可圈可点,似乎被批评为演技不佳的演员都会演一个自毁形象的角色翻身,不过不是都能够成功。



Thin-Client还是Rich-Client,是个问题
8月 22, 2006, 4:49 下午
Filed under: 技术体会
这几天,Google的Writely又重新引人关注了,我之前没有注册,现在注册上一用,可能因为之前期望太高,说老实话觉得Writely功能不是很
强,并不能算上一个完全的在先Word,但是javascript能够做成这样,还是很让人佩服。同样就在几天前,Micorsoft推出的Live
Writer,一个可以方便写Blog的客户端程序,似乎是最近Windows
Live发布产品中难得获得不少好评的,形成强烈对比的是在线产品Live
Space恶评如潮。从这些现象中似乎可以看出,Microsoft的强项还是在客户端,在线产品客观的说,比Google和Yahoo!都还有差距。


的同事Xin是客户端应用的坚定支持者,他认为AJAX这种东西虽然容易部署,但是能够支持的运算能力有限,所以要支持更多的功能,必然越来越庞大,最后
还是不得不借助Rich-Client的模式。其实,拥有自己的客户端程序的产品,和Thin-Client的Web产品,差别也不大,使用Live
Messenger,可以自动在线升级,Tab中的内容也是根据用户帐号的国家/地区属性动态产生,但是还有很多别的功能如IP电话、地图查询等功能都集
成进来,似乎不可能做成一个Web-based的产品。

用工程师的思维分析一下,假如Thin-Client端的产品真能彻底替代Rich-Client,总得有下面几条前提
1) 网络足够快,能够及时下载Javascript脚本,如果feature非常丰富,javascript一般都会更多;
2) Javascript实现的功能在浏览器中执行足够快,毕竟脚本语言程序运行速度和native code还是有差距的;
3) 等等

许上面的条件随着网络和硬件等条件的改善,都不成为问题,不过我看Rich-Client不可能消亡,行业不是完全由纯技术因素决定的,总得有人做OS
吧,MS会继续做OS,而且会在OS中附加很多应用程序,而且任何成熟的公司都不会放弃自己的强项而去模仿对手的强项,虽然现在有Windows
Live,我看Rich-Client今后比较长的一段时间内,还会是MS的主攻方向。



C++: Variant Length Argument List
8月 21, 2006, 10:52 上午
Filed under: 技术体会

有时候我们希望定义参数列表不确定的宏(Macro),比如打印Debug信息的宏。C/C++支持变长参数列表的函数,但是对于宏定义,有点小问题。

C99标准(注意这是C语言标准,不是C++标准)有一个__VA_ARGS__可以用在宏定义中表示参数列表中的“…”部分,比如我们可以这样定义宏

#define MY_DEBUG(format, ...) 
	do { 
		printf(format, __VA_ARGS__); 
	while (0)

只可惜C++标准中没有规定支持__VAR_ARGS__,不过gcc和MSVC等编译器都支持,也是,能编译C++肯定能编译C,编译器厂商也乐得做过顺水人情在C++中多支持一个功能;)

如果实在觉得这样不稳,就怕那天code需要port到一个不支持__VAR_ARGS__的编译器上,还有一个方法,适用于“纯C++编译器”,ATL中的ATLTRACE实现用的也是这种方法

#define MY_DEBUG DebugClass()

class DebugClass
{
	void __cdecl operator()(const char *format, ...) const
	{
		va_list ptr;
		va_start(ptr, format);
		vprintf(format, ptr);
		va_end(ptr);
	}
};

这种方法巧妙的利用了C++对()的重载能力,#define部分世纪上市建立了一个DebugClass类型的临时变量(注意后面的括号一定要有),然后调用了这个临时变量重载的operator()方法,即使编译器不支持__VA_ARGS__,它总得支持va_list/va_start/va_end这一套东西,把变长参数列表交给vprintf这样接受的函数取处理,当然也可以我们自己处理,不过似乎没必要费那个劲了。

其实还可以在DebugClass的构造函数中加上参数,就可以获得更多的Debug信息

#define MY_DEBUG DebugClass(__FILE__, __LINE__)

class DebugClass
{
	DebugClass(const char *file, int line)
	: m_file(file), m_line(line)
	{
	}
	void __cdecl operator()(const char *format, ...) const
	{
		printf("File: %s Line: %d t", m_file, m_line);
		va_list ptr;
		va_start(ptr, format);
		vprintf(format, ptr);
		va_end(ptr);
	}
	const char * m_file;
	int m_line;
};



奥林匹克精神的战争
8月 21, 2006, 1:38 上午
Filed under: 八卦杂谈

停火之后,以色列和真主党都宣布取得了胜利,这场战争就和奥林匹克运动会一样,参与就是胜利:)

只要愿意参与战争就能取胜,那谁都会想参活以下了