<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[喵内]]></title><description><![CDATA[楼外的蒹葭、傍晚的月亮和鸡鸣寺的樱花。]]></description><link>https://blog.caiths.com</link><image><url>https://pic.imgdb.cn/item/653e1b74c458853aef64d366.jpg</url><title>喵内</title><link>https://blog.caiths.com</link></image><generator>Yohaku (https://github.com/Innei/Yohaku)</generator><lastBuildDate>Wed, 04 Nov 2026 19:00:14 GMT</lastBuildDate><atom:link href="https://blog.caiths.com/feed" rel="self" type="application/rss+xml"/><pubDate>Wed, 04 Nov 2026 19:00:14 GMT</pubDate><language><![CDATA[zh-CN]]></language><item><title><![CDATA[阅读室里的几个小地方]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/projects/reader-app-details">https://blog.caiths.com/posts/projects/reader-app-details</a></blockquote><div><p>在手机上搜“回南天”，跳出来的第一条是一篇三千字的长文摘要，我想找的那篇两百字的手记，排在第七。</p><p>那是十月下旬的一个晚上，下班回到住处，我没像往常那样去折腾网页端，而是打开 Xcode，对着 iOS 模拟器收拾起了博客的配套阅读器：<a href="https://github.com/poboll/miao-reader"><code>poboll/miao-reader</code></a>。</p><p>给自己的博客单独写一个原生 SwiftUI 客户端，本来就有点自娱自乐的奢侈。既然是给我自己和几个常来的朋友准备的掌上阅读室，我便不想往里塞什么社交动态或弹窗卡片，只盼着它像一间收拾得干干净净的小书房：进门光线柔和，找旧文章顺手，累了还能靠在椅背上听它念两段。</p><p>为了这几个“顺手”，那几天晚上我连着改了三个小地方。</p><h2 id="">搜索框</h2><p>原来的搜索栏是个不分青红皂白的大漏斗。敲进一个关键词，不管是长篇博文（<code>post</code>）、几百字的手记（<code>note</code>），还是随手发的一句碎碎念，全都一股脑挤在同一张列表里。在手机上找半年前的一篇手记，得先划过一大片长文摘要。</p><p>那天夜里我把搜索逻辑拆开重新理了一遍（<code>ef7b387</code>）：把筛选维度跟当前所在的栏目联动，给博文、手记和思考各自划定检索范围。改完在模拟器里切了几下标签，结果一下子清爽了。找长文去长文的书架，翻日常去手记的抽屉，各有各的归宿。</p><p>再搜“回南天”，那篇两百字的手记稳稳排在第一位。</p><h2 id="">颜色</h2><p>收拾完搜索，我又跟颜色较上了劲。</p><p>网页端和 App 放在一起看，最让我别扭的是深浅色总差着一口气。网页端在 Shiroi 主题里调了很久的暖白纸张底色和深色夜间背景，到了 iOS 原生控件上，总显得生硬冷冽。</p><p>我干脆打开主站的 <code>packages/design-system/src/tokens.css</code>，对着里面的色值变量一行行比对，把日间和夜间的配色令牌原样搬进了 <code>miao-reader</code> 的主题管理（<code>3c4996f</code>）。模拟器切到深色模式的那一下，熟悉的温润暗调在小屏幕上铺开，掌心里的方寸屏幕终于和电脑浏览器里的那个世界对上了。</p><p>（比对色值这件事本身极其枯燥，我中途至少走神去刷了两次手机。）</p><h2 id="">朗读</h2><p>最后一个改动让我折腾到了凌晨：给文章详情页加一个语音朗读（TTS）的入口（<code>293c42c</code>）。</p><p>有时候盯了一整天屏幕，晚上洗漱完躺在床上，眼睛酸涩得不想再对焦任何一行小字，可脑子又想随便翻两篇旧文听个响。我用 Swift 原生的语音合成接口封装了一个轻巧的 <code>TTSManager</code>，把朗读按钮放在文章底栏最顺手的位置。</p><p>第一次试的时候，它把一段代码块里的花括号和反引号一个个念了出来，听得我在床上笑出了声。于是我又在把正文喂给语音引擎之前加了一层纯文本清洗，把代码块、链接符号和 Markdown 标记都先剥干净。</p><p>写完最后一行，我把手机连上调试，点开一篇以前写的随笔，按下那个小小的播放图标。安静的房间里响起平稳的朗读声，系统自带的嗓音还带着一点机械质地，念到某个长句时停顿的位置也不太对。我闭上眼听了一会儿，听自己过去写下的字句一句句从耳边过去，心里很踏实。</p><hr/><p>这三次提交加起来，没有什么惊天动地的架构重构，也没有值得大书特书的复杂算法。只是一些每天真正打开它的人才会留意的小角落：搜索更听话了，夜里的颜色更顺眼了，累的时候可以不看，只听。</p><p>那天我是听着它睡着的，第二天早上醒来，手机还停在那篇文章的最后一段。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/projects/reader-app-details#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/projects/reader-app-details</link><guid isPermaLink="true">https://blog.caiths.com/posts/projects/reader-app-details</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Fri, 30 Oct 2026 13:30:25 GMT</pubDate></item><item><title><![CDATA[照片有了单独的页面]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/tech/photo-standalone-page">https://blog.caiths.com/posts/tech/photo-standalone-page</a></blockquote><div><p>语雀小记里有一行字，是六月中旬某个傍晚敲下的：想给平时拍的照片起个名字，单独搭一个像画廊一样的页面。</p><p>后面跟着五个字：“今日未完成”。</p><p>那会儿手头正忙着别的项目收尾，写完这行我就合上了电脑。这五个字一搁，就搁到了十月底。</p><p>照片在我这儿一直有点委屈。出门散步撞见一片好看的晚霞，路上偶遇一角屋檐，深夜书桌上一盏暖黄的灯，按快门那一刻心里都是满的。可回到电脑前打开博客后台，对着空白的 Markdown 编辑器，又常常犯起难来：为了一两张照片，很难立刻凑出一篇两千字的长文；不写，这些定格下来的瞬间就只能沉在相册底下，被新的截图和杂七杂八的东西一点点盖住。</p><p>（我手机相册里截图和照片的比例，大概是三比一。）</p><p>照片和文字本来就是两种截然不同的呼吸节奏。文字要铺垫、要有逻辑，把前因后果娓娓道来；而一张照片往往只需要一秒钟的对视——光影落在墙面上的纹理、空气里的湿度、按快门时的心情，全都已经在画面里了。硬给每张照片都绑上一篇长文，不仅累了写字的人，也委屈了那些本该轻盈安放的瞬间。</p><p>十月下旬终于腾出手，我决定把六月欠下的这笔账补上。</p><p>这回没再去折腾繁琐的自定义图床后台，而是基于开源的 <a href="https://github.com/Afilmory/afilmory"><code>Afilmory</code></a>（<a href="https://github.com/poboll/afilmory"><code>poboll/afilmory</code></a>）搭了一座独立的小暗房，绑上单独的子域名：<a href="https://gallery.caiths.com">gallery.caiths.com</a>。</p><p>部署跑通的那个晚上，我花了整整两个小时，像整理旧抽屉一样，把散在各处的照片一张张挑出来，重新走了一遍构建流程。挑的时候比想象中难，有几张当时觉得很好，现在看糊得厉害；也有几张随手按的，放大以后反而舍不得删。</p><p>当浏览器里第一次刷出完整的瀑布流网格时，五十四张照片整整齐齐铺在深色背景上，每一张都保留着清晰的拍摄参数与时间印记。我滚着鼠标往下翻，翻到一张去年冬天在新疆拍的雪，停了好一会儿。</p><p>独立站点搭好，还得让人找得到门。我在主博客（<a href="https://github.com/poboll/shiroi"><code>poboll/shiroi</code></a>）的首页和导航栏“更多”菜单里，为这间「照片廊」留出了入口，又把它的地址加进了站点地图。这样不管是偶尔路过的访客，还是深夜回来翻旧账的我自己，顺着导航轻轻一点，就能从密密麻麻的文字和代码世界里抽身，走进另一间只属于光影的安静展厅。</p><p>改完这些，我回到语雀，在六月那行“今日未完成”后面补了三个字：</p><p>“十月底。”</p><p>看着这桩拖了几个月的小心愿终于画上句号，我忽然觉得，维护一个个人博客最迷人的地方或许正在于此：它就像一间永远在缓慢生长的屋子。今天添一把椅子，明天开一扇天窗，有些念头哪怕在备忘录里睡了整整一个夏天，只要心里的那点偏爱和兴致还在，就总有在某个秋夜里推门见光的一天。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/tech/photo-standalone-page#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/tech/photo-standalone-page</link><guid isPermaLink="true">https://blog.caiths.com/posts/tech/photo-standalone-page</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Thu, 29 Oct 2026 13:30:18 GMT</pubDate></item><item><title><![CDATA[八月笔记里的机器鸭子]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/tech/notebook-machine-duck">https://blog.caiths.com/posts/tech/notebook-machine-duck</a></blockquote><div><p>一只黄色的小鸭子，从屏幕左边一扭一扭地走到右边，在桌沿停住，歪了一下脑袋。</p><p>八月中旬的一个深夜，我本来只是窝在椅子里漫无目的地刷外网的硬件社区，手指划到这段视频时停住了，然后又倒回去看了三遍。</p><p>它叫 <code>Microduck</code>（<a href="https://duck.fandcode.com/">duck.fandcode.com</a>），是 Pollen Robotics 和开源社区一起折腾出来的微型双足机器鸭，那阵子在外网的硬件圈子里火得一塌糊涂。二十来厘米高，圆滚滚的脑袋底下踩着两只扁平的脚掌，走起路来笨手笨脚的，笨拙里又透着一股说不清的机灵。从大学起就没少跟舵机、开发板和 3D 打印机打交道的我，几乎是条件反射地冒出一个念头：我也想在书桌上养一只。</p><p>可惜它只在外网社区里流转，国内买不到现成的整机。想领一只回家，只能顺着开源图纸和物料清单，从零开始自己攒。</p><h2 id="8--13-">8 月 13 日：轮滑鞋</h2><p>那天晚上我在备忘录里新建了一页，像模像样地写下标题，开始盘算这只小鸭子的“落户计划”。</p><p>第一个跳出来的念头，居然不是它的步态怎么调，而是给它加点好玩的改装配件。看它踩着小碎步的样子，我突发奇想：要是用 3D 打印机给它打一双迷你轮滑鞋套在脚掌上，让它在书桌的木纹上滑过去，该有多滑稽。念头一钻进脑子就收不住了。一颗真螺丝都还没摸到，我已经在笔记里写下“做一点小配件，3D 打印出来轮滑鞋”，顺带还琢磨起要不要把从零件采购到组装踩坑的过程拍下来，剪成几期连载视频。</p><p>后半页就彻底成了一场发散的头脑风暴。我对着项目页面估算这一整套要花多少钱：全身十几颗串行总线舵机、主控板、传感器、电池，再加上 3D 打印耗材，还有大概率要交的“学费”。算着算着思维又飘远了：国内像我这样眼馋又买不到现成套件的人应该不少吧，要是把走通的 DIY 流程整理成更容易上手的教程甚至配件包，好像也挺有意思？</p><p>（现在翻回去看那页上的数字，与其说是严谨的物料核算，不如说是一个深夜上头的工科生对着屏幕画的一张草图。）</p><h2 id="8--16-">8 月 16 日：仓库</h2><p>真正让我冷静下来的，是三天后的那个周末。</p><p>我老老实实打开 GitHub，把 <a href="https://github.com/pollen-robotics/microduck_rl"><code>pollen-robotics/microduck_rl</code></a> 克隆到本地。比起备忘录里天马行空的轮滑鞋，代码仓库的目录结构诚实得多，也冷静得多。这是一个基于 MuJoCo 物理引擎和强化学习的训练仓库，一只双足机器鸭从“三维模型”到“能站稳走两步”中间的每道工序，都明明白白摊在那儿：导出机器人的 URDF 和 XML 描述文件，配置强化学习的奖励函数与观测空间，在仿真环境里摔倒、爬起、再摔倒成千上万次以收敛策略，最后把训练好的 ONNX 权重部署到实机上做 Sim-to-Real 的迁移。</p><p>我盯着终端里那些环境依赖和仿真配置看了很久。滚轮往下滑，划过一排排关节限位参数和控制频率设置，前几天那种“买齐零件、拧紧螺丝就能走”的轻快想象，像肥皂泡一样，悄没声儿地破了。原来视频里那几秒憨态可掬的摇摆后面，压着这么多控制理论、机械公差与强化学习调参的硬骨头。</p><p>那天关掉终端，我没急着去下单那一堆舵机，也没把那页写满奇思妙想的笔记删掉。</p><h2 id="">先放在八月</h2><p>我一直有点隐隐的执念，觉得只有从第一颗螺丝拧到最后一行代码、风风光光跑通的项目，才配写进博客。可翻着这页停在八月中旬的笔记，我又觉得这一段也挺值得留下的：在深夜被一个新奇玩具点燃，兴冲冲写下一堆改装点子，三天后翻完源码，才看清它真正的工程份量。折腾的日子里，这样的时刻其实比顺利跑通的时刻多得多。</p><p>那只还没被 3D 打印出来的机器鸭子，连同它那双只存在于备忘录里的轮滑鞋，就先安安静静在八月的笔记里待着吧。等手头的事告一段落，书桌腾出一块空地，热床重新升温的时候，我们再见。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/tech/notebook-machine-duck#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/tech/notebook-machine-duck</link><guid isPermaLink="true">https://blog.caiths.com/posts/tech/notebook-machine-duck</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Wed, 28 Oct 2026 13:30:11 GMT</pubDate></item><item><title><![CDATA[我想给自己买一张看世界的门票]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/thoughts/ticket-to-see-the-world">https://blog.caiths.com/posts/thoughts/ticket-to-see-the-world</a></blockquote><div><p>工牌从挂绳上取下来的时候，比我想象中轻。</p><p>那是实习结束办完交接的最后一天，交接文档已经发出去了，电脑里的私人文件也清得差不多。我把工牌放在键盘旁边，没有马上退出内部通讯软件，而是坐直了身子，给这段日子照顾过我的同事和前辈写一封很长的感谢信。写着写着就长了，从第一天找不到工位、发起第一次代码评审手忙脚乱，写到后来并肩推进项目节点、上周那次线上高并发排查。删掉了几句客套的寒暄，又补回来几句真心话。</p><p>写到信的末尾，手指在键盘上顿了顿。然后我第一次无比认真地打出了那几个字：决定回学校继续深造。</p><hr/><p>回想起来，这几个月的实习生活带给我的收获是实打实的。</p><p>刚进组报到的那一周，我连拉取主干代码、提代码评审都要对着规范文档反复核对好几遍，生怕哪一步点错给线上添乱。后来跟着带教前辈一点点摸清了公司庞大系统的运转脉络和那些弯弯绕绕的调用链，也真正独立接下了几个核心业务模块的开发。</p><p>印象最深的是一个排查线上高并发延迟的下午。我盯着监控面板上那条往上翘的曲线，翻日志、看线程、查连接池，查到一半突然愣住了——这不就是大一大二在操作系统和网络课上死磕过的调度、锁竞争与连接管理吗？当年为了应付期末考试死记硬背的东西，原来并不是试卷上的纸面屠龙术，一直在这里等着我。当海量的真实请求涌进来时，那些枯燥的底层机制在生产环境里发出了清脆的回响。那一刻有点想笑，又有点后怕：幸好当时没全忘。</p><p>组里的技术氛围也让人舍不得。遇到难啃的卡点，几个人拖把椅子围到白板前涂涂画画，你画一个框我补一条线；忙到很晚，就一起下楼吃碗热气腾腾的汤面再回来。那种谁卡住了都有人搭把手的默契与彼此托底，是我在学校里很少体会到的，也让我第一次真切见识到了成熟技术团队在工程上的专业与从容。</p><hr/><p>可也正是在这样顺畅充实的节奏里，一件原本模模糊糊的心事，慢慢有了清晰的形状。</p><p>我发现自己越来越熟练地调用现成接口、利索地拼装业务模块，手头的活干得越来越快；但如果我不甘心只停留在这一层，碰到真正深水区的问题——某个性能瓶颈到底卡在操作系统调度还是底层存储、某个架构取舍背后的真实代价怎么算——我往往只能凭着写代码的直觉猜个八九不离十，却拿不出严谨的理论支撑去把它彻底讲透。</p><p>离职面谈那天，带教和我坐在走廊尽头的小会议室里。他翻着我写的实习总结，温和却一针见血地给出了评价：</p><p>“你干活踏实，上手也快。但往深处钻研技术的劲头和厚度，还可以再加强。”</p><p>话一点都不重，我却在心里反复咀嚼了很久。走出会议室的时候，我明白他说中了。那种隔着一层毛玻璃看系统核心机制的感觉，我在实战里碰到过不止一次；以前遇到硬骨头，往往下意识地绕过去，假装没看见。</p><p>既然已经看清了短板在哪里，与其带着半桶水在业务线里匆忙赶路，不如趁着现在还年轻、还坐得住冷板凳，干脆退回来把基础和地基重新打牢。</p><hr/><p>只是真从热闹的工程现场退回到安静的备考桌前，起初的落差比我想象中还要磨人。</p><p>没有了提交代码后流水线亮起的那一排绿灯，也没有了白板前七嘴八舌的并肩讨论。每天面对的只有翻卷了边的数学教材、一摞越堆越高的演算草稿纸，和一张精确到半小时的作息表。头两个星期我总忍不住去摸手机，好像还在等谁在工作群里 @ 我一下。（当然没有人 @ 我，大家都在忙自己的需求。）</p><p>十月底的夜风已经有了凉意。有时候在自习室坐到闭馆，揉着发酸的眼睛走出教学楼，路灯把影子拉得很长，心里也会冷不丁冒出一丝怀疑：这样选真的对吗？</p><p>每到这种时候，我就把手机掏出来，翻到离职那天写下的那封长信。光标停过的地方，还是那句话：</p><p>我想给自己买一张看世界的门票。</p><p>考研对我来说从来不是为了躲进象牙塔，也不是逃避步入社会的压力；恰恰相反，正是那几个月在真实工程里的摸爬滚打，替我拨开了眼前的迷雾，让我无比清楚地看清了自己想往哪条路走。</p><p>脚边有几片落叶被晚风吹得打转。我紧了紧背包的肩带，迎着路灯往宿舍走，脑子里想的是明早八点，还得把今晚没算完的那道积分题接着拿下。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/thoughts/ticket-to-see-the-world#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/thoughts/ticket-to-see-the-world</link><guid isPermaLink="true">https://blog.caiths.com/posts/thoughts/ticket-to-see-the-world</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Wed, 28 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[给厂商写一封要规格书的信]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/tech/asking-vendor-for-specs">https://blog.caiths.com/posts/tech/asking-vendor-for-specs</a></blockquote><div><p>二十六根。</p><p>我趴在放大镜底下数了三遍，那条软排线上的金手指确实是 26 pin。数完我把镊子往切割垫上一放，靠回椅背，叹了口气。</p><p>电烙铁架在右手边，空气里还飘着一点没散尽的松香味，而切割垫正中央摆着的，是一张让我琢磨了好几天的墨水屏相纸。厂商给它配了一个挺有意思的玩法：一台造型复古的一次性相机，咔嚓按下快门，画面定格到相纸上，这张屏幕的一辈子就算交代完了，里头的照片再也换不掉。我捏着那张薄薄的相纸在台灯底下翻来覆去看了好几天，越看越觉得可惜：这么细腻的一块墨水屏，正常刷图再用个十年八年都不在话下，凭什么拍一回就跟着一次性相机一起退休？</p><p>手痒之下，便动了改装的心思。琢磨着给它外挂一块低功耗蓝牙模块，再用 3D 打印机打个严丝合缝的小背壳。手机连上蓝牙，随时能把刚拍的新照片刷进相纸里，压根不用再去买那台配套的玩具相机。</p><p>想得很美。等我拿薄撬片屏着呼吸把外壳撬开，一盆冷水就迎头浇了下来。市面上能查到开源资料的公版墨水屏，大多是 24 pin，这块偏偏多出两根，跟开源资料完全不是一个路数。顺着排线往下看，底部的小副板上还赫然焊着一颗芝麻大的芯片，八成是身份加密，用来跟自家相机做握手防伪的。</p><p>平心而论，做消费级硬件产品靠相纸耗材回本，设一道防伪门槛我完全能理解。可这道门槛刚好横在我画了一半的转接板前面。STM32 的测试板前两天就焊好了，就搁在手边，但没有准确的引脚定义和驱动电压参考，我实在不敢贸然上电去跑通讯测试。墨水屏里动辄十几伏的驱动高压，时序和引脚稍微对不上号，轻则屏幕毫无反应，重则直接把高压灌进逻辑脚，当场烧废一块好端端的屏幕。我手里可只有这一张。</p><p>对着那排密密麻麻的金属触点干瞪了两天眼，万用表测出来的几条地线和电源线杯水车薪，剩下的大半还是一团迷雾。最后我一咬牙：干脆给厂商写封信，向他们要一份规格书。</p><h2 id="">一封信写了一晚上</h2><p>信里的算盘其实打得很清楚。自报家门，说明自己是个平时爱折腾硬件和 3D 打印的独立创作者，正打算给他们的相纸设计一套带蓝牙刷图功能的开源小背壳。要是这个改装套件做出来、在手工和极客圈子里传开，大家为了玩蓝牙相框，反倒会成批成批地去复购相纸，对耗材销量只有好处没有坏处。把这层利害关系算清楚，再顺理成章地提到自己画板子卡在了 26 pin 的排线定义上，希望能申请一份屏幕排线的规格书。哪怕因为商业机密不便透露完整的握手协议，只给一份最基础的引脚功能定义也行。</p><p>就这么几百个字，我在编辑框里删删改改，从吃完晚饭一直磨到快十二点。（说来好笑，平时写代码或者画板子遇到死胡同，我都没这么字斟句酌过。）</p><p>语气稍微生硬一点，读起来像是在质问人家为什么要搞硬件封锁；可要是写得太卑微、太像随口讨教，又怕对面的商务或客服扫一眼觉得没油水，顺手就拖进了垃圾箱。改到最后一版，我把段落顺序整个调了过来：第一句先摆“这个蓝牙背壳能帮你们多卖相纸”，然后坦诚交代自己卡在哪个技术节点上，最后才礼貌地落到“能不能给一份引脚定义”。</p><p>把对别人有用的价值摆在最显眼的台面上，再去伸手要东西。这点小心思，大概是在深圳实习这几个月，在无数封往来邮件里慢慢磨出来的一点世故。</p><p>点发送的时候，我盯着那个转圈的小图标看了好一会儿，心里竟然有点像高中交完作文卷子。</p><h2 id="">还在等</h2><p>邮件发出去好几天了。每天下班回来第一件事就是开电脑查收件箱，可里头安安静静，什么回音也没有。</p><p>那块拆开的 26 pin 屏幕现在静静躺在桌角的收纳盒里，排线朝上，二十六根金手指整整齐齐。转接板还停在 EDA 里画了一半的样子，我也没急着去碰它。</p><p>折腾这个，真不是想去占厂商什么便宜。纯粹是舍不得一块好端端的墨水屏被人为写死了寿命，想凭手里的烙铁和代码替它多续几年命而已。只是没想到，比起在软件里熬夜走线画 PCB，向握着图纸的人体面地开一次口，反倒是硬件折腾路上更难迈过去的一道坎。</p><p>明天下班，再看一眼邮箱。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/tech/asking-vendor-for-specs#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/tech/asking-vendor-for-specs</link><guid isPermaLink="true">https://blog.caiths.com/posts/tech/asking-vendor-for-specs</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Tue, 27 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[一份四千字的讲解稿，和它后面的五个问号]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/projects/oculichat-five-questions">https://blog.caiths.com/posts/projects/oculichat-five-questions</a></blockquote><div><p>前两天整理旧文档，翻出一个文件，字数统计显示四千一百多字。</p><p>是 2025 年春天写的竞赛讲解稿。点开的时候我还有点期待，想看看当年的自己写得多认真；结果一路往下滚，越看越想笑，滚到最后，又笑不出来了。</p><hr/><p>那年春天，几个平时总凑在一起折腾代码的同学在自习室里商量着报一场高校竞赛。题目选得颇有几分济世救人的味道：做一套 AI 眼科辅助诊断系统。往页面上传一张眼底彩照，背后的模型就能分辨出是白内障、糖尿病视网膜病变、青光眼，还是一双健康的眼睛，顺带给病变程度打个分级。</p><p>为了像模像样，几个人围着一桌子奶茶杯琢磨了大半个晚上，起了个又洋气又郑重的名字：“Oculichat 眼智医”。</p><p>比赛还没走到路演答辩，我手里那份应付材料评审的讲解稿，就已经攒到了四千多字。现在回头看，当年深夜敲键盘那股越写越顺、甚至有点刹不住车的亢奋劲儿，隔着屏幕都能感觉到。</p><p>算法那一章，我一板一眼地写了怎么用 ResNet50 加 VGG16 双路并行去提取眼底血管和视盘的局部特征；怎么把左右眼的图像特征拼到一起；怎么在中间塞一个空间注意力模块（Spatial Attention）盯住微小病灶。到了网络末端的多任务输出头，模型不光要给出疾病分类和严重程度分级，还顺手把患者的年龄和性别预测也一起包揽了。</p><p>要是只停在模型结构这一节，它顶多算一份规规矩矩的课程大作业。可一旦写到系统工程和商业落地那几章，字数就彻底脱缰了：后端 Spring Boot 微服务怎么拆，React 搭起来的交互前端怎么设计，云端对象存储怎么做高可用，一路洋洋洒洒写到在线医保结算和商用支付接入，最后还正儿八经规划了一整节面向第三方医院和体检机构的“开发者生态”。</p><p>我至今还记得敲下“开发者生态”这五个字的时候，已经是凌晨两点，自己盯着发亮的屏幕都愣了一下。那时候我们的模型权重，明明还跑在队友那台风扇一转就像直升机起飞的游戏本上。（纸面上的架势，倒活脱脱已经是一家估值过亿的医疗科技独角兽了。）</p><hr/><p>好在这股微醺的劲儿没持续太久。</p><p>写完全文最后一个句号、准备合上电脑睡觉之前，我鬼使神差地多敲了一个回车，在四千字长文的末尾单独留了一小节备忘，标题起得很实在：“需要注意和确认的点”。</p><p>底下我一口气列了五条，每一条当时都答不上来：</p><ol start="1"><li>训练用的那批眼底数据集，确切叫什么名字，是什么开源协议？</li><li>前端调 <code>/predict</code> 推理接口时，报文里到底是直接塞一长串 Base64，还是先传到云存储、再递一条图片 URL 过去？</li><li>演示页上那几张看着很有说服力的病灶概率热力图和特征重要性分析图，是哪段代码实时算出来的？</li><li>文档里写得颇有未来感的“非接触式登录”，落到代码里怎么实现？</li><li>最要命的一条：那个跑着权重的推理 API，正式答辩那天，部署在谁的哪台机器上？</li></ol><p>五条备忘，五个孤零零的问号。</p><p>现在再看，它们每一个都正好扎在前面写得最饱满、最气派、最像行业白皮书的那几段话上。正文里越是把“端云协同、可解释性医疗 AI、多模态微服务”讲得行云流水，末尾那几句“到底传 Base64 还是 URL”“模型到底跑在哪台电脑上”的追问就越扎眼，也越显得诚实。</p><hr/><p>是这五个问号把我们从云端拽回了地面。</p><p>接下来的几个星期，大家收起写商业计划书的那股狂想，老老实实坐回电脑前一个个填坑：核对数据集出处，统一前后端的传输格式，把热力图的生成脚本接进真正的推理流水线，给模型找一台稳当的机器跑服务。没有一件是好看的活，但每填上一个，心里就落下一块石头。</p><p>那年秋天，获奖通知陆陆续续寄到了学院：全国大学生电子设计竞赛二等奖，中国大学生计算机设计大赛二等奖和三等奖，全国大学生数学建模竞赛省一等奖，还有一枚沉甸甸的“挑战杯”银奖。证书摊在桌上，那几个月在实验室和宿舍之间来回跑的日子，总算有了个交代。我们确实熬夜把权重跑通了，确实一块砖一块瓦把前后端和接口拼了起来，也确实在答辩席的灯光下，把那套四千字的故事讲得从容了。</p><p>可每次想起那个春天，我最先想到的，始终还是讲解稿屁股后面那五个问号。</p><p>它们像一面偶尔被翻出来的小镜子，温和又清醒地提醒我：在写技术方案或者做项目汇报的时候，读起来最顺滑、最气派、最让人挑不出毛病的漂亮句子，背后往往就藏着整个系统里最心虚、最没底的那一块。</p><p>从那以后，无论是看别人的还是翻看自己的技术文档，我都很少先去前几页看那些宏大的愿景图了。我习惯直接把滚轮拉到最底下，看看写的人在画完星辰大海之后，有没有给那些还没着落的细节，老老实实留下几个诚实的问号。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/projects/oculichat-five-questions#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/projects/oculichat-five-questions</link><guid isPermaLink="true">https://blog.caiths.com/posts/projects/oculichat-five-questions</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Mon, 26 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[赶在过期前]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/notes/76">https://blog.caiths.com/notes/76</a></blockquote><div><p>今天干了一件特别有成就感的小事——成功预约上了明天周日下午的双人下午茶，嘿嘿。</p><p>说起来这张下午茶兑换券还是好几个月前攒下来的，一直躺在卡包角落里吃灰。每次周末不是忙着赶手头的项目，就是犯懒窝在屋里不想动弹，一拖再拖，眼瞅着有效期的最后死线就要到了。今天猛地一拍大腿想起来，赶紧点进小程序一看，居然正好还剩最后一周的周日空档可以约上，那种感觉简直不亚于在垃圾桶里捡回了一张五十块钱纸币。</p><p>已经提前在心里盘算好了明天的安排：睡个懒觉起来，换身清爽的衣服出门，找个靠窗有阳光的位置坐下，点一壶热茶配两块小蛋糕，把电脑和待办事项统统留在屋里。</p><p>有时候觉得，成年人日常里的快乐其实特别容易满足，根本不需要什么惊天动地的大惊喜。只是一张差点被遗忘、却赶在过期前最后一刻成功救活的优惠券，再加上一个恰好没有任何杂事打扰的晴朗周日下午，就足够让人从周六晚上开始美滋滋地期待好半天了。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/notes/76#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/notes/76</link><guid isPermaLink="true">https://blog.caiths.com/notes/76</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Sun, 25 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[考研这件事，我想了一年]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/thoughts/kaoyan-one-year">https://blog.caiths.com/posts/thoughts/kaoyan-one-year</a></blockquote><div><blockquote><p>考研比实习重要。</p></blockquote>
<p>这是我手机备忘录里一篇笔记的第一行，写于去年六月的一个晚上。</p><p>那天我在招聘软件上划了一整晚。技术岗、大厂的核心部门，稍微体面一点的岗位点进去，任职要求第一条往往都冷冰冰地印着“硕士及以上”五个字。我手里那张本科学历还没到手，就似乎已经有点不够用了，有时候甚至连让人看一眼项目和代码的机会都没有，那道门槛一上来就把人结结实实地挡在外面。</p><p>划到后来有些心烦，我关掉软件，在备忘录里新建了一页空白文档，用力敲下了那七个字。</p><p>当时我觉得，把这句话钉在最显眼的地方，就像给接下来的日子插了一块路标，往后只要低着头照着走就行。</p><h2 id="">路牌插下以后</h2><p>可后来的日子，并没有因为一句话变简单。</p><p>我开始背着沉甸甸的书包往返于宿舍和图书馆之间，复习资料翻开又合上，草稿纸攒了一沓又一沓。可心底总有一点说不清道不明的犹豫，像鞋里进了一粒细沙，不至于走不了路，但走几步就硌一下脚心。</p><p>今年六月，轮到我们这一届拍毕业照了。某个闷热的下午我闲下来，不知道怎么就把备忘录往下翻到了底，又重新点开了那篇笔记。</p><p>隔了整整一年再看那七个字，感觉有点奇妙，像在旧抽屉里翻出一张自己写给自己的字条，字迹分明是自己的，语气却陌生了。我索性在底下敲出几道分隔线，把这一年里在脑海中打过无数次架的念头全部摊开，分成“想去”和“不想去”两栏，一条一条重新数了一遍。</p><h2 id="">想去</h2><p>“想去”那一栏，一开始写的全是最标准不过的现实考量：提升学历、弥补遗憾（？）、好找工作。</p><p>只是在敲完“好找工作”四个字之后，大拇指在输入法上方悬停了片刻，还是没忍住补了一对括号，在里头灰心地添了一句：</p><blockquote><p>（等我读完又贬值的话也完蛋了）</p></blockquote>
<p>前面那个“弥补遗憾”，后面跟着的问号也是我自己加的。我其实说不清究竟想弥补什么，是当年高考时的一次失手，还是单纯对某种更体面的名校光环放不下执念。</p><p>真正让我对着屏幕愣住的，是我顺着心意写在这一栏最底下的那行字：</p><blockquote><p>放不下我的学生身份（可能只是因为没赚到钱）。</p></blockquote>
<p>写下这句的时候，脸颊甚至有些发烫，像是被自己当面拆穿了藏得最深的心事。只要还留在学校里，交着学费、住着宿舍、按着校历过日子，社会对一个成年人的诸多严苛丈量就还可以名正言顺地往后推迟两三年。我原以为自己舍不得的是象牙塔和少年时光，剥开外头那层温情脉脉的壳，里头藏着的多半只是还没在社会上靠双手赚到安身立命的钱，因而在望见校门外的风浪时，本能地想要往熟悉的屋檐下再缩一缩。</p><h2 id="">不想去</h2><p>可清单的另一侧，那些“不想去”的理由同样密密麻麻地站在原地，半步都不肯退让。</p><p>我真的不太想再把大好的二十几岁困在日复一日的试卷和标准答案里了。从小学一路考到大学，十几年光阴仿佛全被折算成了一张张答题卡上的分数；只要一想起还要坐在书桌前，为了几分得失而反复咀嚼同一种题型、背诵同一套模板，胸口就止不住地发闷。</p><p>更何况，这几年写代码、做项目、和朋友们一起折腾各种新鲜玩意儿的间隙里，心底始终有个声音在提醒自己：考研从来不是人生唯一的出路。在好几个睡不着的深夜里，我还认真动过出国的念头，总想去外面的世界走一走，看看那些不在同一套考卷里打转的同龄人，究竟在过着怎样具体的生活。</p><h2 id="">一年以后</h2><p>从去年初夏到今年十月末，这张清单我前前后后点开过很多次。两边的理由一条都没有少，也没有哪一边真的说服了另一边。</p><p>有一阵子我总在心里责备自己摇摆不定，怀疑自己是在拿“厌倦应试”给畏难找借口，或者是在拿“逃避社会”给迷茫打掩护。可这一年里，每一次心动和每一次退缩都是实实在在拉扯过的，我慢慢也就看明白了：左边那些渴望与惶恐是真的，右边那些不甘心与向往同样也是真的。</p><p>它们能在备忘录里僵持整整一年分不出胜负，恰恰是因为两边写下的每一个字，全都是那段日子里最真实的我。</p><p>唯一变了的，是我现在看着这张清单，不再急着逼自己立刻拿红笔划掉其中一半了。</p><p>夜色渐深，我锁了手机屏幕，下楼去买水。十月底的晚风迎面吹过来，带着一点微凉的清爽。至于那道还没有划上句号的选择题，就让它陪着我往前面的路再走一程吧。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/thoughts/kaoyan-one-year#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/thoughts/kaoyan-one-year</link><guid isPermaLink="true">https://blog.caiths.com/posts/thoughts/kaoyan-one-year</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Sun, 25 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[一台后封的礼物]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/notes/75">https://blog.caiths.com/notes/75</a></blockquote><div><p>七夕前满心欢喜地挑了一台苹果设备打算当礼物送人，结果今天把包装盒拿出来仔细端详的时候，心里猛地“咯噔”了一下：白色的外包装盒边角磨损得厉害，正面的划痕清晰可见，最离谱的是背后那根原厂易拉封条居然贴得歪七扭八——以苹果一贯严苛的出厂包装工艺，原封机器的封条怎么可能歪成这副模样？</p><p>回想起签收那天的场景，越想越觉得不对劲。当时快递员送上门，还没等我伸手接稳，小哥就极其熟稔地直接替我把封条撕开了；而且里面的内盒变形得厉害，手机卡在槽里根本倒不出来，最后还是小哥掏出美工刀硬生生撬开的。我赶紧去网上搜了一圈大家的踩坑帖，像这种外盒脏旧、封条重贴、内盒挤压变形的情况，十有八九就是商家拿拆封退货机重新包装的“二次后封机”。</p><p>最让人窝火的是，去找卖家理论时，对方立刻搬出“已拆封激活不支持无理由退换”的霸王条款来堵我的嘴，整个售后流程被他们设计得滴水不漏。从下单到快递员抢着拆盒，没有任何一个环节主动告知过这台机器的真实来历。</p><p>其实卖官翻机或者二手良品本身并不可耻，真正让人寒心的，是把别人摸过的后封机器堂而皇之地当成“全新未拆封”卖给满怀心意送礼的人，被戳穿之后还要摆出一副理直气壮的嘴脸。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/notes/75#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/notes/75</link><guid isPermaLink="true">https://blog.caiths.com/notes/75</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Sat, 24 Oct 2026 13:30:02 GMT</pubDate></item><item><title><![CDATA[从积分题到路由器：这一年]]></title><description><![CDATA[<div><blockquote>此渲染由 Yohaku API 生成，或存排版之虞，最佳体验请往：<a href="https://blog.caiths.com/posts/archive/a-year-from-integral-to-router">https://blog.caiths.com/posts/archive/a-year-from-integral-to-router</a></blockquote><div><h2 id="">九月</h2><p>2025 年 9 月 18 日，我在手机备忘录里郑重其事地记了一笔：自己独立解出了一道积分题。</p><p>现在想来，“独立”两个字其实有点心虚。当时手边明明摊着翻卷了边的教材，我几乎是盯着现成的公式一行行往里硬套的。可当草稿纸上的常数项终于消掉，算出来的分式跟参考答案严丝合缝对上的那一刻，笔尖顿在纸上，心里还是涌起了一股很踏实的高兴。</p><p>那段日子窄得像一条一眼望到头的走廊。自习室的桌上永远堆着演算纸、公式表和画满红道道的错题本，只要低头钻进那些弯弯曲曲的数学符号里，抬头时天不知不觉就黑了。那会儿我还不知道，趴在桌前跟一道积分题较劲的那个下午，差不多是我以“学生”的身份度过的最后一段完整又安稳的时光。</p><h2 id="">三月</h2><p>2026 年 3 月 6 日，事情尘埃落定，我确认下半年不用再回学校了。</p><p>十几年的读书生涯就这么轻轻巧巧地画上了句号。没有想象中把书抛向半空的狂喜，心里倒像被人突然搬空了一块，空荡荡地发慌。</p><p>从记事起背上书包跨进校门，上学这件事早就像一份干了十几年的老差事。嘴上偶尔抱怨早起、抱怨考试，身体却早就习惯了那套严丝合缝的齿轮运转。冷不丁一夜之间“交了工牌”，下一处落脚的地方得自己去找。说有多害怕倒也未必，更多是一种手脚不知往哪儿放的生疏——头一回面对没有课表、没有上下课铃声切分的时间，早上睁开眼，一整天的空白压下来，竟不知道第一步该往哪边迈。</p><h2 id="">四月</h2><p>真正的下马威往往藏在鸡毛蒜皮里。</p><p>4 月 7 日傍晚，屋里的网突然断了。我敲开后台管理页面一看，才发现家里的路由器不知怎么被人登进去，彻底重置了。盯着屏幕上空荡荡的初始配置页面，我欲哭无泪，在备忘录里连敲了两个“哭哭”。</p><p>住宿舍那会儿，断网了在群里喊一声网管就行；放假回乌鲁木齐，这种事自然有家里人去折腾。可那天我蹲在墙角，看着路由器上一闪一闪的绿灯，忽然无比清醒：从翻宽带账号、拔插网线到重设无线密码，这件麻烦从头到尾都是我自己的，没有别人能替我兜底。（翻了半个小时，最后宽带账号是在运营商发来的一条两年前的短信里找到的。）</p><p>生活大概就是从那个傍晚开始悄悄换了计价单位。不再有现成的缓冲地带，往后那些意料之外的故障和烂摊子，都会直接递到我一个人手上。</p><h2 id="">七月</h2><p>7 月 2 日深夜，对着满屏飞快滚动的代码和自动跑着的脚本，我忍不住写下了一段怀念 GPT-3.5 时代的话。那时候 AI 还只是一个干干净净的网页对话框，遇到看不懂的报错问它两句，再自己一行行敲进编辑器里跑通，每天关电脑时都觉得比昨天更懂了一点。一转眼，现在的工具恨不得把从构思到部署的整条链路一口吞下，跑得太快了，快到我常常站在原地，有点跟不上趟。</p><p>写完合上电脑，屋里一下子安静下来，窗外有雨点断断续续地打在楼下的雨棚上。我靠在椅背上忽然回过味来：这一整年，其实都在经历同一件事。墙上的课表换成了自己维护的日程表，抬头能搭话的室友换成了一闪一闪的终端光标，身边的布景一刻不停地拆旧换新，而我能做的，就是在每次被推着往前跑的时候稳住呼吸，把迎面抛过来的陌生麻烦一件件接住。</p><p>从九月草稿纸上的一道积分题，到四月墙角那台被重置的路由器，再到七月深夜的那声叹气，这一年里没发生什么惊天动地的大事。一个旧身份在慢慢褪下去，新的那个还没长全。</p><p>那台路由器现在还在墙角，绿灯一闪一闪，后台密码我换成了一串自己都记不住的字符，抄在一张便利贴上，贴在它背面。</p></div><p style="text-align:right"><a href="https://blog.caiths.com/posts/archive/a-year-from-integral-to-router#comments">览毕，何不一言？</a></p></div>]]></description><link>https://blog.caiths.com/posts/archive/a-year-from-integral-to-router</link><guid isPermaLink="true">https://blog.caiths.com/posts/archive/a-year-from-integral-to-router</guid><dc:creator><![CDATA[喵内]]></dc:creator><pubDate>Sat, 24 Oct 2026 13:30:01 GMT</pubDate></item></channel></rss>