<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>TripleCamera 的博客</title><link>https://triplecamera.github.io/</link><description>Recent content on TripleCamera 的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-Hans-CN</language><copyright>© 2026</copyright><lastBuildDate>Mon, 13 Apr 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://triplecamera.github.io/index.xml" rel="self" type="application/rss+xml"/><item><title>Arch Linux 如何检查上次更新包大小变化</title><link>https://triplecamera.github.io/posts/arch-liunx-pkg-size-diff/</link><pubDate>Mon, 13 Apr 2026 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/arch-liunx-pkg-size-diff/</guid><description>&lt;p&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="pacman 提示净更新大小为 -3710.18 MiB，十分反常"
 src="https://triplecamera.github.io/images/archlinux-pkgsizediff/intro.png"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;昨天晚上，我在滚系统的时候遇到了一个问题：如何得知哪些包的体积显著变小了？&lt;/p&gt;
&lt;p&gt;在滚完系统以后，我去群里提问。群友告诉我，应该在 &lt;code&gt;pacman.conf&lt;/code&gt; 里打开 &lt;code&gt;VerbosePkgLists&lt;/code&gt; 选项。——可是这样做只能对以后的更新产生效果，而我已经滚完系统了。那么，有没有办法知道上一次更新时包的大小变化呢？&lt;/p&gt;
&lt;p&gt;我最开始让 ChatGPT 帮我写了一个脚本。ChatGPT 从日志里提取出了上一次更新的包名，然后从缓存里查找更新前后的包，最后计算差值并排序。可是运行结果显示，&lt;code&gt;magma-cuda&lt;/code&gt; 是体积减小最多的包，减小了约 &lt;code&gt;75 MiB&lt;/code&gt;。——这并不能解释为什么净更新大小为负三千多兆。&lt;/p&gt;
&lt;p&gt;经过一番摸索，我找到了问题的原因：ChatGPT 比较的是压缩包的大小，而压缩前后的大小有时会有很大出入。我试着从压缩包里提取 &lt;code&gt;.PKGINFO&lt;/code&gt; 并读取其中存储的压缩前大小，最后发现是 &lt;code&gt;magma-cuda&lt;/code&gt; 这个包变小了 3 个多 G，这才和 pacman 汇报的结果对上了。&lt;/p&gt;
&lt;p&gt;以下是完整流程（注意，这个方法奏效的前提是更新前后的版本都残留在缓存中）：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;首先，从 &lt;code&gt;/var/log/pacman.log&lt;/code&gt; 里提取上次更新的日志，保存在另一个文件中，比如 &lt;code&gt;update-log&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;接下来，从日志中提取包名、旧版本、新版本这三个关键信息，保存在另一个文件中，比如 &lt;code&gt;update-log2&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ grep &lt;span style="color:#e6db74"&gt;&amp;#39;upgraded&amp;#39;&lt;/span&gt; update-log | sed -E &lt;span style="color:#e6db74"&gt;&amp;#39;s/.*upgraded ([^ ]*) \(([^ ]*) -&amp;gt; ([^ ]*)\)/\1 \2 \3/&amp;#39;&lt;/span&gt; &amp;gt; update-log2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;然后，去缓存中查找更新前后的包，提取 &lt;code&gt;.PKGINFO&lt;/code&gt; 并读取其中存储的压缩前大小，保存在另一个文件中，比如 &lt;code&gt;update-diff&lt;/code&gt;。&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-console" data-lang="console"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$ &lt;span style="color:#66d9ef"&gt;while&lt;/span&gt; read pkg old_ver new_ver
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;do
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; old_size=$(tar -xO --zstd -f /var/cache/pacman/pkg/$pkg-$old_ver-*.pkg.tar.zst .PKGINFO | grep size | awk &amp;#39;{ print $3 }&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; new_size=$(tar -xO --zstd -f /var/cache/pacman/pkg/$pkg-$new_ver-*.pkg.tar.zst .PKGINFO | grep size | awk &amp;#39;{ print $3 }&amp;#39;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; diff_size=$(( new_size - old_size ))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; echo $diff_size $pkg
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;done &amp;lt; update-log2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;运行时会出现一些奇怪的报错信息（“忽略未知的扩展头关键字‘……’”），我们不要管它。&lt;/p&gt;</description></item><item><title>数字泔水</title><link>https://triplecamera.github.io/posts/digital-slop/</link><pubDate>Thu, 19 Feb 2026 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/digital-slop/</guid><description>&lt;p&gt;2 月 12 日夜里，有位同学在我们学院的水群里转发了一则新闻：《&lt;a href="https://mp.weixin.qq.com/s/Ty2yyeBkUOZY7vbV2Jo_2A" target="_blank" rel="noreferrer"&gt;着力整治“数字泔水”等垃圾信息，网信办启动春节专项行动&lt;/a&gt;》。其中的“数字泔水”一词引起了我的注意。&lt;/p&gt;

&lt;h2 class="relative group"&gt;词义
 &lt;div id="词义" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%af%8d%e4%b9%89" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;什么是“数字泔水”？让我们引用一段原文对此的解释：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;&lt;!-- raw HTML omitted --&gt;（二）生成传播“数字泔水”等垃圾信息。&lt;!-- raw HTML omitted --&gt;一是利用AI等新技术新应用批量生成逻辑混乱、信息空洞、高度雷同的低质内容。二是滥用AI技术对经典动画、影视作品等植入低俗暴力内容，进行戏谑恶搞。三是对文学名著、历史典故等进行“魔改”，歪曲解构优秀传统文化。四是&lt;!-- raw HTML omitted --&gt;批量炮制“父母偏心”“婆媳矛盾”“姐弟互殴”等渲染家庭矛盾、代际冲突文案和剧情，&lt;!-- raw HTML omitted --&gt;营销炒作博取流量。五是利用AI批量生成所谓“鸡汤网文”“霸总爽剧”“专家科普”等图文、短视频内容，影响网民认知判断。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;虽然我现在很想对这个词展开进一步分析，但是考虑到大多数人（主要是我自己）对“泔水”一词不甚了解，我决定先简单介绍一下这个词：&lt;/p&gt;

&lt;h3 class="relative group"&gt;泔水 / slop
 &lt;div id="泔水--slop" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%b3%94%e6%b0%b4--slop" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;《现代汉语词典（第 7 版）》对“泔水”一词的解释如下：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;【泔水】（名）倒掉的残汤、剩饭菜和淘米、洗刷锅碗等用过的水。有的地区叫泔脚、潲水。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;——与英语中“slop”一词的含义相对应。根据 &lt;a href="https://dictionary.cambridge.org/dictionary/english/slop" target="_blank" rel="noreferrer"&gt;Cambridge Dictionary&lt;/a&gt; 的解释，这个词作名词时以下含义与“泔水”相近：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;liquid or wet food waste, especially when it is fed to animals&lt;/li&gt;
&lt;li&gt;food that is more liquid than it should be and is therefore unpleasant&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;根据&lt;a href="https://en.wiktionary.org/wiki/slop" target="_blank" rel="noreferrer"&gt;维基词典&lt;/a&gt;的解释，这个词作名词时以下含义与“泔水”相近：&lt;/p&gt;</description></item><item><title>计科生活笔记（五）</title><link>https://triplecamera.github.io/posts/living-in-6-part5/</link><pubDate>Sun, 01 Jun 2025 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/living-in-6-part5/</guid><description>&lt;h2 class="relative group"&gt;前端写的越烂的人，代码行数越多
 &lt;div id="前端写的越烂的人代码行数越多" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%89%8d%e7%ab%af%e5%86%99%e7%9a%84%e8%b6%8a%e7%83%82%e7%9a%84%e4%ba%ba%e4%bb%a3%e7%a0%81%e8%a1%8c%e6%95%b0%e8%b6%8a%e5%a4%9a" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;我发现，前端写的越烂的人，代码行数越多。&lt;/p&gt;
&lt;p&gt;因为他不知道怎么用最简单的方法去实现功能，他只是在那里不停的堆叠代码，直到代码能正常工作为止。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;

&lt;h2 class="relative group"&gt;谐音梗真是人类一项伟大的发明
 &lt;div id="谐音梗真是人类一项伟大的发明" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%b0%90%e9%9f%b3%e6%a2%97%e7%9c%9f%e6%98%af%e4%ba%ba%e7%b1%bb%e4%b8%80%e9%a1%b9%e4%bc%9f%e5%a4%a7%e7%9a%84%e5%8f%91%e6%98%8e" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;我终于知道为什么 &lt;a href="https://github.com/kuma-xx/BUAASE2025-PairProgramming" target="_blank" rel="noreferrer"&gt;2025 软工结对项目&lt;/a&gt;要叫《影蛇舞》了——因为 MyGo 有一首歌叫《&lt;a href="https://zh.moegirl.org.cn/%E5%BD%B1%E8%89%B2%E8%88%9E" target="_blank" rel="noreferrer"&gt;影色舞&lt;/a&gt;》。&lt;/p&gt;
&lt;p&gt;我觉得谐音梗真是人类一项伟大的发明。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;

&lt;h2 class="relative group"&gt;嗜睡
 &lt;div id="嗜睡" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%97%9c%e7%9d%a1" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&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;!-- raw HTML omitted --&gt;</description></item><item><title>追本溯源：探寻北航 MOS 操作系统的历史</title><link>https://triplecamera.github.io/posts/the-history-of-mos/</link><pubDate>Thu, 01 May 2025 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/the-history-of-mos/</guid><description>&lt;p&gt;我们都知道，北航的 MOS 操作系统是从 MIT JOS 移植过来的。（如果你还不知道这一点，说明你既没有认真读过&lt;a href="https://os.buaa.edu.cn/public/guide-book.pdf" target="_blank" rel="noreferrer"&gt;指导书&lt;/a&gt;、&lt;a href="https://os.buaa.edu.cn/team/" target="_blank" rel="noreferrer"&gt;宣发页&lt;/a&gt;等官方资料，也没有认真看过&lt;a href="https://www.zhihu.com/question/322261810" target="_blank" rel="noreferrer"&gt;知乎&lt;/a&gt;等非官方资料；甚至没有认真参与水群，因为水群里会有学长提到这一点。）&lt;/p&gt;
&lt;p&gt;但是我们都不知道的是：MOS 到底是衍生自 JOS 哪一年的版本？毕竟指导书里没有写，学长也没有说。我曾问过高阶助教，高阶说他也不知道，具体年份已经不可考了。他还说，要是发现了 MOS 的问题，大家就一起讨论，然后把它改掉。除非涉及到核心问题，不然考证完全没有必要。&lt;/p&gt;
&lt;p&gt;那么我为什么要去问高阶，又要费大力气去考证这个呢？原因如下：&lt;/p&gt;

&lt;h2 class="relative group"&gt;缘起
 &lt;div id="缘起" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%bc%98%e8%b5%b7" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;为什么我会想到考证 MOS 的历史呢？这还要从我重做课下任务说起。我去年做实验的时候，被代码和指导书的各种问题折磨，吃了不少苦；今年做助教的时候，自然希望能改掉实验课的诸多问题——但当时想要改掉的问题已经被我忘光光了。于是我认为，要想发现实验课的不足，就要设身处地，重做一遍课下任务。可惜的是，许多助教并不看重这一点，他们认为，既然去年吃了一遍苦，今年又何必再吃呢？于是他们就没有重做课下，自然也就少了很多发现。&lt;/p&gt;
&lt;p&gt;这不，在我重做课下的过程中，由于我对 MOS 理解的加深，越来越多的疑惑逐渐浮出水面。下面我举两个例子：&lt;/p&gt;
&lt;p&gt;第一个例子是 &lt;code&gt;KADDR&lt;/code&gt; 宏，这个宏的作用是将物理地址转换为 kseg0 虚拟地址，便于在内核态直接访问：&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;// translates from physical address to kernel virtual address
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#define KADDR(pa) \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;	({ \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;		u_long _ppn = PPN(pa); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;		if (_ppn &amp;gt;= npage) { \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;			panic(&amp;#34;KADDR called with invalid pa %08lx&amp;#34;, (u_long)pa); \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;		} \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;		(pa) + ULIM; \
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;	})&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;不过这个宏有一些问题：它没有对传入的 &lt;code&gt;pa&lt;/code&gt; 参数作类型转换。我在写 Lab2 的时候，就曾经往里面传了个 &lt;code&gt;Pte *&lt;/code&gt; 类型的值，结果 &lt;code&gt;KADDR&lt;/code&gt; 就直接对指针做了加法，导致计算结果发生了溢出。在我翻看我去年的代码时，才发现我去年在同样的地方被坑过一次，甚至还发了篇帖子求助助教。&lt;/p&gt;</description></item><item><title>编程随笔（五）</title><link>https://triplecamera.github.io/posts/programming-5/</link><pubDate>Tue, 01 Apr 2025 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/programming-5/</guid><description>&lt;p&gt;最近我们为 OSome 做了一次兼容性更新，使其能够兼容新主楼机房的 Firefox 70。&lt;/p&gt;

