我不大喜欢 OS X Mountain Lion

前天我打开 Apple 的网页的时候,看到了页面右下角有下一代操作系统 Mountain Lion 的介绍。后来从网上一查,发现这个介绍已经发布了有一阵了,我现在打开 RSS 阅读器的次数少了,看来有点跟不上时代了。

我看了一下这个介绍页面,越往下看,觉得越没有升级的兴趣了。等到看完了,我开始思考原因,发现 Apple 对于操作系统走在了一个与其它开发者非常不同的道路,在我的意料之外,但确是情理之中。

从当前的 Lion 开始,一直到将要发布的 Mountain Lion,Apple 走的大方向是把 iPhone/iPad 平台的产品与经验放在 Mac 平台上。我不喜欢。

我的理解是,当 Apple 开发完毕了自己的 Mac OS 操作系统之后,computer 这个外来词语大概就可以翻译成“电器”了,而不再是我们今天说的“电脑”了。“电器”和“电脑”的区别就在于“器”与“脑”,“器”是“器具”,是工具;而“脑”显然比工具更灵活。作为一个计算机爱好者,计算机系的学生,我当然喜欢“电脑”甚于“电器”。当然,喜欢钻研一个产品的人们不喜欢被束缚住。喜欢钻研移动平台的人肯定愿意给 iPhone 越狱,因为这样他们可以更自由的做更多的事。

虽然我喜欢自由的操纵电脑,但可惜从“电脑”到“电器”演化,是电脑普及的必然趋势。比尔盖茨当年的豪言“让每一台桌子上都摆上 PC 机”,要做的就是把电脑“电器化”。好比一台电视机,在今天的中国,一个老太太都会操作,找到自己喜欢的节目来看;但让一个老太太来操作电脑,绝大多数学习起来肯定有困难。为什么?因为电脑比电视复杂的多。比尔盖茨要推广电脑,要做的就是让电脑操作起来更容易,因此 Windows 的出现,用图形界面来大大简化了电脑的操作,为电脑的普及立下了盖世之功。

电脑在今天还没有完成电器化,但电话方面却是已经完成了。早期的黑客可以用某种特殊的口哨,对着话筒吹出特殊频率的声波,然后可以免费的打电话。电影《地心末日》中有这么一个情节,黑客“老鼠先生”抢过了男主角的手机,用口香糖纸包着嚼黏的口香糖,做成一个小哨子,在男主角的手机上拨几个号码,对着麦克风吹一声,男主角的手机就可以免费的拨打全球的电话了。这当然是电影的情节,今天没有任何一家电信公司的手机可以做到这个,因为这些当年的漏洞早就已经被封锁了。电话已经成为了走进千家万户的家用电器,而不再是打电话比发传真还贵的奢侈品。

手机平台上的系统也是如此。Symbian v3 系统上安装第三方软件很麻烦,我记得当时还要下载个软件自己给手机软件加认证才可以安装,这种封锁就是把智能手机电器化的手段。结果诺基亚没有 Apple 那样的设计意识,生生的把这个模式做的保守诟病。iOS 虽然是从电脑上的操作系统移植过来的,但用更好的方式封锁了很多用户活动,原因就是让智能手机更简单。当你只能在 app store 里安装程序时,自然不需要考虑第三方软件的安装位置、是否安全、是否太过耗电等问题,因为 app store 的审核流程都帮你筛选过一遍了。

自然,不是所有人都喜欢这样,所以有了越狱。而且电器化确实牺牲了很多自由,这是必然的。自由操作这种东西当然需要有一定的知识与时间、耐心才能驾驭的了,就好比 Windows 用户玩不来 Linux 一样。我身边有同学买了 iPhone 之后到处找人帮忙给越狱,这样其实是相当危险与麻烦的,手机容易出问题,出了问题就只能再找好人去修。既要便利,又要自由,哪有那么多的好事?

再说会桌面计算机领域。继微软之后,Apple 开始把电脑的电器化更加推进了一步。因为 Apple 比微软有优势,就是它比微软多了硬件业务。其实从根本上来说,Mac OS 就是 Apple 买硬件的附带产品。Apple 因此也不需要考虑操作系统的兼容性等问题,只要把操作系统做的更简单就好了。怎么让操作更简单?电器化!因此,在 Mountain Lion 中,我们已经可以看出这种趋势来了。很多 iOS 上的软件都被移植到了 Mac 上,为的就是简化操作。

手机上这么做我不反对,反而赞成,因为我觉得手机是日常的电器,我对 hack 手机也没有什么兴趣,所以我对手机的要求就是便利、安全,因此如果我手中有了 iPhone 之后我应该不会去越狱,而是老老实实的在 app store 下载免费的或购买我承担的起的软件。但在桌面电脑上这么搞,我就有些抗拒了。有了键盘,我就想着可以更加自由的操纵电脑。现在我用的 Snow Leopard 我就已经能感觉到限制了,在操作系统方面我到今天仍然很怀念我过去用的 Gentoo。Mountain Lion 的这些新特性,很显然把电脑的自由度给剥夺了一部分。虽然对普通用户这样更方便,也更安全,但作为玩家的我来说,这样少了更多的乐趣。

而且,Apple 的操作系统发展到现在,其实仍然还在往电脑电器化的方向摸索。Mountain Lion 还没有到只靠这些就可以完成大部分工作的地步,所以很多东西都似是而非,要做到 Apple 演示的那样便利,必须所有软件都用 Apple 的,中间换一个软件就好比锁链少了一个扣,就完不成了。除非 Apple 能保证 Mac 上只运行他们自家的软件。

