<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>空と海</title><description>この綺麗世界</description><link>https://blog.chiyo.uk/</link><language>zh_CN</language><item><title>下一步</title><link>https://blog.chiyo.uk/posts/2026/10/0702/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2026/10/0702/</guid><description>一篇由于睡不着随性写的文章，所以写的很乱，见谅</description><pubDate>Tue, 06 Oct 2026 18:06:52 GMT</pubDate><content:encoded>&lt;h1&gt;下一步&lt;/h1&gt;
&lt;p&gt;也是好久没有写博客了啊……那就写一点碎碎念吧。&lt;/p&gt;
&lt;p&gt;某种意义上我的大学已经过了一半，但出于一些&lt;a href=&quot;https://zsb.ecnu.edu.cn/37576/list.htm&quot;&gt;显而易见的原因&lt;/a&gt;，我的老同学们一部分在上个月美美保研上岸，另一部分则在猛猛学考研课程。这种情况下多少会被那帮家伙带着走而感到焦虑。而刚好自己也到了该思考当社畜/保/考/润的节骨眼上，不妨写篇博文作为对当下想法的记录，供过段时间的自己参考。&lt;/p&gt;
&lt;h2&gt;当社畜？&lt;/h2&gt;
&lt;p&gt;啊哈哈，完全没有考虑过的选项吧算是。拿学士学位出来找工作感觉只能找到一些传统软开方面的工作。但是软开方面感觉真的容易被 AI 取代[^1]，况且传统软开前后端技术栈我目前还算是一窍不通。&lt;/p&gt;
&lt;p&gt;但尽管如此，本着试试的态度，还是打算向 Google 和 MS 投一下实习看看（明年5-9月份那批），对转正不抱什么希望，能赚一笔就行。&lt;/p&gt;
&lt;h2&gt;推免？&lt;/h2&gt;
&lt;p&gt;前面几年确实没有考虑过保研的事情，一方面是因为&lt;a href=&quot;#%E6%B6%A6&quot;&gt;从高三开始的执念&lt;/a&gt;，另一方面是觉得自己保研只能保本校，而本人恰好又是个不喜欢在一个环境待太久的家伙，再加上不喜欢保研那种为了绩点卷生卷死的氛围，所以一直没考虑过。&lt;/p&gt;
&lt;p&gt;但是最近事情出了一些变化&lt;a href=&quot;%E8%A7%81%E6%88%91%E5%89%8D%E6%AE%B5%E6%97%B6%E9%97%B4%E5%8F%91%E7%9A%84%5B%E5%B8%96%E6%96%87%5D(https://voskey.icalo.net/notes/arrdko8brj)&quot;&gt;^2&lt;/a&gt;，导致我似乎产生了一些外保的机会，再加上「那位大人」的因素，我现在逐渐开始考虑保研的可能性了，所以本学期先稳住成绩，看看实习那边怎么说。&lt;/p&gt;
&lt;h2&gt;考研？&lt;/h2&gt;
&lt;p&gt;不想卷生卷死，PASS&lt;/p&gt;
&lt;h2&gt;跑路？&lt;/h2&gt;
&lt;p&gt;这是考虑过最多的方面了，从高三开始我就有润日[^3]的想法，因为高中一直困在四协的事情中，自然厌恶那种官僚气息，所以当时便向往「自由的学风」的京都大学。&lt;/p&gt;
&lt;p&gt;最开始的意向是&lt;a href=&quot;https://www.kuchem.kyoto-u.ac.jp/&quot;&gt;理学部化学教室&lt;/a&gt;&lt;a href=&quot;%E5%8F%97%E5%88%B0%E5%B0%8F%E6%97%B6%E5%80%99%E5%AE%B6%E9%87%8C%E4%BA%BA%E6%8A%8A%E5%88%9D%E4%B8%AD%E5%8C%96%E5%AD%A6%E6%95%99%E6%9D%90%E7%BB%99%E6%88%91%E5%BD%93%E8%AF%BE%E5%A4%96%E4%B9%A6%E7%9A%84%E5%BD%B1%E5%93%8D%EF%BC%8C%E6%88%91%E5%B9%BC%E5%84%BF%E5%9B%AD%E6%AF%95%E4%B8%9A%E7%9A%84%E6%97%B6%E5%80%99%E5%B0%B1%E4%BC%9A%E8%83%8C%E5%85%83%E7%B4%A0%E5%91%A8%E6%9C%9F%E8%A1%A8%E4%BA%86&quot;&gt;^4&lt;/a&gt;，本来大学报考志愿里也填了一半的化学，但「生化环材四大天坑」的名号实在是太响了，转专业的时候还是选择了泛 cs 方面。意向也变成了&lt;a href=&quot;https://mastodon.acm.org/@fos_kuis&quot;&gt;五十嵐・末永研&lt;/a&gt;&lt;a href=&quot;%E4%B8%8D%E9%82%A3%E4%B9%88%E8%B0%9C%E8%AF%AD%E4%BA%BA%E4%B8%80%E7%82%B9%E7%9A%84%E8%AF%B4%E6%B3%95%EF%BC%9A%5B%E3%82%B3%E3%83%B3%E3%83%94%E3%83%A5%E3%83%BC%E3%82%BF%E3%82%BD%E3%83%95%E3%83%88%E3%82%A6%E3%82%A7%E3%82%A2%E5%88%86%E9%87%8E%5D(https://www.fos.kuis.kyoto-u.ac.jp/)&quot;&gt;^5&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;后来在辅修了一段时间的数学后，发现自己对数学方面也有点兴趣&lt;a href=&quot;%E9%99%A4%E4%BA%86%E4%BD%A0%EF%BC%8C%E6%95%B0%E5%80%BC%E8%AE%A1%E7%AE%97%EF%BC%81&quot;&gt;^6&lt;/a&gt;，于是萌生了找寻数学-计算机交叉方向的念头，阴差阳错发现了&lt;a href=&quot;https://www.kurims.kyoto-u.ac.jp/~cs/indexj.html&quot;&gt;另一个意向去处&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;两个实验室中的教授都从事 &lt;a href=&quot;https://zh.wikipedia.org/wiki/%E7%A8%8B%E5%BC%8F%E8%AA%9E%E8%A8%80%E7%90%86%E8%AB%96&quot;&gt;PLT&lt;/a&gt; 方面的研究，在接触了一段时间后发现是自己能学下去（并感兴趣）的东西，尽管不知道能不能走下去、能走多远，但也算是大概找到了属于自己的方向。&lt;/p&gt;
&lt;h2&gt;闭环？&lt;/h2&gt;
&lt;p&gt;就此，围绕 PLT 方面我开始做了一些行动，&lt;a href=&quot;https://axi404.top/blog/uni-memoir2#%E4%B8%8A%E6%B5%B7%E5%AE%9E%E4%B9%A0&quot;&gt;从 Axi 那里了解到了 ailab 的实习&lt;/a&gt; ，巧的是 ailab 官网当时确实挂着形式化验证的日常实习招聘，遂投递，结果石沉大海，这学期再去看已经把岗位撤掉了，不过我还是从 Gemini 对话记录里把职位要求翻出来了，权当留作记录：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./ailab.png&quot; alt=&quot;ailab&quot; /&gt;&lt;/p&gt;
&lt;p&gt;上学期为了这个实习狂刷&lt;a href=&quot;https://softwarefoundations.cis.upenn.edu/&quot;&gt;软件基础&lt;/a&gt;，被默拒后不甘心，找到了另一个实习，但这次的老师和学长都很热情，最后也顺利通过&lt;a href=&quot;%E8%A7%81%E6%88%91%E5%89%8D%E6%AE%B5%E6%97%B6%E9%97%B4%E5%8F%91%E7%9A%84%5B%E5%B8%96%E6%96%87%5D(https://voskey.icalo.net/notes/arrdko8brj)&quot;&gt;^2&lt;/a&gt;。往后可能会在保密条约允许的范围内更新一点学到的 PLT 知识，给博客整点 tech 相关内容。&lt;/p&gt;
&lt;h2&gt;当下？&lt;/h2&gt;
&lt;p&gt;不管怎么说，先做两手准备吧，一边维持住成绩来保证自己可以拿到保研资格，一边学日语英语，对着募集要项准备专业课。暑假的时候&lt;a href=&quot;https://voskey.icalo.net/notes/aqkyhj2ufh&quot;&gt;幡然醒悟&lt;/a&gt;
报了年底的 N3 考试，不管是为了自己还是为了那位大人，都得尽力去学了。至于以后的路究竟怎么走，大概元旦或者寒假我也能得到自己的答案了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;好久没有这样想写什么写什么了，真是爽啊…………&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;[^1]: 我已经两次误判 AI 的发展趋势了（第一次是高考的时候误判了对计算机的影响，第二次是暑假前误判了对数学的影响）希望这不会是第三次&lt;/p&gt;
&lt;p&gt;[^3]:
&amp;gt; 实习线上面试
&amp;gt;
&amp;gt; 老师：“你为什么打算去日本？这个方面欧洲那边会强一些。”
&amp;gt;
&amp;gt; 我：“因为经济（笑”
&amp;gt;
&amp;gt; 老师：“也有日本文化方面的原因吧，我看你的 Github 主页是日文名”
&amp;gt;
&amp;gt; 我：“呃是这样”
&amp;gt;
&amp;gt; 会议室里顿时充满了快活的气氛&lt;/p&gt;
</content:encoded></item><item><title>NULL</title><link>https://blog.chiyo.uk/posts/2026/04/0815/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2026/04/0815/</guid><description>就算偶而會碰到好事，活著還是沒有意義的。</description><pubDate>Wed, 08 Apr 2026 07:27:09 GMT</pubDate><content:encoded>&lt;h1&gt;无题&lt;/h1&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;
</content:encoded></item><item><title>MIT18.01-Exam1</title><link>https://blog.chiyo.uk/posts/2026/04/0314/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2026/04/0314/</guid><pubDate>Fri, 03 Apr 2026 06:47:41 GMT</pubDate><content:encoded>&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;(10 pts.) Find the tangent line to $y = \frac{1}{3}x^2$ at $x = 1$&lt;/p&gt;
&lt;p&gt;Since $y&apos; = \frac{2}{3}x$.&lt;/p&gt;
&lt;p&gt;&lt;s&gt;We have $\sout{y(0) = \frac{1}{3} \cdot 0^2 = 0}$ and $\sout{y&apos;(0) = \frac{2}{3} \cdot 0 = 0}$.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;Then $\sout{y - y(0) = y&apos;(0)(x - 0) \Rightarrow y - 0 = 0 \cdot (x - 0) \Rightarrow y = 0}$.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;&lt;s&gt;So the tangent line is $\sout{y = 0}$.&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;We have $y(1) = \frac{1}{3} \cdot 1^2 = \frac{1}{3}$ and $y&apos;(1) = \frac{2}{3} \cdot 1 = \frac{2}{3}$.&lt;/p&gt;
&lt;p&gt;Then $y - y(1) = y&apos;(1)(x - 1) \Rightarrow y - \frac{1}{3} = \frac{2}{3} \cdot (x - 1) \Rightarrow y = \frac{2}{3}x - \frac{1}{3}$.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find the derivative of the following functions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;(7 pts.) $\frac{x}{\sqrt{1 - x}}$&lt;/p&gt;
&lt;p&gt;$(\frac{x}{\sqrt{1 - x}})&apos; = (x(1-x)^{-\frac{1}{2}})&apos; = (1-x)^{-\frac{1}{2}} + (x \cdot (-\frac{1}{2})(1-x)^{-\frac{3}{2}}) = \frac{1-\frac{\cancel{3} 1}{2}x}{(1-x)\sqrt{1-x}}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(8 pts.) $\frac{\cos(2x)}{x}$&lt;/p&gt;
&lt;p&gt;$(\frac{\cos(2x)}{x})&apos; = \frac{-2x \sin(2x) - \cos(2x)}{x^2}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(5 pts.) $e^{2f(x)} = g(x)$&lt;/p&gt;
&lt;p&gt;$g&apos;(x) = (e^{2f(x)})&apos; = 2f&apos;(x)e^{2f(x)}$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(5 pts.) $\ln(\sin x)$&lt;/p&gt;
&lt;p&gt;$(\ln(\sin x)) = \frac{1}{\sin x} \cdot \cos x = \cot x$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(15 pts.) Find $\frac{\mathrm{d}y}{\mathrm{d}x}$ for the function for the function $y$ defined implicitly by $y^4 + xy = 4$ at $x = 3, y = 1$.&lt;/p&gt;
&lt;p&gt;$\frac{\mathrm{d}}{\mathrm{d}x}(y^4 + xy) = (4y^3)y&apos; + y + xy&apos; = y&apos;(4y^3 + x) + y$&lt;/p&gt;
&lt;p&gt;Since $y^4 + xy = 4$ and $\frac{\mathrm{d}}{\mathrm{d}x} 4 = 0$.&lt;/p&gt;
&lt;p&gt;We have $y&apos;(4y^3 + x) + y = 0$&lt;/p&gt;
&lt;p&gt;Then $\frac{\mathrm{d}y}{\mathrm{d}x} = y&apos; = -\frac{y}{4y^3 + x} = -\frac{1}{4 \cdot 1^3 + 3} = -\frac{1}{7}$ at $x = 3, y = 1$.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(15 pts.) Skipped.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(15 pts.) Let&lt;/p&gt;
&lt;p&gt;$$
f(x) =
\begin{cases}
ax+b, &amp;amp;x &amp;lt; 1 \
x^4 + x + 1, &amp;amp;x \ge 1
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;Find all $a$ and $b$ such that the function $f(x)$ is differentiable.&lt;/p&gt;
&lt;p&gt;$$
f&apos;(x) =
\begin{cases}
a, &amp;amp;x &amp;lt; 1 \
4x^3 + 1, &amp;amp;x &amp;gt; 1
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;So we have&lt;/p&gt;
&lt;p&gt;$$
\begin{cases}
ax+b = x^4 + x + 1\
a = 4x^3 + 1
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;at $x = 1$.&lt;/p&gt;
&lt;p&gt;Then&lt;/p&gt;
&lt;p&gt;$$
\begin{cases}
a \cdot 1 +b = 1^4 + 1 + 1\
a = 4 \cdot 1^3 + 1
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;And we can get $a = 5, b = -2$.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Evaluate these limits by relating them to a derivative.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;(5 pts.) Evaluate $\lim_{x \rightarrow 0} \frac{(1 + 2x)^{10}-1}{x}$&lt;/p&gt;
&lt;p&gt;$\lim_{x \rightarrow 0} \frac{(1 + 2x)^{10}-1}{x}
= 2 \lim_{x \rightarrow 0} \frac{(1 + 2x)^{10}-1^{10}}{2x}
= 2 (t^{10})&apos;|&lt;em&gt;{t = 1}
= 20 t^9|&lt;/em&gt;{t = 1}
= 20$&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(5 pts.) Evaluate $\lim_{x \rightarrow 0} \frac{\sqrt{\cos x}-1}{x}$&lt;/p&gt;
&lt;p&gt;$\lim_{x \rightarrow 0} \frac{\sqrt{\cos x}-1}{x}
=\lim_{x \rightarrow 0} \frac{\sqrt{\cos (0 + x)}-\sqrt{\cos 0}}{x}
=(\sqrt{\cos t})&apos;|&lt;em&gt;{t = 0}
=(-\frac{\sin t}{2\sqrt{\cos t}})|&lt;/em&gt;{t = 0}
=0$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;(10 pts.) Derive the formula $\frac{\mathrm{d}}{\mathrm{d}x} a^x = M(a)a^x$ directly from the definition of the derivative, and identity $M(a)$ as a limit.&lt;/p&gt;
&lt;p&gt;$$
\begin{aligned}
\frac{\mathrm{d}}{\mathrm{d}x} a^x
&amp;amp;= \lim_{\Delta x \rightarrow 0}\frac{a^{x + \Delta x} - a^x}{\Delta x} \
&amp;amp;= \lim_{\Delta x \rightarrow 0}\frac{a^{x}a^{\Delta x} - a^x}{\Delta x} \
&amp;amp;= \lim_{\Delta x \rightarrow 0}\frac{a^x(a^{\Delta x} - 1)}{\Delta x} \
&amp;amp;= a^x \lim_{\Delta x \rightarrow 0}\frac{a^{\Delta x} - 1}{\Delta x} \
&amp;amp;= M(a)a^x \
\end{aligned}
$$&lt;/p&gt;
&lt;p&gt;where $M(a) = \lim_{\Delta x \rightarrow 0}\frac{a^{\Delta x} - 1}{\Delta x}$&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content:encoded></item><item><title>水杉空间</title><link>https://blog.chiyo.uk/posts/2026/03/1710/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2026/03/1710/</guid><description>让我再试一次……</description><pubDate>Tue, 17 Mar 2026 02:28:24 GMT</pubDate><content:encoded>&lt;h1&gt;水杉空间：基于 Misskey 的校内 SNS 实现&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;[!NOTE]
这篇文章尚未完成，最近不是很有劲头，所以大概会持续完善&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;misskey-dev/misskey&quot;}&lt;/p&gt;
&lt;h2&gt;起因&lt;/h2&gt;
&lt;p&gt;暂略，现在不是很有精力回忆。&lt;/p&gt;
&lt;h2&gt;契机&lt;/h2&gt;
&lt;p&gt;契机有二，一是之前在&lt;a href=&quot;https://chariri.moe/&quot;&gt;茶栗栗&lt;/a&gt;那里看到了 Misskey 这个平台，觉得美观性不错，就记了下来，顺带找了一个实例注册了自己的账号，实际使用体验也不错。
二是在刷p大野史的时候顺着一系列链接刷到了&lt;a href=&quot;https://closed.social/&quot;&gt;闭社&lt;/a&gt;。闭社基于 Mastodon 实现，但个人不太喜欢 Mastodon 的 UI 。
刚好 Misskey 也兼容 ActivityPub 协议，就想着基于 Misskey 搭建本校内的闭社平台。&lt;/p&gt;
&lt;h2&gt;结构&lt;/h2&gt;
&lt;h3&gt;服务器&lt;/h3&gt;
&lt;p&gt;为了在免备案的前提下尽可能压缩成本，一开始的计划是弄个甲骨文云的 Always Free 计划。
但是貌似甲骨文云注册门槛相当的高，我一开始用中行的非人哉万事达借记卡没有通过，后来又去工行办了一张零额度的星座VISA信用卡，结果依然没有通过。&lt;/p&gt;
&lt;p&gt;后来在朋友刷b站的时候看到 &lt;a href=&quot;https://education.github.com/pack&quot;&gt;GitHub Student Developer Pack&lt;/a&gt; 可以领到免费的 AWS 服务器，就去看了下。
结果 AWS 没找到，倒是发现了这里可以拿到 &lt;a href=&quot;https://www.digitalocean.com/&quot;&gt;DigitalOcean&lt;/a&gt; 一年内 200USD 的免费额度。
开一个 2 核 2G 服务器是 18USD 一个月，200USD 刚好差不多用一年，那就你了。&lt;/p&gt;
&lt;p&gt;（我，学生，服务器送我.jpg）&lt;/p&gt;
&lt;p&gt;基本上在 Github 上通过学生认证后到 Developer Pack 页面找到 DO 然后根据提示领取就行。
需要注意的地方在于 Github 学生认证会检查定位与 IP ，在认证过程中不要使用 VPN 。&lt;/p&gt;
&lt;h3&gt;域名&lt;/h3&gt;
&lt;p&gt;cloudflare 注册即可，如果您搭建的是自己学校内的闭社，可以向闭社项目组申请 &lt;code&gt;xxxx.closed.social&lt;/code&gt; 域名。
我用的是自己的域名，所以不太清楚申请流程。&lt;/p&gt;
&lt;h3&gt;注册邮箱白名单&lt;/h3&gt;
&lt;p&gt;Misskey 默认筛选邮箱是黑名单制度，只能 ban 掉指定域名的邮箱，而校内 SNS 需要白名单制，即仅允许校内邮箱域名注册。&lt;/p&gt;
&lt;p&gt;本着保持对源码最小改动的原则，我们做了如下修改（笑）：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
if (!isBanned) {
 return {
   available: false,
   reason: &apos;banned&apos;,
  };
}
...
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;详见 Commit &lt;a href=&quot;https://github.com/ECNU-minus/misskey/commit/3b123a2786b48dc557e4735df3b108be01b9bc60&quot;&gt;&lt;code&gt;3b123a2&lt;/code&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;通过这个修改反转整个黑名单逻辑，使其拒绝所有不在所列邮箱域名内的注册请求，真的是相当粗暴wwwwwwww&lt;/p&gt;
&lt;h3&gt;运维&lt;/h3&gt;
&lt;p&gt;在 DO 那边关闭了除 22, 80, 443 之外所有端口的入站流量，确保安全。&lt;/p&gt;
&lt;h2&gt;后续计划&lt;/h2&gt;
&lt;h3&gt;移动客户端&lt;/h3&gt;
&lt;p&gt;这个真的很重要但我不会写orz&lt;/p&gt;
&lt;h3&gt;找回密码&lt;/h3&gt;
&lt;p&gt;这个似乎有点问题，暂时还没有解决&lt;/p&gt;
&lt;h3&gt;宣传&lt;/h3&gt;
&lt;p&gt;补药啊我社恐&lt;/p&gt;
</content:encoded></item><item><title>民法总论期末论文</title><link>https://blog.chiyo.uk/posts/2026/02/0321/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2026/02/0321/</guid><pubDate>Tue, 03 Feb 2026 13:10:00 GMT</pubDate><content:encoded>&lt;h1&gt;论诚信原则在民法中的地位与作用&lt;/h1&gt;
&lt;h2&gt;一、引言&lt;/h2&gt;
&lt;p&gt;诚信原则是民法的一项重要基本原则，被誉为民法的“帝王条款”。
诚信原则在社会治理、市场交易等场景下具有极强的规范意义。
我国现行《民法典》第七条明确规定了“民事主体从事民事活动，应当遵循诚信原则，秉持诚实，恪守承诺。”&lt;a href=&quot;%E3%80%8A%E4%B8%AD%E5%8D%8E%E4%BA%BA%E6%B0%91%E5%85%B1%E5%92%8C%E5%9B%BD%E6%B0%91%E6%B3%95%E5%85%B8%E3%80%8B%E7%AC%AC%E4%B8%83%E6%9D%A1&quot;&gt;^1&lt;/a&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;诚信原则最早起源于罗马法&lt;a href=&quot;%E9%83%AD%E5%A4%8D%E5%BD%AC%EF%BC%9A%E3%80%8A%E6%B0%91%E6%B3%95%E8%AF%9A%E5%AE%9E%E4%BF%A1%E7%94%A8%E5%8E%9F%E5%88%99%E4%B8%8E%E8%99%9A%E5%81%87%E8%AF%89%E8%AE%BC%E6%A3%80%E5%AF%9F%E7%9B%91%E7%9D%A3%E3%80%8B%EF%BC%8C%E8%BD%BD%E3%80%8A%E6%B1%9F%E8%A5%BF%E6%A3%80%E5%AF%9F%E3%80%8B2020%E5%B9%B4%E7%AC%AC5%E6%9C%9F%EF%BC%88%E6%80%BB%E7%AC%AC193%E6%9C%9F%EF%BC%89&quot;&gt;^2&lt;/a&gt;，
违背诚信原则的行为在罗马法中被认定为无效行为。&lt;a href=&quot;%E6%AF%9B%E5%B8%8C%E5%BD%A4%EF%BC%9A%E3%80%8A%E5%8F%A4%E7%BD%97%E9%A9%AC%E6%B3%95%E4%B8%AD%E7%9A%84%E8%AF%9A%E4%BF%A1%E5%8E%9F%E5%88%99%E3%80%8B%EF%BC%8C%E8%BD%BD%E5%8C%97%E4%BA%AC%E6%94%BF%E6%B3%95%E7%BD%912020%E5%B9%B410%E6%9C%8813%E6%97%A5%EF%BC%8C%3Chttps://www.bj148.org/wh/bl/sy/202010/t20201013_1586349.html%E3%80%82%3E&quot;&gt;^3&lt;/a&gt;
中国古代虽无对诚信原则在法律层面上的明确约定，
但也有着“民无信不立”、“仁义礼智信”等谚语，
在道德层面上要求人讲求诚信。&lt;/p&gt;
&lt;h3&gt;（二）近代法典化时期&lt;/h3&gt;
&lt;p&gt;进入近代，欧洲各国意识到系统性的法条在国家治理层面有着重要的作用，
开始编纂成文法典。这一时期产生了《法国民法典》与《德国民法典》两大民法典。
而诚信原则在其中均得到了继承与体现，
如《法国民法典》规定“契约应以善意履行之”&lt;a href=&quot;%E6%9D%8E%E6%B5%A9%E5%9F%B9%E3%80%81%E5%90%B4%E4%BC%A0%E9%A2%90%E3%80%81%E5%AD%99%E9%B8%A3%E5%B2%97%E8%AF%91%EF%BC%9A%E3%80%8A%E6%8B%BF%E7%A0%B4%E4%BB%91%E6%B3%95%E5%85%B8%EF%BC%88%E6%B3%95%E5%9B%BD%E6%B0%91%E6%B3%95%E5%85%B8%EF%BC%89%E3%80%8B%EF%BC%8C%E5%95%86%E5%8A%A1%E5%8D%B0%E4%B9%A6%E9%A6%861979%E5%B9%B4%E7%89%88%EF%BC%8C%E7%AC%AC152%E9%A1%B5%EF%BC%88%E7%AC%AC1134%E6%9D%A1%EF%BC%89&quot;&gt;^4&lt;/a&gt;，
《德国民法典》又将诚信原则拓展到债法的一般原则上，
在此之后的《瑞士民法典》更进一步将其确立为全法典的准则。&lt;/p&gt;
&lt;h3&gt;（三）中国法历程&lt;/h3&gt;
&lt;p&gt;在我国法治进程中，
《民法通则》、《民法总则》、《合同法》等法律均将诚信原则确立为一项基本原则&lt;a href=&quot;%E3%80%8A%E6%B0%91%E6%B3%95%E9%80%9A%E5%88%99%E3%80%8B%E7%AC%AC%E5%9B%9B%E6%9D%A1%EF%BC%9A%E2%80%9C%E6%B0%91%E4%BA%8B%E6%B4%BB%E5%8A%A8%E5%BA%94%E5%BD%93%E9%81%B5%E5%BE%AA%E8%87%AA%E6%84%BF%E3%80%81%E5%85%AC%E5%B9%B3%E3%80%81%E7%AD%89%E4%BB%B7%E6%9C%89%E5%81%BF%E3%80%81%E8%AF%9A%E5%AE%9E%E4%BF%A1%E7%94%A8%E7%9A%84%E5%8E%9F%E5%88%99%E3%80%82%E2%80%9D&quot;&gt;^5&lt;/a&gt;。
2020年发布的《民法典》作为对过往民事单行法的整合，于第7条规定了诚信原则，
奠定了这一原则在民事活动中作为基本原则的地位。&lt;/p&gt;
&lt;h2&gt;三、诚信原则在现行《民法典》中的体现&lt;/h2&gt;
&lt;h3&gt;（一）总则编&lt;/h3&gt;
&lt;p&gt;除上文所述《民法典》第7条之外，
民法典亦于第142条规定了解释意思表示时应基于诚信原则，
这一规定保证了行为人的意思可以以一种相对客观的形式得到公认的解释，
进一步保障了建立于意思表示上的一般民事行为得以正常进行。&lt;/p&gt;
&lt;h3&gt;（二）合同编&lt;/h3&gt;
&lt;p&gt;在合同编中，《民法典》第466条规定解释合同条款应当基于诚信原则。
同第142条类似，这一规定确保了合同可以得到客观的解释。
在此之后，《民法典》第500条规定了订立合同时违背诚信原则需承担民事责任、
第509条规定履行合同时应遵循诚信原则、
第558条规定了在合同关系结束后依照诚信原则需履行的义务。
这一系列法条涉及了合同自订立、履行、终止的全部阶段，
由此确保了合同关系始终遵循诚信原则。&lt;/p&gt;
&lt;h3&gt;（三）诚信原则于《民法典》其余部分的体现&lt;/h3&gt;
&lt;p&gt;除此之外，诚信原则于《民法典》其余各编中亦有体现，
如第222条实质上要求登记不动产时需遵循诚信原则，
第1043条夫妻应当互相忠实体现了在婚姻关系中的诚信原则，
第1125条表明在继承关系中应当遵循诚信原则等。&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;h2&gt;五、诚信原则在司法上的应用&lt;/h2&gt;
&lt;p&gt;在深圳市某甲科技有限公司、深圳某乙科技有限公司等侵权责任纠纷一案&lt;a href=&quot;%E6%B7%B1%E5%9C%B3%E5%B8%82%E6%9F%90%E7%94%B2%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E3%80%81%E6%B7%B1%E5%9C%B3%E6%9F%90%E4%B9%99%E7%A7%91%E6%8A%80%E6%9C%89%E9%99%90%E5%85%AC%E5%8F%B8%E7%AD%89%E4%BE%B5%E6%9D%83%E8%B4%A3%E4%BB%BB%E7%BA%A0%E7%BA%B7%E6%B0%91%E4%BA%8B%E4%BA%8C%E5%AE%A1%E6%B0%91%E4%BA%8B%E5%88%A4%E5%86%B3%E4%B9%A6%EF%BC%8C%EF%BC%882023%EF%BC%89%E6%9C%80%E9%AB%98%E6%B3%95%E7%9F%A5%E6%B0%91%E7%BB%88869%E5%8F%B7&quot;&gt;^6&lt;/a&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&gt;《合同法》第六条：“当事人行使权利、履行义务应当遵循诚实信用原则。”
《民法总则》第七条：“民事主体从事民事活动，应当遵循诚信原则，秉持诚实，恪守承诺。”
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>写于冬至之日</title><link>https://blog.chiyo.uk/posts/2025122116/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025122116/</guid><pubDate>Sun, 21 Dec 2025 08:58:53 GMT</pubDate><content:encoded>&lt;h1&gt;大概是年度总结&lt;/h1&gt;
&lt;p&gt;56 年寒冬首日（不是这记法还真是有够中二的）。
姑且算是过个年吧，整点年度总结什么的。&lt;/p&gt;
&lt;h2&gt;应用年度报告&lt;/h2&gt;
&lt;p&gt;虽然不是个很喜欢给自己贴标签的人，
但怎么说呢，真方便啊（笑&lt;/p&gt;
&lt;p&gt;太久没写正经东西了，
不如先从这里给自己找点灵感。&lt;/p&gt;
&lt;h3&gt;BiliBili&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./bilibili.jpg&quot; alt=&quot;BiliBili&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./list.png&quot; alt=&quot;list&quot; /&gt;&lt;/p&gt;
&lt;p&gt;依旧音乐播放器这一块没得说。
横向对比一下的话，音乐比其他专门的音乐 App 全不少，
找不到原曲也能找到拿来当背景音乐的视频。&lt;/p&gt;
&lt;p&gt;跟 Youtube 和 Niconico 的优势比起来就是
不开会员就可以挂在后台黑听。&lt;/p&gt;
&lt;p&gt;不过今年没营养的视频还是刷的太多了。
经常一刷就是半宿，然后导致晚起床。&lt;/p&gt;
&lt;p&gt;切片真得少刷，不然纯粹就是破坏了原片的观影体验。&lt;/p&gt;
&lt;h3&gt;Github&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./github.png&quot; alt=&quot;Github&quot; /&gt;&lt;/p&gt;
&lt;p&gt;后半年瓷砖的数量显然上来了，
按照时间顺序的话，
前面零散的应该都是给长庆写的生存手册、
十月底跟十一月初是这个博客、
十一月后半段到十二月中旬是 Times 和 Plus、
然后大概是 Lean 和别的什么了。&lt;/p&gt;
&lt;p&gt;看上去可能……还不错？&lt;/p&gt;
&lt;p&gt;希望明年能在一些开源项目中做点贡献吧。&lt;/p&gt;
&lt;h3&gt;Steam&lt;/h3&gt;
&lt;p&gt;&lt;img src=&quot;./steam.png&quot; alt=&quot;Steam&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./steamtime.png&quot; alt=&quot;steamtime&quot; /&gt;&lt;/p&gt;
&lt;p&gt;和上文 Github 瓷砖还真是明显的互补啊，
我似乎已经能预见到以后工作的悲惨生活了（bushi&lt;/p&gt;
&lt;p&gt;照着时间轴捋一下好了，每个月取前四个游戏：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;一月：
&lt;ul&gt;
&lt;li&gt;闰跃之年：在亲戚家一个下午打通的，超喜欢这作的知识锁和地图设计，感谢 VS2 大人送我这个游戏；&lt;/li&gt;
&lt;li&gt;大富翁：和老姐玩的；&lt;/li&gt;
&lt;li&gt;鹅鸭杀：记不清了，大概是和四协那帮家伙玩的吧；&lt;/li&gt;
&lt;li&gt;别喂猴子：没那么玩的进去倒是，但是感觉主旨还算有趣。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;二月：
&lt;ul&gt;
&lt;li&gt;PUBG：我二月就在打这个吗？&lt;/li&gt;
&lt;li&gt;大富翁：依旧老姐；&lt;/li&gt;
&lt;li&gt;传送门2：伟大，神中神！我要给月球来上一枪.jpg&lt;/li&gt;
&lt;li&gt;画猜：年度团建游戏，应该是和四协以及 NAAU 都玩过。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;三月：入了夏日口袋，打算在番剧上映之前推掉，显然失败了，此外入了Tick Hop、战地 1 和战地 5
&lt;ul&gt;
&lt;li&gt;PUBG：和舍友以及咸鱼打的，我是彩笔（笑&lt;/li&gt;
&lt;li&gt;夏日口袋：鸥线的前半段，我很好奇我什么时候能全线推完&lt;/li&gt;
&lt;li&gt;大富翁：和黄油猫打的，他说我像开了&lt;/li&gt;
&lt;li&gt;双人成行：当时打折买的，也是和黄油猫打的，小游戏跟滑雪好玩捏&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;四月：
&lt;ul&gt;
&lt;li&gt;超级鸡马：和黄油猫打的，阴b大战阴b说是&lt;/li&gt;
&lt;li&gt;PUBG：依旧舍友老咸鱼&lt;/li&gt;
&lt;li&gt;BABA IS YOU：好玩，可惜没玩明白&lt;/li&gt;
&lt;li&gt;森林冰火人：童年经典4399小游戏，和黄油猫玩的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;五月：
&lt;ul&gt;
&lt;li&gt;造桥：这我真没印象了，为什么是五月最多的？&lt;/li&gt;
&lt;li&gt;PUBG：同上&lt;/li&gt;
&lt;li&gt;大富翁：同三月&lt;/li&gt;
&lt;li&gt;A=B：？应该是我给别人安利吧&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;六月：买了田舍妹
&lt;ul&gt;
&lt;li&gt;挺进地牢：元气骑士电脑版（bushi），好玩！经常大半夜哀嚎“（你倒是翻）滚啊！快（翻）滚啊！”&lt;/li&gt;
&lt;li&gt;大富翁：三人局，依旧像开了&lt;/li&gt;
&lt;li&gt;VVVVVV：像素风小游戏，期末周复习的时候通掉了&lt;/li&gt;
&lt;li&gt;田舍妹：想冲了（点头）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&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;ul&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;九月：无&lt;/li&gt;
&lt;li&gt;十月：无&lt;/li&gt;
&lt;li&gt;十一月：
&lt;ul&gt;
&lt;li&gt;泰拉瑞亚：和咸鱼玩过一次，可惜兴趣确实不大&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;十二月：买了底特律：变人、smee新作、杀戮尖塔和古早街机三合一包&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;从世间走过&lt;/h2&gt;
&lt;h3&gt;寒冬&lt;/h3&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;./54.jpg&quot; alt=&quot;54&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./55.jpg&quot; alt=&quot;55&quot; /&gt;&lt;/p&gt;
&lt;p&gt;cf round 996 1h57min 一发过 D 上蓝了&lt;/p&gt;
&lt;h3&gt;春&lt;/h3&gt;
&lt;p&gt;花丸晴琉毕业直播，晴琉琉😭😭😭你不要走晴琉琉😭😭😭&lt;/p&gt;
&lt;p&gt;辅修入选了，接着这个机会去参与了友校的水灯节&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./shuideng.jpg&quot; alt=&quot;shuideng&quot; /&gt;&lt;/p&gt;
&lt;p&gt;春末去杭州拍了封电报给慕老师。&lt;/p&gt;
&lt;h3&gt;夏&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;我艹这个夏天过的简直太糟糕了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;打了拉面大学的校赛，成绩不错，可惜 C 题差了一个性质没看出来&lt;/p&gt;
&lt;p&gt;期末周努力活下来了但是电脑被售后格式化了我*你*的**哈批，*了全家的**东西。&lt;/p&gt;
&lt;p&gt;六月依旧白蚁季，宿舍楼道里都是&lt;/p&gt;
&lt;p&gt;市赛，因为少输出换行奖项掉了一等…………………………&lt;/p&gt;
&lt;p&gt;去参与了 SJTU 的 lean 暑训班，第一次接触到这个语言，有种宿命的预感在啊……&lt;/p&gt;
&lt;p&gt;顺便去了 AOSCC ，氛围真好的社区啊（叹&lt;/p&gt;
&lt;p&gt;暑假留校集训，热麻了&lt;/p&gt;
&lt;p&gt;唉唉，人际关系&lt;/p&gt;
&lt;h3&gt;秋&lt;/h3&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;p&gt;国庆爽骑了两天的自行车，
速通苏城给江老师寄了封明信片，
然后陪 xp 和他对象在古城逛了三天…………唉唉xql真好&lt;/p&gt;
&lt;p&gt;十月底翘了两天课回了趟家，赶上了下雪。
回来后开始搭这个博客，啧，突然想起来有个草稿存了好久没写完。&lt;/p&gt;
&lt;p&gt;去友校买了两个螃蟹吃，圆梦了。&lt;/p&gt;
&lt;p&gt;和朋友写了 Times 和 Plus ，可惜还不够好……缺少了一些……说不上来的感觉&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;/p&gt;
&lt;p&gt;报名了 SCU 的 LEAN 寒假培训班，博一下公费旅游（bushi&lt;/p&gt;
&lt;h2&gt;他人所讲述的故事&lt;/h2&gt;
&lt;h3&gt;Anime&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;少女终末旅行：好久之前买的，才把漫画看完，打算寒假再回顾一遍番剧和漫画，好喜欢这种末世风。&lt;/li&gt;
&lt;li&gt;假冒的孩子：开头不错，后边感觉要落入俗套了，第四册还没出，不知道会怎么样。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cartoon&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;败犬女主：单身狗看不得这个，太阳光了太青春了感觉要死了&lt;/li&gt;
&lt;li&gt;来自深渊：嗯……&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Games&lt;/h3&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;h3&gt;Novel&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;我和女友的妹妹接吻了：太棒了我要看的就是这种扭曲的剧情啊！！！&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Bokaro&lt;/h3&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;h2&gt;听筒那端&lt;/h2&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;h2&gt;因为有一条通向远处的路&lt;/h2&gt;
&lt;p&gt;苏城杭州，都是一日游，没能留下什么记忆&lt;/p&gt;
&lt;p&gt;大概也只能回忆起漫步在苏城楼宇间的场景吧。&lt;/p&gt;
&lt;h2&gt;问点什么？&lt;/h2&gt;
&lt;p&gt;参考&lt;a href=&quot;https://leehenry.top/posts/words_in_wildness/ww-vol04/&quot;&gt;一起用 15 个问题总结这一年吧！&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Q01.如果用一个字/词/短语/句子来概括这一年，你会如何描述它？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;迷茫。我依旧不知道我将要走向何方&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q02. 这一年是否面临了对你而言重要的人生变化？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;电脑被格式化了，失去了整个高中留下来的聊天记录&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q03. 日常的生活节奏如何？在锻炼、饮食、睡眠方面，有哪些变化与反思？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不太像活人，吃饭时间和正常三餐时间完全错开，睡眠时区至少西移了四个时区。睡眠真得调整了（汗&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q04. 在财务管理和储蓄方面是否有变化，有什么有意思的支出吗？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;修手机算吗（目移&lt;/p&gt;
&lt;p&gt;除此之外大概是下单了 anemoi 的实体版&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q05. 工作或学习上，这一年取得了哪些对你而言具有阶段意义的里程碑？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;依旧没挂科，分流顺利，以及入选辅修，和同学做了 Times 和 Plus&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q06. 是否发展了一些个人副业或长期兴趣项目？目前的进展与收获如何？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;完全没有，残念，不过我猜新学的 lean 大概会帮我找到一点方向&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q07. 有哪些让您情绪起伏的瞬间？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;市赛少输出了换行、电脑被格式化、队友退役&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q08. 是否落泪过，为什么？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;骑车风吹的&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q09. 尝试了哪些未曾体验的事情？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;好像……没有诶&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q10. 去到了哪些未曾涉足的空间？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;通勤路上的十几公里，之前一直是地铁的，这学期时间宽了经常骑车去&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q11. 有哪些对您产生影响的书籍、影视、音乐或游戏作品？其中是否有特别令您印象深刻的人物、角色或观点？&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;/blockquote&gt;
&lt;p&gt;Q12. 是否进入、发展或结束过一段亲密关系，有什么新的体悟？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;无&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q13. 哪些朋友对您这一年影响最大？是否结识了新朋友，是如何结识的？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;黄油猫，打游戏打的。湘，平时聊天。新朋友基本都是在学校群里抓到的。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q14. 有没有参与到一些社区或圈子的建设、维护或互动，对您而言意味着什么？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;帮 lean 的中文社区抓了点格式错误，对我来说也就是举手之劳吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Q15. 面向 2026 年，您最希望实现的三个目标或愿望是什么？&lt;/p&gt;
&lt;blockquote&gt;
&lt;ol&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;h2&gt;有让自己快乐吗&lt;/h2&gt;
&lt;p&gt;残念，并没有，我甚至不能直面自己写完这篇总结&lt;/p&gt;
&lt;p&gt;（唉不是怎么这么像流水帐啊草，元旦前再完善完善？&lt;/p&gt;
</content:encoded></item><item><title>Times</title><link>https://blog.chiyo.uk/posts/2025120520/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025120520/</guid><description>闲暇（？）之余弄的小玩具</description><pubDate>Fri, 05 Dec 2025 12:15:05 GMT</pubDate><content:encoded>&lt;h1&gt;Times: 基于RSSHub 与 Friend-Circle-Lite 的学院通知聚合网站&lt;/h1&gt;
&lt;p&gt;::github{repo=&quot;DIYgod/RSSHub&quot;}
::github{repo=&quot;willow-god/Friend-Circle-Lite&quot;}&lt;/p&gt;
&lt;p&gt;有人似乎半个月没更新博客了（（（&lt;/p&gt;
&lt;p&gt;但倒是度过了还算充实的半个月，从 Github 热力图上便可见一斑。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;./heatmap.png&quot; alt=&quot;热力图&quot; /&gt;&lt;/p&gt;
&lt;p&gt;周末闲下来了不妨讲讲这半个月都干了什么，就从 Times 开始好了。&lt;/p&gt;
&lt;h2&gt;起因&lt;/h2&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;p&gt;于是就有一个显而易见的问题：&lt;strong&gt;通知太“散”了。&lt;/strong&gt;
基本上为了查看有没有最新通知要去看好几个网站，就很麻烦。
但当时也没想到什么好的解决法子，就先凑合用着了。&lt;/p&gt;
&lt;h2&gt;契机&lt;/h2&gt;
&lt;p&gt;之前有段时间了解过一点点 RSS ，
也听说过 &lt;a href=&quot;https://docs.rsshub.app/&quot;&gt;RSSHub&lt;/a&gt; 这个为不提供 RSS 订阅的网站添加 RSS 解析的项目，
但当时也仅仅是作为一个订阅链接的“使用者”，
况且发现由于学校网站迁移，之前前辈写好的 RSSHub 路由不能用了，
也就没有深入了解下去。&lt;/p&gt;
&lt;p&gt;上个月给这个博客网站添加了友链朋友圈功能后（见&lt;a href=&quot;../2025111000/&quot;&gt;这篇博文&lt;/a&gt;），
我突然发现“这玩意拿来抓学校通知刚刚好”。
本着有自用需求的想法，我忽悠 &lt;a href=&quot;https://github.com/FrozenStarrrr&quot;&gt;FrozenStarrrr&lt;/a&gt; 重启暑假搁置掉的 Minus 计划。
刚刚好那周我们专业要进行分流，
也带有一点点“做出来的话可以当面试资本”的私心在。&lt;/p&gt;
&lt;h2&gt;结构&lt;/h2&gt;
&lt;p&gt;从这一小节开始正式进入具体介绍项目环节。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;fuwari 怎么没有 mermaid 支持草&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;                                -----------------
---------------------  RSSHub   |     .xml      |
| School&apos;s websites |----------&amp;gt;|      on       |
---------------------           | RSSHub Server |
                                -----------------
                                        |
                        ----------------| Friend-Circle-Lite
                        |               |
                        v               v
                ---------------    ------------
                | Github Page |    | all.json |
                ---------------    ------------

