前言:关于“随记”
嘛,本来这种东西是适合放在类似微博的地方的。但我想说的话其实会有些琐碎;以前我的微博完全自闭的时候倒是没事,近两年(不知道为什么)渐渐有了些会和我互动的关注者,总感觉有些压力了呢。一则不想以别人看不懂的东西污染别人的时间线,一则毕竟微博是私有平台,在上面写东西终究是受别人掌控的。
所以我把一些我自己想到的东西,应该不会对除我以外的很多人有用、但总觉得还是应该以某种形式公开的东西放在此处。姑且以一个月为单位收纳进一篇博文中吧,会随时更新的。有时候可能会把内容从这里捞出去,扩展一下写成一篇正式的博文。
放在自己的网站上自然还有一个好处,那就是对 HTML 的运用会自由很多。坏处(?)则是会被从搜索引擎检索到;不过能帮上别人的话,也好。
U+0336 (03-10)
我在网易云音乐的一首歌的歌词里看到这个,
Are we all f̶u̶c̶k̶e̶d̶?
我意识到这不是语义标签而是附加字符。在比较现代的字体上,它的显示效果还真不错。是 U+0336 COMBINING LONG STROKE OVERLAY。
众所周知,网易云音乐有一些(以相当池沼的方式实现的)屏蔽词。我能想到的一些受害者有 The Vaccine 乐队的《Post Break-up Sex1》、(British) Sea Power2 乐队的《Smallest Church in Sussex》;一个趣事是我在《极乐迪斯科》的什么 BGM 下评论玩梗的“+1 Suggestion”因为其中含有“+1s3”而被神隐。
剩下的就不必多说了。但这位歌词贡献者是有一些眼力见的。(“眼力见”并非我母语的用词,我姑且理解成知识面和随机应变能力的综合了。)
Rime 的 C-S-(1|2)
快捷键 (03-10)
原来 C-S-1
可以切换最近的方案,C-S-2
也可以切换 ASCII 模式。
注拼方案 v2.2 (03-10)
把标记四声的 y
换成了 s
。现在声调全部由左手负责了。
原因是 y 作为拼音的声母出现太频繁了。我从哪里挖来的数据说 y 的频率是第二名,仅次于 d,占比高达 9.69%(d 是 10.29%)。
我此前,以及现在也用 q, w, r 标记一到三声。也碰到过一点问题,但并不严重;q, w 的频率在 3.2% 左右,r 是 2.76%。s 是 1.47%。
另一方面,知乎有人说普通话四声的比例是 21.6 : 21.8 : 18.8 : 37.8。此前用 y
表示四声的问题尤其被放大了。
这三个多月以来我已经三次更换基本用习惯了的主力输入方案了,希望这是最后一次。虽然或许这能成为一种打破习惯化、刺激人脑学习机制的途径呢(笑)
顺便用 s
表示四声顺便还一定地体现了去声的历史来源。
poole.css 用 float 处理脚注标号 (03-10)
或者至少 zola 的 hyde 主题引用的 poole.scss
这样处理,搞得很丑陋,还可能存在问题。我姑且用 position: absolute
代替了,而且使用伪元素填充脚注块前的空间以免定位错误。可在上面一个小节末尾看到效果。
xz 的多线程 (03-10)
用 xz -T0
使用尽可能多的线程,但默认是单线程的 -T1
。我稍微 alias 一下,
alias tarxz = tar -c -I 'xz -T0' -f
或者给 xz
加上个 -9
或者(vel, inclusive or)-e
来做极限压缩。
但我测试的时候出现了奇怪的现象,加了 -9
反而比不加的结果要大,加了 -e
显著增长时间但结果反而稍大于寻常 -9
。可能是测试集的原因。
但总之还是比压缩成 .tar.gz
要慢一些的。后者只需要几百毫秒,在我这 xz
两秒起步。
Nushell 0.76 (03-11)
前段时间我留意到他们的网站更新了目录结构。此前我订阅了他们的 RSS,以即时更新。但我正留意到 0.76 已经发布了两星期多;我再一看自己的订阅,已经失效了。原来他们把订阅链接也改了,改得正规了一点。
哎呀,怎么说呢,重构(我姑且把结构变化算入其中)是人之常情。但是订阅这种东西还是讲稳定性的吧。我会怎么做呢?我会在自动构建中留一个硬链接。我事实上也是这么做的,对于本站的 RSS 订阅。
上一个版本引入了 enumerate
命令,但我当时试了试总觉得不太实用。结果这个版本里取消了 each
的 closure4 对元素序号的捕获——也就是 |el ind|
这样的东西不能用了。明明这是一两个版本前才有的东西呢。现在要先 enumerate
再 each
,把列表元素变成一个有 index 和 item 两个键的 record。想想这也是好的,毕竟捕获两个的话不够直观。
另一个影响我现存脚本的更改(breaking change)是,把 str lpad
str rpad
合并为 fill
命令,而且更改了签名。
ウィトゲンシュタインのはしご (03-11)
6.54
私の命題は、次のように説明として役立ちます。 (彼は、いわば、はしごを登った後、はしごを捨てなければなりません。)
彼はこれらの命題を超越しなければなりません。そうすれば、彼は世界を正しく見るでしょう。
只是觉得很酷。话本来就很酷,这个翻译尤其酷。
Zola shortcode (03-11)
参考 https://www.getzola.org/documentation/content/shortcodes/。我写了个
{% figure(caption=“lang.md
”) %}
<div lang="{{ tag }}">
{{ body | markdown() }}</div>
{% end %}
还有个
{% figure(caption=“figure.md
”) %}
<figure>
{{ body | markdown()}}<figcaption>{{ caption | markdown(inline=true) }}</figcaption>
</figure>
{% end %}
两点需要注意的,
lang
变量是预留的,不能用这个名字,不然会实际指向 post 的 lang 而非调用时传入的。这是为了 i18n,不得不吃。- 用
.md
做后缀的话| markdown()
就足够了,不然用.html
还得| safe
而可能导致意外问题(比如文中已经 escape 但并未裹在<code>
中的 HTML 片段)
硬写 HTML 标签也不是不行,但这次不知道为什么出了点小问题,内部的内容没能被当作 Markdown 转换,可能是因为只有一个块(一个 blockquote)。另一方面,我的确不喜欢频繁输入 <>
。
我用五分制给作品评分的标准 (03-17, 03-25)
比如说,用在豆瓣之类的网站。
此前我的标准是比较混乱的,
- 曾经就是十分制,然后按四舍五入投射到五分制上面。这样往往给得虚高。
- 上个月我想到一种做法,即依然是十分制,但最终给出的五分制分数是用作品当前的十分制分数加上我的评分和作品分数之差。但想想这样还是太随意了,虽然本意是拉高一下我觉得评分太低的良作,但很难在其余类型的作品上比较连贯地做到。
所以我抛弃了以上的做法,在最近一周的评分中采用了一种新的标准。至少目前看来用着很舒服,我想可以用上很久。
是这样的:我不再从虚空中生成一个十分制下的分数,而换用一套语义化的标准。
- 五分的作品是我希望推荐给任何人看的杰作;
- 四分的作品是我可能推荐给我的朋友的良作;
- 三分的作品是我能看完但感觉不会有进一步兴趣的中等良作,也可能偶尔推荐给朋友。
- 二分就差一点了,或许能勉强看完,或许不能。大概没有太多新意的流水线产品属于此类。
- 一分大概是真正的粪作……我真的会看这种东西吗。还是有可能的吧。
嘛,总还是有个比较好点。
也许我会用这套标准给此前我标记的东西来个 overhaul,也许不会。
也许再加一条,
- 三分及以上的作品,我可能会看续作;
- 三分以下的作品则不然。
这适用于我对有的作品该给三分还是两分存在犹豫的情况。
模式编辑太快了 (03-20)
太快了,太快了。
情况是,我有个输入方案的码表,我希望保留两种变体:一种把修饰符号放在字母前面,一种放在后面。我先处理好了后者,因为后者是我要模仿的另一个输入法原来的做法。那么,怎么快速得到前者呢?
我想了五秒钟,然后使用模式编辑:
(ICYMI,我的模式编辑器是 Helix。)
形如
# grave
`a à
`e è
`i ì
`o ò
`u ù
的数据,在这个文件里有上百行。
我需要将其变成
# grave
a` à
e` è
i` ì
o` ò
u` ù
以下是步骤:
%
选择整个文件;s^[^#\s]
选择并非空行和标识注释的#
号的每行开头的字符作为多光标;dp
删除光标下的东西并粘贴在此时的光标(即后一个字符)后面。
虽然用模式编辑处理文本跟函数式编程一样在有的时候是有局限的,但有的时候也是真的舒服。
我恢复正常的一个证据 (03-21)
04:09–04:30
感觉自己开始恢复正常的一个证据是,可以正常地对待快餐游戏了。不会完全抵触,也不会沉迷了的样子。刚才打CSGO一局被翻盘的平局不加时,我没犹豫多久就确定我不会继续玩下去。我有生活。我开始可以正常生活了。其实开始玩之前我还想改名成“哥们忙打得少状态孬”,可惜完美平台改名要花钱。
但想想,我对于这类游戏的态度从来就是图一乐的,只是在之前那样状态低落的状态下会有点沉迷。比如说,我几乎从不练枪,也很少练道具,也不练peek和预瞄。而且我的反应也确实慢,操作也不灵敏,切道具和释放完全不像职业哥或一些主播那样流畅。想想我打osu的时候也是从来不练没有rank的练习图的。我似乎从来没有想着自己可以变强;这似乎是一个我从来把这种事情当图一乐的证据。嗯,其他事情呢?我好像也没有想着变强,而是沉迷于发现新的吸引眼球的东西的路径依赖。我其实从来就是灵性匮乏的人,我的灵性没有丢失。我不是天才。我甚至不比常人才思敏捷。刚才我在游戏中,甚至在语音沟通上都显得迟钝。当然也因为我疲惫;当然也因为我已经20天没玩这个游戏,有些陌生。但我的口吃却是货真价实的呢。哪怕我用经验的、习得的东西去弥补,先天的缺憾也是事实。
在很久很久以前,我的这一缺憾,我的迟钝,让我可以远离喧嚣、静下来思考,这使得我在一些思维上反而比同龄人更快。但后天补全的东西,我想算不得真物。或者说,以“成为正常人”的标准行事留下的一切,至少对我来说不是真物。会走到这一步,大抵是出于 1) 愚钝的本性 2) 想要被承认的欲望 3) 自我感动。这就像我对社团充满自信的改造一样,是一时可能光鲜新颖,而终究要因为我能力不足而失败的。我幸运的地方在于,即使失败了我也能比较好地活下去。我觉得这不美。
我觉得我很是应该远离人群,多读些书、多做点事情。砍掉多余的触角,耐心培育我喜欢的根系。彻底远离人多的地方,哪怕只是远远看着也不行。抛弃一切能够融入大众的幻想。这不是审美的问题,是我想,这样真正对我自己好,这是维氏所云“唯一严格正确的方法”。
他必须超越这些命题,之后他才会正确地看待世界。
这是我为自己找的新梯子。
“分类”和“标签”两层划分的局限 (03-21)
我想,根本原因还是在于它们不太能做组合的索引。当然了,动态网站,或者使用多一些JS的静态网站可能比较容易做到这一点吧。
是这样的,我希望效仿剑桥笔记肝帝,在借来的时间里整理大学生涯学到的东西并且分享在个站上。我希望主要以便携性强的 HTML 的形式呈现。而与此同时,把关于同一样东西的所有笔记收录到单一文件里是不太可行的。那么这样的笔记污染本站的归档页面也就罢了,如果还不能很好地、比较自动地索引出来,那就太灾难了。
我想,有两大主要途径。
- 完全放弃把笔记纳入站点的体系,而转而使用事先生成的、独立运作的一系列静态页面。比如说,生成好(极端的情况下甚至“站中站”)一系列相互链接的页面并放在,比如说
static/resources/
里面的一个文件夹;然后只要在网站的常规部分留一篇文章作为入口就可以了。至于这样的笔记所用的生成器那就比较自由了,Zola 也行(但糟糕的开箱即用程度让这个同样不太现实,除非我在那之前做出 zola-xmin),Hugo 也行,mdBook 之类也行,R Bookdown 也行,Racket Scribble 也行。嚯,我动笔时其实不倾向这个解决方案,现在倒有点喜欢了;这满足了我探求多种东西的欲望。(但这说不定不是好事呢。) - 还是纳入站点,但用一些技巧来实现索引。比如说,把全部索引页面归在一个“分类”下,然后这类页面应用不同的模板,且通过 shortcode 建立同时通过分类和标签筛选过的索引。但这样做还是会污染分类和标签吧,哪怕我不在意它污染归档页面。而且,索引的顺序也相当可疑:是用日期,还是用标题,还是用每个页面的权重?须知一个普通的博客系统往往假设所有的源文件以平铺的形式组织。当然,Hugo 有用树状目录作为 sections 组织页面的能力,我怀疑 Zola 也有;但这样时候还是绕了远路呢。何况 sections 也并不那么好使,按我的记忆还是要用上权重进行排序,如果不想把命运交给简单粗暴的字符串排序的话。
- 作为第二种情况的分支……彻底接受无能为力性(futility),干脆像一些不得已在自己不能掌控的网站上写文章而使用专栏性质的文章序列安排内容的人一样,不再讲究笔记内部的层级关系,按一定的主题标上序号平铺了事。嘛,虽然各人有各人的选择,我还是希望能体系化的东西具备一定的结构(而非纯线性)的。
嗯,我提笔前倾向于一种后者的实现,现在却觉得前者很好。或许我的确会使用类似 mdBook 或 Racket Scribble 的东西;甚至,在将来的我的标记语言的输出格式中,加入这两种格式的支持。因为,比如说,mdBook 的目录甚至需要人工书写。
这么看来,使用 sections 的 Hugo 倒可能真的不坏,毕竟写好的笔记并不需要反复修改和重新部署。用数字为章节标号其实也不会太坏。只是又得在这台机子上安装 Hugo,工具链太多还是有点接受不了。嗯,得尽快写一个 zola-xmin 出来。
然后再多多利用脚本就完事了。
无实践不成学习 (03-23)
无实践不成学习,无感想不成读书。
其实那个“成”字我不想加的,但是与其附加后期的解释,还是不如在原文上增加自明的部分、花少量精力减轻理解负担好。
这也许也是一种可以挪用的哲学呢。
浅译一下,
Nullum studium sine praxi. Nulla lectio sine reflexione.
嘛,这总之是我这两天在想的东西。学语言不做实践(听说读写;但因语言而异前两者未必是需要的)等于没学,不仅忘记的速度快,而且可能的确根本就不能掌握。学习其他的东西也是一样的,只要我们把学习的定义扩大。比如说阅读。
我今天去一个订阅了但很久没更新的主页看了一眼,原来作者转行、离开学术界后换了个网站写新的内容。然后我看到以前看了大赞的文章,却想不起来要旨是什么。这就是因为我没有做笔记。随着年龄的增长,光靠大脑就能保持博闻强记的时候已经过去了。非写一点东西不可;写出来若有能力分享也是很好的。
说来我对现在的个站还是有点不满意,但不太能说出不满意在哪。我思考了一下,觉得可能和不太好突出重点有关。我有一个初步的想法:增加一个布尔属性,指示这篇文章是否应该被放上首页。想到就干。
花了四十分钟。20分钟解决了问题,5分钟探索能不能做得更优雅,剩下15分钟吹毛求疵——倒也不是,因为 Zola 就是没有提供比较好的对分页器应用 filter 的方法。
人生还是漫长的等待死亡的过程 (03-25)
人生还5是漫长的等待死亡的过程,没什么意义。但推进这个过程也是没有意义的,所以不必自杀。在这个基础上,能减少痛苦就减少痛苦吧。幸福地活下去……如果以外显的东西作为定义,也不是不可以追求。读书、思考的结果是否有意义呢?恐怕也没有,但多少做点事情吧。让自己从经济一点的角度是对种群有益一点的个体?可是我这样的基因……好吧,还是比有的人的基因更值得传下去的,我想。
但做的事情也许也分两种吧。有的也许是有持久价值的东西,有的则不然。比如说,如果人可以不依赖双手进行精确而快速的输入,那么一切基于用双手敲击键盘的输入方案将失去意义。当载体要被淘汰,乘在这艘船上的东西自然就活不下去。有的载体似乎永远也不会被淘汰;要乘上那些船吗?比如C语言、Bash。但我的答案是不,因为这些虽然不会被淘汰、而且也仍在产生大量的代码,但从好文明的角度看来还是不够好的。在有更好的选择时,在认为更好的选择最终要把前者打压到一个比较小的范围时,自然要以超越性的眼光选择更进步者。此之谓提倡好文明。把好文明作为活着的目标吧。
如果自己的衰退是必然,那么哀叹也只是浪费时间。不如好好利用这样的时间。万事皆在于速度:接受的速度、理解的速度、恢复的速度,等等。比如说,如果恢复的速度足够快,那么和从没受过伤就看不出区别。如果服务重启的速度足够快、备份足够多,就和从来没有下线看不出区别。让自己留下的东西更精简、更完善一点,直面熵增。
Nushell 之可爱 (03-29)
或许我有一天会详细论述,但不是在今天。只是,有这样一门语法舒服的真正的 Shell,实在是幸事。
比如说,我收到一串网页的分享,但只保留了一个该网站内的共通URL,怎么快速地打开呢?
考虑原格式已经以换行作为分隔符:
ML4119756
pM411H7tp
3c411j7Se
7L411d7i4
u84y1w7fw
qb411Z7d8
8b411d71a
HY4y1X7NP
nT41167jK
Bb411d7ru
TP411o77a
因为 Nushell 的数据文本格式中列表的分隔符(,
)是可选的,所以只需加上 [
然后粘贴进去,再加上列表结尾的 ]
。(而且,对于列表的内容,不符合数字格式定义的不带引号也会被当作字符串,这太方便了。)
> [ML4119756
pM411H7tp
3c411j7Se
7L411d7i4
u84y1w7fw
qb411Z7d8
8b411d71a
HY4y1X7NP
nT41167jK
Bb411d7ru
TP411o77a
]
╭────┬───────────╮
│ 0 │ ML4119756 │
│ 1 │ pM411H7tp │
│ 2 │ 3c411j7Se │
│ 3 │ 7L411d7i4 │
│ 4 │ u84y1w7fw │
│ 5 │ qb411Z7d8 │
│ 6 │ 8b411d71a │
│ 7 │ HY4y1X7NP │
│ 8 │ nT41167jK │
│ 9 │ Bb411d7ru │
│ 10 │ TP411o77a │
╰────┴───────────╯
……然后,把它传入管道,然后迭代。
> [ML4119756
pM411H7tp
3c411j7Se
7L411d7i4
u84y1w7fw
qb411Z7d8
8b411d71a
HY4y1X7NP
nT41167jK
Bb411d7ru
TP411o77a
] | each {|e| firefox ('example.com/' + $e)}
` `
完成啦!我不必一个个补全完整的部分后放到浏览器地址栏里,就能打开全部网页了。
另一个例子是,我经常使用 `you-get` 这个 Python 脚本下载媒体文件。如果我有很多已知的链接,如何快速下载它们?
答案还是运用 `each`。但这次有些不同:如果只是顺序迭代,一个个下载,是否会有些慢呢。Nushell 提供了原生的多线程解决方案:`par-each`。
` `sh
['https://music.foo.com/bar?id=415793546', 'https://music.foo.com/bar?id=415792564', 'https://music.foo.com/bar?id=415793547', 'https://music.foo.com/bar?id=415792565',
'https://music.foo.com/bar?id=415793548', 'https://music.foo.com/bar?id=415792566', 'https://music.foo.com/bar?id=415793549', 'https://music.foo.com/bar?id=415792567', 'https://music.foo.com/bar?id=415793550', 'https://music.foo.com/bar?id=415792568',
'https://music.foo.com/bar?id=415793551', 'https://music.foo.com/bar?id=415792569', 'https://music.foo.com/bar?id=415792570', 'https://music.foo.com/bar?id=415793552'] | par-each {|e| you-get $e}
如前所述,逗号和引号其实不要也没关系。这样就多线程调用 you-get
来完成下载了,速度往往比按顺序来要快得多。
The ills of Nushell module (03-30)
Namespace conflict and inconsistency.
entity parse
would conflict with builtin commandparse
if I want to useparse
withinentity
.There’s no way I can distinguish a call of Nushell builtin function from a user-defined function, not in the way I “escape to the system” with
^
.And modules can’t export self-referencing aliases smoothly without a global import.
Can’t export function with same name as module (filename), regardless of how will I import the module (like with
*
). This hard check is insane.
So I guess I will stick to
- naming the module files with a leading dot
.
, - and always use the global import (
use foo.nu *
).
as possible.