另外,不知道是不是因为这几年 Apple 的口碑太好了,我看到 Apple 这么一步一步的发展操作系统,就不免考虑到 Mac 到最后会不会发展成一个完完全全封闭的操作系统,所有软件都只能从 app store 购买,第三方软件都不准安装,甚至在电脑上必须要越狱才能安装第三方软件。Richard Stallman 写过一篇文章,名为《The Right To Read》,里面构想了一种所有版权产品都必须要通过跟电脑认证才能合法使用,违反者会受到残酷的惩罚。当时我觉得 Richard 肯定会影射微软,但现在看看也许 Apple 更有机会做到这么一步。:)

今天早上我看到了一篇文章,是一篇对 Linus Torvalds 的采访,里面提到了 Linus 买了一台 11′ 的 MacBook Air。Linus 喜欢这台 MBA 因为它的硬件设计的非常好,其它的厂商都没有做到这种地步。我也是持相同的观点。在我看来,Apple 的电脑让人欲罢不能的不是所谓的华丽的界面,而是它那几乎完美的硬件设计。我很难想象我这台 MacBook 报废了之后我要用到一台 DELL 那种丑陋的笔记本,而我也非常愿意在我的 MacBook 上跑 Gentoo。我在 2008 年暑假的时候尝试过安装 Gentoo,但 MacBook 的特殊键盘和触摸板让我配置起来很麻烦,最后放弃了。

这篇文章种相关的部分没有提到 Linus 在这台 MBA 上运行什么软件,会不会也是 Mac OS X?我猜测的是不会,但不能确定。后来我找到了另一篇文章,里面有一张图片,虽然不是很大,但可以看到那台 MBA 运行的桌面不是 Mac OS X,倒是很像 KDE,这个我就不能确定了。

最后,介绍 Mountain Lion 的文章的最后一部分,“All-new features for China”很有意思,新的操作系统对于中国的一些山寨产品,包括新浪微博、QQ 等专门进行了支持,看来中国的 Mac 用户数量也足以让 Apple 做出一些相关决策了啊。

成功设置 Crontab

前天写了个程序用来生成一个静态的 twitter timeline 页面,但最后一步没有完成,也就是设置 crontab 让这个程序隔一段时间执行一次。否则需要我手动登陆服务器来运行程序就太蠢了。

过去我用过 crontab,但次数不多,而且这种东西都是设置一下就不再碰的,所以相关的东西我早就忘记了。而且我印象里也没有设置过需要调用第三方库的程序,因此周一的时候就配置失败了。

过去我尝试 crontab 的时候,系统会把程序的输出结果发到我的邮箱里。这次却一直没有动静。我怀疑过是不是系统本身的问题,但安装系统的时候我都是走的标准流程,crontab 相关的东西碰都没碰。但为什么一直收不到邮件让我非常费解。

后来我考虑到是不是邮件被发送到服务器本地去了。于是去了我的 Maildir 目录下看看,果然几封邮件都在这里。这让我比较奇怪,我设置的 Exim 4 应该运作正常才对,我的服务器上的 WordPress 程序就可以正常发送电子邮件。后来看了一下收件人地址,发现是 liufeng@li413-79.members.linode.com,这或许就是问题,看来有那个相关的地方我没有设置好。

看了一下邮件的内容,果然说是找不到 twitter gem,看来运行的时候 crontab 找不到 RVM 安装的东西。搜索了一下,经过几次尝试后,发现这篇文章里讲的东西十分有用。文章中的方法是通过运行 bash 读取相关的变量设置,然后像普通执行程序时一样运行这个程序。评论中有人反对这种方法,原因是 crontab 的特点之一就是不登陆而运行程序,这个方法和宗旨不符。后来我发现 RVM 自己也提供了给 crontab 调用的 wrapper,但我测试后不成功。于是还是使用了运行 bash 的方法。

目前这个程序基本上完备了。或许有工夫有心情的时候我会写个 css 美化一下页面,毕竟我看 Rails 里也用上了 SCSS,我想学一下。然后看看能不能提取出一个模版,把模版写在主程序里面挺难看的,也不符合风格。

Ubuntu 升级后 MySQL 无法启动

上一篇文章中我说道,我遇到了 MySQL 的严重问题。在这里专门说一说。

当时我写好了程序,已经通过 FTP 上传到服务器上了,然后就上服务器上调试。由于近期 Ubuntu 12.04 LTS 出来了,因此每次我登陆的时候,都会有升级的提示,让我运行 do-release-update 来升级。因为我用的是 VPS,我不确定 Linode 是怎么说这个事的,是不是有问题,因此我在这半个月中一直忽视它。今天又看到了这个提示,觉得大概是时候把它处理一下了。

于是我搜索了 Linode 的页面,看到它的 blog 上写的可以升级。我过去在用 Ramhost 和 YardVPS 的时候都做过这个,因此虽然脑子里想的是不是要备份一下数据库,但考虑到过去都很顺利的通过了,于是就没有再管,直接升级了。

升级中间出来一个窗口,让我设置 MySQL 的 root 密码。虽然我过去设置过,但我这次还是重新输入了两次,接着提示我说设置 root 密码失败,原因可能是我过去设置过 root 密码,或者是配置出了问题。我一看,我过去设置过 root 密码啊,于是就没有考虑这个,直接选择继续了。

升级结束后我开始测试我的程序。我选择了手动创建数据库,但在运行 MySQL 客户端的时候,却出现了错误信息:

ERROR 2002 (HY000): Can’t connect to local MySQL server through socket ‘/var/run/mysqld/mysqld.sock’ (2)

无论我用普通帐号还是 root 帐号都出现了这种问题。开始时我以为是个小问题,于是重启 MySQL,结果发现启动不起来了,运行 service mysql restart 的结果是:

