大三下学期回顾

本文初记于 2026 年 8 月记事,后因篇幅过长、与今笏功能性不太相符而单独提成这篇博文。

一切要从初中开始说起……为了应对体育中考的引体向上,我学习了浪摆,自那以后——我是又浪又摆。

总之,又是拖延了一个月,才来写写有关这一学期的一点事情。内容的话大概就是看看这学期的一些日程记录吧,然后把其中值得转述、展开的讲讲。

真是累人啊,刚把前一个几万字完成了,又得马不停蹄奔赴早该结束的下一篇,而单线程的我已经把重要的事项推迟了一周又一周。感觉的确是进入了不该进入的暑假状态,在学校跟在家里没啥两样。

星期

去年的时候记了 255136140250,结果今年都过去七个月了,今年的数字还没记。今年都还是在用去年的数字,然后手动 +1 一下。

笔记

之前都是用 Cherry Studio,依旧是用对话的方式来 One-shot 制作笔记,基本上初稿我是很不满意的,需要后续进行打磨,只有真的不怎么在意的才会不改了直接抛在那。

这学期刚开始的时候倒是尝试使用 Agent 了。主要用的是 Claude Code,其实也试过 Codex 搭配 GPT,但 GPT 生成的笔记质量不大合我意,即便有时候急用改了我后面也是高血压地改内容。

举个例子,我最为不满意的就是它公式喜欢在最后弄个标点 , .,能写出这样的说明就没按照我的要求去看相应的参考。当然实则是看了但没有把这个当一回事儿,但我不喜欢这样一条一条把约束补充进去,尤其是 Claude 能做好,于是就废弃不用。还有就是多行公式喜欢给我乱换行。

笔记的质量嘛我觉得应该算是上了一个台阶的。只可惜这学期的课也是没怎么听,因此其实很难直接进行衡量。

我稍微比较用心了的笔记大概有《高级算法》以及《软件系统设计》。然而前者有一段摆烂期,导致我从第二章末开始没怎么听课,看不懂了,直到期末的时候才突击了一下最后两章(第三章就放了),了解了大概内容,细节还是不太掌握,因此也就前两章我改得比较多,最后两章可能复习的时候略微修过一点;而后者设计模式部分上课的时候做的,感觉质量不错,期末的时候偶尔也会翻看。

学期后期的时候,甚至让 Agent 自己尝试进行配图了,让它自己写 Python 脚本来绘图。因此可以看到部分笔记有了一些还算可以的图。当然其实效果也就那样吧,聊胜于无,能真正起到辅助理解的少之又少。

期末复习自然也是靠 Agent 了,提前给我准备复习资料。不过到最后依旧是突击复习,甚至比上次还极限。

期末

既然提到了,就来讲讲期末相关的一些内容吧。

首先是考试安排,我这学期有三门课有期末考试,一门《高级算法》属于选修学分,另外两门《软件系统设计》与《软件质量与管理》是必修学分。

2026.6.4

  • 唉,也不知道齐全不齐全。但也没办法了,总得开始去做。先做完,然后再看吧?那现存的怎么处理?并行还是纯废弃呢?这也是一个问题,悲伤。
    • 唉,当初也不知道是什么时候停止了。看了看时间,最后一次也差不多是一个多月前,四月底。
    • 笑了啊,现在想重启,但当时可是在抱怨「背这个 Anki 越背越觉得之前做的纯逆天,这挖空挖的都是什么狗屎。」。
    • 要不我还是先把这个 review 先看完,再重置一波吧。但如果这样得稍稍提速,之前 5/天都很逆天了,现在感觉得 10 甚至 15。不对,好像都不够。
    • 事已至此,先清 RSS 吧。
    • 好想看看同期我在做什么,应该有两个可以参考的时间点,手机上可以瞧瞧。
  • 考试安排出来了,6.24 软件系统设计,6.25 软工三(这玩意也要考试?),6.29 软件质量管理,6.30 高级算法(这个不明,要考试就完了)。感觉这学期神了,比上学期压力大,上学期有点太摆了。
    • 然后是 6.19 学期结束,要是软工三和高级算法不考试的话,那其实还可以。
    • 重看了眼 PPT,软工三应该是不用考试的,就看下周一,高级算法考不考了。不过笔试口试至少有一个就是了,希望不要笔试,复习压力更大一点。要没有的话,倒还可以。
    • 然后我去盯一下一年前和上学期,那时候的我在干啥。
    • 先看去年,嗯,课满满当当的,没那么多时间想乱七八糟的,考得也挺多。不过那时候也确实认真多,还在认真记和看笔记呢,现在我笔记更新都懒得更新,往往是其他更新连带着提交一大批。
    • 那会是 6.6 课程结束?这么早,然后 6.9 开始连考四天,最后第五门 6.17。倒退的话,那时候的今天应该是 2025-05-22。这个时间,我好像刚「爽」完耶。
    • 那天,日常清卡 Anki,然后写了一个报告作业。没绷住,然后第二天就是「串」那事情。感觉其实也差不多,都在和作业搏斗。不过那周正好是效率比较高的一周,评分挺高的。当时还要写 *** 呢,不知道最后是什么时候写完的。
    • 然后下周差不多开始 Anki 重置等。其实真要说,感觉去年这时候负担重得多就是了。然而从期中就稍有准备。现在仍在挣扎眼前事情,还没机会抽身搞算法练习什么的,悲哀呀。
    • 然后持续了高效率一段时间后,就到了 5.29,也就是割脉,后面就急转直下了。原来是这么晚的事情啊,那时候都倒数第二周临近结束了。
    • 然后到真正的一年前,也是那会最后一周,还是挺快调整过来,紧锣密鼓筹备复习了。
    • 不过反倒是 6.7 这天摆了,嗯,像是我会做的事情。第二天也没好到哪里去。大概就是靠着前面的准备勉强撑过去的吧。不过考试后,刚开始状态还是不错的,只是后面受到挫败,然后就开摆了。
    • 好了,去年的就看到这里吧,去看看上学期。上学期 12.26 课程结束,啊,这我熟啊,因为那会该做的任务,是我这学期才搞完的,其中一篇还是一个月前搞完的。等价计算的话,那时候的今天就是 2025-12-11 了。
    • 真有意思,那会在喂金鱼,当天甚至还有一个其他的。也是,我差不多就是最后一个月在突击。另外 ***。
    • 除此以外当天还有 ***,真是丰富的一天呐。我嘞个去,那会依旧还在弄 Focust,那我也是释然了。不对,不能这样想,毕竟上学期也是少有的摆。然后该周也是摸摸鱼,烂完了。其实那段时间都挺烂的,只不过正好遇到了 Sha1-Hulud 2.0,所以短时间内扳回一城了,后面就是该烂继续烂。
    • 不过看下周,其实当时也有 Anki ongoing 的。哦,是决定要恢复 Anki。然后看样子,效率也逐渐起来了,果然是期末大人的威压。然后那周也终于是把 *** 相关的启动了,大的事情,都是拖了一个学期。
    • 看了下,感觉其实也没怎么搞复习的事情,估摸着都是期末突击的。虽然有上学期太烂的缘故,但也稍稍放宽心了。
    • 多看了一下,其实也没啥特殊的,甚至年末还写了写 ***。因此这学期也放宽心吧,跟之前没什么两样。

嘛,不过真要说的话,这学期的复习再创新低了属于是。

前一段指的是早早准备了一些软件质量与管理的资料,打算要去背。然后 6.5 开始准备软件系统设计的复习资料。后面给这两科的复习资料做了一个阅读器,不然这么多 Markdown 文件要是手动打开并启动预览的话压根看不过来,而且资源占用也会很恐怖。

上面两张是 6.14 截的图了,其实后面还有修正与补充内容。同时字数统计还包含了一些工程内容,因此会有点冗余。

此外还制作了一些 Anki 卡片,后续我的复习主要靠的就是 Anki 卡片,复习资料其实反而是附属。

2026.6.6

高级算法大作业出来了,那应该是没有期末了,万幸。

2026.6.8

  • 逆天了,还有期末考试。而且没平时作业参考,那学个毛。汗流浃背了这下。
    • 在亲爱的同学们的努力下,似乎期末改作业了(且不算分数),泪目了泪目了,感动,这下期末压力减小一大截。

2026.6.9

  • 唉,真是大落大起大落。老师群里说,因为已经安排好考试时间了,没法取消。尽管说会出简单点,而且就两道题。但没有题目参考,没有作业题拿来复习,我依旧考个蛋哪。摆了摆了,还是专业课重要一点,特么一个选修课这么费劲。

2026.6.13

  • 对了,老师说期末考后面两章,似乎会有例题。唉唉,占比 10% 我费啥劲。

高级算法期末考试的大起大落。

该说不说,这门课虽然说我确实比之前学概率论的时候摆不少,但确实任务是一顶一的重呐。但其实这门课的知识,我也觉得比其他课有意思得多,尤其是跟什么软件质量与管理相比。

2026.6.15

  • 今早又小雨,不过没尝试骑车,而是走路过来。路上稍微想了一下这周怎么安排,如果能顺利实行的话:
    • 周一,准备高级算法的,课上有例题大概,加上往年的作业,可以预判一下,预判不到那就放弃了。晚上要是再没准备发消息就没必要发了。
    • 周二、三就软件系统设计,一定得看了,毕竟 Anki 都没开,得早点看完开。周一如果有时间最好也开看。
    • 周四软件质量管理。
    • 周五软件系统设计,加上答辩的材料看看。
    • 周六、日,一天答辩,希望是六吧,这样尽快进入复习阶段。
  • 题库给了,两道题,后面两章一章一道,但一章的题库就 9 题了,另一章还没出,昏厥。今天上课看了看第五课的笔记,虽然没追上,前面和后面部分都有没太看明白的点,但应该比第四章理解程度高一点。
    • 想要按计划,先准备第四章的复习资料,不过现在好像 Claude 挂了,没辙。

本来想分科目来展现复习过程的,但会出现这样不同科目一起考虑的情况,于是作罢,就按时间顺序来吧。

当然我的计划完全可以当放屁的就是了。

2026.6.18

  • 打算高级算法就纯背题目了,我给你默写下来。这应该是可以做到的,只希望题库赶紧出好,今天先把降维的卡做了。
    • 早上有点摆,最后一点时间才开始做,做了前六题共 28 小题,中午回来后做完了总九题,一共 41 小题,平均 4.55 小题。考虑到那个唯一一个一问的题目基本不会考(不然的话没有多问基本上很难拿部分分了),其他要么 4 小题要么 8 小题(感觉出 8 小题的概率更高),平均是五问,有得背了。
    • 当然有一些很容易背,因为就是上一题的自然承接,但那些需要过程、尤其是我题目的概念都还不知道的就着实有点绝望了。因此在此之前还是需要先了解一下概念,起码知道在做些什么,才能更好的背。
    • 至于说到时候熬夜是肯定的,不过最好的应该是在此之前就已经熟悉了概念,已经背一部分,起码每个都过一遍了,然后第二天早点起来快速刷多几遍。

我靠了,最后就考了那个唯一一个一问的题目。只是也不是原题,添加了一些引导。

我刚开始想要纯背题目答案,但后面其实想了一下感觉也完全不可行,得理解一下题目才更方便记忆,因此在不到 24h 复习高级算法的时间内,我还是选择了先去看笔记,尝试去理解内容,再去理解答案。虽然磕磕绊绊没有全部细节无死角弄明白,但起码还是有一个大概了。而那本来打算放弃掉的一题,后面也老老实实看了。

2026.6.20

  • 逆天的一天,现在快五点,来了四个多小时才创建来写。
    • 还是睡不着,也许是不够冷,也可能是昨天中午睡太久了,睡了一个小时,然后再额外躺了半个小时。
    • 总之就是没睡着,结果想着夜深人静的时候,复习效率应该会比较高,反正也比较清醒,又这么摆了好几天,不如起来复习一下。
    • 有了这个念头后就更睡不着了,于是等了一会后就起来了,大概是一点四十多。
    • 起来后发现,实际上没想象中精神。但起都起了,该做事了吧。
    • 然后就纯摆烂,摆啊摆。哦对了,起来的时候看到 ***。
    • 一点复习资料也没看,就各种摆,到六点半,再次上床去睡觉了。相当于是一个置换,跟早上换了一下。倒计时设置了个五个半钟,差不多就是午饭时间起来。
    • 中间可能也有朦朦胧胧清醒过吧,不过快十二点的时候手表振动,然后想干脆不吃午饭了,再睡两个钟到两点得了。
    • 不过思量一会后还是起来了。想的是睡太多了晚上可能又睡不着了。不过这相当于牺牲了今天,尤其是晚上还要答辩,现在昏昏沉沉的。
    • 起来后吃泡面,顺带泡了一下昨天领的粽子,是一个甜粽,蜜枣,当时食堂的时候我还想换一个的。那个粽子密封包装的时候看不太明白怎么弄,拆开来才能看到完整的说明。大概就是要沸水泡,而且还得重新煮沸。
    • 我哪里有这个条件,于是泡十分钟后,倒掉再重泡了十分钟。不过吃的时候,感觉里面还没完全熟,外面还算正常,虽然也不甜,里面就感觉生涩生涩的。也就靠近核心那块好一点了,唉,糟糕的体验,虽然说好歹是吃完了。
    • 弄完后就去教学楼了,然后就再摆了四个小时,到现在才来写。
    • 现在还有几分钟就五点了,差不多五点半去吃饭。这段时间就继续来写点东西吧,把前几天说要写的写一下,不过我现在脑子一团浆糊,加上也没记录想法,就想到哪写哪吧。
    • 唉不行,现在又饿又困,写不了,先去吃饭了。
  • 吃完饭回来,现在五点五十多,差不多六点十五就去会和了。刚刚回来的时候去洗手间洗了一下脸清醒一下,不过还是很困。
    • 算了,提前下去吧,顺带可以偷听一些提前准备一下。反正在这也是开摆。

答辩当天。自然我前面写的「计划」沦为「废纸」。答辩具体的内容就不展示了,毕竟我主要是来看看我的摆烂的。哦还有感想呢差点忘了:

2026.6.20

  • 再不好好复习,就给我直接上吊得了。

然后临近期末,基本上每天都会比较详细记录一下「复习」的情况。

