混沌周刊 #20 | 爪哇伐木工

各位好,欢迎来到第20期《混沌周刊》,我们来看看这一期有什么新的内容吧。

🪵 Log4j

log:

(noun)

1. a part of the trunk or a large branch of a tree that has fallen or been cut off.

2. an official record of events during the voyage of a ship or aircraft.

(verb)

1. enter (an incident or fact) in the log of a ship or aircraft or in another systematic record.

2. cut down (an area of forest) in order to exploit the timber commercially.

本周技术圈最大的新闻应该是Java日志框架Log4j的安全漏洞CVE-2021-44228. 由于Log4j使用的广泛性,传言此漏洞令无数人半夜起来加班。漏洞的原理简言之,就是用户输入会在某个地方作为参数,如果内容含有特定内容,那么就可能触发特定代码执行,造成安全隐患。

由于各类框架乃至标记语言被设计得越来越全能,很多想象不到的小功能也可以成为攻击者的目标。比如Python中读取YAML内容存在loadsafe_load方法,区别在于前者出于灵活性考虑,支持任意的YAML标签引用同名Python类型,后者限制了这个功能。

另一个例子是Ruby on Rails框架中,利用用户发送的JSON或HTML表单内容更新数据时,需要调用permit方法。因为来自用户的请求最终会变为一个散列表,如果不限制其中可能出现的字段名称,则可能受到来自恶意输入的攻击。

再读一遍:不要相信用户的任何输入。

🌏 来自互联网

现在是用Rust重写操作系统的合适时候吗?》,一个2019年InfoQ的演讲,还有一份文字版。演讲谈到了许多操作系统的发展历史(比如曾经有人想用Java做操作系统),推荐观看。除了演讲内容本身,其中提到的若干典故也很有趣:

第二系统效应:由佛瑞德·布鲁克斯在《人月神话》中提出的经验概括。它认为,在完成一个小型、优雅而成功的系统之后,人们倾向于对下一个计划有过度的期待,可能因此建造出一个巨大、有各种特色的怪兽系统。第二系统效应可能造成软件专案计划过度设计,产生太多变数,过度复杂,无法达成期待,并因而失败。

贝特里奇头条定律:任何以问号结尾的新闻标题,都能够用「不」来回答。


一个笑话,来自知乎

互联网公司校招名额大幅增加说明了什么问题?

招聘增加,腾笼换鸟淘汰老人。
招聘不变,增速放缓进入停滞。
招聘减少,进入寒冬步入衰退。


Canvify,一个iOS App,可以让你预览某张照片被打印出来贴在墙上的样子。

有人用Rust写了一个Emacs Lisp VM,如果有人想重建一个21世纪的Emacs的话,这大概是万里长征第一步。

未来的脚本语言应该是什么样子?规模化,容易性能调优,并行化,IDE支持。的确也都是现在的主流脚本语言都在努力的方向,参考松本行宏对Ruby未来的看法

如果你的工作依赖于电子邮件,而你每天也有清空未读的习惯,为什么不试试用电子邮箱来管理待办事项和信息呢?实际上,Gmail的Inbox设计也许就是受GTD理念启发。


在MacVim上,表示国家和地区的emoji不能完全正确地显示:如输入法国国旗🇫🇷,文本会显示为这面旗后面再跟上一个被方框包裹着的R字母,而如果输入中国的emoji🇨🇳,后面的字母又是N,怎么回事呢?这篇文章很好地解释了旗帜emoji的编码方式。

所有国家和地区旗帜的emoji都由两个特殊的Unicode代码点表示,这两个代码点也属于英文字母,但不是我们通常理解的ASCII里的英文字母,而叫做Regional Indicator Symbol Letter,在U+1F1E6和U+1F1FF之间。每个地方旗帜的emoji,实际上就是表示该地区的两个字母,只不过这里用的字母来自前面说的范围。所以中国的emoji=🇨(U+1F1E8)+🇳(U+1F1F3)。如果你找一个文本框将这两个特殊字母前后挨在一起,就将得到中国国旗的emoji. 至于地区编码,使用的是ISO 3166-1标准。

而诸如彩虹旗🏳️‍🌈一类的非地区旗帜emoji,编码方式则更为复杂。甚至于有趣的是,不同语言里彩虹旗的长度还不一样:

  • Ruby: 4
  • Swift (String): 1
  • Swift (NSString): 6
  • Python2: 14
  • Python3: 4
  • JavaScript: 6

你最常用的Git命令是哪个?除了pull/push/commit三件套,大概就是checkout了吧?但checkout实在具备太多功能和参数,它的对象可以是分支、提交或者文件。为了避免这个命令的困惑,Git 2.23版本引入了两个新的Git命令:switchrestore:

  • git switch切换分支
  • git switch -c创建新分支并切换到它
  • git restore --staged将文件取消暂存(Stage)
  • git restore --source=HEAD --staged --worktree将文件恢复到HEAD状态(撤销改动)

简言之,一个针对分支,一个针对文件。


本期《混沌周刊》就到这里,下期再见吧。

如果你觉得本栏目对你有所帮助,不妨推荐给其他人,感谢!


发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注