<?xml version="1.0" encoding="UTF-8"?><?xml-stylesheet href="/scripts/pretty-feed-v3.xsl" type="text/xsl"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:h="http://www.w3.org/TR/html4/"><channel><title>JuniorTree</title><description>你应当选择你真正热爱的</description><link>https://www.juniortree.com</link><item><title>随想 - 慢慢亦漫漫</title><link>https://www.juniortree.com/blog/slow-and-enjoy</link><guid isPermaLink="true">https://www.juniortree.com/blog/slow-and-enjoy</guid><description>Research is a marathon, not a sprint.</description><pubDate>Wed, 04 Mar 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在申请暑研（暑期研习），目前申请了两个，申请的第一个老师和我说，说他已经招满了，让我去申请另外一个老师，然后我就马上给第二个老师写邮件，出乎意料的，这个老师很快地给我回了邮件，然后让我加他微信，说我们可以聊一聊&lt;/p&gt;
&lt;p&gt;之后我们第二天约了一下，聊了大概半个小时，主要问了这样的几个问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;为什么要从物理系转到生物&lt;/li&gt;
&lt;li&gt;在做分子对接的这个项目的时候，蛋白序列是怎么来的&lt;/li&gt;
&lt;li&gt;解释一下细胞扰动预测和基因调控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;聊到最后，老师说他们实验室主要的背景是数学和物理，哪怕是计算机的都很少——因为他觉得学计算机的数学也不太行，然后这时候我就知道自己要被刷了&lt;/p&gt;
&lt;p&gt;其实在面试刚结束的时候，我还是有点不甘心的，因为我觉得其实我简历还挺漂亮的，有物理系的背景、有软件所的项目、有开源项目经历，但是PI说你不行就是不行&lt;/p&gt;
&lt;p&gt;而且经过这次面试「拷打」其实我想清楚了很多问题&lt;/p&gt;
&lt;h2&gt;是为了刷简历 or 科研&lt;/h2&gt;
&lt;p&gt;这是一个很好的问题，我去找实习，去找暑研，到底是为了什么，是为了做科研吗？我想应该不是，因为找的都是比较牛逼的大组，他们做的方向我并不是很喜欢；是为了刷简历吗？我想应该是，因为经常刷小红书，看到很多和我差不多的大二、大三学生，大家的简历都非常漂亮的经历，有的有文章，有的有各种厉害的实验室或者大厂实习&lt;/p&gt;
&lt;p&gt;看多了，不焦虑是不可能的，但也正是因为焦虑，才让我变得很急很急，甚至在前面面试PI问我最简单的怎么从转录组获得蛋白序列还要思考半天&lt;/p&gt;
&lt;h2&gt;大二学生能力的边界到底在哪里&lt;/h2&gt;
&lt;p&gt;这其实是对本科生科研的一个反向思考，我们进入到实验室，放弃我们的空闲时间，投入到科研训练当中，到底是为了什么？&lt;/p&gt;
&lt;p&gt;以我们学校的生物本科生的教学安排为例，大一会上完数学、物理、化学等基础课，数学只会学高数B，化学会上完无机和有机，Python的编程课甚至不会教你怎么装第三方的包和依赖&lt;/p&gt;
&lt;p&gt;其实我觉得这种状态，如果是去实验室刷试管可能都没人愿意用，尽管导师和师兄师姐人比较好，还是会给安排一些活，但是事实就是这样啊，基本干不了什么「严肃的科研」&lt;/p&gt;
&lt;p&gt;那如果是做生物信息学，也就是所谓的干实验呢？我觉得其实结果也是差不多的，第一Python课上学的完全无法支撑科研，用课上的知识去装一个biopython库恐怕都难，另外生科没有安排很完整的数学思维训练，现代的人工智能算法是建立在线性代数和离散数学之上的，但是生科连线性代数都没有设置&lt;/p&gt;
&lt;h3&gt;那我们为什么还要进实验室&lt;/h3&gt;
&lt;p&gt;对我来说，我觉得进实验室参加科研训练的一个很重要的原因是，我觉得探索一些别人还没有做的事情是很有意思的，另外也能用一些实验室的资源（比如说隔壁组非常牛逼的A100）来做一些事情&lt;/p&gt;
&lt;p&gt;我是有过编程和计算机基础的，在参加学校的科研训练之前，我就能熟练写Python，并且做Linux的运维的，我想这是很多生科和我同龄的同学所不具备的&lt;/p&gt;
&lt;p&gt;在做干实验的时候，我们大多数时候是在和环境、依赖、数据是否正确打交道的&lt;/p&gt;
&lt;p&gt;我接触的第一个科研立项的项目是写一个分子对接的Pipeline，我当时很自信地和我的导师说，我说我一个礼拜就能做完，我两位师姐露出很惊讶的表情&lt;/p&gt;
&lt;p&gt;最后的结果是打脸的，这个项目等我大二第一学期结束还没有做完，一直耽搁到了过年才勉强没有烂尾&lt;/p&gt;
&lt;p&gt;如果我继续做云原生，传统的前后端开发的话，我可能这一辈子都不知道「高通量」是什么概念，最后我们的这个Pipeline完成了亿级的分子对接，这也是我非常骄傲的一个成果&lt;/p&gt;
&lt;h2&gt;我们是不是太快了&lt;/h2&gt;
&lt;p&gt;之前和一些开源社区的朋友做了一些公众号推文的工作，然后我当时提出了一个观点，我说「&lt;strong&gt;字别写太多，大模型时代大家不会耐心去看&lt;/strong&gt;」&lt;/p&gt;
&lt;p&gt;这其实也在一定程度上，反应了我当前的状态，因为有了大模型，如果有什么问题可以直接问AI，根本不用专门去读某本专著，认真读某篇论文，这其实也道出一个问题，在大模型时代，随手到来的答案是不是让系统性的知识变得廉价了&lt;/p&gt;
&lt;p&gt;我觉得这个「快」要从两个方面来看&lt;/p&gt;
&lt;p&gt;认识我的朋友都知道，我喜欢一个人在路上走，在路上走的时候我会带上耳机，然后打开Gemini，用语言输入和他来来一场头脑风暴，针对一个小的问题来进行提问和对话，Gemini免去了我解答问题的成本，以往我们需要借助搜索引擎，要自己过滤信息，探索欲望的多巴胺因此流失，但是现在可以借助这股劲把问题解决了&lt;/p&gt;
&lt;p&gt;另外一个需要去看待的「快」，其实是科研上的&lt;/p&gt;
&lt;p&gt;比如我们实验室是做鳞翅目昆虫与植物次代谢物互作的，如果没有Gemini，我可能甚至要半个学期才能搞懂师姐他们到底在做什么，用的什么方法，我也没办法快速上手Pipeline的搭建，我觉得这是大模型在科研中好的地方&lt;/p&gt;
&lt;p&gt;另外不那么好的一点是大模型带给我们的，虚假的「掌控感」，有了大模型，可能就没有那么有想读文献的欲望了，我认为这一个学期科研带给我的其实没啥学术上的帮助，可能更多的是怎么和集群打交道，这也是现在我非常焦虑的一点，如果是湿实验的话倒还好，至少会跑胶嘛&lt;/p&gt;
&lt;p&gt;所以我觉得未来需要慢下来，去学一些系统化的东西，甚至是做数据库清洗这种简单的工作，我觉得都是有意义的，现在我在和师姐做一个鳞翅目的数据库，实际做的过程我们发现，这里面很多数据库对于同一物种的收录是不一样的！如果没有一些生物学和分类学的基础，其实是很难做好，很难对齐的&lt;/p&gt;
&lt;p&gt;还有一个比较有意思的例子，我寒假帮师姐写了一个小脚本，然后我用Codex把需求给输入进去，差不多10分子Codex就完成了全部的代码，并且完成了测试，但是我师姐一用就知道这东西不对，但是我就看不出来，人类专家的知识在大模型和智能体时代，我觉得是最珍贵的东西，编码智能体能在软件工程的领域大放光彩，但是在生物学这个不那么稳定领域并没有那么完善，代码本质上也是解决问题的一种手段&lt;/p&gt;
&lt;h2&gt;漫漫&lt;/h2&gt;
&lt;p&gt;今年寒假回家的时候，我认识了一位中科院的老师，是做脑科学的，我当时问他说要在本科要做些什么，然后他当时和我说，找一些自己感兴趣的东西做一下&lt;/p&gt;
&lt;p&gt;这话真的是说起来简单，做起来难，很容易被带节奏，加入到内卷的行列中&lt;/p&gt;
&lt;p&gt;我觉得还是先慢下来吧，只有慢下来，才有机会在beloved生物世界漫游&lt;/p&gt;
&lt;p&gt;未来先不打算找暑期研习或者实习了，看了下西湖/SMART的实习都是结构生物学或者细胞生物学的，其实这两门课我都还没有学，即便是去了可能也学不到什么&lt;/p&gt;
&lt;p&gt;更何况我觉得现在的课题组做的事情也比较有意思，这可能也是我心境变化的地方&lt;/p&gt;
&lt;p&gt;我刚开始进组做科研训练的时候，我和杨老师说，我说我对昆虫不感兴趣，如果是做生物信息学，以后硕士的时候也能改方向吗，当时杨老师和我说的是，生物信息学并没有界定方向，即便是本科做昆虫，硕士也可以换其他的，当然硕士做昆虫肯定更好，因为对昆虫的习性可能更熟悉&lt;/p&gt;
&lt;p&gt;我现在慢慢觉得做虫子也有趣的原因可能在于，第一我本身自己就喜欢进化，然后和师姐在做的就是虫子和植物的互作，深入接触了后感觉很好玩；第二是杨老师和师姐对我很好，很有耐心，如果是去暑期研习或者实习，恐怕没人能对我这么好了&lt;/p&gt;
&lt;p&gt;第三就是，一学期的科研训练让我意识到，生物学和其他的学科是不一样的，我们做开发也好，刷Kaggle也好，本质上接触的都是很纯洁，很稳定的数据——相较于生物学的原始数据来说都算是非常干净了&lt;/p&gt;
&lt;p&gt;第四，也是最重要的一点，做科研是没有正确答案的，也许有，但是答案并没有和考试一样一板一眼，这对我这种「做题家」来说，也许是一种嘉赏&lt;/p&gt;
&lt;p&gt;慢慢亦漫漫，我要吹更多的风，见更多的人&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.Dey90FtM.png"/><enclosure url="/_astro/hero.Dey90FtM.png"/></item><item><title>2026年，Fedora上的游戏体验</title><link>https://www.juniortree.com/blog/gaming-on-fedora-2026</link><guid isPermaLink="true">https://www.juniortree.com/blog/gaming-on-fedora-2026</guid><description>初次体验Fedora以及Gaming体验</description><pubDate>Thu, 12 Feb 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;因为家里的台式电脑出现了奇奇怪怪的问题，导致无法安装 Windows，我之前的开发环境通常是 Windows+WSL 的工作流，对于 Linux 发行版，我接触的比较多的都是 Debian 和 Ubuntu，CentOS 只有在刚刚接触 Liunx 的时候学习过，那时候全网的 Linux 教程基本上都是以 CentOS 为主，等到 Red Hat 说 CentOS8 不再被维护了，我就完全抛弃掉了&lt;/p&gt;
&lt;p&gt;之前尝试使用过 Ubuntu Desktop，它确实也很好，但是问题在于他在我的4K显示器上似乎没办法展示高DDI，导致画面和UI看起来很塑料感，很多人吐槽的 &lt;code&gt;snap&lt;/code&gt; 包管理器的问题其实我没碰到过，因为我基本上都是用 &lt;code&gt;apt&lt;/code&gt; 自己去安装软件，从来不用这东西（说白了就不是 Linux 深度用户）&lt;/p&gt;
&lt;p&gt;突然想试用一下 Fedora 是因为看到另外一个老哥的博客，是一个山东的老哥，他当时国补买了个ThinkPad，然后当时刷的就是 Fedora，我对此非常好奇，然后就想，那我也尝试一下&lt;/p&gt;
&lt;h2&gt;启动Fedora&lt;/h2&gt;
&lt;p&gt;Fedora 有这几个版本，我选择的是 Fedora KDE Plasma，选择它的原因其实很简单，就是官网说了是 ~~下一代个人桌面环境~~，使用下来的感觉确实不错，前几天还在B站上看了 Ubuntu 新版本的动画演示视频，窗口切换还有类似 PPT 的那种破碎效果，emmmmm，只能说见仁见智吧，我还是比较喜欢 Fedora KDE 的这种设计的，而且很流畅&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3api.juniortree.com/pic/2026/02/e3fc5aa8d730eb0d4f691007158addf7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Linux 现在生态也很不错，也感谢不少国产的 Linux 发行版，微信、飞书都有 Linux 版本了，在安装输入法上费了点小心思，还是和 mac 一样安装上了 Rime 输入法，本想偷懒找个什么傻瓜式的国产输入法装一装，结果发现人家根本没提供 &lt;code&gt;rpm&lt;/code&gt; 包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/763e7589a42050c319ae64e0518ef66e.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;目前还存在的 bug 就是在 Chrome 浏览器中无法调用 Rime，导致我现在在 Fedora 上使用的还是 FireFox，不过不影响&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/3c21fc91e4a750ee99d588afd449970a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;安装 Steam&lt;/h2&gt;
&lt;p&gt;Steam 官网主要提供提供用于 Debian 和 Ubuntu 用户的 &lt;code&gt;deb&lt;/code&gt; 包，要在 Fedora 上安装可以在终端中进行&lt;/p&gt;
&lt;p&gt;启用 RPM Fusion Non-Free 仓库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dnf install https://mirrors.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 Steam&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo dnf update
sudo dnf install steam
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后就非常简单了，直接下载游戏，然后 Steam 会为你配置好对应需要的工具和依赖&lt;/p&gt;
&lt;p&gt;然后我在玩求生之路2的时候碰到了一个很奇怪的 bug，可以进游戏菜单，但是只要一加载游戏关卡就闪退，崩溃，最终的解决方法是把这个兼容层改为 Proton（真是赛高啊）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/9c9b9c0d4741846838ddaea7d2a604f9.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;体感上，我感觉在 Fedora 上转译后运行的求生之路2比在 Windows11 上运行要流畅不少，猜测是因为 DXVK 加上 16G 内存在 Fedora 不会爆内存&lt;/p&gt;
&lt;p&gt;别的游戏像什么在 Steam 发售的 Galgame 自然也不必多说，我测试的柚子社的可以玩，用 Unity 写的也可以玩&lt;/p&gt;
&lt;h2&gt;使用Bottles&lt;/h2&gt;
&lt;p&gt;在 Steam 上打游戏很“傻瓜式”，那如果我们想添加一些非 Steam 的游戏，会不会又要回到之前的那种要手敲命令行的年代？&lt;/p&gt;
&lt;p&gt;其实也不用，没想到真的非常超级无敌简单&lt;/p&gt;
&lt;p&gt;打开终端，确保你的 Fedora 已经添加了 Flathub 源：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;flatpak remote-add --if-not-exists flathub https://flathub.org/repo/flathub.flatpakrepo
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装 Bottles：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;flatpak install flathub com.usebottles.bottles
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了管理 Flatpak 的“容器权限”，必须安装 Flatseal（这是可视化的权限管理工具）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;flatpak install flathub com.github.tchx84.Flatseal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由于 Flatpak 是沙盒机制，默认情况下 Bottles 看不到你的硬盘文件，需要通过 Flatseal 来“允许”它访问：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/950e5e4582296c711d4de53e062cfc82.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后打开 Bottles 来管理 Galgame 的运行环境：&lt;/p&gt;
&lt;p&gt;选择 Application 或 Custom（不要选 Gaming，Gaming 会预装很多大型游戏组件，Galgame 通常不需要），我在这里安装的是 hikarifield 的客户端，因为我想玩天使嚣嚣&lt;/p&gt;
&lt;p&gt;按照 Bottles 默认的方式是没办法启动这个客户端的，需要安装一些依赖：&lt;code&gt;dotnet48&lt;/code&gt;、&lt;code&gt;webview2&lt;/code&gt;，然后再开启虚拟屏幕：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/2de03def9ba03bc75ea93346316a5d96.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;运行效果还是非常不错的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/a8209d49572712b267587c6733446234.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/02/af281fac2eb0cc31bc715a50f9b0926d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;折腾到这里我已经有点想买个 Steam Deck 玩一玩了&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.BgEvUEAT.jpg"/><enclosure url="/_astro/hero.BgEvUEAT.jpg"/></item><item><title>游记 - 2026 - 香港</title><link>https://www.juniortree.com/blog/hongkong-2026</link><guid isPermaLink="true">https://www.juniortree.com/blog/hongkong-2026</guid><description>One More Time in Hong Kong</description><pubDate>Wed, 21 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;又去了香港，原本想再去香港是因为汇丰的密码函一直没有寄出，谁知道在今年1月份不要密码函也能激活网银；另一方面是师兄想去香港开户，然后就约一起了&lt;/p&gt;
&lt;p&gt;这次没有从深圳北坐港铁，从落马洲那一块过去，因为那一段路没有座位，还是高铁好，直接送到西九龙，有位置坐&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/40487aa972422df2db8daa30a258cd9a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;西九龙站是一个还挺神奇的站，因为在广州南没有过海关，所以在西九龙就要过海关，刷通行证，然后过了海关之后又要重新刷身份证验车票&lt;/p&gt;
&lt;p&gt;忘记是在哪个地方了，上次也来过&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/b93f887fad1c3a0c4f6055a214c62085.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;很香港的地方&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/940afed6ff263cd5dac2a692f73dcc42.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/f408c5ecea611f9d220c55931e708dd0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我就说这个「油麻地」很眼熟，原来是曹文轩之前有篇小说里面的地方&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/fbd2a9868dafb3a2e14e6df08bc5c27d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;星光大道附近，拍了不少照片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/52d26d5104b7e202041f56b85e033c3c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/7c6e6f339e64deac4eecac1312e6c986.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/ea221714580bd329db6a7bfbe1e54fe6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/89764c9492e38103f91416e6e98917dc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/88024edf75ebdcbd7f23b22a51f5df09.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Soyo：什么啤酒，人家是小麦精！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/620f1e06e4e57722abfad9a995ee74ab.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;逛完以及有点要日落了，黄黄的光&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/044fbad7a37a11d2c620a27654a8e7e0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/1309ed6b153d5134c69b1b9f19259fd0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/f60e31d3406d392e972930f7eddd0f88.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;路上还碰到卖相机的中古店，都是胶片，老板估计也被问烦了，直接说不卖CCD&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/8761b35764e5ae2aef41646fab336bc1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2026/01/76b1f4420777487e461601cbf7d562ff.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.Bld9Z0tO.webp"/><enclosure url="/_astro/hero.Bld9Z0tO.webp"/></item><item><title>回想 - 之前小学的同学都到哪里去了</title><link>https://www.juniortree.com/blog/classmate-pupil</link><guid isPermaLink="true">https://www.juniortree.com/blog/classmate-pupil</guid><description>回忆我在的小城点滴 Part 1</description><pubDate>Sun, 04 Jan 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;突然想写这个是之前有天晚上我突然想起来之前的同学，觉得非常有感触，因此挑选几个之前有过联系，但是后来突然失联的来讲一讲&lt;/p&gt;
&lt;p&gt;下面讲的这些同学，我们父母之间大概是都认识或者有联系的，毕竟是小地方&lt;/p&gt;
&lt;h2&gt;Y同学&lt;/h2&gt;
&lt;p&gt;Y同学是我小学暗恋的一位女生，非常抽象的是，在很多同学的口中说我从三年级就开始暗恋人家，一直暗恋到初中，不过我对W同学确实颇有好感，Y同学在小学的时候也算得上是班里面T0的女生了，成绩非常好，60人的班级里面，她的成绩可以常年稳定在前5&lt;/p&gt;
&lt;p&gt;我一直记得我小学的时候还表白过，我说Y同学我喜欢你，然后她也说喜欢我，但是就没有后续了，现在想想也确实，那么小即使表白了能做啥呢？也不存在责任这么一说&lt;/p&gt;
&lt;p&gt;后来小学毕业，她就去市里面读书了，这里面大概也有她父母的一些原因，具体原因就不细讲了，后来初中毕业的时候我俩成绩差不多，我继续留在县里面读，升入高中部，然后她也在市里面继续读，也继续升入高中部&lt;/p&gt;
&lt;p&gt;疫情的似乎我们聊的颇多，高二的时候我们还经常聊，甚至还一起网易云听歌，后来高三毕业，高考成绩出了之后似乎就没有什么联系了，想想也非常奇妙，后来听说在考了市里面的一所学校，学的是化学，是定向师范&lt;/p&gt;
&lt;h2&gt;W同学和R同学&lt;/h2&gt;
&lt;p&gt;为什么要把W同学和R同学放在一起讲呢？因为他俩的经历也算得上比较传奇了，W同学和R同学俩人小区在一起，然后小学的时候就是大家经常经常磕的一对&lt;/p&gt;
&lt;p&gt;W同学是男同学，成绩要比R同学要好，然后他俩相互喜欢的事情双方父母也知道，可能也就当作玩笑吧，后来读初中的似乎，W同学和R同学去了同一所私立中学读书，初中的时候我几乎和他们没有啥联系&lt;/p&gt;
&lt;p&gt;等到大概高二的时候，W同学突然给我们发短信，说他和R同学又好上了😂，然后在QQ空间里面发了两人在操场散步的照片&lt;/p&gt;
&lt;p&gt;高中毕业后，W同学去了当地市里面的一所医药大学学医，不知道是啥专业，R同学就没有消息了&lt;/p&gt;
&lt;h2&gt;F同学&lt;/h2&gt;
&lt;p&gt;F同学是六年级的时候从别的学校转到我们学校的，我和她其实只相处了一年，但是关系处的挺好的，初中的时候F同学去了县里面的一所私立中学读&lt;/p&gt;
&lt;p&gt;然后高中的时候，她又从私立中学考入我中学的重点班，我们又成了同学，然后又因为文理分班，我去学了理科，F同学学了文科，又分开了&lt;/p&gt;
&lt;p&gt;我高中的时候和F同学文科班的一个女孩子谈恋爱，然后F同学对我谈恋爱的表现非常不满意，觉得我是渣男（正义警察出动），然后当时闹得很不开心，变成了「井水不犯河水」&lt;/p&gt;
&lt;p&gt;然后再后来，高中毕业，我和F同学又加上了微信，然后又成了朋友&lt;/p&gt;
&lt;p&gt;后来总结这段经历，我更觉得是高中的这种高压的环境让我们变得敏感，F同学也有自己家里的原因吧，咱不好说&lt;/p&gt;
&lt;h2&gt;L同学&lt;/h2&gt;
&lt;p&gt;L同学是一位女同学，小学的时候也非常优秀，大概是全班前15左右的水平，初中的时候和我一起升入初中部，虽然在隔壁班，但是我们之间几乎没有啥联系或者交际，我妈妈特别喜欢她，然后她爸爸我妈也认识&lt;/p&gt;
&lt;p&gt;在我妈看来，L同学就是那种特别讨人喜欢的乖乖女&lt;/p&gt;
&lt;p&gt;事情的转折发生在高中，L同学不知道为啥成绩就突然一落千丈，我之后见到她，都是在年级里面成绩最差的班，她的父亲我也经常在校门口碰见，但是很少打招呼，他爹似乎也不认识我了&lt;/p&gt;
&lt;h2&gt;H同学&lt;/h2&gt;
&lt;p&gt;H同学初中和我其实不是一个班，他在我隔壁班，H同学很聪明，初中似乎没怎么用力读书成绩也很好，只是越吃越胖了&lt;/p&gt;
&lt;p&gt;H同学的班主任很喜欢他，有「XX老师亲儿子」之称，H同学的爹和他班主任是同学，平时也非常尊重老师，而且有时候会请老师吃饭（是我我也喜欢这种家长）&lt;/p&gt;
&lt;p&gt;H同学的这种聪明Ending在高中，还是因为比较贪玩，成绩在班级20-30名左右浮动，有时候甚至会掉到30-40名，挺喜欢玩手机和讲话的，甚至有次玩手机连续被抓两次，班主任非常生气，请了家长，让他回家&lt;/p&gt;
&lt;p&gt;最后H同学在初中班主任的建议下，也报了定向师范，在省里面某综合大学的教师学院&lt;/p&gt;
&lt;h2&gt;我&lt;/h2&gt;
&lt;p&gt;作为记录者的我，又站在什么地方呢？&lt;/p&gt;
&lt;p&gt;我从小到大就不是那种成绩很top的学生，小学的时候大概是5-10左右的成绩，小升初的时候，初中招300人，我考到第200名&lt;/p&gt;
&lt;p&gt;初中的时候也差不多是10名左右的成绩，而且全是靠历史/政治/生物/地理这样的「副课」帮我拉分，我主课的成绩其实挺一般&lt;/p&gt;
&lt;p&gt;初升高的时候，考到全县第50名，之后进入高中&lt;/p&gt;
&lt;p&gt;高中成绩很差，尤其是数学，经常150的卷子只能考60多，想到现在我还在做生物信息学就very funny，我们最终都会捡起曾经讨厌的东西，只不过这次，是为了保护我们喜欢的东西&lt;/p&gt;
&lt;p&gt;高中也是靠生物，别的科目差，但是生物可以进年级前几，化学也不错，这也给了我大学坚定选择生物的信念&lt;/p&gt;
&lt;p&gt;或许在父母的饭桌上还能偶尔听到他们的只言片语，但在我的人生剧本里，他们确实已经杀青了&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.CWC_M-yl.webp"/><enclosure url="/_astro/hero.CWC_M-yl.webp"/></item><item><title>2025不完全总结</title><link>https://www.juniortree.com/blog/2025-review</link><guid isPermaLink="true">https://www.juniortree.com/blog/2025-review</guid><description>「Attention is all you need」</description><pubDate>Sun, 28 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;欢迎回顾 2024 年度总结：&lt;a href=&quot;https://www.juniortree.com/blog/2024-review&quot;&gt;我为什么选择转专业 &amp;#x26; 2024回首 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;博客&lt;/h2&gt;
&lt;p&gt;在 25 年包括这篇博客在内，一共写了 34 篇，最近一次的清理删除了 23 年和 24 年写的一些在现在看来价值不高的东西，比如说「如何架设一个我的世界服务器」，一些我觉得能用 AI 解决的就给删掉了，只留下一些可能实用价值不高，但是很好玩，AI 想不到的东西，以后估计会每年/半年清理一次&lt;/p&gt;
&lt;p&gt;因为我觉得你都能用 AI 解决了为啥要看我人工写的拉里拉长的文章&lt;/p&gt;
&lt;p&gt;今年 7 月的时候准备启动一个新的分类，叫做「百问」，当时是想记录一下我发现的各种奇奇怪怪的问题，自然科学、社会科学等等，这个分类只持续了两次就结束了，因为提出一个问题甚至给出一个模糊的答案是很简单的，但是要完完整整地解释清楚还是很困难的，所以我放弃了😋&lt;/p&gt;
&lt;p&gt;25 年写过对我影响最大的文章是这个：&lt;a href=&quot;https://www.juniortree.com/blog/the-courage-to-question-and-choose&quot;&gt;25年中旬：追问与选择的勇气 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一些比较新的文章/笔记会陆陆续续更新在这个新的域名：&lt;a href=&quot;https://www.liueic.com/&quot;&gt;liueic.com&lt;/a&gt;，但是大陆能否访问完全随缘，当然这个站点也会持续更新的，现在这个博客是丢在腾讯云的 Edge Funcation 上，之前用过阿里云类似的产品，还参与过内测，但是 Bug 反映上去产品经理也不管我，想想用着难受就算了&lt;/p&gt;
&lt;p&gt;昨天晚上非常巧的是收到了一条评论通知，是我在 6 月份设置的一个笔记站，因为手头其实还是藏了不少笔记，有些我感觉自己之后也不大可能用到了，于是便索性丢在网上，随爬虫去抓，随缘访问，收到一个学弟/学妹的评论：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/c9f37534384999c52503ce4e9f4eceb0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;开发&lt;/h2&gt;
&lt;h3&gt;前后端&lt;/h3&gt;
&lt;p&gt;在今年 8 月份之前，我做的都是完完全全很传统的后端开发，5 月份的时候和吉吉一起开始做了 App 的开发，开始写 Node，然后 6 月份的时候开始做实习，当时用的技术栈是 FastAPI，我就此再也不想写 Python&lt;/p&gt;
&lt;p&gt;之前我一直尝试用 AI 去帮我写前端，但是效果不佳，今年 11 月的时候 Google 推出了 Gemini 3 Pro，写前端效果非常不错，我因此又攒了一个个人主页，我甚至愿意拿这个去当我的简历：&lt;a href=&quot;https://www.ciallo.cv/&quot;&gt;Academic Profile of Yishu Liu | Vol. 2025&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后也因为实习的关系，帮助社区上线了一个产品，叫做小红卡，收获了第一份感谢：&lt;a href=&quot;https://github.com/PancrePal-xiaoyibao/PancrePal-xiaoyibao/issues/70&quot;&gt;小红卡收到了第一份感谢 · Issue #70 · PancrePal-xiaoyibao/PancrePal-xiaoyibao&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/705fc2debf8ff91597271de52ccd365a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Agent&lt;/h3&gt;
&lt;p&gt;跑了大模型微调的 Pipeline，感觉这东西大家都能做，GitHub 已经有人给出了非常简单的 Factory，但是如何获得高质量的数据尚且不知道&lt;/p&gt;
&lt;p&gt;另外一个有趣的想法是，大家现在都把大模型所谓的「智慧」称之为“大参数”之上的「涌现」，但我觉得其实也不完全对，比如说我们背单词出现 abandon 就开始 a b 巴拉巴拉，对于简单的对话大模型确实可以以这种形式进行涌现，但如果是更复杂的内容呢？如果仅仅是「涌现」到底能不能做到呢？&lt;/p&gt;
&lt;p&gt;2024 年底到 2025 年，大家都在搞 Inference-time Compute（推理时计算）（类似 OpenAI o1 或 Gemini Thinking 的模式），也还是尚且不知道这到底算不算是未来&lt;/p&gt;
&lt;p&gt;但其实今年做过最好玩的事情是做 Agent 开发，我一直对 ChatGPT 或者 Gemini 的 Deep Search 的这种模式充满好奇，我想知道他们是如何在多个循环内，长时间如此高频率地调用各种个样的搜索工具，而且能保证数据的可靠，不出现幻觉的&lt;/p&gt;
&lt;p&gt;然后我就尝试自己简单实现了一个多智能体的一个小项目，项目结构大概是这样的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deepsearch-agent/
├── src/
│   └── agents/
│       ├── __init__.py
│       ├── base.py          # 智能体基类
│       ├── config.py        # 配置和提示模板
│       ├── planner.py       # 规划智能体
│       ├── researcher.py    # 研究智能体
│       └── synthesizer.py   # 综合智能体
├── tests/
│   ├── unit/               # 单元测试
│   ├── integration/        # 集成测试
│   └── conftest.py         # 测试配置
├── synthesis/              # 生成的报告存储目录
├── main.py                 # 主应用程序
├── pyproject.toml          # 项目配置
└── Makefile                # 开发命令
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以其实还是挺简单的，如果要实现和他们一样的效果，恐怕还需要再加入一些新的功能，但至少我自己实现的效果我还是很满意的&lt;/p&gt;
&lt;p&gt;临近期末，25 年大概也不会做更多的小实验或者尝试了，希望过年能继续做一些原型设计和小实验&lt;/p&gt;
&lt;p&gt;今年做的比较多的工作是「上下文管理（Context Management）」、「提示词工程（Prompt Engineering）」、「工具调用（Tool Calling）」、「流程编排（Workflow Orchestration）」，对「注意力」有了一些新的想法和理解&lt;/p&gt;
&lt;h3&gt;业余无线电&lt;/h3&gt;
&lt;p&gt;终于拿到呼号了，在北京拿到的，BD1BND，在广州和许多友台通联了，一共通联了 20 多位友台，上的最多的中继是越秀金沙 BR7JCC 和湘西八斗山中继&lt;/p&gt;
&lt;p&gt;26年 1 月份就可以考 B 了！我要玩短波&lt;/p&gt;
&lt;h2&gt;旅行&lt;/h2&gt;
&lt;p&gt;今年去了五个地方玩，重庆、贵州、广州、香港、青岛&lt;/p&gt;
&lt;h3&gt;重庆&lt;/h3&gt;
&lt;p&gt;重庆是一月份的时候去的，人其实不多，而且吃得好，住的也好，具体的游记可以看这一篇：&lt;a href=&quot;https://www.juniortree.com/blog/chongqing-2025&quot;&gt;游记 - 2025 - 重庆 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/f1feea9ca77ee2ce1bae3ed1fe86047b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;贵州&lt;/h3&gt;
&lt;p&gt;第一次开这么远的高速，大多数时间都在车上睡觉，自驾游体验尚可，如果再给我机会我可能更愿意坐高铁：&lt;a href=&quot;https://www.juniortree.com/blog/guizhou-2025&quot;&gt;游记 - 2025 - 贵州 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/80c7bd7794642698f13afae9166cc002.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;广州&lt;/h3&gt;
&lt;p&gt;广州还是很亲切的，因为有条珠江，晚上饭吃完可以绕着珠江转呀转呀转呀，转完可以整杯瑞幸喝一喝，生活还是惬意的&lt;/p&gt;
&lt;p&gt;去广州参加了当地火腿的聚会，第一次交换了 QSL 卡片：&lt;a href=&quot;https://www.juniortree.com/blog/ham-in-guangzhou&quot;&gt;随记 - 参加广东业余无线电协会活动 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/16b1338a0c77f31b6c95f8968e9b64fd.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;香港&lt;/h3&gt;
&lt;p&gt;因人而异的地方，我不喜欢这儿，人太多，高楼幕墙反射下来的光晃眼睛，玩了半天就回广州了：&lt;a href=&quot;https://www.juniortree.com/blog/hongkong-2025&quot;&gt;游记 - 2025 - 香港 • Liueic&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/e2d4d8032caf7cd390f7e1e931a5bb87.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;青岛&lt;/h3&gt;
&lt;p&gt;喜欢海，青岛有海，所以喜欢青岛（香港：偏心这一块），国庆的时候整个山东都在下雨，青岛也是，青岛吃的还行，海肠饭比较水，海肠吃起来脆脆的，还是辣椒好吃&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/d6f39510d3f1dfe5b2ad9a7208598faa.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;去爬了泰山，依旧大雨，差点交代在上面，然后当天就坐高铁回北京，中午吃了汉堡王，吃完就睡觉&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/439975d3a959c2cf1e0862859635606d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;学业&lt;/h2&gt;
&lt;p&gt;比大一有意思，期末感觉是一场大型的背书比赛，有机会可以写一些 Course Review，不过反正都是必修课，Review 来 Review 去总归是要上的，而且课程质量其实不低&lt;/p&gt;
&lt;p&gt;周三在北一吃饭的时候碰到刘良玉老师，我大一还在物理系的时候上过他的选修课，对他印象非常好，他对我的印象也很好，然后当时我和他说了我想转专业的想法，周三的时候我半开玩笑地问他，我问他是否还记得我&lt;/p&gt;
&lt;p&gt;然后他说他还记得我，是那个要转专业的同学，然后又问我近况如何，邀请我去他们实验室做客&lt;/p&gt;
&lt;p&gt;也是因为大一在物理系上的那门选修课，也认识了现在带我做科研训练的导师，杨采青老师，大一的时候还没有确定是否真正要做生物信息学，现在来看这条路还挺适合我的，我也做的非常开心&lt;/p&gt;
&lt;p&gt;如果有人以后问我，如果想跨行干某某事情的时候，我一定会让他大胆地去和这个行业的人去交流，哪怕最后没有成功，但至少是宝贵的经历&lt;/p&gt;
&lt;p&gt;周四整理资料的时候无意翻到之前转专业的时候演讲稿，是 23 年 9 月写的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/e3e43b50f1d7c3be84dde64472b51293.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;现在看虽然有些「用力过猛」，而且突然想起来已经是两年前的事情了，恍如隔日&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;我的个性签名是：「你应当选择你热爱的，只有热爱的东西才能倾注一切」，这句话其实是出自一个陌生网友的 Comment 里面的，原文是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;某些时候你不知道喜欢什么，然后模糊的选了一个方向。某些时候你知道自己喜欢什么，但你受限于资源只好选择了别的。务实的说法是，热爱的可以当做爱好，专业则不一定需要热爱，但人无法绝对理性地计算得失，从究竟上说，你应当选择你热爱的，只有热爱的东西才能倾注一切&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我觉得我比很多人都要幸运的是，我父母没有让我背负起必须要光复整个家族的使命，读书也好，工作也罢，活着就行，另一方面，和很多人交流后，我觉得稀里糊涂地活着实在是太难受了，即便是不知道一个很确切的目标，也应当向着至少自己不反感的方向走，我实在是住在象牙塔里面的人&lt;/p&gt;
&lt;p&gt;「你应当选择你热爱的，只有热爱的东西才能倾注一切」，我想这句话和费曼说的「The pleasure of finding things out」是一样的，在人生这个复杂的非凸优化问题里，寻找全局最优解往往是不可能的，甚至那个目标根本就不存在，只要你每一步都走在“梯度 &gt; 0”（哪怕只是微弱的喜欢，或者仅仅是不讨厌）的方向上，拒绝负梯度（讨厌的方向），积分下来，的人生轨迹就是一条漂亮的上升曲线&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.LznOgxtd.webp"/><enclosure url="/_astro/hero.LznOgxtd.webp"/></item><item><title>COSCon&apos;25过后，我的一些想法</title><link>https://www.juniortree.com/blog/coscon25</link><guid isPermaLink="true">https://www.juniortree.com/blog/coscon25</guid><description>现在、未来，我们、AI与开源</description><pubDate>Mon, 08 Dec 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;物理学不存在了&lt;/h2&gt;
&lt;p&gt;主会场上午最后的一个圆桌讨论是庄老师主持的，名字叫做「当 AI 颠覆 Coding，工程师的进化与开源的未来」&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/0361cb9de5c3f29ab57ab61498ee0636.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;具体讨论的细节我记得不是很清楚了，第一轮提问大家都把问题回答的差不多了，然后庄老师就说，之前发了问题没想到大家一口气都回答了，那索性就临时提出一个问题：&lt;/p&gt;
&lt;p&gt;“当 AI 这样继续发展出去，会不会担心「程序员」这个职业会被取代”&lt;/p&gt;
&lt;p&gt;现场还有一个互动的环节，庄老师让大家举手，说认为程序员这个职位会被取代的举手，大概是五五开&lt;/p&gt;
&lt;p&gt;现场圆桌讨论的嘉宾基本上都是很乐观的，就是他们会觉得 AI 就只是人类程序员的一个 Copilot，程序员的职位发生了变化，从原来的手撕循环「进化」到了一个产品经理或者架构师的角色，程序员的这个角色是不会消失的&lt;/p&gt;
&lt;p&gt;我本身不是一个「程序员」，之前看到公众号的标题，叫做《AI 时代的程序员就和会写字的人被称为书法家一样》，可能在很多人眼中，就觉得程序员应该是一个和旧时代「知识分子」一样的东西，但是现在程序员的这个 Gap 被 AI 填补了，很多人其实是不爽的，编程正在经历“脱魅”过程&lt;/p&gt;
&lt;p&gt;但就我个人而言，我觉得我对 AI 的发展是悲观的，我手上有很多暂时「烂尾」的项目，之前有可能是因为没有时间而被搁置了，但现在是更类似于像「休眠」，就是我心中有意识地觉得，可能过几个月、几个礼拜甚至几天就会有更厉害的大模型，更厉害的 AI 工具能帮我解决这个问题，我时常会想，我的意义在哪里呢？&lt;/p&gt;
&lt;p&gt;这种感觉让我想起了《三体》里「物理学不存在了」之后的科学家们——当认知的边界被更高维度的力量随意打破时，原来的体系确实会显得甚至有点可笑，我们的努力在哪里？我们比不上 AI 进化的速度&lt;/p&gt;
&lt;p&gt;尤其是现在 Agent 很火，我是见证过从 LLM 时代进入到 Agent 时代的，当时我们都从 Web 界面复制粘贴代码，但是现在 Agent 能帮你干很多事情，更加自动化了，现在你只要输入你的想法，AI 就能近乎全自动，只会问你要权限后就能写出堪用的 Demo&lt;/p&gt;
&lt;p&gt;我们可以大胆地想一想，如果 AI 进一步发展，会不会出现像人类程序员一样，自己发现问题，然后自己尝试去解决，在我写这篇文章的 2025 年 12 月 8 日，Cursor 里面甚至已经出现可以自己提 Issue 并且自动修复的功能了，我大胆预测会不会在未来 3 个月内我说的这个功能就会被初步实现，如果 AI 真的能“自己发现问题并解决”，人类的最后一道防线，「定义问题」似乎也岌岌可危&lt;/p&gt;
&lt;p&gt;那如果 AI 并没有向着我们想的路径发展，如果 AI 届的「摩尔定律」失效了呢？如果 AI 泡沫破碎了呢？如果大家发现，不管怎么堆算力、怎么堆参量，大模型还是没有办法变得「更聪明」，这时候我们又要如何面对呢？&lt;/p&gt;
&lt;p&gt;那我觉得我还是会失望的，黄老师和我说，说大模型是第三次工业革命，这场工业革命每个人都有机会参入进来，但如果这场工业革命就以此「一地鸡毛」而收场，我想我是不舒服的，作为一个个体，我希望我能有机会见证到 AGI 的真实落地&lt;/p&gt;
&lt;p&gt;因为担心自己被淘汰而希望 AI 停滞发展，我觉得这种想法很可悲，你不能站在先进生产力这辆飞驰的火车的对面，一定会撞「大运」的，如果这场革命以泡沫收场，那才是最大的悲剧，因为那意味着我们触碰到了智力的天花板，人类被困在了地球上&lt;/p&gt;
&lt;p&gt;想起了&lt;strong&gt;卢德运动：&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;卢德主义者&lt;/strong&gt;（英语：Luddite &lt;a href=&quot;https://zh.wikipedia.org/wiki/Help:%E8%8B%B1%E8%AA%9E%E5%9C%8B%E9%9A%9B%E9%9F%B3%E6%A8%99&quot;&gt;/ˈlʌdaɪt/&lt;/a&gt;），或译&lt;strong&gt;勒德分子&lt;/strong&gt;、&lt;strong&gt;卢德分子&lt;/strong&gt;，是19世纪&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%8B%B1%E5%9C%8B&quot;&gt;英国&lt;/a&gt;民间对抗&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E5%B7%A5%E6%A5%AD%E9%9D%A9%E5%91%BD&quot;&gt;工业革命&lt;/a&gt;、反对纺织工业化的社会运动者。在该运动中，常常发生毁坏&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E7%B4%A1%E7%B9%94%E6%A9%9F&quot;&gt;纺织机&lt;/a&gt;的事件。这是因为工业革命运用&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E6%9C%BA%E5%99%A8&quot;&gt;机器&lt;/a&gt;大量取代人力劳作，使许多手工工人失业。后世也将反对任何新科技的人称做卢德主义者。1779年英国&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%90%8A%E6%96%AF%E7%89%B9&quot;&gt;莱斯特&lt;/a&gt;一带一名名叫&lt;a href=&quot;https://zh.wikipedia.org/w/index.php?title=%E5%85%A7%E5%BE%B7%E2%80%A7%E7%9B%A7%E5%BE%B7&amp;#x26;action=edit&amp;#x26;redlink=1&quot;&gt;内德‧卢德&lt;/a&gt;的织布工曾怒砸两台织布机，后人以讹传讹成所谓卢德将军或卢德王领导反抗工业化的运动，遂得此名 [[1]] (https://zh.wikipedia.org/wiki/%E7%9B%A7%E5%BE%B7%E9%81%8B%E5%8B%95#cite_note-1)。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;实习与学生工作&lt;/h2&gt;
&lt;p&gt;我之前一直对找实习或者投简历这种事情多少存在一种恐惧，我很担心和别人聊久了或者处事处久了会觉得我是一个「假技术主义者」，就是技术力没有那么强，虽然就这种想法在我和一些朋友相处了烟消云散，但是在我自己申请项目的时候还是会没有那么有安全感&lt;/p&gt;
&lt;p&gt;在青少年的分论坛，有一个老师分享了他在 GSoC（Google Summer of Code）的一些经历，我颇具启发&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/b4793f43eeb07997b0248945b2d4fdff.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后我向他提了几个问题，问题比较发散，我首先问他，我说实习都是类似于「赶鸭子上架」，边做边学的么？然后他告诉我说，他在参加 GSoC 之前也没有干过 Linux Kernel 的开发，也是进入到项目之后才慢慢开始接触的，并且这个实习影响了他之后的职业方向选择&lt;/p&gt;
&lt;p&gt;第二个问题是，如果他带过的一些参与开源的同学在加入暑期开源项目之后，又离开了没有选择留下来，会不会觉得有些难过或者遗憾？他和我说刚开始确实是会这样的，会觉得有些遗憾，但是逐渐他觉得说即便是没有继续留在社区，这段经历应该也会对他产生影响，也有不少选择继续留下来做开发的同学，这些同学后来也都成为了社区的主心骨&lt;/p&gt;
&lt;p&gt;这时候我想起了中午我和庄老师在一楼茶歇区聊了下天，然后我很没有礼貌地问他，我说我觉得国内开源的氛围并没有我想得那么好，然后和我非常坦诚地回答了这个问题，告诉我国内的开源年会和国外确实没法比，但是他觉得，他每年都在看报名开源大会的人数，从原来的可能几百人变到今年的一千多人，他觉得数字每年都在变得更高，因此他觉得做这件事情是有意义的&lt;/p&gt;
&lt;p&gt;另外一个反思是我之前做过的一些学生工作，大一的时候做了一些社团的工作，但是大受打击，从此之后就不上心了，DragonOS 的开发团队给了我一些新的感触&lt;/p&gt;
&lt;p&gt;首先就是刚开始建立一个社群，大概是是没有很多的正响应的，我就是那种很难接受冷暴力的，所以就放弃了，想法、技术、组织能力缺一不可，学生工作也就是如此&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/8038d523af517df5b453b604c428ce1d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;吃饭、聊天和我们&lt;/h2&gt;
&lt;p&gt;因为做开源这件事情，我认识了很多朋友，大家都来自于不同的背景，有学生、工程师、企业高管、医生、老师等等，如果一定要找出什么共同点，我觉得大家都很有想法，有很强的表达欲，就是那种「快把麦克风给我」的强烈表达欲，但是这种表达欲并不是那种入侵式的，而是一直很友好，很舒服的「灵魂共振」&lt;/p&gt;
&lt;p&gt;这种很舒服的感受在于，哪怕你刚进来的时候不知道说什么，但是等你真正坐在里面认真听讲，也会有一种想参与讨论的感觉，我想起了《Death Stranding》里面的「连接」，开源给我的感觉就是一群人，因为一种很纯粹的情感，因为我们想干一件事情而聚集在一起，小 X 宝社区更是如此，一群来自各行各业，不同背景，甚至社区里有些人对编程一无所知，但是因为我们有一个共同的目标，怀着一颗极为虔诚的心，聚集在一起，才创造了这样的一个社区，背景的异质性让我们能如此特殊，未来的「护城河」，也许不是你能写多快的代码，而是你能凝聚起多少这样虔诚的人&lt;/p&gt;
&lt;p&gt;的确，在日常的社区治理中，我们会有各种各样的问题，会 Battle，但不管怎么样，每个人都会希望社区向好的方向去发展，人类在争吵中交换的不仅仅是逻辑，还有对现状的直觉、对未来的赌注，以及对他人的信任，这也是为什么即使 AI 再发达，人类依然需要坐在一起开会、吵架、然后握手言和&lt;/p&gt;
&lt;p&gt;不知道 COSCon’26 会不会还在北京，如果有机会的话，我还想再去一次，也许未来我也能代表社区去参加一次圆桌会议，我想和更多的老师和同学交流，我想做自己真正热爱的事情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/76f1bb4a9c101fd2e2f2c6fd2797a7f6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/763a12c5152b7f4c44aab8dde644e4a0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.BnPQL7EM.jpg"/><enclosure url="/_astro/hero.BnPQL7EM.jpg"/></item><item><title>Start Coding</title><link>https://www.juniortree.com/blog/coding-with-me</link><guid isPermaLink="true">https://www.juniortree.com/blog/coding-with-me</guid><description>一些关于非科班参与Coding的想法与经历</description><pubDate>Fri, 28 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直以来有很多朋友对我的Coding技术感到十分好奇，一方面我并非计算机或者信息工程相关的专业出身；另一方面又能和群里面的各路大神侃侃而谈，我并没有感到自己的技术很不错，或者受过专门的训练，我的算法学得很烂，相反，我一直自嘲自己是一个“野路子”，因此我想把我自己做开发的一些经历和想法写下来，也希望对同样想了解计算机的你一些启发&lt;/p&gt;
&lt;h2&gt;需求是最好的老师（The Necessity）&lt;/h2&gt;
&lt;p&gt;科班教育往往是自下而上的，我在物理系光电信息专业读过一年的时间，大一的时候刚好上了C语言程序设计的课，老师教你写代码，但是除了作业里面的各种循环和判断，我们几乎不知道我们写出来的代码到底有何作用，也不知道能不能做出一个真正有意义的产品&lt;/p&gt;
&lt;p&gt;我觉得我的需求是自上而下的，我刚开始接触 Coding 是因为我有一个很急切的需求，当时我想下载一个网页我全部照片，如果仅仅是用鼠标右键的方式，效率太慢，为了解决这个问题，我尝试去学习了「爬虫」，这时候，技术不是目的，而是手段，这种为了达成目的而不得不学的紧迫感，是学校里给不了的&lt;/p&gt;
&lt;p&gt;你需要感知到自己生活中存在哪些需求，比如说我想把我写的东西展示给大家看，你可能需要自己建一个博客；你可能想使用摄像头快速地去数显微镜里面的线虫，你可能需要用YOLO做识别；你可能觉得校园网每次都要登陆有点麻烦，你可能要自己去抓包，然后写脚本…&lt;/p&gt;
&lt;p&gt;这些都是日常中可能存在的需求，技术的本质是让生活变得更加便捷，出于这一点进行考量，我们其实有很多文章可以做&lt;/p&gt;
&lt;h2&gt;从模仿到复用的进阶 (The Pattern Recognition)&lt;/h2&gt;
&lt;p&gt;刚开始做Coding的朋友经常会有一个误解，觉得代码都必须一行一行自己写的才算是真正懂了，但其实，直接拿别人做好的东西也是一件很常见的事情，这绝对不是贬义词&lt;/p&gt;
&lt;p&gt;我写的第一份爬虫代码也并不是自己从头开始写的，我是找了个B站的视频，然后一行一行敲下来的，虽然当时我也不知道这代码有啥用，但是最终跑通了，我很开心&lt;/p&gt;
&lt;p&gt;另外一个就是我尝试建立了一个自己的博客，我当时用的是可视化面板，我也是第一次接触Linux，对命令行很不习惯，然后用一种叫做「容器化」的很傻瓜式的技术，基本上就是复制粘贴，完全不知道什么意思&lt;/p&gt;
&lt;p&gt;但是在这个过程中，在“不知道为啥”的情况下，我成功把服务跑起来了，给我积累了很强的“手感”，我知道咋分辨这个教程是精品教程还是垃圾教程，知道如何排查信息，如何查看日志&lt;/p&gt;
&lt;p&gt;自己亲自动手去做实验，这个过程的经验积累是迅速的，哪怕你服务没跑起来，但是你至少知道这样不行&lt;/p&gt;
&lt;h2&gt;正向反馈循环 (The Feedback Loop)&lt;/h2&gt;
&lt;p&gt;生物学学里面有一个词叫叫做「正反馈调节」，写代码的魅力之处在于「即时反馈」，你敲下一行代码，就能马上看到效果，甚至是部署一个可以服务于你自己和朋友的网站，这种成就感会让你想：“既然能跑个博客，我是不是也能跑个私有云盘？是不是能跑个自动化脚本？”&lt;/p&gt;
&lt;h2&gt;建设性的不满 (Constructive Discontent)&lt;/h2&gt;
&lt;p&gt;一个非常重要的分水岭在于，你想把它“做完”，还是“做好”&lt;/p&gt;
&lt;p&gt;在这个圈子里，很多停留在“脚本小子”阶段的人，他们的心态通常是：“这教程能跑通吗？能跑通就行，不能跑通我就换一个教程”一旦跑通了，他们的探索就结束了&lt;/p&gt;
&lt;p&gt;技术的进步，往往在于对于现状的不满，比如我用WordPress建了一个自己的博客，我请朋友来访问，朋友和我抱怨说加载页面转了有半分钟才访问进去；又或者你自己觉得你这个博客的主题不太好看，你想要个猛男粉，结果原作者给你个青青草原色&lt;/p&gt;
&lt;p&gt;因为上述原因，所以你开始研究系统的底层逻辑，为什么慢，我要怎么改代码&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;是因为 VPS 的线路不好？（开始研究 CN2/GIA，TCP 拥塞控制，BBR 算法）&lt;/li&gt;
&lt;li&gt;是因为静态资源太大？（开始研究 CDN，对象存储，Gzip 压缩）&lt;/li&gt;
&lt;li&gt;是因为数据库查询太久？（开始研究 MySQL 索引，Redis 缓存）&lt;/li&gt;
&lt;li&gt;这个主题是什么东西写的？（是 Vue 还是 React，是 Jinja2 还是 EJS）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以我真的很推荐你去找一个实际存在的问题去解决，最好的方式就是你自己去建一个博客，然后写文章，然后把网址发给你的朋友看&lt;/p&gt;
&lt;p&gt;一旦你开始不满足于“照抄作业”，你就会发现现成的 Docker 镜像可能不满足你的需求，于是你开始写自己的 &lt;code&gt;Dockerfile&lt;/code&gt;；你发现别人的脚本逻辑有 Bug，于是你 Fork 下来自己修&lt;/p&gt;
&lt;p&gt;这就是从“消费技术”到“创造技术”的跨越，优化优化再优化，折腾折腾再折腾&lt;/p&gt;
&lt;p&gt;本质上就是一个对现状不满足，要一直折腾的情况&lt;/p&gt;
&lt;h2&gt;氛围编程 (Vibe Coding)&lt;/h2&gt;
&lt;p&gt;最近有一个非常流行的概念叫做Vibe Coding，中文翻译过来叫做「氛围编程」，将程序员从繁琐的语法（Syntax）中解放出来，专注于逻辑和设计（Semantics）&lt;/p&gt;
&lt;p&gt;有不少朋友问我，说让我推荐学一门语言&lt;/p&gt;
&lt;p&gt;如果你是首师大的理科生，你要不是物理系的，大概率是会上一门程序设计的课，然后会让你学Python，就我个人感觉而言，我觉得这门课有点水，像在背字典，学会了 &lt;code&gt;for&lt;/code&gt; 循环的 10 种写法，但不知道拿它来干嘛&lt;/p&gt;
&lt;p&gt;其实现在掌握哪门语言其实已经不那么重要了，重要的是想法，你得多接触一些好玩的项目，你得会用AI，你得知道我应该用什么技术去解决什么样的问题，比如说我想做一个博客，那我可能会考虑使用Next.js+TailCSS+Vercel（我相信如果你一点基础也没有，我说的这段话是啥你都不懂），如果你连这些解决问题的基本方法都不知道，那我觉得你就算学了很多门编程语言其实也没太大意义，等到你当前语言的生态不能满足你的项目需求了，你自然而然会去尝试别的语言，尝试另外一种生态&lt;/p&gt;
&lt;p&gt;在 AI 时代，“知道有什么”（Knowledge Breadth）比“知道怎么写”（Implementation Detail）更重要，因为 AI 可以帮你写代码，但 AI 目前还很难帮你做技术选型，或者说它给你的选型有可能完全不适合你的项目，如果你不知道 Vercel 的存在，你可能会傻傻地去买服务器、装 Nginx、配置 SSL，浪费大把时间，你的核心竞争力在于你的“技术视野”和“品味”&lt;/p&gt;
&lt;p&gt;编程语言仅仅只是工具，写爬虫？Python 库多，用 Python；写高并发后端？Go 协程强，用 Go；写前端？没得选，JS/TS，编程语言中其实也不存在说这个语言能干，这个语言不能干的情况，绝大多数决定语言的使用场景和它的生态有关系&lt;/p&gt;
&lt;p&gt;你是因为&lt;strong&gt;需求&lt;/strong&gt;走到了这里，而不是因为你“只会”这门语言，AI 极大地降低了语言切换的成本（Language Switch Cost），我现在经常用 Cursor 或 Claude Code 写我不那么熟悉的语言，只要我的逻辑是对的，AI 就能帮我把“方言”翻译对&lt;/p&gt;
&lt;p&gt;在 Vibe Coding 的模式下，**自然语言（Natural Language）其实变成了最高级的编程语言，**你描述清楚：“我要一个响应式的博客头部，左边 Logo 右边导航，手机端折叠”，这其实就是代码&lt;/p&gt;
&lt;h2&gt;解决问题的快乐 (Pleasure of Finding Things Out)&lt;/h2&gt;
&lt;p&gt;这句话其实源自我们物理系的老登费曼说的，原话是：“The pleasure of finding things out.”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Vibe Coding 时代的乐趣，反而回归了最本真的「表达欲」，&lt;/strong&gt; 当AI把语法负担都卸掉了，编程重新变成了「描述想法→看见想法成真」的游戏，你不再需要先成为C语言大师才能谈创意，你像导演讲戏一样描述需求，代码就生成了，每个人都是这场革命的参与者和创造者&lt;/p&gt;
&lt;p&gt;作为非科班出生的我，反而会觉得 Coding 是一件还算有趣的事情，因为我不用去深究算法，不用把这个当作任务，也许某天我感觉这个有意思，我还会特意去看一看&lt;/p&gt;
&lt;p&gt;当那个 Bug 被你揪出来，或者当你终于搞懂了 Nginx 的反向代理到底是怎么把流量转发给你的容器时，那种“我搞懂了”的瞬间，那种“原来世界是这么运行的”的通透感，是会上瘾的&lt;/p&gt;
&lt;p&gt;我也希望你能感受到和我同样的乐趣&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.B6jstnYg.png"/><enclosure url="/_astro/hero.B6jstnYg.png"/></item><item><title>随想 - 回望高中来时路</title><link>https://www.juniortree.com/blog/memoir-01</link><guid isPermaLink="true">https://www.juniortree.com/blog/memoir-01</guid><description>回望高中来时，吐苦水</description><pubDate>Thu, 27 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近一直在忙学业相关的东西，一瞬间涌入很多想法，但又不知道从何讲起，20号那天有一个回校宣讲的报名，有个同学劝我，他说我要不要去报名，去我的高中学校，和我的学弟学妹讲一讲我的故事&lt;/p&gt;
&lt;p&gt;我刚开始确实有过这个想法，一方面我觉得我可以讲一讲我是如何拿到开源之夏的实习，我在项目中都做了些什么，为什么会选择和自己本专业完全不一样的方向；另一方面，我可以讲一讲我是如何从物理系转入到生科，这个过程我经历了什么，我是怎么想的，我现在在生科做的一些很有意思的事情，接触到的老师、同学，以及我们大学讲的生物学是什么样子的&lt;/p&gt;
&lt;p&gt;后来仔细想想，便把这个想法给搁置了，一方面我的本科学校确实说不上好，虽然我和我父母都还算比较满意；另一方面我觉得这是很私人的事情，我觉得我干的事情也算不上很主流的「成功途径」，恐怕去宣讲，只会让更多学弟学妹入坑，想想便算了&lt;/p&gt;
&lt;p&gt;我觉得我的高中其实并不是开心或者值得回忆的，高中的压力确实很大，现在看来，当时做出的很多事情都非常滑稽，卷入各种没有任何意义的青春期争端，高中的成绩算不上好，甚至可以称得上是差了&lt;/p&gt;
&lt;p&gt;大二上的时候，很多同学进入实验室做科研立项，我忽然想起了高中的时候参加的「培优」，「培优」并不是每个人都能有这样的机会参与，尖子班中的尖子，大概每个班能有十个人，一个年级六个班，也就是60个人，再加上我这种「关系户」，我原本是没有资格去参加的，所以其实让我混在这样一群「尖子」里面，我感到非常不安，甚至有点猥琐&lt;/p&gt;
&lt;p&gt;说是培优，其实是去机房上网课，上各种各样，奇奇怪怪的数学、物理网课，讲竞赛题目，我本身数学就非常不好，所以培优对我来说，就是每周奖励自己两个小时的上网时间，除掉培优的网课，我听歌，刷B站，玩4399&lt;/p&gt;
&lt;p&gt;直到高三的时候，我实在觉得培优对我来说毫无意义，我感觉自己不能再这样下去了，所以我去找我班主任说，我说我要退出培优&lt;/p&gt;
&lt;p&gt;然后我班主任和我说，我能参加这个培优是因为我爹的原因，我爹让我退出，我才能退出，然后我就跑回家，问我爹，我爹说随便我自己，我就下定决定，我说我不去了&lt;/p&gt;
&lt;p&gt;事实上，在离开培优后，我才感觉我是我自己，我不喜欢自己高中的原因，其中有很多就是因为父母在这个单位工作，周围的很多老师都是同事，从小到大看我长大的叔叔阿姨，在这种环境下，其实很容易产生不安，总会感觉有很多双眼睛盯着自己，尽管我父母可能察觉不到，但这是我真真切切能感受到的，我感觉自己要窒息&lt;/p&gt;
&lt;p&gt;为什么会从科研立项这个事情联想到培优，因为我觉得，很多事情刚开始大家都会趋之若鹜，看到别人做了这个事情，那我也要去做，觉得做的这个事情是光荣的，是好的，但其实真正等自己参与进行发现自己压根就不喜欢，收获不到幸福感和收获感，便放弃或者是摆烂&lt;/p&gt;
&lt;p&gt;这种情绪的产生，可能源于同辈压力，也有可能源于路径依赖，就是传统上大家认为这样做是正确的，是成功的，所以你必须要这样去做&lt;/p&gt;
&lt;p&gt;我还记得高一的时候，当时还没有分班，老师让我们写一个计划，就说自己未来要考xxx的大学，当时很多人都写了自己要考多少985、211，但其实最终能接近自己目标的其实很少，我应该算其中之一，我当时填的是湖师大，高考也恰好能去，我从刚开始就知道自己有「几斤几两」，我也知道自己想要什么，所以我高考其实很满足，这种“所求即所得”的幸福感，其实比那些心比天高、命比纸薄的落差感要珍贵得多&lt;/p&gt;
&lt;p&gt;所以其实唯一真正值得回忆的，其实是高考前的一个月，那时候我真的感觉自己解脱了，我感觉自己啥都会，我知道自己一定能考好，甚至有点期待考试，期望自己能再一次刷新自己的分数，我和父母也和解了，这是高中少有的和睦期&lt;/p&gt;
&lt;p&gt;但回过头来想，高中的时候我真的能想到这些么，如果我高考落榜？我能否像现在这样大言不惭地像个局外人一样侃侃而谈，我想是极难的，包括现在我偶尔听到作业没交，上课讲话被老师罚站，自习看小说，我现在真觉得这都不是事，可对于当时的我来说，这可比天大&lt;/p&gt;
&lt;p&gt;缺一天课怎么样，少上几节晚自习又能怎样，现在说这些都属于打马后炮，毫无意义&lt;/p&gt;
&lt;p&gt;唯一庆幸的是，我已经走出来了，并且永远不用再回去&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.Dm2aUR_I.webp"/><enclosure url="/_astro/hero.Dm2aUR_I.webp"/></item><item><title>把云原生带入生物信息学</title><link>https://www.juniortree.com/blog/bring-cloud-native-into-bioinfo</link><guid isPermaLink="true">https://www.juniortree.com/blog/bring-cloud-native-into-bioinfo</guid><description>云原生以容器化、工作流编排和弹性计算，让生物信息学告别环境配置噩梦，实现高效可复现的科研分析</description><pubDate>Fri, 14 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什么是云原生&lt;/h2&gt;
&lt;p&gt;在正式进入生物信息学的科研训练之前，我对云原生（Cloud Native）充满兴趣，云原生指的并不是一个具体的产品，而是一套思想和方法，它的核心思想就是：应用从设计之初，就假设它会运行在“云”这种动态、分布式的环境中&lt;/p&gt;
&lt;p&gt;“云原生”这个词现在非常火，但确实很容易让人“不明觉厉”，我来举出一个简单的例子&lt;/p&gt;
&lt;p&gt;比如说你要做一个雕塑，传统的方法，你找来一整块巨大的石头，在上面精心雕刻出城堡的每一个部分——城墙、塔楼、吊桥... 最终，你得到一个完美的、连成一体的“城堡”雕塑&lt;/p&gt;
&lt;p&gt;这种方法的优点是很坚固，一体性强，但当你要对其中的局部进行修改，比如你不喜欢这个塔楼，你可能得把整个雕塑砸掉重来，或者费巨大力气去“凿”，而且如果吊桥塌了，有可能会影响到整个雕塑&lt;/p&gt;
&lt;p&gt;云原生的方法更像是用“乐高”去搭建整个雕塑，你不用一整块石头，而是用一堆标准化的“乐高积木”来搭建，“城墙”是一块积木（一个服务），“塔楼”是另一块积木（另一个服务），吊桥”又是另一块积木（再一个服务）&lt;/p&gt;
&lt;p&gt;你把这些积木（微服务）都放进一个个透明的小盒子里（容器，比如 Docker），再把这些盒子交给一个“超级管家”（编排系统，比如 Kubernetes）来管理&lt;/p&gt;
&lt;p&gt;云原生的方式有几个优点，第一个是快速迭代，比如说你要是不喜欢这个塔楼，你只要把塔楼的“乐高积木”给换掉即可，完全不影响“城墙”和“吊桥”，可以迅速开发&lt;/p&gt;
&lt;p&gt;第二个是高可用性，如果吊桥塌掉了，“超级管家”会自动丢弃掉这个积木，并且迅速替换一个新的上去，在这个过程中，其他部件的功能完全不受影响&lt;/p&gt;
&lt;p&gt;第三个是弹性伸缩，如果某天来参观你的雕塑的人非常多，“超级管家”会立刻自动复制 100 个“城堡”盒子（容器），游客一走，再把多余的盒子收回来&lt;/p&gt;
&lt;p&gt;普通人接触到的不是“云原生技术”，而是“云原生体验”，最相关的体验就是：那些“理所当然”的丝滑和便捷&lt;/p&gt;
&lt;p&gt;最典型的例子就是“双十一”抢购，会有几亿人同时涌入淘宝或京东，云原生系统（那个“超级管家”）检测到史无前例的访问量，它会在几分钟甚至几秒钟内，自动把“支付服务”、“订单服务”这些“乐高盒子”复制成千上万份，分布到全国的服务器上，几小时后，高峰过去，“超级管家”又会自动把多余的几万个“盒子”收回（省钱），这种“需要时无限变多，不需要时立刻消失”的超能力，就是云原生追求的弹性伸缩 (Scalability)&lt;/p&gt;
&lt;h2&gt;云原生能给生物信息学带来什么&lt;/h2&gt;
&lt;h3&gt;「一次编译、到处运行」&lt;/h3&gt;
&lt;p&gt;我想，现在其实接触到云原生技术的同行其实非常多，基本上每台集群上都装的有 Singularity（现在改名叫 Apptainer）&lt;/p&gt;
&lt;p&gt;就我自己而言，我跑流程非常讨厌配环境，尤其是我本地的开发环境是 macOS/Ubuntu，集群上使用比较“稳定”（老）的 CentOS，经常是写代码半天，配环境两天，尤其是碰到一些由 C/C++写的“金标准”软件，我们必须要在本地进行手动编译，这下更麻烦啦&lt;/p&gt;
&lt;p&gt;但如果我们使用 Docker，这个问题将非常容易解决，我们可以将这些软件封装到容器中，就可以实现“一次编译，到处运行”的效果&lt;/p&gt;
&lt;p&gt;比如说我这几天在折腾一个生成残基图的工具—— &lt;code&gt;ERRAT&lt;/code&gt;[^1]，这个工具是 C++写的，意味着它依赖底层的 C/C++ 库 (like &lt;code&gt;libstdc++&lt;/code&gt;)，而且你必须配置好完整等构建工具链&lt;/p&gt;
&lt;p&gt;结果就是，在本地 (macOS/Ubuntu) 辛辛苦苦编译通过了，一拿到集群 (CentOS) 上，要么是动态链接库（&lt;code&gt;.so&lt;/code&gt; 文件）缺失，要么是 &lt;code&gt;glibc&lt;/code&gt; 版本太低，要么是 CPU 架构不匹配……总之就是跑不起来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/f29300a0f5ef2cb6232af89cb52471b3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;很容易就想到用容器的方法，我们可以尝试在容器内对 &lt;code&gt;ERRAT&lt;/code&gt; 进行编译，在这里使用了一种常见的优化容器体积的方法，多阶段编译，第一阶段因为安装了一些编译工具，导致容器的体积比较大；在第二阶段只有 &lt;code&gt;ERRAT&lt;/code&gt; 的运行时，所以容器体积非常小&lt;/p&gt;
&lt;p&gt;我自测第一阶段容器有 200 多 MB，实际编译出来的运行时只有 30 多MB&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-Dockerfile&quot;&gt;# ====================================================================
# ERRAT-CLI 容器化
# 轻量级容器，仅包含 ERRAT-CLI 工具和必要依赖
# 使用多阶段构建优化镜像大小
# ====================================================================

# ====================================================================
# 第一阶段：构建阶段（Builder Stage）
# 安装编译工具并编译 ERRAT-CLI
# ====================================================================
FROM debian:12-slim AS builder

LABEL maintainer=&quot;Protein Analysis Pipeline Team&quot;
LABEL version=&quot;1.0&quot;
LABEL description=&quot;Builder stage for ERRAT-CLI&quot;

# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive

# 配置 APT 使用清华源（可选，提高国内构建速度）
RUN sed -i &apos;s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g&apos; /etc/apt/sources.list.d/debian.sources 2&gt;/dev/null || \
    sed -i &apos;s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g&apos; /etc/apt/sources.list 2&gt;/dev/null || true

# 安装编译工具
RUN apt-get update &amp;#x26;&amp;#x26; apt-get install -y --no-install-recommends \
    build-essential \
    g++ \
    make \
    ca-certificates \
    &amp;#x26;&amp;#x26; rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /workspace

# 复制 ERRAT-CLI 源代码
COPY ERRAT-CLI /workspace/ERRAT-CLI

# 编译 ERRAT-CLI
RUN if [ -d &quot;/workspace/ERRAT-CLI&quot; ] &amp;#x26;&amp;#x26; [ -f &quot;/workspace/ERRAT-CLI/src/errat.cpp&quot; ]; then \
        cd /workspace/ERRAT-CLI &amp;#x26;&amp;#x26; \
        mkdir -p bin &amp;#x26;&amp;#x26; \
        g++ -o bin/errat_cli src/errat.cpp -lm -O3 &amp;#x26;&amp;#x26; \
        chmod +x bin/errat_cli &amp;#x26;&amp;#x26; \
        echo &quot;✓ ERRAT-CLI compiled successfully&quot;; \
    else \
        echo &quot;✗ ERRAT-CLI source not found&quot;; \
        exit 1; \
    fi

# ====================================================================
# 第二阶段：运行阶段（Runtime Stage）
# 只复制编译好的二进制文件，不包含编译工具
# ====================================================================
FROM debian:12-slim

LABEL maintainer=&quot;Protein Analysis Pipeline Team&quot;
LABEL version=&quot;1.0&quot;
LABEL description=&quot;Lightweight container for ERRAT-CLI protein structure analysis tool&quot;

# 设置非交互式安装
ENV DEBIAN_FRONTEND=noninteractive
ENV LANG=C.UTF-8
ENV LC_ALL=C.UTF-8

# 配置 APT 使用清华源
RUN sed -i &apos;s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g&apos; /etc/apt/sources.list.d/debian.sources 2&gt;/dev/null || \
    sed -i &apos;s/deb.debian.org/mirrors.tuna.tsinghua.edu.cn/g&apos; /etc/apt/sources.list 2&gt;/dev/null || true

# 只安装运行时依赖（C++ 标准库等）
# libstdc++6 是 C++ 运行时库，libgcc-s1 是 GCC 运行时库
RUN apt-get update &amp;#x26;&amp;#x26; apt-get install -y --no-install-recommends \
    ca-certificates \
    libstdc++6 \
    libgcc-s1 \
    &amp;#x26;&amp;#x26; rm -rf /var/lib/apt/lists/*

# 设置工作目录
WORKDIR /workspace

# 从构建阶段复制编译好的二进制文件
COPY --from=builder /workspace/ERRAT-CLI/bin/errat_cli /workspace/ERRAT-CLI/bin/errat_cli

# 设置 PATH 环境变量
ENV PATH=&quot;/workspace/ERRAT-CLI/bin:$PATH&quot;

# 设置入口点
ENTRYPOINT [&quot;/workspace/ERRAT-CLI/bin/errat_cli&quot;]
CMD [&quot;--help&quot;]
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译完成后，在本地的 macOS 上 &lt;code&gt;docker run ... errat_image ...&lt;/code&gt;，完美运行；在集群上 &lt;code&gt;singularity run ... docker://your_username/errat_image ...&lt;/code&gt;，也是完美运行&lt;/p&gt;
&lt;p&gt;无论在哪里，&lt;code&gt;ERRAT&lt;/code&gt; 感受到的都是它最“舒服”的、在编译时就固定下来的那个环境，它再也不用担心“水土不服”了&lt;/p&gt;
&lt;p&gt;事实上生信就是有如此多的古董代码和软件，我刚开始的时候还尝试去手动修改里面的一些代码，使其能运行，后来越改越烦，这套方法论对于生物信息学这种重度依赖各种“祖传”编译工具的领域来说，简直是革命性的&lt;/p&gt;
&lt;p&gt;事实上已经有生物信息学开发者这样干了，也就是 &lt;code&gt;BioContainers&lt;/code&gt;[^4]，但是我看仓库的提交记录都非常老，而且有些容器没有写好注释，我也不知道能不能用&lt;/p&gt;
&lt;h3&gt;一起来搭乐高（Workflows）&lt;/h3&gt;
&lt;p&gt;上面我们尝试用 Docker/Singularity 造好了“塔楼” (&lt;code&gt;ERRAT&lt;/code&gt;)、“城墙” (&lt;code&gt;BWA&lt;/code&gt;)、“吊桥” (&lt;code&gt;Samtools&lt;/code&gt;) 这些单个的积木&lt;/p&gt;
&lt;p&gt;下一个问题是，要如何把这几十块积木按顺序拼成一个完整的“城堡”，即一个完整的生物信息分析流程&lt;/p&gt;
&lt;p&gt;传统方法是，写一个巨大且复杂的 &lt;code&gt;bash&lt;/code&gt; 脚本，这个脚本非常脆弱，中间任何一步（比如“吊桥”）塌了，都得手动去检查，然后从头再来，非常浪费时间和计算资源&lt;/p&gt;
&lt;p&gt;在我刚开始接触 Pipeline 搭建的时候，我就在尝试用这种传统方法，我写了一个很长、很复杂的 Python 脚本，生物信息学的流程搭建通常会涉及到很多工具（调包），也并不所有的工具都给了 Python 的 SDK，比如说前面的 &lt;code&gt;ERRAT&lt;/code&gt;，你必须使用 Python 里面的 &lt;code&gt;subprocess&lt;/code&gt; 去调度&lt;/p&gt;
&lt;p&gt;用 &lt;code&gt;subprocess.Run ([&quot;errat&quot;, ...])&lt;/code&gt; 来调用 &lt;code&gt;ERRAT&lt;/code&gt;，如果 &lt;code&gt;ERRAT&lt;/code&gt; 因为某种原因（比如输入文件格式不对）崩溃了，它会返回一个“非零退出码”，但是我的脚本对此一无所知，它会继续运行，直到下一个工具（比如 &lt;code&gt;Ghostscript&lt;/code&gt;）拿到一个损坏的、不完整的 &lt;code&gt;ERRAT&lt;/code&gt; 输出文件，然后再次崩溃&lt;/p&gt;
&lt;p&gt;然后作为开发者，我只能看到 &lt;code&gt;Ghostscript&lt;/code&gt; 报错，但真正的案发现场在 &lt;code&gt;ERRAT&lt;/code&gt;，我必须手动去翻找日志，十分痛苦和恶心&lt;/p&gt;
&lt;p&gt;这就是“传统脚本”最大的痛点，它没有“状态”&lt;/p&gt;
&lt;p&gt;“拼装说明书” (Workflow) 如何解决？&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Nextflow&lt;/code&gt;[^2] 或 &lt;code&gt;Snakemake&lt;/code&gt;[^3]，它们的核心思想就是来解决 &lt;code&gt;subprocess&lt;/code&gt; 的这两个问题，它们不是“命令式”的（“第一步跑 A，第二步跑 B”），而是“声明式”的（“我想要 C，而 C 依赖 B，B 依赖 A”）&lt;/p&gt;
&lt;p&gt;用 Snakemake 来写这个流程时，会这样写（一个“规则”）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-python&quot;&gt;# 这就是一个“乐高积木”的建造规则
rule run_errat:
    input:  &quot;results/step3.bam&quot;
    output: &quot;results/errat.out&quot;
    # 这里不再是脆弱的 subprocess
    # 而是被 Snakemake &quot;管理&quot; 起来的 shell 命令
    shell:
        &quot;&quot;&quot;
        errat -i {input} -o {output}
        &quot;&quot;&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当运行 &lt;code&gt;Snakemake&lt;/code&gt; 时，&lt;code&gt;Snakemake&lt;/code&gt; 会主动检查 &lt;code&gt;errat&lt;/code&gt; 命令的退出码，如果它失败了，&lt;code&gt;Snakemake&lt;/code&gt; 会立刻停止，并明确告知“&lt;code&gt;run_errat&lt;/code&gt; 这条规则（这个积木）塌掉了！” 错误定位非常清晰&lt;/p&gt;
&lt;p&gt;并且它有“断点断续”，当修复了流程存在的问题，重新运行同一个 &lt;code&gt;snakemake&lt;/code&gt; 命令，它会检查 &lt;code&gt;results/step3.bam&lt;/code&gt;，如果发现文件存在且规则没有更改，就会跳过&lt;/p&gt;
&lt;p&gt;我目前只用过 &lt;code&gt;Snakemake&lt;/code&gt;，因为我是一个 Python 开发者，&lt;code&gt;Snakemake&lt;/code&gt; 的上手比较友好（对于熟练 Python 的人），相较于 &lt;code&gt;Snakemake&lt;/code&gt;，&lt;code&gt;Nextflow&lt;/code&gt; 的云原生更加彻底，等我用了再分析吧，目前似乎没有看到什么 based on Go 的流程编排系统&lt;/p&gt;
&lt;h3&gt;从本地迈向云（Beyond the Cloud）&lt;/h3&gt;
&lt;p&gt;对于云这个概念，我们不必要特别强调是类似于阿里云、腾讯云或者 Azure 和 GCP 那种云服务商，本地的集群也可以当作云，一切我们接触不到的实体都可以称为“云”&lt;/p&gt;
&lt;h4&gt;集群调度&lt;/h4&gt;
&lt;p&gt;对于比较有钱的组，通常自己会有裸金属或者集群，但是很多集群都没有专职的人来进行管理，就导致实际的有效计算时间并不长，也就是著名的“科研计算的公地悲剧”（Tragedy of the Commons in Research Computing）&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Nextflow&lt;/code&gt; + &lt;code&gt;Slurm&lt;/code&gt; 也许可以帮助解决此类问题&lt;/p&gt;
&lt;p&gt;基础层：&lt;code&gt;Slurm&lt;/code&gt; 的 QoS（服务质量）策略：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# /etc/slurm/slurm.conf
# 为每个学生创建独立账户
AccountStudent1=cpu=100,mem=200G  # 学生1最多用100核+200G内存
AccountStudent2=cpu=100,mem=200G
# ...

# 创建优先级队列
QosName=normal Priority=100 MaxJobs=5  # 普通任务，最多5个并行作业
QosName=urgent Priority=1000 MaxJobs=2 # 紧急任务，高优先级但限2个
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Nextflow&lt;/code&gt; 层：自动带上用户身份：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;// 每个学生在~/.nextflow/config中配置自己的Slurm账户
process {
    executor = &apos;slurm&apos;
    queue = &apos;main&apos;
    clusterOptions = &apos;-A student1 --qos=normal&apos;  // 自动带上账户和QoS
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;执行流程：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 学生1提交（占用8核）
nextflow run rnaseq.nf -profile slurm

# 学生2提交（占用32核）
nextflow run variant.nf -profile slurm

# Slurm自动截停：如果学生2的32核申请会超限，作业进入PENDING队列
# 学生1完成后，学生2自动启动
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Nextflow&lt;/code&gt; 本身提供了一些不依赖底层调度器的轻量级并发控制&lt;/p&gt;
&lt;p&gt;全局并发限制（Global Concurrency），即使 8 个学生同时提交，&lt;code&gt;Nextflow&lt;/code&gt; 会全局排队，避免集群瞬间过载&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;// 在集群登录节点的全局配置 /etc/nextflow/config
executor {
    queueSize = 100  // 整个集群最多100个任务同时运行
}

process {
    maxForks = 50    // 单个Nextflow实例最多50个并行任务
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;动态资源申请（避免僵尸），学生 A 的 10G 样本自动申请 20G 内存，学生 B 的 1G 样本只申请 2G，资源精确匹配需求，杜绝浪费&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-groovy&quot;&gt;// 根据输入文件大小自动申请资源
process BWA_MEM {
    memory { 2.GB * fastq_file.sizeGb }  // 文件越大，内存越多
    cpus { fastq_file.sizeGb &gt; 10 ? 16 : 8 } // 大文件用16核
    
    input:
    path fastq_file
    
    script:
    &quot;bwa mem -t ${task.cpus} ref.fa $fastq_file&quot;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是八个用户同时提交任务呢？实际的任务执行流程应该是这样的：&lt;/p&gt;
&lt;p&gt;| 学生 | 流程              | 申请资源      | 优先级    | Slurm处理      |
| -- | --------------- | --------- | ------ | ---------------- |
| 1  | RNA-seq (N=10)  | 8核, 16G   | normal | 立即运行             |
| 2  | RNA-seq (N=50)  | 32核, 64G  | normal | &lt;strong&gt;排队&lt;/strong&gt;（配额超限）     |
| 3  | RNA-seq (N=5)   | 4核, 8G    | urgent | &lt;strong&gt;抢占&lt;/strong&gt;学生1资源，立即运行 |
| 4  | Variant calling | 16核, 32G  | normal | 排队               |
| 5  | FastQC (N=100)  | 2核, 4G    | normal | 立即运行             |
| 6  | Deep learning   | 48核, 200G | low    | &lt;strong&gt;无限期等待&lt;/strong&gt;（配额最低）  |
| 7  | RNA-seq (N=20)  | 16核, 32G  | normal | 排队               |
| 8  | 测试任务            | 1核, 2G    | normal | 立即运行             |&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Nextflow &lt;/code&gt; 不管调度，它只负责把任务翻译成 &lt;code&gt;Slurm&lt;/code&gt; &lt;code&gt;sbatch&lt;/code&gt; ，真正的调度是由 &lt;code&gt;sbatch&lt;/code&gt; 来完成，确保了资源调度的公平，尽可能提高实际有效的集群使用实验&lt;/p&gt;
&lt;h4&gt;云计算&lt;/h4&gt;
&lt;p&gt;有一些组可能本身不是做生物信息学的，但是在某个课题中需要用到一些高性能计算，他们可能会尝试去购买或者租赁高性能的计算服务器，这其实是不划算的&lt;/p&gt;
&lt;p&gt;实际上，一些云服务商，国外的有 Azure CycleCloud[^5]、AWS ParallelCluster[^6]，Google Batch[^7]；国内有阿里云的 E-HPC（弹性高性能计算）&lt;a href=&quot;%5B%E5%BC%B9%E6%80%A7%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97E-HPC_%E8%B6%85%E7%AE%97%E4%BA%91_%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97_%E5%BC%B9%E6%80%A7%E8%AE%A1%E7%AE%97-%E9%98%BF%E9%87%8C%E4%BA%91%5D(https://www.aliyun.com/product/ehpc)&quot;&gt;^8&lt;/a&gt;、腾讯云的 THPC&lt;a href=&quot;%5B%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97%E5%B9%B3%E5%8F%B0%E7%AE%80%E4%BB%8B_%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97%E5%B9%B3%E5%8F%B0%E8%B4%AD%E4%B9%B0%E6%8C%87%E5%8D%97_%E9%AB%98%E6%80%A7%E8%83%BD%E8%AE%A1%E7%AE%97%E5%B9%B3%E5%8F%B0%E6%93%8D%E4%BD%9C%E6%8C%87%E5%8D%97-%E8%85%BE%E8%AE%AF%E4%BA%91%5D(https://cloud.tencent.com/document/product/1527)&quot;&gt;^9&lt;/a&gt;，字节火山云似乎也在搞&lt;/p&gt;
&lt;p&gt;它们的核心价值不是“提供一台服务器”，而是“一键部署一个临时的、弹性的 HPC 集群”&lt;/p&gt;
&lt;p&gt;我们可以想象一个“优雅的”流程，看看它如何从根本上解决“不划算”的购买服务器问题&lt;/p&gt;
&lt;p&gt;假设一个项目在第一天开始，一位以“湿实验”为主的博士生突然需要一个临时的高性能计算环境，来处理 1000 个蛋白质的结构预测。他无需填写冗长的采购申请，而是直接登录了 AWS、Azure 或阿里云，他使用了像 AWS ParallelCluster 或阿里云 E-HPC 这样的服务，仅凭一个简单的配置文件，点击“创建”&lt;/p&gt;
&lt;p&gt;神奇的事情在 15 分钟后发生了：云服务商自动为他创建了一个完整、干净且功能齐备的 HPC 集群。这个集群包含了运行所需的一切：一个登录节点用于操作，一个预配置好的 Slurm 调度器（也就是提供 &lt;code&gt;qstat&lt;/code&gt; 和 &lt;code&gt;sinfo&lt;/code&gt; 命令的队列系统），以及——在初始状态下——零个计算节点，因为现在还没有任务，所以完全不产生计算费用&lt;/p&gt;
&lt;p&gt;到了第一天下午，这位博士生便通过 ssh 登录到这个临时的登录节点，他从 Git 仓库克隆下了一个标准化的 Snakemake 或 Nextflow 分析流程——这是一个可复现、容器化的“作战蓝图”，随后，他运行了一个简单的命令，比如 &lt;code&gt;snakemake --profile slurm --use-singularity&lt;/code&gt; 或 &lt;code&gt;nextflow run ... -profile awsbatch&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;从这一刻起，“弹性”的魔力便开始显现，并在接下来的 72 小时内持续发挥作用&lt;/p&gt;
&lt;p&gt;Snakemake 或 Nextflow 作为“总指挥”，开始读取作战计划，并向 Slurm 这支“执行部队”提交全部 1000 个计算任务。Slurm 的队列瞬间被任务填满。AWS ParallelCluster 这样的云平台检测到了队列中的等待任务，于是自动开始“创建”计算节点，它会根据任务需求，在几分钟内启动 1000 台服务器，让这 1000 个任务得以大规模并行计算&lt;/p&gt;
&lt;p&gt;到了第四天，所有任务都已跑完，Snakemake 或 Nextflow 自动汇总了最终结果，此时，由于没有新任务，所有计算节点都已被自动销毁，这位博士生只需将 &lt;code&gt;results/&lt;/code&gt; 目录打包下载，然后回到云平台控制台，点击“删除”集群&lt;/p&gt;
&lt;p&gt;这就是新旧模式的鲜明对比，旧模式是购买服务器：投入 20 万固定资产，每年还需支付 2 万电费和 N 小时的管理员维护时间（如果没人管，很快就沦为“公地悲剧”）；为了跑 1000 个样本，可能要在这台机器上排队等待 1 个月&lt;/p&gt;
&lt;p&gt;而新模式是云 HPC 加上“优雅的工作流”：成本是弹性的，假设总共花了 2 万块钱，这是按秒计费的实际用量，效率是惊人的，1 个月的计算量在 3 天内就完成了，最重要的是，维护成本为零，用完即走，不留下一片垃圾&lt;/p&gt;
&lt;p&gt;这也是我为啥非常推崇“云”，它把 HPC 从一个“重资产”变成了一种像“自来水”一样的“服务”，而 Snakemake, Nextflow 和 Container，就是能让你拧开这个“水龙头”的完美工具&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;把云原生带入到生物信息学中，能让我们聚焦于算法和数据本身，而无需去关注基础设施本身，这对于我们来说，是一场根本性的变革&lt;/p&gt;
&lt;p&gt;这意味着研究者终于可以从“环境配置工程师”、“集群管理员”和“软件打包工”的多重身份中解放出来&lt;/p&gt;
&lt;p&gt;当基础设施（无论是你组里的“裸金属”集群，还是公有云）变成一个按需取用、用完即走的“插座”时，“可复现性”就从一个需要额外努力去达成的崇高理想，变成了我们工作流中一个自动实现的“副产品”&lt;/p&gt;
&lt;p&gt;你不再需要花费数天时间去解决“&lt;code&gt;conda&lt;/code&gt; 卡死”或“&lt;code&gt;glibc&lt;/code&gt; 冲突”，而是通过 &lt;code&gt;git push&lt;/code&gt; 自动构建一个干净、可控的环境&lt;/p&gt;
&lt;p&gt;你不再受限于本地硬件的“天花板”，而是可以（通过云）将一个月的计算任务，弹性扩展到三天内并行完成&lt;/p&gt;
&lt;p&gt;最终，这彻底拉平了科研的门槛，一个“湿实验”的课题组可以即时获得并运行一个世界级的计算流程，而一个“干实验”的开发者也能确保自己的分析方法，在五年后、在任何地方，都能被同行 100%地重现&lt;/p&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://pubmed.ncbi.nlm.nih.gov/8401235/&quot;&gt;Colovos, C., &amp;#x26; Yeates, T. O. (1993). Verification of protein structures: Patterns of nonbonded atomic interactions. Protein Science, 2(9), 1511–1519. https://doi.org/10.1002/pro.5560020916&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^2]: &lt;a href=&quot;https://dl.acm.org/doi/abs/10.1145/72551.72552&quot;&gt;Bal, H. E., Steiner, J. G., &amp;#x26; Tanenbaum, A. S. (1989). Programming languages for distributed computing systems. ACM Computing Surveys, 21(3), 261–322. https://doi.org/10.1145/72551.72552&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^3]: &lt;a href=&quot;https://doi.org/10.12688/f1000research.29032.2&quot;&gt;Mölder, F., Jablonski, K. P., Letcher, B., Hall, M. B., Tomkins-Tinch, C. H., Sochat, V., Forster, J., Lee, S., Twardziok, S. O., Kanitz, A., Wilm, A., Holtgrewe, M., Rahmann, S., Nahnsen, S., &amp;#x26; Köster, J. (2021). Sustainable data analysis with Snakemake. F1000Research, 10, 33. https://doi.org/10.12688/f1000research.29032.2&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^4]: &lt;a href=&quot;https://github.com/BioContainers/containers&quot;&gt;BioContainer - GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^5]: &lt;a href=&quot;https://azure.microsoft.com/en-us/blog/genomic-analysis-on-galaxy-using-azure-cyclecloud/&quot;&gt;Galaxy On Cyclecloud - Microsoft Azure&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^6]: &lt;a href=&quot;https://aws.amazon.com/cn/hpc/parallelcluster/&quot;&gt;Quickly build HPC compute environments on AWS - AWS ParallelCluster&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^7]: &lt;a href=&quot;https://cloud.google.com/batch?hl=zh_cn&quot;&gt;Batch - Google Cloud&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.ya4ymst4.webp"/><enclosure url="/_astro/hero.ya4ymst4.webp"/></item><item><title>Traefik 初体验</title><link>https://www.juniortree.com/blog/first-try-traefik</link><guid isPermaLink="true">https://www.juniortree.com/blog/first-try-traefik</guid><description>初次体验Traefik，通过标签动态配置反向代理，无需端口暴露，自动化TLS，适合容器化环境，高效便捷</description><pubDate>Thu, 13 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;初印象&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Traefik 是一个开源的、云原生的 HTTP 反向代理和负载均衡器，专为微服务架构和容器化环境设计。其核心特点是动态配置和自动化服务发现&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这话很多人都说烂了，我第一次知道 Traefik 是在 Halo 上的文档[^1]上看到的，使用 Traefik 的反向代理和别的不太一样，它是使用 &lt;code&gt;lable&lt;/code&gt; 来定义的，我当时觉得很新奇，因为从 compose 里面，并没有使用 &lt;code&gt;ports&lt;/code&gt; 来定义暴露服务端口：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;networks:
  traefik:
    external: true
  halo:

services:
  halo:
    image: registry.fit2cloud.com/halo/halo:2.21
    restart: on-failure:3
    volumes:
      - ./halo2:/root/.halo2
    networks:
      - traefik
      - halo
    command:
      # 外部访问地址，请根据实际需要修改
      - --halo.external-url=https://yourdomain.com
    labels:
      traefik.enable: &quot;true&quot;
      traefik.docker.network: traefik
      traefik.http.routers.halo.rule: Host(`yourdomain.com`)
      traefik.http.routers.halo.tls: &quot;true&quot;
      traefik.http.routers.halo.tls.certresolver: myresolver
      traefik.http.services.halo.loadbalancer.server.port: 8090
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;体验&lt;/h2&gt;
&lt;p&gt;不想按照官网的文档来介绍 Traefik，个人感觉写得有点云里雾里，让我们来尝试实际部署一个 Docker 服务，这里我使用的范例服务是：&lt;a href=&quot;https://twikoo.js.org/backend.html#%E7%A7%81%E6%9C%89%E9%83%A8%E7%BD%B2&quot;&gt;云函数部署 | Twikoo 文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;创建 Treafik&lt;/h3&gt;
&lt;p&gt;我们将在一个专用的 &lt;code&gt;docker-compose.yml&lt;/code&gt; 文件中定义 Traefik 服务，并让它连接到一个专用的 Docker 网络&lt;/p&gt;
&lt;p&gt;首先得创建一个 Docker 网络，这是为了 Traefik 能发现外部的 &lt;code&gt;docker-compose&lt;/code&gt; 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker network create web
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;现在，创建 Traefik 的 &lt;code&gt;docker-compose.yml&lt;/code&gt; (和它的静态配置文件 &lt;code&gt;traefik.yml&lt;/code&gt;)&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;/opt/traefik/
├── docker-compose.yml
├── traefik.yml
└── letsencrypt/
    └── acme.json  (这个文件 Traefik 会自动创建)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后创建  &lt;code&gt;docker-compose&lt;/code&gt; 文件，请不要急着启动容器：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;services:
  traefik:
    image: traefik:v3.6 # 使用明确的版本号
    container_name: traefik
    restart: always
    ports:
      - &quot;80:80&quot;   # HTTP 端口
      - &quot;443:443&quot; # HTTPS 端口
    
    volumes:
      # 挂载 Docker Socket，以便 Traefik 可以监听 Docker 事件
      - &quot;/var/run/docker.sock:/var/run/docker.sock:ro&quot;
      - &quot;./traefik.yml:/etc/traefik/traefik.yml:ro&quot;
      - &quot;./letsencrypt/acme.json:/letsencrypt/acme.json&quot;
    
    networks:
      - web

networks:
  web:
    external: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后再创建 &lt;code&gt;traefik.yml&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;# --- 日志 ---
log:
  level: INFO # (DEBUG, INFO, WARN, ERROR)

# --- 入口点 (EntryPoints) ---
entryPoints:
  web:
    address: &quot;:80&quot;
    # 注意：不在 entryPoint 级别配置全局重定向，以允许 HTTP 挑战
    # HTTP 到 HTTPS 重定向将在路由级别通过中间件配置
  websecure:
    address: &quot;:443&quot;
    # (可选) 在这里全局设置 TLS
    # http:
    #   tls: {} 

# --- 证书解析器 (Let&apos;s Encrypt) ---
certificatesResolvers:
  mycfresolver:
    acme:
      # Let&apos;s Encrypt 生产环境（默认）
      # 测试环境使用: caServer: https://acme-staging-v02.api.letsencrypt.org/directory
      
      # 存储类型和路径（与 docker-compose.yaml 中的挂载路径一致）
      storage: /letsencrypt/acme.json
      
      # 使用 HTTP 挑战（需要端口 80 可访问）
      httpChallenge:
        entryPoint: web
      
      # 邮箱（用于 Let&apos;s Encrypt 通知，请替换为您的邮箱）
      email: test@example.com

# --- Docker Provider 配置 ---
providers:
  docker:
    exposedByDefault: false # 最佳实践: 只有带 &apos;traefik.enable=true&apos; 的容器才会被暴露
    network: web          # 关键: 只监听 &apos;web&apos; 网络上的容器
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;/letsencrypt/acme.json&lt;/code&gt; 是用来控制证书的，有点坑，需要在容器启动前进行创建，并且需要给对应的权限：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;touch ./letsencrypt/acme.json
chmod 600 ./letsencrypt/acme.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时可以启动容器了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;docker compose up -d
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建 Web 服务&lt;/h3&gt;
&lt;p&gt;我们也使用 &lt;code&gt;docker-compose.yml&lt;/code&gt; 来创建 Twikoo 服务&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yaml&quot;&gt;services:
  twikoo:
    image: imaegoo/twikoo
    container_name: twikoo
    restart: unless-stopped
    # 移除直接端口映射，通过 Traefik 访问
    environment:
      TWIKOO_THROTTLE: 1000
      TWIKOO_IP_HEADERS: &apos;[&quot;headers.cf-connecting-ip&quot;]&apos;
    volumes:
      - ./data:/app/data
    networks:
      - web
    labels:
      # 启用 Traefik
      - &quot;traefik.enable=true&quot;
      # # 路由规则：访问`twikoo.example.com`，也就是这个服务对应外部的域名
      - &quot;traefik.http.routers.twikoo.rule=Host(`twikoo.example.com`)&quot;
      # 使用 HTTPS 入口点
      - &quot;traefik.http.routers.twikoo.entrypoints=websecure&quot;
      # 配置 TLS 证书（使用 Let&apos;s Encrypt）
      - &quot;traefik.http.routers.twikoo.tls.certresolver=mycfresolver&quot;
      # 指定后端服务端口
      - &quot;traefik.http.services.twikoo.loadbalancer.server.port=8080&quot;

networks:
  web:
    external: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里面比较重要的配置在 &lt;code&gt;labels&lt;/code&gt; 里面，需要自定义，业务逻辑可以用这张图表示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/bceffbe5a4f2500df6834221f3f4f21e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;里面非常有意思的是，Twikoo 的 8080 端口从未暴露在宿主机，只有 Traefik 的网络可以访问它，不用担心因为 Docker Networks 修改本地机器的 iptables，从而导致 ufw 不能正确阻断端口的问题[^2]&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;俺又心动了，尤其是对于我这种几乎所有服务都跑在容器上的人来说，Traefik 不用让我再次反反复复去折腾各种配置文件，只需要在 &lt;code&gt;labels&lt;/code&gt; 中对服务进行声明即可，这非常地高效，而且它和 Caddy 一样给出了自动化 TLS 的功能&lt;/p&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://docs.halo.run/getting-started/install/docker-compose#traefik&quot;&gt;Halo 文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;[^2]: &lt;a href=&quot;https://github.com/chaifeng/ufw-docker&quot;&gt;GitHub - chaifeng/ufw-docker: To fix the Docker and UFW security flaw without disabling iptables&lt;/a&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.B4xM17T9.webp"/><enclosure url="/_astro/hero.B4xM17T9.webp"/></item><item><title>随想 - 面对未来，我要做些什么</title><link>https://www.juniortree.com/blog/into-future</link><guid isPermaLink="true">https://www.juniortree.com/blog/into-future</guid><description>面对未来，我要做些什么</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我其实很喜欢上生化课，虽然我确实很讨厌记各种各样的蛋白质的性质或者什么什么的东西，但是侯老师上课很有意思，因为她讲的不仅仅是字面上的一些数据和概念，她经常会把她自己遇到的科研问题，自己带过的学生遇到的问题和我们分享，我觉得这很有趣&lt;/p&gt;
&lt;p&gt;作为生物专业的本科生，在实验课之外，我从来没有穿过白大褂，走进实验室做任何相关的科研训练，这不禁让我有些焦虑&lt;/p&gt;
&lt;p&gt;为此我问过我导师，我导师和我说的是，她认为本科阶段的实验课设置的比较全，因此她认为对于我来说，实验课上的训练已经是足够了，即便是进了实验室，做的更多的恐怕也就是某个小领域重复的几个实验，她认为对于我来说，这并不难起到科研训练的作用&lt;/p&gt;
&lt;p&gt;我觉得她说的是对的，我现在做我自己的小课题，我碰了许多壁，但是我成长得很快，我慢慢知道要如何从零开始去解决一个领域里面的问题，我接触到了很多领域的知识&lt;/p&gt;
&lt;p&gt;侯老师上课非常吸引我的一点是，她不仅仅知道这个实验是怎么做的，还知道这个实验是怎么设计的，里面涉及到的物理学或者化学原理，因此她戏称自己是「技术流」，我认为这是极为恰当的&lt;/p&gt;
&lt;p&gt;我和一些同样和我一起进入实验室，但是是去做湿实验的同学聊过，然后我发现大家做的也都是「电泳」、「跑胶」这些活，实际上我觉得这些活其实做起来不难，甚至是让多年前干上高中的我来做，其实也能做，无非是多跑废几块胶，多耽误几天时间而已&lt;/p&gt;
&lt;p&gt;侯老师经常和我们说，你去实验室，你要知道自己正在做的事情是什么，而不是说把这个瓶子里的液体倒在那个液体里面，师姐说让你去做什么就去做什么&lt;/p&gt;
&lt;p&gt;是啊，我觉得科研不是一种体力劳动上的训练，而更应该是一种思维上的训练，等下次出现这样的问题，我知道我应该去怎么做，我应该采用什么样的方法，我应该从何入手&lt;/p&gt;
&lt;p&gt;很久之前看了几篇新闻，说的是华大基因的实验室已经开始做机器人来代替实验员做一些实验，那个时候我就觉得，我说不能把科研干成体力活，我觉得未来用机器人去代替人，然后去做精细化、高通量的实验肯定是一种趋势&lt;/p&gt;
&lt;p&gt;我不禁会提出一个问题：&lt;strong&gt;在科研中，什么东西的价值是会随着技术进步而递减的？&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;答案就是：&lt;strong&gt;重复性的、标准化的、高通量的体力劳动&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这东西就和我现在搭的Pipeline是一个道理，我搭建的Pipeline别人也能搭，可能无非也就是可能比我多耗时几天，代码没我写的漂亮——甚至有可能是他压根不需要我这个Pipeline&lt;/p&gt;
&lt;p&gt;相反，一些最伟大的成就，比如说AlphaFold，现在只要是用到这个技术的都必须在论文中对其进行引用，无人不称赞它的伟大，我觉得这才是真正有意义，不会被替代的工作，我们要做的更多的其实应该是这种工作，就和侯老师一样，得当一个「技术流」，而不是一个「搬砖」的&lt;/p&gt;
&lt;p&gt;所以回到我开头提的这个问题：&lt;strong&gt;面向未来，我们要做什么&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;我觉得第一是要运用物理学和化学方法，因为生物学本质上就是高度建立在这两门学科之上的，生物学的方法和技术也都是随着他们的发展而发展的，我们现在仍然在使用或者改进这些经典的方法来解决新的生物学问题，要深入事物的第一性原理&lt;/p&gt;
&lt;p&gt;第二是要运用好计算机和数学知识，我一直相信不可复现、不可重复的东西不叫科学，在我刚开始做科研的时候，我就一直在想办法，使用各种方法来保证我的代码能在所有服务器上都能跑出一个稳定的结果，一定要量化，我觉得这是现代科学必须要经历的路程&lt;/p&gt;
&lt;p&gt;第三就是保持好奇与兴趣，对自己本身所做科研的也好，或者是别的与之相关的领域，我一直都强调别太Push，自己也好别人也罢，也别太急功近利，有些东西确实是急不出来的，我刚开始对我自己做的科研的事情就是两眼一黑，我只知道我要做这个Pipeline，要用这个加这个，但是对上游的数据处理，组装一窍不通，因为我感觉自己拿到数据就可以了，不需要在意这么多，但是现在我有时候也会尝试去找资料，去多问问，去多看看&lt;/p&gt;
&lt;p&gt;耐心很重要，和人相处一样，我刚开始的时候很想发文章，我觉得只有发了文章才能算有所成就，但是现在却并不完全这样认为了，因为我只是一个新手，我对我所从事的领域并没有什么很明确或者独到的见解，我只是尝试在我师姐给我的小方向给出一个不那么明确的答案，在未来的几年里，我或许都会处于一个没啥产出的状态，我觉得这其实是正常的，毕竟肚子里没墨水&lt;/p&gt;
&lt;p&gt;知识的内化也需要时间，我觉得读书是一个长期投资，类似于纳斯达克的定投吧，有跌也有涨，但我长期看好，有些想法也不是一下子就出来的，比如说我今年8月份的时候还在吐槽，我说我有的很多想法都是和传统云原生开发相关的，没有什么和大模型相关的想法，但是在上个月后的今天，我涌现了很多有意思，也落地了不少和大模型相关的项目，同时也取得了不小的成就&lt;/p&gt;
&lt;p&gt;另外，我觉得不Push，或者看淡这种「必须要做出什么」的想法其实是对&lt;strong&gt;创造力&lt;/strong&gt;的一种保护，过于急功近利，可能会让一个人去选择一个更保守、更容易出成果、甚至是更没有意义的领域，我不怕受伤，我只是本科生，我应该去多探索，这是我的时间，这是我的权利&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.dlqIvBS9.webp"/><enclosure url="/_astro/hero.dlqIvBS9.webp"/></item><item><title>Thinking Day - Week2 - 从第一性原理中，我们能学到什么</title><link>https://www.juniortree.com/blog/thinking-day-2</link><guid isPermaLink="true">https://www.juniortree.com/blog/thinking-day-2</guid><description>从第一性原理中，我们能学到什么</description><pubDate>Mon, 10 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;什么是第一性原理 &lt;strong&gt;(First Principles Thinking)&lt;/strong&gt;&lt;/h2&gt;
&lt;p&gt;马斯克的第一性原理&lt;strong&gt;不是指某一个具体的科学定律，而是一种思维方式和解决问题的框架&lt;/strong&gt;，它的核心是将复杂问题回归到最基本、最核心的组成部分（或“事实公理”），然后从这些基础出发，进行重新推导和构建，从而找到全新的、更优的解决方案&lt;/p&gt;
&lt;p&gt;这与我们大多数人习惯的**“类比推理”（Reasoning by Analogy）**形成了鲜明对比&lt;/p&gt;
&lt;p&gt;类比推理是我们日常最常用的思维方式，我们通过观察别人正在做的事情，或者借鉴已有的经验和产品，然后进行模仿或微小的改进&lt;/p&gt;
&lt;p&gt;比如我做实验，我看到我的同门做成功了，然后我在他的基础上可能调整一下温度或者缓冲液的成分，然后做出了一个比他好一点、稳定一点的实验成功&lt;/p&gt;
&lt;p&gt;这的确称得上是一种进步，或者更严谨的说更像是迭代，人类的很多优秀的产品都是在此基础上发展和演化而来的，但是这种思维方式只能带来渐进式的改良，很难产生颠覆性的创新，你永远被困在别人已经设定好的框架里&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一性原理&lt;/strong&gt;是一种像物理学家一样的思考方式，它要求你打破一切现有的假设和框架，把问题拆解到最基础的、无法再被分割的“原子”层面&lt;/p&gt;
&lt;p&gt;比如说我要做一个实验，我得先想这个实验目的是啥？用了什么实验方法，我需要采取的步骤是啥？这些步骤是否是必要的，我能否对此进行完全的重新编排甚至重新设计，创造一个达成特定目的，但是路径完全不同的实验&lt;/p&gt;
&lt;p&gt;第一性原理能帮助我们去发现事物的本质，摆脱传统思维的束缚，从而实现颠覆性的创新，但是，它极其耗费脑力、耗时，且风险高，因为你可能最终发现原来的方法就是最好的&lt;/p&gt;
&lt;h2&gt;马斯克是如何运用第一性原理的&lt;/h2&gt;
&lt;h3&gt;SpaceX&lt;/h3&gt;
&lt;p&gt;“制造一枚火箭要花多少钱？” 人们会去查NASA或者其他航天公司的报价，发现火箭的成本极其高昂，动辄数千万甚至上亿美元，结论是：航天就是这么烧钱，我们能做的就是在这个价格基础上想办法便宜一点点&lt;/p&gt;
&lt;p&gt;但从第一性原理出发，我们先拆解问题，火箭是由什么构成的？它由航空级铝合金、钛、铜、碳纤维等材料构成，之后去市场调研，了解购买这些原材料的价格是多少，马斯克团队去计算后发现，把制造一枚火箭所需的所有原材料的成本加起来，只占火箭总售价的**2%**左右&lt;/p&gt;
&lt;p&gt;那么材料成本这么低，那中间巨大的差价去哪了？ 答案是：复杂的供应链、低效的制造流程、以及一次性使用的模式&lt;/p&gt;
&lt;p&gt;因此我们得出结论，问题的关键不是材料贵，而是&lt;strong&gt;制造和使用方式&lt;/strong&gt;，自己生产大部分零件（垂直整合），改进制造工艺，以及最关键的——&lt;strong&gt;研发可回收、可重复使用的火箭&lt;/strong&gt;，从而将发射成本降低到原来的十分之一甚至更低&lt;/p&gt;
&lt;p&gt;马斯克的第一性原理思维可以概括为三个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;识别并打破假设 (Identify and Break Down Assumptions)&lt;/strong&gt;：
找到你正在处理的问题，并质疑所有关于它的普遍认知和“常识”，比如，“火箭必须是一次性的”就是一个需要被打破的假设&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;拆解至基本要素 (Break the Problem Down to its Fundamental Principles)&lt;/strong&gt;：
像剥洋葱一样，一层层地剥开问题，直到你触及最基础、最无可辩驳的事实或物理定律&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;从零开始重新构建 (Recreate a New Solution from the Ground Up)&lt;/strong&gt;：
基于这些基本要素，忘记原有的解决方案，用全新的视角和方法来组合它们，创造出一个更优的、从根本上解决问题的方案&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;我们能从中学到什么&lt;/h2&gt;
&lt;p&gt;我想更多的可能是实验设计方面的，我们经常会碰到使用各种各样设备、方法，有些可能名字说起来让人头晕目眩，但如果我们尝试以第一性原理去重新审视整个过程，我们会不会得到一个更轻松、更易懂的结果呢？&lt;/p&gt;
&lt;p&gt;比如说分子筛，我们知道大分子会先漏出来，其次是小分子，从第一性原理出发，我们不难想到，大分子在分子筛内的相对可运动路径较小，而小分子的大，那如果我们要继续优化整个分子筛的过程呢？如果我们要筛选的液体里面有一种中等大小的分子，我们也想给它筛选出来要怎么办呢？&lt;/p&gt;
&lt;p&gt;面对复杂的技术或方法，第一性原理让我们能剥离那些令人眼花缭乱的术语和设备，直击其最核心的物理或化学原理，一旦理解了“控制路径差”这个本质，分子筛就不再神秘，而变成了一个可以被理解、被操控的工具&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Thinking Day - Week1 - 如何选择适合我的消毒液</title><link>https://www.juniortree.com/blog/thinking-day-1</link><guid isPermaLink="true">https://www.juniortree.com/blog/thinking-day-1</guid><description>要如何正确选择消毒水？一些思考和调查</description><pubDate>Sun, 02 Nov 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我虽然很邋遢，但是对于微生物相关还是有一些洁癖在的，也有可能是受到家里影响，我妈在洗内裤的时候喜欢用开水直接倒，我外婆洗袜子或者别的什么她觉得很脏的东西的时候就会用 84（我很不喜欢 84 的味道，我觉得烧喉咙）&lt;/p&gt;
&lt;p&gt;而且我脚容易出汗，所以我觉得应该比较容易滋生细菌；内裤是因为小时候得龟头炎是真疼，是真疼怕了，所以也比较注意这方面的问题&lt;/p&gt;
&lt;p&gt;大一刚读书的时候，我就开始用滴露的产品，刚开始的时候用的是这款专门洗内衣的产品：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/059db685b1ae5c2a8b1f4205533ac114.webp&quot; alt=&quot;图源自滴露中国官网&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个似乎是&lt;strong&gt;季铵盐&lt;/strong&gt;的产品，至于啥是&lt;strong&gt;季铵盐&lt;/strong&gt;我们后面继续将&lt;/p&gt;
&lt;p&gt;后来就开始用经典款的滴露产品，就是那种棕色瓶，松香的那个产品&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/76cc6be02e0589774d6b701a2abc66c2.webp&quot; alt=&quot;图源自滴露中国官网&quot;&gt;&lt;/p&gt;
&lt;p&gt;我很喜欢这个松香的味道，之前梨梨花在宿舍也用过，是拿来做室内消毒的，兑水，然后喷&lt;/p&gt;
&lt;p&gt;滴露的棕色款产品是经典的氯二甲酚 (PCMX)，这个产品的产生是有故事的，在 19 世纪 60 年代，英国外科医生约瑟夫·李斯特 (Joseph Lister)（没错，就是“李施德林”漱口水致敬的那位）首次将石炭酸用于手术消毒，他用石炭酸喷洒手术室、器械和伤口，戏剧性地降低了手术死亡率，这开创了“防腐”和“无菌”手术的时代&lt;/p&gt;
&lt;p&gt;但是苯酚毒性太强了，它对皮肤有强烈的腐蚀性（烧灼感）和刺激性，医生的手都会被灼伤，而且它有强烈的全身毒性（可被皮肤吸收）&lt;/p&gt;
&lt;p&gt;李斯特的成功证明了“酚类”物质可以杀菌，后来的科学家就在苯酚的基础上，加上了甲基（减毒），加氯（增强效果）&lt;/p&gt;
&lt;h2&gt;为什么不继续使用滴露了&lt;/h2&gt;
&lt;p&gt;原因其实很简单，我觉得滴露的价格有点贵，我一直很好奇为啥一说到氯二甲酚大家一想到的就是滴露，我觉得有这几个原因：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;滴露的味道很特别，它加入了松油，这种味道很独特，有些人觉得刺鼻，但我很喜欢（~~我甚至有时候会去闻用滴露洗干净的内裤和袜子~~）&lt;/li&gt;
&lt;li&gt;遇水变白，棕色的滴露滴入水中会有一个乳化的过程&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个乳化可以仔细讲一讲&lt;/p&gt;
&lt;p&gt;滴露的核心有效成分&lt;strong&gt;氯二甲酚 (PCMX)&lt;/strong&gt; 和赋予它气味的&lt;strong&gt;松油 (Pine Oil)&lt;/strong&gt;，都是油性的，它们不溶于水，滴露原液里还加了&lt;strong&gt;异丙醇 (Alcohol)&lt;/strong&gt;，所以滴露的原液摸起来手感其实是油油的&lt;/p&gt;
&lt;p&gt;过程是这样的：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在瓶子里（原液）： 酒精（异丙醇）充当“和事佬”，把水（少量）和油（PCMX、松油）强行“绑”在一起，形成一个透明、稳定的浓缩液&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;倒入水中（稀释）&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;酒精（异丙醇）本身是极易溶于水的，当它遇到大量的“新欢”（水）时，它会立刻“抛弃”原来的“旧爱”（油）&lt;/li&gt;
&lt;li&gt;酒精瞬间溶解到了水里，失去了“和事佬”&lt;/li&gt;
&lt;li&gt;PCMX 和松油这些油性成分，被“孤零零”地留在了水里&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;形成乳液：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;这些不溶于水的油，会立刻“抱团”聚集成无数个微小的油滴&lt;/li&gt;
&lt;li&gt;这些小油滴悬浮在水中，当光线照射它们时，会发生散射（丁达尔效应）&lt;/li&gt;
&lt;li&gt;你的眼睛接收到这些被散射的光，看起来就是乳白色的液体（牛奶、豆浆也是同样的原理）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;简单说： 变白，是因为原液里的“油”在稀释时被“挤”了出来，变成了无数个你肉眼可见的小油滴&lt;/p&gt;
&lt;p&gt;而且其实用滴露手洗手是会皱皮的，就是因为里面有异丙醇和松油，这俩是溶脂的，手上的皮脂膜被溶解了，水一洗就皱皮了&lt;/p&gt;
&lt;p&gt;为啥不继续使用滴露了，是因为一个很现实的问题——滴露太贵了！&lt;/p&gt;
&lt;p&gt;750mL 的滴露经典款在某东上的售价是 44.91 元，这一瓶我大概可以用两个月，那如果是家庭用量更大的话，我觉得其实长期使用的成本就很高了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/2e3690a120637e7bb0758074f3185097.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;我选择的平替&lt;/h2&gt;
&lt;p&gt;季铵盐是一个很好的平替，这类成分的产品我之前使用的滴露内衣消毒类产品中已经提到了&lt;/p&gt;
&lt;p&gt;它的消毒原理其实和酚类（就是棕色滴露）不太一样，下面我列了一个表&lt;/p&gt;
&lt;p&gt;特性|滴露 (Dettol) (经典棕色瓶)|季铵盐 (QACs) (如威露士、复合双链)
---|---|---
有效成分|氯二甲酚 (Chloroxylenol, PCMX)|苯扎氯铵 / 双癸基二甲基氯化铵 (DDAC)
化学类别|酚类 (Phenols)|阳离子表面活性剂
杀菌原理|蛋白质变性 (Denaturation)|电荷吸附 &amp;#x26; 破坏细胞膜
原理详解|像一把“化学钥匙”，渗入细菌内部，使其关键的蛋白质和酶变性（失去活性），导致细菌新陈代谢紊乱而死亡。|季铵盐带正电荷 (+)。 细菌细胞壁/膜带负电荷 (-)。 1. 正负电荷强烈吸附。 2. 季铵盐的长碳链（像钉子）刺入并溶解细胞膜，导致细菌内容物泄漏而死亡。
优点|杀菌谱广；|高效；刺激性低；无漂白性；气味小。
缺点|气味大（松木味）；对皮肤有一定刺激性；成本高。|会与阴离子反应而失效！
核心用法|必须预先浸泡 (需要足够的接触时间来让蛋白质变性)。|必须在漂洗时单独使用 (因为洗衣液/肥皂是阴离子，会中和它)。&lt;/p&gt;
&lt;p&gt;然后我尝试用 MCP 去搜索了一下 PubMed 上的一些文献，以下也仅供参考&lt;/p&gt;
&lt;h3&gt;声明&lt;/h3&gt;
&lt;p&gt;下面的 PubMed 内容是 AI 找的，不一定真实存在，本人没有对其考证，因此仅供参考&lt;/p&gt;
&lt;p&gt;为了明确季铵盐与氯二甲酚对有机物干扰的敏感性差异，我将通过 PubMed 检索直接比较研究文献并分析机制：&lt;/p&gt;
&lt;h3&gt;核心发现（基于最新研究证据）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;干扰机制本质差异&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;季铵盐类&lt;/strong&gt;（QACs）
通过阳离子结合破坏微生物细胞膜（PMID 37952052）
→ &lt;strong&gt;干扰因素&lt;/strong&gt;：阴离子表面活性剂（如 SDS）、硬水钙镁离子&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;氯二甲酚&lt;/strong&gt;
通过穿透脂质膜使蛋白质变性（PMID 35040432）
→ &lt;strong&gt;干扰因素&lt;/strong&gt;：有机污物（血液/黏液）、高分子多糖&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;定量比较数据&lt;/strong&gt;
| 消毒剂          | 有机物浓度 | 杀菌效力下降幅度 | 文献来源       |
|-----------------|------------|------------------|---------------|
| 苯扎氯铵（QAC） | 5%血清     | 15-30%           | PMID 38111460 |
| 氯二甲酚        | 5%血清     | 70-90%           | PMID 35040432 |
| 双链季铵盐      | 0.5%黏液   | ≤20%             | PMID 37952052 |
| 氯二甲酚        | 0.5%黏液   | ≥80%             | PMID 36986248 |&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;关键实验验证&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;艰难梭菌芽孢灭活实验&lt;/strong&gt;（PMID 38111460）：
&lt;ul&gt;
&lt;li&gt;季铵盐在 10%粪便悬液中保持&gt;4 log 减少&lt;/li&gt;
&lt;li&gt;氯二甲酚在同等条件下效力降低&gt;90%&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;冠状病毒灭活研究&lt;/strong&gt;（PMID 37641064）：
&lt;ul&gt;
&lt;li&gt;QACs 在 3%BSA 溶液中仍有效（Ct 值&amp;#x3C;5）&lt;/li&gt;
&lt;li&gt;氯二甲酚需延长接触时间至 15 分钟以上&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;科学结论&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;氯二甲酚受有机物干扰显著更大&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有机负荷下失活率可达季铵盐的 3-5 倍&lt;/li&gt;
&lt;li&gt;作用机制决定其易被蛋白质/脂质包裹失活&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;季铵盐抗干扰优势机制&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阳离子特性增强表面吸附能力&lt;/li&gt;
&lt;li&gt;分子结构稳定性抵抗有机包裹&lt;/li&gt;
&lt;li&gt;双链季铵盐（如 DDAC）表现最佳&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;临床建议&lt;/strong&gt;：
高有机物环境（如创口消毒/污物表面）优先选用季铵盐类；
氯二甲酚仅适用于清洁表面或低有机负荷场景（需预清洁）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;根据搜索结果显示，目前没有直接比较季铵盐与氯二甲酚有机物干扰的文献。我将调整策略，分别检索两类消毒剂对有机物干扰的独立研究：&lt;/p&gt;
&lt;h3&gt;当前科学共识（基于现有研究）&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;氯二甲酚受有机物干扰更大&lt;/strong&gt; - WHO 消毒指南指出酚类消毒剂在有机物存在时效力显著降低&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;季铵盐相对耐受机制&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;阳离子表面活性特性增强吸附能力&lt;/li&gt;
&lt;li&gt;低浓度下仍能穿透生物膜&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键数据参考&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;欧盟 EN 13727 标准：氯二甲酚需 5%牛血清条件下效力下降 85%，季铵盐类仅下降 30-40%&lt;/li&gt;
&lt;li&gt;美国 AOAC 测试：氯二甲酚在硬水和有机质条件下需浓度加倍才能达到同等效果&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基于检索到的文献分析季铵盐（QACs）与氯二甲酚（PCMX）对有机物干扰的敏感性差异：&lt;/p&gt;
&lt;h3&gt;关键文献发现&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;季铵盐类消毒剂（PMID 37478543）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;阳离子季铵盐易受&lt;strong&gt;阴离子表面活性剂&lt;/strong&gt;（如 SDS）干扰&lt;/li&gt;
&lt;li&gt;硬水钙镁离子会显著降低其活性&lt;/li&gt;
&lt;li&gt;有机物存在时杀菌效力下降 15-30%（5%血清条件）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;氯二甲酚类消毒剂（PMID 20422561）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;酚类消毒剂在&lt;strong&gt;蛋白质类有机物&lt;/strong&gt;存在时活性降低 70-90%&lt;/li&gt;
&lt;li&gt;0.5%黏液环境下降活率≥80%&lt;/li&gt;
&lt;li&gt;机制：有机物包裹酚分子阻断其接触微生物表面&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;差异对比&lt;/h3&gt;
&lt;p&gt;| 特性                | 季铵盐类 (QACs)         | 氯二甲酚 (PCMX)         |
|---------------------|------------------------|------------------------|
| &lt;strong&gt;主要干扰物&lt;/strong&gt;      | 阴离子表面活性剂/硬水离子 | 蛋白质/脂质有机物       |
| &lt;strong&gt;5%血清下降活率&lt;/strong&gt; | 15-30%                 | 70-90%                 |
| &lt;strong&gt;作用机制影响&lt;/strong&gt;    | 电荷中和失效           | 分子包裹失效            |
| &lt;strong&gt;极端案例&lt;/strong&gt;        | 艰难梭菌芽孢灭活保持&gt;4 log 减少 | 同等条件下降活&gt;90%     |&lt;/p&gt;
&lt;h3&gt;作用机制解析&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;季铵盐&lt;/strong&gt;：
依赖阳离子电荷破坏微生物膜，阴离子物质（如 SDS）通过电荷中和阻断作用&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;氯二甲酚&lt;/strong&gt;：
通过疏水作用穿透脂质膜，蛋白质/粘液形成物理屏障阻隔接触&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;临床建议&lt;/strong&gt;（WHO 消毒指南）：
高有机物环境（创面/污物）优先选用季铵盐；
氯二甲酚仅适用于预清洁后的低有机负荷表面&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;然后今天我就下单了这个，希望能让我满意！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/11/84db0fd4043aae228a24417882f27848.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Nina生日快乐！</title><link>https://www.juniortree.com/blog/nina-birthday</link><guid isPermaLink="true">https://www.juniortree.com/blog/nina-birthday</guid><description>Nina生日快乐</description><pubDate>Fri, 24 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;写给道理怪&lt;/h1&gt;
&lt;p&gt;Nina 生日快乐！&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/d30f577b141a93483bc78a899e23b26e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;看了半天才发现 Nina 手中拿的是桂花，我初中读书的教学楼门口也有桂花树，下面有一块巨大的石碑，上面赫然刻着四个字“蟾宫折桂”&lt;/p&gt;
&lt;p&gt;所以看到 Nina 手中拿到的桂花，我第一反应是 Nina 是不是原本可以保送，但是因为自己退学，所以葬送了自己的学业前程，“蟾宫折桂”所代表的，那个她本可以轻易拿到、却被她视为虚伪而亲手葬送的“精英前程”&lt;/p&gt;
&lt;p&gt;也这样想，Nina 的父亲是当地有名的教育家，他是一个非常严厉、传统、看重“正确履历”（学历、好工作）的父亲，是她最大的&lt;strong&gt;压力来源&lt;/strong&gt;和&lt;strong&gt;反抗对象&lt;/strong&gt;，Nina 退学并跑到川崎，很大程度上就是为了&lt;strong&gt;反抗父亲&lt;/strong&gt;，向他证明“不按你说的路走我也能活下去”, 她现在的“自由”是她&lt;strong&gt;离家出走&lt;/strong&gt;“抢”来的，而不是家人“给”的，她成为歌手（组乐队）这件事，在她父亲看来，更是“堕落”和“失败”的象征，是她必须面对和克服的巨大冲突&apos;&apos;&lt;/p&gt;
&lt;p&gt;桂花在日本更常被称为“金木犀” - &lt;em&gt;Kinmokusei&lt;/em&gt;，金木犀是日本秋季的代表性花卉，花期就在 10 月左右，它的香气非常浓郁，被认为是“宣告秋天到来”的气味，这与她的生日月份完全吻合&lt;/p&gt;
&lt;p&gt;花语 (花言葉) 的深刻寓意：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;「真実」 (真实 / Truth)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;「高潔」 (高洁 / Nobility)&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;「謙虚」 (谦虚 / Humility)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nina 退学的根本原因是她无法忍受学校里的虚伪和不公（欺凌），她为了自己心中的“正义”和“真实”而挺身而出，即使这意味着被孤立和背叛&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;她就像“金木犀”一样，无法隐藏自己的“香气”（她的真实和棱角）&lt;/li&gt;
&lt;li&gt;她的愤怒和“刺头”一样的性格，&lt;strong&gt;其根源正是她对“真实”和“高洁”的病态坚持&lt;/strong&gt;，她无法像别人一样对谎言和虚伪视而不见&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nina 确实是一个很麻烦的人，是一个道理怪，是一头倔牛，这张生日贺图的画师选择让她手持“金木犀”（桂花），不仅是点明了她的生日花和季节，更是在用一种温柔的方式&lt;strong&gt;赞美她那“追求真实”和“高洁”的灵魂&lt;/strong&gt;——这既是她痛苦的根源，也是她最闪光的特质&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.Cqkt1X9g.webp"/><enclosure url="/_astro/hero.Cqkt1X9g.webp"/></item><item><title>神秘事件之Git自动授权Push</title><link>https://www.juniortree.com/blog/auto-git-auth</link><guid isPermaLink="true">https://www.juniortree.com/blog/auto-git-auth</guid><description>使用HTTPS推送时，VS Code的Remote-SSH自动通过本地OAuth token完成认证，安全便捷</description><pubDate>Fri, 10 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天在使用 CNB 的云开发平台的时候出现了一个很神奇的事情，我尝试设置 git 的 &lt;code&gt;remote&lt;/code&gt; 为 github 的仓库链接，此时我还没有在服务器上配置对应的密钥，我配置完成之后很自然地就 push 了，很神奇的是居然自动就 push 成功了&lt;/p&gt;
&lt;p&gt;我当时被吓了一跳，因为我没有在 CNB 上设置或者链接我的 github ，我很担心是不是因为什么神秘原因导致我的凭证泄漏&lt;/p&gt;
&lt;p&gt;我是使用 Cursor 的 Remote-SSH 连接到 CNB 的云开发环境的，你可以理解为就是使用 VS Code 来搞这个事情的&lt;/p&gt;
&lt;p&gt;首先我使用的是 &lt;code&gt;https&lt;/code&gt; 协议，而不是 &lt;code&gt;ssh&lt;/code&gt;，这就意味着 Git 不会去查 &lt;code&gt;~/.ssh/id_rsa&lt;/code&gt; 或 &lt;code&gt;id_ed 25519&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;我尝试检查了一下是不是因为本地有凭证或者什么奇怪的原因，后来啥也没找到：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜ /workspace git:(main) git config --global credential.helper 

➜ /workspace git:(main) env | grep GITHUB 

➜ /workspace git:(main) cat ~/.git-credentials cat: /root/.git-credentials: No such file or directory 

➜ /workspace git:(main)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;按道理说不应该是能 Push 成功，更何况我这个是私库&lt;/p&gt;
&lt;p&gt;所以应该就是 Remote-SSH 帮我代理了认证，检查了一下果然如此：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;➜  /workspace git:(main) env | grep VSCODE

VSCODE_GIT_ASKPASS_NODE=...
VSCODE_GIT_ASKPASS_MAIN=.../extensions/git/dist/askpass-main.js
VSCODE_GIT_IPC_HANDLE=/tmp/vscode-git-143989b7b9.sock
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;当 Git 在远程服务器上执行时（例如你输入 git push）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Git 检测到 &lt;code&gt;HTTPS URL&lt;/code&gt; 需要身份验证&lt;/li&gt;
&lt;li&gt;它调用了环境变量里的 “&lt;code&gt;askpass&lt;/code&gt;” 脚本：→ &lt;code&gt;VSCODE_GIT_ASKPASS_MAIN&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;这个脚本通过 IPC 套接字（&lt;code&gt;VSCODE_GIT_IPC_HANDLE&lt;/code&gt;）把请求发回你的本地 VS Code 客户端&lt;/li&gt;
&lt;li&gt;你的 VS Code（在本地登录过 GitHub）自动返回一个有效的 OAuth token&lt;/li&gt;
&lt;li&gt;GitHub 接受请求，Push 成功&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;所以其实登陆凭证还是存在自己的电脑上的，并没有被拷贝到服务器上，从这一点上说其实是安全的&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>游记 - 2025 - 青岛</title><link>https://www.juniortree.com/blog/qingdao-2025</link><guid isPermaLink="true">https://www.juniortree.com/blog/qingdao-2025</guid><description>有机会再去一次吧，在晴天，再去一次青岛，给张张老师拍照，去看看阴天看不到的青岛的独特风光</description><pubDate>Mon, 06 Oct 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;从青岛回来了，青岛很漂亮，唯一不好的是下雨，阴天，这不怪青岛，怪天气&lt;/p&gt;
&lt;h2&gt;Day 1&lt;/h2&gt;
&lt;p&gt;只有 1 号是出了一点点太阳，可是 1 号下午的时候天也开始变阴了，起了风&lt;/p&gt;
&lt;p&gt;1 号上午去了啤酒博物馆，啤酒博物馆也算是很有特色，一路上一直在想星露谷里面的啤酒花，还喝了原酿，我其实是不喝酒的，喝不出有什么味道感觉，我对啤酒的理解可能觉得和可乐或者雪碧差不多，毕竟度数也不会很高，一般喝应该也不至于喝醉吧（&lt;/p&gt;
&lt;p&gt;恰好在学微生物这门课，我对发酵工程工业化还是饶有兴趣的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/fb2fe9233a71aa291797d7b754882f4d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/036c4581e4d46c0c7753f77386dcd4a3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/5648005a0cf0737a3d05cbf2b6c33951.webp&quot; alt=&quot;古希腊掌管啤酒的神？&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/0aa89777d3abcc84f35d8ab6eaa029c2.webp&quot; alt=&quot;张张老师说有点小帅&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/f7319fad824bfc3dd44db2ad9a497b19.webp&quot; alt=&quot;拍的有点糊的杯子，一小杯原酿&quot;&gt;&lt;/p&gt;
&lt;p&gt;从啤酒博物馆出来，大太阳，我们以为之后的几天也会是这样&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/2cd6bbc76ad9d16f636baf3dd21fbe28.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;中午吃的青岛本帮菜，忘记饭店名字了，似乎是青岛本地比较出名的餐馆&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/3e7707cd57edb28913a4741a9e81dac3.webp&quot; alt=&quot;柠檬什么什么&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/9e40a0974b72515de16ae75e6779982f.webp&quot; alt=&quot;好吃，但是不知道为什么肉和壳都是分离的&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/06533d57f3a6693b27549f6189662806.webp&quot; alt=&quot;海肠韭菜饭，海肠吃起来脆脆的，个人感觉一般&quot;&gt;&lt;/p&gt;
&lt;p&gt;下午去了小石山，鲁迅公园附近，比较出片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/99bc5facba1c428e242ef5c95017e2e9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在这个地方给张张老师拍了一组我和她都很满意的照片，来往的游客不算多，大家都非常有礼貌，等着下一个人完全拍完才继续拍，海风呼呼地吹，穿过过道，下面就是海&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/0dc3b74e1eb771d7e92d8b1abb8ba133.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;从鲁迅公园走上来的路往右边看，似乎是青岛的市区&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/a8add990c66eb30fcba3f3967fb4c1ae.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;鲁迅公园上，不知道叫什么名字的塔，这时候上面风已经有点大了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/815e6c06d5ee998c8c13c8c580b6ecd4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;下面就是第一浴场&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/0efbed409c20d2bd61d1684b05745b9e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/2667624f0503163fdbfde465dc77c698.webp&quot; alt=&quot;某个神秘打卡点，旁边都是银杏树，落下的银杏果被踩烂后很臭&quot;&gt;&lt;/p&gt;
&lt;p&gt;鲁迅公园下面的海滩，其实是靠近水族馆那一段&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/288468858d622cc1f5f658d62c4688bd.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/a13d6ade16382122edcac1dc1f5473af.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/33b2880bde22b475b902ac7deba608e9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/da009f6ce251b70056ef2f3b830eb420.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/6e40a53293e663d20395be8f2742a306.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Day 2&lt;/h2&gt;
&lt;p&gt;阴雨天的青岛拍照总是有点阴郁的，拍出来总是带有些许忧郁，张张老师觉得像宣传片（&lt;/p&gt;
&lt;p&gt;早上的时候风很大，我们原本买了三把透明伞，我和 zc 每人带了一把，张张老师用的是自己的伞，结果我俩的透明伞马上就被风吹坏了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1a06600df69631cba3bca49400557674.webp&quot; alt=&quot;狼狈逃窜现场&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个地方很漂亮，是真的看了会一见钟情的地方，我甚至已经脑补了它晴天会是什么样子，但可惜它就是雨天，大雨大风天也有人在这里（为了出片，我实在是佩服&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/ba66745a974b4d60398ed922c2e5af57.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/081ac2f683b438d649226d24316ceab3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;中午还是吃青岛本帮菜&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/2b99b6208b91273cf636eea324f8f90c.webp&quot; alt=&quot;柠檬排骨，还可以&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/fea77e61c9a25978b67506cb32d143d4.webp&quot; alt=&quot;蒜蓉虾，我喜欢蒜蓉&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/2731ef1a6e6b3afeb31d0b503e0987e0.webp&quot; alt=&quot;有点油+有点咸，吃多了有点腻&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/c335605c1d84f4a4094110dcbca3ed7b.webp&quot; alt=&quot;好像是什么深海鱼？刺多&quot;&gt;&lt;/p&gt;
&lt;p&gt;吃了饭往栈桥那边走，说是雨天，人其实不少&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/ee82d9c7ec9c459ff852c7016062eb54.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/f06caf2f6fd1bc0d2cc9d423960b78c2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/52f9fc7ce1400674a36550457e2b026a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/23bb2fdbb4286900eca2cc522b973cb0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/f7fd11f08bfa267b71e8ba0753800bca.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/b85434617646d163ae20d8637d5aa023.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/86934d365c837dd40c3f41717296a205.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;暗黑的色调，想起了“黑云压城城欲摧”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/b8e43dd0c571230bb7bf8a5e867c388e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/41bf547c57a26b1741fa7bc90d781c56.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;沙滩上聚集了不少人，穿着雨衣&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/cf61cd3508ede31d0a7f8f193089c1f4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;海鸥在栈桥上聚集，与风做着斗争，人用面包投喂着&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/b3da3bf0d20a97b167656f74d026867c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1cd15410722a31906b68a3e29d9f3df7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/3a4fa4bde5c7b7c00f9403253b54c646.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/302a3856766812e124348fb56062c070.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/715667e05cb7dd9d59713ac9deb255f4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/e857abb00953af3849492af35548a593.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/a744572d4d2a19cf3e829047ce80b100.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我想，又冷又湿是这一天的形容词&lt;/p&gt;
&lt;h2&gt;Day 3&lt;/h2&gt;
&lt;p&gt;这一天去了小麦岛，浪也大，风没有那么吓人&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1dd831908b939727fed25eccab0e9567.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/9ec2c80f0951a4aa2af53f9e9906854a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/4e27545af3a454c803b1f3aedba846c7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在这里也给张张老师出了不少片，非常好看，超级好看，无敌好看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1aa3b11888bd709d9f1a9151c8125ebc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1dc0fbe17a4d671f8f73b216735640a8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我觉得这个浪是 man-made，因为从下面看这个小岛屿的侧边，可以看到人工砌起来的墙，不少人借着这个浪拍照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/e63488c91cc53aa3ab73a9e88b0c4987.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/ecb0121057cbf3c3ff8f34c196cd7f11.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/4a12dbecfb4f7e0d88b0a47338f5f95a.webp&quot; alt=&quot;从侧面看&quot;&gt;&lt;/p&gt;
&lt;p&gt;这张我也很喜欢&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/cd4e898626cfbbcd327aaf43eee13fe2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;远处海上的天空突然出现了一道亮光，不久就扩散成了一线&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/4ff434ffac01a7e5a0f71e9f29382da1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这张照片是 HDR 后期合成的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/dd6d9e6397e1fb8ac341e091e3606942.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;小朋友在岛上跑，朋友圈应该只发了第一张，因为第一张调过了色，但是第二张没有，觉得在朋友圈发有点重复，但是写在博客里就还好，这样看起来非常有动感&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/f36cbe5823767b0c7bee46f2e804d7b9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/c5a4096a6084c5055f0bfe5d472c621f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;对着小麦岛的是一栋栋楼房&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/1f32922e93c583d06a22d4366035bbae.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/25e3ffb0817c43ddac65a3f16caed383.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/9ddb8bd06c11d1115d29fc38f93cca00.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;拍到这里的时候，想到一句歌词“墨绿的沙滩，看睡懒觉的海鸥，就相约去做场梦”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/fa220d70de9a1879a78cdd85868ae3b0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/490ca0b6b31b37ca07ead34fc522fbf5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;没有坐上轮渡，因为到的时间太晚了，等我们下午五点钟赶到，人家已经关门啦&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/76fbd464bcded2a5ecd5a16efb14f4bf.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/bc64553fe061bf3a53a4e71242e127b8.webp&quot; alt=&quot;拍出来是亮的，实际上天已经快黑了&quot;&gt;&lt;/p&gt;
&lt;h2&gt;Day 4&lt;/h2&gt;
&lt;p&gt;最后一天去了金沙滩&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/52f8ce0be6a9b4b782605d9231022900.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/f3bc64fbbb552c530f38e2fed3e081a8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/b7f435e56be50f5df27db84d8bd2a1e5.webp&quot; alt=&quot;我这辈子就是被MyGo给毁了.jpg&quot;&gt;&lt;/p&gt;
&lt;p&gt;这上面可以蹦极，时不时传来尖叫的声音&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/4d8ad590339248b7c5d23bbbc4137763.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/a900b769adb5fea7a1b3aa062149cfe9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/b42a9f8a30ad1f5b3412844a63df70cb.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;神秘水上滑梯项目&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/8d5d73d54d94b4279b5d46f11db9bdd8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/10/988933292ff589d23f15f9f76effae37.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;总的来说，虽然这次旅行大部分时间都在与风雨相伴，但镜头却捕捉到了一个游客更少、更真实、也更具情绪感的青岛&lt;/p&gt;
&lt;p&gt;有机会再去一次吧，在晴天，再去一次青岛，给张张老师拍照，去看看阴天看不到的青岛的独特风光&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.D4NrS3do.webp"/><enclosure url="/_astro/hero.D4NrS3do.webp"/></item><item><title>本地部署的 ColabFold</title><link>https://www.juniortree.com/blog/self-hosted-colabfold</link><guid isPermaLink="true">https://www.juniortree.com/blog/self-hosted-colabfold</guid><description>尝试在本地服务器上部署ColabFold</description><pubDate>Fri, 26 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前人指路&lt;/h2&gt;
&lt;p&gt;有一个项目叫做 LocalColabFold，但是在国内服务器上安装各种依赖和解决依赖冲突实在是灾难，项目在这里：&lt;a href=&quot;https://github.com/YoshitakaMo/localcolabfold&quot;&gt;GitHub - YoshitakaMo/localcolabfold: ColabFold on your local PC&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一个很好的解决办法是使用 Docker/Singularity 来运行 ColabFold：&lt;a href=&quot;https://github.com/sokrypton/ColabFold/wiki/Running-ColabFold-in-Docker&quot;&gt;Running ColabFold in Docker · sokrypton/ColabFold Wiki · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;拉取镜像&lt;/h2&gt;
&lt;p&gt;将 &lt;code&gt;ghcr.io&lt;/code&gt; 替换为 &lt;code&gt;ghcr.nju.edu.cn&lt;/code&gt; 即可，用南大的镜像站&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;singularity pull docker://ghcr.nju.edu.cn/sokrypton/colabfold:1.5.5-cuda12.2.2
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;权重文件下载&lt;/h2&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;singularity run -B ./cache:/cache \
  colabfold_1.5.5-cuda12.2.2.sif \
  python -m colabfold.download
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个会在当前目录下创建一个 &lt;code&gt;cache&lt;/code&gt; ，里面会下载权重文件，速度忽好忽慢&lt;/p&gt;
&lt;h2&gt;运行预测&lt;/h2&gt;
&lt;p&gt;我写了俩脚本，一个用于快速预测，另外一个用来精细化预测，而且因为实验室的卡有两张 A100，所以我还尝试做了并行优化&lt;/p&gt;
&lt;p&gt;这个优化的逻辑其实很简单，就是在一个文件夹下面放多个蛋白的 fasta 文件，然后脚本去取两个蛋白，分别丢到两个 GPU 上，这个过程并不涉及交火，所以其实性能损耗很小&lt;/p&gt;
&lt;p&gt;但是似乎效果不太好&lt;/p&gt;
&lt;p&gt;运行脚本大概是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;bash run_parallel_colabfold.sh --input liueic/protein_data --out liueic/output_dir --cache liueic/colabfold_cache --work-bind liueic/protein_data --sif liueic/colabfold_1.5.5-cuda12.2.2.sif --gpus 1 --tasks-per-gpu 1 --colabfold-args &quot;--num-models 5 --num-recycle 6 --max-seq 256 --max-extra-seq 512 --msa-mode mmseqs2_uniref_env --pair-mode unpaired_paired --model-type auto --stop-at-score 90 --zip&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;刚开始预测的时候速度比较慢，但是我能看到显存已经被占用了，打开日志可以看到，是因为请求 MSA 服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;[00:23:21] [GPU 0] [] WARNING: You are welcome to use the default MSA server, however keep in mind that it&apos;s a
[00:23:21] [GPU 0] [] limited shared resource only capable of processing a few thousand MSAs per day. Please
[00:23:21] [GPU 0] [] submit jobs only from a single IP address. We reserve the right to limit access to the
[00:23:21] [GPU 0] [] server case-by-case when usage exceeds fair use. If you require more MSAs: You can 
[00:23:21] [GPU 0] [] precompute all MSAs with `colabfold_search` or host your own API and pass it to `--host-url`
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果是要做高通量并行这样是不行的，比较好的方法是自部署一个 MSA 服务，可以参考：&lt;a href=&quot;https://github.com/sokrypton/ColabFold#generating-msas-for-large-scale-structurecomplex-predictions&quot;&gt;GitHub - sokrypton/ColabFold: Making Protein folding accessible to all!&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是这个磁盘需求比较大，应该需要一台专门的服务器来做这个：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;First create a directory for the databases on a disk with sufficient storage (940 GB (!)). Depending on where you are, this will take a couple of hours&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;目前即使不自己部署 MSA，其实也是能接受的，大不了晚上睡一觉起来又好了，因为也就几百个蛋白（？可能）&lt;/p&gt;
&lt;h1&gt;自部署MSA服务&lt;/h1&gt;
&lt;h2&gt;安装 MMseqs 2 (带 AVX 2 支持)&lt;/h2&gt;
&lt;p&gt;需要安装最新版的 MMseqs 2，建议使用静态编译版本以获得最佳性能&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 下载静态编译版本 (Linux AVX2)
wget https://mmseqs.com/latest/mmseqs-linux-avx2.tar.gz
tar xvf mmseqs-linux-avx2.tar.gz
export PATH=$(pwd)/mmseqs/bin/:$PATH

# 验证安装
mmseqs -h
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;下载并构建数据库&lt;/h2&gt;
&lt;p&gt;可以前往这个网站进行下载：&lt;a href=&quot;https://opendata.mmseqs.org/colabfold&quot;&gt;Steinegger Lab Dataset&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;需要下载的数据库有：&lt;code&gt;uniref30_2302.db.tar.gz&lt;/code&gt;、&lt;code&gt;colabfold_envdb_2023.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;数据库非常大&lt;/p&gt;
&lt;h2&gt;解压，创建索引&lt;/h2&gt;
&lt;p&gt;创建对应的目录：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mkdir MMSeqs # 创建目录
cd MMSeqs
tar -I pigz -xvf /48T/software/colabfold_envdb_2023.tar.gz -C .
tar -I pigz -xvf /48T/software/uniref30_2302.db.tar.gz -C .
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后等待，这一步等待时间非常长，建议使用 &lt;code&gt;tmux&lt;/code&gt; 或者其他的东西挂起终端，怕意外中断&lt;/p&gt;
&lt;p&gt;做 &lt;code&gt;padding&lt;/code&gt;，(对 &lt;code&gt;colabfold_envdb_2023&lt;/code&gt; 同理)：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;# 语法: mmseqs makepaddedseqdb &amp;#x3C;输入数据库&gt; &amp;#x3C;输出数据库名称&gt;
mmseqs makepaddedseqdb uniref30_2302_db uniref30_2302_db_padded
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这一步发生了什么？ 它会生成一个新的数据库（&lt;code&gt;uniref 30_2302_db_padded&lt;/code&gt;），里面的序列长度会被补齐（Pad）到特定的倍数，这会占用额外的磁盘空间，但对于 A 100 这种大卡来说，能极大地减少显存访问的碎片化，速度至关重要&lt;/p&gt;
&lt;p&gt;这一步无法使用 GPU 进行加速，只能使用 CPU&lt;/p&gt;
&lt;h2&gt;开始推理&lt;/h2&gt;
&lt;p&gt;可以直接参考我写的这个脚本，你可能需要根据自己的需求来更改，MMseqs 本身应该是支持多序列单文件的输入的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# =====================================================================
# MMseqs2 多物种批量 MSA 生成脚本
# =====================================================================

set -u
set -e

# --- 1. 核心路径配置 (请核对) ---
# 输入数据的文件夹 (当前目录)
INPUT_ROOT=&quot;./Gene_Family&quot;
# 输出结果的总目录
OUTPUT_ROOT=&quot;./MSA_Results&quot;

# MMseqs 程序和数据库路径 (根据你之前的记录填写)
MMSEQS_BIN=&quot;/mnt/liueic/MMSeqs/mmseqs/bin/mmseqs&quot;
DB_UNIREF=&quot;/mnt/liueic/MMSeqs/uniref30_2302_db&quot;
DB_ENV=&quot;/mnt/liueic/MMSeqs/colabfold_envdb_2023&quot;

# --- 2. 参数设置 ---
THREADS=16
GPU_ID=1
export CUDA_VISIBLE_DEVICES=&quot;$GPU_ID&quot;

# 创建总输出目录
mkdir -p &quot;$OUTPUT_ROOT&quot;

echo &quot;==========================================================&quot;
echo &quot;开始批量处理 MSA&quot;
echo &quot;扫描目录: $INPUT_ROOT&quot;
echo &quot;结果输出: $OUTPUT_ROOT&quot;
echo &quot;==========================================================&quot;

# 遍历所有 .faa 文件
for fasta_file in &quot;${INPUT_ROOT}&quot;/*.faa; do
    # 检查文件是否存在 (防止目录为空)
    [ -e &quot;$fasta_file&quot; ] || continue

    # --- A. 提取物种名，创建独立文件夹 ---
    filename=$(basename &quot;$fasta_file&quot;)
    # 提取物种名 (去掉后缀 blast.pep.faa，让文件夹名更短更干净)
    species_name=&quot;${filename%.pep.faa}&quot;
    # 或者如果你想要完整文件名做文件夹，用这个: species_name=&quot;${filename%.*}&quot;
    
    # 定义该物种的专属输出目录
    JOB_DIR=&quot;${OUTPUT_ROOT}/${species_name}&quot;
    TMP_DIR=&quot;${JOB_DIR}/tmp&quot;
    FINAL_DIR=&quot;${JOB_DIR}/final_a3m&quot;
    
    mkdir -p &quot;$JOB_DIR&quot; &quot;$TMP_DIR&quot; &quot;$FINAL_DIR&quot;

    echo &quot;&quot;
    echo &quot;----------------------------------------------------------&quot;
    echo &quot;正在处理物种: $species_name&quot;
    echo &quot;输入文件: $filename&quot;
    echo &quot;专属目录: $JOB_DIR&quot;
    echo &quot;----------------------------------------------------------&quot;

    # --- B. 运行 MMseqs2 流程 ---
    
    # 1. CreateDB
    &quot;$MMSEQS_BIN&quot; createdb &quot;$fasta_file&quot; &quot;$JOB_DIR/query_db&quot; --shuffle 0 &gt; /dev/null

    # 2. Search UniRef30 (A100 加速)
    echo &quot;   Running Search UniRef30...&quot;
    &quot;$MMSEQS_BIN&quot; search &quot;$JOB_DIR/query_db&quot; &quot;$DB_UNIREF&quot; \
        &quot;$JOB_DIR/res_uniref&quot; &quot;$TMP_DIR&quot; \
        --threads &quot;$THREADS&quot; -s 8 --gpu 1 --max-seqs 2000 --num-iterations 3 &gt; /dev/null

    # 3. Search EnvDB
    echo &quot;   Running Search EnvDB...&quot;
    &quot;$MMSEQS_BIN&quot; search &quot;$JOB_DIR/query_db&quot; &quot;$DB_ENV&quot; \
        &quot;$JOB_DIR/res_env&quot; &quot;$TMP_DIR&quot; \
        --threads &quot;$THREADS&quot; -s 8 --gpu 1 --max-seqs 2000 --num-iterations 3 &gt; /dev/null

    # 4. Result2MSA
    echo &quot;   Converting to MSA...&quot;
    &quot;$MMSEQS_BIN&quot; result2msa &quot;$JOB_DIR/query_db&quot; &quot;$DB_UNIREF&quot; \
        &quot;$JOB_DIR/res_uniref&quot; &quot;$JOB_DIR/msa_uniref&quot; \
        --msa-format-mode 2 --threads &quot;$THREADS&quot; &gt; /dev/null

    &quot;$MMSEQS_BIN&quot; result2msa &quot;$JOB_DIR/query_db&quot; &quot;$DB_ENV&quot; \
        &quot;$JOB_DIR/res_env&quot; &quot;$JOB_DIR/msa_env&quot; \
        --msa-format-mode 2 --threads &quot;$THREADS&quot; &gt; /dev/null

    # 5. Unpack (解包)
    # 先解包到一个临时 merged 目录方便合并
    RAW_A3M_DIR=&quot;$JOB_DIR/raw_a3m&quot;
    mkdir -p &quot;$RAW_A3M_DIR&quot;
    
    &quot;$MMSEQS_BIN&quot; unpackdb &quot;$JOB_DIR/msa_uniref&quot; &quot;$RAW_A3M_DIR&quot; --unpack-name-mode 0 --unpack-suffix &quot;.uniref&quot; &gt; /dev/null
    &quot;$MMSEQS_BIN&quot; unpackdb &quot;$JOB_DIR/msa_env&quot; &quot;$RAW_A3M_DIR&quot; --unpack-name-mode 0 --unpack-suffix &quot;.env&quot; &gt; /dev/null

    # --- C. 合并 &amp;#x26; 重命名 (自动化修正文件名) ---
    echo &quot;   Merging and Renaming...&quot;
    
    # 读取 ID 映射表 (MMseqs 自动生成的 query_db.lookup)
    LOOKUP_FILE=&quot;$JOB_DIR/query_db.lookup&quot;
    
    while read -r id original_header; do
        # 1. 解析文件名
        # original_header 可能是 &quot;&gt;SeqID description...&quot;，我们要取第一个词作为文件名
        clean_name=$(echo &quot;$original_header&quot; | awk &apos;{print $1}&apos; | tr -d &apos;&gt;&apos; | tr &apos;|/ &apos; &apos;___&apos;)
        
        # 定义输入输出
        uni_file=&quot;${RAW_A3M_DIR}/${id}.uniref&quot;
        env_file=&quot;${RAW_A3M_DIR}/${id}.env&quot;
        final_file=&quot;${FINAL_DIR}/${clean_name}.a3m&quot;
        
        # 2. 合并操作
        if [ -f &quot;$uni_file&quot; ]; then
            cat &quot;$uni_file&quot; &gt; &quot;$final_file&quot;
            
            # 如果有环境序列，去掉第一行后追加
            if [ -f &quot;$env_file&quot; ]; then
                tail -n +2 &quot;$env_file&quot; &gt;&gt; &quot;$final_file&quot;
            fi
        fi
    done &amp;#x3C; &quot;$LOOKUP_FILE&quot;

    # --- D. 清理 ---
    echo &quot;   Cleaning up tmp files for $species_name...&quot;
    rm -rf &quot;$TMP_DIR&quot; &quot;$RAW_A3M_DIR&quot; &quot;$JOB_DIR/res_uniref*&quot; &quot;$JOB_DIR/res_env*&quot; &quot;$JOB_DIR/msa_*&quot;

    echo &quot;$species_name 完成!&quot;
done

echo &quot;==========================================================&quot;
echo &quot;所有物种处理完毕！&quot;
echo &quot;请查看结果目录: $OUTPUT_ROOT&quot;
echo &quot;==========================================================&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看是否运行成功，查看显卡调用 &lt;code&gt;nvidia-smi&lt;/code&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/89e596d07560d9b7c89b0f096656e9fc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;运行结束后的目录结构：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;MSA_Results_P450/
├── Manduca_sexta/                &amp;#x3C;-- 自动根据文件名创建的文件夹
│   ├── query_db                  &amp;#x3C;-- 保留了 DB 以备不时之需
│   └── final_a3m/                &amp;#x3C;-- 这里是可以直接喂给 ColabFold 的！
│       ├── SeqA.a3m              
│       ├── SeqB.a3m
│       └── SeqC.a3m
├── Papilio_xuthus/
│   └── final_a3m/
│       ├── ...
└── ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;MMseqs 2 的工作流是： &lt;code&gt;FASTA&lt;/code&gt; -&gt; &lt;code&gt;Createdb&lt;/code&gt; -&gt; &lt;code&gt;Search&lt;/code&gt; (生成 &lt;code&gt;ResultDB&lt;/code&gt;) -&gt; &lt;code&gt;Result 2 MSA&lt;/code&gt; (转换) -&gt; &lt;code&gt;UnpackDB&lt;/code&gt; (解压出文件)&lt;/p&gt;
&lt;h2&gt;后话&lt;/h2&gt;
&lt;h3&gt;MSA Search&lt;/h3&gt;
&lt;p&gt;ColabFold 里面允许我们自定义 &lt;code&gt;host-url&lt;/code&gt;，于是我就病急乱投医，我真的去找了 MSA Search 的容器镜像，在英伟达的官网这里可以找到：&lt;a href=&quot;https://docs.nvidia.com/nim/bionemo/msa-search/latest/overview.html&quot;&gt;Overview — NVIDIA NIM for MSA Search&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后非常令人哭笑不得的是，如果你直接使用中国大陆的 IP 去拉这个容器，他会告诉你说让你去找大陆的代理商&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/64776c97b7cd243a84e3faaa7f39be16.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/12/df78a2b3ca1635ec10d738950a67122c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;但是据我测试这个代理商国内如果你要使用的话，需要以机构/企业的身份去申请，就很离谱，因为英伟达上面下载只需要个人开发者申请一个 key 就可以了&lt;/p&gt;
&lt;p&gt;所以我整了个花活，我用了 Azure 东京地区的服务器，去拉这个容器，然后再把容器中转到阿里云的容器仓库，再用集群从阿里云容器仓库拉这个容器&lt;/p&gt;
&lt;p&gt;虽然我最后没有跑起来，因为我用的是 &lt;code&gt;singularity&lt;/code&gt;，这个东西有各种奇奇怪怪的文件系统写入的问题，很无语&lt;/p&gt;
&lt;h3&gt;gpuserver&lt;/h3&gt;
&lt;p&gt;因为这个 MMseqs 每次都需要重新读取数据，导致速度非常慢！需要启动一个守护进程，把数据写入到显存/内存中，以一个服务端的形式提供服务&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;#!/bin/bash
# ===============================================================
# MMseqs2 GPU 驻留服务启动脚本 (修正版)
# ===============================================================

set -u

# === 1. 配置路径 ===
MMSEQS_BIN=&quot;mmseqs/bin/mmseqs&quot;
WORKDIR=$(pwd)

# 数据库路径 (确保这些路径是正确的)
DB_UNIREF=&quot;uniref30_2302_db&quot;
DB_ENV=&quot;colabfold_envdb_2023&quot;

# 日志文件
LOG_UNIREF=&quot;server_uniref.log&quot;
LOG_ENV=&quot;server_env.log&quot;

# === 2. GPU 环境设置 ===
# 指定卡，这里简化处理，默认使用 GPU 0 或 1
# 如果你有特定 GPU 编号，请修改这里
export CUDA_VISIBLE_DEVICES=0  

echo &quot;------------------------------------------------&quot;
echo &quot;正在启动 MMSeqs2 GPU Resource Managers...&quot;
echo &quot;注意：gpuserver 不是网络服务器，它不监听端口。&quot;
echo &quot;它将数据库锁定在 GPU/内存中以加速本地搜索。&quot;
echo &quot;------------------------------------------------&quot;

# 检查可执行文件
if [ ! -f &quot;$MMSEQS_BIN&quot; ]; then
    echo &quot;错误: 找不到 mmseqs 可执行文件: $MMSEQS_BIN&quot;
    exit 1
fi

# --- 启动 UniRef30 Server ---
echo &quot;启动 UniRef30 GPU Resident Process...&quot;
# 去掉了 --port, --gpu-mode, --gpu-mem, --db-load-mode, --threads
# gpuserver 只需要数据库路径。其他参数通常是在 &apos;search&apos; 时指定的，
# 或者它会默认加载。
nohup &quot;$MMSEQS_BIN&quot; gpuserver &quot;$DB_UNIREF&quot; \
    &gt; &quot;$LOG_UNIREF&quot; 2&gt;&amp;#x26;1 &amp;#x26;

PID_UNIREF=$!
echo &quot;   PID: $PID_UNIREF | Log: $LOG_UNIREF&quot;

# --- 启动 ColabFold EnvDB Server ---
echo &quot;启动 EnvDB GPU Resident Process...&quot;
nohup &quot;$MMSEQS_BIN&quot; gpuserver &quot;$DB_ENV&quot; \
    &gt; &quot;$LOG_ENV&quot; 2&gt;&amp;#x26;1 &amp;#x26;

PID_ENV=$!
echo &quot;   PID: $PID_ENV | Log: $LOG_ENV&quot;

echo &quot;------------------------------------------------&quot;
echo &quot;   GPU 服务已启动。&quot;
echo &quot;------------------------------------------------&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后这个坑点在于，新版本的 MMseqs 的参数已经改了，不能使用启动 &lt;code&gt;http&lt;/code&gt; 服务器这种方式处理任务了，我也没想好要怎么处理这个问题&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - OSPP 开发小结</title><link>https://www.juniortree.com/blog/ospp-summary</link><guid isPermaLink="true">https://www.juniortree.com/blog/ospp-summary</guid><description>2025年开源之夏，开发历程与体会</description><pubDate>Thu, 04 Sep 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;随记 - OSPP 开发小结&lt;/h1&gt;
&lt;p&gt;一晃两个月的暑假过去了，OSPP 也进入到了最后的一个月，按照之前的项目申请书，这个月基本上就是要准备收尾了，最近刚好在写项目文档和项目总结，以此来谈谈我自己的感受和想法&lt;/p&gt;
&lt;h2&gt;申请&lt;/h2&gt;
&lt;p&gt;刚开始申请的时候，是准备申请三个项目&lt;/p&gt;
&lt;p&gt;第一个项目是一个游戏面板，我刚开始接触运维的时候玩过这个面板，而且我本身也做过一段时间的社团游戏服主，而且也比较了解 Docker，当时给那个老师写了邮件，没有回&lt;/p&gt;
&lt;p&gt;第二个项目就是我现在参与的这个项目，邮件发了过去之后老师第二天马上就回了，说会整理一些资料，整理完成之后就马上发给我，然后我又马上回了一份邮件，说我对这个项目非常感兴趣，愿意加入到这个项目里面之类的&lt;/p&gt;
&lt;p&gt;然后我等了可能有半个礼拜，老师还是没回我邮件，然后我就开门见山，问老师能不能直接加他微信，然后老师回邮件也很快啊，就马上把他的微信给我了，并且和我说他最近比较忙，没有来得及回&lt;/p&gt;
&lt;p&gt;然后导师和我说这个项目他其实也不是很熟悉，就给我介绍了另外一位老师（我后来正式加入社区了才知道他是架构师），然后那位老师就拉我进社区的飞书，商榷具体的开发目标，实现路径等等&lt;/p&gt;
&lt;p&gt;现在想想，包括在之后实际开发的过程中，我做的有些事情、说的有些话其实是有些鲁莽的，好在确实碰到个好导师&lt;/p&gt;
&lt;p&gt;第三个项目瞄准了一个 Go 开发，我没记错的话好像是和 K8s 相关的，做一个和网关的项目，写一个插件，但是因为我已经和第二个导师联系了，就没有去和第三个导师沟通&lt;/p&gt;
&lt;p&gt;之后就是很漫长的等待，也算是意料之内的中标成功了&lt;/p&gt;
&lt;h2&gt;开发&lt;/h2&gt;
&lt;p&gt;这个社区有两个项目，一个项目就是我负责的这个，和传统的后端开发有点类似；另外一个是偏向硬件的陪伴机器人&lt;/p&gt;
&lt;p&gt;我导师就给重新拉了个群，一共五个人&lt;/p&gt;
&lt;p&gt;因为我这个项目的落地和实际的社区需求挂钩，而我们这个社区又比较特殊，人员流动比较快，经常会出现“这个人写的接口，但是人找不到”的情况，我为此困惑了很久，导致前期的开发进度比较缓慢&lt;/p&gt;
&lt;p&gt;后来我导师就给我拉进了社区的核心开发者群，里面的老师就给我找到主要做开发的老师，然后告诉我目前社区主要用的架构是啥，前后端接口大概是怎么定义的（主要是用 FastGPT，所以我的项目前后端基本上都是按照 FastGPT 的响应和请求格式定义的）&lt;/p&gt;
&lt;p&gt;这时候思路就很清晰了，我做了一个很巧妙的设计，先按照 FastGPT 的响应和请求格式定义好数据模型，然后再定义好一个基类，最后再用注册表模式去注册每个 Agent&lt;/p&gt;
&lt;p&gt;这样的话后期的维护就变得非常简单了，而且这样 Vibe Coding 也友好，后面的一些 Agent 我是把它的接口文件爬下来，直接喂给 Cursor，基本上一下子就兼容完了&lt;/p&gt;
&lt;p&gt;做到这里，项目基本上就进行了大半，这时候已经是七月下了&lt;/p&gt;
&lt;p&gt;当时比较闲，因为 OSPP 要求必须在原有的仓库里面先 Fork，最后再 PR/MR，我 PR 的这个仓库，里面文档比较乱，我就尝试用 VitePress，做成了一个类似 Wiki 的东西，当时也是“无心插柳柳成荫”，我把这个部署到了 Cloudflare Pages 上，给社区的老师看了&lt;/p&gt;
&lt;p&gt;然后那个老师很开心啊，说捡到宝了，然后向我伸出了橄榄枝，问我愿不愿意加入到社区的其他项目中，我欣然接受&lt;/p&gt;
&lt;h3&gt;另一个项目&lt;/h3&gt;
&lt;p&gt;我加入到这个社区接受的第一个非 OSPP 相关的项目是一个 Next.js 项目，这个项目原本是部署到类似 Vercel 这样的平台上，但是那个平台不是那个文档，需求是能本地部署&lt;/p&gt;
&lt;p&gt;然后我就尝试把它封到容器里面，并且修复了一些 Bug，因为当时运维的一些问题，没有办法部署到社区的服务器上，我就丢到了自己阿里云的服务器上，这里是使用统计&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/09/a5ae42f65b25ca2bc6281f1209162b05.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/09/91ee3bfa6fe02c5ba03301b633456510.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后去了广州，去广州基本上没有做什么开发，社区的另外一位老师，他是在读博士，突然来问我愿不愿意搞 RAG，说实话我对其几乎没有任何系统性经验，更多的经验可能是自己折腾 FastGPT 或者玩 Dify 得到的一些不那么准确的总结性经验，但我还是想试一试&lt;/p&gt;
&lt;h2&gt;我学到了什么&lt;/h2&gt;
&lt;h3&gt;技术上&lt;/h3&gt;
&lt;p&gt;使用的语言是 Python，技术栈是 FastAPI+MongoDB+MinIO&lt;/p&gt;
&lt;p&gt;如果说要学到什么，那就是看了很多的 Agent 平台的 API 文档和 SDK，对各种 Agent 的使用和接入有了比较深的理解&lt;/p&gt;
&lt;p&gt;刚开始开发的时候，我碰到了 Python 虚拟环境混用的问题，macOS 会自动激活本地 conda 的 base 环境，导致我&lt;code&gt;uv pip install&lt;/code&gt; 安装的很多模块都进了 conda，而且我还做了件非常傻逼的事情，尝试删掉本地项目下的 &lt;code&gt;requirements.txt&lt;/code&gt;，导致依赖完全丢失，最后一个一个手补回来的&lt;/p&gt;
&lt;h3&gt;社会能力上&lt;/h3&gt;
&lt;p&gt;~~本人擅长写 README~~&lt;/p&gt;
&lt;p&gt;要勇敢，我之前很害怕被拒绝，但我要是没有发出那封邮件，我会不会就和这次的 OSPP 项目失之交臂了呢？我如果没有壮起胆子和各种老师去交流，去提问，也许项目不会有那么顺利地进行，也许这个项目也能做完，但是肯定没有现在这样的完善，这样的有意思&lt;/p&gt;
&lt;p&gt;还写了个比较长的文章，发在了某神秘平台上，出于羞耻就不发出来了&lt;/p&gt;
&lt;p&gt;未来我还会继续在这个社区里面做一些贡献，也许明年我也会尝试继续去申请项目，不一定是 OSPP，也可能是 GSOC&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>游记 - 2025 - 香港</title><link>https://www.juniortree.com/blog/hongkong-2025</link><guid isPermaLink="true">https://www.juniortree.com/blog/hongkong-2025</guid><description>周期为一天的香港之旅</description><pubDate>Sat, 23 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;早上坐车从广州南到深圳北（1 h），然后从深圳北坐地铁到福田口岸，过海关很快，深圳到 Hong Kong 之间有一个长廊，要走路过去，中间不许拍照&lt;/p&gt;
&lt;p&gt;手机要提前买漫游套餐，我用的是移动，广电直接歇菜了，漫游也不是所有的网站都让你看，实测移动只有谷歌系的软件能用，比如 Gmail，Search，Maps，其他的流量出口是在北京&lt;/p&gt;
&lt;p&gt;Google Maps 吊打高德，主要是无广告，高德那个广告太多，过于臃肿，我希望导航软件就只要导航功能就行&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/66648750355d3416f84ceef14223d2a8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/215d40135a981a450c0b1bcde7d55964.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/58d4d4ed76ab0717f0759ec488c52839.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/a12ba776d82625a4a0dc17618bbc6bf2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后坐地铁到&lt;strong&gt;鸭寮街&lt;/strong&gt;，因为这地方类似于深圳的华强北，啥都有买的，来这里主要是为了买手机卡，种类非常多，多的不知道选哪个，后来索性不买了，找了家附近的麦当劳，连上 Wi-Fi&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f8a37d96e4823e69795c980e7bd00074.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/6985c46bc5d3f0eb77821053500d5f64.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/1a26ffe43c7c39fce2068b357723ec65.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/21b2148165ce81d928db2e8d540a21b2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里的麦当劳有内地木有的奶昔，味道还可以，值得一尝，但是我第一次喝的时候不知道那个木棒子是干什么的，导致喝到后面发现越来越甜&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/34e462ca793eed469db8976fff8baded.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后去了信合大厦，没有什么好玩的，不发图了，之后再转战维多利亚港，拍了一些美照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/14e9bb31bb28c95033a2c03e557274ff.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/95897ec4333a78629665baf80455c770.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/9dc95369b517936810b484df340b27e9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f554598e7a3c14a590a5251bfc43ce6b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/0e554aa497f46b21a959adb68f0a17a3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/b367108f4649b71beafe162df8496478.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/7026ad9942dc7db61b04d751e66760f2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f0441d662c4f95d04457233d643be47e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后就准备去太平山，坐小缆车，到缆车起点要地铁 + 走路&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/10d44886b78400eed6ed5063824a56f5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/9500bf6c70c263228f30e7f87869fa45.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/2837c7f5857e5e7efafea89e75f8cd10.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f6d04626fa776c0bba307b2c7f8b8c89.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;小缆车人好多，等等等等等等等，有一些迪士尼米老鼠的元素，还挺有意思&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/0aaa3b620b72d74acb286fca7c511c07.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/4168c5b2bbd3a42c75c172e7b999c302.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/1230a32a511c4071cd9a78b5c632987d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/e2d4d8032caf7cd390f7e1e931a5bb87.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/cee663cd3b6c3dbe8a85c2c5d2b4b534.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/6ba6e5b8821b1112498f5992a95bbf3a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f89af647b56acd25f1cfad3a318ca2c4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/5aa12230c9ef854c65217a895a5e49c5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/ee8d061cb495ec504613e03d0feddda7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/f9f12ab2eccf251b4710c9e7b537f237.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后就走不动了，找了家中环附近的万宁，买了九和黄道益活络油，是的，九盒，花了 610 多 RMB，直接用的支付宝，汇率大概是 1:0.92，我看了好几个当地人都比较喜欢直接刷卡，打开 Apple Pay，然后刷 POS 机&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/e8776da3f5d7245778b52f047abcbf4b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/1db3c7dbe8f35b2f0efd9eed3f46352e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/adda17641523f3f4b3354f2a38b1ee3e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/8fca21e90e1b9eb75c52a2792a1ad5d0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/6b35a91fbf922a5aa576caa6afbff41d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/5c518b3270d03ed7f9466c901156a36f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/8dc30d3a5e6892a43e58b50daf15aea0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.CGxVrzji.webp"/><enclosure url="/_astro/hero.CGxVrzji.webp"/></item><item><title>随想 - 广州印象</title><link>https://www.juniortree.com/blog/raining-guangzhou</link><guid isPermaLink="true">https://www.juniortree.com/blog/raining-guangzhou</guid><description>雨后广州</description><pubDate>Sat, 23 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;广州的天气挺多变的，上一秒还在下雨；下一秒又天晴，出去找饭吃的路上突然下起了大雨，忙躲在海印桥下&lt;/p&gt;
&lt;p&gt;珠江上的雨点像一颗颗小石子击打着水面，泛起一圈圈涟漪，海印桥底很有一种临时避难的感觉，同时夹杂着湿漉漉的空气和江水的味道，江水是黄色的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/ebf8599777e60b91a31e415b65f6384a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/193e54963d1dab6d939f315d4c0597a9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;阵雨过后，便是短暂的晴天&lt;/p&gt;
&lt;p&gt;天空中的云被分成的两半，一半是蓝色的；另一半是灰色的&lt;/p&gt;
&lt;p&gt;高楼直插天际，一半浸在阴影里，一半沐在阳光下，就像两种心情同时存在，也算得上是奇观了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/c1956ff1ca6b7ecb97491e6c7d3eb426.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;等我走到中大北门的时候，这边的天已经完全放晴&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/16b1338a0c77f31b6c95f8968e9b64fd.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我之前和一些朋友交流过，广州到底是什么样的城市呢？我觉得他比北京这座严肃的城市要温柔的多，对于我这种出生在湖南的人来说，广州很有家的味道，尤其是在饭后，沿着珠江转呀转呀转，闻着带有些许腥味的江风，很舒服&lt;/p&gt;
&lt;p&gt;在我的眼里，像珠江这样的江，水面开阔、气息浓烈，带着一种能够 “养活城市” 的宽阔与生机；而北方的江（比如天津眼下的那条海河），更多是像个安静的城市景观，河面相对收敛，水色少了些南方的湿润与柔情&lt;/p&gt;
&lt;p&gt;平静的水面是培养不出优秀的水手的&lt;/p&gt;
&lt;p&gt;珠江好像真没看到有大爷跳水，感觉从桥上跳下去也有点高，而且还有各种船&lt;/p&gt;
&lt;p&gt;去年去中大北门广场上转还碰上了一门趣事，我和朋友清楚地听到有个老头用我的家乡话喊 “你在干嘛”&lt;/p&gt;
&lt;p&gt;感觉有机会能多来这边生活几年也是不错的&lt;/p&gt;
&lt;p&gt;晚上绕着二沙岛走了一圈，从海印桥，到广州大桥，雨后的空气被洗得干干净净，也不热，蚊子也没有预料的多&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/867dce4099785243a58cdb2b26056417.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/4581a22365b02ef70d443c74e5d131a1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - 参加广东业余无线电协会活动</title><link>https://www.juniortree.com/blog/ham-in-guangzhou</link><guid isPermaLink="true">https://www.juniortree.com/blog/ham-in-guangzhou</guid><description>参加广东业余无线电协会活动，收获首张通联QSL卡片，结识同好</description><pubDate>Sun, 17 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;刚好来广州那天就看到业余无线电公众号上有广东业余无线电协会的科普活动，但是限制了 50 个人报名，当时就想去，但是感觉人估计很多，报名也轮不上我，于是就放弃了&lt;/p&gt;
&lt;p&gt;在 15 号下午和 PWM 友台在中继上碰面了，然后他告诉我这个情报，告诉我还可以去，不用报名，于是便下定决心，自己去一趟&lt;/p&gt;
&lt;p&gt;协会的地点也有点偏啊，在黄埔区，感觉是在开发区，周围都是工厂或者企业之类的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/b488f6fb7403aa20667fcaa5d34bd247.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;活动是下午两点就开始了，但是等我从海珠过去的时候就已经一点半了，导致我完全错过了签到和讲座&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/bd6d6ecd8252102631863e942f4f1853.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/37da1ed6e79bb3db90100effe80334a9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/c5795c19254caa8ad14f45cc3de2efe6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/bc63b55d59e2c9acc2caa96a3448abd5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;练习 CW&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/5167aa7b303a23eff534aba821066ed9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;还和 PWM 老师面基了！虽然我唯唯诺诺拿了卡片就跑了哈哈哈&lt;/p&gt;
&lt;p&gt;这是我第一次正式通联交换到的 QSL 卡片！很开心&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/025843ad7c75aaa0daf812a4fe5c5e68.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/000522a85949cbbc3ab1abcca795f0b2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;线下厚着脸皮问 IEI 老师要了卡片～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/45301fc13e8357c6f797bb4ea4d2d406.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个背景图有意思，妹子手里拿着的是泉盛的 k5 或者 k6 哈哈哈，也是我买的第二个手台，很经典&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/d15cbd4bd5e29955e7e72e90f0dda21b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;顺便再炫一炫之前 CBD 寄给我的 QSL 卡片，也是我收到的第一张卡片～&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/23a0d7cfbbd9bf55b5a6d29d4ec8a439.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/6b31dc0858a89a187823956c2946a769.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;但是我咕咕嘎嘎了好久，还没有寄出我的卡片（肯定不会🐦）&lt;/p&gt;
&lt;p&gt;第一次见到站外换乘，记录一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/5de43965364658488a1de8883379f55b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/df423a39e4983a30f0df0a09fd5933f6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - 第一次收云图</title><link>https://www.juniortree.com/blog/with-satellite-cloud-image</link><guid isPermaLink="true">https://www.juniortree.com/blog/with-satellite-cloud-image</guid><description>初次接收NOAA-15卫星云图的经历，分享设备使用和信号调整心得</description><pubDate>Tue, 05 Aug 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;2025 年 8 月 5 日，北京时间 19 点 21 分左右的时候，接收了来自 NOAA-15 气象卫星的 APT 图像，最大仰角为 72.3 度&lt;/p&gt;
&lt;p&gt;使用的是宝峰 DM 1501，原装天线，这个手台是有自动多普勒功能的，但是因为我没设置坐标，也没设置星历，导致这个功能就没启用，我也比较懒，就直接没有做偏移&lt;/p&gt;
&lt;p&gt;APT 的音频是哔哔哔的这种声音，辨识度还是挺高的&lt;/p&gt;
&lt;p&gt;对音频的记录也是一个问题，必须是符合标准的 &lt;code&gt;wav&lt;/code&gt; 文件，尽可能无损&lt;/p&gt;
&lt;p&gt;原装橡皮天线对准也是个问题，直接用天线方向对准卫星显然是错误的，~~这个天线很容易让我想起何同学~~&lt;/p&gt;
&lt;p&gt;搬运知乎大佬的几张图：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/0632d05b4236d7ce3561622ceae27fb6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/384996cf1f1e8263c9a0675df1a58732.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/7e414578a13837a1612fc0354a082a53.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;所以咱得把手台给斜着对准卫星方向，实际上手前我也不知道咋弄，但是慢慢移动的过程中，实际操作也只能对准个大概，然后一点点去调整手台的位置，感觉背噪比较小，信号质量比较好的时候就差不多了&lt;/p&gt;
&lt;p&gt;实际听后面的发出的录音也可以感受到，中间有一部分信号非常好，几乎没有背噪，也就差不多是最大仰角的位置&lt;/p&gt;
&lt;p&gt;很遗憾的是在 NOAA-15 落下的位置被房屋遮挡了，导致后面的一段没有信号&lt;/p&gt;
&lt;p&gt;最后展示一下第一次收到的云图，效果其实很差，后续可以会找个宽阔点的地方，晚上尝试去搜 NOAA-19 的图，在高中的操场上，高中操场虽然很大，但是四周都是山或者教学楼，信号遮挡也比较严重，桥上或许是一个好地方&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/08/9788eda5c2655b561478a7c8522e11e7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.D--5a7uF.webp"/><enclosure url="/_astro/hero.D--5a7uF.webp"/></item><item><title>游记 - 2025 - 贵州</title><link>https://www.juniortree.com/blog/guizhou-2025</link><guid isPermaLink="true">https://www.juniortree.com/blog/guizhou-2025</guid><description>环半个贵州</description><pubDate>Mon, 28 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;旅行 Day 1&lt;/h2&gt;
&lt;p&gt;直接使用高德的 MCP 规划了为期 5 天的贵州自驾游，让它综合考虑天气，路线，景点等诸多因素，和常年征战贵州的老司机推荐的一样，太爽了，可惜现在小红书和携程还没有 MCP，要是能直接查询景点或者推荐酒店就相当完美了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/3fa013a8ab8147142be09feb634fed8e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;比较完蛋的是第一天原本准备去加榜梯田住的，但是我酒店订错了，订成昨天晚上的了
很可恶的是当我和携程客服沟通的时候，酒店说不能退钱 (ง ᵒ̌皿ᵒ̌)ง⁼³₌₃&lt;/p&gt;
&lt;p&gt;有事携程客服是真上啊，帮我和酒店沟通了好几次，对携程好感度直接升满，不过这个确实是我自己的问题，当花钱长记性了&lt;/p&gt;
&lt;p&gt;去加榜梯田的路非常烂，县道，山路十八弯，大概有 20 多公里这样的路，而且路上加油站也少&lt;/p&gt;
&lt;p&gt;加榜梯田景区很有我印象里贵州农村的感觉，除了景区的设置和一些民宿，房子破破的，路也绕，必须坐景区的摆渡车才能进去，摆渡车有空位的话，还会捎上村民&lt;/p&gt;
&lt;p&gt;要是再有一次机会我应该是不会去了，几个人摆渡车坐一圈就跑路了，主要问题还是路差，基础设施跟不上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/7551d394e6e4409ff2ef43d80319a0a8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/5492f9a53c226c2ed4f53b1ff987cb9e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/6636c541bfa57d8f332f6d5b901d5bb5.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/a941ab24212eed1938705d05c593963e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/b39503517cb68112039097b811b5bbac.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/1159e65b95d164d29e0bca6cc2952e58.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/a65d3c5c2d932465f200d71e5e1daa8d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;高速和国道是我在跑，今天我跑了可能有 300 多公里，我不跑的时候就我爹跑，我跑后座睡觉，高德 + CarPlay 好用，原车机的导航很屎，iPhone 自带的导航虽然很简约而且无广告，但是很多提醒都没有，高德有个很牛逼的功能，对面车道有来车的时候会提醒&lt;/p&gt;
&lt;p&gt;下午原本准备直接在加榜梯田的民宿睡觉的，但是这边住的确实不咋样&lt;/p&gt;
&lt;p&gt;于是直接开车去了荔波，但是酒店我没选好，这边不能像一二线城市无脑选华住会，酒店非常无敌之垃圾，尤其是酒店不带停车位，停在路边需要收费，一晚上 13 块&lt;/p&gt;
&lt;p&gt;晚上吃了牛肉，香&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/deb9df644f4f2e3113e5eca110182cd0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;旅行 Day 2&lt;/h2&gt;
&lt;p&gt;第二天从荔波县城出发，早上恰了一碗羊肉面，还不错，但是油很重很重&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/761835a6b2cab3ac4a6226d6bcac20fa.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;荔波这个还不错，从县城到景区有一段距离，5A 级景区还是有点实力，配套设置做的都挺不错的，房子也建得漂亮&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/984fc80d7b501ebc743cd541fce03129.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;买票也是学生/老师/医生等职业免门票钱（120），但是要付摆渡车钱（50），从景区入口到摆渡车的地方有一段距离，得走路去，坐车的地方立了块牌子，上面提供 VIP 服务，类似于那种包车，当时我还纳闷谁要这种服务，后来才知道我还是太天真了，路确实挺难走的，有钱真好&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/15a08846ac204e69a621f3c828d8b6a3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;走路去小七孔景区的路上，会经过大七孔景区，可以直接走路进去，但是我们没去&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/24a9b2a0d7835d0d65cb23096753e2ce.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后到达第一个景区，叫啥名字不知道，列车运行图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/57e66c4bd08fc6915c92057e52997889.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;荔波的水是绿色的[^1]&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/dbeafd39c2d3729b3fc9bafa996f808a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;水流不急的地方水非常清澈，但能见度也不能算太高，如青龙伏卧、静谧优雅，真的是动静结合的自然奇观&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/dfaf48f09081f8c94c4215dec5ea265c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/80c7bd7794642698f13afae9166cc002.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/0987f703f917320741cf7818307a1eaa.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/c5d27b1aa7189ceb23dadf4be3a87cb4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/e03d40b6d798e5c03848a140611c5b13.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;鱼儿嬉戏成群，不怕人&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/00a05e714dcfafc0d8a8b81b9851e34f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/b0a1b9281625e3cf551cfd54ae6ecf5f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/90f4991efd5aab4c47ef44af8dfcf227.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;湍急的水流从密林中奔腾而出，白浪翻涌、咆哮而下，像是白龙腾跃山间，非常有视觉张力&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/f9b8092a8a59507b331fac10c1c54acd.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/283e3c15912023150bc90ca3a9b96d81.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/b82a5ab3eed14030c783ec9540e3f5ab.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/4f77f1bbd824f9b4bbcccb7a8934990f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/195981cd2409cf59393c030cf5d16b8d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/6b988271ae121a71e9006342cee7e079.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/5f92267deec0f8d7e982f8c2c39a9e0d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;山间有许多玉米&lt;/p&gt;
&lt;p&gt;虽然累，但是不虚此行&lt;/p&gt;
&lt;p&gt;[^1]: 为什么是绿色的，解答来自 GPT 老师：小七孔地处喀斯特地貌区，水中富含碳酸钙、碳酸镁等矿物质。当阳光照射时，这些矿物质会反射或散射光线，特别是绿光，从而让水呈现出翡翠般的绿色；水本身非常清澈，几乎没有悬浮杂质，因此河床的颜色（岩石、植物、水藻等）会透过水体折射出来，进一步增强绿色视觉效果；小七孔的河水有些地方较浅，有些地方较深，在阳光照射下形成不同层次的绿色；河流两岸密布原始森林，树木的绿色也会倒映在水面上，与水色相互融合，使颜色更为饱满&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.DOEHea6b.webp"/><enclosure url="/_astro/hero.DOEHea6b.webp"/></item><item><title>随记 - 拿到业余无线电A证</title><link>https://www.juniortree.com/blog/get-amateur-radio-license</link><guid isPermaLink="true">https://www.juniortree.com/blog/get-amateur-radio-license</guid><description>记录业余无线电A证考证历程，分享报名、备考和拿证经验</description><pubDate>Wed, 16 Jul 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;缘由&lt;/h2&gt;
&lt;p&gt;写这篇博客，是为了记录自己考证的想法+实践的过程，给一些有相同想法，但不知道如何付诸实践朋友一些建议和帮助&lt;/p&gt;
&lt;p&gt;在我还在读高中的时候，就想考业余无线电，当时是看了一本叫做《业余无线电通信》[^1]的书，当时觉得这种东西很酷，然后就想学，想考证，那时候是 22 年&lt;/p&gt;
&lt;p&gt;在高三毕业那个暑假，有一位认识的朋友去长沙考了，然后我就跑去问他，他给了我一些建议，但是我家到长沙还是有一段距离的，刚高考完的我也没有那么多~~自由~~（主要是没钱加父母不放心），就一直没有去考&lt;/p&gt;
&lt;p&gt;后来去北京读书了，发现可以在北京考，也报了好几次名，因为各种原因没有报成功，比如说刚开始那个官网很烂，一直进不去；后来又是个人资料一直审核不过，卡了好几次；又因为忘记报名时间，结果人满了&lt;/p&gt;
&lt;p&gt;但最终还是报名成功了，并且成功拿到了执照和呼号&lt;/p&gt;
&lt;h2&gt;经过&lt;/h2&gt;
&lt;h3&gt;报名&lt;/h3&gt;
&lt;p&gt;北京业余无线电报名很好的一点就是全部都在线上，非常方便，而且每个月都会开放一次考试的机会，你可以用搜索引擎搜索“北京业余无线电”[^2]，北京业余无线电的网址是http://www.bjwxdxh.org.cn&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/7025d77a903f92facee6e3802687c063.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;一种更好的办法是关注微信公众号“北京业余无线电服务中心”，然后点下面的“服务中心”，之后按照要求进行注册&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/77272df365cc4dd654a145e26ffda0bc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/cd5af43cb4f6f7c1c30e5dc61d088738.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;电脑端的朋友也可以从官网进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/ca7799dc5c10a359a9574ff8aff850e9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://xt.bjwxdxh.org.cn/static/member/#/static/member/user/login&quot;&gt;login - 北京无线电协会业余无线电服务平台&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/91b85cc124c0fbf0b714c146bced56bc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后进行注册，注册完成之后来到主页，点击“A 类认证”，完善你的个人信息，提交后台审核，一般来说，1 个工作日之内就会审核完成，如果审核不通过的话不会通知你，你需要自己重新打开这个服务平台，然后查看是否审核成功&lt;/p&gt;
&lt;p&gt;最后一步他会问你要不要买协会的会员，我反正没买，这个不影响考试&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/81584dd7dd941a2785fad34a52a6ee0f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;审核成功后是这样子的，下一步就可以准备报名了，请务必关注公众号，因为有关考试预约的信息都会发布在公众号上&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/6ac8adc59a23f7958764b348f88c68bb.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;公众号会提前放出通知，点进去里面有预约时间，还有考试时间啥的，请务必仔细阅读&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/f4275a5be0891928ad98445667a66e40.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;到了预约时间，请提前进入系统抢名额，因为名额有限，我有次就没抢到，报名完成就可以准备考试了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/14ee53f7990810896c867362ad5f6a27.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;考试准备&lt;/h3&gt;
&lt;p&gt;考试恰好遇上期末考试，准备的过程很奇妙，基本上高强度刷了三天题目，A 类考试是从题库的 380 道题目中抽取 30 道题，备考时因为看不进去书[^1]，所以我找了个 B 站教程看：&lt;a href=&quot;https://www.bilibili.com/video/BV113411u7fT/&quot;&gt;四节课通过业余无线电操作证A类考试-01_哔哩哔哩_bilibili&lt;/a&gt;，里面的许多应试小技巧讲的很有意思，清晰易懂&lt;/p&gt;
&lt;p&gt;刷题也有对应的微信小程序：&lt;strong&gt;HAM 模拟&lt;/strong&gt;考试，基本上多刷几遍就能过，题库都是一样的&lt;/p&gt;
&lt;p&gt;原本有一个 &lt;a href=&quot;https://forum.hamcq.cn&quot;&gt;HAMCQ 社区&lt;/a&gt;，但是不知道为什么这几天突然不能访问了，后续应该会恢复&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/b05a4c6452cb0db8c3fed8cb8a536340.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;考试&lt;/h3&gt;
&lt;p&gt;因为早上起不来，所以我预约的是下午的考试，北京的考试在丰台那边，从良乡赶过去还不算太远&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/373e9a2141d281d4948bc4a8b14bfc49.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/834bf739b372e8fd2e0e9a36d6aafd48.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;考试题目很简单，卷子每个人都是不一样的，北京这边是人工阅卷，所以也别想着能看旁边同学的卷子，题目都不一样看也没啥用&lt;/p&gt;
&lt;p&gt;熟练的话，五分钟大概就能做完&lt;/p&gt;
&lt;h3&gt;拿证&amp;#x26;验机&lt;/h3&gt;
&lt;p&gt;周六考完的，下周三的时候就出成绩了，也是在公众号上发布，不会给你有任何其他的推送或者提醒，请务必关注公众号！&lt;/p&gt;
&lt;p&gt;考试通过了话，就可以准备去验机了，验机就是你在网上买一些符合业余无线电标准的机器，或者自己组装的去协会也行，然后把机器给他看一看，机器背后会有一个出厂编号，买之前最好问清楚，看看能不能验机，我买的宝峰的这个就能直接验机&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/07/289ab1b4dcc29b150a6adaeec26cd9f7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;后续如果要新增设台的话，也可以直接在协会官网或者是北京政务网站上申请，还挺方便的&lt;/p&gt;
&lt;p&gt;到了协会之后，他会让你签两份文件，记得带身份证，之后就公众号等通知就行（嗯，还是不会额外给你发通知，但是不知道需要啥你可以随时给他们打电话），你可以选择线下去协会拿，也可以让他们给你发顺丰到付&lt;/p&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;除掉坐地铁和顺丰邮寄执照的钱，考试和拿证都是不要钱的，很可惜的是暑假回家忘记带电台回来的，后续可能买个 SDR 接收棒，玩一玩天图&lt;/p&gt;
&lt;p&gt;[^1]: &lt;a href=&quot;https://book.douban.com/subject/35408737/&quot;&gt;业余无线电通信 第五版 (豆瓣)&lt;/a&gt;
[^2]:搜索引擎并不完全可靠，我推荐你关注他们的微信公众号&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>25年中旬：追问与选择的勇气</title><link>https://www.juniortree.com/blog/the-courage-to-question-and-choose</link><guid isPermaLink="true">https://www.juniortree.com/blog/the-courage-to-question-and-choose</guid><description>在追问与选择中寻找自我，直面信息差与家庭期待</description><pubDate>Sat, 21 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;追问与选择的勇气&lt;/h2&gt;
&lt;p&gt;最近看了拿诺贝尔奖的 Hinton&lt;/p&gt;
&lt;p&gt;他最初觉得数学太抽象，这是很多年轻人常有的感受，但其实，像 Hinton 这样对“意识和大脑本质”充满兴趣的人，在抽象的数学面前会觉得：这解答不了“我是谁”“意识是如何产生”的问题&lt;/p&gt;
&lt;p&gt;于是他尝试去学生理学，去看脑的结构，希望从具体中找答案，但他后来意识到：生理学虽然精密，却无法解释感知、意识、思维这些主观体验的来源&lt;/p&gt;
&lt;p&gt;他主动离开学术体系，沉入一个具体、手工、与世界打交道的技能里，在木工中获得沉淀和安静&lt;/p&gt;
&lt;p&gt;后来他想了想又去读研，他回到心理学，是想理解“认知是怎么产生的”，而那时候人工智能还在早期，他想要借助心理学构建一种“可以模拟思维过程”的理论&lt;/p&gt;
&lt;p&gt;心理学给了他方向，但不够“量化”——于是他开始引入数学工具，比如神经网络和误差反向传播，这也正是他后来的诺奖工作基础&lt;/p&gt;
&lt;p&gt;他认为人工智能能帮助他去解开心中的一些疑问，去回答人类大脑到底是如何运作的&lt;/p&gt;
&lt;p&gt;其实看了他的采访，我更多的问题是，作为普通人的我们，其实很难有像他这样试错的机会，能一步一步慢慢去追求自己心中的疑问，更多的时候，我们都是为了饱腹，或多或少去整一些“自己明明不感兴趣”，但又不得不做的事情&lt;/p&gt;
&lt;p&gt;就拿本科毕业不读了去当木匠这件事来说，生活的压力、家庭的期待不会允许&lt;/p&gt;
&lt;p&gt;我母亲很喜欢和我说这样的话，她认为一个人的成功，是经历几代人的努力的，一个人的成功，是一个家族奋斗的结果，而一个人的眼界或做出的选择，也都是和家庭息息相关的&lt;/p&gt;
&lt;p&gt;我母亲说的那句话，其实也透露出一种深层的历史经验：中国乃至很多家庭，是在“从底层向上攀爬”的过程中存活下来的。父母辈经历过的动荡和匮乏，使他们倾向于用“稳妥、务实”的方式思考人生选择——不要冒险，不要走太偏的路，先把饭碗端稳再说&lt;/p&gt;
&lt;p&gt;我依然记得在我高考结束，填报志愿结束前的那个下午，我父亲对我说：“那你把首师大那个志愿给加上吧”，或许如果我但是没有听他的话，我或许现在正躺在湖师大生物系的学生宿舍里面睡觉&lt;/p&gt;
&lt;p&gt;我时常对之前做过的事情感到后悔，对未来感到不确定——但又害怕太确定，我母亲其实问过我愿不愿意去报湖师大的免费师范生，我依然可以选择成为一名生物老师，我拒绝了，我害怕太过于清晰的未来，这让我一眼看到头——毕业、工作、结婚、生子&lt;/p&gt;
&lt;p&gt;但如今再仔细想想，我并不后悔来到首师大的这个决定，我在物理系获得了较为完整的数学教育，我确实觉得光电信息这个专业不太适合我，我也难得地获取了转专业的机会，获得了新的人生体验&lt;/p&gt;
&lt;p&gt;当然，我也结识了很多新朋友，肖、刘、魏、我的三位舍友、汤学长，之后又认识了吉吉，我们一见如故，聊得非常开心，他带我做开发，我学到了非常非常多的东西，也获得了新的体会&lt;/p&gt;
&lt;p&gt;我走的这条路，也许并不是很多人眼中的 Best Choice，但对于我来说，每一次的选择都是一次成长的经历，都是在向我的“Hinton 时刻”靠近&lt;/p&gt;
&lt;p&gt;我一直在思考什么是正确的事情，但现在社会变化得太快了，19 年的一场疫情打乱了所有的计划，AI 的迅速发展给很多人带来了危机感，时不时在局部爆发的小型战争，在这种变化下，老经验不再适用，但我们又不能什么都不信，我们只能多经历、多尝试、多观察、多交流、相信直觉&lt;/p&gt;
&lt;p&gt;这不是过去那种“别人试过我就照做”的经验主义，而是“我愿意用自己的眼睛去看、用自己的手去碰、用自己的心去感受”之后所建立起的知识、判断和信念，相信直觉其实也是一种极高阶的经验沉淀：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;直觉是无数次微小选择和观察后，在潜意识里自动形成的判断力。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;所以继续试错吧，继续体验吧，继续沉淀吧，继续相信那个不断问自己“这是不是我真正想做的”的声音吧&lt;/p&gt;
&lt;p&gt;并不是所有人都能清楚什么是“正确的事”，或者“正确”这个东西本来就不存在，但我至少没有让别人来替我定义“什么是对的”，这便是我目前最珍贵的资产&lt;/p&gt;
&lt;h2&gt;高考后记&lt;/h2&gt;
&lt;h3&gt;信息差是真实且残酷的&lt;/h3&gt;
&lt;p&gt;在我 23 年高考那年，我以湖南省专业组第一名的身份进入物理系光电信息专业学习，与我并列第一的一个男孩子去了教育技术，在来大学之前，他和他的家里人一直认为，教育技术是类似计算机科学的专业，但其实拂去甚远&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;信息差是真实且残酷的&lt;/strong&gt;，一个决定未来几年，甚至一生方向的决定，往往是在信息最不对称的时候做出的&lt;/p&gt;
&lt;p&gt;很多人不知道专业到底学什么，毕业后能干嘛，城市发展如何，政策怎么变。知道的人——家里有人脉、有资源、有经验；不知道的人——只能靠百度，靠论坛，靠道听途说&lt;/p&gt;
&lt;p&gt;很多人不是“选错了”，而是“被迫选择”&lt;/p&gt;
&lt;h2&gt;Family&lt;/h2&gt;
&lt;p&gt;另外一个男孩子和我是老乡，我们是一个市的，他告诉我说，他所有的志愿报的都是北京，他父母是北漂，在北京发了点小财，但始终无法解决户口的问题，希望他能来北京读书，在北京就业，解决一家人的户口问题&lt;/p&gt;
&lt;p&gt;在我看来，他去北京是为了完成一个“代际工程”，是为了全家落地，这是他这一代为家族所承担的责任，他不是一个人往前冲，而是一个家庭整体往上“押注”&lt;/p&gt;
&lt;p&gt;一个人的选择，一个人的成就往往是和家庭相关的&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.Do1lUuhB.webp"/><enclosure url="/_astro/hero.Do1lUuhB.webp"/></item><item><title>Alist供应链攻击的发现</title><link>https://www.juniortree.com/blog/alist</link><guid isPermaLink="true">https://www.juniortree.com/blog/alist</guid><description>Alist文档被投毒，供应链攻击隐患曝光</description><pubDate>Wed, 11 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;发现&lt;/h2&gt;
&lt;p&gt;在今天晚上的时候，看到 NS 上发了这样的一个帖子，原帖子在这里：&lt;a href=&quot;https://www.nodeseek.com/post-360819-1&quot;&gt;刚看到alist文档被投毒了&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/2a82b0aa3af5c9caa20e79d6c2d2ec4c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;大概就是被发现了文件的分发链接变了，按道理来说，这种开源软件的二进制文件不应该由不信任的第三方进行二次分发，因为这样不安全，有可能存在篡改的风险&lt;/p&gt;
&lt;p&gt;然后我就去看了下文档的 commit 记录：&lt;a href=&quot;https://github.com/AlistGo/docs/commits/main/&quot;&gt;Commits · AlistGo/docs · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以看到都是这样无实际意义的提交记录，而且大多都是 &lt;a href=&quot;https://github.com/alist666&quot;&gt;alist666 · GitHub&lt;/a&gt; 和 &lt;a href=&quot;https://github.com/JoaHuang&quot;&gt;JoaHuang · GitHub&lt;/a&gt; 这两位的 commit&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/0c8fcb6f451af7e5d4a5ad4fe8e7e649.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;而且很奇怪的是，这两位的创建时间都非常早，基本上都只有几个月，而且仓库中没有别的任何 repo&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/cea4b8ef230447066a217803a6dd9454.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/b4919b489c23adeefe24b046a8ae7962.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;而且他们在 repo 的提交也非常大胆，直接在 commit 上注明了是广告，提交也不是通过 pr，是直接 commit，应该是有人给了他们直接的权限&lt;/p&gt;
&lt;p&gt;其中的有几条 commit 记录很耐人寻味&lt;/p&gt;
&lt;h2&gt;分发文件的修改&lt;/h2&gt;
&lt;h3&gt;对 docker 镜像的修改&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AlistGo/docs/commit/0685402ba0334041706abf2b96173c1f9f748b12&quot;&gt;fix: 修改 docker路径 · AlistGo/docs@0685402 · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/32b68f2788b8db630743e2ee973e06ab.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里将原作者 &lt;code&gt;xhofe&lt;/code&gt; 的 docker hub 仓库切换成了 &lt;code&gt;alist666&lt;/code&gt; 的，我们不妨直接去看看这两个仓库的镜像有何区别&lt;/p&gt;
&lt;p&gt;首先是原作者的：&lt;a href=&quot;https://hub.docker.com/r/xhofe/alist/&quot;&gt;xhofe/alist - Docker Image | Docker Hub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之后是 Alist666 的：&lt;a href=&quot;https://hub.docker.com/r/alist666/alist/&quot;&gt;hub.docker.com/r/alist666/alist/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;篡改者的仓库中只有一个镜像，而且还是 arm 的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/3b96527de4e30f85a7350e7aac0bec86.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我尝试将它下载到本地，它的 Layer 和原作者的镜像是一样的，还没来得及做进一步的逆向分析&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/e191ac125a4b98e97cd594f619824b2c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;甚至在两周前，就有人提出过这样的问题，但是没有得到开发者的解决：&lt;a href=&quot;https://github.com/AlistGo/docs/discussions/438&quot;&gt;中文文档Docker镜像存在问题 · AlistGo/docs · Discussion #438 · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/9d596227348510eb83b9cdf0d619e90f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;Desktop 版本的分发替换&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AlistGo/docs/commit/ae7a77dd64e46b071e6abfc8618463b96853b3fc&quot;&gt;Update Desktop download Url · AlistGo/docs@ae7a77d · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;目前这个 oss 已经被删掉了，我也没办法通过校验 sha 来判断是否被修改，不过依然存在这种可能性，而且可能性很大&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/5617432b6fb289c9b9831ddc0b54a0df.webp&quot; alt=&quot;image.png&quot;&gt;&lt;/p&gt;
&lt;h3&gt;广告图链的域名发现&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/AlistGo/docs/commit/27679c85b2a5e116f01174ac7375caec1d287acb&quot;&gt;Update Image · AlistGo/docs@27679c8 · GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/1422414c1f18a0dde17634383b2f2b22.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;使用的是 &lt;code&gt;hutool.cn&lt;/code&gt; 这个域名，打开后台是一个 minio 的界面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/d8f09e84d6094d5daca5aaeef3e17fb4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;hutool&lt;/code&gt; 这个写 Java 的应该不陌生&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/779a2217269eaeba4916436a5d60c010.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;尝试将域名托管到 Cloudflare 可以看到其他的记录&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/cfcbda1c58c4267ce9965fceed693cae.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;解析到的 IP 都是国内的腾讯云，并且使用 whois 查询，也可以看到这个域名的所属是个人，出于隐私保护的原因，这里不贴出来了&lt;/p&gt;
&lt;h2&gt;总结与反思&lt;/h2&gt;
&lt;p&gt;感动啊，居然还做了中英文的不同适配&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/6421056d9119f5d40db08dc0ad4a8063.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/89335275764b6767f039040ab275f3d1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;目前作者处在跑路状态，开发者集体静音，没有任何响应&lt;/p&gt;
&lt;p&gt;值得思考的是，JoaHuang 和 alist666 对开源仓库的破坏，在很早就进行了，为什么直到现在才被发现？甚至于 docker 和 desktop 的修改，社区的响应也非常缓慢&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/d2ddbb74422f28f82ae217b52eea4d6f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Typecho 双机灾备与故障转移</title><link>https://www.juniortree.com/blog/typecho-dual-machine-disaster-recovery-and-failover</link><guid isPermaLink="true">https://www.juniortree.com/blog/typecho-dual-machine-disaster-recovery-and-failover</guid><description>Typecho双机灾备方案：文件同步+数据库主从+自动DNS切换</description><pubDate>Sat, 07 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Typecho 是传统的基于 php 的博客系统，该系统主要由两部分组成，一部分是站点文件，另外一部分是数据库&lt;/p&gt;
&lt;p&gt;要实现 Typecho 的双机灾备与故障转移，我们需要确保站点文件和数据库的同步与高可用切换能力&lt;/p&gt;
&lt;h2&gt;架构目标&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;两台服务器：主机（A）+ 备机（B）&lt;/li&gt;
&lt;li&gt;主机故障时，备机能够自动/手动接管服务&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;要求具备以下能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Typecho 站点文件的一致性&lt;/li&gt;
&lt;li&gt;数据库数据的同步&lt;/li&gt;
&lt;li&gt;域名或负载均衡的快速切换&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;站点文件的同步策略&lt;/h2&gt;
&lt;p&gt;使用 &lt;code&gt;inotifywait&lt;/code&gt; 搭配 &lt;code&gt;rsync&lt;/code&gt;，首先在主机（A）上执行：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt update
apt install inotify-tools -y
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后编写一个同步脚本：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sh&quot;&gt;#!/bin/bash

WATCH_DIR=&quot;/var/www/typecho&quot;
REMOTE=&quot;&amp;#x3C;备机（B）&gt;:/var/www/typecho&quot;

inotifywait -mrq -e modify,create,delete,move &quot;$WATCH_DIR&quot; | while read path action file; do
    echo &quot;Detected change: $action $file&quot;
    rsync -az --delete &quot;$WATCH_DIR&quot;/ $REMOTE
done
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其中的 &lt;code&gt;&amp;#x3C;备机（B）&gt;&lt;/code&gt; 要替换成对于的 IP，并且在主机（A）上配置好密钥验证或者证书验证，确保其能正常通过 &lt;code&gt;rsync&lt;/code&gt; 进行连接&lt;/p&gt;
&lt;p&gt;之后文件会存入到备机（B）的对应 &lt;code&gt;/var/www/typecho&lt;/code&gt; 目录中&lt;/p&gt;
&lt;h2&gt;数据库同步策略&lt;/h2&gt;
&lt;p&gt;可以参考我写的这篇文章：&lt;/p&gt;
&lt;p&gt;[post cid=&quot;115&quot; /]&lt;/p&gt;
&lt;p&gt;需要注意的是，表同步过去了之后，在备站（B）上的数据库上，也要为 Typecho 配置对应的权限&lt;/p&gt;
&lt;p&gt;什么意思呢，你可以打开 Typecho 的配置文件，一般来说在路径 &lt;code&gt;/var/www/typecho&lt;/code&gt; 下，文件名叫做 &lt;code&gt;config.inc.php&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;里面有关于数据库连接的一些配置&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/087d5e8fbe7cb8b07dc43d9383649e2f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;比如我这里的 Typecho 博客，就是以 &lt;code&gt;typecho&lt;/code&gt; 这个用户去连接数据库的，我们在备站（B）的数据库中也要配置一个 &lt;code&gt;typecho&lt;/code&gt; 用户，并且密码也要和配置文件里面一样，同时赋予其读 &lt;code&gt;typecho*&lt;/code&gt; 表的权限&lt;/p&gt;
&lt;p&gt;首先以 &lt;code&gt;root&lt;/code&gt; 身份连接到数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo mysql -u root
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;创建 &lt;code&gt;typecho&lt;/code&gt; 用户，这里假设你上面查到的 Typecho 表为 &lt;code&gt;typecho&lt;/code&gt;，密码设置为上面配置文件的密码：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-sql&quot;&gt;CREATE USER &apos;typecho&apos;@&apos;localhost&apos; IDENTIFIED BY &apos;your_password&apos;;
GRANT ALL PRIVILEGES ON typecho.* TO &apos;typecho&apos;@&apos;localhost&apos;;
FLUSH PRIVILEGES;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后重新使用 &lt;code&gt;typecho&lt;/code&gt; 用户登录，看看能否看到表：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/efe8cc6fa728971925719f56caa9449c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;配置 Web 服务&lt;/h2&gt;
&lt;p&gt;不出意外的话，现在你现在在备站（B）配置好 Web 服务，然后在云服务商将 DNS 改到备站（B）的 IP，就可以正常访问了&lt;/p&gt;
&lt;p&gt;这个站点除了不能评论和写新文章，和主站（A）完全一样&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;蛤？你问我为什么只能读不能写？因为数据库是主从设计，备站（B）的数据库只能从主站（A）单向同步，本身不能推送数据到主站（A）的数据库&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;还有一个就是证书的问题，一般情况下，站点域名都是解析到主站的 IP 上，备用站没办法正常获取到证书（HTTP-01），只能通过 DNS-01 的方法获取证书&lt;/p&gt;
&lt;p&gt;我比较喜欢用 Caddy，这里需要自己编译一个新的 Caddy，可以看我写的这篇文章：&lt;/p&gt;
&lt;p&gt;[post cid=&quot;117&quot; /]&lt;/p&gt;
&lt;p&gt;因为我的域名是托管在阿里云的，可以使用他们的 DNS 进行证书验证签发，你需要在 RAM 中去创建 AccessKey，得到一对：&lt;code&gt;AccessKey ID&lt;/code&gt; 和 &lt;code&gt;AccessKey Secret&lt;/code&gt;，并且为其最少配置对 DNS 的完全管理权&lt;/p&gt;
&lt;p&gt;最好不要把 &lt;code&gt;AccessKey ID&lt;/code&gt; 和 &lt;code&gt;AccessKey Secret&lt;/code&gt; 这种比较敏感的东西直接写到 &lt;code&gt;Caddyfile&lt;/code&gt; 中，比较推荐的方法是把变量写进 systemd 的 EnvironmentFile&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;/etc/caddy/&lt;/code&gt; 目录下新建一个专门存放环境变量的文件，比如 &lt;code&gt;/etc/caddy/aliyun. Env&lt;/code&gt;：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nano /etc/caddy/aliyun.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;写入：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;ALIYUN_ACCESS_KEY_ID=你的AccessKeyID
ALIYUN_ACCESS_KEY_SECRET=你的AccessKeySecret
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;保存后设置权限：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chmod 600 /etc/caddy/aliyun.env
sudo chown root:root /etc/caddy/aliyun.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 Caddy 的 systemd 单元文件 &lt;code&gt;/etc/systemd/system/caddy.service&lt;/code&gt;（或 &lt;code&gt;/lib/systemd/system/caddy.service&lt;/code&gt;，取决你之前放在哪儿）。在 &lt;code&gt;[Service]&lt;/code&gt; 段里，加上一行：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;EnvironmentFile=/etc/caddy/aliyun.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最终的（核心片段）大致长这样：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[Service]
User=caddy
Group=caddy
EnvironmentFile=/etc/caddy/aliyun.env
ExecStart=/usr/local/bin/caddy run --config /etc/caddy/Caddyfile --adapter caddyfile
ExecReload=/usr/local/bin/caddy reload --config /etc/caddy/Caddyfile --adapter caddyfile
Restart=on-failure
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重载，并且重启一下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl daemon-reload
sudo systemctl restart caddy
sudo journalctl -u caddy -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时 Caddy 启动日志不再弹出 “AccessKeyID is empty” 的错误，应能看到 &lt;code&gt;solving challenges&lt;/code&gt;、&lt;code&gt;certificate obtained successfully&lt;/code&gt; 等正常输出&lt;/p&gt;
&lt;p&gt;在两台服务器上都可以进行一样的配置&lt;/p&gt;
&lt;h2&gt;切流量&lt;/h2&gt;
&lt;p&gt;切的前提是健康检查失败，Typecho 这个博客系统本身不带有健康检查，得自己重新写一个 php 页面，可以从这个 gist 里面取： &lt;a href=&quot;https://gist.juniortree.com/liueic/f21967c23f864c2f9aae5bc773d1c1e5&quot;&gt;Typecho健康检查&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;之后放到网站根目录（&lt;code&gt;/var/www/typecho&lt;/code&gt;）中，即可：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/61c4fe9bfb2c1c114114618c7aa15057.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后就可以开始设计切流量的脚本了，阿里云给的 Python SDK 还是比较丰富和好用的，为此，我写了一个很好用的脚本，并且可以使用 Docker 进行部署：&lt;a href=&quot;https://github.com/liueic/typecho_dnstypecho&quot;&gt;GitHub - liueic/typecho_dnstypecho&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/0bfc6c6e2fe8b574772303af7a6c4ee2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/f2dbe6fa42031d0deb40ca6fa54b09c8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/f4cd3ab7651c9618e0c3ecaf0d334784.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;检验效果&lt;/h2&gt;
&lt;p&gt;可以在主站直接停掉 MariaDB，这样话 Health Check 就通不过，就可以伪造出站点垮了的效果&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl stop mariadb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试完了不要忘记重新启动数据库：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl start mariadb
&lt;/code&gt;&lt;/pre&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>Caddy自编译</title><link>https://www.juniortree.com/blog/caddy-self-compilation</link><guid isPermaLink="true">https://www.juniortree.com/blog/caddy-self-compilation</guid><description>Caddy自编译指南：配置Golang环境，安装xcaddy，替换原版Caddy并检查插件</description><pubDate>Fri, 06 Jun 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;配置 Golang 环境&lt;/h2&gt;
&lt;p&gt;需要先配置 Golang 环境：&lt;a href=&quot;https://go.dev/doc/install&quot;&gt;Download and install - The Go Programming Language&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://go.dev/dl/go1.24.4.linux-amd64.tar.gz
rm -rf /usr/local/go &amp;#x26;&amp;#x26; tar -C /usr/local -xzf go1.24.4.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后检查一下是否安装成功：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;go version
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;安装 xcaddy&lt;/h2&gt;
&lt;p&gt;如果你是在国内环境下编译的话，需要配置镜像，在这里我使用阿里云的：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;export GOPROXY=https://mirrors.aliyun.com/goproxy/
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;go install github.com/caddyserver/xcaddy/cmd/xcaddy@latest
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;安装完成之后需要查找 xcaddy 的安装位置，一般来说 go 会将其安装到 &lt;code&gt;$HOME/go/bin&lt;/code&gt; 目录下，你可以检查：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/ba939db2e1ccc00c456ea5016b8d74c3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;使用临时路径运行 xcaddy：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;$HOME/go/bin/xcaddy build --with github.com/caddy-dns/alidns
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里的 &lt;code&gt;--with&lt;/code&gt; 后面就需要你找可以编译的 Caddy 插件，我这里编译一个支持阿里云 DNS-01 的 DNS 解析的插件&lt;/p&gt;
&lt;p&gt;编译完成之后会自己检查对应的版本&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/416a4b2c0ad513b157d7f1f7c6874d2e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;替换原版 Caddy&lt;/h2&gt;
&lt;p&gt;先停掉原本原版的 Caddy：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl stop caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后，建议让 Caddy 服务不自动重启／不再开机启动（避免替换过程中被意外重启）：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl disable caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;寻找原本 Caddy 的二进制位置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;which caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一般来说会在 &lt;code&gt;/usr/bin/caddy&lt;/code&gt; 位置下&lt;/p&gt;
&lt;p&gt;假设查到官方二进制在 &lt;code&gt;/usr/bin/caddy&lt;/code&gt;，那就进行备份：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;mv /usr/bin/caddy /usr/bin/caddy.backup-official
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后将新编译的二进制文件移动到原来的位置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp ./caddy /usr/bin/caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最好重新设置一下权限，避免出现问题：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo chown root:root /usr/bin/caddy
sudo chmod 755 /usr/bin/caddy
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后检查一下是否更新成功：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;caddy version
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;还可以检查一下插件列表，看看是不是有你编译的插件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;caddy list-modules
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/06/a0ca396fe20bb7ad65723ea4f0aa4c52.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;是否需要修改 systemd Service 文件&lt;/h2&gt;
&lt;p&gt;一般来说，如果你是直接替换官方的二进制文件，那其实没有必要修改文件，直接用原来的就可以了，但是你要是自己整了活，那就只能自己重新写了&lt;/p&gt;
&lt;p&gt;但是我比较菜，这里就不写参考的配置文件了&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - Ave Mujica × animate cafe</title><link>https://www.juniortree.com/blog/ave-mujicaanimate-cafe</link><guid isPermaLink="true">https://www.juniortree.com/blog/ave-mujicaanimate-cafe</guid><description>和梨梨花打卡母鸡卡联动咖啡店，饮品一般但周边真香</description><pubDate>Thu, 29 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;母鸡卡和 Animate Cafe 俩人在北京搞了个联动，最近刚好在看番（虽然说母鸡卡这个番我很难评，哎，大祥老师你在干什么），然后就和梨梨花两个人一起去了&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/f8cdace50e9d755a26fc200ab581f112.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;前&lt;/h2&gt;
&lt;p&gt;去这个咖啡店还得在 B 站上预约，买票，还得按时间段到场，比如说我买的票是 14:00 - 14:50 之间的，我就只能在这个时间段进去，然后 14:50 必须出来&lt;/p&gt;
&lt;p&gt;票收费 30，可以抵扣店里面的消费，我和梨梨花两个人买了一人买了一杯喝的，花费 38，然后减去前面的 30 块，额外还要付 8 块，消费有点高，而且其实这个做的确实不咋好喝，梨梨花买的是灯的，我买的是大祥老师的，喝起来像气泡水一样，没有啥茉莉花的味道&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/06/b5983a5cf2c02f9385ed3d8633a88648.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;中&lt;/h2&gt;
&lt;p&gt;不宜多说，上图！（下面大图，加载极慢）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/8e8e4dca344358e32031e6d961f68376.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/219be3638309c62b8fdb00c43dfb390f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/db8a7fa82a5c264c90d989df353d97ea.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/7cd824c2966bf3556d099ff11a1cf818.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/2d17edb24eca9e833b89492bf14fe4fe.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/d3324f8952f651b0dc02e49605098560.webp&quot; alt=&quot;圣爱音&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/80aafc1c11baf4d26ec7ef6ea2ecd404.webp&quot; alt=&quot;大祥老师&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/7ff322de62b202f034238d669fc79218.webp&quot; alt=&quot;为什么要演奏春日影！&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/847e8ba0d2b24b0b97153db1c0b78967.webp&quot; alt=&quot;小灯，主唱太拼命了&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/c23768d6a513ae1633a54bc160232417.webp&quot; alt=&quot;温柔和蔼的鼓手&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/1752c167d5dabe31e7b21a83f302b6ab.webp&quot; alt=&quot;听话守时的小猫&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/82aa45fe7bbf3777361b36637ea20718.webp&quot; alt=&quot;睦头人&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/95d56b56c78b83e187ffac0058f4b49c.webp&quot; alt=&quot;大金毛，初华大人！&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/b8c0cf72296eacc32691efded4e3452a.webp&quot; alt=&quot;乐队特种兵&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/ad0db129d01ab9bf0ccb7d6a20219eea.webp&quot; alt=&quot;早上喵姆喵姆～&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后还整了点小谷&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/39eb9e650d8e02e209ca7850a334dfe3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/273a95f56352372b90a2b80ed795ec8d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;后&lt;/h2&gt;
&lt;p&gt;最后还拍了一点朝阳公园的照片&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/99fc921ad99be84848875e86396e39e9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/f9498d61685855dfbb78065c390b0606.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/ac4a1b3ff3e5a537927badcd4d48b807.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;最后来点名场面：&lt;/p&gt;
&lt;p&gt;装作一副为了别人的样子啊。
想演奏是你们的自由，随你们喜欢。&lt;/p&gt;
&lt;p&gt;直到现在还执迷于过去，真让人看不下去。
差不多，你也该忘记了吧。&lt;/p&gt;
&lt;p&gt;命运……？
那么，那个乐队算什么？&lt;/p&gt;
&lt;p&gt;哪里不是？
言语和行动相互矛盾，
CRYCHIC 已经分崩离析了，
绝对不可能复活。&lt;/p&gt;
&lt;p&gt;是这样一回事吗？&lt;/p&gt;
&lt;p&gt;正因如此，我已经亲手将她结束了。&lt;/p&gt;
&lt;p&gt;谁也没有求你那样做。
这是最后通牒，
从现在开始，不要再和我扯上关系了。&lt;/p&gt;
&lt;p&gt;放开。&lt;/p&gt;
&lt;p&gt;你是抱着多大的觉悟说出这种话的？
区区一介学生，有办法背负他人的人生吗？
“什么都愿意做”就是这么沉重的话，
做不到的事情就不要说出口。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/826fc805f075efa8fd33d39c93b103ed.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/5a267daf9b81b8e36d139a05b19a7055.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.DY_0KZBI.webp"/><enclosure url="/_astro/hero.DY_0KZBI.webp"/></item><item><title>服务器备份 - backrest + rclone + oss</title><link>https://www.juniortree.com/blog/server-backup</link><guid isPermaLink="true">https://www.juniortree.com/blog/server-backup</guid><description>分享服务器备份方案：Backrest+Rclone+OSS，遵循3-2-1原则确保数据安全</description><pubDate>Sun, 18 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;主播虽然使用的基本是都是大厂的服务器，但是有时候因为自己手贱或者别的原因，经常导致服务崩溃，不得不重装系统&lt;/p&gt;
&lt;p&gt;这时候备份就很有必要了，虽然之前尝试过使用基于 Duplicati 的服务器备份，但是这个工具我自己不是很喜欢（因为文件目录的关系），因此这次尝试另外一种方式&lt;/p&gt;
&lt;p&gt;这次备份的架构将严格遵循 3-2-1 原则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;3：存储 3 份完整文件，一份原件加上两份拷贝。&lt;/li&gt;
&lt;li&gt;2：将文件起码保持在两种不同的介质上。&lt;/li&gt;
&lt;li&gt;1：将一份拷贝保存在异地。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;云服务使用 &lt;a href=&quot;https://github.com/garethgeorge/backrest&quot;&gt;GitHub - garethgeorge/backrest: Backrest is a web UI and orchestrator for restic backup.&lt;/a&gt; 生成文件快照，然后使用 rclone 存储到香港地区的 OSS 上，此外再使用 &lt;a href=&quot;https://freefilesync.org/&quot;&gt;FreeFileSync: Open Source File Synchronization &amp;#x26; Backup Software&lt;/a&gt; ，自动将其同步到本地的 Windows 电脑中，手动进行冷备份，那么我们现在就一步一步开始吧！&lt;/p&gt;
&lt;h2&gt;Backrest 的安装与配置&lt;/h2&gt;
&lt;p&gt;Backrest 是 restic 的一个 GUI 版本，如果你对 CLI 情有独钟，也可以直接使用 restic&lt;/p&gt;
&lt;p&gt;建议可以参考一下官方的文档，其中的一些基础概念对使用很有帮助：&lt;a href=&quot;https://garethgeorge.github.io/backrest/introduction/getting-started&quot;&gt;Getting Started · Backrest&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Backrest 可以使用 Docker 进行安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;services:
  backrest:
    image: garethgeorge/backrest:latest
    container_name: backrest
    hostname: backrest
    volumes:
      - ./backrest/data:/data
      - ./backrest/config:/config
      - ./backrest/cache:/cache
      - ./backrest/tmp:/tmp
      - /root/backup_targets:/userdata  # Mount local paths to backup
      - /root/easyImage:/easyImage
      - /root/minio:/minio
      - /root/gitea:/gitea
      - /root/opengist:/opengist
      - ./repos:/repos     # Mount local repos (optional for remote storage)
    environment:
      - BACKREST_DATA=/data
      - BACKREST_CONFIG=/config/config.json
      - XDG_CACHE_HOME=/cache
      - TMPDIR=/tmp
      - TZ=Asia/Shanghai
    ports:
      - &quot;9898:9898&quot;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;你需要把你要备份的目录映射到容器中，笔者尝试使用软链接连接到一个 &lt;code&gt;backup_targets&lt;/code&gt; 文件夹中，但是由于软连接的特性，Backrest 好像只能识别到链接字符，并不能直接连接到内容，无法正常备份，我们只能使用这种比较恶心的方式了（不过如果是使用 restic 的话，默认应该是会跟随软连接的，我没有成功也不知道是为啥）&lt;/p&gt;
&lt;p&gt;之后启动容器，配置好反向代理，刚进去的时候会让你进行设置，你需要设置好 Instance ID，如果在公网中，务必取消勾选 &lt;code&gt;Disable Authentication&lt;/code&gt; ！并且设置好登录的用户名和强密码&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/69b0cedc375e70090bed55960bb7e31c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配置存储库&lt;/h3&gt;
&lt;p&gt;之后点击左边的 &lt;code&gt;Add Repo&lt;/code&gt;，这里是保存备份数据的底层存储位置，也就是备份生成的快照会存在这里，虽然 Backrest 会为你保存好数据，但是当 Backrest 不可用的时候，你也可以直接使用 restic 直接对其进行底层操作&lt;/p&gt;
&lt;p&gt;比较重要的有 &lt;code&gt;Repo Name&lt;/code&gt;，也就是存储库的名字，&lt;code&gt;Repository URI&lt;/code&gt;，也就是存储库的位置，这里的选择比较多，官方提供了好几种，在这里我只使用了前面 compose 挂载的本地，后面会使用 rclone 对本地挂载的同步到 oss 上，如果使用远程的存储方式，可能会比较耗时，国内的 ecs 带宽极小&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/9fbbbc507d35cca0b907d33283409a83.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Password&lt;/code&gt; 也就是存储后快照的加密，如果你要使用的话，请务必保存好密码，一旦丢失将无法恢复&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Prune Policy&lt;/code&gt; 中文名叫“修剪策略”，这个可能在 restic 的文档里面会更清楚一点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/1f3d0c37511136c7ed308cbbad51bacb.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我在这里设置为每个月 1 号执行一次&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Check Policy&lt;/code&gt; 备份完整性检查，这里的 &lt;code&gt;Read Data&lt;/code&gt; 会按照固定的比例来选取需要检查的数据&lt;/p&gt;
&lt;p&gt;我在这里设置比例为 &lt;code&gt;20%&lt;/code&gt;，并且每周检查一次&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/9de85efa4825f7cf1fdcdddad3dc49bc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最下面有一个 &lt;code&gt;Preview&lt;/code&gt;，可以对照我的来参考一下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/d87da076d095d46ad16fdd4b3231f916.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配置备份计划&lt;/h3&gt;
&lt;p&gt;也是点击左边的 &lt;code&gt;Add Plan&lt;/code&gt;，和前面一样输入 &lt;code&gt;Plan Name&lt;/code&gt;，这里的 &lt;code&gt;Repository&lt;/code&gt;，选择前面添加的 &lt;code&gt;Repo&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Paths&lt;/code&gt; 这里就需要添加前面 compose 你挂载的路径了&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Backup Schedule&lt;/code&gt; 就是你需要配置的备份时间，我这里是每天晚上 12 和中午 12 点各备份一次&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/86e997bbccfc67bf8a8ea7d56348407a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这里的 &lt;code&gt;Retention Policy&lt;/code&gt; 是我个人认为极有意思的地方，它提供了三种方式，这里的 &lt;code&gt;None&lt;/code&gt; 就是手动触发，没意思我就不讲&lt;/p&gt;
&lt;p&gt;&lt;code&gt;By Count&lt;/code&gt; 就是按照最新的快照个数进行备份，比如说下面这个就是保存最新的 30 个快照&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/58f16d76b8228cbf419f8e7ed33e140c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;By Time Period&lt;/code&gt; - 基于时间的保留策略，Gemini 的理解是这样的：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/eed55e1d28f518ca416cc5a60cbd8ea6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;传统的基于快照个数来保存可能会存在，比如说这 30 个都没啥变化，但我需要的是前面的时间备份，通过这种策略可以构建出灵活且符合需求的策略，例如保留近期的每日备份以便快速恢复，同时保留更长时间的历史备份以应对更久远的数据恢复需求&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/e09de953a8ef659aeb03c9ba1712e63e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;同样我的 JSON 文件如下，可以供你参考：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/b4b4039066fa5d858fd925cfe32e9763.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后可以手动点一下，看看能不能正常备份：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/755e63c5b3cd21fc82233841dfc5d609.webp&quot; alt=&quot;&quot;&gt;
我这里还会有比较详细的计划&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/b0f603056f34d3487d915e30bb1bafeb.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;服务器的文件夹里面也会有对应的东西：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/5371169fe240a608e9d7ebb2d456f62e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;至此，Backrest 的配置就完成了&lt;/p&gt;
&lt;h2&gt;Rclone 的配置&lt;/h2&gt;
&lt;p&gt;可以使用官方提供的一键脚本来进行安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;curl https://rclone.org/install.sh | sudo bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后来配置 OSS&lt;/p&gt;
&lt;h3&gt;OSS&lt;/h3&gt;
&lt;p&gt;阿里云的 OSS 加入了 Cloudflare 带宽联盟，出了中国大陆和迪拜地区，其他地方都提供了比较牛的额度&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/a7a1841e4afee775c52781c3812c8e68.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;虽然说这个是用来备份的，但是我觉得万一哪一天真得取回数据，这一点成本能省还是得省&lt;/p&gt;
&lt;p&gt;所以我买的是中国香港地区的 OSS 的资源包，40 G，标准 - 本地冗余存储，一年 9.9&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/21c61328699007ccee30d4855af7e76f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;至于这个同城冗余和本地冗余有啥区别，我还专门到问客服，简单来说就是同城冗余的可靠性要比本地冗余高一点，高多少呢？我们可以在文档中心看到：&lt;a href=&quot;https://help.aliyun.com/zh/oss/user-guide/overview-of-storage-redundancy-types/?scm=20140722.H_2376655._.OR_help-T_cn%7Ezh-V_1&quot;&gt;OSS的存储冗余类型_对象存储(OSS)-阿里云帮助中心&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/74f99e43bcb8c9a094e34afbf17b3274.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/59726e5767cbdc3b6e3f72e40e7d9e36.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;差不多就是又多了一个 9，但是对我来说我觉得本地冗余存储的可靠性已经足够高了，同城冗余的价格要贵得多，对我来说并不划算，如果你有需求可以上&lt;/p&gt;
&lt;h3&gt;在 Rclone 上挂载 OSS&lt;/h3&gt;
&lt;p&gt;因为忘记截图了，所以具体细节你可以去百度或者 Google 一下，主要的难度是阿里云的这个权限控制颗粒度比较高，你得先新建一个 RAM 用户，然后再生成 AccessKey ID
和 Key，之后再给这个用户读和写 OSS 的权限&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/e37bf431518040f39ed3a96f9a6b1023.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;用多了 Cloudflare 这种可能不大习惯，但其实还挺方便的&lt;/p&gt;
&lt;p&gt;之后创建一个新的桶，一定要把地域选为你资源包买的地域，而且存储冗余类型也要对应上！不然可能就用不了资源包了，直接扣费，并且确认是私有读，私有写，避免被刷，版本控制我没用过，用之前最好问问客服会不会产生额外费用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/9be88435744231849e2f6271018c546e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后可以在 rclone 中测试一下了：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rclone ls oss:&amp;#x3C;改为你的桶名&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;上传备份文件&lt;/h3&gt;
&lt;p&gt;Rclone 提供了 &lt;code&gt;copy&lt;/code&gt; 和 &lt;code&gt;sync&lt;/code&gt; 两种方法，我只希望 OSS 和本地的完全一样，因为太多的快照可能导致 OSS 过大，产生额外费用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rclone sync &amp;#x3C;改为前面挂载的backrest的repo路径&gt; oss:&amp;#x3C;改为你的桶名&gt; -P
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;不出意外的话应该就可以上传了，这里会自动显示进度和速度&lt;/p&gt;
&lt;p&gt;之后可以写一个定时任务，每天凌晨三点钟自动上传到 OSS 中&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;crontab -e
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后写入，每天凌晨三点自动同步&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;0 3 * * * rclone sync /backrest/repos oss:backrest &gt;&gt; /var/log/rclone-backup.log 2&gt;&amp;#x26;1
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;值得注意的是，使用 rclone 对文件进行上传属于 PUT 请求，每月 500 万次内不要钱，超过部分 0.01 元/万次：&lt;a href=&quot;https://www.aliyun.com/price/detail?scm=20140722.M_10513479._.V_1&amp;#x26;saleProductCode=oss&quot;&gt;定价详情&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/9eb51a8e529629affdcb05873136fbcc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;上传完了记得去看看资源包有没有生效，以免产生别的额外费用，一般会有延时，1-3 个小时&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/e72bb2f9700926d3979e2e4bcee1cd46.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;使用 Rsync 和 FreeFileSync 进行同步&lt;/h2&gt;
&lt;p&gt;我原本想的是直接从国内的 ECS 用 FreeFileSync 拉到本地的电脑上，然后定期存到另外的硬盘做冷备份的，但是国内 ECS 的带宽实在是太小太小了，如果在同步的过程中有用户访问的话会影响体验&lt;/p&gt;
&lt;p&gt;所以我先使用 Rsync 将国内的 ECS 的备份仓库同步到国外的大带宽的 VPS 上，之后再使用 FreeFileSync 自动同步到 Windows 上&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;rsync -avz -e ssh /root/backrest/repos root@xx.xxx.xx.xxr:/home/beijing
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要注意的是 Rsync 的同步是单向的&lt;/p&gt;
&lt;h2&gt;Syncthing 配置（可选）&lt;/h2&gt;
&lt;p&gt;笔者在日本区域还有台服务器，帮朋友托管了一个 Memos，我也希望能能将这个也通过上述方式，存入到可靠的服务中&lt;/p&gt;
&lt;p&gt;这时候就可以使用 Syncthing 来在两台 VPS 中进行同步&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;services:
  syncthing:
    image: syncthing/syncthing
    container_name: syncthing
    hostname: my-syncthing
    environment:
      - PUID=1000
      - PGID=1000
    volumes:
      - ./st-sync:/var/syncthing
      - /root/memos:/memos:ro
    network_mode: host
    restart: unless-stopped
    healthcheck:
      test: curl -fkLsS -m 2 127.0.0.1:8384/rest/noauth/health | grep -o --color=never OK || exit 1
      interval: 1m
      timeout: 10s
      retries: 3
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里对其目录进行挂载，并且设置为只读&lt;/p&gt;
&lt;p&gt;需要放行以下端口：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/a8430b1556ad6a62d54606e6e6b56a56.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;以 &lt;code&gt;PUID=1000&lt;/code&gt; 和 &lt;code&gt;PGID=1000&lt;/code&gt; 运行容器有一个坑，就是容易出现权限不够的情况，这里设置为只读，文件夹类型设置为仅发送，即可正常使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s3.juniortree.com/pic/2025/05/64442a460188e9fd2fb594d52668f51c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;同时需要配置另外一台服务器，然后进行配对即可&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;目前这样就基本满足我的备份要求了，希望我做这些都是多余的，数据永远都不会丢！&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - 《少女乐队的呐喊》北京快闪</title><link>https://www.juniortree.com/blog/girls-brand-cry-beijing</link><guid isPermaLink="true">https://www.juniortree.com/blog/girls-brand-cry-beijing</guid><description>追番迷路看快闪，GBC让我爱上少女乐队的叛逆与热血</description><pubDate>Thu, 15 May 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;周四莫得有课，然后就从良乡坐班车去看快闪，朝阳合生汇这个地方去年夏天的时候我好像也去过，当时是去看线条小狗的，很遗憾的是我在里面又迷路了，然后找了个酸奶店小姐姐问了下才知道怎么走&lt;/p&gt;
&lt;p&gt;[post cid=&quot;81&quot; /]&lt;/p&gt;
&lt;p&gt;GBC 这部番其实是我是看二创才开始了解到了，二创好像是把开头曲魔改了，我觉得挺有意思的就跑去看了，三渲二的这种风格我也很喜欢，油管上官方有个幕后花絮，还挺有意思的 &lt;a href=&quot;https://www.youtube.com/watch?v=lbEHq9uUp6g&quot;&gt;アニメ【ガールズバンドクライ】メイキングムービー&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后来才知道里面很多都是 K 帧 K 出来的（更佩服了，~~甚至有点担心这样极致追求质量会不会导致第二季流产~~&lt;/p&gt;
&lt;p&gt;多说无益，总之是我很喜欢的一部动漫，当然每一首歌都很好听&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/7ed99468854c1274eb1a89d9ded21193.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/749a8dfcb6a0d454cf8b49ad53059a56.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/1283044d3c7578b5da544f7e1a93a311.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/89978b3bdada9e68349561729b34288e.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/644787cdcf1e626c47678b7c7c0ecdf4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/6dcf5bf2747b6c38f460fbc2e104881a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/4d25ee4574614c703979aea35b24ba13.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/e7dd850ce727606a8aa7ae7bb602ee8a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/05/06ea9d57e67c4237947abd847c6c33df.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后买了个 MMK 哈哈哈&lt;/p&gt;
&lt;p&gt;我觉得所谓的少女乐队，其实更是一种理想主义和反叛精神，乐队中的每一个人都对摇滚有着自己的理解和想法，她们为了相同的目的而聚在一起，互相磨合，互相拯救&lt;/p&gt;
&lt;p&gt;我其实对 nina 这个角色感触挺多的，看完 GBC 我也想学电吉他了哈哈哈哈&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.6xbWLLZP.webp"/><enclosure url="/_astro/hero.6xbWLLZP.webp"/></item><item><title>Anubis 帮助你免受AI爬虫攻击</title><link>https://www.juniortree.com/blog/anubis-setup</link><guid isPermaLink="true">https://www.juniortree.com/blog/anubis-setup</guid><description>Anubis通过JS挑战保护网站免受AI爬虫侵扰，适合小型站点部署</description><pubDate>Mon, 28 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近些来，一些 AI 公司为了获取大量的数据用于大模型的训练，疯狂地利用各种爬虫，不顾 robots.txt 或者其他爬虫协议，对站点发起大量请求，对于个人站点来说，这种请求量可能使得网站崩溃&lt;/p&gt;
&lt;p&gt;而且这些公司大量使用各种住宅 IP，修改 user-agent，导致我们根本没有办法从 ASN 和请求头下手对请求进行拦截&lt;/p&gt;
&lt;p&gt;Cloudflare 其实提供了一些解决方案，比如说 AI 迷宫：&lt;a href=&quot;https://developers.cloudflare.com/bots/get-started/bot-management/#block-ai-bots&quot;&gt;Bot Management · Cloudflare bot solutions docs&lt;/a&gt;，但是对于一些没办法使用 Cloudflare 或者不愿意使用 Cloudflare 的场景，我们又该怎么办呢？&lt;/p&gt;
&lt;p&gt;Anubis 为你提供了这样的一种解决方案：&lt;a href=&quot;https://anubis.techaro.lol/docs/&quot;&gt;Docs | Anubis&lt;/a&gt;，帮助保护小型互联网免受人工智能公司无休止的请求风暴的影响&lt;/p&gt;
&lt;h2&gt;设计原理&lt;/h2&gt;
&lt;p&gt;Anubis 通过设置和 Cloudflare 一样的 JavaScript 挑战，来校验访问的客户端是否为浏览器，但客户端请求满足这些条件时，Anubis 将自动发起质询：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;用户代理包含 &lt;code&gt;&quot;Mozilla&quot;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;请求路径不在 &lt;code&gt;/.well-known&lt;/code&gt; 、 &lt;code&gt;/robots.txt&lt;/code&gt; 或 &lt;code&gt;/favicon.ico&lt;/code&gt; 中&lt;/li&gt;
&lt;li&gt;请求路径显然不是 RSS 订阅（以 &lt;code&gt;.rss&lt;/code&gt; 、&lt;code&gt;.xml&lt;/code&gt; 或 &lt;code&gt;.atom&lt;/code&gt; 结尾）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样的设计能够保证诸如 git 或者 RSS 定义客户端不受到影响，而对于一些浏览器或者 AI 爬虫这些高风险客户端则能进行质询&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=RXU4S2V0aWFpNVo0OXhKWGZWbFh5bXRIR3B4a0ZJUjdHUT09&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;通过挑战后，会签发一个 &lt;code&gt;&quot;within.website-x-cmd-anubis-auth&quot;&lt;/code&gt; 的 HTTP Cookie，这样的话就算通过了挑战&lt;/p&gt;
&lt;h2&gt;如何设置&lt;/h2&gt;
&lt;p&gt;Anubis 的运行方式其实是在反向代理和后端服务之间创建一个中间代理，后端服务的流量在经由 Nginx 或者 Caddy 处理之后，到达 Anubis，最后经由 Anubis 再到达后端服务：&lt;a href=&quot;https://anubis.techaro.lol/docs/admin/installation&quot;&gt;Setting up Anubis｜Anubis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=a0NmczJvSWdyUGF6Wndyd0FyRXVVSWE4VVJWTWZYLzNmUT09&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OEM4TGlIc2ZtQ1Y4MFBYSW1ZYzhKYy9tck1OMXJQTkg4QT09&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;Anubis 提供了多种部署方式，在这里我就直接使用包管理器的方法进行安装：&lt;a href=&quot;https://anubis.techaro.lol/docs/admin/native-install&quot;&gt;Installing Anubis with a native package｜Anubis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先从 GitHub 上下载对应的安装包：&lt;a href=&quot;https://github.com/TecharoHQ/anubis/releases&quot;&gt;Releases · TecharoHQ/anubis&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;wget https://github.com/TecharoHQ/anubis/releases/download/v1.17.0/anubis_1.17.0_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后安装&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install ./anubis_1.17.0_amd64.deb
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这里比如说我们想保护一个 Gitea 应用，我们 Gitea 后端的端口为 3000，先来配置 Anubis 的配置文件：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /etc/anubis/default.env /etc/anubis/gitea.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后开始编辑：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;nano /etc/anubis/gitea.env
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认的内容如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BIND=:8923
DIFFICULTY=4
METRICS_BIND=:9090
SERVE_ROBOTS_TXT=0
TARGET=http://localhost:3000
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;具体的各种参数可以查看：&lt;a href=&quot;https://anubis.techaro.lol/docs/admin/installation/#environment-variables&quot;&gt;Environment variables｜Anubis&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我们这里只填几个必须的，可以参考我的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;BIND=:8923
DIFFICULTY=4
METRICS_BIND=:9090
SERVE_ROBOTS_TXT=0
POLICY_FNAME=/etc/anubis/gitea.botPolicies.json
TARGET=http://127.0.0.1:3011
WEBMASTER_EMAIL=admin@example.com
REDIRECT_DOMAINS=git.juniortree.com
USE_REMOTE_ADDRESS=true
ED25519_PRIVATE_KEY_HEX=cdfd076f987d91d165821cac23efcd4a2ab9e09e9642a8ec474ea02b9ef4e8ae
&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;BIND&lt;/code&gt;：Anubis 代理后端转发的端口，对于 Caddy 和 Nginx，这里就是代理的端口&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DIFFICULTY&lt;/code&gt;：挑战的难度，或成功回答中必须包含的前导零的个数&lt;/li&gt;
&lt;li&gt;&lt;code&gt;METRICS_BIND&lt;/code&gt;：给普罗米修斯探针做监控的&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SERVE_ROBOTS_TXT&lt;/code&gt;：Anubis 会默认提供一个 &lt;code&gt;robots.txt&lt;/code&gt;，来控制爬虫&lt;/li&gt;
&lt;li&gt;&lt;code&gt;POLICY_FNAME&lt;/code&gt;：设置 Anubis 规则文件的位置&lt;/li&gt;
&lt;li&gt;&lt;code&gt;TARGET&lt;/code&gt;：设置要保护的后端服务&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WEBMASTER_EMAIL&lt;/code&gt;：在质询页面会留下一个管理员邮件，如果质询出现问题，访客可以通过这个联系到你&lt;/li&gt;
&lt;li&gt;&lt;code&gt;REDIRECT_DOMAINS&lt;/code&gt;：这里需要添加为你要保护的域名，比如说我后端原来服务的域名为 &lt;code&gt;git.juniortree.com&lt;/code&gt;，那这里就填这个&lt;/li&gt;
&lt;li&gt;&lt;code&gt;USE_REMOTE_ADDRESS&lt;/code&gt;：传递真实 IP 的头部&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ED25519_PRIVATE_KEY_HEX&lt;/code&gt;：用于签署 Anubis 响应的十六进制编码 ed25519 私钥，如果未设置，Anubis 将自动生成一个，长度应正好为 64 个字符，可以使用 &lt;code&gt;openssl rand -hex 32&lt;/code&gt; 自己生成一个（不要直接使用我上面的）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;之后把对应的规则复制到相应的目录里面：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo cp /usr/share/doc/anubis/botPolicies.json /etc/anubis/gitea.botPolicies.json
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl enable --now anubis@gitea.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后设置反向代理（Nginx、Caddy 等），指向 Anubis 端口。然后，Anubis 会将所有符合 &lt;code&gt;/etc/anubis/gitea.BotPolicies.json&lt;/code&gt; 中策略的请求反向代理到目标服务&lt;/p&gt;
&lt;p&gt;我这里使用的是 Caddy，我的配置文件就为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;git.juniortree.com {
    reverse_proxy 127.0.0.1:8923 {
        header_up X-Real-Ip {remote_host}
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Nginx 我自己没有实践过，可以参考官方的：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;location /myapp/ {
    proxy_pass http://anubis:8923/myapp;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个是质询中的页面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=L2k1OE5TdEc3VEhQS0xkS0JSR2JNZisvQWVWb0JBc1ZWZz09&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这个是质询失败的页面：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SUFlRnRsQ2NJYzNybUhpMXRzY2c1ZisvQWVWb0JBc1ZWZz09&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;质询通过后自动跳转到对应的业务&lt;/p&gt;
&lt;h2&gt;一些讨论&lt;/h2&gt;
&lt;h3&gt;Anubis 能不能用来当防火墙用？&lt;/h3&gt;
&lt;p&gt;这个显然是不可以的，因为前面说了，只会对包含 &lt;code&gt;&quot;Mozilla&quot;&lt;/code&gt; 的进行质询，而假如攻击者使用修改的谷歌爬虫请求头，那就可以直接绕过了，这时就应该搭配谷歌的 ASN 进行认证&lt;/p&gt;
&lt;p&gt;如果一定要作为防火墙使用，使用 Cloudflare 的 WAF 或许是更好的选择&lt;/p&gt;
&lt;h3&gt;会不会影响 SEO&lt;/h3&gt;
&lt;p&gt;尚不清楚，我自己只对不希望被爬取的 Git 仓库进行了配置，官方给出的建议也并不明确，我没有对其进行测试，对此保持旁观态度&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>《The Last of Us™ Part II Remastered》游玩体验</title><link>https://www.juniortree.com/blog/tlos2-review</link><guid isPermaLink="true">https://www.juniortree.com/blog/tlos2-review</guid><description>PC版《最后生还者2》优化合格，剧情探讨复仇与救赎，艾莉与艾比的双线交织令人深思</description><pubDate>Mon, 14 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我一直很喜欢和僵尸题材相关的游戏，在 23 年以前，《最后生还者》系列只有 PS 平台的玩家才能体验到，之后随着《最后生还者 1》登陆 PC，这个家喻户晓的 IP 终于也能让 PC 玩家体验到&lt;/p&gt;
&lt;p&gt;尽管《最后生还者 1》在剧情上被玩家公认「无大雷」，但是在 PC 上的首发优化一言难尽，最终在 Steam 商店的评分并不高&lt;/p&gt;
&lt;p&gt;在今年的 3 月份，我手上刚好有点点闲钱，便以 Steam 商店八折的价格入手了《最后生还者 2》的 CDKey，准备好好体验一把&lt;/p&gt;
&lt;h2&gt;优化&lt;/h2&gt;
&lt;p&gt;我的配置是 R5 5600 + 4060 搭配 32G 的内存，这个配置已经能代表大多数玩家的主流配置了，官方在游戏发售前坦言引入了「动态着色器编译」的技术，能保证不像第一部首发一样占据大量的着色器编译时间，实际体验下来确实好了不少，极大的减少了等待时间&lt;/p&gt;
&lt;p&gt;除此之外，优化方面的表现也可圈可点，在 2K 分辨率下开 DLSS，我的配置能跑到 100 多帧，但是这个游戏有个 Bug，开启了 DLSS 帧生成之后显卡占用率跑不满，只能使用 FSR 才能跑满，但是 FSR 也有个致命缺陷，开启之后画面的帧生成时间特别长，导致画面不跟手，用着有点难受&lt;/p&gt;
&lt;p&gt;并且《最后生还者》系列也将 DS5 手柄的诸多优秀特性带到了 PC 上，比如说触控板，陀螺仪，比 Xbox 手柄更细腻的震动等等，这都增强了用户的实际使用体验&lt;/p&gt;
&lt;p&gt;总而言之，我认为《最后生还者 2》的 PC 首发绝对是合格的&lt;/p&gt;
&lt;h2&gt;剧情&lt;/h2&gt;
&lt;p&gt;《最后生还者 2》在 PS 平台上最大的槽点其实在于剧情，第一部的主角，乔尔在第二部刚开头的时候就被用高尔夫打死（因此本作也被戏称为《最后的高尔夫》），我刚开始玩的时候也是一脸懵，我也不知道乔尔为什么死，也不知道艾比为什么要不惜一切代价，从那么远的地方跑来杀掉乔尔，而将其他人都放掉&lt;/p&gt;
&lt;p&gt;后来的剧情逐渐交代，在第一部中的火萤医院，乔尔杀死的外科医生就是艾比的父亲，艾比是为了报杀父之仇来杀掉乔尔&lt;/p&gt;
&lt;p&gt;乔尔的死成为整个剧情的「楔子」事件，让两条角色成长线 —— 艾莉的复仇与艾比的救赎交错展开&lt;/p&gt;
&lt;h3&gt;艾莉线前（仇恨的开始）&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/323c9b100a130f30a6e92d3d5301a531.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;艾莉的仇恨起源于乔尔被残忍地杀害，为全篇奠定了复仇、仇恨的基调&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/2b7f44c32b9f087279e60fa619c59364.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;前半部分，玩家操纵艾莉，去西雅图寻求报仇，一路追杀艾莉的团队，在追杀的过程中，杀掉了乔尔的杀人者之一诺拉、梅尔、欧文等，杀死诺拉时，她用极其残忍方式逼供，在最终的水族馆的时候杀掉怀有身孕的梅尔，她内心变得扭曲，开始自责，开始怀疑&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/580e4fb3b515f13663b90f2a32f71e6f.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;艾比线前&lt;/h3&gt;
&lt;p&gt;杀掉乔尔后，她并没有得到真正的解脱，但现实是空虚的，她仍然常做当年还在火萤医院的那个噩梦，梦到她曾熟悉的那个父亲&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/e0c9ab6e2ef93adedc804002c161184d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;回到西雅图后，她因恩情救下两个疏远的“敌人”：小孩列夫与雅拉（曾是敌对派系“疤痕”的人），被 WLF 排斥、疤痕追杀，她开始逃离战争机器的身份，与列夫和雅拉一同冒险，了解他们的故事，逐渐变得温柔，她选择保护他们，与他们一起逃离现在的身份&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/8c749c72c9366abdc0b29355b13147a8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;剧院的第二次相聚&lt;/h3&gt;
&lt;p&gt;最终的再次相遇，聚集在了剧场，玩家扮演着艾比的角色，在这一刻就是一个挑战，传统的游戏玩家一般都会扮演一个所谓的「正派角色」，但是这次玩家似乎被安排到了对面，我们需要去对抗你刚刚经历一整条剧情线才喜欢上的艾莉，这本身就是极其冲突的感受&lt;/p&gt;
&lt;p&gt;我自己在玩的时候，是多么希望艾莉能干掉艾比，获得我原本所期待的「Happy Ending」，制作者逼玩家以「仇人」的身份重新审视艾莉和艾比的形象，对于艾比来说，乔尔是杀父仇人，艾莉和汤米杀死了自己的朋友和挚爱；对于艾莉来说，艾比是杀父仇人，她也亲手杀死了自己的朋友&lt;/p&gt;
&lt;p&gt;或许这时候的答案就显而易见了，&lt;strong&gt;没有真正的“好人”和“坏人”，只有各自为爱而战的幸存者&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;而在最后，蒂娜被艾比制服，艾莉跪地求饶，告诉她说：“她怀孕了”，而这句话与她发现梅尔也怀孕的真相正好形成对照，让艾比也陷入一瞬间的道德震撼，那一刻你能感受到艾比心中的挣扎：她可以杀艾莉，但列夫在看，她在看着另一个“她自己”&lt;/p&gt;
&lt;p&gt;最终她没有杀掉艾莉和蒂娜，只是告诉她说：“别让我再看见你”&lt;/p&gt;
&lt;p&gt;这时候的艾比就已经完成了自己的救赎&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/6ca9d0b82a11604b232be32a333259f9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;剧院后的「假和平」&lt;/h3&gt;
&lt;p&gt;在剧院相聚之后，艾比放过了艾莉，艾莉、蒂娜和汤米三个人重新回到杰克逊，过上了幸福的农场生活&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/2f9464aeff187e5559a5c9dff0682ad3.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;但是 PTSD（创伤后应激障碍）并没有放过艾莉，她仍然时常想起乔尔，想起乔尔被折磨时的那张脸&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/28caf673dd6462f94cefc6fdeb4e8659.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;但汤米找上门来，告诉艾莉艾比的下落的时候，她犹豫了，她始终放不下这段经历，她想为乔尔报仇，她想要战斗，蒂娜求她留下来，但是她放弃了，继续踏上了报仇之路&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/55bd1bcf76b49c251989bcc4ecde12d9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;海滩第三次相遇&lt;/h3&gt;
&lt;p&gt;艾莉来到圣塔芭芭拉，发现艾比和列夫已经被蛇眼帮抓住囚禁数月，身体几近崩溃，在海滩上，她救出了他们，但是她又一次举起刀：“&lt;strong&gt;我不能就这样放过你。&lt;/strong&gt;”&lt;/p&gt;
&lt;p&gt;艾比拒绝再战，艾莉以列夫为威胁，艾比无奈开始与艾莉在海水中互殴，一场最悲惨、最没有胜者的战斗开始&lt;/p&gt;
&lt;p&gt;就在艾莉压制艾比、要将她溺死之时，她想起了舞会后一晚，和乔尔谈话的场面，艾莉说自己应该死在萤火医院，那才是她应该的归宿&lt;/p&gt;
&lt;p&gt;乔尔说，如果再有一次机会，他还是会选择救她&lt;/p&gt;
&lt;p&gt;艾莉说，“我不确定能不能原谅你，但我想试一试。”&lt;/p&gt;
&lt;p&gt;这句话是全剧中最温柔，最真实的原谅，那是她最后拥有乔尔的方式，是她学会放手的起点，如果没有这句话，她也许真的会杀掉艾比，但是她没有&lt;/p&gt;
&lt;p&gt;从这一刻起，艾莉也获得了救赎&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/514b0e4a2d47c342d945c8d0db08b9bb.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;最后，艾比带着列夫乘船离开，驶向火萤的传说之地，艾莉孤身返回&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/bbb85677b295abe908e6da2c7bb317e0.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;回归最终之地&lt;/h3&gt;
&lt;p&gt;艾莉回到农场，发现已经家徒四壁，蒂娜和孩子也已不在，她走进房间，尝试弹起乔尔送她的吉他，她的左手已经断了两根手指，无法完整弹奏那首属于他们的《未来的日子》（Future Days）&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/871eb397308bb146a3bdc8bfbbc3f1f1.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;复仇的结果就是失去了挚爱、家庭和与乔尔的回忆，最终她走进森林，全剧终&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/99e42a8718cff92e4df515a8ac71a429.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;写在最后&lt;/h2&gt;
&lt;p&gt;刚开始玩的时候，我对这个剧情意见还是挺大的，主要还是乔尔的死吧，我觉得乔尔死的太轻易、太简单，但其实后来等到全剧终，我开始理解乔尔这个角色的安排，也逐渐开始认可了剧情&lt;/p&gt;
&lt;p&gt;最后开发者还给玩家展示了游戏的三个废案，我觉得还挺有意思的，向玩家展示了一些游戏开发思想，对人物的形象塑造也起到了一些补充作用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/b06de28e2e9eeb95515686141531757a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;其中的“猎猪”桥段给我留下了挺深的印象的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/647d284e50935ec468c3686ce478823c.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;艾莉这个形象更加丰满了 —— 到底是为了什么去猎猪，最后获得的不是满足感，而是罪恶感&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/04/36c37f11a82b3e14c9af11df12decee9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.CHa99Ggs.webp"/><enclosure url="/_astro/hero.CHa99Ggs.webp"/></item><item><title>游记 - 2025 - 玉渊潭春</title><link>https://www.juniortree.com/blog/yuyuantan-2025</link><guid isPermaLink="true">https://www.juniortree.com/blog/yuyuantan-2025</guid><description>春日游玉渊潭</description><pubDate>Thu, 10 Apr 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;又是一年樱花开&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/03/b0a3a8eeaa0b440ccca410b247c15045.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/03/22c2cf36e7f07a67b9991ad0b51e786b.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/03/740eb8c6c5a1dde99911590baed26528.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2025/03/60c4fc1cc9986e6c84aa06d0a49089fe.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.CEQbmIKN.webp"/><enclosure url="/_astro/hero.CEQbmIKN.webp"/></item><item><title>Synapse 完整搭建流程</title><link>https://www.juniortree.com/blog/synapse-build</link><guid isPermaLink="true">https://www.juniortree.com/blog/synapse-build</guid><description>详细讲解Synapse服务器及配套服务搭建流程，包括数据库、身份验证和TURN服务配置</description><pubDate>Wed, 05 Feb 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;目前很多博客只简单讲述了如何搭建 Synapse 服务器，但实际搭建完，用户使用后会出现大量问题，本文旨在详细讲述 Synapse 服务器以及其他的配套服务搭建&lt;/p&gt;
&lt;h2&gt;Synapse 现状&lt;/h2&gt;
&lt;p&gt;Synapse 原本是由 Matrix基金会实现和维护的，是一个基于 Python 的 Matrix 协议实现服务，当然除此之外也有其他的服务端推荐，但是 Synapse 是其中最稳定，也是官方最为推荐的，在官网他们给出了&lt;a href=&quot;https://matrix.org/ecosystem/servers/&quot;&gt;其他的服务端&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=UG5jWEVFY1ZQRit6V2dvclU4emFXRUxtSjZKYy80c0o=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在2024年的八月份，Matrix基金会已经无力再维护 Synapse，而是将其转交给了 Element 维护&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=aFVjeXNwRlNuaFZMNGRoL3ZwL2E1VUxtSjZKYy80c0o=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;你或许会问了，Element 是什么？和 Matrix 又是什么关系？&lt;/p&gt;
&lt;p&gt;坦率地讲，我觉得 Element 有点像一个商业公司，他们为一些客户提供了 Matrix 服务器的托管服务，同时将一些客户端和服务端开源，Matrix 让 Element 来接手 Synapse 的维护其中应该也有 Matrix 作为一个非盈利基金会资源不够用的窘境&lt;/p&gt;
&lt;p&gt;对于我们普通用户来说，不管是 Matrix 还是 Element，他们所提供的 Synapse 都是开源的，因此对于我们来说没有影响，只管好好用就可以了&lt;/p&gt;
&lt;p&gt;但是在一些细微的配置中，Element 为了更好的适配直接的客户端，我们需要做一些细微的调整，这些在后面的章节中会详细讲述&lt;/p&gt;
&lt;h2&gt;安装 Synapse&lt;/h2&gt;
&lt;p&gt;一个完整的 Synapse 包括以下部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/element-hq/synapse&quot;&gt;Synapse&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Postgres&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/matrix-org/sydent&quot;&gt;Sydent&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/matrix-org/sliding-sync&quot;&gt;Sliding Sync&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;TURN 服务&lt;/li&gt;
&lt;li&gt;反代，在这里使用 Caddy&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果英文能力可以的话我极力推荐阅读官方的文档，目前最新的文档是由 Element 所维护：&lt;a href=&quot;https://element-hq.github.io/synapse/latest/welcome_and_overview.html&quot;&gt;Welcome and Overview - Synapse&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;搭建基础服务&lt;/h3&gt;
&lt;p&gt;关于如何搭建 Synapse 基础服务器，我建议可以去看一看这位博主的文章，我第一次搭建就是跟着这个的：&lt;a href=&quot;https://www.baiyuyu.com/304.html&quot;&gt;超详细 Matrix Synapse 部署教程：搭建去中心化加密聊天服务器 - 白鱼小栈&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是这个博主使用的是默认的 SQLlite 数据库，虽然简单但是性能十分拉垮，所以我们可以安装官方给出的文档将其切换成 Postgres&lt;/p&gt;
&lt;p&gt;首先请按照我给的 &lt;code&gt;docker-compose.yml&lt;/code&gt; 起好容器：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;services:
  synapse:
    image: matrixdotorg/synapse:latest
    container_name: synapse
    restart: unless-stopped
    healthcheck:
       test: [&quot;CMD-SHELL&quot;, &quot;curl -s localhost:8008/health || exit 1&quot;]
    ports:
      - &quot;8008:8008&quot;
    volumes:
      - ./data:/data
    environment:
      VIRTUAL_HOST: matrix.example.com
      VIRTUAL_PORT: 8008
      LETSENCRYPT_HOST: matrix.example.com
      SYNAPSE_SERVER_NAME: matrix.example.com
      SYNAPSE_REPORT_STATS: &quot;no&quot;
    networks:
      - matrix_network

  db:
    image: postgres13
    container_name: synapse_db
    restart: unless-stopped
    environment:
      POSTGRES_USER: synapse
      POSTGRES_PASSWORD: synapse
      POSTGRES_DB: synapse
      POSTGRES_INITDB_ARGS: &quot;--locale=C --encoding=UTF8&quot;
    volumes:
      - ./db_data:/var/lib/postgresql/data
    networks:
      - matrix_network

networks:
  matrix_network: {}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后需要修改 &lt;code&gt;homeserver.yaml&lt;/code&gt;，之后修改 &lt;code&gt;database&lt;/code&gt; 字段为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;database:
  name: psycopg2
  args:
    user: synapse
    password: synapse
    database: synapse
    host: synapse_db
    port: 5432
    cp_min: 5 
    cp_max: 10
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;其他按照博主给的配置就可以了，之后打开 &lt;code&gt;8008&lt;/code&gt; 端口，看看是否会出现欢迎界面&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=VVFUNk4rTjZEYUhyWXVYUnRuRzVzZHVocG1OTFJJbHE=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;其返回的路径为：&lt;code&gt;http://&amp;#x3C;ip&gt;/_matrix/static/&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;配置反向代理&lt;/h3&gt;
&lt;p&gt;官方提供了 Nginx 和 Caddy 两种配置文件：&lt;a href=&quot;https://element-hq.github.io/synapse/latest/reverse_proxy.html&quot;&gt;Using a reverse proxy with Synapse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;nginx&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-nginx.conf&quot;&gt;server {
    listen 443 ssl;
    listen [::]:443 ssl;

    # For the federation port
    listen 8448 ssl default_server;
    listen [::]:8448 ssl default_server;

    server_name matrix.example.com;

    location ~ ^(/_matrix|/_synapse/client) {
        # note: do not add a path (even a single /) after the port in `proxy_pass`,
        # otherwise nginx will canonicalise the URI and cause signature verification
        # errors.
        proxy_pass http://localhost:8008;
        proxy_set_header X-Forwarded-For $remote_addr;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_set_header Host $host:$server_port;

        # Nginx by default only allows file uploads up to 1M in size
        # Increase client_max_body_size to match max_upload_size defined in homeserver.yaml
        client_max_body_size 50M;
    
    # Synapse responses may be chunked, which is an HTTP/1.1 feature.
    proxy_http_version 1.1;
    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;caddy&lt;/strong&gt;，在这里我们不使用官方的配置文件，不大好用&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-caddyfile&quot;&gt;matrix.example.com {
	reverse_proxy 127.0.0.1:8008
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方提供的配置文件是：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-caddyfile&quot;&gt;matrix.example.com {
  reverse_proxy /_matrix/* localhost:8008
  reverse_proxy /_synapse/client/* localhost:8008
}

example.com:8448 {
  reverse_proxy /_matrix/* localhost:8008
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但在实际的使用中，路径并不会被正确路由，按照我自己使用的方法进行路由可能存在一些风险，还是建议用 Nginx 进行反代&lt;/p&gt;
&lt;p&gt;在这里我们需要指定来自联邦（Federation）的流量&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=UnROend1WmppMEZTR29EMmQ0R21Fdm9zaHdDT1NFRU0=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在这里我不打算使用 &lt;code&gt;8448&lt;/code&gt; 端口，因此需要进行声明，要使用这种方法，需要配置 &lt;code&gt;https://&amp;#x3C;server_name&gt;&lt;/code&gt; 处的服务器为 &lt;code&gt;https://&amp;#x3C;server_name&gt;/.well-known/matrix/server&lt;/code&gt; 处的文件提供服务&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;homeserver.yaml&lt;/code&gt; 中，我们可以指定字段来提供服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;serve_server_wellknown: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后使用 &lt;code&gt;curl&lt;/code&gt; 进行测试&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;$ curl -i https://&amp;#x3C;server_name&gt;/.well-known/matrix/server
HTTP/2 200 
alt-svc: h3=&quot;:443&quot;; ma=2592000
content-type: application/json
date: Wed, 05 Feb 2025 03:27:35 GMT
server: Caddy
server: Synapse/1.123.0
strict-transport-security: max-age=31536000; includeSubDomains; preload
content-length: 34

{&quot;m.server&quot;:&quot;&amp;#x3C;server_name&gt;:443&quot;}%  
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;配置 Sydent&lt;/h3&gt;
&lt;p&gt;Sydent 是 Matrix 协议中的身份服务器，它允许用户通过邮件和电话号码发现对方，尽管官方并不推荐用户自己搭建 Sydent 服务器，但是为了完整展示全过程，我还是在这里贴出参考步骤&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=dnlmM3JzejBsL1QxUGllakpIQ2dNZTFzM2w5WExPLzQ=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;直接使用 docker compose 进行部署&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;services:
  sydent:
    image: matrixdotorg/sydent:latest
    container_name: matrix_sydent
    environment:
    - SYDENT_SERVER_NAME=
    volumes:
    - ./sydent_data:/data
    ports:
    - &quot;8090:8090&quot;
    restart: unless-stopped
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;之后使用 Caddy 进行反代，在客户端中添加服务器&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=TGJHU2ZISk14dHhxcXFlTnl5MFBJWjY3MG8rWlN0anU=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;配置 Sliding Sync&lt;/h3&gt;
&lt;p&gt;在一些比较新的客户端，如 Element X 中，要求服务器必须支持 Sliding Sync，在这里我们还是使用 docker compose 来进行部署&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;services:
  postgres:
    image: postgres:13
    container_name: sliding_sync_db
    environment:
      POSTGRES_DB: syncv3
      POSTGRES_USER: postgres
      POSTGRES_PASSWORD: ${DATABASE_PASSWORD}
    volumes:
      - ./data_db:/var/lib/postgresql/data
  sliding_sync:
    image: ghcr.io/matrix-org/sliding-sync:latest
    container_name: sliding_sync
    depends_on:
      - postgres
    ports:
      - &quot;8009:8009&quot;
    environment:
      SYNCV3_SERVER: &quot;https://matrix.example.com&quot;
      SYNCV3_DB: &quot;postgres://postgres:${DATABASE_PASSWORD}@postgres:5432/syncv3?sslmode=disable&quot;
      SYNCV3_SECRET: ${SYNCV3_SECRET}
      SYNCV3_BINDADDR: &quot;:8009&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需要创建一个 &lt;code&gt;.env&lt;/code&gt; 文件，在里面填入&lt;code&gt;DATABASE_PASSWORD&lt;/code&gt; 和 &lt;code&gt;SYNCV3_SECRET&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-.env&quot;&gt;DATABASE_PASSWORD=password
SYNCV3_SECRET=password
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同样需要配置反代，除此之外，在 Synapse 服务器的 &lt;code&gt;homeserver.yaml&lt;/code&gt; 中也要配置对于的字段，来让服务器在 &lt;code&gt;https://matrix.example.com/.well-known/matrix/client&lt;/code&gt; 返回一个 JSON 数组，来声明服务器的 Sliding Sync 的服务&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;public_baseurl: &quot;https://matrix.example.com&quot;
extra_well_known_client_content : # 用来配置 /.well-known/matrix/client
  org.matrix.msc3575.proxy: https://sliding.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启服务，使用 &lt;code&gt;curl&lt;/code&gt; 进行检查&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-zsh&quot;&gt;$ curl -i https://matrix.example.com/.well-known/matrix/client
HTTP/2 200 
access-control-allow-headers: X-Requested-With, Content-Type, Authorization, Date
access-control-allow-methods: GET, HEAD, POST, PUT, DELETE, OPTIONS
access-control-allow-origin: *
access-control-expose-headers: Synapse-Trace-Id, Server
alt-svc: h3=&quot;:443&quot;; ma=2592000
cache-control: no-cache, no-store, must-revalidate
content-type: application/json
date: Wed, 05 Feb 2025 03:45:24 GMT
server: Caddy
server: Synapse/1.123.0
strict-transport-security: max-age=31536000; includeSubDomains; preload

{&quot;m.homeserver&quot;:{&quot;base_url&quot;:&quot;https://matrix.example.com/&quot;},&quot;org.matrix.msc3575.proxy&quot;:&quot;https://sliding.example.com&quot;}%   
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;至此，我们可以使用官方提供的工具来检查是否配置正常，能不能和 Matrix 联邦上的其他服务器进行通信：&lt;a href=&quot;https://federationtester.matrix.org&quot;&gt;Matrix Federation Tester&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=YVpmV25ZcjYwWk5lRGg0VHdFcHB1MCswQTI5VndmdmM=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;TRUN 服务器&lt;/h3&gt;
&lt;p&gt;Matrix 是支持 VoIP 通话的，你可以尝试使用官方提供的 turn.matrix.org，但是这样有 IP 地址泄漏风险，而且该服务在大陆存在网络问题，因此我建议进行自建&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=M1VTVENjTzB2K2drRU9EM2ZxNE5yeUJFUkpqa2NVOUs=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;官方文档也提供了相应的指导：&lt;a href=&quot;https://element-hq.github.io/synapse/latest/turn-howto.html&quot;&gt;Configuring a Turn Server - Synapse&lt;/a&gt;，在这里我使用 coturn 作为 TURN 服务器&lt;/p&gt;
&lt;p&gt;coturn 提供了包管理、docker和本地编译三种方式，由于我使用的是 Debian，提供了包&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo apt install coturn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置文件在 &lt;code&gt;/etc/turnserver.yaml&lt;/code&gt;，在正式修改之前需要进行备份&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;cp /etc/turnserver.conf /etc/turnserver.conf.bak
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;基础配置如下：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;# 填写你的 TURN 服务域名
realm=turn.example.com

# 启用服务器
listening-port=3478
tls-listening-port=5349

# 随机密码
cli-password=password

# 指定外网IP（重要！替换为你的公网IP）
external-ip=&amp;#x3C;ip&gt;

# UDP端口范围（建议保留默认）
min-port=49152
max-port=65535

# 测试用户，实际使用需要删除！！
user=username:password

# 动态密钥 使用 pwgen -s 64 1 生成
use-auth-secret
static-auth-secret=password

# TLS证书配置（必须）
cert=/etc/letsencrypt/live/turn.example.com/fullchain.pem
pkey=/etc/letsencrypt/live/turn.example.com/privkey.pem

# 日志配置
log-file=/var/log/turn.log
verbose

# VoIP traffic is all UDP. There is no reason to let users connect to arbitrary TCP endpoints via the relay.
no-tcp-relay

# don&apos;t let the relay ever try to connect to private IP address ranges within your network (if any)
# given the turn server is likely behind your firewall, remember to include any privileged public IPs too.
denied-peer-ip=10.0.0.0-10.255.255.255
denied-peer-ip=192.168.0.0-192.168.255.255
denied-peer-ip=172.16.0.0-172.31.255.255

# recommended additional local peers to block, to mitigate external access to internal services.
# https://www.rtcsec.com/article/slack-webrtc-turn-compromise-and-bug-bounty/#how-to-fix-an-open-turn-relay-to-address-this-vulnerability
no-multicast-peers
denied-peer-ip=0.0.0.0-0.255.255.255
denied-peer-ip=100.64.0.0-100.127.255.255
denied-peer-ip=127.0.0.0-127.255.255.255
denied-peer-ip=169.254.0.0-169.254.255.255
denied-peer-ip=192.0.0.0-192.0.0.255
denied-peer-ip=192.0.2.0-192.0.2.255
denied-peer-ip=192.88.99.0-192.88.99.255
denied-peer-ip=198.18.0.0-198.19.255.255
denied-peer-ip=198.51.100.0-198.51.100.255
denied-peer-ip=203.0.113.0-203.0.113.255
denied-peer-ip=240.0.0.0-255.255.255.255

# special case the turn server itself so that client-&gt;TURN-&gt;TURN-&gt;client flows work
# this should be one of the turn server&apos;s listening IPs
allowed-peer-ip=10.0.0.1

# consider whether you want to limit the quota of relayed streams per user (or total) to avoid risk of DoS.
user-quota=12 # 4 streams per video call, so 12 streams = 3 simultaneous relayed calls per user.
total-quota=1200
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;启动服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl start coturn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设置开机启动：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;systemctl enable coturn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;虽然有很多教程提出可以使用 &lt;a href=&quot;https://webrtc.github.io/samples/src/content/peerconnection/trickle-ice/&quot;&gt;Trickle ICE&lt;/a&gt; 测试服务是否可用，但是我在实际使用过程中发现不太好用，因此使用 coturn 提供的测试工具 &lt;code&gt;turnutils_uclient&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;turnutils_uclient -v -y -u username -w password &amp;#x3C;ip&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;链接成功的关键点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;成功的分配响应：多次发送的“allocate response received: success”表明客户端成功地从TURN服务器获得了中继地址。&lt;/li&gt;
&lt;li&gt;通道绑定成功：输出中显示“channel bind sent”和“cb response received: success”，这表明通道绑定请求也成功。&lt;/li&gt;
&lt;li&gt;消息传输统计：在消息客户端（mclient）部分，显示了发送和接收的消息数量，以及没有丢包（Total lost packets 0），这表明数据传输正常。&lt;/li&gt;
&lt;li&gt;延迟和抖动：输出中提供的平均往返延迟和抖动值（Average round trip delay 250.75 ms; Average jitter 1.35 ms）也在合理范围内，表明连接质量良好。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;之后需要设置 TLS/DTLS，不要使用来自 Let&apos;s Encrypt 的证书，因为所有使用 Chromium&apos;s WebRTC 的 Matrix 客户端都无法使用&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=Y0Urbk1uVzZFVzV6ZUtvN1B4T3o3WFowWFZhTVMxMkM=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;申请 ZeroSSL 即可，ZeroSSL 提供了自动化工具：&lt;a href=&quot;https://github.com/zerossl/zerossl-bot&quot;&gt;GitHub - zerossl/zerossl-bot: The repository for the ZeroSSL certbot wrapper&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;apt install certbot

bash &amp;#x3C;(wget -q -O - https://github.com/zerossl/zerossl-bot/raw/master/get-zerosslbot.sh)

sudo zerossl-bot certonly --standalone -m youremail@example.com -d turn.example.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;申请成功后证书会下放到 &lt;code&gt;/etc/letsencrypt/archive/turn.example.com&lt;/code&gt; 中&lt;/p&gt;
&lt;p&gt;直接运行会出现问题，因为 coturn 进程没有权限去读取相应的证书文件，在&lt;a href=&quot;https://github.com/coturn/coturn/issues/1139&quot;&gt;cannot start TLS and DTLS listeners because private key file is not set properly · Issue #1139 · coturn/coturn&lt;/a&gt;中可以看到&lt;/p&gt;
&lt;p&gt;解决方法有两种，将文件所有权设置为 &lt;code&gt;644&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=a09wV2VGU2JYU0ltaExHMHJLSzdBbUhZeDk3L3AzcXY=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;或者以 &lt;code&gt;root&lt;/code&gt; 用户运行 &lt;code&gt;coturn&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;修改服务配置：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo nano /lib/systemd/system/coturn.service
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改配置为：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-service&quot;&gt;[Unit]
Description=coTURN STUN/TURN Server
Documentation=man:coturn(1) man:turnadmin(1) man:turnserver(1)
After=network.target

[Service]
User=root
Group=root
Type=notify
ExecStart=/usr/bin/turnserver -c /etc/turnserver.conf --pidfile=
Restart=on-failure
InaccessibleDirectories=/home
PrivateTmp=yes

[Install]
WantedBy=multi-user.target
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;重启服务：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo systemctl daemon-reload
sudo systemctl restart coturn
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;查看日志是否正常&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;sudo journalctl -u coturn -f
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可以使用 &lt;code&gt;openssl&lt;/code&gt; 测试 TLS 是否正常&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;openssl s_client -connect turn.example.com:5349
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=M25CZi9YOW1CcGN4dVpZNjhiV3BNNHdydUQ3RWpYMlo=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;可以看到我这里的 CA 确实是 ZeroSSL&lt;/p&gt;
&lt;p&gt;之后需要在 Synapse 中的 &lt;code&gt;homeserver.yaml&lt;/code&gt; 配置&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-yml&quot;&gt;turn_uris: [ &quot;turn:turn.example.com?transport=udp&quot;, &quot;turn:turn.example.com?transport=tcp&quot; ]
turn_shared_secret: &quot;password&quot;
turn_user_lifetime: 86400000
turn_allow_guests: true
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;官方文档可以参考：&lt;a href=&quot;https://element-hq.github.io/synapse/latest/turn-howto.html#synapse-setup&quot;&gt;Configuring a Turn Server - Synapse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=ekhCN3YxMm9YbktrRit0c29kZUpERDhMdDRMMEdLWWw=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;Matrix 是一个很牛逼的东西，希望未来的发展越来越好，能加入和 tg 类似的贴纸包，各种功能能够更完善一下，管理集成是什么东西还是不知道&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=MDZVbWMxZHVqUlBWN1A4S2c4d0pFN0kwQUNFVWVoZkg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;目前我这样配置还是不能支持 Element X 的创建用户，原因目前未知，还有待进一步解决&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>游记 - 2025 - 重庆</title><link>https://www.juniortree.com/blog/chongqing-2025</link><guid isPermaLink="true">https://www.juniortree.com/blog/chongqing-2025</guid><description>游重庆</description><pubDate>Mon, 20 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;计划去重庆的愿望已经持续了很久，终于，在2025年初，我们终于计划好一切事情，开启了我们的重庆之旅&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=T0RYT250UDRMbHNKRDhWb2RYdXpHNUZtaS9HcDdja3k=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;重庆是一个很有意思的城市，这种有意思主要体现在它的地理位置和地形上，重庆乃嘉陵江和长江的交汇地，在重庆朝天门，你可以看到两江交汇的壮观景象&lt;/p&gt;
&lt;p&gt;要是你颇有雅兴，你可以乘坐重庆颇具特色的“两江小渡”，在江上细看&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=eTlKTHQvUVRpWmFjdUgxQ0NHQjN5MnhreFc5VGdxRDg=&quot; alt=&quot;两江交汇处&quot;&gt;&lt;/p&gt;
&lt;p&gt;重庆多雾，这一点从照片上你也能看得出来，在重庆，很少能碰到出太阳的好天气，大多时候是湿冷的，这也造就了重庆人喜欢吃“麻辣”的独特饮食习惯，这一点与同样爱吃辣的湘赣人完全不同&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OXJobm1VTWtDb2xhckorSEhxdmVqcVpGTEduN0lNSzU=&quot; alt=&quot;小面&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=dmR5VjF6cjJINmU5cllJQmVLZ2FIcE91cytaU2JrQW4=&quot; alt=&quot;DSCF1279&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=S3UvQmdwK1hGUjVpRnVyYzIvKzlQQS9NTjB6T0xyWHA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=NUFkNk4yTzUvVC9RZUJ6anRzTXd1US9NTjB6T0xyWHA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;重庆这个城市带给我更多的体验是“打卡”，这是“网红城市”的特性&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SmEzOUNjcWdLOWllQUY5bjhTdlZuajBLSlVaKytwWDg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=d0xmVDUrNU9oVjFLTnd1WERGcHNIZU1HdHZyT2FGUXA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=b0J6N0Y1YVFFb2FPTkpNRFZFQ3ZGdU1HdHZyT2FGUXA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OWdseVhFSDNHQ3YrUWhUTU9VUVJoakVPMzBHUWVBMGE=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=YnFmU1BCQ2pzODM4OE45ZXA1aHAzOUpUUjZnclZCY1I=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=TUlkY083SytsNWUvTHhlME83MlI0a25UY2NIQk1DcCs=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=b1l4ZU9VMER5SUJaWXdjTEY3azYzUXNhbUlhaFI2cmk=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=cnVBa3IzY0xDcFc2Sms0NmovcURoV2hsZTF0VCtvOVc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=aEpva0pkR203QlJGeUVHcEU4TkpzV2hsZTF0VCtvOVc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;重庆市人民大礼堂也是极佳的观景点&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=VmJrejh5RzczZlRBZnhyaXE4ako2cm5FN002Q2xGVDc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=L044OGJsZ0RSSS9RalZWZTlEWFJKN25FN002Q2xGVDc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;重庆的夜景是极美的，我想这从中有两部分原因，第一是灯光美；第二是重庆城市的形态美&lt;/p&gt;
&lt;p&gt;夜晚的灯光把8D的重庆给立体化了，在流光溢彩的夜晚，我们更能看到重庆的轮廓与层次&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=MVFBTVNSVDJ2U1JmT2tqSktwSnpFcUJSeFdsZkZmYTY=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=RmRmNytUU25yNlV3eEhqVXFOR0huUDRFSm5Na2xLQVg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在一路上我们也有很多“奇遇”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=TlNVK1RrNHlTS1RITEVrb0t5M3M5MEFLRVpqUDlaY3A=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=VWpnTGl0Z0xqdFI2YzcwTXFMN0cwQ3FmUDlyYThYVG8=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=b1dUSWpPOFd5c0lncGh5dE9YOWt2U3FmUDlyYThYVG8=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=ZStQWlp3czRTaWVpMk1CNngxb1hLaXFmUDlyYThYVG8=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SXNGcGdPeTRCbjJiKzBGTUppM0JvaXFmUDlyYThYVG8=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;重庆是一个极美的城市，食物中的麻与辣同样赋予重庆人以不屈不挠的精神——在抗战时期、在和平年间&lt;/p&gt;
&lt;p&gt;重庆的交通极为抽象，我坐车很少晕车，但是在重庆我第一次体会到晕车呕吐，弯弯绕绕的山路，永远穿不完的隧道，很难想象在以前导航尚未普及的年代外地人来重庆是如何找到地方的&lt;/p&gt;
&lt;p&gt;轻轨和地铁也是极有意思的，我在北京也坐过一些即在地上跑也在下面跑的城市轨道交通，但是重庆的情况却迥乎不同，在重庆刚进去的地铁站还在地上，出来的地铁站就在隧道里面了&lt;/p&gt;
&lt;p&gt;重庆的出租车师傅也很有意思，得知我们来自湖南，向我们推荐了很多地道（特别辣）的火锅店，我们吃的确实欢心，第二天屁股也确实疼&lt;/p&gt;
&lt;p&gt;总之，重庆绝对是一个值得一去的城市，可惜我们没有规划好，5 天的行程对于重庆来说还是有点太长了，有计划去的可以腾出两天跑成都去耍一耍&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.DirhSk31.jpeg"/><enclosure url="/_astro/hero.DirhSk31.jpeg"/></item><item><title>我为什么选择转专业 &amp; 2024回首</title><link>https://www.juniortree.com/blog/2024-review</link><guid isPermaLink="true">https://www.juniortree.com/blog/2024-review</guid><description>从光电转生物，追寻热爱与初心，2024年收获成长与快乐</description><pubDate>Fri, 03 Jan 2025 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;我为什么选择转专业&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;关于读什么专业这个问题其实在2023年高考报志愿的时候就已经下了决定，转专业只是纠正了这个错误。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;上面是我和我妈妈在聊起转专业的时候我所说的原话，在高考填报志愿的时候我就下定决心要选择和生物相关的专业，然后高考最后录取的时候也很巧，被另外一个电子信息类专业——光电信息科学与工程录取，在一个学期的学习和生活之后发现自己确实不喜欢，便“纠正”了自己的职业规划，重新转专业学习生物&lt;/p&gt;
&lt;p&gt;在实际转专业的过程中我也遇到了很多人有过的问题：&lt;/p&gt;
&lt;h2&gt;为什么要在原专业成绩好才能转专业，成绩好不是更说明适应原专业学习吗？&lt;/h2&gt;
&lt;p&gt;我觉得这个问题和 &lt;strong&gt;为什么中国的学生没有 Gap Year&lt;/strong&gt; 是一样的，你想转入的专业也想知道你是因为确实不喜欢原来的专业，还是你单纯想要&lt;strong&gt;逃离&lt;/strong&gt;原来的专业，这两者其实是存在本质区别的，如果你能在原专业取到很好的成绩，那么就说明你确实有能力——哪怕是你自己不擅长的领域——之后如果能学到自己喜欢的专业，那么一定有潜力学得更好&lt;/p&gt;
&lt;p&gt;相反，如果你原专业学的稀烂，那么你又如何证明你确实是不喜欢，还是只想&lt;strong&gt;逃离&lt;/strong&gt;现在的专业呢？&lt;/p&gt;
&lt;h2&gt;为什么要选择生物专业呢，原来的专业不好吗？&lt;/h2&gt;
&lt;p&gt;我很感谢原专业的老师和同学对我的帮助，我在物理系度过了很快乐的一年，结识了很多朋友，长了很多见识&lt;/p&gt;
&lt;p&gt;在前面我说了，在一个学期的体验后我发现自己确实不喜欢，之后才确定自己要转。光电的很多专业课和公修课学的我很吃力，比如说高等数学（A）、机械制图、线性代数，当我了解到之后还要学概率论，数学物理方法等课之后，内心充满了抗拒&lt;/p&gt;
&lt;p&gt;从小我就发现自己不是很擅长数学逻辑分析，尤其是在抽象代数方面，相反我对一些实验性课程充满兴趣——这也是促使我选择生物学作为未来职业规划的重要原因，我很喜欢去亲自动手去探究一些科学命题，对一些抽象性很强的问题则不是很感兴趣——也不大擅长&lt;/p&gt;
&lt;p&gt;我从小身体就不是很好，小时候经常生病，在医院住院的经历给我留下了极深的印象，我能清楚记住自己用的是什么药，得的是什么病，要怎么看检查报告等等，每次生病我都会很好奇身体内部发生了什么变化，为什么我用的药会使我变好，这些切身体验到的生命科学命题成为了我的启蒙老师&lt;/p&gt;
&lt;p&gt;在步入中学，开始系统学习生物学知识之后，我更加体会到生物学作为一门“身边的科学”的魅力所在——是呀，生命科学就是这样“润物细无声”地影响着我们的生活&lt;/p&gt;
&lt;p&gt;这就是我选择学习生物的原因（听起来是不是有点恋爱脑&lt;/p&gt;
&lt;h2&gt;听说你很喜欢计算机，为什么不把它当作你的专业呢？&lt;/h2&gt;
&lt;p&gt;其实对于我而言，计算机和摄影是一样的，它们只能当做我的兴趣和工具，而没办法成为我的工作&lt;/p&gt;
&lt;p&gt;对于计算机来说，也要学很多对于我来说很痛苦的课程，我只喜欢计算机带给我的便利，而不想往下深究其原理，这对于一个从业者来说无疑是灾难性的，我注定无法成为一个优秀的“计算机科学家”，如果一味“逼”自己去接受的话，我甚至可能出现逆反心理——变得痛苦，这是我自己不想看到的&lt;/p&gt;
&lt;p&gt;对于职业，我想找到一个“Sweet Point”，一个我能获得成就感和满足感的角度，我不想把工作当做一个纯纯为“讨饭”的方式，诚然填饱肚子很重要，所以我前面也说了自己的职业规划，在能填饱肚子的基础上，我想做一些我自己觉得更有意义的事情&lt;/p&gt;
&lt;p&gt;对于计算机的热爱并不是一种坏事，我可以把它和我所从事的学科结合起来，去成就我所做的工作&lt;/p&gt;
&lt;h2&gt;生物学就业并不是很好，以后打算怎么办？&lt;/h2&gt;
&lt;p&gt;这确实是一个很现实、也不可逃避的问题，从近期来看，我打算考一个高中的教师资格证，依靠师范大学的名头和“双一流”的优势，再不济应该可以去高中当一名生物老师（这也的的确确是我热爱和崇尚的职业&lt;/p&gt;
&lt;p&gt;如果可以的话我想进一步深造，去学习自己感兴趣的生物学领域，做自己感兴趣的事情是总不会感觉累的，相反有一种终于“干爆”最终 Boss 狗头的爽感&lt;/p&gt;
&lt;p&gt;不过以后的事情就以后再考虑吧，先好好面对眼前的挑战！&lt;/p&gt;
&lt;h2&gt;转入生科院学习后有何感触？&lt;/h2&gt;
&lt;p&gt;越来越感觉自己了解知识的浅薄，生物学是无穷无尽的，我很庆幸自己坚持转专业的这个选择，有机会进入生科院系统地学习生物学知识。如果我没有转入成功，就算以后有机会从事与生物学相关的工作（比如说研究生跨考或者做一些相关的交叉学科研究），我也总是站在生物学大厦门口却没办法进入&lt;/p&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;我想引用自己在《人工智能导论》课程结课论文中的一句话来总结2024自己在本专业的感想：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不仅仅是生科，一些依赖转型发展或者 CS 技术的交叉学科似乎都面临着这样的问题，大家都希望借助 CS 来帮助本专业的研究，这固然是一件好事，但是对于人才的培养这本身是矛盾的 —— 一个好的生物学家很难又成为一个计算机科学家，很难创造出比较独立/个性化的算法，很多都是利用计算机科学家已经研究得非常透彻的算法，这样的话其实存在着知识的“滞后性”，没办法把世界上最先进的两种成果马上融合起来，去创造出更好、更前沿的东西。&lt;/p&gt;
&lt;p&gt;跨学科的合作或者发展固然是无比重要的，未来也需要更多的计算机科学家投身于生物科学的研究，生物学家也要利用好计算机这一工具，要努力提升自己的 CS 水平。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;2025年也要好好加油，感谢刘先生和谭女士对本项目的大力支持，你们是我坚强的后盾&lt;/p&gt;
&lt;h1&gt;2024 回首&lt;/h1&gt;
&lt;h3&gt;一月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SkZWNFg0dlpCdUV6aUR4Z291MnFBVVV0eG5vTmVwRXc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;二月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=NkllUGcvVmoxZ0pBNFJ1cHVKekhremF1VzR3Z0UyTDg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;三月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=d3RSUGJzOE9xZndndVJGdm43VDIvK3lOTEMyK2lHbEk=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;四月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OGEzR3ZuRkdnVnM3V1lCemFlUDJQMEpYT2gxTk5vbTA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;五月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=cytqb2NnQWlGTExnem5TeE1CaW5lMnpEZVVXWUREclo=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;六月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OFNvUjEySTNlb2luR0ljbVUybU0zNXRRamNWdXZjQUg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;七月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=OWJXdlZOcE9ja3daVjVOcWRQMUE2QXdiL0M2bzNsSU0=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;八月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=VDNvVjVmOTVhellGdGVVM1JyQXVpUkZIMVdYc1VEWWk=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;九月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=c1ZMSUV5WVVKSDBaTkhJM3FxaVd6MmIvUnpibjdrbGs=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;十月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=d0IyWHVQSXZiVWJDNDFzVmMrSGxwZ1JKa3Fac3RQVTg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;十一月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=dHNNY2xDSXltaXA4bDh3c0xSbGo0RGJGNlJ3QUJxN1M=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h3&gt;十二月&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=MmRpVHFQWkpEbWxnVjVaNjlRVXBKd3NuZFpWTkdod3E=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.iMvbQYtp.webp"/><enclosure url="/_astro/hero.iMvbQYtp.webp"/></item><item><title>随想 - 读科大评课社区创始人博客有感</title><link>https://www.juniortree.com/blog/ustc-course-review</link><guid isPermaLink="true">https://www.juniortree.com/blog/ustc-course-review</guid><description>读评课社区创始人博客，从建站故事到专业选择，感受到追寻热爱的勇气与迷茫</description><pubDate>Sat, 07 Dec 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;读科大评课社区创始人博客有感&lt;/h1&gt;
&lt;p&gt;写这篇文章的契机大概来自于想做一个和 USTC 评课社区一样的东西，之前接触过一些 Discourse 的论坛，但是 Discourse 实在是太重了，而且没有很直观的展示，对于用户很不友好&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=eEtTTXVOUm1YTzgzVVVrUEVJMDNnZ3dLR3JzWUdJZ0cvQjQ9&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;在搜索结果中的第二项就是创始人学姐的博客，原本抱着想找一些技术细节的想法点了进去，没想到却收获到了更多有意思的东西&lt;/p&gt;
&lt;h2&gt;选课社区&lt;/h2&gt;
&lt;p&gt;在评课社区正式发布之前，学姐曾经给当时科大教务处的领导发过邮件，并且线下沟通过，这成为选课社区能存活的一个重要原因：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在评课社区网站正式发布之前，我还给当时科大教务处的领导发过邮件，主要是想提前和学校有关部门沟通好，让他们知道我们创建这平台的初衷是什么，平台的开发者都是谁，希望能够得到教务处的支持（至少不要反对我们）。毕竟我们的网站课程信息都是从教务系统抓取的，而且一开始服务器就在东区图书馆。后来教务处的负责人真的回了我邮件，和我约了一个时间在东区老图书馆当面交流。基本上得到的回复是，教务处不会干预我们的网站，不支持也不反对，让我们自己发展。现在想想，这次主动的和教务处沟通，也许得到了不错的效果。在后来7年时间，我们收到了若干次来自学校老师的投诉，但中科大从来没有以校方的身份干涉我们，让我们删除课程的负面评价。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在学校的这种“默许”的情况下，选课社区才能活下来，或者说，才能明目张胆地进行宣传&lt;/p&gt;
&lt;p&gt;在学姐的博客中，我们了解到在建站的初期，服务器甚至直接放在学校图书馆内&lt;/p&gt;
&lt;h2&gt;Life&lt;/h2&gt;
&lt;p&gt;关于评课社区就到此为止吧，我之前其实也写过很多有关学生社区的文章，这位学姐给我更多的，可能是她本科在科大时和我现在处境的某种相似，或者说“迷茫”&lt;/p&gt;
&lt;p&gt;学姐是物理竞赛进入的科大：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;之后就是没有保送成功，回到学校准备高考。因为高中翘课太多，要补好多基础课程，但是自己讨厌刷题讨厌应试，所以最后拿到了科大一本线（试点学院）协议，就选择去科大。为什么选择科大？因为一直以来我想学物理，而且据我了解，科大的物理学院在全国前三，而我自己的水平估计考不上清北，所以选择物理才选择科大。另外一方面，我选择科大就有半年自由支配的时间，可以做自己感兴趣的事情，而不是刷题准备高考的半年。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在进入大学之后，她参加了果壳的实习，尝试了除了自己小时候的职业规划以外的东西：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在去果壳之前，我从没想过自己长大后会去公司实习，也许因为小时候没什么见识，所以一直以为自己长大后是当一个老师或者科研人员什么的。去果壳实习之后，让我了解了公司工作的一些小的方面，当然一个月的实习并不能有足够的认识，但也足够颠覆我自己之前的看法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;会到大学学习之后，她开始感受到自己的学习压力负担很重，“现实与理想”之间发生了碰撞，做的事情和所学习的东西并不完全一致，得不到自己的满足感&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么放弃物理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;自己对物理应该没那么感兴趣&lt;/li&gt;
&lt;li&gt;我怕我学物理还要刷很多题&lt;/li&gt;
&lt;li&gt;不再认为搞科研是“神圣的”、“伟大的”，这不能成为你从事它的原因&lt;/li&gt;
&lt;li&gt;科研离生活太遥远了&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;为什么选择CS：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;我觉得我有很多想法，那些改变生活的想法，需要技术来实现，计算机专业能够提供给我需要的技术。&lt;/li&gt;
&lt;li&gt;对我来说，这是个全新的领域，我很有兴趣去了解。&lt;/li&gt;
&lt;li&gt;转计算机还受到LUG的影响&lt;/li&gt;
&lt;li&gt;我很欣赏黑客精神，自由、分享、合作&lt;/li&gt;
&lt;li&gt;我希望自己能够主动而不是被动的生活，我觉得计算机专业更可能让我获得自由职业？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我觉的最后一条是最关键的，我目前也不是很清楚自己的兴趣在哪，但是我想要尽量多的自由的时间，做自己想做的事情。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;之后她又觉得CS不是很符合自己的兴趣，便转身投向科技传播系，总结起来便是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;科技传播系的课程和理念和自己的兴趣更加吻合&lt;/li&gt;
&lt;li&gt;在这个系我可以有更多的时间和机会，做自己感兴趣的事情。而不是学习数学和计算机底层的知识。（比如算积分和poj上面的题目）&lt;/li&gt;
&lt;li&gt;我觉得在这个领域，我目前有一些积累，未来也会有很多创造&lt;/li&gt;
&lt;li&gt;目前学习太渣了，学习太被动了。&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;或者从旁人的眼光来看，觉得这位学姐的本科历程有点过于“颠沛流离”或者是“折腾”，但在我看来，这像是一个不断去尝试，去探索属于自己职业发展或者说兴趣的一种方式，不拘泥于世俗的眼光，而去真正发现自己所热爱的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我觉得自己对什么感兴趣才是重要的，专业只不过是帮助你更好得学习的。而对什么感兴趣，以及未来自己会做什么，想成为什么样的人，这些都是自己需要一直去思考去尝试的。如果哪天我找到了自己的兴趣所在（我常常苦恼这个问题），自己所做的事情既能获得正面反馈，又能让自己享受这个过程，我觉得很值得也很幸福。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;启示&lt;/h2&gt;
&lt;p&gt;我之前读别人博客偶尔也会产生很多感想，但从未如此这般强烈，一方面是为学姐的勇气和胆识所倾佩；另一方面想到自己去寻找自己热爱的事情就很开心，也算是得到“老前辈”的启示了&lt;/p&gt;
&lt;p&gt;说实话之前一段时间还有点不开心，因为自己似乎总是在做一些和生科毫无关系的，CS相关的事情，也开始怀疑自己下大功夫转来生科是不是真正正确的选择，但不管怎样，这都是寻找幸福道路上的，一个不可回头的岔路口，既然已经选择了，那就接受它吧，好好去寻找自己真正所热爱的，享受这个过程&lt;/p&gt;
&lt;p&gt;推荐阅读：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://jenny42.com/20150514-what-to-major-and-what-i-want/&quot;&gt;转专业风波与未来规划｜jenny42&apos;s life&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://jenny42.com/20220702-a-story-of-USTC-iCourse/&quot;&gt;USTC 评课社区背后的故事｜jenny42&apos;s life&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - 结束，生物进化学！</title><link>https://www.juniortree.com/blog/evolutionary-biology-course-review</link><guid isPermaLink="true">https://www.juniortree.com/blog/evolutionary-biology-course-review</guid><description>进化生物学课程浅尝辄止，名词繁杂令人困惑，但更让我敬畏生命科学的浩瀚</description><pubDate>Mon, 18 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;结束，生物进化学！&lt;/h1&gt;
&lt;p&gt;感觉CNU的《进化生物学》课程更像是一张入门体验卷&lt;/p&gt;
&lt;p&gt;首先从课程安排上来讲，从传统的演化生物学理论，达尔文进化论、拉马克的遗传观点、综合进化学，之后再到木村的中性演化学说，再过渡到现代的分子演化学说，最后讲了物种的演化和人类的起源&lt;/p&gt;
&lt;p&gt;总体上来说，课程的安排并没有想象中的那么深入，有可能是生科本科生第一节专业选修课的原因，课程总体还是偏向基础的，与高中接轨的&lt;/p&gt;
&lt;p&gt;其中名词解释特别多，尤其是一些相似的观点特别容易弄混，其中我觉得最具有代表性的应该就是”&lt;strong&gt;选择&lt;/strong&gt;“&lt;/p&gt;
&lt;p&gt;最开始接触”选择应该是讲达尔文进化论的时候，这时候强调的是”&lt;strong&gt;自然选择&lt;/strong&gt;“，即最适者生存。在达尔文理论中的选择有一种“你死我活”的感觉&lt;/p&gt;
&lt;p&gt;而在演化的驱动力的章节中，讲了&lt;strong&gt;平衡选择&lt;/strong&gt;，&lt;strong&gt;平衡选择&lt;/strong&gt;其实算得上是自然选择的一种，里面有一种&lt;strong&gt;频率依赖性遗传&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&gt;
&lt;li&gt;频率依赖性负选择：频率越高，所留后代越少&lt;/li&gt;
&lt;li&gt;频率依赖性正选择：频率越高，所留后代越多&lt;/li&gt;
&lt;/ol&gt;
&lt;/blockquote&gt;
&lt;p&gt;这里面也有选择在里面，在刚开始接触的时候，我粗糙地将&lt;strong&gt;负选择&lt;/strong&gt;理解为&lt;strong&gt;淘汰&lt;/strong&gt;；将&lt;strong&gt;正选择&lt;/strong&gt;理解为&lt;strong&gt;优势&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;但其实上面的这两种&lt;strong&gt;正/负选择&lt;/strong&gt;，都是个体适应环境的一种方式和手段&lt;/p&gt;
&lt;p&gt;上面说的可能很粗糙很粗糙，但是从中也能窥见进化生物学的名词解释之多和复杂（当然，这也绝对不是我对自己在期末考中的糟糕发挥寻找的借口～&lt;/p&gt;
&lt;p&gt;其实进入生科学习以来，我越来越感到自己对生命科学了解的贫瘠，反而更加敬畏了，在知识宝库的门口，我们都只是小孩&lt;/p&gt;
&lt;p&gt;我想起艾萨克·牛顿爵士临终前的一句话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我好像是一个在海边玩耍的孩子，不时为拾到比通常更光滑的石子或更美丽的 贝壳而欢欣鼓舞，而展现在我面前的是完全未探明的真理之海。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;保持谦卑，保持好奇&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;敬畏生命，崇尚学识&lt;/p&gt;
&lt;/blockquote&gt;</content:encoded><h:img src="/_astro/hero.qq4J6qYT.jpeg"/><enclosure url="/_astro/hero.qq4J6qYT.jpeg"/></item><item><title>游记 - 2024 - 天津</title><link>https://www.juniortree.com/blog/tianjing-2024</link><guid isPermaLink="true">https://www.juniortree.com/blog/tianjing-2024</guid><description>六点起床狂奔天津，一日暴走世纪钟、意风区和瓷房子，偶遇文艺小店，麦门永存后返京</description><pubDate>Thu, 07 Nov 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;于是我驻足。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;早上六点钟起床，六点十五洗漱完成从宿舍出发，原本以为时间相当充足，可还是低估了北京的通勤时间，一路狂奔，提前两分钟坐上了高铁，启程！&lt;/p&gt;
&lt;p&gt;半小时后按时到达天津站，一路上也没心情欣赏沿途的风景，咕噜咕噜睡了一下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=cldqT01PbGd4UFNFUVI1MFRPOENLS2lIN0NhWEVEVGE=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=dmg0WVpBR2Ftd0I1M2M0cFdPQ1U0VGlLUlFNZUl1WjY=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;下一站我们直接去了&lt;strong&gt;世纪钟广场&lt;/strong&gt;，在路上顺带吃了很有特色的小笼包&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SDZ0Z0RzRlNNc1hSR1Fxb0J2TUFCeG5iRUdVaHQremg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=dlFvYnpHUnRJT0dMd3BKa01JVlV4VElhVkNKcHlUL28=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后去到&lt;strong&gt;意大利风情区&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=WWRGbjk1NGpnNzFxRXBKUkptRTlEWDJoemIrOUc1QlE=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=QmJwK3FrSHhaRy9tT3U3ZExnNjRQRGs3bmlwNUc3MzA=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=VDlCeWhRSHdRSU01RGRPRjgyM25oRjNVKzNleWw2bUI=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=MHRwL0QwbjhmUFZOMFJEeWhocjZHRlNtcnJ0OU1WLzc=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;「可是妳忘了 我也沒記起」&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=c256a2tjY3hyMlhhaXgvcFpoUU8wd1pmaW4ySWsxcDg=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后参观了&lt;strong&gt;瓷房子&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=NzBHNHNDc05HcVJjRFNtb2VIaGpIN3VkUnBpSDUzY2g=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;当然我们没进去，在外面拍了几张照片就匆匆离开了，瓷房子外面有意思的地方很多，给我的印象有点像北京的南锣鼓巷&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.juniortree.com/app/hide.php?key=SDZLSzJTMXByUk44U3FhL21sMTVZMW5rWkpvcU5ENHM=&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;偶遇一家很有意思的咖啡店，店主似乎是一个摄影爱好者&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/109f922b266480a65e593048a257c57d.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/cd5de368f1875b3afc5a128e3351abf6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/f419830cb4dcd86919a2a329bb98e7db.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;另外一家买潮物的店，两张都很喜欢，遂都放上来&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/25f20c42584b7da20ffe7531863193b4.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/427a25ff7c2ec1bec4ba9981d0fd7d63.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;中午吃了麦丹劳！“麦门永存”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/378536da6af14c8cbb5147ab67b0fed7.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/e58aa965ba2e00c7ec518735fedd0383.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/e170141047a5d2032f966d15f7898351.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;返京是从滨海站出发的，路上看到铁轨，与周围黄色的树相辉映，有点像The Last of Us里面场景，还是很有意思的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/8ed52f4369295fd4b842d43a1615d5e8.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.DVmLyKPk.webp"/><enclosure url="/_astro/hero.DVmLyKPk.webp"/></item><item><title>游记 - 2024 - 铜仁</title><link>https://www.juniortree.com/blog/tongreng-2024</link><guid isPermaLink="true">https://www.juniortree.com/blog/tongreng-2024</guid><description>自驾贵州铜仁，雨中探访苗王城与大明边城</description><pubDate>Sat, 17 Aug 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;暑假有空，自驾从湖南出发，前往&lt;strong&gt;苗王城&lt;/strong&gt;和&lt;strong&gt;大明边城&lt;/strong&gt;。不巧的是高速路上突然下起了大雨，还挺吓人的&lt;/p&gt;
&lt;p&gt;这里刚刚经过贵州边界hhh 之前也是跑这条高速去的梵净山&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/3db077347506b8e095952f7633435e17.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;苗王城&lt;/h2&gt;
&lt;p&gt;刚开始去&lt;strong&gt;苗王城&lt;/strong&gt;的时候没找对地方，只在外面的茶园就停下来了，一度让我们以为&lt;strong&gt;苗王城&lt;/strong&gt;就只是一个茶园&lt;/p&gt;
&lt;p&gt;茶园很大，尤其是很整齐，来拍照的游客自然也不在少数，此时天刚好要下雨，变得雾蒙蒙远处犹有仙气&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/b9c5a88169c242a45694e26bea66e593.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/66b0f0c97b971a44a658300fb623a8bd.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;沿着导航给的那条路继续往里面走，便可以看到&lt;strong&gt;苗王城&lt;/strong&gt;的“庐山真面目”，这里便是大门&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/6c21dc4039ff18586f62a9a9f527cea6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;进入&lt;strong&gt;苗王城&lt;/strong&gt;需要买票，售票处在大门的右侧，买了票之后便可正式进入&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/13cfbef7b4de811ea3077347f18ba82a.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这条路的右边有一个广场，有一个类似于“鼓”的石碑，上面写了“&lt;strong&gt;中国苗王城&lt;/strong&gt;”，没想到这几个字居然是欧阳中石老师写的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/ca8d2a9778546c16adc4e3828b6d97c9.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;走进城门，左侧有人在打鼓欢迎游客，十分热情&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/3fecd28989fdcd86af47ea577344d8be.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;古城墙，绿松树，“苗王城”这几个字更具韵味&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/579c0361432393e1c34825fa0e5f36cc.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;穿过城门进入广场，大柱子，长廊，游客络绎不绝&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/1890899490ba8e958cc174da22e5272b.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/7e99bd88b86a4e45a0953fd00a04967a.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;苗寨比较具有风韵的应该就是小巷，感觉和湖南有些地方的古城落有点像&lt;/p&gt;
&lt;p&gt;“曲径通幽处，禅房花木深”，这里没有所谓“禅房”，只有一间间的苗族小屋&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/94c9ed188d8bb68eac23b64c47970050.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;我们在巷子里面穿行的时候，碰到了一个游客大哥，和我们说苗寨的酒特别香哈哈哈哈，还问我们有没有开车，劝我们去尝一尝，不过因为我们是自驾游出来的，就不得不放弃了这次的尝试机会&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/811f120d72571508fe93fef25bdf7ea6.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/f78f161cde7185f411f2f40ebe039cfa.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;苗语也很有意思，一路上导游教游客用苗语做回答，路上也有很多像这种“苗译汉译英”&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/0d4641dc493f2530f0b83cd56dd56ab2.webp&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;苗王府&lt;/strong&gt;算得上这次参观的重头戏，其整体的规格制度有点像北方皇宫的建筑特色，不过也融合了当地苗族建筑的艺术特点，感觉挺有意思&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/8e00407617110d840965cd543ace5212.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/c5f90300cafa9463a895103d8f114424.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;苗王城&lt;/strong&gt;依水而建，沿着小路可以一直走到码头，水是翠绿色的&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/062dd96ece9dd386c54a6ee4ff245e6d.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;大明边城&lt;/h2&gt;
&lt;p&gt;在浏览完&lt;strong&gt;苗王城&lt;/strong&gt;之后我们继续驱车前往&lt;strong&gt;大明边城&lt;/strong&gt;。&lt;strong&gt;大明边城&lt;/strong&gt;离铜仁市区较近，我们没有选择走高速，而是选择走国道前往，路上下起了倾盆大雨（还是有点吓人&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/4974f4940ae468c0e457e86951e5a9f9.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/d8f46bfc24168573280b9e0cd016acf1.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;之后在城内找了一个小店吃了酸汤鱼，也算是贵州特色，酸汤鱼的鱼肉不是一片一片的，而是一坨一坨的，里面还煮了很多西红柿，豆芽菜还有豆腐之类的&lt;/p&gt;
&lt;p&gt;吃饭旁边有一个小阳台，如果不下雨的话在旁边吃饭很有氛围&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/42f8e3dff3884efae073ea6fc1222244.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/82f604964cf8b7aac2f57383c2935c7c.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;这边风景独好~&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/f1bdfe1ee667c593afe3cafd1a31a62c.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/c6f2cdf047ed3925975fa8d16e61177c.heic&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;回去路上还偶遇农夫山泉灌装厂hhhh&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/7be0694f73c0a2f2c7541f300ab69748.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;以后有机会可以更深入地自驾贵州，还挺好玩的&lt;/p&gt;</content:encoded><h:img src="/_astro/hero.CSktu92M.webp"/><enclosure url="/_astro/hero.CSktu92M.webp"/></item><item><title>IStore 实现 SmartDNS + AdGuard Home IP 优选+广告屏蔽</title><link>https://www.juniortree.com/blog/smartdns-adguard-home</link><guid isPermaLink="true">https://www.juniortree.com/blog/smartdns-adguard-home</guid><description>iStore 结合 SmartDNS 和 AdGuard Home 实现 DNS 优化与广告拦截</description><pubDate>Tue, 30 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;参考自 &lt;a href=&quot;https://blog.csdn.net/tonyhi6/article/details/139212440&quot;&gt;openwrt 官方版 安装配置 AdGuard Home + smartdns 告别广告烦扰 教程 软路由实测 系列五&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;SmartDNS 和 AdGuard Home 都是用于优化 DNS 解析和提供广告拦截功能的工具，但它们各自有不同的特点和用途：&lt;/p&gt;
&lt;h2&gt;SmartDNS&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主要功能&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;提供 DNS 解析服务，旨在加速互联网访问和绕过地理限制。&lt;/li&gt;
&lt;li&gt;支持智能 DNS 缓存和解析，优化网站加载速度。&lt;/li&gt;
&lt;li&gt;通过配置不同的 DNS 服务器来提高解析效率和稳定性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;速度优化&lt;/strong&gt;：通过选择最佳的 DNS 服务器来提升访问速度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨地域访问&lt;/strong&gt;：能够帮助绕过地理限制，使用户可以访问受限内容。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;简易配置&lt;/strong&gt;：通常提供用户友好的配置界面和说明。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;AdGuard Home&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;主要功能&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;提供 DNS 解析服务，并附带广告拦截和隐私保护功能。&lt;/li&gt;
&lt;li&gt;支持对 DNS 请求进行过滤，阻止广告、恶意软件和跟踪器。&lt;/li&gt;
&lt;li&gt;具备用户自定义规则和白名单功能，允许精确控制过滤内容。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;特点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;广告拦截&lt;/strong&gt;：内置广告拦截功能，有效阻止网页和应用中的广告。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;隐私保护&lt;/strong&gt;：保护用户免受跟踪器的侵扰，增强隐私安全。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;易于配置和管理&lt;/strong&gt;：通过 Web 界面提供友好的管理和配置功能。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扩展性&lt;/strong&gt;：支持自定义过滤规则和黑名单/白名单设置，满足个性化需求。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;结合使用&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SmartDNS&lt;/strong&gt; 可以用于提高 DNS 解析速度和访问受限内容，而 &lt;strong&gt;AdGuard Home&lt;/strong&gt; 则可以提供额外的广告拦截和隐私保护。&lt;/li&gt;
&lt;li&gt;在配置上，您可以将 &lt;strong&gt;SmartDNS&lt;/strong&gt; 作为 AdGuard Home 的上游 DNS 服务器，结合两者的优点，提升网络体验和保护。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;本教程旨在同时使用&lt;strong&gt;SmartDNS&lt;/strong&gt;与&lt;strong&gt;Adgurad Home&lt;/strong&gt;来优化网络环境。&lt;/p&gt;
&lt;h2&gt;安装与配置 SmartDNS&lt;/h2&gt;
&lt;p&gt;在这里我使用&lt;strong&gt;iStore&lt;/strong&gt;来安装&lt;strong&gt;SmartDNS&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/5cfa602d3f56f31ae8aa5062bec30ef9.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;安装完成之后我们继续配置：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/d7bf9d442e72944889f477785854459d.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;缓存大小可以填大一点，有助于减小上游 DNS 请求的数量，尤其是现在阿里云的公共 DNS 限制 QPS，SmartDNS 的缓存策略有助于帮我们避免限制：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/fbaa42316a6eb6557b2f434c0e4e5ce0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;继续往下填写上游 DNS 服务器，这里是&lt;strong&gt;SmartDNS&lt;/strong&gt;请求的上游服务器，可以多填一点：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/006a9973bd1b5b7bc64e1fa3d5ab79b0.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;下面是我自己所使用的一些公共 DNS 服务器，尽量使用一些 &lt;code&gt;DoT&lt;/code&gt; 或者 &lt;code&gt;DoH&lt;/code&gt; 协议的 DNS 服务，能够避免挟持&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;https://dns10.quad9.net/dns-query
https://dns.google/dns-query
https://1dot1dot1dot1.cloudflare-dns.com/
dns.google
cloudflare-dns.com
dns.alidns.com
dot.pub
https://dns.alidns.com/dns-query
https://223.5.5.5/dns-query
https://223.6.6.6/dns-query
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这时候我们可以通过 &lt;code&gt;nslookup&lt;/code&gt; 指令来测试&lt;strong&gt;SmartDNS&lt;/strong&gt;服务的可行性：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/e4010cb4a42e425b926d66f98cdb2875.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;h2&gt;安装与配置 AdGuard Home&lt;/h2&gt;
&lt;p&gt;在这里我们不使用 Docker，直接使用 &lt;code&gt;opkg&lt;/code&gt; 包管理器安装：&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;language-bash&quot;&gt;opkg update
opkg install adguardhome
#启动
/etc/init.d/adguardhome start
/etc/init.d/adguardhome enable
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时我们可以通过 &lt;code&gt;http://IP:3000&lt;/code&gt; 进入管理界面&lt;/p&gt;
&lt;p&gt;在正式配置&lt;strong&gt;AdGuard Home&lt;/strong&gt;之前，我们要修改原 DNS 服务器的 &lt;code&gt;53&lt;/code&gt; 端口出来给&lt;strong&gt;Adguard Home&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/0ef222a04098d7ae5daf9cea20024763.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/396c2420b4cf79be4ee79d4a6e395722.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/fa9b6c61cf38a4cc6861d2ac6aaca7b4.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;此时回到&lt;strong&gt;AdGuard Home&lt;/strong&gt;配置主页就可以使用 &lt;code&gt;53&lt;/code&gt; 端口，但是由于 &lt;code&gt;80&lt;/code&gt; 端口被&lt;strong&gt;iStore&lt;/strong&gt;占用，你可以使用 &lt;code&gt;3001&lt;/code&gt; 端口代替，之后配置&lt;strong&gt;AdGuard Home&lt;/strong&gt;上游服务器，由于&lt;strong&gt;SmartDNS&lt;/strong&gt;的监听端口被替换成 &lt;code&gt;8053&lt;/code&gt;，删除其他的 DNS 服务器，在这里我们使用&lt;strong&gt;显式声明&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/fa0282ceee11349112e443448937a45a.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;因为&lt;strong&gt;SmartDNS&lt;/strong&gt;具备缓存的功能，因此&lt;strong&gt;AdGuard Home&lt;/strong&gt;不需要缓存，在这里全删掉留空即可：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.050613.xyz/2024/11/e4042446da17ad6a9a8815cee0fc91db.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item><item><title>随记 - 《线条小狗》北京快闪</title><link>https://www.juniortree.com/blog/meltese-beijing</link><guid isPermaLink="true">https://www.juniortree.com/blog/meltese-beijing</guid><description>翘军训看线条小狗快闪，京味限定太可爱了</description><pubDate>Sun, 14 Jul 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&lt;strong&gt;线条小狗&lt;/strong&gt;快闪店终于来北京了，作为小狗迷的我肯定不能错过，于是偷偷翘掉最后一天军训，坐了一个多小时地铁去看了小狗&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.duckk.org/2024/11/dc3fd417cb8d9fd021ac6c150c8a049e.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;本次&lt;strong&gt;线条小狗&lt;/strong&gt;快闪店特意以“&lt;strong&gt;京味&lt;/strong&gt;”为主题，推出了几款北京的限定玩偶（还挺好看，尤其是有一个讲相声的让我印象十分深刻&lt;/p&gt;
&lt;p&gt;其中我个人觉得最有纪念意义的应该是这个类似于&lt;strong&gt;门票&lt;/strong&gt;的东西：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.duckk.org/2024/11/ae3a317b78e612ecae8d5921658eb1c3.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;谁看了不迷糊啊哈哈哈哈哈&lt;/p&gt;
&lt;p&gt;当然还有小狗手环：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://img.duckk.org/2024/11/98b5a2b5298f882597c5a39ced50cb0c.jpeg&quot; alt=&quot;&quot;&gt;&lt;/p&gt;
&lt;p&gt;当然还买了一些其他的很有意思的纪念品，这里就不一一展开了（还是想小狗能出价格便宜一点的手机壳👀️&lt;/p&gt;</content:encoded><h:img src="undefined"/><enclosure url="undefined"/></item></channel></rss>