简短的想法、公告、备忘录、一些我的悄悄话、一切不足以写成文章的碎片。
文字化的情绪
自认为是一个死脑筋的人,只喜欢用认定的某种方法去做某件事,尤其讨厌被其他因素打断。「同一时刻只专注于一件事可以做得更好」,我相信这个说法,也清晰地知道它只是自我催眠,用于安慰不擅长同时处理多个事务的自己。可我依旧相信、或者说“信仰”这个说法,如果您想要我的准确感受。
逐渐,我没了清晰的思绪,更加难以维持专注,不得以应用另外一种方法:把多件事拆开,在它们之间不停切换,这样每次只处理一件事,却能有同步推进的假象,简单的“并发”。
(逐什么的渐?年龄?心绪?生活习惯?我不知道。)
似乎是个好办法,但类似并发,它也有上下文切换的代价。如果要切换回之前的状态,需要消耗额外的心神,进而产生抗拒,最后花费更多时间做心理准备。表现出来,就成了严重的拖延症。
并且,事情拆分后仍会萦绕在脑中,想专注于眼前事,却还是控制不住担忧那些遥远的东西。不过这就是另一个话题了,我想说的不是这个,甚至也不是上面那些。
一篇博客,可能拆成两次、三次,甚至更多零碎的片段来完成。第一部分,我可能趴在窗台呼吸冷空气,带着轻松的情绪构思和记录;第二部分,我可能又做了噩梦,在荧光玻璃前撑着额头喝咖啡,此时如果直接续写,感情措辞都会不同。
我应该模仿之前的情绪,换取统一的阅读体验,但我又没法得心应手地做到操控这些情绪,文字化的情绪,最后出来的只有拧巴的词句,精神分裂。
clojure-lsp 语义高亮问题
在 Neovim 里用 clojure-lsp 编辑中文路径的 EDN 文件时,可能丢失语义高亮(Semantic Highlighting),效果就和这两个 issue 里的图片一样:#1759、#470,但它们的问题与此不同。
排查了很久,推测可能与文件 URI 有关,在仓库中找到两个相关的 issue:#1851、#1813,不过已经被修复,我遇到的 bug 也与其不同,至少 LSP 没有抛出错误。
无论是 Neovim、VS Code 插件,还是 Python 脚本,怎样交互 LSP 都得出了一样的结果,应该可以排除客户端问题。
又经过一系列胡乱摸索,我怀疑在 clojure-lsp 内部使用了两种 URI,某些地方是 Unicode URI,有的则是 percent-encoded URI。对于非 ASCII 文件名这两个 URI 是不同的,所以在“数据库”查询中找不到对应的 key,没法得到 clj-kondo 分析产生的信息,就没有 semantic tokens 了。
只是记录有关 bug 的推测,没有临时解决方案。
博客的六度分隔理论
「世界上任何互不相识的两人,只需要很少的中间人就能够建立起联系,平均只需要 6 步」,一个颇具争议的社会学理论。
随着互联网时代到来,联系逐渐自动化(基于喜好和人际的推荐算法),小世界现象愈发显著。
虽说博客算是脱离了社交媒体推荐算法,但我仍然能从“友链”逐步跳转到认识的人(博客)。这说明网络没有那么广袤无限,悲伤又可怕。
AI 能做出好看的图表,但不是以您想的方式
最新的文章做了一些 Excalidraw 图表,如果您注意力惊人,就会发现它还是 Catppuccin Macchiato 配色的,与博客结合很协调。
我首先写了一些描述图表的“代码”,基本就是逐行的文本和一些字符箭头 <- / ->,没有深究语法的严谨性,普通的 LLM(和人类)都能理解。
接着让 LLM 据此生成 Mermaid 图表代码,这是 LLM 擅长的领域,就和让它们生成 Markdown 一样。生成 Mermaid 而非其他图表(甚至图片)的好处是,您可以获得一个结构确定的图表描述,方便检查逻辑和二次修改。(所以您想生成 D2 也是可以的,只是相较起来 LLM 不擅长它。)
不过 Mermaid 很丑,我用了 mermaid-to-excalidraw 将其转换为 Excalidraw 图表,并手动调整布局和连线。这已经很好看了,但还不足够,是的,好看很重要,我就是那种会把课堂笔记做成手账的人。
Excalidraw 图表实际就是 JSON 文件,这点还挺方便的。我把 Catppuccin 配色表给 LLM,让它修改 JSON 中的配色,在商量几次颜色与形状的含义后,就得到了现在的结果,这可比自己手动复制色值方便多了。
据我所知,Obsidian 的 Excalidraw 插件可以导入调色板,所以再花一些功夫制作调色板,也许您还能更方便且精准地修改图表。
现在 AI 相关的工具链能力越来越强,「加载各种 SKILL,调用各种 Agent,帮我生成各种图表」兴许能做到同样效果。但我就是没法信任它们,就和我没法从根本上信任 LLM 对 JSON 字段中 X/Y 坐标值的理解一样。
每一环都有足够的人工参与才有资格称 AI 为“工具”。
Saya 和它的编译器
有关 Saya Lang 有很多积压着的文章和代码 TODO。前段时间完成了它的 bindgen,其中有不少有趣的部分,本该有一篇文章。可是写代码时没有实时记录,如果要回头总结(就像博客里大部分文章一样)就觉得疲倦、缺乏兴趣了。
更何况接下来 Saya 还有很多事要做,比如类型推断和类型转换,实现之后可以简化 saya-bindgen 生成的 Saya 代码,也能让自己使用舒服一些。
尽管畅想未来需要许多现实前提,而它们还都是 TODO,我还是提前设想了标准库设计和内存管理方案。做一个普通的 GC 应该不会太难,打算只把它作为可选项;如果要手动管理内存,有个 defer 来帮忙应该还不错。
顺带一提,C 的 Defer 规范已经完成可用了,也许您感兴趣。
晚上好
零碎的想法不断涌出,时刻分散我的注意力,同时也增加记忆负担,整理记录是我与之抗衡的手段。现在,我愿意与您分享一部分,换句话说,我们终于可以在「碎片」相聚了。
这里的氛围虽不一定轻松愉快,但也至少更加随意,如果非要形容,我想这些文字是“混乱”的,携带着各种时刻的情绪。
而为了不让这里只是自言自语,我也会放一些近期的见闻或简短的公告。比如这次就是告诉您「碎片」上线了,同时上线的还有特殊 404 界面,您可以去看看。
特意去 404 页面就好像故意迷路一样。