2026.6.21

  • 真摆啊,现在都快八点了,才刚刚写完 *** 这里。还是没开始复习,还打算看看之前需求那会啥时候开始复习的。
    • 正在看,1.8 的考试,1.2 开始 Claude 准备复习资料,我倒是已经准备好挺久了,只是一直没开始看。
    • 没绷住,那会还在蹲 *** 呢,怎么跟现在差不多?1.3 ***,感觉比现在还逆天啊。然后那天还补了一点模拟题,但我好像其实也没咋看。待会去统计一下字数。
    • 后面主要应对其他考试,比如 1.5 的编译原理。
    • 没绷住,然后 1.5 考完当天一样摆,换算一下今天其实跟那天一样,那天还在看 Neuro 呢。
    • 1.6 的时候才看了近些年的题目题型,并稍微放宽心了。然后还背了点并整理了卡片,数量倒比现在少很多就是了。
    • 1.7 就是我印象中那一天了,早上一样很摆,然后下午专注背卡三个小时,晚上又有点小摆。
    • 九点了,现在翻到 1.16,感觉得把一月的看完了,然后就差不多可以回去了,今晚就写点周报,有机会看看往年卷得了……
  • 发了发了,也是九道候选题库,算了回去再跑。难绷,好像小问少了很多,但很多设计方面的题?

这时候回看主要是为了衡量一下彻底的 DDL,因为需求那会的复习真是比较极限的,基本是靠我「印象中那一天」的下午,耐着性子背完了,而前提还是我看了看近些年的题型后感觉心里有一些底了,不再像无头苍蝇一样乱撞了。

但其实都不适用这学期的两门专业课,因为我好像都没单独去看往年整卷,以及这次复习比需求那会更紧张极限。

2026.6.22

  • 简单过了一遍(虽然还是快速掠过,没细看,早知道就直接开始背了,差不了太多,一直想着没看过不方便背,但实际上不背只是看我也没太看得进去),估算的时候突然感觉有点吓人,近 300 张卡(手动补了一张类图的,299 目前),5min 一张记忆要 25h,即便是 1min 也要 5h。
    • 去年极限两天,是因为卡数量没那么多,加上题型我已经比较确认了。但这个软件系统设计直到现在我题型其实也没太摸透。然后晚上终于开始背了,背了一会,虽然中间也有点摆,但可能 40min 就清掉了三四十张吧,有点哈人了。现在还在 244/10 中(先暂停了 16 张 C 级的)。
    • 等我洗完澡看看能不能再推进一点,真背不完了。唉唉,太摆了,绝不能再这样了(好像也只有下一门能这样了),两天不太行,要是还有一天我就能放心多了,唉真太摆了这段时间。
    • 后面软件质量管理也直接开背吧,最多也就是粗略快速看一遍,然后直接背吧,别墨迹、拖拉了。
    • 罢了,回来后还是没心力去看,明天早上专注些吧,起码清到 100 出头吧。
  • 草草掠过了一遍,开始背 Anki 了,不过就背了一点。感觉明天按类别分开背比较合适,现在因为 Basic 和 Cloze 分开导入的,即便按顺序清 Cloze 也得等 Basic 完才轮得到。

本来是想先看一遍复习资料再背的,结果拖了好几天一直都没看复习资料。最后只好直接开始背,反而终于能启动了,在最后背完了再看复习资料。

2026.6.23

  • 分了一下组,共有 6 组,看样子昨天 Basic 还涉足到了第三组?那这稍微有点超出意料,不过也正常,本来 Basic 就比 Cloze 少的(117:182)。然后设计模式占了 90 张,这部分,啧。
    • 我靠真神了,Basic 和 Cloze 还是有不少重复的。你要说英文回忆的重复也就算了,普通 Basic 跟 Cloze 也有重复。算了这是好事,要是真独立三百张卡我可以就地解决了。
    • 十一点出头,背完了第一部分,49/297,删了一些没必要的子 Cloze(也有加新的,不过总体上是减少),重复的 Basic Cloze 就不管了,也不方便找。先休息一下,第二部分就 24,昨天还背了一点,而且有一些还给我暂停了,希望早上能一并背完,现在状态是 215/10/6(6 都来自第二部分,即昨天已经会了的内容的复习;10 一半一半来自二三部分),应该早上能下 200,不过想到最初目标的 100 出头感觉没啥希望,但背就是了!
    • 有点摆了,十二点后才刚背完第二部分,并暂停了几张,现在是 204/5,没能下 200。先去吃饭了,吃完饭回来继续背。
    • 吃完饭回来也有点摆了,现在两点多继续背第三部分,目前是 37/5。差不多四十分钟吧弄完了,快三点了。
    • 不摆,继续背,等到架构部分弄完才能看。下一部分 36,总现在是 167 了,设计占了一半多。
    • 我靠,感觉架构剩下这两部分有点难背啊。背了几个后去预览扫了一遍,顺带把设计部分也扫了一遍,清了一些卡片。现在三点半,歇一下吧。
    • 快五点了,背完了第四部分。累垮了,但还得继续,得在吃饭前背完第五部分 42,架构模式才算结束,还有设计部分 80 呢。
    • 五点四十二,背完了 Cloze 部分,因为 Basic 太夸张了先暂停了,现在背完了 Cloze 来解禁,希望不会有太多新东西。
    • 还有几分钟六点,终于 tm 架构部分背完了。去吃饭了,吃完饭回来赶紧背设计部分,希望在八点半,最迟九点前能背过一遍。
    • 靠了,摆麻了,六点半多后回来,然后摆了一个多小时,现在还有几分钟八点,得抓紧背了。不过之前想的是,设计模式干背的应该会少一点,靠理解的应该多一点,也许会稍微容易一点?
    • 耗时大概一百分钟,到快九点四十,背完了 80 张。设计模式部分确实简单一点,时间主要花在刚开始的查资料部分,理解后就很简单了,纯背的比较少。
    • 等十点回去吧,再看一眼资料,回去再摆。另外今天 RSS 视频挺多,但还是留明天考完再看吧。
    • 难绷啊难绷,现在十点出头,看了点复习资料,还在架构模式,感觉刚开始的部分已经要忘干净了。
    • 十点半了,设计模式大概过了一遍,这部分刚背加上比较靠理解,因此没太细看。架构部分看了两部分(一半)了,先回去了,看今晚能不能看完吧。尽量吧,然后明早提前一个小时起来继续反复背,以及看例子等。
    • 回来再草草看完了剩下两个部分,还有一些内容,如演进、架构模式列表的还得明天再细背一下。
  • 太 tm 难背了。有时候休息摆一下,比这段时间好多了。

2026.6.24

  • 软件系统设计复习:
    • 有点小摆了,简单看了两眼,给演化制卡了,然后晾衣服,然后再摆了一下,过九点半了。
    • 快十点半大概又摆了二十分钟,现在快十点五十了,继续背吧。
    • 12:05,清完了选的一部分。将应该比较重要的标记了,吃完饭回来再弄一遍应该就差不多了。
    • 13:40 左右,清了一百多张标蓝色 flag 的筛选卡组,大概就这样吧,走了。可惜复习器是本地的,去教室后只能看 Anki 了,没得看复习器。

最后的复习。

2026.6.24

  • 软件系统设计考试:
    • 去教室后也没啥能看的了,就坐等发卷了。
    • 分试卷、答题纸、草稿纸,新奇,感觉很久没见过这样的类型了。虽然给了两张答题纸,不过我最后只写满了一张就是了。
    • 十道简答题,还有两道大题(分别是架构和设计)。简答大多数还行吧,不过第五题问事件驱动架构为什么容易有 timing 相关问题(说起来如果是中文,然后说时序问题那我就明白了)。我忘记了这个概念,感觉复习资料里没咋见过,第一时间想的是异步系统相关,但不确定,于是先空缺了,后面再回来答。后面的时候因为时间也不多了,我就随便写了,因为我不确定是不是异步系统就没写了,而是写了个好像是发布订阅的,事件顺序、重复、错误,然后编了一个短时间内重复事件的丢弃问题等。
    • 回来查了一下,原来是跟云原生一起的。唉我忘记了这一茬,不然的话就完全可以放心就是异步系统了,然后写的也不大对。唉唉,太可惜了。
    • 其他差不多吧,大部分应该我都能 get 到,除非是误解了,不然感觉问题不算很大,或者即便有些问题也属于是能编的,不算无从发挥。
    • 再一个就是最后一个设计题,有一句英文那个我没读明白,然后加上一个命令模式,我突然有点忘了命令模式是啥样的,内心想的是策略模式,然后在那里琢磨了挺久。最后也没在草稿纸上想出来,而是直接铅笔在卷子上涂涂画画了。也确实不太熟练就是了。
    • 咦不对,命令模式我好像是记得的,最开始想的是对的,但后面补加说了个策略模式,然后加上没看懂题目那个命令是啥意思,就随便搞了。
    • 这题花了最长时间,前面的可能最多也就一个小时到三点差不多?然后这一题一直琢磨到可能三点四十左右匆匆搞完,然后把前面一些标记的补了,没细看其他的就交卷了,接近三点五十。
    • 嘛,虽然有这样那样不爽的点,但总的来说我感觉还是可以的,毕竟一天多极限突击背书的,还行,还行。也没考很多恶心的背诵,稍微有点可惜,但也还好了,毕竟我考前也不知道会考哪里,也只能都背了,哪怕只考了 1%。
  • 考完试了,虽有瑕疵,但总体感觉还行。

然后是《软件系统设计》的考试想法。

2026.6.24

  • 下午回来后以及晚上就摆了,最后半个小时内才制卡了,共九题 15 小题,然后顺带把 41 张那个 1 禁用了,看着整齐一点,而且我猜大概率是不会考的(虽然但是后面如果有时间还是要看看的)。明天的话可能就补一下基础知识吧,争取能把答案看明白了。

考完后就摆了,最后一点时间把高级算法考试剩下部分制卡。

2026.6.25

  • 就大概看了一遍第四章降维的笔记,大体了解了一遍。
  • 早上,摆了。
  • 下午,最后一个多小时的时候,修了 Markdown 预览插件重置滚动的问题后终于开始看,边问 DeepSeek,结果看明白、理顺了,好爽,高高兴兴去吃饭了。
  • 晚上回来后摆了一点继续看,后面看完了,不过跳了点内容,一开始以为题目没涉及,但后面细看似乎有涉及一部分?不过也没时间了。
  • 明天就没机会看高级算法了,最多吃饭的时候看,得开始专心复习软件质量管理了。
  • 别再那么极限了!软件质量管理虽然有客观题(不定项),但感觉字数更多一点,更难背一点。

没记太多东西。看了一点高级算法的笔记,不过还是有点摆。

2026.6.26

  • 吸取教训了,今天应该直接开始背 Anki,而不是去看什么复习资料。
  • 今日又是烂完了。
  • 明天,除了吃饭时可以看,都给我禁闭啊!

然后又泄气了。

2026.6.27

  • 还是没转过来。但复习压力应该是更大的,今天必须得开始背一遍 Anki 了。
  • 摆了好一会,终于快五点开始背了。
    • 感觉确实比软件系统设计难背啊,虽然总卡数少了一点只有两百多一点(不过另一边除掉重复的以及英文触发可能也多不了多少),但第一节 27 张就背了一个多小时。主要是概念太多了,完整定义难背。只能寄希望后面卡片多一点客观题的要素了。五点四十多了,也背不完第二部分了,先摆一下然后去吃饭吧。今晚希望可以全都过一遍。
    • 回来后先没立刻背,审视了一下后面组的卡片。看后面有一些算是比较简单的,但也有一些感觉会很吃力,很难说需要多久吧。另外非常恶心的,背第一组已经遇到的就是 Cloze 特么的乱搞,暴露个解释,然后 Cloze 名词,有你这样提示的吗?真服了好吧,质量感觉不如软件系统设计。
    • 神经了,疑似还有漏东西,说自己已经覆盖了,实则没有。这还是我随便瞥了一眼看到的。
    • 摆了,快九点才开始背第二个,然后又背了快一个小时,21:36 才背完。真的太难背了我去。而且后面还是速速过的,不然肯定超一个小时。而且这第二节我一个问题都没去问,因为没啥意义。后面我速过也是感觉背不下来,最多背点关联词,考场上自行发挥吧。第一个 27 张,第二个也就 22 张而已,就这么吃力了……
    • 我先拿第七个也是最后一个 DevOps 休息一下吧,这个应该简单点,也是 21 个。背了几个,感觉可能依赖于前面一些概念?
    • 过快一点后,在 54 搞完了。很多我也没认真背了,得靠临场想,留个印象。
    • 22:38 第三部分弄完了,也该回去了,今天就这样吧,明早把剩下两个弄完,剩下时间加深巩固印象,加上看看复习资料。我已经进行了一些提速,并一些只留印象没认真背,饶是如此平均时间也 19s 接近 20s,而软件系统设计则是 15s 左右,太难背了。我靠,原来是剩下三部分,31、36、55,有点昏厥了。
  • 唉,摆麻了,又要复刻一遍,只不过这次还更难背一点。背了 4/7 组,但比较粗糙,打算先快速过一遍,然后看复习资料,再练习其他的,然后再加深印象。
  • 早上、下午摆。
  • 下午最后一个小时背了点。
  • 晚上摆,一直到八点多才继续快速过了几组。

现在想起来我还是瑟瑟发抖,太难背了,我那时真宁愿再给我考两门软件系统设计也不想背这个软件质量与管理。

2026.6.28

  • 唉,这个软件质量管理是真不想背,中午也没回去午休,继续摆,到现在三点半才来写,写完后继续背吧。
    • 昨天的时候想到,***。
    • 然后又摆了一下到三点五十多……16:48 背完第四部分,又是差不多一个小时。接着继续吧。
    • 17:23 背完第五部分,这个稍微简单一点,加上我后面也过得快了一点。平均用时从 19s 压到了 15s。不过最后一部分 55 张,感觉没法剩下时间弄完啊。但还是得弄,能弄多少弄多少,只不过先休息一下吧。
    • 摆了一下,没背,不过把选择和判断除了还没背的部分(就几个)过了一遍,错了一些,还行。不过我感觉我背的很多实际上是客观题的内容。晚上要筛一些主观题的加强重复背。差不多六点了,吃完饭回来继续完成。
    • 摆完了,可以重开了感觉,不到七点回来后一直摆,到快八点。另外晚上的时候感觉好困呐。
    • 最后一个五十多张还挺快,不到五十分钟,到 20:38 就好了。现在先去弄一下客观题眼熟一下。
    • 做了一下,还挺久的,21:08 才做完。应该做一遍就够眼熟了,不用多做了。DevOps 那里不熟的有点多,但那里也有点搞笑,有相当一部分错题感觉。
    • 看了看别的资料,好像有名词解释题?但好像挺陌生的,有点麻。
    • 有点何意味,感觉 24, 23, 22 的大部分主观题一样,就少量更改,而且 24 年还在 ChatGPT 三段(这个没背)。九点半了,我还要歇会吗?算了过一遍复习资料印象,然后剩下时间选一些卡出来留给明天清吧。
    • 看到了 21:48 简单过了一遍。去 *** 休息一下,然后回去再标记卡片吧,感觉 DevOps 那块可以标少一点。算了,还早,才十点出头,回去后就摆了,那还是在这里就标记一下吧。希望十点半前弄完。然后还是早半个小时,七点起来看吧。22:16,大概选了 133 张,实际应该会更少一点,明天背的时候自行取消。然后剩下时间看看其他的概念,到十点半回去。总之希望不要有偏离我范围的名词解释了,最好别有,感觉忒难了点。
    • 在看的过程中,查了一下,感觉原始课件中确实没有那些概念啊。差不多,29 了,回去了。调一下闹钟,早点起来,希望可以过两遍,同时背过一遍相同简答题的。
  • 勉强算是过了一遍复习吧。
  • 早上、下午摆。
  • 下午快四点才开始。
  • 晚上快八点开始。其实不如 2026-06-23 效率高,毕竟是真难背。
  • 明天再过一遍,加上最后一题的简答题背,最好能两遍吧。