// 手搓只能画成这样了凑合看吧
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;基本思路就是&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;编写路由解析学校网站的通知公告页面&lt;/li&gt;
&lt;li&gt;部署 RSSHub 服务器（当然我们小作坊没钱高服务器只能找其他办法）&lt;/li&gt;
&lt;li&gt;利用友链朋友圈定时抓取上一步生成的 &lt;code&gt;.xml&lt;/code&gt; 文件&lt;/li&gt;
&lt;li&gt;生成静态页面，部署到 Github Page 上&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;编写路由&lt;/h2&gt;
&lt;p&gt;因为学校的本科生院网站完全就是把之前教务处网站换了个域名。
而 &lt;a href=&quot;https://github.com/markbang&quot;&gt;棒无&lt;/a&gt; 前辈之前曾写过&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/15357&quot;&gt;教务处网站的路由&lt;/a&gt;，
这使得我们可以参考 &lt;s&gt;抄&lt;/s&gt; 前辈留下来的 &lt;code&gt;.ts&lt;/code&gt; 文件照葫芦画瓢，
先将
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/20515&quot;&gt;本科生院的路由&lt;/a&gt;
和
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/20531&quot;&gt;自家学院的路由&lt;/a&gt;
写好。&lt;/p&gt;
&lt;p&gt;写完两个路由，也差不多有了点经验。
接下来的几周我们陆续又写完了其他 25 个学院的路由
（&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/20532&quot;&gt;PR#20532&lt;/a&gt;,
&lt;a href=&quot;https://github.com/DIYgod/RSSHub/pull/20582&quot;&gt;PR#20582&lt;/a&gt;）。
这也是目前路由的完成情况，
有关于更详细的路由支持计划，
您可以查看我们 Fork 仓库的 &lt;a href=&quot;https://github.com/ECNU-minus/RSSHub/issues/1&quot;&gt;Issue#1&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;由于作为一个仅有三人的小作坊，
我们属实没钱也没有什么网络安全经验去维护一台服务器，
所以我们只能依赖公共实例或是 Github Actions 。
无论哪种我们都需要将自己写的路由提 PR 给原 repo。
所以有一周基本上就是在
&lt;code&gt;写路由 -&amp;gt; 提PR -&amp;gt; 查看CR评论 -&amp;gt; 改路由&lt;/code&gt;
的循环中度过的。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;考虑到 RSSHub 的规模，我似乎可以不要脸的说自己也是给 stars 项目提过 pr 的人&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;部署友链朋友圈&lt;/h2&gt;
&lt;p&gt;这一步基本照着文档来就行，
但考虑到抓取通知毕竟和项目原目的不一样，
还是需要做一些更改。&lt;/p&gt;
&lt;h3&gt;修改读取 &lt;code&gt;json&lt;/code&gt; 路径&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;spider_settings:
  enable: true
  json_url: &quot;https://raw.githubusercontent.com/ECNU-minus/Friend-Circle-Lite/main/sites.json&quot;
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对于新增学院的信息按照文档给定格式写入 Fork 仓库根目录下的 &lt;code&gt;sites.json&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;由于 RSSHub 生成的订阅路径特殊，
不能由 &lt;code&gt;site.json&lt;/code&gt; 中的链接自动解析，
需要在 &lt;code&gt;conf.yaml&lt;/code&gt; 中自行执行 RSS 地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 特殊RSS地址指定，可以置空但是不要删除！
# 解释：用于指定特殊RSS地址，如B站专栏等不常见RSS地址后缀，可以添加多个
#   name:               友链名称
#   url:                指定的RSS地址
specific_RSS:
  - name: 学院名称
    url: RSS 订阅地址
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;添加学院 logo&lt;/h3&gt;
&lt;p&gt;这一步对我来说是比较难受的一步，
需要去各个学院官网手动找到院徽下载转成 &lt;code&gt;.webp&lt;/code&gt; 格式然后统统塞入 &lt;code&gt;./assets/&lt;/code&gt; 文件夹下。
理想状态是点开学院官网就能从学院详情直接下载到透明背景的图片，
至于实际操作下来嘛……&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数院化院还有几个学院没有院徽&lt;/li&gt;
&lt;li&gt;计院只能找到蓝底的院徽&lt;/li&gt;
&lt;li&gt;传播学院给了 &lt;code&gt;.ai&lt;/code&gt; 格式的文件倒是还能理解但是美术学院竟然只提供 &lt;code&gt;.pdf&lt;/code&gt; 格式的文件
&lt;s&gt;不是，为什么要用 &lt;code&gt;.pdf&lt;/code&gt; 存图片啊&lt;/s&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后官网找不到的只好去下载微信公众号头像，
没设计院徽的学院就只能用校徽替代，
才总算凑了个七七八八。&lt;/p&gt;
&lt;h3&gt;功能调整&lt;/h3&gt;
&lt;h4&gt;更换默认壁纸&lt;/h4&gt;
&lt;p&gt;默认壁纸实在是太不二次元了，更换 &lt;code&gt;./static/bg-light.webp&lt;/code&gt; 文件即可&lt;/p&gt;
&lt;h4&gt;去掉首页&lt;/h4&gt;
&lt;p&gt;默认的友链朋友圈界面点开会是 &lt;code&gt;文档/接口&lt;/code&gt; 页面，
需要往下滚动才能查看到文章，
容易使用户感到困惑，
故需要删掉相关代码&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;style&amp;gt;
  ...
  .container {
      background: rgba(255, 255, 255, 0.8);
      display: flex;
      text-align: center;
      align-items: center;
      height: 100vh;
      width: 100%;
      flex-direction: column;
      justify-content: center;
  }
  ...
