Monthly Archives: November 2008

伟大程序员的工具

2006年的时候,波兰程序员stiff想出了一个好主意,就是利用互联网上公开的邮件地址,给他认为的那些伟大的程序员们发去了10个问题。有些伟大的程序员回邮件了,有些没回,stiff没说那些没回。回答了问题的程序员包括:

  • Linus Torvalds: 写了Linux内核。
  • Dave Thomas: 写了不少好书,尤其ruby相关的。
  • David Heinemeier Hansson: DHH,写了ruby框架rails。
  • Steve Yegge: lisp黑客。有个著名的blog。写了游戏Wyvern。
  • Peter Norvig: lisp黑客。Google的Research Director。写了不少人工智能相关书籍。
  • Guido Van Rossum: Python语言创造者。
  • Bjarne Stroustrup: C++语言创造者。
  • James Gosling: Java语言创造者。
  • Tim Bray: XML和Atom标准的作者之一。

鉴于stiff也是Emacs用户,我猜测stiff肯定也给RMS发了邮件,至于为什么RMS没有答复,那就未知了。

10个问题分别是:

  1. 你是怎么学会编程的?学校教育有帮助吗?或者你根本没有受过完整的学校教育?
  2. 你认为每个程序员都应该拥有的最重要的技能是什么?
  3. 你认为数学和物理对程序员来说重要吗?为什么?
  4. 你认为什么将成为计算机编程领域的下一件大事(next big thing)?面向X编程,Y语言,量子计算机,或?
  5. 如果你有三个月的时间去学一种相对较新的技术,你会选择什么?
  6. 你认为某些程序员比其他程序员的生产力强10倍或100倍的原因是什么?
  7. 你最喜欢的工具是什么(操作系统,编程/脚本语言,编辑器,版本控制系统,shell,数据库,或其他你离不开的工具)?为什么你更喜欢它们?
  8. 你最喜欢的编程相关书籍是?
  9. 你最喜欢的非编程相关书籍是?
  10. 你最喜欢的乐队/乐手/作曲家是?

我比较感兴趣的两个问题是,工具和编程书籍。他们对这两个问题的答案是:

工具:

  • Steve Yegge:
    操作系统:Unix!我现在使用linux,cygwin和darwin的时间一样多。作为提高生产率的工具,unix是无可替代的。每个程序员都应该学会使用/bin和/usr/bin下的工具。

    脚本语言:Ruby。我能熟练使用基本上所有主要的脚本语言:perl,python,tcl,lua,awk,bash,以及另外一些我正在忘掉的。但是我真的很懒,而Ruby是目前为止最简单的,我们真是天作之合。

    文本编辑器:Emacs,因为它是最好的。

    版本控制:SVN。

    Shell:Bash,因为我懒得去学一个更好的。

    数据库:MySQL。

    其他:我发现GIMP很有用,但是也很难用。我用它好多年了,但仍然几乎不能用它干什么。但我离不开它,真是讽刺。

    Firefox正在成为我的一个重要工具,当我被迫要使用ie或safari时,我会感到窒息。

    注意所有这些工具(Unix,Emacs,Firefox,GIMP,MySQL,Bash,SVN,Perforce)有一个共同点:它们是可扩展的;比如,它们都有编程接口。伟大的程序员会去编写他们的工具,而不是仅仅使用它们。

  • Linus Torvalds:
    我其实没有在工作中使用那么多工具,对其中有些工具,我已经花了时间让它们为我工作。操作系统部分显然是最重要的,但我同样写了我自己的版本控制系统(git),而我使用的编辑器(micro-emacs)也是经过定制和扩展的。

    除了这三部分,其实我最关心的是我的邮件阅读器。我使用pine,不是说它一定就是最好的,只是因为我习惯了用它而已。

  • David Heinemeier Hansson:
    OS X, TextMate, Ruby, Subversion, MySQL.这些工具是我目前喜欢的。
  • Peter Norvig:
    我不喜欢所有三种主流操作系统,Windows,Mac,Linux。我喜欢python和lisp。以及Emacs。
  • Dave Thomas:
    我几年前转到Macs了,之前我是有超过十年使用经验的Linux用户。Mac下的工具不一定是更好的,但是它们不需要经常维护了,这让我更专注于使用它们。

    我不是某一种工具的信仰者:我倾向于经常转换,这样我才能获得尽量多工具的使用经验。目前我使用OSX, Emacs, TextMate, Rails, Ruby, SVN, CVS, Rake, make, xsltproc, TeX, MySQL, Postgre, 还有许多小的辅助工具。谁知道我明年将会使用什么。

  • Guido Van Rossum:
    Unix/Linux, Python, vi+emacs, Firefox。
  • James Gosling:
    这些日子我活在NetBeans里。它能做任何我想做的,非常清晰又有效率。这是我用过的最好的开发环境。
  • Bjarne Stroustrup:
    Unix,sam(一个非常简单的编辑器),还有一个好的c++编译器,当然。
  • Tim Bray:
    我喜欢类Unix系统,像Python和Ruby这样的动态语言,以及像Java这样的静态类型语言(尤其是Java APIs),Emacs,Bash,NetBeans。