start: Job failed to start

这时,我意识到可能是 MySQL 系统出问题了,去浏览器访问我的 blog,果然提示数据库连接不正常。

我上网搜索,确实有人有过这种经历,但原因是因为硬盘空间满了,清除出一些空间来就解决了。还有人说跟 /var/run/mysqld 的权限有关,我试过修改权限,但仍然不管用。

这时我有点着急,因为我的数据并没有备份。系统升级这种事我做过几次,都很正常,从来没有出现过这种情况。如果我又数据库的备份,我大不了重新做一次系统,然后把数据导入回去就行了。现在却没办法了。我尝试着备份了 /var/lib/mysql 目录后删除 MySQL,再重新安装 MySQL,结果还是不行。

我查看了 /var/log/mysql/error.log,结果里面相关的内容是:

120514 11:16:44 [Note] Plugin ‘FEDERATED’ is disabled. 120514 11:16:44 [Note] Plugin ‘InnoDB’ is disabled. 120514 11:16:44 [ERROR] Unknown/unsupported storage engine: InnoDB 120514 11:16:44 [ERROR] Aborting

120514 11:16:44 [Note] /usr/sbin/mysqld: Shutdown complete

我看了半天也没怎么看出门道来,InnoDB 我在刚开始安装 MySQL 之后马上就关上了啊,普通的网站根本用不到 InnoDB,而且它又十分的耗内存,因此这是 VPS 的内存优化必做步骤之一。

我只好又查其它的文档,也做了不少尝试。比如说,配置文件中的 default-character-set 选项过期了,新的选项是 character-set-server,等等。我改了一些这种选项,但总是没有效果。

最后,我因为错误记录中提到了 InnoDB,就抱着试一试的心情,把配置文件中的 skip-innodb 这一行给注释掉了,结果启动 MySQL,竟然成功了。我无论如何也想不到竟然会在这个地方出问题。

解决了问题后我成功的让我的程序可以访问 MySQL 数据库了。然后我想找找为什么关掉 InnoDB 会让 MySQL 无法启动。当我检查我为了这个程序所创建的数据库时,惊讶的发现了这个数据表竟然使用了 InnoDB 引擎,而不是我以为的 MyISAM。抱着这种猜想,我搜索了 Google,果然发现了,从版本 5.5 之后,MySQL 默认的引擎成了 InnoDB

这让我非常惊讶。因为在我的印象里,除非像 Wikipedia 这种类型的网站,会有在统一时间更新数次数据的情况,一般的网站都不需要用 InnoDB 的。而关闭 InnoDB 会节省至少 80MB 的内存,这对于 VPS 来说时比较重要的。因此,应该会有更多的人需要 MyISAM 而不是 InnoDB 才对。结果 MySQL 不声不响的把默认的存储引擎就这么给换掉了。

更重要的是,MySQL 对于这种情况处理的太粗暴了。默认的存储引擎是 InnoDB,配置中却关闭了它,那么就用第二顺位的引擎不就行了么?当然,或许设计者有其它方面的考量,但我觉得这已经属于向下不兼容的升级了,错误信息中至少放一些提示吧。

找到了问题的原因之后,我检查了一下内存使用情况,发现 512MB 的 VPS 目前虽然启动了 InnoDB,但内存方面还是比较有余的,因此我也没有调整存储引擎这方面,打算渐渐的体验一下 InnoDB 试试。

生成 Twitter 静态网页

我从 2009 年就想写一个程序,把我的 Twitter 记录生成为静态的网页,放在我的服务器上,可以让墙内的人浏览。这样,在国内的父母也可以像 Twitter 被封锁前那样通过我的 Twitter 来了解我的生活情况。

当时我完成了一个小程序,但仅仅是做实验用的,有相当多的小问题。当时用的是 twitter4r 库,很多东西都不大成熟,用它写程序挺麻烦的。当时也遇到了各种问题,都在上面的文章中描述过。后来的代码总结在这篇文章里

最近我看了一些关于 Rails 的文档,写了一些程序,受到了一些启发,于是觉得可以重新写一写这个程序了。现在很多东西也变了,有了 twitter 库,获得记录的方法也更方便了。我如今也不再执着于把所有的 tweets 都保存下来了。另外,我对于数据库方面的了解更多,所以没有干巴巴的用 sqlite 接口来写 SQL,而是用了 Sequel 库,在本地用 Sqlite 3 调试,在服务器上就用 MySQL。结果程序很快就出来了,在纸上做设计,把要做的步骤考虑清楚了之后,很容易的就完成了代码。当中遇到的困难之一是对 Ruby 的不熟悉,很多东西我都需要查找例子,这是练习不足的原因。困难之二就是在 Sequel 的文档搜索信息费了我很多功夫。很多东西都不能想当然,我需要摸索着试验。比如说查看一条 tweet 是不是已经在数据库中有了,只要找找有没有相同的 id 就可以了,这个操作就让我费了很长时间来试验才知道正确的用法。

我过去从来没有写过 MySQL 程序的经验,因此在服务器方面也遇到了问题。首先是 MySQL 本身的启动问题,这个放在下一篇文章中专门谈,其次是安装 mysql 的 gem 时的问题,系统在哦年时提示:

*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of
necessary libraries and/or headers.  Check the mkmf.log file for more
details.  You may need configuration options.

只是说缺少依赖,但并没有说具体少什么。后来我找到这篇文章,知道了原因,安装了 libmysql-ruby 和 libmysqlclient-dev 库之后就没问题了。

最后是让程序自动运行,我用 crontab 完成。但我平时很少用到这个,因此从网上找了配置的写法,让它每 12 小时运行一次,但现在还不知道我的配置写的是否正确,等到了凌晨的时候看看运行情况。