&amp;lt;/style&amp;gt;
...
&amp;lt;div class=&quot;container&quot;&amp;gt;
  &amp;lt;img src=&quot;./favicon.ico&quot; alt=&quot;Avatar&quot; class=&quot;avatar&quot; /&amp;gt;
  &amp;lt;p&amp;gt;Friend-Circle-Lite&amp;lt;br /&amp;gt;服务已运行&amp;lt;/p&amp;gt;
  &amp;lt;div class=&quot;button-container&quot;&amp;gt;
    &amp;lt;a
      href=&quot;https://blog.liushen.fun/posts/4dc716ec/&quot;
      class=&quot;button&quot;
      target=&quot;_blank&quot;
      &amp;gt;查看文档&amp;lt;/a
    &amp;gt;
    &amp;lt;a href=&quot;/all.json&quot; class=&quot;button&quot;&amp;gt;测试接口&amp;lt;/a&amp;gt;
  &amp;lt;/div&amp;gt;
  &amp;lt;a href=&quot;#&quot; class=&quot;scroll-down-icon&quot; id=&quot;scroll-down-button&quot;&amp;gt;&amp;lt;/a&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;修改文章抓取数目与抓取时间&lt;/h4&gt;
&lt;p&gt;设定每个学院抓取 8 篇文章（只是因为刚好凑个整又不至于太少）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spider_settings:
  ...
  article_count: 8
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;原仓库为抓取数目设定了默认 150 的上限，
超过了便会按照一定规则筛选作者，
考虑到学院数目较多，
故将上限改为 256 （同样凑个整）&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;def deal_with_large_data(result):
    &quot;&quot;&quot;
    处理文章数据，保留前150篇及其作者在后续文章中的出现。

    参数：
    result (dict): 包含统计数据和文章数据的字典。

    返回：
    dict: 处理后的数据，只包含需要的文章。
    &quot;&quot;&quot;
    result = sort_articles_by_time(result)
    article_data = result.get(&quot;article_data&quot;, [])

    # 检查文章数量是否大于 150
    max_articles = 256
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;从 RSSHub 服务器抓取通常需要更长的时间，
默认设置的 15 秒很容易超时，
故将其修改为 60 秒。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;timeout = (10, 15)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;添加筛选作者多选下拉栏&lt;/h4&gt;
&lt;p&gt;这部分扔给 FrozenStarrrr 处理的，我只提了需求没管具体实现。&lt;/p&gt;
&lt;h2&gt;生成静态页面&lt;/h2&gt;
&lt;p&gt;这部分主要是调 Actions ，感觉还算比较重要，故单拉出来一个二级标题。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;域名&lt;/p&gt;
&lt;p&gt;原部署逻辑是在生成静态页面后初始化 git 仓库然后强制推送到 page 分支上，
这样做的好处是 page 分支始终仅有 1 个 commit ，较为简洁，
但是每次更新会清理掉 CNAME 文件，令自定义域名失效。
故对 actions 做如下修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;- name: Commit changes
  run: |
    mkdir pages
    cp -r main ./static/index.html ./static/readme.md ./static/favicon.ico ./static/bg-light.webp ./temp/cache.json ./static/bg-dark.webp all.json errors.json pages/
    cd pages
    touch CNAME
    echo &quot;times.myecnu.org&quot; &amp;gt;&amp;gt; CNAME
    git init
    git add .
    git commit -m &quot;⏱️ $(date +&quot;%Y年%m月%d日-%H时%M分&quot;) GitHub Actions定时更新&quot;
    git push --force https://x-access-token:${{ secrets.GITHUB_TOKEN }}@github.com/${{ github.repository }}.git HEAD:page
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;服务器&lt;/p&gt;
&lt;p&gt;一开始我们采用的是抓取远程公共实例的方式，
但是这样会比较依赖远端服务器的稳定性，
在问了伟大的ゲミニ様之后得知可以在 actions 里边通过拉取 docker 镜像提供服务。
于是作如下修改&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;friend-circle-lite:
  runs-on: ubuntu-latest

  services:
    rsshub:
      image: diygod/rsshub:latest
      ports:
        - 1200:1200
      options: &amp;gt;-
        --health-cmd &quot;curl -f http://localhost:1200/ || exit 1&quot;
        --health-interval 10s
        --health-timeout 5s
        --health-retries 5
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后将所有抓取链接指向 &lt;code&gt;localhost:1200&lt;/code&gt; 即可。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;后续计划？&lt;/h2&gt;
&lt;p&gt;当前虽然算是能用，但还是存在一些不足，后续可能会考虑对其进行进一步的修改。&lt;/p&gt;
&lt;h3&gt;支持更多网站&lt;/h3&gt;
&lt;p&gt;目前仅支持所有以 &lt;code&gt;&amp;lt;ul&amp;gt;&amp;lt;/ul&amp;gt;&lt;/code&gt; 无序列表实现通知公告的网站（除了你，数院）
使用 &lt;code&gt;&amp;lt;table&amp;gt;&lt;/code&gt; 和 &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt; 实现的网站暂时还没写。
目前已经支持和打算支持的页面可以参照 Fork 仓库的 &lt;a href=&quot;https://github.com/ECNU-minus/RSSHub/issues/1&quot;&gt;Issue#1&lt;/a&gt; 页面。&lt;/p&gt;
&lt;p&gt;以及数学科学学院网站采用 &lt;code&gt;gb2312&lt;/code&gt; 编码，直接抓取会出现编码错误，
暂时还没想好怎么解决。&lt;/p&gt;
&lt;h3&gt;重写静态页面&lt;/h3&gt;
&lt;p&gt;审美不合&lt;/p&gt;
&lt;h3&gt;邮箱通知&lt;/h3&gt;
&lt;p&gt;当前还只能通过用户查看来被动查找信息，但友链朋友圈原仓库支持邮箱推送，
可以实现主动推送订阅通知，提升用户友好性。
基于此，下一步要做的是修改对应配置文件，支持用户订阅部分消息源的通知，并定时推送。&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;ECNU-minus/times&quot;}&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为作品&lt;a href=&quot;http://shiratamaco.com/&quot;&gt;星空鉄道とシロの旅&lt;/a&gt;中的 &lt;a href=&quot;http://shiratamaco.com/assets/images/scrshots16.png&quot;&gt;CG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>博客折腾指北0x03 - 随记、一言或是微语</title><link>https://blog.chiyo.uk/posts/2025111211/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025111211/</guid><description>今天说点什么怪话好呢？</description><pubDate>Wed, 12 Nov 2025 03:32:02 GMT</pubDate><content:encoded>&lt;h1&gt;随记页面&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;本小节部分灵感来自于&lt;a href=&quot;https://www.ftls.xyz/posts/2023-08-13-mricoblog/&quot;&gt;微语/说说/微博/Mricoblog 嵌入博客网页&lt;/a&gt;&lt;br /&gt;
本文代码修改自 &lt;a href=&quot;https://misskey-hub.net/cn/docs/for-users/features/embed/&quot;&gt;Misskey 文档 - 嵌入网站&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;misskey-dev/misskey&quot;}&lt;/p&gt;
&lt;p&gt;:::tip[实现]
本博客基于内嵌 &lt;a href=&quot;https://misskey-hub.net/&quot;&gt;Misskey&lt;/a&gt; 时间线实现该功能，
如不想通过该方法方法实现，
请查阅其他文章。
:::&lt;/p&gt;
&lt;p&gt;在此之前我使用过 Wordpress 部署博客，当时选用的主题是 &lt;a href=&quot;https://github.com/mirai-mamori/Sakurairo&quot;&gt;Sakurairo&lt;/a&gt; ，
印象当中是有一个页面可以用来记录一些只言片语 &lt;s&gt;方便我随地大小写（bushi）&lt;/s&gt;。&lt;/p&gt;
&lt;p&gt;最近在浏览他人博客的时候，在 &lt;a href=&quot;https://shiro.love/&quot;&gt;Shiro&lt;/a&gt; 的博客中又看到了&lt;a href=&quot;https://shiro.love/says&quot;&gt;类似的界面&lt;/a&gt;。
于是便打算给自己的博客也弄一个。
am_g_7
但是当前部署的静态博客有个问题，
在移动端设备弄一个 git 和 Obsidian 来写这种短博文有些太过不便了。
于是我最后采用了内嵌外部 SNS 的方法。&lt;/p&gt;
&lt;p&gt;之前被别人介绍过&lt;a href=&quot;https://zh.wikipedia.org/wiki/%E8%81%94%E9%82%A6%E5%AE%87%E5%AE%99&quot;&gt;联邦宇宙&lt;/a&gt;
（&lt;a href=&quot;https://en.wikipedia.org/wiki/Fediverse&quot;&gt;Fediverse&lt;/a&gt;）的存在，
对这种去中心化但又互联互通的结构颇有好感。
在对比了一些平台后，
我采用了 &lt;a href=&quot;https://misskey-hub.net/&quot;&gt;Misskey&lt;/a&gt;
（主要是界面美观还可以插入表情包）。
当然你也可以选择 &lt;a href=&quot;https://joinmastodon.org&quot;&gt;Mastodon&lt;/a&gt; 或是别的什么，
在此贴一篇基于 Mastodon 实现的参考博文：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://www.eallion.com/hugo-blog-embed-mastodon/&quot;&gt;Hugo 博客集成 Mastodon&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;:::warning[使用联邦宇宙时的注意事项]
请遵循你所使用实例的 &lt;strong&gt;基本规则、服务条款&lt;/strong&gt; 等内容，
建议有条件的人可以自行搭建实例。
:::&lt;/p&gt;
&lt;p&gt;以下为基于 Misskey 的实现方法：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在你喜欢的实例上注册 Misskey 账号&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;./src/pages/&lt;/code&gt; 目录下创建 &lt;code&gt;misskey.astro&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import { getEntry, render } from &quot;astro:content&quot;;

import Markdown from &quot;@components/misc/Markdown.astro&quot;;

import MainGridLayout from &quot;../layouts/MainGridLayout.astro&quot;;

const thisPost = await getEntry(&quot;spec&quot;, &quot;misskey&quot;);

if (!thisPost) {
 throw new Error(&quot;This page content not found&quot;);
}

const { Content } = await render(thisPost);
---

&amp;lt;MainGridLayout title=&quot;随记&quot; description=&quot;私の Misskey&quot;&amp;gt;
  &amp;lt;div
    class=&quot;flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32&quot;
  &amp;gt;
    &amp;lt;div class=&quot;card-base z-10 px-9 py-6 relative w-full&quot;&amp;gt;
      &amp;lt;Markdown class=&quot;mt-2&quot;&amp;gt;
        &amp;lt;Content /&amp;gt;
      &amp;lt;/Markdown&amp;gt;
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/MainGridLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;code&gt;./src/content/spec/&lt;/code&gt; 文件夹下创建 &lt;code&gt;misskey.md&lt;/code&gt; 文件，
并在其中合适位置插入如下代码段&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...

&amp;lt;iframe
  src=&quot;https://&amp;lt;HOST&amp;gt;/embed/user-timeline/&amp;lt;USER_ID&amp;gt;&quot;
  data-misskey-embed-id=&quot;v1_&amp;lt;RANDOM&amp;gt;&quot;
  loading=&quot;lazy&quot;
  referrerpolicy=&quot;strict-origin-when-cross-origin&quot;
  style=&quot;border: none; width: 100%; max-width: 500px; height: 300px; color-scheme: light dark;&quot;
&amp;gt;&amp;lt;/iframe&amp;gt;
&amp;lt;script defer src=&quot;https://&amp;lt;HOST&amp;gt;/embed.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;并作如下修改：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;HOST&amp;gt;&lt;/code&gt;: Misskey 服务器的主机名&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;USER_ID&amp;gt;&lt;/code&gt;: 要嵌入的用户的 ID（不是以 @ 开头的用户名）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;&amp;lt;RANDOM&amp;gt;&lt;/code&gt;: 随机字符串（如果使用 embed.js ，则为必填项。如果同一页面中有多个嵌入代码，请确保它们不重复）&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上述代码也可以在 &lt;code&gt;Misskey 个人主页-右上角三个点-嵌入-此用户的帖子&lt;/code&gt; 处自动生成&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改 &lt;code&gt;./src/config.ts&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
export const navBarConfig: NavBarConfig = {
  links: [
    ...
    {
     name: &quot;随记&quot;,
     url: &quot;/fediverse/&quot;,
    },
    ...
  ]
}
...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;最终效果请前往&lt;a href=&quot;../../fediverse&quot;&gt;随记&lt;/a&gt;页面查看&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为作品&lt;a href=&quot;https://key.visualarts.gr.jp/anemoi/&quot;&gt;anemoi&lt;/a&gt;中的&lt;a href=&quot;https://key.visualarts.gr.jp/anemoi/gallery.html&quot;&gt;CG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>云端的单身情歌流程简述</title><link>https://blog.chiyo.uk/posts/2025111209/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025111209/</guid><description>有关于2025年云端单身情歌流程的小计</description><pubDate>Wed, 12 Nov 2025 01:57:17 GMT</pubDate><content:encoded>&lt;h1&gt;如何组织一场线上单身情歌？&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;在此记录2025年云端单身情歌准备流程，留给后人参考。&lt;br /&gt;
—— 09-音频&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;早期准备&lt;/h2&gt;
&lt;h3&gt;群聊&lt;/h3&gt;
&lt;p&gt;目前群聊仍是沿用 2023 年云端单身情歌时建的群，
截至敲下这段话，群聊内共有1241人。&lt;/p&gt;
&lt;p&gt;据 H 统计，去年活动结束后群聊内有约700人，
目前群上限为 2000 人（啊我艹年超会好贵.jpg），
所以按这个增长率看至少明年还不用担心清人/扩群/分群的问题。&lt;/p&gt;
&lt;p&gt;但明年大概需要讨论群满了应该怎么办。&lt;/p&gt;
&lt;h3&gt;必要的文件&lt;/h3&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;li&gt;当天上午单身情歌合唱录像（自由&amp;amp;青华，可以试试提前问问光影在校生当天能不能帮忙录像&lt;/li&gt;
&lt;li&gt;校歌（可以在 b 站上找）&lt;/li&gt;
&lt;li&gt;学校内各类铃声音乐（请尽可能使用原文件，部分文件已上传到策划群群文件中）
&lt;ul&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;li&gt;离校铃（工作日晚九点播放）：《友谊地久天长》钢琴&lt;/li&gt;
&lt;li&gt;间操音乐：
&lt;ol&gt;
&lt;li&gt;《Get Up》—— Kelly Clarkson&lt;/li&gt;
&lt;li&gt;《Samsara》—— Tungevaag &amp;amp; Raaban&lt;/li&gt;
&lt;li&gt;《霍元甲》—— 周杰伦&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;先期宣传&lt;/h3&gt;
&lt;p&gt;这两年暑假至十一期间，
毕业生间会传共享文档。
可以趁传的比较热的时候将活动群二维码以接龙留言的形式插进文档。&lt;/p&gt;
&lt;h2&gt;前期准备&lt;/h2&gt;
&lt;h3&gt;海报&lt;/h3&gt;
&lt;p&gt;只是提醒有这一项别忘了，
具体样式由当年组织者自己发挥，
记得把群二维码/加群方式放到海报上。&lt;/p&gt;
&lt;h3&gt;宣传&lt;/h3&gt;
&lt;p&gt;可以通过如下几个途径宣传：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;QQ表白墙&lt;/li&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;h3&gt;审核&lt;/h3&gt;
&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;li&gt;在校生也不用卡，考虑到作息不推荐参与，但是想来唱也不拦着&lt;/li&gt;
&lt;li&gt;外校学生想来凑热闹的只要表明身份不捣乱也能来&lt;/li&gt;
&lt;li&gt;入群问题语焉不详、顾左右而言他的打回但不用拉黑，让他们重新填入群问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;群内管理&lt;/h3&gt;
&lt;p&gt;控制话题走向，可以闲聊吹水，但不要涉及敏感话题。
在有冲突苗头的时候及时介入。
善用群管理权限，对于发言不合适的人按照 &lt;code&gt;提醒&amp;amp;撤回-禁言-踢出去&lt;/code&gt; 渐进处理。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;不是很推荐踢人，容易吸仇恨。一般禁言处理即可。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;如果群内有冲突让他们拉个小群自行解决。
别在千人群里丢人。&lt;/p&gt;
&lt;h3&gt;确定时间&lt;/h3&gt;
&lt;p&gt;近几年活动时间一直是 &lt;code&gt;11-11 23:11&lt;/code&gt;&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;code&gt;23:00-00:00&lt;/code&gt; ， &lt;code&gt;500&lt;/code&gt; 的即可。&lt;/p&gt;
&lt;p&gt;参考价位是&lt;code&gt;CN¥ 30~40&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;千人会议太贵了而且没有那么多人来，没必要租。&lt;/p&gt;
&lt;p&gt;如果预估同时入会人数少于 &lt;code&gt;300&lt;/code&gt; 人的话可以看看有没有学校为学生提供 &lt;code&gt;300&lt;/code&gt; 人会议室预约，
比如我就能约到。
（不过没什么必要，&lt;code&gt;500&lt;/code&gt; 人的也不贵）&lt;/p&gt;
&lt;h2&gt;活动流程&lt;/h2&gt;
&lt;p&gt;以下为 &lt;code&gt;2025&lt;/code&gt; 年流程，仅供参考。
实际组织没必要完全按照这个来，
凭当年组织者喜好。&lt;/p&gt;
&lt;h3&gt;活动开始前&lt;/h3&gt;
&lt;p&gt;提前一小时（&lt;code&gt;22:00&lt;/code&gt;）左右确认设备，调试音量，准备好文件、电脑壁纸等。&lt;/p&gt;
&lt;p&gt;提前十五分钟（&lt;code&gt;22:45&lt;/code&gt;）进活动会议室，设置联席主持人，&lt;strong&gt;手动开启录屏&lt;/strong&gt;。
整场活动中联席主持人需要及时闭麦、禁言、移出不合适发言、行为的人。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;23:00&lt;/code&gt; 把会议号发到群内，开始进人。&lt;/p&gt;
&lt;h3&gt;暖场&lt;/h3&gt;
&lt;p&gt;放一些前期暖场的纯音乐，&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;我力荐 Yanni 的 《With an Orchid》。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;前场&lt;/h3&gt;
&lt;p&gt;放预铃，然后播放往年单身情歌回顾视频和当天学校内录像。&lt;/p&gt;
&lt;p&gt;时间允许的话可以下午把当天录像剪入回顾视频中一起放。&lt;/p&gt;
&lt;h3&gt;主体&lt;/h3&gt;
&lt;p&gt;放上课铃，然后播放单身情歌原唱，
需要在屏幕上显示KTV式歌词，歌词颜色对比度需要大一点（今年看不清放到哪句了）&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;/p&gt;
&lt;p&gt;一定会有人点校歌，所以先放校歌，
接下来可以放间操音乐，
这段时间主要留给大家聊天。&lt;/p&gt;
&lt;h3&gt;结束&lt;/h3&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;我力荐 Kenny G. 的 《Going home》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;到 &lt;code&gt;00:00&lt;/code&gt; 还有人在会议室内的话就直接结束会议。&lt;/p&gt;
&lt;h3&gt;活动结束后&lt;/h3&gt;
&lt;p&gt;结束会议后去下载会议云录制视频，
如果没有下载/访问权限的话去和淘宝商家对线。&lt;/p&gt;
</content:encoded></item><item><title>55 年秋 13 周、冬 1 周周记</title><link>https://blog.chiyo.uk/posts/2025111019/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025111019/</guid><description>某人懒了，上周没写，两周合一周</description><pubDate>Mon, 10 Nov 2025 11:23:33 GMT</pubDate><content:encoded>&lt;h1&gt;55 年秋 13 周、冬 1 周周记&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;不是，
这太诡异了，
我想写周记的时候发现上周没什么好写的。
你懂吗，
就如同上一周不存在了，
removed了，
deleted了。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;嘶，
这就半学期了？&lt;/p&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;h3&gt;计算机&lt;/h3&gt;
&lt;h4&gt;软件测试与验证&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;考试，看上周周记。&lt;/p&gt;
&lt;h4&gt;编译原理与技术&lt;/h4&gt;
&lt;p&gt;摸了&lt;/p&gt;
&lt;p&gt;冬 3 周考试，需要复习。&lt;/p&gt;
&lt;h4&gt;操作系统&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;配 lab 环境，没配好&lt;/p&gt;
&lt;h4&gt;软件分析与验证前沿&lt;/h4&gt;
&lt;p&gt;暂时没看&lt;/p&gt;
&lt;h4&gt;竞赛&lt;/h4&gt;
&lt;h5&gt;Codeforces&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;1+2 只开了一道 A 掉大分重回青名，
只能说不是很擅长这种数据范围有特殊影响的题目。&lt;/p&gt;
&lt;p&gt;这事不想多说……太打击了……&lt;/p&gt;
&lt;p&gt;马上还有一场 div 2 ，打回来一雪前耻好了。&lt;/p&gt;
&lt;h5&gt;AtCoder&lt;/h5&gt;
&lt;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;周六打了 abc431 ，
还算不错，
基本解题思路和复盘可以看&lt;a href=&quot;../2025110822/&quot;&gt;这篇文章&lt;/a&gt;。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;周六打了 abc432 ，
C 注意到了性质代码没写对，
应该直接用一元二次方程解的。
基本思路与复盘还没写，
这两天补一下题。&lt;/p&gt;
&lt;h4&gt;其他&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h5&gt;&lt;a href=&quot;../2025110415/&quot;&gt;程序设计讲义&lt;/a&gt;&lt;/h5&gt;
&lt;p&gt;对的，前半周绝大部分精力都花在这上边了。&lt;/p&gt;
&lt;h3&gt;数学&lt;/h3&gt;
&lt;p&gt;上课摸鱼一时爽，周记复盘火葬场了这下。&lt;/p&gt;
&lt;h4&gt;微分几何&lt;/h4&gt;
&lt;p&gt;同秋 12 周。&lt;/p&gt;
&lt;h4&gt;初等数论&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;在讲二次剩余，笔记见&lt;a href=&quot;https://chiyoyuki.github.io/note/Number_Theory/9/&quot;&gt;初等数论第9周笔记&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;偏微分方程&lt;/h4&gt;
&lt;p&gt;没学，也没看回放，只知道还在讲热传导方程，坏中坏。&lt;/p&gt;
&lt;h4&gt;拓扑学基础&lt;/h4&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;开始从头追进度了打算，整理了&lt;a href=&quot;https://chiyoyuki.github.io/note/Topology/2/&quot;&gt;拓扑学基础第2周笔记&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;日语&lt;/h3&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;blockquote&gt;
&lt;p&gt;秋 13&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;水曜 - 学业帮帮，见&lt;a href=&quot;../2025110415/&quot;&gt;讲义&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;土曜 - CMC 体验卡，包没奖的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;冬 1&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;火曜 - 云端双十一，见&lt;a href=&quot;../2025111209/&quot;&gt;流程简述&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;土曜 - 给课栈提了个 pr&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;a href=&quot;https://key.visualarts.gr.jp/summer_rb/&quot;&gt;Summer Pockets REFLECTION BLUE&lt;/a&gt;中的 CG&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>博客折腾指北0x02 - 友链与朋友圈</title><link>https://blog.chiyo.uk/posts/2025111000/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025111000/</guid><description>我们曾经终日游荡，在故乡的青山上</description><pubDate>Sun, 09 Nov 2025 16:07:24 GMT</pubDate><content:encoded>&lt;h1&gt;友链与朋友圈&lt;/h1&gt;
&lt;p&gt;我觉得友链界面算是博客必不可少的一部分，
可惜 Fuwari 主题尚未实现这一功能，
只能自己另寻其他解决办法。&lt;/p&gt;
&lt;p&gt;:::warning[参考注意]
Fuwari 主题后续可能会内置友链页面，
请考虑是否要自己外加这一功能。&lt;/p&gt;
&lt;p&gt;此外，
我对于 Astro 了解并不深，
如您阅读了这系列第 0x00 篇文章的话应该知道我听说 Astro 也仅仅是半月前的事情。
所以基本上文中代码不是抄的就是 AI 写的，
很多代码可能未必准确，
主打一个能跑就行。&lt;br /&gt;
这个文章的实现策略也仍存在问题，
比如友链部分样式不一致。&lt;/p&gt;
&lt;p&gt;如您愿意帮我改进代码，
请提PR。
我将不胜感激。
:::&lt;/p&gt;
&lt;h2&gt;友链页面&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本小节代码主要修改自仓库 &lt;code&gt;cworld1/astro-theme-pure&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;cworld1/astro-theme-pure&quot;}&lt;/p&gt;
&lt;p&gt;:::note[有关上游仓库 saicaca/fuwari 对友链的支持计划]
详见&lt;a href=&quot;https://github.com/saicaca/fuwari/issues/35/&quot;&gt;issue #35&lt;/a&gt;和&lt;a href=&quot;https://github.com/saicaca/fuwari/pull/642&quot;&gt;pr #642&lt;/a&gt;
:::&lt;/p&gt;
&lt;p&gt;友链界面最开始参考了AULyPc的文章&lt;a href=&quot;https://aulypc1.github.io/posts/website/add_friendspage_in_fuwari/&quot;&gt;给你的Fuwari添加一个友链页面&lt;/a&gt;，
但后来在逛 &lt;a href=&quot;https://axi404.top/links&quot;&gt;Axi&apos;s Blog&lt;/a&gt; 的时候很喜欢他的友链界面和朋友圈，
于是顺藤摸瓜找到了 &lt;a href=&quot;https://github.com/cworld1/astro-theme-pure&quot;&gt;Pure 主题&lt;/a&gt;，
然后把友链相关的部分抄了过来，
具体步骤大致如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;添加必要组件&lt;/p&gt;
&lt;p&gt;仿照 &lt;a href=&quot;https://github.com/cworld1/astro-theme-pure/blob/main/public/links.json&quot;&gt;Pure 主题配置&lt;/a&gt;
建立 &lt;code&gt;./public/links.json&lt;/code&gt; 文件，
以下为示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;friends&quot;: [
    {
      &quot;id_name&quot;: &quot;my-favorite-links&quot;,
      &quot;desc&quot;: &quot;个人收藏&quot;,
      &quot;link_list&quot;: [
        {
          &quot;name&quot;: &quot;空と海&quot;,
          &quot;intro&quot;: &quot;就算活著沒有意義，偶而還是會碰到好事的。&quot;,
          &quot;link&quot;: &quot;https://chiyoyuki.uk&quot;,
          &quot;avatar&quot;: &quot;https://chiyoyuki.uk&quot;
        },
        {
          &quot;name&quot;: &quot;填写示例&quot;,
          &quot;intro&quot;: &quot;这是一个示例&quot;,
          &quot;link&quot;: &quot;localhost:4321&quot;,
          &quot;avatar&quot;: &quot;这里填写对方的头像地址&quot;
        }
      ]
    },
    {
      &quot;id_name&quot;: &quot;my-friends-links&quot;,
      &quot;desc&quot;: &quot;先友后链&quot;,
      &quot;link_list&quot;: []
    },
    {
      &quot;id_name&quot;: &quot;my-links-friends&quot;,
      &quot;desc&quot;: &quot;先链后友&quot;,
      &quot;link_list&quot;: []
    },
    {
      &quot;id_name&quot;: &quot;special-links&quot;,
      &quot;desc&quot;: &quot;特殊链接&quot;,
      &quot;link_list&quot;: [
        {
          &quot;name&quot;: &quot;异次元之旅&quot;,
          &quot;intro&quot;: &quot;我们一起去萌站成员的星球旅行吧！&quot;,
          &quot;link&quot;: &quot;https://travel.moe/go.html&quot;,
          &quot;avatar&quot;: &quot;https://icp.gov.moe/images/ico400.png&quot;
        }
      ]
    }
  ]
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;./src/components/&lt;/code&gt; 文件夹下新建 &lt;code&gt;links/FriendsList.astro&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
import { Image } from &quot;astro:assets&quot;;