编程书籍:

  • Steve Yegge: SICP。
  • Linus Torvalds: Kernighan & Ritchie’s “The C Programming Language” ; Andrew Tanenbaum’s “Operating Systems: Design and Implementation”.
  • David Heinemeier Hansson: Extreme Programming Explained.
  • Peter Norvig: Structure and Interpretation of Computer Programs.
  • Dave Thomas: IBM’s “IBM/360 Principles of Operation.
  • Guido Van Rossum: Neil Stephenson’s Quicksilver.
  • James Gosling: Programming Pearls by Jon Bentley.
  • Bjarne Stroustrup: K&R.
  • Tim Bray: Bentley’s Programming Pearls

可以看到,工具部分9人中有6个提到了Emacs,提到vi的只有一个,且是和emacs并列提到。有两人提到NetBeans,他们都是Java背景。

书籍部分,出现两次的书有:SICP,K&R以及Programming Pearls。Lisp黑客提到的都是SICP。

全文及原文在此

Leave a comment

Expect自动登录

在公司里我用expect自动登录服务器,我的工作环境配置在那台服务器上。我不用密钥方式的原因是,用它仍然至少要输入一次密钥的密码。而在我配置好了环境的工作服务器上,我使用screen加ssh-agent 的配合,可以让我理论上从此不需再输入密码了。但是,事实上,偶尔screen detach了后就连不上了,这时就又要输次密码了。正常情况下,我每天下班后直接关机,screen会帮我自动detach掉,然后第二天上班时,用expect自动连上工作服务器,再从工作服务器用screen -r回到昨晚关机时的状态。

总之,expect的作用就是让我们从此不需要输入密码。用法其实很简单,虽然它理论上也是一种编程语言。我之前的那个自动登录脚本是网上抄的。昨晚自己看了看man,发现其基本的应用很简单,学会四个命令就行。分别是,spawn, expect, send, interact,spawn用来开启一个进程,expect用来确定输入提示,send用来自动输入,interact用来表示进入交互环境。

比如自动登录ssh服务的脚本:

#!/usr/bin/expect
 
spawn ssh kyle@x4100.unix-center.net
expect "*Password:"
send "kylepasswd"
interact

就这么简单四行而已。如果是登录ftp,则把spawn行改下即可。

当然,它也可以写出比较复杂的应用。如mkpasswdpassmass 之类,不过,我暂时还没有其他复杂需求,再说,我目前对expect的了解也只局限这四个命令。

1 Comment

11 secrets

1. 不要开发已有的东西。
要接受这个现实:大多数问题都已经被发现、诊断和解决了。

如果自己编写软件,那么在他跳槽时很可能会留下一个烂摊子,因为没有别人了解他写的软件。

