# 3. 静态网站生成器

内核恐慌 · 2014-11-03

<https://lib.pan.icu/ecd9ff55-224b-457f-80d9-751582b6890c>

本期《内核恐慌》中，主持人Rio和吴涛深入探讨了静态网站生成器的概念、兴起原因及实际使用体验。他们指出，静态网站生成器通过预先生成HTML文件，避免了动态网站中数据库查询和服务器端渲染的负担，从而提升性能和安全性。Rio分享了自己从WordPress迁移到Jekyll的经历，感叹其依赖管理复杂但社区活跃；吴涛则因Apple Force（2500多篇文章）的生成耗时问题，先后尝试了Python自建工具和Go语言编写的Hugo，后者在单核上不到1秒完成构建，速度惊人。两人还讨论了部署自动化：吴涛利用GitHub Webhook和git post-merge钩子实现代码推送后自动生成站点，而Rio仍用传统rsync。针对评论功能，他们倾向于关闭或使用第三方平台如Discourse，认为提高评论门槛能有效减少垃圾信息。最后，吴涛展示了Go语言中独特的日期格式化方式——通过一个固定时间点（2006年1月2日15:04:05）作为模板，无需记忆占位符，体现了Go语言的设计哲学。

## Questions this episode answers

### Hugo 静态网站生成器的构建速度为何能比 Jekyll 快这么多？

吴涛在节目中实测，他的 Apple Force 网站有 2500 多篇文章，用 Jekyll 构建需 3 分钟，而 Hugo 仅需不到 1 秒。Hugo 用 Go 编写，生成独立二进制文件，执行效率远超基于 Ruby 的 Jekyll，且无需外部依赖，部署极简。Rio 也提到 Jekyll 升级时常引发编码错误，Hugo 的高性能和低摩擦特性解决了这些痛点。

