-
Purple Dragon Book!
计算机系的同学一定听说过“龙书”吧?编译原理的经典之作 – Compilers: Principles, Techniques, and Tools. 很幸运,我们当时的课本就是它。 刚才和同学聊到编译原理的好书还有“虎书”和“鲸书”时,他提醒我龙书已经出来第二版了 – Compilers: Principles, Techniques, and Tools (2nd Edition),让我比较吃惊。2006年出的,那时已经毕业了。做毕业设计的时候,老师就提到后来发展的许多新技术,龙书中都是看不到的,让我看虎书。现在应该好了: Every chapter has been completely revised to reflect developments in software engineering, programming languages, and computer architecture that have occurred since 1986, when the last edition published. 关于“龙书”,这里有一个词条,原来之前还有一本绿龙书,出版于1977年。不到10年,红龙书出来了,而现在的紫龙书时隔20年才出来。看到定价请不要害怕,国内已经有影印版。 看这本书以及另一本讲计算机体系结构的书的时候,给我印象最深的是,这些作者可以把如此深奥、晦涩、难懂的知识这么流畅地传授给你,让你感受不到门槛。他们不仅是科学家,还是教育家,他们写书的时候不仅要自己懂,而且要考虑如何让读者懂。而国内的作者们,肚子里本来就没东西的就不用说了,有些学术水平比较牛,写出的书看起来却不相称,许多感觉是在给自己打草稿。 另外提醒大家,千万不要看那些糟蹋原著的中文译本。与其花时间在猜测那些蹩脚甚至错误的翻译文字上,不如花点时间学好英文,去看原著。
-
Mac Terminal 的命令编辑技巧
初次试用 Mac 的 Terminal,肯定会觉得在命令行上移动光标非常不方便 —— Mac 的大部分程序中按下 Home/End 键都不是到达行首或行末,这让初次接触 Mac 的用户们很烦恼。这个其实比较容易解决,在 Mac 中,多数情况下 Ctrl-a/Ctrl-e 是行首、行末。接下来就说说其它的一些技巧,让你在 Terminal 中的工作更加高效。 现在的 Mac OS X 中的默认 shell 都是 bash 了。bash 的最基本的技巧就不必多说了,大家按得最多的,我想可能是上下方向键(或者 Ctrl-p/Ctrl-n),还有 Ctrl-r 搜索命令历史。 —————–不仅限于 Mac—————– 有一个我们一般不去碰的命令 —— “set -o vi”,它会把 bash 命令行的编辑方式改成 vi,当然了,默认 mode 是 “Insert”。你可以试试执行这个命令,然后输入命令,按下 ESC. 这时 j/k 就是上一条/下一条命令,h/l 就是左右移动了,再试试 w? 如果你喜欢 vi,这也许是个不错的选择 🙂 默认的编辑方式是 emacs,可以通过 “set…
-
Site24x7 – 网站监控小工具
前文说到 VPS 被服务商无声无息地关闭,后来我就在网上找,看有没有针对俺这种小客户地免费监控工具。我不需要你每天从全球各地发来请求测量网站的 accessibility, response time,只需在它 down 的时候及时提醒我一声就好了。 这篇文章对于廉价或免费的监控服务做了比较详细的比较,我看了看,感觉 site24×7 比较好用。免费的监控服务对我来说已经够用了,只需要给我发个邮件即可。它甚至有短信提醒,支持的列表上有中国的主要运营商,至少我测试中国移动是可以的。不过只有免费的 10 条短信,用完后买 50 条需要 10 美金,还是比较贵的。 可以查看完整的 pricing 及 feature comparison.
-
Apache 中禁止通过其它域名访问
现如今办什么事都不方便,有一天发现某 VPS 不能访问了,问服务商怎么回事,答曰指向该 VPS 的某域名没有beian,所以给你关了。国内的服务也就这样了,上面对他们野蛮,他们现学现卖,对客户也一样野蛮,连一声通知都没有。再说这个没有beian的域名,一个夹杂着字母和数字的 .cn 垃圾域名,我们根本没见过。照这样,我去花一块钱整个域名指向 miibeian,是不是它就该关了? 本来,法律法规是弱者约定用来约束强者的工具,但是现在它对强者毫无作用,反而被强者用来欺压弱者。 国内的主机商还有个特点是擅长使用 QQ,却不屑于使用其它的交流工具比如 Email. 客服丝毫不懂技术,死活要让我去把这个域名备案,shit. 后来又说,你的 VPS 上解除绑定不就行了?shit,我疯了,自己的事还忙不过来,去绑定这么个破域名。好吧,来“解除绑定”。 httpd.conf 加上这么三行: RewriteEngine on RewriteCond %{HTTP_HOST} !^(.*)\.yourdomain\.com [NC] RewriteRule ^/(.*) http://www.pig.com/ [L,R] 其实就是用的 mod_rewrite, 在请求的域名不是你的域名的情况下,重定向到一个其它的地址。 许多人可能会首先想到 mod_access,但这个似乎是用来控制 visitor IP 来源的,而不是他访问的地址。 写完发现,本文本来空洞无物,加了些抱怨,显得丰满了许多。
-
几个一直读错的英文单词
我一直认为自己的英文发音是比较准确的。如果发音不标准,至少也知道这个单词的音标是什么,大部分生词看到拼写也能知道它的音标。 我第一个发现的一直读错的英文单词是 archive. 中间的字母i,我一直认为发音是 [i:],当听到一个同学读 [ai] 的时候,心想他一定是错了,不过后来自己回去查,发现自己一直都是错误的发音。 我记得前段时间 aw 曾经再 twitter 上征集容易读错的单词列表,不知道后来有没有继续,我也 search 不到当时的 tweet 了。当时我就回复了他一个 archive. 不过最近的这一段时间,因为连续遇到一些英文比较牛的朋友,我开始愈加谨慎起来,于是陆续发现了自己更多的错误,包括: navigate. 第一个字母我曾经以为发音是 [ei] analytic. 我模仿 analysis 的音标来读 iterate. 第一个字母我认为是 [ai] 提醒一下,金山词霸这样的辞典是不怎么严谨的,它标注的音标有时候可能不准确。有时候你会发现同一个单词查出来有不同的读音(不是多音词),肯定有一个是错误的。查读音的话,比较权威的是这个:Cambridge English Pronouncing Dictionary,一个研究语言学的朋友推荐的 🙂 他还跟我说,英文单词千万不要望文生音。上面提到的几个单词,实际上都是我犯了“望文生音”的错误。 英语和美语的读音有一些常见的比较有规律的差异,可以在这里看看。 我个人觉得吧,发音准确对学好英语还是挺重要的。
-
使用英文版本网站的好处
前几天,Charles 抱怨 subversion 的客户端版本不兼容问题搞得他很烦。因为 TortoiseSVN 的最新版本在 working copy 中记录的是 1.6 的 svn client metadata 格式,而 NetBeans 使用的是他自己安装的 CollabNet 版本的 1.5.6,因此用 TortoiseSVN 更新了一下 working copy,NetBeans 就无法操作了。 Charles 坚持他在 collab.net 上看到的最新版本就是 1.5.6,然而我去看的时候,明明是已经有 1.6 版本的。我没太注意过 subversion 跟 CollabNet 到底是啥关系,反正是非常非常紧密的关系,不可能 svn 出了1.6 而 CollabNet 没有对应版本的(CollabNet 应该是主导作用的,它网站上下载的版本按理说应该是完全一样,虽然我从来没用过它的版本)。一番思考之后,Charles 终于发现了原因——他被重定向到了中文站,哈哈。 这个故事告诉我们,有英文站尽量用英文站,不要图省事用中文版本,除去读到错误翻译的风险,你还有可能因为翻译的延迟而误事。Google 的产品也是一样,新特性都最先在英文版里尝试。 Charles 说使用中文被 Collab 鄙视了,我又想到了 skype,中国人被鄙视得更加彻底,访问 skype.com 直接被重定向到 tom.com(肯定是根据 IP 判断地理位置),然后给你个贴了小广告的版本。去广告的最简单办法是访问…
-
PHP Warning: PHP Startup: Unable to load dynamic library
首先,做 web 开发一定要学会看日志。做了一个简单的 PHP 数据库程序,访问时页面全是空白怎么办?看看 Apache 的 error.log (Windows). 在 Windows 上安装 PHP 之后,如果是以 Apache 方式运行,那么 Apache 启动的时候在 error.log 里一般会出现许多 warning,大致是这样的: PHP Warning: PHP Startup: Unable to load dynamic library ‘D:\\Program Files\\PHP\\ext\\php_gd2.dll’ – \xd5\xd2\xb2\xbb\xb5\xbd\xd6\xb8\xb6\xa8\xb5\xc4\xc4\xa3\xbf\xe9\xa1\xa3\r\n in Unknown on line 0 这个错误分两种情况处理。第一种情况,某些 ext 子目录中的扩展依赖于 PHP 安装根目录下的 dll,比如 ext/php_mysql.dll 就依赖 libmysql.dll,如果你发现错误日志中有 mysql 扩展,那就说明 PHP 安装的时候,没有在 PATH 环境变量中加上 PHP…
-
混乱的中文——“标签”是什么?
我觉得中文本来就够混乱不堪的,到了计算机及其它现代科学的世界里,就完全是一团糟了(也许我说的有点过了,呵呵)。今天在网上闲逛看见这么一个比较典型的代表,就拿它举个例子。 假如做产品的跟做页面的交流,说:“这里需要一个标签。”请问这个“标签”指的是什么?我想到的有这么几种可能: tab. 不了解的请看这篇“如何处理海量tab?”,我就是看到这个想到写一写这个话题的 🙂 tag. Web 2.0 时代被滥用的东西,实际上就是更随意的分类,我在很久以前写过一篇日志“标签(tag)真的那么重要吗?”。看,当时我就怕读者搞不清楚,于是在括号里标注了英文。 label. 一个 HTML tag,用在表单中。写过不少 HTML 的人还不知道?赶紧看去。 平心而论,单单说中文混乱是偏激的。一词多义在一般自然语言中都存在,甚至在编程语言中不也很常见吗?就拿上面第二点提到的 tag 来说,在第三点里也出现了(HTML tag),不过是不同的含义。而 label 也解释为第二点的意思,和 tag 互换使用。Google 的产品就习惯把 tag 叫做 label. 这么理智地一想,又觉得英文也似乎好不到哪儿去……哦,我自己都快绕不过来了,想说服别人,却连自己都说服不了了 🙁 总起来说,结合上下文语境,英文还是更清楚一些。这些差异主要是因为计算机世界里新创造了许多概念和词汇,而某些是在中文里没有对应的,或者对应得不好。如果留心的话,就会发现台湾人有许多名词的译法跟大陆不一样,也许值得参考。有些东西不好办,还是保留原词比较好,例如 “hack” 这个词。 混乱,还是博大精深?我的思想又彪得更远,觉得语言对一个民族的性格特点有很大的影响力。中文是很善于模棱两可的,在古代更是这样,连标点符号都没有,不知道古代多少人因此吃过亏。由于交流的工具——语言本身就是很模糊的,人与人之间就是你说我猜,又怕猜错,于是孔老夫子就总结出来一套非常非常科学的行事方法,叫做中庸,一直被我们葱白到今天。 扯太远了,全是愚见,仅供一笑 🙂 做过技术书籍翻译的同志们才更有发言权。
-
葱白
前些天 Kaven 写了一篇文章 “JavaScript大牛:Douglas Crockford“。过了几天,大牛 Douglas Crockford 跑过来看,真是仔细,不光看文章,还翻到下面的评论,对这句话产生了强烈的好奇心: 不得不说,我葱白他。 于是大牛就到处找翻译,Yahoo/Google 的翻译都很糟糕——你能想象有翻译软件能搞对这句话吗?令人惊讶的是,微软的 Windows Live Translator 竟然给翻译出来了! 大牛显然是谦虚中有睿智,睿智中有自信,认定微软是正确的。 我一位同学又试了一下这句网络语言:“我稀饭你”,结果它又翻译得不错——”i’m crazy about you”. 让我葱白一下微软!
-
return 一个空的集合,而不是 null
想想几天前的天气,阳光明媚,万里无云,真是让人有辞职的冲动。到了这个小假期,似乎人间的幽怨又郁积起来,天地转入混沌,一篇迷茫。我决定窝在家里,学点东西。 这个话题对于程序员来说是家常便饭,设计许多函数、方法的时候都会遇到。实际上这是极其基本、极其容易理解的一个问题,不过有些人还没有意识到,仍然随意乱写。拿 Java 举个最简单的例子: [code lang=”java”] public List getTopUsers(int limit) { if (limit < 1) { return null; } // … } [/code] 这个例子里首先判断传入的参数 limit,如果它小于 1,那后面的工作就不需要了,这里用了 return null 来处理这种情况。这个方法可能在许多地方被调用,每次调用结束,都要判断一下返回值是不是 null,如果不是 null,才可以进行正常的处理。这是多么繁琐的事情。 [code lang=”java”] // The tedious way: List topUsers = xxx.getTopUsers(limit); if (topUsers == null) { // … } else { for (…) {…} }…