2. 使用开放源码软件。
开放源码工具的性质使它们的寿命很长,对于流行的工具尤其如此。

3. 将所有东西自动化。
应该把工作自动化的原因是:避免工作比实际做工作需要更多的脑力。

4. 在设计时就考虑到可伸缩性 —— 从一开始就要计划偷懒。

5. 在设计时就考虑到硬件的可管理性。
懒惰的管理员应该尽可能避免到数据中心去。最懒惰的管理员甚至不知道数据中心的具体位置 —— 对于他们来说,数据中心仅仅是一组主机名或 IP 地址。

6. 使用出色的集群管理软件 —— 工欲善其事,必先利其器。
最受欢迎的集群管理工具包括 OSCAR (System Imager)、ROCKS、Perceus 和我们喜爱的 xCAT 2。

7. 使用开放源码的监视解决方案。
最流行的开放源码监视工具包括:
* Nagios
* Ganglia
* Cacti
* Zenoss
* CluMon

8. 用队列调度程序控制/管理用户
用户是所有问题的根源。应该尽一切努力把用户挡在您的计算机之外。

9. 检验付出所得到的回报 —— 执行基准测试!

10. 管理集群管理员交流。
生产力最高的文档共享方法是设置一个内部 wiki。

11. 不断寻找更懒惰的办法。
在这个快速变化的世界里,没人能够知晓所有东西,并且只很少一部分人精通某些东西。

英文 | 中文

Leave a comment

DEK and Emacs

Knuth是计算机世界头号牛人,其TAOCP(The Art of Computer Programming)是计算机科学界的圣经,他写的TeX是科学论文排版的标准。他可能是除了RMS之外,最有名的Emacs用户了。

今年四月,Donald Knuth的访谈,我翻译了其中讲他用什么工具那一段。翻译很烂,主要为自己更好地理解。

Andrew: What set of tools do you use today for writing TAOCP? Do you use TeX? LaTeX? CWEB? Word processor? And what do you use for the coding?

问:写TAOCP你用些什么工具?TeX?LaTeX?CWEB?还是字处理器?你用什么工具写代码呢?

Donald: My general working style is to write everything first with pencil and paper, sitting beside a big wastebasket. Then I use Emacs to enter the text into my machine, using the conventions of TeX. I use tex, dvips, and gv to see the results, which appear on my screen almost instantaneously these days. I check my math with Mathematica.

答:我一般的工作习惯是,先坐到一个大废纸篓旁,把所有的东西用纸笔写下来。然后在Emacs编辑器里,用TeX的格式把文本输入到机器里。我用tex,dvips和gv查看如今几乎是可以立刻显示到屏幕上来的结果。我用Mathematica检查我的数学公式。

I program every algorithm that’s discussed (so that I can thoroughly understand it) using CWEB, which works splendidly with the GDB debugger. I make the illustrations with MetaPost (or, in rare cases, on a Mac with Adobe Photoshop or Illustrator). I have some homemade tools, like my own spell-checker for TeX and CWEB within Emacs. I designed my own bitmap font for use with Emacs, because I hate the way the ASCII apostrophe and the left open quote have morphed into independent symbols that no longer match each other visually. I have special Emacs modes to help me classify all the tens of thousands of papers and notes in my files, and special Emacs keyboard shortcuts that make book writing a little bit like playing an organ. I prefer rxvt to xterm for terminal input. Since last December, I’ve been using a file backup system called backupfs, which meets my need beautifully to archive the daily state of every file.