2026.6.29

  • 七点起来,没睡太好,大概是近些天最差的一次了。一开始没睡着,可能是因为睡前喝了牛奶,然后手表显示 0:21 左右睡着,然后朦朦胧胧一点四十多的时候醒了一下看了看表,然后我记得四点多、六点出头和六点四十多也都看了看。手表显示四点刚过和四点多快五点,以及五点多也有醒来(六点出头无),然后 6:41 清醒,总共睡了 6h13min。然后现在差不多八点了,还是有点困,开始背吧。
    • 9:07,大概背了 70min,过了第一遍,并取消掉部分标记,现在就 104 张了,应该有时间过第二遍。先休息一下,然后把大题的背一下,再过第二遍。目前平均时间是 17s。
    • 再摆了大半会,四十了最后过一下吧。
    • 因为又摆了点,后面就没背了,剩下的直接过一遍眼熟。现在有点饿啊我去,有点没力气。10:12 了,也差不多该走了。另外按理来说,应该按顺序先写客观题,不过怕忘了又应该先写主观题。但想客观题可以热身一下,同时看主观题内心有个想法,还是按顺序来吧。走了走了。

虽然很摆,但还是真不容易。

2026.6.29

  • 两点半过后才来写,有点摆了。
    • 十一点四十多就交卷,然后吃饭后一直摆到现在,两点出头才来教学楼。
    • 怎么说呢,感觉挺差劲的,跟软件系统设计的不一样,那个虽然也感觉背多了很多,但大部分题目基本上都还是属于熟悉的范畴的,背着也相对舒畅一些,背多了自己会有一个脉络感知,即便没有直接背到答案也可以编一点。
    • 但这个真的吃力,我随便写写,填满就交了,放弃挣扎。
    • 比如说有一个 Quality Journey 步骤纯默写,属于是罕见的纯默写题了,这种应该是稳拿的。结果当时我看 B 级,加上八个,有点难背,就标记暂停了。一点印象都没有,只记得有八个,随便编了,一个都没沾上。唉,真是失败。其他最多的我也不是没背,像最多有背了 12 个,不过是分层背的。这个属于是赌输了。
    • 还有选择有一些不确定的,如一个软件过程无关的名词。里面有个 Gate 我忘了是啥,之前期中时期的 Anki 有,但因为我很久没弄了也不知道。然而这个答案其实在笔记字段中有,只是我没咋看,猜错了。这已经 -7 了。其他忘记了,也不想看了。就这样吧。

不管怎么样解脱了。不过考完试的感觉和最终结果倒是反过来了。

2026.6.92

  • 有点摆了,吃晚饭前才看了第五题的前四题,第五题还算是比较少方便记的。另外感觉有点问题,有个解答里面内容好像写错了,写反了。
    • 快八点,看了大概四十分钟吧,看了剩下五题,大概都能理解了(细节还需要后面具体背)。该去看第四题的了。
    • 快九点了,第四题看了五题了,真累。
    • 摆了半个多小时后,三十多继续看,看到现在 22:18 看完了。后面 CountSketch OSE 的有点难,最后一题还涉及了我没学过(不记得?)的矩阵概念,感觉无敌了。
    • 我想想,似乎也没多少时间在这里背了,不如直接回去?唉唉,这背得完吗?
    • 明天定了个四点的闹钟。为了避免吵,手机定四点半,手表四点。
    • 看天气明早可能大雨,真糟糕呐。咦,那这样好像明天不太能洗了?
  • 就复习,考试,复习吧。不过高级算法也就看了一遍所有题目,没来得及开始背。

挺极限的,直观来看只有下午和晚上可供复习高级算法,而此时我还没能理解呢。就是在这样紧迫的情况下也得摆上一摆。

2026.6.30

  • 四点起来了。中间多次醒来,本来三点半就下来了,但感觉还是太早了就又上去了。摆到四点半后,开始背吧。
    • 感觉这个副屏暗光背景下频闪有点严重,看着难受。
    • 感觉似乎不是副屏的频闪,关了副屏还是有,加上主屏也试了,不会是灯的吧?那咋整?调亮一点后好像好一点?再看看吧。
    • 5:44 把第五题的过了一遍,用了 70min,有点多,而且剩下几个属于是混个脸熟,具体就考场的时候自己分析了吧。得赶紧看第四题的了。
    • 差不多七点了,外面还在下着雨,真糟糕。还差 CountSketch 部分还没看完,唉真希望不要考这个,有点难记,考其他的比如啥 Torus 就不错。然后我感觉看着看着第五题可能都有点忘记了。第五题主要不希望考二部图、DAG 相关的,这部分也不太熟。
    • 七点二十多去看了点球大战,现在七点半还没看完最后一题……
    • 没吃早餐,现在过去了,此外还有一题无小题的没看,得眼熟一下。走了。

最后的挣扎,考的都是我不希望考的。

2026.6.30

  • 2026-07-02 来写,太墨迹了。首先是考试吧。
    • 那天下雨,走过去,真恶心啊。然后又在外面看了一点就进考场了。
    • 考前想的是,第四题降维什么的希望不要考 CountSketch 相关的,尤其是要是考最后一个,来个 F 范数什么的,我都不记得我学过没这种,直接摆了得了;第五题不要考 DAG、二分图什么的,因为我也不太熟。不过考前还是看了看 CountSketch 下界,生日攻击那个。
    • 然后一进去看卷子,有点傻眼了,跟原题不太一样。第一题是 DAG,我没认出来,还以为是第四题的,然后再看后面,CountSketch,直接何意味了,我想怎么有两个第四题?后面再定睛一看才发现第一页的题是网络流那块的,怎么是反过来的……然后就感叹运气真差,都命中我不希望的。
    • 虽然不完全一样,但加入了一些引导。我也不知道我做对没,就是照着我自己的理解写了,感觉有点一句话正着反着各写一遍,磕磕绊绊的。CountSketch 那个倒还好,考的是生日攻击那个,写着写着我感觉我也算是理解了,应该问题不大。
    • 不过 CountSketch 那题倒有点奇怪,第一个是证明 x=eiσiσjej\boldsymbol{x}=\boldsymbol{e}_i-\sigma_i \sigma_j\boldsymbol{e}_jAx22=2\lVert \boldsymbol{A} \boldsymbol{x}\rVert_2^2=2(好像不是 A\boldsymbol{A},忘了是啥了,反正就是逐列互不相同的单位向量,代表 dd 维子空间),然后 ΠAx22=0\lVert \boldsymbol{\Pi} \boldsymbol{A} \boldsymbol{x}\rVert_2^2=0,但我自己算应该是 i,ji, j 哈希碰撞了才会为 0,我也是这样写的。刚刚复述给 DeepSeek 它也是说要碰撞才是 0。
    • 写到最后两问的时候(这时候基本上就是机械式的写了,已经想好了),陆陆续续有许多人交卷了,还好我也差不多了,剩下也用不着太动脑了,不然我得急躁死,刷拉刷拉的声音。
    • 最后可能 8:40 左右交卷了吧,然后在西区那边吃了早餐,也是肉包 + 豆浆,贵了 5 毛。
    • 然后在食堂那边摆了一下,结果出去后刚骑车没多久,又开始下雨了,只能停下来撑伞,骑完剩下的路程。唉,在外应该趁早回来才是。

然后终于解脱了。

2026.7.4

  • 晚上吃饭的时候,俩成绩出来了,一个是 *** 那个,一个是软件质量管理,都是 NJU Table,我手机又没 2FA,只能回来看。
    • 回来路上想要是软件质量管理就 60 左右,那总评可能得下 80 了。不过最后不错,期末 ***,平时 ***,总评 ***,还可以了。
    • 可惜了,要是我背了那八个加上选择那个不错的话期末居然能有 ***?那总评可能还有 *** 的样子,那更是爽到了。

出分挺快。比预期好不少。

2026.7.19

  • *** 出成绩了,***,不错,比预想好。***。
    • 呃呃,原来软件系统设计也出来了,***,有点低了感觉,难怪 ***……不管了,无所谓了。
    • 所以说我复习相对良好(尽管也很摆)的软件系统设计,比复习得简直一坨的软件质量管理还低,无敌了……

不管怎么说,尘埃落定,专业课的分都确定了。其实还差一个形策,不过写到这里当天(8.3)出来了保研课程成绩,最终也有了定论。

志愿

这学期做了几次志愿吧。说起来,这几次志愿可能是我这学期最开心的几天了,是我难得感受到自己存在的价值与意义的时候。现在有点后悔前两年的时候没有多做一些,起码出去走走。

搬一下当时的记录:

发汤圆

  • 累麻了。
    • 十一点半去吃午餐,说起来十七食堂二楼全换了,这几天吃了其中两个,感觉还行。然后中午吃了最左边的那个,印象很差,后面别去那里吃了。
    • 然后赶十二点多的公交,差不多十二点十分出发。算上回来加起来花了两块钱。
    • 来了后先在那边逛了一下,还玩了一个一层楼高的滑梯,中间停不住,好爽。然后过一会去弄志愿了。
    • 先发汤圆,说起来我今天到现在都还没吃汤圆呢。发给外卖小哥,发了一会发完了继续煮,然后再发差不多了。
    • 然后这时候也去晚会那边帮忙摆凳子了,差不多两点出头就去那边坐了,刚开始小眯了一会,毕竟发现电耗得好快,两点半左右就只有五十电左右了。
    • 然后就一直等节目,等有活就上去,一直到四点半左右结束。然后把凳子还回去,坐公交回来了。
    • 到目前为止 9280 步数,应该可以上万步今天。
    • 小腿尤其地酸痛,本来之前就有点酸痛,现在更酸痛了。

哈哈哈,居然还有食堂的事情。这个「印象很差」的位点,学期后半段常常去那里吃,尤其是消耗比较大的时候去那里更不错,主要就是太腻了,吃得太撑了。

知识问答

  • 志愿累麻了。
    • 回宿舍看一会后去做志愿,这时候已经有点雨了,打伞骑车,车座还有水,然后风刮。
    • 到了后就分摊位,才知道是一个警察的知识问答什么活动,去了禁毒和装备的那俩处,然后基本就是在那里了,盖章不在我手上,所以其实我也没啥事情做,虽然后面找到机会也拿到章盖了几次。
    • 警官们都慈眉善目、和蔼可亲、亲切可爱,在摊位聊了不少天。
    • 然后后面建议我们也去参与一下活动,于是速通了一下。
    • 首先是食堂底下的有三个,一个是扔圆环和丢沙袋的,圆环一个都没挂上,沙袋给我丢最大一个一直没进丢急眼了,好在最后一个进了。然后第二个是转盘回答问题,抽到 3 个,给了一张纸,不过前两个完全不会,剩下连着 3 个比较简单,过关。第三个就抽一个问题回答,好在比较简单也过关了,这部分似乎是反诈相关的。
    • 然后先去了交通安全那里,戴了一个模拟酒驾的 3D 眼镜,确实扭曲,绕着一个闭合图案走了一圈,盯着脚和图案走其实还是能走下来的,只是有点怪。
    • 最后就是去了我这个摊位,装备那边直接盖了一个章,然后禁毒抽了一个虎门销烟鸦片的题,集完了,领了一只熊。
    • 后面附近还牵出来一只警犬,叫「布丁」,一岁大,女孩,德牧犬。可爱,后面跟她去玩了一下,似乎后面会常驻警务室,而且在东区,那很好啊,我早上跑步说不定能见着。
    • 对了期间还有一个充气熊非常活跃。
    • 然后最终十二点半过后才结束,饿了。拍照、签退什么的,然后志愿者还领了一份伴手礼。那个集章可以换熊或手办,熊看起来更好就领了熊,不过送的伴手礼包括熊和手办,可惜的是集赞的奶茶没有。所以我就有两只熊和一个手办了。
    • 回来的时候有点小雨,不过打算回来吃了,然后就没打伞骑回来了,凉飕飕的。回来差不多一点吃了汤圆,不过吃完后暂时没吃泡面的打算。
    • 现在也差不多一点半了,去睡会午觉吧,有点累了。

哈哈哈,还早上跑步呢,毛都没跑。

