Posts published during March, 2010

设计新语 (new speak) 这种语言的目的,不仅仅是一种适合表达 Ingsoc 的世界观和思维习惯的媒介,更加要紧的是,其他的思维方式根本无法在新语下表达。 — George Orwell  “1984

语言是能够影响思维的,这一点基本上对语言和思维有认识的人都能够体会到。

一、

亚马逊丛林里面有个部落,语言中没有数字的概念,因此,当地说这个语言的人只能够分辨两框苹果哪个多哪个少,却不能数出这框苹果比那框苹果多多少。非洲也有一个部落,语言里面没有左和右的概念,只有东南西北。他们也就没有“右手”这个词,只能根据身体的朝向说你“东边的手”或者“西边的手”等等。因此当地人方向感特别强,到什么地方先要分清楚东南西北,否则没法表达一些意思。

阿拉伯人常常和骆驼打交道,因此有几十个关于大骆驼小骆驼公骆驼母骆驼等等的不同的词。 爱斯基摩人天天出门见雪,因此有地上蓬松的雪,结了冰的雪,刚下的雪,屋子上的雪等等十几个不同的词。假如他们看到一副画,就要先思考这个画里面的骆驼或者雪是什么属性的,如果不知道属性(比如卡通画里面的骆驼或者雪),他们就不知道怎么说才好。这些都是语言对思维的限制的例子。

语言对思维还有一种误导的作用。比如我们小时候常常听说的一个词叫做“早恋”。这个词在中文里面包含了偏见,好像是本来不应该的,提早了的恋情。这个词本身表达的概念应该是中性的(英文里这个词叫做 puppy love, 小猫小狗之间的恋情,媒体和大众对这种现象都是中性态度),但是中文表达出来,却包含了一种价值判断(“早”字包含了不应该的意思)。 中文中有无数这样不科学的,包含了偏见和价值判断的词(这些词被李笑来老师称为恶词)。任何一个想要独立思考的人都应该避免使用这些恶词。

二、

我们说了语言能够影响思维,那么语言是不是决定了思维呢? 这就是著名的 Sapir-Whorf 猜想。 这个猜想是说,语言对思维是有决定性影响的,即存在这样的一个语言,使得某种意思能够在这个语言中得到表达,但不见得在另外的一个语言中得到表达。 假如说 Sapir-Whorf 真的能够成立的话,那么 1984 和新语真的不是痴人说梦。

三、

所幸的是,很简单可以证明 Sapir-Whorf 猜想不正确。 大家都知道,计算机语言是一种非常受限的语言,然而只要这个语言是“图灵完全“的,他们在最根本的表达能力上都是没有区别的。乔姆斯基更加猜想,人的语言的生成机制,就是一个图灵机。 这个猜想其实和丘奇-图灵论题是等价的。 我在之前一些文章中提到的,人工智能的符号学派假设人的思维完全来自于对符号的处理,根据丘奇图灵论题,那么只要一种语言能够容纳图灵机,就能容纳其他语言了。 我们常用的自然语言是显然能容纳图灵机的, 因此,理论上来说,只要语言足够复杂,就不大可能完全决定我们的思维,使得一种语言能表达的意思完全不能由另一种语言表达。当然,不同的表达有效率的问题,因此即使本质等价,从效用上看也不等价。

四、

中文中唐诗宋词的结构之美,是其他基于字母的语言难以企及的,所以,审美是和语言息息相关的。 Python 编程中的美,函数式编程中的美,也是 FORTRAN 所未能得见的。 中文的美一定程度上来自于其搭配的模糊性和意象类比,读多了唐诗,宋词的人就知道,几乎没有一个没有类比的。 这种意象类比在文学作品中出现是一种优美的事情,但在非文学作品中,在评论,科学写作和日常交流中,这往往是正确思维的敌人。 这在一本叫做 The Alphabet Effect 的书中讲得很仔细。

英国科学家李约瑟毕生研究中国科技史,他很好奇,古代中国拥有世界上最先进的技术和生产水平,为什么却没有发展出现代科学呢? 到底是中国古代社会哪一方面出了问题呢? 这个“李约瑟问题”的答案有很多种,其中 The Alphabet Effect 这本书就提出了一种解释: 中国的书写系统不是字母化的,而是方块字。 或者简单的说,就是全怪仓颉这个人,怎么不造出拼写文字?