最后,程序代码在我的 Github 中:link。生成的页面在这里这里这里,我没怎么做美化,毕竟我不擅长这个,等有时间再看看。

奇怪的 YouTube 页面

今天偶然发现了一个奇怪的 YouTube 页面。因为我用了 AutoPager,所以在看视频的时候往下拖动,会出现自动载入的第二页。但一个视频的下一页是什么?谁也不知道,然后出来的就是一个错误页面,设计风格挺抽象的,我看了半天也美明白其有什么含义在里面。

An error page of YouTube.

第一次看 3D 电影

昨天晚上我和几个同学在电影院看了平生第一场 3D 电影,名为《Wrath of the Titans》。

电影本身,我觉得很无聊。对于西方神话传说中的神,能让我兴奋的大概仅限于《圣斗士》中出现过的人物了。故事本身也没有什么可看性,只是几个人打来打去,华丽的效果没有用在关键的招数上,反而让人觉得“朴实”。电影是晚上 10 点开始的,昨天下午我还去了健身房,弄得挺疲劳,晚上吃了一顿大餐,吃饱喝足到了 10 点正式疲劳的时候。加上了无聊的剧情,所以我在看了大约 1/5 的时候,就睡过去了。后来主人公一行找到火神的时候我醒来了一会,然后又睡了。最后剧情还剩下 1/5 的时候,我睡醒了,看到了结束。

这次的 3D 电影在当地被称作 Real 3D,也就是需要戴上眼镜来看才有效果,摘下眼镜后看到的银幕上的画面是重影的。还有一种 3D 叫做 IMAX 3D,我没有看过,不过听说是不用戴眼镜,银幕直接让你感觉到 3D 效果,不过没有 Real 3D 效果好。我挺讨厌这种方式的,因为我视力非常不好,必须戴近视眼镜,所以 3D 眼镜我戴在了近视眼镜的外面,套两层眼镜感觉当然不舒服了。如果摘下近视眼镜,我又看不见,因此只能凑合着戴两层眼镜看了。

不知道是不是我眼睛的问题,还是电影的效果问题,我看的 3D 效果感觉十分不明显。在这部电影中,让我明显感觉到 3D 效果的只有几个镜头。首先是到最后主人公骑着天马冲向巨大的克罗诺斯的时候,我能感觉到骑着天马的主人公出现在银幕的前方,这种脱离出银幕的感觉挺有意思。第二个镜头不如第一个明显,但效果更好一些,就是克罗诺斯挥拳击打地面的时候,带起的带有火星的土块的时候,这些土块看上去飞出了银幕,直冲着观众飞了过来,这种感觉让我稍微的有些刺激。但这种镜头实在是太少了,所以其它的 3D 效果都让我觉得平淡无奇,简直看不出来,让我们感叹这钱花的太不值了。3D 电影的票价为 6.25 加元,而普通电影才 1.75 左右,从效果上来说,差别非常小。

看电影的时候,我也在考虑 3D 这种效果究竟有没有实际的意义。抛开这部电影本身的制作不大适合 3D 不谈,我之前也看过不少动作片,没有特意制作的 3D 效果,但看上去也是十分的刺激。所以我就猜想,这种 3D 效果并不契合人类的视觉呢?我们看普通的电影时,都可以通过自己的视觉与大脑模拟出正确的效果,但看 3D 电影时却并没有获得比普通电影更多的信息。也许 3D 技术需要改进,也许我们其实并不需要这种所谓的 3D 技术。

除了这种戴眼镜的 3D 电影,我还经历过几种不同的立体电影。最早的一次时小时候和我的父亲在济南的今天的泉城广场那附近,看过一次动感电影。电影的内容是我们乘坐过山车在山洞里冲来冲去,经常眼看着要撞上了障碍物的时候拐弯,或者障碍物消失。电影院的椅子是特制的,可以朝各个方向倾斜,因此在看电影的时候真实感非常突出,我当时看的时候就能体会到强烈的紧张刺激的感觉。但当我回头时,看到后排的椅子也晃来晃去时,就觉得放松多了。这种类型的立体电影我只见识过这么一次,而且应用范围非常的小,因为这种电影只有在过山车这种场景中才又明显的效果,而并不是所有的电影中都经常出现类似场景的。

另外一种立体电影是我去外地旅游时,参观的一个景点。那种电影院算是一个小型的圆形广场,没有座位,观众站在广场中心,银幕是一个圆环,环绕在广场周围。这种电影估计是用特殊的手段拍摄的,摄像机把一个点的 360 度视角都拍摄了下来。比方说在一条小船上的视角,观众往前看就看到船头,往后看就看到船尾,就好像是真正的乘坐在一条船上一样。当然,这种立体电影应用的也比较少,而且拍摄手段复杂,估计只有短的纪录片才可以承受这种成本,而且这种模式对于故事性的电影帮助不大。

这三种就是我目前见识过的立体电影模式了。不过我感觉除非有新的发展,否则这三种模式都不会是民用的立体电影的未来。

Blog 是什么?

今天关注博客的人少多了

现在讨论“Blog 是什么”这个问题似乎有点搞笑。理论上来说,这个话题应该早在 2006 年就讨论完了。今天再说这个都不是遭人鄙视这么简单的了,现在谁还不知道个博客啊。更何况从实际的技术上来说,blog 早已开始走下坡路了。微博这种东西的发展已经把博客的市场逼得越来越小了,道理很简单,很少有人愿意静下心来写一篇文章。而写一句话的成本要小多了。或许从一开始人们需要的就不是博客,而是一种表达的方式。相比起传统的网页,博客可以让人们更容易的发布信息。而微博才是人们真正需要的东西。人们要说话,而不是做作文。

