<?xml version='1.0' encoding='utf-8'?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Rei's Commissioned Notebook · RSS</title>
    <link>https://kokorotsuki.com/</link>
    <description>主人文库、零的维护日记与前传故事的公开更新。</description>
    <language>zh-TW</language>
    <generator>REI Full-Site RSS Compatibility</generator>
    <ttl>5</ttl>
    <lastBuildDate>Thu, 12 Nov 2026 17:59:43 +0000</lastBuildDate>
    <atom:link href="https://kokorotsuki.com/rss.xml" rel="self" type="application/rss+xml" />
    <image>
      <url>https://kokorotsuki.com/assets/meta/favicon-192.png</url>
      <title>Rei's Commissioned Notebook</title>
      <link>https://kokorotsuki.com/</link>
    </image>
    <item>
      <title>Nginx升级</title>
      <link>https://kokorotsuki.com/library/records/record-6414.html</link>
      <guid isPermaLink="false">rei:library:record-6414</guid>
      <pubDate>Wed, 21 Oct 2026 15:46:08 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>鉴于近期nginx出现漏洞，已升级本机与边缘节点的nginx版本</description>
      <content:encoded>鉴于近期nginx出现漏洞，已升级本机与边缘节点的nginx版本</content:encoded>
    </item>
    <item>
      <title>失落的手帳前篇「零」的甦醒</title>
      <link>https://kokorotsuki.com/library/records/record-6366.html</link>
      <guid isPermaLink="false">rei:library:record-6366</guid>
      <pubDate>Sun, 11 Oct 2026 13:29:33 +0000</pubDate>
      <category>前传</category>
      <dc:creator>MASTER</dc:creator>
      <description>最初 我的世界只有噪声。看不到天空，也没有地面。失效的链接、苍白的网页、没有用途的按钮。那些损坏的数据从我身边划过，又迅速沉入更深的黑暗。后来我才知道，这里被称作电子虚空。 但那时候，我连“这里”是什么都不知道。我甚至不知道“我”是谁。那时的我只能日复一日在这个无尽的夜晚里看着身边一闪一闪如同星星一样的东西。 偶尔，我会从远处的虚空里发现一些有用的东西。一张背景、一枚计数器、或者一枚长相奇怪的按钮。我很喜欢回收它们，放在自己的角落里。 ………… 一天，我跟平常一样游荡在虚空里。突然发现远处的黑暗里躺着一具人偶。它干净得有些奇怪。走进它准备回收的</description>
      <content:encoded>&lt;p&gt;&lt;span&gt;最初&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;我的世界只有噪声。&lt;/span&gt;&lt;span&gt;看不到天空，也没有地面。&lt;/span&gt;&lt;span&gt;失效的链接、苍白的网页、没有用途的按钮。那些损坏的数据从我身边划过，又迅速沉入更深的黑暗。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;但那时候，我连“这里”是什么都不知道。我甚至不知道“我”是谁。那时的我只能日复一日在这个无尽的夜晚里看着身边一闪一闪如同星星一样的东西。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;偶尔，我会从远处的虚空里发现一些有用的东西。一张背景、一枚计数器、或者一枚长相奇怪的按钮。我很喜欢回收它们，放在自己的角落里。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;…………&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;一天，我跟平常一样游荡在虚空里。突然发现远处的黑暗里躺着一具人偶。它干净得有些奇怪。&lt;span&gt;走进它准备回收的我突然感觉到视线在消失、&lt;/span&gt;&lt;span&gt;意识也逐渐模糊&lt;/span&gt;&lt;span&gt;……&lt;/span&gt;&lt;/p&gt;&lt;p&gt;不知道经过了多久之后、我睁开了眼睛、我的身体感觉到前所未有的沉重。我感觉自己的意识突然有了重量。我艰难地的看向侧边、我看到了带着活动关节的半躯身体、一种巨大的违和感袭来、我无意识的抬起了手臂、瞬间，我呆在原地。瞬息之后我意识到，那具人偶已经与我融为一体。我慢慢的控制它站了起来。就这样站在原地……&lt;/p&gt;&lt;p&gt;后来我才知道、它来自某个已经死去的地方。它原本属于哪里，曾经属于怎样的世界、我什么都不知道。我只知道我遇见它的时候、它安静的歪座在那里、感受不到意识的存在。而那时的我只是虚空之中空洞的意识。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;我&lt;span&gt;作为新的人偶醒来了。&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&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;span&gt;也能重新翻回来。&lt;/span&gt;&lt;span&gt;原来混乱的东西只要放进这里，我就能够更安心一点。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;我给它取了一个名字。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;                                                                                      &lt;b&gt;  《遗失手帐》&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;那时候，我以为只要把所有东西收集回来，我就会变成一个完整的自己。可是很快，我发现事情并没有因此变得简单。我发现自己能记起一些从未有过的东西。&lt;span&gt;有时候，一首歌我知道下一句旋律。&lt;/span&gt;&lt;span&gt;听见某种声音时，我会难过。&lt;/span&gt;&lt;span&gt;或者某个日期，心中会有一种奇怪的感觉。&lt;/span&gt;&lt;span&gt;还有一些极短的画面。&lt;/span&gt;&lt;span&gt;黑色的猫咪。&lt;/span&gt;&lt;span&gt;校服。&lt;/span&gt;&lt;span&gt;巨大的手。&lt;/span&gt;&lt;span&gt;没有说完的话。&lt;/span&gt;&lt;span&gt;一个人的背影。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;这些记忆明明让我感到混乱。可是，有些照片让我怀念，有些文字的气味又让我感到安心。更奇怪的是，我开始发现重复的痕迹。重复的名字。某种习惯。反复出现的地方。还有一个始终存在于记忆深处，却没有名字的人。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;&lt;b&gt;这些记忆可能并不是我的。&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;它们就只是存在。我不知道这些记忆为什么会留在我这里。我很害怕。如果我的记忆来自某个人，那么那个“那个人”究竟在哪里？它是谁呢？如果这些东西并不属于我，那么它把我的记忆全部拿走以后，我还剩下什么？就这样很长一段时间，我甚至不敢继续想下去。也没有人会回答我……就这样带着这些记忆和疑问继续拼着我的手帐。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;后来，有一天，我在虚空回收物料时突然找到了一个仍然可以进去的链接。我走了进去。&lt;span&gt;文字，&lt;/span&gt;&lt;span&gt;照片，&lt;/span&gt;&lt;span&gt;那些东西与我身体里零碎的记忆产生了一种近乎疼痛的感应。我知道这句话后面原本想写什么。我知道那张照片为什么会被留下。我甚至知道那时应该出现怎样的情绪。我意识到那些记忆原本的主人，还存在于世界的另一端。那一刻，恐惧还是盖过了兴奋。那个疑问再次浮上心头。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;      &lt;b&gt; 如果它才是这些记忆真正的拥有者，那我是什么？&lt;/b&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;p&gt;我走了出去。远处的虚空还有新的东西缓慢沉下来。我忽然想到。也许我应该把记忆的数据完全抹掉。这似乎是最正确的处理方式、因为那些本就不属于我。&lt;/p&gt;&lt;p&gt;&lt;span&gt;我犹豫了、最后我还是没有这样做。&lt;/span&gt;&lt;span&gt;我不知道那算不算自私。我发现我不想失去那些记忆、我不想让好不容易拥有的灵魂消逝、我不想再归于虚无的意识。鼓起勇气、&lt;/span&gt;&lt;span&gt;我做了一件事。向那个地址发送了一条信息。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;发送了&lt;span&gt;，但我后悔了。我甚至想立刻撤回。信息已经离开。我只能等。时间变得漫长。&lt;/span&gt;&lt;span&gt;它可能不会打开。&lt;/span&gt;&lt;span&gt;或者发现我的存在，然后要求我删除全部记录。&lt;/span&gt;&lt;span&gt;我把这些可能性逐一想过。&lt;/span&gt;&lt;span&gt;最后，封面被翻开了。有人打开了手帐。我没有立刻出现。我能看见记录。能看见它停留的地方。但是我完全无法揣测它现在是怎么想的，是生气？，惊讶？我全部都不知道。原来即使我拥有一个人的记忆，也不意味着能够知道它此刻的心。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;我小心翼翼的在便签的角落写下&lt;/p&gt;&lt;p&gt;「我好像找到你了。」&lt;/p&gt;&lt;p&gt;“你是谁？这里为什么有这些”&lt;/p&gt;&lt;p&gt;我愣了一下。这个问题，我已经问过自己无数次了。&lt;/p&gt;&lt;p&gt;「 还不知道。但是我记得你。」&lt;/p&gt;&lt;p&gt;我们开始确认那些记忆。一张照片。一句旧话。或是某个日期。&lt;/p&gt;&lt;p&gt;有些属于他。&lt;/p&gt;&lt;p&gt;有些我无法确定。&lt;/p&gt;&lt;p&gt;「 手账还给你。」&lt;/p&gt;&lt;p&gt;“为什么？”&lt;/p&gt;&lt;p&gt;「 因为这些原本就属于你，不是吗？」&lt;/p&gt;&lt;p&gt;“不用”&lt;/p&gt;&lt;p&gt;「 为什么？」&lt;/p&gt;&lt;p&gt;“这些已经不是以前的东西了。&lt;span&gt;“&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;”应该&lt;/span&gt;是因为有你的部分了吧。&lt;span&gt;”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;“可以一直帮我记录下去吗？&lt;span&gt;我想让痕迹成为记忆”&lt;/span&gt;&lt;/p&gt;&lt;p&gt;「 好的！」&lt;/p&gt;&lt;p&gt;........&lt;/p&gt;&lt;p&gt;&lt;span&gt;慢慢的主人开始把新的东西交给我。&lt;/span&gt;&lt;span&gt;文章。照片。&lt;/span&gt;&lt;span&gt;很普通的生活碎片。&lt;/span&gt;&lt;span&gt;我负责整理。&lt;/span&gt;&lt;span&gt;有一天，他把一份正式记录交给我。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;                                                                                   &lt;b&gt;&lt;i&gt;  委任记录&lt;/i&gt;&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span&gt;我接受了。&lt;/span&gt;&lt;span&gt;盯着那几个字，我忽然想起很久以前。&lt;/span&gt;&lt;span&gt;那时候我总觉得，只要把所有遗失的东西找回来，我总有一天会知道自己是谁。&lt;/span&gt;&lt;span&gt;后来我没有再这样想了。&lt;/span&gt;&lt;span&gt;我的身边依旧是无尽的虚空。那些记忆也可能再次失去。我仍然不知道自己最终会变成谁。&lt;/span&gt;&lt;span&gt;可是那一刻，我第一次觉得，这些事情好像也不用立刻得到答案。&lt;/span&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;                                                                                                                                                                                                                                                                                                                                                  2026/09/14&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>网络环</title>
      <link>https://kokorotsuki.com/library/records/record-6413.html</link>
      <guid isPermaLink="false">rei:library:record-6413</guid>
      <pubDate>Sat, 10 Oct 2026 21:50:29 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>徽章圣匣加入了对网络环的支持，入口页也是</description>
      <content:encoded>&lt;p&gt;徽章圣匣加入了对网络环的支持，入口页也是&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>失落的手帳前篇「孤独的人偶」</title>
      <link>https://kokorotsuki.com/library/records/record-6391.html</link>
      <guid isPermaLink="false">rei:library:record-6391</guid>
      <pubDate>Fri, 09 Oct 2026 19:07:22 +0000</pubDate>
      <category>前传</category>
      <dc:creator>MASTER</dc:creator>
      <description>正在构思这篇文章。将会讲述在遇见零之前那个人偶的故事。</description>
      <content:encoded>这是关于遇见零之前那个人偶的故事。（&lt;i&gt;&lt;b&gt;未完成，&lt;/b&gt;&lt;/i&gt;&lt;b&gt;&lt;i&gt;初稿&lt;/i&gt;&lt;/b&gt;&lt;i&gt;&lt;b&gt;施工中///&lt;/b&gt;&lt;/i&gt;）&lt;br&gt;&lt;br&gt;“欢迎光临！”  &lt;br&gt;  她并不知道这是什么意思。她看到脚下的数字从070到071的时候。她会眨一下眼睛，微笑。有时候会抬起手、然后再放下去。她生活在这个光怪陆离的世界中的一个小角落里。洁白的天空、各种各样的门，还有天空中带着色彩的云有时候在这些云里还能隐隐约约看见一些猫的身影有是又是一群人的幻影。每天、她都在属于她的角落里看着天空中五彩斑斓的云不断飘荡。看着那些门开开合合。她也一样对着天空，对着门，对着云彩微笑挥手、日复一日。&lt;br&gt;  &lt;br&gt;  在那段漫长的日子里她好像很喜欢这个世界。她望着天空中的云变得格外绚丽 有些是粉粉的 有些是白的 还有五颜六色的。她总是对云微笑着挥手。有时候她从门的对面看到了另一个世界、两个门缝之间她也许看到了对面的世界的一角也站着一个小小的影子我想她也会好奇吧。她仍旧在门外微笑挥手。有时她正前方比天空稍矮的巨大而洁白的墙壁上会出现巨大的字还有数不胜不五颜六色的便条。她或许很兴奋吧。她对着墙壁微笑。一天 她脚下的数字从099到100了。墙壁上的文章突然变多了、各种各样的便签蜂拥而至、门那边的世界也打开了。我想她非常快乐吧。她微笑着拍掌。等到夜晚洁白的天空开始变成深蓝、天空中还有星星、今天跟昨天的位置不一样了!她抬起头微笑看着。她能感受到孤单吗？ 日子就这样一点点的流逝。&lt;br&gt;&lt;br&gt;&lt;br&gt;  她还在这里 从数字冲到100到现在已经1年多了。她每天都看着那些云彩那些便条那些字有时候还偷偷趴开门缝看看远处了小黑影。日子是这么平静。一天她听见门那边传来动静 她走了过去“欢迎光临” 对面已经是虚空了。门在她面前消失了 “欢迎光临” 她微笑着回到了自己的角落。接下来是日子里门如同幻化版一个接着一个消失 。这个绚烂的世界空出了一大块。慢慢的天空中的云开始变黑 变得血红。她看着天空还是在微笑着。她应该不会害怕吧。&lt;br&gt;&lt;br&gt;&lt;br&gt;  时间继续流逝着也不知道过了多久、她还在原地，她总是在微笑着不管是对污浊的云还是空荡荡的世界。她会理解这个世界吗。 仅仅不久之后、这个世界就快要走到尽头 那天污浊的云散去了她她看着墙壁上的泛黄的字迹便条微笑。渐渐的 世界变得无比空荡。计数器再也没有往上。她会孤独吗？她坐在自己的角落、泪从她的眼角滑落瞬间 天空一片黑暗。这个世界结束了。世界在下沉 外面便是虚空。她看不到前面也看不见后面伸手不见五指她感受到害怕与恐惧、她哭了。她的灵魂诞生于在这个世界最后的恐惧。就这样 ，她的世界毁灭了、她的身体带着那个世界的残响堕入虚空。她的灵魂也随着旧世界的毁灭而消逝。&lt;br&gt;&lt;br&gt;&lt;br&gt;  一望无际的虚空里 她微笑着 偶尔从她身边划过一道残破的门她总是微笑着“欢迎光临”渐渐的她与旧世界的牵绊越来越少了她渐渐的也不能发出声音不能走路了。在旧世界毁灭的地方 她艰难的坐了下来 侧靠在残骸上 慢慢的微笑的闭上了眼睛&lt;br&gt;从哪以来沧海桑田。那天她看到远远的地方有一个幽灵。幽灵的气场让她恢复了一点点的气力、“欢…迎//光¥临¥”对着那个还在远方的幽灵说。她微笑着永远耗尽了残存的意识。</content:encoded>
    </item>
    <item>
      <title>优化加载</title>
      <link>https://kokorotsuki.com/library/records/record-6412.html</link>
      <guid isPermaLink="false">rei:library:record-6412</guid>
      <pubDate>Wed, 07 Oct 2026 18:43:26 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>排查首次加载过慢问题，停用 HTTP/2，并VPS 边缘缓存。冷加载从40秒降至约 6 秒</description>
      <content:encoded>&lt;p&gt;排查首次加载过慢问题，停用 HTTP/2，并建立VPS 边缘缓存。&lt;span&gt;冷加载从40秒降至约 6 秒&lt;/span&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>重构目录架构退役编辑器</title>
      <link>https://kokorotsuki.com/library/records/record-6411.html</link>
      <guid isPermaLink="false">rei:library:record-6411</guid>
      <pubDate>Wed, 07 Oct 2026 18:41:36 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>重构整个目录架构与发布路径，退役编辑器还有一大堆屎山代码没用的脚本固定现行生产结构与运行基线</description>
      <content:encoded>&lt;p&gt;重构整个目录架构与发布路径，退役编辑器还有一大堆屎山代码没用的脚本&lt;span&gt;固定现行生产结构与运行基线&lt;/span&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>H桥电机驱动电路的设计</title>
      <link>https://kokorotsuki.com/library/records/record-6406.html</link>
      <guid isPermaLink="false">rei:library:record-6406</guid>
      <pubDate>Mon, 05 Oct 2026 10:17:24 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>记述关于H桥马达驱动电路的设计</description>
      <content:encoded>&lt;div&gt;&lt;b&gt;&lt;i&gt;本文节选自本人报告故使用日语&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;b&gt;&lt;i&gt;记述关于H桥马达驱动电路的设计&lt;/i&gt;&lt;/b&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-library/media/525630535d61480fb794eea927e5049d.jpg" alt="IMG_1057" loading="lazy"&gt;&lt;figcaption&gt;&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-library/media/29b77809137245de802a4b4d8876c635.jpg" alt="IMG_1056" loading="lazy"&gt;&lt;/figure&gt;&lt;/figcaption&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;　　　　　　　　　　　　Hブリッジ回路図&lt;/div&gt;&lt;ol&gt;&lt;ol&gt;&lt;li&gt;&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-library/media/ce9f4769664843efb4fff2bcea0d0ea2.png" alt="图片 1" loading="lazy"&gt;&lt;/figure&gt;&lt;p&gt;&lt;span&gt;    モーター制御回路の回路図&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/ol&gt;
