解名缰 鸟倦飞

R2SWF诞生记(一)

2013 年 12 月 07 日 | 分类于 R

刚刚提交了 R2SWF 0.7 版。

五年以前,差不多就是这个时候,北京召开了第一届R语言会议,那时候天还很蓝(←_←够了)。

那时候还不认识初代目火影谢老大,当时他做了一个R语言实现动画的报告,我坐在下面听。因为当时我好像正好在捣腾 Flash 动画,于是报告结束后上去搭讪,问了三个问题:“这个动画的原理跟 Flash 很像啊。不知道现在有没有什么自动生成 Flash 的程序?这个功能以后能不能加到 animation 包中去?”初代目答曰:“是啊,不清楚,可能吧。”(注:此处有夸张)

后来 animation 包真的加入了一个 saveSWF() 函数,其原理是调用了一个叫 SWFTools 的程序,它可以把 PNG, JPEG 和 PDF 格式的图片转换成 SWF 格式的 Flash 动画。saveSWF() 所做的就是将程序调用的命令行封装成函数,供用户使用。但这里面有一个麻烦事,就是需要系统里面装好 SWFTools,【而且】,把可执行文件加到系统 PATH。后面这件事对于 Windows 用户简直就是灾难,所以初代目一直想把 SWFTools 打包到 animation 里面。我记得当时做了很多尝试,比如把 exe 文件直接塞到软件包中,但因为 CRAN 不允许软件包包含可执行文件,所以此路不通。还有用函数自动下载安装文件,然后读取注册表获取文件位置什么的,但好像也是因为太过复杂而放弃。

然后过了一年,到了第二届R语言会议,那时候天依旧很蓝(戳开链接有图为证)。

这中间的一年里开始折腾各种新奇的玩意,比如 Linux,比如开始学C语言,比如学着自己编译一些开源软件,等等。可能也是因为会议的演讲中有宫雨老师关于R与C交互的报告,所以当时就萌生了把 SWFTools 打包进 animation 的想法。于是那时候便开始研究 SWFTools 的源代码结构,然后试着与R进行结合。终于,天可怜见(误),在某个夜黑风高的夜里,居然真的被我编译通了,为此还兴奋地发了篇博客。只可惜,那时候还太年轻(?),根本不知道里面的水有多深。要知道,开源社区的代码风格是以最大可能兼容各种不同的平台,所以你需要 configure 文件,需要 Makefile,需要 config.h.in,等等等等。等我意识到这些,才知道已经掉到坑里出不来了,参见那时的吐槽。因为这些问题,程序没办法在 Windows 上编译,所以只好潜心修学,苦练内功,等待他日再战。

【警告:后面要变文风了】

于是一年又一年,这次是 2010 年的 12 月 3 日,距初代目潜入美帝已经过了两载。这段时间略有一些反常,因为原本初代目会定期将一些情报资料发送到我们组织的加密邮箱,但最近已经有两周没有通信了。我推测信件是因为不明的原因被拦截,因为即使经过256位加密,当前的情报传输也并非总是可靠的。如果是这样,今后的通信可能会面临很大的风险。但无论如何,这一天我必须将两个压缩文件包发送到网络通道的另一端,以在约定的时间里完成组织的任务。不,不对,这不是组织的任务,而是私下里与初代目构思出的一个计划。即使是在组织内部,也很少有人听说过这个计划。

这一天的天气本应不错,但我故意调低了房间的亮度,因为我觉得太强的光线会让我放松警惕。在确定周围没有其他人之后,我像往常一样打开邮件的页面,同时从抽屉的最深处拿出一个闪存盘,将其中的两个文件上传到附件中。我反复检查了邮件的内容,使其看上去更像是日常的对话,以免露出破绽。我不停地告诉自己,这一步迟早要来的,就算是失败了也不会对我产生本质上的影响,但我还是迟迟没有办法点下发送的按钮。就这样犹豫了一分多钟,手上的汗已经沾到了鼠标和键盘上。终于,门外一阵陌生的声响,让我警觉地迅速点下按钮,决绝地忘记了其中的任何细节。

我原本以为,这封邮件会石沉大海,或至少要等若干天才收到回复,谁知道仅仅过了四个小时,我便收到了来自初代目的指示。大意非常明确,“时机成熟,独立出来,开始行动”。

【待续】