interface friend {
 avatar: string;
 name: string;
 intro: string;
 link: string;
}

interface friend_list {
 id_name: string;
 desc: string;
 link_list: friend[];
}

function shuffle(arr: friend[]) {
 return arr.sort(() =&amp;gt; Math.random() - 0.5);
}

interface Props {
 title?: string;
 list: friend_list;
}
const { title, list: friendList, ...props } = Astro.props;
---

{title &amp;amp;&amp;amp; &amp;lt;h2 id={friendList.id_name}&amp;gt;{title}&amp;lt;/h2&amp;gt;}
&amp;lt;div class=&quot;grid gap-3.5 sm:grid-cols-2 sm:gap-4 lg:grid-cols-3&quot; {...props}&amp;gt;
  {
    friendList.link_list.length &amp;gt; 0 ? (
      shuffle(friendList.link_list).map((frd: friend) =&amp;gt; (
        &amp;lt;a href={frd.link} target=&quot;_blank&quot; class=&quot;no-underline&quot;&amp;gt;
          &amp;lt;div class=&quot;group relative h-full overflow-hidden rounded-2xl border bg-background px-2.5 py-1.5 transition-colors hover:bg-muted sm:px-4 sm:py-2&quot;&amp;gt;
            &amp;lt;div class=&quot;relative z-10 flex h-full items-center gap-3&quot;&amp;gt;
              {/* avatar */}
              &amp;lt;div class=&quot;relative h-14 w-14 min-w-14 overflow-hidden rounded-full&quot;&amp;gt;
                &amp;lt;Image
                  class=&quot;my-0 bg-white&quot;
                  src={frd.avatar}
                  height={80}
                  width={80}
                  alt=&quot;avatar&quot;
                  loading=&quot;lazy&quot;
                /&amp;gt;
                &amp;lt;div class=&quot;absolute start-0 top-0 h-full w-full&quot;&amp;gt;
                  &amp;lt;div class=&quot;flex h-full w-full items-center justify-center rounded-full bg-foreground opacity-0 transition-opacity duration-300 ease-in-out group-hover:opacity-50&quot;&amp;gt;
                    &amp;lt;svg
                      xmlns=&quot;http://www.w3.org/2000/svg&quot;
                      width=&quot;32&quot;
                      height=&quot;32&quot;
                      viewBox=&quot;0 0 24 24&quot;
                      fill=&quot;none&quot;
                      stroke-width=&quot;2.5&quot;
                      stroke-linecap=&quot;round&quot;
                      stroke-linejoin=&quot;round&quot;
                      class=&quot;me-2 stroke-background&quot;
                    &amp;gt;
                      &amp;lt;line
                        x1=&quot;5&quot;
                        y1=&quot;12&quot;
                        x2=&quot;19&quot;
                        y2=&quot;12&quot;
                        class=&quot;translate-x-4 scale-x-0 transition-all duration-300 ease-in-out group-hover:translate-x-1 group-hover:scale-x-100&quot;
                      /&amp;gt;
                      &amp;lt;polyline
                        points=&quot;12 5 19 12 12 19&quot;
                        class=&quot;translate-x-0 transition-all duration-300 ease-in-out group-hover:translate-x-1&quot;
                      /&amp;gt;
                    &amp;lt;/svg&amp;gt;
                  &amp;lt;/div&amp;gt;
                &amp;lt;/div&amp;gt;
              &amp;lt;/div&amp;gt;
              {/* details */}
              &amp;lt;div class=&quot;flex flex-col gap-y-1&quot;&amp;gt;
                &amp;lt;p class=&quot;my-0 line-clamp-1 text-sm&quot;&amp;gt;{frd.name} &amp;lt;/p&amp;gt;
                &amp;lt;p class=&quot;my-0 line-clamp-1 text-xs text-muted-foreground&quot;&amp;gt;
                  {frd.intro}
                &amp;lt;/p&amp;gt;
              &amp;lt;/div&amp;gt;
            &amp;lt;/div&amp;gt;
            {/* avatar bg */}
            &amp;lt;Image
              class=&quot;absolute -start-2 top-0 z-0 my-0 h-full w-2/3 bg-white object-cover opacity-15&quot;
              src={frd.avatar}
              height={80}
              width={80}
              alt=&quot;avatar bg&quot;
              loading=&quot;lazy&quot;
              style={{
                maskImage:
                  &quot;linear-gradient(to left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%)&quot;,
                msMaskImage:
                  &quot;-ms-linear-gradient(to left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%)&quot;,
                WebkitMaskImage:
                  &quot;-webkit-linear-gradient(to left, rgba(0, 0, 0, 0) 0%, rgba(0, 0, 0, 1) 100%)&quot;,
              }}
            /&amp;gt;
          &amp;lt;/div&amp;gt;
        &amp;lt;/a&amp;gt;
      ))
    ) : (
      &amp;lt;p&amp;gt;Nothing here.&amp;lt;/p&amp;gt;
    )
  }
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;./src/pages&lt;/code&gt; 目录下创建 &lt;code&gt;friends.astro&lt;/code&gt; 文件：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; ---
 import links from &quot;public/links.json&quot;;
 import Waline from &quot;../components/Waline.astro&quot;;
 import I18nKey from &quot;../i18n/i18nKey&quot;;
 import { i18n } from &quot;../i18n/translation&quot;;

 // import config from &apos;virtual:config&apos;

 import Markdown from &quot;@components/misc/Markdown.astro&quot;;
 import FriendList from &quot;@/components/links/FriendsList.astro&quot;;
 // import PageLayout from &apos;@/layouts/CommonPage.astro&apos;
 import MainGridLayout from &quot;@/layouts/MainGridLayout.astro&quot;;

 const headings = [
  { depth: 2, slug: &quot;common-links&quot;, text: &quot;Common Links&quot; },
  { depth: 2, slug: &quot;special-links&quot;, text: &quot;Special Links&quot; },
  { depth: 2, slug: &quot;apply-links&quot;, text: &quot;Apply Links&quot; },
 ];

 const { friends } = links;
 // const linksConf = config.integ.links
 const linksConf = {
  // Yourself link info
  applyTip: [
   { name: &quot;Name&quot;, val: &quot;空と海&quot; },
   { name: &quot;Desc&quot;, val: &quot;就算活著沒有意義，偶而還是會碰到好事的。&quot; },
   { name: &quot;Link&quot;, val: &quot;https://chiyoyuki.uk&quot; },
   {
    name: &quot;Avatar&quot;,
    val: &quot;https://cravatar.com/avatar/ac3d325212c82a0bed5aac65b37da52e?s=1024&quot;,
   },
  ],
 };

 const linkEditPage =
  &quot;https://raw.githubusercontent.com/ChiyoYuki/chiyoyuki.github.io/refs/heads/main/public/links.json&quot;;
 ---

 &amp;lt;MainGridLayout
   title={i18n(I18nKey.friends)}
   description={i18n(I18nKey.friends)}
 &amp;gt;
   &amp;lt;div
     class=&quot;flex w-full rounded-[var(--radius-large)] overflow-hidden relative min-h-32&quot;
   &amp;gt;
     &amp;lt;div class=&quot;card-base z-10 px-9 py-6 relative text-90 w-full&quot;&amp;gt;
       &amp;lt;p&amp;gt;怎么可能有顺序呢，当然是随机的~ It&apos;s random&amp;lt;/p&amp;gt;&amp;lt;br /&amp;gt;
       &amp;lt;h2 id=&quot;common-links&quot;&amp;gt;个人收藏&amp;lt;/h2&amp;gt;
       &amp;lt;FriendList list={friends[0]} /&amp;gt;&amp;lt;br /&amp;gt;
       &amp;lt;h2 id=&quot;special-links&quot;&amp;gt;先友后链&amp;lt;/h2&amp;gt;
       &amp;lt;FriendList list={friends[1]} /&amp;gt;&amp;lt;br /&amp;gt;
       &amp;lt;h2 id=&quot;special-links&quot;&amp;gt;先链后友&amp;lt;/h2&amp;gt;
       &amp;lt;FriendList list={friends[2]} /&amp;gt;&amp;lt;br /&amp;gt;
       &amp;lt;h2 id=&quot;special-links&quot;&amp;gt;特殊链接&amp;lt;/h2&amp;gt;
       &amp;lt;FriendList list={friends[3]} /&amp;gt;&amp;lt;br /&amp;gt;

       &amp;lt;!-- apply-links --&amp;gt;
       &amp;lt;Markdown class=&quot;mt-2&quot;&amp;gt;
         &amp;lt;h2 id=&quot;apply-links&quot;&amp;gt;Apply Links&amp;lt;/h2&amp;gt;
         &amp;lt;p&amp;gt;本站信息（点击即可复制）:&amp;lt;/p&amp;gt;
         &amp;lt;blockquote
           class=&quot;not-prose grid grid-cols-[auto_1fr] gap-x-2 break-words border-s-4 ps-4&quot;
         &amp;gt;
           {
             linksConf.applyTip.map(({ name, val }) =&amp;gt; {
               const script = `navigator.clipboard.writeText(&apos;${val}&apos;);document.dispatchEvent(new CustomEvent(&apos;toast&apos;,{detail:{message:&apos;Copied &quot;${val}&quot; to clipboard!&apos;}}))`;
               return (
                 &amp;lt;&amp;gt;
                   &amp;lt;span class=&quot;text-end&quot;&amp;gt;{name}:&amp;lt;/span&amp;gt;
                   &amp;lt;samp class=&quot;cursor-pointer&quot; onclick={script}&amp;gt;
                     {val}
                   &amp;lt;/samp&amp;gt;
                 &amp;lt;/&amp;gt;
               );
             })
           }
         &amp;lt;/blockquote&amp;gt;
         &amp;lt;p&amp;gt;
           可通过下方留言或 &amp;lt;a href={linkEditPage} target=&quot;_blank&quot;&amp;gt;提交 PR&amp;lt;/a&amp;gt; 申请友链。此外申请说明：&amp;lt;br
           /&amp;gt;
           Apply your link by leaving comment or &amp;lt;a
             href={linkEditPage}
             target=&quot;_blank&quot;&amp;gt;Submitting a PR&amp;lt;/a
           &amp;gt;. Additional info:
         &amp;lt;/p&amp;gt;

       &amp;lt;/Markdown&amp;gt;
     &amp;lt;/div&amp;gt;
   &amp;lt;/div&amp;gt;
 &amp;lt;/MainGridLayout&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改i18n信息&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;./src/i18n/i18nKey.ts&lt;/code&gt; 文件中填入 &lt;code&gt;friends = &quot;friends&quot;,&lt;/code&gt; 一项：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;enum I18nKey {
  ...
  author = &quot;author&quot;,
  publishedAt = &quot;publishedAt&quot;,
  license = &quot;license&quot;,
  friends = &quot;friends&quot;,
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 &lt;code&gt;./src/i18n/languages&lt;/code&gt; 下的文件，此以 &lt;code&gt;zh_CN.ts&lt;/code&gt; 为例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const zh_CN: Translation = {
  ...
  [Key.author]: &quot;作者&quot;,
  [Key.publishedAt]: &quot;发布于&quot;,
  [Key.license]: &quot;许可协议&quot;,
  [Key.friends]: &quot;友链&quot;,
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;将友链界面添加至顶栏&lt;/p&gt;
&lt;p&gt;修改 &lt;code&gt;./src/types/config.ts&lt;/code&gt; ，添加 &lt;code&gt;Friends&lt;/code&gt; 一项&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export enum LinkPreset {
   Home = 0,
   Archive = 1,
   About = 2,
   Friends = 3,
  ...
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修改 &lt;code&gt;./src/config.ts&lt;/code&gt; ，添加 &lt;code&gt;LinkPreset.Friends&lt;/code&gt; 一项&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;export const navBarConfig: NavBarConfig = {
   links: [
    ...
    LinkPreset.Home,
    LinkPreset.Archive,
    LinkPreset.About,
    LinkPreset.Friends,
    ...
  ],
};
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;友链朋友圈&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;本小节代码主要修改自仓库 &lt;code&gt;cworld1/astro-theme-pure&lt;/code&gt; 和 &lt;code&gt;willow-god/Friend-Circle-Lite&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;::github{repo=&quot;willow-god/Friend-Circle-Lite&quot;}&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;生成新的 &lt;code&gt;json&lt;/code&gt; 文件&lt;/p&gt;
&lt;p&gt;在 &lt;code&gt;./scripts/&lt;/code&gt; 下（或是别的什么地方）新建 &lt;code&gt;generate-format-friends.cjs&lt;/code&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;const fs = require(&quot;node:fs&quot;);
const path = require(&quot;node:path&quot;);

// 黑名单：不想订阅的站点名称
const blacklist = [&quot;友站名称1&quot;, &quot;友站名称2&quot;, &quot;友站名称3&quot;];
// 只处理前几个分组（与原脚本行为一致）
const lastIndex = 3;

const inputPath = path.resolve(process.cwd(), &quot;public&quot;, &quot;links.json&quot;);
const outputPath = path.resolve(process.cwd(), &quot;public&quot;, &quot;friend.json&quot;);

function loadLinks() {
  if (!fs.existsSync(inputPath)) {
    console.error(`输入文件不存在: ${inputPath}`);
    process.exit(2);
  }
  try {
    const raw = fs.readFileSync(inputPath, &quot;utf8&quot;);
    return JSON.parse(raw);
  } catch (err) {
    console.error(&quot;读取或解析 JSON 失败：&quot;, err);
    process.exit(2);
  }
}

function buildFriendData(data) {
  const friends = [];

  if (!data || !Array.isArray(data.friends)) {
    console.warn(&apos;输入 JSON 中未找到 &quot;friends&quot; 数组，输出将为空。&apos;);
    return { friends: [] };
  }

  data.friends.forEach((group, index) =&amp;gt; {
    if (index &amp;lt; lastIndex) {
      const list = Array.isArray(group.link_list) ? group.link_list : [];
      const filtered = list.filter(
        (item) =&amp;gt; item &amp;amp;&amp;amp; !blacklist.includes(item.name),
      );
      filtered.forEach((item) =&amp;gt; {
        const name = item.name || &quot;&quot;;
        const link = item.link || &quot;&quot;;
        const avatar = item.avatar || &quot;&quot;;
        friends.push([name, link, avatar]);
      });
    }
  });

  return { friends };
}

function writeOutput(obj) {
  try {
    const dir = path.dirname(outputPath);
    if (!fs.existsSync(dir)) fs.mkdirSync(dir, { recursive: true });
    fs.writeFileSync(outputPath, JSON.stringify(obj, null, 2), &quot;utf8&quot;);
    console.log(`已生成：${outputPath}`);
  } catch (err) {
    console.error(&quot;写入输出文件失败：&quot;, err);
    process.exit(2);
  }
}

const data = loadLinks();
const friendData = buildFriendData(data);
writeOutput(friendData);

// 导出以便测试或复用（如果以模块方式引入）
module.exports = { loadLinks, buildFriendData, writeOutput };
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;克隆 &lt;code&gt;willow-god/Friend-Circle-Lite&lt;/code&gt; 并作为公开仓库&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改你的 &lt;code&gt;Friend-Circle-Lite&lt;/code&gt; 仓库中的 &lt;code&gt;./conf.yaml&lt;/code&gt; 文件，使其指向第一步中生成的 &lt;code&gt;json&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;spider_settings:
  ...
  enable: true
  json_url: &quot;https://raw.githubusercontent.com/ChiyoYuki/chiyoyuki.github.io/refs/heads/main/public/friend.json&quot;
  ...
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;修改你的 &lt;code&gt;Friend-Circle-Lite&lt;/code&gt; 仓库的设置，
&lt;code&gt;Settings-Pages-Build and deployment&lt;/code&gt; 中 &lt;code&gt;Source&lt;/code&gt; 选择 &lt;code&gt;Deploy from a brench&lt;/code&gt; ，
&lt;code&gt;Branch&lt;/code&gt; 选择 &lt;code&gt;page&lt;/code&gt; 分支根目录。
然后可以前往 &lt;code&gt;$USER_NAME.github.io/$REPO_NAME&lt;/code&gt; 页面查看是否正常生成&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在友链界面添加朋友圈&lt;/p&gt;
&lt;p&gt;接下来回到博客仓库&lt;/p&gt;
&lt;p&gt;修改 &lt;code&gt;./src/pages/friends.astro&lt;/code&gt; 文件，
其中 &lt;code&gt;private_api_url&lt;/code&gt; 这里修改为上一步生成页面的地址&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
&amp;lt;Markdown class=&quot;mt-2&quot;&amp;gt;
    &amp;lt;h2 id=&apos;small-circle&apos;&amp;gt;Small Circle&amp;lt;/h2&amp;gt;
    &amp;lt;div id=&apos;friend-circle-lite-root&apos; class=&apos;not-prose&apos;&amp;gt;Loading...&amp;lt;/div&amp;gt;
    &amp;lt;script&amp;gt;
    import &apos;@/styles/fc.css&apos;

    import { FriendCircle } from &apos;@/plugins/friend-circle&apos;

    const fc = new FriendCircle()
    fc.init({
    private_api_url: &apos;https://chiyoyuki.uk/Friend-Circle-Lite&apos;,
    page_turning_number: 10,
    error_img: &apos;https://cravatar.cn/avatar/57d8260dfb55501c37dde588e7c3852c&apos;
  })
  fc.load()
  &amp;lt;/script&amp;gt;
  &amp;lt;h2 id=&quot;apply-links&quot;&amp;gt;Apply Links&amp;lt;/h2&amp;gt;
  &amp;lt;p&amp;gt;本站信息 The site information:&amp;lt;/p&amp;gt;
  ...
&amp;lt;/Markdown&amp;gt;
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;./src/plugins/&lt;/code&gt; 文件夹下添加 &lt;code&gt;friend-circle.ts&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;interface Config {
  private_api_url: string;
  page_turning_number: number;
  error_img: string;
}

interface Article {
  title: string;
  link: string | URL;
  avatar: string;
  author: string;
  created: string;
}

interface ArticleData {
  article_data: Article[];
  statistical_data: {
    friends_num: number;
    active_num: number;
    article_num: number;
    last_updated_time: string;
  };
}

export class FriendCircle {
  config!: Config;
  root!: HTMLElement;
  start = 0;
  allArticles: Article[] = [];
  container!: HTMLElement;
  randomArticleContainer!: HTMLElement;
  statsContainer!: HTMLElement;
  loadMoreBtn!: HTMLButtonElement;
  modal!: HTMLElement;

  load() {
    this.loadMoreArticles();
    this.loadMoreBtn.addEventListener(
      &quot;click&quot;,
      this.loadMoreArticles.bind(this),
    );
    window.onclick = (event) =&amp;gt; {
      const modal = document.getElementById(&quot;modal&quot;);
      if (event.target === modal) {
        this.hideModal();
      }
    };
  }

  init(config: Partial&amp;lt;Config&amp;gt;) {
    this.config = {
      private_api_url: config.private_api_url || &quot;&quot;,
      page_turning_number: config.page_turning_number || 20,
      error_img:
        config.error_img ||
        &quot;https://fastly.jsdelivr.net/gh/willow-god/Friend-Circle-Lite@latest/static/favicon.ico&quot;,
    };

    this.root = document.getElementById(
      &quot;friend-circle-lite-root&quot;,
    ) as HTMLElement;
    if (!this.root) return;

    this.root.innerHTML = &quot;&quot;;
    this.createContainers();
  }

  private createContainers() {
    this.randomArticleContainer = this.createElement(&quot;div&quot;, {
      id: &quot;random-article&quot;,
    });
    this.container = this.createElement(&quot;div&quot;, {
      className: &quot;articles-container&quot;,
      id: &quot;articles-container&quot;,
    });
    this.loadMoreBtn = this.createElement(&quot;button&quot;, {
      id: &quot;load-more-btn&quot;,
      innerText: &quot;Load more&quot;,
    }) as HTMLButtonElement;
    this.statsContainer = this.createElement(&quot;div&quot;, {
      id: &quot;stats-container&quot;,
    });

    this.root.append(
      this.randomArticleContainer,
      this.container,
      this.loadMoreBtn,
      this.statsContainer,
    );
  }

  private createElement&amp;lt;K extends keyof HTMLElementTagNameMap&amp;gt;(
    tag: K,
    attributes: Partial&amp;lt;HTMLElementTagNameMap[K]&amp;gt;,
  ): HTMLElementTagNameMap[K] {
    const element = document.createElement(tag);
    Object.assign(element, attributes);
    return element;
  }

  loadMoreArticles() {
    const cacheKey = &quot;friend-circle-lite-cache&quot;;
    const cacheTimeKey = &quot;friend-circle-lite-cache-time&quot;;
    const cacheTime = localStorage.getItem(cacheTimeKey);
    const now = Date.now();

    if (cacheTime &amp;amp;&amp;amp; now - Number(cacheTime) &amp;lt; 10 * 60 * 1000) {
      const cachedDataString = localStorage.getItem(cacheKey);
      const cachedData = cachedDataString
        ? JSON.parse(cachedDataString)
        : null;
      if (cachedData) {
        this.processArticles(cachedData);
        return;
      }
    }

    fetch(`${this.config.private_api_url}all.json`)
      .then((response) =&amp;gt; response.json())
      .then((data) =&amp;gt; {
        localStorage.setItem(cacheKey, JSON.stringify(data));
        localStorage.setItem(cacheTimeKey, now.toString());
        this.processArticles(data);
      })
      .finally(() =&amp;gt; {
        this.loadMoreBtn.innerText = &quot;Load more&quot;;
      });
  }

  processArticles({ article_data, statistical_data }: ArticleData) {
    this.allArticles = article_data;
    this.updateStats(statistical_data);
    this.displayRandomArticle();
    this.displayArticles();
  }

  private updateStats(stats: ArticleData[&quot;statistical_data&quot;]) {
    this.statsContainer.innerHTML = `
      &amp;lt;div&amp;gt;${stats.friends_num} links with ${stats.active_num} active | ${stats.article_num} articles in total&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;Updated at ${stats.last_updated_time}&amp;lt;/div&amp;gt;
      &amp;lt;div&amp;gt;Powered by &amp;lt;a href=&quot;https://github.com/willow-god/Friend-Circle-Lite&quot; target=&quot;_blank&quot;&amp;gt;FriendCircleLite&amp;lt;/a&amp;gt;&amp;lt;br&amp;gt;&amp;lt;/div&amp;gt;
    `;
  }

  private displayArticles() {
    const articles = this.allArticles.slice(
      this.start,
      this.start + this.config.page_turning_number,
    );
    articles.forEach((article) =&amp;gt; {
      this.createArticleCard(article);
    });
    this.start += this.config.page_turning_number;

    if (this.start &amp;gt;= this.allArticles.length) {
      this.loadMoreBtn.style.display = &quot;none&quot;;
    }
  }

  private createArticleCard(article: Article) {
    const card = document.createElement(&quot;div&quot;);
    card.className = &quot;article&quot;;
    card.innerHTML = `
      &amp;lt;div class=&quot;article-image author-click&quot;&amp;gt;
        &amp;lt;img class=&quot;no-lightbox&quot; src=&quot;${article.avatar || this.config.error_img}&quot; onerror=&quot;this.src=&apos;${this.config.error_img}&apos;&quot;&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;article-container&quot;&amp;gt;
        &amp;lt;div class=&quot;article-author author-click&quot;&amp;gt;${article.author}&amp;lt;/div&amp;gt;
        &amp;lt;a class=&quot;article-title&quot; href=&quot;${article.link instanceof URL ? article.link.toString() : article.link}&quot; target=&quot;_blank&quot;&amp;gt;${article.title}&amp;lt;/a&amp;gt;
        &amp;lt;div class=&quot;article-date&quot;&amp;gt;️${article.created.substring(0, 10)}&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
    `;
    card.querySelectorAll(&quot;.author-click&quot;).forEach((el) =&amp;gt; {
      el.addEventListener(&quot;click&quot;, () =&amp;gt; {
        this.showAuthorArticles(
          article.author,
          article.avatar,
          article.link,
        );
      });
    });
    this.container.appendChild(card);
  }

  displayRandomArticle() {
    const randomArticle =
      this.allArticles[Math.floor(Math.random() * this.allArticles.length)];
    this.randomArticleContainer.innerHTML = `
      &amp;lt;div class=&quot;random-title&quot;&amp;gt;Random Poll&amp;lt;/div&amp;gt;
      &amp;lt;div class=&quot;article-container&quot;&amp;gt;
        &amp;lt;div class=&quot;article-author&quot;&amp;gt;${randomArticle.author}&amp;lt;/div&amp;gt;
        &amp;lt;a class=&quot;article-title&quot; href=&quot;${randomArticle.link}&quot; target=&quot;_blank&quot;&amp;gt;${randomArticle.title}&amp;lt;/a&amp;gt;
        &amp;lt;div class=&quot;article-date&quot;&amp;gt;️${randomArticle.created.substring(0, 10)}&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      &amp;lt;button id=&quot;random-refresh&quot;&amp;gt;
        &amp;lt;svg xmlns=&quot;http://www.w3.org/2000/svg&quot; width=&quot;32&quot; height=&quot;32&quot; viewBox=&quot;0 0 24 24&quot;&amp;gt;&amp;lt;g fill=&quot;none&quot;&amp;gt;&amp;lt;path d=&quot;M24 0v24H0V0zM12.593 23.258l-.011.002l-.071.035l-.02.004l-.014-.004l-.071-.035q-.016-.005-.024.005l-.004.01l-.017.428l.005.02l.01.013l.104.074l.015.004l.012-.004l.104-.074l.012-.016l.004-.017l-.017-.427q-.004-.016-.017-.018m.265-.113l-.013.002l-.185.093l-.01.01l-.003.011l.018.43l.005.012l.008.007l.201.093q.019.005.029-.008l.004-.014l-.034-.614q-.005-.019-.02-.022m-.715.002a.02.02 0 0 0-.027.006l-.006.014l-.034.614q.001.018.017.024l.015-.002l.201-.093l.01-.008l.004-.011l.017-.43l-.003-.012l-.01-.01z&quot;/&amp;gt;&amp;lt;path fill=&quot;currentColor&quot; d=&quot;M2 12.08c-.006-.862.91-1.356 1.618-.975l.095.058l2.678 1.804c.972.655.377 2.143-.734 2.007l-.117-.02l-1.063-.234a8.002 8.002 0 0 0 14.804.605a1 1 0 0 1 1.82.828c-1.987 4.37-6.896 6.793-11.687 5.509A10 10 0 0 1 2 12.08m.903-4.228C4.89 3.482 9.799 1.06 14.59 2.343a10 10 0 0 1 7.414 9.581c.007.863-.91 1.358-1.617.976l-.096-.058l-2.678-1.804c-.972-.655-.377-2.143.734-2.007l.117.02l1.063.234A8.002 8.002 0 0 0 4.723 8.68a1 1 0 1 1-1.82-.828&quot;/&amp;gt;&amp;lt;/g&amp;gt;&amp;lt;/svg&amp;gt;
      &amp;lt;/button&amp;gt;
    `;
    this.randomArticleContainer
      .querySelector(&quot;button#random-refresh&quot;)
      ?.addEventListener(&quot;click&quot;, (event) =&amp;gt; {
        event.preventDefault();
        this.displayRandomArticle();
      });
  }

  // Enable modal
  showAuthorArticles(author: string, avatar: string, link: string | URL) {
    if (!document.getElementById(&quot;fclite-modal&quot;)) {
      const modal = this.createElement(&quot;div&quot;, {
        id: &quot;modal&quot;,
        className: &quot;modal&quot;,
      });
      modal.innerHTML = `
      &amp;lt;div class=&quot;modal-content&quot;&amp;gt;
        &amp;lt;div class=&quot;modal-header&quot;&amp;gt;
          &amp;lt;img class=&quot;modal-author-avatar&quot; src=&quot;${avatar || this.config.error_img}&quot; alt=&quot;&quot;&amp;gt;
          &amp;lt;a class=&quot;modal-author-name-link&quot; href=&quot;${new URL(link.toString()).origin}&quot; target=&quot;_blank&quot;&amp;gt;${author}&amp;lt;/a&amp;gt;
        &amp;lt;/div&amp;gt;
        &amp;lt;div id=&quot;modal-articles-container&quot;&amp;gt;&amp;lt;/div&amp;gt;
      &amp;lt;/div&amp;gt;
      `;
      this.root.appendChild(modal);
    }
    this.modal = document.getElementById(&quot;modal&quot;) as HTMLElement;
    const modalArticlesContainer = document.getElementById(
      &quot;modal-articles-container&quot;,
    ) as HTMLElement;
    const authorArticles = this.allArticles.filter(
      (article) =&amp;gt; article.author === author,
    );
    authorArticles.slice(0, 4).forEach((article) =&amp;gt; {
      const articleTemplate = `
        &amp;lt;div class=&quot;modal-article&quot;&amp;gt;
          &amp;lt;a class=&quot;modal-article-title&quot; href=&quot;${article.link instanceof URL ? article.link.toString() : article.link}&quot; target=&quot;_blank&quot;&amp;gt;${article.title}&amp;lt;/a&amp;gt;
          &amp;lt;div class=&quot;modal-article-date&quot;&amp;gt;${article.created.substring(0, 10)}&amp;lt;/div&amp;gt;
        &amp;lt;/div&amp;gt;`;
      modalArticlesContainer.insertAdjacentHTML(
        &quot;beforeend&quot;,
        articleTemplate,
      );
    });

    this.modal.style.display = &quot;block&quot;;
    setTimeout(() =&amp;gt; {
      this.modal.classList.add(&quot;modal-open&quot;);
    }, 10);
  }

  hideModal() {
    this.modal.classList.remove(&quot;modal-open&quot;);
    this.modal.addEventListener(
      &quot;transitionend&quot;,
      () =&amp;gt; {
        this.modal.style.display = &quot;none&quot;;
        this.root.removeChild(this.modal);
      },
      { once: true },
    );
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在 &lt;code&gt;./src/styles/&lt;/code&gt; 文件夹下添加 &lt;code&gt;fc.css&lt;/code&gt; 文件&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/* Random article */
#random-article {
  display: flex;
  margin-bottom: 0.7rem;
  column-gap: 0.7rem;
  align-items: center;
}
.random-title {
  color: hsl(var(--foreground));
  white-space: nowrap;
}
#random-refresh {
  height: 2.35rem;
  aspect-ratio: 1;
  display: grid;
  place-items: center;
  border-radius: 0.75rem;
  border: 1px solid hsl(var(--border));
  transition: background-color 0.2s;
}
#random-refresh:hover {
  background-color: hsl(var(--primary-foreground));
}
#random-refresh svg {
  width: 1.25rem;
  height: 1.25rem;
}
@media (max-width: 640px) {
  #random-article {
    flex-wrap: wrap;
    row-gap: 0.3rem;
    margin-bottom: 1.5rem;
  }
  .random-title {
    flex-grow: 1;
  }
  .article-container {
    order: 3;
    flex-basis: 100%;
  }
  #random-refresh {
    height: max-content;
    padding: 0.2rem;
  }
}

/* Modal */
.modal {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: hsl(var(--background) / 0.3);
  --tw-blur: blur(24px);
  backdrop-filter: var(--tw-blur) var(--tw-brightness) var(--tw-contrast)
    var(--tw-grayscale) var(--tw-hue-rotate) var(--tw-invert)
    var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
  -webkit-backdrop-filter: var(--tw-blur) var(--tw-brightness)
    var(--tw-contrast) var(--tw-grayscale) var(--tw-hue-rotate)
    var(--tw-invert) var(--tw-saturate) var(--tw-sepia) var(--tw-drop-shadow);
  z-index: 999;
  opacity: 0;
  visibility: hidden;
  transition:
    opacity 0.3s ease-in-out,
    visibility 0.3s ease-in-out;
}
.modal.modal-open {
  opacity: 1;
  visibility: visible;
}
.modal-content {
  opacity: 0;
  position: relative;
  top: 50%;
  left: 50%;
  transform: translate(-50%, -50%) translateY(-50px);
  width: 40rem;
  z-index: 1000;
  max-height: 90%;
  transition:
    transform 0.3s ease-in-out,
    opacity 0.3s ease-in-out;
  overflow: hidden;
  display: flex;
  flex-direction: column;
}
@media screen and (max-width: 675px) {
  .modal-content {
    width: 90%;
  }
}
.modal.modal-open .modal-content {
  transform: translate(-50%, -50%) translateY(0);
  opacity: 1;
}
.modal-header {
  display: flex;
  justify-content: center;
  align-items: center;
  column-gap: 0.9rem;
  padding: 0.7rem 1rem;
}
.modal-author-avatar {
  border-radius: 999px;
  width: 3rem;
  height: 3rem;
}
.modal-author-name-link {
  text-decoration: none;
}
#modal-articles-container {
  background-color: hsl(var(--primary-foreground));
  border: 1px solid hsl(var(--border));
  padding: 0.7rem 0.7rem;
  border-radius: 0.75rem;
  overflow-y: scroll;
  display: flex;
  flex-direction: column;
  row-gap: 0.7rem;
}
.modal-article .modal-article-title {
  cursor: pointer;
  text-decoration: none;
  display: -webkit-box;
  -webkit-line-clamp: 2;
  line-clamp: 2;
  -webkit-box-orient: vertical;
  overflow: hidden;
  text-overflow: ellipsis;
}
.modal-article .modal-article-date {
  font-size: 0.75rem;
  line-height: 1rem;
  text-align: right;
}

