程序世界的饮料

本文纯属消遣解闷,收集一些计算机程序世界里出现过的饮料。

咖啡

咖啡作为提神醒脑神器,是程序员们的福音,Buy me a coffee 也成为了开源项目里“给我打钱”的代名词。因此,我们经常可以在各种工具中看到咖啡的影子。

Java

这个名气比较大,就不啰嗦了。

Java 是印度尼西亚爪哇岛,因盛产咖啡而闻名。也因此,Java 的很多库会与咖啡有关,例如 JavaBeans(咖啡豆)。

CoffeeScript

CoffeeScript 是一门可以编译成 JavaScript 的编程语言,用以为 JavaScript 提供一些语法糖,没错,出发点和 TypeScript 基本一致。但由于 TypeScript 日益壮大,CoffeeScript 的使用也越来越少了。

超文本咖啡壶控制协议

简介

这是一个真实存在的玩笑性质的通信协议,定义了一个基于 HTTP 协议的、对咖啡壶进行控制、监测与诊断的标准,其被定义在 RFC2324 :Hyper Text Coffee Pot Control Protocol (HTCPCP)。

这个协议诞生于 1998 年的愚人节,由 Larry Masinter 提出。这个人是一位因特网先驱,毕业于斯坦福大学,主要就职于 AT&T 和 Adobe,参与制定了不少 RFC 标准。这个协议的开头解释了它的目的:

There is coffee all over the world. Increasingly, in a world in which computing is ubiquitous, the computists want to make coffee. Coffee brewing is an art, but the distributed intelligence of the web-connected world transcends art. Thus, there is a strong, dark, rich requirement for a protocol designed espressoly for the brewing of coffee. Coffee is brewed using coffee pots. Networked coffee pots require a control protocol if they are to be controlled.

咖啡已经遍布世界各地。在一个充满计算机的世界里,计算机使用者也想要煮咖啡。煮咖啡是一门艺术,而这样一个由网络连接的世界所构成的分布式智能已经超越了艺术。 因此,我们强烈、暗黑、充分地需求一个浓缩的为煮咖啡而设计的协议。咖啡是用咖啡壶煮出来的,要控制互联网咖啡壶,就需要一个控制协议。

协议内容

在 HTCPCP 协议中,客户端如果想要冲泡咖啡需要使用 BREW 或 POST 请求,且 Content-Type 应被设置为 "application/coffee-pot-command"。HTTP 头中可以携带各种额外选项,包括牛奶、糖浆甚至酒精的类型等等。PROPFIND 请求可以获取咖啡的 metadata。WHEN 请求用于控制什么时候停止把牛奶倒入咖啡。最后通过 GET 请求可以“获取”煮好的咖啡。

HTTP 服务端也有对应的返回状态码,一个是 406 Not Acceptable 表示客户提出了不能完成的请求;另一个非常有趣的是 418 I'm a teapot,即任何企图用一个茶壶进行煮咖啡的客户端行为会收到这个 418 错误码。由于这个 418 状态码非常幽默有趣,它真的被各大平台所囊括,作为一个有趣的小彩蛋。一些服务会用 418 来告知用户错误访问了一些服务。

HTCPCP 协议也真的有人实现了出来,例如这个 Flask 项目,还有下文的 Emacs。

拯救 418

然而在 2017 年, IETF HTTPBIS 主席 Mark Nottingham 提出在 Node.js 中移除 418 状态码,随后要求在 Go、Python 和 ASP .NET 的库中也移除 418 状态码。这一行为引发了一位 15 岁开发者 Shane Brunswick 的不满,他认为 418 虽然是一个幽默的产物,但它时刻提醒着我们,计算机程序世界的根本应该永远是人。这位年轻的开发者因此建立了 save418.com 来发起“拯救 418 运动”。这一运动在互联网平台上快速传播,得到了大家广泛的支持,最终 Nottingham 做出了让步,允许 418 成为一个保留状态码,在未来不会被新的状态码所替代。如今,我们的确可以在诸如 Python 3.9 的 http 库中看到 418 IM_A_TEAPOT 的影子,且在相应的 pull request 中提及了“拯救 418 运动”。

save418.com