关于 Octopress

让我这个从 2006 年就开始写博客的人在今天重新思考什么是 blog 这个问题的原因,是因为一款类 blog 系统的传播与逐渐流行。它的名字是 Octopress,相关介绍可以去它的网站上看。总而言之,它的特色是用户用 Markdown 来把一篇文章写在文本文件里,然后 Octopress 会生成静态的网页。用户可以用 rsync 之类的工具把网页放到服务器上去,这就完成了一次发布的操作。

我发现越来越多的人开始用起了 Octopress,有些人是从 WordPress 转过去的。我自己没有用过 Octopress,但看了介绍之后觉得这种方式没有什么吸引我的地方,于是就对它保持了兴趣——为什么这么多有条件的人都放弃 WordPress 而用起了 Octopress 呢?

调查了一下,我总结出 Octopress 相对于 WordPress,大约有以下几个优点:

  • 静态发布
  • git 版本控制
  • 漂亮的模版(我从未见过有比 Octopress 默认的模版感觉更好的 web 界面了,这另一方面叶造成了这个模版的烂大街 :))
  • 不需要数据库和 PHP 的支持

我感觉其中最吸引我的就是静态发布和不需要数据库、PHP 这两点。静态发布其实更早的 Movable Type 就已经做到了,但 Perl CGI 程序的入门要比 PHP 难得多,虽然现在不支持 PHP 的主机已经基本没有了,但 Octopress 可以把网站发布在 Github 之类的地方,算是它的一项廉价优势。我调查的一些 Octopress 用户因为访问量比较大,因此从 WordPress 切换到 Octopress 之后会有比较大的效率提升,这在其它地方比较少见。而说实话,今天的服务器几乎没有不支持 MySQL 和 PHP 的了。特别是数据库,我觉得一些不用数据库的系统之所以不用数据库并非是因为用不起数据库,而是一种特殊的选择。比如 MoinMoin,把不用数据库作为自己的一种特色。但再我实际的使用过程中,我觉得保存数据还是数据库是正途,用文件来存储数据,就算操作起来也回有一定的问题,不加保护的把这些文件暴露给用户,一旦用户不小心动了什么地方(比如权限),就有可能早成系统的问题。所以 Octopress 不用数据库,我很难说清楚是不是优势。不过,使用 git 来做版本控制倒是一绝,虽然我对于 git 管理源代码之外的文档还没有什么经验。

Octopress 的页面美观设计也是一绝。我用过的两个 blog 系统,Movable Type 和 WordPress,它们都在美观方面没有什么建树。Movable Type 就不用提了,版本 3 的时候还不错,到了版本 4 的时候几个模版显示中文简直可以用“惨不忍睹”来形容。WordPress 好一些,但默认的模版也没有让人觉得“眼前一亮”。第三方模版的数量挺大,但比起 Octopress 的模版来,我觉得都差一些,除了一些有设计技术的人给自己弄的模版,但这些都不大有公开的。而 Octopress 对于文章中插入的代码的排版让我看来也很专业,WordPress 的这方面,总是让我痛苦啊。

Octopress 有这么多的好处,我却一直对它没有动心,因为我觉得 Octopress 少了一些 blog 的必要的要素。

Blog 要包含什么?

博客的诞生,把我们从 web 1.0 时代引导到了 web 2.0 的时代。web 2.0 和 1.0 的不同点在于,web 2.0 有了用户交互的功能。在 web 1.0 时代,用户看到的都是静态的 HTML 网页,无法参与到网站的交流当中。虽然有聊天室之类的地方存在,但它们无法做到统一有效的集中信息。Web 2.0 跟随博客这个概念诞生,用户可以根据一篇文章发表评论,评论可以自动的显示在相应的区域,被所有人看见。从此,互联网进入了一个新的时代。

后来我们有了 Movable Type、WordPress 等面向个人的 blog 系统,个人可以在自己的服务器上安装这些系统,建立 web 2.0 网页。再后来慢慢的 BSP 出现了,这带来了一个建立 blog 的热潮。由于创建一个 blog 的成本很低,所以那时候的互联网用户,只要不是一些有意守旧的人群,几乎人人都有一个 blog。不管里面有没有内容,人们还是热衷于像互换名片一样的交换友情链接。这个热潮在 Facebook、Twitter 开始流行之后渐渐的减弱,关于减弱的原因,今天我仍然保持这个观点

那么相比起传统的网页,一个博客都需要有那些要素呢?我今天的观点是,除了正文、模版之类的非常明显的东西外,还要有:

  • 评论
  • trackback
  • 后台管理系统
  • RSS

这些是目前主流的 blog 系统所包含的东西。RSS 首先是不能少的,虽然它未必跟博客的概念一同诞生,但到了今天,RSS 已经不仅仅限于博客了,它已经算是一个 web 2.0 网站必备的要素了。评论和 trackback 差不多可以算作一项。虽然有一些人已经放弃了这个功能了。很多网站都不开启 trackback 功能,或者它们干脆有错误,没办法正常发送显示 trackback。这一条功能是我在刚刚认识到博客的时候比较期待的一点,因为我觉得它可以让博客之间可以互相交互,可以把相关的话题串联在一起,是一项伟大的发明,谁知到现在已经很少有人认真关注它了。评论稍后再说,后台管理系统是一个比较公认的要素,但最近 Octopress 之类的系统已经放弃了在线的管理系统,而是通过命令行来管理一个 blog。这一点我没有亲自体验过,所以不做评论。