我用CWEB给每一个讨论到的算法写程序(这样我才能完全的理解那个算法),它跟GDB调试器配合很好。我用MetaPost作图(偶尔,我也会用Mac机上的Adobe Photoshop或Illustrator)。我有一些自己写的工具,像我自己的用来在Emacs里检查Tex和CWEB语法的拼写检查工具。我设计了我自己的位图字体在Emacs里使用,因为我不喜欢ASCII apostrophe和left open quote看起来像独立的符号,视觉上互不搭配。我有特殊的Emacs模式来帮助我给我机器中的成千上万份论文和笔记做分类,我有特殊的Emacs键绑定让写书轻松地有点像弹奏某种乐器一样。虚拟终端的选择,相对xterm,我更喜欢rxvt。从去年10起,我开始用一个教backupfs的文件备份系统,它能给每个文件每天的状态存档,正好满足我的需求。

According to the current directories on my machine, I’ve written 68 different CWEB programs so far this year. There were about 100 in 2007, 90 in 2006, 100 in 2005, 90 in 2004, etc. Furthermore, CWEB has an extremely convenient “change file” mechanism, with which I can rapidly create multiple versions and variations on a theme; so far in 2008 I’ve made 73 variations on those 68 themes. (Some of the variations are quite short, only a few bytes; others are 5KB or more. Some of the CWEB programs are quite substantial, like the 55-page BDD package that I completed in January.) Thus, you can see how important literate programming is in my life.

根据我机器上的当前目录状态,我今年至今写了68个不同的CWEB程序。2007年,我大约写了100个,06年90个,05年100个,04年90个。CWEB有一个极其方便的“改变文件”的机制,用它我可以飞快地根据一个主题文件创建多个不同的版本和不同的变体。08年至今,我已经有73个变体,68个主题文件了。(一些变体很短,只有几个字节,另一些则有5KB或更大。其中一些CWEB程序内容相当多,如我今年1月完成的有55页的BDD包。)所以,你可以看到,文学编程(literate programming)在我生活中有多么重要。

I currently use Ubuntu Linux, on a standalone laptop—it has no Internet connection. I occasionally carry flash memory drives between this machine and the Macs that I use for network surfing and graphics; but I trust my family jewels only to Linux. Incidentally, with Linux I much prefer the keyboard focus that I can get with classic FVWM to the GNOME and KDE environments that other people seem to like better. To each their own.

目前,我在一台没有联网的笔记本上使用Ubuntu Linux。我时常会用闪存在这台机和我用来上网和作图的Mac机交换数据,但重要的数据我只相信Linux。相对于其他人更喜欢的GNOME和KDE桌面环境,我更喜欢以键盘快捷键为中心的古典的FVWM。人各有所好(To each their own)。

1 Comment

总结一下

总结一下学会的一些新东西。

Web服务器环境。Nginx Web Server, MySQL database server, PHP scripting language, 这是我们的基本环境。另外,php有两个扩展,还有一个缓存服务器memcached。Nginx和Memcached是我以往从来没有接触过的。fastcgi方式使用php,也是新知。

Cron,以前听说过,没有用过。现在才切实体会到它的强大。如果没有它,系统管理员们肯定都会疯掉。

Rsync,这是我们主要文件备份工具。以前从未用过。其他备份工具还有mysqldump和mysqlhotcopy,是用来备份数据库的。mysqlhotcopy,我知道它是个perl脚本,但是我至今还没用过它。

OpenSSH, Screen, Vim, Bash,这几个工具我以往就每天都在用了,近来只是把它们用的更加深入一些了。

还有一些跟系统管理关系不大的工具,如firefox,mlterm,fcitx等,这些也是我每天都要用的,在工作的机器上也在我的eee pcc上。

这些天最大的收获可能是shell脚本编程算是真正入门了。现在,任何可能需要重复执行的任务,我首先都会想到写个脚本把它自动化。而且,大部分时候,我都能把那个脚本顺利地写出来。

还有SQL语言,很多时候,直接操作数据库,比起用phpmyadmin这些图形化工具更有效率得多。尤其是那些需要重复执行的那些数据库操作,更是非要用到SQL语句了。现在算了解了一点SQL皮毛了。

CentOS系统。这跟RedHat区别不大,而RedHat 9是我装的第一个Linux操作系统。再说,Linux系统之间的区别,本就不大,所以不算新知。