大体说来,此书认为,第一,中文读,写系统分离(看到,听到一个字不知道怎么写)使得阅读中文的时候较多的采用非线性(右脑)思维,而人在进行逻辑思考的时候较多的是左脑思维。两脑并用不是优势,所以中文书写系统影响了左脑的发展。 这一点我不知道对错。 第二点说,中文的字,都是从具体的图画而来,而中文的词,都是单字组合而来,这些单字组合,又必须要尊重原来具体单字的含义;加上单字又是抽象了具体的,可以画出来的事物,所以中文的抽象程度不高,且一词多义现象非常严重。 而现代科学需要的是高度抽象的词,和高度精确的概念。这一点我是同意的。现代汉语里很多词,在新文化运动前是没有的,比如“科学”,“哲学”,“政府” 等等。古希腊的拼写文字组合灵活,很早就形成了如“质”,“量”,“比率”,“几何学”,“心理学”等等和现代科学相关的,抽象程度很高的词,而这些概念则是古代汉语中从来没见到过的。第三,活字印刷术虽然号称是中国发明的,但其实一直没有大规模使用,在清代还是雕版为主。而普遍采用字母的欧洲则迅速采用了活字技术,使得雕版技术只在高档场合有所保留。 这一来更加拉大了信息传播的差距。

五、

俗话说,人穷不能怪父母,用批评中文本身的方法来掩饰在科学上的落后只是一种学说而已。 如果现代汉语和其他语言处于同一起跑线的话,本应当有足够的机会弥补这个缺口。 不过,英语已经成为一种事实上的语言了,所有的新的概念和新的学说,基本上都是以英语发表。作科研的人做到后来也知道,有些概念不知道怎么翻译成中文(而且一翻译就是错的,比如俄狄浦斯情节,翻译成中文叫做恋母情节,其实完全是把一个好词翻译成了恶词,抽象程度大大降低)。 我一直鼓吹,如果要学习计算机科学的话, 会英语的人能看英文就少看中文,因为中文中,对计算机科学中相关概念的精确程度的确比不上英文,而且一翻译就错。

英文 wikipedia 有几百万个词,而中文只有十万个,撇去因为审查制度造成的不便外,英文比中文的复杂度是在高太多了。(从这个意义上来说,审查制度是不是在扼杀中文?)
六、

语言是一种媒介,不光是语言能影响人的思维方式,物理媒介本身也能影响人的思维方式。 你是否曾经觉得在多媒体计算机屏幕前看书怎么也看不下去,一换到纸质的书就能看下去? 是否觉得小时候爱看电视的人长大了思维不连续,没逻辑? 是的,媒介会构建和摧毁你的思维方式。 多媒体计算机有很多的视觉元素,会抑制你的左脑的线性思维,激化你右脑的模式识别能力,所以,在多媒体计算机前看书的你,会自觉不自觉的被转换到右脑的思维方式,看电视也一样。 这是无法避免的事情。 科学研究发现,儿童看很多电视会影响后天的智商和持续思维能力,因为电视屏幕平均每隔90秒就要换一次场景,儿童的大脑就会发展为适应这样的持续激励的右脑思维方式,而左脑得不到必要的训练。

想买 iPad 看书的同志们,可要想好了你买了 iPad 之后大脑是不是会和你作对不让你看书哦 :) 如果你常常用 iPad 看电影上网的话,看书可能是一件让大脑感到困难的事情 :)

我的 wordpress 的 index.php 文件总是在最后莫名其妙的出现 一个 iframe, 里面有 http://www.kmsjwg.***com****/x*******x.htm 昨天晚上我检查的时候还没有,今天就已经被举报成恶意站点了。

我怀疑是博客哪个地方有漏洞,目前正在修复。 哪位有线索也可提供。

谢谢阅读

待月西厢下,迎风户半开。隔墙花影动,疑是玉人来。

最近 twitter 上最流行的一个关键词是”西厢计划”. 这个计划名字取得很浪漫,客户端叫做张生,对,就是西厢记里面那个翻墙去见崔莺莺小姐的张生;显然,服务器端必然叫做崔莺莺。客户端的张生是最重要的部件,可以不依赖于服务端工作。