科技馆一

  • 终于回来了,我累麻了。
  • 志愿:
    • 昨晚想的是带帆布袋的,结果又没准备,简单翻了一下衣柜没看到,估摸是在大箱子里,不过也是轻手轻脚翻了一下,没翻到。再翻就浪费时间了,最后决定就用背包了。
    • 里面装了三个剩下的面包和两个新的派,顺带加了个牛奶。
    • 神人的是手机电量只有 65,到现在只有 60 了,因为那狗屎健康充电,早知道昨晚就应该充满等着,我虽然昨晚想到了,但本以为差不多够的,加上还以为停在 80。另外那根充电线充得太特么慢了。
    • 早餐想到其实可以去食堂打包,然后再想说不定还有爱心早餐。不过实际去了,打包两个肉包,没爱心早餐,还是照付钱。Why?
    • 我现在在坐的是二号线,昨天没细探究,直达的是一号线,二号线要转。但因为我没去过一号线的那个南站,不想把时间浪费在可能多余的寻找时间中,于是就放弃了,但下周得找找南站。估摸是西区校门口那一块。
    • 昨晚打算车上看某休闲读物的,不过手机电也不多,还好就半天,加上就睡了六个多小时,我还是休息一下吧。现在则是在手机敲这部分,担心下午回来后就忘记了。
    • 上面六个是早上在手机写的,写完后就眯眼休息了,毕竟是终点站倒也不用担心坐过站。不过写完后就又察觉到漏写了一些内容,但为了省电就没继续写了。
    • 累麻了,上面的内容写了后没继续写,剩下时间就完全开摆了。晚上最后一点时间 ***。
    • 早上没说的大概有一个,水壶忘了拿啦,然后在下面放书包再回去取,并加点热水。当然后面看来没必要,那里可以拿水。还有一个就是电车我上的时候被司机「赶」下来了,没听清他说啥,然后我看见他关了门,然后从里面走出来到了另一侧。原来真的要司机换向啊,长见识了。换向后再开门上去,花费 2 元。后面有轨电车我也经历了换向。
    • 看刷卡时间,6:52 上了有轨电车,然后 7:54 换乘地铁,也就是说门口的二号线光是电车部分就要一个小时左右,然后是 8 站地铁,这个倒挺快我记得,反正我最终可能 8:10~8:15 就到了,在门口徘徊了一阵子后,跟其他同志愿者在门口等,后面给保安放进去了。噢不对,7:54 应该是地铁出站时间,也就是加起来 1h 左右。
    • 出地铁口一下子就是科技馆了,同时很明显的是对面就是电车,我当时就猜是一号线,于是回来的时候就那样坐了回来。它在马路中央,我因为吃午饭在远处,于是先过了马路,以为是在对面,然后走了回来后又再过马路回来(虽然说好像另一侧也有,但我没找到,为了保险还是过来了,顺带熟悉来的路)。
    • 很奇特,它要从地下进去,而且还是在地下刷卡,时间是 13:04,然后在上面等车,很快也来了,我记得可能是 13:05 还是 13:07 就上车了,当然,这里也有换向。在上面就不用重复刷卡了。
    • 然后我记得特地算了一下时间,13:45 左右就下车了,快了挺多欸,那我下次就应该这样过来。不过离校门稍微有点远,走了一会后进校门也不太熟悉,找了一会路,最终找到单车骑到了南雍楼,大概用了 20min,14:05?
    • 然后是充电线,我都忘了换了充电线了,之前那个因为感觉有点长,椅子老是压到,以及有点脏了,还有一侧已经脱落了,遂换了前阵子加了几毛钱买的线。现在看来充电问题这个线应该要背主锅,是真废物啊。我之前就隐隐有点觉察,感觉充电速度有点慢了,下午换回来了。另外还买了个充电宝,89.88,大概明天到,然后我下周就能用上了。
    • 过零点了,今天就先写到这,剩下的,具体做志愿和一些补充就明天写吧。
  • 志愿:
    • 一进去签了个到,存了个包后我就直接去我的位置了,不过就在门口售票处徘徊,上了个厕所。然后想到还没拿志愿服,遂再下楼回去拿了外套,不过水壶还是放在垃圾桶上,后面取了。
    • 等了一会后一个工作人员过来,喊了「消失的动物园」去,然后我就跟另外两个女生一起去了。另外本来没懂这个什么含义的,但是第一次上到二楼的时候就秒想到估摸着是讲已灭绝动物的,果不其然。不过我对这个兴致倒也不是很足就是了。
    • 此外我本以为另外两个女生可能是专业的职工,但签到的时候看,似乎也是学校来做志愿的。不过说是一个组,但也就只是在一个场合而已,各自在自己的位置,互不打扰,不用有什么联系(虽然建了一个微信群,但也没发啥就解散了),这挺好。
    • 上去后有个帘子后面是员工休息区,里面有一些小凳子。每过一阵子就会来换班,然后可以在这里休息十分钟。包存柜子倒是一个错误的选择,我中午结束的时候刚出门就忘了取包,立刻从出口折返,还好保安没拦我。以及回来后立刻买了个 20000mAh 的充电宝——说实话感觉挺沉重的,像一块砖头,但好像能充满两三次——后面应该也要跟着包一起比较合适,或者说带个帆布袋?
    • 因为怕消耗太多电量,休息的时候我也不敢玩手机,最多也就开始或结束看两眼群有没有消息(志愿群,不是什么乱七八糟的),然后就闭目养神。不过十分钟后再睁眼起来就有点昏昏沉沉了,虽然很快就能恢复正常。
    • 终于来讲我的工作了。先是在门口,让其中一个女生看大门,大概就是指导游客扫码购票、进站和一些事项说明的。说实话我觉得这个工作量最大,因为所有游客必经之地。另外一个女生是一个滑梯附近,然后具体干啥忘了,似乎是有让防逆行之类的。然后我在她附近一点,虽然当时工作人员指引我没走那个更近的路,而是绕了一下,不知为何。
    • 我就是在一个攀爬的地方,大概就是维持攀爬的秩序。这个攀爬说实话感觉是这里面最好玩的一个了,没有之一。讲解完后跟我们讲九点才正式开始,因此在此之前我们可以自由闲逛一下。我就攀爬了一下,再过树洞,从最高处滑滑梯下来,有点爽。
    • 不过只玩了一次,后面注意到左手臂那个旧伤口又破皮了,真莫名其妙吧,神了,为啥还有问题。之前的好不容易愈合了,虽然还是有颜色,但起码也是好了,现在又有伤口了。以及左手背上小指根也莫名其妙有个伤口。于是后面再尝试进去攀爬时会碰到,因为注意到了伤口,会疼,就没再爬第二次了。
    • 以及旁边有一个鳄鱼孵蛋的游戏机也是我掌管。大概就是高温会孵雄性,低温会孵雌性,为了让鳄鱼族群可以正常繁衍,温度要在中间适宜的地方才能成功。然后游戏一开始在最高温,且会缓慢升温,右边有一个转把,可以制冷降温。所以就是一个很简单的游戏,降温控制到中间,并维持到倒计时结束就成功了。低情商弱智,高情商益智。
    • 不过即便如此很多人还是不看或是看不懂说明。小孩就算了,大人也有玩不会的。有不知道转把的,有疯狂在那里转的等等。当然也就是个小游戏而已,不必那么认真。结果后期还看到一个家长在教训小孩,呆在那里起码十分钟以上吧,我没记错还「打」了一下,可能是手掌。反正就是在那里反复讲规则。记得第一个来玩的小男孩就没玩成功,然后第二个女孩来玩一次就成功了,我在那里感慨不愧是女孩子啊。
    • 一开始没多少人,到我第一次换班,可能快十点?都还没一个人来玩,但到后面确实就火爆了。一开始因为人少我也就没让他们排队,直接放进去了。结果后面人多了太乱了,我拦也拦不住,明明是要一个爬高点才能第二个进去,结果里面一下子有三个人,服了。后面让他们好好排队,然后我一个一个放才好。当然后面也有通融的例外就是了。
    • 爬的这个很多其实也记不得了,但总之就是彼此之间差距非常大。印象最深的可能是一个挺高大的女生,在玩这个的当中我感觉大概是排前列了,结果她爬到上层的时候,说她怕高了,后面更小的孩子都上去了还僵持在那里,最终又原路退下去了。我也见过身材矮小得多的孩子都成功上去了。甚至还有不少玩得很嗨,多次挑战。搞得我后期的时候还是比较累的。
    • 但总的来说还是蛮开心的,最近一段时间心情一直不佳,虽然偶有开心的事情,但主旋律是浑浑噩噩。能做点实事我还是非常高兴的,虽然起得有点早,但再选一次我还是愿意来的。不过我果然对这个展厅兴致不高,逛的时候也没细看别的,玩了一面墙的一部分答题,全对(虽然有些我是真不知道,凭感觉猜的),还有就是一个霸王龙 3D 视频那看了一下,循环的。其他真没啥兴趣,因此希望这周六给我换个别的展厅。
    • 对了,领志愿服后还领了一瓶矿泉水,因此其实可以不用带水的。不过我两个都有喝,后面吃饭的时候把矿泉水喝完了。吃饭要出门,然后走到附近的党群中心,在那里吃盒饭。一般吧,不过我也饿了很快就吃完了。然后就是走路找电车回去了。

上面说的伤口是:

2026.3.12

  • 午睡真把脑子睡没了。
    • 路上到一个地方,一处是有正在喷水的水管,但转角曲率比较小,一处是侧一点,但要立刻转角且曲率大一点,然后我思索了半秒选择了前者。
    • 然后就是半秒后尝试轧过水管的时候滑倒了,摔个狗啃泥。
    • 但奇妙的是心情没有很差,只是觉得很小丑。
    • 手掌下面有点破皮,不过主要还是小臂那边红得比较多。还有就是衣服裤子湿了点,但也还行。
    • 现在好酸痛,累。
    • 上厕所顺带看了眼有点痛的右膝盖,也有点擦伤,不过就有点红白,没像左胳膊那样大片血红。

科技馆二

  • 回来了大概快一个小时吧,现在是七点半,累麻了。简单讲讲志愿的事情,就不跟上次一样事无巨细了。
    • 不知为何,昨晚没睡好,躺在床上翻来覆去睡不着,最后一点出头才睡着。然后半夜也多次醒来,看时间五点之间有十多分钟清醒时间,然后最后这段时间也是翻来覆去,写着不到六点就清醒了,但我还是到六点五十多才下床。还是好累,我再歇会,看看视频。
    • 摆了,剩下时间还是没写,就这样吧,明天补。
  • 剩下一个小时,边跑边写点东西吧,先写前两天的志愿,不能再拖了。
    • 手机记录了时间,7:11 买完包大概然后上车,7:16 到校门。不过不是上次进来那个门,那里有路旁可以停车。不过停车后出来走一段路就到那个门了,那里可能不太能停车?回来时只见上次的两辆电动车还在那里。然后是 7:22 到了车站,7:26 上了车。然后 8:05 到了目的地,8:12 签到。实际用时跟上次计时一样是 40min,不知道为何地图说是 50min,不然其实我可能选择更晚起来。当然现在也不错了。
    • 一开始这个「微力无穷」我还以为是什么微生物呢,我全天都在这里,想着希望别太无聊,不然太没意思了。不过到了后我就立刻知道,这里肯定比那个消失的动物园有意思,因为映入眼帘的一下子就是机器人。
    • 有三个岗位,一个是一进来的一个看起来很高级的挖矿机,排队维持秩序。第二个是一个冰球,也是排队维持秩序。第三个是最远的(不过那一侧也有一个入口,相当于冰球在最中间),是什么体态的。
    • 另外两个这次就是智软的,本来之前我说没啥用因为没联系,不过这一次倒是有稍微聊一点,虽然我也不认识他们,而他们似乎是朋友。
    • 然后我就选了冰球,因为一看这个冰球就很好玩,次之我认为是那个挖矿机。然后在九点前的一段时间就去挖矿机那里玩了玩。咋说呢,其实没想象中好玩,本来我以为跟冰球是并列甚至更好玩的说。因为太抽象了,一开始不太会玩,甚至其实很多人玩都是 0 分的。不过我后面最高弄过 3k+ 分,两次,要是多玩几次也肯定能刷更多的,但我也没玩太多了。最高见过 4k+ 分。
    • 至于这个冰球则是真挺好玩的,跟机械臂对打,不过其实它不够聪明,因此也不需要啥策略,一直往那里打就是了。然后这里也是最火爆的,人一整天都特别多。然后我的任务基本就是维持秩序。有两个冰「球」,其实是薄片,一开始我是直接都给他们玩,然后如果进了我就去下面掏。但是后面觉得也不对,因为他们腿在那里,我掏的像个变态一样,尤其是有人的时候还因为不方便而掏得更久了。到后面我大概理解醒悟了,就只给他们一个,自己拿着一个,然后如果进了让他们自己掏,如果卡住了再给他们我手上这个,我感觉这个才是正经的。不过下午跟别人换班后,我过去游走,感觉他们跟我不太一样,不太参与游戏的,基本上就是三个(因为有一个不太光滑的我没带上)全给了,然后不管了,除非卡住。
    • 下午的时候我就交换到那个挖矿机了,不过这里是真无聊,我也没什么机会参与进去(除非就是老生常谈的告诉他们怎么扣动扳机,但也没意思),排队又不需要什么,因此下午我就一直在周围游走了。没上午那么认真。
    • 另外跟上次还不一样,这次是真的累人,不仅仅是因为一整天的服务,而是因为没有明确的中间换班休息。像上次,是每隔一阵子就有工作人员来换班休息,而这次并没有,虽然说应该也不是不行,但我是没有去换班休息过,因此除了坐挖矿机,和有时候蹲着歇一会外,基本没什么机会休息,都得一直站着。
    • 细节似乎也没啥必要多说了,毕竟其实跟上次就爬上去后拍了几张照片不同,这次还是一开始拍了不少,早上机器狗活动、机器人巡视的时候我也拍了(像下午机器人就没出来了,只在边界里面活动)。
    • 另外早上的时候看到有一个模拟太极的,很想去打打看,结果下午的时候试了试,光速忘记了,太耻辱了。
    • 这次是十二点就停了去吃饭,比上次的质量好多了。不过边看手机边吃,吃完后已经十二点半了,最后在负一楼逛了一大圈绕路,时间也不多了,就回去了,没啥有意思的。
    • 上午的时候基本没咋看手机,连吃饭时间都是别人叫我走的,没看到 QQ 私发我了。下午就看了不少了,继续看上午在车上看的一点某休闲读物。不过后面就看了 81.2% 好像,最后回来车上继续看的,吃晚饭的时候倒没看,在看别的消息。下午的时候无聊的时候就看手机了,但站着看也好累,又不能时常蹲着(太奇怪了),于是就是看看歇歇。
    • 另外充电,早上充电宝似乎从 70 多充到了 90 多,然后还是 99%。下午从 60 多也是充,我刚刚看了一下还有 96%。感觉买大了,1w mAh 可能就够了。
    • WiFi,看到两个像的名称,但找不到相关告示与密码,甚至耗了很多流量去看了眼公众号、浏览器搜索也没找到。回来后小红书查了一下也没看到,所以是真没有吗……
    • 最后回来,步数表记录破了纪录,1.8w,然后软件纪录 2w+,不仅打破了纪录,还是我第一次上 2w,里程碑。但是腿是真的累,一下午腿一直很累。

每次做完都是一句「累麻了」,也确实,这学期做的志愿其实都是干实事,没有很水。

两个梦。

