# 33. 没有主题的闲聊

内核恐慌 · 2016-01-10

<https://lib.pan.icu/12a87d8e-293d-4a08-8cbd-9863d16ffcca>

本集闲聊中，两位主持人讨论了编程中命名困难与概念负债，以Fira Code字体连字特性为例说明工具对代码风格的影响。IPN全站启用HTTPS，并改用Let's Encrypt自动签发证书，Rio还为此用Go编写了并发ACME客户端，10秒内完成验证。回顾了2002与2015年开发者桌面截图对比，观察工具演变。吐槽了Rockchip硬件日历bug让11月有31天，以及IE 8/9/10于2016年1月12日停止支持对中国政府网站的影响。最后提到Debian创始人Ian Murdock去世与Neovim的终端模式特性。

## Questions this episode answers

### Linux 内核提交中提到的 Rockchip 日历缺陷是什么？

Rockchip 日历缺陷是指其芯片硬件时钟错误地将 11 月设为 31 天。Linux 内核提交说明里，Julius Werner 幽默地将其比作教皇格里高利十三世的历法改革，指出格里历花费 300 年才被全球接受，而 Rockchip 的改动可能也需要类似漫长的时间。为此，内核中加入了补丁，让芯片时钟能与真实格里历协调工作。

[47:04](https://lib.pan.icu/12a87d8e-293d-4a08-8cbd-9863d16ffcca?t=2824000)

### 为什么命名事物被认为是计算机科学中最难的问题之一？

Rio 和吴涛在节目中讨论，命名直接影响程序员的 mental model 和架构清晰度。吴涛引入概念债（conceptual debt）概念，解释不当的命名会导致整个系统概念脆弱难解。他们举例说明，如将所有内容都命名为 “node” 则过于抽象，而像 PHP 函数名那样混乱的命名则会加剧理解负担，最终损害软件质量。

[3:33](https://lib.pan.icu/12a87d8e-293d-4a08-8cbd-9863d16ffcca?t=213000)

### Fira Code 字体如何通过连字改善代码可读性？

Fira Code 是一款基于 Fira Mono 的等宽编程字体，它利用 OpenType 的 ligature 特性，将常见的多字符运算符（如 ==、!=、=>）显示为数学中连贯的单一符号。吴涛解释，这需要字体本身包含连字字形且排版引擎支持，目前它在 Terminal.app 和 MacVim 中可以工作，但 Item2 等终端暂时不支持。

[31:04](https://lib.pan.icu/12a87d8e-293d-4a08-8cbd-9863d16ffcca?t=1864000)

### Neovim 的终端模式是什么，有什么优势？

Neovim 的终端模式允许在编辑器内直接嵌入一个终端 buffer。吴涛介绍，该模式提供插入（正常终端输入）和普通模式（Vim 键绑定）两种状态。在普通模式下，使用者可以用 Vim 的快捷键选择、复制终端输出，无需借助系统剪贴板，这解决了在传统终端和 Vim 之间切换复制结果的繁琐问题。Rio 调侃其为 Emacs 邪教路线，但吴涛认为这比传统方法更高效。

[22:22](https://lib.pan.icu/12a87d8e-293d-4a08-8cbd-9863d16ffcca?t=1342000)

## Key moments

- **[0:00] 新年闲聊**
  - [0:29] 计算机科学只有两件难事：缓存失效与命名（cache invalidation and naming things）
  - [0:55] 因北极气压带控制，欧洲今年圣诞节无雪，Rio去奥地利滑雪
  - [1:41] 欧洲缺雪，网上流传‘今年第一个雪人’照片实为两个水坑插着胡萝卜
- **[3:25] 命名之难**
  - [3:33] 命名不当会形成概念债务（conceptual debt），影响程序架构的清晰度
  - [4:04] 技术债务（technical debt）就像水槽里堆满的脏盘子，不清理就越积越多
  - [5:07] 命名方式塑造了开发者的心理模型（mental model），糟糕的命名会误导设计
  - [6:12] 国内程序员因英文不好常写出命名混乱的代码，加剧概念债务
  - [7:59] Java编程中的‘名词王国’（Kingdom of Nouns）现象，导致类名过度抽象
  - [9:55] 缓存失效是计算机科学难题，因为很难判断缓存内容何时真正无效
- **[10:53] 法语键盘**
  - [11:00] 分布式系统笑话：两个难题是消息顺序和仅发送一次，但说了三遍
  - [12:11] 听众反馈：法国程序员因怕编码问题使用无重音的法语注释，法语键盘缺乏括号等符号
  - [16:44] FFMPEG的作者是法国人，吴涛戏称不要使用法国程序员写的程序
- **[17:48] 桌面今昔**
  - [17:54] 开发者收集了2002年和2015年Unix大牛的桌面截图对比，发现工具类别变化不大
  - [20:14] Rio认为过去13年间编程工具类别没有根本性变化，但个人对Vim的掌握精进
  - [21:26] Brian Kernighan如今使用OSX，被视作一种讽刺
  - [22:39] Vim的作者Bram Moolenaar用Vim直接编写原始邮件，通过命令行发送
- **[26:13] CDN 劫持**
  - [26:13] IPN网站因DNS攻击和CDN劫持导致音频下载失败，后通过全站HTTPS解决
- **[30:34] 连字字体**
  - [30:44] 等宽字体Fira Code利用连字（ligature）将编程符号显示为数学符号
  - [32:05] 中文里的‘招财进宝’合字可视为连字的一种，常用于西文排版的美观
  - [35:41] 因显示和输入的限制，程序员用<=代替≤等符号，形成了编程约定
  - [38:13] 使用编程连字需要字体和排版引擎同时支持，多数终端模拟器尚不支持
  - [41:05] 测试发现macOS自带终端应用支持Fira Code连字，但iTerm2不支持
  - [42:42] Rio曾用Vim的conceal特性将Python关键字显示为符号，如def变成λ
- **[46:09] 日历芯片**
  - [46:20] Rockchip芯片的日历模块误将11月设为31天，内核补丁注释幽默提及格里历改革
  - [49:48] 吴涛 vs Rio：拳头数月份简便 vs 凯撒奥古斯都故事更精确
  - [52:33] Q: 有什么方法可以在 O(1) 时间复杂度下计算整数阶乘？
  - [55:00] Rockchip是福建的低端平板芯片厂商，与英特尔合作推出廉价Atom平板
  - [56:59] 吴涛认为Rockchip的缺陷损害了中国制造声誉，Rio则指出德日制造也曾经历劣质阶段
- **[1:01:28] 窗口管理**
  - [1:01:28] macOS上的Kwm是一个平铺窗口管理器，具有焦点跟随鼠标特性，类似Linux的i3
  - [1:04:51] 焦点跟随鼠标（focus follows mouse）功能允许鼠标经过窗口时自动激活，无需点击
- **[1:09:21] IE 终结**
  - [1:09:21] 2016年1月12日起，微软停止对IE8、9、10的安全支持，仅维护IE11和Edge
  - [1:12:06] 吴涛吐槽中国政府部门网站仍要求使用IE6和800x600分辨率，日期控件设计反人类
  - [1:17:34] 加拿大和英国政府网站通过重设计提升了可用性和现代感，采用专业设计团队
  - [1:19:59] Neovim的terminal mode允许在编辑器内嵌入完整终端，利用同一窗口操作
- **[1:20:06] Neovim 终端**
  - [1:22:28] Neovim的终端模式通过模拟器将输出映射到Vim buffer，可在normal模式和插入模式间切换
- **[1:27:55] 创始人离世**
  - [1:28:06] Debian创始人Ian Murdock因遭遇警察暴力后自杀身亡，他在推文中控诉警察
  - [1:30:17] Ian Murdock在最后推文称自己年薪160万美元、受过良好教育，却被警察殴打
  - [1:33:39] 美国警察因反恐和枪支泛滥已军事化，吴涛提醒在美听众遇警察要小心
  - [1:35:42] 人生没有save/load，不能像写程序一样处理edge case，一次错误可能导致系统崩溃
- **[1:38:37] 证书自动化**
  - [1:38:37] Rio用Go语言重写了ACME客户端，以并发方式自动从Let's Encrypt获取SSL证书
  - [1:40:26] 新的ACME客户端支持同时验证多个域名，将证书生成时间从几分钟缩短到10秒内

## Speakers

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

## Topics

字体, 安全, 科技政策

## Mentioned

Rockchip (company), Dewey (product), Fira Code (product), Hasklig (product), IE (product), Kwm (product), Let's Encrypt (product), Macvim (product), NeoVim (product), Pragmata Pro (product), Star SSL (product), Terminal.app (product), Vim (product), i3 (product), iTerm2 (product)

## Transcript

### 新年闲聊

**Rio** [0:00]
欢迎收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。 我们号称 "hardcore"，但是也没有干货 ， 想听人听 ，不想听的人就别听 。

本节目的网址是 kernelpanic.fm， 我们推荐大家使用 Podcast 客户端订阅节目 ， 详情请访问 ipn.li/faq。 欢迎你为本节目捐款 ， 捐款地址是 kernelpanic.fm/donate。

捐款金额随意 ， 只要是 8 的正整数位就可以 。 捐款不会为你带来什么 ，不捐也不会让你失去什么 。

我们的口号是 ： There are only two hard things in Computer Science: cache invalidation and naming things.

**吴涛** [0:38]
那个 ， 欢迎回来哈 ， 你 。

**Rio** [0:40]
新年快乐 ！

**吴涛** [0:41]
去哪了 ？ 这有点晚 ， 新年已经过完了 。

**Rio** [0:44]
啊对 ， 我和女朋友去奥地利滑雪了 。

**吴涛** [0:48]
奥地利 ？

**Rio** [0:49]
对 ，因为德国没有雪 ， 今年特别特别暖 。

**吴涛** [0:52]
OK， 所以那个 global warming 是真的哈 ？

**Rio** [0:55]
呃 ， 我看了一下， 好像是因为 ， 呃 ， 什么原因来着 ，是因为今年北极的一个什么气压带控 ， 将太多的冷气流控制在了北极 ， 导致冷风没有南下， 所以 。

**吴涛** [1:15]
圣诞当然没有来 。

**Rio** [1:16]
整个欧洲 ， 对 ， 整个欧洲都没有雪 。 然后圣诞节那几天 ， 网上传的图片 ， 照片就是 ，因为德国南部基本上每年你可以有一定的几率碰上白色圣诞节 ，但是今年是完全没有可能 ， 所以网上就有什么图片说 " 今年我的第一雪人 "， 然后照的是地上两个水坑 ， 上面一个水坑插了个葫芦 ， 今年我的第一雪人。

然后奥地利稍微好一点 ， 今年的那个 ， 呃 ， 叫什么 ， 高山速降滑雪的锦标赛在

奥地利和意大利举行 ， 应该是 ， 然后他们 1500 米以上稍微有点雪 ，但是大部分的场地还是需要人造雪 ， 就很碎啊 ， 就滑雪的时候看周围全都是绿色的 。

**吴涛** [2:05]
OK， 哎呀这个还好啦 ， 你想想这个什么澳大利亚人。

**Rio** [2:09]
澳大利亚冬天可以滑呀 ， 奥 。

**吴涛** [2:12]
不不 ， 我说澳大利亚人过圣诞节 。

**Rio** [2:14]
啊对 ，他们穿着比基尼 ， 戴着圣诞帽 ，在沙滩上用沙子堆一个 ， 堆一个 ， 堆一个 。

**吴涛** [2:21]
杀人。

**Rio** [2:21]
杀人。

**吴涛** [2:22]
Snowman.

**Rio** [2:23]
Mr. Sandman.

**吴涛** [2:25]
这个不错 。OK。

**Rio** [2:27]
呃 ， 还是加拿大好呀 ， 滑雪 。

**吴涛** [2:30]
加拿大 ， 对 ， 加拿大还是一如既往的雪多哈 。

**Rio** [2:33]
嗯 。 你呢 ， 你干了什么 ？

**吴涛** [2:37]
我没干什么 。

**Rio** [2:38]
做两期节目 ， 对 。

**吴涛** [2:39]
对 。

**Rio** [2:40]
请了嘉宾做两期节目 。

**吴涛** [2:42]
你去度假了吗 ？ 我还在这干活是吧 。 咱们总得有一个人在这盯着嘛 。

**Rio** [2:46]
嗯 ， 这叫敬业 。

**吴涛** [2:51]
好吧 。 呃 ， 行 ， 那个我们就开始这期的正题 ，其实这期也没什么正题哈 。

**Rio** [2:58]
对 ， 这期 ， 对 ， 又是所谓没有主题的闲聊 ， 我们决定每一期没有主题的闲聊都叫没有主题的闲聊 。

省去了想名字 。

**吴涛** [3:08]
那不然你还能想出别的什么名头出来 ？

**Rio** [3:11]
哈 ？

**吴涛** [3:12]
就不然你还能想出什么别的 ， 别的这个 title 出来吗 ？

**Rio** [3:15]
对 ， 如果你其实如果愿意的话 ，也可以像 IT 公论那样找一个每期金句做 title 嘛 ， 对吧 ？

**吴涛** [3:23]
你这是暗示我每次都没有主题是吗 ？

**Rio** [3:25]
哈哈哈 ，you got it。 但是就像我们刚才的口号说的 ， 这个在计算机科学里面 ， 呃 ， 命名东西是非常非常难的 。

### 命名之难

**Rio** [3:33]
有时候 ，有时候你要在 ， 就不只是节目了 ， 就你有时候命名一个类 ， 然后稍后你会发现这个名字是不恰当的 ， 然后你是改还是不改 ， 改就非常麻烦 ，但是不改又觉得不爽 。

**吴涛** [3:50]
哎 ， 刚好前几天看到一篇文章哈 ，他说这个 ， 我们过去有个概念叫做这个 technical debt 嘛 ， 就是技术 。

**Rio** [3:56]
对 ， 技术负债 。

**吴涛** [3:57]
负债 ， 对 ， 就是你之前做了一些什么 ， 你之前挖了多少坑 ， 然后最后自己踩进去了 ， 对吧 ？

**Rio** [4:04]
对 ， 我们公司 ， 呃 ， 我前公司的墙上挂着一副 ， 就是一个水槽里面堆了可能几千个脏盘子 ， 说这就是 ， 这就是 technical debt， 然后你要是 ， 你要是不洗的话 ，他们就会一直堆在那 。

**吴涛** [4:19]
OK， 然后我之前看到一篇文章 ，他说这个除了这个 technical debt 之外， 还有一个叫做 conceptual debt。

**Rio** [4:26]
Conceptual debt。

**吴涛** [4:27]
概 ， 概念负债 ， 什么意思 ？ 他讲的大概就是说 ， 刚才讲的 ， 你刚才不是讲 naming things， 就是给东西起名字嘛 ， 这个其实会 ， 如果起得不好的话 ， 就会形成一个所谓的 conceptual debt， 就是概念负债 。

什么意思呢 ？ 比如说你一个类的名字 ， 或者一个变量 ， 或者一个方法的名字起得不好 ， 然后碰巧整个程序的其他地方又是基于这个概念去构建起来的 ， 这样的话就会对你整个后面的那些概念造 ， 就整个这个架构就变得不清晰 ， 就很难理解嘛 。

**Rio** [4:59]
对 ， 它会影响你的这个 mental model， 就你把那个东西的 ， 你使用的称谓会影响你的思维 。

**吴涛** [5:07]
对 ，而且它会 ， 就你选择的一个词 ， 一个叫法 ， 它会直接影响到你在你的大脑中怎么去理解这个整个架构 ， 整个它的概念在整个架构中所处的一个什么样的位置 ， 甚至说如果你选择那个基石型的概念 ， 选择这个不好 ， 会导致你整个 ， 整个上层架构是一个比较 ， 呃 ， 脆弱的 。

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

**吴涛** [5:30]
啊 ， 然后我就不禁想起这么一个事儿哈 ，因为你知道 ， 毕竟我们这个国产的程序员们很多人这个英文都不好嘛 ， 然后这个写程序又被逼无奈要用这个英文 ， 又不能用拼音 ， 对吧 ？

**Rio** [5:45]
Not necessarily，不过 。

**吴涛** [5:47]
呃 ， 对 ，但是 ， 就是这样的一个逻辑嘛 ， 大致上我们是认同这种做法的 ，但是你会发现 ， 照这个逻辑推演下去 ， 然后又有这个叫做 ， 呃 ，conceptual debt 这么一个概念的话 ， 那一个必然的结论就是 ， 很多人写的这个 naming things， 就是这个起名都是错的 ， 或者是有点混乱的 。

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

**吴涛** [6:12]
啊 ，有多少人的这个什么 CMS 里面 ， 一个叫做 post 的东西 ， 代表了不止一个含义 ？

**Rio** [6:21]
呃 ， 这个的确是 ，但是反过来有 ， 就是如果你走一个另外一个极端 ， 那就真让我想起来另外一个极端 ， 就是有些 CMS， 我说 DRUPAL 吧还是什么 ， 它把所有东西都叫做 node， 就是 ，node 就代表了它是这个 CMS 里面管理的一个节点 ， 然后这个节点可以是任何东西 ， 可以是 post， 可以是 article， 可以是一个 start page 之类的 ， 然后你又会觉得这个命名又太抽象了 。

**吴涛** [6:52]
对 ， 所以说这个一定是一个 ， 呃 ， 就是它如果太抽象的话 ， 它也是一个没有起好名字的一种表现嘛 ， 或者说是一种形式的 technical debt， 就是 ， 啊 ， 太抽象以至于没有什么实际意义 。

**Rio** [7:08]
对 。

**吴涛** [7:09]
对 ， 所以真的你去读那些 ， 啊 ， 所谓那种大牛写的代码 ， 你会发现它在整个概念上是非常清晰 ， 然后结构是非常这个 ， 呃 ， 就是概念非常清楚嘛 ， 定义清楚 ， 然后结构也是非常清晰的 ， 然后你再去看一些这种 ， 呃 ， 二三流的程序员写的代码 ， 你会发现你别怎么 ， 这个概念这一会儿在那出现 ， 一会儿在这出现 ， 就是搅不清

楚嘛 。 所以我在想就是说 。

**Rio** [7:36]
方法命名也没有什么统一性 。

**吴涛** [7:38]
没错 ， 没错 ， 然后包括什么 ， 可能很多这个国内的同志们 ， 啊 ， 特别是写什么 ， 啊 ， 这个 Java 类的吧 ， 或者那种 class 类型的 ， 要有种特殊的那种语法 ， 你知道吧 ， 就是 ， 啊 ，the non-kingdom， 就是名词王国 。

**Rio** [7:58]
啊 ， 没错 。

**吴涛** [7:59]
要什么 executor 啊 ， 什么 。

**Rio** [8:02]
一定要叫 executor。

**吴涛** [8:03]
Challenger 啊 ， 对 ， 一定要这样起的话 ， 然后你会发现很多人就会 ， 然后又会牵涉到一个什么主动式被动式 ， 对吧 ？

一个什么 executor 啊 ， 然后 executee 啊 ， 举个例子哈 ， 你会发现 ， 呃 ， 好像开始有点不太对路了 。

**Rio** [8:19]
这个是 。 这个怎么说呢 ， 这个可以追究根源的话 ， 可以追究到 ， 呃 ， 面向对象的一些弊端上面 ， 就是 ， 你做类的话 ， 你总是 ， 这个因为类嘛 ， 它终究是一个实体 ， 然后这个因为在面向对象的 ， 就如果一个是纯面向对象的语言里面 ， 方法是不能独立存在的 ，也就是说名词是一切 。

**吴涛** [8:43]
这里肯定要纠正一下， 这不是面向对象 ，是面向类 ， 就是 class-oriented program。

**Rio** [8:47]
啊 。

**吴涛** [8:49]
就是狭义的 ， 或者说更精 ， 更那个什么 ， 更明确定义的 object-oriented，其实不一定要 。

**Rio** [8:55]
Prototype 也不允许方法单独出现 ，也可以不允许方法单独出现 。

**吴涛** [9:01]
嗯哼 。

**Rio** [9:02]
不是吗 ？

**吴涛** [9:04]
呃 。

**Rio** [9:07]
或者这么说吧 ，在 ， 呃 ， 函数不是一级成员的语言里面 ， 这是一个常见的问题 。

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

**Rio** [9:16]
可以这么说吧 。

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

**Rio** [9:18]
对 ， 然后这个就 ， 好吧 ， 这跟 OO 没有什么太多关系 。

**吴涛** [9:22]
Anyway， 说回这件事儿哈 ， 就是说 ， 呃 ， 起名字是一门很大的学问 ，不要小看 。

**Rio** [9:28]
没错 。

**吴涛** [9:28]
然后如果你觉得你起的名字不好 ， 可能要先怀疑一下是不是自己的语文水平不太够 。

**Rio** [9:34]
嗯 ， 或者你本身就是一个非常愚蠢的 idea， 比如说 PHP 函数名。

**吴涛** [9:42]
又黑 。

**Rio** [9:43]
我发现我们每当需要举反面教材的时候 ， 这个 ， 这个 。

**吴涛** [9:47]
你总会拿出这个 。

**Rio** [9:48]
我觉得 Java 总是非常丰富的资源 。

**吴涛** [9:54]
好吧 。

**Rio** [9:55]
OK。

**吴涛** [9:55]
所以刚才讲两个 hard things 啊 ， 刚才讲一个 naming things， 然后另外一个 cache invalidation， 为什么它是 hard things？

**Rio** [10:04]
呃

，因为很难判断什么时候这个 cache 才是真的 invalidated。 这个 ， 呃 ， 我觉得原作者说这句话的时候 ，他只是想要说一个 ，他其实就是想强调这个命名非常难 ， 然后他举了一个比较 ， 呃 ，well-known 的难题 ， 就是 cache invalidation。

因为你实现一个 cache 的时候 ， 你永远不知道这个里面的内容是不是真的已经不需要被 cache 了 。

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

**Rio** [10:36]
这个牵扯到的因素太多了 ， 所以 ， 所以它是一个知名的难题 。 但是 naming things， 至少这个人在说这个 ， 这谁说的 ？Phil 什么谁说的 ， 然后他在说这句话的时候 ， 这还不是一个 ， 就是 。

**吴涛** [10:53]
就是说都知道 。

### 法语键盘

**Rio** [10:54]
即便现在 ， 仍旧不是一个被广为接受的一个难点 ， 就是大部分人会觉得我靠 ， 起名字有什么难的 ？Full bar 嘛 。

**吴涛** [11:03]
对吧 ？

呃 ， 没错 。其实还是挺难的 ， 我觉得 。

**Rio** [11:09]
对 ， 然后由这个格言衍生出来了很多变种 ， 比如说什么 ， 呃 ，在分布式系统里面 ， 呃 ，有两件知名的困难 ， 呃 ， 一个是 ， 哦 ， 第二个是 ， 呃 ， 确保每个消息只出现一次 。

第一条是 ， 呃 ， 确保所有的消息按顺序到达 ， 第二条是确保所有消息只出现一次 。 你得到这个梗了吗 ？

就是他把难题说了三遍 ， 对不对 ？ 他说只有两个难题 ，但是他说了三个 ， 然后其中前两个的顺序是反的 。

**吴涛** [11:48]
然后， 然后还重复 deliver 了一下 。

**Rio** [11:51]
对 ， 没错 。

**吴涛** [11:53]
嗯 ， 这个是 Matthias Verraz，是吧 ？ 是这么念吗 ？

**Rio** [11:58]
Matthias Verraz。

**吴涛** [11:59]
What？

**Rio** [11:59]
是谁啊 ？ 不知道是谁 。Someone。

**吴涛** [12:04]
Whatever.

**Rio** [12:05]
Yeah。

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

**Rio** [12:07]
其实这里可以插一个那个听众反馈 。

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

**Rio** [12:11]
呃 ， 这是我在休假的时候收到的 ，也过去一阵子了 ， 这是 12 月 21 号 ， 哇 ， 我圣诞节前呢 。 呃 ，Hi Rio， 吴涛 ， 好久没给你们写反馈了 。

话说本期中， 应该是 29 期 ，wait a second， 啊 ，30 期 。

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

**Rio** [12:28]
呃 ， 话说本期中吴涛久违的黑法国了 ， 今天我来助攻吴涛 。 本期中两位讨论到需不需要用英语来写代码的问题 ， 我和吴涛一样看到法语注释就头疼 。

正常来说看法语注释不顺畅 ， 应该怪自己法语还不够好 ，但法国人也是各种槽点大 ，他们不喜欢用英语来写代码 ，但是又怕带 accent 的那个法语字母 ， 就是什么 A， 呃 ， 这个东西什么来着 ， 就是 A 下瓢啊 ，A 上瓢啊 ， 然后 C 下面带一个尾巴那种 。

**吴涛** [13:00]
形象的说就是那个拼音的四声 。

**Rio** [13:04]
对 ， 呃 ， 会产生 encoding 的问题 ， 于是代码中会出现大篇幅的没有任何 accent 的法语注释 。 最近我和法国同学讨论编码语言的问题 ，他对自己选择法语编码的问题 ， 呃 ， 的原因居然是在代码里看到英语就知道是 Cooley 的那个 ， 法语就是自己写的 。

无言以对 。 最后用法语键盘编码也是个无比艰难的事情 ，在键盘上， 特别是 Mac， 找不到波浪号 、 美元符号 、 方括号等等写程序必不可少的符号 。

不知这一点在德语键盘上会不会好一点 。 这里再顺便吐槽一下微软 ， 官网的 Economic 系列键盘也不能选语言 ， 为了 quality 见位 ， 我只能在英国亚马逊去买 ，但是我对英式键盘 layout 里回车不是直条的这一点也是不太适应 。

**吴涛** [13:59]
呃 ， 这个很简单 ， 买国 ， 买那个 ， 呃 ， 美式的就好了 。

**Rio** [14:04]
呃 ， 我 。

**吴涛** [14:06]
美式的寄不过来了是吧 ？

**Rio** [14:08]
可 ， 我在德国如果要买 quality 键盘的话 ， 我也得去亚马逊上去专门选 US English layout，因为英国的 English layout 是所谓 。

**吴涛** [14:16]
分两个 English 嘛 ， 一个是 International English。

**Rio** [14:20]
对 ， 或者是 ISO，ISO 的那个 International layout。

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

**Rio** [14:25]
它是一个倒 L 型回车 。

**吴涛** [14:28]
非常蠢 。

**Rio** [14:29]
对 ， 呃 ， 德语上面按方括号还好吗 ？ 就是德语的方括号必须按右边的 ， 呃 ，alt， 然后加 8， 应该是 。

**吴涛** [14:41]
这家 ， 这家 ， 这家还好 。

**Rio** [14:43]
就 ， 就如果 ， 我觉得和法语键盘比起来还 OK 吧 。 法语键盘是按一个 。

**吴涛** [14:50]
你公司的德国同事是用德语键盘编码吗 ？

**Rio** [14:53]
呃 ， 我们公司有用英语键盘的 ，也有用德语键盘的 。 用德语键盘 ， 我在刚来德国的时候 ， 强迫自己适应德语键盘的时候 ，也是用德语键盘编码的 。

就用过一阵子 ， 用过一段之后就觉得还好 ， 就是你必须习惯以右手的大拇指为轴心 ， 然后用中指或者是无名指去按那两个 ， 那两个方括号 。

**吴涛** [15:15]
但是你不觉得这样各种都不顺吗 ？

**Rio** [15:18]
是很蠢啊 ， 所以 。

**吴涛** [15:19]
所以你就换回来了是吧 ？

**Rio** [15:20]
所以后来我就换回来了 。

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

**Rio** [15:22]
当我明白我现在已经可以在德语键盘上编码的时候 ， 我就换回英语键盘 。

**吴涛** [15:28]
我 ， 我 ， 我之前在德国的时候也用过一小 ， 两小时德语键盘 ， 到最后结论是 What the fuck， 赶快找一个那个美国美语键盘换回去接着用 。

**Rio** [15:41]
对 ， 你会觉得自己像一个幼儿园的刚学电脑的人， 不停地低头看键盘 ， 我靠 ， 这个键应该怎么按出来 。

**吴涛** [15:48]
哎 ， 那有一个问题啊 ， 你之前说你同事也有用德语写这个注释的吗 ？

**Rio** [15:53]
对 。

**吴涛** [15:54]
他们那个 ss 写哪个 ？

**Rio** [15:57]
他们会把 ss 写成 ss， 对 。 然后 。

**吴涛** [16:00]
就两个展开写是吧 ？

**Rio** [16:02]
对 ，因为德语的转写是有标准的嘛 ， 所以就 。

**吴涛** [16:06]
啊 ， 原本也可以转写 ， 就加 ue 嘛 。

**Rio** [16:08]
对 。

**吴涛** [16:10]
啊 ， 那就还好 。 就其实跟法国人的做法一样 ， 只是法语没有这种转写的标准 ， 所以他们就 。

**Rio** [16:16]
对 ，他们就直接不加那个 accent。

**吴涛** [16:19]
然后会产生歧义吧 ， 这样 。

**Rio** [16:22]
呃 ， 应该是 ，但是法语学的反正举不出一个例子来 ，但肯定是有了 。

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

**Rio** [16:30]
就什么不加 accent 是一个词 ， 加 accent 是一个词 ，不加 accent 就是侮辱你祖先啊之类的 ， 这种事情 。

**吴涛** [16:38]
这个事情的教训是不要用法国程序员写的程序 。

**Rio** [16:44]
有什么知名程序是法国人写的 ？

**吴涛** [16:47]
有啊 ， 那个 FMPEG 啊 。

**Rio** [16:49]
What？

**吴涛** [16:50]
那哥们不是法国人吗 ？

**Rio** [16:52]
我要罢用 FMPEG。

**吴涛** [16:55]
是吧 ？ 这哥们叫

Fabric Spalat。 哎 ， 猜对了 ，在法国 。

**Rio** [17:04]
哦 ，sorry。

**吴涛** [17:05]
这个东西叫 Grenoble 的一个地方 ，不知道在哪 。 啊 ， 这哥们写过很多这种知名的玩意儿 。

**Rio** [17:14]
OK。

**吴涛** [17:15]
啊 ， 除了那个 ， 那个 FMPEG 之外 ，他还写过 ，他还写过一堆很有名的小东西 ， 我现在想不起来了 。Anyway。

**Rio** [17:27]
呃 ，其实想想的话 ，Blizzard 在法国公司应该是负责欧洲的本地化了 ， 甚至也有开发人员 。 所以如果要 ， 如果真的要罢用法国软件的话 ， 那可能星际也不能玩了 。

不能这样对待自己 。 算了 。

### 桌面今昔

**吴涛** [17:48]
吧 ， 对 ， 就这样 ，不要那么残忍了 。 呃 ， 所以今天我们第一个题目是什么 ？

**Rio** [17:54]
呃 ， 历史的变迁 。 正值新年之际 ， 我们来回顾一下历史 。

**吴涛** [18:01]
回顾什么历史现在要 ？

**Rio** [18:04]
呃 ，screenshots from developers 2002 versus 2015。

**吴涛** [18:11]
啊 ， 这个其实还挺有意思的 ， 这个是一个 ， 这哥们叫什么 ？ 叫 Anders。

**Rio** [18:18]
Anders。

**吴涛** [18:20]
Anders，他姓什么呢 ？ 看

一下 。

**Rio** [18:27]
啊 ，wait a second， 我们刚才是要讲 CDN 是吧 ？ 我反正 。

**吴涛** [18:31]
没事啊 ， 那个可以放到后面讲 ， 无所谓 。 新年回顾历史我觉得挺好的 。

**Rio** [18:35]
OK， 好 。

查到名字了吗 ？

**吴涛** [18:39]
呃

，不知道他叫姓什么 。 域名看来是 anders。

**Rio** [18:46]
About

photography。

**吴涛** [18:53]
哎 ， 这些不重要了 ， 这个人是谁其实问题不是很大 。 呃 ， 这个人在 2002 年前 ， 呃 ，2002 年的时候 ，也就是 14 年前吧 ， 啊 ， 给一堆这个 Unix 的开发者或者是其他的一些知名的大牛们写过一封信 ， 让他们说提供一下这个他们工作这个电脑屏幕的截图 。

然后他当时把那些截图都保存下来了嘛 。 然后去年呢 ， 就是 2015 年年底的时候 ， 呃 ，12 月 10 号吧 ， 对 ，他又发了一篇 ， 然后他问了就是现在那 ， 那就是 14 年前那波人， 然后他们现在的桌面长什么样子 。

当然了 ，因为有一些人已经 ， 呃 ，不在世了 ， 所以就中间缺了一些 ，但是就是其他剩下都还 ， 都还 ， 都回复了 。

然后他就把这 2002 年的回复和 2015 年的这个回复摆在一起来对比一下， 看看这个历史的变迁到底怎么样子 。

我觉得这个还 ， 还非常有意思啊 。 你觉得最 ， 最令那个什么 ， 你觉得最有印象深刻的是哪个 ？

**Rio** [20:11]
呃 ， 说实话 ， 我觉得都还好 。

**吴涛** [20:14]
都还好 。 你有预期吗 ？

**Rio** [20:17]
我其实不觉得他们在 ， 就是甚至我会觉得 13 年的这个时间不是特别的长 。You know， 就 。

**吴涛** [20:27]
OK。

**Rio** [20:28]
我现在回想 2002 年的时候好像没有和现在有什么非常天翻地覆的变化 。 可能唯一的变化就是在这过去的 13 年里面 ， 我对 Vim 的掌握程度是天翻地覆的 。

但是在窗口 ， 或者说在屏幕 ，在这个桌面上会摆什么 ， 乃至常用哪些工具 ， 好像 ， 啊 ， 如果你按门类分的话 ， 我觉得没有什么太就是 fundamental 的变化 。

就我们用的东西永远是那几样 ， 什么那个图像编辑软件 ， 字处理软件 ，Terminal。

**吴涛** [21:07]
嗯哼 。

**Rio** [21:08]
呃 ， 无非是版本号更新了 ，但是好像没有什么特别 。

**吴涛** [21:14]
没有别的区别 。

**Rio** [21:14]
对 ， 当然那个 ， 呃 ，Kernel 它 ， 它从 Linux， 它从 Unix 切换到 OS10 了 ， 这个让我觉得还那个挺 ， 挺 ， 挺特别的 。

因为它是 Brian Kernel，you know， 然后它现在在用 OS10， 这不让人觉得讽刺吗 ？

**吴涛** [21:32]
但是它的用法也 ， 也 ， 也挺原始的嘛 ， 就是它 。

**Rio** [21:37]
对 ， 它实际上是在拿 OS10 当做一个稳定的 。

**吴涛** [21:41]
就当 X 嘛 。

**Rio** [21:42]
对 。

**吴涛** [21:44]
就是剩下所有工作还是在 Terminal 里面完成的 ， 比如说它用那个 RPY 那个 ， 呃 ， 就字符界面的 ， 啊 ， 邮件客户端 ， 对吧 ？

**Rio** [21:55]
对 。

**吴涛** [21:55]
这里看它还有一些 ， 啊 ，SSH， 还有其他什么看不见的一个东西 。 跟它 12、13 年前并没有什么明显的区别 ， 这也在干同样的事 。

**Rio** [22:10]
它 ， 它毕竟是一个 ， 它是什么 ， 它是 40 年代 ，40 年代出生的人吧 ， 这一个 ， 这已经是一个高龄老人了 ， 对吧 ？

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

**Rio** [22:19]
它在 。

**吴涛** [22:20]
它在 2002 年采访这帮人的时候 ， 这帮人都已经是相对来说比较成熟稳定的一个状态了嘛 。

**Rio** [22:25]
叫什么业界泰斗啊 。

**吴涛** [22:28]
呃 ， 这不是泰斗 ，也是骨干了 。

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

**吴涛** [22:32]
但是我看有比较大变化的是谁 ， 我发现 ， 这一圈里面 。

**Rio** [22:37]
呃 ， 没有吧 。

**吴涛** [22:39]
其实你不好奇一下 Vim 那个作者他在干嘛吗 ？ 叫 Bram Muller。

**Rio** [22:45]
Muller 他现在瑞士的 Google。

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

**Rio** [22:49]
哦 ， 你说他的 ，他的那个屏幕上， 我觉得他是为了截图才放这么多 。

**吴涛** [22:54]
不 ， 就是我其实挺好奇的 ，他 ， 那些东西 。 你看这张大图啊 。

**Rio** [23:01]
嗯 。

**吴涛** [23:02]
呃 。

**Rio** [23:03]
这 ZIMBO。

**吴涛** [23:04]
窗口有 1、2、3、4、5，5 个吧 。

**Rio** [23:11]
对 ， 它还有一个看起来像 Picasso 的那个东西 ， 那是什么 ？

**吴涛** [23:16]
那就是 Picasso 啊 。

**Rio** [23:18]
Picasso 还存在吗 ？

**吴涛** [23:19]
它如果用 Google 系管理照片的话 ， 应该还在吧 。

**Rio** [23:23]
OK。 反正它 ， 你看它的那个开的窗口里面也可能有一大堆 X term。

**吴涛** [23:32]
你看它 ， 它 ， 它用邮件的方式很奇特 ， 你就没有发现 。

**Rio** [23:37]
它用邮件的方式 ， 它不是用 Gmail 的那个网页端 。

**吴涛** [23:42]
不是 ， 它最左边那个窗口 ， 那个 Vim 窗口是邮件 。

**Rio** [23:46]
What？

**吴涛** [23:47]
你仔细观察一下 。

**Rio** [23:49]
哦 ， 真的 ？

**吴涛** [23:51]
对 ， 所以它是直接裸写那个邮件本体 ， 然后用一个什么命令行去处理的 。

**Rio** [23:58]
那可是它的 ， 那它的 ， 它的那个浏览器窗口里面有两个 。

**吴涛** [24:03]
也有 Gmail， 对吧 ？

**Rio** [24:04]
Gmail 的窗口 ， 所以它是同时用一个 ， 反正它是同一个客户端就是了 。 它要么用一个 Web UI， 要么用一个 ， 呃 ，CUI。

**吴涛** [24:16]
对 ， 对 ， 对 。 但我就觉得它最左边那个处理邮件那个窗口特别 ， 特别奇怪 ，因为我从来没有见过人这么用邮件 。

**Rio** [24:26]
OK。

**吴涛** [24:26]
就你直接在磁盘上创建一个文件 ， 然后这个文件是这个邮件一个的原始的格式 ， 然后再通过某种方式去处理它 。

**Rio** [24:36]
嗯 ， 这 ， 对 ， 这也有可能是个什么插件啊之类的 。

**吴涛** [24:42]
就 ， 就 ， 就很神奇嘛 ， 这种用法 。

**Rio** [24:44]
对 ， 它在编辑的这个文件的名字是 ， 就是 bramban007， 然后是在这个根目 ， 呃 ， 自己的 home，home 目录下面的 mail new。 我觉得这有可能是某种插件的 。

**吴涛** [25:02]
对 ， 它 ， 它是一个 Vim 的窗口啊 。

**Rio** [25:04]
对 ， 就这个插件让你通过一个字处理器来 ， 呃 ， 撰写邮件内容 ， 然后你一保存 ， 它就把它 somehow 记住去之类的 。

**吴涛** [25:13]
对 ， 所以 ， 所以这个是挺有趣的一个东西 。

**Rio** [25:17]
对 ， 这个 ， 呃 ， 说起来比较难 ， 就是如果你没有看过这个网页的话 ， 可能 ， 可能会理解里面 ， 理解起来有点困难 ，但基本上就是你可以看到这个网页上面有很多列举了一些名人， 就不是每个都很有名 ，有些是什么 ， 呃 ，Unix Historian，whatever that means。

**吴涛** [25:43]
OK。

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

**吴涛** [25:44]
呃 ， 这个链接我们会放到那个 shownotes 里面哈 ， 然后大家可以去有兴趣打开一下， 点开那个大图 ， 看看他们这些大牛的桌面到底都平时都长什么样 。

**Rio** [25:56]
对 ， 如果你有兴趣的话 ，也可以从现在开始 ， 就是每年给自己的桌面做一个 。

**吴涛** [26:01]
拍一个照是吧 ？

**Rio** [26:02]
做一个 screencap， 然后存下来 。

**吴涛** [26:05]
我好像可以找到 。

**Rio** [26:06]
对 ， 依稀可以找到零几年，05 年、06 年的桌面截图 ，但是 。

**吴涛** [26:12]
哈哈 。

**Rio** [26:13]
那接下来要讲的是前两天 IPN 发生的一件 ， 啊 ，incident 应该说 ， 呃 ， 具体经过是什么 ？

### CDN 劫持

**吴涛** [26:23]
呃 ， 就断断续续有人抱怨说这个我们下载不了 IPN 的这个音频文件啊 ， 或者是网页是打得开的 ， 就是听不了而已 。

**Rio** [26:34]
对 ， 然后我们也这一次没能成功的把这个 blame 转移到中国电信或者中国联通上面 ， 所以只好去看看是不是自己的服务器出问题了 。

**吴涛** [26:47]
但其实很难说 ，因为是一个 DNS 的问题嘛 。

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

**吴涛** [26:52]
DNS 解析的那个 ， 我们用的那个 CDN 解析不出来 ， 然后之前出现了个 ，有几档子事连到一起就挺混乱的 。

啊 ，不知道你还有没有看新闻哈 ， 就大概两周 ， 一两周以前吧 ，有那个新闻说全球的那 13 个根域名的这个服务器 。

**Rio** [27:10]
哦 ，OK。

**吴涛** [27:11]
然后说那个大哥们的那个拒绝服务攻击嘛 。

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

**吴涛** [27:15]
然后当时他们就做了一些处理 。 啊 ， 这个也要可能要普及一下这个常识啊 ， 比如说我们全球 ， 啊 ， 就我们平时解析域名的时候 ， 比如说你要上这个 ， 啊 ，google.com 对吧 ？

它是要一个一个去问 ， 点 ， 这个要问这个谁负责 .com 对吧 ？ 它问 ， 它要问这个就所谓的这个根服务器 ， 然后根服务器说啊 ， 这个服务器负责 .com， 然后另外它就跑去 .com 那个服务器上面问谁负责这个 .com 下面的这个 google 这个域名对吧 ？

然后一层一层 ， 然后问到 google 说谁负责 google 下面的三个 ， 三个 w 这个域名对吧 ？ 一层一层这样问下去 ， 大致是这么一个逻辑啊 。

那所以谁 ， 它问的第一个那个 ， 那个叫什么服务器 ？

**Rio** [27:58]
根域名服务器吗 ？

**吴涛** [27:59]
对 ， 根域名服务器叫做 ， 就全球有这么 13 个 ， 啊 ， 去负责这种 .com 啊 ，.net 啊 ， 这种的响应 ， 然后这些就遭到了一个大范围的这种攻击 ， 然后导致很多地方解析都出了问题 。

然后这还 ， 这还没完哈 ， 完了之后国内 ， 啊 ， 我们用的那个像 IPN 的一些域名都是在 DNS port，DNS port 的这个服务商那里 host 的嘛 。

啊 ， 就会发现 ， 呃 ，DNS port 又说国内的这个域名解析也出现了各种各样的这种奇怪的问题 ， 就经常出现解析不到啊 ， 就是你要解析个地址它解析不出来 ， 啊 ， 还有 ， 呃 ， 就是解析出来可能是一个什么本地的 127.0.1 这种地址对吧 ？

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

**吴涛** [28:46]
呃 ， 就 ， 就这两件事情不知道有没有什么联系 ， 反正就现象是这样子的 ， 就导致我们有些这种服务也一直解析 ， 断断续续会有出这种问题 。

啊 ， 然后再加上之前我们不是遇到过那个音频文件的那个被劫持吗 ？ 因为现在 IPN 整站是用的这个 HTTPS 加密连接 ，不会有这种中间的这个 ， 呃 ， 运营商劫持的问题 。

但是在很长一段时间内 ， 那个 CDN 的那个音频文件下载 。

**Rio** [29:19]
还是传统的 HTTP？

**吴涛** [29:20]
HTTP 的这个铭文的协议嘛 ， 然后很多这种 ， 这种之前也提到过小运营商它为了节省它的那个带宽的流量 ， 它会自己再做个本地的缓存 ， 然后又没做好 ， 就导致我们经常听到一半 ，有些 ，有些听众抱怨说听到一半就串台了所谓的 ， 对吧 ？

听 ， 听上前五分钟还是这个 《 内核恐慌 》， 后五分钟就可能变成 《IT 公论 》。

**Rio** [29:44]
就串到了什么中文 。

**吴涛** [29:45]
别的什么节目 。

**Rio** [29:46]
电话之类的 。

**吴涛** [29:46]
对 ， 对 ， 对 ， 好像这样 ， 这样就很 ， 很乱嘛 。 呃 ，但是 CDN 要部署这个 HTTPS 还是就不是那么简单的事情 ， 要做很多这前期的准备工作 。

但好在呢 ， 这个我们新年伊始哈 ， 我们终于把这件事情做完了 ， 然后那个域名的这个 hosting 也尽量针对国内的访问做了一些调整吧 。

啊 ， 希望哈 ，hopefully， 啊 ， 之后我们就不会再遇到类似的问题了 。

**Rio** [30:17]
对 ，但如果遇到什么问题的话 ， 各位听众请一定要向我们反馈 ， 这样才能帮助我们改进这个服务的质量 。

**吴涛** [30:24]
没错 。 对 ， 这就是我们这个 IPN 的一个 CDN 遇到的一些最近的一些近况 ，也给大家做一个简单的说明吧 。

**Rio** [30:34]
嗯哼 。 啊 ，OK， 那接下来是 ， 怎么说呢 ， 一款最近又有了些动静的新字体 。

### 连字字体

**吴涛** [30:44]
其实我一直不太清楚啊 ， 那个 ， 那个 OS10 到底有没有自带 Fira Mono 那款字体啊 ？

**Rio** [30:52]
呃 ， 没有吧 。

**吴涛** [30:54]
没有是吧 ？ 那我不知道为什么我电脑上有一个叫做 ，有一款叫做 Fira Mono 的 ， 然后它这款这个 Fira Code 是基于这个 Fira Mono 来改的吗 ？

这个东西是念 Fira 吗 ？F-I-R-A。

**Rio** [31:07]
应该是吧 ？ 不然还能念什么 ？

**吴涛** [31:09]
Fire？ 但是不确定了 。Fira 吧 。

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

**吴涛** [31:15]
啊 ， 所以有人就基于一个叫做 Fira Mono 的这么一个等宽字体 ， 然后它做了一些什么呢 ？ 我们按照国内的行话说叫做深度定制 。

**Rio** [31:27]
OK， 好吧 。 忽然感觉像个房地产商 。

**吴涛** [31:32]
对 。 啊 ， 它在这个 Fira Mono 基础上扩展了很多这个字符集 ，也做了一些优化 ， 然后它里面最有意思的就是说它用那个 ，因为现代的这个字体 ， 这个排版引擎有一个特性叫做 。

**Rio** [31:47]
Ligature。

**吴涛** [31:47]
Ligature， 对 。 连字可能 ， 这个是个排版学的概念 ， 可能还要先解释一下哈 。

**Rio** [31:53]
对 ， 这个在中文里面比较少见 ， 如果一定要说的话 ， 把招财进宝四个字写成一起 ， 写在一起就可以视为一种中文的连字 。

**吴涛** [32:05]
这也能扯到一起 。

**Rio** [32:06]
可以啊 ， 为什么不行 ？ 这本质上是同一件事情 ， 只不过在中文里面用得非常常见 。

**吴涛** [32:11]
你得描述一下这个东西怎么一回事 ， 我觉得不是很多人都能理解这个词的 。

**Rio** [32:15]
呃 ， 对 ，Ligature 在西文排版里面指的是 ， 呃 ， 为了 ， 为了美观 ， 主要是为了美观 ， 把特定的常见的字幕组合做成一个 ，在最原始的状态下 ，是把一个特定字幕组合做成一个单独的字模 ， 比如说你 ， 呃 ， 英语里面最常见的 FI，fish，F-I-S-H， 它会把 FI 做成一个单独的一个签字 ， 或者是早期是木火字应该 。

然后 。

**吴涛** [32:45]
看起来的效果就是那个 I 上面那一点被 F。

**Rio** [32:48]
被 F 吃掉了 。

**吴涛** [32:49]
把手吃成 ， 吃进去了 ，是连在一起的 。

**Rio** [32:52]
对 ， 或者 FFI， 它会把那个两个 F 的 。

**吴涛** [32:57]
横线连起来 。

**Rio** [32:57]
上面的 ， 对 ， 横线连在一起 ， 然后上面的前第一个 F 会融入第二个 F 的顶端 。

**吴涛** [33:04]
对 ， 然后 。

**Rio** [33:06]
像 FL 这种 ，flower。

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

**Rio** [33:08]
它那个 F 和 L 的尖尖也会连起来 ， 像是 ， 像是 ， 呃 ， 叫什么 ， 漏油了一样 。

**吴涛** [33:15]
没错 。

**Rio** [33:15]
然后这个 Ligature 如此常见 ，以至于在某些语言里面 ，Ligature 成了一个单独的字母 ， 比如说德语的 SZ， 看起来像一个 Beta，但实际上它是一个 S 和另一个 S 连在一起 ， 然后第一个 S 因此被拉直了 ， 然后看起来像 Beta， 然后或者像一些语言里面的 ， 呃 ， 法语里面有个 OE 的连字符 ， 呃 ，也是可以被当成一个单独字母用 ， 或者是某些语言里面有个 AE， 就是 A 和 E 连在一起 。

然后 。

**吴涛** [33:51]
AE 还有 AE 的连写还分这个大小写两种情况呢 。

**Rio** [33:55]
那 OE 也分呢 。

**吴涛** [33:57]
哦 ， 哎 ， 哦 ， 对 ， 对 ，OE 也分 。

**Rio** [34:00]
OE 连字的大写就是 O 变成了一个像 ， 像左突出的 D， 然后右边 ， 右半边和这个 E 的左边的竖连在一起 。

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

**Rio** [34:11]
这 ， 这在 ， 这个在牌子 ， 就是在 ， 怎么说 ， 签与火的时代是比较容易实现的 ， 就是你只需要把两个字的字模刻在一起就可以了 。

但是在数字时代 ，因为每一个字符在 ， 这个 ，在二进制的层面它是分开的 ， 所以实际上连字是一个非常晚近才在数码排版界出现的一个东西 。

**吴涛** [34:37]
最 ， 最开始支持这个 Ligature 的这个牌 ， 这个牌子引擎是哪个 ？ 应该是 OS10 上那个吧 ？

**Rio** [34:43]
呃 ，是 ， 呃 ， 叫什么来着 ？ 呃 ，Type 1 应该是 ， 从 Type 1 开始有 Ligature。

**吴涛** [34:51]
就是 Adobe 的那套东西 。

**Rio** [34:52]
对 。

**吴涛** [34:53]
OK。

**Rio** [34:54]
嗯 ， 对 ，但是在 ， 至少在编程界 ，Ligature 是一个很 ， 几乎没有 ， 没有任何你好用的东西 。 呃 。

**吴涛** [35:04]
对 ，因为它需要依赖于这个一个 GUI 的环境 ， 然后需要这个 ， 呃 ， 牌子引擎对这个事情要有支持 ， 然后你还有一些什么参数要打开它才可以 ，也不是 ， 就是你牌子引擎有了这个 Ligature 之外， 你手 ， 你的字体本身还得有这个 Ligature 的那些 character， 那些字符你才可以显示嘛 。

**Rio** [35:25]
对 ，其实这里可以插一句就是 ，因为显示技术的限制导致了我们目前编程使用的一些 convention， 呃 ，是在不写程序的人看来非常奇怪的 。

呃 ， 或者是你需要一段时间 ，因为你已经会编程了 ， 所以经过如此久的时间你是不会意识到它有多奇怪的 ， 比如说 ， 呃 ， 小于等于号 ， 或者是 ， 呃 ，不等于号之类的符号 ， 你写起来都是在不会写程序的人看来非常奇怪的 ， 对吧 ？

然后 。

**吴涛** [36:00]
对 ， 我们写数学的小于等于就是写个小于号 ， 然后在下面那个再多加一个并行的一横 ， 对吧 ？

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

**吴涛** [36:08]
但是在我们编程的时候 ，因为 ， 当然不光是显示的问题 ， 那也牵涉到输入的问题哈 。

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

**吴涛** [36:14]
就会说你 ， 你键盘上没有小于等于这个符号嘛 ， 你得如果单独去找的话其实也挺难的 。 那一个变通的办法就是我先输一个小于号 ， 再输一个等于号 ， 两个 ， 两个连拼在一起你就知道小于等于是吧 ？

它看起来有点奇怪 。

**Rio** [36:28]
就是说技术的限制实际上， 实际上逼着逼迫我们形成了某种特别的编程的风格 ， 一种 convention， 又比如说下标这个东西 ， 你在计算机上没有办法方便地输入一个字符在另外一个字符的右下角 ， 对吧 ？

就假设如你 ， 你想象如果我们的编程是简单的像那个科幻小说里面是用纸和笔来完成的话 ， 你完全可以写一个 X， 然后右下角一个角标 2 来代替比如说 X 方括号 ， 呃 ， 或者是 dollar 2 之类的这种东西 。

又 ， 又扯远了 ，但是反过来这 ， 这个 Fira Code 这个字体就是一个对此一个 ， 一个改进或者说尝试 ， 它 ， 它使得一些常用的编程 ， 或者说在某些比较年轻的编程语言里面常用的符号 ， 呃 ， 变成了 Ligature， 比如说它把一个 ， 呃 ， 两个等于号 ， 如果你打两个等于号的话 ，在其他的普通的等宽字体里面看起来是两个等于号 ，在这个 Fira Code 里面看起来就是一个连贯

的很长的等号 。 然后如果你打感叹号等于号 ， 就在普通语言里面是什么不等号之类的 ， 它会把它显示为一个很长的等于号 ， 然后， 然后上面画了一个斜杠 ， 就像一个数学家使用的符号一样 。

**吴涛** [37:46]
对 ， 然后它这个就是 ， 这应该是首款等宽字体支持这种比较奇怪的数学符号的 Ligature 的 ， 呃 ， 作品吧 ？

**Rio** [37:57]
呃 ， 应该不算是 ，因为我之前用过 。

**吴涛** [38:01]
之前你用那个叫什么来的 ？ 那个有一个 Pragmata Pro。

**Rio** [38:04]
我现在还在用 。

**吴涛** [38:06]
是 。

**Rio** [38:06]
它也有 ， 对 。Pragmata Pro，但是那个非常贵 ， 要一百多欧吧 ？

**吴涛** [38:11]
对 ， 然后 Fira Code 这款是免费的 ， 还是开源的 。

**Rio** [38:13]
刚刚推出了免费的字体 ， 就如果你感兴趣的话可以试一下， 尤其是如果你是一个 Haskell 爱好者的话 。

**吴涛** [38:20]
对 ， 或者是那个 Swift 也可以用 。

**Rio** [38:24]
呃 ，Swift 里面其实没有太多的 。

**吴涛** [38:28]
但是 Swift 可以让你自定义那个 operator 运算符啊 。

**Rio** [38:34]
是 ， 话是这么说没错 ，但是真正用的 。

**吴涛** [38:37]
任何 ， 任何允许你自定义这个运算符的语言你都可以用上这个很帅气的这个 Fira Code 的这个字体的这个 Ligature 特性 。

**Rio** [38:47]
对 ， 这让我想起一个那个前两天 ， 呃 ，在推上是谁来着 ？ 罗生说的吧 ？ 说那个 ， 呃 ， 之前有人在试验 Swift， 就是自定义一大堆那个运算符 ， 然后用的是 Unicode 里面的数学符号 。

**吴涛** [39:02]
对 。

**Rio** [39:03]
然后有人批评他说什么你 ， 你做这个就是 ， 就从一个 ， 就像我刚才说的 ， 被灌 ， 被这个工具复述住了手脚 ， 然后不得不产生出一套 convention 的程序员的角度来看 ， 这是非常 ， 呃 ， 加引号离经叛道的 。

然后， 然后当 Swift 开源之后， 人们发现在 Swift 的 ， 呃

， 的 ， 应该是什么 ？Test 或者是 。

**吴涛** [39:35]
就那个 ， 做做 homebrew 那哥们好像写过一套类似的东西 。

**Rio** [39:39]
啊 ， 应该就是他 ， 没错没错 ， 就是他 。

**吴涛** [39:42]
叫什么 Matt 什么来着 ？

**Rio** [39:43]
对 ，Matt。他后来 Swift 开源之后， 人们发现在 Swift 的 experimental branch 下面有这样的一系列 features，而且比 Matt 做的要早 。 然后现在 Matt 就可以对那些人说 "In your face"。

但 ，但 ，但怎么说呢 ， 就这还是一个非常

， 嗯 ，有悖于 convention 的东西 ， 就是你 ， 我觉得写程序很重要的一点 ， 尤其是写开源程序 ， 很重要的一点就是你写的东西别人看懂 ， 对吧 ？

**吴涛** [40:16]
对 。

**Rio** [40:17]
而目前的现在大环境是你 ， 你写的东西非常牛逼的话 ，但是 ， 虽然非常牛逼 ，但是也许很多人看不懂的话 ， 那它的贡献的编辑效率是非常低的 。

**吴涛** [40:30]
没错 。

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

**吴涛** [40:31]
啊 ， 当然这个 Fira Code 刚才讲 ， 如果你要真的使用这个 ， 呃 ，Ligature 的话 ， 要有两个要件同时具备 ， 一个是说字体要具备这个 Ligature 的 character。

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

**吴涛** [40:42]
那些符号本身要有 ， 要那个 ， 那个外形要有定义嘛 。 另一个就是你的那个排 ， 排版引擎要开了 ， 要支持这个特性并且打开了 。

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

**吴涛** [40:52]
然后非常不巧呢 ， 呃 ， 应该没有任何一款这个终端模拟器 ， 或者是这种就是纯符号 ， 字符界面的这种 ， 呃 ， 编辑器有这个特性吧 ？

**Rio** [41:05]
呃 ，在那个 Terminals support 里面 ， 我们惊讶的发现 Terminal app 是支持的 。

**吴涛** [41:11]
啊 ，是吗 ？

**Rio** [41:12]
Console 也支持 。

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

**Rio** [41:15]
但是你我用的这个 Item 2，Item 是不支持的 。

**吴涛** [41:19]
啊 ， 原来是这样 。 所以如果我用那个苹果自带的 Terminal 的话 ，是可以用 Fira Code 的 。

**Rio** [41:25]
对 ， 你可以试一试 。 然后我为了试这个 ， 我就把它 ， 我就重新用这个 Macvim 了 ， 呃 ， 就是图形化的那个 。

**吴涛** [41:34]
Vim 的 Mac 原生 GUI 版 。

**Rio** [41:38]
对 。

**吴涛** [41:39]
所以它打开支持吗 ？

**Rio** [41:42]
它支持啊 ，但是有一些非常小的 glitch， 比如说你在 ， 你打一个 ， 打一个小于等于号 ， 然后， 嗯 ， 如果你把鼠标挪过它 ， 它会

，有时候会变回一个小于号和一个等于号 ，也许是为了改 。

**吴涛** [42:01]
这才是正确的处理方法 。

**Rio** [42:03]
OK，但是有时候就是你 ， 如果你只是扫过那个符号的话 ， 它有时候中间会出现一个裂缝 。

**吴涛** [42:11]
就是 。

**Rio** [42:11]
这个是什么 ？

**吴涛** [42:12]
就感觉是一个 。

**Rio** [42:13]
渲染错误吧 ？

**吴涛** [42:13]
对 ， 渲染错误 ， 对 。 但其他的什么 Xcode 我还没有试啊 ， 或者什么 Coda 之类的没有试 ，但目前用过来 ， 就是如果你习惯的话应该还好 。

对 ，因为这个一个最主要的问题就是说我们就用那种基于终端也好 ， 还是像 Vim 这种基于我们姑且称为字符栅格的 ， 或者字符网格的这种逻辑的话 。

**Rio** [42:37]
CUI 吗 ？

**吴涛** [42:38]
对 ， 你把两个 ， 你把两个字符融合 ， 或者是多个字符融为一个 ， 它对它的这个定位的计算还是会有一定影响的 。

**Rio** [42:47]
对 。

**吴涛** [42:49]
就你光标移上去 ， 你说你 ， 你比如说它三个字符 ， 比如说大于 ， 就是那个三个等于号连一起 ， 一个全等符号 ， 举个例子啊 ， 那你把那个字符往左挪个一个位的时候 ， 它说应该这个符文应该显示你选择哪个字符呢 ， 对吧 ？

就比较难做 。

**Rio** [43:06]
对 。

**吴涛** [43:07]
啊 ， 刚才那个 Item 2 不行啊 ， 就没有暂时没有办法 。 呃 ，但是其实也是有变通的手段的 ， 你知道吗 ？Vim 也可以有这个东西 。

**Rio** [43:17]
不是吗 ？

**吴涛** [43:18]
Vim 7.0， 我忘了 7.2 还是 7.3 开始支持一个叫做 conceal 的特性 。

**Rio** [43:26]
嗯哼 。

**吴涛** [43:27]
Conceal 特性做的事情跟 ，在概念上跟这个 Ligature 非常像 ， 就是说它可以让你 ， 呃 ， 把一个或者多个 ， 呃 ， 真实的字符当成另外一个单独的字符来处理 。

比如说你可以把这个 ， 我之前干过 ， 我之前写过一个小的 ， 呵 ，Vim 的插件或者一个 ， 一个小的配置脚本吧 ， 可以让 ， 叫 cute-python 嘛 。

**Rio** [43:56]
OK。

**吴涛** [43:57]
然后它可以做一些非常邪恶的事情 ， 就是用那个 Vim 的 conceal 特性 ， 把 Python 里面的一些关键词改成一些符号 ， 比如说 Python 里面有那个 def， 就是 define 那个一个定义一个函数的那个关键词的 def 嘛 ， 你觉得看它不爽太长的话 ， 你可以换成一个 lambda。

**Rio** [44:17]
OK。

**吴涛** [44:18]
对吧 ？ 然后 。

**Rio** [44:19]
我还记得第一次那是 2009，2010 年，11 年的时候在北京 ， 呃 ，Rio 的家中看着 Rio 编程那种油然而生的敬佩感 ， 就是他在写 Python，但是我看不出他在写 Python。

**吴涛** [44:34]
因为邪教 。

**Rio** [44:37]
对 ，他用这个插件把 Python 改得面目全非 。

**吴涛** [44:40]
对 ， 还有一个把那个比如说 return， 就是返回 ， 呃 ， 函数结果那个东西改成一个那种 ， 一个弯弯的箭头 ， 对吧 ？

**Rio** [44:48]
嗯哼 。

**吴涛** [44:49]
还有一些什么来着 ？ 啊 ， 呃 ， 还有那个真的 lambda 改成一个 lambda 那个参数嘛 。 还有就是包括刚才常见的把一个小于等于改成一个数学的那个小于等于的符号 ， 就这些也可以做的 。

然后这些的支持呢 ， 就相对来说要稍微好那么一点点吧 ，因为它是这个那个 Vim 原生的 ，不会出现刚才你说那种渲染错误的情况 ，因为它不依赖那个任何操作系统的 ，不 ， 任何这个 ， 这个 GUI 的支持 ，因为它是在字符层面去做这么一种事 。

**Rio** [45:23]
对 。

**吴涛** [45:24]
啊 ， 所以这个链接我稍后也放出来吧 ， 大家如果有兴趣去试一下这种邪教 ， 呃 ，也可以去尝试一下， 算是 ， 算是一种 work around 的 。

**Rio** [45:33]
Welcome to drink their cool aid.

**吴涛** [45:37]
呃 ， 除了我们刚才提到的这个 ， 嗯 ，Fira Code 和 Pragmata Pro， 呃 ， 之外还有一个叫 Hasklig 的字体 ， 它是应该是基于 Source Code Pro 改的 ， 它把那个 Source Code Pro 里面那些 ， 呃 ， 那个数学符号或者编程符号加改成了 Ligature，但是效果就看起来不是那么漂亮 ，不过有兴趣的朋友 ， 有兴趣的朋友可以去试一试 。Hasklig， 就 Haskell 和 Ligature 的 ， 呃 ，Parliamental。

### 日历芯片

**吴涛** [46:12]
OK， 这是一个挺好的尝试 。 嗯 ， 下面一段新闻其实挺搞笑的 。

**Rio** [46:20]
嗯哼 。

**吴涛** [46:22]
呃 ， 这个是出现在 ， 我想想这个是出现在哪里 ， 这个是出现在 Linux Kernel 内核开发组里面的一小段 ， 它是一个 commit 嘛 ，因为那个 Linux 内核是用 git 管理这个软件版本的嘛 。

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

**吴涛** [46:38]
然后你不是每次要写一个 commit， 这个就是 ， 这个叫什么 commit message， 中文叫什么 ？ 啊 ， 提交说明 。

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

**吴涛** [46:49]
好吧 ， 然后他们是不是给一个芯片的 ， 算是写驱动吧 ， 应该是 ， 的一段 ， 打 ， 打的一段这个 ， 这个 commit， 然后里面有个非常奇妙的小故事 。

**Rio** [47:04]
嗯 。

**吴涛** [47:04]
说这个 AD 是公元后是吧 ？BC 是公元前 ？

**Rio** [47:08]
在公元 1582 年， 教皇格里高利十三世 。

**吴涛** [47:13]
哈哈哈 ， 念完念完 ， 接着念 ， 就这个调调 。

**Rio** [47:15]
这个要及时去翻译它了 ， 我做不到吧 ？ 好吧 ， 我试试啊 。 公元 1582 年， 教皇格里高利十三世发现 ， 呃 ， 既有的儒略历法无法正确地反映现实 ， 于是他改进了计算闰年的方式 ，以满足这一条件 。

这就是格里 ， 格里历和儒略历的来历 ， 来源吧 ， 就这么说 。

**吴涛** [47:42]
一个有闰年， 一个没闰年嘛 。

**Rio** [47:43]
对 ，不是 ， 呃 ， 格里历的闰年要比儒略历的闰年计算的方法正确 ， 正确 ， 更正确一点 。 我们现在用的就是格里历 。

**吴涛** [47:51]
更对一些 。

**Rio** [47:52]
对 ， 格里高利历 。 然后， 嗯 ， 与此类似的 ，在公元 2013 年，Rockchip，Rockchip 是中国 ， 呃 。

**吴涛** [48:03]
福建的那个厂商吧 ？

**Rio** [48:04]
应该是 。

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

**Rio** [48:05]
呃 ， 这个 Rockchip 的硬件工程师认为 ， 目前的格里高利历 ， 呃 ， 还是有缺陷 ， 呃 ，因此 11 月应该有 31 天 。 然后后面写说 ， 就非常幽默的笔法说 ， 呃 ，不幸的是 ， 呃 ， 这个格里历能够在世界范围内获得应用已经 ， 就 ， 就花费了 300 年时间 。

所以就因为一些晚 ， 比较晚近的这个新教国家 ， 它是 ， 还是使用儒略历的 ，因为儒略历的 ， 就如果你改了历法的话 ， 那个节日的日期就要变嘛 。

然后有些新教国家到现在都没有改 。Wait a second。 最近的新教国家应该是七几年才改 ， 如果我没记错的话 。

然后这个 commit message，commit message 里面就说这个 ， 呃 ，Rockchip 的厂商的这个改变可能还要过一年时间才能被全球的其他人接受 。

所以目前这里是一个小的 patch， 让它能够跟这个世界上其他地方所使用的这个格里高利历来协同 。

**吴涛** [49:12]
对 ， 对 ， 当然 ， 呃 ， 前面都是段子啊 ， 这个写 ， 写这个 commit message 的人叫 Julius Werner。

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

**吴涛** [49:21]
然后他是 ， 哎 ，他是 Kwm 那个组的 。

**Rio** [49:24]
对 ，他是 Kwm 工作应该是 。

**吴涛** [49:25]
啊 ， 想来他应该是为这个用 Rockchip 的平板电脑跑这个 Kwm 浏览器或者是 KwmOS 的时候 ， 搞遇到这个 ， 这个硬件 bug。

**Rio** [49:38]
愚蠢的问题 ， 对 。

**吴涛** [49:39]
对 ， 哎 ， 所以说 ， 说到刚才那个问题在哪里 ， 可能很多人没有意识到 ，11 月是没有 31 号的 。

**Rio** [49:45]
What？ 会有人意识不到吗 ？

**吴涛** [49:48]
就很多人意识不到 ， 你不要 ， 你不要小看这一个 。 那我问你啊 ， 呃 ， 一年 12 个月哪 ， 哪几个月是有 31 号的 ？

**Rio** [49:55]
呃 ，1 月 、3 月 、5 月 、7 月 、8 月 ， 呃 ，10 月 、12 月 。

**吴涛** [50:08]
对吧 ？ 所以你怎么记的 ？

**Rio** [50:10]
就是 ， 这是有由来的 ，因为 ， 呃 ，7 月是 September， 呃 ，是 ，7 月在罗马是 9 月嘛 ，因为 SEPT 是 9， 对吧 ？September 在罗马是 9 月 。

然后 Augustus， 奥古斯都把自己的名字命名成了 8 月 ， 就是现在的 8 月 。 然后， 呃 ，Augustus 认为它应该和 ， 呃 ， 它应该和之前的那个 Julius， 就是凯撒 ， 就儒略凯撒一样伟大 。

而儒略凯撒所在的那个月是 7 月 ，7 月有 31 天 ，他认为自己所在的月也应该有 31 天 ， 所以 8 月有 31 天 。

然后 7 月和 8 月在这边要逆一个顺序嘛 ， 就这么来的呗 。 这不是很简单吗 ？

**吴涛** [51:01]
哇 ， 你这个太绕了 ，但是有一个非常取巧的一个办法 。

**Rio** [51:07]
是数手上的那个 ？

**吴涛** [51:09]
对对对 ， 就那个 。

**Rio** [51:11]
OK。

**吴涛** [51:11]
因为很多人不知道还是不知道 。

**Rio** [51:12]
这个太弱智了吧 ， 好吗 ？

**吴涛** [51:14]
但是很好用啊 。

**Rio** [51:16]
好用在哪 ？ 你要去数哎 。

**吴涛** [51:18]
就介绍一下嘛 ， 可以 。

**Rio** [51:20]
OK， 好吧 。 就如果你把是两个拳头并在一起 ， 然后去数这个拳头上的 ， 呃 ， 高低 ， 从左手的小指开始是 1 月 ， 然后小指和左手无名指之间的凹是 2 月 ， 那你就可以数 1 月大 、2 月小 ，3 月大 、4 月小 ，5 月大 、6 月小 ，7 月大 。

然后到右手 ，8 月大 、9 月小 ，10 月大 、11 月小 ，12 月大 。 这是一个 ， 这是英美小朋友所使用的法子 。

**吴涛** [51:49]
对对 ， 我就每次我想不起来的时候就是要这个 ， 这个两手摊开来数 ，不是摊开 ， 就是两手抱拳来数一下 。

**Rio** [51:57]
可是你不觉得这个要比脑子里面想说 ， 哦 ， 呃 ，Julius 和 Augustus 一样伟大 ， 要 ， 要难很多 。

**吴涛** [52:04]
但是你 ， 你那个 ， 你那个要 ， 要 ， 需要具备好多基础知识才可以用啊 ， 就是你的这个叫什么 ， 你的 dependency 太多了 。

**Rio** [52:12]
好吧 。

**吴涛** [52:13]
你看你 。

**Rio** [52:14]
我有一个非常 ， 我有一个非常复杂的 compilation。

**吴涛** [52:16]
是 ， 首先你得知道这个叫什么 ， 这两个人分别是谁 ， 对吧 ？ 然后知道他们这个 ，他那个 September，他们的生日分别是哪个月 ， 然后他们得知道这个 September， 英文的 9 月其实是 ， 呃 。

**Rio** [52:30]
7 月 。

**吴涛** [52:31]
7 月 ， 对 ， 对吧 ？ 你就 。

**Rio** [52:33]
December 是 10 月 ， 这个 。

**吴涛** [52:36]
对啊 ， 你这个 ， 你那个叫什么来着 ，dependency 有点多 。 这个方法就比较简单明了了 ， 速记法是吧 ？ 就好像有些人写那个 ， 哎 ， 那个 ， 那个 magic number 是怎么来的来着 ？

就是快速开方 ， 对吧 ？

**Rio** [52:50]
啊 ，OK。

**吴涛** [52:51]
对 ， 你费了半天劲写了一个无比正确的快速那个一个开方算法 ， 人家说他过来写了一个 magic number， 然后就把这个事情完美的解决了 ， 然后精度还可以接受 。

**Rio** [53:03]
在线性时间解决了 。

**吴涛** [53:04]
哈哈哈 ， 对啊 。 是不是惊呆了 ？

**Rio** [53:09]
嗯 ，是 ， 好吧 。

**吴涛** [53:11]
啊

， 啊 ， 说到这个 ， 刚才讲那个线性时间也提到这个 ，也有最近有个挺好玩的是 ， 呃 ， 问题什么来着 ？

呃 ， 请给出一个函数在 ， 它是 O1 的函数 ， 然后给出 ， 呃 ， 让它算这个 int 类型的那个 n 感叹号那个东西叫什么来着 ？

**Rio** [53:32]
阶乘 。

**吴涛** [53:33]
阶乘 ， 对 。

**Rio** [53:34]
What？ 在线性时间内 ？

**吴涛** [53:37]
对 ， 就 O1 的这个时间内给出 n， 一个函 ， 就写个这个阶乘那个函数嘛 ， 让它在线性时间内给出结果 。

**Rio** [53:44]
OK， 答案是什么 ？

**吴涛** [53:46]
你不知道怎么做吗 ？

**Rio** [53:47]
不知道 。

**吴涛** [53:48]
说出来一定会惊 ， 一定会惊 ， 惊死你 。

**Rio** [53:51]
Surprise me。

**吴涛** [53:53]
你就把那个结果预先算好 ， 写到一个那个什么数组里面嘛 ，因为 n， 你阶乘的话 ， 那个 n 不需要多大就会 overflow 那个 int 类型嘛 。

所以那个列表 ， 那个列表不会多大 。

**Rio** [54:07]
Jump table 吗 ？

**吴涛** [54:08]
对 ， 没错 ， 都不用 jump。

**Rio** [54:10]
What？

**吴涛** [54:10]
哈哈哈 。

**Rio** [54:11]
可是这 ， 这是 ， 这是 ， 这是赖皮啊 。

**吴涛** [54:15]
这 ， 这但是它 totally 符合这个 spec 呀 。 因为一旦这个 ， 这个 integer overflow， 它的那个 ， 一旦发生 integer overflow 的话 ， 它的那个 behavior is undefined 嘛 ， 当然 defined 你可以返回任何值 。

**Rio** [54:29]
那

， 好吧 ， 这 ， 这是其实是和语言和开发环境相关的 。 如果你在 Haskell 里面写一个 n1 的 ， 呃 ， 计算阶乘的函数是不能这么写 。

**吴涛** [54:42]
那个 Haskell 的那个 ， 那个 int 类型是任意精度的吗 ？

**Rio** [54:46]
Haskell 有 number 类型 ， 呃 ，也有跟平台相关的什么 int32 类型 ， 如果没记错的话 ，但是我很可能记错了 。

**吴涛** [54:53]
所以说我说 ， 我说是写 int32 这种类型的东西可以用这个赖皮的方法 ， 这算是一种赖皮 ， 对吧 ？

**Rio** [54:58]
对 ， 没错 。

**吴涛** [55:00]
哈哈哈 。

**Rio** [55:00]
但是真面试是不会过的 。

**吴涛** [55:04]
不一定啊 ， 可能会问你那类似 ， 那你说那个 magic number 快速开方这个算会不会过呢 ？

**Rio** [55:11]
呃 ， 首先不可能有人在面试的时间直接想到这个 number。 就你如果写出你答案 ，也就意味着你是看到过这个故事的 。

**吴涛** [55:23]
那如果 ， 那最开始发明这个 magic number 那个人呢 ？

**Rio** [55:26]
那他也不可能是在面试的时候发明的 。

**吴涛** [55:28]
嘿 ，hold on， 那个 ， 那哥们好像就是那个写 FMPEG 那个作者吧 ？

**Rio** [55:32]
不可能 ， 这个 ，他这是 Kwm。

**吴涛** [55:35]
对 ，他比那个人早多了 。

**Rio** [55:38]
OK。

**吴涛** [55:38]
而且这 ， 这甚至不是 Kwm 发明的 ，Kwm 说他是在什么地方看到的 。

**Rio** [55:43]
也是在 。

**吴涛** [55:43]
就如果你去看 Wikipedia 的那个 magic number 的那个词条的话 ， 它会 ， 它会注明说开发者不详 ， 就谁找出来这个数不详 。

**Rio** [55:53]
OK。

**吴涛** [55:54]
啊 ，anyway， 扯 ， 扯回刚才那个 Rockchip 那个 ， 那个 。

**Rio** [55:57]
哦 ， 扯到哪了 ？

**吴涛** [55:59]
有点绕得远了 。 刚才讲那个 Rockchip 是中国福建的一家专门为低端平板电脑生产英特尔芯片的厂商 ， 好像是这样 。

**Rio** [56:09]
对 ，而且它 ， 它应该不是代工厂商 ， 它只是一个研发厂商 ， 它自己没有厂 。

**吴涛** [56:15]
哎 ， 好像这家其实挺奇怪的 ，因为之前当时英特尔宣布过一个合作 ， 就是跟这家厂的 ，但我当时还觉得挺奇怪的 ， 为什么选这家 。

后来我大概明白怎么一回事了 ， 就是因为英特尔要在 ， 叫什么 ， 抢回被 Arm 处理器夺走的这个平板电脑市场 。

**Rio** [56:38]
低端 。

**吴涛** [56:38]
对吧 ？ 所以特别跟这个 ， 呃 ， 英特尔有一个合作

， 去基于那个英特尔的这个 Atom 这个处理器 ， 去做一些这种低端的平板 。 市面上那种低 1000 块钱以下的英特尔平板基本上都是用的 ， 用的这家的芯片 。

**Rio** [56:59]
嗯哼 。

**吴涛** [57:00]
非常有意思 。 然后， 嘿 ，他们就在芯片里面搞出了这么一种楼子 。

**Rio** [57:05]
幺蛾子 ， 对 。

**吴涛** [57:07]
对 ， 怎么说呢 ， 我其实挺丢人的 ，因为从一个硬件的厂商这个 ，因为你硬件也是 ， 某种程度它还是有软件的成分在里面 。

**Rio** [57:16]
硬件是固化的软件 。

**吴涛** [57:18]
没错 。

**Rio** [57:19]
建筑是 ， 建筑是凝固的音乐 ， 硬件是固化的软件 。

**吴涛** [57:23]
这个还能对上 ，不错哈 。anyway， 就说这个 ， 这个事本身说明一个 ， 一个什么现象呢 ？ 就是说可能反映了我们做事的时候认真不足 。

**Rio** [57:37]
不够死抠字 ，不够 ，不够抠得不够死 。

**吴涛** [57:40]
不够严谨嘛 。

**Rio** [57:41]
嗯 。

**吴涛** [57:42]
或者说你的这个 ， 包括验 ，因为芯片还是有什么验证的环节嘛 ， 都没有发现这种明显的问题 ，是吧 ？

**Rio** [57:48]
对 ， 这说明什么呢 ？ 说明他们开发周期短于一年 。

**吴涛** [57:53]
哈哈 ， 还没到那一年呢 ， 已经出现这个问题了是吧 ？

**Rio** [57:56]
对 。

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

**Rio** [57:59]
但是其实我有点好奇 ， 就是为什么 calendar 这个东西要在硬件层面实现 。

**吴涛** [58:04]
它是一个硬件时钟嘛 。

**Rio** [58:07]
可是硬件 ，不是硬件时钟可以理解 ， 硬件时钟可以简单的只提供 ， 就是一个计数啊 ， 那为什么 calendar 这个东西要由硬件来提供 ？

**吴涛** [58:16]
哼 ， 这是一个好问题 。

**Rio** [58:18]
对 ， 你比如说你在那个电脑上提供一个 ROM 级别的那个硬件时钟 ， 我可以理解 ，因为那是 BIOS 的一部分 ，但是在一个简单的平板上为什么也需要这个 ？

还是说其实平板本质上就是一台电脑 ， 那既然电脑需要的话 ， 平板也需要 ？

**吴涛** [58:37]
对啊 ， 我觉得就是这样子的呀 。

**Rio** [58:38]
好吧 。

**吴涛** [58:39]
但是我觉得可能更 ， 要 ， 刚才你说那种是一种实现方式嘛 ， 就是说我硬件只提供一个 ， 就是按秒 ， 呃 ， 自增的一种 ， 一个绝对数 ， 然后你 。

**Rio** [58:50]
就像单片机一样 。

**吴涛** [58:52]
对 ， 对 ， 对 ， 然后你直接通过软件的算法去 ， 啊 ， 把它转为一个 ， 就是我们正常的一个日历的时间 ，因为这个算法还挺复杂的 ，因为它不是一个科学的东西嘛 ， 对吧 ？

它是一个有一些各种各样的修正值 ， 各种各样的特例加在里面去的 ， 对吧 ？ 比如说历史上好像哪几年少了几天 ， 还有什么乱七八糟的 。

**Rio** [59:11]
对 ， 日期实际上是一个非常复杂的 。

**吴涛** [59:14]
对 ， 还加上什么闰年闰秒啊之类的 ， 就很复杂 。

**Rio** [59:16]
日期最让人讨厌的地方是有时候它不是算出来的 ， 它是观测出来的 。

**吴涛** [59:24]
哈哈哈 。 对 ，但是 ，但是这家出现这种问题 ，其实我觉得在某种程度上是给 ， 就是我们叫做中国制造这个牌子是抹黑的嘛 ， 对吧 ？

**Rio** [59:36]
OK， 伤害了中国人民的感情 。

**吴涛** [59:38]
呃 ， 就为什么我们老总结都说 Made in Germany， 啊 ，Made in Japan， 现在是一个 ， 啊 ， 好的这个品质的标志 ， 大家都追求要 ， 要买这个外国本土制造的 ，而不是说外国品牌中国制造的这种东西 ， 对吧 ？

**Rio** [59:53]
出了大众 。

**吴涛** [59:55]
对对对 。 哈哈哈 ， 又自黑 。 啊 ，但我觉得一种很重要的原因就是说这些 ， 啊 ， 品 ， 这种 Made in XX 国家的这种品牌在某种程度上代表了消费者对这种品牌的一种信任嘛 。

但是如果说你老是出这种幺蛾子的话 ，其实你这个 ， 这种 Made in China 的这种牌子就不可能说在一二十年后或者二三十年后变得像我们现在看 Made in Germany，Made in Japan 一样的那种 ，有一种什么信任感在里面 。

**Rio** [1:00:29]
我觉得还是一个沉淀的问题吧 ， 就是德国货在 18 世纪的时候也是劣等货的代名词 ， 英国货是最好的嘛 ， 然后日本货在 90 年代也 ， 呃 ，在 80 年代也是 ，wait a second， 日本货在 60 年代是比较烂的 ， 欧洲人就觉得日本货就是 ， 就感觉现在的 Made in China 一样 。

**吴涛** [1:00:49]
对 ，80 年代的 Made in Japan 已经很好了 。

**Rio** [1:00:52]
80 年代已经 ， 日本已经是世界上首屈一指的硬件制造商 ， 然后现在 ， 现在也就是中国比较 ，但即便现在的中国货也已经要比什么孟加拉或者是越南之类的要好一些 。

所以我觉得这是一个积累过程吧 ，也许再过上 100 年， 中国货也就变成了就高端品牌 。

**吴涛** [1:01:16]
Hopefully，但如果他们接得出这种幺蛾子 ， 我觉得这个时间要往后再拖一拖 。

**Rio** [1:01:21]
当前肯定不可能啊 ，但看 ， 看将来吧 。

**吴涛** [1:01:25]
OK。

**Rio** [1:01:26]
Yeah。

### 窗口管理

**吴涛** [1:01:28]
呃 ， 下面有一个小玩意儿 ， 之前我们也讲过哈 ， 就是你在 Linux 上面用的是一个叫做 I3 的窗口管理系统 ， 对吧 ？

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

**吴涛** [1:01:39]
然后当时我们说它是一个叫做 Tiling based window management， 就是基于磁片的 。

**Rio** [1:01:46]
评估式的 。

**吴涛** [1:01:47]
对 ， 如果你不知道基于磁片是什么意思呢 ？ 请找一个 Windows Phone 来看一下就知道了 。

**Rio** [1:01:53]
哈哈哈 ， 请 ， 请看一下自己家厕所瓷砖 。

**吴涛** [1:01:57]
哈哈哈 ， 这个 ， 这个比喻太生硬了 。

**Rio** [1:02:01]
呃 ， 对 ， 简单来说一个 Tiling window manager 会把你的窗口尽可能的铺开 ， 就是彼此不互相遮挡 ， 这是 Tiling window manager 的一个最主要的特征 。

呃 ， 这也就是为什么很多人会选 ， 会 ， 会 ， 比如说我会选用它的原因 ， 就是因为你不 ，不用再操心哪个窗口在下， 哪个窗口在上 ，因为所有的窗口都尽可能 。

**吴涛** [1:02:25]
不存在遮挡的问题 。

**Rio** [1:02:26]
平铺开 ， 对 ， 如果你不看一个窗口的话 ， 那它们 ， 那它要么完全的被另外一个窗口遮挡了 ， 要么它就 ， 嗯 ， 被关掉了 。

**吴涛** [1:02:36]
啊 ， 然后， 然后我之前用 Linux 桌面的时候也小小试过一段时间 I3， 确实好用 。

**Rio** [1:02:46]
但是 ， 啊 ， 没办法 。

**吴涛** [1:02:48]
但是我现在用 OSTen 了 。

**Rio** [1:02:49]
啊 ，OK， 对 ， 然后在 OSTen 上我们两个 ， 你是用什么 Dewey？

**吴涛** [1:02:54]
对 ，Dewey。

**Rio** [1:02:55]
对 ， 我们两个都用 Dewey， 就是有机会 。

**吴涛** [1:02:58]
不仅解决这个问题 。

**Rio** [1:02:59]
对 ， 你不需要用手 ， 鼠标去挪动窗口 ，因为用鼠标挪动窗口是一个非常耗时的功能 ，而且在 99% 的情况下， 你进入一个特定的工作模式的时候 ， 你的窗口布局实际上是特定的 ， 所以你可以用一个快捷键来快速的把自己的窗口挪到自己想要的位置 。

**吴涛** [1:03:16]
呃 ， 对 ，但毕竟那个什么 Dewey 它不是 I3 那种方式嘛 ， 还是很 ，有一种什么来着 。

**Rio** [1:03:25]
就你还是有那种人为的 ， 人为的操作把窗口挪动到指定的位置 ，而它不能做到说一个窗口一打开就去那个位置 。

**吴涛** [1:03:34]
对 。

**Rio** [1:03:34]
对吧 ？

**吴涛** [1:03:34]
而且还有一些边框啊 ， 那些也没有办法很好的弄掉 。

**Rio** [1:03:38]
对 。

**吴涛** [1:03:38]
啊 ， 然后就出了这么一个叫做 Kwm。 Tiling window manager with focus follows mouse for OSTen。

**Rio** [1:03:48]
对 。

**吴涛** [1:03:49]
但是先要声明一下这个我没有装哈 ，因为 。

**Rio** [1:03:51]
嗯 ， 我也没有装 。

**吴涛** [1:03:53]
现在是一个 ， 嘿 ， 还在开发中的一个东西 ， 就可能会有一点点问题 。

**Rio** [1:03:59]
版本号是零点几来着 ， 零 ， 零点 。

**吴涛** [1:04:02]
对 ，但是从截图和描述的情况来看 ， 它基本上在 OSTen 上复刻了 I3 的全套功能 。

**Rio** [1:04:09]
对 。

**吴涛** [1:04:09]
包括最最重要的那个 focus follows mouse， 这个肯定要稍微解释一下什么意思啊 。 就毕竟我们现在用的这个 ， 啊 ， 桌面系统它还是一个单一 focus， 单一焦点的一个系统嘛 ， 就是一次只能有一个窗口处于激活状态 ， 一次只有一个对话框处于一个激活状态 ， 对吧 ？

然后 focus follow mouse 呢 ， 它会直接决定说你把那个鼠标光标挪到某一个窗口上面的时候 ， 哪怕你没有点击激活它 ， 它会自动帮你切换到那个应用上面去 ， 这个时候你去输入的这个快捷键啊什么的都可以比较方便的 ， 啊 ， 意义上来去不用再单独按一个键去 type， 就说这个 command type 去切换了嘛 。

**Rio** [1:04:49]
嗯哼 。

**吴涛** [1:04:51]
对 ， 啊 ， 这个我觉得非常好用 。

**Rio** [1:04:54]
对 ， 这是一个比较 ， 尤其是在 Tiling window manager 里面比较重要的一个 ， 一个特性 ， 就是你在 Dewey， 当然 Dewey 的 ，Dewey 完全不去 ，Dewey 实际上是一个非破坏性的窗口 ， 窗口管理辅助工具 ， 呃 ， 它没有必要实现这个功能 ，而且我觉得 ， 啊 ，Mac 上面有一点 ， 或者说我已经习惯一点是 ， 如果你的一个窗口比较小 ， 然后它遮挡了后面一个比较大的窗口的一部分 ， 然后你把那个 focus 放在前面的这

个小窗口上， 鼠标挪 ， 鼠标则在后面那个大窗口上， 此时你挪动滚动条 ， 呃 ， 被滚动的是后面那个大窗口 。

**吴涛** [1:05:37]
啊 ， 对 ， 这个 ， 这个 Mac 上， 呃 ， 就这个特性是已经有一点那种 focus follow mouse 的感觉了 。

**Rio** [1:05:43]
对 ， 这实际上是一个对我来说已经足够有点 。

**吴涛** [1:05:47]
哈哈哈 ， 只需要那个滚动窗口就好了是吧 ？

**Rio** [1:05:51]
对 ，而且这个特性有时候还挺有用的 ， 就是你在 ， 尤其比如在做摘抄的时候 ， 你的 ， 你希望自己的输入焦点一直在前面那个小窗口里面 ， 然后后面那个大窗口被 ， 呃 ，但是后面那个大窗口应该仍旧被 ， 呃 ， 被滚动 。

如果你是严格意义上的那个 focus follow mouse 的话 ，有可能那个小窗口就直接不见了 。

**吴涛** [1:06:16]
就被切到背后挡住了嘛 。

**Rio** [1:06:18]
对 ， 没错 。

**吴涛** [1:06:19]
对 ， 这也是一个 ， 所以有时候有一些那种 ， 啊 ， 工具型的应用 ， 它会做一个 always on top 的这么一种模式 ， 就一直在顶端 ， 就不管你把焦点丢到哪里去 ， 它一直浮在那个屏幕的最顶层 ， 如果你把那个屏幕上一层一层叠加的状况的话 。

**Rio** [1:06:34]
对 ，但是仍旧有一个输入焦点的问题 ， 就是你可能光标焦点不在哪 ，但你希望输入焦点在哪 。

**吴涛** [1:06:41]
对 。

**Rio** [1:06:42]
这也是一个

。

**吴涛** [1:06:45]
然后， 啊 ，有兴趣的 ， 就是如果你在桌面上用过 I3 或者被我们两个安利的觉得挺有试试的话 ， 可以去用一下这个叫做 Kwm 的窗口管理系统 。

**Rio** [1:06:57]
对 ， 它是用那个 。

**吴涛** [1:06:58]
它真的挺不一样的 。

**Rio** [1:06:59]
对 ， 它是用 ， 我看它是用 Carbon 写的 ，C++ 呼叫 Carbon API， 然后去 ， 它实际上是一个叫什么 ， 呃 ， 这个东西叫什么 ， 中文叫什么来着 ， 就是 assistant， 就是为残障人士利用那个残障人士 API。

**吴涛** [1:07:17]
Dewey 也是需要用残障人士才可以 ， 叫辅助功能 。

**Rio** [1:07:21]
啊 ， 对 ， 它是用那个辅助功能去 ， 去看那个 event loop， 然后， 呃 ， 去呼叫 Cocoa 的那套 API。

**吴涛** [1:07:30]
没错 。

**Rio** [1:07:31]
嗯哼 ， 可以试一试 。

**吴涛** [1:07:34]
所以 。

**Rio** [1:07:34]
就 ， 我意思是 ， 我刚才说这句话的意思是它的性能应该还不错 。

**吴涛** [1:07:38]
哈哈哈 ， 绕了好远 。

**Rio** [1:07:40]
对 ， 它不是用什么非常二的手段 ， 什么 AppleScript 之类的 ， 它是一个实打实的 C++ 程序 。

**吴涛** [1:07:47]
哎 ， 那个 Dewey 是用 AppleScript 方式实现的吗 ？

**Rio** [1:07:50]
我不知道啊 ， 好像不是吧 。

**吴涛** [1:07:52]
但是看它的那个感觉其实也是通过某种窗口 API 的方式来实现的 。

**Rio** [1:07:56]
它提供了一个脚本接口 ， 所以有可能是 ，有可能是 。

**吴涛** [1:08:00]
所以 ， 所以在本质上和 AppleScript 没什么区别 。

**Rio** [1:08:02]
对 。

**吴涛** [1:08:03]
OK。

**Rio** [1:08:04]
就 Dewey 有时候会让你的那个窗口失去 ， 失去外框之类的 ， 就我碰到过一两次 ， 非常 ， 虽然非常的稀少 ，而且其实不是所有的 ，不是所有的 ， 呃 ，App 都会接受 Dewey 的那个重定 ， 重新改它的命令 。

**吴涛** [1:08:23]
对 ， 主要是有些窗口它会说它会指定一个最小尺寸 。

**Rio** [1:08:25]
对 。

**吴涛** [1:08:26]
比如说这个微信的 Mac 版 ， 它你就不能缩到小于 ， 比如说某一个尺寸之后， 就它就不能再缩了嘛 。

**Rio** [1:08:34]
OK。

**吴涛** [1:08:34]
就挺讨厌 。

**Rio** [1:08:35]
OK， 我没有装微信 ， 这种东西怎么装在自己的电脑上 。

**吴涛** [1:08:40]
打字啊 ， 打字方便啊 。

**Rio** [1:08:42]
啊 ， 我宁可牺牲这个方便性 ， 就不要让腾讯的东西装到我电脑上 。

**吴涛** [1:08:48]
说明你用的还不够多 。

**Rio** [1:08:50]
嗯 ，其实微博应该已经被 ， 哎 ， 微博不是腾讯的 ，OK。

**吴涛** [1:08:55]
对 。

**Rio** [1:08:56]
嗯 ， 我刚才想说那个微博已经被集成到了系统级别 ， 所以 。

**吴涛** [1:09:00]
没有啊 ， 只能发 ，不能看 ， 你还要看还是得装个那个 。

**Rio** [1:09:04]
啊 ，OK。

**吴涛** [1:09:06]
推特也是一样的嘛 。

**Rio** [1:09:08]
好吧 。

**吴涛** [1:09:09]
半集成这个叫 。

**Rio** [1:09:11]
那推特至少是一个 ， 就不是 ，不是中国公司 。

**吴涛** [1:09:14]
哈哈哈 。 下面播报一个惊天大好消息 。

### IE 终结

**Rio** [1:09:21]
好消息 ， 好消息 ， 走过路过不要错过 ，I18、I19、I10， 全都 reaching end of life on Tuesday。 对 ， 就是各位听到这一期节目的 ， 哎 ， 这是 ， 这是这周日的节目对吧 ？

**吴涛** [1:09:38]
对 ， 对 ， 就是大概 。

**Rio** [1:09:39]
各位听到这一期节目的之后的第一个星期二 ，也就是 12 日，1 月 12 日 。

**吴涛** [1:09:45]
2016 年 1 月 12 日， 历史性的一刻 。

**Rio** [1:09:48]
对 ，IE， 呃 ，Internet Explorer， 呃 ， 八九十都不再被官方支持了 ，也就是他们 。

**吴涛** [1:09:56]
不再发布安全补丁 。

**Rio** [1:09:58]
对 ，不再发布安全补丁 ，而且用户在装了一个补丁之后， 会在使用浏览器的时候接收到一个提示 ， 说你赶紧升级到 IE 11 吧 。

对 ， 此前的 IE 6 和 7 已经死得很早 ， 然后现在八九十也就 ， 呃 ，Sun and Plant， 呃 ， 来到了自己的生命的尽头 。

**吴涛** [1:10:26]
那个 IE 6 和 7 应该是随着那个 Windows XP 的受众阵型开始正儿八经不被支持了吧 ？

**Rio** [1:10:34]
对 ， 我记得那个时候中国政府好像还官方谴责微软不再支持 Windows XP，有这事吧 ？

**吴涛** [1:10:41]
真的吗 ？ 有这事 ？

**Rio** [1:10:42]
对 ， 我记得好像是 ， 对 ， 很有可能是以讹传讹 ，但对 ， 各位有兴趣的话可以考虑一下 。

**吴涛** [1:10:48]
你可能做得出来 。

**Rio** [1:10:49]
对 ， 我没有任何 ， 呃 ， 没有任何这个责任啊 ， 毫无责任的传个谣 。

**吴涛** [1:10:58]
你 ， 你不办人寿贴你就死了你知道吗 ？

**Rio** [1:11:01]
嗯 ， 好吧 。

**吴涛** [1:11:03]
啊 ， 无所谓了 ， 你现在已经不是了 。

**Rio** [1:11:05]
对 。

**吴涛** [1:11:05]
不受法律 。

**Rio** [1:11:06]
不受 ，不受你国法律管制 。

**吴涛** [1:11:08]
天朝法律管制 。

**Rio** [1:11:08]
耶 。

**吴涛** [1:11:10]
啊 ， 那这个微软的官方政策现在是怎么样 ？ 它只支持 ， 呃 ， 叫什么来着 ， 只更新维护最新一个版本的 IE， 对吧 ？

**Rio** [1:11:19]
对 。

**吴涛** [1:11:20]
就是目前是 IE 11，以及那个新出的叫做 Edge 的浏览器 。

**Rio** [1:11:26]
对 。

**吴涛** [1:11:27]
对 ， 啊 ， 当然呢 ，其实这个也会带来一些不大不小的影响啊 ， 本来这个什么就千疮百孔的安全 ， 呃 ， 现状是吧 ， 然后又不再发官方支持了 ，以后再报个什么各种 zero day， 就你就只能歇菜了 。

**Rio** [1:11:45]
嗯哼 。

**吴涛** [1:11:45]
当然此举主要也是逼迫某一些 ， 呃 ， 机构 、 政府以及企业去升级嘛 。

**Rio** [1:11:55]
对 ， 怎么说呢 ， 反正为了 ， 为了技术的进步 ， 总是要牺牲一点点安全性吧 ， 这个 ， 这个 。

**吴涛** [1:12:01]
对 ，但是我 ， 我发现最近就遇到一些不大不小的问题 。

**Rio** [1:12:05]
嗯哼 。

**吴涛** [1:12:06]
啊 ， 我装 ， 装了一个 Windows 10， 对 。

**Rio** [1:12:10]
啊 ， 我也装了 Windows 10。

**吴涛** [1:12:12]
然后用它的那个 IE 11 或者是 Edge 去访问一个 ， 呃 ， 我国政府的官方网站要申请一个东西 。

**Rio** [1:12:19]
OK， 歇菜啊 。

**吴涛** [1:12:21]
就歇菜了 。

**Rio** [1:12:22]
OK。

**吴涛** [1:12:23]
进行不下去 。

**Rio** [1:12:24]
哈哈哈 。

**吴涛** [1:12:25]
啊 ， 我也不知道问题 ，而且我点了那个叫做什么来着 ， 呃 ，compatibility， 兼容模式 。

**Rio** [1:12:30]
嗯哼 ， 还是不行 。

**吴涛** [1:12:31]
还是不行 。 啊 ， 我 ， 我也不知道该怎么办 。

**Rio** [1:12:35]
OK。

**吴涛** [1:12:36]
然后这个是 2015 年了哈 ， 我们那个天朝政府的那个 ， 那个门户网站下面依然还写了那么一句经典的台词 。

**Rio** [1:12:48]
啊 ， 推荐分辨率 800 乘 600。

**吴涛** [1:12:50]
为了保证最佳效果 ， 请 ， 请推荐使用 800 乘以 600 分辨率下使用 IE 6 浏览器访问本站 。

**Rio** [1:12:58]
哎 ， 怎么说呢 ， 就是有时候你会觉得 ， 呃 ， 中国把很多东西当成一个基础建设来使用 ，但实际上软件的更新的速度是远远超过于官员的预期 。

**吴涛** [1:13:13]
不 ， 它 ， 它当成基础建设这个 ， 这个 ， 这个做法是没错的 ， 它 ， 它就说我们之前有要用那个词叫做什么 ， 呃 ，lowest common denominator， 这个东西记对了 ， 最小公分母 ， 对 。

啊 ， 就是没错的 ，因为你是一个 。

**Rio** [1:13:29]
最大公约数 。

**吴涛** [1:13:31]
对 ， 对 ， 你 ， 你是一个政府机构嘛 ， 你要保证这个东西的 ， 它的这个可 ， 可用性 ， 你肯定要选择一个最低平台去做 ， 这个东西本身倒是其实没有什么问题 ，但是你可不可以选择一种更加规范的方式呢 ？

比如说 ，因为政府网站无非就填表单比较多嘛 ， 对吧 ？

**Rio** [1:13:48]
对 。

**吴涛** [1:13:49]
你就老老实实用一个这个 HTML 的 4 吧 ， 都不要说 5 了哈 ， 用 HTML4 的那些表单 ， 这儿帮你填就好了行不行 ？

非要搞一个什么 ， 呃 ， 插件 ， 这就不说了 ， 你说插件你还有个安全的考虑是吧 ？ 非要弄一些非常诡异的 JavaScript 的那个 ， 那个 ， 呃 ， 那种 ， 那种特 ， 特效 ， 比如说你 ， 你写个日期吧 ， 最简单一个 ， 对吧 ？

**Rio** [1:14:17]
嗯哼 。

**吴涛** [1:14:17]
你就给一个框 ， 让我输入 2015-12-13， 点一下就够 ， 就够了对吧 ？

**Rio** [1:14:23]
嗯哼 。

**吴涛** [1:14:24]
它不行 ， 它非要弄一个按钮 ， 然后按下来是一个展开的日历 ， 然后你要一段一年一年， 然后跳到你出生那一年， 出生那一月 ， 出生那一天再点一下 。

但如果你是像我们这种 80 后你觉得还可以忍是吧 ， 从 ， 尤其从 2015 年再点个 20 次就回到 198 几年了对吧 ？

**Rio** [1:14:43]
对 。

**吴涛** [1:14:44]
但是你要是对一个用户是 196 几年出生的人呢 ？

**Rio** [1:14:49]
呃 ，是这样 。

**吴涛** [1:14:50]
对吧 ？

**Rio** [1:14:51]
是这样 ， 没错 。

**吴涛** [1:14:51]
然后他们的解决方案说 ， 啊 ， 那你可以直接双击那个 2015 或者 2016 那个年份 ， 然后把它编辑成 196 几不就好了吗 ？

就不用点 50 次了嘛 ， 对吧 ？ 那既然如此的话 ， 你为什么要做这个日历呢 ？ 你直接让我在这个框里面输入不就好了吗 ？

**Rio** [1:15:07]
因为有些人适合一点呢 。

**吴涛** [1:15:09]
哎 ， 所以嘛 。 然后 。

**Rio** [1:15:12]
你知道 ，因为用户习惯是很难说的事情 ， 我知道你的槽点在哪 ，但我想说的就是 。

**吴涛** [1:15:18]
不 ， 我槽点还没完 ， 就我理解 ， 就说你说有些人不懂 ， 或者你还会输错格式 ， 比如他会输一个中文的横线或者其他乱七八糟的字符你无法控制 ， 那你要用这个日历控件我也没有问题 ， 那拜托能不能用一个向前兼容的日历控件 ？

你不要写一个日历控件出来让 ， 让你用一个最新的 ， 最符合这个 ， 这个 HTML 这个标准的浏览器反而不能用那个控件了 ，也说不清那个字是不是很沮丧

。

**Rio** [1:15:47]
这个 ， 好吧 ， 这我觉得 。

**吴涛** [1:15:52]
所以你说 。

**Rio** [1:15:52]
所以我的 ， 我的 ， 我的 ， 我的说的 ， 我的 ， 我的这个吐槽点在于 ， 如果说你的这个 ， 啊 ， 设计意向是说是一个 ， 呃 ， 面向 list， 呃 ，lowest common denominator， 最小公分母的这种设计的话 ， 那就不要搞那么多复杂的花花肠子好吧 ？

**吴涛** [1:16:08]
好吧 。 哎 ， 所以当然了 ， 这个东西一向就是说 ， 呃 ， 欧洲我不知道哈 ， 北美政府做的就还比较不错 ，他的网站再丑再烂 ， 至少能保证你在 ， 呃 ， 基本上主流的 ， 呃 ， 操作系统主流的浏览器里面用都没有问题对吧 ？

但中国的政府网站 90% 你离了 IE 6 就是不行 。

**Rio** [1:16:33]
中国的很多事情都是一个 ， 都 ， 都是一个非常混沌的政治决策的过程 。

**吴涛** [1:16:41]
不 ，但是我不 ， 我不觉得这个是一个政府的问题 ， 你不能指望说政府这么一种官僚机构它能够去帮你想到这些技术问题 ， 这个是明显是这个政府找的这个外包开发者 ， 这开发者的水平低下的一个 ， 一个结果嘛 。

**Rio** [1:16:57]
呃 ，但是为什么会找到开发水平低下的开发者 ，也是政府决策的一个过程 ， 就它的 。

**吴涛** [1:17:05]
这个 ， 这个两码事 ， 就是说两头 ， 就在嘛 ， 哪怕你说在北美政府一个 ， 美国政府也好 ， 我不知道德国政府怎么样 ， 就所有国家政府找的开发者肯定不是那个 ， 那个国家最优秀的 ， 这个是毋庸置疑的 ， 就是说你肯定找的是一个他们 ，他们投 ， 招投标嘛 ， 那找最低报价的那个 ， 那肯定是最 ， 只能是最次 ， 最次的 ， 那 ， 呃 ， 那能不能及格呢 ？

**Rio** [1:17:29]
OK， 如果你是这个意思的话 ， 好吧 ， 的确是 。

**吴涛** [1:17:32]
那 。

**Rio** [1:17:33]
对吧 ？

**吴涛** [1:17:34]
那这里说到这里就不得不表扬一下那个什么枫叶国政府哈 ， 最近应该是去年吧 ， 开始陆陆续续上线的枫叶国政府的那些办事的网站全部都 ， 就这国家级别的哈 ，但各省的还有点落后， 但国家级别的办事的网站全部都换了新的外观 ， 然后换了新的系统 ， 我觉得还相当不错其实 。

**Rio** [1:17:54]
OK。

**吴涛** [1:17:55]
至少人家 ， 至少人家自己用的 Helvetica。

**Rio** [1:18:00]
OK， 前两年英国政府也是有一个比较大的工程 ， 就是全面改换英国政府相关网站的外貌和易用性 ， 我记得 Type is Beautiful 还有报道 ， 然后也是现在改的就比较 ， 你会觉得那个有时候你会觉得那个 UI 可能有点傻 ， 就是有点 naive，但是的确是非常好用 ， 就是重要的信息写得很大 ， 然后重要 ， 重要的该点的按钮放得很 ， 放 ， 放 ，也画得很大 ， 然后颜色很鲜明 。

**吴涛** [1:18:29]
对对对 ，他们还是请过这种相对来说比较专业的设计团队去做过一个这个 rebranding 吧 ， 算是 。

**Rio** [1:18:36]
对 ， 所以你看它终究还是有要有一个政府 ， 政府行为在里面对吧 ？ 如果政府不去管这个 ， 就美国那个什么 ， 什么给残障人士的那个法案叫什么来着 ， 就是网站必须让视觉障碍者也能用的那个法案 ， 如果没有这种政府行为 ， 如果立法者不去做的话 ， 那 ， 那这个所有的实 ， 实施的这个工程商当然会选择你说的那个 ， 呃 ， 最大公因子来 ， 来 ， 来 ，

来 ， 来实施了 。

**吴涛** [1:19:12]
嗯哼 。

哎 ，anyway， 我也不知道这个东西该怎么去吐槽了 ， 你这东西就完全没有办法 。

**Rio** [1:19:22]
槽点有点乱 ， 说实话 ， 刚才说这一大串我们到底想要表达什么好像不是很清楚 。

**吴涛** [1:19:28]
哎 ， 没什么 ， 就也没 ， 就很 ， 很清楚啊 ， 就我们不满 。

**Rio** [1:19:32]
好吧 。

**吴涛** [1:19:32]
至于具体为什么不知道 。

**Rio** [1:19:34]
对 ， 总之刚才这条新闻这个 IE 八九十的 1 月 12 号就要死了 。

**吴涛** [1:19:41]
受众阵型 。

**Rio** [1:19:42]
对 ， 对于 ， 对于中国的开发者来说可能不是一个特别特 ， 特别有意义的消息 ，不过 ， 呃 ，在 IE 市场份额没有那么大的其他国家这是一个比较大的事情 。

**吴涛** [1:19:57]
走 。

**Rio** [1:19:58]
对 。

**吴涛** [1:19:59]
呃 ， 最后说两件事吧 ， 那我先要 ， 我先要 ， 我说 ， 我最近做了一个事 。

**Rio** [1:20:06]
嗯哼 。

### Neovim 终端

**吴涛** [1:20:07]
我装了那个 Neovim。

**Rio** [1:20:09]
OK。

**吴涛** [1:20:10]
然后我把我的那个 Vim， 呃 ， 设了一个 alias 吧 ， 就 VI 默认是启动那个 Neovim。

**Rio** [1:20:19]
OK，NVI 默认启动 NVI。

**吴涛** [1:20:21]
对 ， 没错 。

**Rio** [1:20:23]
OK。

**吴涛** [1:20:24]
然后 Neovim 里面有个特别好的 ， 呃 ，Neovim 我们之前说过吧 ， 还是没说过是吧 ？

**Rio** [1:20:30]
说过吧 ，有一期我记得我刚才翻 show notes 还看到前面有一期提到了它 。

**吴涛** [1:20:36]
OK，anyway，Neovim 就是一个 Vim 的 ， 叫什么来着 ， 呃 ，不算 fork， 它这个算什么 ？

**Rio** [1:20:46]
Rewrite。

**吴涛** [1:20:47]
对 ， 算是一个 rewrite， 就是把 Vim 的那些历史包袱都丢掉了 ， 比如说 Vim 至少在逻辑上现在还是支持 DOS 系统的 ，但是相信已经没有人再用 DOS 系统了 。

**Rio** [1:21:00]
You never know，不过 。

**吴涛** [1:21:03]
啊 ， 还有一些更 ， 更古老的我们从来闻所未闻的什么 Amiga 呀 ， 还有什么那些稀奇古怪系统就是已经绝迹了 。

**Rio** [1:21:11]
对 ， 它还 ， 它总是这么说吧 ， 它为了支持某些 0.001% 的市场份额 ，在

。

**吴涛** [1:21:18]
但从 。

**Rio** [1:21:18]
从而存留了一些非常古老的代码 。

**吴涛** [1:21:20]
但其实有人说过这个事情 ，其实现在的所谓的 Vim 支持那些古老的操作系统其实都是没有经过验证的 ，因为没有人在那边 compile 过最新版本它到底能不能用 。

**Rio** [1:21:31]
好吧 ， 你的这个 test user pool 可能就个位数的一些人。

**吴涛** [1:21:36]
对 ，a handful。

**Rio** [1:21:38]
对 。

**吴涛** [1:21:39]
啊 ，anyway，Neovim 就是说 ，Neovim 他们作者在之前想去在 ， 在那个 Vim 的那个代码里面提交一些改进 ， 然后被那个 Vim 的作者 Mur。

**Rio** [1:21:51]
Mulana。

**吴涛** [1:21:52]
Bram，Bram Mulana 是吧 ？

**Rio** [1:21:54]
嗯哼 。

**吴涛** [1:21:54]
拒了 ， 然后他们一怒之下就自己 。

**Rio** [1:21:58]
另起炉灶 ， 对 。

**吴涛** [1:21:59]
另起炉灶 ， 起来叫做 Neovim，Neo 就是新的意思嘛 ， 新 Vim。

**Rio** [1:22:03]
对 。

**吴涛** [1:22:03]
然后他们的一个主要的卖点其实之前可能介绍过就不说了 ，但主要简单提一下就是把 Vim 的一些历史包袱都拿掉了 ， 只保留最 ， 就现在还在实际使用的操作系统支持 ， 还有一些他们认为不必要的特性也去掉了 ，但也加入一些比较新的特性 。其实我就要大力推荐一个特性叫做 terminal mode。

**Rio** [1:22:28]
嗯 ，terminal mode， 就是可以在 Vim 里面呼叫 terminal。

**吴涛** [1:22:31]
就是可以在 Vim，Neovim 里面可以开一个 。

**Rio** [1:22:37]
Terminal mode。

**吴涛** [1:22:37]
Window， 然后你可以打冒号 terminal 回车 ， 这个 buffer 就变成了一个 terminal 的 portal。

**Rio** [1:22:46]
OK。

**吴涛** [1:22:48]
从此告别 Tmax。

**Rio** [1:22:51]
好吧 ， 我的观点还是这个 ， 这是朝 UMAX 这个邪教的方向发展 。 你为什么不直接 control 下自己切换回 terminal？

**吴涛** [1:23:02]
因为有时候你要 side by side 对比嘛 。

**Rio** [1:23:04]
好吧 ，fair enough。

**吴涛** [1:23:06]
然后有时候其实最主要问题是其实它解决了这么一个问题 ， 就是你要把 terminal 里面某一个命令的输出 ， 啊 ，以一种比较精确的方式复制回 Vim 里面去 ， 我不知道这种方式出现的概率有多少 ，但是我可以想见一些用例了 。

**Rio** [1:23:27]
这个 Vim 可以做到呀 。

**吴涛** [1:23:29]
呃 ， 你告诉我怎么操作 。

**Rio** [1:23:32]
我具体的不是很 ， 我可以查一查然后回答 。

**吴涛** [1:23:37]
大部分人是这么操作的 。

**Rio** [1:23:38]
应该可以 。

**吴涛** [1:23:39]
大部分人是这么干的 ， 就是开一个 terminal 窗口 ， 然后运行那个命令 ， 找到输出 ， 然后用鼠标那个滚轮滚上去 ， 然后用那个鼠标选中那个区域 ， 右键点复制 ， 切回 Vim 再用那个 clipboard 粘贴回来嘛 。

**Rio** [1:23:55]
呃 ， 对 。

**吴涛** [1:23:56]
就是 。

**Rio** [1:23:56]
但这是比较难用的一个方式 ， 我的印象里面的确有比较更 rewrite 的方式来着 。

**吴涛** [1:24:02]
你用 Tmax 的话 ， 它有一个 mode 是可以往回滚 ， 滚到它用进入一种类似 Vim 的 normal mode 的一种方式 ， 然后你可以选用那个光标选择一串字符 ， 然后复制到系统 ， 系统剪切板里面 ， 然后再切回 Vim， 然后再通过那个系统剪切板再贴回你的 Vim 编辑器里面 ， 对吧 ？

但是以上都是需要经过系统剪切板的 。 但是如果你把这个用 Neovim 这个 terminal 窗口的话 ， 它是在同一个 Vim 的 buffer 里面 ， 你不需要经过系统剪切板 ，而且所有的 ， 所有的 Vim normal mode 可以用的快捷键啊 ， 这些包括那种跳几行啊 ， 选择几个字啊 ， 这方式都可以在 terminal window 的 normal mode 里面实现 。

**Rio** [1:24:49]
OK， 所以它实际上是一个有点像一个 Vim keybinding 的 ， 呃 ，bash，但只是更好 。

**吴涛** [1:24:57]
呃 ， 它实现是这样的 ， 它实现是它有那个 lib term 吧 ， 还是 libvert 我忘了 ， 啊 ， 去在底层真的是开了一个这种 terminal 终端模拟器 ， 然后它只是把终端模拟器的结果一直映射到某一个 Vim 的这个 buffer 里面去 。

然后那个 buffer 会有两种模式 ， 一种是插入模式 ， 一种是普通模式 ， 插入模式的话你所有的输入都会直接被发送到那个终端里面去 ， 然后再把终端的那个结果回写回这个 buffer 嘛 。

**Rio** [1:25:26]
OK。

**吴涛** [1:25:26]
但是如果你按一个特殊键的组合回到这个 normal 的话 ， 这个 buffer 就跟 ， 呃 ，Vim 的任何一个普通 buffer 是一模一样的 。

**Rio** [1:25:37]
OK， 我懂 。

**吴涛** [1:25:38]
你所有的那些操作都变成 Vim 的操作 ，不会出现任何例外的情况嘛 。

**Rio** [1:25:42]
好 。

**吴涛** [1:25:43]
啊 ， 所以 。

**Rio** [1:25:44]
我查到了这个 Vim 里面可以用 read， 就是那个冒号 read， 然后后面跟一个感叹号 ， 然后加一个命令 ， 它就可以把那个命令的输出贴 ， 贴到你当前的 buffer 里面 。

**吴涛** [1:25:57]
那就全部你不能选择了 。

**Rio** [1:25:59]
对 ， 的确是 ，但是你说的这个 terminal mode 的确是更灵活 ，也更 。

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

**Rio** [1:26:04]
更直观吧 ， 至少 。

**吴涛** [1:26:06]
对 ， 啊 ， 所以我自己的一个用例的话其实就挺好 ， 比如说整个屏幕就一个 Vim 全屏 ， 然后左边是编辑框 ， 然后右边是这个 terminal mode， 然后就可以正式进入 UMAX 邪教了 。

**Rio** [1:26:21]
啊 ，Vim as an operating system。

**吴涛** [1:26:23]
快要实现了 。

**Rio** [1:26:25]
啊 ， 浑身 。

**吴涛** [1:26:26]
但 Neovim，Neovim 找一些这种比较高级的特性也会帮助实现这些 ， 比如说 ， 啊 ， 它可以被 ， 被嵌入作为一个故意的程序的嵌入式的方式 ， 就通过这种 client-server 的方式 ， 它作为一个编辑 ， 编辑的 server， 然后 client 发送指令 ， 然后拿 ， 拿这个响应结果就好了 。

**Rio** [1:26:46]
OK。

**吴涛** [1:26:47]
所以这个邪教的路上越走越远了是吧 ？

**Rio** [1:26:50]
没错 ， 这个是这个用星际 ， 用星际争霸的这个术语来说 ， 它是一个 hybrid， 融合了 Zerg 和我们光荣伟大的 Protos 的这个种种特点 ， 造出来的一个非常强大的 ，但是双方都不喜欢的东西 。

**吴涛** [1:27:07]
哎 ， 你打完了吗那个 ？

**Rio** [1:27:09]
当然打完了 。

**吴涛** [1:27:10]
OK， 我是在 YouTube 上看了两个小时的 。

**Rio** [1:27:13]
你 YouTube 通关的 ， 天呐 。

**吴涛** [1:27:15]
对 ， 我是 YouTube 通 ，也不是通关 ， 通 ， 就没有看打仗的过程 ， 只看了那个 。

**Rio** [1:27:19]
Shame on you。

**吴涛** [1:27:20]
对 ， 那个过场动画的过程 ， 然后把整个故事集结都看完了 ， 实在没时间打呀 。

**Rio** [1:27:25]
好吧 ， 你现在是 ， 对 ， 天使投资大忙人。

**吴涛** [1:27:29]
哎 ，不不 ， 各种瞎折腾 。

**Rio** [1:27:31]
啊 ， 风险投资 ，sorry。 哎 ， 你最近那个 ， 呃 ，Rio 掮客工程就是给各位 ，Rio has talent。

**吴涛** [1:27:41]
啊 ， 你还在进行 ， 还在进行 ，但是最近有些是在线下进行的 。

**Rio** [1:27:45]
啊 ， 非常好 ， 所以你要在这继续打广告吗 ？

**吴涛** [1:27:49]
呃 ， 这 ， 这期先不打了 ， 下次吧 。

**Rio** [1:27:51]
OK。

**吴涛** [1:27:52]
合适的再说 。

**Rio** [1:27:53]
好 。

**吴涛** [1:27:55]
啊 ， 最后再讲一个 ， 一个算是大新闻吧 ，但是这个我不知道 ，其实跟技术没什么关系 ，但是因为这个人事 ， 呃 ， 要不你来说吧 。

### 创始人离世

**Rio** [1:28:06]
好吧 ， 就是 ， 呃 ， 我最喜欢的 Linux 发行版的创始人之一 ，是创始人之一吧 。

**吴涛** [1:28:14]
就创始人吗 ？ 还有之一 ？

**Rio** [1:28:16]
就是创始人 himself。

**吴涛** [1:28:18]
对 ， 就是 Debian 的创始人叫 Ian。

**Rio** [1:28:22]
对 ，他 ，他自杀了 。

**吴涛** [1:28:24]
就是 Debian 是两个名字的合体嘛 ，是他当时的女朋友还是老婆 ， 忘了 ， 女朋友吧 。

**Rio** [1:28:34]
就像京东一样是吧 ？

**吴涛** [1:28:35]
叫 Debbie 吧 ， 应该是 ， 然后就 Debbie， 然后他叫 Ian 嘛 ，I-A-N， 所以是 Debbie 嘛 。

**Rio** [1:28:41]
OK。

**吴涛** [1:28:42]
然后最近这个 Ian 在推特上放话说他被警察胖揍了一顿 ， 然后他就决定自杀 。

**Rio** [1:28:51]
对 ， 呃 。

**吴涛** [1:28:53]
然后他就果然自杀了 。

**Rio** [1:28:55]
对 ，Ian 在 Constance 出生 ， 就是他是个德 ， 德裔美国人， 然后他在 1973 年 4 月 28 日生于 Constance， 然后 2015 年 12 月 28 日 。

**吴涛** [1:29:09]
哎 ，Constance 是那个 ， 那个 ， 那个三国交界的湖边是吧 ？

**Rio** [1:29:12]
伯登湖那个 。

**吴涛** [1:29:13]
OK， 对 。

**Rio** [1:29:14]
然后死于 San Francisco， 然后他死因 ，他的死因是被警察 ， 这被警察逮捕了吗 ？ 好像也没有 ， 警察跟着他 ， 我看他的临终前的几条推是他 ， 警察去了他家 ， 然后把他打了一顿 。

**吴涛** [1:29:35]
对 ， 这个事情现在就没有 ，因为现在事情还在调查中嘛 ， 对吧 ，也不知道到底怎么回事 ，但是根据他之前出 ， 就是自杀之前几天在推特上的 ， 呃 ， 发的推 ， 我们整理出一个时间 ， 这个线索大概是说警察因为现在美国这个警察暴力是一个很大的一个政治问题嘛 。

**Rio** [1:29:58]
对 。

**吴涛** [1:29:58]
然后之前都是什么都是什么 ， 主要是黑人被报道说被这个白人警察 ， 呃 ，由于这个什么种族歧视的原因胖揍了一顿 ， 或者是开枪滥杀之类的 ， 对吧 ？

但这回这个 Ian 这哥们是个白人， 然后也遇到这个状况 ， 所以 ， 呃 。

**Rio** [1:30:17]
他最后几条推里面有一条说 ，他说我是一个白人， 我每年赚 1.6 个 million。

**吴涛** [1:30:22]
对 。

**Rio** [1:30:23]
啊 ， 我受过良好教育 ， 结果被这帮警察孙子们打了一顿 ， 警察就是一群 ， 呃 ， 没有受过教育 ， 崇尚暴力的废物啊什么的 ， 我 ， 我的余生将 ， 呃 ， 与邪恶的警察作斗争 。

**吴涛** [1:30:37]
对 ， 然后他的余生就这样草草了结了 。

**Rio** [1:30:39]
然后他过了几天之后他就自杀了 。

**吴涛** [1:30:43]
哎 ， 对 ， 然后忘了说 Ian 这哥们最应该是就是半年前吧 ， 加入了这个 Cloudflare 这间公司 。

**Rio** [1:30:52]
嗯哼 。

**吴涛** [1:30:53]
Cloudflare 应该是目前 ， 呃 ， 应该是全球最 ， 如果不是最大也是排前几的那种网络基础设施的公司 。

**Rio** [1:31:04]
对 ， 呃 ， 我不知道该怎么 comment，因为这我不 ， 没有在美国生活过 ， 我不是无法想象美国的 。

**吴涛** [1:31:14]
有几个问题 ， 首先这个事情的来龙去脉我们都不知道 ， 我们只看到单方面的一个信息嘛 ， 对吧 ？ 也没有出现一个 ， 呃 ， 什么第三方的那个独立审计报道 ， 所以这件事情后续怎么样其实还难说 ，但是美国警察的这个暴政 ， 哈哈 ， 暴力执法其实有 ，是有一些年头了 。

**Rio** [1:31:35]
对 ， 前两年一直几乎没过一段时间就会有这样一个新闻冒出来 。

**吴涛** [1:31:41]
就不用前两年， 就去年吧 ， 基本上是每隔一个月就要闹一个事 ， 对吧 ？

**Rio** [1:31:45]
对 ， 我的意思就是过去的这两年之间一直有这样的事情浮现 ， 就是它的实 ，其实已经有一段历史了 。

**吴涛** [1:31:52]
对 ， 特别是那个上次 Ferguson 那个 ， 那个事 ，其实把这个事情推到了一个 ， 呃 ， 一个巅峰吧 。

**Rio** [1:31:59]
风口浪尖 ， 对 。

**吴涛** [1:32:00]
对 ， 就让人感觉好像八九十年代美国的犯罪非常猖獗 ， 警察是弱势群体 ， 现在是警察已经俨然演化成了美国最大的黑帮了 。

你 ，而且有时候我会觉得很奇怪 ， 就是你看美国的那些警察的器械 ， 当他们出动的时候 ， 那个 ， 那个枪械是要 。

**Rio** [1:32:21]
军事化的吧 ？

**吴涛** [1:32:23]
比什么世界上一个随便一个小国家的那个军队还要牛逼的 ， 就他们完全可以

。

**Rio** [1:32:30]
嗯哼 。

**吴涛** [1:32:30]
对抗什么 ， 对抗一个中亚小国啊之类的 ， 就只出动警察就够了 。 对 ， 这个事情也是有一个历史大背景的 ， 就是美国是 。

**Rio** [1:32:38]
不禁枪的吧 ？

**吴涛** [1:32:39]
不禁枪的吧 ， 大部分州是不禁枪的吧 。

**Rio** [1:32:42]
瑞士也不禁枪 。

**吴涛** [1:32:44]
啊 ，他们瑞士也不禁枪吧 ？ 不 ，他那个步枪还不一样啊 。

**Rio** [1:32:48]
好吧 ， 反正美国有些非常奇怪的条约 ， 什么你一支步枪只要它不是全自动的就可以卖 ，但实际上那个非全自动的步枪看起来跟 ， 看起来跟那个军人用的什么 M4 之类的一模一样 ，而且 。

**吴涛** [1:33:05]
而且他那个半自动的可以很快的改进 ， 改 ， 改装为全自动的嘛 。

**Rio** [1:33:11]
是 ， 对吧 ，是这样 。

**吴涛** [1:33:13]
对 ， 所以就是有这么一个大背景下， 就是说美国警察去执法的时候 ，他们面临的这个 ， 呃 。

**Rio** [1:33:19]
危险 。

**吴涛** [1:33:20]
风险也是蛮大的 ， 经常有什么黑帮啊 ， 暴力团体啊 ， 就也是这种全副武装的装备来对付你 ， 所以没有办法嘛 ， 这个矛和盾的问题就只能互相搞什么军备竞赛呗 ， 然后导致这个结果就是现在就是美国警察已经叫做准军事化了嘛 。

**Rio** [1:33:38]
是这样 。

**吴涛** [1:33:39]
然后就可以 ， 哎 ， 等一下， 这个是我们节目讨论的问题 。

**Rio** [1:33:43]
哈哈哈 ， 对 ， 我们好像有点朝这个 ， 朝这个叫 ， 叫什么 ， 选美的方向 。

**吴涛** [1:33:49]
选美 ，anyway，但这个 ， 这个是大背景交代一下， 具体听可能以后选美他们会 ， 会聊的话可能会讲到这个事 ，但是就是还是这提醒一下， 如果你是在美国的听众朋友们 ， 啊 ， 遇到警察小心一点是吧 ， 哪怕你是这个看起来人畜无害的亚洲黄种人软件工程师 ，也有可能被警察胖揍一顿的 。

**Rio** [1:34:11]
嗯 ， 对 ， 两条 ， 一个是不要跟他们说话 ， 第二就是他们问你什么你就说你要见律师 ， 第二就是什么 ， 千万不要让他们搜你的车 。

**吴涛** [1:34:21]
叫你干嘛你就干嘛 。

**Rio** [1:34:22]
即便你什么都没有 ， 你也不要让他们搜你的车 。 哈哈哈 ， 呃 ， 对 ， 这些都是从 YouTube 上得来的一些什么美国生存指南之类的 。

灯塔国怎么能这样 ， 对吧 ？ 哈哈哈 ， 太让我 。

**吴涛** [1:34:39]
灯塔国美人戏已经不行了你不知道吗 ？

**Rio** [1:34:42]
哎 ， 好吧 。

**吴涛** [1:34:44]
美 ， 美 ， 美人戏已经被那个什么反恐和这个绿教搞得也开始神 ， 神经兮兮的了 。

**Rio** [1:34:52]
嗯 ， 伊斯兰 ， 伊斯兰的在美国的问题没有欧洲大吧 ？

**吴涛** [1:34:57]
那肯定 ， 欧洲已经 。

**Rio** [1:34:58]
欧洲 ， 欧洲所以说不是灯塔国 。

**吴涛** [1:35:02]
哈哈哈 ， 灯塔盟也 ，也快 ， 快贵了 。

**Rio** [1:35:05]
不够萌 ， 对 。

**吴涛** [1:35:06]
对 ， 现在只能看看天朝怎么应付这些事情了呗 。

**Rio** [1:35:11]
嗯 ， 还看 ， 还要 ， 还看我那句话怎么说来着 ， 还看今朝 。

**吴涛** [1:35:17]
还看天超 。

**Rio** [1:35:18]
蜀风这种人物还看天朝 。

**吴涛** [1:35:20]
啊 ， 最近刚出了反恐法你知道吗 ？

**Rio** [1:35:22]
我知道呀 。

**吴涛** [1:35:23]
啊 ， 对 。

**Rio** [1:35:25]
但反正管不到我 ， 管他呢 。

**吴涛** [1:35:29]
哈哈哈 ， 管 ， 这个 ， 这个还是管得到的 。

**Rio** [1:35:33]
What？

**吴涛** [1:35:34]
比如说你回国探个亲 ， 然后被 ， 被人当做恐怖分子一顿 ， 一顿打 ， 你也很现实嘛 。

**Rio** [1:35:41]
好吧 。

**吴涛** [1:35:42]
对吧 ， 小孩就是 。

**Rio** [1:35:43]
你说我好忐忑呀 。

**吴涛** [1:35:46]
我只说这是一种 possibility。

**Rio** [1:35:48]
OK，edge case。

**吴涛** [1:35:52]
对 ，edge case，但是我们 ， 我们写程序嘛 ，不就是各种处理 edge case 嘛 。

**Rio** [1:35:59]
是这样 ，但是很遗憾没有办法做一个测试用例来探测这个边界条件 。

**吴涛** [1:36:05]
你 ， 你不能那个 try and catch， 你只能 try 一次 ， 然后你系统就崩溃了 。

**Rio** [1:36:11]
对 ， 就好像那个火星救援的小说里面 ，他们最后把什么一堆东西给拆了 ， 然后说这个东西的失败的可能性是 4%， 然后但是我没有办法探测它 ，因为你点火就是点火了 ， 没有 ， 没有什么办法能让你把它停下来再 ， 再重新修改 。

**吴涛** [1:36:29]
对 ，you have one shot。

**Rio** [1:36:31]
Yeah。

**吴涛** [1:36:32]
所以不能用写程序的思维来过人生了 。

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

**吴涛** [1:36:37]
搞不好那个 crash 了你就再也回不来了 。

**Rio** [1:36:40]
对 ， 人生没有 save load， 这是我们从 。

**吴涛** [1:36:43]
哎 ， 你说有没有人写程序的时候他不保存 ， 然后就一次写过 ，因为其实 。

**Rio** [1:36:49]
竞赛是有可能的吧 ？

**吴涛** [1:36:51]
有那个啊 ， 你记得那个叫什么 ， 呃 ，List Machine 的时代 。

**Rio** [1:36:56]
嗯哼 。

**吴涛** [1:36:57]
它不是整个那个 。

**Rio** [1:36:58]
随写随改 。

**吴涛** [1:36:59]
都是一个 image 嘛 ， 对吧 ？

**Rio** [1:37:00]
对 。

**吴涛** [1:37:01]
那如果说假设不保存的话 ， 那整个 crash 就没了 。

**Rio** [1:37:09]
对 ， 好 ， 听起来好恐怖啊 ，不过那个时候反正 。

**吴涛** [1:37:12]
不好 ， 好在他们是 list 吧 ， 应该不会怎么 crash 的 。

**Rio** [1:37:15]
而且那个时代就是机器比较简单嘛 ， 就像那个我们小时候任天堂 ， 那机器 crash 怎么办 ， 重启呗 ， 直接按下 power 键 ， 那个时候重启机器简直跟我靠玩一样 。

**吴涛** [1:37:26]
那个是因为你有 ROM 嘛 ， 你有那个固化 ， 那个 read-only memory 的存在 。

**Rio** [1:37:30]
List Machine，List Machine 也是固化的 ， 半固化的应该是 。

**吴涛** [1:37:34]
但至少就说你能恢复到一个初始状态 ，但是你改的东西就没了 。

**Rio** [1:37:37]
嗯 ， 那倒是 。

**吴涛** [1:37:39]
我们也是经过这样的日子的是吧 ？

**Rio** [1:37:41]
对 。

**吴涛** [1:37:42]
Crash only 的人生 。

**Rio** [1:37:44]
哈哈哈

。 好吧 ， 这一期就这么结束吧 ， 就新年第一期 。其实我们周年的时候也没有做什么庆祝啊 ，不像 ，不像那一次还请到了 CC 程来庆祝 IT 公论一周年 。

**吴涛** [1:38:02]
哈哈哈 。

**Rio** [1:38:03]
我们内核恐慌的一周年就默默无闻的过去了 。

**吴涛** [1:38:08]
不然你还想怎样 ？

**Rio** [1:38:11]
是啊 ， 过 80 大寿吗 ？

**吴涛** [1:38:13]
哈哈哈 。

**Rio** [1:38:14]
把萧姐 、 慕瑶和 CC 程全都请来 。

**吴涛** [1:38:17]
之前上过我 。

**Rio** [1:38:19]
祝过寿 。

**吴涛** [1:38:19]
恐慌的嘉宾一数 ， 一个手都能数过来 。

**Rio** [1:38:23]
对 。

**吴涛** [1:38:23]
哎 ， 数过来 。

**Rio** [1:38:24]
这可能也就是我们节目的传统吧 ， 我们以贤良为主 。

**吴涛** [1:38:30]
我们 ， 我们毕竟是一个娱乐节目是吧 ？

**Rio** [1:38:32]
对 。OK，在节目结束之前还有一个重大的新闻要宣布是吧 ？

**吴涛** [1:38:37]
呃 ，其实什么什么 ， 这是很小的新闻好吧 ，不过我们节目的听众可能会关心这种事 。

### 证书自动化

**Rio** [1:38:43]
A small step for real。

**吴涛** [1:38:46]
对 。

**Rio** [1:38:46]
A giant step for security。

**吴涛** [1:38:51]
最开始我们不是说这个 IPN 现在已经是全栈 HTTPS 了吗 ？ 包括 CDN 也是 ， 对吧 ？

**Rio** [1:38:57]
嗯哼 。

**吴涛** [1:38:57]
然后， 呃 ，其实我们最近做了一点改动是把所有 ，因为之前我们证书是用那个 Star SSL 的免费证书嘛 。

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

**吴涛** [1:39:06]
那其实挺烦人的 ，因为它那个界面 ， 呃 ， 是一个 web based， 你必须要一个一个鼠标去点去操作验证域名 ， 然后发放证书 ， 这个过程挺坑的 。

然后之前有人写了一个 ， 这个算是叫做什么 ， 呃 ， 爬网页那个叫什么 scrappy 对吧 ？

**Rio** [1:39:25]
嗯 ，crawler。

**吴涛** [1:39:26]
啊 ，crawl， 呃 ， 它不是 crawler， 它是网页 。

**Rio** [1:39:30]
哦 ，scrappy。

**吴涛** [1:39:31]
Web scrappy。

**Rio** [1:39:31]
OK， 就是把网上的资料刮下来那个 。

**吴涛** [1:39:33]
对 ， 刮下来然后再弄 ， 然后有人用基于这种方法做了一个 Python 的 ， 哈哈 ， 这个命令行工具 ， 模拟一个浏览器在操作那个 Star SSL 的网页 ， 然后去发放证书 ，但是整个不是非常稳定和靠谱嘛 。

**Rio** [1:39:49]
就是典型的所谓 duct tape programming。

**吴涛** [1:39:52]
对 ， 没错 ， 就是 ， 就是要放出你那张图是吧 ？

**Rio** [1:39:55]
哈哈 ， 对 。

**吴涛** [1:39:56]
胶水水管那张图一定要找出来哈 。

哈哈哈 。 呃 ， 然后， 呃 ， 我们上次不是说那个 Let's Encrypt 进入那个叫做 public beta 的阶段了吗 ？

**Rio** [1:40:07]
嗯哼 。

**吴涛** [1:40:08]
然后就可以不用邀 ， 邀请 ，也可以去就随意使用 ，但可能有时候会遇到它的一些坑或者是不稳定的时候 ， 这个目前还没遇到 。anyway， 就说 IPN 现在所有的其他所有的网站的域名的证书现在都全部是改成了这个 Let's Encrypt 发放的证书 。

**Rio** [1:40:26]
嗯哼 。

**吴涛** [1:40:26]
啊 ， 包括我们用的 CDN 也是 。

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

**吴涛** [1:40:30]
啊 ， 当然用了这个证书 ， 用了这个 Let's Encrypt 这个好处是什么呢 ？ 就可以一切自动化了 ，因为它本来就是一个 API 嘛 ， 它的 ， 它的那个网站甚至都没有一个界面可以让你手工去 。

**Rio** [1:40:41]
你必须用命令行 。

**吴涛** [1:40:42]
对 ， 你必须用它的这个命令行或者用它的官方客户端或者用第三方客户端去做这个事嘛 。 然后之前我用了一个别人写的一个叫做 ACME tiny 的一个 200 行 ，不到 200 行的一个 Python 脚本去做这个事 。

然后我仔 ， 我仔细观察了一个 ， 一个这个脚本 ， 发现和之前那个 ， 那个用 Star SSL 那种 web scrappy 的方式去做 ， 呃 ，有提升但是没有本质的区别 。

**Rio** [1:41:11]
嗯哼 。

**吴涛** [1:41:12]
比如说它会调用一个这个 Open SSL 的这个命令行工具去读取一个 RSA 的这个私钥 ， 然后再打印出它的公钥的部分 ， 然后再把那个公钥的部分的两个 ， 呃 ，component， 一个是 e， 一个是 n， 两个数字 ， 再转通过命令行的一些稀奇古怪的操作 ， 把它转换成那个 Let's Encrypt 服务端需要的格式再发送回去 。

**Rio** [1:41:37]
你刚才这句话政治不正确 ， 应该说利用这个 Unix 哲学的一组工作流 。

**吴涛** [1:41:44]
呃 ，which is highly unreliable。

**Rio** [1:41:47]
OK。

**吴涛** [1:41:47]
Anyway， 开玩笑了 ，其实还是挺 reliable 的 ， 就是假设那个域命令输出都正常的话 。 但是呢 ， 毕竟我还是不太喜欢这种政治不正确的方式去做这种 ， 哎 ，不叫 ，不叫政治不正确 ， 这叫 。

**Rio** [1:41:59]
政治正确的方式 。

**吴涛** [1:42:00]
这种比较不严谨的方式去做这么一种一 ， 一个操作嘛 ， 对吧 ？ 啊 ， 然后我觉得它那个界面也不 ， 就是那个 UI 啊 ， 就是 command line， 就是命令行程序也是要讲 UI 的嘛 ， 我觉得也不是特别好吧 。

啊 ， 所以呢 ， 这个时候作为一个还 ， 还在继续写代码的人， 哈哈 ， 的唯一正确方法是什么呢 ？ 是自己写一个 。

**Rio** [1:42:27]
OK。

**吴涛** [1:42:28]
啊 。

**Rio** [1:42:29]
黑客精神在 Rio 身上得了完美体检 。

**吴涛** [1:42:32]
哈哈哈 。 啊 ， 所以我用那个 Go， 呃 ， 重写了一遍这个一个 ACME 的客户端 。 啊 ， 为什么要用 Go 写呢 ？

因为 Go 里面的标准库有对这个有非常完善的支持 ， 包括连解析生成那个 RSA 私有 ， 呃 ， 那些 ， 那些公钥私钥啊 ， 包括 X509 证书的格式啊 ， 什么什么的 。

但其实我 ， 我用它写的一个最主要原因是 ， 之前用那个 Python 的客户端也好 ， 还是我看到那官方的那个 Python 一个非常庞大 ， 非常沉重的客户端也好 ， 它都不支持并发验证域名 ，因为它签发域名的时候 ， 它要验证你确实控制这个域名的 ， 通过的 ， 通过就是说你在这个域名服务器上部署一个特殊的文件的方式来实现的 ， 对吧 ？

但是他们都要一个一个 ， 就是顺序验证嘛 ，但是你知道 IPN 旗下有那么多 。

**Rio** [1:43:26]
如果能堆的话就 。

**吴涛** [1:43:27]
对 ，而且每个域名都有两个嘛 ， 一个是比如说 IPN.my， 然后有 WW.IPN.my， 然后把它跳转回 IPN.my 嘛 ，因为很多有些人是喜欢在前面加 3W 的嘛 。

**Rio** [1:43:37]
嗯哼 。

**吴涛** [1:43:38]
所以数一下， 我手上有几十个域名 ， 然后每次去等它那个生成一个证书的话要等好久 。 所以我想 ， 啊 ， 那个 Go 不是最擅长的就是并发操作嘛 ， 然后我看了一下那个 ACME 的协议哈 ，其实也比较简单 ， 呃 ， 就是是可以支持并发的 。

所以说那用 Go 也做了一个高并发的支持 ， 我可以同时验证 。

**Rio** [1:44:02]
写了一堆 code routine 是吧 ？

**吴涛** [1:44:04]
哎 ， 对 ，Go，Go routine， 对 。

**Rio** [1:44:06]
OK。

**吴涛** [1:44:07]
对 ， 就我可以 ， 就可以在呃 ，10 秒大概 ， 大概差 ， 看网络情况 ， 差不多 10 秒以内吧 ， 就完成整个这个验证域名和证书生成的一个操作 ， 然后最终输出一个完整的这个 certificate chain， 包括我的那个 AJX 的用的那个 ， 呃 ， 加密的私钥 。

**Rio** [1:44:27]
Awesome。

**吴涛** [1:44:28]
啊 ， 这个工作我 ， 呃 ， 开 ， 开源了 ， 我放到那个 GitHub 上面去了 ，但现在还是 ， 呃 ， 我 ， 我稍后把那个链接放到 shownotes 里面吧 ， 让大家有兴趣可以去用一下 。

然后 。

**Rio** [1:44:40]
好了 。

**吴涛** [1:44:41]
呃 ， 什么 ，show me the pull request。

**Rio** [1:44:43]
哈哈哈 。 Or SDFU。

**吴涛** [1:44:46]
没错 。

**Rio** [1:44:48]
OK， 感谢收听 IPN Podcast 网络旗下的 IT 技术主题娱乐节目 《 内核恐慌 》。 我们号称 hardcore，但是也没有干货 ， 想听人听 ，不想听人就别听 。

您可以为本节目捐款 ， 捐款地址是 kernelpanics.fm/donate。 呃 ， 对 ， 我们现在其实还是没有多少钱 ， 我本来想买摩托车的 ， 摩托车现在连个离合器都买不了 。

哈哈哈 。 捐款金额随意 ， 只要是 8 的正数倍就可以 ， 捐款不会为你带来什么 ，不捐也不会让你失去什么 。

我们的口号是 no hard feelings。 如果你有任何反馈 ， 可以发邮件到 kernelpanic@ipn.my。 同时也欢迎你收听 IPN 旗下的其他几档节目 ，《IT 公论 》、《 未知道 》、《 太依赖了 》、《 流星通信 》、《High Story》、《 阴影像 》、《 无次元 》、《 玻璃质 》、《 玄美 》，以及最新上线的这个名字的 ， 名字非常牛逼的 《Art in Situ》、《 陛下官 》。

我们下期节目再会 。

---

本节目库由 PodHood（https://podhood.com）提供支持——播客网站平台。
