冠群's profile成长的见证PhotosBlogLists Tools Help

Blog


    May 24

    zz 编辑器漫谈

    原文出处

    编辑器漫谈

    这篇文章谈到的话题——编辑器,和学术没有直接联系,可是却影响着我们每天的工作效率。我们平常使用电脑的过程中,至少有三类软件是必不可少的:操作系统,网络浏览器,以及编辑器。

    网 上的很多技术论坛充斥的着这样的争论:Windows vs. Linux,或者IE vs. Firefox。可是,这些争论虽然炽热,但其历史久远的程度却无法和下面的这个争辩相提并论:Vi/Vim vs. Emacs。熟悉Unix/Linux的朋友都知道它们的鼎鼎大名,这两款编辑器都诞生于1976年,其作者也分别是计算机界举足轻重的人物,Bill Joy (Sun的共同创始人和首席科学家),和Richard Stallman (GNU的创立者和自由软件的教父)。这两种编辑器代表了不同的设计哲学,自其诞生起,关于它们孰优孰劣的争论便无日无之,伴随着它们的成长,直到现在。 在Wiki上有专门一个词条,叫做"Editor War",它描述了这场延续了超过30年依然没有尽头的“战争”。

    在这篇文章中,我无意介入这场争论,而是以一个使用者的角度,回顾在我成长的不同阶段所观察到的各种编辑器的变迁。

    遥远的Dos时代:WPS & CCED & Turbo IDE

    在1994 年的时候,我刚上初中,家里给我买了第一台电脑——那是一台486,使用MS-Dos 6.22 + Windows 3.1。虽然,Windows在那时已经初具规模,但是由于历史的原因,当时Dos下的软件远比Windows下面的丰富,因此大部分工作还是在Dos完 成。

    当时在国内,大家流行的是学习中文打字——尤其是五笔字型,由于相比于当时智能化程度还很低的拼音具有无可比拟的录入速度,广受青 睐。国外的编辑器对于中文一般支持不好,而且不符合中国人的使用方式,使用的人不多。当时主流的文字处理方式是用WPS处理一般的文章,用CCED编撰表 格。国内很多文章都是用20行20列的原稿纸撰写——一个方格一个字。这种排版方式只有WPS独家支持,而用Word实现非常困难而且使用不便。

    一 点题外话,这两款软件的作者,求伯君和朱崇君,是国内早期程序员的杰出代表。当时有一篇广为流传的报道——求伯君卖屋做软件,它让求伯君以及他创立的金山 公司成为国产软件事业旗帜。除了WPS,新一代的电脑用户更加熟悉的金山词霸也是金山的作品。平心而论,WPS还是一款非常优秀的软件,也符合国内大部分 用户的需要的。由于和微软商业竞争上的失策以及盗版的侵蚀,WPS跌下王座,辉煌不再,令人惋惜。

    而程序的撰写,主要使用每种语言自己 的IDE,比如Quick Basic, Turbo Pascal, Turbo C/C++,都有自己专用的集成编辑环境。这些软件一张1.44M的软盘就能装下,虽然功能远不如现在用DVD才能装下的Visual Studio,不过其设计确实非常经典,使用也很方便。

    在那个时候Turbo Pascal/C的出品人Borland公司是程序设计领域的领袖。可是到了Windows时代,除了Delphi的短暂风行,已经根本无力和 Visual Studio抗衡,在一系列战略失误之后,最近把它的程序设计软件事业(旗下的CodeGear公司),以两千多万美元的低价贱卖给一个别的公司。(两千 多万美元,对于一般人来说听着很多,但是相比现在的IT业动辄十亿百亿的交易来说,这实在是惨淡得令人伤心。)除了Borland高层在战略上的把握连连 失误之外,Borland的顶尖人才大量流失也是其失败的重要原因,连Turbo Pascal和Delphi的首席架构师,也在1996年被微软挖走,为微软开发了一种非常优秀的语言C#。

    Windows时代:Microsoft独领风骚

    在90 年代中期开始,Word开始大量进入国内用户的视野,并且逐步取代了WPS,占据了文字处理的垄断地位。我最早使用Word,是在Word 5.0/6.0版的时候,当时相应的Office版本是4.3。到了Windows 95之后,办公套件的版本开始改用年代表示,到现在已经更新了多个版本:Office 95, 97, 2000, 2003, 2007。

    Word 6.0给我的最印象深刻的体验就是所见即所得(WYSIWYG)——字体段落风格直接就显示在工作区里,虽然现在看来这是理所当然,这在当时可是个新概 念,WPS等当时还是主流的软件都还不能实现这点,主要还是依靠特殊控制符来表达排版。当时,Office对我有着非常大的吸引力,包括 Word/Excel/PowerPoint/Access,每个新版本出来都要详细学习一番。我家里的书柜中还摆放了不少这些软件的教程——不过已经很 久没看了,它们是那个时代的印记。

    不过,Word功能再强大,也是不能拿来写程序的。在Windows时代的程序开发,经历了短暂的战 国时代后,由Microsoft的Visual Studio一统天下。在Windows刚出来的时候,那是一团混乱。习惯了Dos编程的程序员们完全不知道怎么在Windows下面写程序。仓卒之间, 开发商就把Dos下的那些开发软件改改拿去出Windows下面的版本:比如Borland C++ 4.0/5.0和Microsoft C 7.0。由于这些东西本身不是为windows写的,用它们开发windows程序困难很多,而且很不稳定。混乱期结束后,真正的windows开发工具 出来了,最著名的是Borland Delphi/C++ Builder和Microsoft Visual Studio(包括被广为使用的VC6和VB6)。

    Borland和Microsoft的产品一度势均力敌,相持不下。随着它的一些顶 尖设计师,包括Anders Hejlsberg被挖到微软,Visual Studio有了长足进步,对于Borland的产品有着越来越明显的优势。Microsoft依赖其强势的市场地位,开始推广.Net,并且推出了C# ——这是Anders Hejlsberg领导下的一款力作,在很多方面都是非常优秀的。这时候Borland开始手足无措,左右摇摆,一时要搞Borland.Net来迎合新 的趋势,却无法抗衡微软的先天优势,一时又要搞Kylix支持跨平台开发,却发现Linux市场太小无法养活自己,而且那里是开源的天下,商业软件不是那 么受欢迎,Mac更是Apple的封闭王国,水泼不进。在进退失据之中逐步失去市场。

    在很长一段时间,从高中开始,直到到去MIT之 前,我一直是用Visual Studio作为自己的主要开发工具,经历了它从第一代版本VS97, VS6.0, VS.Net 2002, VS.Net 2003直到VS.Net 2005。功能强大而又体贴,是一款值得信赖的软件。我个人不是热别喜欢VS 6.0(虽然到了今天,它依然有大量的人在使用),主要是它对于ISO C++的标准支持得不是特别好,对于很多高级的模板用法编译上存在问题。但是,到了VS2003/2005,这些问题不复存在了。而对于C#的喜爱,也加 深了我对于Visual Studio.Net的依赖。

    专业领域:向文本回归

    Windows 是视觉的盛宴,所有的软件都热衷于“所见即所得”的方式——也给用户种下了“所见即所得”是理所当然的印象。在这种方式下,编辑成为了输入文字,以及通过 大量的鼠标操作(interaction)来选择和调节样式的工作。Interactive的工作方式,简单,直观,对于普通用户来说确实是最好的。但是 对于一些专业要求比较高的工作未必尽然。

    从计算机科学的角度看来,它最大的问题在于内容和排版样式紧密耦合。这使得贯彻排版的一致性变 得非常困难,基本需要每篇文章逐句逐段的调节。当需要更换排版方式的时候,整个耗时费力的排版过程需要重新进行。Word的样式表在部分解决了这个问题, 但是,大量的细调依旧不可避免。

    在很多专门领域,要求同一内容方便施加不同的排版方式(学术会议稿件),或者要求排版方式一致地贯彻在大量的文件之中(比如系统性的产生大批帮助文件)。这就需要内容和排版分离来大幅度提高效率——因为它要求内容和排版分离的编辑方式,而不是“所见即所得”的耦合方式。

    首 先是Latex。这是学术论文撰写的重要方式。它是以纯文本形式编写,以特殊指令,比如\section, \table, \equation等等来标示不同的内容,并通过style file来贯彻最后的排版样式。相比于Word,Latex产生的学术文档一般具有更高的排版质量。公式输入也更为方便(在熟练掌握主要的数学符号输入的 情况下)。不过,坦白地说,虽然相比于Word,Latex对于内容和样式有更大程度的的分离,但是,样式还是在一定程度上耦合在所编辑的文本中,比如 figure的位置和大小调节,以及\textbf, \emph这些直接写在文中而非style file中的指令。

    Latex这样 的编译式文字处理形式(以文本编辑源文件,并通过编译生成排版后的结果),还有着另外一个优点,便于自动产生。对于有大量图表的文章,我常用的一种方式就 是写一个脚本把实验结果直接生成Latex图表,从而节省手工录入的过程,既提高了效率,又减少了错误。

    真正的和排版无关的表达形式是 XML,它单纯地放置内容,并且通过XSL(XML Stylesheet Language)来描述内容的表现方式。这种方式被大量运用于自动化的网页和文档的生成过程。我曾经在MATLAB Exchange发表过的一些Toolbox,后来就采用了这种方式大批生成帮助页。

    http://web.mit.edu/dhlin/www/softwares/dmtoolbox_doc/helps/mdoc.dmtoolbox.mdir.xml

    http://web.mit.edu/dhlin/www/softwares/sltoolbox_doc/helps/mdoc.sltoolbox.mdir.xml

    大家可以到上面这个网址看看效果(index页面有时传输略缓慢)。主要是,撰写一些脚本从matlab源码的头注释中自动提取帮助内容,产生XML文件,并且通过XSL来定义表现形式。

    文 本如何产生呢?一种就是上述的用程序批量生成,还有很多还是要文本编辑器来编辑。在Windows里面,文本编辑基本上是百花齐放的局面。没有一种编辑器 占垄断地位,我个人用得比较多的是UltraEdit,有时也用EditPlus和NotePad++。一般来说,一些专门格式的文件都用专门的编辑器编 写,比如Latex,常用WinEdt或者LatexEditor;XML则用XML Spy,HTML主要用Visual Studio或者DreamWeaver。

    在MIT的工作:文本编辑的世界

    到 了MIT——这是自由软件的大本营,工作方式进一步受到身边环境的同化,全面向Linux转移,这一年里Linux基本就是我的工作环境。(不要误解,这 里从来不强迫大家使用什么操作系统,很多人还是坚持用windows的,呵呵,不过如果在公开邮件中宣传Windows可能会惹来Richard Stallman的责难)

    在这里,我用Latex写作业,报告和paper,用Latex-Beamer来编写 presentation(不再用ppt了),也和使用多年的Visual Studio说再见了。现在,软件的编译构建通过自行撰写MakeFile来完成。这是一种全新的体验——就是你能在这个过程中全面了解和控制每个过程运 作的细节——这一切都是自己编写指令完成,而不再是隐藏在按钮后面的神秘过程。你可以非常自由而灵活地把握和定制流程的走向。

    看上去有点麻烦,不过磨刀不误砍柴功,通过一个设计良好的脚本(这在一开始可能需要花点时间),可以把大量过程自动化(而使用传统工作方式,可能需要很多次操作),从而很大程度上提高工作效率,而且能很好保证过程的一致性和正确性。

    这 一次,都只是围绕着一个核心——编辑文本(无论是Latex source, Makefile, Bash script还是Program source code都是以文本形式存在的)。和Windows一样,Linux也有着无数的编辑器,但是有两种是长期占据优势地位的,就是文章一开始提到的 Vi/Vim和Emacs。

    在Windows里面,编辑器是普通的工具,在Linux里面,在相当程度上,这两种编辑器各自代表着一种 文化潮流,其地位不是Windows那些编辑器可以相提并论的。Emacs诞生于MIT,Vi/Vim起源于Berkeley,在我身边的人中使用 Emacs的占多数。这是一种强大得令人难以置信的编辑系统。它的使用说明长达561页,这仅仅是使用说明。还有一本长达300多页的说明,告诉你怎么用 Emacs LISP来配置这个编辑器。

    Emacs被很多人认为就是一个完备的“操作系统”。在这个编辑器里面,你除了编写各种格式的 文件之外,可以构建和运行程序,收发邮件,以文本方式浏览网页(它以一种很聪明的方式把网页的内容以比较友好的文本方式呈现给你),还可以玩游戏,和煮咖 啡(这个功能对于我来说暂时属于传说)。在某些自由软件社区,Emacs是一种信仰和生活方式,通过经过精心配置的Emacs,你基本上可以不离开它完成 几乎全部工作(Hmm, 拿它来打3D游戏似乎还不现实,但是俄罗斯方块之类的是绰绰有余了,呵呵)。

    我对于Emacs还没有那么忠 诚,不过它在过去的这个学年确实是我的主要编辑工具,我用它完成了我全部的course project——它被用来撰写C/C++, Python, Java, 和Latex。但是,MATLAB还是用matlab自带的editor来写——值得一提的是MATLAB的editor有一种Emacs模式。

    Emacs 其实是一个非常灵活的软件,对非常核心的部件都可以全面定制,而远不仅仅是key mapping, color scheme等表面的东西。对它的配置,使用一种专门为它设计的语言,叫做Emacs LISP,这是一种基于LISP的专用语言。但学习起来,可能不那么容易。Emacs的配置过程颇为繁琐,它主要通过.emacs文件配置,大家可以在网 上看看那些被分享的.emacs配置文件,基本都在数百行以上。也就是说,在让你的Emacs编辑器完全符合你的心意之前,需要编写一个几百行的配置脚 本。当然,你用默认的配置也可以,不过在某些格式的文件的编写中没有那么好使。我在第一次使用前,花了整整三天才把它配得比较顺手了。当然了,第一次配好 后,把.emacs存下来,以后就省心了——即使重装系统,把那个.emacs拷贝过来就行。

    Emacs给人的感觉是有点过于重量级 了,即使在一台配备Quadcore(3G Xeon x 4) + 8G Ram的工作站上,打开大部分插件时,还是有时感到一点delay。不要小看这一点delay,在代码编辑的过程中,在效率上会带来不可忽略的开销,(想 想击键时需要等待0.2秒的感觉)。后来,始终觉得Emacs不太适合进行轻量级的编辑,于是转向Vim。

    Vim也是一种非常优秀和强 大的编辑器,编辑效率比Emacs更高。Emacs通过Ctrl, Alt, Shift这些辅助组合键来触发各种功能。而Vim则采用模式方式,它有多种mode。在Insert mode里面,就像普通编辑器那样,比如输入dd,就是敲进去两个字符dd;而在normal mode里面,dd就是删除当前行。它在编辑命令上下了很多的功夫,编辑功能特别强大。比如单是删除就有非常多的方式,dw 删除一个单词,d3w 删除三个单词,d4j 删除接下来三行,d5k 删除前面五行, dG 删除到文章末尾,d$删除到行尾,dft删除到下一个出现的字母t,d'a删除到下个书签为a的地方。。。。。。还有其它非常多样的编辑方式。这使得很多 以前需要敲很多键才能完成的功能,在几个键内迅速实现。不过Vim的学习曲线比较陡峭,上手比较难,需要反复大量联系才能熟练,很多人看着几个模式来回切 换就晕,更不用说用说那些千变万化的命令组合。不过经过一段时间的坚持练习,后面的编辑速度可以成倍提高,非一般编辑器能比。

    相比于 Emacs, Vim相对较轻(虽然也在变得臃肿之中),而且很多必要的部件本身就配置得不错,人工配置的工作量比较少。它也有一门专门的语言来配置,叫做Vim Script,新版的Vim也可以用python来配置了。对于我自己使用感觉来说,它的Line Number Display和Omni Completion是相比于Emacs更出色的亮点,而且编辑上感觉不到延时,也不需要老是把手指伸到Ctrl, Alt这种地方去了。

     

    文本编辑是计算机一个很基础的用处,以至于我们常常忽略它。不过,当你深入到它的世界,却可以发现它独特的魅力。



    May 15

    来美九个月

    这是我来美国的九个月,也是SAVVY来美国的第九个月。当然,还是我来美国的第九个月。
    也是nothings同学来美九个月纪念日。
    发文纪念。

    为啥平时我觉得这个月发生了好多事情,但是等到总结的时候总是想不起来呢?

    州税回来了,不过只有应得的一半@@
    结束了为期一年的生理学学习@@

    响应了一下03EE五一聚会的精神,和远在DB的撒肥进行了来美以后的第二次会晤。
    吃到了红烧肉,大快朵颐,大快人心,大块的肉。
    还参观了一次MALL,见到了传说中的GUCCI和LV

    生活在一点点改变,看得到。
    May 13

    zz谈论 牛逼顿

    首先为地震受难者默哀。。。


    然后转载一下这篇文章。


    引用

    牛逼顿

    328号是牛顿的忌日,但是知道的人很少,我们毕竟更关心沈殿霞和张国荣。其实牛顿老师在科学圈里曾经很有权势,被女王封了爵位成了贵族,人称牛爵爷,官至皇家造币局局长兼皇家学会会长。如果阿尔伯特没有辞了以色列总统的话和他有一拼。

    说他有权势并不仅是官大,主要是贡献大。如果17世纪就有诺贝尔奖的话,牛顿老师至少能连续垄断4届物理学奖(分光计;力学体系的构建;反射望远镜;万有引力),同时为了表彰他在炼金方面的造诣,再奉送他一届化学奖。而且这孙子鼓捣出了流数术,所以菲尔兹数学奖也要给他。要知道,他的这些发现基本都是在26岁以前获得的,30岁以后牛顿就开始玩票了,成天琢磨上帝和炼金,以及怎样把莱布尼茨搞臭,捎带手的把以前的发现整理成书。所以你能想象到他在当时的欧洲是如何的一呼万应,敢跟他叫板的只有莱布尼茨和大主教贝克莱。牛老师死的时候,全英国的名流以给他扶柩为荣,全欧洲的名流蜂拥伦敦。来自法国的傻逼文科生伏尔泰在国葬现场大受刺激,回去就写了首诗,嫉妒之情溢于言表。

    牛顿老师的一生是天才的一生,战斗的一生,也是孤独的一生。一辈子没有朋友,也没有结过婚,很可能到死都是处男,关于牛顿是否处男的问题,由于篇幅过长,我将在另一篇文中论证。当然他肯定不会孤独,因为科学的世界里乐趣无限,快感连连。出乎世俗想象的是,科学其实远比任何娘们儿都风骚,玩科学比玩女人爽得多,得到一个成果所获得的高潮强烈而持久,不仅有快感,更有巨大的自我认同感,远胜于那几秒寒颤之后无边的空虚与落寞。所以陈景润其实是沉溺于美色不能自拔,身体弱架不住高潮过度被爽死了。

    牛顿老师茕茕孑立,形影相吊的原因是多方面的。首先他生性孤傲,自恃高才,瞅谁都是傻逼,当然不会真心跟傻逼交朋友。同时在他眼里人是不分男女的,只有傻逼和巨傻逼两种,所以他对女色没兴趣也就可以理解了。有婚介中心给他介绍过几个名媛,拾掇拾掇都是当王妃的坯子,但一见面就受不了牛顿的牛逼烘烘和不知所云。

    另一方面是外在的,不光他不愿意交朋友,也没有人真正想跟牛顿当朋友,结交他的人都是有目的的。人们对他只有敬畏和仰慕,并不真的喜欢他。这道理其实很浅显,绝大部分人都热衷于跟比自己傻的人待着,很少有人愿意在人精的身边衬托自己的二逼。所以好多人都喜欢小动物和小孩子,就是因为这些东西够傻,他们在这些东西身上能获得安全感与主宰感。不少姑娘一见到小猫小狗小人儿都会迫不及待的搂抱,接踵而至的就是很嗲的说好可爱欧~,听得我阴毛都竖起来了。有时候可爱和憨态可掬的潜台词就是弱智。小猴子也很好玩,喜欢的人就少多了,因为猴子机灵到能戏弄人,那些人没有驾驭猴子的自信。同理,喜欢小孩的都是喜欢他们的单纯与缺心眼,在他们眼里,小孩跟小动物没有本质区别,也都是四条腿走路,露着屁眼随时拉撒。如果遇到一个小天才,3岁就会心算三位数乘法或者知道傻逼二字的正确写法,她们一定会骇破了胆。所以那些喜欢养猫狗的女士们别再标榜自己有爱心了,你们其实比谁都缺德。我从不喜欢猫狗,这是因为我敬畏大自然的生灵而不忍戏弄它们;我也不喜欢小孩,因为我把他们当作一个大写的人而不是小畜生看待。

    大家不喜欢牛顿的另一个原因是他性格暴戾乖张。长年在他身边的人回忆说,牛顿在人前只笑过两回,其中一次还是嘲笑:有人问他,欧几里得的《几何原本》那么老朽,不知道还有什么价值。牛顿闻听放声大笑。而且他人品太差,跟谁都打架。众所周知他从小就有校园暴力的记录,胖子同学不小心踩了他的风车,他抬手就把胖子打哭了,我们的教科书居然说这是他有志气的表现。长大了不以拳脚论高下,他就雇用枪手大骂莱布尼茨,甚至不惜化名亲自去骂,人品至此真是无以复加。莱布尼茨若不是脸皮厚早就跟纳什一样疯了,而且牛顿老师肯定会拍个片子叫《丑陋心灵》继续恶心人家。

    关于牛顿的另一个谎言是他的谦虚,证据就是牛顿老师说过两段著名的话,一段是站在巨人肩膀上,另一段是海边捡石头子。这确实很有迷惑性,我第一次听到后感动的直冒鼻涕泡。但任何话语都是有语境的,巨人肩膀那一句的语境是这样的:胡克其实早就发现了万有引力定律并推导出了正确的公式,但由于数学不好,他只能勉强解释行星绕日的圆周运动,而且他没有认识到支配天体运行的力量其实是普遍存在的,是“万有”的。第谷早在100年前就发现了行星的公转其实是椭圆运动,开普勒甚至提出了行星运动三定律。所以科学界对胡克的成果不太重视。后来数学小狂人牛顿用微积分极其圆满的解决了这个问题并把他提出的力学三条基本定律成功推广到了星系空间,改变了自从亚里士多德以来公认的天地不一的旧观点,被科学界奉为伟大的发现。于是胡克大怒,指责牛顿剽窃了自己的成果。牛顿尖酸刻薄的回敬道:是啊,我他妈还真是站在巨人的肩膀上呢!这本是一句反语,至少不是真的想客气一下。几百年后罗永浩说自己只是站在巨人的肩膀上也是这意思。但后人出于塑造完人的目的,只保留了孤立的原话而去掉了语境,变成了一句彻头彻尾的谦辞。同样的情况出现在另一段话上:牛顿晚年因为树敌过多,来自欧洲大陆比如法德的一些新锐科学家质问他:“牛顿你丫牛逼什么啊?”牛顿此时完全的展现了他科学界大宗师的风度与水平,潇洒的回敬道:“我没有什么牛逼的。我只是一个在海边独自玩耍的小孩,偶尔会为捡到几个美丽的贝壳而欣喜若狂,却对面前浩瀚的真理大海无所察觉。”意思是说你们他妈的连贝壳都看不见有什么资格评价我?几十年的官场毕竟不是白混的,牛老师甩片儿汤话的水平已经到了信手拈来闲庭信步宠辱不惊的境界,所以我们只记住了这一段优美至极、深邃如同诗歌的话语。

    牛顿老师人品差,不谦虚,没朋友,按现在的说法这是典型的高智商低情商,事业不会成功。但我们也发现,当智商高到一定程度的时候是可以取代情商的。所以那些说自己情商低的所谓天才们,你们没成功只是他妈的还不够聪明而已,怨不着人家情商。要知道牛顿是个遗腹子和早产儿,出生时体重不到5斤,没吃过DHARHA配方的奶粉。亲娘改嫁后跟文盲姥姥度过无聊的童年,没有任何的早期智力开发和学前启蒙,7岁上学以前脑子里空空如也,牛妈妈对他的期望仅仅是认识点字然后回家务农。但是牛顿上中学后已经熟练掌握了拉丁语希腊语西班牙语和英语,然后被推荐进了剑桥,20出头就当了卢卡斯教席的终身教授。如果他能活到今天,我一定会请他当熊博网的形象代言人兼吉祥物。

    晚年的牛顿除了升官发财再无其他骄傲之处,而且官迷心窍,没退休一直干到85岁寿终。当然他并没闲着,写了150万字的神学著作,同时一心扑在化学事业上,在家里盖了窑子,拿出年轻时搞物理的劲头玩命试验。但这次他的出发点就错了,总是希望从黄铜和煤渣中提炼出黄金。要知道化学反应只能改变分子并不能改变原子,能给原子做变性手术的只能是核反应。他违背了化学定律里的物质不灭原则,所以虾米了。

    最后,说两段悼词。一段是他的墓志铭:伊萨克牛顿爵士,安葬在这里。他以超乎常人的智力,第一个证明了行星的运动与形状;彗星轨道与海洋的潮汐。他孜孜不倦地研究,光线的各种不同的折射角,颜色所产生的种种性质。让人类欢呼,曾经存在过这样一位,伟大的人类之光。另一段是英国诗人写的:自然和自然的规律隐藏在茫茫黑夜之中。上帝说:让牛顿降生吧。于是一片光明。

    不知道为什么,这两段总是让我有点感动。



    May 08

    让凯撒的归凯撒,让上帝的归上帝

    我不会做赋也不会写词不会留下惊天动地的大作。
    我会唱生日快乐歌,可是还是不习惯通过无线电波隔着几千公里唱给一个远方的朋友听。
    -。-||

    我很少会说出或者写出对别人的想法,即使是一起长大或者同屋多年的好友。
    但是我却很想为她写些什么,写些她的什么。

    最开始关注到CASSADY的时候,完全是在和别人的谈话中提到的。
    当年大一下期末时CANOEE(当然那个时候他叫TIAQI)非常哀怨的跟我说:一个叫做CASSADY(当然那个时候她叫sakura)默默的做完了一本同济的高数练习册,然后从此就NB无敌了。我大一的印象基本上完全模糊了,这是我唯一能想起来的事情。
    大一唯二能想起来的事情是下学期周五中午一个女孩子总是默默的来到3108第二排,准备下午的高数。
    大一唯三能想起来的事情是大一暑假帮李佳搬家的时候CASSADY对TIAQI说你一定电脑使用过度因为眼睛不会转只能直勾勾的向前看。

    大约在三年前CASSADY的入党大会上,老将们纷纷拍案而起,群起而攻之。我相信这对于一个性格直爽光明磊落的女孩子内心伤害巨大。果不其然从此以后CASSADY默默的重新做人开始转型,以至于几年期间里变化是如此的大是非常的大太TMD的大了,以至于我只能从照片中努力把现在的CASSADY和大一时的CASSADY相关一下。

    我喜欢着CASSADY直爽痛快的性格,欣赏着她有品位又独到的见地,她总是能够自我化解内心的忧愁,面对压力总是能够愈战愈勇。我选择永远做她惊天动地之举的支持者,永远做她行云流水娓娓道来之文章的忠实读者。她总是可以绘声绘色手舞足蹈的向我讲述经历的趣闻轶事,而我只能搜刮肚肠挤出一点事情并且很冷很汗颜以至于她听了以后很识趣的配合着嘿嘿笑笑。回想着她在福来面馆一边吃面一边吃头发,想象着暑假IBM实习时每天早上在2023穿着高跟鞋有节奏的哒哒声,面无表情的听她说今天又飚了一把死了都要爱还腼腆地说皑皑今天嗓子没唱开,眉头紧蹙的看着她如同一根木桩似的在虹口游泳馆随意式自由泳。。。

    就这样一晃四五年,我一直在一个不远也不近的地方,默默的见证着她的成长。
    我们的生活或许是本应无交集的,但总是因为其他人的出现或者其他事的发生,让我们可以并行向前,一起走过。

    请原谅,这篇文章写的太迟,让你等的太久。

    祝你能够拥有更多属于自己的精彩。
    落寞无尘,理想的天堂。


    May 07

    zz让MATLAB更快

    http://dahua.spaces.live.com/blog/cns!28AF4251DF30CA42!2393.entry

    让MATLAB更快

    MATLAB是一门在数值运算方面非常高效的语言,对于提高MATLAB的效率,有一些大家熟知的方法,比如避免使用for循环,向量化,使用C-mex写核心,等等。这些原则大体是没错的,但是教条地运用有时反而会降低效率。

    根据问题的规模,适当选择向量化的策略

    向量化的基本思想是以空间换时间,通过把要处理的对象转化成一个矩阵,集中处理。这比起非向量化的处理方式往往需要消耗更多的内存。在内存紧张的时候,内存分配的开销可能是很大的。

    比如,给定一个列向量v1,和一个行向量v2, 计算矩阵M,使得M(i, j) = v1(i) + v2(j)。一种常用的向量化实现:

    m = length(v1); 
    n = length(v2);
    M = repmat(v1, [1, n]) + repmat(v2, [m, 1]);

    这个过程中,除了M以外,还要创建两个大小为m x n的临时矩阵。repmat创建临时矩阵有一定的overhead,主要花费在元素索引上。由于元素加法的向量化收益本身并不显著,扣除repmat的额 外开销后,得益就更小了。另外,当这些矩阵很大,接近物理内存容纳能力的时候,必然导致和虚拟内存进行频繁的交换,耗费大量的IO时间,向量化可能得不偿 失。这种情况下,下面这种向量化程度略低的方式可能是更好的选择:

    M = zeros(m, n);
    if m < n
    for i = 1 : m
    M(i, :) = v1(i) + v2;
    end
    else
    for i = 1 : n
    M(:, i) = v1 + v2(i);
    end
    end

    这个例子是要说明在设计向量化的时候,要对其它潜在的影响因素也进行考虑,权衡得失。对于这个例子本身,在2007版以后的matlab,有一个通用的简洁的写法。

    M = bsxfun(@plus, v1, v2);

    MATLAB内部对于bsxfun有很专业的优化,这个写法在时间和空间上都比较节省。

    对一组d x d矩阵求逆,假设这些矩阵放在大小为d x d x n的数组里。在一般条件下,多个矩阵求逆没有特别的向量化方法,通常就是逐个求

    n = size(A, 3);
    B = zeros(size(A));
    for i = 1 : n
    B(:, :, i) = inv(A(:, :, i));
    end

    不过,当d很小而n很大的时候,比如对大量2x2矩阵求逆(这在设计几何的问题中很常见),那么直接利用2x2矩阵的求逆共识,进行向量化了:

    a = reshape(A(1, 1, :), [1, n]);
    b = reshape(A(1, 2, :), [1, n]);
    c = reshape(A(2, 1, :), [1, n]);
    d = reshape(A(2, 2, :), [1, n]);

    g = 1 ./ (a .* d - b .* c);
    r11 = d .* g;
    r12 = -b .* g;
    r21 = -c .* g;
    r22 = a .* g;

    B = reshape([r11; r21; r12; r22], [2, 2, n]);

    在正式的代码中,还需要处理可能为奇异(a*d-b*c=0)的情况。

    某些非数值计算问题的向量化

    有些问题,表面上不像是数值计算,但是通过适当的转化,也可以通过向量化解决。

    非等量复制: 比如有一组数[10, 20, 30], 各自要复制成[3, 2, 5]份,最终产生出 [10 10 10 20 20 30 30 30 30 30]。这个问题,虽然简单,但是因为不是那么“整齐”,因此向量化不是特别直接。下面给出一种思路:

    首先产生出起始位置标志向量[1 0 0 1 0 1 0 0 0 0],然后通过cumsum,产生出[1 1 1 2 2 3 3 3 3 3],最后以此为索引,可以得到结果。

    % vs: the values to be copied
    % ns: the numbers of copies

    vs = vs(ns > 0);
    ns = ns(ns > 0);

    sp = [1, cumsum(ns(1:end-1)) + 1];
    result = vs(cumsum(sp));

    对于图像处理或者二维信号问题,善用filter。

    比如,要对每个像素,基于其局部邻域进行一些计算。即使整个计算本身不是线性的,但是只要能分解成线性局部运算的组合,就可以利用filter。

    比如,对于图像I, 产生V,使得V(i, j)是像素I(i, j)周围w x w邻域的像素的方差。

    I = im2double(I);
    h = ones(w, w) / (w * w);
    M = imfilter(I, h, 'symmetric');
    M2 = imfilter(I.^2, h, 'symmetric');
    V = M2 - M.^2;