2026.3.18

  • 昨晚做了个梦,具体记不清了,但有一些细节有点意思:
    • 首先有一个女孩,***。
    • 我似乎有一个同伴,不过不知道是谁,她也有。然后也不知道在干什么。
    • 然后就是经典「电梯」,这个电梯我总感觉我「之前」哪里「见过」,因为有点印象,都是升到非常高层,而且过程令人恐惧。
    • 这次我跟同伴电梯上升的时候似乎还想起「之前」,之前就是过程胆战心惊但结果平安抵达没有问题什么的。
    • 但这次着实有点恐怖了,上到高层到顶,速度没见减,结果从顶部冲了出来,然后这个顶部也不是什么很宽很广的大平台,而是就像工地那种,就一个细细长长的「杆」,然后就是电梯厢冲出来一小点高度,再坠落到电梯口旁边,似乎还伸出杆一点。
    • 然后上面有俩人,一个好像也是女的,原型不清楚,要不是辅导员就是班主任了。另一个是电梯相关维修人员?反正就是在倒数,似乎是指电梯的使用寿命。然后「班主任」语气平和地说我们运气挺好啥的。
    • 然后我也不记得我上来是为了干啥的,反正好像就又下去了。结果有一根很长很粗的「线」(可能有电梯厢那么粗)在外面,下去的时候同步扔了下去,好像叫「防坠绳」?
    • 然后再坐这个电梯回去的时候我就抱着这根绳子不肯撒手(真是力大无穷),怕电梯往下直摔死了,因此刚开始电梯只是缓缓下降。
    • 但在后面也就慢慢放松,然后最后不再抓着绳了,然后电梯就加速。但最后似乎平安抵达。
    • 下来后可能跟 *** 她们会和了?然后后面干啥就没啥大的印象了。

2026.7.28

  • 做了一个奇特的梦,醒来后还能记得很多细节。不过吃早餐等后现在也距离起床过了半个多钟了,可能也有一些模糊了,不管怎么样先记录下来吧。
    • 首先背景大概就是我在做志愿活动,具体做的什么活动已经忘记了,地点就是在大学,只不过有点魔幻。
    • 我所在的地方好像有一个小坡,干的什么已经忘记了,然后另一侧似乎也有一个跟我类似的,偶尔回去看。不过这部分可能没想多少,抑或是很多碎片忘记了。
    • 然后大概我去挑宿舍,我的行李在一楼,大概是为了避免带着行李跑上跑下,我于是打算先自己踩点选好宿舍,然后再把行李带上来。
    • 接下来我大概撞入了几间都是有人的宿舍,最后来到了四楼,进了一间。
    • 这个宿舍楼有点奇特,它大概是有两边,我应该在其中一边探寻。然后最后进了一间后才发现,它的构造,好像一整栋(这一边)不同楼的中间都是衔接在一起的,中间大概是一块很大的圆形活动板(不是平移打开的,是上下翘打开的,即垂直旋转),周围四角有四个床位。
    • 然后我正在查探的时候突然出现了一个人,他应该一直在这里,怎么出现的我也忘记了,似乎跟那块活动板有关,因为好像是他出现的时候我才窥见了建筑的奇特,活动板打开后可以看到下层甚至更低。
    • 他的语速很快,一开始说了什么我忘记了,然后我莫名其妙开始吃橄榄(内心里还想过油甘)。然后他快速地说了什么,我听不清不知道怎么回应,好像就跟他说我听不清之类的,好像说什么因为我在嚼橄榄因此听不清。然后他就以超大的声音再快速说了什么,音量大概整栋楼都听得到,但我还是听不太明白,于是就让他凑近点跟我讲。
    • 最后他凑近了跟我讲什么忘记了,然后他要去上厕所。趁着他去上厕所,看着他的背影,我拿着水壶和另一样东西(忘记了)溜走了。大概是打算放弃选中这一间宿舍。
    • 出来后可能换了一边,也可能没有?但总之下了一楼到三楼,再进去看,还是有人。
    • 之前看到有人我立刻就出来了,没看人具体什么样子。不过这次我就没有立刻出来了,而是看了两眼,好像是一男一女,年纪看着比我大的样子。我再往里面走了几步,两人就站起身来,带上一些东西,可能是书匆匆离开了,嘴里好像还说了些什么,似乎是打扰自习之类的?
    • 样貌看起来像是老师,我当时也感觉好像似曾相识,但最终忘记了是谁。总之当时我在好奇,怎么变成教室了。于是我从另一个出口出来,那个出口跟清晰的我进来的入口不太一样,大概藏得比较深。出来后似乎有很多人,可能是亲眼所见也可能是听到声音,也许跟志愿所进行的那个活动相关。
    • 等我再回头想要进去宿舍的时候,发现几个比我年轻模样的学生进去了,只好作罢,最终放弃了。
    • 后面画面再一转,也可能只是我自己放弃了宿舍这边的事情然后回到了刚开始说的另一侧做志愿的地方。人好像已经少很多,慢慢散了。然后我这才发现这里有一个非常高的近乎垂直的崖,看着下面稀疏了的人群慢慢路过。然后我好像就在抱怨这该怎么下去啊,感觉会摔死一样。
    • 然后好像就出现了一个女生,似乎跟志愿领队什么的相关(她似乎是很多志愿活动相关的学生负责人之类的),带了还有一些也是做志愿的学生,然后她出现后莫名其妙就有一个可以往下走的路了,于是我们就跟着她一起走。
    • 路上聊了一些什么我有点忘记了,但好像就是她想要我们这一群人干什么额外的事情,还是长途跋涉什么的,忘记了。然后也忘了是谁,甚至可能是我还提到过志愿已经结束了。
    • 最后反正主要是我和另一个人(似乎也是女生)跟她起冲突了,她就开始威胁我们。说了什么忘记了,好像是平方数 1, 4, 9, 16 什么的,说了两遍,我后面还懊恼没有录音,总之像是可以作为她把柄的东西。后面就开始威胁了,然后我就跟她争辩说我无所谓志愿时长,我志愿时长也已经做够了,我只是看有人(好像是老师)有需要,才过来帮忙的。然后她就继续讲,好像跟违纪相关的,似乎是说违纪了就没法评奖评优的,借此来威胁我。然后我就继续说,大不了我也不要了,反正又不是没拿过。不过我记得我全程没有任何骂人的脏话,也没有什么其他的。
    • 然后就是继续走,我路上似乎还在不断抱怨,似乎还听到后面有人窃窃私语说我「还在刚呀」。后面似乎还提到我这一边什么什么的,好像是本来可以从我一开始做的那一侧走的,那里的老师说过什么,忘记了。只是我一出口就后悔了,因为这是假话。然后她冷冷问我为什么不早说。
    • 后面可能继续走啊走,走很远了,很累了,到了一家店,于是我们打算在这里吃。有一个透明的柜子,里面有各式各样的寿司,装在一个圆盘中,每个人拿就是了。我从右往左走来看,中间看到一个很对我为胃口的,然后继续看完剩下的,没有更满意的,回来决定选那个,这时候周围少了不少,可能是别人已经挑了。然后我拿起来后,感觉似乎跟我一开始见的不太一样。
    • 然后是找地方坐着吃。我看到大概有三排座位,我靠左,或者说就是从座位的右侧走过去。前两排的座位右侧都坐着一个脏兮兮的人。然后第三排左侧也有一个脏兮兮的人,我犹豫一会后还是坐在了第三排的座位右侧开始吃,大概是怕别人认为我介意。
    • 快速吃完后我忘了干啥了,可能是付钱后等其他人,反正莫名其妙我回到宿舍了(跟一开始探寻那个宿舍不是一个)。等了一会后我在一个 QQ 群里问他们好了吗,在哪里。不过这个群似乎并不是我们这次这个志愿所有人在的群,而是之前志愿的群,因此其实除了那个女生在外,其他人员可能是不同的。
    • 过了一会后,那个女生给我私聊了一串非常长的文本。似乎有一个地点,是学校内我从没去过的楼的名称,似乎是宿舍楼?然后我什么感觉忘记了,后面就醒来了。
    • 真是非常逆天长啊,光是写这个好像就花了半个多钟。这个梦主要来看大概是分为三个阶段(做志愿、宿舍楼、志愿相关冲突),其中最后一个阶段大概是因为离梦醒最近,也印象最深。而且其中有不少细节,如志愿时长等比较真实,也有点奇葩。
    • 另外说起来也奇怪,梦中感觉我很讨厌那个女生,其他人似乎也有类似的情绪,但醒来后这个感觉就很淡薄了。

其实感觉有点水啊哈哈,直接把当时的记录就搬过来,也懒得补充点什么。

Zellij

这学期学了一下 Zellij,有点爽。之前也没用过 Tmux,但听过其威名,只是不知道有什么用。

记得更早之前就听说过 Zellij 了,当时就安装尝试了一下,结果很快就抛之脑后了。没想到这次一上手就爱不释手了。

之前需要多开的时候我都是 Windows Terminal 新开一个标签页,然后再这样那样。实在有需要对照查看的时候,才会尝试用一下它的拆分终端功能。而有了 Zellij 后可以直接在一个标签页完成,而且相当舒服。

我感觉之前没感觉到好处,是因为没记住热键模型与相应的规律。而这次上手后我就尝试了一下,摸索出来了规律,然后就是爽用了。

不过我也确实是改了一点配置,例如说默认的热键配置冲突太多了,我 Vim/Neovim 自己还有很多映射呢。于是切换成了 Unlock-first,需要先按 Ctrl + G 才能触发。

那如果要原样输出 Ctrl + G 呢?答案是按两次。但这不是原生的,需要配置。

同时 Unlock-first 主要针对的还是 Ctrl 类型的热键,但对 Alt 类型的还是不太生效,但 Alt 类型我 Neovim 也遇到了一些冲突,也需要原样打出。因此也是希望在按了 Ctrl + G 后能够释放。

这个其实希望是可以原生支持的,但既然现在没有,那就只能自己搞了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
shared_except "locked" "renametab" "renamepane" {
    bind "Ctrl g" { Write 7; SwitchToMode "locked"; }
    bind "Alt +" { Write 27 43; SwitchToMode "locked"; }
    bind "Alt -" { Write 27 45; SwitchToMode "locked"; }
    bind "Alt =" { Write 27 61; SwitchToMode "locked"; }
    bind "Alt [" { Write 27 91; SwitchToMode "locked"; }
    bind "Alt ]" { Write 27 93; SwitchToMode "locked"; }
    bind "Alt f" { Write 27 102; SwitchToMode "locked"; }
    bind "Alt h" { Write 27 104; SwitchToMode "locked"; }
    bind "Alt i" { Write 27 105; SwitchToMode "locked"; }
    bind "Alt j" { Write 27 106; SwitchToMode "locked"; }
    bind "Alt k" { Write 27 107; SwitchToMode "locked"; }
    bind "Alt l" { Write 27 108; SwitchToMode "locked"; }
    bind "Alt n" { Write 27 110; SwitchToMode "locked"; }
    bind "Alt o" { Write 27 111; SwitchToMode "locked"; }
    bind "Alt p" { Write 27 112; SwitchToMode "locked"; }
    bind "Alt Shift p" { Write 27 80; SwitchToMode "locked"; }
    bind "Ctrl q" { Quit; }
}

翻了一下记录,看来是没有什么机会支持:

2026.5.21

  • 早上整了 Zellij 的 Alt 热键穿透。
    • 它 locked/normal-only 的热键,即便模式不对也依旧监听,因此即便将热键从 shared_among 中改为了 locked,在 unlock 后还是无法穿透,跟 Ctrl + G 一样。于是只好在 normal 给这些键也 Write,Alt 的比较简单,就是 ESC(27) + 对应符号的 ASCII,然后 ASCII 可以 :ascii,不过我忘了 UTF-8 之类的怎么查看。我翻翻文档。查到了,没有命令,就是 g8 而已。
    • 这个有点恶心,我看看有没有相关 issue。有一个 PR 修改这种行为:fix: forward unbound keys in Normal mode regardless of default input mode by metaspace · Pull Request #4770 · zellij-org/zellij
    • 但非常遗憾的是关掉了,作者认为在命令模式(即 normal)捕获所有热键的行为是合理的,这很遗憾了,因为这意味着我要手动映射掉透传的键,虽然作者说的也有一些道理吧,说之前采用过但受到了很多抱怨。只是我觉得 unlock first 模式跟原本默认的模式又有很多不同了,unlock 后能够透传其实我觉得是属于预期行为的。没必要评论了。

除此以外 Zellij 其实也有遇到一些问题。例如说 detached 了会话后再 attach,有一些程序的恢复不太符合预期。例如说我 Neovim 打开了某文件,重新打开的话有时候会提示是否要 re-run,有时候就是直接执行了空 nvim 命令,然后如果退出 pane 就一并关闭了,如果正巧 tab 也没有其他 pane,那就 tab 也没了,有点蛋疼。

还有就是保存 session 的时机感觉也不太符合预期,现在似乎是定时的?

除此以外就是每次升级要自己迁移 session,这是因为没有相应契约。不过好在最新版本已经有了。

哦差点忘了,最初用 Zellij 的时候还遇到了 Vim 的问题。因为 Zellij 也会改窗口标题(后面还遇到了一个小问题,现在还没修)。于是我直接不搞什么窗口匹配了,只要你是 Windows Terminal 就匹配得了,管他什么乱七八糟。

但不管怎么说,还是用得相当爽的。我现在如果有什么目标都会开一个 Zellij 会话了,这样想工程启动的时候太方便了。当然,如果是临时、简单的情形,那还是会新开一个终端标签页。

等一下,我是不是写过了?我靠真是服了,翻到 Zed 打算写的时候才感觉有点熟悉啊,于是翻了翻三月的记事,确实已经写过了。罢了罢了,也算是额外补充了一些信息,例如说上面的一些配置就是后面优化的。

既然如此 Zed, GlazeWM 就不细谈了。

Zed 其实前几天清理 Scoop 安装列表的时候卸掉了,确实感觉用不太上,你 Vim 模式很厉害,但我已经直接用 Neovim 了,VS Code 说实话都不怎么开了,也就留着当个备用。

而 GlazeWM 除了上次说的 QQ、微信不太好用外,还有就是 QQ 截图也搞不了。因为 Snipaste 没法截长图,而 QQ 截图截长图还是很好用的,因此真的有必要的时候我就不得不关掉 GlazeWM,弄完再重启。如果说没有临时布局的话那还好,只是需要每个窗口都点一下重新自动归类,但如果我自己有临时调整一下的话那就麻烦了。

JJ

本文初记于此,后因篇幅过长单独提成博文《我的 JJ 使用体验》

缩小 WSL 体积

WSL 体积每隔一段时间就会膨胀一点,而且不会自动收缩。之前找的方法每次都要手动弄,太麻烦了。后面终于写了一个脚本,直接 sudo 运行就行了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
$VhdxPath = "<WSL 虚拟硬盘位置>"
# =========================

# 检查是否以管理员身份运行
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
    Write-Host "错误:请以管理员身份运行此脚本!" -ForegroundColor Red
    exit 1
}

# 检查文件是否存在
if (-not (Test-Path $VhdxPath)) {
    Write-Host "错误:VHDX 文件不存在 -> $VhdxPath" -ForegroundColor Red
    exit 1
}

