月度归档:2011年11月

『故事新编』

鲁迅创作『故事新编』用了十三年,十三年时间创作八篇短篇小说,倒不是说它们字字珠玑,这些文章本就似鲁迅顺手牵羊的产物,有灵感了,有素材了才写一篇,故每篇都是话中有话,带些讽刺。

1.『补天』:原名『不周山』,来自典故『共工怒触不周山』,不周山是支撑着天际的一座大山,不周山倒后,天塌了一角,人间四处灾祸不断。女娲不忍看见自己创造的人就此毁灭,因此捡五色石融化后补天。

2.『奔月』:嫦娥和后羿的爱情故事可以说是古代小说里的异类,它与『梁祝』、『白蛇传』这样的神鬼传说大相径庭,后两者表现的是男女双方为了爱情互相牺牲,是动人凄美的故事,而『嫦娥奔月』却不是。嫦娥与后羿结婚后,似乎是个好吃懒做的人,后羿天天出去狩猎,直到附近的猎物都被打完了,经常食不果腹,而嫦娥却是个自私的人,有天,趁后羿外出打猎,她偷吃仙丹,升天奔月,成为了一个仙人。这个故事是美丽的爱情故事传说的一个反例。另外,还有一个人叫逢蒙的,乃后羿徒弟,后因名利师徒反目,逢蒙杀了后羿。后羿这个人就一悲剧的典型。

3.『理水』:大禹治水,禹三过家门而不入。本文主要还是讽刺了一群身在其位,不谋其政的权贵们,墙头草,两边倒。

4.『采薇』:伯夷叔齐乃商纣时期的诸侯二代,因家族受纣王灭族,而投奔西昌周家。后西周伐纣,伯夷叔齐二人因迂腐的个性而离开西昌,他们觉得伐纣乃天理不容,并且发誓从此不食周粟,隐于首阳山,采薇而食之。虽然如此,二人的迂腐本性却不曾更改,四处吹嘘自己的忠烈气节,于是有人说,普天之下,莫非王土。即便是山上的薇菜,也是周家的。伯夷叔齐二人听此于是开始绝食,直至饿死。临死之前,上天派了一只母鹿想以鹿奶相救,哪知兄弟二人起了贼心,想吃掉鹿肉,被母鹿察觉而离去。伯夷叔齐的最后一丝希望破灭。鲁迅在这篇文章讽刺的就是那群封建老顽固的迂腐守旧和冥顽不灵。

5.『铸剑』:干将莫邪是楚国有名的铸剑师,楚王命他们二人铸一把剑。二人铸得一雄一雌两把宝剑,干将料到会被楚王所杀,于是只将雌剑献给楚王。十几年后,干将莫邪儿子眉间尺长大成人,得知复仇使命,于是背着雄剑去复仇,偶遇黑衣人,黑衣人承诺只要眉间尺献出自己的宝剑和头颅,就能帮其达成心愿。眉间尺相信了黑衣人,最后,黑衣人以献刺客首级和剑之名见到了楚王,为眉间尺复了仇,砍下楚王的头颅,再割下自己头颅,连同眉间尺头颅,三个头颅一起在鼎中直到煮烂,不分谁是谁,于是留下三王冢的典故。佩服眉间尺,更佩服黑衣人。

6.『出关』:老子非常博学,孔子经常以探讨之名前来切磋学问,后老子觉察出孔子的不轨,所谓道不同,孔子走的是朝廷路线,而自己走的是流沙。遂准备出关,出关之前,去带兵的总管府里又讲授了一课,最后有惊无险出了关。——孔子人品也有不堪的时候呀~

7.『非攻』:墨子说服楚国放弃攻占小国宋国的计划。联系起以前看过的一部电影『墨攻』,讲述的也是墨人守城的故事。墨守成规,墨人守城天下第一,墨子一直主张和平,一生致力于帮助孱弱国家守城抵御外国侵略。

8.『起死』:庄子路遇一尸首,苦于同情心,而请求神人将其复活,哪知此人因穿越几百年而重获新生非但没有半点感激,反而揪着庄子不放,无理取闹,上演一出哭笑不得的闹剧。所谓庄生晓梦迷蝴蝶,这故事里的哲学思想与『盗梦空间』有些类似:我梦中是一只飘飘荡荡的蝴蝶,醒来是一个忙忙碌碌的庄周,究竟是庄周梦见了蝴蝶,还是蝴蝶梦见了庄周呢?真实与虚幻,谁是谁非,几千年的疑问了。