&lt;h2 class="relative group"&gt;背景
 &lt;div id="背景" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%83%8c%e6%99%af" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;上周四（3 月 27 日）是我第一次去新主楼上机，我被那里的环境震惊到了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;讲台上没有教师机，也不能统一控制所有机器开关机。&lt;/li&gt;
&lt;li&gt;助教说课程平台只能用 Chrome 浏览器访问，跳板机和 GitLab 仓库只能用火狐浏览器访问。（什么规则怪谈）&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;ul&gt;
&lt;li&gt;Windows 7 Service Pack 1&lt;/li&gt;
&lt;li&gt;Google Chrome 79.0.3945.117&lt;/li&gt;
&lt;li&gt;Mozilla Firefox 70.0.1&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;再看一下症状：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于课程平台，使用 Chrome 可以正常打开，使用 Firefox 打开后显示为空白。&lt;/li&gt;
&lt;li&gt;对于跳板机和 GitLab，使用 Firefox 可以正常打开，使用 Chrome 打开时提示证书错误，但是选择继续访问后可以正常访问。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;原因
 &lt;div id="原因" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%8e%9f%e5%9b%a0" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;使用 Firefox 打开课程平台，然后打开控制台，可以看到一条报错信息：&lt;/p&gt;</description></item><item><title>编程随笔（四）</title><link>https://triplecamera.github.io/posts/programming-4/</link><pubDate>Wed, 19 Mar 2025 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/programming-4/</guid><description>&lt;p&gt;不得不说我对 Vue 的理解还是太浅薄了。&lt;/p&gt;

