Adium 一些工作与开源软件相关的思考

更新: 原来 MSN 群中使用 /showname 命令也可以控制这一点。

另外 Adium 其实是个非常好的开发群体,非常 active & helpful,只是项目庞大到了这样,bug tracker 里的 ticket 一多,开发者自己也很难保证代码结构足够好了。


因为最近开始使用 MSN 群 (1, 2),但我使用的 MSN 客户端 Adium 并不能将群内发言人的身份显示出来,只能全部统一显示为群本身的名称。

其实这是 Adium 所使用的 IM 协议支持库 libpurple 在支持 MSN 协议上固有的缺陷 — 不过也不算特别严重的缺陷,因为 Windows 版本的 MSN 也只在 Windows Live Messenger 8 以上才支持,而 Mac OS X 下的 Microsoft Messenger 干脆到现在也不支持。

所以,要修复这个问题,必须从 libpurple 上打主意,然而,因为 libpurple 编译不便 (后面我会解释为什么这么说),Adium 本身的代码仓库中只提供了编译好的 libpurple framework,编译这个 framework 的步骤则是分离出来的,要单独用 Utilities/dep-build-scripts 下面的脚本来完成

可是问题变得越来越 tricky 了:为了编译 libpurple 的代码,必须下载整个 pidgin 的代码,但 pidgin 的代码又是用臭名卓著的 Monotone 来管理的,这直接导致下载当前代码的步骤就变得复杂无比,更不用说后面的编译了。

这还没有完,崩溃的是,Adium 虽然其他协议的支持都是直接从 libpurple 来的,但偏偏 MSN 协议最近改用了从 libpurple 中 fork 出来的 msn-pecan 项目,而 msn-pecan 又是用 git 来管理代码的……

这么一来,为了修改 MSN 协议支持并编译出 Adium,我们必须至少涉及三套版本管理系统 (Subversion, Monotone 和 git),把 Adium 提供的一堆错综复杂的脚本找出来,让它先给 libpurple 打上 Adium 自己的 patch,然后分 ARCH 来生成 configure 并分别配置编译,最后合并成 Universal Binary 再 copy 回 Adium 的 Frameworks 目录去… 到这里我还没开始改一行代码呢!

虽然这个问题最终得到了解决,我提交的 patch 也将合并到 msn-pecan 官方的代码中去,可是这个经历仍然让我觉得颇有体会:

从 F/OSS 项目的贡献者来讲,要成功的参与项目,就必须掌握好常用的版本管理工具并了解基本的编译手段,才有机会参与到真正的代码修改中去。

而从 F/OSS 项目的发起和维护者来讲,要创造一个成功的项目,应该:

  1. 避免使用怪异的版本管理工具
  2. 编译步骤简单再简单,尽可能分解为可以单独执行调试的步骤,尽可能减少会在编译时出现的问题

用 MEncoder 编码 H. 264 流

MEncoder 是常用的离线编码器,属于 mplayer 项目的一部分,这里介绍了怎样用 MEncoder 编码常见的视频流。

首先,要安装 x264 编码库,mplayer 需要这个库才能加上 H. 264 编码支持:

$ git clone git://git.videolan.org/x264.git
$ cd x264
$ ./configure
$ make && sudo make install

注意 x264 库需要 yasm 汇编器,MacPorts 下可以用 sudo port install yasm 安装。

然后编译 mplayer (包括 mencoder)。

$ svn co svn://svn.mplayerhq.hu/mplayer/trunk mplayer
$ cd mplayer
$ ./configure # 注意输出中是否有 "Checking for x264 ... yes" 字样
$ make && sudo make install

然后就可以调用 MEncoder 了:

$ mencoder input.fmt -o output.fmt -ovc x264 -oac copy -x264encopts \
    bframes=4:b_pyramid:weight_b:pass=1:psnr:bitrate=1500:turbo=1

其中 input.fmt, output.fmt 分别是输入和输出文件,其调用格式见 MEncoder 的文档,而后面 -x264encopts 的参数制定的是 x264 编码参数,这是影响编码质量和速度的地方,文档中也有专门一节详细说明,这里选取的是一个中等偏上的效果。

在看过 Diablo 3 的 Trailer 之后

就完全不期待 Spore 了… 原因主要是:

  • Spore 是个 Cider port,不是真正的 native Mac Game — 今年的 Neverwinter Nights 2 Mac 版给我的印象很糟
  • 从 Creature Creator 来看,Spore 的角色太卡通太塑料了,让人提不起兴趣
  • Diablo 3 完全没有令我失望…