八个传说中的故事,每个故事的剧情都足以撑起一部90分钟的电影,中国的编剧们应该感到幸福呀,历史神话题材近乎取之不尽,用之不竭,可为什么好电影还是那么少呢?

--EOF--

『暗时间』

发现越来越多出版人把目光瞄向了网路上的一些知名博客,比如『浪潮之巅』『黑客与画家』、『软件随想录』以及刘未鹏(微博)的『暗时间』等等,选择这些题材出版是有原因的,首先既然是知名博客,那就不必担心其内容的质量,群众的眼睛都是雪亮的。其次如果在网路上受到别人认可,那么把它搬到线下,推荐给另外一部分读者群,肯定也会大受欢迎。再次,所有内容都已经现成,对于作者和出版人都没有交稿的压力,何乐而不为呢。而对于读者来讲还是内容为上才是王道,只要是好的内容,别花了几天时间看完一本书给人完全浪费时间的感觉就行。

『暗时间』的所有内容源自于刘未鹏的博客Mind Hacks,按题材分成三篇:暗时间、思维改变生活、跟波利亚学解题。

暗时间篇所选的几篇博文都是关于时间管理方面的,我正是冲着这部分内容才去看它的,因为我认为自己的时间管理能力实在太差,书里边有个比喻很形象:每个人的生命就像沙漏(如封面图),里面装的沙子总量大致相当,不同的是,有的沙漏颈部较细,有的沙漏颈部较粗。颈部较细的沙漏能够抓住每一粒时间之沙,即使沙子总量一定,也能拥有更长的生命。能利用好各种暗时间的人,给人感觉就能做更多的事,从而拥有更长的生命。有两个Tips可以参考:1、不要让脑子停下来,多花时间思考问题。就像CPU,要随时让它满载运行,持之以恒,必然有了更多的思考时间。这与我前几年听过的一句话类似,那句话是说,读研期间如果觉得近阶段生活太滋润了,那就一定是不够努力,需要调整。2、随身携带笔记本,将生活中灵光一现的想法记录下来,这也是一种积累。如何有效利用暗时间很容易让人想到近年爆红的微博,想必微博的初衷是为了让人们利用自己的时间碎片,能够在较短的时间内获取信息。然而事实是,有很多人的大块时间被微博划分成时间碎片,无法利用,于是时间利用率越来越低。

思维改变生活篇主要是作者关于思维方法的一些见解。刘未鹏似乎对思维方法非常推崇,甚至对思维方法背后的人类脑科学和认知学细节也了解甚多。虽然了解思维方法形成原因有好处,但是我认为这个好处就好比成功学书籍对人的指导作用,意义不大。引用『黑客与画家』作者Paul Graham的一个观点:一个画家不必知道颜料的化学成份是什么。本篇有个例子倒是挺有共鸣的:解题时,有时候会卡住做不下去,需要别人的指点或看答案才能做出来,而别人可能寥寥一句话指出某个关键点,我们立马就知道怎么做了,因为这个关键点的知识其实是知道的,就是不知道在解题时如何把它从脑子里提取出来。这就是理解和运用的区别,看了答案能做出来的叫理解,不看答案也能做出来的才算是运用,而只有能运用自如的东西,才真正算是自己的东西。理解和运用之间的距离就是如何让自己的思维触及到那个关键点的过程。

跟波利亚学解题这部分的内容是一些思维方法在数学中的具体应用,因为本身我对数学的理解不深,对可计算理论也没有多大研究,只知道对角线原理和贝叶斯方法的神奇,却不知道它们为何会神奇到成为人工智能各领域的基石。这部分内容看过后收获不大。

『暗时间』把一些细节做得很到位,比如所有的认知理论、心理学和参考文献引用都标了出处,并且附了中英文书名等,比如作者认为重要的地方都加粗显示。另外有几本觉得比较有价值的书先记下:『影响力』『Mean Genes』『The Paradox of Choice : Why More is Less』

--EOF--

『论人与人之间不平等的起因和基础』

『论人与人之间不平等的起因和基础』是卢梭应第戎科学院征文而写的一篇论文,顺着他的思维,人与人之间不平等现象的原因被论述得非常清晰。论文篇幅很短,商务印书馆出的书质量和权威性不容置疑,就是这些老专家过于严谨的治学态度导致这类社会学著作读起来晦涩不堪,用户体验有点差。