&lt;h2 class="relative group"&gt;问题
 &lt;div id="问题" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%97%ae%e9%a2%98" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;这学期我担任 OS 开发组助教，任务之一就是制作宣发页。&lt;/p&gt;
&lt;p&gt;宣发页使用 Vue 3、Vuetify 3、Vue Router 4 制作。现在有个需求，需要让助教列表支持查看往届助教。由于我那段时间没空，这项任务就交给了另一位助教。经过几次修改后，这项功能合并到了主分支。下面是最小复现示例：&lt;/p&gt;
&lt;p&gt;&lt;a href="https://play.vuejs.org/#eNqFVttuG0UYfpVhg2RHyu46dpK2xgkuqBIgAVGJ4AIjNF6P7W12Z5aZWTuW5TuEWqpQoaoSJ6kSV3BVARcgJe3T1E25yivwz8wevU6IFHnnPx&amp;#43;/mbkVYp8694TVtvwwYlyiOfI4wZLcjiK0QEPOQlSbxKTWo4kAZ7EkPOE4rjnm7FT/05hIfzgr2lDnXFA5SI3gKHKMkx71GBUSJeJov2yuvqlF0gjr8A8UhJxYkLoJJT8nNgwhZDGV9doGuKptWltW4hIS70gSRgEYPFCCnYkNLP2ZHuw&amp;#43;5shjAeP7PSvifoj5rGclIkUhW/oyIAevHp&amp;#43;&amp;#43;fP7LxV9nF2dPXz97cfHbw5dnDy/OTi/P7y&amp;#43;fP14&amp;#43;OH3997Pli68vz3/qeGxADuZz9KaO3RnGQXCI5RgtFh1X8y7PH3TcVQeZ5zRytEFOJKHCZzRj6sAk7osCJaUhySAVF5JYPvp&amp;#43;&amp;#43;ceT5XffLB/9qRwB82r5iLMhEYJxUHz15MflP/eXP//67w9P/1cRC&amp;#43;ELial8e0Yw3282mruFAmYKIaExYhGhNqP2mE0IX5EppYw96U&amp;#43;w1F2ZI4gtEmhRMauV&amp;#43;rGUjCJ/AKJZLD0LTey&amp;#43;TxVRa4Ouadfy298hvY5r1KoxuKWJWUkiAOvIC8AN2O2P7BEnMyCOxtAgu7U&amp;#43;PqNl&amp;#43;2AXYhrqlPTBp0hVDEJD7WMyS8jqpCchP3e9wPeO4UzxxB9BaEesrlibwHPXZGA8rrYAyKoH5UZWmptQ8sGqFKQwsvkmKajJVcyy2hOfTLMAtf9UKrEB3yXzcBQe9yOJAkxHkLBUxRFExko0AyHY/7sGqAoAZCdg9VZBkMLmHEHpSmAHAikQJXC3n1usbwLbMHVvgPd5zzIzvYX0107P&amp;#43;iI3kbcERLGYUQ/VJziISRsJyX062kT7B2iukjbenCgW47omIBQBHrRRLd&amp;#43;h2pZhfBUTPmsbPfWngmkjbdiQFupnoaJFCE&amp;#43;xD5EkyeoUEHJdNIX5Z1MnYB6WgB4OJwHDA80H9Y5ram3q/oZto7GUkWi7LkTiHasNHQag7rHQxe6NW7uN7cathttsQDGazQaybdU&amp;#43;IWcatLpJ0WupkZhGxyOtnEB1t&amp;#43;XccLZvugPINKU5IdxQnhCqKRBPYis1i4QHgDEAykZWIFOSqT9QhdtrOs3d6ETnOyZqDdto56YmmAQzg3ApJOVfdx9&amp;#43;SELGZ&amp;#43;&amp;#43;BB/jZSohXj5gymFj4jASQIjnEI5JdeAWavvjyiTxMMbYkX6KuaNxO8y5plKipRmmozeBCWQA8kxmrQWIMrFJCoUzFwBd66HLJ7Cooq5SjX1UqjHBRqZyAUiosT7Z/xYqb3RibZrTXdai&amp;#43;qX2bROFzoR8O5ERXbECGOA5S29B3U0nAngh6zyh0XzsAdNUMQJhsz3pW3mVF7llrpzmR6O44LaeRzXNCdYgI7T5nU6GHDWAjtd0FIXdAJpKxQAD8&amp;#43;Ve5qAh295w9Z9sN/L4L1l1Ya3JStp3s0zVBX7mCYFHb0oACxYSSSVg8OvRHKwVTbfUDwj&amp;#43;OFJyUC4cDwIoPNE3ymGSBeWPiHa&amp;#43;h3xMnJthDTqBSE1JIRmI&amp;#43;InCFK/adTz4CXCswQzaIA5C&amp;#43;hnmXCBbEKkYj9k5MBxB2QU5H&amp;#43;77uP0D0kbiTvrCyQHU1tLwu7rvXpJ6H23J2ClVcwYHKa7T4PFu5CEG7ggoV/eIrrapfwYiKfvE9BM9XeKlK2Donea7qG8hR9w48WOGlWvXwJdwQqmZguOXsOtsta/EffGxK/g==" target="_blank" rel="noreferrer"&gt;Vue Playground&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;值得注意的是，最初的版本不长这个样子。在最初的版本中，“课程助教”选项卡是用 &lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt; 实现的，点击展开菜单，再次点击菜单项即可跳转——和官方文档里的&lt;a href="https://vuetifyjs.com/zh-Hans/components/tabs/#section-6ea251fa523083dc5355" target="_blank" rel="noreferrer"&gt;溢出到菜单&lt;/a&gt;示例几乎一模一样。但是每个 &lt;code&gt;&amp;lt;v-tab&amp;gt;&lt;/code&gt; 下方都有一个横条（文档中叫 slider），用来指示当前选中的选项卡。而 &lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt; 下方没有 slider，这就导致路由切换到“课程助教”页面时，slider 并不会自动更新，还位于其他选项卡下方：&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;于是这位助教改成了用 &lt;code&gt;&amp;lt;v-tab&amp;gt;&lt;/code&gt; 套 &lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt; 实现，并把交互逻辑改成了悬浮展开菜单、点击跳转。一位高阶助教又在此基础上进行小修，将 &lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt; 改为 &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&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;视觉上有一点不足是，目前被选中的菜单项（2024/2025）不会显示为选中状态。&lt;/li&gt;
&lt;li&gt;最后，代码写得非常不优雅。通过 CSS 让按钮和其他两个选项卡一样宽。&lt;code&gt;navigateTo&lt;/code&gt; 函数更是不知所云，结尾为什么要调用 &lt;code&gt;nextTick&lt;/code&gt;，这位助教也说不清——他说他是用 ChatGPT 写的。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;我希望能重新实现这个功能，目前有三个策略：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;上策：既使用 &lt;code&gt;&amp;lt;v-tab&amp;gt;&lt;/code&gt; ，又支持点击展开菜单。另外“课程助教”选项卡和其下的菜单项能够正确显示为选中状态。&lt;/li&gt;
&lt;li&gt;中策：为了支持点击展开菜单而放弃 &lt;code&gt;&amp;lt;v-tab&amp;gt;&lt;/code&gt; 的 slider，改回之前的 &lt;code&gt;&amp;lt;v-btn&amp;gt;&lt;/code&gt;。在此基础上，菜单项要能够显示为选中状态。&lt;/li&gt;
&lt;li&gt;下策：彻底放弃选项卡套列表的布局，改为在 &lt;code&gt;AssistantPage&lt;/code&gt; 内部做一个下拉菜单。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;第一版
 &lt;div id="第一版" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ac%ac%e4%b8%80%e7%89%88" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;

