2025-03-29 18:38:00
This article documents my experience installing Chimera Linux on a decade-old MacBook Air.
Why Chimera Linux? While I’ve used many Linux distributions over the years, most carry significant historical baggage. I wanted to see what a more modern distribution could achieve. Chimera Linux’s technical approach is quite appealing—it doesn’t use systemd and incorporates userland components from FreeBSD.
The initial setup went surprisingly smoothly. I downloaded the image(x86-64, plasma), flashed it to a USB drive, and booted the MacBook Air from it—all in one go, which felt almost too good to be true. Upon closer inspection, however, I discovered that the hard drive hadn’t loaded properly. Additionally, while Bluetooth worked, the wireless network card wasn’t recognized. Not a perfect start, but still acceptable—certainly smoother than my previous adventures with FreeBSD.
I began by addressing the hard drive problem. After researching the error, I found that it was related to a kernel parameter. The solution was to add intel_iommu=off
to the kernel boot parameters. Nothing too complex—just a matter of rebooting and remembering to modify the GRUB settings before each boot, otherwise the hard drive wouldn’t be recognized. The proper way to make this change permanent would be editing /etc/default/grub
, but this approach doesn’t work on a LiveCD.
Next came the more challenging wireless network card issue. The symptom was a lack of device files in /dev/net
. Using lspci
, I identified the card as a BCM4360. The default b43
and bcma
modules loaded in the LiveCD couldn’t drive this card. After finding some documentation, specifically this one, I realized I needed to compile a kernel module. I initially wanted to compile it in the LiveCD environment to minimize unknowns, but since kernel version in the apk repository is newer than the LiveCD version, I decided to install the system first and then tackle the driver issue.
Following the official documentation, I created the necessary partitions (ZFS+EFI+boot), mounted them, and executed chimera-bootstrap -l /media/root
to copy the LiveCD contents to the new partition. This step produced an error at the end—something about being unable to create hard links across devices. I suspected the script/command hadn’t handled this edge case properly, so I ignored it. When I ran apk upgrade --available
, the process was painfully slow because the network connection was going through my phone’s hotspot via Bluetooth, resulting in limited bandwidth. After upgrading several packages, I simply hit Ctrl-C to interrupt the process. I then installed GRUB and rebooted without issues, but couldn’t get into X, and the Bluetooth service wasn’t running either. This presented a challenge since I had never dealt with fixing Bluetooth from the command line without network access, and even if I got Bluetooth working, I’d still need to connect to my phone to access the internet. I took the easy way out: rebooted, booted from the LiveCD again, mounted the ZFS partition, and fixed the issue. If I recall correctly, either sddm
or sddm-dinit
wasn’t installed; once installed, everything worked normally.
Of course, I still needed to compile the network card driver. I referenced this SlackBuild and modified this script slightly to get it to compile properly(gist here).
In reality, it wasn’t that straightforward. I first needed to install clang
and gmake
, then install/update linux-stable{,-dev}
. The most frustrating part was discovering I also needed to install the wireless-regdb
package. The original script was designed to use gcc
for compilation, while Chimera Linux uses clang
. Rather than hunting for environment variables, I simply created a symlink from clang
to gcc
, which worked fine for the compilation.
After successful compilation, I had the wl.ko
kernel module file and could load it with modprobe
. Whether using modprobe -r
or adding to the blacklist, I could drive the network card with my newly compiled wl.ko
(visible in the PCI information), but /dev/net
still showed only the tun
device from my phone’s shared hotspot. As a last resort, I looked up the dmesg
error (about loading regulatory.db
) and discovered it was indeed due to a missing database. After installing the corresponding package with apk, everything worked properly.
My final thoughts:
wireless-regdb
/sddm-dinit
. On the other hand, many things require manual configuration (for instance, Chinese input methods need to be compiled from source, as they’re not available in the software repository or cports).I’ll continue to follow this distribution’s development. It shows potential, and the developer updates are quite frequent.
2025-03-29 14:16:00
这篇文章记录一下自己是如何在一台十年前的MacBook Air上折腾Chimera Linux的.
先说一下为什么, 主要是我自己用过的发行版虽然很多, 但是都有了很多很多的历史包袱. 我想看看现代一点的发行版能够做到什么程度. 从介绍来看, Chimera Linux的技术路线比较讨喜. 比如没有使用systemd, 比如使用了FreeBSD里面的userland.
具体的折腾算是一波三折. 首先比较顺利地下载镜像刷到U盘然后在这台MacBook Air上U盘启动进系统一气呵成, 让人感觉有点不现实. 不过再仔细一看, 发现硬盘没成功加载, 蓝牙虽然能用但是无线网卡却没识别. 不算太圆满的开局, 不过还能接受, 至少比我之前折腾FreeBSD要顺利得多了.
然后开始解决硬盘的问题, 拿着报错查了下, 发现是一个内核参数的问题, 需要在内核启动时加上intel_iommu=off
, 不算什么特别的, 需要重启电脑而已, 而且每次进系统之前都要记得去grub里面改, 否则硬盘就不能识别. 正确的修改方式是编辑/etc/default/grub
, 不过对于LiveCD, 这种做法是无效的.
然后就是更纠结的无线网卡的问题. 症状是/dev/net
下面没设备文件. lspci
看了下, 是BCM4360, LiveCD中默认加载的b43
和bcma
模块都没法带动这个卡. 查到一些文档, 比如这个, 于是要编译内核模块了. 本想在Live CD环境中编译, 这样unknown会少很多, 不过repository里面的内核版本和Live CD里的内核版本有区别, 于是我就打算先安装系统, 然后再去解决驱动的问题.
我按照官方文档分好了区(ZFS+EFI+boot), 挂载, 然后执行chimera-bootstrap -l /media/root
来将LiveCD中的内容复制到新分区中去. 这一步最后会有报错, 记得好像是说无法跨设备来创建硬链接. 我猜是这个脚本/命令没有处理好这种细节, 于是就忽略了. 后面开始执行apk upgrade --available
时速度很慢, 因为网络走的是手机热点通过蓝牙来传递数据, 所以带宽很小. 我升级了一群包后直接Ctrl-C了, 后面正常安装grub后重启没问题, 但是进不了X, 这个时候蓝牙服务也没打开. 这个比较麻烦, 因为之前从来没有处理过命令行下没网络修蓝牙的情况, 而且即使蓝牙修好了还需要通过蓝牙连接到手机才能上网. 于是重启, 再次祭出LiveCD后挂载zfs进去修了. 记得不错的话, 要么是sddm
没安装, 要么是sddm-dinit
没安装, 安装后就都能正常工作了.
当然当然还要继续编译网卡驱动呢. 参考了这个SlackBuild, 把这个脚本稍稍改了下(gist), 就能正常编译了.
当然现实中才没这么简单呢, 先要装clang
和gmake
, 然后要去装/更新linux-stable{,dev}
, 最坑的是还要安装wireless-regdb
这个包. 原始脚本中应该是使用gcc来编译的, 而Chimera Linux是clang. 我懒得去找环境变量, 直接将clang软链接成了gcc, 编译也没啥问题. 编译成功后可以得到wl.ko
这个内核模块文件, 用modprobe
就能正常加载, 不管是modprobe -r
还是加黑名单, 都能让这个网卡用我们刚编译的wl.ko
来启动(PCI信息里也能看到), 但是我的/dev/net
里仍是只有一个手机共享热点的tun
设备. 最后是死马当活马医似的将dmesg
的报错(加载regulatory.db
出错)查了下, 发现真是缺少数据库的缘故. apk安装对应的这个软件包后就好了.
最后加上一点小杂感:
我自己会继续跟进这个发行版, 目前来看还是有一定潜力的, 作者的更新也很勤快.
2025-03-26 08:08:00
这个月不太想写码, 所以就读了不少书. 先说三本我觉得挺普通的, 其一张爱玲的华丽缘, 读了之后愈发不喜欢张爱玲了. 我还是更欣赏作者用白描的方法写故事, 像写史一样, 可以春秋笔法, 但是我不希望作者亲自下场, 事必躬亲地评论一些细枝末节的东西. 是的, 描写很细致, 是的, 比喻挺绝, 但是我就是喜欢不起来, 就好像不会欣赏一个喜欢碎嘴的聪明伶利的小厮一样. 其二是莫言的鳄鱼, 这本我是欣赏不来, 很像没好好写的命题作文. 整个剧本看不到什么创造力, 文笔也是莫言那种土了掉渣的那种, 不对我的胃口. 其三是我们的老北京, 挺一般的. 作者没啥文化, 更多是附庸风雅, 没啥高论. 接下来是两本中规中矩的, 先读的是Cat on a hot tin roof. 去年十二月看过电影, 这个月继续读原著剧本, 发现第三幕有两个版本, 而且都和电影不一样. 电影虽然说教成分更重, 但更自然. 作者初版里Big Daddy第三幕完全消失, 按剧场版导演要求的编辑版里也只是出来露脸, 但是个性和其之前的塑造有明显的出入, 我还是更喜欢电影的版本, 人物塑造更成功, 更立得住. 后读的是Everyday Shakespeare. 语录体的集子, 比较有亲和力, 除了解释这些古话的意思, 还贴心的给出了使用的场合. 一天翻完, 记了一些笔记, 不过已经单独成文了. 最后是喜出望外的一本熊逸的春秋大义, 旁征博引得让我羡慕, 之前对中国古代史的一些疑问也被解答了. 收获不能说太多, 但是能在国内这种舆论环境下将这本偏自由派的书出版, 已经很了不起了.
书读了不少, 影视也看了不少, 首先是为了下个月回国而预热的向着宵夜的方向, 里面的广告让人有点受不了, 这种经济环境下去诱导人借钱, 总觉得有点作恶. 吃食来说, 都是苍蝇馆子, 没啥印象深刻的. 其他城市我也许不熟悉, 但是我从小在武汉长大, 不觉得生烫牛杂能够代表武汉的饮食文化. 在Netflix上看完了鱿鱼游戏2, 不如1那么有冲击力, 剧情也有不少不太合理的地方, 不过还是等3吧, 一切终将有一个尽头. 最后是被我翻译成小龙虾在唱歌的Where the Crawdads Sing, 剧情上的有些gaps, 辩护律师很抢戏, 很喜欢这个老先生的抑扬顿挫, 最后那段结案陈词写得很棒. 里面女主在凶案前夜说的”I don’t know if there is a dark side to nature, just inventive ways to endure.” 让我有点感慨, 总感觉整个故事有点中国武侠小说里的善恶因果. 大家都可以承认杀人是不对的, 但是从ways to endure的视角出发, 总会让人愿意去原谅一个以武犯禁的人物.
当然, 游戏也玩了不少. 手机上主要在玩暖雪和文明6. 前者普通难度通关, 装备和技能系统不错, 不过怪物多样性是一个很大的遗憾, 很多时候就是在割草. 可重玩性不佳. 地图的多样性也是一个问题, 场景的随机性很不足. 文明6通关了标准的王子难度. 没什么特别的感谢, 中规中矩的一个文明游戏. 通关了之后就删除了, 因为实在是太花时间了! 最后是趁打折在PS上买的Gran Turismo 7, 画质相对于Gran Turismo Sports的确有一些变化, 但是不太明显. 目前仍然在做咖啡馆的主线任务以及刷驾照的全金杯.
这个月AI继续玩了不少, 写了一个MCP服务器, 也对目前AI的可用程度有一些自己的看法. 不过遗憾的是dashed没什么时间去继续推进.
先说自己写的这个MCP服务器. 用途是能够通过Claude来创建和修改Jira tickets. 这样可以省很多时间. 除了这个之外, 我还做了一个小的功能, 就是能够通过口述来更新Jira ticket. 大概的实现原理是用OpenAI的whisper来解析语音, 然后交给Claude来分析意图, 然后解析出一个结构化的请求, 调用Jira的API来完成请求. 这个过程中我踩了一个小坑, 因为自己对MCP的定位不是特别清楚, 所以还在想既要写一个MCP client又要写一个MCP server. 后来想清楚了, 语音控制这个场景下, 我们完全不需要MCP的参与. 因为我们可以控制Claude的输出, 要求它就是输出我们请求所需要的json payload, 然后我们调用API的时候直接用Claude的输出就好了.
另外, 之前认为AI会很快改变我们的工作, 现在看来还是有点太早下结论了. 对于一些固定场景的任务, 比如同样逻辑从一种编程语言翻译到另外一种, 或是给已知代码编写单元测试, 的确现在的LLM能够做得很出色. 但是对于更开放的问题, 或者更长的代码, 或者是更少见的技术, 那么AI的帮助很有限, 甚至有时候是在帮倒忙. 我们得寄希望于技术的进步, 让LLM更优秀更全面, context上的阻碍更小, 另外得看到, LLM在提升上已经越来越小, 悲观一点说, 也许不太会有巨大的跃进.
又开始在旧电脑上折腾Linux, 这次的目标是Chimera Linux, 技术选型很讨喜, 我在一台2015年的MBA上LiveCD启动后能正常看到桌面, 声音/触摸板/蓝牙也都没问题, 不过网卡驱动得自己编译. 在这个上面已经花了两个晚上, 不过乐在其中.
2025-03-13 10:40:00
这个月读完了Everyday Shakespeare: Lines for Life, 这本书看起来挺厚实, 不过大概一天就翻完了. 往不好听一点说, 这算是dumbed down版的莎翁名言录. 不过考虑到几百年的差距让那个时候的很多词的意思和现在都有了很大的区别, 不通俗化一点的确不太好读. 除了那些字面上的thee, thy, thou, hath/doth之类的, 有些不是那么明显, 但是会给阅读造成障碍. 一个典型例子比如:
A little fire is quickly trodden out; which, being suffered, rivers cannot quench
这儿suffer的意思是”to allow”而不是”to endure”. 但是如果你按照忍受的去理解, 就会觉得殊不可解了.
说回这本书, 组织形式大概是按日期每天一页介绍一句名言, 除了讲解这句话的出处外, 还贴心地解释, 在什么情况下引用这句话比较合适. 整体来说阅读难度很低, 我自己是一边陪着Claude Code写代码一边翻完的. 边写边记笔记, 把这些名言记下来, 现在来回顾一遍.
Unbidden guests are often welcomest when they are gone
这句和汉语里的”请神容易送神难”有点类似. 现代英语会说most welcome, 但是如果说welcomest, 一下子就古意盎然了.
Better three hours too soon than a minute too late
汉语里面有宁停三分不抢一秒的说法. 两个说法都是拿一个长时间和一个短时间做对照来强调. 当然这两句一为守时一为守则, 有所不同.
It gives me wonder, great as my content, to see you here before me
这句是用来打招呼的, 读起来音韵感挺好, 像在唱歌一样.
Love all, trust a few, do wrong to none
书里面介绍, 这句话除了用来自勉以外, 也合适用来送给即将分别的友人. 汉语里有”害人之心不可有”的说法, 但是整个句子就和这儿莎翁的句子大相径庭了.
Fortune brings in some boats that are not steered
这句话的意思更多是说总有人非常幸运, 不靠努力也能成功. 有点像”站在风口上,猪都可以飞”. 但是两句话又有细微的区别, 莎翁这句更是强调偶然性和不可控性. 汉语这句更像是和自我奋斗vs历史进程关联更大.
Make not your thoughts your prisons
这句话实际上是在说要think out of the box, 不过换成这样的祈使句, 读起来更有力量感. 有点master yoda的感觉了吧?
There’s no art to find the mind’s construction in the face
这句话是在说人心难测, 对应汉语里的”画龙画虎难画骨, 知人知面不知心”. 相比之下, 我更喜欢汉语里这样的表达方式, 不谈这个对仗, 单论汉语里后一句, 三个字重复使用, 节奏感很强.
He that will have a cake out of the wheat must needs tarry the grinding.
有点像汉语里的梅花香自苦寒来. 也有点像莎翁另外一句uneasy lies the head that wears a crown, 当然原句说的是辛劳, 而后面这句说的是risk management.
Your worship was the last man in our mouths
汉语里对应的说法是”说曹操曹操到”. 英语里类似的还有”talk of the devil”这个说法. 个人觉得talk of the devil还更有表现力一些.
Abide the change of time, quake in the present winter’s state, and wish that warmer days would come.
这句记下来单纯因为它很应景, 现在不仅仅是一个国家/地区的动荡, 而更像是整个世界范围的动荡. 汉语里的表达类似”守得云开见月明”.
All days are nights to see till I see thee, and nights bright days when dreams do show thee me.
这让我想起莎翁情史里女主朗诵的这段:
What light is light if Sylvia be not seen? What joy is joy if Sylvia be not by— Unless it be to think that she is by And feed upon the shadow of perfection? Except I be by Sylvia in the night, There is no music in the nightingale. Unless I look on Sylvia in the day, There is no day for me to look upon. She is my essence, and I leave to be If I be not by her fair influence
这段朗诵的台词仍是莎翁的作品.
Grief makes one hour ten.
汉语里对应了”度日如年”, 相比之下, 我觉得英语版中的数字对比更直接更强烈一些.
Let us not burden our remembrances with a heaviness that’s gone
这句真美! 成功地将抽象的压力/回忆具像化成重量, 然后又轻轻抽掉. 汉语中类似的表达可能不少, 但是能够这么形象传神的应该没有.
Your present kindness makes my past miseries sports.
这句用来在被雪中送炭后感谢对方的善意. 让我联想到了”良言一句三冬暖”. 当然, 出自戏剧的这句有点太直白了些, 太像对话了所以记忆点不够足.
Thou hast no more brain than I have in mine elbows.
这句骂人的话适合送我家那只橘猫, 英语世界里有另外一句”All orange cats share the same brain cell”
I understand a fury in your words, but not the words.
这句是说对方只是在情绪输出, 但是没有什么条理讲不清楚事情. 这句话听起来就让人感觉很舒服, 首先给了understand, 表达了同理心, 但是也直接地指出了问题, 同时并没有对对方有任何的指责, 只是说自己没understand.
But since all is well, keep it so: wake not a sleeping wolf
这句让我想起本行, 一个系统能跑就不要动.
Now this ill-wresting world is grown so bad, Mad slanderers by mad ears believed be
‘Tis the time’s plague when madmen lead the blind
这两句在书里面靠的很近. 虽然来自不同的作品, 但是表达的意思都是一致的. 当然, 仍然很应景.
Nothing will come of nothing
这句话可以用来在起床时激励自己, 一分耕耘才有一分收获.
The task he undertakes is numbering sands and drinking oceans dry.
这句话真形象, 抽象的任务的艰巨程度被描绘成了数砂和饮尽海水.
All that lives must die, passing through nature to eternity.
人生的意义是什么?
To me, fair friend, you never can be old, for as you were when first your eye I eyed, such seems your beauty still.
同样让我想起莎翁情史里的台词, “you will never age for me nor fade nor die”, 不过后面这句不出于莎翁的著作.
I love and honour him, but must not break my back to heal his finger
这句强调不要为了别人的小事而牺牲自己的大事. 自己的一味付出总该有个限度.
I must hear from thee every day in the hour, for in a minute there are many days.
这句来自不朽的罗密欧与朱丽叶, 算是”一日不见如隔三秋”的英语版. 后半句把等待消息的期待写得很形象.
2025-02-23 14:01:00
这个月继续沉迷写码, 游戏书籍电影涉猎得都少. PS5只主动打开了一次, 把Gran Turismo Sport又下载回来, 找了几个赛段之后又开始重跑北环(Nürburgring Nordschleife). 没自虐到要求金牌, 花了大概一个小时熟悉赛道后练习了五六次, 过了银牌就好. 手机上继续偶尔玩小丑牌, 最好的记录是过了橙注, 要过金注需要运气非常好才行. 挑战也过了三个(富者愈富/刀锋之上/疯狂世界), 但是这个游戏再玩下去也没什么意思了. 至少我自己玩的时候套路已经比较确定了. 后面可能无聊过过挑战吧, 顺便解锁最后剩下的两个小丑牌和两个优惠券.
书籍的话翻出大唐双龙传, 从隐潭山反败为胜开始读, 直到最后的大结局. 整个没花多少时间, 感想是虽说市面上的普遍印象是黄易的文笔很烂, 但是实际上基本水准还是在的, 比现在普通人都能写的网络小说还是要好一些.
最近重新翻出RSS开始读. 之前一直是macOS上一个旧版的Reeder(比这儿的Reeder Classic还要旧), 配合inoreader来读RSS. 但是Reeder的UI的确不太有吸引力, 而且也缺乏稍后读的功能. 看了一圈, 看来市面上能够支持RSS的产品已经少了很多了. 我尝试了一下Readwise家的Reader, 没感觉有特别杀手的特性, 而且完全没有免费的版本. 我又试用了Matter, 这个产品感觉已经很不错, 很是我所希望的功能了, 但是我7天后才发现iOS和iPadOS上没有订阅不能用App里面的阅读功能, 而只能用网页版. 而且iOS下的网页版体验只能说一般, iPad上要好一些, 接近原生app了, 于是现在打算继续使用inoreader当入口, Matter当主阅读器. 毕竟深入阅读的场合我都还是可以掏出iPad的.
读RSS文章的时候看到了这篇讲vim现状的文章, 里面有提到使用coverity来保证基本的代码质量. 因为我手上的dashed项目, 于是就试用了一下. 基于github action, 很快地就将静态分析结果发了过去. 结果还真的找到了不少问题. 这个产品的功能很强大, 但是marketing和用户体验做得很一般. 当然, 另外一个感叹是AI生成的代码不太能直接用, 虽然我已经人肉修过好多次了, 但是还是可能有各种潜在的问题.
这个月dashed项目(详情见上个月的介绍)没什么太大的进步, 主要完成的是将命令行历史保存到sqlite里面去, 再就是修一些coverity发现的C的问题. 另外一些未完成的工作围绕着将carapace-bin里面定义的很多补全规则提取出来. 一个典型的例子比如对sudo命令的补全, 因为现在的代码组织的缘故, 我不太好直接import这份代码, 所以只能依赖读代码并丢给ast来分析的方式, 解析成一个内部格式, 然后再加入到我的项目里面来.
dashed还没写完, 我倒是又开了一个新坑. 这个项目被我叫做左右互搏, 大概的主旨是让一个AI来写代码, 另外一个AI来读代码, 做代码评审, 当代码评审通过时直接在本地一个容器中进行修改, 并运行测试. 目前基本功能可以跑通, 比如可以让LLM把一个打印hello world的go程序改成打印hello llm.
另外, 这个月我还折腾了不少neovim相关的东西, 之前试用的是我自己修改过的codeium, 不过现在codeium的那个公司主要精力应该是在windsurf上了. 所以我尝试了一下本地跑一个用于补全的模型. 搜索了下, 目前最好的似乎是qwen2.5-coder. 只是我本地跑的时候, 直接curl的延时都会比较大, 不太确认是什么原因, 不过后来公司提供了copilot, 于是就拿起了copilot.lua, 用起来比codeium要好一圈. 不过我倒是觉得, 编辑器自动补全的需求还是有的, 而且这个补全理应不需要一个超大的模型, 应该是可以蒸馏出一个比较小的, 可以本地用的模型出来. 看到同事演示的cursor写前端有点眼馋, 后面估计会试试Copilot chat的插件.
我们公司内部开会时, 公司的founder们很鼓励大家使用AI, 而且给我们申请了各种各样的AI model, 方便我们使用和创新. 据内部一个调查, 使用AI的程序员比不使用AI的程序员相比产出的PR会高一些. 这个因果关系里孰因孰果有待商榷, 不过公司能够这样鼓励新技术的使用, 还是很值得赞赏的. 另外我们的COO的说法是, AI会是我们人生中最大的一次paradigm shift, 比互联网普及和手机普及还要大. 我能够看到的未来比较有限, 不过目前来说, AI的确给我赋能, 大大提升了我的效率, 给我的生活带来了正面的影响. 我觉得接下来需要仔细看的是AI会不会达到奇点, 以及到达奇点后会发生什么样的事情.
2025-01-30 08:21:00
这个月沉迷写码, 游戏书籍电影涉猎得都少. 游戏来说全成就了九日, 这个游戏真的很推荐. 很多角度来说, 这个游戏都像是一个低成本的黑神话. 最后的boss战, 真假结局, 对中国文化传统的再挖掘, 都是很值得赞赏的. 很期待赤烛的下一部游戏. 另外, 差不多月中的时候手机上开始玩小丑牌. 目前还在努力解锁所有小丑(还剩6个), 基本上所有手牌都通了红注, 但是只有比较容易的方格牌组通关了绿注. 目前主要感受是要保持平衡, 默认的5张小丑牌, 要有经济的, 加筹码的, 加倍率的, 加特效的, 后面还要换成乘倍率的. 最好玩的一次是拿了比较好的组合, 能够比较有效地Farm幻灵牌. 这个游戏很容易沉迷, 写码写累了来一局感觉还挺好. 令人觉得很厉害的是游戏的平衡性做得很好. 另外我在等到了主机上支持loot filter的更新后尝试回归了Path of Exile 2, 不过还是没怎么玩下去, 第二周目到了最后一个章节. 这个游戏没让我感觉太engaging, 很多时候只是为了玩而玩, 挺累的. 躺在床上刷小丑牌更舒服不是?
书籍开始重读燕食记, 这次重读的时候特意标记了一下那些我觉得很细致很入神的描写, 比如:
小孩子们在地下欢闹着,边剥边吃。慧生剥开一个给阿响。吃下去,爽了神一般,刚才的旅途劳顿,竟然不觉了。阿响抬起头,看晨光熹微,照进山谷里来了。光芒从繁密的树叶间筛过来,落到地上是斑斑驳驳跳动的影子。雾气也散了,渐渐稀薄,也匿到了光里头,整个山谷都明亮起来。
这段是描写在果园吃荔枝的场景, 顺着小孩的视角, 没有直接描述荔枝的好吃, 而是通感般地描写太阳的光照. 短句也多, 仿佛诗一样.
河川守智推开了邻湖的满洲窗,看见窗外的荔枝湖上,已是一派绿意。微风吹过,湖上泛起层叠的浪。不是水,而是新生的荷叶,正是舒展的时候。茎叶相连,一叶推着一叶,向远处迭进去。他想,秋后底下生出的,又是枝枝好藕。
这段是写餐馆旁荷塘的景致, 这段荷浪的描写让我想起了朱自清, 篇幅/剧情限制下, 这儿没有太多着墨, 自然无法与荷塘月色里的繁复描绘一较高下, 但是我觉得这段比季羡林那篇里聊胜于无的描写还要更好一点. 比如写浪, 用的是推字和迭字, 都很精到.
这个项目在不断的演进下已经算是比较稳定了, 我自己也已经用了有一个月了. 希望不会有太多的bug. 不过看着自己的idea从无到有地萌发出来, 感觉也还是挺特殊的. 另外, 对于nvim这种比较方便hack的编辑器, AI的时代也对我们的使用带来了很大的便利, 我们现在已经可以按我们的要求来随意扩展编辑器的功能了. 相信随着AI的发展, 我们也许会有自己跟AI聊聊天, 就能帮我配置好编辑器的一天(对, 我相信无论到什么时候, 自己写代码都还是有必要的, 我不相信AI会让所有的编程语言都变成机器码).
这个月又开了一个新项目, idea源于我很早就有的一个需求: 一个更现代的shell. 我之前尝试过用rust+pest来完成一个shell, 后来发现POSIX是一个深坑, 我自己来说那个项目就半途而废了, 不过这也许也是很多新写的shell不再使用POSIX标准. 但是, 就我个人的使用习惯, 我觉得POSIX标准还是有市场的, 毕竟在已经熟悉bash的前提下再去学一个新的shell语言规范实在是有些不划算. 然而, 那些比较成熟的shell相对不太会有比较大的更改, 因为这些shell除了提供交互体验外, 还要兼顾脚本执行的功能, 而在这种情况下, 稳定是压倒一切的.
月底时和AI聊天, 想到另外一个approach, 我们也许可以修改已有的shell, 在交互模式下, 我们可以短路一些shell内置的逻辑, 而运行一个我们自己提供的cli. 所有的用户体验都可以由这个dashed(dash line editor)来完成. 为此, 我在AI的协助下修改了dash的源码, 插入了一些我自己的hack, 下面是一个PoC:
上面这个gif里大概展示了这样一些功能:
DASH_LINE_EDITOR=./dist/dashed ./dist/dash
, 即告诉我们自己编译的这个dash, 使用我们自定义的行编辑器.现在项目的进度是刚刚hack完dash, 协议还没完全完成(现在只通过命令行将退出状态传给了dashed, 但是还有一些其他信息需要传递呢). 至于为啥不hack bash/zsh而是dash? 因为代码少而且简单啊. bash和zsh的代码量都会大不少. 而且交互模式下我们不太会需要用到那些高级功能, POSIX提供的那些就够用了, 至少目前是这样的. 这个路如果走通了, 我们后面还有机会还可以去hack其他的shell. 项目目前还是private, 等更稳定一点功能更丰富一点的时候会设为public.