期末周真的结束了?
我大二下的最后一门考试在第十六周的周四,然而考完之后迎来的却是更多的事情:
- 互联网应用开发技术这门课的答辩时间是周天下午,我还有一小部分收尾工作需要完善;
- 小学期的软工原做了一个有甲方爸爸的项目,利用大模型开发一个学术本子的辅助写作助手;
- (原)科协准备开发一个科创平台,方便电院(现在缩小到计院了)同学寻找相关赛事,并提供组队和参赛劳动学时申请的功能;
- 报名参加了腾讯开悟的 RL 大赛,训模型操作英雄打王者荣耀;
- 给网络信息中心的一个老师打工,赚点外快;
- 试图做点科研 or 实习(?
这么多开真的吃得消吗
考完试的第一天显然是学不下去的,约了同学打 80 分。周五先解决 chp 的电子书城。周六下午科创网开个组会初步定下大框架,电院拆分后科协划分到各学院的双创部,这个活现在就由计院的双创部负责了,但是部长去杭州实习了,所以本来带前端的我现在主要就去忙后端了,再去叫了另一个同学来带前端。周天答辩的时候还下暴雨了,本来天气已经又闷又热一整周了,偏偏在出门的时候来这么一出。答辩还扣了我书本封面上传的分,因为我偷懒只做了上传图片的 URL,助教说这样用户体验不好。晚上是软工原小组的组会,组长大概讲了下产品愿景和现有的代码仓库,回去的时候又在下暴雨,我顺便把组长载去西区,结果淋得浑身全身衣服都能拧出水了,而且我下午才刚洗完澡。回去之后换一件衣服又得冒雨走路去包图,和科创网开发组的两个同学讨论下。
周末过得牢的没边了
Week 1
软工原?sbj?:yaoming:
软工这专业本身挺好的,写项目做点自己的东西,我觉得乐在其中。但是为什么偏偏课都这么难评呢,课上讲的东西往往对实际的工程没有帮助,还有很多形式化的任务、折磨人的报告。sbj 的软工原真就是最为甚者,因为前几届学长学姐反映大二下软工课业负担实在太重,遂把这门课推到了暑假的小学期,现在好了,小学期每天过得跟上班一样,4 学分的课排了 6 学分的课时,小学期 4 周,除了周三下午都得上课,一三五上午上无聊透顶的理论,还有逆天的报告和作业,剩下的时间都是排了个工位,给大家做小组项目。
第一天下午一到指定教室,也是无语了,为啥不肯多用几个教室呢,一张桌子安排两个小组,真是挤得不行。

sbj 也是不知道去哪里看了个所谓的“立会”,每天下午小组成员都要在助教的监督下站着开十分钟左右的会,感觉好蠢(x
ProPilot
组长给我们的产品取的名字,寓意为 Proposal Copilot,要做成 VSCode 插件和 Office 加载项的形式,组长在水源上开了个帖子来记录开发过程。
第一天我主要也还在熟悉现有代码,我负责的部分是传统的后端部分,和前端兄弟对接 API,处理消息队列、缓存等。组长让我们用 Apifox 来和前端对接 API 格式,不得不说这工具确实好用,集成了文档和测试的功能,界面还是中文的,非常友好(于是我立马把它用到了我们科创网的开发上)。不过由于是第一次用这个工具,还不是很熟悉,遂磕磕绊绊地搞了半天。
一开始我们后端用的框架是 Litestar,一个号称性能极佳的新兴后端框架,我又花了一些时间去读文档和搜资料,然后试着去写了个路由。遇到的第一个 bug 是路由处理函数一直识别不到请求体,研究了半天最后找到的原因竟然是,请求体在函数传参中必须命名为data。第二个遇到的问题是,路由处理函数通过依赖注入的方式和数据库进行会话,但是又老是接不上数据库,那天中午和组长吃饭聊了聊,已经想抛弃 Litestar 转投 Flask 或者 FastAPI 了,下午还在蒸,照着它那写得一坨的文档,终于解决了数据库的问题,其中一个原因又是传参命名问题,必须命名为transaction。第三个问题让我彻底放弃了 Litestar,就是在添加 JWT 认证的时候,它规范里要求的一个函数有一个参数叫ASGIConnection,我翻遍了文档 + 问 AI + 看社区,始终没找到这个变量怎么用、有哪些方法,实在难以解决这个问题,遂放弃。未来可期未来用呗,新框架感觉就是,本身还有一些不成熟的地方,然后 AI 又知之甚少,社区支持也不太完善,我们这种项目还是用些成熟点的框架为好。简单调研了下,最后决定用 FastAPI 了,于是我又花了一个午的时间把现有的代码迁移到了新框架下,不得不说,FastAPI 确实很完善,用起来顺利多了。后面又和前端那边的兄弟对接了下,已经可以从他本机上的 VSCode 插件往服务器上发请求并响应了。
接下来我要做消息队列,组长选用了 Celery。另外还有一个搜图功能,原本用的是 GitHub 的一个开源仓库 VectorVFS,它的处理方式是把嵌入向量直接存在图片元数据的 xattr 字段,但由于它提供的是一个命令行工具,每次调用都需要重新加载模型,频繁使用时就会产生很多无意义的开销,组长让我看看他的源码,看看能不能做成只需要加载一次模型就能重复使用的的方式。后来组长又给了另一个建议,用多模态大模型吧图和嵌入向量一起存进向量数据库里(我们用的是 Milvus),用这种方式来搜,选用的模型是 BAAI 的 BGE-VL-large。
sbj 这课让我们一周写了四五份报告了
SJTUcontest
我们的科创网终于正式开工了!其实本来寒假的时候就要开始做了,但由于当时没什么技术栈,加上一开学又很忙,遂一直拖到了现在。目前主要就是我在负责这个项目的推进,组会的时间定在了每周天下午。这周每天晚上基本都和两个开发组里的同学一起约了图书馆的小组学习室,属于是白天晚上轮轴转了。
我们采取前后端分离的开发方式,后端选用的框架是 Django,配合 REST framework,用 JWT 做鉴权,后期可能还会接入 jAccount 登录,还得按照它的开发者文档做个适配;前端框架用 React,组件库我选了 Material UI,前端这边主要交给了另一个之前一起做信安 CTF oj 前端的同学。
Django 我虽然是第一次用,但它的文档非常的完善,AI 也很懂,所以推进还是挺快的,遇到的好多问题也是一查文档或者一问 AI 就解决了,更何况强大的 Claude Sonnet 4 还能帮忙写大量的代码。后端这边已经有了比较核心的几个接口:登录、拿比赛信息等等。前端那边的同学也在熟悉 React,不过很快也做了个初版的用户界面和比赛列表界面出来。
一些七七八八
先看看这周的 WakaTime 吧:

事实上软工原每天写代码的时间并没有被记录上去,因为是用 VSCode 的 SSH 连接到服务器上编辑的,没法把我的 API key 放上去。其实我想说的是,每天上下午都上课了,还能统计出这么长的时间
但是 mac 忠实地记录了我的使用时间,平均一天 9 小时,而且全是牛马人的软件。有一说一,每天看这么长时间的屏幕眼睛真的难受,连我这么喜欢看电子产品的都感觉,到了晚上不想再继续看屏幕了。
期末周狠狠让我的作息又变规律了起来,小学期又沿用了下来,然而每天睡眠估计只有六七个小时,还没有午睡,这周感觉每天都是超负荷运转,累得不行。
赚外快的工作也准备开始了,先和 xed 联系了那边的老师,看看有没有什么工作可干。RL 的学习那边,学长给我推荐了 CleanRL,一个实现经典 RL 算法的代码仓库,但我也还没有看。双创部的指导老师说,科创网不用那么着急,大家自己的事情优先,开学时能上线就行,而且 jAccount 接口的申请也还在走流程,估计没那么快,我打算下周减少推进科创网的时间,多花点时间在学习 RL 上。
写这篇 blog 的同时我硬逼着自己纠正了打字习惯,由于从小玩电脑习惯 WASD 键位了,导致我打字的时候左手食指一直是放在 D 上的,虽然可以盲打且打字速度还不错,但是手指放的键位实际上是不对的,一直想纠正过来,也是终于落实了,发现并没有想象中的那么难,以前每次想纠正,都因为实际用的时候的需求,导致我还不那么适应时没法满足速度而中道崩殂。
几周前冲动消费,斥巨资买了网易云 7 周年的黑胶 SVIP 实体卡片,但是卡片最近才到,而我为了听歌已经先续了一年 VIP 了,遂决定到明年到期的时候再激活卡片,太持家了哈哈哈。

某天下午去上课的时候,发现一只鸟正好从户外飞进了教学楼,然后停在了地板上,小鸟你对插座感兴趣嘛(雾

Week 2
Monday
昨晚又熬夜刷手机了,三点才睡,早上又是早十,总共就睡了五个多小时,吃晚饭的时候真是累得不行了。
今天 ProPilot 这边主要熟悉了下消息队列,组长选用的是 Celery + Redis 的方案。还有下午的第一次迭代答辩,本来组长下午有面试和助教约了晚上了,但是后来他又赶回来了,遂照常解决。下午在 Celery 文档里看到了个很好笑的:

赚外快的事今天也大概敲定了,做一个高考题库建设,提供 AI 支持,可以通过学科筛选、知识点筛选等等,还能够在输入某道题型时返回 top-k 个相似题目,有一笔不菲的酬金。老师说作为自招题库是一方面的应用价值,另一方面她更关心的是技术层面的 deep research,后续也可看情况评估酬劳。
早上 sbj 的课上给科创网写了个用户注册的接口,方便在测试的时候使用,后续部署的时候再把这个接口关掉。晚上准备先不急着推进科创网了,毕竟明天就是赛事官方指定的学习期开始了,先看看学长推荐的 CleanRL 吧。
Tuesday
今天试着写了个消息队列的任务,下午遇到了点问题,和同组的同学 debug 了半天,消息队列试着写了一个任务,但是出了点问题,任务卡在调用时的状态了,并没有真的去执行,仍在调试中(doge
sbj 今天又要我们写新报告了hhh
爸妈和弟弟出来自驾游了,准备一路玩过来,然后我周末去苏州和他们玩两天。
Wednesday
昨晚睡前翻了下 Celery 的文档,在早上 sbj 的课上把消息队列不工作的问题解决了,原因是 Celery 的 worker 进程需要另外启动,否则任务就会一直滞留在队列里。另外想简化下 Celery 任务的传参问题,看看能不能也用 Pydantic 模型传参,AI 毕竟是训练出来的,信息多少还是有点滞后了,它告诉我不行,但是我在 Celery 的仓库里看到有人提的一个 issue,就是希望它能支持 Pydantic,已经处于 closed 状态了,又去看了看文档,发现在 Celery 5.5.0 起开始支持这一特性了,就是在调用delay()的时候需要对传入的 Pydantic 模型调用model_dump()方法,简单写了个测试,发现是可以用的。早上和模型测的同学这边对接还是有点问题,她自己跑的测试是没有问题,但是在消息队列里调用的用户上传文档的处理却会报错,但由于 FastAPI 和 Celery 都是在我这的终端跑的,她看不到 log,目前该问题仍是待解决状态。另外还有两个相对不那么要紧的问题,一个是独立启动后端 web 服务进程和任务队列的 worker 进程都会重新加载一次模型,是个挺耗时的操作;另一个是我们的 Celery 采用 Redis 做 broker,SQLite 做 backend,但是不知道为啥,每次启动 worker 进程时连接到 Redis 都用了相当长的时间。
下午和 xed 在宿舍里爽玩双影奇境了,也是挺久没一次性打这么久游戏了,目前进度推到了放出来那只巨大的鱿鱼。每次玩都在感慨,不愧是双人成行制作组的二作,各种构思、创意都十分精妙,难度也适中,而且和双人成行也不会很同质化。
晚上 init 了一下 AI 命题项目的仓库,准备用 uv 来管理环境和依赖。有种感觉是,程序员们越来越热衷于速度快、轻量化的解决方案。操作系统有 Arch Linux 神教;IDE 方面 JetBrains 系出了那张整活图(讽刺 IDEA 代码分析超级久的),更何况还有超大的内存占用,VSCode 现在是通吃了,特别是现在又有了 AI,JetBrains 是每况愈下,也在开发自己的轻量级 editor 了;Python 传统的 Anaconda 也在被吐槽太重且依赖解析巨慢,才出来没多久的 uv 迅速走红了;前端也基本从 webpack 转到了 Vite,前者我甚至已经没用过了;甚至编程语言,Rust 最近不也凭借着超高的性能而特别流行,前一阵子还看到 Ubuntu 25.04 用 Rust 重写了 sudo;至于硬件,我相信 Type-C 会一统天下的(doge
Thursday
和模型测的同学对接了一下补全功能的服务,中间遇到的一点小问题也大概解决了,不过还没测试接口的可用性。sbj 又让我们写什么文档,还是照旧让 AI 直接生成了一手。下午服务器有其它人在上面跑模型,同时我们也在训一个模型,直接把显存占满了,导致小模型也没法加载,后端服务自然是启动不了了,于是小小摸鱼了一波(
AI 命题的项目那边,写了个简单的用户登录注册功能,接下来准备接 MinerU 的服务。负责的老师又给我们推了另一个简单的项目,AI 生成教材,说是比较简单,准备一周之内弄完。
和科创网开发组的另一个后端同学把队伍表做了一下,和前端同学试了下接口,晚上回去又给前端做了个简单的登录页、重构了下路由,然后用 Axios 封装了一个 API 请求器,实现了一些基础的前端请求服务,大部分是 Claude 帮忙写的。
老妈叫我给他们三个预约下入校,如果他们先到了但我还没下课他们就先自己在学校里逛逛。
实际上,由于忙到了一点多,第二天又有早八,我是在第二天中午补记的
Friday
早上又是无聊透顶的 sbj 的课,但是昨晚整个软院都停电了,服务器早上才重启,然后连接似乎也不是很稳定,遂大部分时间都在摸鱼(主要是重新去看了下 FastAPI 的文档),重写了一个搜索引擎前缀补全的判断逻辑。
中午吃饭的时候看了组长在他自己的生活帖里分享的视频《流量时代,学新闻还有意义吗?—聊聊新闻业的现实和理想》,关于理想,或许不只是新闻业吧。我很喜欢视频里面引用的尤瓦尔·赫拉利在《人类简史》里的一句话:
智人这个物种之所以能取得如此巨大的成就,是因为智人会相信虚无的东西,并且会为了心中哪些虚无,牺牲现实的利益。
下午把 ProPilot 的补全功能跑通了,写了下文本总结功能的 prompt,但是由于另一个同学在训模型,显存被占满了,很多都还没测。
下课的时候爸妈到了,带他们去吃佬肥猫,然后驱车前往苏州玩两天,周天下午还得赶回去开组会。
Weekend
周六上午去了拙政园,中国四大园林之一,很有江南水乡的韵味,游客倒也没有特别特别多,不过就是特别热。回来后翻了翻相册,感觉没有拍到啥特别满意的照片。中国四大园林苏州占了两个,另一个是留园,以前还是盛宣怀的宅子呢。
中午老妈说要先去逛寒山寺再回酒店,遂打车前去,然后坐船,再进去寒山寺里游览,这是个很大的寺庙,而且还结合了苏州园林的一些风格。
姑苏城外寒山寺,夜半钟声到客船。
下午在酒店午休了一会,傍晚出发去东方之门,苏州的标志性建筑,坐电梯上楼试图去一家餐厅,结果门口在排长队,而由于上下楼的人多,电梯每次都要等很久,电梯里人站的不均匀也会触发超重警报。出来后,就往金鸡湖边走,想等着看音乐喷泉。

老妈在网上看到金鸡湖有免费游船坐,于是我们去排队取票,不过只剩九点半的了。晚上就在金鸡湖边找了一家苏帮菜餐馆,吃了特色的松鼠鱼。吃完就等着坐船了,还别说,虽然是免费的游船,但也还不错,从湖的一岸开到另一岸的码头,远远看东方之门,再加上晚上亮灯,显得十分 modern。

我觉得苏州这个金鸡湖倒是和杭州西湖有很多相似之处,湖的夜景都很不错(甚至有不少雷同),湖畔都很能彰显所在城市的繁华,不知道是不是我的错觉,总感觉金鸡湖似乎比西湖还要大些。
周庄古镇本来是周天上午的一个候选项的,而且返回上海正好也顺路,但我觉得以前去过乌镇了,这两者估计也差不多,于是我们就在酒店睡到了自然醒,然后开车回上海。返程比去程导航预计的时间整整少了半小时,我一开始还奇怪,结果一上高速发现,确实没什么车,开得很顺利,周五晚上估计是很多在上海工作的人下班回苏州,于是路上很堵。到学校边上,中午带他们去吃了鲜烫牛肉粉,下午还有一个组会要开,晚上去吃了玉兰苑二楼的一品茶餐厅。
Week 3
restarting…
由于周末都在玩,回来有不少事要做,不过周末弄了下 MinerU API 的调用,给后面题库上传浅浅准备下。周一下午由于组长有事,我们软工原的各自负责的部分又都遇到了一点问题,导致进度没怎么推得动。
晚上 fdy 约看电影,说最近的《F1:狂飙飞车》风评很好,我们去龙湖天街吃了烤鱼,然后看了这部电影。我以前没怎么接触过赛车类相关的东西,这次看这部电影,感觉也十分不错。
组长下午忙完回来,把 ProPilot 的前缀补全的一些逻辑修了下,评估测试也跑通了。
周二一天倒是把 ProPilot 推了不少,属于是前期积累现在都能用上了,补全、总结、润色、上传图片、搜图等等都能用了,和前端的对接也基本处理好了。下午立会助教告诉我们这周不幸被 sbj 抽到亲自答辩。xswl,助教也是直接管 sbj 叫沈阿姨
周二晚和 xed 把 AI 生成教材的 dirty work 给搞完,然后研究了下 docsify 的部署,把整本电子书部署在老师给的一台服务器上了。
周二熬得有点晚,周三早八直接睡过头了,也是人麻了,sbj 这课我就没翘过,之前都没签到,偏等我第一次翘课的时候来了一手签到。
accelerating…
周五被 sbj 抽到答辩了,和前端把现有的所有功能都对齐跑通了。本地部署的模型是个 7B 的小模型,逻辑能力实在是过于低下了,连输出都没法按照 prompt 的要求,于是组长说答辩的时候先用 Qwen-Plus 的 API,换过来重新测一下发现效果显著提升了,AI 不愧是个比谁砸钱多的领域啊(doge,硬件限制是真不行。后面组长又让我去对比一下 Qwen 的几个不同参数量的模型,看看极限在哪,我测出来的结论是无论是 Qwen3 还是 Qwen2.5,最小都不能低于 14B,要不连最基本的输出逻辑都没法保证。组长后面又试着在本地跑了个 INT4 量化的 Qwen3-30B-A3B,一开始不知道怎么回事输出了个两万多字的文本,后来把重复惩罚调高了之后,模型直接疯了:

现在搜图用的嵌入模型是 Visualized-BGE,答辩前和前端同学在测图片上传和搜图:

答辩现场,两台电脑分别连着服务器的终端跑着 FastAPI 的 uvicorn 服务器和 Celery 的工作进程:

科创网也推了不少进度,现有的 API 都发布在了 Apifox 自动生成的文档站上,现在已经有 18 个 API 啦!花一晚上解决了一个麻烦点:连接 jAccount 登录的接口,看了好久的文档又调试了好久才弄好。SJTU Developers 上给的文档似乎是基于传统的前后端不分离的模式介绍的,以至于在我们这种前后端分离的项目上,我不得不进行一些魔改,最后做出来的登录流程是:
- 用户在前端点击 jAccount 登录按钮,前端向后端发请求,获取 jAccount 登录授权 URL,前端跳转到该 URL 上;
- 用户完成 jAccount 登录后,跳转至前端的回调页面,进入该页面时前端会立即从路径查询参数中读出 code,并把该 code 发至后端;
- 后端把 code 发送至 jAccount 登录认证服务器,换取用户信息,判断该用户是否已在数据库中,若无,则自动创建;
- 后端向前端返回第二步中请求的响应,包括 JWT 和用户信息。
中间还遇到了一点 bug,特别是第三步的时候,一直报错,打印了认证服务器发来的响应体之后才搞明白,不同 scope 获取用户信息的方式还不尽相同:
- 如果 scope 是 openid,那么响应体会有一个
id_token字段,这是一个 JWT,直接 decode 就能拿到用户信息; - 如果 scope 是 basic 或 essential,那么响应体将不会有这个字段,需要用响应体中的
access_token字段再往指定 API 发请求才能获取用户信息。
离谱的是,basic 和 essential 不仅仅是根据权限不同返回更多的字段,而是整个数据结构都完全不一样,我测试用的是 essential 的,文档里直接没写响应体长什么样,又让我困惑了一阵子。我干脆直接在代码里写了不同情况的处理,这样到时候拿到的不管是 basic 还是 openid,都不会出问题。

AI 命题那块,简单调研了下,写了个初步的设计思路:

数据库打算用 PostgreSQL,有一个 pgvector 插件,能够让它支持向量相似度搜索,默认采用最精确的最近邻搜索,同时也可以选择 HNSW、IVFFlat 两种索引,可以根据实际情况选用,这样就不需要一个额外的向量数据库了。在代码仓库里写了一些简单的测试和上传文件并保存在本地的路由,让 AI 参考高中课程标准生成了一份知识点层级列表,并简单修改了下,准备直接用了。
老师看了我的方案后说,MaxKB 用的也是这一套,还把官网的架构文档发来了,我一看发现还真差不多,笑死了,那我是不是能去当软件架构师了(bushi
take a rest?
每个项目都多少有点眉目了,整体感觉还是蛮良好的。这周又是高强度的一周,但是感觉还欠了很多事没做。
比较着急的一项是,腾讯开悟的 RL 赛是一点还没开始准备,本来想周末都搞这块的,结果周末一开始实在是想休息了(x
上海最近的天气非常古怪,生动反映了小时候作文里写的那句“天气就像小孩的脸,说变就变”,可以一会突然下大暴雨,然后没几分钟又停了,还经常下太阳雨,晴空万里但是雨特别大,让人摸不准啥时候好出门。
最近想明白了一件事:赚钱和理想就应该分得清楚一点,除非家里有矿,否则靠自己的人生追求就获得可观的收入根本就不可能。二八定律最有用的一集,只用 20% 的精力去换取自己 80% 的收入,这一部分就尽可能快地完成任务就好了,不必纠结和自己的价值观是否相符(甚至不必纠结完成得是否完美);然后用剩下 80% 的精力去换取剩下那 20% 的收入,虽然这样说看起来很抽象,但我想表达的意思是,这一部分应该是自己的人生追求和理想,尽管相对来说可能没有那么高的经济效益,但是为了雕琢生命中某些精致的东西,我想这是值得的。
Week 4
终于到小学期最后一周了吗
周一 ProPilot 又有大进展了,写了一个接口,支持前端查询任务(上传文献、图片)进度,本来想用 WebSocket 的,组长说先用简单点的跑通了再说,其实似乎用上 WebSocket 似乎也不太有很好的解决方案,理想的效果应该是,Celery 的 worker 进程中某个任务每次状态更新时,都能触发一个回调函数,这时候利用 WebSocket 往前端发消息,然而我看了下 Celery 的文档,它似乎只提供了在任务结束时的回调函数(也可能是我文档看的不够仔细),这样即是后端用上了 WebSocket,无非也就是把前端的持续轮询搬到了后端,减少一些网络传输的开销,但还要多维护一个任务 ID 数组。或许还有一个方案是,增加一个消息队列,专门用来消费任务状态更新的消息,不过这个等后面再优化吧。我还用 AI 给项目生成了一份 README。组长今天找到了一个效果很不错的小模型,FP8 量化的 24B 的 Mistral,输出可以说是很令人满意了,而且也不会像之前的 Qwen 那样发疯了。前端那边的 Word 加载项问题,微软似乎为了什么所谓的安全考虑,会拦截从 Word 往外发送的 HTTP 请求,甚至在开发时都不允许,上周尝试了自签证书使用 HTTPS,结果 Word 直接以不安全的证书为由也拒绝了连接,无奈之下这周联系甲方,没想到博士学长竟然直接给了一个 se.sjtu.edu.cn 的子域名,同时也是可信证书,那明天可以试着解决这个问题了。
晚上把科创网 jAccount 登出的处理也做了,感觉后端算是基本完工了,上周末组会学长说可以写点测试,具体就照我们软工原里讲的来。但我从没听过软工原是怎么讲的啊
刷知乎看到了一张梗图,之前也看到过就是了,不过还是忍不住想放上来,太好笑了。

微信出了一个很离谱的 bug,具体如下:

这个漏洞只会在安卓系统上生效,Windows、macOS 和 iOS 都会原样显示这个 a 标签,微信似乎做了一个临时的应对方案,就是用户在粘贴到发送框时会自动加个空格,不过手动把空格删了就又会触发了。已经有 B 站 UP 做了一期视频来讲解其中的原理,似乎就是个很基础的注入式攻击,这不是程序员偷懒吗(doge
晚上吃饭的时候组长开玩笑说我最近写了这么多 FastAPI,可以成 FastAPI 领域大神了,笑死,最近真是,两个项目都在用 FastAPI,我估计它官网文档的每个字我都看过一遍了。
又上压力了
周二早上把 SSL 证书配到了我们的开发服务器上,博士学长那边把所有都配置好了,我们几乎啥也不用配,把他发来的证书配进去就行。我感觉他应该是用了某种类似 nginx 的方式(虽然我对 nginx 也不是很了解),把接收到的 HTTPS 请求转为 HTTP 发到本地的对应端口上,不过这都只是我的猜测,反正现在能在域名+对应的端口上访问我们的后端服务器了!我用 Claude 写了个蛮好看的主页,我说 Claude 怎么这么喜欢渐变紫的背景色,上次让它给我写个简陋的登录界面也是完全一样的背景。
有了 HTTPS,下午就和前端对上了 Word 加载项的接口,我们两个看到弹出“登录成功”的时候,都惊喜地叫了起来,同组的另外一个同学说吓了一跳(谁让之前搞了半天都是 Network Error 呢)。下午还把补全功能也丢进任务队列里了,提供了查询任务状态和取消任务的 API,现在返回的结构体直接套了一层又一层hhh
几个人同时在服务器上协作实在是容易弄出各种奇葩的事,我清理了半天的api/目录,刚提交到 Git 缓存,准备 commit 的时候,突然显示全没了,原来是组长同时在提交 README 的修改,我git add和git commit中间就隔了几秒钟,结果刚好就被一起提交上去了,组长又重新打了个--amend。由于我们都在一个机子上写代码,压根就没有及时提交,以至于项目结构简直就是一坨,今天也是弄得勉强能看了,但是git log属于是完全无有效信息了,最搞笑的两条:feat: api BREAKING change.和feat: a huge checkpoint.。
今天下午临下课的时候,组长用 uv 删了个包,结果不知道咋回事 uv 把一大堆包全删了(没搞懂 uv 到底是咋解析依赖的,我之间在装一个包的时候也一堆包都被自动删掉了),于是我们的环境直接全没了,于是组长不得不重新把所有包都装上(真成配环境大神了),于是我们的开发不得不暂停一下。幸运的是,由于我为了避免和前端测试的冲突,前端那边开着 HTTPS 的服务器一直没关掉,还能正常运行,我在另一个端口上开的热重载的开发服务器虽然寄了,但不影响前端测试(当然是测不需要 Celery 的那部分,需要 Celery 的任务也只能 pending 了),这何尝不是一种开发环境和生产环境呢(笑
晚上把我的 win 本也带出去了,试图配下腾讯开悟 RL 赛的开发环境,一开始选了它那个 CPU + GPU 的选项的,结果进度条在那边卡了半天不动,我以为是显卡驱动的问题,遂把 Game Ready 卸了装了 Studio 驱动,结果还是没解决,于是又去升级了一波 Docker,重启电脑直接打不开了,断断续续按了半小时电源键才打开,结果 Docker 炸了,PowerShell 里wsl -l -v --all一看发现 Docker 一直卡在 Uninstalling 状态,遂参照 AI 给的暴力注销法wsl --unregister docker-desktop才整好。一看开发平台文档才知道,这里的 GPU 选项只是在测试代码正确性的时候启用 GPU,而测试代码正确性的时候只会跑一轮强化学习,感觉没什么差,搞了半天都快十点了,遂直接回宿舍,回宿舍重新用纯 CPU 开了下瞬间就好了。
晚上 AI 命题那边的老师又说要赶进度了,可能要放到教育部的平台上去,我直接一整个无语,真就提前当上互联网牛马了,小学期每天从早忙到晚,现在终于快结束了,结果又同时比赛+项目两座大山,真是太有生活了。
阶段性的空虚感
周三上午又睡过早八了,遂不去。Milvus 的连接突然出问题了,组长叫我修一下,但是下午又在摸鱼,然后 xed 突然和我说想去 KTV,于是我们直接工作日晚上跑去 K 歌,我说学软件工程最后都会学疯的有没有懂的。他中途得知了他妹下周生日的消息,遂立即购买了周六的车票回家,不得不只剩我一个人在学校了。
周四早上开始修 Milvus 连接的问题,但是当时这个模块并不是我实现的,我有点无从下手,只好把报错发给 Claude 大神,结果真没想到他竟然真从这八千多行里定位到了问题,原因是某个函数的return写在if里了,结果直接导致了一些情况下返回空对象。下午用 FastAPI 提供的TestClient类把路由层的测试写了。晚上加了个班确保明天答辩全流程不出问题,结果没想到又出了两个问题,一个是之前效果最好的搜图突然搜不到了,后来发现原因是测试的时候把user_uploads/目录下的文件全删了,但 Milvus 里并没有删对应的记录,而 Milvus 里存的又是文件的哈希值和存储目录,导致前端即便重新上传了新文件,在搜索时却被哈希值相同但已经被删掉文件的记录给顶掉了;另一个是 Celery 突然间歇性罢工了,有些发过去的任务却没出现任何的执行 log,我们几乎一整晚都在找这个 bug 出在哪,组长一开始看到了个在for循环里写的try-except块还用了continue,说这样有可能导致某些问题,于是把这里给修了,但是 bug 似乎还是没有解决,最后临近要走的时候才发现,我们在两台电脑连到服务器的终端上同时开了两个 Celery 的 worker 进程,导致它们之间互相抢工作了emmm
周五答辩完和组长一起去了 rr 实验室找甲方博士学长展示了一下项目,结果发现这个插件在 Windows 上似乎有点问题,于是就用我的 Mac 来展示了,学长指出了很多还需要完善的地方,我还顺便看到了他们实验室在做的一个项目,真的好牛。组长又去水源上开了个帖子,拉人来一起完善我们的项目,同时我们下学期 rr 的课也可以接着做这个。晚上把 xed 拉来想把双影奇境最后的部分给通了,但是他明早还要赶动车,最后还是没打完。后面下了个王者又熬夜和 lzy 打,好久没玩这游戏了。
每次一件大事告一段落总有种莫名的空虚感,说不上是放松还是紧张,总是觉得做得还不够好,再加上其实并没有真正的忙完,接下来的日子还要继续多开,想想真的挺累的。
周六晚给自己写了第一版的简历,参考了高天的 EECSResume 和 SnailClimb 的 JavaGuide,模板来自 resume,commit message 写了 “resume v1 (2025-07-20)“,完工后看了看虽然没有什么很出色的东西,但好像也不算太烂(?