&lt;h3 class="relative group"&gt;简化
 &lt;div id="简化" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e7%ae%80%e5%8c%96" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;首先我查阅了 &lt;code&gt;&amp;lt;v-tab&amp;gt;&lt;/code&gt; 的 &lt;a href="https://vuetifyjs.com/zh-Hans/api/v-tab/" target="_blank" rel="noreferrer"&gt;API 文档&lt;/a&gt;，在里面找到了 &lt;code&gt;to&lt;/code&gt; 选项。这个选项对应 Vue Router 的 to 属性，用这个比自己实现函数方便多了。于是我把 &lt;code&gt;@click=&amp;quot;navigateTo(item)&amp;quot;&lt;/code&gt; 换成了 &lt;code&gt;:to=&amp;quot;`/assistant?year=${item}`&amp;quot;&lt;/code&gt;。&lt;/p&gt;</description></item><item><title>计科生活笔记（四）</title><link>https://triplecamera.github.io/posts/living-in-6-part4/</link><pubDate>Mon, 02 Sep 2024 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/living-in-6-part4/</guid><description>&lt;h2 class="relative group"&gt;开学第一天
 &lt;div id="开学第一天" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%bc%80%e5%ad%a6%e7%ac%ac%e4%b8%80%e5%a4%a9" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;今天是开学第一天。&lt;/p&gt;
&lt;p&gt;早上九点，我不情愿地起了床。走到食堂，看着琳琅满目的食物，不知道该吃什么。突然灵机一动：就吃泡面吧！&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;吃完泡面，就骑车去上课。今天唯一的一节课是上午三、四节的算法。老师念 PPT，超无聊。&lt;/p&gt;
&lt;p&gt;这是课上唯一一件有意思的事：老师问，什么是算法；有人答，$程序 - 数据结构 = 算法$。&lt;/p&gt;
&lt;p&gt;晚上六点我去食堂吃饭，七点要开组会。到了食堂又不知道该吃什么，突然灵光一现，想吃地下一层的肉酱面，但那里的队很长。我以为组会七点半到八点就能结束，于是打算开完会再去吃饭。结果没想到我们一边开会，一边闲聊，一直拖到九点才开完。我本来已经对食堂不抱希望了，结果过去一看，大部分窗口都打烊了，卖面的窗口却还开着。最后我如愿以偿吃到了肉酱面。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;晚上回到宿舍，看见班上的某位同学在楼道里窜来窜去，跟着他去了他们宿舍，才知道 Python 全英出分了，他正在四处打听成绩。他们宿舍的人分数都在 94–96 之间，又问我的成绩。我拿手机一查——94。于是他们就开始怀疑这门课是随机打分的了。不过不管是不是随机打分，他们都觉得这是门&lt;strong&gt;绝世烂课&lt;/strong&gt;。我大惊，问他们希望拿到多少分，他们说，拿到 95 分就算满意，拿到 98 分就算很满意。&lt;/p&gt;
&lt;p&gt;唉，保研。&lt;/p&gt;
&lt;p&gt;9 月 2 日（一）定稿&lt;/p&gt;

&lt;h2 class="relative group"&gt;食堂逸事
 &lt;div id="食堂逸事" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%a3%9f%e5%a0%82%e9%80%b8%e4%ba%8b" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;刚才我在吃饭，对面来了个小伙子，还挺有礼貌，问我这儿有没有人。&lt;/p&gt;
&lt;p&gt;我说没有，他就坐了。&lt;/p&gt;
&lt;p&gt;我看他穿着 &lt;!-- raw HTML omitted --&gt;2306&lt;!-- raw HTML omitted --&gt; 新定做的 T 恤，就问他是不是大二的，他说是。&lt;/p&gt;</description></item><item><title>计科生活笔记（三）</title><link>https://triplecamera.github.io/posts/living-in-6-part3/</link><pubDate>Sun, 07 Jul 2024 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/living-in-6-part3/</guid><description>&lt;h2 class="relative group"&gt;夏季学期的前夕
 &lt;div id="夏季学期的前夕" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%a4%8f%e5%ad%a3%e5%ad%a6%e6%9c%9f%e7%9a%84%e5%89%8d%e5%a4%95" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;TODO&lt;/p&gt;

&lt;h2 class="relative group"&gt;上课第一天
 &lt;div id="上课第一天" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%8a%e8%af%be%e7%ac%ac%e4%b8%80%e5%a4%a9" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;7 月 4 号星期四是上课的第一天。&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;hr&gt;
&lt;p&gt;下午，我正在宿舍写作业，室友突然说他电脑开不了机了。&lt;/p&gt;
&lt;p&gt;他按下电源键，电源键上的小灯亮起，但是屏幕不亮。昨晚还好好的，他说，我也没干什么呀。于是我们提着电脑，去了学校里的维修店。&lt;/p&gt;
&lt;p&gt;修电脑的人脸白白的，看着面善，穿了一件花色衬衫，平易近人的样子。他看了电脑的症状，又看了电脑的型号（Lenovo Legion R9000K2021H），得出了一个骇人的结论：要换 CPU。他说，拯救者的一系列型号用的都是 AMD 的 CPU，所以都有接触不良的问题。他先让我们摸键盘的中心位置，室友摸到那里有温度，他说是 CPU 在发热；接着，他用手掌按压那里，同时按下电源键——他说他是在试着把 CPU 压回去。不过，他的尝试失败了。&lt;/p&gt;
&lt;p&gt;然后他开出了价钱：换 CPU 要 1900。紧接着他用微信联系了一个自称是联想客服的人，问对方换主板需要多少钱，对方答 10000+。我的室友吓了一大跳。&lt;/p&gt;
&lt;p&gt;至于我嘛，我是不太信他这一通操作的，想去联想售后先看看。那个人也没阻拦我们，直接告诉我们南门就有官方维修店。我也在高德上查到了，可惜马上就关门了。室友说他不着急用电脑（现在他拿 Mac 当生产力，这台电脑只用来打游戏），于是我想明天先去售后看看。虽然电脑已经过了保修期，但咨询应该是免费的。于是室友听从了我的建议。&lt;/p&gt;
&lt;p&gt;我们把电脑放回了宿舍，然后一起吃麦当劳去了。麦当劳 7 件任选 72 元，不错。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;

&lt;h2 class="relative group"&gt;不上课的第一天
 &lt;div id="不上课的第一天" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%8d%e4%b8%8a%e8%af%be%e7%9a%84%e7%ac%ac%e4%b8%80%e5%a4%a9" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;TODO&lt;/p&gt;</description></item><item><title>计科生活笔记（二）</title><link>https://triplecamera.github.io/posts/living-in-6-part2/</link><pubDate>Wed, 20 Mar 2024 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/living-in-6-part2/</guid><description>&lt;h2 class="relative group"&gt;感冒
 &lt;div id="感冒" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%84%9f%e5%86%92" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;我感冒了。&lt;/p&gt;
