巴别塔上的雇工


Vista
9月 30, 2006, 9:15 上午
Filed under: Uncategorized
今天领到一台LapTop,以后就是在家也要干活,开会可以写Blog的人了:)
以前的工作PC都在呼呼的忙,正好把LapTop装上Vista来试用一下,IT部门工作效率还挺高,下午送去下去就装好了。
这篇Blog就是在笔记本上敲出来的,刚刚用,不习惯,以后还要好好适应这样敏感的键盘。


《宝贝计划》:绝对推荐
9月 29, 2006, 3:43 下午
Filed under: 电影电视
刚刚看宝贝计划回来,不多说,一句话——精彩!
这才是一部纯粹的成龙作品,成龙风格的回归,绝对值得一看。



《龙虎门》:武戏九十,文戏及格
9月 28, 2006, 3:13 下午
Filed under: 电影电视
之前网上著名的影评人魏君子说《龙虎门》是“武戏满分,文戏零分”,今天我终于赶了个晚看了,我的打分是,武戏九十,文戏及格。
 
这两年打得不错得香港电影《杀破狼》《龙虎门》的武戏都是甄子丹制造。老甄这么多年打拼,到成龙李连杰都淡出的时候才达到top的位置,不过他又能导又能武指又能演,也就洪金宝还有这个能耐吧,老洪在拍《杀破狼》时据说也颇看好老甄。要说满分,还不至于,我记忆中李连杰的《黄飞鸿》第一集称得上武戏满分。一个电影一百多分钟,一开打怎么也得打几分钟,还要有其他串接情节得戏,打戏撑死也就十场出头,要能比较完全的表现,谈何容易。《龙虎门》里面每一段打斗拿出来都不错,但是放在一起就觉得少了一点什么,感觉太过刚猛,全是勇往之前打不过也要打,还是刚柔并济的好:)
 
要说《龙虎门》文戏零分也太过了,不少批评都说人物感情没有描绘的细腻,我觉得没必要描绘细腻,本来主题就是要打,在文戏和武戏之间triage一下,当然选择把100分钟有限的时间多分配在打上面。漫画改编的电影都是应为原著就有很大的观众群了,所以再搞一把赚一票,经常情节很傻,比如《神奇四侠》,像我这样也没看过原著漫画的,看《龙虎门》也能觉得不错,他也算拍的成功了。
 


Thread之困
9月 27, 2006, 10:07 上午
Filed under: 工作心情
今天搜一个关于线程的问题,用Thread+XXX来搜,搜出来的大多都是和线程风牛马不相及的东西,点击打开网页进去一看才知道怎么回事,这些网页都属于国外的论坛或者newsgroup,一个帖子及其回帖称为一个thread,上面有XXX相关内容,还有名为View Full Thread、Preview Thread、Next Thread这样的连接,估计就是这些东东让Bot们认为这个网页和Thread相关性还挺大。Bot要是能够识别出这些Thread语义上和网页主题无关,就能避免这种问题。

刚才还搜了以下“陈良宇+模特”,虽然也得到一些小道消息,但是绝大多数也是没相关的网页,排的比相关网页还靠前,但内容其实就是一个介绍陈*良*宇的新闻,加上边上一大堆新闻链接里面有一条什么“XX模特XXXXX”。



Software Tells No Lie, But It Is Never Right
9月 26, 2006, 12:41 下午
Filed under: 工作心情
今天看到一个统计,犯事的官员,贪的越多,判刑越轻,这无论逻辑上法理上都不正确。最近还有一个话题关于电脑量刑软件,这么看起来似乎真该有着样一个软件,软件不会徇私,但是软件也是由人开发配置的,“有人的地方就有江湖”,难保不会有猫腻,所以这个量刑软件应该是一个Open Source软件才有意义(以上纯属个人观点,与我的雇主没有任何关系:))。即使是Open Source也不能保证正确,软件就是这样,他不会说谎,但是还是永远不会正确,因为不清楚什么是正确。

看最近又有从事某个职业的大人物被拉下马了,暗自庆幸自己从事了一个工作性质要求诚实的行当(当然不是说任何别的行当就不诚实了,也不是说这个行当里的人都诚实),不贪不躁,做好我的螺丝钉,拿上工资,交上税款,然后回家陪家人,生活就这么简单,感觉很好。



孔子
9月 26, 2006, 4:17 上午
Filed under: 八卦杂谈

最近某基金会推出了孔子标准像,说是为了有利于孔子文化的传播,中国人不是什么问题,主要是怕外国人看有很多不同形象的孔子会糊涂。

据我所知,外国人也说过“一千个人看哈姆莱特就有一千个哈姆莱特”,耶稣和圣母玛丽亚也没有标准像,伊斯兰教的安拉别说标准像,连像都没有,照样不影响信徒朝拜。一个慈眉善目长袍飘飘的古代老头形象,加上一点注释,谁要是还不能认出这是孔子,还能指望这种人能够理解孔子思想吗?



Talking about 由实际问题联想到面试题
9月 25, 2006, 8:47 上午
Filed under: 工作心情