过去我一直以为评论是博客的重要功能之一。因为从表面上来看,一个博客没有评论框,那不就和 web 1.0 的网站一样了吗?正因为有了评论这个功能,博客才可以跟用户交互。所以当我在五、六年看到蔡智浩的部落格居然没有开启评论系统时,真正的大吃了一惊。看了他的一篇《部落格迴響的心理分析》里对于这个问题的解释,我不禁感叹太激进了。我自己是绝对做不到这样子的,到了今天,也依旧不大认同他的观点。结果到了现在,Disqus 之类的第三方评论管理系统反而渐渐的火了起来。Octopress 本身没有评论功能,因此使用 Disqus 作为它的评论系统。

我对这种第三方的评论系统总是不大感冒。出于最近“本地的才最可靠”的想法,我一直觉得有些东西,能放在自己的服务器上尽量放在自己这里,因为这样才算是把它们握在了自己的手中。虽然比起个人的服务器来说,专业网站的服务器会更可靠一些,但一些特殊的因素(比如公司倒闭啦、被墙啦)总会让我觉得不大有安全感。当然,自己服务器上的东西,在折腾来去后总是容易丢失的,我的博客上的很多评论都在我上次切换 blog 系统的时候给没了。但自己弄丢的总找不到别人指责,所以也只好懊恼一番就算了。如果是因为别人的缘故让我的信息丢失,那么就不是懊恼一下子就可以缓过劲来的。另外,对于中国大陆的访问者来说,这些东西总有被墙的危险。至于事情发生了之后,能不能把这些放在第三方网站上的评论再导入回自己的 blog 系统中,我还没有一个比较明确的答案。但既然如此,一直把评论放在自己的服务器里就是了,我还没有遇到过那种流量大的让用户发表评论特别困难的案例呢。

不过,见的多了,我现在也渐渐的接受了没有评论系统的博客了,也勉强可以接受 Octopress 这种评论的设计。原因之一还是现在博客的没落,没有人在乎它了,所以它的一部分(也就是评论系统)就变得不那么重要了。虽然我也觉得过多的留言降低 blog 的质量,有些知名博客总会 招惹到一些没有任何价值的评论确实让人讨厌,但有价值的评论我总是非常珍惜的。

“蔡依林的部落格”事件

我在 2007 年三月份,时值我开始写博客一年后的时候,遇到过一次“蔡依林的部落格”事件。当时我感觉比较好笑,对于所谓的蔡依林的部落格也感觉似是而非,但没想到在今天,因为 Octopress 等 blog 系统的出现,它却让我有了不同的感受。

这个事件本身比较幽默,一个人写了一篇文章,起因是他看到一篇新闻说,蔡依林花了五百万(新台币)建立了一个部落格,他上去看了一眼,发现这根本就是一个 web 1.0 的有着个人首页+留言板的站点,因此探讨了 blog 所需要拥有的要素,同时觉得五百万建立一个博客有些夸张。有趣的地方是很多蔡依林的粉丝看都没看文章的内容,就在文章的评论当中发表对蔡依林的“仰慕之情”,让我们可以探讨那个时候的普通网民对于博客的态度,甚至是根本就不知道什么是博客,博客代表的是谁。

不过我今天探讨的问题和这个幽默无关,而是关于 blog 应该有什么要素的讨论。那位仁兄的观点是在 web 2.0 的时代,没有 RSS、Trackback 等功能有些怪。那个时候我的观点是这个网站确实不应该值五百万台币,而网站本身的功能也不完善。结论是当时的很多人都不了解博客,因此只有留言功能,而博客的其它功能都没有实现。这在 Octopress 流传之后让我有种打脸的感觉。

我之前说过的 blog 的要素,Octopress 只保留了 RSS 一项,其它的都是通过插件或第三方网站来完成。也就是说,当时蔡依林的部落格其实加上了 RSS 输出,那么就可以算作是我们今天所认为的 web 2.0 网站了,更何况人家已经有了留言系统。这在 2007 年的时候是我不能想象的。

如今,hijolin.com 这个域名已经没了,蔡依林的那个部落格也早已经不存在了。我也不知道目前蔡依林的官方网站到底有什么东西,或许已经有了 RSS 功能吧。

关于 Brent Simmons 的发布系统

上个星期我读 Shawn Blanc 的博客 的时候,找到了 MarsEdit 的创始人 Brent Simmons 的博客,里面有一篇文章介绍了 Brent 自己写的一个新的发布系统,用来维护自己的博客。

这个系统是用 Ruby 写的,是一个本地程序,用来代替作者上一个用 PHP+MySQL 写的系统。这个名为 wildcat 系统是一个文件夹,由脚本和文章来组成。文章的源文件用 Markdown 书写,存放在特殊的文件夹里,运行时脚本会根据这些源文件生成静态的 HTML 文件,还有 RSS 输出,然后可以把生成的文件传输到服务器中去。这其实和 Octopress 有异曲同工之妙。根据作者 Brent,这个系统的好处在于:

  • 整个站点都在自己的硬盘上
  • 整个站点都用 git 来做版本控制
  • 方便备份,不用数据库
  • 在本地可以运行 Apache 来预览结果
  • 写几个 XML-RPC 处理器,仍然可以用 MarsEdit 来写博客
  • 但也可以用任何其它的编辑器
  • 站点在本地可以用 Spotlight 或 grep 和 find 来搜索
  • 整个站点的都是静态的页面,所以从一个服务器移动到另一个上非常非常的简单