[45:58](https://lib.pan.icu/ecd9ff55-224b-457f-80d9-751582b6890c?t=2758000)

### Go 语言中格式化时间的方式为什么独特？

Go 没有使用传统的百分号占位符如 %H、%M，而是用一个固定的参考时间“2006年1月2日 15:04:05”。你只需按想要的格式写出这个时间点，如“03:04”代表时分，程序就会自动推断。Rio 和吴涛在节目末尾详细演示了这一机制，吴涛认为它虽然初次接触不习惯，但用熟后无需查手册，非常直观。

[1:38:38](https://lib.pan.icu/ecd9ff55-224b-457f-80d9-751582b6890c?t=5918000)

### 如何用 GitHub webhooks 实现静态网站的全自动发布？

吴涛为 Apple Force 网站设置了自动化流程：源文件托管在 GitHub，每次 commit 触发 webhook，服务器执行 git pull，再通过 post-merge 钩子自动运行 Hugo 生成静态页面。全程无需手动操作，甚至可以在 GitHub 网页上直接编辑文章并发布。Rio 评价这是“端到端自动化”，能消除写作发布的摩擦，让你更愿意更新内容。

[1:09:40](https://lib.pan.icu/ecd9ff55-224b-457f-80d9-751582b6890c?t=4180000)

## Key moments

- **[0:00] 开场**
  - [0:42] “现在是协调世界时UTC，%H点%M分”——吴涛开场报时
  - [1:48] TMK Underline Keyboard mod让HHKB键盘实现HJKL方向键，吴涛解释其原理
  - [4:59] 德系车锁车后油箱盖仍能打开的安全隐患——Rio揭露
  - [6:26] 部分大众车拔钥匙后车灯不自动关闭，直至电池耗尽——Rio吐槽此设计缺陷
  - [8:45] 德国门房大爷认为德国车都是骗子并误认现代为日本品牌——Rio分享
- **[10:58] 静态生成器**
  - [11:04] 静态网站生成器定义：按规则将纯文本内容生成静态网页的工具
  - [12:23] 吴涛回忆90年代通过大学tilde目录托管个人主页的静态网站时代
  - [15:22] Rio因依赖包API变化放弃自建Lua博客系统，转投Jekyll
  - [18:25] 版本号0.9的不成熟技术不适合长期项目——Rio从Lua迁移中汲取的教训
  - [19:24] “Java已经死了，死的东西是不会变的”——Rio调侃
  - [21:58] Rio的博客平台变迁：从榕树下、Doodle News到WordPress和Jekyll
- **[36:38] 性能瓶颈**
  - [37:00] Jekyll生成2500篇AppleForce帖子的测试结果：Core i7单核耗时3分钟
  - [38:13] Ruby官方实现MRI被认为太慢，是Jekyll生成缓慢的主因
  - [40:41] Rio曾用C#为学校美工编写静态网站生成器，实现模板填充
  - [42:41] 编程Kata概念：将“十进制转罗马数字”作为练习，或编写静态网站生成器
  - [44:50] Python multiprocessing使AppleForce生成时间从3分钟降至12秒
  - [46:18] Hugo性能测试：2500篇文章生成不到1秒，碾压其他脚本生成器
- **[1:01:00] 部署自动化**
  - [1:01:29] Rio描述部署流程：通过git push推送源文件，服务器git pull后执行build
  - [1:03:27] Dropbox Linux客户端不稳定，同步延迟严重，影响博客更新
  - [1:06:08] Dropbox开放API后可用webhook通知服务器更新，无需安装客户端
  - [1:07:10] BitTorrent Sync作为去中心化同步方案，稳定性优于Dropbox
  - [1:08:45] 文件系统事件触发多次重建，中间状态不稳定可能导致错误暴露——吴涛分析
  - [1:09:40] 最终方案：GitHub webhook触发git pull和Hugo build，实现端到端自动化
- **[1:31:12] 评论迁移**
  - [1:31:12] 从动态网站迁移静态的两大难点：图片等附件管理和原有评论的处理
  - [1:31:32] “就不要评论了”——Rio谈静态博客如何处理评论
  - [1:33:52] Rio分享通过博客评论认识德国朋友“点问号鱼”的经历，感叹评论曾是重要社交渠道
  - [1:35:01] Discourse等第三方评论平台通过嵌入JavaScript为静态网站添加评论功能
  - [1:37:25] “Our world is reality”——吴涛调侃静态生成器只流行于程序员圈子
- **[1:37:38] 结尾**
  - [1:38:13] “现在是Zulu time，%H点%M分”——吴涛结尾再次报时
- **[1:38:41] Go时间格式**
  - [1:38:49] Go语言特有时间格式化方法：使用“2006-01-02 15:04:05”作为模板
  - [1:40:38] Go时间格式化只需记住“2006年1月2号3点4分5秒”即可推导所有格式
  - [1:43:38] Rio起初不理解Go时间格式化，经吴涛解释后承认其巧妙性

## Speakers

- **Rio** (host)
- **吴涛** (host)

## Topics

Web 开发

## Mentioned

BitTorrent Sync (product), Dropbox (product), Emacs (product), Flickr (product), GitHub (product), Go (product), Hugo (product), Hyde (product), Jekyll (product), Lua (product), Middleman (product), Movebot Type (product), MySQL (product), Nginx (product), Octopress (product), Pelican (product), Python (product), Ruby (product), Vim (product), WordPress (product)

## Transcript

### 开场

**Rio** [0:01]
3，2，1， 开始 。

**吴涛** [0:04]
3，2，1， 开始 。

**Rio** [0:07]
你来开场 。

**吴涛** [0:12]
呃 ，OK。

**Rio** [0:16]
这回该说 " 临时 " 了吧 。

**吴涛** [0:18]
这次说到临时去了 。

嗯 ，" 全球协调室 "。 不对不对 ，UTC 是什么来着 ， 协调世界是 ？

**Rio** [0:32]
我不知道它中文名字叫什么 ，Universal Coordinated Time？

**吴涛** [0:39]
哎 ，Univ... 这是法语 ，Universal...

**Rio** [0:41]
啊对 ， 它是一个法语的缩写 。

**吴涛** [0:42]
之类的 。 OK。 现在是协调世界时 UTC， 百分号 H 点 ， 百分号 M 分 。 您正在收听的 —— 或正在反复一听再听的 —— 是 " 内核恐慌 " 一档 IT 类 podcast 节目 ， 主持人是我 ， 吴涛 ， 还有 Rio。

**Rio** [1:01]
OK， 呃 ，在今天的节目正式开始之前 ， 我们做一个什么 ，follow-up， 简称 FU。

**吴涛** [1:08]
对 ， 对 ，在阔别了两周之后， 大家又听到我们的声音了 。 这两周之间也有一些反馈 ，但实际上我们这期节目不是在真正的您听到这期节目的前一天或者前两天录的 ， 这具体什么时候我们都保密了 。

但 ， 呃 ， 目前我们所得到的一些反馈是 ， 嗯 ， 一位也是姓吴的推友 ，在推特上告诉我说 ， 如果想要在 HiPad 跟 Keyboard 上面使用 HJKL 做方向键的话 ， 可以去加装一个叫做 TMK Underline Keyboard 的 mod。

然后这个 mod 的 ， 我记得我以前应该看到过这个东西 ， 它的根本的理念就是在这个 HHKV 上面加装一块 ， 呃 ， 使用 ARM 处理器的开发板 ， 然后在这个开发板上烧录一个 ， 呃 ， 呃 ， 烧录一个控制器 ， 然后通过这个控制器做这个键盘和主机之间的传输 ， 呃 ， 传输 converter， 可以这么说 。

**Rio** [2:16]
对 ， 对 。

**吴涛** [2:16]
然后就可以让 ——

**Rio** [2:17]
你翻译了一下， 对吧 ？

**吴涛** [2:19]
对 。 然后这样就可以让 ， 这样就可以自定义 HiPad 跟 Keyboard 上面的哪些键有哪些功能 。 比如说 ， 它有一个比较经典的 mod 是用空格键做的 ， 当作 Fn，也就是说在你按下空格键的时候 ， 你就可以去按 1、2、3， 然后这个时候 1、2、3 就是 F1、F2、F3。

**Rio** [2:35]
哦 ，OK。

**吴涛** [2:37]
对 。 但是我是觉得要在上面加一个 TZK， 就是它推荐了一个开发板 ， 叫 TZK 开发板 ， 这个开发板足够小 ，并且可以塞进这个键盘的内部 。

可我觉得拆开键盘塞一个开发板进去 ， 然后焊啊什么的 ， 还是太麻烦了 。

**Rio** [2:56]
这 ， 这 ， 这你就不够硬核了 ， 人家都自己组装 ， 从那个什么 ， 从零部件开始组装键盘了 。

**吴涛** [3:03]
对 ， 没错 。 这说明我还是硬核精神不够啊 ， 需要 ， 需要 ， 还是还是需要来试一试这件事情的 。

**Rio** [3:11]
嗯 ，而且你就守着离那个 chair 场那么近 ， 对吧 ？

**吴涛** [3:16]
这个跟他们没关系啊 ， 我总不能去他们要这个 ， 我总不能去跟他们要这个轴 。 哦 ， 你的意思是我买一堆轴来 ， 然后自己做一个键盘是吧 ？

**Rio** [3:24]
对啊 ， 这两天 ， 前两天那个什么 Hacking 就这样 ，不是有个人就这么干了吗 ？

**吴涛** [3:28]
唉 。

**Rio** [3:29]
这个还真 ——

**吴涛** [3:30]
送我一个 3D 打印机 。

**Rio** [3:31]
这才是 ， 这才是真正的硬核 ， 好吧 。

**吴涛** [3:34]
对 。其实开源的键盘项目我以前也见过一个 ， 就是 ， 呃 ， 完全 DIY 来制作 ，而且网上可以买到它的图纸 ，而且我相信那个键盘的壳子就是用 3D 打印机的 。

**Rio** [3:47]
哈 ， 这这样出来的那个就是手感和这个材 ， 就做工会存疑吧 。

**吴涛** [3:54]
呃 ， 很难说啊 。 我是比较相信现在的 3D 打印机还没能达到我们一个键盘需要的模具的精度 。

**Rio** [4:03]
对 ， 这个是一个挺 ， 挺麻烦的事情 。 而且就如果 3D 打印真的能做到那个精度 ， 我最想打的还是上次我们说那个 Keycup， 就 Keyboard 应该 ——

**吴涛** [4:14]
Keycup， 对 。

**Rio** [4:14]
Keyboard 应该是 ——

**吴涛** [4:15]
Cupboard， 我现在想起来了 ，Cupboard 是 ，是那个 ——

**Rio** [4:18]
厨房板嘛 ， 就是 ——

**吴涛** [4:19]
对 ，不是 ，是 ——

**Rio** [4:20]
歌板 。

**吴涛** [4:20]
叫什么 ， 歌板 ？ 不是 ， 橱柜的意思 ，Cupboard。

**Rio** [4:24]
就歌板嘛 。

**吴涛** [4:24]
Fun Cup The Board。

**Rio** [4:26]
Yeah。OK， 呃 ， 另外一个 follow-up 是 ，有人说这个车 ， 就是我们第一期的时候讲到哈 ， 那个说这个德国的很多车 ， 还有加拿大的很多车的油箱盖是没法锁的 ， 然后他说是有一张盖的锁是由中控所控制的 ， 锁车后应该就打不开了 。

对 ， 这个就是 ， 这个它应该是这样的 ， 可是它就不是这样的 。

**吴涛** [4:51]
你确定吗 ？

**Rio** [4:51]
对啊 ， 我确定啊 。

**吴涛** [4:52]
我不 ——

**Rio** [4:53]
就是当你用遥控 ， 就是你下了车 ， 然后用遥控钥匙吧 ， 车锁了之后， 你仍旧可以打开油箱盖 。

**吴涛** [4:58]
对的 。

**Rio** [4:59]
Holy shit。

**吴涛** [5:00]
那如不然的话 ， 如果中控车锁住之后， 这个事情就不存在这个问题了 ， 对吧 ？ 这个就是 secure design，但是为什么要吐槽它 ， 就是因为它不是这样的 。

**Rio** [5:10]
OK。

**吴涛** [5:10]
所以 ——

**Rio** [5:11]
这个真的是一个挺严重的问题 。

**吴涛** [5:13]
不 ， 我 ， 我 ，而且我觉得好像日系车都没什么这个问题 ， 就是那个 Jeep 这个系列 ， 我发现全部都这样 ，不知道为什么 。

**Rio** [5:21]
美国人比较信任别人吧 ， 可能是当初美国人， 即便现在美国的油价也是非常非常便宜的 。

**吴涛** [5:27]
不 ， 这个 ， 偷油都不 ， 都算了 ， 万一有那什么三长两短 。 不 ， 你看那个什么电影里面最常见的一个什么镜头 ， 什么男 ， 那个什么男主角 ， 或者是一个坏人， 就是坏 ， 怎么 ， 怎么 ， 坏 1 号 ， 跑到路街边去要制造一起什么 distraction 的时候 ， 就把那个油箱盖拧开 ， 然后丢个什么烟头进去 ， 然后自己很 ， 很潇洒地走 ， 然后过了十几秒 ， 啪 ， 就爆炸

了 。

**Rio** [5:51]
嗯 ，《Breaking Bad》 里面那个老白就把他的车这样烧了 。

**吴涛** [5:55]
对啊 ， 就你就觉得这个事情 ， 这是多么一个 ， 多么明显的一个 security fault。

**Rio** [6:02]
嗯 ， 的确 。 应该去酷儿啊之类的地方问一问 ， 到底是为什么 ， 为什么这么说 。

**吴涛** [6:07]
对 ，他们怎么想 。

**Rio** [6:07]
就好像 ，其实 ，其实还有一个问题就是 ， 呃 ， 包括很多非常现代的车 ， 比如大众的车 ， 它的车灯在你离开驾驶舱拔了钥匙之后， 如果你不把 ， 如果你不在驾驶舱里面把车灯关掉 ， 车灯会一直亮着 ， 直到电池耗尽为止 。

**吴涛** [6:26]
不会吧 ？

**Rio** [6:26]
这为什么呢 ？

**吴涛** [6:27]
这个我先 ——

**Rio** [6:27]
是的 。

**吴涛** [6:28]
现在车还这样吗 ？

**Rio** [6:29]
有些很 ，有很多车都是这样的 。 我们在冰岛就看到一辆这样的车 ， 直到它电池 ， 就是看到那个灯一点点熄灭 ， 都没有人知道那辆车是谁的 。

**吴涛** [6:37]
哎 ， 我还以为就至少是可能最近几年， 就是自 ， 这个做的车它有那个功能 ， 就是延时关灯 。

**Rio** [6:46]
对 ，有些车在你下车之后拔钥匙的时候 ， 如果你忘了关车灯 ， 它会滴滴滴报警 ，但是如果你不理它的话 ， 它就会让灯一直开着 。

**吴涛** [6:57]
嗯 。

**Rio** [6:57]
我怀疑这是有什么用意的 。

**吴涛** [6:59]
对 ， 就这个我知道 ， 我 ， 你看我自己现在那个车就是 ， 它会 ， 就 ， 就你拔了钥匙 ， 人下车锁上车门之后， 灯会亮一会儿 ， 然后它的那个用意是说 ， 你知道很多这个 ， 呃 ， 就车是停车库里面嘛 ， 对吧 ？

然后如果晚上的话 ， 比较黑的情况下， 它可以就是照着你回去离开那个地方 ， 然后它再把那个灯熄掉 。

**Rio** [7:21]
对 ， 我的车有这个功能 ，但是只需要在钥匙上按一个键 ， 这个灯就会亮 ， 然后亮大概 40 秒 ，50 秒它就会自动熄灭 。

**吴涛** [7:29]
对对对 ，不到 ——

**Rio** [7:30]
它不会一直亮着 。

**吴涛** [7:32]
还是有个选项可以把这个东西关掉还是怎么样 ， 我忘了 。

**Rio** [7:36]
不可能 。

**吴涛** [7:36]
就是 3 号 ， 这绝对是一个很傻逼的设计之一 。 而且 ， 或者 ， 或者这么讲吧 ， 就算是你有这个需要把那个车灯一直亮着 ， 比如说你在这个 ， 这个野外， 你要做什么事情 ， 对吧 ？

当把那个车灯当作一个照明来用 ，也可以 ，但是起码你这个车要做一个什么 ， 呃 ，2 备用电源 ， 保证能够下一次能点着 ， 对吧 ？

**Rio** [7:57]
对 ， 你至少应该在电量即将消耗到只 ， 只够一次或者两次打火的时候 ， 把这个车灯切断吧 。

**吴涛** [8:04]
对啊 ， 结果 3 号它就还不管 ， 接着用 ， 用到烧光为止 ， 然后就这样 。

**Rio** [8:10]
我 ， 我甚至有可能这个自动关灯的选 ， 功能是一个选项 ， 你去加钱 ， 没有钱就没有 。 也不是没有可能 ，因为很多德国厂商非常黑心 ， 就 ——

**吴涛** [8:19]
非常黑心 。

**Rio** [8:20]
一定要加 。 对 ， 我讲个笑话好了 ， 反正已经说到这么远了 。 就 ， 呃 ， 我之前工作的公司有一个德国人 ，是我们的门房大爷 。

**吴涛** [8:28]
嗯哼 。

**Rio** [8:29]
就是 ， 呃 ， 德国美 ， 德国几乎每栋建筑都有一个人专门负责维护这栋建筑的 ——

**吴涛** [8:33]
Janitor。

**Rio** [8:34]
这种设施 。 对 ，Janitor。Janitor 先生有一天跟我说 ，他觉得德国的汽车厂商都是 Uptalk， 骗子 ， 说要价太高了 。

**吴涛** [8:44]
嗯哼 。

**Rio** [8:45]
然后他说 ：" 我觉得日本车挺好 。" 我说 ：" 哎 ， 您觉得日本哪辆日本车 ， 哪个日本车的牌子好呢 ？" 他想了想说 ：" 嗯 ， 现代 。"

**吴涛** [8:52]
哈哈哈哈

。 不过差不多 ， 反正 ——

**Rio** [8:58]
True story。

**吴涛** [9:00]
日本韩国啥啥分不清楚 ，也 ，也还不错 。 不过他这个事情我觉得反映了一个现实哈 ， 就是这个 ， 就是日系 ， 还有特别像那韩系厂商在就是人性化这一方面 ， 当然人性化就体现在就车内的一些电子装备啊 ， 一些怎么让你省心和舒坦的这么一些小配件上， 还做得挺好的 。

本来其实这些东西也花不了多少钱 ， 对吧 ？ 比如说他给你搞个什么 ， 我想最前几年还比较火的那个蓝牙 ， 你知道 ， 很多蓝牙是 ， 就现在的车可能都没有这个问题 ， 前几年的车 ， 蓝牙它是分两种的 ， 一种是就只能连手机打电话 ， 然后另外一种是可以连这个立体声音乐嘛 。

然后就有很多很多这种 ——

**Rio** [9:42]
协议级 ， 协议级别啊 ， 好像 。

**吴涛** [9:44]
对 ，是 ，是不同的协议 。 蓝牙那个叫什么 ， 呃 ， 就是 ——

**Rio** [9:47]
协议级别 。

**吴涛** [9:47]
对 ， 它会传输的要求会高一点 ，但是这个东西成本也就是几美元的事情 ， 对吧 ？ 然后但是你会发现很多这种就是日系 ， 日韩系的厂商他会把直接把这两个功能都给做进去 ， 就是 for free， 你就有了 。

然后你看很多这种 ， 特别是德系啊 ，他就会啊 ， 标配是没有这个蓝牙功能的 ， 然后每 ——

**Rio** [10:07]
稍微有点什么 ， 你 ——

**吴涛** [10:08]
哎 ， 再加 ， 再加 1000 美元 ， 给你一个通话的功能 ， 再加 1000 美元 ， 给你一个这个就是播放多媒体 ， 蓝牙播放多媒体的功能 。

你会觉得 ， 唉 ， 就是什么 ， 就是 ， 你会觉得这个就是完全你作为一个他的一个用户哈 ， 当然很多人说买得起那个什么 ， 什么奔驰宝马的人根本不 care 这种事情 ， 对吧 ？

但是 ， 你 know。

**Rio** [10:33]
对 。

**吴涛** [10:34]
所以 ， 所以也无怪乎像北美你可以看到 ， 德国这个例子就不说 ， 德国是个特殊的国家 ，但你看北美的话 ， 街上跑的大部分还是日系车嘛 ， 这个还是有一定的道理的 。

**Rio** [10:45]
对 ， 德国人， 唉 ， 太爱国货了 ， 只能这么理解 。

**吴涛** [10:52]
对 。

**Rio** [10:53]
呃 ， 对 。 好 ， 两个 follow-up 之后， 我们进转入今天的正题吧 。

**吴涛** [10:58]
所以今天我们要讲的一个题目叫做 Static site generators。

### 静态生成器

**Rio** [11:04]
对 ， 静态网站生成器 。 生 ， 听起来就比上次的键盘要 ， 要 ， 要 hardcore 一点 。 为了弥补我们上次不够 hardcore 的 ，不过上期节目的反响好像挺好 ， 至少我女朋友听了很开心 ， 她说她要换新键盘了 。

**吴涛** [11:20]
哈哈哈 ， 惨了你 。

**Rio** [11:22]
呃 ， 对 。

**吴涛** [11:23]
所以什么是静态网站生成器 ？ 这其实不 ，并不是所有人都知道这个概念哈 。

**Rio** [11:30]
对 ， 呃 ， 虽然我又忍不住想要说 ，不知道这个概念就不会设定 。

**吴涛** [11:35]
我 ， 我发现我们每期都 ， 都因 ，因为种种原因流失了一部分观众 ， 呃 ， 听众 。

**Rio** [11:43]
呃 ， 对 ， 还是解释一下吧 。其实静态网站生成器的理念非常简单 ， 就是 ， 呃 ， 生成一些静态的网页 。

**吴涛** [11:56]
呃 ，不对不对 ，其实反了 ， 反了 。 我应该是先过来 ， 就最开始我们做这个个人主页的时候 ， 大家都应该还记得挺清楚 ， 就是用什么 ， 呃 ，Dreamweaver 还是手工写一个这个 HTML 的代码 ， 然后放 ， 命名成这个 index.html 或者是 index.htm， 哎 ，html 这个文件 ， 然后放在这个网页这个服务器的某一个 ， 就是你的 user 那个目录里面 。

然后那个时候大家很多人还没有这个私有服务器这个概念嘛 ， 很多人放到是一个 ， 就是共享的服务器 ，有一个 tilde， 你知道你的用户名这么一个目录下面 ， 对吧 ？

**Rio** [12:33]
对 ， 波浪线 ， 然后用户名 ， 然后 slash。

**吴涛** [12:36]
对 ， 然后你去访问这个 ， 这个网址的时候 ， 比如说我记得我大学的时候 ， 比如说这个学校的名字是 sysu.edu.cn， 然后有个斜杠 tilde， 我的这个选择的用户名 ， 就这个访问那个地址就可以打开我的这个叫什么 ， 个人主页了 。

啊 ， 这个 ， 这个 ， 这个 。

**Rio** [12:53]
即便现在 ， 即便现在还是有非常非常多的计算机大牛 ， 尤其是那些在教授里面拿这个 ，在 ，在学校里面拿教授 ， 呃 ， 讲 ， 叫 tenure。

**吴涛** [13:03]
嗯 ， 终身教授 。

**Rio** [13:05]
终身奖 ， 终身教职奖 。

**吴涛** [13:07]
对 。

**Rio** [13:07]
终身教职奖金 ， 终身教职薪 。

**吴涛** [13:10]
不 ， 就是终身 。

**Rio** [13:11]
这段抹去吧 ， 我求你 ， 这段抹去 。

**吴涛** [13:14]
Tenure position。

**Rio** [13:15]
啊 ， 对 ，tenure position。

**吴涛** [13:17]
对 。

**Rio** [13:17]
OK， 重录 。 嗯 ， 就是即便现在很多大学的教授也在 ，他们拿到他们的这个终身薪水的同时， 一直使用着大学的一个账号来做他们的个人主页 。

比如我没记错的话 ，Knut 高德纳应该就是一直是这样的 。

**吴涛** [13:38]
嗯哼 ， 很多人都是吧 ， 就在学术圈子很少 ， 很少 ， 就他会 ， 这样会显得比较 ， 我不知道 ， 可能很 ， 成为一种约定俗成 。

**Rio** [13:46]
比较 ， 比较 time honored 应该说 。

**吴涛** [13:48]
对 。

**Rio** [13:48]
你打开他的 ， 你打开别人的那些 ， 呃 ， 新潮弄潮儿的网页 ， 一个一个美丽 ， 那个神秘啊 ， 然后打开他们的网页 ， 哇 ， 可以一股七神爱的互联网风 ， 风格扑面而来 。

**吴涛** [13:59]
对 。

**Rio** [14:00]
对 。

**吴涛** [14:01]
啊 。

**Rio** [14:01]
这是其实只是正儿八经第一代的 static site。

**吴涛** [14:04]
对 。

**Rio** [14:05]
但是他们不一定是用 generator generate 出来的 。

**吴涛** [14:08]
但可能是手 ，他 ，他其实也有啊 ，其实他是有用那个什么 ， 就是你说 Dreamweaver 算不算一个 generator？ 算 ，其实 。

**Rio** [14:16]
我觉得不算 。Dreamweaver 只能算一个 。

**吴涛** [14:18]
Editor 吧 。

**Rio** [14:19]
Author，author software。

**吴涛** [14:21]
好吧 。 然后他会把这个网页放到那个服务器上， 就可以访问了 。 然后这个 ， 这个你 ， 你就访问那个网址 ， 千年不变 ， 都是那个网页长那个样 ， 就叫静态嘛 ， 它不会变 。

**Rio** [14:31]
对 。

**吴涛** [14:31]
然后这个就是一个所谓的 static site。 然后后来的趋势是变成了那个叫什么 ， 动态网站嘛 ， 这个是大概是在 00 年左右吧 ， 就是 00 年到 10 年这段时间 。

**Rio** [14:45]
随着改革开放的资产深化 ，以及这个互联网技术日新月异 ， 人们发现很多内容其实是可以当有人来问的时候 ， 我才生成出来送给他看的 。

**吴涛** [14:58]
对 。

**Rio** [14:58]
其实这就是动态网站的根本意义 ， 就是 ， 呃 ， 动态网站上面一般也许会有一个数据库 ， 然后有一堆程序 ， 然后有一堆预先写好的模板 ， 然后当一个来访 ， 访客来访问你的网站的时候 ， 这些程序从数据库里面取出数据 ， 然后把这些数据填进模板里面 ， 然后动态生成一个网页 。

**吴涛** [15:19]
对 。

**Rio** [15:19]
来给访客看 ， 这就是动态网站 。

**吴涛** [15:22]
对 ， 这就有些 ， 就可能解释了什么是动态和静态哈 。 但是最近这两三年哈 ，以某 ， 那个什么叫 Jekyll 为代表的这个静态网站生成器又崛起了 。

然后这个时候 ， 来 ， 吴涛你也解释 ， 你 ， 你觉得什么才叫一个生成器 ？

**Rio** [15:40]
呃 ， 所谓生成器其实就是能够按照你预先定义的一组规则 ， 然后自动为你写好的一些 ， 通常是纯文 ， 某种纯文本格式的内容 。

**吴涛** [15:55]
嗯哼 。

**Rio** [15:56]
呃 ， 生成一大堆静态网页 ， 然后就像最古老的那种静态网站一样 ， 供你可以 ， 让你可以不需要任何动态的程序 ， 然后放在网上的某一个地方供人浏览的工具 ， 就叫做动态网站生成器 。

**吴涛** [16:12]
OK， 所以这就从你个人的角度来讲 ， 你觉得如果让你 ， 比如你现在博客这样点是用什么写的 ？WordPress 还是 ？

**Rio** [16:23]
Jekyll。

**吴涛** [16:23]
Jekyll，OK。 所以 ，但是我记得你之前是用那个 WordPress 写的 ， 对吧 ？ 就搬家之前 。

**Rio** [16:29]
我之前是用一个自己写的 CMS。

**吴涛** [16:32]
但是 。

**Rio** [16:33]
甚至不算 CMS， 是一个自己写的 blog 系统 ，是用 Lua 写的 。

**吴涛** [16:37]
是动态的吗 ？ 还是静态的 ？

**Rio** [16:38]
是半动态的 ，因为它没有数据库 ， 就是 。

**吴涛** [16:41]
从文件里面拿吗 ， 对吧 ？

**Rio** [16:43]
就是我有一堆 ， 我有一堆纯文本文件 ， 然后你访问的时候 ， 它把这一堆纯文本文件和 template 结合在一起 。

**吴涛** [16:50]
OK， 所 ， 所以这里有个很关键的问题 ， 我觉得可能一定要解释清楚 ，也是很多人在纠结 ， 就是我相信听众里面如果你是程序员的话 ， 或多或少会 ， 会有这种纠结的事情 。

就是当初你是怎么决定要从一个动态或者是半动态的系统变成一个完全静态的那个博客来做呢 ？

**Rio** [17:13]
其实我觉得在我身上很简单 ， 就是跟风吧 。

**吴涛** [17:16]
哈哈哈 。OK。

**Rio** [17:18]
或者是 ，其实有两方面的原因 ， 一方面是跟风 。

**吴涛** [17:22]
嗯哼 。

**Rio** [17:23]
呃 ，因为这个 Jekyll 这个东西是由 Tom Preston Venner 写的 ， 就是 ， 呃 ，GitHub 的 。

**吴涛** [17:29]
创始人之一 。

**Rio** [17:30]
前创始人以及前总裁 。

**吴涛** [17:32]
对 。

**Rio** [17:33]
嗯 ，因为他写了 ， 所以就引起了很多人的注意 ， 然后在程序员圈子里面就渐渐流畅开来 ， 然后几乎有一段时间是蔚然成风啊 ， 就好多好多人都换了 。

**吴涛** [17:44]
嗯哼 。

**Rio** [17:45]
然后一方面是因为这个 ， 另一方面是当时我想要把那个 Lua 的站点程序捡起来写的时候 ， 发现 Lua 已经改得有点乱 ， 当时我依赖的那个包 ，因为它 0.0.2 还是那个版本 ， 然后在我 ， 当我捡起来的时候已经变成 0.8 了 ， 然后就中间已经变得面目全非 ， 我所有几乎用到的函数全都变了 。

**吴涛** [18:12]
OK。

**Rio** [18:13]
然后再捡起来写 ， 我觉得有点力不从心 ， 就想说哎呀 ， 干脆转吧 ， 反正我的所有文章都已经是纯文本 ， 就相当于一个半静态的这么一个状态在了 。

**吴涛** [18:25]
所以 ， 所以插一个 ， 这里的教训是一定要做好版本管理 ， 对吧 ？

**Rio** [18:31]
这个版本管理没关系 。

**吴涛** [18:32]
不不 ， 依赖管理 ，dependency management。

**Rio** [18:36]
这个是教训是 Lua 要做好它的这个 。

**吴涛** [18:39]
你自己也没有做好啊 。

**Rio** [18:41]
包系统 。

**吴涛** [18:41]
你做好这个就没有这事了吗 ？

**Rio** [18:43]
我的最大的失误就在于我没有及时跟进每个依赖的库的开发进度 ，因为我并不是什么 Lua 痴迷者 ， 我是 ， 我是 Polyglot， 我要保持 Polyglot 的尊严 ， 我不能一直去死追 ， 死追蒙娜一个 ， 一个语言不放吧 。

**吴涛** [19:00]
嗯 。

**Rio** [19:00]
对 。

**吴涛** [19:01]
OK。

**Rio** [19:02]
就是怎么说呢 ， 就是如果一定要说有什么教训的话 ， 就是不要用太不成熟的技术 ， 尤其是在你想要做一个比较大的东西的时候 。

**吴涛** [19:11]
嗯哼 。

**Rio** [19:11]
但是我也不是说我的 blog 系统有多大 ， 就是你想做一个比较 ， 呃 。

**吴涛** [19:16]
长时间经营的东西 。

**Rio** [19:17]
对 ， 所谓 build to last 的东西的时候 ， 你不要用太新的技术 。

**吴涛** [19:22]
不然 。

**Rio** [19:22]
尤其不要用版本号还是 0.9。

**吴涛** [19:24]
不然下场 。

**Rio** [19:25]
这就是为什么 ， 这就是为什么 Java 可以活到现在的原因 ， 就是很多很多很多很多希望能够长时间运行的网站会选择 Java，因为 Java 它已经死了 ， 死的东西是不会变的 。

**吴涛** [19:38]
哈哈哈 。 人家不是马上要出 1.7 还是 1.8 了吗 ？

**Rio** [19:43]
1.8，1.8。

**吴涛** [19:43]
啊 。

**Rio** [19:44]
不是 ，不已经不是 1.8 了 ， 就现在改 ， 从 Java。

**吴涛** [19:46]
7。

**Rio** [19:47]
你太过时了 ，1.5 开始就直接叫 Java 5， 然后 6，7，8， 现在是 8。

**吴涛** [19:51]
它不打算开始到二点几了 ， 对吧 ？

**Rio** [19:54]
嗯哼哼 ， 对 。

**吴涛** [19:55]
OK。

**Rio** [19:56]
Java 8 里面有 generics， 呃 ，不不 ，sorry，Java 8 里面有那个匿名函数 lambda。

**吴涛** [20:02]
Too late。

**Rio** [20:03]
Yeah，too late，way too late。

**吴涛** [20:05]
OK。 呃 ， 所以在迁移过程中你觉得整个体验怎么样 ？

**Rio** [20:13]
一开始挺好的 ， 就是刚刚转到 Jekyll 的时候挺好 ，但是后来 Jekyll 生了几次集 ， 我记得有一次是

从 1.8， 从 1， 还是从 1.7 级 ， 从依赖从 Ruby 1.7 级升到 1.8 级的时候 。

**吴涛** [20:30]
嗯哼 。

**Rio** [20:30]
呃 ，不停地弹出一个 encoding 的错误 。 我记得那个错误好像不止我一个人， 很多很多人都受到影响 。

**吴涛** [20:38]
嗯 。

**Rio** [20:38]
呃 ，但是持续的时间很短 ，但那是第一次不爽 ， 然后但是随之之后就有很多很多次不爽 。

**吴涛** [20:46]
但那你现在还坚持在用的 Jekyll 在上面跑吗 ？

**Rio** [20:49]
我主要是不怎么写了 ， 我上一次写好像 Jekyll 还给了我一些脸 ， 面子还是跑起来了 ， 所以暂时还没有换 。

**吴涛** [20:57]
哎 ， 等一下， 你现在这个 ， 这个 setup 是怎么样子的 ？ 是在本机跑 ， 同步过去 ， 还是在服务器上架了这个 ？

**Rio** [21:04]
呃 ， 我是同那个把 repository 共享在 GitHub 上， 然后从那个远程一个 pull， 然后在远程 build 吧 ， 应该是 。

**吴涛** [21:16]
不 ， 这个 build 是你自己服务器上 build 的 ， 还是那个 GitHub 的 ？

**Rio** [21:19]
应该是在服务器上 build， 应该是在服务器上 build 的 。

**吴涛** [21:22]
什么叫应该是 ？ 已经不记得了 。

**Rio** [21:24]
因为我不记得 ， 对 ， 我已经很久没有写 blog 了 ， 我现在 ， 我之前 blog 总觉得再怎么也要一个月一篇吧 ， 或者是上次写是不是一年一篇 。

**吴涛** [21:34]
不会 。

**Rio** [21:34]
上上上一篇和上上篇的间隔是一年 。

**吴涛** [21:37]
不过你比我好 ， 我的博客就 ， 就写过几篇 ， 然后再也没碰过了 。

**Rio** [21:43]
嗯 。

**吴涛** [21:44]
OK。

**Rio** [21:45]
哎 ， 对 ， 博 ， 博客程序 ， 对 ， 从 ， 呃 ， 最开始我是用什么 ， 嗯 ，blogger.cn 还是 ？

**吴涛** [21:58]
Blogger 啊 ， 就 blogspot， 对吧 ？

**Rio** [22:01]
不是不是 ，不是 blogspot， 那个时候还没有 blogspot。

**吴涛** [22:04]
啊 。

**Rio** [22:04]
2003 年的时候应该是 。

**吴涛** [22:05]
国内还是国外 ？

**Rio** [22:07]
国内啊 ， 第一 ， 刚开始当然是在国外， 国内啊 ， 那个时候 ， 嗯 。

**吴涛** [22:10]
博客大巴 ？

**Rio** [22:11]
用 ，不是博客大巴 ， 博客大巴出来的要晚多了 。

**吴涛** [22:15]
OK。

**Rio** [22:16]
我在榕树下写过东西 。

**吴涛** [22:19]
哈哈哈 。

**Rio** [22:20]
对 ， 然后， 呃 ， 我 。

**吴涛** [22:23]
文艺青年啊 ， 这是 。

**Rio** [22:24]
太文艺了 ， 那个时候是在 。

**吴涛** [22:26]
对 。

**Rio** [22:26]
后来转到一个 ， 呃 ， 后来自己出了国之后转到一个自己搭建的 ， 呃

，不对不对 ， 出国之前先有一阵子转到了 Doodle News， 你知道 Doodle News 吗 ？

**吴涛** [22:41]
这个什么东西 ， 什么什么 ？

**Rio** [22:43]
Doodle News，D-O-N-E-L-U-S。

**吴涛** [22:45]
就以前那个 cursor 那个 。

**Rio** [22:47]
对对对 ，cursor 在上面写的 。

**吴涛** [22:49]
Cursor 在上面写的 。

**Rio** [22:49]
然后那个 ， 那个 blog 程序是一个 .NET 写的 。

**吴涛** [22:53]
嗯哼 。

**Rio** [22:54]
而且当时我很喜欢它 。 后来从那儿转到了一个自己搭建的 WordPress 上， 然后第一次有了自己的域名 ， 叫做 by them by mfinster, by them mfinster, 就是在窗子旁边 ， 当时是我和一个曾经很好的朋友一起写 。

**吴涛** [23:09]
嗯哼 。

**Rio** [23:10]
对 ， 然后后来 ， 呃 ， 我们俩分 ， 劳艳分飞之后， 分别单飞之后， 呃 ， 我搬到了另外一个就是现在的域名上，metafox， 一开始是 metafox.name，因为 .name 是所 ， 呃 ，supposed to be。

**吴涛** [23:25]
Personal。

**Rio** [23:26]
私人的 ， 对 ，personal website，但我发现没有人鸟它 ， 基本上稍微有一点 ， 呃 ， 稍微有点钱的人都会去买 .com。

**吴涛** [23:35]
.com 便宜啊 ，.com 十块钱一年 。

**Rio** [23:38]
对 ， 我现在就是 metafox.com。

**吴涛** [23:40]
你竟然注册到了 ， 你当初干嘛去了 ？

**Rio** [23:43]
不 ， 我在我注册到 metafox.name 的三五年时间之内 ，.com 其实一直都在 ，但是我就是没有注册 。

**吴涛** [23:53]
Epic。

**Rio** [23:53]
它一直在等我 ， 我 ， 对 ， 我只能这么理解 ， 它一直在等我 。 然后我前两天上知乎发现自己 2001 年的时候写的答案留在当时的网址 ，metafox.name 还被人翻出来说 ， 呃 ， 呃 ， 链接差评断了 。

**吴涛** [24:09]
你没有续费了吗 ？

**Rio** [24:12]
那个 .name 域名没有再续费了 ， 就没有意义啊 ， 说实话 。

**吴涛** [24:15]
没有 。

**Rio** [24:15]
没有人会记得 。

**吴涛** [24:16]
这样不好啊 。

**Rio** [24:18]
不 ， 我记 ， 我觉得有一句谚语说什么你把东西传上网 ， 它就会永远不会消失 ， 这句话是错的 ， 我觉得太多太多东西 ， 这已经永远找不到了 。

**吴涛** [24:26]
对啊 ，不过还好有个那个什么 ，the internet archive。

**Rio** [24:30]
Time machine。

**吴涛** [24:31]
Yeah。

**Rio** [24:32]
可以帮你救回来 。

**吴涛** [24:33]
Internet time，the so-called internet time machine。

**Rio** [24:36]
对 ， 那可以帮你救回来 。

**吴涛** [24:38]
嗯 。 哎 ， 等等 ， 撤哪里去 ，有点远了 。

**Rio** [24:40]
对 ， 回到 Jekyll。

**吴涛** [24:42]
静态 ， 静态网站生成器 。

**Rio** [24:44]
我在推特上 follow 一个人 ，他的名字叫做 horse_mans， 就是 horse 马 ， 然后 mans，不是 man，而是 mans， 就是 m-a-n-s， 我不知道这是复数还是故意恶搞 。

**吴涛** [24:56]
嗯 。

**Rio** [24:57]
总之他是一个非常有趣的人 ，他的很多的 ，他的很多推都非常恶搞 ， 你得看一阵子才明白他在讲什么 ，但是看懂了之后就哈哈大笑 。

呃 ， 这个 horse_mans 他在大概两周之前 ，也就是你们听到这一期 podcast 的两周之前 ，他发过这么一条推说 "It takes one Git repository, two submodules, one virtual environment, five direct Python dependencies, one node virtual"—no, this is NVM 是什么 ？

**吴涛** [25:30]
呃 ，node virtual machine， 好像就切换 node 的版本啊 ， 好像是 。

**Rio** [25:35]
对 ，anyway， "one NVM environment and one node package to build my blog, and oh, oh, and five and four Emacs packages."

**吴涛** [25:46]
悲惨的 Emacs。

**Rio** [25:47]
对 ， 我相信 。

**吴涛** [25:48]
他说的是 Jekyll 吗 ？

**Rio** [25:49]
我觉得他应该说的是 Jekyll， 就是他 ，他 ， 然后我就看了一眼他的 blog，他的 blog 是很短 ， 然后最新一篇帖子好像是在讲这个 Emacs 的某个 package，他可以在直接在 Emacs 里面写 blog， 然后一键就可以把 blog 部署啊什么的 。

**吴涛** [26:10]
这 ， 这似乎是所有程序员的通病啊 ， 花了 72 个小时连续不断地去琢磨出了最佳的写博客 ， 然后完成这个 publish 的整个这个 workflow， 然后从此再也不写了 。

**Rio** [26:26]
对 ， 然后写一个 "Hello world, I will write, I will stop write my blog."

**吴涛** [26:31]
And that's it.

**Rio** [26:33]
Yeah, and that's it.

**吴涛** [26:35]
对 ， 所以你也是这样吗 ？ 你转换成 Jekyll。

**Rio** [26:38]
我不是这样的 ， 我不是这样的 。

**吴涛** [26:39]
还写了几篇是吧 ？

**Rio** [26:41]
我的 blog 还是有 ， 呃 ， 从可能最早的一篇是 2005 年到现在 。

**吴涛** [26:46]
嗯 ，不过它 。

**Rio** [26:47]
积攒了一些 。

**吴涛** [26:48]
哎 ，不过它那个说了也反映了一个问题啊 ， 就是现在的很多这种非常 hippie 的这种软件的依赖真是太多了 。

**Rio** [26:59]
让我想起了曾经的所谓 Windows 下面的 DLL 地狱 ， 就是一个新的软件可能要依赖其他几个 DLL， 这些 DLL 又要依赖更多的 DLL， 然后所有 DLL 的版本都有区别 。

**吴涛** [27:15]
嗯哼 。

**Rio** [27:16]
对 ， 然后就会又产生类似的状况 。

**吴涛** [27:20]
对 ，其实这个 Ruby 我自己并不会哈 ， 然后我不知道它的那个包管理系统怎么样 ，但是我看听着 。

**Rio** [27:27]
你太谦虚了 ， 你所谓的不会就是没有用它写过大型程序的意思吗 ？

**吴涛** [27:31]
我还真没有用它写过任何东西 ，其实 。

**Rio** [27:34]
对 ， 这就是所谓不会是吧 ，但是你 ， 你 ， 你读起 Ruby 来感觉比我快 ， 我敢相信 。

**吴涛** [27:40]
它那个语法很 ， 很接近嘛 ，也没什么特别难懂的地方啊 。

**Rio** [27:44]
嗯 。

**吴涛** [27:45]
啊 ，不 。

**Rio** [27:45]
所以还是懂 。

**吴涛** [27:47]
这个什么 ， 出了一旁通嘛 ， 我觉得稍微编过一段时间程都能达到这个效果 。Anyway， 扯远了 ， 我想问的一点就是 Ruby 的包管理系统我感觉还可以啊 ，但那个 Gem，Gem 系统 。

**Rio** [28:00]
嗯 ，其实是算是所有的包管理系统里面就是最好的几个之一了吧 。

**吴涛** [28:08]
嗯 ， 对 ， 我觉得就 ， 我觉得目前看就都 ， 就是在那个 scripting languages 里面哈 ， 呃 ，Gem 不错 ， 然后那个就是 npm，node 那个我觉得还挺好的 。

**Rio** [28:18]
对 。

**吴涛** [28:19]
然后 b 人最开始之前最喜欢的脚本语言 Python 的包管理系统就是 ， 呃 。

**Rio** [28:26]
嗯 ，Teasoflow。

**吴涛** [28:28]
不是 。

**Rio** [28:29]
算了 ，不伤感 。

**吴涛** [28:31]
这个不刺激大家了 ， 接着说这个事情 。 呃 ， 就为什么会需要这么多东西 ？

**Rio** [28:39]
我觉得它的设计哲学就是 "Battery not included"。

**吴涛** [28:44]
"Battery not included" 自备电池要 。

**Rio** [28:48]
对 ， 你得自备电池 ， 或者说它试图把中心的核心的功能做得尽量的 ， 嗯 ， 简短 。

**吴涛** [28:58]
嗯 。

**Rio** [28:58]
导致它有非常多的外部依赖 。

**吴涛** [29:02]
但是这样对使用和配置的话 ，其实还是蛮大影响的 ， 我觉得 。

**Rio** [29:08]
对 ， 就是我觉得现在的 DevOps 越来越流行 ， 当然 DevOps 我们可能也会专门找人来讲 ， 就是就一方面的原因也是现在的软件部署的确是越来越多的牵扯到了开发人员的 know-how， 或者说你要想要开发一个东西 ， 你必须先要弄明白这个东西会怎样部署 。

**吴涛** [29:34]
嗯哼 。

**Rio** [29:35]
也就侧 ，也就从一个侧面推进了 DevOps 这个交叉行业的 ， 呃 ， 涌现吧 。

**吴涛** [29:43]
就本来 ， 我觉得本来就是应该是立体的 ， 为什么要很 ，以前很残忍的要分成 dev 和 ops 这两个工种呢 ， 就是很奇怪的一件事情 。

**Rio** [29:52]
我觉得是出于证交 ， 就是职能证交的考量 ，因为你不能期待一个程序员每天写完程序还要去 ， 呃 ， 夜里面 on call 随便随时静待着 ， 服务器要是出了问题还要爬起来去解 ， 解服务器的问题 。

**吴涛** [30:07]
嗯 。

**Rio** [30:08]
而且人的精力毕竟是有限的 ， 我觉得就是 DevOps 的在 ， 的 ， 的工作在 ，在你我看来好像没有那么复杂 ，但其实很多人， 呃 ， 对于开发没有什么经验 ，但是对于配置服务器很在行 ，而反过来也有 ，也也一样有很多很多人。

**吴涛** [30:27]
就我 ， 好吧 ， 这个事情留到 ， 留到下次专门讲这个事情再吐槽了哈 。 呃 。

**Rio** [30:32]
这 ， 嗯 。

**吴涛** [30:34]
但是就 ， 就但是这么多包的话 ， 你如果装在服务器上要遇到升级的话 ， 你怎么办 ？ 比如上次你自己就遇到这个问题 ， 呃 。

**Rio** [30:43]
嗯 。

**吴涛** [30:44]
自己写的都会有这种问题 ， 然后你如果依赖别人的 。

**Rio** [30:47]
我觉得如果一个比较大的 Ruby 网站真的要面临依赖包升级的话 ， 可能是一个比较浩大的工程 。 我的网站无所谓 ， 反正没有什么人看 ， 就直接把 Nginx 停了就好了 ， 甚至 Nginx 不用停 ， 看着看见 ， 看见屎就看见屎呗 。

但 ，但是对于一个相对大的工程来说 ， 这可能是个比较大的问题 。

**吴涛** [31:10]
OK。

**Rio** [31:11]
嗯 。

**吴涛** [31:11]
呃 ， 这说到这个静态网站生成器哈 ， 就是我 ， 就其实我之前也在尝试嘛 ， 然后试了这个 Jekyll， 呃 ， 大家可能不知道我还在维护那个 appleforce.com 那个网站 ， 然后 。

**Rio** [31:26]
有人不知道吗 ？

**吴涛** [31:28]
我不确定啊 ， 所以先声明一下哈 。

**Rio** [31:30]
OK， 我们 ， 我们的 Rio 同学是 appleforce.com 的 。

**吴涛** [31:36]
Op。

**Rio** [31:36]
首席技术官 。

**吴涛** [31:37]
Op。

**Rio** [31:38]
然后我觉得上次 ， 上次 Lawrence 说什么 ， 我 ，Lawrence 在 IP 帝国里面说我是 ， 呃 。

**吴涛** [31:45]
Time is, time is beautiful 的 CTO， 我听了差点把水喷出来 。

**Rio** [31:51]
我不知道 。

**吴涛** [31:52]
哎 ， 算吧 。

**Rio** [31:53]
不算 ，因为即便算也不能算 ，因为 ， 呃 。

**吴涛** [31:57]
什么叫即便算也不能算 ， 到底是算还是不算 ？

**Rio** [32:00]
即便算 ， 即便真的是 CTO 也不能拿 CTO 这个头衔 ，因为 ， 呃 ，Time is beautiful 更像一个协作社群 ， 社群是非常 。

**吴涛** [32:09]
Apple for all 的意思啊 。

**Rio** [32:10]
对 ，但社群的存在其实是非常 ，不是说非常 ，但是在形式上是要排斥这种公司式的职务分配和管理的 。

**吴涛** [32:20]
对对对 ， 那是开玩笑的 ，不用太当真 。

**Rio** [32:23]
对 ， 我 ， 我知道 ，但对 ， 我 ， 我这次来回赠一款帽子 。

**吴涛** [32:29]
对 ， 然后那个 ， 那个站点其实最开始的时候是跑在一个叫做 ， 我不知道你还记不记得哈 ，Movebot Type。

**Rio** [32:37]
我当然记得 。

**吴涛** [32:38]
啊 ， 我还记得 。

**Rio** [32:39]
是一个 Perl 写的静态网站生成器 。

**吴涛** [32:43]
对 ， 我还记得 ， 呃 ， 张亮还是谁曾经说过你们的贵网站的这个 theme 创作是咚咚咚的复杂 ， 或者 whatever, 反正是这么一段描述你们忆苦思甜的这么一段文字 ， 我还记得 。

**Rio** [32:57]
对 ， 然后 。

**吴涛** [32:58]
读到那个文字 。

**Rio** [32:59]
那个大概是 10 年还是 11 年的时候吧 ， 然后当时， 那时我刚刚就去 ， 就加入这个 ， 这个 ， 这个地下组织 ， 然后， 然后他们就说 ， 哎 ， 要不我们想想这个 Movebot Type 实在是救不活了 ， 然后 Perl 又是一个没人爱的孩子 ， 对吧 ？

**吴涛** [33:16]
呃 。

**Rio** [33:17]
而且 Perl 的消沉其实也可以专门找一期节目来做 ， 说实话我对 Perl 这个语言还挺有感情的 。

**吴涛** [33:24]
天呐 。

**Rio** [33:25]
但好吧 。

**吴涛** [33:27]
留待 ， 留待下次 ， 这次我们专讲这个 。

**Rio** [33:29]
是不是随着逐渐做节目你发现我声音有点变态了 ， 家伙 ？

**吴涛** [33:33]
没有没有 ， 这个什么萝卜青菜各有所爱 ， 这个没什么 。

**Rio** [33:36]
OK。

**吴涛** [33:37]
啊 ， 然后就把它 ， 这当时也是随大流嘛 ， 跟你现在转 Jekyll 的情况实际上是一样的 ， 当时就是我们要做一个动态程序 ， 然后就改成了那个 WordPress， 然后改成 2 点几吧 ， 好像还是 。

**Rio** [33:51]
嗯 ， 我还记得爬上你们的站点去写一个把所有的帖子导出来的工具 。

**吴涛** [33:59]
那都是什么时候的事了 ？

**Rio** [34:01]
对 ， 很多年前了 ， 考古啊这些现在实在 。 然后就是很多年以后发现 ， 哎 ， 这个 WordPress 经常 ， 它 WordPress 有很多插件的 ， 对吧 ， 经常升级的时候这样说不能用 ， 然后就导致根本就不敢点那个升级 ， 然后也其实说我去在那里维护 ，其实也就是半吊子让它 ， 让那个网站还能用 ，不要挂掉就好了 ，其实也没怎么挂 。

**吴涛** [34:22]
不要挂掉 ，不要被注入 。

**Rio** [34:23]
对 ， 就其实也没怎么注入 ，有没有被注入我都不知道 。

**吴涛** [34:26]
Type is beautiful 曾经被注入过 ， 挺惨的 ， 每一个 ， 几乎每一个 PHP 软件都遭到了那个异端病毒的沾染 。

**Rio** [34:35]
哼 。

**吴涛** [34:35]
然后不得不让 Rex 上 SSH 去 ， 去一点点删掉 。 天呐 ， 你这样 ， 你这样为难 Rex 能好吗 ？

**Rio** [34:43]
我不在电脑前死 。

**吴涛** [34:45]
好吧 。 呃 ， 然后就 ， 就变成一个所谓年久失修的一个网站嘛 ， 然后就也没有办法去改 ， 然后 PHP 也不想去碰了 ，PHP 是一个超丑的东西 ， 要专门吐槽一期这个哈 。

**Rio** [34:59]
对 ，it's a pain in the ass。

**吴涛** [35:00]
对 ， 然后终于 。

**Rio** [35:02]
如果原有 pain in the ass 指数的话 ，PHP 绝对是 。

**吴涛** [35:05]
爆表了 。

**Rio** [35:05]
超过 10 分 。

**吴涛** [35:08]
好 ， 然后终于在上个月吧 ，也不对 ， 应该是前 ， 前 ， 前周还是上周 ， 我忘了 ， 我终于下定决心把它整个导出来做成一个静态博客 ， 静态站点 ， 这样的好处就是我再也不用维护它了 。

你看 ， 所以其实出发点也蛮奇怪的 ， 就是为了不维护 ， 然后现在这工作 。

**Rio** [35:30]
出发点其实很正常 ， 这不就是懒惰推进人类文明的进步吗 ？

**吴涛** [35:33]
对对对 ， 这个有道理哈 。 啊 ， 然后现在 ， 现在如果你现在去访问这个 appleforce.com， 它现在是已经是有一个静态 ， 就 static site generator 生成的网站 ， 它再也不是跑在 WordPress， 通过 PHP 跑的东西了 ， 然后随之来的好处就是我可以把 ， 呃 ，MySQL 也干掉了 ，不用维护 MySQL 了 ， 又少了一个东西可以管它 ， 你看作用 。

**Rio** [35:56]
而且没有安全隐患了 。

**吴涛** [35:58]
呃 ，hopefully。

**Rio** [35:58]
不再有什么安全隐患了 。

**吴涛** [35:59]
就只要 ， 只要 Nginx 不出问题 ， 然后 SSH 不出问题 ， 我这个站点应该没有什么可以出问题的地方 。

**Rio** [36:05]
对 。

**吴涛** [36:06]
啊 ， 然后， 然后顺便改了一下那个模板样子 ， 然后之前那个也已经太有点古老了 。

**Rio** [36:11]
嗯 。

**吴涛** [36:12]
啊 。

**Rio** [36:13]
对 ， 所以你是曾经用过 Jekyll 来生成 appleforce， 还是说 。

**吴涛** [36:17]
对啊 ， 这个 。

**Rio** [36:18]
我理解为你曾经使用 Jekyll。

**吴涛** [36:20]
这个 ， 这个 ， 现在这个 appleforce 不是用 Jekyll 生成 ， 待会是用另外一款工具生成 ， 待会会讲 ，但是就最开始的时候想做这件事情其实已经想了很久了 ， 第一次尝试把它这个 WordPress 改成静态的就是用 Jekyll， 然后是在 13 年吧 ， 去年的上半年应该是 。

**Rio** [36:37]
嗯哼 。

### 性能瓶颈

**吴涛** [36:38]
然后发现一个很严重的问题 ，Apple Force 上面就是一共历史有从 07 年开始发的帖吧 ， 我看了一下， 到现在为止有差不多 2500 多篇这个帖子 。

**Rio** [36:50]
嗯哼 。

**吴涛** [36:51]
你猜一下用 Jekyll 生成 ， 就用 Jekyll 的就 plugin free， 就是什么插件都不装的情况下生成一遍这个网站要多长时间 ？

**Rio** [37:00]
嗯 ， 你的生成是指你已经把 MySQL 里面的资料导出来了 。

**吴涛** [37:04]
对对 ， 就是 ， 就是 build 一 ， 就 build 一遍需要多长时间 ？

**Rio** [37:09]
啊 ，5 分钟 。

**吴涛** [37:11]
呃 ， 差不多 ，在我的 2.6 GHz Core i7 上， 就是它可以 ， 就是 ， 就是如果是单核 。

**Rio** [37:21]
你是在本地 build 的 ？

**吴涛** [37:23]
对 ， 就是在本地测试嘛 ， 本地 build 的 ， 就是它可以好像 3.2 GB 吧 ， 这个 Hz 的 i7 上， 我 build 一遍这个帖子需要 3 分钟 ， 啊 ，1 分钟还是 3 分钟 ，3 分钟好像是 。

**Rio** [37:34]
嗯 ， 我想那相当长了 。

**吴涛** [37:36]
我想想 ， 这简 ， 这完全不能够忍啊 。

**Rio** [37:39]
这个就好像那个 XAD 漫画一样 ， 两个人在踩在椅子上拼键 ， 然后有人说 "Go back to work!" 然后其中一个人说 "Compiling!"

然后 。

**吴涛** [37:49]
对对对 。

**Rio** [37:49]
你 ， 你 ， 哦 "Go on!"

**吴涛** [37:51]
就你完全 ， 完全不能够 ， 完全不能够想象在你生成一个静态站点需要这么久吗 ？ 然后觉得这个事情完全不能忍了 ， 后来就去看了一下， 一搜 ， 发现这不是我一个人的问题 ， 就很多人都有 ， 都有这个抱怨 ， 然后追根溯源 ， 无非就是两点吧 ， 一个是 Ruby 这个语言应该是 。

**Rio** [38:13]
太慢了 。

**吴涛** [38:13]
本身太慢了 ， 呃 ，不 ， 就这个它的这个官方实现太慢了 ，但肯定有快的 ， 什么 JRuby，但没 ， 没试过这么奇异的组合 。

**Rio** [38:20]
JRuby 比 CRuby 快吗 ？ 不可能吧 。

**吴涛** [38:22]
我猜应该是吧 ，hopefully， 我不知道 ， 我没用过 。

**Rio** [38:26]
JRuby 比 CRuby 快 ， 我不相信 。

**吴涛** [38:28]
好吧 ， 我 ， 我没试过 ， 我只是在想哈 ， 就是这个 。

**Rio** [38:31]
哎 ，不对 ， 那个官方的 Ruby 应该叫什么 ，MRuby。

**吴涛** [38:33]
MRI 吗 ？

**Rio** [38:35]
对 ，MRI。

**吴涛** [38:36]
对 ， 然后就我 ， 我也没试过各种奇异组合 ， 我就用那个 macOS 10 自带那个 Ruby， 然后去跑一下， 然后我网上搜一下， 发现这个是通病嘛 ， 我现在这个是肯定 ， 就我自己是一己之力是没得救了 ， 就想想算了 。

然后后来我就想 ， 那要不自己写一个吧 ， 就没有这么麻烦 ， 然后当时就用 Python 写了一个 ， 我觉得这个是应该所有程序员应该的必经之路吧 ， 就至少要写一到两个这个 static site generator 才 ， 才甘心的 。

**Rio** [39:06]
对 ，其实我应该是写过这么一玩意儿的 ， 就是在大学做网站的时候 ，但是当然那个时候没有意识到这是一个 static site generator，但它实际上就是一个 static site generator。

**吴涛** [39:18]
哇 ， 所以 。

**Rio** [39:19]
就是我们 ， 对 ， 我在校网站打工的时候 ， 呃 ， 要给当时的美工 ， 就当时美工还不是一个带有贬义的词 ， 我不知道为什么现在好像说设计师是美工 ，他们会感到被侮辱 ，但那个时候说美工 ， 就是我们网 ， 我们学校网站是真的招美工的 ， 就他们的职位就写美工 ， 然后他们美工那个时候要流行切图 ， 你对切图是什么概念 ？

你对切图这个东西有概念吗 ？

**吴涛** [39:48]
就是给一个 Photoshop 的 。

**Rio** [39:51]
对吧 ，PSD 切成 Table 布局的静态 HTML。

**吴涛** [39:55]
嗯哼 。

**Rio** [39:55]
然后当时他们想要在没有后端工程师的协作的情况之下， 自己测试一下整个站点跑起来大概什么样子 。

**吴涛** [40:07]
OK。

**Rio** [40:08]
然后我就写了这么一个工具 ， 把他们切好的静态图 ， 呃 ， 利用某种当时现在已经记不起来的 ， 当时自己发明的相当于 template engine 的这么一个东西 ， 把一些之前定好的什么网站介绍呀 ， 学工部介绍呀之类的灌进去 ， 然后生成这么一个静态的网站的结果 。

**吴涛** [40:28]
所以已经写 ， 你已经 ，其实也已经写过了 ， 很多年以前 。

**Rio** [40:32]
对 ， 只不过对 ，是 。

**吴涛** [40:34]
在不知不知不觉的情况下已经写了 。

**Rio** [40:37]
而且是用 C# 写的 。

**吴涛** [40:38]
天呐 ， 哈哈哈 。

**Rio** [40:40]
对 。

**吴涛** [40:41]
人生的新境界 。

**Rio** [40:42]
曾经我也是软饭的 。

**吴涛** [40:45]
所以这是你就写 ， 然后你之后没有再写过另外一段吗 ？

**Rio** [40:48]
我之后没有 ，因为 ，因为那个时候我觉得这玩意没有什么基础材料 。

**吴涛** [40:53]
确实也是 。

**Rio** [40:54]
然后， 然后后来唯一一个写过类似的东西就是我说的 ， 说过的那个 Loop 啊 。

**吴涛** [41:01]
半自动化 ， 半动态的这个 。

**Rio** [41:03]
半 ， 半动态的这么一个 CMS。

**吴涛** [41:05]
OK。

**Rio** [41:06]
Block system， 对 。

**吴涛** [41:07]
对 。

**Rio** [41:07]
然后这个 block system 会把所有的那个 ， 呃 ， 留评论啊之类的也都生成静态的 ， 呃 ， 静态的 ， 搞不好还是 TXT 格式 ，因为 Loop 的那个 Loop 的一个好处之一就是你可以它的那个数组 ， 就是它不是数组 ， 就是 Loop 里面只有一种数组叫 table。

**吴涛** [41:29]
Table。

**Rio** [41:29]
然后这个 table 的语法其实几乎是和 JSON 非常像 ，是几乎是半 human readable。

**吴涛** [41:36]
嗯哼 。

**Rio** [41:37]
所以我就把那个评论直接存成它的原生数据格式 ， 然后就每个评论就是一个 Loop 文件 ， 然后人可以读 ， 机器也可以读 ， 很挺好 。

**吴涛** [41:48]
OK。

**Rio** [41:50]
对 ，其实我觉得你 ， 你说的这个其实是 ，是正确的 ， 就是也许如果你在学编程 ， 然后你有点不知道要干嘛 ， 那你可以写一个静态网站生成器出来 ， 这个其实就有点像一个 ， 呃 ， 所谓的 Kata， 就是就有本书叫做 ， 嗯 ，Pragmatic Program， 应该是这本书里面提出的这么一个概念 ， 就是程序员应该准备几个 ， 呃 ， 几个任务 ， 然后这些任务可以供它不停地锻炼自己的

编程技巧 ， 然后这种任务就叫做 Kata， 或者叫 Coral， 然后有很多不同的名字 ，但大意就是 ， 呃 ，Kata 这个日 Kata 源自日语 ， 就是 ， 呃 ， 日文的汉字形 ， 就是形状的形 ， 这个字叫做 Kata。

**吴涛** [42:40]
嗯 。

**Rio** [42:41]
然后它 ， 它 ， 嗯 ， 这个词一般用来描述空手道或者是书法之中的套路或者招数或者定式 ， 围棋的定式 。

**吴涛** [42:52]
嗯哼 。

**Rio** [42:53]
就可以叫做 Kata。 但是 programming Kata 又和这些招式的 Kata 不一样 ， 就是 programming Kata 要 ， 比如说我自己比较喜欢的一个 Kata 就是 ， 呃 ， 把十进制的 ， 呃 ， 阿拉伯数字转成罗马数字 。

**吴涛** [43:11]
嗯哼 。

**Rio** [43:12]
就是如果我遇到一门新的语言 ， 我会想要先试试用这个语言做这件事 。

**吴涛** [43:17]
嗯哼 。

**Rio** [43:18]
其实这就是 Kata。

**吴涛** [43:19]
对对对 。

**Rio** [43:20]
那我觉得写一个动态网 ， 写一个静态网站生成器其实也可以成为一种 Kata， 就是你可以用你刚刚学到的语言去写这么一个东西 ， 然后试着去解决你的问题 ，而且你可以写一个然后扔了再写一个 ， 如果你有兴趣的话 。

**吴涛** [43:35]
对 。

**Rio** [43:35]
然后每一次尝试不同的解决方案 ， 然后， 对 ，其实对于编程也是一个很大的助力 。

**吴涛** [43:43]
对对 ， 就是类似这种编程任务吧 ， 还有很多 ， 比如说你刚才想要写一个静态网站生成器是一种 ， 那你可以尝试写一个动态的 ， 对吧 ， 还可以做一些七七八八的事情 。

**Rio** [43:56]
对 ， 写一个动态的就更 ，有时候可能会觉得更复杂一点 ， 至少我当时觉得这个应该更复杂一点 ， 现在想想两个复杂度其实差不多 ， 只不过可能动态的需要你去掌握一些 ， 比如说怎么样设计一个数据库啊 ， 怎么样 ， 呃 ， 把所有的该装的东西装起来之类的 ，而静态网站生成器的任务相对来说就更纯粹一点 。

**吴涛** [44:20]
对对对 。 哎 ， 刚讲哪里了 ？ 对啊 ， 说到后来我写了一个 。

**Rio** [44:25]
对 ， 你写了一个 。

**吴涛** [44:27]
我就 。

**Rio** [44:27]
你用什么 ， 用 Python 写的 ？

**吴涛** [44:29]
啊 ？ 对啊 ， 用 Python 写的 。

**Rio** [44:30]
你是用 Python 写的 ？

**吴涛** [44:31]
对对 ， 然后用 Python 写了一个 ， 然后因为当时我看那个 Jekyll 生成 Apple Force 那个网站慢的一个最主要原因 ， 它是单核的嘛 ， 就它只有一个进程在跑 ， 然后我看 CPU 占用的时候 ， 就在它 build 的过程中百分之百一直在那里卡住 ， 然后， 呃 ， 我就想那能不能够多核呢 ？

然后我在 Python 写的时候我就把用那个 multiprocessing 那个 ， 那个模块就用多核来处理 ， 然后后来做到是 ， 呃 ， 就是 build 一个 Apple Force 同样的 ， 同样效果的站 ， 大概是需要 10 秒左右吧 ， 就在用同时开四个核的情况下，12 秒 。

**Rio** [45:11]
多少篇文章在这 ？

**吴涛** [45:12]
2500 多 。

**Rio** [45:14]
2500 多个 12 秒 。

**吴涛** [45:15]
对 ， 就是 ，但我也没有做任何特别的优化 ， 就只是简单的开了一下这个多核而已 。

**Rio** [45:21]
Multiprocessing。

**吴涛** [45:22]
对对 ， 就因为这个可能要扯到另外那个那个 Global Interpreter Lock 那件事情 ，但是想留待留待下次吧 ，但是就要 。

**Rio** [45:30]
Time stop。

**吴涛** [45:31]
对 ，有一个这么技巧可以去做 ， 做到它可以 12 秒 ，但是我觉得还是不够慢 ， 还是不够快 ， 呃 ， 就又又又放了那么这小半年吧 ， 然后直到就是前段时间 ， 呃 ， 就今年开始我迷上写那个 Go 那个语言 ， 然后前段时间发现有人， 有人用 Go 写了一个静态生成器叫做 Hugo， 对 ，H-U-G-O，H 应该是不发音的吧 ， 对吧 ，Hugo。

**Rio** [45:58]
呃 ， 如果你按法语念法的话 ，Hugo。

**吴涛** [46:01]
就是雨果 。

**Rio** [46:01]
大鱼 ， 大作家雨果的名字 。

**吴涛** [46:03]
对 ， 然后我就试了一下， 然后发现它 build 的整个 2500 篇文章只需要不到 1 秒钟在我电脑上 ，而且只用一个核 ， 顿时就败 ， 顿时就给它跪了 。

**Rio** [46:19]
是啊 。

**吴涛** [46:20]
然后 。

**Rio** [46:20]
我发现你现在已经是成了半个 Go 的福 ， 叫什么 ， 传福音者 ，evangelist。

**吴涛** [46:26]
对对对 ， 就传道 ， 传教士 ， 对 ， 传教士 。

**Rio** [46:30]
对 。

**吴涛** [46:30]
就确实性能 ， 这个性能不得了 ， 就其他的那些 ， 呃 ，不管 ， 就其他用脚本语言写的肯定跟这个效能是没有办法比的 ，而且 Go 这个 ， 就 Hugo， 就任何用 Go 写的程序都有这个好处 ， 它的部署相当容易 ， 这跟它的那个 ， 就是它最终生成的那个程序是一个 binary 嘛 ， 你单一一个不需要外部依赖 ， 除了 Glibc 哈 ， 呃 ， 这个肯定每个系统都有的嘛 ， 它不需要任何外部

依赖 ，不需要专业依赖 ， 然后你所要做的事情 ， 就是说你要在服务器上部署 ， 你就把那个 binary 复制到服务器上， 啊 ， 就搞定了 。

所以就不会出现刚才你说那个人讲的什么 ， 啊 ， 一个 Git repo， 然后 to sub modules 那一堆乱七八糟的事情 ， 就是相当简单容易 ， 然后性能好 。

**Rio** [47:22]
对 ， 它从一个看起来似模似样的这么一个大工具 ， 进演化到了有点像一个 standalone 的这么一个 ， 就是待在这个 local bin 下面一个工 ， 一个单一工具 。

**吴涛** [47:36]
对 。

**Rio** [47:36]
然后忽然之间这么复杂的任务变得这么简单 ，而且这么 better included。

**吴涛** [47:43]
对 。

**Rio** [47:43]
就感觉是蛮爽的 。

**吴涛** [47:45]
对 ，而而就是 ，但是这个也有代价的哈 ， 代价就是你丧失了灵活性 ，因为起码按目前 Go 的这种方法 ， 它是没有办法动态加载其他代码进去执行的 ， 当然你要非要说你要自己用 Go 实现一个 JS 的这个什么 interpreter， 然后你再 load 那个 JS 文件或其他脚本文件进去 ， 那是另外一说 ，但是就是标准的情况下你是没有办法再去扩展这个程序本身 ， 所以这和刚才那些像

Jekyll 啊 ， 还有包括现在可能有二 ， 就市面上常见的主流的都有可能十几二十个这种静态站点生成器了吧 。

**Rio** [48:25]
对 ， 我做功课的时候找到一个网站 ， 呃 ，GitHub 上面的一个列表叫做 static site generators 的列表 。

**吴涛** [48:32]
嗯 。

**Rio** [48:33]
上面 ， 呃 ， 我数了一下有 278 个 ， 包括 Hugo 在内的 static site generator， 各种各样的语言写出来的 。

**吴涛** [48:42]
嗯哼 。

**Rio** [48:43]
呃 ， 什么连什么 bash 都有 ， 然后还有一些 ， 呃 ， 可能严格意义上不算是静态网站生成器的东西 ， 比如说 ， 呃 ，library load。

**吴涛** [48:52]
嗯哼 。

**Rio** [48:53]
它也算在里面了 。

**吴涛** [48:55]
你这个 ， 这个列表不好哈 ， 这没有可比性不强 ， 我待会给你 ， 我有一个 ，有人专门做了一个 ， 就就因为市面上有太多静态站点生成器 ， 然后你知道很 。

**Rio** [49:06]
哦 ， 那个你说的这个是带投票的是吧 ？ 我好像也看到 。

**吴涛** [49:09]
它有一个很漂亮的那个功能的 ， 还有一个简单的一个就是论述判断 ， 比如它用的什么模板语言啊 ， 它这个什么样的方式啊 ， 协议怎么样的 ， 就是有人做了一个很漂亮的网站去比较市面上 。

**Rio** [49:21]
OK。

**吴涛** [49:21]
就是已有的这些静态站点生成器 ，由此可见这个什么选择困难正严重到了什么样的程度 。

**Rio** [49:31]
嗯 ， 对 ，但是我就是我说的刚另外一个站点上面有一个投票功能 ， 就是选你最喜欢的或者说选你最熟悉的静态网站生成器 。

**吴涛** [49:42]
嗯 。

**Rio** [49:43]
Jekyll 远远领先于所有其他的生成器 。

**吴涛** [49:46]
它是 ， 它是鼻祖吗 ？

**Rio** [49:48]
对 ， 就是这个 ， 我们不妨来简单说一下 Tom Peterson、Preston、Wayne 这些八卦好了 。

**吴涛** [49:55]
你说 。

**Rio** [49:55]
就是它是一个很知名的或者说很强大的 Ruby 程序员 ，他创立了 GitHub， 然后后来做了很长时间的 president， 然后后来前两天吧 ，他写发了篇 ， 发了一条推还是什么的 ， 说 ， 呃 ，goodbye GitHub。

**吴涛** [50:12]
嗯 。

**Rio** [50:13]
Hello Octopus Rift， 就是他去做那个 VR 眼镜的那个 ，他去那个做 VR 眼镜的公司 。

**吴涛** [50:21]
是 Facebook 买下来了吗 ？ 那一家 ？

**Rio** [50:24]
对 ，但是疯传说 ， 八卦说他离职并不是因为他想离职 ，而是因为他有一个女下属状告他 harassment。

**吴涛** [50:36]
你不知道吗 ？ 这个事情之前闹得很大的 。

**Rio** [50:39]
这我 ， 我知道的 。

**吴涛** [50:41]
OK。

**Rio** [50:41]
不然我干嘛要说呢 ？

**吴涛** [50:43]
不不 ， 我我 。

**Rio** [50:43]
我只是来八卦一下 。

**吴涛** [50:44]
OK， 然后这故事其实还蛮那个的哈 。

**Rio** [50:47]
说 ，而且说他 ，他和他的妻子 。

**吴涛** [50:50]
对对对 。

**Rio** [50:51]
同时一起 harass 这个人， 我觉得还挺夸张的 。

**吴涛** [50:55]
对 ， 就之前有一个 GitHub 的女员工去网上发了这个说 ， 就说 Tom Preston Wenner 和他老婆 ， 一个是性别歧视吧 ， 一个是 ， 然后还是什么 harassment，sexual harassment。

**Rio** [51:07]
一个 ， 一个说一个 ， 一个是 ， 呃 ， 基于性别歧视 harassment。

**吴涛** [51:11]
嗯 。

**Rio** [51:11]
然后另外一个是在办公室里面 stalked， 就是跟踪他什么的 。

**吴涛** [51:16]
嗯 。

**Rio** [51:17]
反正这 ， 呃 ， 对 ， 挺不可思议的 。

**吴涛** [51:21]
对 ， 然后后来那个什么 Tom Preston Wenner 就走路了嘛 ， 然后他去 。

**Rio** [51:26]
对 。

**吴涛** [51:26]
哎 ， 我不 ， 哎 ， 我不知道他去了那个 Octopus Rift。

**Rio** [51:30]
对 ，他名义上说有一个调查组 ， 调查团来查这件事情 。

**吴涛** [51:35]
嗯 。

**Rio** [51:36]
但是这个被 ， 呃 ， 欺负的这个女员工说其实根本就没有什么调查团 ，他们只是关起门来谈了谈 ， 觉得这件事情对公司的影响太坏 。

**吴涛** [51:48]
嗯哼 。

**Rio** [51:48]
然后说 Tom 你还是走吧 ， 然后他们就走了 。

**吴涛** [51:54]
嗯哼 。

**Rio** [51:54]
对啊 。

**吴涛** [51:55]
Anyway。

**Rio** [51:55]
Anyway。 这个 Jekyll 其实他因为他是个鼻祖 ， 然后他发展的比较早 ，由此就生成了很多周边产品吧 ， 或者说衍生产品 。

**吴涛** [52:07]
嗯 。

**Rio** [52:07]
也是很多人， 很多人都用 ， 比如说 Jekyll Bootstrap， 就是最开始是用 Bootstrap， 呃 ，Twitter Bootstrap 的主题去包装一个 Jekyll， 然后让你直接可以替换主题 ，不用自己去定制模板了 。

**吴涛** [52:21]
嗯 。

**Rio** [52:21]
后来又出了一个产品叫做 Octopress， 啊 ，Octopress 出来的一段时间之内 ， 好像我认识的所有稍微有点 ， 稍微有点名气 ， 稍微能够坚持那么写两天 blog 的人， 全都把他们的 WordPress 换成了 Octopress。

对 ， 就好像那个时候就好像你不用 Octopress， 你就 ， 你就 ， 你就不是 ， 你就不是个程序员那种感觉 。

**吴涛** [52:47]
所 ， 所以那个 Octopress 就是 Jekyll 的一个叫什么 ， 一个皮 ？

**Rio** [52:53]
对 ， 一个叫什么 ， 呃 ， 加了插件的爱好者定制 deluxe 白金版 。

**吴涛** [53:01]
啊 ， 我想起来了 ， 对 ， 我是用那个就是原生的 ， 就 Jekyll 裸奔 ， 就啥也不装 ， 能跑那个 build Apple Force 那样 ， 那个站是三分钟 ， 一分钟 ， 然后装了 Octopress build 出来是五分钟 ， 然后我就果断的放弃了 。

**Rio** [53:16]
对 ，而且 Octopress 我觉得它最大的问题是很多

， 呃 ， 我相信 ， 我相信江江也说过这问题 ， 就是它的默认主题其实非常难看 ， 就比那个和 WordPress 的默认主题有过之而无不及 ，但是非常多的人在用 ， 所以就让人觉得很 ， 很汗颜 。

**吴涛** [53:36]
默认主题没有哪个好看的吧 ， 我觉得 。

**Rio** [53:40]
Designed by programmer。

**吴涛** [53:42]
哦 。

**Rio** [53:43]
默认主题有好看的 ， 我觉得 。

**吴涛** [53:44]
哪 ， 哪个什么 SSMS 软件你觉得默认主题好看的 ？

**Rio** [53:50]
哎呀 ， 我回去做两天功课 ， 回来再给你答吧 。

**吴涛** [53:54]
你肯定想不出来 。Anyway， 啊 ， 反正 。

**Rio** [53:57]
哎 ， 我知道 ， 那个苹果的那个网站生成器叫什么 ？

**吴涛** [54:02]
啊 ，iWeb。

**Rio** [54:05]
对 ，iWeb 不错 。

**吴涛** [54:07]
天哪 。 哎 。

**Rio** [54:08]
你作为一个果粉不敢反驳吧 。

**吴涛** [54:11]
好吧 ， 无力 。

**Rio** [54:13]
哈哈哈 。

**吴涛** [54:15]
哎 ，不过你还别说 ， 真有用那个 ， 我 ， 我之前就刚刚讲了我的 ， 我 ， 我的那个导师 ，他不是有一个 ，他自己有一个这个在学校挂的那个个人网站 ， 要求给学生 ， 比如他要教那门课 ，他要布置一些作业或者一些什么相关的资料 ，他会放上去嘛 ，他之前还真的是用那个 iWeb 写的 。

**Rio** [54:33]
嗯 。

**吴涛** [54:34]
然后 。

**Rio** [54:34]
我相信其实个人主页生成器 ， 就个人主页创作软件这种东西是一直都有市场的 ， 就像早期的微软的那个 front page 也是想要抓到这一块 ，但是没有一个能做的真正让不懂电脑的人也可以做出一个漂亮的网页来 ， 即便 iWeb 也是有这个问题 。

**吴涛** [54:53]
对对对 ， 就可能最接近的应该是那个什么叫 ， 就就叫 front page 吧 ， 就从 。

**Rio** [55:00]
你说微软的 front page？

**吴涛** [55:01]
对对 ， 就从易用性的角度来讲 ，因为据说什么 。

**Rio** [55:04]
我不觉得 。

**吴涛** [55:05]
这肯定 ，但是不好用 ，但是就说在所有不好用的里面 ， 它是还算还还可以的那种 。

**Rio** [55:10]
不好用是吧 ？

**吴涛** [55:11]
就是 ， 呃 ，the the least worst。

**Rio** [55:15]
对 ， 鸡蛋里面 ， 呃 ， 餸子里面拔将军的话 ， 那只能选它 。

**吴涛** [55:19]
对对对 ， 呃 ， 然后因为就很多那个什么办公室的那种 ， 就是小秘书 ， 那不是老秘书 ， 就是大妈 ， 她可能学学也也也能搞懂 ， 然后能做出一个页面来 ， 虽然不好不好看 ，但是起码该有的信息都有了 ， 你就凑合着用吧 。

**Rio** [55:37]
对 ， 大妈 usability 这是衡量一个软件易用性的非常重要的标准 。

**吴涛** [55:43]
对对对 。

**Rio** [55:43]
我记得早期苹果还在那边吹嘘 ，也不是吹嘘 ， 就是那个时候的确是实情 ， 就是七老八十的大妈也可以不经指引就使用 iPad， 可是现在苹果已经在 iPad 里面内置什么 。

**吴涛** [55:57]
Tips。

**Rio** [55:57]
iOS Tips 这种 2B 程序了 。

**吴涛** [55:59]
它已经那个什么 ， 它已经那个投降了吗 ？

**Rio** [56:02]
它已经不再简单了 。

**吴涛** [56:03]
对 。

**Rio** [56:04]
它这这个复 ， 任何系统复杂的程度都不可能再再老太婆 usable。

**吴涛** [56:09]
对 ，不过 ，不过 front page 它好用 ，其实有一个最核心的一点 ， 就是它也不叫好用 ， 它应该是就是 piggyback 到另外一个东西上面 ， 就是那个 Word，因为很多人都学 ， 就如果你是在办公室工作的人，Word 是你跑不掉要一定要用的一个东西嘛 ， 然后那个 front page 它做的很像那个 Word， 所以其实就学习门槛肯定还是有的 ，但是因为你学过 Word 之后再转过来就没有那么抖了嘛 。

**Rio** [56:35]
对 ， 当时让我非常感动 ， 现在想起来非常汗汗颜的一件事情是 ， 我发现当时我装了 Dreamweaver， 装了 front page， 还装了一个另外一个什么东西 。

**吴涛** [56:47]
嗯哼 。

**Rio** [56:47]
呃

， 应该是 Adobe 的 Go-Live。

**吴涛** [56:52]
是吗 ？

**Rio** [56:52]
是叫 Go-Live 吧 。

**吴涛** [56:53]
什么东西 ？

**Rio** [56:55]
呃 ，不行 ， 这个东西我一定要搜一下， 就是 Adobe 曾经在收购这个 。

**吴涛** [57:01]
Macromedia。

**Rio** [57:02]
呃 ，Macromedia 之前有一款自己的那个 ， 呃 ， 叫什么 ， 主页创作软件 。

**吴涛** [57:11]
嗯哼 。

**Rio** [57:11]
对 ，Adobe Go-Live。

**吴涛** [57:12]
嗯哼 。

**Rio** [57:13]
这个东西实际上我在很长一段时间里面都认为它比 Dreamweaver 好用太多了 。

**吴涛** [57:18]
嗯哼 。

**Rio** [57:18]
呃 ，但是在那个时候我在 ， 呃 ，front page、Go-Live 还有 Dreamweaver 里面同时做了一件事情 ， 就是我想把一行字缩近一段距离 。

**吴涛** [57:31]
嗯哼 。

**Rio** [57:32]
还是做某一某一某想要达成某一个目的的时候 ， 我发现长按着空格键并不能让字在所有编辑器里面 ， 长按空格键并不能让字移动到我想要的地方 。

**吴涛** [57:45]
Front page 可以 。

**Rio** [57:46]
只有 front page 可以 ，因为 front page 在里面插入了一大堆那个 。

**吴涛** [57:50]
NBSP 吗 ？

**Rio** [57:50]
Non-breakable space， 对 。

**吴涛** [57:52]
对 ， 所以看易用性还是很不一样吧 ，intuitive。

**Rio** [57:56]
对 ，very intuitive， 对 ， 我要说 ， 还是要夸它一下 。

**吴涛** [58:01]
对 。

**Rio** [58:02]
在那些久远的想要砸电脑的年代 ，有这样让让人耳目一新的软件出现 ， 真的挺感动的 ， 为小儿确定了幸福 。

啊 ， 又扯远了 。

**吴涛** [58:17]
好 ， 刚才扯了那几个 ， 呃 ，Python 其实还有一个比较知名的那个生成器叫做 Pelican 吧 ， 这个应该是在 。

**Rio** [58:25]
对 。

**吴涛** [58:25]
还 ， 它最早应该有个叫 Hyde 的 ， 对不对 ？

**Rio** [58:30]
对 。

**吴涛** [58:30]
就 Jekyll，Jekyll。

**Rio** [58:32]
所谓 Jekyll 是 evil twin。

**吴涛** [58:33]
对 。

**Rio** [58:34]
它几乎是仿仿 Jekyll 做的 。

**吴涛** [58:36]
对 ， 就 。

**Rio** [58:37]
有一个是一个印度人做的 ， 我记得 。

**吴涛** [58:39]
是吗 ？ 啊 。

**Rio** [58:40]
嗯 。

**吴涛** [58:41]
然后还有 。

**Rio** [58:41]
对 ， 然后 Pelican 是一个法国人， 叫做 Alexis Métayreux。Monsieur Métayreux。 对 ， 是一个法国人， 然后， 呃 ，他应该是给某某资料工作的 ， 我觉得 。

**吴涛** [58:56]
OK。

**Rio** [58:57]
我记得 ， 然后他的之所以叫 Pelican 并不是因为叫孔 ，Pelican 是孔雀的意思 。

**吴涛** [59:02]
嗯哼 。

**Rio** [59:04]
Anyway， 反正 Pelican 他说是一个 。

**吴涛** [59:07]
Caleping 的 anagram。

**Rio** [59:09]
Calepon？

**吴涛** [59:10]
不知道 ， 这法语不知道怎么 ， 就法语的笔记本的意思 。

**Rio** [59:13]
Calepon， 我相信应该是 Calepon。

**吴涛** [59:15]
嗯哼 。

**Rio** [59:15]
对 ， 然后法语里面是笔记本的意思 ， 然后取名叫 Pelican。 但是这就是 ， 当然还有一个 ， 呃 ，在 Jekyll 之后开发的也是基于 Ruby 的 ， 呃 ， 生成器叫做 Middleman。

**吴涛** [59:30]
嗯哼 。

**Rio** [59:30]
Middleman 最大的卖点是它支持的插件比 Jekyll 还要多 。 对 ， 可扩展性 ， 可扩展性比 Jekyll 还要强 ，但也很有可能也比 Jekyll 还要慢 。

**吴涛** [59:42]
对 ， 我 ， 我觉得我们不用挨个介绍这个 ， 我觉得要介绍那个 300 多项的 ， 说到明年的讲不完 。

**Rio** [59:48]
278， 对 ，有点太多了 。

**吴涛** [59:50]
这个列表我想已经有 342 个了 。

**Rio** [59:53]
哇 ，holy shit。

**吴涛** [59:54]
哎 ， 对 ， 你不觉得这个很诡异吗 ？

**Rio** [59:56]
所以你也可以写一张 。

**吴涛** [59:57]
你说一般不怎么写字的程序员 ，他天天费喇叭劲写那么多东西 。

**Rio** [1:00:02]
就像我说的 ， 它是个 cut，而且它是一个很好的 cut。

**吴涛** [1:00:05]
所以 ， 所以你用的是 ， 如果你要用别人的 ， 你一定要小心 ， 你要很容易被坑 。

**Rio** [1:00:10]
对 ， 所谓 NIH 情节 ，not invented here。

**吴涛** [1:00:14]
对 ， 一定 。

**Rio** [1:00:15]
不是我写的 ， 所以我一定要自己写一个 。 我为它为什么不好用 ？ 因为它不是我写的 。

**吴涛** [1:00:19]
哎 ，不过 ，不过我现在心态变了 。 你看我为什么 。

**Rio** [1:00:23]
变成什么样了 ？

**吴涛** [1:00:23]
我自己已经写了一个了 ， 就性能就应该还还凑合了吧 ，但是觉得还是用别人写的比较简单 ， 懒得去麻烦 。

**Rio** [1:00:31]
嗯 ， 这个叫 ， 这叫过来人心态 ， 就是大爷已经写过一个了 ， 我现在有资格 judge 你们这帮人写的东西 ， 我可以挑一个顺手 。

**吴涛** [1:00:38]
我现在的处事哲学是什么 ？Less code is good code。

**Rio** [1:00:42]
嗯 。

**吴涛** [1:00:44]
什么 no code is great code。

**Rio** [1:00:45]
No code is best code。

**吴涛** [1:00:46]
对 ， 对 ， 就这样 。 所以就能能不写自己代码的就不写自己代码 。 然后刚才扯的那个 7788 的那个生成器本身哈 ，其实那个东西大家有兴趣 ， 我们会把那个列表贴在那里 ， 大家自己去看 。

我现在我们要讲另外一件事情 ， 就是部署啊 ， 刚才讲了一半天 dev， 现在讲 op 这一块了 。

### 部署自动化

**Rio** [1:01:06]
对 。

**吴涛** [1:01:07]
就刚才我在问那个你 ， 你也说你在服务器上部署了 ， 然后其实最开始的时候大家还不是这么玩的哈 ， 最开始是在自己的本地生成一个就 public 目录 ， 就是然后直接通过比如说 rsync 或者 scp 的方式复制到远程服务器上去 ， 然后搞定 ， 对吧 ？

然后后来 。

**Rio** [1:01:29]
对 ， 或者直接像我这样 git share， 然后 git pull 就 。

**吴涛** [1:01:33]
对 ， 这这其实这个已经是比较高端的一个方法 ， 或者说比较麻烦的一个方法 ， 你得你得扑来扑去 ， 然后搞来搞去还是挺挺头痛的 ， 对吧 ？

**Rio** [1:01:43]
对 ， 就任意的话 ，其实 git 可以完全拿来当 scp 用啊 ， 就直接 git push 到远端的 。

**吴涛** [1:01:49]
对 ，但是你还得去用命令行嘛 ， 就是还是得去麻烦一下， 就是刚才我讲我现在已经变得很懒的一个人， 所以我 。

**Rio** [1:01:56]
可是你生成难道不需要用命令行吗 ？

**吴涛** [1:01:58]
哎 ， 对 ， 这就是要讲的事情了嘛 。 你其实你也不用了 ， 你你生成的时候你是 push 到那个上面去 ， 然后， 呃 ， 就就服务器这边自动完成了嘛 ，不是吗 ？

**Rio** [1:02:14]
不 ， 我的意思是你在生成这个站点的时候会会使用命令行 ， 那你为什么会害怕 ， 或者说为什么会觉得用命令行发布显得多余呢 ？

**吴涛** [1:02:23]
就因为我不想 ，因为你知道写作的时候和在敲命令操作的时候 ， 我觉得是两种完全不同的心态嘛 ， 所以我不想在写作的时候还要去想 ， 哎 ， 还要再执行一个命令才能够发布 ， 为什么不能写了 ， 存在那个地方 ， 它就自动给我发布了呢 ？

**Rio** [1:02:40]
因为你不知道自己有没有写好 。

**吴涛** [1:02:41]
它不是有那个 draft 的那个目录嘛 ， 就草稿那个目录嘛 。

**Rio** [1:02:46]
什么有 draft 的目录 ？

**吴涛** [1:02:47]
呃 ，Jekyll 有 draft 的那个目录啊 。

**Rio** [1:02:49]
Jekyll 有 draft 的目录 ？

**吴涛** [1:02:50]
哎 ， 你又漏号了 。 有啊 。

**Rio** [1:02:54]
我用的版本还没有呢 ， 我对天发誓 。

**吴涛** [1:02:56]
那可能是后来加的吧 。Anyway， 啊 。

**Rio** [1:02:58]
对 ， 应该是后来加的 。

**吴涛** [1:02:59]
对 ， 后来就出现过这么一一一群用 ， 就是因为 Dropbox 后来不是出了 API 吗 ？ 啊 ，不对 ，Dropbox 没出 API 之前就有人想这么干 ， 就是它注册了两个 ， 单独注册了一个 Dropbox 账号 ， 那个账号在那个服务器上跑 ， 然后它把它的那个静态目录的那个 source 那个 directory，source 那个目录跟那个服务器上那个 Dropbox 的账号共享了 ， 然后这样服务器那边就会同步嘛 ， 然后用一种在

Linux 上你可以要么你就 porr 嘛 ， 你就去去轮询那个目录看有没有文件更改 ， 要么你用那个叫什么 ， 呃 ，no， 那什么 notification 来着 ，fnotify 还是什么来着 ，fsnotify。

**Rio** [1:03:40]
I notification。

**吴涛** [1:03:41]
I know notification。

**Rio** [1:03:42]
I notify 吧 。

**吴涛** [1:03:43]
对 ， 对 ，I notify， 对对对 ， 这个那个系统就 Linux 有这么一个系统 ，2.6 还是 2. 几里面开始搭载的 ， 就它可以通知你说某 ， 你可以就你可以 watch， 你可以监 ， 就是叫什么 ， 观察某一个目录 ， 然后有变动事件 ， 那个系统内核会提醒你 ， 然后你可以再跑一遍嘛 ， 然后有有就有人这么干过 ， 我也这么干过 ， 我就在 。

**Rio** [1:04:04]
监控 。

**吴涛** [1:04:05]
对 ，watch。

**Rio** [1:04:07]
监监控文件目录的更改 。

**吴涛** [1:04:10]
对对 。

**Rio** [1:04:10]
文件系统的更改 。

**吴涛** [1:04:11]
就是 file。

**Rio** [1:04:12]
实际上是一个非常 。

**吴涛** [1:04:13]
File event。

**Rio** [1:04:14]
对 ， 是一个非常 general 的需求 。

**吴涛** [1:04:16]
对 。

**Rio** [1:04:16]
我有时候好奇为什么这么晚才出现这种功能 。

**吴涛** [1:04:20]
其实在好像是 Windows 上先有这个吧 ， 我记得还是还是还是 BSD 上面先有这个东西 ， 我忘了 。

**Rio** [1:04:29]
你说监视一个 。

**吴涛** [1:04:31]
对对对 。

**Rio** [1:04:31]
文文件系统的改变 。

**吴涛** [1:04:33]
对 。

**Rio** [1:04:33]
我 Windows 我印象里面没有啊 。

**吴涛** [1:04:35]
有有有有 。

**Rio** [1:04:36]
Mac 其实是一直有的 。

**吴涛** [1:04:37]
Mac BSD 那个好像一直都有 ， 那个 KQ 嘛 ， 好像一直都有这个东西 。

**Rio** [1:04:42]
嗯 。

**吴涛** [1:04:43]
啊 ，anyway， 说远了 。 啊 ， 就就有人这么干嘛 ， 然后但是那个东西有一个比较麻烦 ， 就是设因为 Dropbox 在 Linux 上面的客户端比较屎 ，有很多 bug 经常会死掉 ， 然后也不知道为什么呢 。

**Rio** [1:04:58]
我从来没用过 ， 我从来没用过 Dropbox Dropbox 的 Linux 客户端 ，是命令行下的吗 ？ 还是是一个 service？

**吴涛** [1:05:05]
它有两个 ， 如果你是 Linux， 你是有这个客这个客户端 ， 它是有那个 GUI 的 ， 如果你没有的话 ， 它有一个指命令行的工具 ， 你还得再设置一遍它怎么去 ， 那个叫什么 ， 呃 ， 就就后后后台运行 ， 后台运 ，Sonic Engine 都很很 ， 都那个都很热闹 ， 那个一次性的嘛 ， 就是你要先运行它 ， 启动它 ， 它会生成一个链接 ， 然后你再把链接复制到你的浏览器里面 ，

你要授权 ， 然后有一堆事情挺麻烦的 ，但是就那个都一次性的都还好 ，但是主要是那个 Dropbox Linux 的客户端 ， 就是 Compoundline 那个版本就比较不稳定嘛 ， 你经常会隔三差五出问题 ， 然后同步也不是很及时吧 ，因为之前我记得那个 Mark Harmon 他也的那个也是这么干的 ， 然后经常会出现 ， 呃 ， 就你在本地已经把那个文章放上去 ， 然后那个本地的那个 Dropbox 已

经显示同步了 ，但是服务器上面可能要等 5 分钟才会同步 。

**Rio** [1:05:58]
嗯 。

**吴涛** [1:05:58]
就就体验 。

**Rio** [1:05:59]
现在还是这样吗 ？

**吴涛** [1:06:00]
呃 ， 现在我不太清楚 ， 就是有有一段时间很多人抱怨这个问题嘛 ，因为我也遇到过 ， 所以就不是很稳定 ， 后来大家就不是很爽 。

啊 ， 当然后来那个 Dropbox 开放了 API 哈 ， 可以直接就是它给你一个 callback 嘛 ， 就是你不用再在服务器端装那个 Dropbox 客户端 ， 你只用开一个那个 web AP web 的那个端 ， 然后它那边同步了 ，Dropbox 服务器会自动给你发一条这个 HTTP 请求 ， 然后你再去啊 Dropbox 那个 API 去请求更新的数据就好 ， 这样的话就可以绕过客户 ， 你不用使用 Dropbox 客户端了嘛 ， 就还好一点 。

**Rio** [1:06:35]
对 ， 变成模型变了 ， 变成变成 event driven 了 。

**吴涛** [1:06:38]
对对 ，其实之前也是 event driven，但是有一个是你要再运行一个 Dropbox 那个闭源的私有的客户端 ， 然后又写得不好嘛 。

**Rio** [1:06:45]
对 。

**吴涛** [1:06:45]
所以现在其实更加的好的方案 。 然后后来大家觉得 ， 哎呀 ，Dropbox 不是那那年出过那个事儿吗 ？ 出过一个事儿 ， 就是有一段时间大的所有账号可以随便都可以访问嘛 ， 那个那个系统的漏洞 。

**Rio** [1:06:59]
对 。

**吴涛** [1:06:59]
然后后来就觉得卧槽这个不靠谱啊 ， 这个信不过怎么办 ？ 后来那个 BitTorrent 就做 BT 那间公司出了一个叫 BitTorrent Sync 这么一个方案 ， 怎么理解呢 ？

它就是一个 Dropbox，但是没有中央服务器的 ， 就它是一个完全分布式的一个系统 。

**Rio** [1:07:16]
去中心化的 。

**吴涛** [1:07:17]
对对对 。

**Rio** [1:07:17]
Dropbox 替代品 。

**吴涛** [1:07:18]
对 ，decentralized Dropbox basically， 就你可以在你的服务器上装一个它的客户端 ， 然后你本机装一个客户端 ， 本机客户端就跟 Dropbox 客户端长得一样 ， 你可以选择一个目录 ， 它会同步 ， 然后你把这个啊这个目录的选择同步到你服务器上去 ， 然后就可以运行 。

然后这个就还不就我觉得我试过相当长一段时间吧 ， 性能还可以 ， 就是我的个人主个人网站之前就是用这种方式来实现的啊 ， 性能还就是速度还行 ， 然后同步速度也可以 ， 然后也没有像 Dropbox 客户端那种就隔三差五不能同步的情况 。

不过它那个因为是去中心化的嘛 ， 就是我必须得保证啊 ， 我的服务器是在线 ，但是我的这个本机一定要完成同步之后我才能够下线 ，不然的话就可能同步到半截 ， 然后那边还是就服务器端还是用那个 I notify 那个接口去侦测有文件的更新啊 ， 然后再去重新重新 review 这个整个整个 site 嘛 。

啊 ， 这些都是这个一个技术层面的问题啊 ，但是呃 ， 这里有一个共性 ， 就是它的是等文件系统或者是某种方式来来更新东西的 。

这里有个问题就是你可能它会更新到一半 ， 比如说你同时改了五个文件 ， 对吧 ？ 它只你它 ，但是你那个文件系统是每个都每次都要触发一个事件的嘛 ， 就可能你你在 。

**Rio** [1:08:35]
所以会导致多次 build。

**吴涛** [1:08:37]
呃 ， 多次 build 本身倒是没有什么问题 ， 如果速度快的话 ，但是因为首先速度不快 ， 特别是大站点 ， 多次 build 就很慢 ， 很费这个服务器的资源嘛 。

就如果你是单核的一个 VPS， 可能会直接卡死 ，但这个都不是最核心的问题啊 ， 最核心的问题是它如果你是改了一半 ， 它可能中间状态是不稳定的 ， 对吧 ？

就是它不是一个 ， 比如你改了模板 ， 举个例子 ， 你可能你改了三个模板文件 ， 它只同步到一个模板文件 ， 然后你会可能中间这些引用就会是错的 。

**Rio** [1:09:05]
你 build 失败 。

**吴涛** [1:09:06]
就会 build 失败 。

**Rio** [1:09:07]
这不是什么大问题啊 。

**吴涛** [1:09:08]
嗯 ，depends， 就如果 build 失败 ， 就如果有就有人会可能看到中间的那个中间状态 ， 然后然后如果它又刚好被缓存下来的话 ， 就会很 ugly 嘛 ， 就不是一个很优雅的方案其实 。

**Rio** [1:09:21]
对 ，不小心把密码或者情书写上去了 ， 然后 。

**吴涛** [1:09:25]
不会这么惨吧 。

**Rio** [1:09:26]
临时终止 。

**吴涛** [1:09:27]
不会这么惨吧 ，但但是就是这个我觉得这不是一个优雅的方案啊 。 然后还有一个问题就是刚才讲的嘛 ， 用命令行去同步 ， 它其实始终是一个我觉得不够用户友好的一个方案 。

所以在 Apple Flight 现在这个版本我是用了另外一种方法 ， 就是用 git 来来同步 ， 然后我是在 GitHub 上面装了建了一个那个 repository， 然后用那个 GitHub 有一个 webhook 这个几个接口 ， 就是它可以等你每次 commit， 它会它会给 。

**Rio** [1:10:00]
其实就是 git 自己的 hook 在 GitHub 上面的延伸 。

**吴涛** [1:10:05]
对对对对对 ， 就对 ， 就是就是大概意思就是你可以自己建一个 ， 你在服务器上建一个这个 web server， 然后侦听这个 GitHub 发过来的这个这个这个事件 ， 然后它你就会知道有一个完完整整的这个 commit 已经过来 ， 比如说你不会出现你你是看你一个 commit 里改了五个文件 ， 你不会说只只只修改到三个文件 ，因为你整个 commit 铺下来肯定是有三呃五个文件全部都改过

了嘛 ， 对吧 ？

**Rio** [1:10:31]
对 。

**吴涛** [1:10:32]
它就是解决了第一个问题 。 然后就是然后 git 你铺回来之后， 它不是有一个 post merge 这个 hook 嘛 ， 本地的 ，而且在那里写个脚本 ， 然后在你运行一下生成就好了 ， 这个整个过程还是蛮优雅的 。

然后 。

**Rio** [1:10:46]
Post merge 还是 post commit？post merge 有 post merge 这个东西吗 ？

**吴涛** [1:10:50]
Post merge 是在 。

**Rio** [1:10:51]
Post commit。

**吴涛** [1:10:52]
Post。

**Rio** [1:10:52]
应该是 post commit，post receive，post。

**吴涛** [1:10:55]
有 post merge。

**Rio** [1:10:56]
Post receive。

**吴涛** [1:10:57]
Post merge 是发生在就是比如说你因为你在服务器上， 你肯定要把那个东西整个那个 repository 抓下来嘛 ， 那个源 ， 对吧 ？

然后它你是 。

**Rio** [1:11:05]
可是不是每一次都会发生 merge 啊 。

**吴涛** [1:11:07]
你 git pull 的话 。

**Rio** [1:11:08]
它有可能只是 for。

**吴涛** [1:11:09]
你是 git。

**Rio** [1:11:10]
Force forward 的 。

**吴涛** [1:11:10]
不 ， 你是你是 git git pull 嘛 。

**Rio** [1:11:13]
Git pull 的话有可能是 force forward，force forward 不会产生 merge 的 。

**吴涛** [1:11:18]
你确定吗 ？ 我记得 git pull 好像默认是 git fetch， 就是 git pull 是等于 git fetch 加 git merge， 然后 fast forward 是在 merge 过程中实现的 。

**Rio** [1:11:28]
不 ，但是这个 merge 不 ， 你的 merge 是只会产生 merge commit merge。

**吴涛** [1:11:33]
不不不 ， 就只是就是只是 git merge。

**Rio** [1:11:35]
只是把那个 head 加到 ， 就是只是把当前的 local branch 啊同步到 remote branch 上， 这个叫 merge。

**吴涛** [1:11:43]
对对 。

**Rio** [1:11:44]
你是这个意思 。

**吴涛** [1:11:44]
对对对 ， 应该是这样子 。 如果我读那个 ， 如果我读那个文档没没理解错的话哈 ，但可能我理解错的话你看一遍 。

啊 ， 就是整个过程就是说就是在那个 git post merge 那个那个钩子里面调用这个静态站点生成器跑一遍就完成了 ， 然后也不会出现那种很诡异的状况 。

然后还有一个比较优雅的地方就是我可以你知道 GitHub 的那个 web 界面其实做得还不错嘛 ， 然后你可以直接在上面添加文件或者编辑文件嘛 。

所以其实我是把 GitHub 的这个就是 web interface 当成了一个 CMS 来用 。

**Rio** [1:12:21]
嗯哼 。

**吴涛** [1:12:22]
然后 。

**Rio** [1:12:22]
就现在 GitHub 上面可以创建新文件了吗 ？

**吴涛** [1:12:25]
可以啊 ， 你是那个在有个上面有个这个路径那那个栏有一个加号 ， 就是创建文件或者是目录 。

**Rio** [1:12:31]
因为我记得以前我我好我好像想要做同样的事情的时候 ， 我懊恼的发现 git 虽然可以 GitHub 虽然可以改文件 ，但是不能产生新文件 。

**吴涛** [1:12:39]
因为它那个不是太显眼啊 ， 你要去在那个就你开一个任意开一个 git repository 的话 ， 它会在那叫什么位置 ， 就顶它会显示一堆文件列表的顶上不是有一个当前那个路径嘛 。

**Rio** [1:12:53]
嗯哼 。

**吴涛** [1:12:54]
那那那个末尾有一个加号 ， 你点那个加号就是可以添加新文件 。

**Rio** [1:12:58]
OK。

**吴涛** [1:12:59]
然后如果你要插再添个目录的话 ， 你就加个斜杠就好了 。

**Rio** [1:13:05]
哦 。

**吴涛** [1:13:06]
对 。

**Rio** [1:13:07]
行 ， 下次可以试一试 。 我是很久没有在 GitHub 上直接修改文件了 ， 好像只有有一一两次要去改一个笔误的时候用过 。

**吴涛** [1:13:16]
对对 ， 我觉得这个这个用用力就特别好 ， 就刚才我讲了嘛 ， 我不喜欢去碰 。 哎 ， 这样不对 ，其实我还是蛮喜欢碰命令行 ， 就是在写作东西的时候我不想去碰命令行 ， 现在就是这个整个 。

**Rio** [1:13:29]
就是在写作的时候 ， 写 blog 本身的时候 ， 我觉得可能最大的痛苦就在于用 Vim 的时候输入法实在是太操蛋了 。

**吴涛** [1:13:39]
Vim 不适合写文章 ， 只适合写程序 。

**Rio** [1:13:42]
对 ，其实对 ，其实 Vim 和输入法是有异曲 ，也不是异曲同工 ， 就是它们的运作机理其实一样的 。 输入法在中文是一种 mode。

**吴涛** [1:13:52]
对 。

**Rio** [1:13:52]
英文是一种 mode。

**吴涛** [1:13:53]
对 。

**Rio** [1:13:54]
然后 Vim 要在你英文的 mode 上加入 command mode 和 edit mode。

**吴涛** [1:13:58]
嗯哼 。

**Rio** [1:13:59]
所以你大脑要维护这三个 mode 之间的状态机切换 ， 就其实还是挺累的 。

**吴涛** [1:14:04]
对啊对啊对 。

**Rio** [1:14:05]
所以在唯一一个在写 blog 的时候 ， 我没有把它用 Vim。

**吴涛** [1:14:09]
对 。 啊 ， 就现在那个 Apple Flash 这个这个状态就是比如说我跟就把直接把这个这个 git repository 跟别人共享嘛 ， 就是把它加入那个 collaborator， 它就可以直接在那边写东西 ， 然后就可以发发布 。

它整个过程就很简单 ， 就是 git 上面添加一个新文件或修改一个文件 ， 然后那边产生一个呃呃这个 commit 事件 ， 然后 GitHub 发一个这个 hook， 那个 webhook 的请求到我的服务器 ， 我的服务器把那个改动 pull 回来 ，run 就跑一遍那个 post merge 的钩子 ， 然后在那钩子里面再跑一遍那个生成静态站点的程序 。

好 ， 这个过程就完成了 。 整个过程我不需要去接触命令行 ， 我也不需要维护 ， 我不需要维护 。

**Rio** [1:14:55]
End to end automation。

**吴涛** [1:14:56]
对啊对啊 ， 就感觉超爽现在 。

**Rio** [1:15:00]
你知道一个网站叫 DevOps Reactions。

**吴涛** [1:15:03]
不知道 。

**Rio** [1:15:04]
DevOps re devopsreactions.tumblr.com。

**吴涛** [1:15:07]
不知道 。

**Rio** [1:15:08]
你可以去看一下， 这上面有非常非常搞笑的 GIF， 呃 ，GIF 动画 ， 然后有一个就是呃

demonstrating end to end automation to new employees。

**吴涛** [1:15:21]
嗯哼 。

**Rio** [1:15:21]
然后对 ， 我现在把这个链接发给你 ， 然后你到时候我们一定要把这个贴在节目的呃链接里面 。 这这个非常精确的描述了一个不知道你的整个工作流程的人第一次听到你们的整个工作流程之后的感受 。

**吴涛** [1:15:38]
不 ，但是你你你有一点我觉得不得不承认 ， 就是我把这个整个这个 workflow 设置好之后， 就是你会哎 ， 就怎么讲 ， 就刚才如果如果我刚才为什么讲我不喜欢去跑命令行去生成一遍这个东西的一个最主要的原因哈 ， 就是因为它会添加一个叫做摩擦力 friction 在里面 ， 就会让我觉得哎 ， 还有一个步骤没跑完好吗 ？

如果我要反复去做这个事情就很麻烦嘛 。 但是一旦把这个东西整个流程自动化以后， 你不需要操心这种事情 ， 你就只需要去写或者去改 ， 你会很愿意去改它的这个 ， 比如改错别字 ， 改标点符号或者改一些模板上的小调整 ， 你会很愿意去做 。

因为整个事情就很简单 ， 你只用在 GitHub 上编辑一个打编辑一个页面保存就可以了 。 这样就是 。

**Rio** [1:16:26]
对 。

**吴涛** [1:16:27]
非常 frictionless， 非常 smooth 的一个过程 。

**Rio** [1:16:30]
对对 ， 这个词也经常被用于形容呃一个理想的软件发布流程的这么一个状态 ， 就是程序员只需要写好呃 。

**吴涛** [1:16:43]
Git push 就可以了 。

**Rio** [1:16:44]
写好一个测试 ， 写好一个功能 ， 然后只需要 commit push， 然后所有的一切都会自动的被部署 ， 自动的被测试 ， 自动的执行回归测试 ， 自动生成一个 nightly build， 然后告诉你软件是不是正常运行 。

**吴涛** [1:16:59]
你还能自动上线 。

**Rio** [1:17:00]
对 。

**吴涛** [1:17:01]
这个是最好 。

**Rio** [1:17:02]
对对 ，其实你的对 ，其实你写 blog 的过程非常像某种软件的发布流程 。

**吴涛** [1:17:08]
对对对 ， 就发布一个静态站点 。

**Rio** [1:17:13]
对 ，但我觉得其实这这也恰恰是一个门槛 ， 就是呃为什么换用 static site generator 的人都是程序员 。

**吴涛** [1:17:24]
因为太麻烦了 。

**Rio** [1:17:26]
因为程序员只有不怕麻烦的人才会搞这么麻烦的事情 。 呃或者反过来说 ， 我觉得普通人， 且不论普通人有没有这个动机 ， 呃普通人之所以不会用 ，不会去用这种 static site generator 的原因之一 ， 就是因为迄今为止没有一个呃 static site generator 支持所谓的所见即所得编辑吧 ， 还是有 ， 我只不过孤陋了 。

**吴涛** [1:17:55]
Generator 肯定是不可以 ， 如果你是 editor 肯定是有的 ， 之前那些什么 front page 那些就是 。

**Rio** [1:17:59]
或者说因为绝大多数 ， 你比如说我们刚才讨论的这几个 ， 嗯 ，Jekyll 呀也好啊 ，Middleman 也好啊 ，Pelican 也好啊 ， 还是 Hyde 也好啊 ， 还是包括我们没有提到的什么 Clay 啊 ， 什么 Hexo 啊这种 。

**吴涛** [1:18:13]
嗯哼 。

**Rio** [1:18:13]
其实每一个包括包括 Hugo 在内都只支持 markdown 或者是另外一种什么样的 ， 就是制标语言写成的半呃半原原代码式的呃文档 。

**吴涛** [1:18:27]
对对 。

**Rio** [1:18:28]
然后把它转转换成静态页面 。

**吴涛** [1:18:30]
嗯 。

**Rio** [1:18:31]
有没有一种生成器支持 ， 就是或者说是更小白友好的 ， 可以让用户通过某种方式 somehow some way 来写出这种所见即所得的东西呢 ？

**吴涛** [1:18:43]
这有有啊 ，tumblr。

**Rio** [1:18:47]
Tumblr 不是一个静态生成器啊 。

**吴涛** [1:18:49]
这这就是问题所在 ， 为什么小白用户他不懂这些 ，他为什么需要去区分什么是静态 ， 什么是动态 ， 它不根本没有关系啊 ， 对吧 ？

**Rio** [1:18:58]
好吧 ， 没有 。 我刚才想的是 ， 如果一定要一定有一位某位小白用户勇敢的听我们的节目 ， 然后想要去试一试静态生成器 ， 却苦于没有办法大概知道自己的网站跑起来是什么样子的话 ， 我觉得其实有一个比较好的方案 ， 就是用 Mo 之类的呃 markdown 编辑器来写 markdown。

**吴涛** [1:19:20]
嗯哼 。

**Rio** [1:19:20]
然后在 Mo 里面看到这个即时生成出来的基本上带了格式的这么一个预览 ， 然后在保存之后， 很多静态网站生成器都非常贴心的提供了即时预览功能 。

你如果有什么原代码 ， 如果你某一个源文件有修改 ， 它会自动把整个网站生成一遍 ， 然后在你的本地跑一个浏览器来把生成好的网站展现给你看 。

**吴涛** [1:19:48]
感觉有点 。

**Rio** [1:19:49]
其实这也算是某种意义上的我所见即所得了 。

**吴涛** [1:19:52]
感觉好绕啊 。 哎 ，不过刚你其实有一点我觉得很好哈 ， 就是呃普通用户用的话 ， 你刚才讲显然能去用 GitHub 做编辑器的人还是多少有点 geek fire 的哈 。

呃 。

**Rio** [1:20:07]
对 ， 你不能指望一个 。

**吴涛** [1:20:09]
普通人。

**Rio** [1:20:10]
一个刚刚 。

**吴涛** [1:20:10]
什么是 geek？

**Rio** [1:20:11]
不能指望某些人去用 ， 只会用这个 ， 只他能登录 WordPress 就不错了 ， 然后能在那个 WordPress 后台里面呃利用那个所见即所得的编辑器把自己的文章大概格式一下， 这已经非常不错了 。

你要强迫他去用 GitHub 这种东西 ， 让他理解什么叫 merge commit， 哈哈哈 ， 就还是太强人所难了 。

**吴涛** [1:20:35]
对对对 ，不过嗯 ， 这其实又反而变成了那个就是动态站点的一个强项哈 ， 就是你知道 WordPress 是有一个叫叫什么 publish 接口的 ， 就它有一个接口可以让第三方程序通过那个接口给它发布这个网站 ， 然后有个有个叫什么啊什么 。

**Rio** [1:20:58]
通过第三方接口 XMLRPC 吗 ？ 就是最开始的那个 。

**吴涛** [1:21:01]
对对对对 ， 就是 。

**Rio** [1:21:02]
XMLRPC 到 PHP 那个好多漏洞都是从那来的 。

**吴涛** [1:21:06]
对 ，不管 ，但是就是从我们先不讲它的底层实现漂不漂亮 ， 对 ， 它有这么个功能 。 然后很多人会比如说就刚才我们讲 ， 你如果静态网站生成的话 ， 你还是得在本地编辑一个 markdown 文件 ， 放进那个可对应的目录 ， 或者是你要在 GitHub 上编辑一个东西 。

你在这种事情在非 PC 或者 Mac 上是做不到的嘛 ， 你比如你在 Mac 手机上就很麻烦 ， 你在这个 iPad 上也做不到这件事情 。

但是如果你有那种像 WordPress 的接口的话 ， 你就你反而是可以做到这件事情的 。 你可以再用一个 app 嘛 ， 然后再编辑文章 ， 然后点 publish， 这才是对对这个普通用户友好友好的一个方式嘛 。

**Rio** [1:21:44]
我相信很多曾经的所谓呃 blog 呃 publisher software。

**吴涛** [1:21:52]
嗯哼 。

**Rio** [1:21:53]
也支持一键保存之后同时发布到多个 blog 平台 。

**吴涛** [1:21:58]
啊 ， 还有这还有 。

**Rio** [1:21:59]
其中就包括 WordPress。

**吴涛** [1:22:00]
还有这种事情 。

**Rio** [1:22:01]
这样的东西 。 对 ，blog 就是写 blog 用的本机软件 。

**吴涛** [1:22:06]
可是这样意义何在呢 ？ 一个人会同时写很多个 blog。

**Rio** [1:22:10]
对 ， 这就这种这种软件存在就没意义 ， 所以现在没有人用 ，也没有也没有再提起这种事 。 但是我是货真价实的用过这种东西 。

**吴涛** [1:22:19]
好吧 。

**Rio** [1:22:20]
而且当时非常黯然神伤的觉得我自己写的这个 blog 系统不能支持这种远程 API， 实在是太废了 。

**吴涛** [1:22:29]
对 ，其实如果你现在做一个这种接口也不是很复杂 ， 你把那个接口协议弄一下， 然后这边写一个那个什么 web server， 然后接收那个请求 ， 然后把那个请求做成一个文件放到本地目录 ， 然后再跑一遍 ， 你想来应该不是特别难的一件事情 。

**Rio** [1:22:46]
对 ，也可以做一个 Kata 是吧 ？

**吴涛** [1:22:48]
对 ， 又是一个又又是一个 Kata。

**Rio** [1:22:50]
Only problem is XML。

**吴涛** [1:22:52]
你可以用 JSON 嘛 。

**Rio** [1:22:54]
啊 。

**吴涛** [1:22:55]
还不错哈 ，但是你还得 。

**Rio** [1:22:57]
不错呀 。

**吴涛** [1:22:57]
但这个这个你得去说服那些呃第三方的呃那个 app 的 ， 就是叫什么写博客软件的作者支持你这个协议 ， 那是另外一回事情 。

所以最好还是实现一个既有的协议 ， 会比较兼容性好一点 。

**Rio** [1:23:13]
嗯哼 。

**吴涛** [1:23:14]
对 ，但是就从易用性来讲 ， 肯定那种是对普通用户呃更友好的嘛 。 但是这种事情我们肯定是不 care 的 ， 我们是谁 ？

我们不是普通用户 。

**Rio** [1:23:24]
哈哈哈

。 啊 ， 所以我们现在是要推荐一下所有对静态网站生成器的人， 呃所有对静态网站生成器感兴趣的人用一下 Hugo 嘛 。

**吴涛** [1:23:41]
嗯 ，其实我还不确定它真的是适合所有人 ，因为它那个没有插件这一点真的是挺大的一个局限的 。 但是它的模板 。

**Rio** [1:23:51]
我觉得对于喜欢折腾的人来说 ， 或者说对于有对于不管这个功能有没有用 ， 先要问这有没有这个功能的人来说 ，Hugo 可能并不是非常适合 。

**吴涛** [1:24:02]
对 ，而且它上手也不太容易 。 它的那个模板语言嘛 ，因为是用的 Go 的自带那个那个就 Go 的标准库自带的那个模板语言 ，也不是特别的 ， 没有名字 ， 就叫呃 HTML slash template。

**Rio** [1:24:19]
OK。

**吴涛** [1:24:19]
啊 ，但是它那个语法就不是非常 intuitive。

**Rio** [1:24:24]
情境什么 。

**吴涛** [1:24:25]
不 ， 语法比较简单 ，但是它那个数据那个 data model 比较比较奇怪 ， 可能不是不是那么直观吧 。 我觉得就特别是如果你习惯了像什么 Jinja 啊 ， 还有 Ruby 那些什么 leak 那些 template 的时候 ， 你再用这个可能会觉得有点奇怪 。

而且 Hugo 的 document 是稍微有点差的 。

**Rio** [1:24:46]
OK。

**吴涛** [1:24:46]
我用 。

**Rio** [1:24:47]
我想提议就是如果你只会这个 PHP， 就不要来碰 Hugo。

**吴涛** [1:24:51]
就我我我用那个纯粹就只是因为 AppleFOSS 的这个 ， 就是你到这个量级 。

**Rio** [1:24:58]
需求在那儿吧 。

**吴涛** [1:24:58]
对 ， 你到这个量级 ，其他的那些基于脚本解释脚本的生成器都是没有办法在几秒钟内搞定的嘛 ， 所以也只有这一招了 。

然后就是我我我我自从对爱上 Golang Go 这个语言之后， 对这个单个文件单个可执行文件即可部署这一点是非常的赞 ，因为我是一个很懒的人， 我不想去操作服务器 。

**Rio** [1:25:25]
嗯 。

**吴涛** [1:25:26]
虽然我一直 。

**Rio** [1:25:26]
爱上了原子化 。

**吴涛** [1:25:27]
虽然我一直在操纵各种服务器 ，但是我非常讨厌这一点 。 所以啊 ， 什么什么 。

**Rio** [1:25:33]
干一行恨一行非常正常 。

**吴涛** [1:25:35]
对 ， 什么依赖管理啊 ， 什么什么部署 ， 什么版本管理啊 ， 啊 not my style。

**Rio** [1:25:42]
对 ， 知道越多就恨越痛恨它 。 但是我觉得 Golang 这个特性可能也跟那个作者有关啊 ， 作者叫 Steve Francie 啊 ，他是就是我去搜这个 Hugo 这个工具的时候才知道作者原来就是大名鼎鼎的 spf13。

我知道这个名字最早是因为他的那个 The Ultimate Vim Distribution， 就是他在比较早的时候推出了一个就算是 Vim 的爱好者爱好者所做的这么一个多插件白金 Platinum 典藏版吧 ， 这种感觉 。

**吴涛** [1:26:20]
但是我一直不明白这个的 point 何在 ， 这种东西的意义在哪里 。

**Rio** [1:26:24]
呃 ， 它向你展示了一个大牛所定制出来的 Vim 能有多顶级 。

**吴涛** [1:26:31]
好吧 ，但是这样学习的成本好高啊 。

**Rio** [1:26:33]
对 ， 我曾经用过一段 ， 我曾经用过它一段时间 ，但是毕竟 Vim 这种 ， 如果你既然你是一个会敢于或者说已经沦落到要用 Vim 的人， 你肯定是一个需求非常特别 ， 非常没有一种所谓呃那个叫什么 stock version， 就是没有一个下从货架上直接拿下来的产品能够完全满足你需求的人。

**吴涛** [1:26:57]
嗯哼 。

**Rio** [1:26:58]
所以你肯定要把这个东西各种摆弄 ，而 spf13 摆弄出来的这么一个 Ultimate Vim 最多起到的作用是不是让小白能够更快的上手 Vim，而是让喜欢折腾的人可以看到这个东西怎么可以被折腾 ， 包括它组织这个 Vim 配置文件的方式啊 ， 包括它管理插件的方式啊 ， 包括它配置插件的方式啊 ， 包括它写的一些非常实用的小程序啊 。

**吴涛** [1:27:26]
嗯哼 。 所以它是一个什么标杆的作用 ，并不是让你让你直接真的去用这个这个东西本身 。

**Rio** [1:27:34]
我相信它还是希望有人能用的 ，但我我也觉得有如果真的有人会需要用到它所提供的那些所有功能 ， 那这个人绝对不会满足于就这么用这些功能 。

**吴涛** [1:27:47]
对 ， 一定会去定制 。

**Rio** [1:27:48]
有些有些拗口啊 。

**吴涛** [1:27:49]
对 ， 一定会手痒会去会去折腾它 。

**Rio** [1:27:52]
对对 ， 这个人毕竟他也是个很牛的人 ，他他是 MongoDB 的所谓 developer advocate， 就是我就什么呃怎么说 ， 死者代言人 ，是是一部科幻小说里面的呃 developer advocate， 呃开发者代言人， 然后 。

**吴涛** [1:28:12]
这就是那个什么 。

**Rio** [1:28:12]
搜了一下这个职位 。

**吴涛** [1:28:13]
Evangelist 的意思嘛 。

**Rio** [1:28:15]
对 ， 这个职位到底是什么意思 ？ 就是他是为本公司的开发者说话的这么一个人， 就是他会向外面的人宣称本公司的产品多么多么好 。

**吴涛** [1:28:26]
就忽悠 。

**Rio** [1:28:27]
然后你为什么 。

**吴涛** [1:28:28]
忽悠开发者的人。

**Rio** [1:28:29]
对对 ， 开发者大忽悠 ， 可以这么理解 。 但是能够做到这种位置的人基本上都非常牛了 。

**吴涛** [1:28:36]
嗯哼 。

**Rio** [1:28:38]
呀 。

**吴涛** [1:28:38]
对 ， 所以大家可以去尝试一下哈 ，但是痛苦程度啊 ， 你们我已经给你们打过预防针了 ， 你们自己想想清楚 。

**Rio** [1:28:47]
如果如果 PITA 指数 pain as 指数太高的话 ， 本站概不复制 。

**吴涛** [1:28:54]
哈哈哈 。 对 ， 啊 ， 所以你有兴趣把你的那个什么那个博客站点切过来吗 ？

**Rio** [1:29:02]
不 ，其实我其实我一直在想我要不要把 TypeScript 切到静态生成 。

**吴涛** [1:29:08]
它们还是在 WordPress 上面跑的 ， 对吧 ？

**Rio** [1:29:10]
对 ， 现在还跑在 WordPress 上 。

**吴涛** [1:29:12]
自己啊 。

**Rio** [1:29:13]
而且比较 ， 我就我这是安全问题 ， 我就不回答 。 有可能造成安全隐患 ， 真正答案是我不知道 。 嗯 。

**吴涛** [1:29:21]
肯定不是 4。

**Rio** [1:29:22]
我觉得 。

**吴涛** [1:29:23]
不是 ， 你就这个版本问题没有任何区别 ， 你就 WordPress 234 都是有安全漏洞的 ， 你你说出来又有什么关系 ？

**Rio** [1:29:31]
不 ， 我觉得最大问题可能是在迁移过程中会有很多什么图片啊 ， 乱七八糟的需要去 。

**吴涛** [1:29:38]
对对 ， 这是一个最最核心的 。

**Rio** [1:29:40]
绝对地址改成相对 ，因为呃我不知道你是怎么在你的 blog 或者说 AppleFOSS 是怎么在 blog 上插入图片的 ， 至少我是所有的图片都放在 Flickr 上 ，但是 Flickr 被国内封了 ，但我也无所谓 。

所以 。

**吴涛** [1:29:55]
嗯哼 。

**Rio** [1:29:56]
这对于我来说不是什么大问题 ， 我就把所有图片传到 Flickr 上， 然后用 Flickr 的共享功能得到那个把这个图片嵌入网址的一串 HTML， 然后把这串 HTML 嵌入到我的文章里面 。

**吴涛** [1:30:07]
嗯哼 。

**Rio** [1:30:08]
所有的文章 ， 所以我的文章基本上全都是天生可一致的 。

**吴涛** [1:30:11]
嗯哼 。

**Rio** [1:30:12]
但是如果你要把 WordPress 里面的文章导出来 ， 那就必然涉及到一个呃 asset management 的问题 ， 就是你要把这些 。

**吴涛** [1:30:20]
不需要那个 。

**Rio** [1:30:21]
图片放去哪 ？

**吴涛** [1:30:21]
你你传到 Word， 哎 ， 等一下，AppleFOSS 之前在 WordPress 的时候 ， 那些文章都是上传到 WordPress，有个什么 wp-content， 然后有一个 。

**Rio** [1:30:31]
对 。

**吴涛** [1:30:32]
Upload 还是什么 ？

**Rio** [1:30:33]
Images。

**吴涛** [1:30:34]
对 ， 一个 。

**Rio** [1:30:34]
Upload images。

**吴涛** [1:30:35]
对 ， 一个目录里面 ， 然后其实很简单 ， 你就保留那个路径嘛 ， 你在那个静态正点生成器 ， 它不是大部分都会有一个这个 static 或者是类似的这种 ， 或者 public 这种目录 ， 让你放那种不需要经过它处理 ， 你直接复制过去那堆文件嘛 。

你就把整个那个 wp-content，WordPress / wp-content， 然后 / uploads 这个目录复制过去就好了 ， 搞定 ，不需要做任何修改 。

**Rio** [1:31:00]
好吧 ， 那我和 Rex 商量一下 ，因为我相信现在的评论也已经被转到了 Discord 上， 所以评论 。

**吴涛** [1:31:09]
啊 ， 对啊 ， 我们没有讲这个评论 ， 这个要补充一下 。

**Rio** [1:31:12]
对 ，其实从动态网站迁移到静态网站生成器 ， 最大的两个问题我们刚才就已经都说到了 ， 一个是 asset management， 就是你之前上传的那些图片怎么办 ？

### 评论迁移

**吴涛** [1:31:23]
嗯哼 。

**Rio** [1:31:24]
另外一个就是你之前那些评论怎么办 ？

**吴涛** [1:31:26]
对对 。

**Rio** [1:31:27]
嗯 ， 所以你知道我怎么处理的吗 ？

**吴涛** [1:31:29]
但基本上已经都有 ， 你怎么处理 ？

**Rio** [1:31:32]
就不要评论了 。

**吴涛** [1:31:34]
哈哈哈 。 这个这个这个这个我我说出这句话 ，Lawrence 一定很高兴 。

**Rio** [1:31:40]
哈哈哈 ， 我可以理解 ，Lawrence 是这样的人。

**吴涛** [1:31:42]
对 。

**Rio** [1:31:43]
这是他的这是他的审美取向 。

**吴涛** [1:31:44]
而且而且我发现有这么一个问题 ， 就是之前 WordPress 那个评论是可以就是发到我们自己站点上面的嘛 ， 后来已经被那个叫什么 spam bot 自动化了 ， 就所有的最近因为 AppleFOSS 也有好长一段时间没有更新了嘛 ， 就最近一两年的新增评论就基本上全是 spam。

**Rio** [1:32:04]
嗯 。

**吴涛** [1:32:04]
所以就关掉就关掉呗 ， 我也已经无所谓 。

**Rio** [1:32:07]
对 ， 这种态度也是可以理解的 ， 就你作为一个内容的产出者 ， 如果你知道自己的内容足够 ， 你如果你对自己的内容足够有信心 ， 那么其实是不需要开一天到晚开着评论 ， 让一个莫名其妙的人可以非常通过非常极低的成本抢到沙发的 。

这真正想要跟你打交道的人会想方设法的把信息传达给你 。

**吴涛** [1:32:33]
对对 ， 我觉得 。

**Rio** [1:32:34]
那些不怎么想要告诉你的人， 那就那就不要发什么评论好了 。

**吴涛** [1:32:37]
对 ， 我觉得这个是很重要的一点 ， 就是要通过某种方法提高这个评论的成本 ， 这样可以才可以有效的降低那种所谓什么沙发啊 ， 板凳啊 。

**Rio** [1:32:48]
Spam，spam。

**吴涛** [1:32:49]
Spam 都不说 ，spam 那个是一个技术问题 。

**Rio** [1:32:51]
I don't like spam。

**吴涛** [1:32:53]
就现在其实嗯 ，有很多渠道可以给作者提出反馈了嘛 ， 比如说呃 Twitter 是一个渠道 ， 微博是一个渠道 ， 就再远古一点没有这些东西的时候 ， 你还可以写邮件 ， 对吧 ？

所以就是真正想要给你反馈 ， 想要跟你讨论是一个就是有这种正确姿态的人 ，他肯定会有各种方法找到你 ，但是你没有必要要把这个评论做得那么易用或者易读 。

而且反过来从这个用户的角度来讲 ，其实很多年以前那种各种什么网站也好 ， 还有什么呃博个人博客也好 ， 下面都有一个评论 ， 你就贴了个评论 ， 你也不大可能会记得回去看那个博主给你回复了什么 ， 对吧 ？

**Rio** [1:33:36]
呃 ，是吧 ， 我觉得还是跟目前沟通的渠道多起来有关 ，有有所关联 。 因为比如说我在德国有一个挺好的朋友叫做他的网名叫做问号鱼 ， 点问号鱼 ， 一定要加一个点 ， 点问号鱼 。

**吴涛** [1:33:52]
嗯哼 。

**Rio** [1:33:53]
他就是在我在读我的 blog， 从当时我在德国 ，他在中国 。

**吴涛** [1:33:59]
嗯 。

**Rio** [1:34:00]
呃读一直读到他也来德国念书 ， 然后后来我们两个在德国见面啊什么的 ， 这一系列都是通过他在我的 blog 上留言开始的 。

**吴涛** [1:34:09]
嗯 。

**Rio** [1:34:10]
所以当然这也许只是个例吧 ，因为我可能通过这种方式以这种方式认识的朋友就只有他一个人。

**吴涛** [1:34:16]
嗯哼 。 但这这肯定这也是一种一种方式 。

**Rio** [1:34:20]
不管怎么说 ，不管怎么说 ， 这种形式已经变得越来越不重要了 。

**吴涛** [1:34:25]
对 ，而且就是而且就现在基本上那种那种就是每个 site 的自己的那种评论功能都沦为了这个 spam 的战场嘛 ， 所以很多人就把它彻底关掉 ， 然后就像刚刚我讲的 。

**Rio** [1:34:37]
嗯 。

**吴涛** [1:34:38]
你要找到我很简单 ， 去社交媒体上 。

**Rio** [1:34:40]
对 。

**吴涛** [1:34:41]
那个找我或者给我发邮件 ， 然后邮件的话 。

**Rio** [1:34:44]
对 ， 只要你愿意找到我 ， 你总是可以找到我 。

**吴涛** [1:34:46]
对 ， 就邮件地址就在那个什么最顶上 ，其实也很简单的一件事情 。

**Rio** [1:34:50]
嗯哼 。

**吴涛** [1:34:51]
啊 ， 还有一个就是如果你确实想要评论的话 ，也有一些方法 ， 就国外的话有那个叫那叫什么来着 ？

**Rio** [1:35:00]
Discord 还是什么 ？

**吴涛** [1:35:01]
就是有个第三方的评论的支持的一个平台 ， 叫什么 ？

**Rio** [1:35:06]
对 ， 就是就是 Discord 嘛 。

**吴涛** [1:35:08]
Discord， 对吧 ？ 这个是一个 ， 然后上次我们讲键盘的时候也提到了那个 Stack Overflow 的创始人去后来做了一个叫 Discourse 的这么一个平台 ， 然后它可以说是一个增强版的 Discord， 就增强版的 Discourse 吧 。

就当你可以集中的去 ， 就作为你说作为这个内容的这个提供方也好 ， 还是内容的消费方也好 ， 你们都可以在一个统一的地方去完成这个评论和回复的功能 ， 就不是不要就不是像之前那种你可能上了五个博客站点 ， 你都留了评论 ， 你还得挨个去看 ， 这就显然太不用户友好了嘛 。

就对于真正想要跟你交流的人来讲哈 ， 所以这也是一个可以考虑的方法 。 然后他们的那个就很简单了 ， 就是你在你你的这个静态博客的页面上嵌入一个这个 Java 的脚本 ，JavaScript 的脚本 ， 然后这个 JavaScript 脚本会动态的生成啊一个一个一个这个评论的界面 ， 然后它可以写写评论之后就会直接发到那个像 Discourse 啊或者 Discord 这种第三方的评论平台上去啊 ， 这也是一种

玩法 。 不过我不知道国内有没有这种类似的东西啊 ， 好像因为国内这个哎环境不太好 。

**Rio** [1:36:20]
国内什么内在网站在网页上内嵌微博 。

**吴涛** [1:36:24]
环境不太好 ， 现在反而反而我觉得现在还基本上都是一个都是说你要在微博上给我留言 ， 然后你得先粉我 ， 对吧 ？

啊 ， 这种这种方式来做的其实也蛮好的 ， 这样粉丝数也上去了 ， 这个什么 spam 也控制住了 ， 大家都蛮开心的 ， 我觉得也是好事 。

**Rio** [1:36:42]
嗯 ， 对 ，而且国内也是很多还是有很多人在用什么新浪博客或者是 。

**吴涛** [1:36:48]
天呐 ， 真的吗 ？ 还有人在用 ？

**Rio** [1:36:51]
真的真的 。

**吴涛** [1:36:52]
还得很多 。

**Rio** [1:36:53]
QQ 空间 ， 对 。

**吴涛** [1:36:54]
博客大巴还在吗 ？

**Rio** [1:36:55]
QQ 空间 ，QQ 空间更是一站式体验 ， 你只要 QQ 登录了 ， 那你在上面干什么都是互动 。

**吴涛** [1:37:02]
那个那个都不叫博客平台 ， 那个是社交 。

**Rio** [1:37:04]
生态环境 ， 生态环境 ， 对 ， 生态环境还是差太多 。

**吴涛** [1:37:07]
对 ， 所以其实你说小白写博客 ， 那肯定上什么 Facebook 啊之类的写的 ，QQ 空间里面写的 。

**Rio** [1:37:16]
对 。

**吴涛** [1:37:16]
这才是正途 。

**Rio** [1:37:17]
我们讨论的东西有点还是有点太脱离现实 。

**吴涛** [1:37:21]
不不不 ，不脱离现实 ， 这个什么 our world is reality。

**Rio** [1:37:25]
哈哈哈 。

**吴涛** [1:37:27]
别人的世界都不是现实 。

**Rio** [1:37:31]
哈哈哈

。

**吴涛** [1:37:33]
接着接着嗑药去 。

**Rio** [1:37:35]
呃 ， 对 。

**吴涛** [1:37:38]
嗯 ， 行 ， 今天就这样 。

### 结尾

**Rio** [1:37:39]
嗯 ， 行啊 ， 差不多就这样了 。

**吴涛** [1:37:42]
感觉好乱呀这一期 。

**Rio** [1:37:45]
对啊 。

**吴涛** [1:37:45]
我上一期录的时候是深夜 ， 我觉得好像头脑不太清楚 ， 这一次又是深夜录的 ， 所以 。

**Rio** [1:37:52]
下次我们改白天好吧 。

**吴涛** [1:37:53]
嗯 ， 对 ， 下次尽量改个白天吧 。 但不管怎么说 ， 这一期完成了 ， 那希望大家能够喜欢 。 啊 ， 现在是 Zulu time， 啊百分之百分号 H 点百分号 ， 您正在收听或者正在反复一听再听的是内核恐慌 。

你看一档由我和 Rio 主持的 Podcast 节目 ， 今天您听到的是第三期 ， 我们讲的主题是静态网站生成器 。

呃 ， 我们目前已经改成了两周一期 ， 所以下一期的话将是两周之后还是星期天播出 。 呃 ， 感谢您的收听 ， 嗯 ， 就这样吧 ， 拜拜 。

**Rio** [1:38:38]
你

知道在 Go 里面就是就是格式化时间不是通过这种方式来实现的吗 ？

### Go时间格式

**吴涛** [1:38:49]
呃 ， 那是怎么实现的 ？ 它那个方法很很机智的 ， 就它规定了一个时间点 ， 就是一个特别的时间点 ， 然后你直接照着你想要的格式书写那个时间点就好了 。

你懂我意思吗 ？ 就是比如说你想要格式化是 200， 比如今年 2014 写横杠 ， 呃 ，10 月就是 10 杠 ， 然后 20， 然后杠几点几分 ， 对吧 ？

然后你就按你想你脑海中想象的这个格式 ， 把它给定的那个时间点给你写出来 ， 然后你用那个作为一个格式串去 format 的那个字符 ， 那个格时间就可以变成你想要的格式 。

**Rio** [1:39:27]
问题在于那个 format 的字符串要怎么写 ？ 你刚才说的是你有一个知道的时间点 ， 然后你要把这个知道的时间点格式化成某一个特定的时间 。

**吴涛** [1:39:38]
不对不对 ， 就是 。

**Rio** [1:39:38]
某一个特定的格式 。

**吴涛** [1:39:39]
你你现在的问题就是你有一个任意时间的一个一个一个 daytime 的一个一个一个变量嘛 ， 你要把它变成一个叫什么 ， 呃 ， 一个字符串嘛 ， 对吧 ？

然后这个字符串你你是心目中是有一个指定的格式长的样子的 ， 然后它在我们比如说 C 系的或者像 Python、Ruby 这些语言也好 ， 就是你有一种那种就是 placeholder 嘛 ， 刚才我们讲的百分号 H、 百分号 M 这种方式来指代某一种类型的时间的字符串的形式 ， 对吧 ？

**Rio** [1:40:11]
对 。

**吴涛** [1:40:11]
然后但是 Go 里面它就说啊 ， 那个太麻烦 ， 太不直观了 ， 比较难难难 ， 你你得还去查手册怎么怎么看 。

这个呢 ， 你只要记住一件事情 ， 就是你记住一个时间点 ， 就是 2006 年 1 月 2 号的 3 点 4 分 5 秒这个时间点 ， 然后你用你希望的那个格式把这个时间写出来 ， 就这样成一个字符串 ， 对吧 ？

然后你把这个字符串作为这个格式化你任意时间的字符串 ， 它就得到你需要的那个格式了 。

解释 。

**Rio** [1:40:48]
可是他怎么知道这个没有解释清楚 ， 就是他怎么知道这个字字符串里面的哪一部分是需要被用目标时间替换掉的呢 ？

**吴涛** [1:40:56]
所以你听刚才我讲那段是 2006 年 1 月 2 日 34 分 5 秒嘛 。

**Rio** [1:41:04]
嗯 。

**吴涛** [1:41:05]
你看就是每一个都是独特的字 ， 每一个都 。

**Rio** [1:41:10]
我大概理解了 ， 就是你在这里面你给了一个样例字符串 ， 然后它可以自动的 somehow 智能推导出这里面哪一部分是哪一个时间 。

**吴涛** [1:41:19]
对对对 。

**Rio** [1:41:19]
是是哪一个时间 。

**吴涛** [1:41:21]
对 。

**Rio** [1:41:21]
可是现在的问题是我比如说我要实现这么一个功能 ， 每当你每当你执行到这一个语句的时候 ， 它就会呃打印出当前时间 。

**吴涛** [1:41:33]
嗯哼 。

**Rio** [1:41:34]
然后当前时间必须是现在是几几点几几分 。

**吴涛** [1:41:38]
嗯哼 。

**Rio** [1:41:39]
应该怎么实现呢 ？

**吴涛** [1:41:40]
你就你这你这当前时间你是只是取 now 那个函数嘛 ， 对吧 ？ 你就是 now 那个函数得到当前时间的一个变量 ，但是这个变量它的内部是一个比如说一个整数来表示 ， 从一个 Unix time 的方式来表示 ， 举个例子 ，但是它跟它怎么格式化这个过程并没有关系啊 ， 你还是用这个方式来格式化嘛 。

比如说你知道当前是比如说你要 10 点 10 分的话 ， 你就你就写个呃我看 3 分 4 秒 ， 就是 03 冒号 04 就可以了 。

你可以看一下它那个那个那个实现那个那个实现方式非常神奇 ， 很很不一样 ， 跟就这个好像是我只有在这里面见过这种实现方式 ， 就 Go 里面这种方式来实现 ，其他的都是用那种 placeholder 的方式来实现的 。

**Rio** [1:42:26]
这么说我们我在那个咱们已经咱们我现在停录吧 ， 这段应该没有办法录进去 。

**吴涛** [1:42:32]
录进去没关系 ， 等 lower 时期剪就好了 。

**Rio** [1:42:35]
OK， 好 ， 我给你发一段那个 format 字符串 ， 你你就最简单的方法就是你把这一段 Python 代码转换成 Go 的方式告诉我 ， 叫 Go 怎么写出来 。

**吴涛** [1:42:47]
好啊好啊 ， 你你你把它打给我 。

**Rio** [1:43:03]
嗯 ，sky。

嗯

， 现在 。

**吴涛** [1:43:12]
啊 ， 就是这样 。

**Rio** [1:43:15]
嗯哼 。

**吴涛** [1:43:16]
啊 ， 我自己就引破那句语句我就不写了哈 ， 就是我就直接写了 。

**Rio** [1:43:19]
嗯哼 。

**吴涛** [1:43:21]
Time 点 now 点 format。

你懂我意思了吧 ？

**Rio** [1:43:40]
可是他怎么知道这不是 03 04 分而不是 03 04 秒 ，03 分 04 秒 ？

**吴涛** [1:43:44]
因为它的那个指定时间是这个 。

就是这里面的 3 和 4 就是对应的是 3 分钟 34 分嘛 。

**Rio** [1:43:59]
所以这里面每一部分都必须是独一二的 。

**吴涛** [1:44:02]
就这个它的那个指定的那个时间是选特别巧 。

**Rio** [1:44:06]
我现在明白了 。

**吴涛** [1:44:07]
对对对 ， 就非非常巧妙 。

**Rio** [1:44:09]
就等于选一个选一个 standard format， 然后让这个每一个 standard format 都具有独一无二性 ， 然后 。

**吴涛** [1:44:15]
对 ， 你总能找 。

**Rio** [1:44:16]
然后它可以自动通过通过这个 format 来推导出 。 我靠 ， 这是这算 over engineer 了吗 ？

**吴涛** [1:44:23]
不 ，但是你不觉得这个很直观吗 ？ 不需要看 ， 就是你只需要记这个 ，而且这个很好记 。

**Rio** [1:44:28]
这个我觉得 。

**吴涛** [1:44:29]
这个很好记嘛 。

**Rio** [1:44:30]
我觉得第一次看到这个肯定会非常晕的 。

**吴涛** [1:44:33]
对 ， 我我第一次看的时候我就觉得哇 ， 这个这什么好奇怪啊 ，但是用过几次之后发现哇 ， 每次都不需要去查手册 ， 超好 。

**Rio** [1:44:43]
好吧 ，也许真的是如同所有所有向我这个传 Go 浪福音的人说的一样 ，Go 浪真的是一个经过深思熟虑的 ， 需要解决切实问题才发才发明出来的东西 。

也许这种方式解决切实问题 ， 切实的问题的确比较好 。

**吴涛** [1:45:02]
对啊 ， 我就我觉得这个 。

**Rio** [1:45:03]
好 ， 下次我可以说 ， 下次我就可以随便说了 ， 现在是现在是呃 GMT 格林威治标准时 1 点 54 分 48 秒 。

呃 ， 您现在收听到的是 whatever。 好了 ， 这期节目就这样吧 。 拜拜 。

**吴涛** [1:45:24]
拜拜 。

**Rio** [1:45:25]
我暂停录了 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