把1000坛酒从0-999编上号,然后把编号转换成二进制,从0000000000至1111100111,十位二进制足矣。

把十个犯人从1-10编好号,n号犯人去尝一滴编号第n位是1的坛子里面的酒,过十天,根据哪些犯人死了可以精确判断哪一坛子有毒,比如第1号和第3号犯人死了,说明是第0000000101号坛子有毒。

其实就是一个用二进制表示的问题。可以看到,很多犯人很有可能不会死,这种方法既高效又人道,这就是数学得力量啊!:)

Quote

由实际问题联想到面试题
上周五在加班干活的时候,拿一大串URL同时去测试我们的程序,结果发现没运行一次在系统event log中都会留下一个出错提示,很可惜这个出错提示没有包含导致出错的URL,所以没法知道testcase中哪一个URL导致了这个错误。这时候已经晚上九点半了,我要想早点回家过周末就得用尽量快的办法找到这个导致出错的URL。最后我实际使用的方法用了一点经验性的知识对可能的URL进行评估,但是多想一步,假如很不幸有上千个毫无明显特征的URL,只有一个有问题,该怎么找到这个URL?

这让我想到一道面试题:
从前有一个国王,他好不容易准备了一千坛好酒庆祝他的六十大寿,但是就在大寿两周前,一个刺客来谋杀他,这个刺客计划往他的寿酒里面投毒,但是很不幸,他才来得及往一个坛子里面下了毒,就被卫兵发现了,混斗中,酒坛子混在一起,被擒的刺客也不知道哪坛子有毒了,只是招供这种毒有三个特点,一是无色无味,二是无论如何稀释,毒性都一样,三是,如果中毒,和常人无异,但是过十天之后就会突然经脉爆裂而死。国王很怒,但是寿宴总是要摆,问题就是把唯一一坛毒酒找出来,于是找死囚来试尝毒酒,但是发现死牢里只有9个死囚,加上刺客只有10个,而且有个问题是这毒要10天才发作,而寿宴两周之后就要举行了,这个国王该怎么找到那坛毒酒呢?

比较一下我说的实际问题和这个面试题,就知道有的面试题虽然古怪,但是还是很有实际意义的。



拆烟囱
9月 23, 2006, 3:40 下午
Filed under: 城市丛林
海淀区,某烟囱,两个工人上周日就开始对其进行拆除

是烟囱就不会矮,干这活真危险


烟囱日见矮小

干到今天,终于差不多了



Talking about 广告之后更精彩
9月 23, 2006, 1:56 上午
Filed under: 八卦杂谈

吴宗宪说得最多的是“掌声鼓励一下”

超女中听到最多的是“谢谢,谢谢,谢谢”

我还是比较喜欢世界杯期间《豪门盛宴》中胖胖的张斌说的话:“大家帮帮忙,看会广告”

Quote

广告之后更精彩

这是我看我型我秀2006总决赛听到的最多的一句话。


Unit Test Private Functions in C#
9月 22, 2006, 2:01 下午
Filed under: 技术体会
问一个关于单元测试(Unit Test)的问题: 如何对private function做Unit Test?
学究一点的回答是: 应该避免直接对private function做UT,如果真的需要,就得考虑把这个function改成public,而且如果代码一开始就应改用TDD的方式开发,应该使得自己的代码容易被UT……

Ok, Ok,我也知道一开始就用TDD最好,但是理论和实际总是有差距的,作为职业程序员,在别人遗留的代码上继续工作的机会比重头开始要大得多,总是会有这样那样不能和书本上描述的一样完美的情况,包括一堆需要测试验证的private function,但是原则上又尽量不要去修改他们的modifier。

还好Java和C#这样的语言提供了reflection机制,即使是private的成员,一样可以可以调用它,所以没有借口不去测试private function。方法其实很简单,可以抽出来,需要UT私有方法的时候重用。

  
  class Util
  {

    public static object RunStaticMethod(System.Type type, 
	string methodName, object [] paramList) 
    {
      BindingFlags bindFlags = BindingFlags.Static 
				| BindingFlags.Public 
				| BindingFlags.NonPublic;
      return RunMethod(type, methodName, null, paramList, bindFlags);
    } 

    public static object RunInstanceMethod(System.Type type, 
	string methodName, object objInst, object[] paramList)
    {
      BindingFlags bindFlags = BindingFlags.Instance 
				| BindingFlags.Public 
				| BindingFlags.NonPublic;
      return RunMethod(type, methodName, objInst, paramList, bindFlags);
    }

    private static object RunMethod(System.Type type, string methodName, 
		object objInst, object[] paramList, BindingFlags bindFlags)
    {
      MethodInfo methodInfo;
      try
      {
        methodInfo = type.GetMethod(methodName, bindFlags);
        if (methodInfo == null)
        {
          throw new ArgumentException("No method '" 
		+ methodName + "' for type '" + type.ToString());
        }

        object objRet = methodInfo.Invoke(objInst, paramList);
        return objRet;
      }
      catch
      {
        throw;
      }
    }

  }