卢梭说自己在看见这个征文题目之后很有想法,于是花了几天躲森林的小木屋里,思绪左右逢源,犹如天神附体般就将人类自野蛮人开始之后到当前人类社会出现的种种不平等现象的起因通过逻辑推理的方法论述了出来。但凡社会学理论都一样,因其与自然科学不同,它没有自然科学中包含的强逻辑性因果关系,社会学理论通常包含众多的模糊性和随机性这类不确定性。比如卢梭在书中应用的一些论证方法,一个结论通常是假设在他前一个假设之上,这在社会学科里似乎很常见,或许也正是因为这个原因,才导致社会学家的学说会如此地百花齐放。只要观点不一样,相同的问题可以走上两个极端,从而形成两个完全没有交集,没有共同思想基础的学派,如卢梭与霍布斯之间就有关于人性本善和人性本恶这两种截然相反的论述。卢梭认为,人类迄今的发展历程可归纳为自然状态和社会状态。所谓自然状态,即指人类还处野蛮人时期的所处状态,这种状态下,一个人是为自己而活,一切活动的行为指南就是这个人自己的本能,因此,处在自然状态下的人是最具幸福感的,也没有任何能限制此时人类需求的因素,而且此时人类的需求也都能得到满足。自然状态下的人类是平等的,真正的不平等出现在社会状态下,谁是第一个把一块土地圈起来,硬说“这块土地是我的”并找到一些头脑十分简单的人相信他所说的话,这个人就是文明社会的真正缔造者。自然状态下,人类没有任何可以被束缚的因素,家庭、雇佣等一些社会契约都不存在,但是社会状态下这些就成了束缚人类的因素,人类因此变得不快乐,不能随心所欲,因此才开始有了痛苦。通常有哲学家认为人类天生是群居动物,人性本恶,卢梭认为这些哲人们仅仅是从人类的社会状态开始之时起开始研究而忽略了人类的自然状态,言外之意,就是他认为自己的研究更底层,更加彻底,更符合人类自然规律。

归根到底,卢梭认为人类形成社会之后,社会契约的出现给人们带来了极大的痛苦。可是,人类又无法再回到自然状态,因为人类已经知道了社会状态带来的种种好处,正因如此,卢梭才会认为:人类痛苦的成因不在于缺乏什么东西,而是对那些东西感到需要。倘若从这个思想出发展开想象,完全可以推导出极权主义者可以以此为蓝本构建一个人人平等、唯我独尊的畸形社会,人人都不会有需求,因而人们反而会觉得快乐。所幸的是,这个学说没有被人利用。

--EOF--

『明朝那些事儿:洪武大帝』

之前一再向易少求证,『明朝那些事儿』到底是史书还是小说?里面的故事有没有虚构的成份?易少说,这确实是本史书,里面的人物、轶事、战役也均为史实,有确切出处的。之所以这么谨慎,一来觉得以后把虚构的东西拿出来当历史跟别人讲是要被笑话的,会留给人一种满口跑火车的感觉。二来对明朝历史实在没有多大兴趣,至于原因,要从『倚天屠龙记』中找,明代的开国皇帝朱元璋和功勋大将常遇春在小说中基本是个可有可无的酱油角色。特别朱元璋,在『倚』中的表现更是与我心中帝王该有的人格品质有较大出入,从而影响到到我对这个朝代产生了偏见,认为其远远不及秦皇汉武、唐宗宋祖来得威武。

朱元璋(原名朱重八,后改名朱元璋,其含义取自朱,谐音诛,元,即大元,璋,美玉)生活的年代正值14世纪元帝国夕阳西下的年代,他的几个亲人死于饥荒,自己后来也去了皇觉寺当和尚,那时候,当和尚也不一定就有饭吃,即使你寺名还带个“皇”字。因此他就要经常出去化缘,实际上就是讨饭,因此,朱元璋当皇帝之前,实际上已经干过和尚和乞丐两种职业了。中国从古至今的主流价值观一直都是讲忠义的,要对皇帝、对天子效忠,因此每个造反的人其实都是已经是被逼上了绝路的。单在『明朝那些事儿:洪武大帝』中就已体现了两次,一次是朱元璋,包括同时代的徐子兴、张士诚、徐寿辉、陈友谅等人的造反。另一次,就是建文帝朱允炆,削藩最后削得燕王朱棣造反夺权。

朱元璋开始在其岳父徐子兴罩下东征西讨,凭借着其出色的军事才能,网罗到了徐达、常遇春、李文忠、冯胜这样的猛将,也物色到刘伯温、李善长这样的谋士,逐步自己掌握大权。最后在江南淮河流域形成陈友谅、张士诚、朱元璋这样的小三国。鄱阳湖一战,朱元璋用火攻以少取胜强大的陈友谅水上舰队,那一战伤到了陈友谅的元气,最终在逃跑过程中他被一支冷箭射中,终结了其不算英雄,但算是枭雄的一生。陈友谅死后,张士诚便成了朱元璋问鼎路上最大的绊脚石。在剿灭张士诚的过程中,朱元璋显示出了一个用人不善的弱点,那就是他亲侄子朱文正因得不到重用而叛变,从建国后朱元璋一系列“死狡兔,烹走狗”的做法来看,搞不好轻用朱文正可能也是他计划内的事情。