/* Articles */
.articles-container {
  display: flex;
  flex-direction: column;
  row-gap: 0.7rem;
}
.article {
  display: flex;
  align-items: center;
  column-gap: 0.7rem;
}
.article-image img {
  border-radius: 999px;
  min-width: 2rem;
  min-height: 2rem;
  width: 2rem;
  height: 2rem;
}
.article-container {
  flex-grow: 1;
  border-radius: 0.75rem;
  padding: 0.3rem 1rem;
  border: 1px solid hsl(var(--border));
  display: flex;
  align-items: center;
  column-gap: 0.6rem;
  transition: background-color 0.2s;
}
.article-container:hover {
  background-color: hsl(var(--primary-foreground));
}
.author-click {
  cursor: pointer;
}
.article-author {
  white-space: nowrap;
}
.article-title {
  overflow: hidden;
  display: -webkit-box;
  -webkit-box-orient: vertical;
  -webkit-line-clamp: 1;
  line-clamp: 1;
  flex-grow: 1;
  text-decoration: none;
  color: hsl(var(--foreground));
  transition: color 0.2s;
}
.article-date {
  font-family:
    ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, &quot;Liberation Mono&quot;,
    &quot;Courier New&quot;, monospace;
  font-size: 0.75rem;
  line-height: 1rem;
}
@media (max-width: 640px) {
  .article {
    align-items: start;
  }
  .article-image {
    margin-top: 0.3rem;
  }
  .article-container {
    flex-wrap: wrap;
  }
  .article-author {
    flex-grow: 1;
  }
  .article-title {
    order: 3;
    flex-basis: 100%;
  }
}
/* Load more */
#load-more-btn {
  background-color: hsl(var(--primary-foreground));
  border: 1px solid hsl(var(--border));
  border-radius: 0.75rem;
  padding: 0.2rem 1rem;
  margin: 0.75rem auto;
  display: block;
  transition:
    color 0.2s,
    background-color 0.2s;
}
#load-more-btn:hover {
  color: hsl(var(--primary));
  background-color: hsl(var(--input));
}
/* Status */
#stats-container {
  font-size: 0.75rem;
  line-height: 1rem;
  text-align: right;
}
#stats-container &amp;gt; * {
  margin-bottom: 0.2rem;
}
#stats-container a {
  color: hsl(var(--foreground));
  text-decoration: none;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;理论上这样就配置好了，
需要注意的是当前配置是半自动的，
每次增删调改友链后要重新生成 &lt;code&gt;json&lt;/code&gt; 文件，
你需要在博客仓库根目录下执行如下指令：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;node scripts/generate-format-friends.cjs
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为作品&lt;a href=&quot;https://key.visualarts.gr.jp/summer_rb/&quot;&gt;Summer Pockets REFLECTION BLUE&lt;/a&gt;中的 CG&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>博客折腾指北0x01 - 博客与笔记</title><link>https://blog.chiyo.uk/posts/2025110922/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025110922/</guid><description>我突然发现我可以把一篇博文拆成好几篇来水</description><pubDate>Sun, 09 Nov 2025 14:21:28 GMT</pubDate><content:encoded>&lt;h1&gt;博客与笔记&lt;/h1&gt;
&lt;p&gt;本篇文章主要叙述安装博客与将原有的笔记页面以外链形式加入。&lt;/p&gt;
&lt;p&gt;这篇文章大多是准备部分，
按照文档按部就班来就可以那种，
我这种半吊子水平写出来的文章估计参考价值不大，
所以我也没写太多，
请酌情参考。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;saicaca/fuwari&quot;}&lt;/p&gt;
&lt;p&gt;先在电脑上安装好 &lt;code&gt;node&lt;/code&gt; 和 &lt;code&gt;npm&lt;/code&gt; 然后执行 &lt;code&gt;npm create fuwari@latest&lt;/code&gt; 就行。
因为我用的是 &lt;code&gt;pnpm&lt;/code&gt; ，所以对应的指令是 &lt;code&gt;pnpm create fuwari@latest&lt;/code&gt; 。
当然也可以通过官方仓库 &lt;code&gt;README.md&lt;/code&gt; 中 &lt;a href=&quot;https://github.com/new?template_name=fuwari&amp;amp;template_owner=saicaca&quot;&gt;从模板创建&lt;/a&gt; 的方法。&lt;/p&gt;
&lt;p&gt;然后在博客主文件夹下执行 &lt;code&gt;pnpm install&lt;/code&gt; 来安装依赖。
没有 &lt;code&gt;pnpm&lt;/code&gt; 的话需要先执行 &lt;code&gt;npm install -g pnpm&lt;/code&gt; 安装。&lt;/p&gt;
&lt;h2&gt;基础配置&lt;/h2&gt;
&lt;h3&gt;&lt;code&gt;./astro.config.mjs&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;因为我习惯将静态页面部署到 Github Pages 上，
参照&lt;a href=&quot;https://docs.astro.build/zh-cn/guides/deploy/github/&quot;&gt;官方配置&lt;/a&gt;进行配置，
主要修改了 &lt;code&gt;site&lt;/code&gt; 和 &lt;code&gt;base&lt;/code&gt; 两项。&lt;/p&gt;
&lt;p&gt;如果使用自己域名的话，
需要在 &lt;code&gt;./public&lt;/code&gt; 文件夹下新增 &lt;code&gt;CNAME&lt;/code&gt; 文件，
内写入使用的域名。&lt;/p&gt;
&lt;h3&gt;&lt;code&gt;./src/config.ts&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;这个文件需要修改的会比较多，
好在&lt;a href=&quot;https://github.com/saicaca/fuwari/blob/main/src/config.ts&quot;&gt;官方示例&lt;/a&gt;给的注释都很全面，
对着修改就好。&lt;/p&gt;
&lt;p&gt;在此给出我的修改对比，以供参考。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import type {
  ExpressiveCodeConfig,
  LicenseConfig,
  NavBarConfig,
  ProfileConfig,
  SiteConfig,
} from &quot;./types/config&quot;;
import { LinkPreset } from &quot;./types/config&quot;;

export const siteConfig: SiteConfig = {
  title: &quot;Fuwari&quot;,
  subtitle: &quot;Demo Site&quot;,
  lang: &quot;en&quot;, // Language code, e.g. &apos;en&apos;, &apos;zh_CN&apos;, &apos;ja&apos;, etc.
  title: &quot;SoraToUmi&quot;,
  subtitle: &quot;この綺麗世界&quot;,
  lang: &quot;zh_CN&quot;, // Language code, e.g. &apos;en&apos;, &apos;zh_CN&apos;, &apos;ja&apos;, etc.
  themeColor: {
    hue: 250, // Default hue for the theme color, from 0 to 360. e.g. red: 0, teal: 200, cyan: 250, pink: 345
    fixed: false, // Hide the theme color picker for visitors
  },
  banner: {
    enable: false,
    src: &quot;assets/images/demo-banner.png&quot;, // Relative to the /src directory. Relative to the /public directory if it starts with &apos;/&apos;
    position: &quot;center&quot;, // Equivalent to object-position, only supports &apos;top&apos;, &apos;center&apos;, &apos;bottom&apos;. &apos;center&apos; by default
    credit: {
      enable: false, // Display the credit text of the banner image
      text: &quot;&quot;, // Credit text to be displayed
      url: &quot;&quot;, // (Optional) URL link to the original artwork or artist&apos;s page
    },
  },
  toc: {
    enable: true, // Display the table of contents on the right side of the post
    depth: 2, // Maximum heading depth to show in the table, from 1 to 3
  },
  favicon: [
    // Leave this array empty to use the default favicon
    // {
    //   src: &apos;/favicon/icon.png&apos;,    // Path of the favicon, relative to the /public directory
    //   theme: &apos;light&apos;,              // (Optional) Either &apos;light&apos; or &apos;dark&apos;, set only if you have different favicons for light and dark mode
    //   sizes: &apos;32x32&apos;,              // (Optional) Size of the favicon, set only if you have favicons of different sizes
    // }
  ],
};

export const navBarConfig: NavBarConfig = {
  links: [
    LinkPreset.Home,
    LinkPreset.Archive,
    LinkPreset.About,
    {
      name: &quot;GitHub&quot;,
      url: &quot;https://github.com/saicaca/fuwari&quot;, // Internal links should not include the base path, as it is automatically added
      url: &quot;https://github.com/chiyoyuki/chiyoyuki.github.io&quot;, // Internal links should not include the base path, as it is automatically added
      external: true, // Show an external link icon and will open in a new tab
    },
  ],
};

