============= 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 有点奇怪。我剪掉了长长的头发,又开始在房间里画一点写生,工作还没有着落,但有一些好消息。我完全不知道以后的自己是什么样子,其实也不算是坏事。