有趣的是,在 2014 年的愚人节,RFC 7168 为茶壶提出了煮茶协议 HTCPCP-TEA,下文会做更详细的介绍。

Emacs CoffeeMode

Emacs 虽然只是个编辑器,但由于极其强大的扩展性,很多人会在里面实现各种功能,包括浏览器。早在 1999 年,就有人为 Emacs 编写了 CoffeMode,实现了 HTCPCP,之所以单独拿出来说是因为煮咖啡这件事在 Emacs 社区已经发展出了特有的含义。喜爱 Emacs 的人时常夸赞它的扩展性,它们会说:“Emacs 甚至可以煮咖啡”;另一方面,很多人觉得 Emacs 虽然扩展性好是优点,但是滥用它的扩展性已经背离了编辑器的初衷,有人会调侃 Emacs 为“一个操作系统”,“Emacs 甚至可以煮咖啡”就又多了一丝讽刺意味在里面。

超文本茶壶控制协议

这是超文本咖啡壶控制协议的升级版,全名是:The Hyper Text Coffee Pot Control Protocol for Tea Efflux Appliances (HTCPCP-TEA)。它解决了 HTCPCP 只能煮咖啡不能煮茶的痛点,对协议进行了扩展。

The deficiency of HTCPCP in addressing the networked production of such a venerable beverage as tea is noteworthy: indeed, the only provision given for networked teapots is that they not respond to requests for the production of coffee, which, while eminently reasonable, does not allow for communication with the teapot for its intended purpose.

值得注意的是,HTCPCP 在处理茶这种古老饮料的网络生产方面是不足的:事实上,对联网茶壶的唯一规定是它们不响应咖啡生产的要求,虽然非常合理,但不允许与茶壶进行通信以达到沏茶的目的。 这个协议规定了一下想要煮茶时应当在 HTCPCP 的基础上使用什么样的 URI,如何使用一些字段等等。同时,对于可能产生的不小心误煮咖啡导致的浪费行为进行了规避。由于现在大部分茶壶都使用电热,不涉及明火,所以不必加防火墙。如果用户需要使用明火煮茶的茶壶,需要自己注意安全问题。

Homebrew

Homebrew 最开始是一个为 macOS 系统设计的包管理程序,我们可以把它类比 Debian/Ubuntu 的 apt,CentOS 的 yum 等。Homebrew 的功能是很正常的,这里主要是展开说说它里面的用词。

Homebrew 本身表示“家酿”,它的实际命令名就是 brew,就是“酿造 ”的意思,它的操作逻辑全是围绕酿酒的。我们想要安装和管理的应用程序是一种 formula(配方),普通的安装就是用命令 brew install <formula>

这个命令会安装一个应用程序到 keg(小酒桶),即某版本的应用程序的目录中。

此外,用户可能希望管理应用程序的多个版本,那么一个程序的所有版本都会放到一个目录下,这个目录称为 rack(架子)。

最后,Homebrew 会把程序都归纳到一个叫 cellar(酒窖)的目录下。

所以总结一下,是在系统里有一个 cellar(酒窖),里面有很多的 rack(架子),架子上放着许多的 keg(小酒桶),每个小酒桶里都是独特的 formula(配方)。

实际在安装时,一般都是去下载开发者事先编译好的应用程序来安装,这个编译好的程序被装在 bottle(瓶子)里,下载之后会直接 pour(倒入,也就是解压缩),进 keg(小酒桶)目录中。

Homebrew 还支持安装一些 macOS 原生应用,也就是说有图形界面的应用程序,这类应用程序统一归纳为到cask(大酒桶)中。cask 一般指那种比较大的运输时装酒的木桶,keg 是比较小的酒桶,比如我们去超市会看到的那种带一个小水龙头的酒桶。cask 会单独放到 Caskroom(大酒桶房间,一个单独的目录)里。

Wine

Wine 是一个可以在 Unix 平台上运行 Windows 程序的模拟器,取四个字母 Windows Emulator 就得到了 Wine 这个名字。同时,Wine 还是递归后义词 Wine Is Not an Emulator 首字母,搞了个程序员经典幽默。Wine 貌似没什么其它有趣的故事。


以上是目前想到的,以后遇到了再补充。祝生活愉快!