export const profileConfig: ProfileConfig = {
  avatar: &quot;assets/images/demo-avatar.png&quot;, // Relative to the /src directory. Relative to the /public directory if it starts with &apos;/&apos;
  name: &quot;Lorem Ipsum&quot;,
  bio: &quot;Lorem ipsum dolor sit amet, consectetur adipiscing elit.&quot;,
  avatar: &quot;assets/images/aino_sns_icon1.jpg&quot;, // Relative to the /src directory. Relative to the /public directory if it starts with &apos;/&apos;
  name: &quot;千代有希&quot;,
  bio: &quot;ignoramus et ignorabimus&quot;,
  links: [
    // {
    // name: &quot;Twitter&quot;,
    // icon: &quot;fa6-brands:twitter&quot;, // Visit https://icones.js.org/ for icon codes
    // // You will need to install the corresponding icon set if it&apos;s not already included
    // // `pnpm add @iconify-json/&amp;lt;icon-set-name&amp;gt;`
    // url: &quot;https://twitter.com&quot;,
    // },
    // {
    // name: &quot;Steam&quot;,
    // icon: &quot;fa6-brands:steam&quot;,
    // url: &quot;https://store.steampowered.com&quot;,
    // },
    {
      name: &quot;GitHub&quot;,
      icon: &quot;fa6-brands:github&quot;,
      url: &quot;https://github.com/saicaca/fuwari&quot;,
      url: &quot;https://github.com/chiyoyuki&quot;,
    },
  ],
};

export const licenseConfig: LicenseConfig = {
  enable: true,
  name: &quot;CC BY-NC-SA 4.0&quot;,
  url: &quot;https://creativecommons.org/licenses/by-nc-sa/4.0/&quot;,
};

export const expressiveCodeConfig: ExpressiveCodeConfig = {
  // Note: Some styles (such as background color) are being overridden, see the astro.config.mjs file.
  // Please select a dark theme, as this blog theme currently only supports dark background color
  theme: &quot;github-dark&quot;,
};
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;笔记页面&lt;/h2&gt;
&lt;p&gt;::github{repo=&quot;squidfunk/mkdocs-material&quot;}&lt;/p&gt;
&lt;p&gt;我觉得点进去笔记页面的基本都能看出来笔记页面与博客页面格格不入。
那是因为笔记页面采用了&lt;a href=&quot;https://squidfunk.github.io/mkdocs-material/&quot;&gt;Material for MkDocs&lt;/a&gt;。&lt;br /&gt;
（之前跟别人写另一个文档的时候被吐槽这个框架太性冷淡风了orz）&lt;/p&gt;
&lt;p&gt;按照官方文档将其部署到另一个仓库中，
就可以通过 &lt;code&gt;$DOMAIN/$REPO-NAME&lt;/code&gt; 访问子页面。&lt;/p&gt;
&lt;p&gt;比如说我将笔记部署到了 &lt;code&gt;chiyoyuki/note&lt;/code&gt; 仓库中，
我就可以通过 &lt;code&gt;chiyoyuki.github.io/note&lt;/code&gt; 访问笔记页面。&lt;/p&gt;
&lt;p&gt;（与 &lt;code&gt;$NAME.github.io&lt;/code&gt; 仓库下子页面命名冲突的情况我还没试过）&lt;/p&gt;
&lt;p&gt;然后修改 &lt;code&gt;./src/config.ts&lt;/code&gt; 即可&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;...
export const navBarConfig: NavBarConfig = {
 links: [
  ...
  LinkPreset.Home,
  LinkPreset.Archive,
  LinkPreset.About,
  {
    icon: &quot;fa6-solid:note-sticky&quot;,
    name: &quot;笔记&quot;,
    url: &quot;/note/&quot;,
  },
  ...
 ],
};
...
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你有 i18n 需求的话，请参考&lt;a href=&quot;../2025111000/#%E5%8F%8B%E9%93%BE%E9%A1%B5%E9%9D%A2&quot;&gt;本系列第0x02篇友链页面小节&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为&lt;a href=&quot;https://www.pixiv.net/users/1799712&quot;&gt;電竜ライ&lt;/a&gt;所绘制的&lt;a href=&quot;https://x.com/key_official/status/1986403190108221904&quot;&gt;作品&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>AtCoder Beginner Contest 431</title><link>https://blog.chiyo.uk/posts/2025110822/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025110822/</guid><description>A/B/C/D; rk2294</description><pubDate>Sat, 08 Nov 2025 14:39:17 GMT</pubDate><content:encoded>&lt;h1&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431&quot;&gt;AtCoder Beginner Contest 431&lt;/a&gt; 记录&lt;/h1&gt;
&lt;p&gt;大概是复健第一场 atc （上次 430 打得太烂被我除名了）&lt;/p&gt;
&lt;h2&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_a&quot;&gt;A - Robot Balance&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;2 sec / 1024 MiB / 100 pts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Problem Statement&lt;/h3&gt;
&lt;p&gt;Takahashi can combine a head part and a body part to create a robot. A robot falls over if the weight of the head part is greater than the weight of the body part.&lt;/p&gt;
&lt;p&gt;Currently, he has one head part and one body part. The weight of the head part is $H$ grams, and the weight of the body part is $B$ grams.&lt;/p&gt;
&lt;p&gt;He wants to make the body part heavier so that the robot does not fall over. Find how many more grams the body part needs to be made heavier so that his robot does not fall over.&lt;/p&gt;
&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$1\le H\le100$&lt;/li&gt;
&lt;li&gt;$1\le B\le100$&lt;/li&gt;
&lt;li&gt;All input values are integers.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Input&lt;/h3&gt;
&lt;p&gt;The input is given from Standard Input in the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$H$ $B$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;Print the answer.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;本题只需要判断 $H$ 是否小于等于 $B$ 即可，
小于等于输出 $0$ ，反之输出 $H-B$ 。
最基本的分支结构练习，没什么好说的。&lt;/p&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