&lt;p&gt;故事得从周六（3 月 16 日）说起。周六晚上，我洗完澡，擦身子的时候无意舔了一下嘴角，结果发现嘴角起了个小泡。&lt;/p&gt;
&lt;p&gt;当时我就慌了，因为以前嘴角也起过泡，每次都会变得很大，然后结痂。于是我喝了很多水。可是第二天下午有植树和爬山活动，活动期间我怕上厕所，就没喝多少水。回来的路上遇到晚高峰大堵车，车开了快两个小时才到。我和其他人一样，睡了一路，醒来时就感觉嗓子干。当天晚上参加了一个线上会议，会开了两个半小时，期间没怎么喝水，也没有去厕所。虽然会后补了不少水，但是周一早上醒来的时候，嗓子还是开始疼了。&lt;/p&gt;
&lt;p&gt;嗓子疼，吃饭也难受。幸好嘴角的泡结痂了，而且后来越结越大。那天我一整天都在疯狂喝水上厕所。等到周二早上，嗓子不疼了，但是开始流鼻涕了——感冒了。&lt;/p&gt;
&lt;p&gt;我一开始以为是半夜着凉了，但是半夜没有开窗户。后来我猜测，可能是当天早上为了上体育课，穿少了，出门被吹了。总之上完体育课，流鼻涕就变得严重起来。周二周三连流了两天鼻涕，用了好多抽纸。感冒上课精神涣散，容易走神；上机头脑不清，智商下线。周二晚上流着鼻涕写完研讨课的 PPT，周三晚上迷迷糊糊写完 OS 课下。&lt;/p&gt;
&lt;p&gt;我的一位室友和我同一天感冒，当天下午就请假在宿舍休息。他去校医院开了些西药，按时吃着，只是时不时咳嗽流涕，听着很是难受。&lt;/p&gt;
&lt;p&gt;周四过后是周五。到了周五，情况又有变化：流鼻涕变少了，但是咳嗽变多了，而且有了痰。当天晚上，一位已经回老家的室友发来微信，说他去医院看病测了新冠，阳了，让我们也测测。于是我去美团上买了抗原试纸，我们三个都测了一下。结果是他们两个都是阴性，我是弱阳。&lt;/p&gt;
&lt;p&gt;之后我继续吃药养病。本来感冒一天天好起来了，但是到了周日，由于我的室友半夜嫌热打开了窗户，导致我早上起床的时候着凉了，感冒又加重了。就这样继续吃药养病，一直到周五（26 日）才敢停药。之后的几天偶尔会突然间开始咳嗽，但嗓子一点也不疼……总而言之，感冒终于是好了。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;

&lt;h2 class="relative group"&gt;下水道
 &lt;div id="下水道" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%b8%8b%e6%b0%b4%e9%81%93" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;!-- raw HTML omitted --&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;我把这件事发到了舍友群里，舍友回了个“6”。下次应该惩罚他们徒手掏下水道:rage:。&lt;/p&gt;
&lt;!-- raw HTML omitted --&gt;

&lt;h2 class="relative group"&gt;你想活出怎样的人生
 &lt;div id="你想活出怎样的人生" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bd%a0%e6%83%b3%e6%b4%bb%e5%87%ba%e6%80%8e%e6%a0%b7%e7%9a%84%e4%ba%ba%e7%94%9f" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;我和三个室友订了 4 月 7 号晚上 8 点的场次。难得整个宿舍一起去看电影。&lt;/p&gt;</description></item><item><title>Arch Linux 害了他</title><link>https://triplecamera.github.io/posts/arch-linux/</link><pubDate>Tue, 06 Feb 2024 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/arch-linux/</guid><description>&lt;blockquote&gt;&lt;p&gt;既然选择了 Arch，便只顾风雨兼程。——周国平没说过这句话&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;我装了 Arch Linux。&lt;/p&gt;
&lt;p&gt;我之前上初中学网安的时候用过 Kali Linux，当时不懂事，用着玩的；上高中学 OI 的时候用过 NOI Linux，是基于 Ubuntu 的；还用过计组的虚拟机，是基于 Debian 的。今年寒假，我得到了升级硬盘、重装系统的机会，这也是一次安装双系统的机会。&lt;/p&gt;
&lt;p&gt;那么，装什么呢？虽然 Ubuntu 开箱即用、易于上手，但是我想挑战一下自己。之前看到、听到身边有些人在用 Arch Linux，我便暗暗记在心里，想装个 Arch Linux 挑战一下自己。于是，在&lt;a href="https://wiki.archlinuxcn.org/wiki/%E5%AE%89%E8%A3%85%E6%8C%87%E5%8D%97" target="_blank" rel="noreferrer"&gt;官方文档&lt;/a&gt;、&lt;a href="https://www.bilibili.com/video/BV1J34y1f74E/" target="_blank" rel="noreferrer"&gt;B 站视频&lt;/a&gt;和&lt;a href="https://zhuanlan.zhihu.com/p/596227524" target="_blank" rel="noreferrer"&gt;知乎教程&lt;/a&gt;的帮助下，我在（1 月 23 日）一天之内就装好了 Arch。&lt;/p&gt;
&lt;p&gt;但是，挑战才刚刚开始……&lt;/p&gt;

&lt;h2 class="relative group"&gt;高分屏适配（1.23 – 1.24）
 &lt;div id="高分屏适配123--124" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e9%ab%98%e5%88%86%e5%b1%8f%e9%80%82%e9%85%8d123--124" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;两次重启之后，黑白的终端和闪烁的光标并没有如期出现；取而代之的是一幅五彩斑斓的桌面。——KDE！屏幕中央的窗口上写着“Welcome to KDE Plasma”，正是对我安装成功最好的祝福。但是……这行字太小了。预装的 Windows 的缩放比例被设置成了 250%，而 KDE 对这一点全然无知。默认的 100% 缩放比例，让这个窗口显得如此渺小。&lt;/p&gt;
