=============
2025 更新日志
=============
.. post:: 2026-07-05
:tags: 生活, 绘画, HomeLab, Sphinx
:author: LA
:category: 年度总结
:location: 北京
现在已经是 2026 年的夏天,但对于我来说,2025 好像迟迟没有离开,所以我写下这篇文章主动告别 2025。
青年艺术家,停止表演
====================
燕郊的学习在两个月前(也就是 26 年的 5 月)结束,我在晓飞老师的工作室完成了素描课程、色彩课程,以及原定的目标:商品级别的作品创作。
那段时间我去画室不再是上课而是画创作,我留起了长长的头发,身上的衣服斑斑点点的都是颜料,看上去像艺术家,做的事情也像艺术家,所以,让我不妨怯生生地自夸一下,我也算是个青年艺术家了?
第二张长期作业
--------------
25 年 5 月的时候我终于把摩西像完成。本来 21 年我已经把课程内容走过一遍,现在回炉再造时却明显感觉自己比当年更迟钝,因此平添不少内耗。
现在回看,21 年的在简单的石膏像上死磕获得了银灰色的美妙质感,25 年面对一个复杂得多的画面依然也能保持逻辑清晰,我其实不必更苛求自己。我过去也许有一个隐秘的优点:即使自我评价不高、即使赢不起也输不起,还是会死磕着没有完全放弃。但我想这个优点我就不带到以后了。
.. gallery:: m-002 m-006
:grid: 1 1 2 2
难道我意外地有些色彩天赋?
--------------------------
在 23 年之前我没有接受过正经的色彩训练 -- 我一直在有意识地避免自己「受教育」。这里其实有点过于爱惜羽毛的意思:虽然我画不好,但内心总觉得大部分色彩教学的「近暖远冷」「近纯远灰」「暗部藏色」难以说服我,因此抗拒使用他们的理论,反过来又加深了自己色感不好的印象。
23 年国庆的时候我抽空回画室画了半个月,色彩课程开了个头。画完摩西后,26 年 5到 8 月,我在画室又完成了色彩训练的室内部分。让我感到意外的是,学色彩的过程没有像学素描那样步步受挫,也一直得到老师的夸奖,虽然最后还是花了别人两倍的时间,但这样的结果已经让我非常满意了。
.. gallery:: cs-006 cs-007 cs-008 cs-009 cs-010 cs-011 cs-013 cs-022
:grid: 1 2 4 4
中间 Swan 回北京,一起度过了一段短暂的甜蜜时光,为了不耽误上课,辛苦她住在离公司很远的酒店。后面我和老师说要尝试写生,在人大地铁站附近画了一些写生。
.. gallery:: cs-014 cs-015 cs-016 cs-017
:grid: 1 2 4 4
9 月,老师让我外出写生,分别在燕郊的小区、北京青龙湖、老家、云南画了一些画。那时候刚好分手,没什么行动力,所以画得并不多。
.. gallery:: cs-021 cs-024 cs-035 cs-037
:grid: 1 2 4 4
作品制作
--------
11 月的时候,到了原定结束学画的时间,但我的进度还远远落后,不能拖下去了。我跟老师说我不想再画色彩,要开始做作品了。
这里说的作品是:稍大尺幅的(相比几十厘米的小画)、在做工较好的画框上绘制的、完成度高的、个人创作。我接触油画时间太短,完全没有油画创作经验,老师给我推荐的策略是:从以前的水彩小稿里选比较好的,直接放大画成油画,不使用太多技法,平涂覆盖多次直到效果足够好。
从 25 年的 11 月到 26 年的 5 月,断断续续地画了 17 张成品,记录在 :doc:`/notes/zxsys/way-to-artist/prod`,每一张都远算不上完善,但确实也呈现出了一些灵韵:
.. gallery::
:grid: 1 2 4 4
s-001 s-004 s-007 s-009
s-011 s-013 s-014 s-017
s-010 s-012 s-015 s-016
这段时间的生活上过得不太好,画室很久没有学生来,平时也没有说话的人,除了打羽毛球时候能快乐些,但总之是熬过去了,我获得了这些画,完成了这次学习的目标。
后面的时间里,按说这位青年艺术家应该开始联络画廊和策展人,同时继续新一轮的创作。但他从燕郊搬走了,画画其实对他失去意义了,尤其是在完成这些作品之后。
风暴瓶的隐喻
------------
很长一段时间里我都在怀疑创作是否加深了我的痛苦,或者说我是否为了创作去刻意追求痛苦纵容自己的恶性思维。又害怕自己因为不创作而变得不特别,而失去那个人的喜爱。
你啊你,你想和稀泥说「你不是这样的」?还是想说「这是艺术家的天命使然」?
事实上是,我确实纵容了自己的恶性思维,因为害怕自己不被喜欢而向他人施加了压力,最后也成功了失去了那个人的喜欢。
我现在心里倒没有悔恨,也没有想道更多的潜,只是有点点遗憾。
晓飞老师让我写创作自述,我让 GPT/Gemini 看了我的画,然后各给我一个自述,初稿里当然有很多艺术圈的套话,但我从和 GPT 的多轮对话里慢慢形成了一个有意思的版本:
我曾是一名软件工程师。在长时间与系统、逻辑和确定性相处之后,我两度「脱轨」,离开了原本的职业轨道去学习绘画。我曾把自己的选择视为命运的感召,后来才意识到,我只是需要一条高尚的遮羞布,来供一个被效率、理性与自我要求压抑的人藏身而已 —— 绘画,再适合不过了。
在这一系列的作品里,绘画不是一种表达观点的媒介,而更像是一个反映内心晴雨的风暴瓶。我过分敏感,总是滋生很多情绪,工程师的职业素养让我天然倾向于结构化地理解一切,但这些情绪却并不遵循显著的逻辑。理性的分析在这里处处碰壁,最终从理解转变为抵抗。更可怕的是,当一个人过度观察自己时,他既是主体,也是被观看的对象;我试图以理性解构自己,同时自身也被解构,一点一点分崩离析。这种崩坏有时是自限的,达到一定程度后又因为求生本能而熔断,于是内心的暴风雨过境,我在一片狼藉中得以喘息。
在内心世界,矛盾产生,激化,归于平静,又再次产生。在瓶中,随机的晶核出现,结晶,消融,又再次结晶。这些矛盾是超越语言的 —— 或者说,我没有能力用线性的、基于语言的思考去梳理、消融他们。我只能画画,画布作为晶核,颜料在其上凝结,通过窥视这个瓶子,我得以伪装成一个真正的客体来看见自己的内心。
我的绘画里经常同时存在两种相反的力量:一面是克制、冷静、必须服从某种规则的理性组织;另一面则是躁狂、荒诞、经常扭曲边界的感性体验。就如同微观晶体的形状只取决于内部粒子的排布,但外部复杂的环境又促成了千变万化的宏观形状。我自己也经常沉醉于这两种力量并置时带来的美妙体验,可是当我越来越熟练于辨认、凝视并描绘这些内部风暴时,我也开始怀疑:这种持续的自我觉察,究竟是在使我更接近真实,还是正在制造一种新的异化?
*你知道吗,其实风暴瓶与天气的对应关系几乎成随机分布。*
数字生活
========
因为不工作,今年的所有代码都是为了自己写的。
Homelab 建设
------------
新设备 :dev:`n100`
~~~~~~~~~~~~~~~~~~
年初了时候因为 :dev:`rpi3` 性能不足,跑不动更多的服务,咸鱼买了个台工控机准系统,又去收了二手内存,买便宜硬盘,期间小有波折,最后也总算是把机器攒起来了。
作为以前靠电脑吃饭的人,我其实对电脑硬件的代际、接口和性价比都没什么了解(也缺乏热情),这次调研的时候通过大量和 AI 聊天恶补了一堆(大概是正确的)知识,最后攒出来的结果自己还挺满意,在此记录:
- 一番调研后我决定买小型的工控机而非品牌的 NAS/NUS,工控机厂商都很小,没什么品牌溢价,缺点是外观没有设计可言、没有 NAS 那么多的盘位、没有集成的系统、一般不带存储和内存。但便宜就是最大的优点了,我闲鱼上 ¥570 拿下一台新创云的工控机。
- 我选的 CPU 是 Intel n100:
- 23 年的 CPU 还算不上到洋垃圾,在未来五六年内都够用;缺点是比洋垃圾贵了好几倍
- 低功耗(TDP 6W)的同时还是 x86 架构,可无缝用 ArchLinux,archlinuxcn 的包也可以直接用。
之前用树莓派的时候偶尔会需要自己编译一些包,但树莓派太弱了,只能偷摸用社区的 buildarm 机器
- 主板上接口还算丰富:
- 4 个 2.5G 网口,对我来说两个就够用其实,多了当然更好
- 主板上 1 个 M.2 接口(系统盘)、1 个 SATA(数据盘)、一个 MiniPCiE(空置,*此处有伏笔*)
- ``USB3 *2`` + ``USB2 *2`` + ``HDMI *1`` + ``DP *1``,我没有特殊要求
- 内存插槽只有一个,我淘了一条联想拆机的 RAMAXEL DDR5 12G 的内存 ¥110
- 内存很难坏,买二手的就行
- DDR5 是个缺点,相比 DDR4 贵太多
- 挑了在消费级市场不知名的 RAMAXEL(基本上都是拆机件)
- 12G 对 Homelab 来说足够了,而且这个冷门的规格(相比 8/16/32)算下来 perG 的价格最便宜!
- 硬盘最开始想法是:系统盘可以买个小的(64G)、二手的无所谓,可以随时恢复,数据盘靠谱即可,结果 PDD 上买了两次便宜硬盘都翻车了,于是最后还是买了新的:
- 系统盘长城 GW3300 128G ¥64,数据盘铠侠 TC10 1T ¥348
- 机器内空间太小,塞进一个 2.5 寸硬盘费劲儿,需要特地买上弯+上弯 SATA 线才能盖上盖
最终的花费大头是:``570+110+64+348=`` *¥1092*。
n100 晋升网关
~~~~~~~~~~~~~
我之前的 NetCore G1 4G 无线路由器的信号质量很不好,且用 Linux 连它时总连不上,最后也没搞明白原因。
后来我就将他便宜买了,在家就只能把流量卡插手机里开热点。于是内网的设备们就闲置了,包括 n100。
但 5 月底搬来北京后我开始琢磨是否能买个 4G 模块,加上树莓派或者 n100 就不用再买 4G 路由了。
最终,在众多 AI 的指导下给工控机加上了一个 20 块淘的移远 EC20,配合 19 月租的流量卡,让他从一个普通的大头设备晋升家里的网关。最后我要求一根黄色的曲别针变直,任命它为 LTE 天线,负责将这个漂亮的小房间和世界连通。
.. grid:: 1 2 4 4
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1783235485068.webp
便宜量大的广电流量卡
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1783235487682.webp
20 块淘的移远 EC20 模块
.. grid-item::
.. figure:: /_images/2025-changelog/IMG_20260705_202022.jpg
为了让 n100 调试时能联网,用上了手机 USB 网络共享
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1783235491711.webp
现在这个小房间居然通过一根掰直了的黄色曲别针和世界相连
chezetc: 管理所有主机配置
~~~~~~~~~~~~~~~~~~~~~~~~~
有了更强劲的主机后我开始部署更多服务:immich、gitea……(好像也没多少),开始纠结于各个服务的配置如何管理起来,
如果是用 k8s/k3s 大约可以用 ConfigMap 管理并且把整台机器打包?但家庭网络用这个还是杀鸡用牛刀了。
咨询过资深老师傅 pandada,pdd 表示部署上去就完了,反正很少会有迁移的时候,这么说也有道理……
我对管理配置的执念其实来自 Linux 用户人手一个的 :archwiki:`dotfiles`,用户可以把 $HOME 下的软件配置文件用软链接或者专用的 dotfiles 管理器统一放到一处管理。
但部署服务时的配置不同,系统服务的配置在 ``/etc`` 下,用软链接或者 dotfiles 管理器会产生权限问题。
也有 etckeeper 这类软件,但他把整个 ``/etc`` 当成一个 git 仓库的做法我不喜欢,``/etc`` 下大部分的配置我都不需要更改,更不需要管理他们。
一番搜索后我看到了 `chezmoi `_,它是一个 dotfiles 管理器,策略是而是通过复制文件/模板生成来管理配置,使得它有可能管理 ``/etc`` 下的文件(如果是基于软链接就避不开权限问题了)。此外软件还提供了非常多的扩展能力和配置项。
`twpayne/chezmoi · Discussion #1510 `_ 提供了一个思路,利用 chezmoi 的 hook script 来处理权限问题,于是我在这个基础上写了 chezetc:
.. ghcard:: SilverRainZ/chezetc
chezetc 只是一层薄薄的脚本,简单来说它:
- 会几乎原样转发命令行参数给 chzemoi,绝大部分工作实际上还是 chezmoi 完成的
- 通过 ``--config`` 隔离配置让原生的 chezmoi 实例免受影响
- 最关键的,chezetc 通过注入配置和钩子,使得 chezmoi 能够维护在 ``$HOME`` 下维护一个仓库,管理 ``/etc`` 下的文件:
:如果从 ``$HOME`` 更新到 ``/etc``: chezetc 会在复制文件时自动插入 ``sudo``
:如果从 ``/etc`` 更新到 ``$HOME``: chezetc 会在文件复制后自动 ``chwown $USER``
在此基础上我在内网 git 上创建了 etcfiles 这个仓库,用来容纳我所有机器上的统配置,结构大概如下::
etcfiles/
├── README.rst # 项目说明
├── chezetc.toml # chezetc 工具配置
├── data.yaml # chezmoi 模板数据(LAN IP、Tailscale IP、服务映射、主机名)
│
├── prefix/
│ └── etc/ # 对应 /etc 下的配置文件
│ ├── shared/ # 共享配置(pacman, nginx, letsencrypt, systemd 等)
│ ├── x1c/ # ThinkPad X1C 专属配置(iwd, llama-swap 等)
│ ├── n100/ # N100 专属配置(dnsmasq, forgejo, bitwarden 等)
│ ├── rpi3/ # Raspberry Pi 专属配置(iwd, miniflux 等)
│ ├── tcc/ # 腾讯云主机专属配置(nginx)
│ └── claw/ # claw 主机专属配置(sing-box)
│
└── bin/
├── etc-host # 操作单台主机的配置
└── etc-shared # 操作所有主机的共享配置
``etc-host`` 和 ``etc-shared`` 是 chezetc 的简单封装:
前者会将 ``etcfiles/prefix/$HOST/etc/`` 下的配置文件和 ``/etc`` 关联起来,而后者则无论当前主机为何,都将 ``etcfiles/prefix/shared/etc/`` 和 ``/etc`` 关联起来。这两个脚本组合起来,我就能灵活地处理多台机器上的所有配置了。
The Sphinx Notes Project
------------------------
随着这两年 AI 的飞速发展,关于通用知识的笔记是几乎没有记录的必要了,但我依然
依赖我的笔记系统记录一些个人化的东西:画册、练习谱、一些复杂的备忘。
此外,探索如何「将笔记更好地结构化、去冗余」带给我很大的愉悦感,所以 SphinxNotes 系列项目的开发没有停滞。
``sphinxnotes-render``: 统一的渲染能力
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
在 Sphinx 里,减少冗余一个办法就是创建专用的 |rst| 指令(Directive,可以理解为标记语言里的可调用函数)+ 模板生成。
举个例子,假设我有大量的作品要记录,我可以创建专用的指令 叫「作品」,有日期、媒介、尺幅几个属性,这个指令会在文档构建时将结构化的作品信息作为 context 传递给形如右方的模板:
.. grid::
.. grid-item::
:columns: 12 4 4 4
.. code-block:: rst
:caption: Original |rst|
.. 作品:: 出行准备
:编号: s-009
:日期: 2026
:材料: 油画
:尺幅: 60cm*50cm
作品简介……
.. grid-item::
:columns: 12 8 8 8
.. code-block:: rst
:caption: Template
{{ 名称 }}(``{{ 编号 }}``)
📅 ``{{ 时间 }}`` | 🎨 ``{{ 材料 }}`` | 📐 ``{{ 尺幅 }}``
.. image:: /_assets/aw/{{ 编号 }}.webp
{{ 内容 }}
模板渲染的结果是新的 |rst|,会继续交给 Sphinx 渲染得到最终的文档,如此我们便可以只提供必要的信息便得到足够丰富的文档。
.. grid::
.. grid-item::
.. code-block:: rst
:caption: Rendered |rst|
出行准备(``s-009``)
📅 ``2026`` | 🎨 ``油画`` | 📐 ``60cm*50cm``
.. image:: /_assets/aw/s-009.webp
作品简介……
.. grid-item-card:: Rendered Document
出行准备(``s-009``)
📅 ``2026`` | 🎨 ``油画`` | 📐 ``60cm*50cm``
.. image:: /_assets/aw/s-009.webp
作品简介……
这样的模式在我的文档里普遍存在,但他们因为形式不同,需要由不同的插件实现:
- 除了画作之外,友情链接、读书笔记也都有对应的专用指令(由 :pypi:`sphinxnotes-any` 提供)
- 首页的「最新更新」功能使用了 :rst:dir:`recentupdate` 指令来读取 Git 仓库,并配合模板生成更新条目(由 :pypi:`sphinxnotes-recentupdate` 提供)
- 所有 SphinxNotes 项目的配置项描述,都是通过 :rst:dir:`autoconfval` 指令实现,仅需知道配置名称,就能从 Sphinx 内部 class 里取得类型和默认值(由 :pypi:`sphinxnotes-project` 提供)
这些相似的逻辑代码之前一直分散在不同的项目中,今年的主要工作就是 ``sphinxnotes-render``:一个用于在 Sphinx 里渲染数据的框架,为有自定义指令 + Jinja 模板渲染需求的插件提供底层能力。
.. ghcard:: sphinx-notes/render
将这些能力抽象出来不太容易,配合 AI 来回重写了几个版本,最终这个框架包含这些核心能力,满足当前所有需求,应该也给未来留下了扩展余量:
- 一套用来用来描述 Directive 参数的 Schema Definition Language
- 一个携带模板和结构化数据的 docutils 文档节点 ``pending_node``
- 一个搭配 ``pending_node``,能在 Sphinx 构建文档不同阶段(parsing、parsed、resolving)都提供近似的渲染能力的 render pipeline
- 一系列提供不同程度渲染能力的 ``SphinxDirective`` 和 ``SphinxRole`` 基类
有了底层能力之后,原来的扩展在迁移过去后,自动拥有了很多新特性的同时也减少了很多重复代码:
:+1311+,-1822: `Integrate with sphinxnotes-render · sphinx-notes/any#51 `_
:+149,-256: `refactor: Migrate to sphinxnotes-render · sphinx-notes/recentupdate#5 `_
``sphinxnotes-any``: 支持 object embedding
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
.. ghcard:: sphinx-notes/any
:del:`这里的 embedding 就是字面意思,和 LLM 的 embedding 没有半点关系。`
sphinxnotes-any 允许用户定义各种各种的专用指令,每个指令使用时会生成一个 object 和对应的锚点,还是刚才的例子,创建了一个作品对象 ``s-009`` ,用户可以文档的任意一处通过 |rst| Role ``:作品:`s-009``` 创建一个指向它的超链接。但如果我我想在文档中嵌入作品的图片,或者作品的描述呢?
在迁移到 render 后的 any 3.x 后,这个功能可以被顺畅地实现了:`feat: Impl ObjEmbedDirective · sphinx-notes/any#54 `_。用户可以用自动生成的 ``xxx+embed`` 指令,在它的 body 里编写的 |rst| 可以直接访问到对应作品的信息。这里就不用虚构的例子了,我们用 :rst:dir:`artwork+embed` 指令即可将 ``s-009`` 嵌入到文档里:
.. example::
.. artwork+embed:: s-009
.. figure::
/_assets/aw/{{ id }}.webp
:width: 50%
{{ name }}, {{ size }}
本文包含的所有画作图片也都是通过类似的这个方式插入,不过用了更多的封装,只需要提供作品 ID 就能批量地插入并显示为网格布局,:doc:`/gallery` 页面也是这么实现的:
.. example::
.. gallery::
:grid: 3 3 3 3
s-009 s-001 s-004
不擅长许愿的古典程序员
----------------------
早在 23 年 GPT 就显现出了强大的逻辑能力,但我是没想到 AI Coding 的落地如此之快:从 25 年底 Coding Agent 开始加速发展,现在大概没有几位程序员能自信地说写的代码比 AI 好了,这让我感到相当焦虑。如果有先知告诉我「未来不需要程序员了」倒也还好,对未知的恐惧是更折磨人的:我不知道现在的模型能力边界在哪里,也不知道未来它们的上限几何。
还好前者显然是可以解决的问题,26 年 2 月我从 OpenCode/MiniMax-M2.4 开始,我还记得第一轮任务是写 sphinxnotes-render 的 Schema DSL。用了一段时间我感到 M2.4 智商有限,这甚至让我沾沾自喜了一番。:del:`等我薅到 Codex/GPT5 的羊毛后,我发现自己还是自大了。`
5 月我搬离燕郊。因为不画画了,写代码更多了,也开始用 AI 优化自己的开发流程。
截至目前,我确实几乎不手写代码了,开发的速度比之前大概快了 3~4 倍,但离网上两天说的 Vibe 一个系统的效率还是相去甚远,我想了一下原因可能是:
0. 我还没有写全新的系统的需求
1. 我目前还在用二三梯队的模型(DeepSeek、MiMO,而非 Claude/GPT)
2. 我无法心安理得地许愿获取一个自己不了解的系统,我不能确保一个超出我能力太多的系统正常工作(当然可能 1 有关系)
模型
目前我主力依然是使用 OpenCode,配合 DeepSeek 的计费 API,另外订阅了 OpenCode Zen 让我偶尔能用上 Claude/GPT 此类 SOTA。
编码
我倾向于用 OpenCode 的 TUI,稍复杂的任务会先 Plan + :parsed_literal:`grill-me__` ,如果需要更细致的修改会打开 Neovim + :ghrepo:`nickjvandyke/opencode.nvim`
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/agents/skills/grill-me/SKILL.md
单轮临时对话
在终端里我自己写了个 :parsed_literal:`agent-run__` 脚本,配合 `Shell Aliases`__ 能方便发起单次的一问一答任务,不必每次都启动 TUI。模型用的 OpenCode Zen 提供的免费 DeepSeek,所以不需要省着用,很多终端操作都交给它:
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/bin/agent-run
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/home/.sh/agent.sh#L9
.. code:: console
$ run 把 cs-009.jpg 命名为 cs-010.jpg,后面的 010..038 以此类推,注意不要覆盖文件
.. code:: markdown
> action-easy · deepseek-v4-flash-free
✱ Glob "cs-*.jpg" 32 matches
→ Read .
... 省略部分输出 ...
没有冲突文件。从高到低逆序重命名:
已完成。验证一下结果:
完成。cs-009→010, cs-010→011, ..., cs-038→039, cs-
039→040,全部后移一位,没有覆盖任何文件。
遇到复杂任务则可以 ``run --hard`` 切换高一档的模型:
.. code:: console
$ run --hard 总结 https://github.com/neovim/neovim/issues/39032
.. code:: markdown
> action-hard · deepseek-v4-pro
$ gh issue view 39032 --repo neovim/neovim --comments 2>&1 | head -200
## Issue #39032 总结
标题: treesitter: attempt to call method 'range' (a nil value) in
languagetree.lua:215 with markdown fenced code blocks
状态: 已关闭(标记为 "not planned"),非 Neovim 自身问题
... 省略部分内容 ...
一句话: 这是第三方插件 nvim-treesitter 的兼容性问题,Neovim 本身无
bug,切换到插件的 main 分支即可。
语音输入
现在本地 ASR(Automatic Speech Recognition,自动语音识别)的小模型已经相当成熟,中英文混和不是特别多的情况下我会倾向使用语音输入。我在 Linux 下用 :ghrepo:`xifan2333/fcitx5-vinput`,配合 SenseVoice FunASR 模型,效果可以接受。
archlinuxcn 用户可以直接 ``pacman -S fcitx5-vinput`` 来安装和更新。
开发杂务
批量更新项目模板
SphinxNotes 开发至今已经有 10 多个需要维护的项目了,大部分是由 :ghrepo:`sphinx-notes/cookiecutter` 模板生成的 Sphinx Extension,共享文档、Lint、CI 等基础设施。但每次更新模板时或多或少需要人工解决一些冲突,有了 AI 后,配合 :parsed_literal:`sphinxnotes-template-update__` skill,批量更新变得非常轻松,现在要是把所有项目一口气迁移到 ``uv`` 应该也花不了半个小时。
.. figure:: /_images/2026-06-28_151018.png
`16 results in sphinx-notes`__
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/agents/skills/sphinxnotes-template-update/SKILL.md
__ https://github.com/search?q=org%3Asphinx-notes+chore%3A+update+project+template&type=pullrequests
Git Commit
我对 Git commit message 的编写一直有些强迫症,除非后面要 squash,否则是断不会写 "update" 这样的 commit message 的。现在有 AI 帮忙写 commit message 了,于是我有这么些 commit skill 互相配合,在不同的项目启用不同的 skill:
:文档修改用: :parsed_literal:`docs-git-commit__`
:配置修改用: :parsed_literal:`dotfiles-git-commit__`
:通用: :parsed_literal:`general-git-commit__`
在 TUI 则配置了 ``/commit``、``/push``、``/pr`` 几个 commands__,终端则 ``agent-run`` + 预定义的 alias
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/agents/skills/general-git-commit/SKILL.md
__ https://github.com/SilverRainZ/dotfiles/blob/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/.agents/skills/dotfiles-git-commit/SKILL.md
__ https://github.com/SilverRainZ/silverrainz.github.io/blob/641ff729d59a206295ce77e3f11a59388d5040e4/.agents/skills/docs-git-commit/SKILL.md
__ https://github.com/SilverRainZ/dotfiles/tree/3b4a4ee8625a64b8b968a0cf544a0554697d64b7/config/opencode/commands
未来还需要程序员吗?我不知道,但一个有 AI 可以用的世界也还不错。
线下生活
========
失乐园
------
分手后的生活发生了剧变,这并不是谁谁的错,除了短期的阵痛外,我更愿意相信自己是因为存在一些社会化上的不足而感到难熬,我只讨论我自己。
我现在什么感觉?
在情感开始有明显裂痕的阶段,我同期开展了咨询,本意是挽回感情,但重点不在此。咨询师一开始总是问我:「你现在是什么感觉?」。我说胸闷, 她追问:「感受一下身体,让你胸闷的那团东西是什么形状?」。我有些恼怒,这个东西怎会有形状呢?嗯,那个东西没有实体,确实不会有一个客观的形状,但也我没有听话 —— 我没有去感受,感受了的话,一定会有形状,哪怕是卫生纸套上小米手环,也会有示数啊。
在一次又一次的咨询里,我慢慢地知道了,胸闷是一团边界清晰的迷雾,有时候在胸口,有时候在喉咙,它们的存在是有原因的:有时候是没休息好,有时候是想起难过的事情,有时候是过敏哮喘了,有时候是因为我就在一个抑郁的状态里。我至少可以分区:我是身体不舒服,还是某件事情让我不舒服。我也会更频繁地反问自己:我现在什么感觉,我的情绪从哪里来?
好奇怪啊,这样的身体感受,早在 :doc:`/notes/zxsys/way-to-artist/find-yourself` 我就画过数十遍了,我能轻易地把它们画在纸上,但却无法回答自己「我现在什么感觉」,甚至很少有意识:这原来是我啊……
我也许从现在才开始看见自己。
学习挑剔和浪费
很经常别人问我吃什么,我说「随便」的时候,其实是真的随便,吃什么都行。别人问我喜欢吃什么,我也很难回答,我没有喜欢吃的东西吗?一方面是从小被教育不挑食,不能提要求,不敢说自己喜欢什么;另一方面,和问出「我现在什么感觉」很难一样,我也很少问自己喜欢吃什么。
其实我最爱吃的水果是芭乐、草莓和樱桃也很喜欢,虽然它们有点贵但是我就是喜欢它们;我最不爱吃苹果和梨。
每顿饭得有青菜吃才能舒服,热的时候会想吃汉堡可乐或者冷面,冷的时候想吃热腾腾的杀猪菜,偶尔会很想吃三文鱼;
我不能吃辣,讨厌吃速冻饺子和几乎牛肉丸以外的其他肉丸。
有时想尝试新的吃食,又怕实际上不好吃,我也会接受买来试试,实在太难吃我会扔掉。嗯,是有些罪过,但我也做过很多善事。
我其实是有很明确的好恶的,别人也有。
其实还有很多想写下,但写这些好像有些太过消耗自己了,我感觉不太舒服,喉咙发紧,不是过敏,应该是太累了,所以就到这里为止。
隐居在朝阳
----------
因为觉得燕郊的房子太压抑,因为想离北京的朋友近些,加之后续找工作大概率还在北京,我从燕郊搬到了朝阳一个有漂亮树景的房子里。每天的目标是按时吃饭,吃完在小区里一圈有一圈地散步 —— 后来发现哪怕这一点都很难,所以我更加刻意地这么做,整个人的状态居然也慢慢还有好转。
.. grid:: 1 2 4 4
.. grid-item::
.. figure:: /_images/2025-changelog/IMG20260503120700.webp
我的美丽树屋
.. grid-item::
.. figure:: /_images/2025-changelog/IMG20260624180724.webp
看到朋友圈立刻出门蹬车两公里拍到的漂亮浓积云
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1779361815851.webp
和球友在运河边野餐
.. grid-item::
.. figure:: /_images/2025-changelog/IMG20260705183249.webp
小区边上的单行道
其他
----
小妹降临我身边
去年 10 月底我去领养了小妹,是一只长毛狸花的小女猫!
不知道是不是小猫长大过程中都要经历一些波折,四个月多的时候在家摔断了股骨头,虽然狠狠折腾了一番但好歹也是健康长大了。
来朝阳后有了更多精力陪她玩,经过我一番教育,本来不让抱的她现在可以躺怀里三五分钟了!
.. grid:: 1 1 5 5
.. grid-item::
.. figure:: /_images/2025-changelog/微信图片_20260628154851.jpg
一开始像一个被唆过的猕猴桃
.. grid-item::
.. figure:: /_images/2025-changelog/微信图片_20260628154857.jpg
这不是缅因什么是缅因!
.. grid-item::
.. figure:: /_images/2025-changelog/微信图片_20260628154841.jpg
脸小小所以大声嚷嚷眼睛会皱起来
.. grid-item::
.. figure:: /_images/2025-changelog/微信图片_20260628154847.jpg
标准脸小猫,你应该去拍广告!
.. grid-item::
.. figure:: /_images/2025-changelog/微信图片_20260628154043.jpg
现在已经是一只标致中猫了
刘辉羽毛球周训
离开大柳之后就没机会练球,十二月的时候刷朋友圈发现 `刘辉周训营 `_ 有个位子空出来,在网上关注刘辉教练很久,感觉他的教学和晓飞老师一样,都比较成体系。机会难得于是去天津练了一周球,体验了一把运动员生活。抛开提升球技的目标不说,这种非日常的体验感非常美妙,每天训练再训练,时间被填满的同时不停地有新体验冲刷着头脑。可能相比旅游,这样的出行更适合我吧。
这次培训对我短期内的球技提升不大,从训练营回来只记住了高远球的动作,三个月内我甚至变得更菜了。但长期来看,我挥拍时肩膀不适的问题完全消失了,且上手球(高吊杀)的发力也越来越顺畅,可惜培训还是太贵了,不然可以再跑几趟。
.. grid:: 1 1 2 2
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1783244533950.webp
圣地巡礼
.. grid-item::
.. figure:: /_images/2025-changelog/mmexport1783244542529.webp
辉哥在直播
吉他
今年因为看了《凡人修仙传》,练了一首 `《归期》 `_,节奏还是有问题也没心思改。还跟着小龙老师的视频练了一点 :doc:`/p/small-triad`,感觉很有用但还弹不利索。
再见啦 2025
===========
已经是七月啦,这个时候才挥别 2025 有点奇怪。我剪掉了长长的头发,又开始在房间里画一点写生,工作还没有着落,但有一些好消息。我完全不知道以后的自己是什么样子,其实也不算是坏事。