Emacs和Vim。很久以前,我就同时是Vim和Emacs用户了。只是近来才真正深刻感觉到,Emacs是程序员的编辑器,Vim是系统管理员的编辑器。虽然,我现在每天还是开着一个Emacs Daemon,但是真正必须要用到Emacs的时候几乎没有。我只是因为喜欢使用Emacs,才将一些文本编辑任务放到Emacs里来的。写脚本,就那么顶多十来行,Vim足够了,何况服务器上都没有安装Emacs的。但是,如果我真的喜欢,当然在服务器上我也可以用Emacs。可悲哀的是,似乎我现在Vim用得比Emacs更溜了。

未来我一定得要多用Emacs,少用Vim。因为我一直以来,都觉得Emacs比起Vim更加优雅一些。Vim是quick and dirty,Emacs是真正的优雅而统一,它有Lisp语言做后盾,比vim强大这点毋庸置疑。

Leave a comment

eee pc 1000h

黑色,硬盘160G,Linux版。

时间,周六下的订单,周日银行通过审核,周一确认发货,周四送到。只用了5天,挺快的。

价格,我4000分期付款,但是似乎目前3500左右市面上都可以买到的。不过,我也不后悔买贵了,毕竟这款官方的定价也4000的,再说,分期肯定要贵点的。

电池,有5600mah和6600mah两种。据说现在都换5600的了,还好我的还是6600。

操作系统,自带的Linux系统(Xandros)是给傻瓜用的,竟然都不允许安装新的软件。还好,硬件是x86架构,支持几乎所有操作系统。我马上下了个Ubuntu eee的系统装上。Ubuntu eee是给eeepc定制的Ubuntu系统,其实跟原版Ubuntu区别不大。只是针对eee pc做了优化了而已。

安装非常简单,我是用手机的1G sd卡装的。两步,首先用UNetbootin制作一个启动盘,然后像一般ubuntu一样的安装。十分顺利,装完后,立马将源改成最新的Ubuntu 8.10的,然后更新,重启,这样eee pc上就装的是最新的Ubuntu系统了。

我用Ubuntu两年多了,我对它的熟悉程度早已超过Windows,很快就可以搭建起熟悉的使用环境,用起来自然是得心应手。

我打算主要用eee pc看计算机原版书籍,看文档,学编程,写代码。偶尔也可以听听音乐,上上网,至于看电影,这10寸的小屏幕怕是不大合适,要看也只能看看av。

随机附送一个usb鼠标,大了点。两张光盘,分别是Linux的安装盘和Windows的驱动。还有一张增值税发票,显示在这次买卖中,赚的最多的是政府,他收了17%的增值税,共计581元。如果政府不收税,商家会不会3417元就卖给我呢?

又买了一个无线路由,用了大半天的时间才将Ubuntu的wifi设置好。没办法,以前没有接触过无线网络。以后可以每天躺床上玩我的eee pc了。

update @ Dec 23, 2008
目前 eee pc 上是双系统, Windows XP 加 Ubuntu。

共8个分区,两个给Windows。sda2是windows的系统分区,主分区,ntfs格式,5G。sda7,windows的数据分区,扩展分区,ntfs格式,30G。

其余分区都是ext3格式,一个100G的数据分区外,/ 2g,/usr 4.5g,/home 2g,swap 1g。

Leave a comment

about me

我是什么,就我看来,应该是取决于我读什么书,我用什么软件,我看什么电影,我想些什么。所以,我决定就这四点,写点关于我自己。可能还要加一点,我读什么blog。