剿灭张士诚后,朱元璋于1368年建国,国号明,年号洪武,定都应天府,今江苏南京。

建国后,朱元璋起兵北伐大元。有常遇春、徐达、李文忠、冯胜、蓝玉等一干大将在,元被迫迁出大都,撤回蒙古。常遇春在北伐过程中病死,徐达一路则因元大将王保保的奋勇抵抗而失败,蓝玉也是在北伐中小露头角的。驱逐了北元,明帝国稳定之后,朱元璋出台一系列的保护自己子孙,削减外姓功臣的政策。洪武四大案就是在那个背景下发生的:胡惟庸案,反贪污,顺便除掉宰相李善长。空印案,反贪污。郭恒案,反贪污,兼除异己。蓝玉案,除异己。蓝玉这个人,为彻底铲除北元做出了巨大的贡献,是为洪武时期名将之一,但是功成名就之后开始狂傲,最终被朱元璋抓住一个把柄所铲除。朱元璋认为,自己制定的政策能确保外姓互相制衡,朱姓永保天下不失。确实,这一点他做得非常出色。

朱元璋本来立朱标为太子,奈何朱标却过早的病死了,于是爱屋及乌传位于朱标儿子、自己的孙子朱允炆。朱允炆年轻气盛,上来第一件事是削藩,削得个个藩王人心惶惶,于是后洪武年代的最牛逼武将兼藩王燕王朱棣不干了。朱棣在北京以靖难之名起兵,由北向南一直打到南京,打胜“靖难之役”,篡位成功,改年号永乐,建文帝朱允炆则下落不明。朱棣的军事才华不容否认,自小受李文忠影响,锻炼出了卓越的军事,这是朱允炆这样的后辈无法比拟的。朱棣是有着陈友谅这般凶残的狠角色,篡位后对建文帝死忠的进行了残酷的迫害,方孝孺,凌迟,灭十族。济南铁公祠铁铉,割耳鼻后煮熟,塞入其口,凌迟,杀其子。黄子澄、齐泰,凌迟,灭三族……但是朱棣的凶残只对异己而言,对于自己的亲信,又是另一番态度了。

『明朝那些事儿:洪武大帝』最终结束于朱棣篡位成功,坐上皇位。

朱元璋肯定没料到,仅仅过了4年,自己打下的天下就被人侵占。所幸是,起兵的是自己儿子,抢了自己孙子的皇位。朱元璋该是高兴儿子的出息呢,还是愤怒孙子的不作为呢?

--EOF--

为Subversion添加HTTP支持

小团队使用SVN时用轻量级的svnserve服务器程序就足够了,又灵巧又方便配置,因为服务器端和客户端使用的协议是专为SVN设计的,所以效率也比其他类型SVN服务器(如Apache的httpd)要高些。相比之下,把Apache配置成一个SVN服务器就显得有些“笨重”了,不过它也有svnserve无法比拟的优势,比如它可以为SVN提供完善的日志记录功能和内置Web方式访问版本库,并且添加HTTP支持可以使得版本库在广域网范围内都可以方便地使用和管理。

本文的实验环境在Windows下,不过以下这些配置虽然平台相关,但是稍微转换一下就能在Linux上生效,并没有什么鸿沟在里边。

为SVN服务器添加HTTP支持主要有以下几个步骤:
1、首先安装Apache和Subversion,我这里用的版本是httpd-2.2.19-win32-x86-no_ssl.msi和Setup-Subversion-1.6.5.msi。SVN安装后,在命令行下敲svn命令,如果不提示“'svn'不是内部或外部命令,也不是可运行的程序或批处理文件。”的表示安装成功了。

2、使用svnadmin命令为项目新建一个库,这个库就是用来存储项目代码的版本控制信息的。比如E盘下有目录E:\svnroot\proj,要把该目录设置为proj项目的库,可以用以下命令:

1
svnadmin create E:\svnroot\proj

如果命令运行成功,proj目录下会生成多个目录和文件,比较重要的是conf目录。如果采用svnserve作为svn服务器,那么所有认证和权限控制的配置都在这个目录中进行,比如配置svnserve.conf、passwd和authz文件。因为我们采用的是Apache服务器,所以这些文件的配置可以省去。

