Tuesday, July 15, 2008

5月12日,四川地震,举国皆悲。在地震中,有无数人失去了毕生积攒的所有财产,甚至连生活都无法继续。幸好,有中央政府的赈灾拨款,帮助他们走出困境。

现在假设有一个5000人的村庄,国家拨款五百万,每个人能分1000。有人觉得1000太少,所以杀掉了2500人,于是所有人领到了2000赈灾款。皆大欢喜,不是么?

也许这样的场景一眼就能看出是无比荒谬的。固然,即便赈灾款的上限是固定不变的,也不能靠杀人来增加每个人的配额。

当然,事实上,赈灾款是按人头分配的,一个人一个月300。不过,我国现在还处于社会主义初级阶段,很多人还挣扎在贫困线以下。5000个人,每个人300就是150万,如果杀掉2500,就能给国家省下75万,这75万,完全可以投入到社会主义建设中去,为四个现代化的实现做贡献。

真要是这样,不如当初就一起都震死算了!靠杀人为国家省钱,那还要国家作甚!不如每个人发瓶农药,一起西赴极乐得了。

然而,很多人所提倡的,正是类似靠杀人来增加人均资源,靠杀人来替国家生钱的事。而这件事,就是计划生育。假如所谓的计划生育,仅仅只是在孕前进行辅导劝说工作,也就罢了,偏偏现在的计生工作,正是要把已经成为一条生命的腹中(甚至是已经诞生的!)婴儿扼杀掉。这么做,不能说不是杀人。而他们冠冕堂皇举出来的理由,竟然就是:中国养不起那么多人!中国人多导致生活水平下降!

退一万步说,假设一个孩子从出生到死亡,所有的费用都由国家承担,生孩子就是给国家增加负担,多生孩子就是多给国家增加不必要的负担,是不道德的事;难道为了保持自己的生活水平,就杀人,鼓动别人杀人,不是比这种行为更不道德,更不齿,更灭绝人性的事么!

Monday, May 12, 2008

城市新闻中的罗生门

前两天在两份报纸上看到两则新闻。看到这两则新闻都是很偶然的机会,一次是因为无聊这辈子第一次买了一份都市快报看,一次是回家偶然看到一份旧的钱江晚报。

都市快报上的新闻,是说一个人在路上看到有人给小汽车拍照,据说还上去拉车门,于是那个人就冲上去摁到那个人打了一顿。还去了派出所,在那个人保证不再拍别人俄汽车之后,赔了他几百块钱。

钱江晚报上的新闻,是说一个外地杂志的编辑在qq上对晚报记者诉苦,说前两天在街上为杂志拍照时,被人冲上来不由分说摁住就打。去了派出所之后,那人一开始说他拍小汽车的照,后来还说他动了人家的车,最后竟然说他是外地人。那个编辑说,在杭州次数也很多,第一次遇到这种人。

虽然第一则新闻上似乎没有说事发地点,但是我很强烈地感觉到这两则新闻说得是同一件事。也许是我的错觉,但是两者的描述在细节上似乎对得上,但又仿佛是两种截然不同的事件:一件是见义勇为的好事,一件简直就是疯子在街上乱打人的流氓事件。

第二条新闻还是很可信的。中国人现在处在一种相当浮躁而敏感的情绪当中。所有的人,从平民百姓到中央政府,对外界事件十分敏感,却又不能冷静下来仔细分析一下,只是冲上去先开揍再说。这种心态,成事很难足啊。

Saturday, May 10, 2008

NASA is paying people $17,000 to lie in bed for 90 days. What you do is just lying... and lying only. You are not allowed to stand up and walk around, you may not even sit up. You can do anything you like, so long as you lie there in the bed.

What an idea. Sounds a marvelous idea for us under-paid 3rd-world workers. If I do it for a whole year, I may have doubled or even quadrupled my annual income, if I lie there and finish my postgraduate life after that. Those Americans are thinking that is too little for the higher risk of losing about 5% of your bone density! Well, as a programmer, bone density (me guess) is at a risk too.