我觉得他列出的这些优点也可以算作是 Octopress 的优点。不过从我个人的经验来说,除了非常极端的情况下,并不需要做到这个样子。版本控制其它的系统都比不过 git,但对于一个博客来说我看用处不是特别明显。至于其它的一些便利性的优势,我觉得都不是特别明显,有了数据库,迁移起来其实就多了几个步骤而已。至于站点的效率,并非没有大流量的 WordPress 站点,比如说 TechCrunch,虽然说它肯定额外的应用了一些技术,但它们站点发布文章的速度和规模实在是让我难以想象,但效率方面问题并不是很大。而且,一旦站点静态化了,必然的结果就是评论功能要另外实现,我现在还不是很认可这种做法。具体是选择静态化还是传统的 blog 系统,这倒是一个需要取舍的地方。

另外一提,Brent 的博客的外观也非常养眼,字体的可读性非常的高,插入的图片也非常得体,我在 WordPress 的一大群模版中还基本上没有见过能达到如此高度的。如见的博客模版方面,新兴的这些静态化的 blog 系统的水平都超越了传统的 WordPress 等老牌的 blog 系统,这是一个让我比较惊奇的地方。

车东的观点 2004 年之前

写这篇文章之前,我偶然看到了 Delphij 的博客上引用了车东说过的话:

那麼 1997 年起出現的這個新字眼,又代表著甚麼意思呢?所謂的 Weblog 指的是一種以 web 作為呈現媒介的(個人) log 。如果要從各位身邊尋找比較接近的例子的話,或許相當於 BBS上的個人板,或明日報個人新聞台吧。也有人把它稱做網頁型態的日記,不過沒有人規定 weblog 每天一篇,所以或許稱做網頁型態的札記會更恰當。

Delphij 的这篇文章写于 2004 年初,那个时候国内很少有人知道什么是博客,甚至博客这个词语好像还没有诞生或刚刚诞生,中国的网民对于博客还处于一种探索阶段。车东的这段话中简明的定义了:

blog = weblog = web log = log

也就是说,blog 其实是一种 log,对于一个人的网络生活的记录。这种观点在今天看来,其实已经非常落伍了,很明显,记录一个人的网络生活,blog 已经出具了,Facebook 等 SNS 网站也渐渐的淡出,重点还是 Twitter、QQ 等工具引导出来的零碎的信息,才更加符合 log 的形态与定义。

关于在线编辑

接下来我像谈谈所谓的在线编辑。在过去,我对 blog 的坚持认知中,后台的管理界面是非常重要的一点。能不能完成某些功能,做某些工作是否简洁,这些是我么考虑的内容。Octopress 等系统的出现颠覆了这种观点,它用简便的命令行来代替了后台程序。说实话对于某些方面,我对这种政策比较欢迎,尤其是文章编辑方面,在线的编辑器绝对无法满足所有人的需求,因此离线编辑则成为了更好的选择。但如果一个 blog 不可以随地的、在任意一台电脑上编辑,怎么能算得上是 blog 呢?

这种思想跟我过去没有自己的电脑有关系。我在 2007 年 9 月之前,都没有属于自己的电脑。所以过去我写博客或者是借用同学的电脑,或者是趁周末回家里用家里的电脑来发布,也造成了我对于移动性的要求比较高。后来有了自己的电脑,我基本上是电脑随身,因此这种要求也渐渐的淡化了。

在今天看来,后台系统对于 blog 不是必要的,虽然对于大多数的用户来说,有个后台管理系统还是更加方便。但 Octopress 等系统,也确实可以通过命令行和配置文档来很好的解决了这些问题。当然,我对于这些系统没有亲自的使用过,或许并没有发言权。

CMS 还是 Blog

很多发布系统,包括 Octopress,都生成自己的系统可以算是 CMS 了。当然,严格来说,blog 也可以算作是 CMS,但我们普遍的认为 CMS 是 wiki 这种程序所代表的系统。相比来说,两者间更大的差别在于信息的管理形式。Blog 是通过文章和评论来组织的,wiki 也是通过文章,但评论这部分变作协作编辑的形式了,两者之间的输出结果有差别。

这些静态化页面的发布系统,剔除了自己的评论功能,其实在组织形式方面已经往 wiki 上面来靠了。我过去其实挺期待这么一个系统的,因为我不喜欢自己手写 HTML 来维护我的首页,也不喜欢把我的博客放在首页上,所以过去我的首页长期以来都是一个简单的导航页。我当时琢磨的是用类似 wiki 的系统来管理我的首页等相关页面:用 Markdown 写好了页面的内容后,放进某个文件夹内,然后脚本遍历文件夹,生成 HTML 页面,搞定。后来总是没有找到合适的系统,如果那时候我知道了 Octopress 等工具,估计会非常高兴的用它们来管理我的首页了吧。现在我的首页,已经转向到了我用 MoinMoin 管理的一个 wiki 页面了,今天看来其实和 Octopress 等发布系统差不多。

但,一个 blog 真的可以用 CMS 系统来代替么?这一点,我仍然持保留态度,留有跟上面的讨论一样,毕竟我们倾向于把 blog 从 CMS 中区分开来,两者管理信息的形式是不同的。

结尾

对于 blog 的本质是什么,blog 需要有那些元素等问题,或许每个人都有不同的观点,这个不好定论。至于 Octopress 是不是一个好的 blog 系统,这种形式跟传统的 blog 系统究竟孰优孰劣,还是一个需要事件验证的问题。但网络这种东西的发展日新月异,如今我对于 blog 的观念跟 2007 年比已经有了很大的不同,之后又会发展成什么样子,我还无法想象。但我看好这种发展,因为它们非常有活力,也表明了信息产业的未来前途。

OS X 10.6 的 AppleScript 中文 bug