Write-Host "正在关闭 WSL……" -ForegroundColor Cyan
wsl --shutdown

# 创建 diskpart 临时脚本
$diskpartScript = Join-Path $env:TEMP "diskpart_compact_$(Get-Random).txt"
$diskpartCommands = @(
    "select vdisk file=`"$VhdxPath`"",
    "attach vdisk readonly",
    "compact vdisk",
    "detach vdisk",
    "exit"
)
$diskpartCommands | Out-File -FilePath $diskpartScript -Encoding ascii

Write-Host "正在压缩虚拟磁盘,请稍候……" -ForegroundColor Cyan
diskpart /s $diskpartScript

# 清理临时文件
Remove-Item $diskpartScript -ErrorAction SilentlyContinue

Write-Host "操作完成!" -ForegroundColor Green

GitLab

本学期的课程在 GitLab 上进行开发,真正使用后我才体会到 GitHub 的好。我在 JJ 那一部分已经提过了,这里集中提记录的一些点吧。

2026.5.9

  • GitLab 可以删除 force push 的 dangling objects,但要自己列表,他们没法自己 gc,太麻烦了我懒得管了。

这个其实我也没怎么深入了解过。GitHub 的则应该是要联系 GitHub Support。

2026.5.21

  • 晚上终于合并了 MR。不过这 GitLab 有点逆天了,默认没有 fast-forward,还有网页操作的邮箱不会 verified,神人了。

2026.5.24

  • GitLab 真有点逆天了,现在才意识到 GitHub 做了一些额外的工作让其更好用:为了 squash and merge 时不会出现一个额外的 merge commit,设置了 fast forword,结果其他毫无冲突的 MR 必须得 rebase 才能合并了,因为 main 变了。GitHub 直接将 commits squash 应用在 main 上,这是多么自然流畅,在 GitLab 上似乎做不到。

这个已经在 JJ 部分吐槽过了。此外 GitLab 的设置是真的多,但一些默认设置有不够好。

还有就是网页操作,比如说合并 MR 的时候,大概是因为我勾选了不想直接用我邮箱的选项(虽然说没什么用,因为 commit 本身就是用了邮箱),就会分配一个邮箱,然后结果不会显示 verified,然而在 GitHub 同样的场景是会的。

还有有关流水线的吐槽,具体其实有点忘记了,但好像就是最后一个提交和 MR 本身会同时运行流水线,但这不是完全相同的吗?然后有时候出问题(流水线的问题)导致最后一个提交成功了,但 MR 那个失败了,那还得继续重跑一遍。

2026.5.26

  • GitLab 是什么 **,Windows 的 Web GUI 书签推不上去,然后让 Codex 调查了才发现,签名用了 CRLF,本地认为是正常签名了,但 GitLab 认不出来。换成 Git 附带的 ssh-keygen.exe 重新签名才好。

这个是真的逆天。

2026.6.8

  • 神了,GitLab 新建项目,没选命名空间,结果选完后,又 tm 给我勾选用 README 初始化了,什么狗屎默认值。
    • 虽然可以 force push,但真恶心,我一定要重新创建。
    • 神了,删除仓库 500。

原谅我私人的日程记录中的粗言秽语……最后没辙还是 force push 解决。

当然其实 GitLab 也有好的点,例如说 MR 这个名字就比 PR 好。还有呢我课程项目中尝试了一下 stacked MR,GitLab 中能设置阻塞 MR,这点挺不错的。不过我看最近 GitHub 似乎也推出来 stacked PR,但我还没怎么了解。

RSSHub

唉,信息聚合事业任重而道远。

简而言之就是 B 站相关的 RSS 被风控了,消息提醒相关的路由是完全用不了,然后像是 UP 的动态、视频什么的,算是基本能用,只是偶尔用不了会提示校验失败。可以通过刷新 Cookie 消除一段时间,但很快就又一片失败了。因为前面失败下一次请求也可能成功,所以我就懒得管了。至于消息提醒相关路由,那就没辙了,但反正也不常用,用不了就用不了。

2025.5.31

  • 咦,莫名其妙看到 B 站清晰度就 360P,刚想说妙哉,本来我也不看画面,结果果然是掉登录了,怎么回事。重新登录看看。嗯没啥问题,直接登录就完事了,甚至没有手机号验证。
    • 过了一会后,咦,会不会是 RSS 那边寄了呢?我可能要检查或测试一下。
    • 看了看 RSSHub 日志:Error: Got error code -352 while fetching: 风控校验失败。看来是寄了,需要重新弄一下 Cookie 了,这应该是我四个多月以来第一个寄的吧。
    • 重新弄了并重启,不知道可不可以,希望别把我 ban 了,看似乎有人 412?
    • 另外 privatebin 不知道怎么了,日志每秒报错,但似乎还能打开,应该还能用吧。不过短时用不到,先关了,免得日志爆了。
    • 临近五点,FreshRSS 用 qq 重新更新一下,RSSHub 日志看起来没问题?
    • 应该刷新完了,都是 200,没有问题。不过 FreshRSS 这边还是有红色警告,还是有问题,但应该就单纯是这边的问题。
    • 我在想,过了好几个月,是否需要重新构建一下 RSSHub,或者准备一个自己的 fork,然后不用手动搞了,直接从 Docker Hub pull。
    • 过了五点后自动请求,警告消失了。

首先是第一次挂了。重新弄了 Cookie 后我就没管了,结果很快又遇到了第二次:

2026.6.3

  • 刚弄完 IDM,看 B 站又有一些风控失败了……无言。看时间是六点开始的,但也不是全部失败。
    • 感觉没辙,虽然半个小时才请求一次,但请求一次就请求一批,也不知道能不能平滑请求。
    • Codex 让给 RSSHub 搞了一下,不知道效果如何。
    • 因为平滑最差可能拖慢 30min(平滑窗口设置为了 30min),因此不是对所有路由都开启好。只对 B 站开启了。另外换了新 Cookie。
    • 按现有的数据看,31 条 B 站路由,最短间隔 6 秒,平均间隔 58 秒,最长间隔 191 秒,半小时的五分钟桶分布是 5,7,3,8,5,3,还可以,就看具体情况如何了。
    • 现在可以看到平滑缓存的日志了。这样其实大概每条都会晚上半个小时?
    • 假设某个视频路由上一次平滑缓存刷新到下一次之间,视频更新了,那不仅要等下一次平滑缓存刷新,还要等 FreshRSS 请求了。在当前的配置下(01 和 31 时 FreshRSS 会请求,然后平滑缓存的窗口也是半小时),最差情况大概就是平滑缓存刷新时间比 FreshRSS 请求稍晚,比如说 02 吧,然后视频 02 以后更新,比如说 03,按旧的情况会在 31 那会更新能看到。但是现在得等 32 的时候平滑缓存刷新才能看到,然后再等到下一个 01 才能看到。
    • 最好的情况自然就是视频发在了请求与平滑缓存之间,这样平滑缓存就一样,可以美美到点开看。
    • 整点发布的视频也可以说是必然要多等半个小时了,因为几乎一定得等平滑缓存刷新。
    • 嘛,这也是不得不付出的代价。对了,重启容器刚启动的时候还是会集中请求,感觉这会是一个潜在的风险点?
    • 回来后再改了点,了解了它的实现后,进行了优化,可以减少大概一半的缓存。然后再启用了 Redis,RSSHub 内存占用减了 100M 左右,然后 Redis 服务也才不到 3M,原来这么爽的吗,早知道早点启用了。
    • 难绷,过了零点看一眼,又涨回来了。

2026.6.4

  • 感觉昨晚看到的低内存,单纯是因为刚启动……现在跟平时完全差不多,不过好在 Redis 占用也不多就是了。
    • 看日志,平滑缓存其实还是有失败的时候,而且两次都是一个。不过后面就好了,不是什么大问题。

第二次失败的时候,我就在想有没有可能是因为 FreshRSS 是定时请求的,而 B 站相关路由还是不少的,集中在短时间内请求可能就给风控了。于是我就有了「平滑缓存」的思路,安排给 Codex 让它实现了。大概思路就是请求的时候直接返回缓存结果,并将真实请求随机平滑到接下来一段时间内,这样就把集中的请求打散了。

然而并没有什么卵用:

2026.6.7

  • 寄,又风控校验失败了。但很奇怪啊,有一些没问题。没招了,翻日志看起来从昨天就会了。我也是看 FreshRSS 有报错才去看的,而有了两类缓存后,出现问题也很难第一时间发现了。估摸着是至少发生了 24h 掉了缓存才察觉。
    • 终于也是给我翻到了,昨天的 20:41 的时候请求极客湾的视频风控校验失败 352(但后面还是出来了,只不过不感兴趣直接刷掉了)。随后就是每一段都有挂掉的了,到现在十点被我觉察。后面还有账号未登录的错误,但后面其实也有成功的。比如刚刚的 22:07 的失败了,22:09 的又成功了。
    • Codex 启动吧。
    • 唉,日志很多后面更新的,提示 Playright(不过刚看到 RSSHub 更新换 Patchright 了),Codex 打补丁把这层去掉了,防止污染日志什么的。但其他没什么实质上的改进。
    • 另外视频是断断续续成功,失败是是风控 352,然后消息是稳定失败,提示未登录,因此视频由于长缓存的存在不会有失败问题,而消息在 24h 长缓存失效后就寄了,这才被我察觉。难怪今天感觉有一些视频点进去,感觉发的比想象中早上一点。
    • 这还没几天呢,要是得一周换一次 Cookie 那也得累死我只能说。
    • 把平滑缓存改成应用在 /bilibili/user 了,这样 /bilibili/message 还是实时的,也不受缓存影响,可以更快通报错误状态。
    • 突然想到除了其他要素,不会是因为服务器 IP 的缘故吧,那很冤了,我也搞不了啥代理吧。

2026.6.10

  • 唉,B 站这个是真恶心啊,又失效了。我都有点懒得管了,继续挂在那里吧。动态消息什么的倒也无所谓了,也不常看。
    • 而且今天似乎又失效一整天了,为啥没提醒我。
    • 哦神了,因为通知提醒今天一天都没有,结果没显示图标。

2026.6.11

  • 唉神了,有平滑缓存的都能给我看到失败了。

于是我就真的没招了,只能弄了一个脚本,同步 Cookie 过去。不过到现在也没用,因为我后面把消息的路由暂停了(毕竟已经废掉了,而且我感觉就是这里风控格外严格导致寄的),就保留正常的,正常的虽然也常常会有风控,但因为不会持续失败我也懒得管了。

Neovim

随着很多代码都由 Agent 代劳,我也逐渐很少再打开 GUI 的编辑器了,即 VS Code。取而代之的则是 Neovim,直接就可以在终端中使用,AI 编程、代码审核、命令操作等全部都可以在终端中完成,不仅更为便捷,性能也更好了。

此外 LLM 还有一个有利的因素就是,以往要探索许久的配置,现在只要下达一个任务就可以了。不必再自己搜集很多资料,然后不断试错寻找解决方案。

因此在学期的后期我也开始给 Neovim 添加了更多配置。

首先是 JJ 相关。LazyVim 提供了一些 Git 支持,但其中很大一部分对 JJ 是无用甚至误导性质的。例如说 JJ 长期处于 detached HEAD 状态,可能 jj status 下是 empty change,但 git status 却非常混乱。

尽管我的 JJ 操作基本上都是在其他地方(例如新开的 pane、tab 甚至终端标签页等)进行的,但要是也可以在 Neovim 中就直接使用的话倒也不差就是了。

于是我就找到了 jj.nvim 这个插件,并让 Codex 帮我配置了一下,相关的映射会被替换成 JJ 的。不过其实使用频率还是不高,因为 JJ 命令行足够好用了。以及这个插件本身就在高速开发过程中,我今天又搜了一下还有许多种可能,等到后面更多用户了也许会有一个公认比较好的选择。

后面可能加强 Neovim 的使用,尝试在其中接替一些以往 VS Code 中的习惯。

然后是 snippets,因为那段时间算是一个「Token 自由」的短暂窗口期,于是我便尝试让 Codex 帮我把 Markdown 的大部分 snippets 迁移到 LuaSnip 当中,舍弃了部分,同时对其中部分也进行了调整,并最后进行了一些优化。

我本来尝试审核一下的,但迭代了几轮后不太坚持得仔细看完全部了,因此也就外围设施看了眼,其他的交给 Codex 自己的能力了,包括自己记录过程、自行启动 Neovim 测试等。

不过完成后我其实没多少使用 Neovim 写 Markdown 的机会——像是在 Windows 上写博客的一些玩意,依旧还是在用 gVim,或许后面会替换成终端上的 Neovim 吧——因此其实也没什么机会进行大规模检验,尤其是没什么自己手动写大量数学公式的机会了,于是规模最为庞大的数学公式,其实没有得到很好的覆盖检查,我检验的时候来来去去就是那几个相当高频的 snippets。

不过就是这样其实我也观察到了一些不一致,例如说一些 autosnippets 需要手动 trigger 了,如标题的 #\d。这个大概也是有意为之的,因为不仅是迁移,我还希望大大提升性能、优化使用体验,于是首当其冲的就是禁用了相当一部分 autosnippets。除此以外 Codex 也应该对一些热点路径进行了优化,例如说高频、高代价的函数进行了缓存等等。这些措施加上 LuaSnip 本身的能力,让 snippets 的性能基本上不会成为写作的瓶颈。我记得我拿过几万行的超大文件(把高密度公式笔记粘贴数份),依旧能保证迅速展开。

不过 LuaSnip 一个代价就是,snippets 的可读性相对来说就差多了,尤其是还不是我自己写的,没什么看的欲望。

LuaSnip 我也看过一点它的文档,于是也让 Codex 额外加入了一些特性。例如说它有不同的节点,于是使用 inlay hint 提示处于什么节点当中。

此外 UltiSnips 可以为 tabstop 提供选项,LuaSnip 中也可以提供,虽然不可以像前者那样直接输入数字就完成输出,但可以切换按顺序切换选择,甚至打开 picker 选择器来选择等。

当然其实也可以探索更多可能了,如果是高二时候的我一定会很兴奋地研究,但现在的我倒有点懒得搞了。

与此同时其实我也让它帮我顺带也弄一点 Typst 的 snippets,它这个也算是弄了吧,但我好像不大满意。真要说的话也许现在 Typst snippets 的价值更高就是了,因为作业我真要自己写,已经手写公式可能几个学期了?返璞归真了属于是。

翻看了一下,我在后面也有跟 Markdown 的性能优化以及各种使用上作斗争。例如说我 Markdown 中有 admonition 语法,但缩进的内容在 Markdown 的「规范」中是被视为代码块的(又是一个我没用过的语法),然后就有了注入 Tree-sitter 的方式解决:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
local M = {}

local indented_code_highlight = "%f[%S]%(indented_code_block%)%s+@markup%.raw%.block\n?"
local indented_code_injection = [[

((indented_code_block) @injection.content
  (#set! injection.language "markdown_inline"))
]]
local applied = false

---@param query_name string
---@return string?
local function read_markdown_query(query_name)
  local ok, files = pcall(vim.treesitter.query.get_files, "markdown", query_name)
  if not ok or #files == 0 then
    return nil
  end

  local chunks = {}
  for _, file in ipairs(files) do
    local lines = vim.fn.readfile(file)
    chunks[#chunks + 1] = table.concat(lines, "\n")
  end

  return table.concat(chunks, "\n")
end

---Treat four-space indented Markdown blocks as prose for editing purposes.
---
---Tree-sitter's Markdown parser must keep producing `indented_code_block`
---nodes for CommonMark compatibility.  The query patch keeps those nodes from
---looking like raw code and injects their content as `markdown_inline`, while
---fenced code blocks and their language injections keep their normal behavior.
function M.setup()
  if applied or vim.g.markdown_indented_code_blocks_as_code == true then
    return
  end

  local highlights = read_markdown_query("highlights")
  local injections = read_markdown_query("injections")
  if not highlights or not injections then
    return
  end

  highlights = highlights:gsub(indented_code_highlight, "")
  if not injections:find(indented_code_injection, 1, true) then
    injections = injections .. indented_code_injection
  end

  vim.treesitter.query.set("markdown", "highlights", highlights)
  vim.treesitter.query.set("markdown", "injections", injections)
  applied = true
end

return M

还有因为我的数学公式相关 snippets 强依赖于 VimTeX,而其不使用 Tree-sitter 而是基于正则语法,同时有一些运行成本比较高的函数,也是费了一番功夫进行调优,尤其是对大文件会使用一些额外的手段等。

再到后面,因为 markdown-preview.nvim 长久不更新了,加上有一些功能不支持(如叕是 admonition,此前我是直接自己替换的),还有我还要继续对性能进行优化等等,就 fork 了一个自用,并开了个 goal 让 Codex 优化了一个晚上。甚至到后面推倒重来换技术栈重写了。

正好写到这里的今天(8.4)看到一篇文章 Devtools must be open source - exe.dev blog,我非常认可里面的观点——认为未来的软件应该是私人定制的。事实上我也正在这么做了,即便我还是囊中 Token 羞涩,不然的话会更加彻底,我也已经 fork 过一些项目自用了。

不过这篇文章倒是提出来一个比较有意思的点,就是定时将本地的变更 rebase 到上游的最新变更。这就属于是基于经过广泛应用的比较稳定的产品进行定制化,算是一个过渡的方法,可以说在很多情况都足够完美了,兼具极高的稳定性与功能完整性。像我 RSSHub 就是这样的,只是我还是手动同步上游的变更,到现在其实也就同步过一次而已。

还有一种则是我最开始比较激进的想法了,那就是完全重写,按照自己的想法进行重写。例子就如上面的 markdown-preview.nvim 插件一样。对小的东西来说问题倒是不大,甚至可以清除掉沉重的历史债务。但对于复杂的大型系统来说就比较困难了,我之前也评估了一下替换掉一个比较复杂的玩意的可行性,最终放弃了。

后面还有一些乱七八糟的就不谈了。总之我现在 WSL 上 Markdown 也是用 Neovim 打开了,Vim 的生态位可以说是基本蚕食掉了,目前唯一的使用场景可能就是我现在正在写的博客文章吧。

但是就是写这个可能也难以胜任了,由于插件性能的原因,我上面迁移 JJ 部分到一个新文件的时候,粘贴的时候 gVim 直接卡死了,内存占用爆表,而终端的 Neovim 轻而易举完成了。因此我后面可能进一步抛弃 Vim,尝试改用 Neovim 写文,顺带看看 snippets 的情况以及 Neovim 的编辑性能等。

当然 Vim 可能还是有少数使用场景。例如说我还有一些比较久的 Git 仓库无法迁移至 JJ,但我 Git 又不太熟悉,还是更习惯 Vim 的 Fugitive。但看文件、改文件、写文件等事情,算是逐渐由 Neovim 接棒了。

AI

终于是写到 AI 这里了,我也是五谷丰登五味杂陈。就从感情色彩比较轻的东西开始说起吧。

Agent Notify

想要让 Agent 长时间跑,但又不想错过信息。在挣扎许久后终于尝试去研究一下怎么解决了。一开始给 Claude Code 单独配了个钩子,但后面用 Codex 更多了,于是终于想该如何复用。再想到我还有 WSL 和 Windows 两个平台,因此最终就是主要的脚本放在 Windows 上,然后每个弄一个包装器。

废话也不多说了,直接上代码吧。

首先是 Codex 和 Claude Code 的配置,Codex 要小心一点,我记得好像 ~ 不会给解析?因此下面得改。

~/.codex/config.toml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[[hooks.PermissionRequest]]
matcher = "*"

[[hooks.PermissionRequest.hooks]]
type = "command"
command = "~/.local/script/codex-notify --hook"
timeout = 10
statusMessage = "Sending approval notification"

[[hooks.Stop]]

[[hooks.Stop.hooks]]
type = "command"
command = "~/.local/script/codex-notify --hook"
timeout = 10
statusMessage = "Sending stop notification"

[[hooks.SubagentStop]]
matcher = "*"

[[hooks.SubagentStop.hooks]]
type = "command"
command = "~/.local/script/codex-notify --hook"
timeout = 10
statusMessage = "Sending subagent notification"
~/.claude/settings.json
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "hooks": {
    "Notification": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.local/script/claude-notify 'Claude Code Alert' 'Needs your attention'"
          }
        ]
      }
    ],
    "Stop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.local/script/claude-notify 'Task Complete' 'Claude Code finished'"
          }
        ]
      }
    ],
    "SubagentStop": [
      {
        "matcher": "",
        "hooks": [
          {
            "type": "command",
            "command": "~/.local/script/claude-notify 'Subagent Done' 'Subagent task finished'"
          }
        ]
      }
    ]
  }
}

包装器:

~/.local/script/codex-notify
1
2
3
4
5
#!/usr/bin/env bash
set -u

script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"
exec "$script_dir/agent-notify" "$@"
~/.local/script/claude-notify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/usr/bin/env bash
set -u

script_dir="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)"

if [ "$#" -eq 0 ]; then
  exec "$script_dir/agent-notify" "Claude Code" "Notification"
fi

if [ "$#" -eq 1 ] && [ "$1" != "--hook" ]; then
  exec "$script_dir/agent-notify" "$1" "Notification"
fi

exec "$script_dir/agent-notify" "$@"

然后是复用的接口:

~/.local/script/agent-notify
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/usr/bin/env bash
set -u

win_script='<Windows 上脚本路径>'
wsl_script='<WSL 版路径>'

if [ ! -f "$wsl_script" ]; then
  printf 'agent-notify: missing %s\n' "$wsl_script" >&2
  exit 127
fi

if [ -t 0 ]; then
  exec powershell.exe -NoProfile -STA -ExecutionPolicy Bypass -File "$win_script" "$@"
fi

tmp="$(mktemp)"
trap 'rm -f "$tmp"' EXIT
cat > "$tmp"
powershell.exe -NoProfile -STA -ExecutionPolicy Bypass -File "$win_script" "$@" < "$tmp"

嘛,其实我还没看过脚本呢,都是看效果如何,有不对劲的再让修复。现在看其实这稍微可以改改,可以只要一个 win_scriptwsl_script 可以用 wslpath 命令得到。

然后就是最终的 PowerShell 脚本了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
param(
    [Parameter(ValueFromRemainingArguments = $true)]
    [string[]] $RemainingArgs
)

$ErrorActionPreference = "SilentlyContinue"

$Utf8NoBom = New-Object System.Text.UTF8Encoding $false
try {
    [Console]::InputEncoding = $Utf8NoBom
    [Console]::OutputEncoding = $Utf8NoBom
    $OutputEncoding = $Utf8NoBom
} catch {
}

function Compact-Text {
    param(
        [AllowNull()] [object] $Text,
        [int] $Limit = 220
    )

    $value = [string] $Text
    $value = ($value -replace "\s+", " ").Trim()
    if ($value.Length -le $Limit) {
        return $value
    }
    return $value.Substring(0, [Math]::Max(0, $Limit - 3)) + "..."
}

function Parse-Json {
    param([AllowNull()] [string] $Raw)

    if ([string]::IsNullOrWhiteSpace($Raw)) {
        return $null
    }
    $trimmed = $Raw.Trim()
    if (-not $trimmed.StartsWith("{")) {
        return $null
    }
    try {
        return $trimmed | ConvertFrom-Json -ErrorAction Stop
    } catch {
        return $null
    }
}

function Get-Prop {
    param(
        [AllowNull()] [object] $Object,
        [string] $Name
    )

    if ($null -eq $Object) {
        return $null
    }
    $property = $Object.PSObject.Properties[$Name]
    if ($null -eq $property) {
        return $null
    }
    return $property.Value
}

function First-Text {
    param([AllowNull()] [object] $Items)

    if ($Items -is [System.Array] -and $Items.Length -gt 0) {
        return Compact-Text $Items[$Items.Length - 1]
    }
    return ""
}

function Read-StdInUtf8 {
    try {
        if (-not [Console]::IsInputRedirected) {
            return ""
        }

        $stream = [Console]::OpenStandardInput()
        $buffer = New-Object byte[] 4096
        $memory = New-Object System.IO.MemoryStream
        while (($read = $stream.Read($buffer, 0, $buffer.Length)) -gt 0) {
            $memory.Write($buffer, 0, $read)
        }
        return [System.Text.Encoding]::UTF8.GetString($memory.ToArray())
    } catch {
        return ""
    } finally {
        if ($null -ne $memory) {
            $memory.Dispose()
        }
    }
}

function Show-Balloon {
    param(
        [string] $Title,
        [string] $Message
    )

    try {
        Add-Type -AssemblyName System.Windows.Forms | Out-Null
        Add-Type -AssemblyName System.Drawing | Out-Null

        $notification = New-Object System.Windows.Forms.NotifyIcon
        $notification.Icon = [System.Drawing.SystemIcons]::Information
        $notification.BalloonTipIcon = [System.Windows.Forms.ToolTipIcon]::Info
        $notification.BalloonTipTitle = $Title
        $notification.BalloonTipText = $Message
        $notification.Visible = $true
        $notification.ShowBalloonTip(5000)
        Start-Sleep -Seconds 6
        $notification.Dispose()
        return $true
    } catch {
        return $false
    }
}

function Start-BalloonWorker {
    param(
        [string] $Title,
        [string] $Message
    )

    $oldTitle = $env:AGENT_NOTIFY_TITLE
    $oldMessage = $env:AGENT_NOTIFY_MESSAGE
    try {
        $scriptPath = $PSCommandPath
        if ([string]::IsNullOrWhiteSpace($scriptPath)) {
            $scriptPath = $MyInvocation.MyCommand.Path
        }
        if ([string]::IsNullOrWhiteSpace($scriptPath)) {
            return $false
        }

        $env:AGENT_NOTIFY_TITLE = $Title
        $env:AGENT_NOTIFY_MESSAGE = $Message
        Start-Process -FilePath "powershell.exe" -WindowStyle Hidden -ArgumentList @(
            "-NoProfile",
            "-STA",
            "-ExecutionPolicy",
            "Bypass",
            "-File",
            $scriptPath,
            "--show-balloon-env"
        ) | Out-Null
        return $true
    } catch {
        return $false
    } finally {
        if ($null -eq $oldTitle) {
            Remove-Item Env:AGENT_NOTIFY_TITLE -ErrorAction SilentlyContinue
        } else {
            $env:AGENT_NOTIFY_TITLE = $oldTitle
        }

        if ($null -eq $oldMessage) {
            Remove-Item Env:AGENT_NOTIFY_MESSAGE -ErrorAction SilentlyContinue
        } else {
            $env:AGENT_NOTIFY_MESSAGE = $oldMessage
        }
    }
}

function Build-From-Payload {
    param([object] $Payload)

    $eventName = Get-Prop $Payload "hook_event_name"
    if ([string]::IsNullOrWhiteSpace($eventName)) {
        $eventName = Get-Prop $Payload "type"
    }

    $title = "Agent"
    $message = "Agent needs your attention"

    switch ($eventName) {
        "agent-turn-complete" {
            $title = "Codex Task Complete"
            $message = Compact-Text (Get-Prop $Payload "last-assistant-message")
            if ([string]::IsNullOrWhiteSpace($message)) {
                $message = First-Text (Get-Prop $Payload "input-messages")
            }
            if ([string]::IsNullOrWhiteSpace($message)) {
                $message = "Codex finished a turn"
            }
        }
        "PermissionRequest" {
            $title = "Codex Approval Needed"
            $tool = Get-Prop $Payload "tool_name"
            if ([string]::IsNullOrWhiteSpace($tool)) {
                $tool = "a tool"
            }
            $toolInput = Get-Prop $Payload "tool_input"
            $description = ""
            if ($null -ne $toolInput) {
                $description = Compact-Text (Get-Prop $toolInput "description")
            }
            if ([string]::IsNullOrWhiteSpace($description)) {
                $message = "Codex is waiting for approval to run $tool"
            } else {
                $message = $description
            }
        }
        "Notification" {
            $title = "Claude Code Alert"
            $message = Compact-Text (Get-Prop $Payload "message")
            if ([string]::IsNullOrWhiteSpace($message)) {
                $message = "Needs your attention"
            }
        }
        "Stop" {
            $title = "Agent Stopped"
            $message = Compact-Text (Get-Prop $Payload "last_assistant_message")
            if ([string]::IsNullOrWhiteSpace($message)) {
                $message = "Agent finished or paused"
            }
        }
        "SubagentStop" {
            $title = "Subagent Done"
            $message = Compact-Text (Get-Prop $Payload "last_assistant_message")
            if ([string]::IsNullOrWhiteSpace($message)) {
                $message = "Subagent task finished"
            }
        }
        default {
            $messageCandidate = Compact-Text (Get-Prop $Payload "message")
            if (-not [string]::IsNullOrWhiteSpace($messageCandidate)) {
                $message = $messageCandidate
            }
        }
    }

    return @($title, $message)
}

$argsList = @($RemainingArgs)
if ($argsList.Count -gt 0 -and $argsList[0] -eq "--show-balloon-env") {
    $title = Compact-Text $env:AGENT_NOTIFY_TITLE 80
    $message = Compact-Text $env:AGENT_NOTIFY_MESSAGE 240
    if ([string]::IsNullOrWhiteSpace($title)) {
        $title = "Agent"
    }
    if ([string]::IsNullOrWhiteSpace($message)) {
        $message = "Agent needs your attention"
    }

    if (Show-Balloon $title $message) {
        exit 0
    }
    exit 1
}

if ($argsList.Count -gt 0 -and $argsList[0] -eq "--hook") {
    $argsList = @($argsList | Select-Object -Skip 1)
}

$stdinPayload = ""
$stdinPayload = Read-StdInUtf8

$payload = $null
$staticTitle = $null
$staticMessage = $null

if ($argsList.Count -eq 1 -and $argsList[0].TrimStart().StartsWith("{")) {
    $payload = Parse-Json $argsList[0]
} elseif ($argsList.Count -gt 0) {
    $staticTitle = $argsList[0]
    if ($argsList.Count -gt 1) {
        $staticMessage = $argsList[1]
    }
    if ($argsList[$argsList.Count - 1].TrimStart().StartsWith("{")) {
        $payload = Parse-Json $argsList[$argsList.Count - 1]
    }
}

if ($null -eq $payload) {
    $payload = Parse-Json $stdinPayload
}

if ($null -ne $staticTitle) {
    $title = $staticTitle
    if ([string]::IsNullOrWhiteSpace($staticMessage)) {
        $message = "Agent needs your attention"
    } else {
        $message = $staticMessage
    }
} elseif ($null -ne $payload) {
    $built = Build-From-Payload $payload
    $title = $built[0]
    $message = $built[1]
} else {
    $title = "Agent"
    $message = "Agent needs your attention"
}

$title = Compact-Text $title 80
$message = Compact-Text $message 240

$logDir = Join-Path $env:LOCALAPPDATA "AgentNotify"
$logPath = Join-Path $logDir "events.log"
try {
    New-Item -ItemType Directory -Path $logDir -Force | Out-Null
    $record = [ordered] @{
        time = (Get-Date).ToString("yyyy-MM-ddTHH:mm:sszzz")
        title = $title
        message = $message
    }
    ($record | ConvertTo-Json -Compress) | Add-Content -Path $logPath -Encoding UTF8
} catch {
}

if (Start-BalloonWorker $title $message) {
    exit 0
}
exit 1

统一后 Codex 的效果不错,但总感觉 Claude Code 的没那么灵敏,不是停顿的时候立刻发通知,感觉要过上好几秒,也不知道是感觉原因还是什么。

当然,即便是开启了 notify 的功能,我后面好像基本还是长时间盯着就是了。

说到这个感觉不得不提一下 goal。之前 Codex 的 goal 可以自动重试,这个真有点爽,挂在那里我是真可以不管了,然后也时常放在晚上让它跑一个晚上,或者更常见的,遇到错误的时候挂上去,自动重试到成功。

然后我后面试了一下 Claude Code 发现不行,便感叹你这边不好。结果后面升级了一下 Codex 发现也不行了。

于是去 Codex 那边查证了一下,原来是被当成 bug 修复了。仔细一想确实可以理解,不然就给当成 DDoS 了,但我也是很可惜这么方便的自动方式就用不了了,毕竟我自己也算是「情况特殊」嘛。

CPA

记得软件质量与管理某次课上,老师问我们 Token 的用量大概是多少。然而我没法准确的进行计量,因为我的「渠道」可以说是散落各处,想要相对全面地计数比较困难。因此就萌生了部署一个 CPA 的想法,但也是拖了好久,直到六月初才部署好了。

不过刚开始的时候还想过要不要在服务器上部署,这样甚至在外面的时候也可以查看使用情况等。但是后面还是否决了,改用本地部署。主要是从性能与安全性两方面考量,而服务器部署的优点对我来说意义不大。

使用的是 Docker Compose,本地部署的 Docker 服务也挺舒服的。我还有一个 Stirling-PDF 服务,用于将图片 PDF 转为带文字的,后面还暴露了接口给制作期末复习资料的 Agent。

当然因为 Stirling-PDF 内存占用大,肯定是不能常驻的。而 CPA 我觉得手动启动的话比较麻烦,因此这个是常驻的,从而 Docker 进程本身就也要开机自启了。

也是弄了相关脚本,开启自动启动 CPA(我已经弄过开机自动启动 WSL 了)。

/etc/wsl.conf
1
2
[boot]
command = /usr/local/sbin/cpa-wsl-autostart
/usr/local/sbin/cpa-wsl-autostart
1
2
3
4
5
6
7
8
#!/bin/sh
# WSL boot hook for the local CPA stack. It returns immediately and lets the
# user-owned helper wait for Docker and start CPA + Usage Keeper in background.
(
  /usr/sbin/service docker start >/dev/null 2>&1 || true
  exec /usr/sbin/runuser -u <user> -- <script> autostart --foreground --delay 20 --retries 18 --interval 5
) >/dev/null 2>&1 &
exit 0

具体脚本有点长,懒得放了,反正就是启动嘛。

当然为了查看具体的数据,还装了一个 CPA Usage Keeper。

不过 CPA 配置中有一些用于 OAuth 回调的端口,但我莫名其妙其中一些用不了(OpenAI 的 1455 用得了,Claude 的 54545 以及一些其他的用不了),这个还是硬编码在代码里面的,改不了。不注释掉的话,Docker 启动服务会报错。

然后看报错信息像是端口占用的问题,但我使出浑身解数也没法找出问题是什么,尝试在 WSL 找(包括但不限于普通的端口检查,还有直接检查虚拟文件等),尝试在 Windows 找,甚至看什么保留列表、黑名单等都找不到。而 CPA 关着我也没法让它自己给自己诊断,只能开着尝试让它调查一下,也未果。

不管这些杂事了。所以说我到现在用了多少呢?诶我靠神了,好像数据有有效期?最早的怎么才在 7.2?合着是只保留了一个月嘛,那很遗憾了。

不过我记得六月那会(从 6.6 部署了 CPA 开始计算)应该是用了 2B+,可能是 2~2.5B 左右吧。然后七月这一个月用了 700M,再前面应该加起来也不到 5B,前面的月份不太可能有六月那么多。具体的使用情况就下面聊聊吧。

杂谈

技术性的话题已过,接下来就是随便聊点什么了,想到啥写啥。

谁还没辱骂过 LLM 呢?我自己也骂过许多次。虽然说辱骂 LLM 只会浪费你的 Token、污染上下文,但正如其他时候语言攻击无法解决问题时,一样很多人情绪上头会选择语言攻击,这可能是因为短时间的情绪价值压倒了实用层面的理性价值。

不过在某一次让我抓耳挠腮的对话中,我突然意识到,我尖锐地回应它,因为它没法 get 到我的含义,而我又不想将我的想法一字不差地输出出去,这怎么有点像生活中一些「你猜」的行为呢?于是我好好补全了完整的想法,后面的输出效果被重新校正了,我感觉效果比之前好上不少。

因此我就想尝试一下,不要对 LLM 生气。我会对其他人生气,因为其他人会反抗我的负面情绪,但 LLM 全盘接纳,一拳打在棉花上,也没什么劲。不如就与 LLM 对话的契机,补全一下自己的交流障碍吧,看看如何更好地表达自己的想法。

不要生气其实不仅仅是不要辱骂 LLM,实际上我对 LLM 破口大骂还是比较少的,更多的其实是阴阳怪气,使用各种反问、感叹、讽刺等。我主要是想约束一下这方面,因为上网上多了,对其他人讲话也不免带有了一些刺,甚至跟现实中的人交流的时候竟然也不自觉用了反问,说出口来才察觉到并后悔。于是想要克制一下,先从对 LLM 开始。

今年,甚至就说这学期吧,我的 LLM 使用模式就发生了很多天翻地覆的变化,甚至就是这学期中的波折,感觉就比之前所有加起来还多了。

去年一整年,一直到今年年初其实都是比较稳定的,使用 Gemini + Copilot。令人感慨 Gemini 现在已经路边一条了,想当初我还坚信它会在御三家中登顶,现在看来是只考虑了物理条件,没有考虑人的因素。而 Copilot 在我开学后不久也逐渐收紧,先是取消了高级模型的访问权限,再然后是转向按 Token 计费,虽然中途偶尔有「小径」可供维持,但最终生命也不长久,很快就被封堵。

那段时间的情绪也可以说是比较低落的,毕竟那会 Gemini 也失去了访问途径,Copilot 可以说是我最后的倚仗了,没想到这个也被攫夺。当然不管怎么说,也非常感谢 Copilot 两年半的陪伴与助力了。

然后就是一直到现在的「混乱」时期了,虽然看起来这只是一个时期,但既然说是混乱那就是跟其他的稳定不太一样,因此我体感上这个时期也是变化比较大的。

现在写代码等,要用 Agent 的话用 Codex + GPT 比较多,有时候也会用 Claude Code + Claude;然后问题的话其实是在官网上问 DeepSeek。沉浸式翻译现在其实还在稀里糊涂地用,等到真的结束了,我大概会切 Azure 翻译,需要高质量的再换 DeepSeek;然后要是有要接入 LLM API 的,也会用 DeepSeek。

这个组合其实蛮奇怪的,这是因为我也许是初高中时养成的一种「坏习惯」,即可以牺牲掉其他,使用极低、接近于零的成本,实现对顶级服务的访问。在初高中时的表现就是寻找「学习版」,而在这时候就是寻找「渠道」。

目前的成本其实说接近于零都不对,因为成本可以说就是零。这几个月付过的钱大概就是学期内软工项目接 DeepSeek API 调试用的一点,还有就是上个月沉浸式翻译额度用超结果欠费了,补了几毛钱。而前面 Agent 用的顶级模型成本就是零。想我 Gemini 那会都还是掏了十几块钱买虚拟卡呢。

然而,天上不会掉馅饼,天底下哪有那么好的事情,让你低成本获得好服务呢?质量、成本兼得的情况下需要牺牲什么?答案是稳定性。因此这学期我的 LLM 体验可以说如同在波涛汹涌的大海中翻滚,好的时候富得流油,而更多的时候在各种各样的报错中挣扎,需要付出相当多额外的精力去寻找、维护等。

六月份能用那么多 token,一定程度上是因为出现了一些「狂欢」,在那期间,罕见地出现了质量、成本、稳定性三者兼得的窗口期,我在那时候也曾写下获得了「Token 自由」的感受。如不是有这样的时候,我也没可能彻夜挂着任务在跑。当然,这样的机会转瞬即逝,非常罕见。

而这其实也一定程度上扭曲了我使用 Agent 的方式。

对于一般的 Claude/ChatGPT 订阅用户,由于有时限内额度的限制,自然是要在那段时间将利用价值发挥到极致,充分榨干。而我更多的是在等待活着的渠道的出现时机与任务时机对上的时候再进行活跃,其他时候要么懒散地没有任务无所事事,要么就是无尽的重试。

这其实也算一定程度上降低了我对于新任务的兴趣。狂欢的时候萌生了很多想法并即刻加以实现,而其后很多点子,很快就抛之脑后了。还有很多任务就是,打算继续放着,等更强大的模型出现,再让它来跑,于是就是等了一个又一个的新模型。

实际上我觉得我也未必就负担不起了正经的订阅,这更像是一种「病态的节约」,实际上却将自己更宝贵(?)的时间与精力浪费在这种沉浮当中。因此我也打算等 DeepSeek V4 Pro 正式版出来,以及其 Harness 发布后,将其纳入到我的 Agent 系统中,起码可以作为一个相对稳定的保底保证。顺带真正更高频地使用没有 SOTA 的模型,看看我还能否守住我上面「不要生气」的承诺,当然也许到那时候就对那些 T0 模型祛魅了也说不定。

此外本学期我对 LLM 的感性想法也可以说是反复横跳,时而欣喜其为我做出一些有意思的东西,时而哀怨不知自己存在的意义,时而高兴它为我解答疑惑迷茫,时而悲叹自己如此差劲。因为另一个地方已经用过「割裂」这个词了,我想用另一个词来形容——LLM 更加地「撕裂」我了。

真要说的话,其实这学期的负面感受尤其的多,也许也有相关的学业压力背景的关系在。

以前感叹自己「摆」比较多,还多是自嘲。但现在更多的是认为自己「没用」,真有点存在价值的怀疑了。

诚然,LLM 还不能做很多事情,我也知道在厉害的人身上它才能如虎添翼。因此更应该磨练自己的技能才对。例如说 Tao 可以跟 GPT 对话了解问题的解答,是因为他数学能力强,而那些研究者能用前沿模型解决未解之谜,也是因为他们自己有相关的知识背景。不是随便拉一个人问 GPT,就能解决了什么什么问题,因为它的解答依旧需要人的检验与核查。

……但,我还只是一个初学者。

如果我是一个更成熟更有技能的工程师,我确实可以将 LLM 用于精进自己的技艺,我有自己的品味,可以洞察其中的问题并予以校正。但我还办不到,我现在有的只是,发现让 LLM 根据我输入的要求重新做的架构,碾压了我带有自己灵感与想法、一步步搭建、一度有点小得意的设计的强烈的挫败感。当然,看到一个更优秀的内容的时候我确实在赞叹,确实有所悸动,但对于自己则是深深的失望。

就像一个觉得自己颇有天赋的小孩,为自己在某一方面的一些才能而沾沾自喜,结果去参加了比赛被别人轻松碾压了。纵使他可能有不差的天赋这是事实不假,只是绝非顶尖,或是不够勤奋没有彻底利用,但我想他也可能这辈子对那个爱好提不起什么兴趣了。回想起来,我学习国际象棋的经历,好像也是在参加了唯一一次比赛后的失败而结束。

我失去了对计算机相关内容的热爱了吗?当然没,不然也不会又花好几天写上这长长的一篇了。但这种负反馈正在蔓延、渗透入我的全身心。消极的情绪已经更像是常态,而原本的惊喜感反而成了麻醉。

最后便以某一日的想法收个尾吧。从 8.2 开始写,也是写了三天,一直写到了 8.5 的凌晨,成就这块板在只有单日的情况下成为最大的一块,足足有 3w 字。

2026.7.20

  • 今天再看到 AI 证伪了雅可比猜想的新闻,加上看了各种保研的消息,感觉非常紧迫,然而我现在还是什么都没做准备、不知道要干什么的纯傻状态,甚至连作业都还没写完呢,加上看到 AI 能力之强,又不免产生了自怨自艾的情感,感觉自己毫无能力、价值,未来一片空虚,唉,心情非常糟糕。