---
title: 第二届靠谱厮奖：俞丽佳
date: '2017-04-11'
slug: copss-2
---

上个月我们颁发了《[第一届靠谱厮奖](/cn/2017/03/copss/)》。时光荏苒，岁月穿梭，我们很快就迎来了第二只靠谱厮[俞丽佳](http://yulijia.net/)。这一只靠谱厮的速度真是快，我本以为交给她的任务至少需要一个月才能做出个雏形来，结果她过了一周就以迅雷不及掩耳盗铃之势[交货](/animation/)了。

![快速完成任务](https://slides.yihui.org/gif/dog-drag.gif)

这事是我好些年前就想做但没做好、后来又停下了的工作：R 动画包 [animation](https://github.com/yihui/animation) 的网站。十年前我用 Dreamweaver 纯手工打造的动画网站在 <https://R.yihui.org>，后来有一阵心血来潮用 DokuWiki 重做了一遍，然而兴奋了没两年，又觉得不靠谱了，因为需要手工维护。后来各位客官应该都知道了，因为痛恨需要手工维护的代码输出[^1]，我从 2011 年开始出门去绕大圈，从 knitr 开始，先绕 LaTeX，完了绕 Markdown，然后是单个文档（rmarkdown）、论文（rticles）、书籍（bookdown）、幻灯片（xaringan），现在绕到了网站阶段（blogdown），终于可以开始着手解决我最初的问题。

2013 年 2 月我写了[一篇日志寻人](/cn/2013/02/waiting-for-thousand-years/)帮我重新整理 animation 包的网站。于是丽佳君立马跳将出来：

![第一封邮件](https://db.yihui.org/images/lijia-email.png)

我又做了[第三次充满野心的尝试](http://vis.supstat.com)，这次是基于 Jekyll 和 knitr，但结果我仍然不满意。我觉得从 2013 年到现在虽然没过几年，但网站的基础设施发生了巨大的变化，部署静态网站已经变得简单地不能再简单。当年我纠结了好一阵子的问题是那些动画文件存在什么地方，其实纠结也是因为自己的特殊洁癖：不想把从代码输出的二进制文件（如图片）放进版本控制系统，于是想了一个非常黑的黑招，把图片存到了 R-Forge 上，估计这个黑招至今也没几个人发现。

五年后，我再次动了这个念头，想把动画网站复活。虽然 animation 包里的 R 代码写得一塌糊涂（毕竟是我的第一个 R 包，新手上路多多关照），但我觉得有些演示还是有那么点意思，比如[高尔顿板](/animation/example/quincunx/)（豌豆机）：

<video controls loop autoplay><source src="https://assets.yihui.org/figures/animation/example/quincunx/demo-a.mp4?dl=1"><p>高尔顿板的演示</p></video>

因为做了两年 Markdown 相关的开发工作，我现在经常自问自一个问题：这个功能要是去掉会不会让人失眠？换句话说，这货还能简化吗？

前两个版本的网站我觉得维护起来痛苦的另一个原因是我当初想让动画支持播放器功能（进度条、播放、暂停、快进、循环按钮等等）。为了在 HTML 页面中重新发明一个播放器，就得捣鼓 JavaScript，还得存一大堆图片，每幅图就是动画的一帧。贼啦繁琐。

第四版动画网站我决定放弃这个复杂的播放器，直接将动画用 FFmpeg 转化为单个 MP4 文件。然后觉得整个世界都清静了！本质上，就是放弃了自己造的播放器轮子，替换为客户端的系统 MP4 播放器。这年头谁的浏览器还不支持播放 MP4 文件呢？[^2]

简单说，所有 MP4 文件通过 knitr 自动输出在我的 Dropbox 文件夹里，用 [Updog](/cn/2017/02/old-tomb/) 做服务器。网站源代码放在 [GitHub](https://github.com/yihui/yihui.org) 上，别人可以提交合并请求。如果需要大规模贡献，我把这个文件夹共享一下就好了。

丽佳君之所以可以做到雷霆万钧之势把这事摆平，主要是写了一个 Shell 脚本把我所有的例子都自动转化成了 R Markdown 文件。跟这样的莽撞人合作让人觉得很舒畅，一个重要原因是她已经非常熟悉脚本工作方式以及 GIT，我无须在技术细节上费心。

该靠谱厮有一点微妙的幽默感，我觉得很逗。其网站分类目录都是四个字，整整齐齐，显然是强迫症的表现；分类里有一类叫“[壳牌脚本](http://yulijia.net/cn/categories/#壳牌脚本)”。神翻译，哈哈哈哈哈。

[^1]: 如果可能，我希望只维护源代码而不要维护输出，输出应该是可以从源代码自动生成的东西。

[^2]: 嘿，你还别说，还真有不支持的。要问它是谁的话，它就是 RStudio。好吧，我的脸又肿了。