3、集成Apache,添加HTTP支持。SVN已经为集成做了准备,在SVN的安装目录%SUBVERSION_HOME%/bin目录下有两个module:mod_dav_svn.so和mod_authz_svn.so。Apache服务器就是通过这两个module,将接收到的HTTP请求通过dav_module代理给SVN服务器,以此来实现以HTTP方式访问svn版本库。所以为了配置方便,最好将bin目录下的两个模块mod_dav_svn.so和mod_authz_svn.so拷贝到%APACHE_HOME%/modules目录下。

4、配置Apache的httpd.conf文件,引入所需模块。在httpd.conf的LoadModule区域的末尾添加:

1
2
LoadModule dav_svn_module modules/mod_dav_svn.so
LoadModule authz_svn_module modules/mod_authz_svn.so

这里有一个依赖性的问题,因为mod_dav_svn.so模块依赖于mod_dav.so模块,而默认情况下,Apache服务器并不加载mod_dav.so模块,所以在此之前要把#LoadModule dav_module modules/mod_dav.so前的#号注释去掉。

5、配置URL与SVN版本库之间的映射关系。还是在httpd.conf文件中,使用Apache的<Location>配置段可以配置(关于<Location>配置段的说明可以参见文章『Apache核心(Core)指令<Location>和<Directory>区别』)。具体配置见下:

1
2
3
4
5
6
7
8
9
<Location /projname>
    DAV svn
    SVNPath E:/svnroot/proj
 
    AuthType Basic
    AuthName "Subversion repositories"
    AuthUserFile  E:/svnroot/proj/conf/users
    Require valid-user
</Location>

该配置表示作用于所有URL中以/projname开头的请求。当Apache收到这样的请求时,就会去SVNPath指定的目录下去请求资源(通过module_dav代理)。AuthType表示认证类型为Basic,即用户名/密码。AuthUserFile用于指定用户信息文件的所在,该文件在下一步会产生。Require valid-user表示不允许匿名请求。

6、生成认证文件。Apache服务器提供了认证管理的工具htpasswd.exe,位于%APACHE_HOME%bin目录下,该命令的用法可以用/?选项查看其帮助信息。假如现在要生成user1和user2两个用户,密码分别为passwd1和passwd2,可以用以下命令生成用户认证文件:

1
2
3
4
C:\Apache2.2\bin>htpasswd.exe -cb users user1 passwd1
Adding password for user user1
C:\Apache2.2\bin>htpasswd.exe -b users user2 passwd2
Adding password for user user2

因为htpasswd命令的选项-c表示重新生成文件,所以第二条命令就不用该参数了。命令执行成功后,把bin目录下的users文件拷贝到httpd.conf文件中配置的AuthUserFile指定的位置去。

7、重启Apache服务器。因为修改过httpd.conf文件,所以最后一步是重启Apache服务器,使配置生效。 这时在浏览器中输入http://localhost/projname,如果出现要求输入用户名和密码的对话框,则表示带HTTP支持的SVN服务器配置成功。

Tips:
1、要想以更细的粒度为每个用户分配权限,可以在<Location>配置段中使用AuthzSVNAccessFile命令,详情可参考『使用Subversion进行版本控制』中的『每目录访问控制』章节
2、新安装的Apache服务器不会随开机启动,可以将其注册为系统服务。注册为系统服务还有一个好处是服务器程序不会显式地显示在任务栏中。注册为服务的命令为:

1
C:\Apache2.2\bin>httpd.exe -k install -n "Apache2.2 "

再去计算机的服务管理页面就可以配置Apache服务是否需自动启动。
3、Apache和Subversion某些版本的组合可能会出现类似如下的错误,具体表现为Apache服务器无法启动:

1
2
httpd.exe: Syntax error on line 129 of C:/Apache2.2/conf/httpd.conf: 
Cannot load C:/Apache2.2/modules/mod_dav_svn.so into server: \xd5\xd2\xb2\……

这个问题一般出现在Apache中引入mod_dav_svn.so模块时,猜测原因可能是mod_dav_svn.so本身是共享对象(Shared Object),它的实现也有依赖于其他模块,而Apache服务器中无法找到这些依赖模块,这些模块对Apache不可见。解决方法是把%SUBVERSION_HOME%/bin目录下的所有*.dll文件拷贝到%APACHE_HOME%bin目录中(提示已存在的不必进行覆盖)。
4、实际上有VisualSVN Server这样的工具,集成Apache和SVN,所有配置均是图形界面完成,界面非常友好。用本文的方法为SVN添加HTTP支持只是满足一下折腾的欲望。:-)

--EOF--