准备安装所有 Noto Sans 字体

一座温暖的南方城市,新的开始。

我庆幸可以在年终看自己做过的事情觉得幼稚而可爱,解决的问题那么简陋却又自诩折腾精神。这毕竟也意味着,这两年没有白过。

渐渐发现最痛快事还是精研标准,名正言顺。慢慢脱离了个人博客等信息源,可以一眼看出信息源的段位和水平;慢慢觉得知乎许多内容都是媒体创作,因而越来越挑剔。

今年在 GitHub 有 801 个贡献,去年是 275 个,还有许多是业务代码。这是去年没有想象到的。给 node.js、angular、moment.js 都贡献了代码,也是去年没有想象到的。

要说生活上最重要的,我觉得是「取舍」二字。「取舍」不是说这里要多一些,那里要少一些;而是干脆利落,该「取」则要大力出奇迹,该「舍」则要一毛不拔。比如说买五件同样的衣服,买两斤同样的糖果;比如说不买什么。物事越少,留给自己支配的注意力就越多。

要说学习上最要紧事,便是明晰概念,建构体系。少年时代在大学课堂上,最记得老师说的便是「明晰概念」,到自己去学习 Unicode 的时候,便觉得概念清晰才能举一反三,触类旁通。「纸上得来终觉浅,绝知此事要躬行」说得就是它。

一段对自己冲击比较大的旅行确实受益匪浅。比如坐了53个小时的火车到拉萨,清晨的高原,深受婆罗米系文字影响的藏文,与汉语有同源关系的藏语,寺庙上已经变成装饰意义的兰扎文,无不款款向我展开了生活奇妙的小径。

许多软件开发工作必然会被人工智能所取代,趁现在,不如早日把人类的过去历史进行数字化,打通人机间的信息交互之门。越来越觉得时间不够用的时候,只能自省学习的过程,争取早日给 Unicode 做贡献。

最后,让我们永远为文明进步而热泪盈眶。

附录

此篇附录与正文毫无关系,只是作者偷懒牵强贴上来的。

Fact: Two compatibily equivalent Unicode string does NOT have to share same length of grapheme clusters.

Example:

1
2
3
4
5
6
7
8
let a = "กํา"; // <0e01, 0e4d, 0e32>
let b = "กำ"; // <0e01, 0e33>
a.decomposedStringWithCompatibilityMapping == b.decomposedStringWithCompatibilityMapping
// returns true
a.count
// returns 1
b.count
// returns 2

所以默认的 grapheme cluster boundary 算法才说

do not have to cover edge cases that will not occur in practice.

因此 maxlength/minlength 这种跟用户密切相关,却又使用 JavaScript 字符串长度来判断的 HTML 属性,注定充满了混乱