Wow, no wonder people dream of going to America and become rich all of a sudden. Well, if you choose the correct career, you may achieve that after all (and without breaking a sweat!).
Finally gone thru The Heir to the Throne campaign. It was really interesting trying to bring down the four grand knights of the clan before defeating 25 enemies. However, with 24 gryphons and some good luck (created by saving/loading some of the times), I was able to achieve that. Wow, it was heartbreaking seeing my gryphons stricken down by those lancers.

Then was the final scene. Numerous enemy units come and strike on my formation. It was hard to see the veterans fall. Knowing there is no need to save anyone for the next scene, it was still hard for me. Though, it was harder to keep everyone alive. Standing the ground against the first couple of waves, and it's easy to fight back.

Medium difficulty. Not bad for a beginner :-)
看起来似乎又被封了?。。。
相当无语了。。。

Friday, May 02, 2008

不得不就毕设倒倒苦水了。说老实话,如果我不是一个好了疮疤忘了疼的人的话,也许就不会在同一块石头上绊倒两次了。想当初本科做毕设的时候,也是痛苦万分的经历,迄今尚不敢回首。居然短短两年后又要经历一次。。。终于知道女人生第二胎的时候是什么心态了。不过,生孩子没法延期,毕设还有条后路。不能背水一战,让我进入了崩溃边缘,从而有了两种恐惧的对象:毕设,以及我心理状态的崩溃。我也不知道哪一个更恐怖。

由于早年告别了Windows,自己的机器又没有好到能够跑虚拟机的地步,外加LaTex一直没学会,因此一直在文本编辑器上码字,然后有机会的时候拷到Word里面。页码是按照Word文档一个模板的格式算的,在Emacs里码字,自然不知道该有多少页。因此,我的心理状态一直处在过山车似的刺激跌宕当中。一会儿就觉得60页,那么宏伟的计划怎么可能完成,跟大跃进似的,还要在几天内完成。一会儿,等我把几千个字拷进去看看页数的时候,又想:哇,这就4页了啊,那一章10来20页的,不是小case?一会儿,想想一章里面到底应该写什么的时候,又觉得:虽然想到的已经写了一点,还没想到的,谁知道会不会最后被我想到,这20多页还是愁啊。。。

于是,我在为看到居然就有4页被我搞定而欣喜的时候,又同时以旁观者的身份冷笑着,看自己还能高兴多久。天啦,真是要把人逼疯不可。崩溃啊崩溃。

不过看的那些论文还是有点收获的。程序切片这个东西还是很有意思的。之前自己yy过,通过分析寄存器间的关系来看程序能不能并行化的问题,其实就是程序切片从另一个角度看过来最原始的想法。也的确就有人把切片用在程序并行化领域的。那方面的论文没看到,也懒得找,不过我又brainstorm了一下,觉得可能性还是满小的。毕竟,函数是有聚合度的,如果一个函数能够切出很多片来,就说明聚合度很低了,就该拆函数了。函数一拆开,就很少需要劳切片工具大驾了,人工并行化也就比较容易了。比如说播放器,如果一开始解码和在屏幕上画是一起的,那么切出来就可能有这么两块。但是这两个很明显应该在重构的时候分开。分开以后,并行化的处理就很明显了,两个线程,一个解码,一个画到屏幕上。没程序切片技术什么事。

所以我现在的想法是,随着软件工程理念的深入,自动化的程序并行化已经不太有可为之处了。倒是同步库可能市场越来越大。毕竟,如Knuth所言,硬件工程师们已经黔驴技穷了。多核时代来临,并行的程序势在必行。

Wednesday, April 30, 2008

最近终于把Freakonomics的正文看完了。书的确很有趣,尤其是其中的观点,包括堕胎合法化导致了犯罪率的下降的理论,非常地有意思。据说这样的理论在美国是被认为很不道德的,这一点作为中国人可能很难体会,大概就像美国人应该很难理解中国电视上电台里大街边铺天盖地的妇女医院和无痛人流广告一样吧。