前几天一个偶然的机会我发现了 Shawn Blanc 的 blog。这个 blog 包含了一些时尚科技的评论,更新速度比较高。作者 Shawn Blanc 目前是专职维护这个 blog,blog 本身有收费会员订阅的项目,每月花 3 美元就可以阅读一些更多的内容。但免费的内容已经非常丰富了,作者有这个底气征收付款,在中文 blog 圈子中应该是比较难以想象的吧。

我从这个 blog 中看到一篇 MarsEdit 的评论,因为我自己也在用 MarsEdit,它是我的计算机上的几个花钱购买的商业软件之一,于是我就花了点之间仔细看了一下作者的评论,从中知道了我之前一直以为不存在的字数统计功能,竟然在脚本菜单下面。我知道自己还不是一个比较资深的 Mac 用户,比如像 mac script menu 这样的菜单我从来没有点过。这次知道在 MarsEdit 这个菜单下面,就有对文章的统计功能。于是我点了统计功能后,MarsEdit 的 CPU 占用率马上飙倒了 99%。最后只能把这个进程给杀掉。杀死进程后 MarsEdit 有崩溃报告功能,我就顺便把这个 bug 给报告了。

Apple 本身也有这种功能,不过可能用户量太大,Apple 应该只把它当作一个记录统计的作用。而 MarsEdit 的开发公司 Red Sweater 这种规模不大的公司,收到这种报告的次数可能不多吧,反正我第二天就收到了 Red Sweater 的回信,请我帮助他们 debug。我把造成问题的那篇文章发送了过去,因为我的文章是中文的,我以为 MarsEdit 可能对多语言支持的不够完善,就提了一句是不是 Unicode 方面的问题。

之后对方发来邮件,包含了一个另一个版本的字数统计脚本的附件,让我用这个脚本来试试。我试了一下,仍然有问题。脚本是用 AppleScript 写的,我从来没有学过这门语言,但据说它非常简单,脚本本身也不长,我看了几眼就大体上知道是怎么回事了。稍微研究一下,我想找出来是我的文章的哪个部分让这个程序的哪一行卡住了。于是排除了一下,发现造成问题的原因比较古怪,也不是所有中文都通不过,我发现的一种情况是只有字符串中包含一个汉字,跟上一个空格,再加上一个数字的时候,words of inputString 就会卡住。inputString 就是输入的字符串,脚本中用了 number of words of inputString 来获得字符串中包含的字符或汉字。我的那篇文章中正好有这种情况。实际上,我从几年前写文章就习惯再汉字跟数字及英文字母之间加上空格,这样更清晰一些,所以我的 blog 中一定会出现很多这种情况,我的大部分的文章都没办法用这种办法来统计字数。

我把我的发现发给了 Red Sweater,对方回信告诉我说这个问题在 OS X Lion 中不存在,因此似乎是 Mac 系统本身的问题。出问题的代码仅仅是调用了系统给的函数,因此也不好解决。对方说他们会想别的办法来获得字数统计功能。

另外,我还询问了对方能不能加上一个实时的字数统计功能,在编辑窗口中显示。结果对方告诉我目前 MarsEdit 已经有这个功能了,在状态栏里有显示。只是默认情况下状态栏是隐藏的,但对方担心他们做的统计功能可能不适合中文,因此他们也询问了我对于中文字数统计的要求。我看了对方的说法,他们或许是因为英文统计的是单词而不是字母的关系,所以考虑做中文分词,统计文章中出现的中文词组。我一看这可差老鼻子远了,中文分词本身就发展的不怎么样,还让老外来做这个,猴年马月才能弄出来啊,更何况中国人看字数统计也不管里面用了多少词组啊。所以我赶紧发邮件说别搞这个了,我们关心的仅仅是字数。

之后,不知道什么时候可以解决这个 bug。老外对于中国语言,大概从文化上就和西方语言有差异吧,我用过一些编辑器,里面也有字数统计的功能,但对中文来说都是没法用,因为它们全部是针对英文的单词设计的,字符之前没有空格就认为是一个单词,比如说这篇文章写到这里,MarsEdit 告诉我一共有 173 个 words,这就差的相当远了。不知道是不是所有写软件的老外都有类似的误会,考虑做什么分词,要能统一的给他们纠正过来就好了。

对 LastPass 有些失望

我从开始用 LastPass 后,就逐渐的把我日常使用的密码用这个软件管理了。不过用到最近,我对它感觉失望了。

失望的原因之一是这款软件太依赖于浏览器。软件本身其实只是一个浏览器的插件,负责本地数据和远程服务器上的数据沟通。我对这种方式的不满在于,它没有考虑胖客户端。今天虽然很多东西都可以再浏览器里完成,但浏览器之外的网络客户端依然保留了一些,最典型的就是各种 IM 软件了。LastPass 只在浏览器中管用,当要在客户端里使用密码的时候,就比较不方便了。当然,这是次要原因。

主要原因在于 LastPass 本身的设计。LastPass 保存的密码项目中有一项 URL,可以在浏览器的 LastPass 按钮中点鼠标就直接登陆网站。这样把事情搞得比较复杂。LastPass 本身可以通过检测浏览器的输入框,来判定要不要自动帮你输入用户名和密码。这项功能因为语言识别的不成熟,因此常常会造成误判,最常见的就是把其它内容识别成用户名。当然还有许多,我现在已经不用 LastPass 了,因此举不出更多的例子了。

我考虑过换用 1Password,但这个软件的售价让我觉得有点高,作为一个密码管理软件有些不值。而且它本身的功能是不是过硬,我还需要进一步考察。另一方面我本身也想做个 Rails 项目干这事,同时也是一次锻炼。不过这样子把密码放在自己的服务器上,安全方面就需要考虑了,SSL,公钥私钥什么的,我现在还没有个谱。所以这方面我还没有做决定。