我是个特别好奇的人,遇到好玩的总要学习一下看看是怎么弄的。因为西厢计划的作者只是简要的介绍了一下原理,其他报道又语焉不详,我当时就觉得很好奇,花了昨天一个晚上详细读了一下源代码,终于知道怎么回事了,觉得原理非常漂亮,所以写篇文章介绍总结一下。

先说大方向。大家都知道,连接被重置的本质,是因为收到了破坏连接的一个 TCP Reset 包。以前剑桥大学有人实验过,客户端和服务器都忽略 Reset, 则通信可以不受影响。但是这个方法其实只有理论价值,因为绝大多数服务器都不可能忽略 Reset 的 (比如 Linux, 需要 root 权限配置iptables, 而且这本身也把正常的 Reset 给忽略了)。只要服务器不忽略 Reset, 客户端再怎么弄都没用,因为服务器会停止发送数据,Reset 这条连接。所以,很多报道说西厢计划是忽略 Reset, 我从源代码来看应该不是这样。在我看来,西厢计划是利用了墙的一个可能的弱点–墙只在连接发起的时候把一个 TCP 连接加入监听序列,如果墙认为这个连接终止了,就会从监听序列中去掉这条记录,这样,这条连接上后续的包就不会被监听。西厢计划就是让墙“认为”这个连接终止的一个绝妙的方法。只要墙认为这个连接两端都是死老虎,墙就不会触发关键词检测,其后所有的数据,都不存在连接被重置的问题了。

如何让一个连接置之死地而后生,就是西厢计划那帮黑客神奇的地方了。这也不是一日之功。 首先,这帮牛人发现,墙的是一个入侵检测系统,把含有关键字的包当成一种“入侵”来对待。采取这种设计有很多好处,但缺点是入侵检测系统可能具有的问题,墙都可能有。西厢计划主页上那篇著名的论文就是讲这些七七八八的漏洞的。可以说处理这些七七八八的漏洞是非常困难的,迫使墙的设计者“拆东墙,补西墙”。这样补来补去,外表看起来好像很牛逼的墙,其实有很多本质上无法简单修补的漏洞,其中有一个致命的,就是 TCP 连接状态的判定问题。 出于入侵检测系统这种设计的局限,墙没有,也没办法准确判定一条 TCP 连接的状态,而只是根据两边收到的数据来“推测”连接的状态。而所有的关键词检测功能,都是基于“连接还活着”的这个推测的结果的。因为墙的规则是在连接发起的时候开始对这条连接的检测,在连接终止的时候停止对这条连接的检测,所以,一旦对连接的状态推测错误,把还活着的连接当成已经关闭的连接,墙就会放弃对这条连接上随后所有的包的检测,他们都会都透明的穿过墙的入侵检测。

上面只是想法,具体到 TCP 协议实现这一层,就要只迷惑墙,还不能触及我要通信的服务器。最理想的情况下,在任何有效通信之前,就能让墙出现错误判断,这些,就需要对 TCP 协议有深刻理解了。西厢计划的那帮黑客,居然真的去读 TCP 几百页的 RFC,还居然就发现了方法(这里我假设读者都知道 TCP 的三次握手过程和序列号每次加一的规则)。 我们都知道,三次握手的时候,在收到服务器的 SYN/ACK 的时候,客户端如果发送 ACK 并且序列号+1 就算建立连接了,但是客户端如果发送一个序列号没 +1 的 FIN (表示连接终止,但是服务器知道,这时候连接还没建立呢, FIN 这个包状态是错的,加上序列号也是错的,服务器自己一判断,就知道这个包是坏包,按照标准协议,服务器随手丢弃了这个包), 但这个包,过墙的时候,在墙看来,是表示连接终止的(墙是 ma de in china, 是比较山寨的,不维护连接状态,并且,墙并没有记下刚才服务器出去的 SYN/ACK 的序列号,所以墙不知道序列号错了)。所以,墙很高兴的理解为连接终止,舒了一口气去重置其他连接了, 而这个连接,就成了僵尸,墙不管你客户端了,而这时候,好戏才刚刚开始。