int main() {
  int h,b;
  cin &amp;gt;&amp;gt; h &amp;gt;&amp;gt; b;
  cout &amp;lt;&amp;lt; max(0,h-b);
  cout &amp;lt;&amp;lt; &apos;\n&apos;;
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_b&quot;&gt;B - Robot Weight&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;2 sec / 1024 MiB / 200 pts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Problem Statement&lt;/h3&gt;
&lt;p&gt;There is a robot, and initially the weight of the robot is $X$. This robot has $N$ types of parts that can be attached simultaneously: type $1,$ type $2,\ldots,$ type $N$. The weight of the type $i\ (1\le i\le N)$ part is $W _ i$. Initially, none of the $N$ types of parts are attached to the robot.&lt;/p&gt;
&lt;p&gt;Process the following $Q$ queries in order. The $i$-th query $(1\le i\le Q)$ is represented by an integer $P _ i$ and is as follows:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If the type $P _ i$ part is not currently attached to the robot, attach it; if it is attached, remove it. Then, print the current weight of the robot.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$1\le X\le100$&lt;/li&gt;
&lt;li&gt;$1\le N\le100$&lt;/li&gt;
&lt;li&gt;$1\le W _ i\le100\ (1\le i\le N)$&lt;/li&gt;
&lt;li&gt;$1\le Q\le100$&lt;/li&gt;
&lt;li&gt;$1\le P _ i\le N\ (1\le i\le Q)$&lt;/li&gt;
&lt;li&gt;All input values are integers.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Input&lt;/h3&gt;
&lt;p&gt;The input is given from Standard Input in the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$X$&lt;br /&gt;
$N$&lt;br /&gt;
$W _ 1$ $W _ 2$ $\ldots$ $W _ N$&lt;br /&gt;
$Q$&lt;br /&gt;
$P _ 1$&lt;br /&gt;
$P _ 2$&lt;br /&gt;
$\vdots$&lt;br /&gt;
$P _ Q$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;Output $Q$ lines. The $i$-th line $(1\le i\le Q)$ should contain the result of processing the $i$-th query.&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;将第 $i$ 个零件是否安装在机器人上用逻辑 &lt;code&gt;true&lt;/code&gt; 和 &lt;code&gt;false&lt;/code&gt; 表示，
不难发现每次 $P$ 操作就是在对这个零件进行 &lt;code&gt;xor&lt;/code&gt; 操作。&lt;/p&gt;
&lt;p&gt;所以只需要单开一个布尔数组用以记录零件是否被安装，
然后每次操作根据被操作零件当前状态对总重量进行加减，
最后对应布尔变量执行异或操作即可。&lt;/p&gt;
&lt;p&gt;需要注意的是机器人初始重量为 $X$ 。&lt;/p&gt;
&lt;p&gt;当然像我一样直接开一个 &lt;code&gt;pair&lt;/code&gt; 也可以。&lt;/p&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

int main() {
  int x,n;
  cin &amp;gt;&amp;gt; x &amp;gt;&amp;gt; n;
  vector&amp;lt;pair&amp;lt;int,int&amp;gt;&amp;gt; w(n,{0,0});
  for(int i = 0; i &amp;lt; n; i++) {
    cin &amp;gt;&amp;gt; w[i].first;
  }
  int q;
  int p;
  cin &amp;gt;&amp;gt; q;
  for(int i = 0; i&amp;lt; q; i++) {
    cin &amp;gt;&amp;gt; p;
    p--;
    if(w[p].second) {
      x -= w[p].first;
    }
    else {
      x += w[p].first;
    }
    w[p].second = !w[p].second;
    cout &amp;lt;&amp;lt; x &amp;lt;&amp;lt;&apos;\n&apos;;
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_c&quot;&gt;C - Robot Factory&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;2 sec / 1024 MiB / 300 pts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Problem Statement&lt;/h3&gt;
&lt;p&gt;Takahashi can combine a head part and a body part to create a robot. A robot falls over if the weight of the head part is greater than the weight of the body part.&lt;/p&gt;
&lt;p&gt;Currently, he has $N$ head parts and $M$ body parts. The weight of the $i$-th $(1\le i\le N)$ head part is $H _ i$ grams, and the weight of the $i$-th $(1\le i\le M)$ body part is $B _ i$ grams.&lt;/p&gt;
&lt;p&gt;He wants to create a total of $K$ robots that do not fall over by appropriately combining the parts he has. Determine whether he can achieve his goal by combining the parts well.&lt;/p&gt;
&lt;p&gt;Here, a part cannot be used to create multiple robots, and two or more head parts (or two or more body parts) cannot be used to create one robot.&lt;/p&gt;
&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$1\le N\le2\times10 ^ 5$&lt;/li&gt;
&lt;li&gt;$1\le M\le2\times10 ^ 5$&lt;/li&gt;
&lt;li&gt;$1\le K\le\min\lbrace N,M\rbrace$&lt;/li&gt;
&lt;li&gt;$1\le H _ i\le10 ^ 9\ (1\le i\le N)$&lt;/li&gt;
&lt;li&gt;$1\le B _ i\le10 ^ 9\ (1\le i\le M)$&lt;/li&gt;
&lt;li&gt;All input values are integers.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Input&lt;/h3&gt;
&lt;p&gt;The input is given from Standard Input in the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$N$ $M$ $K$&lt;br /&gt;
$H _ 1$ $H _ 2$ $\ldots$ $H _ N$&lt;br /&gt;
$B _ 1$ $B _ 2$ $\ldots$ $B _ M$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;Print &lt;code&gt;Yes&lt;/code&gt; if Takahashi can combine the parts well to create $K$ robots that do not fall over; otherwise, print &lt;code&gt;No&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;题目是要在数列 ${H_N}$ 和 ${B_M}$ 中找到 $K$ 个完全不同的二元对 $H_i\leq B_j$，
所以只需考虑最小的 $K$ 个 $H$ 和最大的 $K$ 个 $B$ 是否可以配对即可。&lt;/p&gt;
&lt;p&gt;最开始在敲代码的时候犯了“田忌赛马式”的错误，用最小的 $H$ 去和最大的 $B$ 配对。
需要注意的是在保留上文提及的 $K$ 个元素后，应当以第 $i$ 小的 $H$ 和第 $i$ 小的 $B$ 配对。&lt;/p&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

int main() {
  int n,m,k;
  cin &amp;gt;&amp;gt; n &amp;gt;&amp;gt; m &amp;gt;&amp;gt; k;
  vector&amp;lt;int&amp;gt; h(n),b(m);
  for(int i = 0; i &amp;lt; n; i++) {
    cin &amp;gt;&amp;gt; h[i];
  }
  for(int i = 0; i &amp;lt; m; i++) {
    cin &amp;gt;&amp;gt; b[i];
  }
  sort(h.begin(),h.end());
  sort(b.begin(),b.end());
  for(int i = 0; i &amp;lt; k; i++) {
    if(h[i] &amp;gt; b[m-k+i]) {
      cout &amp;lt;&amp;lt; &quot;No&quot;;
      return 0;
    }
  }
  cout &amp;lt;&amp;lt; &quot;Yes&quot;;
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;&lt;a href=&quot;https://atcoder.jp/contests/abc431/tasks/abc431_d&quot;&gt;D - Robot Customize&lt;/a&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;2 sec / 1024 MiB / 400 pts&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Problem Statement&lt;/h3&gt;
&lt;p&gt;There is a robot consisting of a head and a body. This robot has $N$ types of parts that can be attached simultaneously: type $1,$ type $2,\ldots,$ type $N$. The weight of the type $i\ (1\le i\le N)$ part is $W _ i$. Each part has a different &lt;strong&gt;happiness&lt;/strong&gt; when attached to the head versus when attached to the body. The happiness when the type $i\ (1\le i\le N)$ part is attached to the head is $H _ i$, and the happiness when attached to the body is $B _ i$.&lt;/p&gt;
&lt;p&gt;The robot falls over if the weight of the head is greater than the weight of the body. Here, the weight of the head and the weight of the body are the sums of the weights of the parts attached to the head or body, respectively.&lt;/p&gt;
&lt;p&gt;Takahashi wants to attach all $N$ types of parts to the robot, one of each. Find the maximum possible sum of the happiness of all parts when the parts are attached without causing the robot to fall over.&lt;/p&gt;
&lt;h3&gt;Constraints&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;$1\le N\le500$&lt;/li&gt;
&lt;li&gt;$1\le W _ i\le500\ (1\le i\le N)$&lt;/li&gt;
&lt;li&gt;$1\le H _ i\le10 ^ 9\ (1\le i\le N)$&lt;/li&gt;
&lt;li&gt;$1\le B _ i\le10 ^ 9\ (1\le i\le N)$&lt;/li&gt;
&lt;li&gt;All input values are integers.&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3&gt;Input&lt;/h3&gt;
&lt;p&gt;The input is given from Standard Input in the following format:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;$N$&lt;br /&gt;
$W _ 1$ $H _ 1$ $B _ 1$&lt;br /&gt;
$W _ 2$ $H _ 2$ $B _ 2$&lt;br /&gt;
$\vdots$&lt;br /&gt;
$W _ N$ $H _ N$ $B _ N$&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;Output&lt;/h3&gt;
&lt;p&gt;Print the maximum possible sum of the happiness of all parts when the parts are attached without causing the robot to fall over.&lt;/p&gt;
&lt;h3&gt;思路&lt;/h3&gt;
&lt;p&gt;不妨先让所有零件组成身体，然后从中选取一部分零件组成头部，
组成头部零件的总重量要小于等于身体的总重量。&lt;/p&gt;
&lt;p&gt;于是题目可以转化为总容纳质量为 $\frac{\sum_{i=1}^{N} W}{2}$ ，
每个物品价值为 $H_i-B_i$ 的 01 背包问题，
dp 求解即可。&lt;/p&gt;
&lt;p&gt;写代码的时候忘了 &lt;a href=&quot;https://oi-wiki.org/dp/knapsack/&quot;&gt;01 背包 dp&lt;/a&gt; 怎么写，现去看的 wiki 。&lt;/p&gt;
&lt;h3&gt;代码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;bits/stdc++.h&amp;gt;

using namespace std;

int main() {
  int n;
  long long w = 0,happy = 0;
  cin &amp;gt;&amp;gt; n;
  vector&amp;lt;pair&amp;lt;int,int&amp;gt;&amp;gt; a(n);
  for(int i = 0; i&amp;lt;n; i++) {
    cin &amp;gt;&amp;gt; a[i].first;
    int h,b;
    cin &amp;gt;&amp;gt; h &amp;gt;&amp;gt; b;
    a[i].second = h-b;
    happy += b;
    w+=a[i].first;
  }
  w &amp;gt;&amp;gt;= 1;
  vector&amp;lt;long long&amp;gt; dp(w+1);
  for(int i = 0; i &amp;lt; n;i ++) {
    for(int j = w; j &amp;gt;= a[i].first; j --) {
      dp[j] = max(dp[j],dp[j-a[i].first]+a[i].second);
    }
  }
  cout &amp;lt;&amp;lt; happy + dp[w];
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为作品&lt;a href=&quot;https://atri-mdm.com/&quot;&gt;ATRI -My Dear Moments-&lt;/a&gt;中的&lt;a href=&quot;https://atri-mdm.com/gallery/&quot;&gt;CG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>程设基础讲义1</title><link>https://blog.chiyo.uk/posts/2025110415/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025110415/</guid><pubDate>Tue, 04 Nov 2025 07:26:38 GMT</pubDate><content:encoded>&lt;h1&gt;讲义&lt;/h1&gt;
&lt;p&gt;各位同学下午好。这份讲义的 pdf 和 md 格式我应该在早些时候发到群里了。&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;code&gt;遇见问题需要他人协助解决问题&lt;/code&gt;的基础上，
基于纯粹找茬的提问我们暂且不议。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;在提问之前&lt;/p&gt;
&lt;p&gt;有些问题可能别人遇到过且被解决了，已经有一套完整的解决方案，
比如说配置 VS Code 环境、调整硬盘分区等……&lt;br /&gt;
所以在提问之前，可以先试着查找聊天记录、使用搜索引擎或是查阅官方文档等&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;部分中文文档可能存在翻译不及时或是翻译错误的问题，所以我建议直接查阅英文文档原文。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;提问当中&lt;/p&gt;
&lt;p&gt;如果你认为确有必要向他人提问，请在提问的时候附上比较详细的信息。&lt;/p&gt;
&lt;p&gt;举个例子，前两天有人在群里提问他的代码为什么在 OJ 上 RE (Runtime Error, 运行时错误)了，但是导致 RE 的原因很多，比如说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;没有任何指责这位同学的意思，只是以此举例解释提问附上完整信息的必要性。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;int a = 3 / 0, b = 3 % 0;&lt;/code&gt; 除零错误&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int main(){return 1;}&lt;/code&gt; 主函数返回值非零&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int a[2]; a[10]=0;&lt;/code&gt; 数组访问越界&lt;/li&gt;
&lt;li&gt;……&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果没有额外信息的话，很难判断出究竟发生了什么错误，所以请在提问他人的时候附上截图、报错信息或是完整代码一类的。&lt;br /&gt;
如果附上截图的话，请多截一点，有些错误需要结合上下文分析。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;以下为正式内容。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;switch-case&lt;/h2&gt;
&lt;h3&gt;switch 语句介绍&lt;/h3&gt;
&lt;p&gt;switch 语句是一种多路判定语句，
用以判定表达式是否与某个常量匹配，
其中表达式必须为整型值。[见《C 和指针》4.8]&lt;/p&gt;
&lt;p&gt;其基本结构为&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;switch(表达式) {
  case 常量1: 语句;
  case 常量2: 语句;
  ...
  default: 语句;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们举这样一个例子，
上个学期我总和朋友在环球港不知道吃什么，
所以常常用扔色子的方式解决：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;stdlib.h&amp;gt;
#include&amp;lt;time.h&amp;gt;

int main() {
  srand(time(NULL));
  int randnum = rand() % 6 + 1;
  // 有些同学可能看出来这个 a 生成 1~6 的概率可能不是均匀的。
  // 生成 1 的概率可能略高于 6 的概率。
  // 但这只是一个简单的例子，我们不妨认为我拿的骰子是灌铅的。
  switch(randnum) {
    case 1:
      printf(&quot;Burger King&quot;);
      break;
    case 2:
      printf(&quot;McDonalds&quot;);
      break;
    case 3:
      printf(&quot;Liu Jie&quot;);
      break;
    case 4:
      printf(&quot;Xiao Yang&quot;);
      break;
    case 5:
      printf(&quot;Bao Zai Fan&quot;);
      break;
    case 6:
      printf(&quot;Xi Jia De&quot;);
      break;
    default:
      printf(&quot;Cheater!&quot;);
      break;
  }
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;break&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;switch&lt;/code&gt; 语句中，
&lt;code&gt;case&lt;/code&gt; 只决定了进入分支语句的入口，
而没有决定跳出 &lt;code&gt;switch&lt;/code&gt; 内部的出口。&lt;br /&gt;
这意味着程序在执行到其他的 &lt;code&gt;case&lt;/code&gt; 标签时不会自动跳出 &lt;code&gt;switch&lt;/code&gt; ，
而是按照顺序依次执行接下来的语句。&lt;/p&gt;
&lt;p&gt;我们也可以利用这个性质，将表达式的多种取值映射到同一个语句执行，
比如说下面的代码：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;switch(randnum) {
  case 1:
    ;
  case 2:
    ;
  case 3:
    printf(&quot;Xiao Long Bao&quot;);
    break;
  case 4:
    printf(&quot;Guan Tang Bao&quot;);
    break;
  case 5:
    printf(&quot;Nai Huang Zhi Ma&quot;);
    break;
  case 6:
    printf(&quot;Dou Sha Bao&quot;);
    break;
  default:
    printf(&quot;Zundamon&quot;);
    break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;利用这个性质提高了小笼包的权重。&lt;/p&gt;
&lt;h3&gt;default&lt;/h3&gt;
&lt;p&gt;在上述这段程序中， &lt;code&gt;default&lt;/code&gt; 是一个可选项，
由于在程序的语义上并不会出现匹配到 &lt;code&gt;1~6&lt;/code&gt; 之外的情况，
所以删除 &lt;code&gt;default&lt;/code&gt; 语句后程序功能并不会受到影响。
但出于其他角度考量，通常建议为 &lt;code&gt;switch&lt;/code&gt; 语句加上 &lt;code&gt;default&lt;/code&gt; 分支，
这样易于捕捉到一些潜在的 &lt;code&gt;缺陷&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;此外，&lt;code&gt;default&lt;/code&gt; 的位置并不一定要在 &lt;code&gt;switch&lt;/code&gt; 语句尾，
这意味着&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;switch(randnum) {
  case 1: case 2:
    printf(&quot;Akane&quot;);
    break;
  case 4: case 5:
    printf(&quot;Aoi&quot;);
    break;
  default:
    printf(&quot;Zundamon&quot;);
    break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;switch(randnum) {
  case 1: case 2:
    printf(&quot;Akane&quot;);
    break;
  default:
    printf(&quot;Zundamon&quot;);
    break;
  case 4: case 5:
    printf(&quot;Aoi&quot;);
    break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;switch(randnum) {
  default:
    printf(&quot;Zundamon&quot;);
    break;
  case 1: case 2:
    printf(&quot;Akane&quot;);
    break;
  case 4: case 5:
    printf(&quot;Aoi&quot;);
    break;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这三份代码实际执行同样的功能。&lt;/p&gt;
&lt;h2&gt;指针&lt;/h2&gt;
&lt;h3&gt;指针的概念&lt;/h3&gt;
&lt;p&gt;先来快速地过一遍基础内容：&lt;/p&gt;
&lt;p&gt;在运行程序时，程序的变量存储在内存中，
内存由若干位（bit）构成，
每八位构成一个字节（byte）。
在内存中，使用地址（Address）来表示字节的位置，
字节的位置与地址之间一一对应。&lt;/p&gt;
&lt;p&gt;以下面这段代码为例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a = 0x66ccff, b = 0x39c5bb; // 为了便于和指针一起查看值，这里采用 16 进制
  int *pa = &amp;amp;a, *pb = &amp;amp;b;
  printf(&quot;pa is %p, and pb is %p\n&quot;,pa,pb);
  printf(&quot;*pa is %x, and *pb is %x\n&quot;,*pa,*pb);
  *pa = 0;
  *pb = *pa;
  printf(&quot;a is %x, and b is %x\n&quot;,a,b);
  printf(&quot;pa is %p, and pb is %p\n&quot;,pa,pb);
  printf(&quot;*pa is %x, and *pb is %x\n&quot;,*pa,*pb);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;指针变量用于存储地址，
我们通过 &lt;code&gt;指向类型 * 指针变量名&lt;/code&gt; 的方式声明一个指针变量。
比如上文中 &lt;code&gt;int *pa;&lt;/code&gt; 表示声明了一个存储 &lt;code&gt;int&lt;/code&gt; 类型地址的变量 &lt;code&gt;pa&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;需要注意的是连续声明指针变量时，每个指针变量名前都需要有 &lt;code&gt;*&lt;/code&gt;，
比如 &lt;code&gt;int* pa,pb;&lt;/code&gt; 中 &lt;code&gt;pa&lt;/code&gt; 类型为 &lt;code&gt;int*&lt;/code&gt; 指针，
而 &lt;code&gt;pb&lt;/code&gt; 类型则是 &lt;code&gt;int&lt;/code&gt; 整型。&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;&amp;amp;&lt;/code&gt; 用作一元运算符（而非二元运算符位运算与）时，
用于取一个变量的地址，
比如 &lt;code&gt;pa = &amp;amp;a&lt;/code&gt;，即为将 &lt;code&gt;a&lt;/code&gt; 的地址赋给 &lt;code&gt;pa&lt;/code&gt;；&lt;/p&gt;
&lt;p&gt;当 &lt;code&gt;*&lt;/code&gt; 用作一元运算符（而非二元运算符乘号）时，
用于通过地址间接访问，
比如 &lt;code&gt;*pa = 0&lt;/code&gt;，即为将 &lt;code&gt;pa&lt;/code&gt; 指向的变量赋为 &lt;code&gt;0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;正如一般变量一样，未经初始化的指针变量通常指向一个未经分配的地址&lt;/strong&gt;
&lt;strong&gt;对该地址进行读写会造成程序错误，应当尽量避免这种状况&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;指向指针的指针&lt;/h3&gt;
&lt;p&gt;指针变量同样也是一个变量，
这意味着我们可以声明一个指向指针的指针。
例如：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a = 0x66ccff;
  int *pa = &amp;amp;a;
  int **ppa = &amp;amp;pa;
  printf(&quot;ppa is %p, and pa is %p\n&quot;,ppa,pa);
  printf(&quot;*ppa is %p, and *pa is %x\n&quot;,*ppa,*pa);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这段代码当中，
&lt;code&gt;int **ppa = &amp;amp;pa&lt;/code&gt; 意味着声明了一个类型为 &lt;code&gt;int *&lt;/code&gt; 的变量，
其被初始化为变量 &lt;code&gt;pa&lt;/code&gt; 的地址（即指向变量 &lt;code&gt;pa&lt;/code&gt; ）&lt;/p&gt;
&lt;h3&gt;NULL&lt;/h3&gt;
&lt;p&gt;C 语言中 &lt;code&gt;NULL&lt;/code&gt; 在数值上中被定义为 &lt;code&gt;0&lt;/code&gt;，&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int *a = NULL;
  printf(&quot;%p&quot;,a);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;任何被赋值为 &lt;code&gt;NULL&lt;/code&gt; 的指针会指向 &lt;code&gt;0x0&lt;/code&gt; 的地址。
C 语言保证地址&lt;code&gt;0&lt;/code&gt;永远不会存储数据，对这个地址进行读写通常会导致错误，
所以在访问指针指向地址之前最好检查指针是否为 &lt;code&gt;NULL&lt;/code&gt;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int *a = NULL;
  printf(&quot;%d&quot;,*a);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;指针传递参数&lt;/h3&gt;
&lt;p&gt;有时候在调用函数的时候，我们希望改变函数的参数，比如考虑这样一个函数：&lt;/p&gt;
&lt;p&gt;传入两个整型变量，令两个数字均变为二者的最大值，但函数返回两个数中的较小值。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int fun(int x,int y) {
  int less_value;
  if(x &amp;gt; y) {
    less_value = y;
    y = x;
  }
  else {
    less_value = x;
    x = y;
  }
  return less_value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个函数看上去像是实现了要求，但是如果在函数外部检查传入的变量，
我们会发现二者的值根本没有发生改变。
这是因为函数的参数被当作函数的内部变量。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int fun(int x,int y) {
  int less_value;
  if(x &amp;gt; y) {
    less_value = y;
    y = x;
  }
  else {
    less_value = x;
    x = y;
  }
  printf(&quot;&amp;amp;x=%p, &amp;amp;y=%p.\n&quot;,&amp;amp;x,&amp;amp;y);
  return less_value;
}

int main() {
  int a = 37, b = 42;
  int c = fun(a,b);
  printf(&quot;a=%d, b=%d, c=%d.\n&quot;,a,b,c);
  printf(&quot;&amp;amp;a=%p, &amp;amp;b=%p.\n&quot;,&amp;amp;a,&amp;amp;b);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这里我们捎带着讲一下变量的作用域：&lt;/p&gt;
&lt;p&gt;C 语言的变量分为局部变量和全局变量。&lt;/p&gt;
&lt;p&gt;局部变量声明在函数或代码块（即被一对大括号包裹的代码）内部，
其作用域仅在函数或代码块内部，在作用域外无法访问这个变量。&lt;/p&gt;
&lt;p&gt;全局变量声明在所有函数之外，通常是在代码顶端，
任何函数都可以访问全局变量。&lt;/p&gt;
&lt;p&gt;回到上述函数的问题上来，函数传入的形参作为函数的内部变量，
这意味着在函数内部对参数的修改不会作用到函数外。
我们通过程序的输出结果也可以看出 x 与 a；y 与 b 的地址并不相同。&lt;/p&gt;
&lt;p&gt;针对这种情况，我们可以通过传入指针的做法实现函数功能&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;int fun(int *x,int *y) {
  int less_value;
  if(*x &amp;gt; *y) {
    less_value = *y;
    *y = *x;
  }
  else {
    less_value = *x;
    *x = *y;
  }
  return less_value;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这里需要画个图&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;指针的算数运算&lt;/h3&gt;
&lt;p&gt;指针可以进行自增、自减操作，也可以加上或减去一个整数&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a = 0;
  int *p = &amp;amp;a;
  printf(&quot;Type int is %d bytes.\n&quot;,sizeof(a));
  printf(&quot;%p\n&quot;,p);
  p ++;
  printf(&quot;%p\n&quot;,p);
  p --;
  printf(&quot;%p\n&quot;,p);
  p = p + 3;
  printf(&quot;%p\n&quot;,p);
  p = p - 3;
  printf(&quot;%p\n&quot;,p);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;通过上面的例子我们可以看到，
指针进行算数操作时并不是将指针值直接加上对应数值，
而是变化 &lt;code&gt;数值与指针指向类型的乘积&lt;/code&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;输出数列中的第 $k$ 项。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Input&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每个测试点输入包括三行：&lt;br /&gt;
第一行包括 $1$ 个整数 $n(1 \leq n \leq 100)$ ，表示数列长度为 $n$；&lt;br /&gt;
第二行包含 $n$ 个整数 $a_1, a_2, \dots, a_n(1 \leq a_i \leq 100)$ ，构成一个数列；&lt;br /&gt;
第三行包括 $1$ 个整数 $k$ ，表示需要输出第 $k(1 \leq k \leq n)$ 个整数。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Output&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;每个测试点输出包括一行：&lt;br /&gt;
第一行包括 $1$ 个整数，即为 $a_k$。&lt;/p&gt;
&lt;p&gt;这类问题便可以通过数组解决。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// n == 100
#include&amp;lt;stdio.h&amp;gt;

int main() {
  int n,a[100],k;
  scanf(&quot;%d&quot;,&amp;amp;n);
  for(int i = 0; i &amp;lt; n; i ++) {
    scanf(&quot;%d&quot;,&amp;amp;a[i]);
  }
  scanf(&quot;%d&quot;,&amp;amp;k);
  printf(&quot;%d\n&quot;,a[k - 1]); // 注意数组是零索引
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;100
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100
42
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正如字面意思那样，数组是将若干个变量作为一组，
其在内存中连续存储，这也暗示着其与指针存在练习，我们等下就会讲到。&lt;/p&gt;
&lt;h3&gt;声明、初始化、使用&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a[5] = {2,3,5,7,11};
  for(int i = 0; i &amp;lt; 5; i++) {
    printf(&quot;%d &quot;,a[i]);
  }
  printf(&quot;\n&quot;);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们可以通过 &lt;code&gt;类型名 数组名[元素个数];&lt;/code&gt; 的形式声明一个数组。
比如上文中的 &lt;code&gt;int a[100]&lt;/code&gt; 就是声明了一个具有100个int类型变量的数组。&lt;/p&gt;
&lt;p&gt;需要注意的是数组的下标是从 &lt;code&gt;0&lt;/code&gt; 开始的，
这意味着数组的第一个元素实际上是 &lt;code&gt;a[0]&lt;/code&gt;，
具体这样设计的原因接下来讲完数组与指针联系之后会讲到，
我们不妨先放一放。&lt;/p&gt;
&lt;p&gt;数组的初始化可以通过这种方式进行：&lt;code&gt;int a[5] = {2,3,5,7,11}&lt;/code&gt;。&lt;br /&gt;
如果大括号中元素的数目小于数组大小，则剩下的元素会被自动赋为 &lt;code&gt;0&lt;/code&gt;，
如 &lt;code&gt;int a[5] = {2,3,5}&lt;/code&gt; 等价于 &lt;code&gt;int a[5] = {2,3,5,0,0}&lt;/code&gt;，
但是反过来让数组大小小于初始化元素数目显然会报错。
如果在初始化数组时不指定数组元素个数，
则数组元素个数会自动按照初始化列表调整，
如 &lt;code&gt;int a[] = {2,3,5,7,11}&lt;/code&gt; 等价于 &lt;code&gt;int a[5] = {2,3,5,7,11}&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;与指针的关系&lt;/h3&gt;
&lt;p&gt;我们不妨先来直接看一看数组名究竟代表了什么：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a[5] = {2,3,5,7,11};
  printf(&quot;a is %p, and the address of a[0] is %p.\n&quot;, a, &amp;amp;a[0]);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;很容易注意到数组名的值恰好等于数组第一个元素的地址。
但数组名与指针变量不同之处在于：数组名是一个指针常量，无法被修改；&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a[5];
  int *b;
  int c = 0;
  b = &amp;amp;c;
  // a = &amp;amp;c;
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;这里可以通过画图辅助理解&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int a[5] = {2,3,5,7,11};
  printf(&quot;a is %p, and the address of a[0] is %p.\n&quot;, a, &amp;amp;a[0]);
  printf(&quot;(a+1) is %p, and the address of a[1] is %p.\n&quot;, a + 1, &amp;amp;a[1]);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;由这个例子我们可以看出，正如上文所说，
数组在内存中是连续存储的，
&lt;code&gt;a[0]&lt;/code&gt; 与 &lt;code&gt;a[1]&lt;/code&gt; 在内存上是连续的。&lt;/p&gt;
&lt;p&gt;当我们访问 &lt;code&gt;a[i]&lt;/code&gt; 时，我们实际上在访问的是 &lt;code&gt;a+i&lt;/code&gt; 指向的元素，即 &lt;code&gt;*(a+i)&lt;/code&gt; 。&lt;/p&gt;
&lt;p&gt;&lt;s&gt;考虑到加法运算的可交换性嘛……&lt;/s&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  int n,a[100],sum = 0;
  scanf(&quot;%d&quot;,&amp;amp;n);
  for(int i = 0; i &amp;lt; 100; i ++) {
    scanf(&quot;%d&quot;,&amp;amp;a[i]);
    sum += *(a+i);
    // sum += i[a]; // 可以跑，但是别这么写
  }
  printf(&quot;The sum is %d.\n&quot;,sum);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;零索引&lt;/h3&gt;
&lt;p&gt;在介绍完数组与指针的联系及通过指针访问数组元素后，
我们可以发现数组下标从 &lt;code&gt;0&lt;/code&gt; 开始是很自然的。&lt;/p&gt;
&lt;p&gt;考虑到网络上已经有现成的&lt;a href=&quot;https://www.bilibili.com/video/BV1aeHaexETd/&quot;&gt;科普视频&lt;/a&gt;，
我直接在这里 include 进来好了。&lt;/p&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1aeHaexETd&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h3&gt;数组越界&lt;/h3&gt;
&lt;p&gt;同样地，基于指针与数组的联系，
我们可以发现 &lt;code&gt;int a[10]; a[10]=998244353;&lt;/code&gt; 试图在地址 &lt;code&gt;a+10&lt;/code&gt; 处进行写操作；
但是数组声明仅对地址 &lt;code&gt;a+0&lt;/code&gt; 至 &lt;code&gt;a+9&lt;/code&gt; 进行了分配，
越界访问会同样会引起程序错误。&lt;/p&gt;
&lt;p&gt;初学者容易常犯的错误就是在定义了长为 &lt;code&gt;N&lt;/code&gt; 的数组后访问 &lt;code&gt;a[N]&lt;/code&gt; ；
所以一般在编写程序时推荐为数组长度预留一些范围。&lt;/p&gt;
&lt;h2&gt;字符串&lt;/h2&gt;
&lt;h3&gt;字符串组成&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;

int main() {
  char str[] = &quot;GLaDOS&quot;;
  printf(&quot;%d&quot;,(int)str[6]);
  return 0;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;字符串本质上是一个字符数组，即 &lt;code&gt;char []&lt;/code&gt; 。
但与简单的字符数组不同的是，字符串会在数组尾添加一个元素 &lt;code&gt;&apos;\0&apos;&lt;/code&gt; 作为字符串结束的标志。
&lt;code&gt;&apos;\0&apos;&lt;/code&gt; 在数值上等于 &lt;code&gt;0&lt;/code&gt; ，但正如涉及指针时通常使用 &lt;code&gt;NULL&lt;/code&gt; 一样，
在涉及字符时我们也通常使用 &lt;code&gt;&apos;\0&apos;&lt;/code&gt; 而非 &lt;code&gt;0&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这也意味着一个长度为 &lt;code&gt;n&lt;/code&gt; 的字符串所占的内存空间为 &lt;code&gt;n+1&lt;/code&gt; bytes，
结尾额外多出一个 byte 用于存储 &lt;code&gt;&apos;\0&apos;&lt;/code&gt;。&lt;/p&gt;
&lt;h3&gt;字符串标准库函数&lt;/h3&gt;
&lt;p&gt;在标准库 &lt;code&gt;string.h&lt;/code&gt; 中，定义了一些用作字符串操作的函数，我们在此介绍一些：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;size_t strlen(cs)&lt;/code&gt; ：返回 &lt;code&gt;cs&lt;/code&gt; 的长度&lt;/li&gt;
&lt;li&gt;&lt;code&gt;char *strcat(s,ct)&lt;/code&gt; 和 &lt;code&gt;char *strncat(s,ct,n)&lt;/code&gt;：将字符串 &lt;code&gt;ct&lt;/code&gt; 连接到 &lt;code&gt;s&lt;/code&gt; 的尾部，并返回 &lt;code&gt;s&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;int strcmp(cs,ct)&lt;/code&gt; 和 &lt;code&gt;int *strncmp(cs,ct,n)&lt;/code&gt;：&lt;code&gt;cs&lt;/code&gt; 小于 &lt;code&gt;ct&lt;/code&gt;返回 &lt;code&gt;负数&lt;/code&gt; ，等于返回 &lt;code&gt;0&lt;/code&gt; ，大于返回&lt;code&gt;正数&lt;/code&gt;（字典序比较）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;char *strcpy(s,ct)&lt;/code&gt; 和 &lt;code&gt;char *strncpy(s,ct,n)&lt;/code&gt;：将字符串 &lt;code&gt;ct&lt;/code&gt; 复制到 &lt;code&gt;s&lt;/code&gt; 中，并返回 &lt;code&gt;s&lt;/code&gt; 。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;依旧代码举例&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;#include&amp;lt;stdio.h&amp;gt;
#include&amp;lt;string.h&amp;gt;

int main() {
  char str1[] = &quot;foo&quot;, str2[] =&quot;bar&quot;;
  printf(&quot;The length of str1 is %d.\n&quot;, strlen(str1));
  return 0;
}

&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;应用&lt;/h2&gt;
&lt;p&gt;&lt;s&gt;写不动不想写了，反正这部分是主观内容，留着找例题自由发挥吧。&lt;/s&gt;&lt;/p&gt;
&lt;h3&gt;构思循环条件的切入点&lt;/h3&gt;
&lt;h3&gt;实际问题转化&lt;/h3&gt;
&lt;h3&gt;函数与变量的选取&lt;/h3&gt;
&lt;h3&gt;与信息安全数学导论结合&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;long long pow(long long base, long long exp, long long mod) {
  long long ans = 1;
  for(long long i = 0; i &amp;lt; exp; i++) {
    ans *= base;
  }
  return ans % mod;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;long long pow(long long base, long long exp, long long mod) {
  long long ans = 1;
  for(long long i = 0; i &amp;lt; exp; i++) {
    ans *= base;
    ans %= mod;
  }
  return ans;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;long long binpow(long long base, long long exp, long long mod) {
  // exp = exp % (mod - 1); // If mod is a prime.
  long long ans = 1;
  base %= mod;
  while (exp) {
    if (exp &amp;amp; 1LL) ans = ans * base % mod;
    base = base * base % mod;
    exp &amp;gt;&amp;gt;= 1;
  }
  return ans;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为&lt;a href=&quot;https://x.com/yumenkmc&quot;&gt;nekomo🐾&lt;/a&gt;创作的&lt;a href=&quot;https://x.com/yumenkmc/status/1959180564269048261/photo/1&quot;&gt;作品&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>55 年秋 12 周周记</title><link>https://blog.chiyo.uk/posts/2025110313/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025110313/</guid><description>要记得学数学啊！</description><pubDate>Mon, 03 Nov 2025 05:09:03 GMT</pubDate><content:encoded>&lt;h1&gt;55 年秋 12 周周记&lt;/h1&gt;
&lt;h2&gt;学习&lt;/h2&gt;
&lt;h3&gt;计算机&lt;/h3&gt;
&lt;h4&gt;软件测试与验证&lt;/h4&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;h4&gt;编译原理与技术&lt;/h4&gt;
&lt;p&gt;本周开始学习语法分析，引入了上下文无关语法（CFG）以实现正则表达式无法满足的需求。
主观感觉上 CFG 采用了递推的方式，但是我容易在这里产生一个思维误区，
比如说认为 $S \rightarrow aSb$ 代表 &lt;code&gt;如果S满足文法，则aSb也满足文法&lt;/code&gt;。
不过好在多看了几个例子后也算是从思维误区中跳出来了。&lt;/p&gt;
&lt;p&gt;lab方面老师没有回复常数判定的问题，只能先按照自己的理解先设计自动机了。&lt;/p&gt;
&lt;h4&gt;操作系统&lt;/h4&gt;
&lt;p&gt;本周无课。&lt;/p&gt;
&lt;h4&gt;软件分析与验证前沿&lt;/h4&gt;
&lt;p&gt;阅读了 lec2 课件的第一部分，基本了解了一下 LLVM 的概念。&lt;/p&gt;
&lt;p&gt;按照个人理解来讲， LLVM 是在程序语言和操作系统间引入的中间层，
通过将源代码转化为 &lt;code&gt;.ll&lt;/code&gt; 的中间文件，再转化到对应操作系统的机器码。&lt;/p&gt;
&lt;p&gt;lab 方面还是没有解决 docker 镜像的问题，
很奇怪，即使配置了全局代理，还是无法拉取镜像，docker desktop
也无法打开对应界面。 不清楚是不是像 raw.githubusercontent.com 那样 DNS
解析出现了问题需要修改 host 文件。
这周还解决不了的话就只能找台电脑挂百度网盘下载了。&lt;/p&gt;
&lt;h4&gt;竞赛&lt;/h4&gt;
&lt;p&gt;这周因为看错时间错过了 cf div1+2 ，但是 at abc 倒是按时打了，打得很差。
希望是复健第一场不熟悉的问题，期望接下来几场找到感觉能好起来。&lt;/p&gt;
&lt;p&gt;下场 cf 在六号（周四）；abc 在八号（周六）。&lt;/p&gt;
&lt;h4&gt;其他&lt;/h4&gt;
&lt;p&gt;这周课外探索其他东西的时间可能确实比较多一点。&lt;/p&gt;
&lt;h5&gt;Astro&lt;/h5&gt;
&lt;p&gt;这周时间大多花在魔改博客上了， 从 Github 瓷砖便可见一二。&lt;/p&gt;
&lt;p&gt;虽然对于 Astro 还是不怎么了解的程度， 但是算是初窥门径了？&lt;/p&gt;
&lt;p&gt;目前「关于」页面致谢大概有十个了，
是时候写一篇文章记录一下搭建以及魔改这个博客的经过了。&lt;/p&gt;
&lt;h5&gt;typst&lt;/h5&gt;
&lt;p&gt;这周又在别人的博客当中看到了 typst 这个语言。
本着&lt;code&gt;如果一个新事物无意中看到超过三次就要去尝试一下&lt;/code&gt;的原则去了解了一下基本语法。&lt;/p&gt;
&lt;p&gt;对我个人而言感觉优缺点都很明显&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;优点是在文章中嵌入数学公式要比 &lt;code&gt;Markdown&lt;/code&gt;
方便很多，比如说对于同样的一个麦克斯韦方程组&lt;/p&gt;
&lt;p&gt;$$
\begin{cases}
\begin{aligned}
\nabla \cdot \overset{\rightarrow}{E} &amp;amp; = \frac{\rho_{e}}{\varepsilon_{0}} \
\nabla \times \overset{\rightarrow}{E} &amp;amp; = - \frac{\partial\overset{\rightarrow}{b}}{\partial t} \
\nabla \cdot \overset{\rightarrow}{B} &amp;amp; = 0 \
\nabla \times \overset{\rightarrow}{B} &amp;amp; = \varepsilon_{0}\mu_{0}\frac{\partial\overset{\rightarrow}{E}}{\partial t} + \mu_{0}\overset{\rightarrow}{j}
\end{aligned}
\end{cases}
$$&lt;/p&gt;
&lt;p&gt;这是 &lt;code&gt;Markdown&lt;/code&gt; 内嵌 &lt;code&gt;latex&lt;/code&gt; 的代码实现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$$
\begin{equation*}
   \begin{cases}
       \nabla\cdot\vec{E}&amp;amp;=\frac{\rho_e}{\epsilon_0} \\
       \nabla\times\vec{E}&amp;amp;=-\frac{\partial\vec{B}}{\partial t} \\
       \nabla\cdot\vec{B}&amp;amp;=0 \\
       \nabla\times\vec{B}&amp;amp;=\epsilon_0\mu_0\frac{\partial \vec{E}}{\partial t}+\mu_0\vec{j}
   \end{cases}
\end{equation*}
$$

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而这是 &lt;code&gt;typst&lt;/code&gt; 的代码实现：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
$
cases(
 nabla dot arrow(E) &amp;amp;= rho_(e) / epsilon _0 \
 nabla times arrow(E) &amp;amp;= - (partial arrow(b)) / (partial t) \
 nabla dot arrow(B) &amp;amp;= 0 \
 nabla times arrow(B) &amp;amp;= epsilon_(0) mu_(0) (partial arrow(E)) / (partial t) + mu_(0) arrow(j)
)
$

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;少了很多反斜杠和花括号确实会简便不少。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;而缺点也很明显，typst 毕竟是一门新兴的标记语言，
所以对应的支持或是生态都不多。 像是 VuePress、MkDocs、Hexo 乃至
Github 默认的 Jekyll 这类静态网站生成器都是以渲染 Markdown 为主。
而目前主流的论文、简历模板则是以 Latex 居多，比如
&lt;a href=&quot;https://github.com/sjtug/SJTUThesis&quot;&gt;SJTUThsis&lt;/a&gt;。
这就导致了 typst 在当前的应用比较受限。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;对我个人而言比较适合用来写当前的实验报告和数学作业， 或是先用 typst
写好内容之后通过 pandoc 转为 markdown 或是其他的格式。
（比如说这篇博文就是由 typst 写的，由 pandoc 转为 markdown）&lt;/p&gt;
&lt;p&gt;但是貌似对于数学公式的转换不太正确，有些地方还是需要手调一下。&lt;/p&gt;
&lt;h5&gt;git&lt;/h5&gt;
&lt;p&gt;之前对于 git 的了解仅限于
&lt;code&gt;git clone&lt;/code&gt;,&lt;code&gt;git add&lt;/code&gt;,&lt;code&gt;git commit&lt;/code&gt;,&lt;code&gt;git push&lt;/code&gt;,&lt;code&gt;git pull&lt;/code&gt; 这几个。
但是最近逐渐频繁接触到了代码回滚这类的需要，就需要去学一些 git
的其他指令。&lt;/p&gt;
&lt;p&gt;这周大概学了一下
&lt;code&gt;git checkout&lt;/code&gt;切换分支、&lt;code&gt;git reset&lt;/code&gt;回滚状态、&lt;code&gt;git merge&lt;/code&gt;合并分支这几个。
还需要找到具体应用场景加以熟练。&lt;/p&gt;
&lt;h3&gt;数学&lt;/h3&gt;
&lt;p&gt;有希ちゃん啊有希ちゃん，你怎能如此堕落&lt;/p&gt;
&lt;h4&gt;微分几何&lt;/h4&gt;
&lt;p&gt;没学，也没看回放，坏。&lt;/p&gt;
&lt;h4&gt;初等数论&lt;/h4&gt;
&lt;p&gt;课上补作业导致后半节课跟不上了只能嗯抄笔记。。。&lt;/p&gt;
&lt;p&gt;这周应该是讲到原根了。&lt;/p&gt;
&lt;h4&gt;偏微分方程&lt;/h4&gt;
&lt;p&gt;没学，也没看回放，只知道讲到了热传导方程，坏中坏。&lt;/p&gt;
&lt;h4&gt;拓扑学基础&lt;/h4&gt;
&lt;p&gt;没学，同样没看回放，这周讲到了第四章，坏完了。&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;/p&gt;
&lt;p&gt;具体表现大概就是每天想起来了就背一点， 不过距离补全搁置的还差得远，
基本上每天只是背了一点，甚至没有完成 Anki 的当日计划目标。&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;因为随记页面需要，又重新接触了一下联邦宇宙， 这次没有用之前的 Mastodon，
而是凭着审美选择了 Misskey，
目前打算是拿来作为朋友圈和文件传输助手的平替，
不过目前来看不能完全替代朋友圈的社交属性。 不过拿来记点小点子挺不错的。&lt;/p&gt;
&lt;p&gt;既然周记都写晚了，不如接着写点这周周一的事情。&lt;/p&gt;
&lt;p&gt;大活边上的工地围栏拆了，这下北门可以直通 711 ，
教书院门前的那条窄路估计也能得到一些分流不至于那么挤。&lt;/p&gt;
&lt;p&gt;软测考完了，突击复习效果不错，客观题就错了一个单选。
但是主观题对完答案感觉写的不是那么好。
唉感觉自己还是不太擅长记忆概念定义这一类的。&lt;/p&gt;
&lt;p&gt;天气凉了（或者不如说早凉了），感觉周四和间周周二可以在厨房做饭吃了。
&lt;s&gt;还能拿来水做饭系列的博文&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;把幸运星的前三集看掉了，发现自己确实很难集中注意力，哪怕是放松的时候。
总会想着去看看手机有没有新消息什么的。
不过不能专心看番这件事听上去也太扯了一点......
上旬先把幸运星看完，接下来就看四叠半好了。&lt;/p&gt;
&lt;p&gt;宿舍学习效率确实不高，这周还是得去图书馆&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面由 &lt;a href=&quot;https://voskey.icalo.net/@sevenc_nanashi&quot;&gt;@sevenc_nanashi@voskey.icalo.net&lt;/a&gt; 创作，遵循 &lt;a href=&quot;https://creativecommons.org/licenses/by/4.0&quot;&gt;CC BY 4.0&lt;/a&gt; 协议.&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>南洋游记（其一）</title><link>https://blog.chiyo.uk/posts/2025102913/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025102913/</guid><description>就这样在古城的校园里转呀转</description><pubDate>Wed, 29 Oct 2025 05:23:00 GMT</pubDate><content:encoded>&lt;h1&gt;南洋游记（一）&lt;/h1&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;p&gt;高一刚入学的时候曾看见过有位学姐躺在草坪上看书，
心中暗暗惊奇这学校的自由果然名不虚传，
同时也不免想要效仿一下。
毕业典礼那天自己实在听不下去台上各个代表冗长的发言，
便撺掇慕兄偷偷溜出会场，
躺在教学楼前的小小草坪上，
看着浮云飘过。
边晒着太阳边有一搭没一搭的聊着。
想着未来的大学，
想着眼前的高考。
想着……&lt;br /&gt;
诶，班主任？何时来的（心虚）&lt;br /&gt;
&lt;s&gt;然后我俩就被我班班任抓回会场了&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;毕业典礼、
自主复习、
看考场、
高考笔试、
英语口语、
出分、
填志愿、
查录取结果、
收通知书、
订车票、
收拾行李、
离乡。
那个听闻了十八年的“无穷无尽的夏日”随着件件事情缓缓流逝，
直至迎来终结。&lt;/p&gt;
&lt;p&gt;到了大学，
虽然自家校区内也有草坪。
但是东草经常养护禁止入内、
西草太小，
小到看上去还没有高中教学楼前那片草坪大，
不过好在是真草坪，
不至于完全输给高中。
南草又太远、太荒。
总归不是我幻想中的大学那样的草坪。&lt;br /&gt;
&lt;s&gt;（其实莲南校区的草坪不错，但那是后话了）&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;24 年春，
看到了南洋人节的新闻。
便跟着去凑了个热闹。
主会场便在二部的电草。
那日是个阴天，
但是电草上摊位很多，
人也很多，
东侧的草坪上还搭起了舞台。
连着逛了几个摊位，
买了些奇奇怪怪的小东西。
等到天色渐暗，
舞台那边便亮起灯光，
草地音乐节开始了。
人潮渐渐向东汇去，
我不想被挤在人群中间，
便去逛了西侧的摊位。
听着远处传来的音乐声，
看着夜幕中摊位的灯光，
就这样悠闲地走着。
直到发现时候不早，
人也逛得累了，
就乘地铁回到了宿舍。&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;上学期的课程基本集中在西区三院，
理所应当的路过一餐的次数也最多。
一餐有家飞饼窗口名声在外，
就连我这个外校学生也有所耳闻。
奈何吃过一次后实在难以给我留下什么印象。
反倒喜欢光顾的是另一端的馄饨窗口，
八块还是十块就能买来一碗飘着紫菜和蛋皮的馄饨。
经济、
实惠，
最重要的是美味。&lt;/p&gt;
&lt;p&gt;一餐和校内的麦当劳开在一起，
晚课下课后食堂全部歇业了，
要想不空着肚子回学校就只能去麦点份夜宵。
十三块九毛的 1+1 套餐已经不能喂饱我了，
就只能含泪点一份二十二块九的大饱口福套餐，
边吃边给自己找借口“吃点好的”。
然后临近月底看着空空的银行卡余额欲哭无泪。&lt;/p&gt;
&lt;h3&gt;二餐&lt;/h3&gt;
&lt;p&gt;上学期周五时间宽裕，
晚课也安排在了东下院，
就常跟奈来二餐吃晚饭。
二餐最常去的一家是一楼的烤盘饭，
两块九毛九一两荤素任选，
自己每次去都下手没轻没重的，
明明感觉没夹多少，
一上称价格就飙到了二打头，
不过好在每次也都能吃完。
这家的烧烤风味挺不错的，
虽然有些辣但即使是我也能接受的程度。&lt;/p&gt;
&lt;p&gt;因为暑假要留在古城这边集训，
想着反正走不开不如找点事干，
就给自己选了两周莲南校区的早八通识修学分，
又报名了南洋举办的一个 $\text{L}\exists\forall\text{N4}$ 学习班。
尽管个人能力不足没有入选正式名额，
但南洋的老师看我学校不远，
慷慨地允许我来参与，
只不过没有餐饮补贴。
不过第一天因为饭卡尚在制作，
南洋还是为我们每个人都准备了两天的二餐定向早午晚饭餐券，
连我这种编外人员也有一份。&lt;/p&gt;
&lt;p&gt;吃了一天“免费”的烤盘饭，
第二天想着换换口味吧，
就去了二餐三楼的自选窗口。
三楼的菜品不少，
价格也很便宜。
本着不能浪费餐券的原则，
我拿了不少菜才凑齐餐券的 20 面额；
又本着不能浪费食物的原则，
那天中午我吃了很久才吃完，
回教室的路上人还是撑着的。
三楼的瓦罐汤倒是不错，
喝起来有一股很浓的肉香味在。&lt;/p&gt;
&lt;h3&gt;四餐&lt;/h3&gt;
&lt;p&gt;这学期因为网络赛安排的缘故要早返校一周，
于是课表上就出现了一个看起来很空的“第零周”。
和上文一样，本着“来都来了，找点事干吧”的心理，
我又给自己报名了南洋和华为合作的一个训练营。
这次校方给学员发了四餐的定向餐券。
在校内摸索了一阵子找到四餐后，
发现四餐二楼和二餐三楼是差不多的自选，
遂食之。&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;/p&gt;
&lt;p&gt;（不过那次去吃的一楼那家煲仔饭，也挺好吃&lt;/p&gt;
&lt;h3&gt;玉兰苑&lt;/h3&gt;
&lt;p&gt;作为南洋校方钦定的校外人士用餐场所，
我在这学期才发现自己常买煎饼果子的地方就是玉兰苑。
不过对我而言，
光顾玉兰苑的次数也没那么多：
要么是晚课下课后去饼家买一份煎饼果子路上吃；
要么就是趁着 &lt;code&gt;17:40~18:00&lt;/code&gt; 这二十分钟的课间休息从上院飞速骑一个来回买个饭团，
省着晚课挨饿。&lt;/p&gt;
&lt;p&gt;上学期倒总是口嗨要去玉兰苑买点烤串烤冷面尝尝，
但是每次都是先走进了隔壁点了份煎饼果子。
这学期我高低要尝尝这烤冷面正不正宗。&lt;/p&gt;
&lt;h3&gt;西餐厅&lt;/h3&gt;
&lt;p&gt;南洋的吉姆立德西餐厅我应该是去过三次：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;第一次去是南洋的朋友冰水听我来这边上晚课，
找了天晚上等我下课邀请我一起去尝尝；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第二次则是来这边参加今年的 AOSCC，
餐点直奔二餐烤盘饭而去，
结果看到烤盘饭暑假停业，
铩羽而归。
同行的朋友这时就提出来他和他哥在这边西餐厅吃过味道不错，
中午可以去这边吃饭；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第三次则是多年老友和他女朋友来上海旅游，
逛南洋校园的时候来吃晚饭。
&lt;s&gt;唉打情骂俏的小情侣小情侣小情侣小情侣，我什么时候才能有女朋友&lt;/s&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&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;h3&gt;包图&lt;/h3&gt;
&lt;p&gt;我对南洋最初的印象就是二月十三推文中包图和猫馆长，
来了之后，
包图就在思源湖畔，
却没见过猫馆长，
大概是在哪个角落慵懒地晒着太阳吧。
倒是包图门前经常聚了一大片白鸽，
还看见过黑天鹅，
游人常在那边喂鸟。&lt;/p&gt;
&lt;p&gt;包图的书很全，
令我惊讶的是藏书中竟然还有轻小说一类的。
这学期头一次来包图的时候又读了一遍《银河铁道之夜》，
还看完了华夏图书馆内（似乎）没有的《爱丽丝漫游仙境》
（我印象里上次去找没有找到，也可能是我找的不够仔细的缘故）。&lt;br /&gt;
可惜往后再来，
也是来这里自习写作业了。
终究还是变成了眼中的他人啊（悲）。&lt;/p&gt;
&lt;p&gt;不过也没什么不好，
包图绝对是一个适合自习的环境。
我常去预约四楼靠窗的座位，
写累了一抬眼就能看到楼下的思源湖和更远处的建筑。
可惜这扇窗户是面南的，
天晴的时候午后的阳光实在是刺眼让人难以落座。
昨天便因为这个原因想去六楼。&lt;/p&gt;
&lt;p&gt;六楼则是像高中自习室那样的地方，
人与人之间用挡板分割，
留出来了专供单人的自习区域。
但等我预约好了位置后才发现六楼的位置是没有插座的。
偏偏我还打算用 &lt;code&gt;Markdown&lt;/code&gt; 码这周的数学作业。
于是只好再回到四楼预约了一个不靠窗的座位。&lt;/p&gt;
&lt;p&gt;这两天包图门前的桂花也开了，
一走一过，
满是桂花飘香。&lt;/p&gt;
&lt;h3&gt;主图&lt;/h3&gt;
&lt;p&gt;主图没有包图那样大气的外观，
以至于我去惯了包图有些不愿去主图。
但是来都来了，
不进去看看还是有些亏的。&lt;/p&gt;
&lt;p&gt;按理来讲，
明明是后修建的图书馆，
主图的桌子和书架看上去却没有包图新，
但主图公共区域却有着可供学生使用的双显示屏升降桌。&lt;br /&gt;
&lt;strong&gt;那可是双显示屏升降桌啊&lt;/strong&gt;&lt;br /&gt;
该说南洋不愧是南洋吗，
学生的公共福利这么好。
&lt;s&gt;不知道我有没有机会去那块自习体验一下&lt;/s&gt;&lt;/p&gt;
&lt;p&gt;但楼中有着像是省图那样的开放式楼梯。
我向来喜欢这种看上去很开阔的地方，
可惜楼梯下的座位约满了。
其实主图需要预约的座位反倒是少数，
两侧的阅览室内自习座位都无需预约。
但我刚下单车，不熟地方，
想着向里走走找个别的没被预约的座位，
反倒寻到了一个面对着横跨三层大落地窗的自习区。
便欣然落座，
开始写这篇文章。&lt;/p&gt;
&lt;p&gt;现在这篇文章也要写完了，
预约座位的时间也快结束了。
六点还有 PDE 的晚课，
该从主图出发去食堂吃点什么了，
不知今晚离开南洋的时候会不会心血来潮再去电草转转呢？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为&lt;a href=&quot;https://www.pixiv.net/users/3204&quot;&gt;あるは&lt;/a&gt;创作的&lt;a href=&quot;https://www.pixiv.net/artworks/5924&quot;&gt;ケロちゃん&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2025 年 10 月 29 日&lt;br /&gt;
于南洋二部主图四楼&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>若能化作蒲公英</title><link>https://blog.chiyo.uk/posts/2025102823/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025102823/</guid><description>逃避主义者的自我反思</description><pubDate>Tue, 28 Oct 2025 15:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;若能化作蒲公英&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;我想变成蒲公英&lt;br /&gt;
蒲公英啊，是不会有焦虑的&lt;br /&gt;
这样在我害怕的时候&lt;br /&gt;
只要打开伞&lt;br /&gt;
就能让风带着我逃走&lt;br /&gt;
风啊，风啊&lt;br /&gt;
无论去哪里都好&lt;br /&gt;
请带我走吧&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;既然都起这个标题了，不妨塞两首歌，边听边读吧&lt;/p&gt;
&lt;p&gt;&amp;lt;div style=&quot;font-size:0;&quot;&amp;gt; &amp;lt;!-- 去掉 inline-block 的空隙 --&amp;gt;
&amp;lt;iframe
src=&quot;//player.bilibili.com/player.html?bvid=BV16K411n79X&amp;amp;p=1&amp;amp;autoplay=0&quot;
style=&quot;display:inline-block;width:49%;min-width:200px;height:234px;box-sizing:border-box;border:0;vertical-align:top;&quot;
scrolling=&quot;no&quot; frameborder=&quot;0&quot; loading=&quot;lazy&quot; allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;&amp;lt;iframe
src=&quot;//player.bilibili.com/player.html?bvid=BV1u8411H7yA&amp;amp;p=1&amp;amp;autoplay=0&quot;
style=&quot;display:inline-block;width:49%;min-width:200px;height:234px;box-sizing:border-box;border:0;vertical-align:top;&quot;
scrolling=&quot;no&quot; frameborder=&quot;0&quot; loading=&quot;lazy&quot; allowfullscreen&amp;gt;
&amp;lt;/iframe&amp;gt;
&amp;lt;/div&amp;gt;&lt;/p&gt;
&lt;p&gt;我想我多少是有些习惯逃避了。
逃避本应写的作业，
逃避本应处理好的人际关系，
逃避本该看的书，
逃避不想做甚至是想做的事。&lt;br /&gt;
甚至包括在搭建完博客后，
我也出于本能地逃避或是抗拒写一些东西。
倒不如说虽然有许多想写下来的东西，
但一旦坐到屏幕前，双手放到键盘上，
就不知道从何写起了。&lt;br /&gt;
然后就会觉得想写点什么写不出来啊好痛苦啊……什么的&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;插播一句，
写到这里的时候我手机又摔了。
现在最后的手机屏幕也坏了……&lt;/p&gt;
&lt;p&gt;又回到了没手机可用的日子咯 T^T！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一方面是总是对自己写的语句不满意，
或者说……对自己写的东西感到羞耻吧，
但是不写又不能锻炼自己写作的能力，
然后就这样一直恶性循环下去。&lt;br /&gt;
另一方面是感觉自己的思维有时过于跳脱了，
在这一个话题还没写完的时候脑中就会想到下一个话题去，
结果写着写着发现上下文完全搭不上，
就反复地在一个小地方改来改去，
结果最后整篇读起来也像是打满了补丁，
索性直接删掉。&lt;br /&gt;
再一个方面，
虽然我总是嘴上说着
“文章是写给自己看的，不要去想别人怎么看。”
但真轮到我动笔写的时候，
难免会产生一些有的没的顾虑：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“已经把自己的身份信息隐藏好了吗”&lt;br /&gt;
“别人看到这段会觉得我太做作吗”&lt;br /&gt;
“……”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;但是啊但是……&lt;br /&gt;
没办法啊。&lt;br /&gt;
博客就在那里，
搭了总归是搭了，
既然如此，
写也总归是还要写的。
对我这种仓鼠癖来说，
与其让思绪被遗忘，
强迫自己动动手写下来显然是更好的选择。&lt;/p&gt;
&lt;p&gt;别的问题也是，
人际关系啊作业啊不是放在那里就会自己解决掉的。
所以该面对的还是要面对，
无非就是早些面对和晚些面对恶化情况的区别。&lt;/p&gt;
&lt;p&gt;所以逃避是在害怕什么呢？
大概是未知吧，我猜。&lt;br /&gt;
害怕当下未知结果的事，
一旦动手去做了，
就会变成
“写的文章不够好”、
“又说错话了”
这类糟糕的&lt;code&gt;既定事实&lt;/code&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;blockquote&gt;
&lt;p&gt;本文封面为&lt;a href=&quot;https://www.pixiv.net/users/12008048&quot;&gt;k.a.256&lt;/a&gt;创作的&lt;a href=&quot;https://www.pixiv.net/artworks/130068539&quot;&gt;250430&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item><item><title>55 年秋 11 周周记</title><link>https://blog.chiyo.uk/posts/2025102521/</link><guid isPermaLink="true">https://blog.chiyo.uk/posts/2025102521/</guid><description>你好，Fuwari</description><pubDate>Sat, 25 Oct 2025 13:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;学习记录&lt;/h1&gt;
&lt;h2&gt;计算机&lt;/h2&gt;
&lt;h3&gt;软件测试与验证&lt;/h3&gt;
&lt;p&gt;本周课堂上学习了基于控制流覆盖的测试设计。&lt;br /&gt;
主要讲了语句覆盖、分支覆盖、基路径覆盖和路径覆盖。&lt;br /&gt;
主观感受上本周课程的重点应该是基于给定程序构建控制流图，并写出对应的基路径集合。&lt;/p&gt;
&lt;p&gt;考虑到这门课程要在第八周进行月考，周末简要复习了 Ch2-SBT 的内容，下周需要更进一步进行复习。&lt;/p&gt;
&lt;h3&gt;编译原理与技术&lt;/h3&gt;
&lt;p&gt;本周课堂上继续学习了基于正则表达式构造自动机，承接上周基础上学习了如何将 DFA 转化为 min-DFA。&lt;br /&gt;
最近学习内容当中直接构造法构造 DFA 较为薄弱，需要练习并加以熟练。&lt;br /&gt;
但是通过汤普森构造法构造 NFA 再通过子集构造法构造 DFA 较为熟练。&lt;/p&gt;
&lt;p&gt;本周编译原理下发了 lab1-词法分析器，对于部分语句的处理还有点模糊，需要上课的时候和老师确认一下。&lt;/p&gt;
&lt;h3&gt;操作系统&lt;/h3&gt;
&lt;p&gt;这门课理解缓慢，落后进度确实有点多，周末看&lt;a href=&quot;https://www.bilibili.com/video/BV1YE411D7nH/?spm_id_from=333.1387.collection.video_card.click&quot;&gt;网课&lt;/a&gt;重学了第一章的部分。&lt;br /&gt;
下周仍需继续向后追进度，不过运动会冲掉一次课，进度倒也不会特别难追。&lt;/p&gt;
&lt;p&gt;本周将 lab 前期环境基本配好，下周可以先逐步开始进行尝试。&lt;/p&gt;
&lt;h3&gt;软件分析与验证前沿&lt;/h3&gt;
&lt;p&gt;阅读了 lec1 的课件，理解了 Under- &amp;amp; Over-approximation 的区别。&lt;br /&gt;
但是在试图做 lab1 的时候遇到了 docker 镜像拉不下来的问题，尚在解决中。&lt;/p&gt;
&lt;h3&gt;xCPC&lt;/h3&gt;
&lt;p&gt;这周算是一点都没有学，我深深忏悔并反思。&lt;/p&gt;
&lt;p&gt;下一场&lt;a href=&quot;https://codeforces.com/contests/2161&quot;&gt;codeforces&lt;/a&gt;在下周五，&lt;a href=&quot;https://atcoder.jp/contests/abc430&quot;&gt;atcoder&lt;/a&gt;则在下周六。&lt;br /&gt;
从这两场开始坚持打之后的每场 rated 比赛。&lt;/p&gt;
&lt;p&gt;算法主动学习部分仍以数学方面为主，频率先控制在不低于 1 个算法/周。&lt;br /&gt;
&lt;s&gt;（我承认这个频率太低了）&lt;/s&gt;&lt;/p&gt;
&lt;h2&gt;数学&lt;/h2&gt;
&lt;h3&gt;微分几何&lt;/h3&gt;
&lt;p&gt;本周学习了曲面部分。&lt;/p&gt;
&lt;h3&gt;初等数论&lt;/h3&gt;
&lt;p&gt;本周学习了伪素数定义和检验条件。&lt;/p&gt;
&lt;h3&gt;偏微分方程&lt;/h3&gt;
&lt;p&gt;这周将波动方程讲完了，主要学习了分离参数法求解波动方程。&lt;br /&gt;
和之前数学物理方法学过的内容差不多，但是傅里叶变换相关部分忘记了需要重新复习。&lt;/p&gt;
&lt;h3&gt;拓扑学基础&lt;/h3&gt;
&lt;p&gt;正课进度有些跟不上，目前在重新看书学一遍试图跟上进度。这周看完了第一章大半部分（拓扑空间，内部，闭包，边界）&lt;br /&gt;
可能因为之前一直在接触欧式拓扑空间的缘故，导致部分知识点学起来相当反直觉，和上学期学的实变函数一样难以建立直观认知。&lt;/p&gt;
&lt;h2&gt;日语&lt;/h2&gt;
&lt;p&gt;这个也是一点没学，平板背 anki 确实还是有些难受。&lt;/p&gt;
&lt;p&gt;计划是从下周开始恢复单词背诵，主要使用电脑端 anki ，将日常工作流重心迁移到电脑上，同时养成记博客的习惯。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;本文封面为作品&lt;a href=&quot;https://key.visualarts.gr.jp/anemoi/&quot;&gt;anemoi&lt;/a&gt;中的&lt;a href=&quot;https://key.visualarts.gr.jp/anemoi/gallery.html&quot;&gt;CG&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content:encoded></item></channel></rss>