现在 Mac 下真是只有 Blizzard 一家还在认真做游戏了.. 其他所有的厂商基本上都是用 Cider 来糊弄一下,Apple 是不是应该直接把每年的 <a href="http://developer.apple achat viagra en europe.com/wwdc/ada/index.html#game”>ADA Best Mac OS X Game 发给 Transgaming?

终于用上实验室的打印机了

我们实验室的打印机是一台 HP LaserJet 1020,装在一台 Windows 2003 Server 上通过 Samba 共享的。我一直懒得了解 Mac 下怎么操作这台共享的打印机,所以有什么要打印的都是发给别人帮我打。

今天有空来试了一下解决这个问题。首先,打开 System Preferences 里的 Print & Fax,尝试添加打印机,结果发现 Windows 这里通过浏览工作组找不到打印机所在的那台计算机:

找不到打印机所在机器

怎么办呢,开始 google,找了一圈发现原来需要 Custom Toolbar 才能找到上图中那个 Advanced,提供原来 10.4 里 Printer Setup Utility 的功能,通过直接输入 IP 的方式来配置 Samba 共享的打印机。

因为头一次用,还专门用 smbclient //IP/PrinterName 试了一下确实可以连接。

另外打印的时候还是需要输入密码的,不过对于没有设置密码的共享,可以选 Guest。

配置好了,选择打印但是打印机还是没反应,怀疑是驱动不对,原先选的是 Generic PostScript 打印机的 PPD,可是 HP 压根没有提供给 LaserJet 1020 的官方 Mac 驱动… google 了一下,找到一个很不错的解决方案:foo2zjs — 这是一套开源的驱动,给 Linux 和 Mac OS X 提供了一些缺失的打印机支持,注意网上还能找到许多相关的讨论,和另一套 1022 的驱动据说也能用,可是似乎对于共享打印机不起作用。

按要求依次把驱动和其依赖的包装上之后,在 Driver 里选择 HP LaserJet 1020 Foomatic,终于成功打印,太感动了。

HP LaserJet 开源驱动

下一代 JavaScript 开发方向?

更新: Mozilla Labs 新出一篇 Next Generation Javascripting 也总结了近来出现的一些有趣的东西,包括 Tamarin, SqurirrelFish, Processing.js, ContextFree.jsParchment

其中 Tamarin 和 SqurirrelFish 代表了浏览器 JavaScript 引擎性能的提高 — Tamarin 虽然现在还不明显,因为它的 JIT 还在 tracing 优化阶段,SqurirrelFish 甚至还完全没用 JIT。不过这两者正式进入市场至少要到 2009 年 Mozilla 3 平台的初步发布和 Safari 4 随 Snow Leopard 一起发布时。

Processing.js 和 ContextFree.js 则代表了 Web-based Processing 创作的新方向,ProcessingNodeBox 的成功充分说明了在简单技术上提供更有效的表达方式会给图形生成带来多大的改进,现在能在 Web 上直接实时呈现这些优美的图形,毫无疑问 Flash, Silverlight 等将更不受欢迎了。

Parchment 则是一个非常漂亮的 Z-Machine 在 Web 上的呈现,适合 Text Adventure 爱好者们。


近来,两个新出现的 JavaScript 框架得到了许多关注: SproutCoreObjective-J。表面上,它们共同的特点就是大量使用了 HTML5 特性来改善用户体验,达到类似桌面应用的效果,然而从底层分析,它们其实代表了两种对富 JavaScript Web 应用的开发方式的革命。

为什么说是“两种”呢?虽然 SproutCore 是一套几乎完全由 Apple 工程师开发的框架 — 其设计目的就是给 MobileMe 提供类似桌面应用的效果 — 但其设计思维是 Web 化的,是和现下流行的服务器端开发框架一脉相承的。从我的观点看来,SproutCore 是受 Ruby on Rails 影响严重的一套框架,其提供的工具大多用 ruby 编写,创建的目录结构都带着 Rails 的痕迹 — 甚至开发人员也是典型的 TextMate 用户。

而 Objective-J 虽然也主要是由前 Apple 工程师领导开发,可是这些工程师却是不折不扣的 Objective-C/Cocoa 狂热爱好者,他们在 280slides 表现出来的是典型的 Keynote 风格,其代码组织则是典型的 NeXTSTEP 风格。

所以,可以想见的是,SproutCore 的设计思维更容易为大众接受,而 Objective-J 很可能始终保持小众 — 甚至我都很怀疑它到底会不会发布…