事实上,墙是双向检测的(或者说对每个包都检测的),因此,对服务器和客户端实现相同的对待方法,所以,墙不管客户端还不行,假如服务端有关键词传给客户端,墙还是有可能要发飙的(这里说有可能,因为我也不知道)。所以,最好的办法就是,让服务端也给墙一个终止连接的标志就好了。可是这个说起来简单,做起来难,怎么能让不受自己控制的服务器发一个自己想要的包呢? 西厢计划的那帮黑客,再次去读几百页的 RFC, 令人惊讶的发现,他们居然在 RFC 上发现了一个可以用的特性。我们上面说了,三次握手的时候,在收到 SYN/ACK 后,客户端要给服务器发送一个序列号+1 的ACK,可是,假如我不+1呢,直接发 ACK 包给服务器。 墙已经认为你客户端是死老虎了,不理你了,不知道你搞什么飞机,让这个 ACK 过了。可是服务器一看,不对啊,你给我的不是我期待的那个序列号, RFC 上说了,TCP 包如果序列号错了的话,就回复一个 Reset. 所以,服务器就回复了一个 Reset。这个 Reset 过墙的时候,墙一看乐了,服务器也终止连接了,好吧,两边都是死老虎了,我就不监听这条连接了。而至于客户端,这个服务器过来的 Reset 非常好识别,忽略就是。随后,客户端开始正确的发送 ACK, 至此,三次握手成功,真正的好戏开始,而墙则认为客户端和服务器都是死老虎,直接放过。所以,张生就这样透明的过了墙。 至于过墙以后所有的事情,《西厢记》里面都有记载,各位读者自行买书学习。

现在的西厢计划客户端,即“张生”模块的防连接重置的原理就是这样,服务器端,即莺莺模块的实现也是类似的。防DNS那个,不懂 DNS 协议,所以看不懂。我猜想,因为开发人员都是黑客,所以自然喜欢用最经得起折腾和高度定制的 Linux 开发。 现在看西厢计划的实现,因为依赖于 Linux 内核模块 netfilter, 在 Linux 上如鱼得水,但往其他平台的移植可能是个亟待解决的问题。 我觉得,在其他平台上,可以通过 libpcap 和 libnet ,在用户态实现相同的功能,就是有点麻烦而已,有兴趣的懂网络的可以照西厢计划原理,在家自行做出此功能;当然,全中国人民都用 Linux 最好 :)

PS 1: 据说是西厢计划一个作者画的原理图:http://img.ly/DIi
PS 2: 我对 TCP 的理解仅限于课本,如果上面的对技术的理解有错,请大家指出。
PS 3: 有些漏洞,可能是设计上本质缺陷,不是那么容易修复的。
PS 4: 除了最后一个图,本文没有其他相关链接,如需相关资料,自行 Google。

(2010年3月16日更新:在霍炬老师和他的朋友的帮助下,实习已经找到;在博文视点的 yeka 老师的安排下,我弟弟已经在北京安顿下来。感谢各位老师读者以及推特上各位好友的转推,关注和帮助! )

我们家有两个男孩子,原因是我小时候身体不太好,旁人都让我父母再要一个孩子,因为两个孩子好养 :) 所以我就有了一个亲弟弟,他和我妈妈姓,叫朱爱宥。

我弟弟本科的专业是园林设计,今年7月份就要毕业了。上大学的时候他忙着读书,也没有想到要找实习。现在想找个实习,积累一些经验,他自己也投了不少简历,正好我这里读者人脉广泛,所以我想问问各位读者有没有在房地产/建筑/建材/工程等相关土建类行业的,或者有朋友在这些行业的,能够有一些推荐的机会。

我弟弟在校成绩很不错,建筑景观手绘能力很强,在 Auto CAD, Sketchup, Photoshop 等软件上花了不少功夫,在我看来已经用到出神入化了;他也很勤奋努力,作事情很稳当,能满足绝大部分工作单位对新人的要求。如果哪位读者能够提供信息或者机会,我弟弟和我都感激不尽。

你可以直接与他 “aiyou.zhu@gmail.com” 联系,或者在下面留言。 谢谢各位!