Author: qingbo

  • 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 -o emacs” 来设置。也就是说,在 bash 中,默认我们是可以用 Emacs 的方式来编辑命令的。回头看到达行首/行末的命令 Ctrl-a/Ctrl-e,它们就是 Emacs的命令啊。下面列出对命令编辑非常有用的一些其它指令:

    Ctrl-f/Ctrl-b: 向前/向后移动一个字符 (forward/backword),相当于方向键。
    Ctrl-n/Ctrl-p: 向下/向上移动一行,就是历史查找了,也相当于方向键
    Meta-f/Meta-b: 向前/向后移动一个单词(在 vi 模式下可以单按w/e/b)
    Meta-d/Meta-backspace: 向前/向后删除一个单词 (vi:dw/db)
    Ctrl-k: 删除到行末,非常方便。比如你向前翻历史翻了很久,又决定从头输入一个命令,那么就 Ctrl-a, Ctrl-k,把整行删掉。(vi:d$, 还可以 d^ 删除到行首,不知道 emacs 有没有对应的便捷方式?)

    ————-不仅限于 Mac 部分结束————-

    请看 Meta 键的介绍。

    如果是在 Linux 系统中,那么上文列出的命令中的 Meta 直接用 Alt 替代就行了。而在 Mac Terminal 默认的配置下,我们需要首先按一下 ESC,放开后再按后面的字母,挺不习惯吧?(这种方式在 Linux 中也应该可行)其实在 Mac 中想要试用 Alt(Option) 也很简单。打开 Terminal 的 Preferences -> Settings,选择你使用的 color scheme,在 keyboard 设置的最下面有个 “Use option as meta key”,选中就可以了。实际上这就是设置了 Terminal 程序如何发送给 shell 按键代码。不选中的话,你 ssh 到一台 Linux 机器上也必须用 ESC 键。

  • 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. 不过最近的这一段时间,因为连续遇到一些英文比较牛的朋友,我开始愈加谨慎起来,于是陆续发现了自己更多的错误,包括:

    提醒一下,金山词霸这样的辞典是不怎么严谨的,它标注的音标有时候可能不准确。有时候你会发现同一个单词查出来有不同的读音(不是多音词),肯定有一个是错误的。查读音的话,比较权威的是这个: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 判断地理位置),然后给你个贴了小广告的版本。去广告的最简单办法是访问 http://www.skype.com/intl/en/

    学好英文吧!多一种语言,多好多机会!

  • 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 的安装目录,需要你自己去修改。这一般是因为弱智的杀毒软件造成的。修改后重启机器,再试试。

    环境变量设置正确了之后启动服务还有 warning,说明这些扩展依赖你系统上没有的一些 dll 库,比如 php_oci8.dll/php_pdo_oci.dll 这些是依赖 oracle 的。你如果不在意这些 warning,不管它就可以了,毕竟只要不用到这些扩展提供的功能,就不影响服务运行。如果在意的话,直接去 php.ini 的文件末尾部分,把相应的扩展注释掉就可以了。

  • 混乱的中文——“标签”是什么?

    我觉得中文本来就够混乱不堪的,到了计算机及其它现代科学的世界里,就完全是一团糟了(也许我说的有点过了,呵呵)。今天在网上闲逛看见这么一个比较典型的代表,就拿它举个例子。

    假如做产品的跟做页面的交流,说:“这里需要一个标签。”请问这个“标签”指的是什么?我想到的有这么几种可能:

    1. tab. 不了解的请看这篇“如何处理海量tab?”,我就是看到这个想到写一写这个话题的 🙂
    2. tag. Web 2.0 时代被滥用的东西,实际上就是更随意的分类,我在很久以前写过一篇日志“标签(tag)真的那么重要吗?”。看,当时我就怕读者搞不清楚,于是在括号里标注了英文。
    3. 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 (…) {…}
    }
    [/code]

    推荐的做法是返回一个零长度的 List,这样调用该方法结束后,无需判断返回值是否为 null,直接对其进行循环。不过是 return new ArrayList(0) 吗?尽管这种返回情况几率不是太大,但是每次创建一个新对象总是让人很不爽。幸好,Java 的标准库设计者已经在 Collections 类中放了一个空的 List 常量 EMPTY_LIST,除此之外,还有 EMPTY_MAP, EMPTY_SET,真是贴心。我相信主要还是集合类自己的实现代码中有很多地方用到了它们。于是,我们把 return null 改成 return Collections.EMPTY_LIST.

    这里正好找到一个 Effective Java™ Programming Language Guide 的样章,讲的是 “Return zero-length arrays, not nulls”,基本上是一样的道理。Java 本身没有的空集合常量,我们可以自己定义嘛……事实上在我没有发现 Collections.EMPTY_LIST 的时候,我一直在自定义自己的 EMPTY_LIST 常量 🙂 不过注意一下该文中是怎么通过带参数的 List.toArray 方法去利用那个数组常量的,具体参考 Java 文档中的解释

    这是一个最基本的好习惯,让你的代码更整洁,而不会影响性能。鄙人还很弱,不过觉得一个优秀程序员的最基本素质是享受写代码的过程和代码本身,顺便享受其结果。

    这里有一本 NetBeans API 设计者写的 Practical API Design: Confessions of a Java Framework Architect,我比较希望读一下。不过这种书中估计不会讲本文这么小儿科的东西的。

  • 设想一下网络身份的高效管理及利用

    使用网络服务的目的,应该是利用它们高效、及时地交流有用的信息,获取和分享知识,能够结交到志同道合的朋友也是非常好的事情。

    前阵子有不少朋友加了我 Gtalk. 最近我也在不断地通过 Google reader 中朋友们的分享扩大自己订阅的范围,新加了不少优秀 blogger 的 RSS. 很多人会在 blog 上留下自己的 twitter 帐号,我如果发现有价值就会 follow. 另外 Fenng 当前正在进行他的每日推荐一位推友计划,也让我收获不少。

    问题

    现在一个比较烦恼的问题是,这些人在不同的网站有不同的身份,没有一种机制很好很方便地将它们关联起来。举个不太恰当的例子,Fenng 的 blog 叫做 “DBA notes“,而 twitter 账户名就是 Fenng. 当然了,Fenng 的名气比较大,一般不会搞混的,并且 blog 的 RSS 输出中也包含了作者名,所以说举这个例子不是太恰当。对于普通人,可能就很难讲两个账户关联起来。有时候在 twitter 上看到一条引人注目的 tweet,都想不起来这是谁,还得到他的 twitter 主页去看,如果上面有 blog 链接还好。有时候某人接连几个月没有更新 blog,猛然更新一下,在 Google reader 里是很陌生的感觉,假如 blog 里没有个 about 页面,说不定还真想不起来这是谁。对了,我也希望把 Flickr 的账户也关联一下。

    我虽然关注 web 发展比较多,但是真正在使用的服务还是很少的,现阶段主要也就是 Gtalk, Google reader, twitter. 那些重度 SNS 用户,可能同时在使用的还有 Facebook, LinkedIn… 一大堆,我就懒得列出来了,对于这些人来说,这么多种服务上的朋友们肯定重叠的几率特别大,但是到底有几个朋友的行踪是自己熟悉的呢?twitter 上有位朋友发了一句话,我希望能够以最快的方式知道他是谁,我以前对他的看法,他还在网络上其它什么地方发布有价值的信息。

    friendfeed 我用得不多,但是感觉它不能解决我的问题,我似乎没有选择的余地,要么订阅他的全部,要么什么都不要。目前我在 Gmail contacts 里整理了一些联系人,有的怕忘记,在 notes 字段里写一段描述。仅此,并不是很方便,我几个月可能用到一次。

    设想

    最近似乎老是听到有人谈 “CRM”,地铁里也时不时有哥们聊这个。我就很惭愧了,我知道它的字面意思,却不知道自己对它的理解在什么程度。这里我就以自己粗浅的理解来类比一下。商家需要管理客户的信息,要知道客户什么时候在自己这里消费,抛开隐私问题不谈,他们甚至想知道你在别的地方消费了什么,每天都在干嘛,从而提供更好的服务(也就是诱导再次消费,获取更多利润)。在线下交友的时代,朋友关系用脑子管理就行了。我知道邻居或者同事张三在哪儿工作,闲暇时间喜欢干嘛,过些天要到哪儿去旅游。然而通过网络结交的朋友(或者是关注的人,可能这一类更多),动辄数十上百,大脑就不够用了。于是我们是不是也应该模仿 CRM,来个网络关系管理呢?因为面对的就是网络,没有线下的流程,肯定会比 CRM 更流畅、更方便。

    其基础肯定是一个类似 Gmail contacts 的东西,传统的地址、电话号码也很重要。在这里应该可以给每个联系人关联其 Email, twitter, blog, facebook 等任意账户(链接),可以加自己的备注(以评论的方式最好,一条一条分开)。如果仅仅做到这一步,简直是太容易了,Gmail contacts 差不多已经是这样了。不知道是不是已经有这样的专门产品,我就懒得去找了。

    最关键的,是怎么让用户为这些朋友定义好的账户关联实时地发挥作用。我能想到的一些情景:

    • 查看邮件时,界面右侧可以显示发件人最近的 blog 更新、最新的 tweet
    • 在 Gtalk gadget 中聊天,可以显示为对方关联的信息
    • 查看某 twitter 用户首页,可以显示为对方关联的信息。甚至可以将 twitter 网站上的所有头像改造成 flickr 那样,悬浮并点击时获取数据。
    • 在 Google Reader 中阅读时,可以根据地址栏中的 feed url 获取关联的信息
    • Facebook, flickr, 只要是浏览器中可以访问的个性化服务,都可以加上上述的功能

    具体的实现方式呢,可以视情况而定。比如界面比较空闲的,可以直接显示一些详细信息(blog post, tweet, photos…)。像 Google Reader 这种满屏都是内容还嫌地方小,就应该找个地方显示一个小图标,点击之后再显示详细信息,具体显示什么,用户都可以定制。

    只要提供了 API,这些都不是难事。Greasemonkey 或者 Firefox addon 都可以比较方便的实现这些功能。

    也许现在已经有这样的产品,只是我太闭塞了没有发现?呵呵,如果没有的话,建议有空的人能够实现类似的东西。我的想法比较杂乱,不过也许将来我会整理一下思路,自己做这么个东西……

    在虚拟的网络中把握住现实的东西,才不会迷失自己。