&lt;p&gt;于是在安装完成后，我做的第一件事情就是适配高分屏。&lt;/p&gt;
&lt;p&gt;&lt;a href="https://wiki.archlinux.org/title/HiDPI#KDE_Plasma" target="_blank" rel="noreferrer"&gt;ArchWiki&lt;/a&gt; 上对 KDE 的高分屏适配已经有了详细的教程，包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;调节全局缩放率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调节光标大小（X11 下光标大小不会跟随全局缩放率）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;调节面板高度（X11 下面板高度不会跟随全局缩放率）。&lt;/p&gt;
&lt;p&gt;这里有个小插曲：根据教程，需要设置环境变量来让面板高度跟随整体缩放。经过一番恶补，我终于学会了如何设置环境变量。但是，当我向 &lt;code&gt;~/.bash_profile&lt;/code&gt; 的末尾添加 &lt;code&gt;set PLASMA_USE_QT_SCALING=1&lt;/code&gt; 并重启系统之后，我被卡在了登录页面——输入密码之后会黑屏，然后回到登录页面。&lt;/p&gt;</description></item><item><title>编程随笔（三）</title><link>https://triplecamera.github.io/posts/programming-3/</link><pubDate>Sun, 26 Nov 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/programming-3/</guid><description>&lt;p&gt;Verilog 是一门非常宽松的语言。但这并不是件好事。&lt;/p&gt;
&lt;p&gt;有时我会在写 Verilog 的时候犯一些语法错误，我以为编译器会报警告，但是并没有。于是我就要花大力气去排查错误，最后为自己的粗心大意搭上好多时间。我觉得，如果编译器为此而报错，确实不太合适，但好歹报个警告吧？可是 Verilog 是一门非常宽松的语言，于是编译器就会偷偷地做隐式类型转换。实在是烦死了！&lt;/p&gt;
&lt;p&gt;在我写 P5 的时候，有一些模块间的接线忘记定义了。Verilog 没有报错误或警告，而是直接把它们当作了 1 位的 wire。不过幸运的是，这其中有些变量应该是多位的，在连接时产生了位宽不匹配的警告，这才使我注意到这个失误。&lt;/p&gt;
&lt;p&gt;Verilog 自动生成变量的行为是可以关闭的，使用预处理指令 &lt;code&gt;`default_nettype none&lt;/code&gt; 即可禁用其下方的自动生成。但是，某些依赖自动生成的地方也会受到影响（比如 &lt;code&gt;input&lt;/code&gt; 和 &lt;code&gt;output&lt;/code&gt;）。此时我们需要限定禁用自动生成的范围。以下是一个示例：&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-verilog" data-lang="verilog"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;module&lt;/span&gt; Example (
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;input&lt;/span&gt; ...,
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#66d9ef"&gt;output&lt;/span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;`default_nettype&lt;/span&gt; none
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ...
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;`default_nettype&lt;/span&gt; &lt;span style="color:#66d9ef"&gt;wire&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;endmodule&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;转眼到了 P6。我从周六晚上开始写 P6，一直写到凌晨两点；第二天起床接着写，一直写到快要吃晚饭才写完。当时测试样例过了，但是弱测没过。眼看着时间快不够了，我三两下吃完了晚饭，然后就蹬着单车直接去找助教了。（其实助教推荐的做法是自己构造测试数据，然后通过官方的 Analyzer 来评判测试数据的强度，从而不断改进测试数据，最终找出 CPU 中的 bug。）&lt;/p&gt;
&lt;p&gt;助教帮我从八点 de 到九点，de 出了两个特别低级的错误。一是我将转发信号常量（常量写在 &lt;code&gt;constants.v&lt;/code&gt; 里）从两位扩展到了三位，但是相应的接口都还是两位。于是在作比较的时候发生了隐式转换，最高位被裁掉了。二是我的 DM 有一个接口没有接线，当时预留了接口却没有准备好有关的信号，等到准备好信号之后却把接线的事情忘了。出人意料的是，仿真时 ISE 没有报一个警告。&lt;/p&gt;
&lt;p&gt;当助教帮我 de 完 bug 的时候，教室里就剩一两个人了，助教们要收工了。看助教忙到这么晚，我感觉有些对不起助教。于是我问助教如何才能让 ISE 的语法检查更严一些。助教告诉我，可以试试综合。于是我试着点了一下综合，结果五彩斑斓的调试信息夹杂着花式警告顿时喷涌而出。但是呢，综合的缺点是耗时比较长，所以助教建议在 P8 以前不要综合。&lt;/p&gt;
&lt;p&gt;我去隔壁宿舍请教了一位大佬，大佬说他知道的唯一的办法也是综合 orz&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;周六下午，我的室友发微信问我有关转发的事情。原来他正在重写 P5 课下。当时正巧我也在重构 P5，于是就和他讨论了起来。&lt;/p&gt;</description></item><item><title>笸篮花</title><link>https://triplecamera.github.io/posts/alcea-rosea/</link><pubDate>Sat, 07 Oct 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/alcea-rosea/</guid><description>&lt;!-- raw HTML omitted --&gt;
&lt;!-- raw HTML omitted --&gt;
&lt;p&gt;我们推着姥姥到院子里散步的时候，她指着一丛鹤立鸡群的花，说这是 pú lán 花。&lt;/p&gt;
&lt;p&gt;我用手机扫了一下，发现这是&lt;strong&gt;蜀葵&lt;/strong&gt;（&lt;em&gt;Alcea rosea&lt;/em&gt;）。仔细看来，它长得笔直而坚挺，有些甚至比人还高。它那宽大的叶子集中在下部，像张开的手掌。而花瓣和果实，都挂在高挑的枝头上。它的花瓣是鲜艳的粉色，它的果实是扁平的圆盘。&lt;/p&gt;
&lt;p&gt;可是我没有查到 pú lán 这两个字怎么写。家里有长辈写下了“簠簋”这两个字，可是它们不读 pú lán，它们读 fǔ guǐ。&lt;/p&gt;
&lt;p&gt;转眼到了十月，十一的闲暇给了我重拾这些琐事的机会。我在偶然间发现，如果在搜索“pulan”时加入“方言”二字，就能搜到“笸篮”这个词。但是这个词并不读 pú lán，而是 pǒ lán。下面的这篇文章提供了一些线索：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;笸（po）篮：小时候经常在各家里见到的，一种竹编的用来盛放剪刀、针线、碎步条等杂物的器具，圆盆形，直径约30多厘米，有的外面还有油漆；关中有的地方读作pulan；&lt;/p&gt;
&lt;p&gt;——《&lt;a href="https://mp.weixin.qq.com/s/3-JwYvvOlkAdpXpMCb6POQ" target="_blank" rel="noreferrer"&gt;陕西人常说的一百字，你能写出几个&lt;/a&gt;》&lt;/p&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;p&gt;又称“放花”。一般于春节或元宵节等喜庆节日放焰火。洋县磨子桥焰火自清代以来为最著名者，曾奉调入京参加国庆焰火晚会。主要有竿子花、笸篮花、马花、冲天炮、满天星、流星赶月、闹龙宫、火树银花、连珠炮等160多个品种，五光十色，绚丽多彩。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;这是出现次数最多的搜索结果，原因在于这篇文章已经被转载到泛滥，以至于无法查证来源了。除此之外只剩以下几处零星的提及了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;……用牛皮纸、白杉纸、皱纹纸、有光纸剪的窗花、炕窑花、窑顶花、纸缸花、笸篮花……&lt;!-- raw HTML omitted --&gt;——《&lt;!-- raw HTML omitted --&gt;&lt;a href="http://www.qingyangwang.com.cn/content/2022-08/15/content_581925.htm" target="_blank" rel="noreferrer"&gt;华池县志愿服务实践活动助力非遗文化传承&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;》&lt;/li&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;……这条路两边无数“笸篮花”热情欢迎……&lt;!-- raw HTML omitted --&gt;——《&lt;!-- raw HTML omitted --&gt;&lt;a href="https://www.sohu.com/a/160232619_753988" target="_blank" rel="noreferrer"&gt;感情记忆|避暑龙潭社区之断想&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;》&lt;/li&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;……妈妈在民国年间用最廉价的本贡纸和毛笔画下的母本花样、纸缸花、笸篮花、帽盒花、壁斗花……&lt;!-- raw HTML omitted --&gt;——《&lt;!-- raw HTML omitted --&gt;&lt;a href="http://sino.newdu.com/m/view.php?aid=59264" target="_blank" rel="noreferrer"&gt;母亲与窑洞 不该忘记的“中国女红”&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;》&lt;/li&gt;
&lt;li&gt;&lt;!-- raw HTML omitted --&gt;我印象最深的是初夏，门前院子和地的交界处，粉色的笸篮花（至今也不知学名）……&lt;!-- raw HTML omitted --&gt;——《&lt;!-- raw HTML omitted --&gt;&lt;a href="https://mp.weixin.qq.com/s/gYLChbiap_wEsH81-x0FbQ" target="_blank" rel="noreferrer"&gt;第1449期【沈秀芳系列散文】我家的老房子（上）&lt;/a&gt;&lt;!-- raw HTML omitted --&gt;》&lt;/li&gt;
&lt;li&gt;以及一部小说。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;或许这只是少数人的一种叫法吧。&lt;/p&gt;</description></item><item><title>编程随笔（二）</title><link>https://triplecamera.github.io/posts/programming-2/</link><pubDate>Fri, 18 Aug 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/programming-2/</guid><description>&lt;p&gt;眼下正是八月，当我们正在享受这美好而又漫长的暑假的时候，竟然收到了来自计算机组成原理课程团队的一份礼物——预习任务。&lt;del&gt;可喜可贺，可喜可贺。&lt;/del&gt;&lt;/p&gt;
&lt;p&gt;为了省去安装软件的麻烦，课程团队贴心地为我们准备了虚拟机：Debian 11 系统、LXDE 桌面环境。但是虚拟机在我的高分屏电脑上表现不佳。于是我花了好大功夫来调好它。&lt;/p&gt;
&lt;p&gt;助教告诉我：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;课程组提供的虚拟机以“轻量”为目标进行构建，选用的桌面环境为LXDE，其优点是占用资源少，缺点之一便是你遇到的——缺乏完善的图形界面支持，没有一键式的适配配置方案。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;但是为什么不换一个桌面环境呢？因为&lt;del&gt;我乐意&lt;/del&gt;教程里说：&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;在本地，我们可以换用 GNOME、KDE Plasma 等其他桌面环境，这类桌面环境的功能较默认的 LXDE 更齐全，兼容性更好。但往往占用的资源也较多，在虚拟化环境下性能表现较差，建议谨慎尝试。&lt;/p&gt;
&lt;/blockquote&gt;&lt;p&gt;注：以下配置适合于我的电脑，自己操作时请自行调整。&lt;/p&gt;

&lt;h2 class="relative group"&gt;修改 DPI
 &lt;div id="修改-dpi" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bf%ae%e6%94%b9-dpi" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;这一部分按照教程即可。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;向 &lt;code&gt;~/.Xresources&lt;/code&gt; 文件中写入：&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-text" data-lang="text"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;Xft.dpi: 283&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;然后 &lt;code&gt;sudo reboot&lt;/code&gt; 重启。&lt;/p&gt;

&lt;h2 class="relative group"&gt;修改文件管理器图标大小
 &lt;div id="修改文件管理器图标大小" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bf%ae%e6%94%b9%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86%e5%99%a8%e5%9b%be%e6%a0%87%e5%a4%a7%e5%b0%8f" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;打开文件管理器 PCManFM，在“编辑 &amp;gt; 偏好设置 &amp;gt; 显示 &amp;gt; 图标”里将图标大小调为原来的 2 倍。&lt;/p&gt;

&lt;h2 class="relative group"&gt;修改文件管理器字体大小
 &lt;div id="修改文件管理器字体大小" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%bf%ae%e6%94%b9%e6%96%87%e4%bb%b6%e7%ae%a1%e7%90%86%e5%99%a8%e5%ad%97%e4%bd%93%e5%a4%a7%e5%b0%8f" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;调高 DPI 会使文件管理器字体过大。右键桌面，在“桌面偏好设置 &amp;gt; 外观 &amp;gt; 文本 &amp;gt; 标签文本字体”中将“大小”调为 8。&lt;/p&gt;</description></item><item><title>游泳</title><link>https://triplecamera.github.io/posts/swimming/</link><pubDate>Fri, 07 Jul 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/swimming/</guid><description>&lt;p&gt;本学期，我报名了游泳 1，学习内容为蛙泳。通过十余周的学习，以及课下的多次练习，我成功掌握了蛙泳，并完成了各项课程任务。&lt;/p&gt;

&lt;h2 class="relative group"&gt;蛙泳
 &lt;div id="蛙泳" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%9b%99%e6%b3%b3" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;本学期最大的收获就是学会了蛙泳。蛙泳是最简单的游泳动作，但是学习蛙泳的过程很不容易：&lt;/p&gt;

&lt;h3 class="relative group"&gt;换气
 &lt;div id="换气" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%8d%a2%e6%b0%94" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;要熟练掌握蛙泳，首先需要熟练掌握换气。换气前后，头要沉在水里，脸部几乎与水面平行。换气时，转动脖子让头浮出水面，下巴贴着水面，身体不动。快速吐出上一口气（可以发出“啪”的声音），然后吸入一口气，头回到水下。&lt;/p&gt;
&lt;p&gt;需要注意的是：第一，换气时身体不要乱动（下水之后，换气时要保持双腿伸直夹紧），头不要抬得太高。如果身体过度倾斜，就容易失去平衡下沉。第二，换气速度要快。如果换气太慢，身体也会失衡下沉。换气太慢可能是因为对水产生了恐惧心理，不愿回到水下，需要多加练习克服恐惧。&lt;/p&gt;

&lt;h3 class="relative group"&gt;蹬腿
 &lt;div id="蹬腿" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e8%b9%ac%e8%85%bf" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;掌握换气之后，就要练习蹬腿了。蹬腿前，腿伸直，脚面绷直。蹬腿动作可分为：第一步，双腿折叠，大腿垂直于上身，小腿贴近大腿，双脚勾起。第二步，大腿不动，小腿展开，脚面外翻，大小腿成“W”形。第三步，向外蹬腿，腿蹬直后并拢，脚面转为绷直。第四步，不动，等待身体滑行一段距离。简而言之就是“收翻蹬夹”。&lt;/p&gt;
&lt;p&gt;需要注意的是：第一，蹬腿动作要规范，大腿不能过度折叠，小腿也不能过度展开，否则会影响发力。第二，蹬腿方向要正确，如果蹬腿方向太靠下，身体就会不由自主往上浮。第三，蹬腿速度不能过快，每蹬一次腿都要耐心等一下，以蹬一次腿换一口气为宜。&lt;/p&gt;

&lt;h3 class="relative group"&gt;划手
 &lt;div id="划手" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e5%88%92%e6%89%8b" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;最后需要学习的动作是划手。划手前，双手并拢，举到头顶上方最高处。第一步，双手翻掌，手背相对。第二步，胳膊伸直向两侧划手，划到肩宽之后，手臂缩回，双手在胸前合拢；此时应该抬头换气。第三步，双手合拢向前推出，推到头顶的位置；此时应该低头。第四步，手臂静止不动；此时应该蹬腿。&lt;/p&gt;
&lt;p&gt;需要注意的是，划到肩宽以后就要收手，不要划到体侧。&lt;/p&gt;
&lt;p&gt;换气、蹬腿、划手是蛙泳的三大动作，需要配合得当，多加练习，才能越游越快。&lt;/p&gt;

&lt;h3 class="relative group"&gt;我们
 &lt;div id="我们" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e6%88%91%e4%bb%ac" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h3&gt;
&lt;p&gt;我们先学习了蛙泳的换气动作，头泡在水里、手扒着岸边练习换气。之后学习蹬腿动作：先在垫上做动作，然后上半身趴在岸边、下半身浸在水里练习，最后手握浮板、腰系浮板下水练习，将换气与蹬腿结合起来。再然后学习划手动作：先在岸上练习，然后上半身浸在水里练习，最后撤掉手握的浮板，将三个动作结合起来下水练习。当动作熟练后，我们去掉腰上的浮板，独立完成游泳动作。&lt;/p&gt;</description></item><item><title>电子设计基础训练之无线电台</title><link>https://triplecamera.github.io/posts/basic-training-in-electronic-design/</link><pubDate>Fri, 26 May 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/basic-training-in-electronic-design/</guid><description>&lt;h2 class="relative group"&gt;PWM
 &lt;div id="pwm" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#pwm" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Arduino 可以直接输入模拟信号而无法直接输出模拟信号。但是，PWM 引脚可以通过调整占空比来输出不同幅值的电压，从而输出近似的模拟信号。（详见第 10 章）&lt;/p&gt;
&lt;p&gt;（实验 10.1.2）使用 PWM 引脚输出近似的模拟信号，并使用模拟引脚读取，得到的电压变化如下图。其中平滑的曲线为理论上输出的电压，反复振荡的曲线是输入引脚读取的电压，也就是 PWM 引脚实际输出的电压。&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="使用模拟引脚读取 PWM 信号"
 src="https://triplecamera.github.io/images/radio-pwm1.png"
 &gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p&gt;但是，这个实验的结果很不精确，因为模拟引脚读取速度十分有限。使用示波器可以得到更为精确的结果：&lt;/p&gt;
&lt;p&gt;&lt;figure&gt;&lt;img
 class="my-0 rounded-md"
 loading="lazy"
 decoding="async"
 fetchpriority="low"
 alt="使用示波器读取 PWM 信号"
 src="https://triplecamera.github.io/images/radio-pwm2.jpg"
 &gt;&lt;/figure&gt;
&lt;/p&gt;

&lt;h2 class="relative group"&gt;Timer
 &lt;div id="timer" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#timer" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;Arduino Uno 有三个定时器：Timer0、Timer1 和 Timer2。其中：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Timer0 用于 &lt;code&gt;delay()&lt;/code&gt;、&lt;code&gt;millis()&lt;/code&gt; 和 &lt;code&gt;micros()&lt;/code&gt; 等函数，并控制着 5、6 号引脚的 PWM 输出；&lt;/li&gt;
&lt;li&gt;Timer1 在基础实验中不使用，并控制着 9、10 号引脚的 PWM 输出；&lt;/li&gt;
&lt;li&gt;Timer2 用于 &lt;code&gt;tone()&lt;/code&gt; 函数，并控制着 3、11 号引脚的 PWM 输出。&lt;/li&gt;
&lt;/ul&gt;

&lt;h2 class="relative group"&gt;产生电磁波
 &lt;div id="产生电磁波" class="anchor"&gt;&lt;/div&gt;
 
 &lt;span
 class="absolute top-0 w-6 transition-opacity opacity-0 -start-6 not-prose group-hover:opacity-100 select-none"&gt;
 &lt;a class="text-primary-300 dark:text-neutral-700 !no-underline" href="#%e4%ba%a7%e7%94%9f%e7%94%b5%e7%a3%81%e6%b3%a2" aria-label="Anchor"&gt;#&lt;/a&gt;
 &lt;/span&gt;
 
&lt;/h2&gt;
&lt;p&gt;产生电磁波有两个条件：高频振荡信号和开放电路。后者可以通过接天线实现——当然，悬空的杜邦线也是可以的。下面着重说说前者：&lt;/p&gt;</description></item><item><title>编程随笔（一）</title><link>https://triplecamera.github.io/posts/programming-1/</link><pubDate>Sat, 25 Feb 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/programming-1/</guid><description>&lt;p&gt;昨天（2月24日）晚上，我在写作业之余，去隔壁宿舍逛了逛。&lt;/p&gt;
&lt;p&gt;刚一进门，原汁就向我求助。原来他在上学期的 C 语言课上学着写了一段生成全排列的代码，但是始终没有搞清楚代码的工作原理。代码如下：&lt;/p&gt;
&lt;div class="highlight-wrapper"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-c" data-lang="c"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;#include&lt;/span&gt;&lt;span style="color:#75715e"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span style="color:#75715e"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i ); &lt;span style="color:#75715e"&gt;// i 是正在执行的位数
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; num[&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// 存放每次排列
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; a[&lt;span style="color:#ae81ff"&gt;10&lt;/span&gt;]; &lt;span style="color:#75715e"&gt;// 统计该数字有没有被用过
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; n; &lt;span style="color:#75715e"&gt;// n 开成全局变量
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;main&lt;/span&gt;()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;scanf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d&amp;#34;&lt;/span&gt;, &lt;span style="color:#f92672"&gt;&amp;amp;&lt;/span&gt;n);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;( &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;void&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; i )
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;( i &lt;span style="color:#f92672"&gt;==&lt;/span&gt; n&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; cnt1&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; cnt1&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;n; cnt1&lt;span style="color:#f92672"&gt;++&lt;/span&gt; ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;%d &amp;#34;&lt;/span&gt;, num[cnt1]);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;printf&lt;/span&gt;(&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;\n&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt;( &lt;span style="color:#66d9ef"&gt;int&lt;/span&gt; cnt&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt;; cnt&lt;span style="color:#f92672"&gt;&amp;lt;=&lt;/span&gt;n; cnt&lt;span style="color:#f92672"&gt;++&lt;/span&gt; ){
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt;( a[cnt] &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ){ &lt;span style="color:#75715e"&gt;// 已经使用过这个数字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;			&lt;span style="color:#66d9ef"&gt;continue&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		num[i] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cnt; &lt;span style="color:#75715e"&gt;// 将这个数字存入答案数组
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		a[cnt]&lt;span style="color:#f92672"&gt;++&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 记录已经使用过这个数字
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		&lt;span style="color:#a6e22e"&gt;f&lt;/span&gt;( i&lt;span style="color:#f92672"&gt;+&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;1&lt;/span&gt; ); &lt;span style="color:#75715e"&gt;// 进行下一步递归
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;		a[cnt] &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt;; &lt;span style="color:#75715e"&gt;// 回溯后将 a 数组归零
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;	&lt;span style="color:#66d9ef"&gt;return&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;输入数字 &lt;em&gt;n&lt;/em&gt;，这个程序就能生成 1–&lt;em&gt;n&lt;/em&gt; 的全排列。&lt;/p&gt;</description></item><item><title>Hello World</title><link>https://triplecamera.github.io/posts/hello-world/</link><pubDate>Sun, 19 Feb 2023 00:00:00 +0000</pubDate><guid>https://triplecamera.github.io/posts/hello-world/</guid><description>&lt;p&gt;今天，我的博客搭建完成了。&lt;/p&gt;
&lt;p&gt;这个博客主要用来记录一些学习和生活方面的内容。除非另有声明，文章默认采用 &lt;a href="https://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh" target="_blank" rel="noreferrer"&gt;CC BY-NC-SA 4.0&lt;/a&gt; 协议发布。&lt;/p&gt;
&lt;p&gt;本博客使用 Hexo 搭建，托管在 GitHub Pages 上。优点是功能强大且完全免费，缺点是有一定的学习成本，而且有时网络会不稳定。&lt;/p&gt;
&lt;p&gt;本博客的文章分为文章（&lt;code&gt;post&lt;/code&gt;）和页面（&lt;code&gt;page&lt;/code&gt;）两类：前者多为短篇，时效性较强，一般会开启评论；后者多为中长篇，时效性较弱。&lt;/p&gt;
&lt;p&gt;大概就是这样。&lt;/p&gt;</description></item></channel></rss>