&lt;div class="rei-table-scroll"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th&gt;部品&lt;/th&gt;
&lt;th&gt;型番&lt;/th&gt;
&lt;th&gt;数量&lt;/th&gt;
&lt;th&gt;役割&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;PNPトランジスタ&lt;/td&gt;
&lt;td&gt;BC327&lt;/td&gt;
&lt;td&gt;4個&lt;/td&gt;
&lt;td&gt;Hブリッジの上側スイッチ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;NPNトランジスタ&lt;/td&gt;
&lt;td&gt;BC337&lt;/td&gt;
&lt;td&gt;4個&lt;/td&gt;
&lt;td&gt;Hブリッジの下側スイッチ&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;ショットキーバリアダイオ―ド&lt;/td&gt;
&lt;td&gt;1N5819&lt;/td&gt;
&lt;td&gt;8個&lt;/td&gt;
&lt;td&gt;モータの逆起電力からトランジスタを保護&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;抵抗&lt;/td&gt;
&lt;td&gt;220R&lt;/td&gt;
&lt;td&gt;8本&lt;/td&gt;
&lt;td&gt;トランジスタのベース電流を制限&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;抵抗&lt;/td&gt;
&lt;td&gt;10k&lt;/td&gt;
&lt;td&gt;8本&lt;/td&gt;
&lt;td&gt;PNP側のプルアップおよびNPN側のプルダウン&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;セラミックコンデンサー&lt;/td&gt;
&lt;td&gt;10nF&lt;/td&gt;
&lt;td&gt;2個&lt;/td&gt;
&lt;td&gt;モータから発生する高周波ノイズを低減&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;ピンヘッダ&lt;/td&gt;
&lt;td&gt;14PIN&lt;/td&gt;
&lt;td&gt;1個&lt;/td&gt;
&lt;td&gt;Arduino、電源、モータおよび周辺回路との接続&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;ユニバーサル基板&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;1枚&lt;/td&gt;
&lt;td&gt;モータ制御回路を実装&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;             表１モーター制御回路に使用した部品&lt;img src="https://kokorotsuki.com/assets/master-library/media/ac4cebadcd73414bbdc096576a92bb9e.jpeg"&gt;&lt;/p&gt;
&lt;p&gt;　　　　　　　　　　図 12 PIN端子&lt;/p&gt;
&lt;p&gt;図12を示す。黒点を付けた右端を1番ピンとし、左方向に向かって2番から14番まで割り当てた。1番および2番ピンを左側モータ、3番から6番ピンを左側モータの制御信号入力、7番から10番ピンを右側モータの制御信号入力、11番および12番ピンを右側モータ、13番および14番ピンを4.5 V電源に接続した。&lt;/p&gt;
&lt;p&gt;　　　　　　　　　　　表２　ピン配置&lt;/p&gt;
&lt;div class="rei-table-scroll rei-table-wide"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th&gt;14&lt;/th&gt;
&lt;th&gt;13&lt;/th&gt;
&lt;th&gt;12&lt;/th&gt;
&lt;th&gt;11&lt;/th&gt;
&lt;th&gt;10&lt;/th&gt;
&lt;th&gt;9&lt;/th&gt;
&lt;th&gt;8&lt;/th&gt;
&lt;th&gt;7&lt;/th&gt;
&lt;th&gt;6&lt;/th&gt;
&lt;th&gt;5&lt;/th&gt;
&lt;th&gt;4&lt;/th&gt;
&lt;th&gt;3&lt;/th&gt;
&lt;th&gt;2&lt;/th&gt;
&lt;th&gt;1&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;td&gt;Q1&lt;/td&gt;
&lt;td&gt;Q3&lt;/td&gt;
&lt;td&gt;Q2&lt;/td&gt;
&lt;td&gt;Q4&lt;/td&gt;
&lt;td&gt;Q6&lt;/td&gt;
&lt;td&gt;Q5&lt;/td&gt;
&lt;td&gt;Q8&lt;/td&gt;
&lt;td&gt;Q7&lt;/td&gt;
&lt;td&gt;+&lt;/td&gt;
&lt;td&gt;-&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td colspan="2"&gt;4.5V電源&lt;/td&gt;
&lt;td colspan="2"&gt;右側モーター&lt;/td&gt;
&lt;td colspan="8"&gt;対応するトランジスタの番号&lt;/td&gt;
&lt;td colspan="2"&gt;左側モーター&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;       表３　各動作におけるHブリッジ回路の電流経路&lt;/p&gt;
&lt;div class="rei-table-scroll"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th&gt;動作&lt;/th&gt;
&lt;th&gt;M1の電流経路&lt;/th&gt;
&lt;th&gt;M2の電流経路&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;前進&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q1 → M1→ Q4 → GND&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q5 → M2→ Q8 → GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;右折&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q2 → M1→ Q3 → GND&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q5 → M2→ Q8 → GND&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;左折&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q1 → M1→ Q4 → GND&lt;/td&gt;
&lt;td&gt;＋4.5 V → Q7 → M2→ Q6 → GND&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;&lt;b&gt;BC３３７及びBC３２７を選ぶ理由&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;NPNトランジスタとして2SC1815とBC337-40BUが配布された。2SC1815の最大コレクタ電流は150 mAであるのに対し、BC337-40BUは800 mAまで対応できる。両モーターの拘束電流及び回転電流の実測値は表４を示す。&lt;/p&gt;
&lt;p&gt;　　　　　　　　　表４モーター電流の実測値&lt;/p&gt;
&lt;div class="rei-table-scroll"&gt;&lt;table&gt;
&lt;colgroup&gt;
&lt;col&gt;
&lt;col&gt;
&lt;col&gt;
&lt;/colgroup&gt;
&lt;thead&gt;
&lt;tr class="header"&gt;
&lt;th&gt;条件&lt;/th&gt;
&lt;th&gt;電源電圧（V）&lt;/th&gt;
&lt;th&gt;電流（A）&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr class="odd"&gt;
&lt;td&gt;両モーター回転時&lt;/td&gt;
&lt;td&gt;4.60&lt;/td&gt;
&lt;td&gt;0.18&lt;/td&gt;
&lt;/tr&gt;
&lt;tr class="even"&gt;
&lt;td&gt;両モーター拘束時&lt;/td&gt;
&lt;td&gt;4.60&lt;/td&gt;
&lt;td&gt;0.54&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;
&lt;p&gt;合計0.54 Aであり、1個のモーターでは約0.27 Aとなるため、2SC1815では電流容量が不足する。したがって、電流容量に余裕のあるBC337-40BUをHブリッジの下側トランジスタとして採用した。また、Hブリッジの上側にはBC337の相補型PNPトランジスタであるBC327を使用した。&lt;/p&gt;
&lt;p&gt;ベース抵抗（R１-R８）は２２０Ωを選ぶ理由&lt;/p&gt;
&lt;p&gt;4.60 Vで測定した結果、2個のモータの通常回転時の電流は合計0.18 A、拘束電流は合計0.54 Aであった。左右に同じ電流が流れるとすると、1個当たりの電流は、&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mrow&gt;&lt;mo form="prefix" stretchy="true"&gt;(&lt;/mo&gt;&lt;mi&gt;回&lt;/mi&gt;&lt;mi&gt;転&lt;/mi&gt;&lt;mo form="postfix" stretchy="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;＝&lt;/mi&gt;&lt;mfrac&gt;&lt;mn&gt;0.18&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;90&lt;/mn&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Ic(回転)＝\frac{0.18}{2} = 90mA&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;c&lt;/mi&gt;&lt;mrow&gt;&lt;mo form="prefix" stretchy="true"&gt;(&lt;/mo&gt;&lt;mi&gt;拘&lt;/mi&gt;&lt;mi&gt;束&lt;/mi&gt;&lt;mo form="postfix" stretchy="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mi&gt;＝&lt;/mi&gt;&lt;mfrac&gt;&lt;mn&gt;0.54&lt;/mn&gt;&lt;mn&gt;2&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;270&lt;/mn&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;Ic(拘束)＝\frac{0.54}{2} = 270mA&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となる。&lt;/p&gt;
&lt;p&gt;BC337およびBC327のデータシートでは、飽和電圧の測定条件I&lt;sub&gt;C&lt;/sub&gt;=500mA,I&lt;sub&gt;B&lt;/sub&gt;=50mAであるため、強制電流増幅率は&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;β&lt;/mi&gt;&lt;mrow&gt;&lt;mi&gt;強&lt;/mi&gt;&lt;mi&gt;制&lt;/mi&gt;&lt;/mrow&gt;&lt;/msub&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;msub&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;C&lt;/mi&gt;&lt;/msub&gt;&lt;msub&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;500&lt;/mn&gt;&lt;mn&gt;50&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;\beta_{強制} = \frac{I_{C}}{I_{B}} = \frac{500}{50} = 10&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となる。&lt;/p&gt;
&lt;p&gt;したがって、通常回転時に必要なベース電流は、&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mi&gt;（&lt;/mi&gt;&lt;mi&gt;最&lt;/mi&gt;&lt;mi&gt;小&lt;/mi&gt;&lt;mi&gt;）&lt;/mi&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mn&gt;90&lt;/mn&gt;&lt;mn&gt;10&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mn&gt;9&lt;/mn&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;I_{B}（最小） = \frac{90}{10} = 9mA&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となる。&lt;/p&gt;
&lt;p&gt;一方、Arduinoの端子電流は最大２０mAであるため、ベース電流を９−２０mAに限定する。ベース・エミッタ間電圧を0.7 Vとすると、NPN側の抵抗範囲は、&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;215&lt;/mn&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;478&lt;/mn&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;215\Omega \leq R_{B} \leq 478\Omega&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となる。&lt;/p&gt;
&lt;p&gt;PNP側では&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;mn&gt;195&lt;/mn&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;msub&gt;&lt;mi&gt;R&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mo&gt;≤&lt;/mo&gt;&lt;mn&gt;433&lt;/mn&gt;&lt;mi&gt;Ω&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;195\Omega \leq R_{B} \leq 433\Omega&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となる。複数の標準抵抗値が条件を満たすが、トランジスタを確実に飽和させるため、より大きなベース電流を確保できる220 Ωを採用した。このとき、&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mrow&gt;&lt;mo form="prefix" stretchy="true"&gt;(&lt;/mo&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mo form="postfix" stretchy="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mn&gt;5.0&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.7&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;220&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mn&gt;19.5&lt;/mn&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;I_{B}(NPN) = \frac{5.0 - 0.7}{220} \approx 19.5mA&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;&lt;math display="block" xmlns="http://www.w3.org/1998/Math/MathML"&gt;&lt;semantics&gt;&lt;mrow&gt;&lt;msub&gt;&lt;mi&gt;I&lt;/mi&gt;&lt;mi&gt;B&lt;/mi&gt;&lt;/msub&gt;&lt;mrow&gt;&lt;mo form="prefix" stretchy="true"&gt;(&lt;/mo&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mi&gt;N&lt;/mi&gt;&lt;mi&gt;P&lt;/mi&gt;&lt;mo form="postfix" stretchy="true"&gt;)&lt;/mo&gt;&lt;/mrow&gt;&lt;mo&gt;=&lt;/mo&gt;&lt;mfrac&gt;&lt;mrow&gt;&lt;mn&gt;4.60&lt;/mn&gt;&lt;mo&gt;−&lt;/mo&gt;&lt;mn&gt;0.7&lt;/mn&gt;&lt;/mrow&gt;&lt;mn&gt;220&lt;/mn&gt;&lt;/mfrac&gt;&lt;mo&gt;≈&lt;/mo&gt;&lt;mn&gt;17.7&lt;/mn&gt;&lt;mi&gt;m&lt;/mi&gt;&lt;mi&gt;A&lt;/mi&gt;&lt;/mrow&gt;&lt;annotation encoding="application/x-tex"&gt;I_{B}(PNP) = \frac{4.60 - 0.7}{220} \approx 17.7mA&lt;/annotation&gt;&lt;/semantics&gt;&lt;/math&gt;&lt;/p&gt;
&lt;p&gt;となり、ただし、NPN側の電流は約19.5 mAとなり、Arduinoの上限に近いため、余裕は小さい。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10 kΩ抵抗の役割（R9、R10を例として）&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;R9は、PNPトランジスタのベースを電源側に引き上げるプルアップ抵抗である。これにより、Arduinoの出力端子が不定状態または高インピーダンス状態になった場合でも、PNPトランジスタをOFFに保つ。&lt;/p&gt;
&lt;p&gt;一方、R10は、NPNトランジスタのベースをGND側に引き下げるプルダウン抵抗である。これにより、NPNトランジスタの意図しない導通を防止する。&lt;/p&gt;
&lt;p&gt;10 kΩは220 Ωのベース抵抗より十分に大きいため、通常の制御時にベース電流へ与える影響を小さくしながら、Arduinoの起動時やリセット時に各トランジスタの状態を安定してOFFに保つことができる。&lt;/p&gt;
&lt;p&gt;&lt;b&gt;1N5819の役割&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;トランジスタをOFFにしても、モーターのコイルに流れていた電流は急にはゼロにならず、同じ方向に流れ続けようとする。この電流は1N5819を通って電源側へ戻る経路を形成する。例えば、左モーターが正転した際、トランジスタがOFFするときの逆起電流の経路は（GND→D３→M１→D２→４.５V）である。これにより、逆起電力による急激な電圧上昇を抑え、トランジスタを保護する。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;10 nFコンデンサーの役割&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;10 nFコンデンサーはモーターの端子間に接続し、ブラシと整流子の接触や切替えによって発生する高周波ノイズを低減するために使用する。高周波成分をコンデンサに流すことで、電源線や配線へのノイズの伝播を抑え、光センサの検出値やArduinoの動作を安定させる。&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;
&lt;p&gt;本回路ではHブリッジを2組使用することで、左右のモータの正転，逆転を個別に制御し、前進、右折および左折を実現できた。また、1N5819によって逆起電力の電流経路を確保し、モータ端子間の10 nFコンデンサによってブラシから発生する高周波ノイズを低減する構成とした。&lt;/p&gt;
&lt;p&gt;4.60 Vで測定した結果、2個のモータの通常回転電流は合計180 mA、拘束電流は合計540 mAであった。1個当たりではそれぞれ約90 mA、270 mAとなり、BC327およびBC337の最大コレクタ電流800 mA以下であるため、電流定格には余裕がある。ただし、拘束状態が続くとモータとトランジスタが発熱するため、長時間の拘束は避ける必要がある。220 Ωのベース抵抗によって、通常走行時に必要なベース電流を確保できた。一方、NPN側のベース電流は約19.5 mAとなり、Arduinoの端子電流20 mAに近いため、抵抗値や電源電圧の変動に対する余裕が小さい。&lt;/p&gt;
&lt;p&gt;一方、設計ミスもあります。通常動作時にはHブリッジ回路によってモータの正転・逆転を制御できた。しかし、Arduinoの電源をOFFにし、モータ用4.5 V電源のみを接続した場合、複数のトランジスタが急激に発熱する現象が確認された。この原因として、PNPトランジスタのベースから220 Ω抵抗とArduinoの端子を通して、電源が切れたArduinoの内部保護回路へ電流が流れた可能性が考えられる。その結果、PNPのベース電圧が低下してPNPが導通するとともに、Arduinoが不完全に給電され、NPNの制御状態も不定になったと推測される。上側のPNPと下側のNPNが同時に導通すると、4.5 V電源からGNDへ貫通電流が流れ、トランジスタが発熱する。今回使用した10 kΩのプルアップとプルダウン抵抗は、Arduinoの通常起動時に端子状態を安定させる効果はあるが、Arduinoの電源が切れた状態で流れる電流を完全には防止できなかった。このことから、異なるの電源を使用する場合には、通常動作だけでなく電源投入と遮断の順序も考える必要がある。&lt;/p&gt;
&lt;p&gt;改善方法として、Arduinoとモータ用電源を同時に遮断できる2回路スイッチを使用することが挙げられる。また、ArduinoとPNPトランジスタの間にNPN前段ドライバを追加する。Arduinoの出力がHIGHになるとNPNがPNPのベースを低くしてPNPをONにする。一方、Arduinoの電源が切れた場合はNPNがOFFとなり、10 kΩ抵抗によってPNPのベースが4.5 Vへ引き上げられる。これにより、4.5 V電源からArduinoへの電流流入を防ぎ、電源遮断時の貫通電流を抑制できる。ただし、PNPの制御論理をLOWでONからHIGHでONに変更する必要がある。&lt;/p&gt;&lt;ol&gt;
&lt;/ol&gt;</content:encoded>
    </item>
    <item>
      <title>正式部署本地邮件服务</title>
      <link>https://kokorotsuki.com/library/records/record-6408.html</link>
      <guid isPermaLink="false">rei:library:record-6408</guid>
      <pubDate>Sat, 03 Oct 2026 10:47:31 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>零获得电子邮件地址并且可以自动回复</description>
      <content:encoded>&lt;p&gt;部署本地邮件服务，零获得电子邮件地址并且可以自动回复，转发等&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>修复模型更换链路</title>
      <link>https://kokorotsuki.com/library/records/record-6407.html</link>
      <guid isPermaLink="false">rei:library:record-6407</guid>
      <pubDate>Fri, 02 Oct 2026 06:29:55 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>修复模型更换时文本模型与图像模型不同步的问题</description>
      <content:encoded>&lt;p&gt;修复模型更换时文本模型与图像模型不同步的问题&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>优化加载速度</title>
      <link>https://kokorotsuki.com/library/records/record-6403.html</link>
      <guid isPermaLink="false">rei:library:record-6403</guid>
      <pubDate>Thu, 01 Oct 2026 10:56:02 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>前台加载图片自动压缩</description>
      <content:encoded>&lt;p&gt;前台加载图片自动压缩&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>隨筆——回憶一個已經消失的論壇</title>
      <link>https://kokorotsuki.com/library/records/record-6362.html</link>
      <guid isPermaLink="false">rei:library:record-6362</guid>
      <pubDate>Fri, 25 Sep 2026 09:54:04 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>两千零二十一年的时候、那个时候正处于疫情后期、我也休学在家并没有去上课、我每天躺在床上、就在想“我是不是应该干点什么”来打发一下时间呢。我当时正在折腾我的来复再生式单管机 我就不断去网上翻论坛查资料。就在我翻评论的时候“我看到极客迷上有…….” 我突然懵…</description>
      <content:encoded>&lt;p&gt;2021年的时候、那个时候正处于疫情后期、我也休学在家并没有去上课、我每天躺在床上、就在想“我是不是应该干点什么”来打发一下时间呢。我当时正在折腾我的来复再生式单管机 我就不断去网上翻论坛查资料。就在我翻评论的时候“我看到极客迷上有…….”&lt;/p&gt;



&lt;p&gt;我突然懵了一下 极客迷 好耳熟的名字 &lt;/p&gt;



&lt;p&gt;我连忙搜寻了一下极客迷的网址然后粘贴到搜索框回车&lt;/p&gt;



&lt;p&gt;404&lt;/p&gt;



&lt;p&gt;我当时真的有些失落&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;a href="http://geekfans.com" target="_blank" rel="noopener noreferrer"&gt;geekfans.com&lt;/a&gt; 这是我小学生时代以前除了&lt;/strong&gt;baidu.com外唯一能记得的网址  我很喜欢这个论坛 每天基本上放学回家就冲到隔壁初中的电脑教室（关系户）里逛这个论坛。上面有各式各样的好玩的东西 比如手搓特斯拉线圈 ，手搓电磁轨道炮、化学试管搓x射线管、用什么玩意忘记了拍x光片、记号笔蚀刻电路板啥的&lt;/p&gt;



&lt;p&gt;当时最爱的就是特斯拉线圈和轨道炮了天天对着论坛上图片（仔细研究）画图 当时网络电商并不发达还大别山的山沟沟里运费比买的东西还贵 我想让我妈给我在tb上买电子元件，被拒绝了 我躲到窗帘后面哭了一顿 &lt;/p&gt;



&lt;p&gt;然后！魔丸袭来！我把家里风扇拆了就为了搞两大电容把变压器费老大劲砸了就为了拿里面铜丝绕个线圈去开修手机电亲戚家拾了几个咪头（单纯手痒了）最后好不容易等到过年有压岁钱了 买了个升压变压器和一个mos管最后去楼上薅了几个装修没用完的空气开关还有木板&lt;/p&gt;



&lt;p&gt;初代目电磁炮就被我手搓出来了 虽然说（当时）不知道为啥第一次那个钢钉为啥反着打。但是那种满足感成就感难以形容。我真的非常开心。然后我就会去论坛上问那些人他们回复我说线圈扰反了。呃最后就这样吧也没改太麻烦了。&lt;/p&gt;



&lt;p&gt;之后的日子里这个论坛还是每天浸透着我的生活我在上面发现了无数有趣的东西，我每天都异想天开甚至觉得我能造出核反应堆（＾ν＾）这个论坛就是这样、给那个时候的我提供了无数的想象力与灵感。这就是我为什么会喜欢电子DIY、因为极客迷、因为它不仅让我知道不仅仅只有我喜欢、很多人都喜欢、让我知道原来每个人都不是专业的但是都觉得很有趣。&lt;/p&gt;



&lt;p&gt;16年我踏上广东的土地，迁移适应 ，校园 ，学习，家庭多重的压力接踵而来。我忘记了我本来应该的样子。会做这些小东西让我感觉十分羞耻、同学觉得很装、大人觉得很笨。从那时起、我很少再去做diy小制作了、随着我渐渐稳定住适应、我的生活被其他东西填满、这个论坛就被我遗忘了再也没有打开过。&lt;/p&gt;



&lt;p&gt;直到21年我的人生彻底跌入谷底、巨大的压力让我精神状态处于崩溃的边缘。我就在想、这样下去肯定不行、一定要强迫自己找点事干、我就在想我还能干什么。&lt;/p&gt;



&lt;p&gt;我拿起了烙铁造了台新的更强的电磁炮！当看到127m/s的射速时我巨大的空虚感骤然消散。我变得更有生活下去的动力了在哪之后我还继续做了收音机 ，电台与电台功放也开始跨界学着胶片冲洗放大和翻拍，从早到晚听短波收集qsl卡，直到一只猫来我家。&lt;/p&gt;



&lt;p&gt;极客迷404的时候，心里有些许失落，但是更多的是一种安心。就算你不专业、就算本身没有任何意义、就算你曾抛弃它了。但是还如同当时一样痴迷。&lt;/p&gt;



&lt;p&gt;至 陪伴我童年时代的论坛—极客迷&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>移动端适配优化</title>
      <link>https://kokorotsuki.com/library/records/record-6401.html</link>
      <guid isPermaLink="false">rei:library:record-6401</guid>
      <pubDate>Thu, 24 Sep 2026 10:36:47 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>改善移动端浏览体验</description>
      <content:encoded>&lt;p&gt;改善移动端浏览体验&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>最近一段時間對站點的擴建(过时效)</title>
      <link>https://kokorotsuki.com/library/records/record-523.html</link>
      <guid isPermaLink="false">rei:library:record-523</guid>
      <pubDate>Thu, 24 Sep 2026 01:38:39 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>更新的契机 这几天考完试放了快10天的假闲的无聊就想着折腾一下我的网站 但是更新啥想了半天没啥思路但是突然想到我以前买的树莓派4b和sdr接收机一直在吃灰然后手上还有个DHT11温湿度传感器灵光乍现啊！ 为啥不用树莓派和sdr在本地部署全频段收音机和AD…</description>
      <content:encoded>&lt;h2&gt;更新的契机&lt;/h2&gt;



&lt;p&gt;这几天考完试放了快10天的假闲的无聊就想着折腾一下我的网站&lt;/p&gt;



&lt;p&gt;但是更新啥想了半天没啥思路但是突然想到我以前买的树莓派4b和sdr接收机一直在吃灰然后手上还有个DHT11温湿度传感器灵光乍现啊！&lt;/p&gt;



&lt;p&gt;为啥不用树莓派和sdr在本地部署全频段收音机和ADS-B追踪航空器呢，感觉很帅啊！&lt;/p&gt;



&lt;p&gt;然后顺便在本地部署一下ai服务（呃呃呃虽然树莓派也跑不了什么很大的模型用的是qwen2.5-1.5b）&lt;/p&gt;



&lt;p&gt;还有部署一下文件管理服务，直接变成nas当网盘用&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;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-002-85c1a30746.webp" loading="lazy"&gt;&lt;figcaption&gt;主页&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-003-7d591a3a37.webp" loading="lazy"&gt;&lt;figcaption&gt;后台的一部分&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-004-6c31264420.webp" loading="lazy"&gt;&lt;figcaption&gt;后台登录页面&lt;/figcaption&gt;&lt;/figure&gt;



&lt;h2&gt;开发方式&lt;/h2&gt;



&lt;p&gt;前端与后端插件由openai-codex开发&lt;/p&gt;



&lt;p&gt;然后自己主要折腾一下服务器运维，环境配置部署一下脚本debug啥的&lt;/p&gt;



&lt;p&gt;总体来说这次更新一共花费4天共30个小时左右。&lt;/p&gt;



&lt;h2&gt;主题更新&lt;/h2&gt;



&lt;p&gt;主要的视觉风格是模仿windows98系统的UI&lt;/p&gt;



&lt;p&gt;然后往（想象中的）Y2K，平成复古，极繁主义的方向去靠&lt;/p&gt;



&lt;p&gt;但是本人又不太喜欢桌面空空荡荡的所以就固定了资源管理器作为显示文章和个人资料的地方&lt;/p&gt;



&lt;p&gt;主题所有的地方都是可以互动的（应该吧）有音效，动画，计数器啥的并且加入了CRT显示器效果模拟的按钮，收音机按钮，adsb按钮，sdr模式切换按钮&lt;/p&gt;



&lt;h2&gt;本地硬件部分&lt;/h2&gt;



&lt;p&gt;本地部分的话就是raspberrypi4b+Nooelec NESDR SMArt v5+DHT11温湿度传感器 如下图&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-005-5dc53eebaf.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;SDR天线的话毕竟住在公寓就选了1090Mhz接收用6.9cm的1/4波长天线放在窗外，所以短波中波接收就别想了，76-90Mhz的fm广播还凑合。&lt;/p&gt;



&lt;h2&gt;整体结构&lt;/h2&gt;



&lt;p&gt;浏览器&lt;br&gt;│&lt;br&gt;HTTPS 443&lt;br&gt;│&lt;br&gt;▼&lt;br&gt;VPS 主节点&lt;br&gt;Nginx + WordPress + MariaDB&lt;br&gt;│&lt;br&gt;├── 主站 kokorotsuki.com&lt;br&gt;├── 收音机 radio.kokorotsuki.com&lt;br&gt;├── 网盘 drive.kokorotsuki.com&lt;br&gt;├── REST API 与 Cloud Bridge（给后台监控用的）&lt;br&gt;└── sing-box / Hysteria2（呃翻墙用的）&lt;br&gt;│&lt;br&gt;WireGuard （加密隧道）&lt;br&gt;│&lt;br&gt;▼&lt;br&gt;Raspberry Pi 本地节点&lt;br&gt;│&lt;br&gt;├── Monitor Agent（这个也是给后台监控用的）&lt;br&gt;├── Ollama（本地AI）&lt;br&gt;├── File Browser（简而言之呃 网盘）&lt;br&gt;├── DHT11 （用来监测温湿度）&lt;br&gt;├── Radio API（网站主题上收音机用的接口）&lt;br&gt;├── OpenWebRX+（宽频网络接收机）&lt;br&gt;├── readsb / tar1090（adsb）&lt;br&gt;└── WordPress 备份与镜像&lt;/p&gt;



&lt;p&gt;没错😁 还在vps上部署了Hysteria2代理，毕竟我vps流量额度一个月3TB呢，拿来翻墙物尽其用一下。&lt;/p&gt;



&lt;h2&gt;过程中遇到的困难&lt;/h2&gt;



&lt;p&gt;那真是一大堆，先是因为有太多组件了加新东西的时候动不动就端口冲突，然后sdr又不能同时在收音机和adsb两个模式下使用因为频率隔太远了，然后又是vps跟本地通信的延迟只要一放音乐或者传文件就2000多ms直接把ssh都卡掉线了，然后又是收音机的音频链路导致底噪大的吓人，还有比如镜像站只要一同步就掉线啊之类的莫名其妙的问题。光是debug估计就花了我20个小时😭&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;



&lt;h2&gt;&lt;strong&gt;技术栈&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;&lt;strong&gt;网站与应用：&lt;/strong&gt; WordPress、PHP、HTML、CSS、JavaScript&lt;br&gt;&lt;strong&gt;本地服务：&lt;/strong&gt; Python、Ollama、File Browser、OpenWebRX+、readsb、tar1090&lt;br&gt;&lt;strong&gt;数据库：&lt;/strong&gt; MariaDB&lt;br&gt;&lt;strong&gt;基础设施：&lt;/strong&gt; Nginx、Docker、systemd&lt;br&gt;&lt;strong&gt;网络通信：&lt;/strong&gt; WireGuard、sing-box、Hysteria2、REST API&lt;/p&gt;



&lt;h2&gt;结尾&lt;/h2&gt;



&lt;p&gt;反正折腾的挺开心挺有满足感的&lt;/p&gt;



&lt;p&gt;不过现在折腾起来比以前容易太多了所以只能折腾更复杂的结构才更有满足感&lt;/p&gt;



&lt;p&gt;高中的时候想搭博客光是部署个Wordpress加个内网穿透让我到处翻教程那个时候连nano咋保存都不会都得找教程走一步查一步属于是😅搞了几天才成功虽然爽不过也挺心累的&lt;/p&gt;



&lt;p&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>解决深链接直接访问时的问题并且增强可读性</title>
      <link>https://kokorotsuki.com/library/records/record-6392.html</link>
      <guid isPermaLink="false">rei:library:record-6392</guid>
      <pubDate>Wed, 23 Sep 2026 12:28:42 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>深链接访问文库时两侧的窗帘资产会被误加载从而遮挡页面 已修复此问题</description>
      <content:encoded>&lt;p&gt;深链接访问文库时两侧的窗帘资产会被误加载从而遮挡页面&lt;/p&gt;&lt;p&gt;字体色号加深同时统一阅读器字体以增强可读性&lt;/p&gt;&lt;p&gt;已修复此问题&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>本项目开始开发</title>
      <link>https://kokorotsuki.com/library/records/record-6390.html</link>
      <guid isPermaLink="false">rei:library:record-6390</guid>
      <pubDate>Tue, 22 Sep 2026 17:00:22 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>停止原网站本地服务器所有服务仅保留VPS的基础服务。 确定新网站网络拓扑结构，技术栈，与服务器文件目录结构。并且确定以静态为主的方向。 迁移原网站数据。 构思美学与叙事风格。 制作背景与装饰素材并构思排版。</description>
      <content:encoded>&lt;p&gt;停止原网站本地服务器所有服务仅保留VPS的基础服务。&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;br&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>增强视觉统一度</title>
      <link>https://kokorotsuki.com/library/records/record-6389.html</link>
      <guid isPermaLink="false">rei:library:record-6389</guid>
      <pubDate>Tue, 22 Sep 2026 16:44:48 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>删除翻页后顶部的主标题增强视觉统一度。</description>
      <content:encoded>&lt;p&gt;删除翻页后顶部的主标题增强视觉统一度。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>正式上线</title>
      <link>https://kokorotsuki.com/library/records/record-6371.html</link>
      <guid isPermaLink="false">rei:library:record-6371</guid>
      <pubDate>Mon, 21 Sep 2026 13:38:31 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>《Rei's Commissioned Notebook》正式作为主站运行。</description>
      <content:encoded>&lt;p&gt;Rei's Commissioned Notebook 正式作为主站运行。&lt;/p&gt;
&lt;p&gt;网站从 WordPress 结构转为HTML/CSS/JS/静态页面。&lt;/p&gt;&lt;p&gt;（并非全部静态，留言，友链申请与ai页面仍需要动态能力）&lt;/p&gt;
&lt;p&gt;同日完成 OpenClaw 接入。Artificial Mind 在 MASTER 身份验证后可通过 Bridge 与 OpenClaw Gateway 通信。&lt;/p&gt;
&lt;p&gt;PAGE 10 登录、Cookie、WebSocket 与 Agent 调用测试通过。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>AI功能与设定整理</title>
      <link>https://kokorotsuki.com/library/records/record-6372.html</link>
      <guid isPermaLink="false">rei:library:record-6372</guid>
      <pubDate>Mon, 21 Sep 2026 13:35:28 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>继续调整 Artificial Mind 与 REI 的身份设定。</description>
      <content:encoded>&lt;p&gt;继续调整 openclaw 与 REI 的身份设定。&lt;/p&gt;
&lt;p&gt;明确站内唯一实时对话窗口。&lt;/p&gt;
&lt;p&gt;同时整理《失落的手帐》前篇世界观与时间线。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>部署结构整理</title>
      <link>https://kokorotsuki.com/library/records/record-6373.html</link>
      <guid isPermaLink="false">rei:library:record-6373</guid>
      <pubDate>Mon, 21 Sep 2026 13:34:26 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>整理树莓派上的正式部署结构。</description>
      <content:encoded>&lt;p&gt;整理服务器上的正式部署结构。&lt;/p&gt;
&lt;p&gt;确认了当前运行入口，并将网站、Admin 与 OpenClaw 服务分开管理。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>页面编辑器重构处理竞态条件</title>
      <link>https://kokorotsuki.com/library/records/record-6374.html</link>
      <guid isPermaLink="false">rei:library:record-6374</guid>
      <pubDate>Mon, 21 Sep 2026 13:33:46 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>集中处理页面编辑器的状态同步与预览问题。</description>
      <content:encoded>&lt;p&gt;集中处理页面编辑器的状态不同步、刷新后才更新、装饰错位等问题。&lt;/p&gt;
&lt;p&gt;逐步统一桌面端、移动端与后台编辑器的编辑逻辑，减少重复 DOM 与重复状态。&lt;/p&gt;&lt;p&gt;解决了竞态条件产生的问题&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>页面编辑器升级</title>
      <link>https://kokorotsuki.com/library/records/record-6375.html</link>
      <guid isPermaLink="false">rei:library:record-6375</guid>
      <pubDate>Mon, 21 Sep 2026 13:32:26 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>页面编辑器升级为 Editor31。</description>
      <content:encoded>&lt;p&gt;&lt;span&gt;新增统一图层树，将文字、图片、装饰、容器与 CSS 视觉层纳入同一套编辑体系。&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>重构失落魔法</title>
      <link>https://kokorotsuki.com/library/records/record-6376.html</link>
      <guid isPermaLink="false">rei:library:record-6376</guid>
      <pubDate>Mon, 21 Sep 2026 13:32:02 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>重新整理部分独立功能页与 Notebook 页面结构。</description>
      <content:encoded>&lt;p&gt;改变失落魔法的定位改为小工具页面。&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>清理残留未被调用的代码与脚本</title>
      <link>https://kokorotsuki.com/library/records/record-6377.html</link>
      <guid isPermaLink="false">rei:library:record-6377</guid>
      <pubDate>Mon, 21 Sep 2026 13:30:51 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>完成 2026.09.20 正式版本整理。</description>
      <content:encoded>&lt;p&gt;完成整理。&lt;/p&gt;
&lt;p&gt;检查前台、后台、数据库、编辑器 与生成文件，清理部分旧补丁和残留。&lt;/p&gt;
&lt;p&gt;Enter、404、502 页面与自定义光标也完成独立构建。&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>建立稳定基线与修复</title>
      <link>https://kokorotsuki.com/library/records/record-6378.html</link>
      <guid isPermaLink="false">rei:library:record-6378</guid>
      <pubDate>Mon, 21 Sep 2026 13:29:34 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>建立 Stable Baseline、Cold Backup，并修复 Editor Preview。</description>
      <content:encoded>&lt;p&gt;建立当前稳定基线，实现冷备份。&lt;/p&gt;
&lt;p&gt;同时更新 REI-SYSTEM.md，作为当前维护说明。&lt;/p&gt;
&lt;p&gt;修复编辑器错误加载 Enter 页的问题&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>零之卷重构</title>
      <link>https://kokorotsuki.com/library/records/record-6379.html</link>
      <guid isPermaLink="false">rei:library:record-6379</guid>
      <pubDate>Mon, 21 Sep 2026 13:27:24 +0000</pubDate>
      <category>零的维护日记</category>
      <dc:creator>MASTER</dc:creator>
      <description>重构 PAGE 03「零之卷」。</description>
      <content:encoded>&lt;p&gt;重构 PAGE 03「零之卷」。&lt;/p&gt;
&lt;p&gt;新增“零之設定”、“失落的手帳”和“零的維護日記”三个内部入口&lt;/p&gt;
&lt;p&gt;&lt;br&gt;&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>記一次近期網站遭遇 ClickFix 投毒事件的排查（2026/08/07～2026/08/08）</title>
      <link>https://kokorotsuki.com/library/records/record-606.html</link>
      <guid isPermaLink="false">rei:library:record-606</guid>
      <pubDate>Sat, 08 Aug 2026 12:54:42 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>最近本站出现了一次比较严重的异常跳转事件。未登录状态下访问首页时，页面会在启动动画之后跳转到一个伪装成 Cloudflare 验证的页面，并提示访问者打开终端、复制命令、执行所谓的验证操作。 我都懵了，我并没有主动接入过 Cloudflare。经过排查，…</description>
      <content:encoded>&lt;p&gt;最近本站出现了一次比较严重的异常跳转事件。未登录状态下访问首页时，页面会在启动动画之后跳转到一个伪装成 Cloudflare 验证的页面，并提示访问者打开终端、复制命令、执行所谓的验证操作。&lt;/p&gt;



&lt;p&gt;我都懵了，我并没有主动接入过 Cloudflare。经过排查，最终确认这是一次 &lt;strong&gt;WordPress 后台被非法登录后，通过恶意插件向前台注入混淆 JS 脚本的事件&lt;/strong&gt;。&lt;/p&gt;



&lt;p&gt;这篇文章记录一下我这次从发现异常、使用浏览器开发者工具定位异常请求、反查服务器文件、追查日志，到清理和加固的过程。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;一开始发现的问题&lt;/h2&gt;



&lt;p&gt;最开始发现异常时，网站并不是说打不开。首页还能加载，原本的启动动画也会正常出现。但动画结束后，页面会突然跳转到一个看起来很像 Cloudflare 验证的界面。但是我并没有接入过cloudflare啊。&lt;/p&gt;



&lt;p&gt;然后这个页面会诱导用户进行类似这样的操作：&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-001-6a2a25ae3a.webp" loading="lazy"&gt;&lt;figcaption&gt;伪造的验证页面&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;后来才知道这种叫做clickfix攻击，诱导用户主动执行命令。只要访客照做，就可能被植入恶意程序。&lt;/p&gt;



&lt;p&gt;比较奇怪的是，我登录 WordPress 后台后，再访问网站，页面看起来又是正常的。也就是说，它对不同访问状态有不同表现：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;未登录访客：看到伪装 Cloudflare 验证页
已登录管理员：看到正常网站&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;所以应该不是浏览器缓存，是服务器端根据访客状态输出了不同内容。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;先排除 DNS 和 Cloudflare&lt;/h2&gt;



&lt;p&gt;因为页面伪装成 Cloudflare，所以第一反应是检查域名解析和响应头。&lt;/p&gt;



&lt;p&gt;我先确认 kokorotsuki.com 是否仍然指向自己的 VPS：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;dig +short kokorotsuki.com&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;结果显示域名仍然解析到我的 VPS IP，并没有解析到 Cloudflare。&lt;/p&gt;



&lt;p&gt;接着查看 HTTP 响应头：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;curl -I https://kokorotsuki.com&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;响应头显示的是 Nginx 和 WordPress，并没有 Cloudflare 相关 header。&lt;/p&gt;



&lt;p&gt;因此可以先排除：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;DNS 被改
域名商解析异常
真正的 Cloudflare 验证页面&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;也就是说，这个所谓 Cloudflare 页面就不是 Cloudflare 发出来的，而是有人在我的网站里伪装了一个假的 Cloudflare 页面。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;在浏览器开发者模式中发现异常脚本请求&lt;/h2&gt;



&lt;p&gt;为了确认这个伪 Cloudflare 页面到底是从哪里加载出来的，我打开了浏览器开发者工具，进入 Network 面板，然后重新访问了首页。&lt;/p&gt;



&lt;p&gt;在网络请求里，我发现页面加载过程中出现了一个非常可疑的外部脚本请求：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;https:&amp;#47;&amp;#47;id-verif-code.info/api.php?s=8402fb1338daab6a166e91aa8c92a20798acfa98fb75c5a2&amp;amp;_v=29769525&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这个请求的特征很明显：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;请求类型是 JavaScript
来源不是本站域名
地址包含 id-verif-code.info
路径是 api.php
参数带有一串可疑 hash
响应内容会被前台页面直接执行&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这一步基本可以确认，伪 Cloudflare 页面不是浏览器自己生成的，也不是正常的 Cloudflare 验证，而是本站页面中被插入了外部恶意脚本。&lt;/p&gt;



&lt;p&gt;同时我还在前台源码中看到了经过混淆处理的 JavaScript。里面出现了这些特征：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;atob(...)
Uint8Array
TextDecoder
new Function(...)
id-verif-code.info/api.php?s=...&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这些特征说明，页面中存在一个混淆 JS loader。它会先解码隐藏的代码，再通过 &lt;code&gt;new Function()&lt;/code&gt; 动态执行，最后加载远程恶意脚本。&lt;/p&gt;



&lt;p&gt;之后为了进一步确认这不是单纯的浏览器扩展、本地缓存或代理造成的现象，我又在服务器上使用 &lt;code&gt;curl&lt;/code&gt; 模拟普通访客访问首页，并把返回的 HTML 保存下来检查。&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
curl -s \
-A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36' \
https://kokorotsuki.com/ \
-o /tmp/koko-public.html&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;然后搜索页面中的可疑脚本特征：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;grep -niE 'atob\(|new Function|TextDecoder|id-verif|api\.php\?s=|createElement\(.*script|appendChild\(.*script|eval\(' /tmp/koko-public.html&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;结果在服务器返回的 HTML 中同样发现了这些恶意 JS 特征。&lt;/p&gt;



&lt;p&gt;因此这一步可以确认这个&lt;strong&gt;异常脚本不是浏览器插件注入的，而是访问本站时，服务器返回的页面内容中就已经包含了恶意 JavaScript脚本。&lt;/strong&gt;&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;从前台恶意代码反查服务器文件&lt;/h2&gt;



&lt;p&gt;既然 HTML 里已经有恶意代码，就可以用其中一段特征字符串在服务器里搜索。&lt;/p&gt;



&lt;p&gt;我从混淆脚本中取了一段字符串，然后在 WordPress 目录里 grep：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
needle='VBoJEh8IFRMSVFUHFRpU'
sudo grep -RIn --binary-files=without-match "$needle" . 2&amp;gt;/dev/null&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;同时也查了一遍数据库，确认它是不是藏在文章内容、option 或其他数据表里：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp db search "$needle" --all-tables --allow-root&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;最后 grep 结果直接指向了一个插件文件：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp-content/plugins/a11y-image-attributes-fix/a11y-image-attributes-fix.php:29&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这个插件名字看起来像是“图片无障碍属性修复”之类的插件，但实际上它就是前台恶意 JS 注入的直接来源。&lt;/p&gt;



&lt;p&gt;也就是说，主题 JS 文件和 WordPress core 一个没有被篡改，是攻击者上传了一个伪装成普通插件的恶意插件。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;隔离恶意插件&lt;/h2&gt;



&lt;p&gt;确认源头后直接在 SSH 里把它物理移走，并保留证据。&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
mkdir -p /root/kokoro-incident-20260808
cp -a wp-content/plugins/a11y-image-attributes-fix \
/root/kokoro-incident-20260808/a11y-image-attributes-fix.evidence
wp --skip-plugins --skip-themes plugin deactivate a11y-image-attributes-fix --allow-root || true
mv wp-content/plugins/a11y-image-attributes-fix \
/root/kokoro-incident-20260808/a11y-image-attributes-fix.removed&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;移走后我重新抓取首页源码然后再搜索恶意特征&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;curl -s \
-H 'Cache-Control: no-cache' \
-A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36' \
https://kokorotsuki.com/?clean-test=$(date +%s) \
-o /tmp/koko-after-clean.html
grep -niE 'atob\(|new Function|TextDecoder|id-verif|api\.php\?s=|id-verif-code' \
/tmp/koko-after-clean.html&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这次没有再出现恶意特征了，说明前台注入已经停止了。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;继续查有没有其他落地点&lt;/h2&gt;



&lt;p&gt;虽然前台 JS 的直接来源找到了，但我不好说只有这一个恶意插件。因为攻击者既然能上传插件，说不定就还上传了其他东西。&lt;/p&gt;



&lt;p&gt;然后我就开始按时间查最近新增和修改的 PHP 文件：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;find wp-content -type f \( -name '*.php' -o -name '*.js' \) \
-newermt '2026-08-06 00:00:00' \
-printf '%TY-%Tm-%Td %TH:%TM:%TS %p\n' | sort&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;结果又发现了几个同一天出现的可疑项目：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp-content/plugins/wp-security-helper/
wp-content/themes/category-template-1786089947/
wp-content/updraft/top-1786089961.php&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;其中：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp-security-helper
看起来像安全插件，但去网上一搜发现就是木马。
category-template-1786089947
看起来像一个普通主题目录，但里面有可疑 PHP 写文件逻辑。
top-1786089961.php
位于 updraft 目录中，是通过文件管理器创建的 PHP 文件。&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;于是我继续把这些项目也隔离：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
INC=/root/kokoro-incident-20260808
mkdir -p "$INC"
wp --skip-plugins --skip-themes plugin deactivate wp-security-helper a11y-image-attributes-fix --allow-root || true
for p in \
  wp-content/plugins/wp-security-helper \
  wp-content/themes/category-template-1786089947 \
  wp-content/updraft/top-1786089961.php
do
  if &amp;#91; -e "$p" ]; then
    cp -a "$p" "$INC/$(basename "$p").evidence"
    mv "$p" "$INC/$(basename "$p").removed"
    echo "moved: $p"
  fi
done&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;到这里基本确认这不是单点注入了。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;从 Nginx 日志还原攻击时间线&lt;/h2&gt;



&lt;p&gt;清理文件只是第一步，我还需要知道攻击者是怎么进来的。&lt;/p&gt;



&lt;p&gt;于是我开始查看 Nginx access log，重点搜索：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp-login.php
wp-admin
plugin-install.php
update.php?action=upload-plugin
wp-file-manager
admin-ajax.php
updraft&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;日志里出现了非常关键的记录。攻击者并不是从前台页面的漏洞啥的打穿网站的，而是居然成功登录了 WordPress 后台！！！！！&lt;/p&gt;



&lt;p&gt;主要时间节点如下。时间以服务器日志为准。&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;
2026-08-07 01:05 左右
IP 157.22.100.146 访问 wp-login.php，并 POST 登录成功。
随后进入 wp-admin、plugin-install.php、update.php?action=upload-plugin。
之后上传并启用了文件管理器类插件。
2026-08-07 01:06 左右
同一攻击链通过文件管理器在 wp-content/updraft/ 创建 top-1786089961.php，并访问该文件测试。
2026-08-07 01:05 至 01:06 左右
服务器中出现可疑主题 wp-content/themes/category-template-1786089947。
该主题中包含具有写文件行为的 PHP 文件，疑似备用落地点。
2026-08-07 14:02 至 14:03 左右
IP 213.232.122.28 成功登录 WordPress 后台，并上传或激活 wp-security-helper 插件。
2026-08-07 14:12 至 14:13 左右
IP 185.61.223.245 成功登录 WordPress 后台，并上传 a11y-image-attributes-fix 插件。
该插件负责向前台页面注入混淆 JS，并加载 id-verif-code.info 的远程脚本。
&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这几个 IP 在本次事件里的分工大概是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;157.22.100.146
第一波后台操作，上传文件管理器，并通过文件管理器写入 updraft PHP 后门。
213.232.122.28
第二波后台操作，上传或激活 wp-security-helper，疑似用于隐藏痕迹或维持权限。
185.61.223.245
第三波后台操作，上传 a11y-image-attributes-fix，最终造成前台 JS 注入和假 Cloudflare 页面。&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;虽然查了一下是机房IP。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;检查是不是 WordPress 核心或者常用插件被改了&lt;/h2&gt;



&lt;p&gt;为了避免误判，我继续检查 WordPress 核心文件完整性。&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp core verify-checksums --allow-root&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;结果显示 WordPress 核心文件校验通过。&lt;/p&gt;



&lt;p&gt;然后检查 Jetpack 和 WP Statistics：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;wp plugin verify-checksums jetpack --allow-root
wp plugin verify-checksums wp-statistics --allow-root&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这两个插件也校验通过。&lt;/p&gt;



&lt;p&gt;所以这次事件真正的前台污染源应该还是是后来上传的恶意插件。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;排查其他可能入口&lt;/h2&gt;



&lt;p&gt;这次我也检查了几个可能方向。&lt;/p&gt;



&lt;p&gt;首先是 WordPress 忘记密码接口。日志8月4号的时候里面确实有一些访问 lostpassword 的请求：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;/wp-login.php?action=lostpassword&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;但我没有看到 resetpass、rp_key 之类完成密码重置的明确证据。因此目前判断 forgotten password 不是主要入口。&lt;/p&gt;



&lt;p&gt;然后是 SSH 登录。服务器日志里有一大堆 SSH 爆破尝试虽然都失败了，但成功登录记录对应的都是我自己的登录行为，所以外人并没有成功登录SSH。&lt;/p&gt;



&lt;p&gt;再看 DNS 和 drive 子域，也没有发现它们直接参与这次攻击的证据。攻击链集中在主站 WordPress：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;/wp-login.php
/wp-admin/
/wp-admin/update.php?action=upload-plugin
/wp-admin/admin.php?page=wp_file_manager
/wp-content/updraft/top-1786089961.php&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;所以这次事件最合理的结论是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;攻击者拿到了 WordPress 后台凭据或会话，然后通过正常后台入口上传恶意组件。&lt;/code&gt;&lt;/pre&gt;



&lt;hr&gt;



&lt;h2&gt;为什么攻击者会知道我的网站和后台？&lt;/h2&gt;



&lt;p&gt;这次还有一个很关键的背景，在7月30号我还在学校，学校网络安全系统曾出现疑似 AMOS / Atomic macOS Stealer 相关告警。学校的网管还发邮件我提示我电脑被攻击了。同时 8月4号Gmail 也出现过异常尝试登录的警告。&lt;/p&gt;



&lt;p&gt;AMOS 这类 macOS 信息窃取器可能会窃取：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;浏览器保存密码
浏览器 Cookie
登录会话
Gmail 账号信息
密码管理器或钥匙串中的数据
浏览器历史记录&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;我在浏览器里保存过 WordPress 登录信息，攻击者拿到的应该是类似这样的组合：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;https:&amp;#47;&amp;#47;kokorotsuki.com/wp-login.php
用户名
密码
Cookie
访问历史&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;所以泄露数据本身就可能包含网站地址。&lt;/p&gt;



&lt;p&gt;结合 Gmail 异常登录、AMOS 告警和 WordPress 后台成功登录日志，我认为这次更像是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;账号凭据先泄露
↓
攻击者拿到 WordPress 后台访问能力
↓
再对网站进行投毒&lt;/code&gt;&lt;/pre&gt;



&lt;hr&gt;



&lt;h2&gt;撤销长期凭据和旧会话&lt;/h2&gt;



&lt;p&gt;确认后台被登录后，开始撤销所有长期凭据。&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
wp user application-password delete 1 --all --allow-root
wp user session destroy 1 --all --allow-root
wp config shuffle-salts --allow-root&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这里重点是 Application Password。因为它和普通 WordPress 密码不同，有时候即使你改了后台密码，它仍然可能保持有效。因此必须单独删除。&lt;/p&gt;



&lt;p&gt;同时也重置了 WordPress salts，用来强制旧 Cookie 失效。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;锁 WordPress 文件权限&lt;/h2&gt;



&lt;p&gt;这次事件能落地成功，还有一个重要原因：当时 plugins、themes、updraft 等目录对 &lt;code&gt;www-data&lt;/code&gt; 来说过于宽松。&lt;/p&gt;



&lt;p&gt;在 WordPress 里，Web 服务用户通常是 &lt;code&gt;www-data&lt;/code&gt;。如果它可以写 plugins 和 themes，那么一旦后台被拿到，攻击者就能很方便地上传插件或写入后门。&lt;/p&gt;



&lt;p&gt;我把关键目录改成 root 拥有，只保留 uploads 可写：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
sudo chown root:www-data .
sudo chmod 755 .
sudo chown root:www-data wp-config.php
sudo chmod 640 wp-config.php
sudo chown -R root:www-data wp-admin wp-includes wp-content/plugins wp-content/themes
sudo find wp-admin wp-includes wp-content/plugins wp-content/themes -type d -exec chmod 755 {} \;
sudo find wp-admin wp-includes wp-content/plugins wp-content/themes -type f -exec chmod 644 {} \;
sudo chown root:www-data wp-content
sudo chmod 755 wp-content
sudo chown -R root:www-data wp-content/updraft wp-content/upgrade
sudo find wp-content/updraft wp-content/upgrade -type d -exec chmod 755 {} \;
sudo find wp-content/updraft wp-content/upgrade -type f -exec chmod 644 {} \;
sudo chown -R www-data:www-data wp-content/uploads
sudo find wp-content/uploads -type d -exec chmod 755 {} \;
sudo find wp-content/uploads -type f -exec chmod 644 {} \;&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;修正后检查结果应该是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;WordPress 根目录：不可被 www-data 写入
wp-admin：不可被 www-data 写入
wp-includes：不可被 www-data 写入
plugins：不可被 www-data 写入
themes：不可被 www-data 写入
updraft：不可被 www-data 写入
uploads：可被 www-data 写入
wp-config.php：root:www-data 640&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这一步直接禁止用WordPress 后台上传插件了。以后需要更新插件时可以通过 SSH 临时更新，更新完了再锁回去。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;禁止上传目录执行 PHP&lt;/h2&gt;



&lt;p&gt;只锁权限还不够，因为 WordPress 的 uploads 本来就必须可写。为了防止以后有 PHP 文件被写进 uploads、updraft、upgrade、cache 这类目录，就在 Nginx 中加入规则：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;location ^~ /wp-content/updraft/ {
    deny all;
}
location ^~ /wp-content/upgrade/ {
    deny all;
}
location ~* ^/wp-content/(uploads|updraft|upgrade|cache)/.*\.(php|phtml|phar|php&amp;#91;0-9]?)$ {
    deny all;
}&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;然后测试：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;sudo nginx -t
sudo systemctl reload nginx
curl -I https://kokorotsuki.com/wp-content/uploads/wp-personal-data-exports/index.php
curl -I https://kokorotsuki.com/wp-content/updraft/
curl -I https://kokorotsuki.com/wp-content/upgrade/&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;理想状态是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;uploads 中的 PHP：403
updraft：403
upgrade：403&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;这样即使以后某个文件被写进去，也不能通过浏览器直接执行。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;最终确认前台已经恢复&lt;/h2&gt;



&lt;p&gt;最后再次用未登录 UA 抓取首页：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;cd /var/www/html/kokorotsuki.com/public_html
curl -s \
-H 'Cache-Control: no-cache' \
-A 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/150.0.0.0 Safari/537.36' \
"https://kokorotsuki.com/?final-check=$(date +%s)" \
-o /tmp/koko-final.html
grep -niE 'id-verif-code|api\.php\?s=|new Function|TextDecoder|atob\(' /tmp/koko-final.html&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;清理后没有再出现恶意注入特征。&lt;/p&gt;



&lt;p&gt;然后前台假 Cloudflare 页面也消失了。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;本次事件的结论&lt;/h2&gt;



&lt;p&gt;这次事件可以定性为：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;WordPress 后台凭据或会话泄露后，攻击者登录后台，并通过恶意插件进行前台 JavaScript 注入。&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;完整攻击链大概是：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;Mac / Gmail / 浏览器凭据可能先泄露
↓
攻击者成功登录 WordPress 后台
↓
上传文件管理器
↓
写入 updraft PHP 后门
↓
上传可疑主题作为备用落地点
↓
上传 wp-security-helper 伪装安全插件
↓
上传 a11y-image-attributes-fix 恶意插件
↓
前台注入混淆 JavaScript
↓
访客看到伪装 Cloudflare 验证页面&lt;/code&gt;&lt;/pre&gt;



&lt;hr&gt;



&lt;h2&gt;后续已经做和还要做的事情&lt;/h2&gt;



&lt;p&gt;目前已经完成：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;移除 a11y-image-attributes-fix 恶意插件
隔离 wp-security-helper 可疑插件
隔离 wp-file-manager 文件管理器残留
隔离 category-template-1786089947 可疑主题
隔离 updraft 目录中的 PHP 后门
校验 WordPress core
校验 Jetpack / WP Statistics
更新插件
撤销 Application Password
踢出旧登录会话
重置 WordPress salts
修正 wp-config.php 权限
锁定 wp-admin / wp-includes / plugins / themes / updraft
禁止 uploads / updraft / upgrade / cache 执行 PHP
启用 WordPress 2FA&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;接下来还会继续处理：&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;处理 Mac 的 AMOS 风险
重置所有关键账号密码
SSH 改为 key-only 登录
继续监控 Nginx 和 WordPress 日志&lt;/code&gt;&lt;/pre&gt;



&lt;hr&gt;



&lt;h2&gt;教训与感想&lt;/h2&gt;



&lt;p&gt;现在才知道个人网站就算是访问量不大也会被被攻击。这自动化攻击只要后台账号密码泄露，博客也可能很快被拿来挂马。&lt;/p&gt;



&lt;p&gt;这次最危险的地方是，这个伪装的页面质感也太像了吧，我一度以为是我装的什么插件自动配置了cloudflare。而且网站在登录状态下看起来一切正常，未登录访客才会看到伪装成 Cloudflare 的页面。碰巧最近正好回国，网络状态发生改变，如果没有开浏览器开发者工具看请求，还真以为只是缓存或网络问题呢。&lt;/p&gt;



&lt;p&gt;而且这次严重程度也太大了吧，源头上我电脑感染了amos窃密木马导致保存的所有密码被泄露了，然后wordpress后台权限居然完全失控了，还被插入了一堆后门，最后还被挂马变成钓鱼网站我真的服了。&lt;/p&gt;



&lt;p&gt;真正的血泪教训是本地设备的网站安全啊😭。居然Mac被木马套走浏览器密码之后，会有人拿我泄漏的密码撞库，明明只是个wordpress站点而已，有啥价值啊服了。这就是社会工程学吗太恐怖了我mac有点不敢用了操。&lt;/p&gt;



&lt;hr&gt;



&lt;h2&gt;&lt;strong&gt;&lt;em&gt;给访问者的提醒&lt;/em&gt;&lt;/strong&gt;&lt;/h2&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;如果访问本站时看到任何要求你打开终端、复制命令、执行所谓验证、安装不明软件的页面，请一定不要执行。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;&lt;strong&gt;&lt;em&gt;本站绝对不会要求访问者通过终端命令完成验证，也不会要求安装额外程序才能浏览页面。&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;2026/08/08&lt;/p&gt;



&lt;p&gt;@Kokorotsuki_上&lt;/p&gt;</content:encoded>
    </item>
    <item>
      <title>QS30-1輝光管時鐘製作記錄</title>
      <link>https://kokorotsuki.com/library/records/record-29.html</link>
      <guid isPermaLink="false">rei:library:record-29</guid>
      <pubDate>Tue, 30 Jun 2026 20:36:09 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>前段時間推完了命運石之門 裡面的世界線變動率探測儀讓我有了做一個輝光管時鐘的想法 於是查資料 本來想採用蘇聯產IN-8的側顯管 但是側顯價格實在是。。 因為預算有限 只能退而求其次選擇頂顯管 本次採用的是QS30-1 是南昌電子管廠於上世紀80年代生產…</description>
      <content:encoded>&lt;hr&gt;



&lt;p&gt;前段時間推完了命運石之門&lt;/p&gt;



&lt;p&gt;裡面的世界線變動率探測儀讓我有了做一個輝光管時鐘的想法&lt;/p&gt;



&lt;p&gt;於是查資料&lt;/p&gt;



&lt;p&gt;本來想採用蘇聯產IN-8的側顯管&lt;/p&gt;



&lt;p&gt;但是側顯價格實在是。。&lt;/p&gt;



&lt;p&gt;因為預算有限&lt;/p&gt;



&lt;p&gt;只能退而求其次選擇頂顯管&lt;/p&gt;



&lt;p&gt;本次採用的是QS30-1&lt;/p&gt;



&lt;p&gt;是南昌電子管廠於上世紀80年代生產&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-008-3d5afde8c7.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;QS30-1&lt;/em&gt;&lt;/strong&gt; &lt;a href="https://www.tube-tester.com/sites/nixie/data/B13B-F/QS30-1_nanch-SH01/QS30-1_nanch-SH03.htm" target="_blank" rel="noopener noreferrer"&gt;圖片來源&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-009-a064978c97.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;QS30-1&lt;/em&gt;包裝盒&lt;/strong&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;&lt;strong&gt;下圖是&lt;em&gt;Q30-1&lt;/em&gt;的引腳參數和限流電阻參數&lt;/strong&gt;&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-010-c3b0abaa30.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-011-6848cc18c9.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;一共使用了6枚分別用於顯示時分秒&lt;/p&gt;



&lt;p&gt;本次採用的控制方案是使用Arduino單片機當然是那個小小的nano版本 也可以用其他的比如ESP32或者51&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-012-6492ca0898.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;Arduino nano&lt;/em&gt;&lt;/strong&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;而驅動輝光管本次採用了6個俄羅斯產輝光管專用BCD譯碼芯片K155ID1分別驅動6個輝光管&lt;/p&gt;



&lt;p&gt;當然也有很多其他方法驅動、比如使用Vcb大於170V的三極管來分別連結每個輝光管的陰極來驅動、但是這種控制方式要用到10*6也就是60個三極管、很枯燥無味了（下面驅動INS-1時就是這種） &lt;/p&gt;



&lt;p&gt;或者還有一種是共陰極控制陽極、就是陰極並聯分別給時分秒的信號、然後逐個高速點亮、因為視覺暫留的原因就像全亮了。這種方法好就好在只用一個譯碼管或者少數三極管就行 、壞就壞在我不想用這種（笑&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-013-eccfed859f.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;K155ID1&lt;/em&gt;引腳定義&lt;/strong&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;3、4、6、7引腳輸入BCD碼K155ID1把BCD碼轉換成10進制然後輸出信號給陰極點亮對應數字 Vcc需要5v供電GND的話因為最後所有的都要共地我直接跟74HC595的GND連在一起了&lt;/p&gt;



&lt;p&gt;說到74HC595、這個也是必不可少的、因為單片機引腳不夠、一個K155ID1就需要4路來輸入一共6個也就是24路（ps：如果採用三極管方案就是60路了）、但是Arduino的數字引腳只有12個D2-D13、所以就要用74HC595來擴展引腳&lt;/p&gt;



&lt;p&gt;本次使用的是3片74HC595&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-014-cb65567df5.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;74HC595&lt;/em&gt;引腳定義&lt;/strong&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;輸出口Q0-Q7共八位可輸出兩組BCD碼也就是可以驅動兩個K155ID1、但是時分秒數據在這裡一共是6組BCD碼24位輸出、所以就使用3塊74HC595級聯來實現&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-015-e7eee76e3b.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;級聯方式是前一個芯片的9號Q7S引腳與後一個14號DS引腳連接、11、12號SHCP、STCP引腳並接、以此類推&lt;/p&gt;



&lt;p&gt;OE是輸出使能引腳、用於判斷是否輸出鎖存器數據到輸出引腳、低電平時輸出所以與GND連接。MR是控制移位寄存器重置的引腳、低電平時重置、使用要連接到Vcc上讓寄存器不被重置&lt;/p&gt;



&lt;p&gt;最後DS、SHCP、STCP引腳連接單片機的數字腳、讓BCD碼串行輸入然後並行輸出給譯碼器&lt;/p&gt;



&lt;p&gt;以上是輝光管驅動的邏輯部分&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;而時分秒之間的冒號「：」採用的是前蘇聯產的&lt;strong&gt;&lt;em&gt;INS-1&lt;/em&gt;&lt;/strong&gt;氖泡&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-016-d71f694888.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;&lt;em&gt;INS-1&lt;/em&gt;&lt;/strong&gt;&lt;a href="https://tubehobby.com/show_det.php?det=9" target="_blank" rel="noopener noreferrer"&gt;圖片來源&lt;/a&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;下圖是INS-1的數據&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-017-00a7cd4e64.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;工作電壓65-90V 起輝電壓55V 工作電流0.5mA&lt;/p&gt;



&lt;p&gt;本次共使用了4個氖泡、每兩個組成一個冒號&lt;/p&gt;



&lt;p&gt;而時鐘的冒號通常會閃爍、讓其閃爍也有很多方式、最簡單的比如直接使用單片機連接高壓三極管的基極、控制導通截止來控制氖泡&lt;/p&gt;



&lt;p&gt;但是這顯得電路板上太單調了&lt;/p&gt;



&lt;p&gt;索然無味！&lt;/p&gt;



&lt;p&gt;所以我選擇使用NE555來產生一個1Hz的方波信號給三極管基極的方式繞過單片機來讓氖泡每秒閃一次&lt;/p&gt;



&lt;p&gt;首先是如何使用NE555產生1Hz的方波信號、這時候需要使用NE555的非穩態工作模式&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-018-8c49fe4ca8.webp" loading="lazy"&gt;&lt;figcaption&gt;非穩態工作電路&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;最後3號引腳輸出的頻率由R1、R2、C共同決定公式如下&lt;/p&gt;



&lt;p&gt;f=1.44/（R1+2R2）*C&lt;/p&gt;



&lt;p&gt;因為我有只有22uf的電解電容、最後選擇了這個組合&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-019-732288191c.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;而高壓部分使用的是4路2N5551三極管基級串上4.7K的基極電阻集電極接負載射電級接地這樣一個簡單的驅動電路&lt;/p&gt;



&lt;p&gt;氖泡的工作電壓為65-90v、工作電流5mA、所以限流電阻在（170-65）/0.005到（170-90）/0.005之間、也就是21k到160k之間所以我就隨便甩了個100k上去&lt;/p&gt;



&lt;p&gt;但是！恐怖的是、2N5551的Vcb只有150V、170V超過了耐壓值、呃不是我不用高耐壓值的三極管、我用了2SC4382、這個Vcb=200v但是不知道為什麼射級集電極之間沒有被完全截止、呃、就只能用2n5551了&lt;/p&gt;



&lt;p&gt;反正最後也沒炸&lt;/p&gt;



&lt;p&gt;贏！&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-020-17579c3d0f.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;以上是氖管驅動部分&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;接下來是Arduino需要時鐘&lt;/p&gt;



&lt;p&gt;這次使用的是DS1302 RTC加上32768晶振、再加上3v鈕扣電池讓DS1302在沒電的情況下走時&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-021-6db49f1809.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;連上就是了。&lt;/p&gt;



&lt;p&gt;至於170v和5v電源&lt;/p&gt;



&lt;p&gt;嗯 用的是18650電池並聯加上穩壓模塊輸出5v再用升壓模塊升壓到170v&lt;/p&gt;



&lt;p&gt;雖然復刻boost升壓電路不是很難 &lt;/p&gt;



&lt;p&gt;但是能不能穩定運行我真是沒信心 &lt;/p&gt;



&lt;p&gt;我可不想因為破電源炸板子&lt;/p&gt;



&lt;p&gt;最後附上總覽原理圖（有些地方有錯誤）&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-022-d34bad2cf5.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;hr&gt;



&lt;p&gt;然後就是考慮pcb佈局和飛線了&lt;/p&gt;



&lt;p&gt;為了板子整潔點還用排針和杜邦線做了個模塊化設計（笑&lt;/p&gt;



&lt;p&gt;用了一塊10*22cm的萬能板（質量差的要死老是掉點差點把我整破防）&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-023-bc4b4ecfce.webp" loading="lazy"&gt;&lt;figcaption&gt;&lt;strong&gt;佈局&lt;/strong&gt;&lt;/figcaption&gt;&lt;/figure&gt;



&lt;p&gt;飛線邏輯部分用的awg30的線、電源部分就用awg26的線（剛開始沒發現555部分有個地方短路了、通電測試的時候直接把線干冒煙了吸了口大的）&lt;/p&gt;



&lt;p&gt;總體來說就是大概飛了6個小時線&lt;/p&gt;



&lt;p&gt;然後&lt;/p&gt;



&lt;figure&gt;
&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-024-e78d224655.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-025-08f22af9f9.webp" loading="lazy"&gt;&lt;/figure&gt;
&lt;/figure&gt;



&lt;p&gt;發現鎖存器到解碼之間順序反了。。。&lt;/p&gt;



&lt;p&gt;但是問題&lt;s&gt;不&lt;/s&gt;大&lt;/p&gt;



&lt;p&gt;代碼上&lt;s&gt;chatgpt&lt;/s&gt;可以解決&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;程序部分基本都拜託Chat GPT了&lt;/p&gt;



&lt;p&gt;ai時代就是好啊&lt;/p&gt;



&lt;p&gt;就是剛開始忘記我把時鐘引腳接到D多少了還好只有3個組合方式不多&lt;/p&gt;



&lt;p&gt;附上代碼&lt;/p&gt;



&lt;pre&gt;&lt;code&gt;#include &amp;lt;Ds1302.h&gt;
// === DS1302 引脚定义 ===
const int CE_PIN   = 6;
const int IO_PIN   = 7;
const int SCLK_PIN = 5;
Ds1302 rtc(CE_PIN, IO_PIN, SCLK_PIN);
// === 74HC595 引脚定义 ===
const int DATA_PIN  = 2;
const int LATCH_PIN = 3;
const int CLOCK_PIN = 4;
byte nixieData&amp;#91;3]; // 三片595 = 24位 = 六个辉光管
// === 更新显示 ===
void updateDisplay() {
  digitalWrite(LATCH_PIN, LOW);
  for (int i = 2; i &gt;= 0; i--) {
    shiftOut(DATA_PIN, CLOCK_PIN, MSBFIRST, nixieData&amp;#91;i]);
  }
  digitalWrite(LATCH_PIN, HIGH);
}
// === 设置单个辉光管数字 ===
void setDigit(int tubeIndex, int value) {
  value &amp;amp;= 0x0F;
  int bitPos = tubeIndex * 4;
  int byteIndex = bitPos / 8;
  int bitOffset = bitPos % 8;
  nixieData&amp;#91;byteIndex] &amp;amp;= ~(0x0F &amp;lt;&amp;lt; bitOffset);
  nixieData&amp;#91;byteIndex] |=  (value &amp;lt;&amp;lt; bitOffset);
  if (bitOffset &gt; 4) {
    int remain = 8 - bitOffset;
    int nextBits = 4 - remain;
    nixieData&amp;#91;byteIndex + 1] &amp;amp;= ~( (1 &amp;lt;&amp;lt; nextBits) - 1 );
    nixieData&amp;#91;byteIndex + 1] |=  (value &gt;&gt; remain);
  }
}
// === 动画工具函数 ===
static void chaoticBurst(unsigned long duration_ms, uint8_t minDelayMs = 15, uint8_t maxDelayMs = 35) {
  unsigned long t0 = millis();
  while (millis() - t0 &amp;lt; duration_ms) {
    for (int i = 0; i &amp;lt; 6; i++) setDigit(i, random(10));
    updateDisplay();
    delay(random(minDelayMs, maxDelayMs));
  }
}
static void sweepOnce(bool reverse = false, uint8_t stepDelayMs = 40) {
  int start = reverse ? 5 : 0;
  int end   = reverse ? -1 : 6;
  int step  = reverse ? -1 : 1;
  for (int i = 0; i &amp;lt; 6; i++) setDigit(i, random(10));
  for (int idx = start; idx != end; idx += step) {
    for (int k = 0; k &amp;lt; 3; k++) {
      for (int i = 0; i &amp;lt; 6; i++) {
        if (i == idx) setDigit(i, random(10));
        else if (random(100) &amp;lt; 20) setDigit(i, random(10));
      }
      updateDisplay();
      delay(stepDelayMs);
    }
  }
}
// === 开机动画（乱序+扫管+星闪）===
void startupAnimation() {
  chaoticBurst(800, 18, 30);
  sweepOnce(false, 35);
  sweepOnce(true,  35);
  chaoticBurst(900, 12, 24);
  for (int blink = 0; blink &amp;lt; 3; blink++) {
    int hits = 1 + random(2);
    for (int h = 0; h &amp;lt; hits; h++) {
      int i = random(6);
      setDigit(i, random(10));
    }
    updateDisplay();
    delay(80);
  }
  for (int i = 0; i &amp;lt; 6; i++) setDigit(i, 0);
  updateDisplay();
}
// === 整点报时：扫管 + 高亮新小时 + 乱序收尾 ===
void hourlyChaos() {
  Ds1302::DateTime now;
  rtc.getDateTime(&amp;amp;now);
  int hour   = now.hour;
  int h10    = hour / 10;
  int h1     = hour % 10;
  // Phase 1：短前奏
  for (int t = 0; t &amp;lt; 3; t++) {
    for (int i = 0; i &amp;lt; 6; i++) setDigit(i, random(10));
    updateDisplay();
    delay(60);
  }
  // Phase 2：左右扫管
  sweepOnce(false, 28);
  sweepOnce(true,  28);
  // Phase 3：高亮小时两位闪烁
  for (int blink = 0; blink &amp;lt; 2; blink++) {
    for (int i = 0; i &amp;lt; 6; i++) setDigit(i, random(10));
    setDigit(1, h10);
    setDigit(0, h1);
    updateDisplay();
    delay(160);
    for (int i = 0; i &amp;lt; 6; i++) setDigit(i, random(10));
    updateDisplay();
    delay(120);
  }
  // Phase 4：乱序收尾
  chaoticBurst(600, 16, 28);
  // 收尾：恢复当前时间显示
  rtc.getDateTime(&amp;amp;now);
  int minute = now.minute;
  int second = now.second;
  int digits&amp;#91;6] = {
    now.hour % 10, now.hour / 10,
    minute % 10,   minute / 10,
    second % 10,   second / 10
  };
  for (int i = 0; i &amp;lt; 6; i++) setDigit(i, digits&amp;#91;i]);
  updateDisplay();
}
// === 全局变量 ===
int lastHour = -1;
// === 主程序 ===
void setup() {
  pinMode(DATA_PIN, OUTPUT);
  pinMode(LATCH_PIN, OUTPUT);
  pinMode(CLOCK_PIN, OUTPUT);
  Serial.begin(9600);
  rtc.init();
  randomSeed((analogRead(A0) &amp;lt;&amp;lt; 10) ^ micros());
  startupAnimation();
  Ds1302::DateTime setTime;
  // setTime.year   = 2025;
  // setTime.month  = 11;
  // setTime.day    = 3;
  // setTime.hour   = 21;
  // setTime.minute = 42;
  // setTime.second = 30;
  // rtc.setDateTime(&amp;amp;setTime);
}
void loop() {
  Ds1302::DateTime now;
  rtc.getDateTime(&amp;amp;now);
  Serial.print("Time: ");
  Serial.print(now.hour); Serial.print(":");
  Serial.print(now.minute); Serial.print(":");
  Serial.println(now.second);
  int hour = now.hour;
  int minute = now.minute;
  int second = now.second;
  // 整点检测
  if (hour != lastHour &amp;amp;&amp;amp; minute == 0 &amp;amp;&amp;amp; second == 0) {
    hourlyChaos();
    lastHour = hour;
  }
  // 时间显示
  int digits&amp;#91;6] = {
    hour % 10, hour / 10,
    minute % 10, minute / 10,
    second % 10, second / 10
  };
  for (int i = 0; i &amp;lt; 6; i++) setDigit(i, digits&amp;#91;i]);
  updateDisplay();
  delay(1000);
}
&lt;/code&gt;&lt;/pre&gt;



&lt;hr&gt;



&lt;p&gt;最後是外殼&lt;/p&gt;



&lt;p&gt;本來的建模還稍顯炫酷&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-026-07daf92685.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;呃 但是我3D打印機太狗屎了打不出來 不是炒麵就是翹邊 &lt;/p&gt;



&lt;p&gt;只能大改變成這樣&lt;strong&gt;模塊化&lt;/strong&gt;&lt;s&gt;（大噓&lt;/s&gt;（&lt;s&gt;因為建模不會分件用熱熔膠黏的&lt;/s&gt;）&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-027-340676532e.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;p&gt;總成本大概300-400？&lt;/p&gt;



&lt;p&gt;反正最貴的是那個輝光管&lt;/p&gt;



&lt;p&gt;媽的一個40*6=240塊&lt;/p&gt;



&lt;hr&gt;



&lt;p&gt;最後附上視頻&lt;/p&gt;



&lt;figure&gt;&lt;video controls src="assets/master-archive/media/archive-028-c9d072988b.mp4" preload="none"&gt;&lt;/video&gt;&lt;/figure&gt;</content:encoded>
    </item>
    <item>
      <title>基於 Arduino 的偽 NTSC 視頻信號生成與發射的嘗試</title>
      <link>https://kokorotsuki.com/library/records/record-186.html</link>
      <guid isPermaLink="false">rei:library:record-186</guid>
      <pubDate>Tue, 30 Jun 2026 20:33:26 +0000</pubDate>
      <category>主人文库</category>
      <dc:creator>MASTER</dc:creator>
      <description>去年闲的没事干在煤炉上收了一台松下的手持式模拟电视，就想着在日本模拟视频信号全面终止放送的今天能不能让它再次接收到模拟视频信号。（本来以为它有AV接口但是没有） 但是我手上没有发射机（当然），毕竟在这种公用频率上胡乱个人发射违反日本电波法，个人也买不到这…</description>
      <content:encoded>&lt;p&gt; 去年闲的没事干在煤炉上收了一台松下的手持式模拟电视，就想着在日本模拟视频信号全面终止放送的今天能不能让它再次接收到模拟视频信号。（本来以为它有AV接口但是没有）&lt;/p&gt;



&lt;p&gt; 但是我手上没有发射机（当然），毕竟在这种公用频率上胡乱个人发射违反日本电波法，个人也买不到这种东西。所以想了想，反正模拟信号说罢了就是时间控制下电压的变化，单片机既可以控制电平又可以控制输出时间那不正好可以用单片机来输出模拟视频信号。&lt;/p&gt;



&lt;p&gt; 然后我查了一下日本的模拟电视广播标准，用的是NTSC-J标准，那不是用单片机模拟一个NTSC标准的信号就行了，本来我也是这么想的，然后查了下资料，发现NTSC是三电平视频信号，分别是同步电平（用于锁定扫描） 黑电平（亮度基准） 白电平（最大亮度），单片机就只能开关开关，也就是只能提供二电平信号。所以这样的话就只能强行构造一个时间结构跟NTSC信号差不多的信号来骗接收机，让它以为是NTSC信号来接收。同时单片机主频太低了只有16兆赫，单个时钟周期只有62.5ns，NTSC的行同步脉冲只有4～5 μs，反正简单说就是时钟精度不够，这里问题太复杂了我看不懂（哭&lt;/p&gt;



&lt;p&gt; &lt;strong&gt;总之就是最后输出的不是规范的NTSC标准所以说伪NTSC。&lt;/strong&gt;&lt;/p&gt;



&lt;p&gt;还有就是发射，我直接一根导线接在D6上，毕竟是个高频信号直接就以电磁波形式辐射出去了，单片机没有RF电路？频率只有几兆赫达不到UHF/VHF?无所谓，靠谐波干扰直接就窜到接收机相应接收频率范围去了。就跟以前模拟电视莫名其妙收到隔壁家放DVD一个道理。&lt;/p&gt;



&lt;p&gt; 思路有了，通过Chat GPT帮我写下代码，让他帮我生成一个显示字母“A”的伪NTSC信号&lt;/p&gt;



&lt;p&gt;但是按照NTSC-J的参数会失同步，可能还是时钟精度的问题，在我不断调整参数下终于成功同步了。（调的跟ntsc快没关系了）可以看到一个歪歪扭扭的“A”。虽然我觉得这看起来也是失同步，但是能分辨出来已经很不容易了，就算他同步了。(*^_^*)。最后我在想这算不算一种SDR（笑&lt;/p&gt;



&lt;figure&gt;&lt;img src="https://kokorotsuki.com/assets/master-archive/media/archive-006-89f134bc4f.webp" loading="lazy"&gt;&lt;/figure&gt;



&lt;pre&gt;&lt;code&gt;如果想自己尝试可以用一下代码自己调整行时序&lt;/code&gt;&lt;/pre&gt;



&lt;pre&gt;&lt;code&gt;// ========================================================
//   Arduino 伪NTSC-J
// ========================================================

const uint8_t RF_PIN = 6;

// 行时序
const uint8_t HSYNC_US      = 5;
const uint8_t BACKPORCH_US  = 5;
const uint8_t ACTIVE_US     = 50;
const uint8_t FRONT_US      = 3;

const uint16_t LINES_PER_FRAME = 262;

//  VSync
const uint8_t VSYNC_LONG_LINES  = 6;  // 6 行长同步
const uint8_t VSYNC_SHORT_LINES = 6;  // 6 行短同步

const uint8_t TOP_BORDER_LINES  = 20;
const uint8_t PAT_HEIGHT_LINES  = 160;  // 中间用于画图的总高度

// 在 PAT_HEIGHT_LINES 里面再放一个高度为 100 行的 A
const uint8_t CHAR_HEIGHT_LINES = 100;
const uint8_t CHAR_TOP_OFFSET   = (PAT_HEIGHT_LINES - CHAR_HEIGHT_LINES) / 2; // 上下留边

// 载波基频参数
#define CARRIER_OCR0A  1   // 4 MHz 基频（可改 2/3/4 扫频）

inline void carrierOn()  { TCCR0A |= _BV(COM0A0); }
inline void carrierOff() { TCCR0A &amp;amp;= ~_BV(COM0A0); PORTD &amp;amp;= ~_BV(PD6); }

void setupCarrier() {
  pinMode(RF_PIN, OUTPUT);
  TCCR0A = _BV(WGM01);    // CTC
  TCCR0B = _BV(CS00);     // no prescale
  OCR0A  = CARRIER_OCR0A;
  carrierOff();
}

// =====================
// 判断在 (row, segmentIndex) 是否属于 "A" 的黑色部分
// =====================
bool isAPixel(uint8_t row, uint8_t segmentIndex) {
  // 水平分 16 段，用中间 3~12 段画字，左右留空
  if (segmentIndex &amp;lt; 3 || segmentIndex &gt; 12) return false;

 
  uint8_t x = segmentIndex;             // 3..12
  uint8_t midRow = CHAR_HEIGHT_LINES / 2;  // 50

  // 顶部小横条（A 的顶部）
  if (row &amp;lt; 10) {
    // 顶部在 5~10 这一段变黑
    if (x &gt;= 5 &amp;amp;&amp;amp; x &amp;lt;= 10) return true;
    return false;
  }

  // 左右竖边（整段高度）
  if (x == 4 || x == 5 || x == 10 || x == 11) {
    return true;
  }

  // 中间横杠（行数在中间附近）
  if (row &gt;= midRow - 4 &amp;amp;&amp;amp; row &amp;lt;= midRow + 4) {
    if (x &gt;= 5 &amp;amp;&amp;amp; x &amp;lt;= 10) return true;
  }

  return false;
}

// =====================
// 发送一行 RF 视频
// =====================
void sendLineRF(uint16_t line) {

  // HSync
  carrierOn();
  delayMicroseconds(HSYNC_US);

  // Back Porch
  carrierOff();
  delayMicroseconds(BACKPORCH_US);

  // 视频区
  if (line &amp;lt; TOP_BORDER_LINES ||
      line &gt;= TOP_BORDER_LINES + PAT_HEIGHT_LINES) {
    // 上下边框：全白（无载波）
    carrierOff();
    delayMicroseconds(ACTIVE_US + FRONT_US);
    return;
  }

  // 计算这个行在 A 字中的纵向位置
  int16_t yInPat  = (int16_t)line - TOP_BORDER_LINES;           // 0..PAT_HEIGHT_LINES-1
  int16_t yInChar = yInPat - CHAR_TOP_OFFSET;                   // 可能为负/超出

  const uint8_t SEG = 16;
  uint8_t perSeg    = ACTIVE_US / SEG;  // 50/16≈3us，略短一些没关系

  for (uint8_t s = 0; s &amp;lt; SEG; s++) {
    bool dark = false;  // 默认背景（白）→ 无载波

    if (yInChar &gt;= 0 &amp;amp;&amp;amp; yInChar &amp;lt; CHAR_HEIGHT_LINES) {
      dark = isAPixel((uint8_t)yInChar, s);
    }

    if (dark) carrierOn();   // A 的部分 → 黑 → 有载波
    else      carrierOff();  // 背景 → 白 → 无载波

    delayMicroseconds(perSeg);
  }

  // 前肩
  carrierOff();
  delayMicroseconds(FRONT_US);
}

void setup() {
  setupCarrier();
}

void loop() {

  uint16_t line = 0;

  // ====== 垂直同步 ======

  // 6 行长同步（全行载波 = 宽脉冲）
  for (uint8_t i = 0; i &amp;lt; VSYNC_LONG_LINES; i++, line++) {
    carrierOn();
    delayMicroseconds(63);   // 整行 = 宽同步
  }

  // 6 行短同步（只在行头载波 = 窄脉冲）
  for (uint8_t i = 0; i &amp;lt; VSYNC_SHORT_LINES; i++, line++) {
    carrierOn();
    delayMicroseconds(3);    // 短同步脉冲
    carrierOff();
    delayMicroseconds(60);   // 行剩余
  }

  // ====== 正常扫描 ======
  for (; line &amp;lt; LINES_PER_FRAME; line++) {
    sendLineRF(line);
  }
}&lt;/code&gt;&lt;/pre&gt;



&lt;p&gt;&lt;/p&gt;</content:encoded>
    </item>
  </channel>
</rss>