书中最后一章提出了一个问题:一个人最终的成就和他出生时父母所起的名字有没有关系?好名字会不会有好的出息,而坏名字会不会导致一个人就背运终生?作者得到的结论是:名字和人的命运是相关的。有个好名字的人,往往会有个好结果。不过,先别急着去改名字。虽然名字和命运是相关的,但是并不就是说名字造就了人的命运。事实上,不如说是命运造就了人的名字。出生在哪里,应该算是命运最早的体现吧。基本上,你出生在哪里,你的命运就大致决定下来了:会不会有出息,会有多大出息。在此同时,由于你的父母已经决定了,你的名字会是什么样子,也就不是很随机的事了。很有道理。尤其是在中国,如果你出生在领导家里,你的锦绣前程基本上就已经敲定了。无论你干什么,大大小小总能做个领导。如果你出生在贫困家庭里,固然存在着贷款读大学飞上枝头做凤凰的可能性,但是大家都知道现今大学生的就业状况。另一方面,名字基本上体现了父母的品味。就好像有人总结的武侠小说定律一样,英雄大侠的名字,总不会是阿猫阿狗的。即使是,也会被高人改个好名字啥的。跑龙套的,名字就都不咋的的了。

不过,还有一个问题:什么是好名字?事实上,书里只是说,相近出身的人,重名的概率就高。出身好的人的名字,就相当于是好名字。这个说法之所以能够成立,是因为数年后,这些名字会逐渐成为流行的趋势。对于英语名字,至少是传统的名字,其实并没有分别好坏的方法。和中国人不一样,英语名字大多只有发音,没有实际的意思,因此追求的往往只是好听。但是中国人的名字,因为每个汉字都有意思,因此除了声音以外,还需要寓意也够好。这个使得衡量中国人名字的好坏就有了潜在的定量分析的可能性。好不好听的,计算机可能很难理解。意思好不好,查字典就可以了。有没有意思很坏的谐音,也是计算机更擅长做的事。

不过,之所以说起这些,主要还是因为最近在聊天时听说的一件事。我个人虽然很少玩游戏,但是同学中玩的人还是不少。有个同学说他最近老是输,因为自己队里总有很菜的人,只要对方稍微正常点,自己这边就必输无疑了。那么,只要见到菜的人绕道走就好了呀,别和他们一个队不就结了。但是,看名字,怎么看得出一个人菜不菜呢?我的观点是,从名字的好坏上,可能能看出一个人的游戏水平。

事实上,就校内的战网而言,其实用统计学规律可能更简单地得到有意义的结果:如果一个名字出现的次数很多,那基本上就不会是很菜的人,因为首先他练习地比较多,其次说明别人也愿意和他玩。如果一个名字没怎么见过,那么是菜鸟的可能性就大很多了。毕竟,一个人如果玩得差,就有可能经常换新的名字。最简单的做法,就是只和最常见,以及自己确认过不是菜鸟的人玩。这个算法其实是最原始的,操作性很强,不过有导致玩家饿死的可能性。另外,由于学校战网上申请id不是很容易,因此可能很常见的名字,其实只不过是申请不到新id的老菜鸟而已。

就我现在这种毕设中人的状态而言,这个显然不是一个好方法。最重要的原因就是:太简单。效果虽然应该不错,但是简单的东西,就有使其复杂化从而得出效果可能不咋样,但是很有趣的结果。另外,饿死的可能性还是存在的,因此不能说是没有缺陷,无法改进的算法。

就战网id而言,很多往往是有意思的单词组合。至少对于很多中国人,我猜想是因为对于英语发音规则不是那么熟悉,所以很少会用无意义的音节组合来拼凑id:毕竟,谁知道这个id到底是不是该这么发音?因此,通过分析单词意思来分析名字的好坏,还是很有可能性的。

我个人的意见是,假如SpiritMoon不叫SpiritMoon,而是叫SillyAss的话,必定不会成就他的天王地位。固然,SillyAss可能在特定情况下听起来很酷,但是,这样的名字注定是缺乏品味的,其主人的程度也就可想而知了。

我个人的意见是,这样的算法是可行的。假如看见一个很土的名字,认定他是菜鸟而不是高手,正确率应该不会很低。另外,这样的算法其实是可以推广的。在网络论坛上,出名的,名字往往不会土。假如在88上,出现了一个新id。这个人会不会红极一时,会不会经久不衰,事实上跟他的id是有很强大的正相关性的。这一点,事实上没有任何疑义。这也是为什么id会被抢注的原因。不过,有两点:

1、出名与否,虽然与id相关,但是从因果关系而言,两者都是由个人品味和水平决定的。因此,即使你想到的id被别人抢注了,并不表示你的风头一定会被人抢走。你需要的,只是一个有相同品味的id,以及有水平的灌水。

2、在更看重技术的领域(比如战网上),id的好坏与主人的成功与否的相关性还没有被挖掘。有时候,人们会忽视更容易得到的信息所流露出来的意义。事实上,如果你是一个菜鸟(像我一样),基本上,就别挣扎了。你也想不出什么特别炫的名字的。

以上,就是我个人的观点。

Wednesday, May 02, 2007

我们真的需要去抢米吗?

当我们家里的大米吃完,却又没有钱去买米的时候,我们应该怎么办呢?假如城里的米商把大米囤积起来,试图高价卖给我们,宁愿烂掉也不肯低价出售的时候,我们应该做什么呢?

我们是不是应该过去劫富济贫呢?我们是不是应该把他的米仓扒开,把里面的大米分给像我们一样正在挨饿的穷人呢?

这么做是正义的替天行道!即使街对面就有一家玉米店,店老板正在免费赠送玉米。我们是吃惯了大米的无产阶级!我们怎么能去吃玉米呢?所以我们即使有免费的玉米可以吃,也宁愿去抢更好吃的大米,而不是去吃玉米。

然而,我们真的需要去抢米吗?当我们真的走投无路的时候,我们的挨饿可能是社会的错。也许我们为社会付出了太多,而收获的太少。这时候,也许我们有权利要求社会回报我们,当社会不愿意这么做的时候,也许我们可以自己行动来纠正它的错误。

但是,当我们以为自己已经走上绝路,除了偷窃抢劫以外别无他途的时候,我们却忘了回头看看那家玉米店。也许我们不是忘了,而只是不屑于吃玉米。我们宁愿做吃大米的强盗,也不愿做吃玉米的正人君子。这正是我们最大的悲哀。

Saturday, April 14, 2007

Road to Metaprogramming, a step closer

I was trying to use cl-prevalence today. As a practice, I tried to define a deftransaction macro, just the one like in the bknr-datastore package. I didn't choose the latter, because in Slime, the transactions always get stuck.

Suppose you're using prevayler in Java. It has a transaction interface. Everytime you want a new transaction, you have to define a class, write the same string "implements Transaction", along with the prototype of the transaction execution method. What if you can make transaction something more like class? Just like "enum", raised to the level of a keyword? Or, rather a function declarator like synchronized, denoting the function to be expanded in to a Transaction subclass.

If you can write:

public transaction int myTransaction (int arg1, int arg2) {
return arg1 + arg2;
}

Life would be so much easier. The compiler then has to compile this piece of code into a Transaction subclass. I don't know if the Java 5 annotation can do this. I suspect that the decorators in the latest Python versions can do this. I doubt any Java-nik can do this trick properly.

Well, I'm sure that Lisp can do this. I wrote a 'deftxn' macro, and now I can define transactions just like I define functions (with defun substituted by deftxn of course). I can call the transaction just like I call ordinary functions: actually, they are ordinary functions. The deftxn macro actually defines such a function for me.

This practice brings me one step closer to the so-called "Metaprogramming". And Lisp is the king language in this field. Wish me luck : )

P.S.: the deftxn code:

(in-package :clp-ext)

(defmacro deftxn (name (system &rest args) &body body)
(dolist (arg args)
(when (listp arg)
(error "can't have argument defaults in transaction declaration for transaction ~A, \
please implement a wrapper" name)))
(let ((args-name (gensym))
(tx-name (intern (string-upcase (concatenate 'string "tx-" (symbol-name name)))
(symbol-package name))))
`(progn
(defun ,tx-name (,system ,@args)
,@body)
(defun ,name (,system &rest ,args-name)
(execute ,system
(apply #'make-transaction ',tx-name ,args-name))))))