我读什么书。目前为止,我最喜欢的作家是王小波。他的所有小说和杂文,我都不止读过一遍。他影响我的趣味极大,基本上,可以说,王小波喜欢的,我都喜欢,比如卡尔维诺,比如《情人》,比如现代小说,比如伍迪艾伦,比如Beatles,等等。王小波之前,我喜欢过读沈从文和梁遇春,那已经高中的时候了,那时我也喜欢读庄子和史记。高中的时候,我也读武侠,但只喜欢金庸和古龙二人,高中之前,也看其他的武侠小说。我后来的阅读兴趣,可能就是小时候由读武侠而带起的。进入大学后,小说读得极少,计算机方面的东西读得极多。现在如果要我读非计算机的文学书,我的品位是,只读外国书,只读现代小说和现代哲学。

我用什么软件。从大二左右开始,我就已经是一个开源软件爱好者了。后来,对自由软件和开源软件了解更多后,曾更赞同自由软件的理念,最近又觉得开源软件理念也没什么不好。以前对RMS更加尊敬一些,现在对Linus也加了不少敬意。我的桌面操作系统是Ubuntu,工作中使用的台式机是Ubuntu 8.04,个人使用的eee pc是Ubuntu 8.10。浏览器我用Firefox,已有三年经验。文字编辑器,我使用Emacs和Vim,我更喜欢Emacs,但工作需要,Vim用的多一些。blog系统,如你所见,我用Wordpress。总结来说,我日常所用软件,全部都是开源软件,并且大部分是GPL授权。

我看什么电影。我大学里开始爱上看电影,主要喜欢艺术电影,好的商业电影也看。我以导演和国家为标准来挑选我要看的电影,比如,如果某部电影是贾樟柯的或伍迪艾伦的,我想都不会想,马上会下载下来看。对了,我主要的看电影方式是,用emule下载,然后在电脑上看,我似乎从来没有进过影院。如果某部电影来自一个我觉得很有异国风情的国家,比如瑞典丹麦或巴西阿根廷之类,我也会毫不犹豫地下载来看。有时间的时候,我也看美剧和英剧。国内有不少我喜欢的电影,但我从来不看国内电视剧。

我想些什么。我曾经喜欢哲学,会想人生的意义。但近几年来再也没有想过了,可能觉得人生的意义是个没有意义的题目吧。我的政治倾向很明显,假如现在有反对党,我肯定会努力加入。我支持自由主义和民主。我信奉个人主义,也就是人人必须做好自己,不要干涉别人,也不要遇事期待别人帮助。我反对爱国主义,民族主义。我坚信人权高于主权,也就是个人权利应当置于在国家利益之上。目前我的思想还比较稚嫩,所以,我还应该多读哲学,多经历世事。

我喜欢的blog,在links里基本都有。主要也就是些技术和政治的。

Leave a comment

OpenSolaris

Unix-Center是SUN专门用来在中国推广它的OpenSolaris操作系统的。它提供的免费ssh服务,我经常在用。

看到Ubuntu这么受欢迎,SUN也开始学起来了。比如免费送安装光盘 , 比如每年发布两个版本 。不过,它现在一共才发了两个版本。最新版本的OpenSolaris是2008.11,连版本号都跟Ubuntu一样来取了。Ubuntu的8.10就表示2008.10。

本人虽是Ubuntu用户,但对所有类Unix系统都有好感,都有学习欲望。其实使用哪个操作系统,对我而言是无所谓的,因为我最常用的那些工具,基本都是跨平台的。就如Firefox,Emacs,Vim,我真的找不到不支持这三个软件的平台。平时我选择软件的使用,工具的学习,跨平台是很重要的影响因素。比如VB,C#之类编程语言,我就很没兴趣,主要是因为它们不能跨平台。

OpenSolaris和FreeBSD之类,我还没怎么用过,老实讲,很想体验体验,学习学习。所以这次免费送光盘活动,我很无耻地又报名了。这次送来,不能像上次一样,装都不装了。不管怎样,也得装上,用用,熟悉一下,也许一不小心又爱上了。当年,如果不是Canonical不远千里,从荷兰给我送来免费光盘,我今日也不大可能成为一个忠实的Ubuntu用户吧。当年还是2006年呢。

Leave a comment