Oct 28, 2008 - Obama 的胜利将是web2.0 的胜利

Comments

几个简单的例子:

Facebook 上, Obama 的页面比McCain 要早N多天建立, 其他社会网站上情况也差不多

Obama 网站上有Flash 做的各种各样的Flash 的工具, 你可以算自己的Tax cut, McCain 网站上没有

Obama 网站使用Ajax. McCain 网站什么都没有, 视频也老不变.

McCain 网站上唯一的亮点就是链接了很多YouTube 视频, 都是真实的抱怨 Obama 的.  很可惜, 这些视频都是网站工作人员自己链接的, 不是人上传的.

Obama 旗下我知道的就有五个网站(我不是天天看新闻的人, 都是误打误撞访问的). 其中有两个是和谣言作斗争 (http://fightthesmears.com/ http://www.stopthesmears.com/) 其中后者更加的web2.0, 用户可以上传自己听到的谣言和澄清.

Obama 所有的信息都是扁平的, 搜索引擎友好的. McCain 的信息显得层次化, 要找信息比较难.

就凭旗下网站的数目和对社会化网站的使用程度, Obama 同学不可能不赢.

PS: 我和女友都是穷学生. 我们到Obama 的网站上简单的用”减税计算器” 算了一下, 平均都会有 400-500美元的减税. 而McCain 不对我们这些收入低的人减税. 因此, 我们这一代人, 基本上都会投 Obama.

Oct 26, 2008 - 一周杂记

Comments

A. 荐书

向大家推荐4本我读了之后觉得非常非常好的书

1. Smart and Gets Things Done (Joel Spolsky)

从一开始就读Joel 大叔博客的同学就不需要看了, 因为文章都是从他博客上选下来的. 书中讲了技术公司怎样找 “聪明并且能把事情完成” 的人. 别被标题误导了, 这不是一本讲如何 GTD 的书, 但是这本书对于”准备过冬” 的技术人员, 绝对是好书一本. 另外听说[阮一峰要翻译](http://www.ruanyifeng.com/blog/2008/10/i_will_translate_more_joel_on_software.html), 还是很佩服的. 同时很惊讶: 为啥这么好的书到现在才翻译, 要知道 JoS 04年就出来了. 

2. Bell Labs: Life in the Crown Jewel (Narain Gehani)

这是一本既不出名, 封面也不好的书. 可是这个书好在两个地方: A. 作者见证了Bell 实验室的从 80 年到 01 年的荣辱兴衰. 书中关于各种各样的八卦都有涉及, 而且作者作为做技术出身的, 对UNIX系统的前世今生, 对几位大佬的八卦生平, 都让我们这些后来的研究者向往. 

3. Advices for a Young Investigator (Santiago Ramon y Cajal)

也是一本不为众人所知的小众书. 最近被大家分享很多次的 “非常牛逼、相当见血” 就是其中的一段. 我觉得对于我这样从事科学研究的年轻人来说, 这本书讲的的确的相当见血, 非常受用.

4. The Rest is Noise (Alex Ross)

[A. 荐书

向大家推荐4本我读了之后觉得非常非常好的书

1. Smart and Gets Things Done (Joel Spolsky)

从一开始就读Joel 大叔博客的同学就不需要看了, 因为文章都是从他博客上选下来的. 书中讲了技术公司怎样找 “聪明并且能把事情完成” 的人. 别被标题误导了, 这不是一本讲如何 GTD 的书, 但是这本书对于”准备过冬” 的技术人员, 绝对是好书一本. 另外听说[阮一峰要翻译](http://www.ruanyifeng.com/blog/2008/10/i_will_translate_more_joel_on_software.html), 还是很佩服的. 同时很惊讶: 为啥这么好的书到现在才翻译, 要知道 JoS 04年就出来了. 

2. Bell Labs: Life in the Crown Jewel (Narain Gehani)

这是一本既不出名, 封面也不好的书. 可是这个书好在两个地方: A. 作者见证了Bell 实验室的从 80 年到 01 年的荣辱兴衰. 书中关于各种各样的八卦都有涉及, 而且作者作为做技术出身的, 对UNIX系统的前世今生, 对几位大佬的八卦生平, 都让我们这些后来的研究者向往. 

3. Advices for a Young Investigator (Santiago Ramon y Cajal)

也是一本不为众人所知的小众书. 最近被大家分享很多次的 “非常牛逼、相当见血” 就是其中的一段. 我觉得对于我这样从事科学研究的年轻人来说, 这本书讲的的确的相当见血, 非常受用.

4. The Rest is Noise (Alex Ross)

](http://www.therestisnoise.com/) 是今年 McArthur 奖的获得者之一. 我博客上以前提到的贴乐谱的音乐博客就是这哥们. 他是纽约时报的专栏作家. 这本书等于是20世纪音乐指南. 而且差点拿今年的普利策. 我只读了几章, 爱不释手. 

B. 编程

根据 TopLanguage 论坛上讨论的结果和我自己的研究和几周的思考, 我觉得对于我来说, 以下几门语言值得学:

  • AppleScript

AppleScript 最大的好处在于可以控制苹果下的应用程序. 当然这个不是AppleScript 独有的, 因为Ruby/Python 也能很好的完成任务. AppleScript 酷的地方在于, 它非常贴近自然语言. Java 已经算得上很贴近了, 可是还是受限于关键词和类库. 比如 public static void main 就完全不是合法的英语. Python 稍微好一点, 函数名都比较自然语言, 但是还是不够. 比如 pos = string.find(s,’^’) 这一个简单的语句就蕴含了对象方法赋值这两个操作. 对于不懂编程的人, 这些都是需要学习成本的. 而 AppleScript 的思路就比较新颖: 放弃 BNF 的约束, 规定一个更加松散的贴合英语的语法. 然后告诉用户, 哪些词是可以用的动词, 哪些是可以用的名词. 比如以下是 Adium 编程文档里面的两行:

application n : Adium’s application class

close v : Close a document.

close specifier : the document(s) or window(s) to close.

这样, 用户就可以用松散的语法规则, 用英语编程. 在 AppleScript 里面, 可以用 a of B, 而不需要 B.a. 种种这些, 让我觉得, 未来的编程语言未必就是一种发展方向, AppleScript 可能是向自然语言编程过渡的一种语言, 值得一学. (Ubiquity 也有动词和名词的说法)

随着多核和云计算成了下一代的架构选择, 语言也要变化一下. 这两个语言都是函数式的, 支持分布式的(类似 Erlang), 跑在 JVM 上的. 我一直喜欢 JVM 平台上的语言, 因为 JVM 设计干净, 跨平台, 分布和并发解决的都很好, 也有很多现代特性. 而 x86/IA32 原生的环境, 不见得未来能够被多核环境容纳. 我觉得编程语言也到了 Paradigm Shift 的时候了, 把宝押在 JVM 平台的函数式编程语言上. 

  • Ruby

这个原因很简单, 觉得学一个和 Python 竞争的语言对于用 Python 也有启发. 而且的确发现Ruby 的长处, 特别是比较了 Django 框架和 RoR 框架后, 觉得 Ruby 值得一用. 

C. GTD

 最近因为写书稿, 事情多, 更加注意事情的组织, 因此总结了几条GTD和时间管理的如下 (我最近一直在注意实践 GTD, 不过我从来没订阅 LifeHacker 和 43 Folders, 因此以下的经验大家或许早就看到或者体会到了)

  • 不要迷信 Moleskines (以及任何工具) 

我以前也没听说过这个笔记本. 最近写书稿, 觉得计算机打字效率低(而且要画图, 涂改, 纸笔最好). 因此到书店买了一本看上去很顺手很结实的软面笔记本, 回来以后才发现是 Moleskines, (据说还是众多大牛用过的, 国内还有专门的博客介绍这个, 顿时感觉自己太他妈的小资了). 用了一段时间 Moleskines, 大体感觉如下:

  1. 结实, 边角圆的, 不容易皱, 对于我这样整天把乱七八糟东西塞包里面的人很实用.
  2. 那个小绳书签其实没用, 因为可以夹一张纸. 小绳老是挂我钥匙圈上
  3. 如果要用它排日程, 最好用专门的日程表. 软面的用来排日程要自己画表格, 画标签, 浪费时间. 
  4. 最有用的是那圈松紧带. 能合上笔记本, 还能夹上很多小便签. 我已经很变态的给我的苹果加上了一圈很难看的绿色的松紧带, 这样我可以夹一些纸. 这个是 Moleskines 最有用的设计了. 
  5. 艺术家其实都是用这个笔记本画图的, 和我们今天的用法千差万别….
  • 用好现有工具的基础上试用其他工具, 不要着急换工具

为了写书提纲, 我用了很多工具. Freemind 等等. 到头来发现, 还是文本编辑器最好. 同时, 因为我发现思维比打字快, 而且不习惯在计算机前面书写, 所以我都先用纸笔写, 但是最终必须电子化, 为此我尝试了很多办法, 比如买了一个电子笔记本在上面写, 在 Tablet 上写等等, 结果这些越用越不顺手;  原来我用一个优盘+ rsync 就可以带着所有的书稿到处走, 后来我用 SVN 管理, 又发现每次同步解决冲突麻烦死了 (我的掌上电脑上没有 SVN).  因此, 到最后, 还是采用外带一个优盘到处走的方式. 书写的时候还是用纸笔, 也不搞什么手写笔之类的炫的, 直接等有空的时候敲进电脑. 经过这些折腾, 我的经验就是: 什么顺手, 就坚持用什么. 时髦的新工具不见得最适合. 况且这些旧工具我用得比大多数人都熟悉, 就算用文本组织, 用机械的同步, 效率也不比用其他时髦工具差. 领会了这条, 我就不是太急切的幻想明天出来一个新工具把我的效率提高100%, 因为显然不可能. 

(完)

Oct 19, 2008 - 完全用命令行工作-4: 苹果图形界面脚本化

Comments

我用苹果 Mac OS X 两年了, 越用越觉得, 其他操作系统要从苹果的 Mac OS X 上学习很多东西. 特别是图形界面的统一的脚本化接口, 我认为这对未来的操作系统是一个很好的启示, 也是完全用命令行工作哲学在图形界面时代的一个不可缺少的部分.

起因是最近我在写一系列的中文文章, 因为几乎没有数学公式, 而我又喜欢纯文本的工作方式, 因此在排版上我选择了reStructuredText. 一般来说, 英文文本我都是直接在 vim 下工作. 可是苹果下的 vim 对中文的支持不是想像的那么好, 至少中文输入法打出来的常常有乱码. 名动天下的 TextMate 固然好, 显示中文却只有半个字那么宽, 看上去很不舒服. 其他的编辑器要么收费, 要么嫌大, 要么不顺手, 因此落到最后还是用了苹果的 TextEdit.

但是写技术文章的人都知道, 写文章不仅是打字这么简单. 特别是技术文章, 常常需要离开编辑环境跑脚本, 查Google, 看 wiki. (我不知道别人是不是这样, 至少我为了写出质量较好的文章, 写的时候也要做很多功课). 特别是因为我在用 reStructuredText, 一个最基本的需求就是处理当前文本生成 HTML/LaTeX 然后预览. 这些需求, 在 VIM 和 TextMate 中都是原生支持的, 很简单能做到. 但是在 TextEdit 这样的软件中, 乍一看, 毫无办法. 所幸的是, UNIX 家族的操作系统, 特别是苹果, 秉承了 简单的事情要有简单的解法, 复杂的事情要有可能的解法 这样的设计思路, 提供了不止一条解决问题的方法. 因为苹果设计了一个叫做”脚本化应用程序”的东西, 使得这些任务可以很简单的完成. 我研究了几天, 学到了一些东西, 拿出来和大家分享.

  1. 最常常被忽略的菜单栏, Service 菜单.

用具体的例子来说可能更加简单. 用 Gmail 的各位都知道, 如果邮件里面有 90081243455 这样的数字串, 或者有 北京是西城区XX路YY号 这样的地址, Gmail 就很贴心的显示出 “使用 Google 追踪快递包裹” 或者 “使用地图查看地址” 这样的链接. 也就是说, Gmail 会识别出这些特定的样式, 然后给你一个上下文相关的(也就是说, 和你内容相关的) 服务. 这样的服务贴心舒适, 相信不少人都很喜欢. 一般我们把这个叫做上下文相关的服务.

再说 Firefox. 前不久 Firefox 出了一个很贴心的小插件, 叫做 Ubiquity, 我在 Firefox 下几乎离不开它: 选中任何一行地址, 只需要敲几个键, 就可以查 Google Map. 选中任何一个名词, 可以立即查 Wikipedia, 等等. 一般我们把也把这个叫做基于选定的服务.

苹果上的 Service 菜单, 就是这样的一个基于上下文相关和基于选定的服务. 举个最简单的例子, 如果你的机器上装有 Skype, 然后你选中了一串电话号码, 这时候你可以到 Service 菜单中选择 Skype -> Call this number. Skype 就会自动拨打这个电话. 或者选中一个单词, Service 菜单中就会自动出现: Look up in the Dictionary. 选中它以后, 你机器上的字典就会跳出来, 把单词的释义呈现给你. 所有的这一切, 都是基于苹果的一个叫做 System Service 的框架. 简单的说, 每个应用程序告诉系统: 在什么情况下, 你给我什么信息, 就可以让我做什么事情. 这样, 在选定的上下文符合条件的时候, 你就可以在菜单中选择这个服务. 这个东西方便无比. 比如说, 常常老板在邮件里面写: 你这周做啥啥. 我就可以选中整行句子, 按下 ⇧⌘ Y. 这样整行句子就被纪录到 Stickies 里面去了, 相当于随时写下一个便签.

现有的菜单栏固然好, 但是自己编写的更加好玩. 所幸的是, 你不需要会苹果的生涩的 Obj-C 才能编写菜单. 有一个强大的工具, 叫做 ThisService, 能够把 Ruby, Python, Applescript 和 shell 脚本都包装成 Services. 比如说我昨天就花了一分钟写了一个很简单的叫做 Translate 的脚本, 通过 Python 提交文本给 Google Translate, 返回中文. 在阅读有很多不认识的单词的新闻文章时候, 只要选中段落, 选择这个 Translate. 一个翻译成中文的窗口就出现了. 在这个软件的帮助下, 任何脚本都能点一下鼠标就变成一个服务: 具体我就不一一详述了.

总的来说, 我们可以注意到, 在日常使用计算机的时候, 一个应用程序中的一些内容(文本或者图像), 往往要作为另外一个程序的输入, 交给另外一个程序处理. 比如选中的单词查字典, 选中的地址查阅地图, 和选中的电话号码拨打, 选中的句子翻译等等, 这些需求都是存在的. Windows 家族解决问题的方法, 是通过程序切换和剪切板. 而苹果就是通过统一的接口来完成的, 思想和UNIX管道是非常相似一脉相承的 (当然, windows 家族从来就没有 UNIX 家族管道这个思想, 所以也就想不出统一接口这样的设计了).

在苹果下, 统一脚本接口可以用来处理像 Service 这样的程序之间通信的问题, 这个是 windows 家族从来没有想过的. 同时, 据我个人经验, 这个思想在 Linux/X11 家族也没有全部实现. 在 Linux 命令行下, 我们都知道, 不同的小工具之间是正交的, 一个程序的输出是一个程序的输入, 这个 UNIX 哲学长盛不衰. 直到今天, 正常的 Linux/UNIX 用户也会天天用管道做程序之间的通信. 可是在图形界面出现后, 这样的好传统在 X11 系统中似乎没有被继承. 比如, 不能选中一段文字直接送给 wc 计算字数. 究其原因, 是因为图形界面再也没有明显的输入输出这个概念了. 字符串和图像变成了要在程序之间传送的基本单位. 在这种情况下, 就需要不仅仅以文件为基本单位, 而是以被选中的那些字符串, 句子, 链接, 图片等为基本单位的通信. 在这个层面上, 苹果的确先行一步. (当然 Emacs VIM 等等也是可以通信和调用外部程序的, 但是毕竟不是整个系统都能这样).

  1. 史上最简单的语言, AppleScript.

故老相传, 当年 Knuth 大神访问苹果, 总裁 乔布斯 同学发挥爱吹牛的光荣传统, 说: 高教授, 您来了. 我特别崇拜你, 您的书我都读过. 各位读者都知道, 要是Jobs 真的把高教授的书都读过, 全世界大学计算机系99%的教授基本上都要自杀让位给Jobs. 所以, 高爷子知道他吹牛皮. 以下的故事分两个版本, 第一个版本是硅谷的版本, 是高爷子当即就说: 斯蒂夫同学, 你又扯淡忽悠了. 第二个版本是我的版本: 说高爷子一听, 也不生气, 心想, 你我共同作为硅谷两个最懂字体设计的搞IT的, 我也不好得罪你, 且问你一道简单的问题, 看你读了我哪几本书. 于是高爷子眼珠一转, 题上心来, 问到: 乔布斯同学, 请问世界上最简单的编程语言是啥子呢? 乔布斯是个不懂技术的主. 想起当年和 Woz 合作的时候搞的东西叫做 BASIC, 听名字就觉得简单, 于是说道: 乃是 BASIC. 高爷爷说, 还有比这个更简单的么. (话说高爷爷心想, 我手里握着 TeX, Metafont, MIX, Literate Programming, CWEB 等几张王牌, 我就不信你说不出一个搭不上边的). 乔布斯同学哪能体会到高爷爷的良苦用心, 他又不会编程, 于是就杜撰到: 我们公司最近正在开发世界上最简单的一个语言: 叫做苹果脚本(AppleScript). 高爷爷一听就知道又是吹牛, 于是立即回复: 斯蒂夫, 你又扯淡忽悠了. 斯蒂夫同学哪服软, 于是要求开发部门开发一个连他都懂怎么用的语言. 于是 AppleScript 就被捣鼓出来了.

(以上故事纯属扯淡忽悠)

话说AppleScript 有多简单呢? 就和说话一样简单. 我曾经也写过介绍. 再这里再给一个例子:

`我用苹果 Mac OS X 两年了, 越用越觉得, 其他操作系统要从苹果的 Mac OS X 上学习很多东西. 特别是图形界面的统一的脚本化接口, 我认为这对未来的操作系统是一个很好的启示, 也是完全用命令行工作哲学在图形界面时代的一个不可缺少的部分.

起因是最近我在写一系列的中文文章, 因为几乎没有数学公式, 而我又喜欢纯文本的工作方式, 因此在排版上我选择了reStructuredText. 一般来说, 英文文本我都是直接在 vim 下工作. 可是苹果下的 vim 对中文的支持不是想像的那么好, 至少中文输入法打出来的常常有乱码. 名动天下的 TextMate 固然好, 显示中文却只有半个字那么宽, 看上去很不舒服. 其他的编辑器要么收费, 要么嫌大, 要么不顺手, 因此落到最后还是用了苹果的 TextEdit.

但是写技术文章的人都知道, 写文章不仅是打字这么简单. 特别是技术文章, 常常需要离开编辑环境跑脚本, 查Google, 看 wiki. (我不知道别人是不是这样, 至少我为了写出质量较好的文章, 写的时候也要做很多功课). 特别是因为我在用 reStructuredText, 一个最基本的需求就是处理当前文本生成 HTML/LaTeX 然后预览. 这些需求, 在 VIM 和 TextMate 中都是原生支持的, 很简单能做到. 但是在 TextEdit 这样的软件中, 乍一看, 毫无办法. 所幸的是, UNIX 家族的操作系统, 特别是苹果, 秉承了 简单的事情要有简单的解法, 复杂的事情要有可能的解法 这样的设计思路, 提供了不止一条解决问题的方法. 因为苹果设计了一个叫做”脚本化应用程序”的东西, 使得这些任务可以很简单的完成. 我研究了几天, 学到了一些东西, 拿出来和大家分享.

  1. 最常常被忽略的菜单栏, Service 菜单.

用具体的例子来说可能更加简单. 用 Gmail 的各位都知道, 如果邮件里面有 90081243455 这样的数字串, 或者有 北京是西城区XX路YY号 这样的地址, Gmail 就很贴心的显示出 “使用 Google 追踪快递包裹” 或者 “使用地图查看地址” 这样的链接. 也就是说, Gmail 会识别出这些特定的样式, 然后给你一个上下文相关的(也就是说, 和你内容相关的) 服务. 这样的服务贴心舒适, 相信不少人都很喜欢. 一般我们把这个叫做上下文相关的服务.

再说 Firefox. 前不久 Firefox 出了一个很贴心的小插件, 叫做 Ubiquity, 我在 Firefox 下几乎离不开它: 选中任何一行地址, 只需要敲几个键, 就可以查 Google Map. 选中任何一个名词, 可以立即查 Wikipedia, 等等. 一般我们把也把这个叫做基于选定的服务.

苹果上的 Service 菜单, 就是这样的一个基于上下文相关和基于选定的服务. 举个最简单的例子, 如果你的机器上装有 Skype, 然后你选中了一串电话号码, 这时候你可以到 Service 菜单中选择 Skype -> Call this number. Skype 就会自动拨打这个电话. 或者选中一个单词, Service 菜单中就会自动出现: Look up in the Dictionary. 选中它以后, 你机器上的字典就会跳出来, 把单词的释义呈现给你. 所有的这一切, 都是基于苹果的一个叫做 System Service 的框架. 简单的说, 每个应用程序告诉系统: 在什么情况下, 你给我什么信息, 就可以让我做什么事情. 这样, 在选定的上下文符合条件的时候, 你就可以在菜单中选择这个服务. 这个东西方便无比. 比如说, 常常老板在邮件里面写: 你这周做啥啥. 我就可以选中整行句子, 按下 ⇧⌘ Y. 这样整行句子就被纪录到 Stickies 里面去了, 相当于随时写下一个便签.

现有的菜单栏固然好, 但是自己编写的更加好玩. 所幸的是, 你不需要会苹果的生涩的 Obj-C 才能编写菜单. 有一个强大的工具, 叫做 ThisService, 能够把 Ruby, Python, Applescript 和 shell 脚本都包装成 Services. 比如说我昨天就花了一分钟写了一个很简单的叫做 Translate 的脚本, 通过 Python 提交文本给 Google Translate, 返回中文. 在阅读有很多不认识的单词的新闻文章时候, 只要选中段落, 选择这个 Translate. 一个翻译成中文的窗口就出现了. 在这个软件的帮助下, 任何脚本都能点一下鼠标就变成一个服务: 具体我就不一一详述了.

总的来说, 我们可以注意到, 在日常使用计算机的时候, 一个应用程序中的一些内容(文本或者图像), 往往要作为另外一个程序的输入, 交给另外一个程序处理. 比如选中的单词查字典, 选中的地址查阅地图, 和选中的电话号码拨打, 选中的句子翻译等等, 这些需求都是存在的. Windows 家族解决问题的方法, 是通过程序切换和剪切板. 而苹果就是通过统一的接口来完成的, 思想和UNIX管道是非常相似一脉相承的 (当然, windows 家族从来就没有 UNIX 家族管道这个思想, 所以也就想不出统一接口这样的设计了).

在苹果下, 统一脚本接口可以用来处理像 Service 这样的程序之间通信的问题, 这个是 windows 家族从来没有想过的. 同时, 据我个人经验, 这个思想在 Linux/X11 家族也没有全部实现. 在 Linux 命令行下, 我们都知道, 不同的小工具之间是正交的, 一个程序的输出是一个程序的输入, 这个 UNIX 哲学长盛不衰. 直到今天, 正常的 Linux/UNIX 用户也会天天用管道做程序之间的通信. 可是在图形界面出现后, 这样的好传统在 X11 系统中似乎没有被继承. 比如, 不能选中一段文字直接送给 wc 计算字数. 究其原因, 是因为图形界面再也没有明显的输入输出这个概念了. 字符串和图像变成了要在程序之间传送的基本单位. 在这种情况下, 就需要不仅仅以文件为基本单位, 而是以被选中的那些字符串, 句子, 链接, 图片等为基本单位的通信. 在这个层面上, 苹果的确先行一步. (当然 Emacs VIM 等等也是可以通信和调用外部程序的, 但是毕竟不是整个系统都能这样).

  1. 史上最简单的语言, AppleScript.

故老相传, 当年 Knuth 大神访问苹果, 总裁 乔布斯 同学发挥爱吹牛的光荣传统, 说: 高教授, 您来了. 我特别崇拜你, 您的书我都读过. 各位读者都知道, 要是Jobs 真的把高教授的书都读过, 全世界大学计算机系99%的教授基本上都要自杀让位给Jobs. 所以, 高爷子知道他吹牛皮. 以下的故事分两个版本, 第一个版本是硅谷的版本, 是高爷子当即就说: 斯蒂夫同学, 你又扯淡忽悠了. 第二个版本是我的版本: 说高爷子一听, 也不生气, 心想, 你我共同作为硅谷两个最懂字体设计的搞IT的, 我也不好得罪你, 且问你一道简单的问题, 看你读了我哪几本书. 于是高爷子眼珠一转, 题上心来, 问到: 乔布斯同学, 请问世界上最简单的编程语言是啥子呢? 乔布斯是个不懂技术的主. 想起当年和 Woz 合作的时候搞的东西叫做 BASIC, 听名字就觉得简单, 于是说道: 乃是 BASIC. 高爷爷说, 还有比这个更简单的么. (话说高爷爷心想, 我手里握着 TeX, Metafont, MIX, Literate Programming, CWEB 等几张王牌, 我就不信你说不出一个搭不上边的). 乔布斯同学哪能体会到高爷爷的良苦用心, 他又不会编程, 于是就杜撰到: 我们公司最近正在开发世界上最简单的一个语言: 叫做苹果脚本(AppleScript). 高爷爷一听就知道又是吹牛, 于是立即回复: 斯蒂夫, 你又扯淡忽悠了. 斯蒂夫同学哪服软, 于是要求开发部门开发一个连他都懂怎么用的语言. 于是 AppleScript 就被捣鼓出来了.

(以上故事纯属扯淡忽悠)

话说AppleScript 有多简单呢? 就和说话一样简单. 我曾经也写过介绍. 再这里再给一个例子:

`

看, 明明就是英语嘛! 这么平铺直叙几乎没有语法的编程语言, 真的是世界上最简单的编程语言唉.

别看这个语言简单, 威力可不小. Mac 上几乎所有的应用程序, 都能够用这个语言去控制, 特别是 iTunes 甚至还有一个专门的网站, 专门就让你下载千奇百怪的控制脚本.

Applescript 还有两个好处: 1. 他是苹果原生支持的, 可以直接编译成苹果的应用程序来用. 因此, 简单的任务处理都可以用这个语言. 比如我们上面说的做成 Service 的, 也可以用 Applescript 来实现. 2. 他能够和其他应用程序交互. 其实在苹果系统中, 在脚本桥技术(Script Bridging) 出现之后, 理论上C/Javascript/Python/Ruby 都是可以和应用程序交互的. 可是AppleScript 的支持更加好, 更加直接. 比如取当前播放的iTunes乐曲名字, 可以用

AppleScript:

tell application "iTunes" to get the name of the current track

也可以用 Python

from Foundation import *<br /> from ScriptingBridge import *<br /> iTunes = SBApplication.applicationWithBundleIdentifier_("com.apple.iTunes")<br /> print iTunes.currentTrack().name()

显然 Python 要显得笨重一些.

同时, AppleScript 也是苹果中小机器人 Otto 的底层技术, 因此在整个系统中发挥了基础性的作用. 虽然学习 AppleScript 显得很偏很不入流, 但是在苹果上做一些小任务有时候还是用得着的. 比如说我的让 TextEdit 支持 ⇧⌘ R 自动编译的例子, 就是先写了一串脚本, 取当前文件名, 然后使用 do shell script 这个指令调用 make. 这样, 调用这个脚本, 就可以完成自动编译. 用快捷键来调用脚本, 有两种方式, 一种是通过把脚本拷贝到应用程序的脚本目录并且添加一个菜单项. 另一种是用 QuickSilver 来帮忙了. 第一种方法应该最简单, 但是我没有尝试成功, 有兴趣的读者可以读这篇文章.

  1. QuickSilver

我曾经间或的提到过 QuickSilver. 刚开始我并不能体会到他的魔力, 直到最近在玩脚本控制的时候才发现. 简单的说, QuickSilver 就是能让你用键盘控制程序的程序. 或者说, QuickSilver 就是键盘命令中枢. 比如说播放音乐, 只要一键激活 QuickSilver, 再打一下 play (有时都不要打全), 回车. iTunes 就放起音乐了. 上面我们说的任何控制系统的脚本, 都能够被 QuickSilver 控制. 我在拔掉你的鼠标一文中也提到, “你要是苹果用户又不用QuickSilver或命令行, 那你是把苹果当Windows用”.

QuickSilver 作为应用程序快速启动的功能大家想必都很熟悉. 控制 iTunes 大家也得心应手. 我就介绍一个被大家忽略的功能: 设置上下文相关的快捷键. 传统上, 快捷键是被应用程序定死的. 即使你写了一个扩展应用程序的脚本, 你也得点点鼠标去调用, 而不能设置键盘快捷键去调用. 解决的方法有三个, 第一个是我在第一部分讲的, 包装成一个 Service. 这样的好处是可以包装出一个快捷键, 坏处是这个Service 是全局都有用的, 不管你在哪个应用程序里面, 这个 service 都能用. 第二种是我在第二部分提到的我没有尝试成功的, 即添加一个菜单项目的方法. 第三个就是采用 QuickSilver 的 Trigger 功能了. QS 用户可以使用 ⌘’ 调出 trigger, 然后添加一个 Custom Trigger, 把目标指向自己写好的一个 AppleScript, 给这个 trigger 分配一个快捷键, 并且把使用的范围 scope 限定在一些应用程序中. 这样, 不费任何功夫, 只写一个简单的脚本, 您就可以在你的计算机上把你的 TextEdit 也改造成一个功能强大的编辑器了.

结语: 如我在拔掉你的鼠标一文中说的, 完全使用键盘能强迫人使用高效简洁和正确的工具. 随着图形界面和多媒体的出现, 鼠标的反而成了一个最常见的动作. 其实认真分析鼠标点选操作就发现, 无非是两种: 一种是用鼠标选择内容, 准备用一定的工具和程序处理这个内容, 还有一种是鼠标选择操作. 前者对内容的选择, 鼠标是高效的. 而后者对操作的选择, 鼠标是低效的 (因为键盘快捷键和命令行更加高效). 因此, 如果我们想要高效的工作, 就要避免后一种操作, 并且进一步解放前者.

对后一种的避免很简单: 拔掉鼠标, 强迫用键盘. 对前者的解放, 随着各种各样如 Service, Ubiquity 以及上下文敏感程序的兴起, 使得我们不需要在不同的程序之间拷贝来拷贝去, 而是直接通过程序之间的标准接口通信, 使得我们甚至不需要切换程序. 所有的都应该这些基于命令行和后台来完成, 而不是通过分散注意力切换程序来完成. 这些新的工具, 更加符合一个高效能的现代人的需求, 更加能够提升你的效率. 当然, 决定做事的效率的不仅仅是工具, 因此, 不要迷恋这些工具. 为了获得 1% 效率的提升, 而过于强调工具的各种淫巧, 反而降低效率. (警告: 这些工具都是非常迷人的, 很容易一用就爱上它们. 记住, 效率是最好的判断标准 :).

附 “完全用命令行工作系列” 文章一共五篇, 写了也不少了, 有些工具我一笔带过, 有些我花了几句话讲了一下. 基本上我介绍到的提到的, 都是我自己天天用的, 也是我认为非常有用的. 我写作的时候也都是带着 “Smart and Get Things Done” 的哲学, 只介绍干净的设计良好的软件. 各位想实践 GTD 的读者可以自行选择趁手工具. 有更多的 GTD 的完全用 键盘/命令行 工作的软件, 也不妨向我推荐.

完全用命令行工作-3: 常用工具

完全用命令行工作-2: 常用软件

完全用命令行工作-1: 拔掉你的鼠标

完全用命令行工作: 几条趁手语句

Oct 13, 2008 - 编程珠玑番外篇-2.计算机图书排版的八卦

Comments

大家都知道, 计算机科学家超级爱动手自己开发工具, 而且对美有超乎常人的需求. Knuth 爷爷当年觉得自己辛辛苦苦的好书被排版成地摊上的厕纸一样, 一怒之下自己搞出了红遍大江南北的 TeX. 从此整个世界都清净了. 排版是计算机科学家研究的一个很好玩的领域, 这篇文章就谈谈我所知道的关于排版的八卦.

先说 Knuth 爷爷的吧. 首先, 是在设计 TeX 的过程中, 这位老爷爷研究了很多著名的字体, 成了名动一时的字体专家, 据说和乔布斯并称为加州最懂字体设计的两个搞IT的 (我瞎说的). 研究字体之余, 他就研究收集各大书法家的作品, 然后这位老爷爷又是一个基督教徒, 所以干脆用它的收藏出了一本书, 叫做 <3:16>. 这本书特别牛逼, 是一本用计算机科学研究上帝存在的. 而且发挥计算机科学的小幽默, 取圣经每章的第3节第16小句, 还证明了这个和随机一样好.

还是克爷爷, 写完TeX之后不过瘾, 要写本书来冲冲喜, 于是写出了极其牛B名字的 The TeXbook. 一语双关, 表现了牛人一贯的狂妄. 写完这个他又想写写自己的字体和绘图系统设计(metafont 系统) 所以干脆出了五卷书, 行话称作ABCDE, 也是用名字来表明: 看, 基本的入门书, 你非看不可.

跑题一下: Knuth 爷爷最喜欢让人家看到他提出的名字就腿发软. 比如他提出了一个叫做 Literate Programming 的东西, 并且很不怀好意的对 Dijkstra 说, 小样, 当年你说 structured programming 的时候我非要用 goto, 结果人家都说我是 unstructured programming (没结构的编程), 现在我要提出一个叫做 literate programming 的东西, 你要是不跟着我混, 人家就会叫你 illiterate programming (没文化的编程). 在这么邪恶的名字下, 全世界程序员只好个个听这个老头的话, 乖乖的使用文档和程序融为一体的”有文化的”编程习惯.

其实克爷爷属于斯坦福家族的. 在70-80年代, 世界上还有一个NB的研究机构: 贝尔实验室. 贝尔实验室自己也开发了自己的排版工具: Troff. 开发者是著名的K, 就是 K&R 里面的那个K. 这个 Troff 也是一个牛到极点的排版软件, 比如说, 当年那些科学家都对出版社的排版不满意, 所以都威胁出版社说: 我自己来排版, 你们只管印刷就行了. 就是因为这帮科学家开了这个传统, 所以后来出版商遇到想自己排版的, 都用巨崇拜的眼光打量着你.

说到 troff, 以下大名鼎鼎的书都是用 troff 排版的:

Advanced Programming in the UNIX Environment

The AWK Programming Language

The C Programming Language

Compilers: Principles, Techniques, and Tools

Computer Networks, 3rd Ed.

Computer Networks And Internets, 3rd Ed.

The Design and Implementation of the 4.4BSD Operating System

Effective TCP/IP Programming

The Elements of Programming Style, 2nd Ed.

Internetworking With TCP/IP Volume 123

More Programming Pearls

The Practice of Programming

Software Tools

Unix Network Programming

The UNIX Programming Environment

Programming in C++

所以说, troff 排版的无烂书. 当然, TeX 家族也不是吃素的, SICP, TAoCP, CLRS 都是用 TeX 搞出来的. 陶哲轩也说, 鉴别民科文章第一步就是看是不是用TeX排版的. 可见排版排得专业, 也是好文章的一个先决条件.

我觉得可以把以上的结论概括成 徐氏排版定理, 如果一本书, 不是以上所说两个软件排版的, 又不是 O’Relly 出版的, 那是好书的概率也就不怎么大了. 作为一个作者来讲, 一定要记得用 troff 或者 latex 排版 :)

troff 和 latex 都是一脉相承的, 理念也差不多, 所以牛B的开发人员两头都在玩, 比如一个叫做 Werner Lemberg 的牛人, 就是 troff 的开发人员, 同时还跑到 TeX 那里开发了支持中日韩的 CJK 包. (大家都知道, 软件的中文支持从来都不是中国人开发的)

史上最牛的程序员 Bill Joy 同学据说用了一个周末就写出了 vi, 所以大家都怀疑, 他用了半个小时的时间写了 BSD 上的 troff. 他写的这个程序, 被SUN用着, 一直用到今天.

最后强行插播一条广告: 我最近要写一本小册子, 叫做 Motifs in Computer Science (原名叫 Meta Ideas in Computer Science). 一定保证用 LaTeX+Troff+reStructuredText 排版, 按照我的 Troff/Latex 排版无烂书结论, 这本书也不是太烂. 欢迎捧场.

再补充一则八卦: 话说当年 PDP-11小型机特别贵, 但是贝尔实验室的科学家又想要用. 怎么办呢? 于是, 他们发挥了科学家爱忽悠的能力, 去和经理说: 你看, 我们文档的排版很烂吧(当年还是打字机时代), 你们投资一下搞一个小型机回来, 我们保证给你们开发一个在这个机器上用的文档排版系统. 经理一听, 大笔一挥说: 买之!. 科学家一听都乐了, 哈哈, 我们有新玩具了. 然后, 他们就开始在 PDP11 上开发 UNIX 了. 经理也不懂, 看他们搞的好玩, 就不时来问问: 老大们, 排版系统怎么样了? 贝尔的科学家一边敷衍敷衍, 一边继续搞 UNIX 和 C 语言. 等这两样都搞好了, 瞬间就写了一个排版软件, 就是 nroff. 经理可乐了, 说, 哎, 我们终于投资有回报了啊. 科学家也乐了, 因为若干年之后, C 和 UNIX 红遍大江南北, 因此两人拿下图灵奖. 所以说, 做研究这东西, 一定要先把基金忽悠过来, 然后想干啥干啥, 最后结果反而超出预料. (贝尔实验室的人居然研究宇宙背景辐射拿诺贝尔奖, 这种宽松宽容的基础研究在其他地方是很难遇到的).

Oct 12, 2008 - 美国普通话

Comments

国人都知道, 各地方言都不一样, 所以中央电视台总是用普通话来广播, 这样一来, 连我90岁的外婆也能听懂党的政策. 而在美国, 有没有普通话的说法呢? 其实看美剧的同学都知道, 美国压根就没有中国如此差异巨大的方言, 要有不同, 就是把 coke 说成 pop, 把 this 说成 dis 罢了, 也不会严重到各地人民听不懂的地步. 因此, 我一直相信: 美国英语到处都差不多, 大家都能听懂, 没所谓的普通话和方言的说法. 

最近美国大选, 美国人民很娱乐的, 拿到候选人的一点小玩意就发挥搞笑. 比如共和党候选人Palin, 来自与俄罗斯隔了一个小海沟的阿拉斯加, 根据我女朋友的说法, 拥有极其乡巴佬的明尼苏达农民口音, 因此大家都嘲笑她. 你如果Google 一下 Palin + You betcha 或者 Palin + Darn Right, 就会得到很多有趣的结果. 当然还有土到掉渣的 Joe Six-pack (我女友说任何受过教育的人都不会这么说的, 类比一下就是在中文中胡锦涛说“我们代表广大泥腿子利益”一样的粗俗. 她的方言和口音最近被美国人民搞笑, 引起了我极大的好奇: 有没有标准的美国英语? 美国英语又没有普通话?

研究了一圈发现, 美国还真有普通话(放心, 我们以前学的都是美国普通话). 美国普通话大致是以美国中部, 即 Nebraska 东部地区, Iowa 中部和南部地区, Illinois 西部地区等很小的一个区域的方言为基础产生的. 美国所有的媒体都使用标准的美国普通话广播. ( http://en.wikipedia.org/wiki/General_American ) 这样保证全国人民都能听懂标准的美国普通话.

和中国一样, 美国也有主流的语音标准, 说穷地方的方言是容易被鄙视的. 尤其是南方口音, 因为传统上经济不发达, 饶舌又把这个语言发挥到极致, 所以听上去就比较土气. 据我女友说, 南方口音的小朋友到东北部常春藤上学, 因为开口闭口基本都是鼻音, 会严重的被嘲笑. 不过四年的训练会改变掉很多口音, 所以华盛顿的律师出生的政客们个个”普通话”都很标准. 除去南方口音, 加拿大口音和伦敦口音也是常常被用来搞笑的口音(不见得是鄙视). 著名的The Daily Show 就找了一个满口伦敦腔的哥们做外派记者, 每次访问别人的时候就可以摆出傲慢的高高在上的采访姿态. 其它非英语的口音倒是没人拿来搞笑, 估计大家都习惯了.

我们中国学生开口闭口都是中国口音, 也挺有特色的. 在意”标准英语”发音的各位, 我觉得在学习英语的时候可以从CNN等电台的发音开始模仿, 而不应该过多的卷入当地口音. 要不然整了半天其实学的是个不标准的当地口音.