<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>GoodBoyboy &#39;s Blog｜惬意小屋-点滴记忆</title>
  
  
  <link href="https://blog.goodboyboy.top/atom.xml" rel="self"/>
  
  <link href="https://blog.goodboyboy.top/"/>
  <updated>2026-07-17T02:26:11.000Z</updated>
  <id>https://blog.goodboyboy.top/</id>
  
  <author>
    <name>GoodBoyboy</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>回家吵的第一场架</title>
    <link href="https://blog.goodboyboy.top/posts/3228333651.html"/>
    <id>https://blog.goodboyboy.top/posts/3228333651.html</id>
    <published>2026-07-17T02:26:11.000Z</published>
    <updated>2026-07-17T02:26:11.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>不是和家里人吵架，是和外人吵架😋</p><h2 id="起因">起因</h2><p>因为今年比较热，楼上可能是想给客厅装空调，然后准备把空调外机装在我家窗户旁。</p><p>本来这玩意声音就大，被我妈发现后就表示要装就装到他们自己家阳台窗户那去，别影响我家，然后就开始吵起来了</p><h2 id="开始">开始</h2><p>一开始早上我出去去剪头发了，没开局参团，回来时老远就听到我妈的声音。</p><p>到楼下后发现我妈正在和一楼和住在楼上的男方对线，我先站在一旁了解一下原委，方便加入战局。</p><p>了解完原委后迅速加入战局开始持续输出😋</p><h2 id="输出">输出</h2><p>首先是对方尝试用所谓的“国家规定”，表示空调排水管要低于外机，试图尝试证明“将空调外机安装在我家窗户边”的合理性，还表示开发商是这么设计的。</p><p>我妈先是使用道德，表示虽然是“国家规定”，但是会影响到其他人来尝试化解。当前暂时没找到破局之法，所以也只能先跟团。</p><p>这其实是最关键的一点，也是破局之点，这个之后说。</p><p>输出了一会发现效果并不好，还是被压一头，我妈又开始换方向，我当然是继续跟团。</p><p>房屋设计时其实不止外面的那个排水管，阳台另一侧内部还有一个专门的用于排水的排水管，但是它又不用，非要装在这一侧。</p><p>这里就可以体现出自私性了，另一侧有专门的内侧排水管不装，非要装到楼道这一侧，可能是觉得装到另一侧制冷效果不好还是咋滴，还想用规定来把空调外机装到人家窗户边影响别人</p><p>典型的规矩有利时就用规矩压人捏😋</p><p>玩互联网这么多年不是白玩的，瞬间识破。</p><p>不过这会依旧是没找到破局之法，暂不说吵架的时候有没有时间查所谓的“规定”，这种用有利的规矩压一头确实是很有效的办法，所以进入持续垃圾时间。</p><p>这时那气势上就不能输，同时继续想破局之法。</p><p>吵架时，我无意间得知对方还是一名老师，众所周知嘛，所以我稍微穿插了一点点人身攻击（人身攻击是不对的哦，大家不要学我），瞬间把对面惹炸毛了😂。不过对方也确实挺敏锐的，说我不要指指点点他，我也意识到这也可能起反作用，容易被扣上不讲理、人身攻击这类帽子，不过把他营设的那种“很讲理”的人设卸掉就行了。</p><p>突然，我妈找到了战局关键一点，那就是排水管的设计其实每户就是自己窗户旁边的！</p><p>我也迅速意识到这一点，经过确认，排水管口数量刚好和楼户数对应！</p><p>示意图：蓝色为楼上以及他想要安装的空调外机，红色为排水管道，排水管道后面是楼道</p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/17/7437c0ff-e867-4913-bb4e-f6c756e32948.png" alt=""></p><p>也就是说，这个排水管设计时就是就是高于所谓的“规定”的，那么如果说这个规定是真的（不确定是不是真的，不过看着像是有备而来），那就是开发商设计问题，那就和前文一开始他自己说“是开发商这样设计的”前呼后应，属于是搬起石头砸自己脚了😂</p><p>他自己也数了一遍，发现好像确实是这样，瞬间熄火了</p><p>到这里赢面已经占了一大半了。</p><p>这时女方在阳台上可能发现战局有点不对头了，也开始加入战局，尝试使用少数服从多数战略，说其他家都是这么装的。</p><p>但是这牌打得太晚了，而且互联网上这种对线实在是太多了</p><p>直接“人家这么做你就要这么做吗？”，“别人这么做别人就是对的吗？”直接秒了。</p><p>而且我妈观察更敏锐，虽然说其他楼栋的是这样装的，但是我们这栋楼没一个这样装，也就是说，他的楼上并没有占据属于他的那一层的排水管，因此事实上他是有使用自己楼层排水管的客观条件的，不会出现人家占了他的排水管，他只能用我们家的这种情况了。</p><p>到这里男方就吵不下去了，毕竟无论从哪个角度来说已经没有理由</p><p>这时我继续补刀，表示又不想安装在另一侧，又想要把外机安装在别人窗户边，那不就是自私自利么</p><p>此时胜局已定，男方也只能轻飘飘的说一句“你们不讲理”这种毫无作用的话了。</p><p>说实在的，一开始和你讲理的时候，你自己非要趾高气扬的拿着规定，不顾别人的感受，要把外机安装在别人阳台窗户边，最后发现自己拿出的“规矩牌”反倒被别人拿来制衡自己后又说别人不讲理，多多少少有点难蚌。而且虽然其他栋的住户有这样安装的，那也是要和楼下住户商量啊，让你装是情分，不让你装是本分，属实是有点拎不清了。。。</p><h2 id="收尾">收尾</h2><p>吵得差不多的时候，又有另外一个邻居过来想缓和一下关系。在这种胜局已定的情况下当然是没有问题的，最后我们也是借坡下驴，完成收尾😋。</p><h2 id="另一种可能">另一种可能</h2><p>可能那个安装师傅觉得安装不好装，然后说些七七八八的蹿楼上来和我妈吵架。不过我觉得这种可能是很低，毕竟是这么大的人还是老师，被别人拱火当枪使的概率还是太低了。</p><h2 id="后记">后记</h2><p>真的好久没吵过架了，这次输出还是没有发挥好，大部分时间还是只起到辅助作用，还得是老妈AOE全场</p><h2 id="最后">最后</h2><p>只是单纯分享和复盘一下这次吵架，邻里之间有摩擦很正常，如有雷同，请不要对号入座</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;不是和家里人吵架，是和外人吵架😋&lt;/p&gt;
&lt;h2 id=&quot;起因&quot;&gt;起因&lt;/h2&gt;
&lt;p&gt;因为今年比较热，楼上可能是想给客厅装空调，然后准备把空调外机装在我家窗户旁。&lt;/p&gt;
&lt;p&gt;本来这玩意声音就大，被我妈发现后就表示要装就装到他们</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="吵架" scheme="https://blog.goodboyboy.top/tags/%E5%90%B5%E6%9E%B6/"/>
    
  </entry>
  
  <entry>
    <title>新设计了一个Astro主题</title>
    <link href="https://blog.goodboyboy.top/posts/1365608464.html"/>
    <id>https://blog.goodboyboy.top/posts/1365608464.html</id>
    <published>2026-07-14T15:57:38.000Z</published>
    <updated>2026-07-14T15:57:38.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>最近闲的无聊，设计了一款叫Furnest的Astro的主题，中文名叫绒毛小窝，定位是一款Furry主题。</p><p>虽然说定位是Furry，但是整个主题除了首页大屏是一张Furry图以外好像其他地方并没有看见Furry元素（逃</p><p>主要还是因为手上没多少Furry素材，不过现在主题绝大部分功能已经设计完成了，后续会补齐一些Furry元素（确信</p><h2 id="展示">展示</h2><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/90413278-7231-45e8-8091-2505d204be74.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/48f74e2f-23bb-4166-9398-a7cca62d0e52.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/3e4b6368-eb25-4e76-844f-634bda6013f6.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/14/a4638da9-d4e1-42d0-94a9-b4bb15a0eeeb.webp" alt=""></p><h2 id="Demo">Demo</h2><p>如果有兴趣的话可以看看Demo哦，等完善的差不多后会进行开源供大家使用。</p><p>Demo：<a href="https://www.furwolf.com/">https://www.furwolf.com/</a></p><p>是的，官网即Demo（逃</p><h2 id="参与">参与</h2><ul><li>Penpot：<a href="https://penpot.app/">https://penpot.app/</a> 感谢由Penpot提供开源UI设计解决方案</li><li>DeepSeekk：<a href="https://www.deepseek.com/">https://www.deepseek.com/</a> 感谢由DeepSeek提供开源AI模型</li><li>ChatGPT：<a href="https://chatgpt.com/">https://chatgpt.com/</a></li></ul>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;最近闲的无聊，设计了一款叫Furnest的Astro的主题，中文名叫绒毛小窝，定位是一款Furry主题。&lt;/p&gt;
&lt;p&gt;虽然说定位是Furry，但是整个主题除了首页大屏是一张Furry图以外好像其他地方并没有看见Furry元素（逃&lt;/</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="主题" scheme="https://blog.goodboyboy.top/tags/%E4%B8%BB%E9%A2%98/"/>
    
    <category term="Astro" scheme="https://blog.goodboyboy.top/tags/Astro/"/>
    
    <category term="Furnest" scheme="https://blog.goodboyboy.top/tags/Furnest/"/>
    
  </entry>
  
  <entry>
    <title>Cap，一个基于PoW的自托管验证码系统</title>
    <link href="https://blog.goodboyboy.top/posts/1964691587.html"/>
    <id>https://blog.goodboyboy.top/posts/1964691587.html</id>
    <published>2026-07-09T10:25:56.000Z</published>
    <updated>2026-07-09T10:25:56.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近发现一款开源的自托管验证码系统，研究了下觉得设计思想很有趣，打算写一篇博文分享一下。</p><h2 id="什么是Cap">什么是Cap</h2><p>Cap 是一款自托管的验证码系统，用隐形的工作量证明替代了传统的图像拼图。用户只需点击一个复选框，工作量便会在其浏览器中静默运行，而用户的任何数据都不会离开你的服务器。无需谷歌、无遥测、无按次收费。</p><p>项目地址：<a href="https://trycap.dev">https://trycap.dev</a></p><p>下面是我自己部署的一个demo：</p><script src="https://cdn.jsdelivr.net/npm/cap-widget"></script><p>SHA-256版：</p><p><cap-widget id="cap" data-cap-api-endpoint="https://cap.furwolf.com/1118fa888d/"></cap-widget></p><p>RSW版：</p><p><cap-widget data-cap-api-endpoint="https://cap.furwolf.com/b2675e884b/"></cap-widget></p><h2 id="验证流程">验证流程</h2><p>首先，客户端会向验证码服务器发起请求，拿到挑战。</p><p>然后客户端会在本地完成完成PoW，以及运行挑战里附带的JavaScript程序来验证浏览器环境。</p><p>完成指定轮数的PoW和浏览器环境验证后，向验证码服务器发送结果。</p><p>验证码服务器完成校验后，下发token。</p><p>此时用户浏览器再携带token向资源服务器发起实际请求。</p><p>资源服务器收到请求后使用向验证码服务器验证token正确性。</p><p>验证码服务器回应验证情况，资源服务器确认验证成功后允许请求。</p><h2 id="什么是PoW">什么是PoW</h2><blockquote><p>以下是维基百科 <a href="https://zh.wikipedia.org/zh-hans/%E5%B7%A5%E4%BD%9C%E9%87%8F%E8%AD%89%E6%98%8E">工作量证明</a>的解释</p></blockquote><p>工作量证明（Proof-of-Work，PoW）是一种对应服务与资源滥用、或是阻断服务攻击的经济对策。一般要求使用者进行一些耗时适当的复杂运算，并且答案能被服务方快速验算，以此耗用的时间、设备与能源做为担保成本，以确保服务与资源是被真正的需求所使用。此概念最早由Cynthia Dwork和Moni Naor于1993年的学术论文提出，而工作量证明一词则是在1999年由Markus Jakobsson与Ari Juels.所发表。现时此技术成为了加密货币的主流共识机制之一，如比特币所采用的技术。</p><p>工作量证明系统的核心特性在于其非对称性：证明者需完成适度困难（但可行）的计算工作，而验证者能极高效地验证结果。Hal Finney于2004年透过“可重用工作量证明”（RPOW）概念将此机制应用于数位代币，采用160位元SHA-1演算法。</p><h2 id="为什么是PoW">为什么是PoW</h2><p>下面是Cap官网的原话：</p><blockquote><p>Every CAPTCHA can eventually be solved, whether by AIs, algorithms, reverse-engineering and spoofing fingerprints, or humans paid via CAPTCHA farms, and this results in an endless cat-and-mouse game between attackers and defenders. The crucial difference lies in the cost imposed on attackers.<br>Cap’s goal is to make automated abuse expensive and hard while keeping the experience fast and virtually invisible for real users. Proof-of-work is a perfect balance for this issue, stopping abuse by requiring computational effort rather than relying solely on human verification methods that bots continuously learn to mimic.<br>Imagine sending 10,000 spam messages costs $1, potentially earning $10 – a profitable venture. If Cap increases the computational cost so that sending those messages now costs $100, the spammer loses $90. This eliminates the financial incentive.<br>Cap’s proof-of-work is heavily inspired by Hashcash. Our instrumentation challenges are inspired by Twitter and YouTube’s own custom challenges.</p></blockquote><p>简而言之，就是通过PoW，增加攻击者的成本，拉低其收益。让原来一次攻击只要花费1块钱，变成10块钱甚至100块钱。从而消除掉攻击者的动机。</p><p>最直观的就是，通过PoW，让原来一秒可以向一个端口请求一万次的脚本，强行限制到一秒请求两次，甚至两秒请求一次，让其效率约等于人工手动点击。</p><p>而且相较于传统验证码，我觉得它的另一个亮点是——Open</p><p>它的整个工作流程都是透明且公开的，没有混淆，没有对抗。</p><p>它就这样明晃晃的摆在那，但是你却无可奈何，必须要消耗掉一定的资源才能完成。</p><p>就像<a href="https://baike.baidu.com/item/%E6%9F%AF%E5%85%8B%E9%9C%8D%E5%A4%AB%E5%8E%9F%E5%88%99">柯克霍夫原则（Kerckhoffs’s principle）</a>。</p><p>好的加密方法绝不依赖闭源，一个真正强大、优秀的加密算法，不仅不怕开源，反而必须开源。</p><p>只有经过全球顶尖密码学家和黑客长年累月的公开攻击和审查却依然屹立不倒，才能证明它是安全的。</p><p>也因为Open，所以完全不惧开源。</p><p>还有一个亮点，也是Cap主要亮点之一——隐私友好</p><p>因为PoW主打的是资源消耗，完全不需要任何个人信息参与和用户行为判定</p><p>可以在<a href="https://trycap.dev/guide/compliance.html">https://trycap.dev/guide/compliance.html</a>看到</p><blockquote><p>用户数据始终不会离开你的基础设施。终端用户无需使用Cookie或追踪机制，验证流程中无第三方调用，工作量证明完全在访客浏览器中运行。</p></blockquote><h2 id="PoW工作原理">PoW工作原理</h2><p>Cap有好几种工作模式，这里举例最简单的一种</p><figure class="highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">const</span> tokenFnv = <span class="title function_">fnv1a</span>(token); <span class="comment">// ① FNV-1a(token全文)</span></span><br><span class="line"><span class="keyword">for</span> (<span class="keyword">let</span> i = <span class="number">0</span>; i &lt; c; i++) &#123;</span><br><span class="line">  <span class="keyword">const</span> idxStr = <span class="title class_">String</span>(i + <span class="number">1</span>); <span class="comment">// ② &quot;1&quot;, &quot;2&quot;, &quot;3&quot;...</span></span><br><span class="line">  <span class="keyword">const</span> saltSeed = <span class="title function_">fnv1aResume</span>(tokenFnv, idxStr); <span class="comment">// ③ 续算索引号</span></span><br><span class="line">  <span class="keyword">const</span> targetSeed = <span class="title function_">fnv1aResume</span>(saltSeed, <span class="string">&quot;d&quot;</span>); <span class="comment">// ④ 续算固定字母&quot;d&quot;</span></span><br><span class="line">  <span class="keyword">const</span> salt = <span class="title function_">prngFromHash</span>(saltSeed, size); <span class="comment">// ⑤ xorshift32 PRNG，参数s</span></span><br><span class="line">  <span class="keyword">const</span> target = <span class="title function_">prngFromHash</span>(targetSeed, difficulty); <span class="comment">//参数d</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>然后暴力枚举 SHA-256 前缀匹配</p><p>假设 target = “0000”（d=4），salt = “a1b2c3…”：<br>n=0: SHA-256(“a1b2c3…0”) → c4f8…  前缀不匹配<br>n=1: SHA-256(“a1b2c3…1”) → 9e2d…  前缀不匹配<br>n=2: SHA-256(“a1b2c3…2”) → 00007f… 前缀匹配</p><p>那么答案就是2</p><p>客户端要做的，就是根据题目要求，找到一个n，使得符合题目对于哈希前缀的要求。</p><p>众所周知，密码学哈希函数有一个著名的特性叫雪崩效应（Avalanche Effect），哪怕仅仅将输入数据改变了1个比特，输出的256位哈希值也会发生翻天覆地的、毫无规律的改变。</p><p>因此无法通过前一个值预测后一个值是什么，只能老老实实花时间算。</p><p>而出题者只需要根据你的答案重新算一次，就知道是不是符合题目的要求了，这也体现了PoW中非对称特性。</p><p>另外我们也可以进行一个期望计算：</p><p>SHA-256的输出结果在整个可能的值域[0,(2^256)-1]里是均匀分布的，而且每次计算只有成功与失败两种结果，每次计算因为雪崩效应也是独立的，因此它是契合几何分布的。</p><p>例如d为4，要求前四个字符为某个特定值（假设为0000）</p><p>哈希值的每一位出现 <code>0</code> 的概率是 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mfrac><mn>1</mn><mn>16</mn></mfrac></mrow><annotation encoding="application/x-tex">\frac{1}{16}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1901em;vertical-align:-0.345em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">16</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.345em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>。</p><p>要哈希值的前四个字符连续都是0，那么概率就是相乘：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>p</mi><mo>=</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>×</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo>=</mo><msup><mrow><mo fence="true">(</mo><mfrac><mn>1</mn><mn>16</mn></mfrac><mo fence="true">)</mo></mrow><mn>4</mn></msup><mo>=</mo><mfrac><mn>1</mn><mn>65536</mn></mfrac></mrow><annotation encoding="application/x-tex">p = \frac{1}{16} \times \frac{1}{16} \times \frac{1}{16} \times \frac{1}{16} = \left(\frac{1}{16}\right)^4 = \frac{1}{65536}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">×</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.604em;vertical-align:-0.95em;"></span><span class="minner"><span class="minner"><span class="mopen delimcenter" style="top:0em;"><span class="delimsizing size3">(</span></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">16</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mclose delimcenter" style="top:0em;"><span class="delimsizing size3">)</span></span></span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:1.654em;"><span style="top:-3.9029em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">4</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">65536</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p>根据几何分布的期望公式 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mi>p</mi></mfrac></mrow><annotation encoding="application/x-tex">E(X) = \frac{1}{p}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.3262em;vertical-align:-0.4811em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.8451em;"><span style="top:-2.655em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">p</span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.394em;"><span class="pstrut" style="height:3em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.4811em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span>，期望值就是：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>E</mi><mo stretchy="false">(</mo><mi>X</mi><mo stretchy="false">)</mo><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mi mathvariant="normal">/</mi><mn>65536</mn></mrow></mfrac><mo>=</mo><mn>65536</mn></mrow><annotation encoding="application/x-tex">E(X) = \frac{1}{1 / 65536} = 65536</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mopen">(</span><span class="mord mathnormal" style="margin-right:0.07847em;">X</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.2574em;vertical-align:-0.936em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1/65536</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.936em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">65536</span></span></span></span></span></p><p>也就是平均要计算65536次哈希，才能找到一个前缀为四个<code>0</code>的合法哈希。</p><h2 id="优化">优化</h2><p>众所周知，SHA-256这种算法，GPU算起来最快了。因此Cap还支持RSW时间锁谜题算法，专门用来抗GPU。</p><p>具体算法原理这里就不展开了。</p><p>不过目前RSW还处于实验阶段，并且不是默认开启的。</p><h2 id="缺点">缺点</h2><p>与其说是缺点，我觉得应该是有些人对于Cap的设计理念理解错了。</p><p>Cap的核心理念是通过PoW来提高攻击成本，但它并没有阻止脚本程序的功能。</p><p>我让AI写了个python解题脚本，测试参数如下：</p><ul><li>Challenge protocol：SHA-256</li><li>Difficulty：4</li><li>Challenge count：80</li><li>Enable instrumentation challenges</li><li>Attempt to block headless browsers</li><li>Block non-browser user agents</li><li>Require browser headers</li></ul><p>不考虑出题和验证，以及传输的时间，在使用纯CPU计算下：</p><p>PoW工作量证明花费<code>4s19'</code>，调起浏览器完成浏览器环境检测<code>1s22'</code></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/09/28a9617d-f2ac-4869-9a5b-5c6ad4de09c5.webp" alt=""></p><p><img src="https://pic.goodboyboy.top/imgs/2026/07/09/53ef0663-d32d-4b2a-b86b-08a9dcac29bd.webp" alt=""></p><p>可见用脚本完全可以实现自动化，只是原来一次一秒可以打几千发，现在只能老老实实五秒一发了。</p><p>另外如果用cuda写结合GPU算，时间应该会更短。</p><h2 id="后记">后记</h2><p>Cap还是蛮好玩的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近发现一款开源的自托管验证码系统，研究了下觉得设计思想很有趣，打算写一篇博文分享一下。&lt;/p&gt;
&lt;h2 id=&quot;什么是Cap&quot;&gt;什么是Cap&lt;/h2&gt;
&lt;p&gt;Cap 是一款自托管的验证码系统，用隐形的工作量证明替代了传统的图像拼图。</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Web" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Web/"/>
    
    
    <category term="验证码" scheme="https://blog.goodboyboy.top/tags/%E9%AA%8C%E8%AF%81%E7%A0%81/"/>
    
    <category term="Cap" scheme="https://blog.goodboyboy.top/tags/Cap/"/>
    
    <category term="自托管" scheme="https://blog.goodboyboy.top/tags/%E8%87%AA%E6%89%98%E7%AE%A1/"/>
    
  </entry>
  
  <entry>
    <title>公益服务迁移通知</title>
    <link href="https://blog.goodboyboy.top/posts/2030627247.html"/>
    <id>https://blog.goodboyboy.top/posts/2030627247.html</id>
    <published>2026-07-08T08:51:55.000Z</published>
    <updated>2026-07-08T08:51:55.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>由于资源组合调整，现将大部分公益服务已从<code>goodboyboy.top</code>迁移至<code>furwolf.com</code>下。</p><p>并关闭了部分使用较少或项目已被出售的服务。</p><p>对于接口类的公益服务已在原有域名上设定了301重定向，短期不会影响服务正常运行，但仍建议迁移至新域名。</p><p>具体变更请见公益服务页面：<a href="https://blog.goodboyboy.top/free/">https://blog.goodboyboy.top/free/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;由于资源组合调整，现将大部分公益服务已从&lt;code&gt;goodboyboy.top&lt;/code&gt;迁移至&lt;code&gt;furwolf.com&lt;/code&gt;下。&lt;/p&gt;
&lt;p&gt;并关闭了部分使用较少或项目已被出售的服务。&lt;/p&gt;
&lt;p&gt;对于接口</summary>
      
    
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
    
  </entry>
  
  <entry>
    <title>一种基于argon2id算法与shamir算法的内存PoW（工作量证明）解密游戏</title>
    <link href="https://blog.goodboyboy.top/posts/4010684677.html"/>
    <id>https://blog.goodboyboy.top/posts/4010684677.html</id>
    <published>2026-07-07T10:45:47.000Z</published>
    <updated>2026-07-07T10:45:47.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>其实一个月前就设计了这个游戏，今天正式整理发布。</p><h2 id="算法采用">算法采用</h2><p>通过利用argon2id算法的内存硬度来对抗GPU运算，实现基于内存的PoW，拉低硬件差距。</p><p>通过利用shamir算法门限方案，增加游戏乐趣。</p><h2 id="游戏整体流程图">游戏整体流程图</h2><pre><code class="highlight mermaid">flowchart TD    Enumerate(Enumerate Nonce) --&gt; |枚举 Nonce| Target[Target Nonce]    M[Memory Cost] --&gt; Parameters[Parameters]    T[Time Cost] --&gt; Parameters[Parameters]    Parallelism[Parallelism] --&gt;  Parameters[Parameters]    Length[Output Length] --&gt; Parameters[Parameters]    Salt[Salt] --&gt; Parameters[Parameters]    Parameters[Parameters] --&gt; |参与计算| Argon2id[Argon2id PoW]    Target[Target Nonce] --&gt; |参与计算| Argon2id[Argon2id PoW]    Argon2id[Argon2id PoW] --&gt; |派生内容| Secret[Secret]    Secret[Secret] --&gt; |转换| AES1Key[AES Key]    AES1Key[AES Key] --&gt; |参与计算| AES1[AES Algorithm]    EncryptedShamirContent[Encrypted Shamir Key] --&gt; |参与计算| AES1[AES Algorithm]    AES1[AES Algorithm] --&gt; |解密内容| TagShamirKey[Tag + Shamir Key]     TagShamirKey[Tag + Shamir Key] --&gt; |匹配 Tag| CorrectTag&#123;Correct Tag&#125;    CorrectTag&#123;Correct Tag&#125; --&gt; |No| Enumerate(Enumerate Nonce)    CorrectTag&#123;Correct Tag&#125; --&gt; |Yes| ShamirKey[Shamir Key]    ShamirKey[Shamir Key 1] --&gt; |参与计算| Shamir[Shamir Algorithm]    ShamirKey2[Shamir Key 2] --&gt; |参与计算| Shamir[Shamir Algorithm]    ShamirKey3[Shamir Key 3] --&gt; |参与计算| Shamir[Shamir Algorithm]    MoreShamirKey[...] --&gt; |参与计算| Shamir[Shamir Algorithm]    Shamir[Shamir Algorithm] --&gt; |合成 AES Master Key| MasterAESKey[AES Master Key]    MasterAESKey[Master AES Key] --&gt; |参与计算| AES2[AES Algorithm]    EncryptedContent[Encrypted Content] --&gt; |参与计算| AES2[AES Algorithm]    AES2[AES Algorithm] --&gt; |得到解密密文| DecryptedContent(Decrypted Content)</code></pre><h2 id="玩法讲解">玩法讲解</h2><h3 id="公开参数">公开参数</h3><p>首先，出题者会给出本次游戏难度（Argon2id算法）参数：</p><ul><li>Memory Cost(m) - 内存开销：指定算法在计算过程中需要使用的内存总量</li><li>Time Cost / Iterations (t) - 时间开销 / 迭代次数：指定算法的执行轮数。</li><li>Parallelism / Lanes (p) - 并发度 / 线程数：指定计算时可以同时使用的独立计算通道（lanes）或线程数量。</li><li>Salt (S) - 盐值：随机数据。</li><li>Output Length / Hash Length (l) - 输出长度：最终哈希结果的字节长度，一般为32用于匹配AES256密钥长度</li></ul><p>下方为可选的公开数据：</p><ul><li>Range - Nonce范围：Nonce的范围，可用于降低游戏难度。</li></ul><p>然后，出题者会公开本次游戏奖池数与最少碎片数（Shamir算法）：</p><ul><li>Total shares(n) - 总份额数 / 碎片总数：指定总奖池数量。</li><li>Threshold(k) - 阈值 / 门限值：拼凑出最终Key所需的最少碎片数。</li></ul><h3 id="公开密文">公开密文</h3><p>接着，出题者会公开本次游戏所有的被加密的密文以及标识：</p><ul><li>所有被加密的Shamir Key（奖池）的密文</li><li>最终需要解密的密文</li><li>正确解密的内容所包含的Tag</li></ul><h3 id="开始计算">开始计算</h3><p>首先，解题者需要从挑选一个奖池，确定奖池的密文。</p><p>然后找出一个Nonce（随机数），将公开的游戏难度参数与Nonce通过argon2id算法进行计算，计算时间由出题者设置的难度决定。</p><p>如果出题者公开了Nonce范围，则在范围内寻找。</p><p>计算完成后会得到一个派生内容。</p><p>接着解题者需要将派生内容转换为 AES Key（具体转换规则由出题者公布），通过AES算法将奖池密文解密出来。</p><p>解密出内容后，可以通过Tag进行匹配（其实也可以不用匹配，AES-CGM模式下自带MAC校验），如果能成功匹配，则说明是正确的Nonce，成功得到一枚碎片；如果不能匹配成功，则说明是错误的Nonce，需要重新寻找。</p><p>当集齐出题者所设置的最少数量的碎片时，即可通过Shamir算法将碎片合成一个AES Master Key。</p><p>最后，通过这个AES Master Key，解密得到最终的奖品。</p><h3 id="计算优化">计算优化</h3><h4 id="寻找Nonce">寻找Nonce</h4><p>如果出题者给出Nonce范围，则可以尝试采用随机+HashMap去重的方式，将一部分期望压在你的lucky上。</p><p>你可能计算一次就中，也可能计算完整个奖池才中😄。</p><p>当然，你也可以一个一个算。</p><h4 id="并行计算">并行计算</h4><p>虽然出题者可以限制argon2id算法的并行数，但解题者可以并行的寻找Nonce并计算，只要解题者愿意付出额外的资源与成本😄。</p><h2 id="算法讲解">算法讲解</h2><h3 id="argon2算法">argon2算法</h3><p>argon2有些复杂，不讲（</p><h3 id="Shamir算法">Shamir算法</h3><div class="note info flat"><p>以下内容参考于Gemini</p></div><p>Shamir算法全名叫<code>Shamir 秘密共享算法 (Shamir's Secret Sharing)</code>。</p><p>Shamir算法的数学基础是多项式插值。</p><p>首先构造一个多项式</p><p>假设要隐藏的密钥是数值 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。随机生成一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 次的多项式：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>a</mi><mn>0</mn></msub><mo>+</mo><msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo><msub><mi>a</mi><mn>2</mn></msub><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mo>⋯</mo><mo>+</mo><msub><mi>a</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub><msup><mi>x</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msup></mrow><annotation encoding="application/x-tex">f(x) = a_0 + a_1x + a_2x^2 + \dots + a_{m-1}x^{m-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0141em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="minner">⋯</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.0724em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span></span></span></span></span></span></span></span></span></p><p>在这个多项式中，常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 为要隐藏的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mn>0</mn><mo stretchy="false">)</mo><mo>=</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">f(0) = S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord">0</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>），而其他的系数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>a</mi><mn>2</mn></msub><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><msub><mi>a</mi><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow></msub></mrow><annotation encoding="application/x-tex">a_1, a_2, \dots, a_{m-1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.2083em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mathnormal mtight">m</span><span class="mbin mtight">−</span><span class="mord mtight">1</span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.2083em;"><span></span></span></span></span></span></span></span></span></span> 为随机生成。</p><p>然后，在这个多项式的曲线上取 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>n</mi></mrow><annotation encoding="application/x-tex">n</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">n</span></span></span></span> 个不同的点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mn>2</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo separator="true">,</mo><mo>…</mo><mo separator="true">,</mo><mo stretchy="false">(</mo><msub><mi>x</mi><mi>n</mi></msub><mo separator="true">,</mo><msub><mi>y</mi><mi>n</mi></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_1, y_1), (x_2, y_2), \dots, (x_n, y_n)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="minner">…</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.1514em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mathnormal mtight">n</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 。</p><p>在数学上，要唯一确定一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 次的多项式，刚好需要 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个点。</p><p>只要任意 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个点，就可以通过<strong>拉格朗日插值法</strong>计算出完整的原多项式，从而求出 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>，也就是还原出了真正的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。</p><p>如果凑齐点数少于 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi></mrow><annotation encoding="application/x-tex">m</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span></span></span></span> 个，即使拥有 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>−</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">m-1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 个点，也无法推导出常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>a</mi><mn>0</mn></msub></mrow><annotation encoding="application/x-tex">a_0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">0</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span> 。</p><h4 id="示例">示例</h4><p>例如典型的 (3, 5) 门限方案</p><p>门限 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>m</mi><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">m=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">m</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>，因此需要一个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn><mo>−</mo><mn>1</mn><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">3-1=2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span> 次的多项式。</p><p>二次多项式也就是<strong>一元二次方程</strong>，它的图像是一条<strong>抛物线 (Parabola)</strong>。<br>方程的形式为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><msub><mi>a</mi><mn>2</mn></msub><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><msub><mi>a</mi><mn>1</mn></msub><mi>x</mi><mo>+</mo><mi>S</mi></mrow><annotation encoding="application/x-tex">f(x) = a_2x^2 + a_1x + S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.0141em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7333em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">a</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span></span></p><p>在这条抛物线上，随机切下 5 个不同的点（比如 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>1</mn><mo separator="true">,</mo><mn>2</mn><mo separator="true">,</mo><mn>3</mn><mo separator="true">,</mo><mn>4</mn><mo separator="true">,</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">x=1, 2, 3, 4, 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8389em;vertical-align:-0.1944em;"></span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">5</span></span></span></span> 对应的坐标）。<br>5 个坐标点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>1</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>1</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_1, y_1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span> 到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><msub><mi>x</mi><mn>5</mn></msub><mo separator="true">,</mo><msub><mi>y</mi><mn>5</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x_5, y_5)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">5</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span>。</p><p>在几何学中，<strong>任意三个不在一条直线上的点，可以唯一确定一条抛物线</strong>。只要有 3 个坐标点，通过方程计算，就能还原出这条抛物线，找到它与 Y 轴的交点（即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的值），即可把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 算出来。</p><p>如果只有 2 个点，两点只能确定一条直线。<strong>经过这两个点的抛物线有无数条</strong>，无法知道哪一条是真正的抛物线，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 的可能性为无限大。</p><p>下面为具体数值演示</p><p><strong>隐藏的密钥</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">S = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span> （也就是抛物线与 Y 轴交点的值，即 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值）。</p><p><strong>方程</strong>：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>f</mi><mo stretchy="false">(</mo><mi>x</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mn>2</mn><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mn>5</mn><mi>x</mi><mo>+</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">f(x) = -2x^2 + 5x + 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.10764em;">f</span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.8974em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8141em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">5</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span> （对还原者隐藏）。</p><p><strong>生成的 5 个坐标点</strong>：</p><ol><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>2</mn><mo separator="true">,</mo><mn>44</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(2, 44)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">2</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">44</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></li><li><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>5</mn><mo separator="true">,</mo><mn>17</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(5, 17)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">5</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">17</span><span class="mclose">)</span></span></span></span></li></ol><p>假设已知的坐标分别是 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></strong>、<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></strong> 和 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></strong></p><h4 id="拉格朗日插值法-Lagrange-Interpolation">拉格朗日插值法 (Lagrange Interpolation)</h4><p>拉格朗日插值法的核心思想是“加权”。对于每一个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值，乘以一个特定的“权重系数”（通常用 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 表示），然后相加即可得到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x=0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时的密钥 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span>。</p><p>公式如下：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><msub><mi>y</mi><mn>1</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>1</mn></msub><mo>+</mo><msub><mi>y</mi><mn>2</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>2</mn></msub><mo>+</mo><msub><mi>y</mi><mn>3</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">S = y_1 \cdot l_1 + y_2 \cdot l_2 + y_3 \cdot l_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6389em;vertical-align:-0.1944em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span></span></p><p>权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>l</mi></mrow><annotation encoding="application/x-tex">l</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal" style="margin-right:0.01968em;">l</span></span></span></span> 它只和的 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标</strong> 有关。</p><p>计算规则是：用其他的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标除以“其他的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标减去自己的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标”，然后相乘。</p><p>把选出的三个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标分别记为：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">x_1=1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>=</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">x_2=3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>=</mo><mn>4</mn></mrow><annotation encoding="application/x-tex">x_3=4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.5806em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>。</p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub></mrow><annotation encoding="application/x-tex">l_1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>），与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span>）进行计算：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>2</mn></msub><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>3</mn></msub><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>−</mo><msub><mi>x</mi><mn>1</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_1 = \frac{x_2}{x_2 - x_1} \cdot \frac{x_3}{x_3 - x_1}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>1</mn></msub><mo>=</mo><mfrac><mn>3</mn><mrow><mn>3</mn><mo>−</mo><mn>1</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mrow><mn>4</mn><mo>−</mo><mn>1</mn></mrow></mfrac><mo>=</mo><mfrac><mn>3</mn><mn>2</mn></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mn>3</mn></mfrac><mo>=</mo><mfrac><mn>12</mn><mn>6</mn></mfrac><mo>=</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">l_1 = \frac{3}{3 - 1} \cdot \frac{4}{4 - 1} = \frac{3}{2} \cdot \frac{4}{3} = \frac{12}{6} = 2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">6</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">12</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">2</span></span></span></span></span></p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub></mrow><annotation encoding="application/x-tex">l_2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>），与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>）进行计算：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>1</mn></msub><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>−</mo><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>3</mn></msub><mrow><msub><mi>x</mi><mn>3</mn></msub><mo>−</mo><msub><mi>x</mi><mn>2</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_2 = \frac{x_1}{x_1 - x_2} \cdot \frac{x_3}{x_3 - x_2}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>2</mn></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mn>3</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mrow><mn>4</mn><mo>−</mo><mn>3</mn></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mo>−</mo><mn>2</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>4</mn><mn>1</mn></mfrac><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">l_2 = \frac{1}{1 - 3} \cdot \frac{4}{4 - 3} = \frac{1}{-2} \cdot \frac{4}{1} = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">2</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">4</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span></span></p><p><strong>计算 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span> 的权重 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub></mrow><annotation encoding="application/x-tex">l_3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span>：</strong> 提取另外两个的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>1</mn></mrow><annotation encoding="application/x-tex">1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>3</mn></mrow><annotation encoding="application/x-tex">3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span></span></span></span>），与 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi></mrow><annotation encoding="application/x-tex">x</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span></span></span></span> 坐标（<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn></mrow><annotation encoding="application/x-tex">4</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">4</span></span></span></span>）进行计算：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub><mo>=</mo><mfrac><msub><mi>x</mi><mn>1</mn></msub><mrow><msub><mi>x</mi><mn>1</mn></msub><mo>−</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mfrac><mo>⋅</mo><mfrac><msub><mi>x</mi><mn>2</mn></msub><mrow><msub><mi>x</mi><mn>2</mn></msub><mo>−</mo><msub><mi>x</mi><mn>3</mn></msub></mrow></mfrac></mrow><annotation encoding="application/x-tex">l_3 = \frac{x_1}{x_1 - x_3} \cdot \frac{x_2}{x_2 - x_3}</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1.9436em;vertical-align:-0.836em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.1076em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:0em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.836em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><msub><mi>l</mi><mn>3</mn></msub><mo>=</mo><mfrac><mn>1</mn><mrow><mn>1</mn><mo>−</mo><mn>4</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>3</mn><mrow><mn>3</mn><mo>−</mo><mn>4</mn></mrow></mfrac><mo>=</mo><mfrac><mn>1</mn><mrow><mo>−</mo><mn>3</mn></mrow></mfrac><mo>⋅</mo><mfrac><mn>3</mn><mrow><mo>−</mo><mn>1</mn></mrow></mfrac><mo>=</mo><mfrac><mn>3</mn><mn>3</mn></mfrac><mo>=</mo><mn>1</mn></mrow><annotation encoding="application/x-tex">l_3 = \frac{1}{1 - 4} \cdot \frac{3}{3 - 4} = \frac{1}{-3} \cdot \frac{3}{-1} = \frac{3}{3} = 1</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8444em;vertical-align:-0.15em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mord">4</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:2.0908em;vertical-align:-0.7693em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">−</span><span class="mord">1</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.7693em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:2.0074em;vertical-align:-0.686em;"></span><span class="mord"><span class="mopen nulldelimiter"></span><span class="mfrac"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:1.3214em;"><span style="top:-2.314em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span><span style="top:-3.23em;"><span class="pstrut" style="height:3em;"></span><span class="frac-line" style="border-bottom-width:0.04em;"></span></span><span style="top:-3.677em;"><span class="pstrut" style="height:3em;"></span><span class="mord"><span class="mord">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.686em;"><span></span></span></span></span></span><span class="mclose nulldelimiter"></span></span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">1</span></span></span></span></span></p><p>现在，将三个点的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi></mrow><annotation encoding="application/x-tex">y</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span></span></span></span> 值与各自算出的权重相乘，然后相加：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>1</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>1</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>2</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>2</mn></msub><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><msub><mi>y</mi><mn>3</mn></msub><mo>⋅</mo><msub><mi>l</mi><mn>3</mn></msub><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S = (y_1 \cdot l_1) + (y_2 \cdot l_2) + (y_3 \cdot l_3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">1</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord"><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0359em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord mathnormal" style="margin-right:0.01968em;">l</span><span class="msupsub"><span class="vlist-t vlist-t2"><span class="vlist-r"><span class="vlist" style="height:0.3011em;"><span style="top:-2.55em;margin-left:-0.0197em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">3</span></span></span></span><span class="vlist-s">​</span></span><span class="vlist-r"><span class="vlist" style="height:0.15em;"><span></span></span></span></span></span></span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mo stretchy="false">(</mo><mn>45</mn><mo>⋅</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>39</mn><mo>⋅</mo><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mo stretchy="false">(</mo><mn>30</mn><mo>⋅</mo><mn>1</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">S = (45 \cdot 2) + (39 \cdot -2) + (30 \cdot 1)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">45</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">39</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">30</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">⋅</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">1</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mn>90</mn><mo>−</mo><mn>78</mn><mo>+</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">S = 90 - 78 + 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">90</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">78</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>S</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">S = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span></span></p><p>最后还原出了最初设定的密钥 <strong>42</strong>。</p><h4 id="原始的解方程">原始的解方程</h4><p>依然使用上文 3 个坐标点：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span></strong>、<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span></strong> 和 <strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span></strong>。</p><p>3 个点确定的抛物线，它的标准方程形式则为：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>y</mi><mo>=</mo><mi>a</mi><msup><mi>x</mi><mn>2</mn></msup><mo>+</mo><mi>b</mi><mi>x</mi><mo>+</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">y = ax^2 + bx + c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.9474em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mord"><span class="mord mathnormal">x</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></span></p><p>目标是求出未知的系数 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi></mrow><annotation encoding="application/x-tex">a</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span></span></span></span>、<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>。</p><p><strong>注意：</strong> 当 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>x</mi><mo>=</mo><mn>0</mn></mrow><annotation encoding="application/x-tex">x = 0</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">x</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">0</span></span></span></span> 时，<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>y</mi><mo>=</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">y = c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.625em;vertical-align:-0.1944em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>。因此，<strong>因此需要寻找的 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>S</mi></mrow><annotation encoding="application/x-tex">S</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord mathnormal" style="margin-right:0.05764em;">S</span></span></span></span> 其实就是常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span></strong>。</p><p>将 3 个 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mi>x</mi><mo separator="true">,</mo><mi>y</mi><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(x, y)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">x</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mclose">)</span></span></span></span> 坐标分别代入标准方程中：</p><ol><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>1</mn><mo separator="true">,</mo><mn>45</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(1, 45)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">1</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">45</span><span class="mclose">)</span></span></span></span>：</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>1</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>1</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a(1)^2 + b(1) + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">1</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p>化简得：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a + b + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></strong> (方程 ①)</p><ol start="2"><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>3</mn><mo separator="true">,</mo><mn>39</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(3, 39)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">3</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">39</span><span class="mclose">)</span></span></span></span>：</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>3</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>3</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">a(3)^2 + b(3) + c = 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">3</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">3</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></span></p><p>化简得：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">9a + 3b + c = 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></strong> (方程 ②)</p><ol start="3"><li>代入点 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mo stretchy="false">(</mo><mn>4</mn><mo separator="true">,</mo><mn>30</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(4, 30)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord">30</span><span class="mclose">)</span></span></span></span>：</li></ol><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo stretchy="false">(</mo><mn>4</mn><msup><mo stretchy="false">)</mo><mn>2</mn></msup><mo>+</mo><mi>b</mi><mo stretchy="false">(</mo><mn>4</mn><mo stretchy="false">)</mo><mo>+</mo><mi>c</mi><mo>=</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">a(4)^2 + b(4) + c = 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1.1141em;vertical-align:-0.25em;"></span><span class="mord mathnormal">a</span><span class="mopen">(</span><span class="mord">4</span><span class="mclose"><span class="mclose">)</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.8641em;"><span style="top:-3.113em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight">2</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mopen">(</span><span class="mord">4</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></span></p><p>化简得：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>16</mn><mi>a</mi><mo>+</mo><mn>4</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>30</mn></mrow><annotation encoding="application/x-tex">16a + 4b + c = 30</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">16</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">30</span></span></span></span></strong> (方程 ③)</p><p>现在，得到了一个包含三个未知数 (<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo separator="true">,</mo><mi>b</mi><mo separator="true">,</mo><mi>c</mi></mrow><annotation encoding="application/x-tex">a, b, c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8889em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">a</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">b</span><span class="mpunct">,</span><span class="mspace" style="margin-right:0.1667em;"></span><span class="mord mathnormal">c</span></span></span></span>) 的三元一次方程组。</p><p>为了解开它，可以通过两个方程相减，先消去常数项 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi></mrow><annotation encoding="application/x-tex">c</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span></span></span></span>：</p><p><strong>1. 用方程 ② 减去方程 ①：</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>=</mo><mn>39</mn><mo>−</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">(9a + 3b + c) - (a + b + c) = 39 - 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">39</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>8</mn><mi>a</mi><mo>+</mo><mn>2</mn><mi>b</mi><mo>=</mo><mo>−</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">8a + 2b = -6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">8</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord">2</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">6</span></span></span></span></span></p><p>两边同除以 2，化简得：<strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>4</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">4a + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></strong> (方程 ④)</p><p><strong>2. 用方程 ③ 减去方程 ②：</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>16</mn><mi>a</mi><mo>+</mo><mn>4</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mn>9</mn><mi>a</mi><mo>+</mo><mn>3</mn><mi>b</mi><mo>+</mo><mi>c</mi><mo stretchy="false">)</mo><mo>=</mo><mn>30</mn><mo>−</mo><mn>39</mn></mrow><annotation encoding="application/x-tex">(16a + 4b + c) - (9a + 3b + c) = 30 - 39</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">16</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">4</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">9</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">c</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">30</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">39</span></span></span></span></span></p><p><strong><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>7</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>9</mn></mrow><annotation encoding="application/x-tex">7a + b = -9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">7</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">9</span></span></span></span></strong> (方程 ⑤)</p><p><strong>3. 用方程 ⑤ 减去方程 ④，消去 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>：</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo stretchy="false">(</mo><mn>7</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>−</mo><mo stretchy="false">(</mo><mn>4</mn><mi>a</mi><mo>+</mo><mi>b</mi><mo stretchy="false">)</mo><mo>=</mo><mo>−</mo><mn>9</mn><mo>−</mo><mo stretchy="false">(</mo><mo>−</mo><mn>3</mn><mo stretchy="false">)</mo></mrow><annotation encoding="application/x-tex">(7a + b) - (4a + b) = -9 - (-3)</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">7</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">4</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">b</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">9</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mopen">(</span><span class="mord">−</span><span class="mord">3</span><span class="mclose">)</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>3</mn><mi>a</mi><mo>=</mo><mo>−</mo><mn>6</mn></mrow><annotation encoding="application/x-tex">3a = -6</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">3</span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">6</span></span></span></span></span></p><p><strong>解得：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span></strong></p><p><strong>4. 把 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span> 代回方程 ④，求 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi></mrow><annotation encoding="application/x-tex">b</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span></span></span></span>：</strong></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>4</mn><mo stretchy="false">(</mo><mo>−</mo><mn>2</mn><mo stretchy="false">)</mo><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">4(-2) + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">4</span><span class="mopen">(</span><span class="mord">−</span><span class="mord">2</span><span class="mclose">)</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>−</mo><mn>8</mn><mo>+</mo><mi>b</mi><mo>=</mo><mo>−</mo><mn>3</mn></mrow><annotation encoding="application/x-tex">-8 + b = -3</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">8</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">3</span></span></span></span></span></p><p><strong>解得：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">b = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span></strong></p><p>现在已知 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>a</mi><mo>=</mo><mo>−</mo><mn>2</mn></mrow><annotation encoding="application/x-tex">a = -2</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span></span></span></span> 和 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>b</mi><mo>=</mo><mn>5</mn></mrow><annotation encoding="application/x-tex">b = 5</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6944em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">5</span></span></span></span>。将其代入方程 ① 中：</p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mi>a</mi><mo>+</mo><mi>b</mi><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">a + b + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6667em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">a</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7778em;vertical-align:-0.0833em;"></span><span class="mord mathnormal">b</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mo>−</mo><mn>2</mn><mo>+</mo><mn>5</mn><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">-2 + 5 + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">−</span><span class="mord">2</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">5</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><span class="katex-display"><span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML" display="block"><semantics><mrow><mn>3</mn><mo>+</mo><mi>c</mi><mo>=</mo><mn>45</mn></mrow><annotation encoding="application/x-tex">3 + c = 45</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.7278em;vertical-align:-0.0833em;"></span><span class="mord">3</span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">+</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">45</span></span></span></span></span></p><p><strong>解得：<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>c</mi><mo>=</mo><mn>42</mn></mrow><annotation encoding="application/x-tex">c = 42</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.4306em;"></span><span class="mord mathnormal">c</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:0.6444em;"></span><span class="mord">42</span></span></span></span></strong></p><h2 id="后记">后记</h2><p>其实这个游戏不仅可以用argon2id算法，也可以用RSW时间锁谜题这类算法。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;其实一个月前就设计了这个游戏，今天正式整理发布。&lt;/p&gt;
&lt;h2 id=&quot;算法采用&quot;&gt;算法采用&lt;/h2&gt;
&lt;p&gt;通过利用argon2id算法的内存硬度来对抗GPU运算，实现基于内存的PoW，拉低硬件差距。&lt;/p&gt;
&lt;p&gt;通过利用sha</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="Python" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/Python/"/>
    
    
    <category term="游戏" scheme="https://blog.goodboyboy.top/tags/%E6%B8%B8%E6%88%8F/"/>
    
    <category term="argon2id" scheme="https://blog.goodboyboy.top/tags/argon2id/"/>
    
    <category term="shamir" scheme="https://blog.goodboyboy.top/tags/shamir/"/>
    
    <category term="PoW" scheme="https://blog.goodboyboy.top/tags/PoW/"/>
    
  </entry>
  
  <entry>
    <title>记忆里的屋子（一）</title>
    <link href="https://blog.goodboyboy.top/posts/930007696.html"/>
    <id>https://blog.goodboyboy.top/posts/930007696.html</id>
    <published>2026-06-28T12:18:55.000Z</published>
    <updated>2026-06-28T12:18:55.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="一">一</h2><p>我的老家在一个小县城的乡下。</p><p>虽然从我记事起，我就一直住在县城里，唯有过年时，我才跟随爸妈一起回到乡下，和周围的亲朋好友一起过年。</p><p>那会我很讨厌回乡下，因为每次都需要坐两个小时的大巴车，沿着弯弯曲曲的山路，摇摇晃晃来到那个屋子。那个承载了爷爷奶奶，爸妈，以及我记忆的屋子。</p><p>在我记事以前，听我爸妈说，家里有一条大黄狗。</p><p>每次我只要上完厕所，学着小狗呜呜叫几声，大黄狗就会跑过来舔我屁股。</p><p>我很喜欢和大黄狗玩，喜欢踩它尾巴，但是它不敢反抗，因为爷爷会在旁边用树枝打它。</p><p>只可惜有一天，它不知道去了哪，可能是被偷狗的贼偷走了，也可能是被什么人打死了。</p><p>每次想到这里，我就觉得很可惜，如果我能更早一点记事，可能我就能永远记得你的样子了吧。</p><h2 id="二">二</h2><p>过年总是热闹的。</p><p>要么和我堂弟在屋子里玩，要么和隔壁屋子的小朋友一起玩。</p><p>当然，还有那些喜欢逗我们的大朋友。</p><p>小时候没有什么可以玩的，我和堂弟便不断找那些大朋友讨嫌，叫他们的绰号，然后奔回家。</p><p>如果跑慢了被抓到，那就免不了一顿暴揍。</p><p>而我逃脱的阻拦之一，便是一个土坡。</p><p>那时还没有水泥路，全是些土路。</p><p>平常不在乡下，没有大人们说的麻利，每次跨上那个土坡都是一次挑战。</p><p>不过好在我从来没有被抓住过，因为我不跳下土坡，自然也就不用跨上土坡了。</p><h2 id="三">三</h2><p>跨年夜十分热闹。</p><p>大人们在屋子里打麻将，我便和堂弟在外面放烟花，放炮仗。</p><p>那时口袋里必然是随时揣着一个打火机的，不是用来抽烟，而是用来放另一个口袋里的擦炮的。</p><p>等到零点的时，四面八方便传来烟花声，各种颜色和花色的烟花在黑夜里绽放。</p><p>大人们也在院子里放起鞭炮，劈里啪啦的声音和天边的烟花声遥相呼应，预示着新的一年的到来。</p><p>我和堂弟也燃起冲天炮，对着天空燃放。</p><p>虽然大人们说过不能对着人放，但在某一年的跨年夜里，我们不知为何，放着放着便对冲起来。</p><p>烟花爆炸的激动和违背大人的偷感交杂在一起，令人兴奋不已。</p><p>本以为这件事不会被发现，却在第二天早上被老妈点出。</p><p>看我一脸疑惑，老妈便拎起我胸前的衣服，给我展示羽绒服上被烧出的密密麻麻的小洞。</p><p>不过好在最后没有被老妈深究。</p><h2 id="四">四</h2><p>每次来到乡下，第一件事必然是在小卖部买个打火机和一板的擦炮。</p><p>那会没有手机电脑这些电子产品，唯一的乐趣就只有放擦炮。</p><p>一盒擦炮里，大部分是普通的小擦炮，还有一两个二连炮，以及一个雷公炮。</p><p>整个冬天下来，擦炮都被我和堂弟玩出花来了。</p><p>一次去别人家拜年时，大人们在屋子里说话，我和堂弟便在院子里放擦炮。</p><p>不经意间，我撇到一个放在水龙头下盛满水的大盆子。</p><p>我便灵机一动，扔了几个小擦炮进去，然而结果只是不痛不痒的。</p><p>于是我拿出那个雷公炮丢进去。</p><p>咚的一声，好像没有什么变化。</p><p>就当我觉得无聊时，发现怎么从盆底开始流出了一些水来。</p><p>看着盆里越来越少的水，我忽然意识到，这下闯祸了……</p><h2 id="五">五</h2><p>那会屋子前还养着一些鸡。</p><p>白天的时候他们会在院子前的橘子树林里活动，晚上则会回到鸡圈里。</p><p>小鸡们很可爱，可是大人们不允许我们捉小鸡。</p><p>直到某一天，一次偶然的情况下，大人们出去了，屋子里只剩我和堂弟。</p><p>我们便一起捉了几只小鸡玩。</p><p>我们把小鸡放在床上玩。</p><p>我用那种黄色空心的透明胶环住小鸡，刚好能围住小鸡。</p><p>玩了一会，我下床取取东西，回来时便看到堂弟匆忙告诉我，鸡在床上拉屎了。</p><p>看到床上那一小坨鸡屎，我有些不知所措，最后还是堂弟把它清理了。</p><p>后面我去看电视，堂弟则是又去捉了一些小鸡，把小鸡挂在门口的渔网上玩。</p><p>好巧不巧，这时大人们回来了，看到被挂在渔网上的小鸡，堂弟当然免不了被一顿说教。</p><p>过了几天，我又想玩小鸡了，便和堂弟又捉了一些小鸡，结果不小心玩死了两只。</p><p>我们便拿着锄头挖了一个小坑给小鸡埋了起来。</p><p>本以为不会被发现，后面却听见大人们嘀咕怎么少了几只小鸡。</p><p>我们那当然只能是不清楚，不知道，不了解了。</p><p>不知道小鸡会不会怪罪我们……</p><h2 id="六">六</h2><p>上初中后，我便再也没有回到这里。</p><p>直到上了大学，我才在清明节跟着父亲，和堂弟一起回到这个屋子。</p><p>在这六年里，周围邻里渐渐都搬去了城里，这个屋子也因为没人住越来越破烂。</p><p>土路变成了柏油路，小朋友变成了大朋友。</p><p>记忆里的土坡被一脚跨过，记忆里的小卖部走几步便到。</p><p>而记忆里的热闹却再也不复，只剩下公路边偶尔驶过的车辆，和拂过耳边的微风。</p><p>小时候的玩伴早已各奔东西，小时候的热闹早已不复存在。</p><p>只剩下一地的荒芜，和空荡的屋子……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;一&quot;&gt;一&lt;/h2&gt;
&lt;p&gt;我的老家在一个小县城的乡下。&lt;/p&gt;
&lt;p&gt;虽然从我记事起，我就一直住在县城里，唯有过年时，我才跟随爸妈一起回到乡下，和周围的亲朋好友一起过年。&lt;/p&gt;
&lt;p&gt;那会我很讨厌回乡下，因为每次都需要坐两个小时的大巴车，沿着弯弯曲曲的山路，摇摇</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
    
    
    <category term="记忆" scheme="https://blog.goodboyboy.top/tags/%E8%AE%B0%E5%BF%86/"/>
    
    <category term="屋子" scheme="https://blog.goodboyboy.top/tags/%E5%B1%8B%E5%AD%90/"/>
    
  </entry>
  
  <entry>
    <title>Ubuntu 26.04 Btrfs+LUKS2安装</title>
    <link href="https://blog.goodboyboy.top/posts/4123452949.html"/>
    <id>https://blog.goodboyboy.top/posts/4123452949.html</id>
    <published>2026-06-18T13:04:44.000Z</published>
    <updated>2026-06-18T13:04:44.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>Ubuntu官方的安装器手动安装下只能识别普通设备分区，并不能把系统安装在mapper设备上。</p><p>这篇教程非新手教程，需要有一定相关知识积累。</p><p>新手建议走官方启动器安装流程。</p><h2 id="正文">正文</h2><blockquote><p>后面教程以/dev/sda设备作为演示，请根据自身实际情况调整</p></blockquote><h3 id="创建分区">创建分区</h3><p>创建三个分区，怎么创建都行，这里不做演示</p><ul><li>/dev/sda1 512MB EFI分区</li><li>/dev/sda2 1G Boot分区</li><li>/dev/sda3 剩余空间 系统分区</li></ul><h3 id="下载镜像">下载镜像</h3><p>可以下载Desktop版，也可以下载Server版，Server版会精简很多，下面演示采用Server版，安装流程和Desktop版没有什么差别，有差别的地方后文会标注出。</p><h3 id="制作Live-CD启动盘">制作Live CD启动盘</h3><p>使用rufus工具（如果自己有其他的烧录工具都行）将镜像烧录至准备的U盘（光盘或者其他什么介质都行，能启动就行）</p><h3 id="前置准备">前置准备</h3><p>重启进入Live CD环境，选择试用Ubuntu。</p><p>Desktop镜像打开终端，Server镜像按ALT+F2切换至终端。</p><p>首先查看并确认设备以及分区</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lsblk</span><br></pre></td></tr></table></figure><p>确认完成后切换为root用户</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> -i</span><br></pre></td></tr></table></figure><p>后面操作均以root身份操作</p><h3 id="配置LUKS2加密容器">配置LUKS2加密容器</h3><p>对系统分区进行LUKS2加密，并将其解锁。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 需要输入两次你想要设置的密码</span></span><br><span class="line">cryptsetup luksFormat --<span class="built_in">type</span> luks2 /dev/sda3</span><br></pre></td></tr></table></figure><p>打开刚刚创建的加密分区，并将其映射为&quot;cryptroot&quot;</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">cryptsetup open /dev/sda3 cryptroot</span><br></pre></td></tr></table></figure><h3 id="格式化并创建Btrfs子卷">格式化并创建Btrfs子卷</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 格式化EFI分区为 FAT32</span></span><br><span class="line">mkfs.fat -F32 /dev/sda1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 格式化boot分区为Ext4</span></span><br><span class="line">mkfs.ext4 /dev/sda2</span><br><span class="line"></span><br><span class="line"><span class="comment"># 将解密后的映射设备格式化为Btrfs</span></span><br><span class="line">mkfs.btrfs /dev/mapper/cryptroot</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">mount /dev/mapper/cryptroot /mnt</span><br><span class="line">btrfs subvolume create /mnt/@</span><br><span class="line">btrfs subvolume create /mnt/@home</span><br><span class="line">umount /mnt</span><br></pre></td></tr></table></figure><h3 id="重新挂载目录树">重新挂载目录树</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">mount -o subvol=@ /dev/mapper/cryptroot /mnt</span><br><span class="line"><span class="built_in">mkdir</span> -p /mnt/home</span><br><span class="line">mount -o subvol=@home /dev/mapper/cryptroot /mnt/home</span><br><span class="line">mount /dev/sda2 /mnt/boot</span><br><span class="line">mount /dev/sda1 /mnt/boot/efi</span><br></pre></td></tr></table></figure><h3 id="解压SquashFS">解压SquashFS</h3><p>在<code>/cdrom/casper/</code>下，寻找后缀为<code>.squashfs</code>的核心系统文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -lh /cdrom/casper/*.squashfs</span><br></pre></td></tr></table></figure><p>Server版通常叫<code>ubuntu-server-minimal.squashfs</code>，桌面版可能叫<code>filesystem.squashfs</code></p><p>将这个文件挂载出来</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mkdir</span> -p /tmp/squashfs</span><br><span class="line">mount -o loop /cdrom/casper/ubuntu-server-minimal.squashfs /tmp/squashfs</span><br></pre></td></tr></table></figure><h3 id="同步系统">同步系统</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">rsync -aAXv /tmp/squashfs/ /mnt/</span><br></pre></td></tr></table></figure><p>同步完成后解除挂载</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">umount /tmp/squashfs</span><br></pre></td></tr></table></figure><h3 id="Chroot">Chroot</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> /dev /dev/pts /proc /sys /run; <span class="keyword">do</span> mount -B <span class="variable">$i</span> /mnt<span class="variable">$i</span>; <span class="keyword">done</span></span><br><span class="line"><span class="built_in">chroot</span> /mnt /bin/bash</span><br></pre></td></tr></table></figure><h3 id="最小配置">最小配置</h3><p>配置DNS</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">rm</span> -f /etc/resolv.conf</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;nameserver 223.5.5.5&quot;</span> &gt; /etc/resolv.conf</span><br></pre></td></tr></table></figure><p>配置普通用户（不建议直接使用root用户）</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">adduser your_username</span><br><span class="line">usermod -aG <span class="built_in">sudo</span> your_username</span><br></pre></td></tr></table></figure><p>配置软件源</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ resolute main restricted universe multiverse&quot;</span> &gt; /etc/apt/sources.list</span><br><span class="line">apt update</span><br></pre></td></tr></table></figure><h3 id="补齐缺少软件包">补齐缺少软件包</h3><p>安装核心套件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install linux-image-generic grub-efi-amd64 cryptsetup-initramfs btrfs-progs -y</span><br></pre></td></tr></table></figure><p>安装桌面环境</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">apt install ubuntu-desktop^ -y</span><br></pre></td></tr></table></figure><h3 id="配置fstab与crypttab">配置fstab与crypttab</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 写入crypttab</span></span><br><span class="line">LUKS_UUID=$(blkid -s UUID -o value /dev/sda3)</span><br><span class="line"><span class="built_in">echo</span> <span class="string">&quot;cryptroot UUID=<span class="variable">$&#123;LUKS_UUID&#125;</span> none luks,discard&quot;</span> &gt; /etc/crypttab</span><br><span class="line"></span><br><span class="line"><span class="comment"># 写入fstab</span></span><br><span class="line">BTRFS_UUID=$(blkid -s UUID -o value /dev/mapper/cryptroot)</span><br><span class="line">BOOT_UUID=$(blkid -s UUID -o value /dev/sda2)</span><br><span class="line">EFI_UUID=$(blkid -s UUID -o value /dev/sda1)</span><br><span class="line"></span><br><span class="line"><span class="built_in">cat</span> &lt;&lt;<span class="string">EOF &gt; /etc/fstab</span></span><br><span class="line"><span class="string">UUID=$&#123;BTRFS_UUID&#125; / btrfs subvol=@,defaults,discard=async 0 0</span></span><br><span class="line"><span class="string">UUID=$&#123;BTRFS_UUID&#125; /home btrfs subvol=@home,defaults,discard=async 0 0</span></span><br><span class="line"><span class="string">UUID=$&#123;BOOT_UUID&#125; /boot ext4 defaults 0 2</span></span><br><span class="line"><span class="string">UUID=$&#123;EFI_UUID&#125; /boot/efi vfat umask=0077 0 1</span></span><br><span class="line"><span class="string">EOF</span></span><br></pre></td></tr></table></figure><h3 id="生成引导">生成引导</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">update-initramfs -u -k all</span><br><span class="line">grub-install /dev/sda</span><br><span class="line">update-grub</span><br></pre></td></tr></table></figure><h3 id="安全启动（可选）">安全启动（可选）</h3><p>这时的引导是没有签名的，如果BIOS开启了安全启动将无法引导，如果有安全启动需求可以安装带签名的GRUB和Shim模块</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">apt install grub-efi-amd64-signed shim-signed -y</span><br><span class="line">grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=ubuntu</span><br><span class="line">update-grub</span><br></pre></td></tr></table></figure><p>最后退出并重启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">exit</span></span><br><span class="line">umount -R /mnt</span><br><span class="line">reboot</span><br></pre></td></tr></table></figure><h3 id="设置中文">设置中文</h3><p>此时系统是英文的，可以在设置里安装Chinese语言包，然后</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> localectl set-locale LANG=zh_CN.UTF-8</span><br></pre></td></tr></table></figure><h3 id="删除Snap（可选）">删除Snap（可选）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt purge snapd -y</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf ~/snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /var/snap</span><br><span class="line"><span class="built_in">sudo</span> <span class="built_in">rm</span> -rf /var/lib/snapd</span><br></pre></td></tr></table></figure><p>安装桌面环境时虽然日志中有安装snap和snap的firefox之类的组件</p><p>但是进入桌面后却没看到任何snap应用，包括应用商店，不过snap服务还是在的</p><h3 id="Bug解决">Bug解决</h3><p>systemd-networkd-wait-online.service卡开机问题</p><p>取消开机自启</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> systemctl <span class="built_in">disable</span> systemd-networkd-wait-online.service</span><br><span class="line"><span class="built_in">sudo</span> systemctl mask systemd-networkd-wait-online.service</span><br></pre></td></tr></table></figure><h3 id="安装Timeshift">安装Timeshift</h3><p>玩Btrfs当然少不了Timeshift</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install timeshift -y</span><br></pre></td></tr></table></figure><h3 id="安装Flatpak（可选）">安装Flatpak（可选）</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br><span class="line"><span class="built_in">sudo</span> apt install flatpak -y</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install gnome-software gnome-software-plugin-flatpak -y</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">flatpak remote-add --if-not-exists flathub https://dl.flathub.org/repo/flathub.flatpakrepo</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;Ubuntu官方的安装器手动安装下只能识别普通设备分区，并不能把系统安装在mapper设备上。&lt;/p&gt;
&lt;p&gt;这篇教程非新手教程，需要有一定相关知识积累。&lt;/p&gt;
&lt;p&gt;新手建议走官方启动器安装流程。&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Software" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Software/"/>
    
    
    <category term="Ubuntu" scheme="https://blog.goodboyboy.top/tags/Ubuntu/"/>
    
    <category term="Btrfs" scheme="https://blog.goodboyboy.top/tags/Btrfs/"/>
    
    <category term="LUKS2" scheme="https://blog.goodboyboy.top/tags/LUKS2/"/>
    
  </entry>
  
  <entry>
    <title>主域名服务不稳定通知</title>
    <link href="https://blog.goodboyboy.top/posts/630772453.html"/>
    <id>https://blog.goodboyboy.top/posts/630772453.html</id>
    <published>2026-05-27T14:41:44.000Z</published>
    <updated>2026-05-27T14:41:44.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>由于阿里云公网权威解析服务免费版即将限速，为保障各项服务稳定，计划将托管于阿里云的主域名<code>goodboyboy.top</code>DNS解析进行迁移。</p><p>主域名<code>goodboyboy.top</code> DNS解析于 2026-5-26 晚开始迁移</p><p>原定迁移至华为云，但出现海外IP无法正常解析问题。因此计划重新迁移至CloudFlare。</p><p>目前主域名<code>goodboyboy.top</code>DNS解析已全部迁移至CloudFlare，由于NS记录缓存问题，NS记录同步全球最长需要48小时，因此在接下来的48小时内主域名下的各项服务质量可能会下降，包括<code>Gravatar 头像加速</code>、<code>Steam 卡片生成</code>等服务。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;由于阿里云公网权威解析服务免费版即将限速，为保障各项服务稳定，计划将托管于阿里云的主域名&lt;code&gt;goodboyboy.top&lt;/code&gt;DNS解析进行迁移。&lt;/p&gt;
&lt;p&gt;主域名&lt;code&gt;goodboyboy.top&lt;/cod</summary>
      
    
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
    
  </entry>
  
  <entry>
    <title>腾讯元宝客户端实习二面凉经</title>
    <link href="https://blog.goodboyboy.top/posts/3668760505.html"/>
    <id>https://blog.goodboyboy.top/posts/3668760505.html</id>
    <published>2026-05-19T10:10:36.000Z</published>
    <updated>2026-05-19T10:10:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="二编">二编</h2><blockquote><p>已凉</p></blockquote><h2 id="前言">前言</h2><p>最近身体不太舒服（体测，一生之敌），感觉今天面试发挥一般般</p><h2 id="正文">正文</h2><h3 id="算法相关">算法相关</h3><p>这次不是手撕了，而是根据场景选择合适的数据结构来完成场景任务。</p><p>场景任务为选择一个合适的数据结构维护一个top10的热搜词，还有千亿级的搜索词</p><p>因为之前从来没有接触过这类问题，前半段答得牛头不对马嘴😭</p><p>后面经过面试官持续描述，加上说到O（1）的时间复杂度，才想起哈希表qwq</p><p>然后关于top10热搜词，我想到了二叉树，然后就是堆，但是我之前堆接触的比较少，凭着记忆以为是最大堆，后面面试官说应该是最小堆（）</p><h3 id="项目相关">项目相关</h3><p>提问：MVC、MVP、MVVM、MVI是什么，有什么区别</p><p>这个问题我会，属于是八股内容了，然而接下来问题让我懵了</p><p>那MVVM有哪些缺点？如果一个简单的应用，不考虑activity生命周期以及屏幕旋转，是用MVVM好还是MVC好？</p><p>说实话我之前还真没觉得MVVM这种架构有什么缺点，它基本上解决了Android APP MVC架构下各种耦合、引用持有问题，而且平常也没有那种极致渲染要求场景，确实是没考虑到。</p><p>面试官的回答是MVC架构更简单，MVVM有一层封装，会有额外的性能开销。确实，对于这种人为限定场景来说，MVC确实比MVVM合适。</p><p>提问：协程和线程有什么区别</p><p>这个问题属于八股内容，八股答法+结合自己的理解</p><p>提问：协程是否能实现真正的并发，再加上额外限制例如单核CPU。</p><p>当时脑子不在状态，答得不是很好。这个具体看实现，而且并发和并行是两个概念，想要实现真正的并行那确实是需要多核CPU，但是并发只需要多个任务同时执行，通过切分CPU时间片达到并发任务执行。而协程是建立在线程之上的，如果按照并发设计是可以实现真正的并发的。</p><p>提问：协程和线程哪个是用户态，哪个是内核态</p><p>这个没什么异议，协程底层就是一个线程池，本质是一个状态机，没有系统调用等开销，运行在用户态。而线程需要通过系统调用和系统进行交互，开销大。</p><p>提问：activity生命周期，activity跳转的生命周期</p><p>依旧是八股问题，第一个答对了，第二个之前看过但是忘记了qwq，面试官叫我面试完自己试试😭</p><p>提问：Compose重组发生在什么时候，如何避免无效的重组（终于有compose的内容了qwq）</p><p>直接秒了</p><p>提问：http中1.x，2.x，3.x有什么区别。分别优化了什么</p><p>秒了</p><p>追问：http2.x相较于http1.x，内容传输上有什么不同</p><p>这个确实是忘了，主要是变成了二进制传输来连接复用</p><p>提问：询问项目缓存机制</p><p>秒了</p><p>提问：列表如何进行缓存设计</p><p>答得不是很好，一个是语言组织上，另一个是没回答完全，只说到了本地缓存，后面面试官说可以做二级缓存，使用内存进行缓存才恍然大悟。</p><p>提问：平常哪些场景使用了AI Coding</p><p>劈里啪啦说了一大堆，过</p><p>最后反问</p><h2 id="后记">后记</h2><p>这次发挥的不是很好，希望能过吧qwq</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;二编&quot;&gt;二编&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;已凉&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近身体不太舒服（体测，一生之敌），感觉今天面试发挥一般般&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;h3 id</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
    
    
    <category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
    
    <category term="腾讯" scheme="https://blog.goodboyboy.top/tags/%E8%85%BE%E8%AE%AF/"/>
    
  </entry>
  
  <entry>
    <title>腾讯元宝客户端实习一面面经</title>
    <link href="https://blog.goodboyboy.top/posts/2566688502.html"/>
    <id>https://blog.goodboyboy.top/posts/2566688502.html</id>
    <published>2026-05-12T02:58:59.000Z</published>
    <updated>2026-05-12T02:58:59.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>相较于搜狗输入法那场面试的面试官，这次的面试官明显就对我感兴趣很多了，和面试官互动得很深入。</p><p>依旧是深度定制DIY面试，无八股盛宴</p><h2 id="正文">正文</h2><h3 id="手撕环节">手撕环节</h3><p>无自我介绍，上来直接开始手撕代码</p><p>题目是二维矩阵最优寻找target数（<a href="https://leetcode.cn/problems/search-a-2d-matrix-ii">240. 搜索二维矩阵 II</a>）</p><p>虽然leetcode做过，但是测试程序依旧是不支持Kotlin，面试官说可以用Java，然鹅我Java都忘得差不多了😂</p><p>没办法，最后面试官让我用JavaScript写，不得不说，JavaScript和Kotlin在基础语法上真的就大差不差，直接救我老命😂</p><p>虽然基础语法上大差不差，但是细节上坑死我了，把console.print写成print，把数组长度的length写成size和size()，在那里测试半天，最后还是面试官提醒我该怎么写🥹</p><p>最后代码出来了，但是边界条件没做好，又卡半天，面试官又善良的提醒了我一下while的边界条件，才把题目A掉。（面试官太善良了🥹）</p><p>本来面试官打算出第二道题的，看时间有点不够了，便结束了手撕环节</p><h3 id="项目盘点环节">项目盘点环节</h3><p>先是让我介绍一下简历里的两个项目，挑重点讲。于是我便快速的过了一遍项目重点和难点。</p><p>然后问了下简历中写的项目优化是怎么优化的</p><p>接着问了下项目用户受众情况</p><p>询问了下项目缓存的实现逻辑以及缓存过期逻辑</p><p>询问了下如何处理宽屏分辨率问题（答得不是很好，因为这块代码是AI写的（doge））</p><h3 id="Kotlin相关知识">Kotlin相关知识</h3><p>Kotlin中的suspend是怎么挂起的，它是线程安全的吗？</p><p>这个前半段有点问道我盲点了，后面问了下Gemini，Gemini是这样说的：</p><details class="toggle" style="border: 1px solid bg"><summary class="toggle-button" style="background-color: bg;color: color">Gemini回答</summary><div class="toggle-content"><p>简单来说：<strong><code>suspend</code> 的挂起是通过“状态机（State Machine）”和“续体传递风格（CPS 变换）”实现的；而 <code>suspend</code> 关键字本身绝对不是线程安全的。</strong></p><p>一、 <code>suspend</code> 是怎么挂起的？（底层原理）</p><p><code>suspend</code> 实际上是一个<strong>编译器魔法</strong>。当你在 Kotlin 中写下一个 <code>suspend</code> 函数时，编译器会在后台对代码进行大幅度的重写。它并不会真正去“阻塞”或“休眠”底层的操作系统线程，而是将函数切分成了多个片段。</p><p>具体来说，编译器做了以下三件事：</p><ol><li>CPS 变换 (Continuation-Passing Style)</li></ol><p>编译器会在你的 <code>suspend</code> 函数签名中，默默追加一个隐藏的参数：<code>Continuation</code>（续体）。<br><code>Continuation</code> 可以理解为“后续的代码”或“一个书签”，它保存了函数恢复执行时需要的所有上下文。</p><ul><li><strong>你的代码：</strong></li></ul><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">suspend</span> <span class="function"><span class="keyword">fun</span> <span class="title">getUserInfo</span><span class="params">(id: <span class="type">String</span>)</span></span>: User</span><br><span class="line"></span><br></pre></td></tr></table></figure><ul><li><strong>编译器眼里的代码（伪代码）：</strong></li></ul><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Object <span class="title function_">getUserInfo</span><span class="params">(String id, Continuation&lt;User&gt; cont)</span></span><br><span class="line"></span><br></pre></td></tr></table></figure><p><em>(注：返回值变成了 <code>Object</code>，因为它可能返回真实结果，也可能返回一个特殊的挂起标志。)</em></p><ol start="2"><li>生成状态机 (State Machine)</li></ol><p>编译器会把你函数内部的代码，以其他的 <code>suspend</code> 函数调用为“分界点”，切分成多个状态（label）。</p><p>假设你有这样一段代码：</p><figure class="highlight kotlin"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">suspend</span> <span class="function"><span class="keyword">fun</span> <span class="title">fetchData</span><span class="params">()</span></span> &#123;</span><br><span class="line">    println(<span class="string">&quot;Start&quot;</span>)</span><br><span class="line">    <span class="keyword">val</span> token = requestToken()      <span class="comment">// 挂起点 1</span></span><br><span class="line">    <span class="keyword">val</span> <span class="keyword">data</span> = requestData(token)   <span class="comment">// 挂起点 2</span></span><br><span class="line">    println(<span class="string">&quot;Result: <span class="variable">$data</span>&quot;</span>)</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><p>编译器会把它变成类似下面这样的<strong>状态机（伪代码）</strong>：</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line">Object <span class="title function_">fetchData</span><span class="params">(Continuation cont)</span> &#123;</span><br><span class="line">    <span class="comment">// 提取状态机和局部变量</span></span><br><span class="line">    <span class="type">StateMachine</span> <span class="variable">sm</span> <span class="operator">=</span> cont; </span><br><span class="line">    </span><br><span class="line">    <span class="keyword">switch</span> (sm.label) &#123;</span><br><span class="line">        <span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line">            println(<span class="string">&quot;Start&quot;</span>);</span><br><span class="line">            sm.label = <span class="number">1</span>; <span class="comment">// 准备进入下一个状态</span></span><br><span class="line">            <span class="comment">// 调用挂起函数，如果它真挂起了，立刻 return 释放当前线程</span></span><br><span class="line">            <span class="keyword">if</span> (requestToken(sm) == COROUTINE_SUSPENDED) <span class="keyword">return</span> COROUTINE_SUSPENDED;</span><br><span class="line">            </span><br><span class="line">        <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">            <span class="comment">// 恢复执行时，提取上一步的结果</span></span><br><span class="line">            <span class="type">String</span> <span class="variable">token</span> <span class="operator">=</span> (String) sm.result; </span><br><span class="line">            sm.label = <span class="number">2</span>;</span><br><span class="line">            <span class="keyword">if</span> (requestData(token, sm) == COROUTINE_SUSPENDED) <span class="keyword">return</span> COROUTINE_SUSPENDED;</span><br><span class="line">            </span><br><span class="line">        <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">            <span class="type">String</span> <span class="variable">data</span> <span class="operator">=</span> (String) sm.result;</span><br><span class="line">            println(<span class="string">&quot;Result: &quot;</span> + data);</span><br><span class="line">            <span class="keyword">return</span> Unit;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><ol start="3"><li>挂起与恢复 (Suspend &amp; Resume)</li></ol><ul><li><strong>挂起（Suspend）：</strong> 当代码执行到 <code>requestToken()</code> 并真正需要等待（比如网络 IO）时，它会向上一层返回一个特殊的标志 <code>COROUTINE_SUSPENDED</code>。这个标志会一路 <code>return</code> 到最外层，<strong>从而把当前的 CPU 线程释放出来</strong>，让线程可以去干别的事情（比如更新 UI 或处理其他协程）。</li><li><strong>恢复（Resume）：</strong> 当网络请求完成时，底层系统（比如回调机制）会调用 <code>Continuation.resumeWith(result)</code>。这会重新触发 <code>fetchData</code> 函数，由于 <code>sm.label</code> 已经变成了 1，代码会直接 <code>switch</code> 到 <code>case 1</code> 继续执行，并带入了网络请求的结果。</li></ul><p><strong>生活中的比喻：</strong><br>就像你看书时遇到了一个不懂的词（<strong>挂起点</strong>），你夹入一个书签（<strong>保存 Continuation 状态</strong>），然后合上书去查字典。在这个期间，你的大脑（<strong>线程</strong>）可以去喝水、听歌（<strong>执行其他任务</strong>）。查到意思后，你翻开书签那一页（<strong>Resume 恢复</strong>），继续往下读。</p></div></details><p>后半段我有点没懂面试官意思，以为面试官是说协程本身是不是线程安全的。</p><p>这就让我有点懵，这就好比你问线程本身是不是线程安全的这种问题</p><p>后面我知道了面试官是问用协程去操作一个变量是不是线程安全的，那当然是非线程安全的啦，这和线程并发出现竞争是一个道理。不过感觉答得不是很好</p><p>然后就是问Kotlin中和UI实现状态的同步是怎么做的。</p><p>我的回答就是用Kotlin的StateFlow，Compose会collect ViewModel中的StateFlow，根据StateFlow传来的变化而变化之类的，感觉答的不是很好。</p><p>接着就是问是否有用过传统Android XML UI。答：有用过，不过后来转Kotlin+Compose了。</p><h3 id="AI相关知识">AI相关知识</h3><p>根据我的项目提问，询问在使用AI编程的时候如何节省Token。</p><p><a href="http://xn--AIAGENT-xm9kn51bc8qnzkga718kz34c6opk0em9som7c.md">我回答是让AI编程工具生成AGENT.md</a>，GEMINI.md等文件，提前读取项目整个架构，避免AI无意义的搜索整个项目，然后每次给出清晰的指令，避免给出模糊的指令，以及模块化编程，避免AI大范围搜索和改动。</p><p>然后面试官询问Skill和MCP哪个用的token较少。</p><p>这当然是Skill啦，Skill当初提出就是为了解决MCP占用上下文过多的问题</p><p>最后问我用过哪些Agent，Agent是什么。</p><p>我目前接触的Agent就Copilot、Codex里面这些自带的Plan、Build这些Agent，没自己做过Agent，所以后半段答得不是很好。</p><h3 id="反问环节">反问环节</h3><p>依旧是询问团队是用Java用的比较多还是Kotlin比较多</p><p>回答不出意外，已有代码用Java，新代码用Kotlin（咳特灵还是太好用了，有效治疗Java带来的偏头痛，以至于我完全不想用Java（逃））</p><h2 id="面试小插曲">面试小插曲</h2><p>因为实验室刚搬迁，网络设施还没弄好，于是只能用手机热点给电脑共享网络。结果面试到一半时突然网络卡顿，立马查了用腾讯会议自带的网络检查功能检查，发现网络有问题，看了下手机，结果是逆天中信（为什么逆天之后说）打来的电话，把我网络顶掉了（有电话时移动数据会被顶掉），想都没想直接挂掉😡</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;相较于搜狗输入法那场面试的面试官，这次的面试官明显就对我感兴趣很多了，和面试官互动得很深入。&lt;/p&gt;
&lt;p&gt;依旧是深度定制DIY面试，无八股盛宴&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;h3 id=&quot;手撕环节&quot;&gt;手撕环节&lt;/</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
    
    
    <category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
    
    <category term="腾讯" scheme="https://blog.goodboyboy.top/tags/%E8%85%BE%E8%AE%AF/"/>
    
  </entry>
  
  <entry>
    <title>对越来越多AI博文的看法</title>
    <link href="https://blog.goodboyboy.top/posts/983973987.html"/>
    <id>https://blog.goodboyboy.top/posts/983973987.html</id>
    <published>2026-05-05T04:23:58.000Z</published>
    <updated>2026-05-05T04:23:58.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>自今年年初小龙虾火了之后，我发现各个平台上有着越来越多的AI文章，最后我甚至在部分博客上也看到AI文章</p><p>所以我想借此机会谈一谈我对AI文章的看法</p><h2 id="看法">看法</h2><p>首先，我并不是抵制AI，AI确实是可以很大程度提升我们的工作效率，对于日常的一些知识问题，我也都会去找AI询问。</p><p>但是，有些人却只是用几句提示词，甚至只是一个想法，就利用AI生产一篇AI文，然后不加思考，不加总结的就把AI的产出内容完全的照搬到文章上，把AI的“思考”作为自己的思考展现给大家。</p><p>我觉得，作为读者阅读一篇文章，本质是和作者的思维进行碰撞，通过文章与作者进行交流。</p><p>如果一篇文章通篇都是AI写的，没有作者的思考，没有作者的总结，这难道不就是我和AI进行交流吗？既然是我和AI进行交流，那我为什么不自己去问AI呢？如果我自己去问AI，我得到的答案可能还更细致，更符合我自己的需求。</p><p>就像和一个人辩论，对方拿着AI和你辩论，他把AI不是当作工具，检查自己和对方的述说有什么漏洞，而是直接让AI代替自己思考，AI说什么他就说什么，那本质上我不就是和AI进行辩论？这样的话我也拿AI，让AI和AI去辩论，那这还有什么意思呢。</p><p>当然，如果是商业化文章，只为满足甲方的快速产出，AI确实是一个很好的提效工具。但是，有些博客博主也这样做，我就有些疑问，写博文难道不是沉下心来慢慢写吗，好像也没有商业化的效率需求吧？</p><p>如果说，写博文是一种任务，是一种需要提效的负担，我觉得还不如不写，停更一段时间更好。</p><p>另外，有些作者可能文笔不是很好，想要借AI来优化一下自己文章，出发点上这当然是没有问题的。但是有些时候，AI优化出来的遣词造句，我觉得反而更没有让我阅读的兴趣。例如什么<code>不是……也不是……而是……</code>、分点加粗、文章格式千篇一律等等问题，都需要作者用心去做提示词调整，如果只是单纯的让AI“优化一下我的文章”，产出的文章大概率是AI味很浓的文章。</p><h2 id="做法">做法</h2><p>对于社交平台上的AI文章，我大抵是没有什么兴趣的。通知类的，有效信息差不多也就是标题和文章末尾了。科普类的，有兴趣的就大抵看一下，然后自己问AI。商单类的，我是看都懒得看。</p><p>对于博客上的AI文章，我的要求会更严格。毕竟，我来这里不是来看AI同质化文章的，不然我为何不去社交平台上看。</p><h2 id="最后">最后</h2><p>最后，我想说的是，不要忘记自己建博客，写博文的初衷。如果任由没有一点自己思考的AI文章充斥自己的博客，那这还是你自己的博客吗？</p><h2 id="后记">后记</h2><p>这篇文章读下来，有些人可能会觉得我傲慢。</p><p>但至少，通过这篇文章传递的，是我的思考。</p><p>但至少，通过这篇文章交流的，是我而不是“它”。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;自今年年初小龙虾火了之后，我发现各个平台上有着越来越多的AI文章，最后我甚至在部分博客上也看到AI文章&lt;/p&gt;
&lt;p&gt;所以我想借此机会谈一谈我对AI文章的看法&lt;/p&gt;
&lt;h2 id=&quot;看法&quot;&gt;看法&lt;/h2&gt;
&lt;p&gt;首先，我并不是抵制A</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="博客" scheme="https://blog.goodboyboy.top/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="AI" scheme="https://blog.goodboyboy.top/tags/AI/"/>
    
  </entry>
  
  <entry>
    <title>GoodBoyboy Blog、Talk联动成功</title>
    <link href="https://blog.goodboyboy.top/posts/1749152833.html"/>
    <id>https://blog.goodboyboy.top/posts/1749152833.html</id>
    <published>2026-05-01T14:28:04.000Z</published>
    <updated>2026-05-01T14:28:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>博客现已接入 <a href="https://talk.furwolf.com/">GoodBoyboy Talk</a> 说说功能，将会在右侧侧边栏实时同步说说内容</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;博客现已接入 &lt;a href=&quot;https://talk.furwolf.com/&quot;&gt;GoodBoyboy Talk&lt;/a&gt; 说说功能，将会在右侧侧边栏实时同步说说内容&lt;/p&gt;
</summary>
      
    
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
    
  </entry>
  
  <entry>
    <title>只有失去了才会懂得珍惜，但幸好我还没有失去</title>
    <link href="https://blog.goodboyboy.top/posts/4025561226.html"/>
    <id>https://blog.goodboyboy.top/posts/4025561226.html</id>
    <published>2026-04-30T12:20:48.000Z</published>
    <updated>2026-04-30T12:20:48.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="NULL">NULL</h2><p>曾几何时，我彷徨过，也悲伤过</p><p>胡思乱想，郁郁寡欢</p><p>想要证明自己，想要一个完美的自己</p><p>为此不断舍弃，只为尽快实现目标</p><p>它很光鲜亮丽，让我无比向往</p><p>它很遥远，让我望不可及</p><p>它带给我的不再是希望，满足，而是欲望，焦虑</p><p>迷茫之际，那个曾被我遗忘在角落的，接纳了我</p><p>让我放下了执念，看清了自己</p><p>让我明白，我不是一个人在前进</p><p>让我学会，接纳不完美的自己</p><p>正如只有失去了才会懂得珍惜</p><p>但幸好我还没有失去</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;NULL&quot;&gt;NULL&lt;/h2&gt;
&lt;p&gt;曾几何时，我彷徨过，也悲伤过&lt;/p&gt;
&lt;p&gt;胡思乱想，郁郁寡欢&lt;/p&gt;
&lt;p&gt;想要证明自己，想要一个完美的自己&lt;/p&gt;
&lt;p&gt;为此不断舍弃，只为尽快实现目标&lt;/p&gt;
&lt;p&gt;它很光鲜亮丽，让我无比向往&lt;/p&gt;
&lt;p&gt;它很遥远，让</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
  </entry>
  
  <entry>
    <title>滴滴Android客户端一面凉经</title>
    <link href="https://blog.goodboyboy.top/posts/3466962992.html"/>
    <id>https://blog.goodboyboy.top/posts/3466962992.html</id>
    <published>2026-04-29T07:34:49.000Z</published>
    <updated>2026-04-29T07:34:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>终于是更新了，但是是凉经😢</p><h2 id="正文">正文</h2><p>首先是自我介绍，介绍一下自己。</p><p>然后是项目盘点：</p><ul><li>项目介绍</li><li>询问项目细节</li></ul><p>接着是八股盛宴</p><ul><li>有用过Handler吗，介绍一下Handler，Handler和Looper之间的关系</li><li>为什么Looper不会造成阻塞</li><li>epoll底层机制是怎么样的</li><li>Android XML和Compose的区别</li><li>Compose 声明式UI和XML命令式UI有什么区别</li><li>有了解过跨端吗</li><li>你用过哪些架构，了解过MVC、MVP吗？介绍一下MVC、MVP、MVVM</li><li>Android四大件是什么，分别是干什么的</li><li>如何和Service交互，正常启动Service和bindService启动有什么区别</li><li>有了解过哪些设计模式（这里没答上来，面试官后面继续问）</li><li>什么是单例模式，单例模式有哪几种（依旧是脑抽没答上来）</li><li>知道什么是懒汉式？（这里想到有懒汉式和饿汉式，但是还是紧张忘记了，一顿乱答（悲））</li><li>了解过建造者模式吗？（意识到是Builder之类的，答对了一半吧，后面又是一顿乱答）</li><li>知道工厂模式吗？（依旧是忘记了然后胡言乱语😢）</li><li>了解过HashMap吗？他是线程安全的吗？（这里HashMap有点忘记了，不过大部分答对了，引出ConcurrentHashMap，但其实这里面试官想问的是HashTable）</li><li>那你说的ConcurrentHashMap和HashTable有什么区别吗？（属于给自己挖坑了）</li><li>有用过哪些布局（这里答的不是很好，因为很久没写XML了，基本上都是Compose）</li><li>说一下RecycleView缓存机制（依旧是给自己挖坑，答得一坨）</li><li>说一下什么是线程死锁，产生死锁的条件</li><li>说一下View的渲染流程（还是答得一坨，答到activity生命周期去了）</li></ul><p>最后一道算法题，面试官手出，可能是当时面试官也没准备什么特别难的题目，就leecode的一个两数之和，直接秒了。</p><p>最后反问</p><h2 id="结局">结局</h2><p>成功进入人才储备库（垃圾桶），原因是岗位不匹配</p><p>其实当时反问环节就差不多知道结局了，他们团队大部分用的还是Kotlin+XML，而且之后打算向跨端flutter方向发展，迁移成Compose的化工程量太大</p><h2 id="后记">后记</h2><p>人生的第一次面试，感觉体验不错（至于为什么等这几天更新腾讯一面面经就知道了），至少一场面试下来能很好的发现自己有哪些八股还掌握不牢，和面试官互动还是很深入的。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;终于是更新了，但是是凉经😢&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&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;/ul</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="面试" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E9%9D%A2%E8%AF%95/"/>
    
    
    <category term="面试" scheme="https://blog.goodboyboy.top/tags/%E9%9D%A2%E8%AF%95/"/>
    
    <category term="滴滴" scheme="https://blog.goodboyboy.top/tags/%E6%BB%B4%E6%BB%B4/"/>
    
    <category term="Android客户端" scheme="https://blog.goodboyboy.top/tags/Android%E5%AE%A2%E6%88%B7%E7%AB%AF/"/>
    
  </entry>
  
  <entry>
    <title>GoodBoyboy &#39;s Talk上线！</title>
    <link href="https://blog.goodboyboy.top/posts/3509156966.html"/>
    <id>https://blog.goodboyboy.top/posts/3509156966.html</id>
    <published>2026-04-23T14:16:08.000Z</published>
    <updated>2026-04-23T14:16:08.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>采用 <a href="https://github.com/GoodBoyboy666">EasyDrop</a> 搭建的 <a href="https://talk.furwolf.com/">GoodBoyboy 's Talk</a> 正式上线！</p><p>后续我将会在GoodBoyboy 's Talk上更新说说相关内容，欢迎大家来玩😄</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;采用 &lt;a href=&quot;https://github.com/GoodBoyboy666&quot;&gt;EasyDrop&lt;/a&gt; 搭建的 &lt;a href=&quot;https://talk.furwolf.com/&quot;&gt;GoodBoyboy &#39;s Talk</summary>
      
    
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/categories/%E5%85%AC%E5%91%8A/"/>
    
    
    <category term="公告" scheme="https://blog.goodboyboy.top/tags/%E5%85%AC%E5%91%8A/"/>
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="EasyDrop" scheme="https://blog.goodboyboy.top/tags/EasyDrop/"/>
    
  </entry>
  
  <entry>
    <title>Easy Drop——一个基于Gin开发的高性能、轻量级说说平台</title>
    <link href="https://blog.goodboyboy.top/posts/1249150699.html"/>
    <id>https://blog.goodboyboy.top/posts/1249150699.html</id>
    <published>2026-04-20T11:50:52.000Z</published>
    <updated>2026-04-20T11:50:52.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>是的没错，又开新坑了（老坑仍然在更哈</p></blockquote><h2 id="项目背景">项目背景</h2><p>用hexo这种静态博客平台不怎么方便发布零星的内容，特别是时间很碎片化的时候，基本上没什么心情更博客，就容易给人一种“假死”的状态。虽然有memos，但是感觉还是不是我喜欢的类型，所以打算自己搓一个。</p><h2 id="项目地址">项目地址</h2><p><a href="https://github.com/GoodBoyboy666/easydrop">https://github.com/GoodBoyboy666/easydrop</a></p><h2 id="项目进度">项目进度</h2><p>目前项目还在开发中，变动会比较频繁，如果想要尝鲜的朋友可以先部署玩玩</p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;是的没错，又开新坑了（老坑仍然在更哈&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;项目背景&quot;&gt;项目背景&lt;/h2&gt;
&lt;p&gt;用hexo这种静态博客平台不怎么方便发布零星的内容，特别是时间很碎片化的时候，基本上没什么心情更博客，就容易给人一种“假</summary>
      
    
    
    
    <category term="应用" scheme="https://blog.goodboyboy.top/categories/%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="Gin" scheme="https://blog.goodboyboy.top/tags/Gin/"/>
    
  </entry>
  
  <entry>
    <title>Perfect Pic —— 一个基于 Gin 开发的高性能、轻量级图床</title>
    <link href="https://blog.goodboyboy.top/posts/3951141653.html"/>
    <id>https://blog.goodboyboy.top/posts/3951141653.html</id>
    <published>2026-02-13T04:39:03.000Z</published>
    <updated>2026-02-13T04:39:03.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>假期在家无聊，和AI一起用Go搓了一个图床，边搓边学Go（doge）</p><blockquote><p>其实很久之前就想搓了awa</p></blockquote><h2 id="Perfect-Pic-是什么？">Perfect Pic 是什么？</h2><p>Perfect Pic 是一个基于 Go (Gin) 开发的高性能、轻量级图床。采用前后端分离架构，为个人或小型团队设计，提供安全可靠的图片存储、管理和分发功能。</p><h2 id="Perfect-Pic-相较于其他图床有哪些优势？">Perfect Pic 相较于其他图床有哪些优势？</h2><ul><li>采用 MIT License 开源，可以自行托管，数据完全由自己掌控。</li><li>采用Go语言开发，相较于传统PHP图床性能好，对服务器压力小。</li><li>支持SQLite、MySQL、PostgreSQL数据库，可根据实际业务场景选择。</li><li>内置内存缓存、Redis支持，提高响应速度。</li><li>前后端分离架构，可以自行编写前端，DIY可玩性高。</li><li>支持Docker部署。</li></ul><h2 id="为什么要开发-Perfect-Pic">为什么要开发 Perfect Pic</h2><p>因为自己博客需要托管图片，商业图床数据不在自己手里不放心，试了好几个开源图床，许多都是用PHP开发，对于我这种垃圾服务器来说压力不小</p><p>特别是当开启图片转换时，我的垃圾服务器可以CPU堵塞好几秒，有时候甚至图片上传失败。有些开源图床又过于臃肿，有些功能根本用不上。</p><p>最后打算自己做一个高性能图床，想吃什么自己做😋</p><h2 id="项目仓库">项目仓库</h2><p>Perfect Pic有两个仓库：</p><ul><li><a href="https://github.com/GoodBoyboy666/perfect-pic-server">perfect-pic-server</a>（后端仓库）</li><li><a href="https://github.com/GoodBoyboy666/perfect-pic-web">perfect-pic-web</a>（前端仓库）</li></ul><p>开发以后端为主，构建均在后端仓库 <a href="https://github.com/GoodBoyboy666/perfect-pic-server/releases">Releases</a> , Releases 构建分为 embed 和非 embed 版，embed版会内嵌前端，便于需求小的用户快速启动，无需额外部署前端。</p><h2 id="开发进度">开发进度</h2><p>目前大部分功能已完成设计并测试，等待系统性功能测试，感兴趣的友友可以去体验体验😄</p><p>喜欢的话麻烦顺手点个免费Star吧（小声）</p><p>仓库目前由我一人维护，开发速度可能不会很快，不过会尽快推出1.0版</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;假期在家无聊，和AI一起用Go搓了一个图床，边搓边学Go（doge）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其实很久之前就想搓了awa&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;Perfect-Pic-是什么？&quot;&gt;Perf</summary>
      
    
    
    
    <category term="应用" scheme="https://blog.goodboyboy.top/categories/%E5%BA%94%E7%94%A8/"/>
    
    
    <category term="图床" scheme="https://blog.goodboyboy.top/tags/%E5%9B%BE%E5%BA%8A/"/>
    
    <category term="Perfect Pic" scheme="https://blog.goodboyboy.top/tags/Perfect-Pic/"/>
    
  </entry>
  
  <entry>
    <title>尘封了八年的祝福</title>
    <link href="https://blog.goodboyboy.top/posts/2205649303.html"/>
    <id>https://blog.goodboyboy.top/posts/2205649303.html</id>
    <published>2026-01-25T08:31:01.000Z</published>
    <updated>2026-01-25T08:31:01.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>无意间在老妹的房间里看到了一个装满五角星折纸的小罐子。</p><p>那是我初三时一个喜欢我的女生在我生日时送给我的</p><p>那时候的我对谈恋爱并没有什么想法，收下了礼物后也没多想，就一直放在了柜子里。</p><p>拿起罐子，不知为何脑海里浮现出“这种东西很适合藏悄悄话”的念头。</p><p>仔细观察了下罐子，发现里面有一颗与众不同的星星，那是一颗画上了小太阳的星星。</p><p>我打开罐子，把那颗星星拿了出来。</p><p>打开星星，上面是一句生日祝福，以及一句</p><blockquote><p>不要忘记我哦~</p></blockquote><p>我放下纸条，心里默念了一下她的名字</p><p>嗯，没有忘记。</p><p>只是不知你现在过的如何，应该已经找到了属于自己的另一半吧。</p><p>我把纸条放回小罐子。</p><p>祝福我收到了，谢谢。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;无意间在老妹的房间里看到了一个装满五角星折纸的小罐子。&lt;/p&gt;
&lt;p&gt;那是我初三时一个喜欢我的女生在我生日时送给我的&lt;/p&gt;
&lt;p&gt;那时候的我对谈恋爱并没有什么想法，收下了礼物后也没多想，就一直放在了柜子里。&lt;/p&gt;
&lt;p&gt;拿起罐子，</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
    
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/tags/%E5%9B%9E%E5%BF%86/"/>
    
  </entry>
  
  <entry>
    <title>欢迎OPPO Pad 4 Pro加入设备大家庭</title>
    <link href="https://blog.goodboyboy.top/posts/381855102.html"/>
    <id>https://blog.goodboyboy.top/posts/381855102.html</id>
    <published>2026-01-23T13:56:02.000Z</published>
    <updated>2026-01-23T13:56:02.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>终于是拼齐了我的设备拼图😄</p><h2 id="实机照片">实机照片</h2><p><img src="https://pic.goodboyboy.top/imgs/2026/01/23/f90c1db5a0ba3b02e0b457084a6dee84.webp" alt="OPPO Pad 4 Pro"></p><h2 id="购买">购买</h2><p>本来是打算去年双十一买的，但是被国补整红温了就没买。今年国补继续，开年国补资金充足，完全不用抢国补。而且要过年了，恰逢京东发券，3000减300，优惠力度比双十一大，不枉费我等这么几个月😭。最关键的是，又开始送笔了！！！</p><p>天时地利人和，直接下单😆</p><p>12+512的配置+笔一起3099，如果去掉399的笔那裸板就是2700！2700能买到骁龙8至尊版性价比还是蛮不错的，12140mAh的电池更是爽上加爽，完全没有续航焦虑，轻度使用一天下来才用一半的电，可能是因为环境温度较低的原因，温度正常一点的话续航应该更高。</p><p>京东物流确实没得黑，十八线小县城晚上下单第二天下午就送到了，直接爽用。</p><h2 id="贴膜">贴膜</h2><p>贴膜折腾死我了，13寸是真的难贴，最后贴膜失败，钢化膜因为静电吸了一堆毛毛，网上找了下教程，发现可以用胶带处理钢化膜上的毛毛。结果在处理毛毛的时候胶带砸在钢化膜上直接给钢化膜干破了😭</p><p>没办法，只好小声询问客服能不能补发一个，没想到还真的能补发，只要补个3块运费就行😄</p><h2 id="保护壳">保护壳</h2><p>pdd上找了一圈，稍微花里胡哨一点的贵的要命，直接就是40+，最后还是选了个朴素一点的，花了我21大洋（心痛），不过亚克力透明背板确实好看，但我其实更想要来图定制（doge</p><h2 id="领取权益">领取权益</h2><p>有些预装的应用，比如画世界Pro，云记什么的，基本上都有购机权益可以领取。领取画世界Pro的设备专属权益时，发现有个是“画兽头”课程😂，原来Furry画师都喜欢用画世界Pro（doge）。只可惜自己画功稀烂，什么都不会画，还没我妹画的好😭</p><h2 id="使（tiao）用（jiao）">使（tiao）用（jiao）</h2><p>首先当然是开启Google服务！</p><p>Color OS系统没有阉割Google服务，所以安装起来特别方便。只需要在设置里启用Google服务，再在应用商店里下载个Play商店即可。</p><p>然后就是把出厂的Color OS 15更新到Color OS 16，感受宣传的“机圈德芙”😆</p><p>最后就是安装各种应用，游戏就装了一个Phigros（平板必装好吧（迫真））</p><h2 id="后记">后记</h2><p>这下终于不用每天晚上背着4斤的游戏本去实验室学习了，带个1斤的pad轻松多了🥰</p><p>不得不说13寸的屏幕用来 <s>看网课</s>（打斗地主）是真的爽（迫真）</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;终于是拼齐了我的设备拼图😄&lt;/p&gt;
&lt;h2 id=&quot;实机照片&quot;&gt;实机照片&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.goodboyboy.top/imgs/2026/01/23/f90c1db5a0ba3b02e0</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="OPPO Pad 4 Pro" scheme="https://blog.goodboyboy.top/tags/OPPO-Pad-4-Pro/"/>
    
  </entry>
  
  <entry>
    <title>官方Android11 Box系统的OrangePi 3B新增红外模块教程</title>
    <link href="https://blog.goodboyboy.top/posts/4210987115.html"/>
    <id>https://blog.goodboyboy.top/posts/4210987115.html</id>
    <published>2026-01-18T07:04:16.000Z</published>
    <updated>2026-01-23T07:10:00.000Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>教程已更新，更新日期：2026-01-23</p></blockquote><h2 id="前言">前言</h2><p>打算把手上的OrangePi 3B刷成电视盒子给家里用，但是OrangePi 3B没有板载红外模块，于是从官方店铺下单了外置红外模块和遥控器，结果到手发现官方并没有进行适配，没办法只能自己适配了</p><blockquote><p>Tips：本篇教程有点长，并且不适合小白使用</p></blockquote><h2 id="准备环节">准备环节</h2><blockquote><p>Tips：不要买OrangePi官方店铺的那个红外传感器，那是<code>红外光电二极管 (IR Photodiode)</code>，不是<code>集成红外接收头 (Integrated IR Receiver)</code>！！！</p></blockquote><h3 id="下载工具">下载工具</h3><p>进入OrangePi官网 <a href="http://www.orangepi.cn/">http://www.orangepi.cn/</a></p><p>进入OrangePi 3B的下载页面 <a href="http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html">http://www.orangepi.cn/html/hardWare/computerAndMicrocontrollers/service-and-support/Orange-Pi-3B.html</a></p><blockquote><p>Tips：OrangePi官方发布的各种资料目前基本上都在百度网盘上，建议提前准备一个SVIP账户</p></blockquote><p>找到“官方工具”，打开链接，需要下载的有：</p><ul><li>Android和Linux镜像烧录工具-RKDevTool和驱动程序</li></ul><p>下载该文件夹内所有内容。</p><p>下载 Android Image Kitchen 用于打包和解包镜像：<a href="https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/">https://xdaforums.com/t/tool-android-image-kitchen-unpack-repack-kernel-ramdisk-win-android-linux-mac.2073775/</a></p><h3 id="下载文档">下载文档</h3><p>下载最新的用户手册</p><h3 id="下载镜像">下载镜像</h3><p>下载最新带有“Android11-box”字样的镜像</p><h3 id="下载并解压Android源码">下载并解压Android源码</h3><p>下载总共25G+的Android源码分卷压缩包</p><p>校验文件md5：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">md5sum</span> -c RK356X_Android11.tar.gz.md5sum</span><br></pre></td></tr></table></figure><p>解压压缩包</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> RK356X_Android11.tar.gz0* | <span class="built_in">sudo</span> tar -xvzf - -C /目标/目录</span><br></pre></td></tr></table></figure><h3 id="准备编译环境">准备编译环境</h3><p>准备一个空余硬盘空间至少有200G+的硬盘</p><p>准备Linux编译环境，建议Ubuntu22.04，当然也可以是更新的系统，只是编译脚本会用到python2之类的，到时候也能改脚本</p><p>按照用户手册中“Android11 源码的编译方法”这节，配置好编译依赖</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y git gnupg flex bison gperf build-essential \</span><br><span class="line">zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 \</span><br><span class="line">lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev ccache \</span><br><span class="line">libgl1-mesa-dev libxml2-utils xsltproc unzip liblz4-tool</span><br></pre></td></tr></table></figure><p>如果系统较新，可能有些软件包已失效，我使用Debian13编译，替换了部分软件包：</p><p>liblz4-tool -&gt; lz4<br>libncurses5 -&gt; libncurses6 (或 libncurses-dev)<br>python -&gt; python3 + python-is-python3</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> dpkg --add-architecture i386</span><br><span class="line"><span class="built_in">sudo</span> apt-get update</span><br><span class="line"><span class="built_in">sudo</span> apt-get install -y git gnupg flex bison gperf build-essential \</span><br><span class="line">zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \</span><br><span class="line">libncurses-dev lib32ncurses-dev x11proto-dev libx11-dev lib32z1-dev ccache \</span><br><span class="line">libgl1-mesa-dev libxml2-utils xsltproc unzip lz4 python3 python-is-python3 libssl-dev</span><br></pre></td></tr></table></figure><h2 id="开始">开始</h2><p>OrangePi官方并没有对红外模块进行适配，因此需要自行编译，不过仅用编译内核，不用编译Android本体，单次编译时间压缩至2~3分钟。</p><h3 id="安装系统">安装系统</h3><p>这里我们采用修补boot的方式，所以首先需要安装完整系统。</p><p>按照用户手册中“烧录 Android 镜像到 TF 卡中的方法”这节方法，安装对应驱动，使用RKDevTool将官方原版镜像烧录OrangePi 3B中。</p><p>烧录完成后启动OrangePi 3B，插入显示器，确保系统已经能正常启动。</p><h3 id="开启开发者模式">开启开发者模式</h3><p>像普通手机那样，在设置里找到版本号多次快速点击开启开发者模式，进入开发者模式菜单，为了方便起见，这里使用网络ADB而不是USB ADB</p><h3 id="解包官方镜像">解包官方镜像</h3><p>使用RKDevTool中“高级功能”内的“解包”功能，将boot.img从官方镜像中分离，重命名为boot-official.img备用</p><h3 id="准备红外模块">准备红外模块</h3><p>红外模块一般是三个引脚，分别是VCC，GND和Signal</p><blockquote><p>官方店铺的红外模块是<code>红外光电二极管 (IR Photodiode)</code>，不是<code>集成红外接收头 (Integrated IR Receiver)</code>，请勿购买！！！请自行在淘宝上购买TSOP38238等集成红外接收头元件。</p></blockquote><p>我使用的OrangePi官方的红外模块描述写的是VCC接3.3V，但是实测下来3.3V貌似有问题无法正常工作，需要接到5V</p><p>Signal则是按照描述接在PIN37，也就是引脚图上的GPIOO3_D3脚（后面的教程均按该引脚来写）</p><p>GND引脚随便找个GND PIN就行</p><h3 id="修改前准备">修改前准备</h3><p>处理环境变量</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">export</span> BOARD=orangepi3b</span><br><span class="line"><span class="built_in">source</span> build/envsetup.sh</span><br><span class="line">lunch rk356x_box-userdebug</span><br></pre></td></tr></table></figure><h3 id="修改内核设备树-DTS">修改内核设备树 (DTS)</h3><blockquote><p>如果你使用的OrangePi官方的遥控器，可以尝试直接使用我给出的键值，避免重新编译，具体内容在<code>制作Keymap</code>一节</p></blockquote><p>在<code>kernel/arch/arm64/boot/dts/rockchip/</code>中找到<code>rk3566-orangepi-3b.dts</code>打开</p><p>在<code>/ &#123;...&#125;</code>内部新增下面配置：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">ir: ir-receiver &#123;</span><br><span class="line">    compatible = &quot;gpio-ir-receiver&quot;;</span><br><span class="line">    gpios = &lt;&amp;gpio3 RK_PD3 GPIO_ACTIVE_LOW&gt;;</span><br><span class="line">    pinctrl-names = &quot;default&quot;, &quot;sleep&quot;;</span><br><span class="line">    pinctrl-0 = &lt;&amp;ir_int&gt;;</span><br><span class="line">    pinctrl-1 = &lt;&amp;ir_int&gt;;</span><br><span class="line">    wakeup-source;</span><br><span class="line">    status = &quot;okay&quot;;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><p>在<code>&amp;pinctrl&#123;...&#125;</code>中新增下面配置：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">ir &#123;</span><br><span class="line">    ir_int: ir-int &#123;</span><br><span class="line">        rockchip,pins = &lt;3 RK_PD3 RK_FUNC_GPIO &amp;pcfg_pull_up&gt;;</span><br><span class="line">    &#125;;</span><br><span class="line">&#125;;</span><br></pre></td></tr></table></figure><h3 id="修改菜单配置">修改菜单配置</h3><p>加载默认配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> kernel</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make ARCH=arm64 rockchip_defconfig</span><br></pre></td></tr></table></figure><p>进入菜单配置页面</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">make ARCH=arm64 menuconfig</span><br></pre></td></tr></table></figure><p>进入<code>Device Drivers</code></p><p>进入<code>Remote Controller support</code>(这一项本身需要打星 *)</p><p>进入<code>Remote controller decoders</code></p><p>建议全部勾选（或者至少勾选 Enable IR raw decoder, NEC protocol, RC-6 protocol）或者你知道你的遥控器是什么协议，官方的遥控器经测试是NEC</p><p>进入<code>Remote Controller devices</code></p><p>找到<code>GPIO IR remote control</code>打星 *</p><p>按右方向键选择<code>&lt;Save&gt;</code>，回车保存为.config（默认名即可）</p><p>按<code>&lt;Exit&gt;</code>一路退出。</p><h3 id="编译">编译</h3><p>因为官方build.sh会使用默认编译config覆盖，因此我们这里覆盖默认的config</p><p>首先备份默认配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">mv</span> <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig.bak</span><br></pre></td></tr></table></figure><p>覆盖配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cp</span> .config <span class="built_in">arch</span>/arm64/configs/rockchip_defconfig</span><br></pre></td></tr></table></figure><p>开始编译</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ..</span><br><span class="line">./build.sh -K</span><br></pre></td></tr></table></figure><p>编译完成后，找到如下文件：</p><ul><li><code>Image</code> 位于<code>kernel/arch/arm64/boot/</code></li><li><code>resource.img</code> 位于<code>kernel/</code></li></ul><h3 id="关闭AVB校验">关闭AVB校验</h3><p>首先在源码里找到avbtool</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">find . -name <span class="string">&quot;avbtool&quot;</span></span><br></pre></td></tr></table></figure><p>通常是<code>external/avb/avbtool</code></p><p>然后生成禁用AVB校验的img</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">chmod</span> +x external/avb/avbtool</span><br><span class="line">python3 external/avb/avbtool make_vbmeta_image --flag 2 --padding_size 4096 --output vbmeta_disabled.img</span><br></pre></td></tr></table></figure><p>不过这个源码里带的avbtool是用python2写的，如果你的编译环境是python2没什么问题，如果是python3则会出现一些错误，可以将报错信息询问AI修改脚本解决</p><p>最后会在当前目录下生成一个几KB大小的<code>vbmeta_disabled.img</code>文件</p><h3 id="制作boot镜像">制作boot镜像</h3><p>回到Windows，将<code>boot-official.img</code>拖到<code>Android Image Kitchen</code>的<code>unpackimg.bat</code>文件上进行解包</p><p>解包完成后当前目录会多出<code>ramdisk</code>和<code>split_img</code>两个文件夹</p><p>进入<code>split_img</code>文件夹，按照下面对应表进行重命名后替换</p><ul><li>Image -&gt; boot-official.img-kernel</li><li>resource.img -&gt; boot-official.img-second</li></ul><p>然后用记事本打开<code>boot-official.img-board</code>文件，填入<code>orangepi3b</code>保存</p><p>最后双击<code>repackimg.bat</code>进行打包，得到<code>image-new.img</code>新boot镜像</p><h3 id="制作Misc镜像（可选）">制作Misc镜像（可选）</h3><p>如果进入Android Recovery模式次数过多，可能会导致直接进入Android Recovery模式，可以通过擦除Misc分区解决</p><p>生成空白misc_wipe.img：</p><figure class="highlight cmd"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">fsutil file createnew misc_wipe.img <span class="number">49152</span></span><br></pre></td></tr></table></figure><h3 id="刷入boot-img镜像">刷入boot.img镜像</h3><p>启动RKDevTool，和之前一样，跟着用户手册让OrangePi 3B进入MaskRom模式</p><p>将MiniLoaderAll烧录至SPINOR，然后切换存储至SD卡</p><p>进入“下载镜像”标签页，勾选“Boot”分区，并点击一下最右边方框，选择之前制作的<code>image-new.img</code>，然后右键空白处，选择<code>添加项</code>，在名字一栏写<code>Vbmeta</code>并勾选，同样的选择<code>vbmeta_disabled.img</code></p><p>如果制作了<code>misc_wipe.img</code>想要擦除Misc分区，同样的右键<code>新建项</code>，名字一栏写<code>Misc</code>并勾选，选择<code>misc_wipe.img</code>即可</p><p>接着点击“设备分区表”按钮，读取设备分区地址信息，这里会有几个分区没有匹配到地址，例如<code>Resource</code>，<code>Kernel</code>，<code>System</code>分区，这是正常现象，只要Boot分区和Vbmeta分区（Misc分区可选）的地址能正常读出即可</p><p>最后点击“执行”按钮刷入镜像</p><h3 id="调试">调试</h3><p>如果系统顺利启动，就已经成功一半了</p><p>确保开启了开发者模式并打开了网络ADB</p><p>如果电脑没有安装ADB，源码里的RKTool文件夹里也有ADB工具</p><p>和OrangePi 3B处于同一局域网下，连接ADB设备</p><p>不用进行配对，直接连接就行</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb connect &lt;OrangePi 3B的IP地址&gt;</span><br></pre></td></tr></table></figure><p>连接上后进入shell</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">adb shell</span><br></pre></td></tr></table></figure><p>切换至root</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">su</span><br></pre></td></tr></table></figure><p>首先检查内核配置</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">zcat /proc/config.gz | grep -i <span class="string">&quot;CONFIG_IR_GPIO_CIR&quot;</span></span><br></pre></td></tr></table></figure><p>正确情况下会输出<code>CONFIG_IR_GPIO_CIR=y</code>，代表内核已经启用</p><p>然后查看设备节点是否有红外设备</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">ls</span> -d /sys/firmware/devicetree/base/ir*</span><br></pre></td></tr></table></figure><p>正确情况下会输出<code>ir-receiver</code>之类的设备文件夹</p><p>进入该文件夹，读取<code>compatible</code>和<code>status</code></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cat</span> compatible</span><br><span class="line"><span class="comment"># 输出应该是 gpio-ir-receiver</span></span><br><span class="line"><span class="built_in">cat</span> status</span><br><span class="line"><span class="comment"># 输出应该是 okay</span></span><br></pre></td></tr></table></figure><p>如果满足上方两个条件，查看ir事件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">getevent -l</span><br></pre></td></tr></table></figure><p>一般会有类似下面的输出，包含<code>gpio_ir_recv</code>输入</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line"> rk356x_box:/ $ getevent -l</span><br><span class="line"></span><br><span class="line">add device 1: /dev/input/event1</span><br><span class="line"></span><br><span class="line">  name:     <span class="string">&quot;gpio_ir_recv&quot;</span></span><br><span class="line"></span><br><span class="line">add device 2: /dev/input/event2</span><br><span class="line"></span><br><span class="line">  name:     <span class="string">&quot;rk-headset&quot;</span></span><br><span class="line"></span><br><span class="line">add device 3: /dev/input/event0</span><br><span class="line"></span><br><span class="line">  name:     <span class="string">&quot;rk805 pwrkey&quot;</span> </span><br></pre></td></tr></table></figure><p>执行<code>cat /sys/kernel/debug/gpio | grep &quot;gpio-123&quot;</code>也会有下面输出，表示正在使用的GPIO是哪个驱动</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">gpio-123 (                    |ir-receiver         ) <span class="keyword">in</span>  hi </span><br></pre></td></tr></table></figure><blockquote><p>如果你已经事先配置好了Keymap一节，那就可以不用手动启用协议了</p></blockquote><p>然后开始选择ir协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>会看到当前支持的所有协议，选择要监听的协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;+nec&quot;</span> &gt; /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>当然也可以开启一堆协议</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">echo</span> <span class="string">&quot;+rc-5 +rc-6 +jvc +sony +sanyo +sharp +mce_kbd +xmp +imon&quot;</span> &gt; /sys/class/rc/rc0/protocols</span><br></pre></td></tr></table></figure><p>开启的协议会用<code>[]</code>包围。</p><p>执行<code>getevent -l</code>用遥控器对着红外设备按下键，正常情况下会有类似下面的输出：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td><td class="code"><pre><span class="line">/dev/input/event1: EV_MSC       MSC_SCAN             0000045c</span><br><span class="line">/dev/input/event1: EV_SYN       SYN_REPORT           00000000</span><br><span class="line">/dev/input/event1: EV_MSC       MSC_SCAN             0000045c</span><br><span class="line">/dev/input/event1: EV_SYN       SYN_REPORT           00000000</span><br></pre></td></tr></table></figure><p>如果满足上面所有情况，则代表硬件已经设置正确并且系统能正常读取解析来自遥控器的信号</p><blockquote><p>Tips：这里建议明确出遥控器使用的是哪种协议，因为后面会使用到</p></blockquote><h3 id="制作Keymap">制作Keymap</h3><p>最后，需要制作Keymap用于将遥控器信号解析出来的十六进制的键值码映射到对应的按键上</p><p>同样是执行<code>getevent -l</code>，然后将遥控器上所有的按键按一遍，并记录对应的键值码，只用记录后三位，例如<code>45c</code></p><p>经测试，OrangePi官方的遥控器键值码如下：</p><table><thead><tr><th>按键</th><th>键值码</th></tr></thead><tbody><tr><td>电源键</td><td>41a</td></tr><tr><td>TV</td><td>44d</td></tr><tr><td>VOD</td><td>443</td></tr><tr><td>音量-</td><td>419</td></tr><tr><td>音量+</td><td>445</td></tr><tr><td>menu</td><td>45d</td></tr><tr><td>mouse</td><td>41b</td></tr><tr><td>上</td><td>444</td></tr><tr><td>左</td><td>41c</td></tr><tr><td>OK</td><td>45c</td></tr><tr><td>右</td><td>448</td></tr><tr><td>下</td><td>41d</td></tr><tr><td>home</td><td>41f</td></tr><tr><td>return</td><td>40a</td></tr><tr><td>1</td><td>413</td></tr><tr><td>2</td><td>410</td></tr><tr><td>3</td><td>411</td></tr><tr><td>4</td><td>40f</td></tr><tr><td>5</td><td>40c</td></tr><tr><td>6</td><td>40d</td></tr><tr><td>7</td><td>40b</td></tr><tr><td>8</td><td>408</td></tr><tr><td>9</td><td>409</td></tr><tr><td>TV-SYS</td><td>458</td></tr><tr><td>0</td><td>447</td></tr><tr><td>SETUP</td><td>453</td></tr></tbody></table><p>拿到对应的键值码后，开始编写keymap文件</p><p>回到Linux编译环境，在<code>kernel/drivers/media/rc/keymaps/</code>下新建一个文件叫<code>rc-orangepi-ir.c</code></p><p>写入下方内容：</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// 文件路径: kernel/drivers/media/rc/keymaps/rc-orangepi-ir.c</span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;media/rc-map.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;linux/module.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="class"><span class="keyword">struct</span> <span class="title">rc_map_table</span> <span class="title">orangepi_ir_table</span>[] =</span> &#123;</span><br><span class="line">    &#123; <span class="number">0x41a</span>, KEY_POWER &#125;,       <span class="comment">// 电源键</span></span><br><span class="line">    &#123; <span class="number">0x445</span>, KEY_VOLUMEUP &#125;,    <span class="comment">// 音量+</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x44d</span>, KEY_TV &#125;,          <span class="comment">// TV</span></span><br><span class="line">    &#123; <span class="number">0x443</span>, KEY_VIDEO &#125;,       <span class="comment">// VOD (映射为 VIDEO)</span></span><br><span class="line">    &#123; <span class="number">0x419</span>, KEY_VOLUMEDOWN &#125;,  <span class="comment">// 音量-</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x45d</span>, KEY_MENU &#125;,        <span class="comment">// menu</span></span><br><span class="line">    &#123; <span class="number">0x41b</span>, KEY_SWITCHVIDEOMODE &#125;, <span class="comment">// mouse (通常映射为切换鼠标模式，或 KEY_FN)</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x444</span>, KEY_UP &#125;,          <span class="comment">// 上</span></span><br><span class="line">    &#123; <span class="number">0x41c</span>, KEY_LEFT &#125;,        <span class="comment">// 左</span></span><br><span class="line">    &#123; <span class="number">0x45c</span>, KEY_ENTER &#125;,       <span class="comment">// OK (Android 确定键通常用 ENTER)</span></span><br><span class="line">    &#123; <span class="number">0x448</span>, KEY_RIGHT &#125;,       <span class="comment">// 右</span></span><br><span class="line">    &#123; <span class="number">0x41d</span>, KEY_DOWN &#125;,        <span class="comment">// 下</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x41f</span>, KEY_HOME &#125;,        <span class="comment">// home</span></span><br><span class="line">    &#123; <span class="number">0x40a</span>, KEY_BACK &#125;,        <span class="comment">// return</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x413</span>, KEY_1 &#125;,           <span class="comment">// 1</span></span><br><span class="line">    &#123; <span class="number">0x410</span>, KEY_2 &#125;,           <span class="comment">// 2</span></span><br><span class="line">    &#123; <span class="number">0x411</span>, KEY_3 &#125;,           <span class="comment">// 3</span></span><br><span class="line">    &#123; <span class="number">0x40f</span>, KEY_4 &#125;,           <span class="comment">// 4</span></span><br><span class="line">    &#123; <span class="number">0x40c</span>, KEY_5 &#125;,           <span class="comment">// 5</span></span><br><span class="line">    &#123; <span class="number">0x40d</span>, KEY_6 &#125;,           <span class="comment">// 6</span></span><br><span class="line">    &#123; <span class="number">0x40b</span>, KEY_7 &#125;,           <span class="comment">// 7</span></span><br><span class="line">    &#123; <span class="number">0x408</span>, KEY_8 &#125;,           <span class="comment">// 8</span></span><br><span class="line">    &#123; <span class="number">0x409</span>, KEY_9 &#125;,           <span class="comment">// 9</span></span><br><span class="line">    &#123; <span class="number">0x447</span>, KEY_0 &#125;,           <span class="comment">// 0</span></span><br><span class="line"></span><br><span class="line">    &#123; <span class="number">0x458</span>, KEY_TV2 &#125;,         <span class="comment">// TV-SYS (映射为 TV2 或其他功能键)</span></span><br><span class="line">    &#123; <span class="number">0x453</span>, KEY_SETUP &#125;,       <span class="comment">// SETUP</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="class"><span class="keyword">struct</span> <span class="title">rc_map_list</span> <span class="title">orangepi_ir_map</span> =</span> &#123;</span><br><span class="line">    .<span class="built_in">map</span> = &#123;</span><br><span class="line">        .scan     = orangepi_ir_table,</span><br><span class="line">        .size     = ARRAY_SIZE(orangepi_ir_table),</span><br><span class="line">        .rc_proto = RC_PROTO_NEC,  <span class="comment">// 这里指定协议为 NEC</span></span><br><span class="line">        .name     = <span class="string">&quot;rc-orangepi-ir&quot;</span>, <span class="comment">// 名字必须和 DTS 里的 linux,rc-map-name 一致</span></span><br><span class="line">    &#125;</span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">int</span> __init <span class="title function_">init_rc_map_orangepi</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    <span class="keyword">return</span> rc_map_register(&amp;orangepi_ir_map);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="type">static</span> <span class="type">void</span> __exit <span class="title function_">exit_rc_map_orangepi</span><span class="params">(<span class="type">void</span>)</span></span><br><span class="line">&#123;</span><br><span class="line">    rc_map_unregister(&amp;orangepi_ir_map);</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line">module_init(init_rc_map_orangepi)</span><br><span class="line">module_exit(exit_rc_map_orangepi)</span><br><span class="line"></span><br><span class="line">MODULE_LICENSE(<span class="string">&quot;GPL&quot;</span>);</span><br><span class="line">MODULE_AUTHOR(<span class="string">&quot;OrangePiUser&quot;</span>);</span><br></pre></td></tr></table></figure><p>接着在<code>kernel/drivers/media/rc/keymaps/Makefile</code>中按照格式接上<code>rc-orangepi-ir.o</code></p><p>然后修改设备树 (DTS)</p><p>回到<code>kernel/arch/arm64/boot/dts/rockchip/rk3566-orangepi-3b.dts</code>，在<code>ir-receiver&#123;...&#125;</code>内添加一条：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">linux,rc-map-name = &quot;rc-orangepi-ir&quot;;</span><br></pre></td></tr></table></figure><p>保险起见，完全重新生成boot</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> kernel</span><br><span class="line">make distclean</span><br></pre></td></tr></table></figure><p>最后从<code>修改前准备</code>这节重新编译内核和制作boot.img</p><h3 id="测试">测试</h3><p>重新刷入boot.img等镜像后，开机测试红外功能，这会应该能正常使用遥控器遥控了</p><p>同样的使用<code>getevent -l</code>查看ir事件</p><p>这会可以看到有下面之类的事件出现：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">/dev/input/event1: EV_KEY       KEY_DOWN             DOWN </span><br><span class="line">/dev/input/event1: EV_KEY       KEY_DOWN             UP</span><br></pre></td></tr></table></figure><h3 id="禁止深睡">禁止深睡</h3><p>因为官方固件深睡模式好像有问题，深睡下无法用红外唤醒，并且唤醒后系统会出现，因此需要禁止系统深睡。</p><p>首先准备一个叫<code>wake_lock.rc</code>的脚本文件，内容为：</p><figure class="highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">on property:sys.boot_completed=1</span><br><span class="line">    write /sys/power/wake_lock stay_awake</span><br></pre></td></tr></table></figure><p>打开终端连接adb，准备推送文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">adb root</span><br><span class="line">adb remount</span><br><span class="line">adb push wake_lock.rc /vendor/etc/init/</span><br><span class="line">adb shell <span class="built_in">chmod</span> 644 /vendor/etc/init/wake_lock.rc</span><br><span class="line">adb reboot</span><br></pre></td></tr></table></figure><h2 id="后记">后记</h2><p>OrangePi官方的红外模块貌似有点不好用，遥控器稍微远一点信号质量就急剧下降，S脚点位拉不下来，识别不到，这会手上没电阻电容，不方便处理，只能等之后再玩了。</p><p>更新：继续和Gemini聊了一会，才知道tmd那玩意是<code>红外光电二极管 (IR Photodiode)</code>，不是用来接收遥控器信号的“接收头”🤣，虽然也是被我用来当信号接收器了，我说怎么tm那么难用，遥控器离30cm以上就收不到信号了。。。应该是买<code>集成红外接收头 (Integrated IR Receiver)</code>。。。不过教程没问题，有问题的是那个逆天硬件🤣</p>]]></content>
    
    
      
      
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;教程已更新，更新日期：2026-01-23&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;打算把手上的OrangePi 3B刷成电视盒子给家里用，但是OrangePi 3B没有板载红外模块，于是从官方店铺下单了外</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hardware" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Hardware/"/>
    
    
    <category term="OrangePi" scheme="https://blog.goodboyboy.top/tags/OrangePi/"/>
    
    <category term="OrangePi 3B" scheme="https://blog.goodboyboy.top/tags/OrangePi-3B/"/>
    
    <category term="Android Box" scheme="https://blog.goodboyboy.top/tags/Android-Box/"/>
    
    <category term="红外模块" scheme="https://blog.goodboyboy.top/tags/%E7%BA%A2%E5%A4%96%E6%A8%A1%E5%9D%97/"/>
    
  </entry>
  
  <entry>
    <title>家里也换成光纤了qwq</title>
    <link href="https://blog.goodboyboy.top/posts/1070030594.html"/>
    <id>https://blog.goodboyboy.top/posts/1070030594.html</id>
    <published>2026-01-16T03:32:28.000Z</published>
    <updated>2026-01-16T03:32:28.000Z</updated>
    
    <content type="html"><![CDATA[<p>之前还没放假回家时，就听我妈说家里有阵突然上不了网，叫了宽带师傅，换成了光纤，然后我就感觉大事不妙</p><p>众所周知，运营商的光猫垃圾的要死，还默认是路由模式，并且普通账户还改不了桥接</p><p>回家登录光猫后台一看，果然是路由模式。。。</p><p>拿itdog ping了一下ipv6，直接全红😭</p><p>而且那个装修师傅搞的网络一言难尽</p><p>你说他不懂吧，他知道把路由器接在了几个Lan口中唯一一个千兆口上，你说他懂吧，他把光猫WiFi开着，我家原来的路由器也开着，而且让我爸妈手机连接的是原来的路由器，最难蚌的是，善后做的一坨，我问我爸妈WiFi密码是多少，他们居然不知道，看来是根本没给我爸妈讲WiFi密码。。。最后还是我通过手机WiFi密码分享功能才调出来WiFi密码。。。</p><p>之前还叫过一次宽带师傅，那个宽带师傅明显就做的好很多，弄了个不干胶贴纸把WiFi密码，宽带账号密码写了贴在路由器上，我回家一看一目了然。</p><p>哦对，还把我路由器管理员密码改了，幸好管理员密码是和WiFi密码一样的，不然真的就变成宽带师傅的路由器了。。。</p><h2 id="后记">后记</h2><p>后面我又试了很多网上的教程，尝试拿到光猫管理员密码，结果都不行。。。看来只能找客服扯皮让他们远程改成桥接了😭</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;之前还没放假回家时，就听我妈说家里有阵突然上不了网，叫了宽带师傅，换成了光纤，然后我就感觉大事不妙&lt;/p&gt;
&lt;p&gt;众所周知，运营商的光猫垃圾的要死，还默认是路由模式，并且普通账户还改不了桥接&lt;/p&gt;
&lt;p&gt;回家登录光猫后台一看，果然是路由模式。。。&lt;/p&gt;
&lt;p&gt;拿itdo</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="网络" scheme="https://blog.goodboyboy.top/tags/%E7%BD%91%E7%BB%9C/"/>
    
    <category term="光纤" scheme="https://blog.goodboyboy.top/tags/%E5%85%89%E7%BA%A4/"/>
    
  </entry>
  
  <entry>
    <title>姜还是老的辣</title>
    <link href="https://blog.goodboyboy.top/posts/2421446382.html"/>
    <id>https://blog.goodboyboy.top/posts/2421446382.html</id>
    <published>2026-01-16T03:19:04.000Z</published>
    <updated>2026-01-16T03:19:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>放假回家，我妈带我去开点喉炎药，回家路上，看到有老板在卖牛肉，于是把我拉过去。</p><p>一开始问，老板是说买的多35一斤，普通的就37一斤。</p><p>然后我妈就开始讲价，老板边切牛肉边讲价，我从来也没自己买过牛肉，不知道行情是怎样，就站在旁边不打扰我妈输出。</p><p>就当我无聊准备看手机时，我妈给老板说“我孩子现在也放假回家，之后经常又会来这边买”之类的。</p><p>站在旁边当装饰的我：？</p><p>我妈还诈老板一下，说“我记得之前都是30一斤的”</p><p>最后老板还是按35卖了。</p><p>要是我买菜，没被缺斤少两坑就不错了，完全讲不来价😂</p><p>不过在小县城也明显感受到经济下行带来的通缩影响了。</p><p>往年牛肉基本都是40-50一斤，今年直接跌倒35一斤。</p><p>和我爸去办点事回来路上买点水果，车厘子居然掉到19.9一斤了，虽然不是高档的那种，但是19.9还是很离谱了。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;放假回家，我妈带我去开点喉炎药，回家路上，看到有老板在卖牛肉，于是把我拉过去。&lt;/p&gt;
&lt;p&gt;一开始问，老板是说买的多35一斤，普通的就37一斤。&lt;/p&gt;
&lt;p&gt;然后我妈就开始讲价，老板边切牛肉边讲价，我从来也没自己买过牛肉，不知道行情是怎样，就站在旁边不打扰我妈输出。&lt;/</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="买菜" scheme="https://blog.goodboyboy.top/tags/%E4%B9%B0%E8%8F%9C/"/>
    
  </entry>
  
  <entry>
    <title>布洛芬效果真不错</title>
    <link href="https://blog.goodboyboy.top/posts/882397341.html"/>
    <id>https://blog.goodboyboy.top/posts/882397341.html</id>
    <published>2026-01-04T10:58:58.000Z</published>
    <updated>2026-01-04T10:58:58.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>多亏了湖南这逆天气温，又又又感冒了。。。</p><h2 id="头痛">头痛</h2><p>这次感冒给我折腾的够呛，又是头痛又是胸闷，但又没发烧，没嗓子痛，看起来不像流感，奥司他韦就没用了</p><p>不止白天不舒服，晚上又是咳嗽又是失眠，连续失眠两个晚上。。。</p><p>刚好这几天又要准备剩下的几门期末考试，这个状态完全复习不进去</p><h2 id="买药">买药</h2><p>这下倒是不知道该买啥药了，不过校医院肯定是不用去了，这种只会开一堆没啥用的药</p><p>我一开始打算罗红霉素或者999感冒灵，找Gemini聊了聊，Gemini说罗红霉素适合细菌引起的感冒，对病毒引起的感冒没用。毕竟罗红霉素也是抗生素，能不吃就不吃吧，我懒得试了，买了999感冒灵和一个枇杷膏用来止咳。</p><p>用了一天，发现没啥效果，想起这玩意主要成分是对乙酰氨基酚，还不如直接吃类似药物，999里面还有咖啡因，本来就睡眠不好</p><p>又和Gemini聊了会，给我推了有布洛芬，我才想起还有布洛芬可以用。</p><p>纯乙酰氨基酚暂时不考虑，因为之前服用过999，我怕药物过量造成肝损伤</p><p>布洛芬的话疫情那会用过，感觉效果还不错，而且没有咖啡因</p><p>拿到布洛芬后，看了下说明书的禁忌和注意事项，确保可以安全服用</p><p>发现注意事项中还有不得饮酒和食用含有酒精的饮料，这几天吃东西都小心翼翼的😂，虽然应该不会像头孢配酒那样直接炸缸，但还是小命要紧（doge</p><p>还有就是这玩意不宜长期或者大量使用，用于止痛不得超过5天，用于解热不得超过3天</p><p>看了一下，一盒药一板12粒，有两板，总共24粒，一天两次一次一粒，可以吃12天，一盒20多块，还是蛮良心的</p><p>吃了两天，除了仍然鼻塞，基本没有头痛和胸闷的情况，昨晚也终于没失眠了😭</p><h2 id="后记">后记</h2><p>乙酰氨基酚和布洛芬的药物原理好像都是通过抑制前列腺素的合成，来减少疼痛和发热</p><p>另外还是不想复习怎么办（doge</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;多亏了湖南这逆天气温，又又又感冒了。。。&lt;/p&gt;
&lt;h2 id=&quot;头痛&quot;&gt;头痛&lt;/h2&gt;
&lt;p&gt;这次感冒给我折腾的够呛，又是头痛又是胸闷，但又没发烧，没嗓子痛，看起来不像流感，奥司他韦就没用了&lt;/p&gt;
&lt;p&gt;不止白天不舒服，晚上又是咳</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="布洛芬" scheme="https://blog.goodboyboy.top/tags/%E5%B8%83%E6%B4%9B%E8%8A%AC/"/>
    
    <category term="感冒" scheme="https://blog.goodboyboy.top/tags/%E6%84%9F%E5%86%92/"/>
    
  </entry>
  
  <entry>
    <title>再见2025，你好2026</title>
    <link href="https://blog.goodboyboy.top/posts/2138059444.html"/>
    <id>https://blog.goodboyboy.top/posts/2138059444.html</id>
    <published>2026-01-01T06:00:30.000Z</published>
    <updated>2026-01-01T06:00:30.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><h3 id="1月">1月</h3><p>2024年12月16日，DeepSeek-V3发布<br>2025年1月15日，DeepSeek APP发布<br>2025年1月20日，DeepSeek-R1发布</p><p>至此，AI正式走入了我的生活</p><h3 id="2月">2月</h3><p>由于DeepSeek的火热，官方服务器一时无法承载大量流量</p><p>也是这段时间，各大云厂商纷纷部署DeepSeek，我也在硅基流动白嫖了一大堆邀请奖励，开始了API自由。（<a href="/posts/2942945809.html">《DeepSeek API挂了？SiliconFlow来救！》</a>）</p><p>不过好景不长，大家都发现了硅基流动，于是没过几天硅基流动也卡成狗了，于是转战字节的火山引擎，继续白嫖doge。（<a href="/posts/1550451800.html">《DeepSeek服务器繁忙？SiliconFlow卡成狗？快来火山引擎！》</a>）</p><p>中间受 <a href="https://ab2cd.com/">奇甲安全</a> 邀请，测试他们加的主流产品 <a href="https://ab2cd.com/product/138.html">一指灵通</a> ，产品还蛮好用的，作为安全产品价格也不贵。（<a href="/posts/3512270884.html">《一指灵通安全硬件体验》</a>）</p><p>然后就是我人生中第一张软件著作权登记下来了，也是我第一次正式写的一款APP（虽然后面很快就用jetpack compose重构了😂）</p><h3 id="3月">3月</h3><p>我开始学习Jetpack Compose，主要还是因为传统的Android View的material 2没3好看，但是Android View 的material3老是出问题，便转向了风格更统一的Jetpack Compose，而且我也更喜欢Jetpack Compose的设计理念，这也是我第一次接触MVVM设计架构。</p><p>然后就是开了我的第二张万事达卡（<a href="/posts/2366358045.html">《欢迎中信万事达双币借记卡加入卡包大家庭！》</a>），有人民币和美元账户，可以往里面存人民币了，也可以用这张卡购汇，不用像中行万事达那样还要一张一类卡用于购汇。</p><p>最后就是受晚夜的BLOG QSL卡启发，做了个博客明信片。（<a href="/posts/243612221.html">《设计了一张博客明信片》</a>）</p><h3 id="4月-5月">4月-5月</h3><p>四月主要还是在折腾OAuth2和OIDC，然后做了第二版的博客明信片😁（<a href="/posts/1630314981.html">《博客明信片v2版发布啦，喜欢就快来申请一张吧！》</a>）</p><p>五月则是折腾了一会土区Apple Music，顺便还办了张邮储万事达卡（变卡王了😂），还注册了个喜欢的域名（<a href="/posts/2975776194.html">《新注册furwolf.com域名》</a>）</p><p>五月最后加入了Postcrossing，开启了 <a href="/posts/3994121440.html">送你一张明信片</a> 活动（欢迎大家来参加），开始正式投递博客明信片。</p><h3 id="6月-7月">6月-7月</h3><p>整个六月差不多都是在折腾Debian，折腾Debian桌面、指纹、游戏、显示器、输入法、字体等等（什么时候能统一一下啊😭）</p><p>然后就是白嫖了一个一年的Gemini Pro，让我的学习速度更加迅猛，再也不用去CSDN屎里淘金了。。。</p><p>七月大部分时间呆在实验室，留校没有回家</p><p>不得不说，湖南七月那真的是热炸了，打个伞出门转一圈都可以浑身大汗，宛如蒸桑拿，而实验室里的空调制冷效果也一般般，开16度结果面板上显示还是28度。。。</p><p>七月折腾完后赶紧跑路回家了，太热了待不了一点。</p><h3 id="8月">8月</h3><p>八月在家就舒服很多，开始折腾上了ESP32</p><p>本来买ESP32是打算刷个Picokey固件玩，结果折腾半天刷好了效果还一般般，完全比不上Canokey，遂放弃折腾Picokey，而是玩起了最基础的电路以及ESP32编程</p><p>ESP32太好玩了，基本上整个月我都在玩ESP32，买各种硬件，显示屏、按钮、LED、电阻、万用表等等</p><p>而且当时我买的是ESP32 S3顶配版，8M的RAM和16M的存储，怎么玩都行。</p><h3 id="9月">9月</h3><p>九月当然是开卡的一个月，招行万事达卡普卡发布，迫不及待跑去分行开卡，我的国内万事达卡有它就够了，没有继续开万事达卡的欲望了（doge</p><p>然后就是买了新音响，原来的那个在暑假的时候坏了</p><p>G1500bar这段时间体验下来感觉还不错，不过默认参数就有点拉了，建议装官方的软件调一下参数，这样低音和人声效果会好很多。</p><h3 id="10月-12月">10月-12月</h3><p>这段时间倒没有折腾什么，每天课多得爆炸，大三也要准备就业相关的事情，时间少了很多qwq</p><p>十一月底的时候疯狂动物城2上映，立马就去看了😆</p><h2 id="小结">小结</h2>        <div id="aplayer-SyragMNA" class="aplayer aplayer-tag-marker" style="margin-bottom: 20px;"></div>  <script>  var options = {"narrow":false,"autoplay":false,"showlrc":3,"mode":"random","mutex":true,"preload":"metadata","listmaxheight":"513px","music":[{"name":"Zoo (From Zootopia 2)","url":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).flac","artist":"Disney/Shakira","cover":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).jpg","lrc":"https://www.goodboyboy.top/uploads/music/Disney _ Shakira - Zoo (From _Zootopia 2_)/Disney _ Shakira - Zoo (From _Zootopia 2_).lrc","theme":"#7767c6ff","pic":""}]};  options.element = document.getElementById("aplayer-SyragMNA");  var ap = new APlayer(options);    window.aplayers || (window.aplayers = []);  window.aplayers.push(ap);  </script><p>祝大家2026新的一年里幸福安康、财源滚滚、心想事成！😄</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;h3 id=&quot;1月&quot;&gt;1月&lt;/h3&gt;
&lt;p&gt;2024年12月16日，DeepSeek-V3发布&lt;br&gt;
2025年1月15日，DeepSeek APP发布&lt;br&gt;
2025年1月20日，DeepSeek-R1发布&lt;/p&gt;
&lt;p&gt;至此，AI</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
    
    
    <category term="年度总结" scheme="https://blog.goodboyboy.top/tags/%E5%B9%B4%E5%BA%A6%E6%80%BB%E7%BB%93/"/>
    
  </entry>
  
  <entry>
    <title>Canokey导入S/MIME邮箱证书并使用Thunderbird发送邮件</title>
    <link href="https://blog.goodboyboy.top/posts/3174411847.html"/>
    <id>https://blog.goodboyboy.top/posts/3174411847.html</id>
    <published>2025-12-24T15:33:55.000Z</published>
    <updated>2025-12-24T15:33:55.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前期准备">前期准备</h2><blockquote><p>Tips: 需要安装1.2.4以及以下的版本，高版本不支持Canokey（或者使用Canokey自家的ckman也行）</p></blockquote><ul><li>安装ykman：<a href="https://developers.yubico.com/yubikey-manager-qt/Releases/">https://developers.yubico.com/yubikey-manager-qt/Releases/</a></li></ul><blockquote><p>S/MIME邮箱证书可以看我上一篇文章（<a href="/posts/2880062507.html">1.90$申请 WISeID S/MIME 邮箱证书</a>）</p></blockquote><ul><li><p>S/MIME邮箱证书</p></li><li><p>安装OpenSC：<a href="https://github.com/OpenSC/OpenSC">https://github.com/OpenSC/OpenSC</a></p></li></ul><h2 id="导入证书">导入证书</h2><p>目前Canokey支持以下几种算法的证书</p><ul><li>RSA2048</li><li>NIST P-256</li><li>NIST P-384</li></ul><p>对于固件版本3.0.0以上的Canokey（CanoKey Canary），还支持以下算法的证书</p><ul><li>RSA3072</li><li>RSA4096</li><li>secp256k1</li><li>Ed25519</li><li>X25519</li><li>SM2</li></ul><blockquote><p>Tips: CanoKey 固件版本 3.0.0 仅支持使用 Ed25519 算法对 32 字节数据做签名，仅支持使用内部生成的 X25519 密钥。</p></blockquote><p>安装好ykman后，连接Canokey，进入终端</p><p>输入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey info</span><br></pre></td></tr></table></figure><p>应该能够看到智能卡的相关信息</p><p>输入命令</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv info</span><br></pre></td></tr></table></figure><p>应该能看到PIV的相关信息</p><p>然后CanoKey一般有4个可用的插槽：</p><ul><li>9A：PIV Authentication</li><li>9E：Card Authentication</li><li>9C：Digital Signature</li><li>9D：Key Management</li></ul><p>从固件版本 2.0.0 开始，CanoKey 还支持82、83插槽</p><p>固件版本 3.0.0 开始，好像还支持<code>Card Capability Container</code>、<code>Card Holder Unique Identifier</code>、<code>Printed Information</code>，有邪修玩法用来存VeraCrypt的密钥</p><p>需要注意的是，9E插槽的默认PIN策略是不验证</p><p>不过这都无所谓，可以通过<code>--pin-policy</code>来设置，具体可以看ykman的命令帮助来使用</p><p>这里使用的是9c插槽</p><p>首先是导入私钥</p><blockquote><p>Tips: Canokey默认的管理密钥是：010203040506070801020304050607080102030405060708，如果修改了管理密钥需要加上<code>-m</code>参数传入管理密钥</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv keys import 9c &lt;私钥文件路径&gt;</span><br></pre></td></tr></table></figure><p>然后是导入公钥证书</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ykman -r canokey piv certificates import -v 9c &lt;公钥文件路径&gt;</span><br></pre></td></tr></table></figure><p>这里会提示输入PIN，输入PIV的PIN即可，这里的<code>-v</code>参数用于验证证书是否匹配导入的私钥，可有可无</p><h2 id="导入Thunderbird">导入Thunderbird</h2><p>启动Thunderbird，找到端到端加密，点击<code>S/MIME安全设备</code>按钮，然后点击<code>加载</code>按钮，选择<code>浏览</code>按钮</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/kgtxq.webp" alt="1"></p><p>找到你安装OpenSC的地方，<code>OpenSC/pkcs11/</code>该目录下有个<code>opensc-pkcs11.dll</code>，选择即可。</p><p>正常加载模块后，点击刚刚添加的模块，模块下面有个canokey设备，选择后点击登录，会要求输入PIN</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/kvn71.webp" alt="2"></p><p>登录完成返回到端到端加密页面，点击个人数字签名证书旁边的<code>选择</code>按钮，一般来说会自动找到符合条件的证书，选择后可以点击旁边的<code>测试</code>按钮</p><p>如果测试提示颁发者无效，说明可能是缺少中间证书，点击<code>管理S/MIME证书</code>按钮，选择证书颁发机构，导入你的颁发机构的中间证书即可。</p><h2 id="参考">参考</h2><p><a href="https://docs.canokeys.org/zh-hans/userguide/piv/">https://docs.canokeys.org/zh-hans/userguide/piv/</a></p><p><a href="https://thinkalone.win/canokey-canary.html">https://thinkalone.win/canokey-canary.html</a></p><p><a href="https://www.liups.net/2025/10/s-mime-%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D%E5%8A%A0%E5%AF%86%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6/">https://www.liups.net/2025/10/s-mime-证书签名加密电子邮件/</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前期准备&quot;&gt;前期准备&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips: 需要安装1.2.4以及以下的版本，高版本不支持Canokey（或者使用Canokey自家的ckman也行）&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;安装ykman：&lt;a hr</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Web" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Web/"/>
    
    
    <category term="Canokey" scheme="https://blog.goodboyboy.top/tags/Canokey/"/>
    
    <category term="S/MIME" scheme="https://blog.goodboyboy.top/tags/S-MIME/"/>
    
    <category term="Thunderbird" scheme="https://blog.goodboyboy.top/tags/Thunderbird/"/>
    
  </entry>
  
  <entry>
    <title>1.90$申请 WISeID S/MIME 邮箱证书</title>
    <link href="https://blog.goodboyboy.top/posts/2880062507.html"/>
    <id>https://blog.goodboyboy.top/posts/2880062507.html</id>
    <published>2025-12-24T14:39:00.000Z</published>
    <updated>2025-12-24T14:39:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>之前Actalis免费申请的一年S/MIME证书到期了，这次打算换个好点的性价比高的，于是找到了WISeID</p><h2 id="资费">资费</h2><p>basic计划一年是1.9<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mtext>（主页上写的是</mtext><mn>4.9</mn><mtext>实际注册登录后只要</mtext><mn>1.9</mn></mrow><annotation encoding="application/x-tex">（主页上写的是4.9实际注册登录后只要1.9</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.6833em;"></span><span class="mord cjk_fallback">（主页上写的是</span><span class="mord">4.9</span><span class="mord cjk_fallback">实际注册登录后只要</span><span class="mord">1.9</span></span></span></span>），并且他家还提供一个月的免费S/MIME证书用于测试，可以先签发一个测试一下。</p><h2 id="购买">购买</h2><p>测试没有问题后就可以开始正式购买</p><p>进入<a href="https://account.wiseid.com/dashboard/my-subscription">https://account.wiseid.com/dashboard/my-subscription</a></p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/iscrv.webp" alt="1"></p><p>可以看到basic计划，该计划支持签发1-3年的证书</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/j8vpx.webp" alt="2"></p><p>这里可以先买一年试用一下</p><blockquote><p>Tips: 这里只能使用万事达或者VISA卡支付</p></blockquote><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/jdeem.webp" alt="3"></p><p>支付成功后可以看到变成了<code>Request Certificate</code></p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/jsta6.webp" alt="4"></p><h2 id="申请证书">申请证书</h2><p>点击<code>Request Certificate</code>后来到证书申请界面。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/jv479.webp" alt="5"></p><blockquote><p>Tips: ECC仅支持签名，不支持邮件加密，RSA支持签名和加密</p></blockquote><p>我个人更喜欢ECC，并且加密功能由我自己的OpenPGP提供，所以选择的是ECC。（虽然对NIST P-256也喜欢不到哪去，要是能Ed25519/Curve25519最好了）</p><p><code>Key Generation method</code>部分看你自己，我个人因为不用于加密倒是无所谓（人家要是想搞坏事直接重新签发一个就行了），如果是RSA并且用于加密邮件，建议还是选择CSR上传不要将私钥托管至平台</p><p>当然如果是想简便那就选择服务器生成吧。</p><p>这里写一下如何通过CSR上传的方式来避免私钥的传输</p><p>首先需要安装OpenSSL，这不是本教程主题，需要自行搜索教程</p><p>安装完成后，打开终端（CMD），输入下面命令生成私钥</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl ecparam -genkey -name prime256v1 -out my_smime_key.key</span><br></pre></td></tr></table></figure><p>这里私钥会生成在当前终端的工作目录下</p><p>然后是生成CSR</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl req -new -key my_smime_key.key -out my_smime.csr</span><br></pre></td></tr></table></figure><p>这里会提示输入<code>Country Name</code>、<code>State or Province Name</code>等等，这些都不是重要的，最重要的是<code>Common Name</code>和<code>Email Address</code>，需要填写申请页面中你的邮箱地址。</p><p>然后将<code>my_smime.csr</code>的内容复制到申请页面中的指定位置，点击申请按钮即可。</p><p>申请成功后就可以点击Download旁边的下载证书按钮下载了。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/12/25/k8zdw.webp" alt="6"></p><h2 id="制作PKCS12证书（可选）">制作PKCS12证书（可选）</h2><p>如果你觉得公钥私钥分离太麻烦，或者有导入到其他设备的需求，可以将其打包成一个.p12证书文件，包含了公钥和私钥。</p><blockquote><p>Tips: WISeID上下载的CRT公钥文件仅包含当前签发证书，不包含完整信任链，建议制作时将中间证书一起打包，避免出现问题</p></blockquote><p>先是不打包中间证书</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl pkcs12 -<span class="built_in">export</span> -out final.p12 -inkey my_smime_key.key -<span class="keyword">in</span> &lt;签发的公钥CRT证书文件&gt;</span><br></pre></td></tr></table></figure><p>最后就会生成一个<code>final.p12</code>文件，包含你的公钥和私钥，当然也可以加个<code>-passout pass:123456</code>给证书设置个密码</p><p>如果要打包中间证书，需要先从官网下载中间证书：<a href="https://public.wisekey.com/crt/wcidpersgbca4.cer">https://public.wisekey.com/crt/wcidpersgbca4.cer</a></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">openssl pkcs12 -<span class="built_in">export</span> -out final.p12 -inkey my_smime_key.key -<span class="keyword">in</span> &lt;签发的公钥CRT证书文件&gt; -certfile &lt;下载的中间证书CER文件&gt;</span><br></pre></td></tr></table></figure><p>这样生成的证书文件就包含了中间证书。</p><h2 id="后记">后记</h2><p>不知道为啥有效期是两年，我明明申请的是一年。</p><p>请妥善保管私钥，不要泄露，泄露后请及时Revoke。</p><h2 id="参考">参考</h2><p><a href="https://dallas.lu/cheapest-smime-cert-from-wiseid/">https://dallas.lu/cheapest-smime-cert-from-wiseid/</a></p><p><a href="https://www.v2ex.com/t/1169946">https://www.v2ex.com/t/1169946</a></p><p><a href="https://blog.dejavu.moe/posts/how-to-apply-for-s-mime-certs-at-low-cost/">https://blog.dejavu.moe/posts/how-to-apply-for-s-mime-certs-at-low-cost/</a></p><p><a href="https://www.liups.net/2025/10/s-mime-%E8%AF%81%E4%B9%A6%E7%AD%BE%E5%90%8D%E5%8A%A0%E5%AF%86%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6/#%E7%9B%AE%E5%BD%95">https://www.liups.net/2025/10/s-mime-证书签名加密电子邮件/#目录</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;之前Actalis免费申请的一年S/MIME证书到期了，这次打算换个好点的性价比高的，于是找到了WISeID&lt;/p&gt;
&lt;h2 id=&quot;资费&quot;&gt;资费&lt;/h2&gt;
&lt;p&gt;basic计划一年是1.9&lt;span class=&quot;katex&quot;&gt;&lt;s</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Web" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Web/"/>
    
    
    <category term="WISeID" scheme="https://blog.goodboyboy.top/tags/WISeID/"/>
    
    <category term="S/MIME" scheme="https://blog.goodboyboy.top/tags/S-MIME/"/>
    
    <category term="EMail" scheme="https://blog.goodboyboy.top/tags/EMail/"/>
    
  </entry>
  
  <entry>
    <title>新购Intel AX210网卡</title>
    <link href="https://blog.goodboyboy.top/posts/1633583570.html"/>
    <id>https://blog.goodboyboy.top/posts/1633583570.html</id>
    <published>2025-12-19T05:10:17.000Z</published>
    <updated>2025-12-19T05:10:17.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>众所周知，华硕天选系列的游戏本基本都是网卡硬盘叠叠乐。我当时那会天选三出来，网卡有Intel和Realtek（螃蟹卡）两个批次，我比较幸运抽到了Intel AX201。虽然Intel的比螃蟹卡好一点但不多，一旦电脑进入高负载还是会掉网卡。</p><p>不过那会都是高负载下才掉网卡，我电脑充电器一般都扔在寝室，在外的时候没充电也上不了高负载。在寝室的时我则是直接用有线，掉网卡也不影响，我也就懒得换AX210了。</p><p>然而最近在低负载开机时居然也开始掉网卡了，这就让我有点不能忍了。</p><p>特别是去实验室学习的时候，背着这么重的游戏本走老远的路到工位，开机发现网卡掉了上不了网，蓝牙也掉连不了耳机，只能坐在那发呆，属实是有点难蚌。。。</p><h2 id="换网卡">换网卡</h2><p>之前听说在高温下AX210比201稳定很多（其实温度也没多高，我把原来的镁光换成了致态7100Plus，无缓加上单面颗粒，正常负载下也就48°左右，PCB背面温度应该更低），去PDD上找了一家看着还可以的，花了60买了个Intel AX210。</p><p>今天网卡到货后，便立马拆机换网卡</p><p>这电脑都被我拆N次了，裤裤就是一顿拆，虽然还没拆过网卡，但是知道大致位置，保险起见还是在B站随便找了个视频看了下教程。</p><p>其他步骤还好，主要是天线的拆卸和安装有点难蚌（还有那紧的要命的螺丝）。</p><p>旧网卡和天线的那个扣扣的超级紧，我扣半天没扣下来，最后还是先把网卡拆了再连着天线掰了下来</p><p>然而我把天线扣网新网卡上扣的时候半天扣不上去，扣上去了轻轻一挑又掉了，又不敢大力出奇迹怕把天线扣或者网卡座子弄坏，最后折腾半天才勉强扣上去。</p><h2 id="驱动">驱动</h2><p>换网卡之前提前把WIFI和蓝牙驱动下好了，不过装完开机后没过一会系统自己就打好驱动了</p><h2 id="使用">使用</h2><p>AX210和201在功能上好像没多大区别，好像就是从蓝牙5.2变成5.3了，WIFI6变成了WIFI6E，支持6GHz。不过我一个也用不到😂</p><p>我在寝室用的有线，实验室那边还是WIFI5</p><h2 id="后记">后记</h2><p>不知道Intel E5支不支持CNVio2，201好像要CPU支持CNVio2才能用，如果支持还可以给我的洋垃圾服务器装上，不支持就留着之后备用吧。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;众所周知，华硕天选系列的游戏本基本都是网卡硬盘叠叠乐。我当时那会天选三出来，网卡有Intel和Realtek（螃蟹卡）两个批次，我比较幸运抽到了Intel AX201。虽然Intel的比螃蟹卡好一点但不多，一旦电脑进入高负载还是会掉网</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="无线网卡" scheme="https://blog.goodboyboy.top/tags/%E6%97%A0%E7%BA%BF%E7%BD%91%E5%8D%A1/"/>
    
    <category term="Intel" scheme="https://blog.goodboyboy.top/tags/Intel/"/>
    
  </entry>
  
  <entry>
    <title>梦</title>
    <link href="https://blog.goodboyboy.top/posts/4054494646.html"/>
    <id>https://blog.goodboyboy.top/posts/4054494646.html</id>
    <published>2025-12-17T14:57:14.000Z</published>
    <updated>2025-12-17T14:57:14.000Z</updated>
    
    <content type="html"><![CDATA[<p>起始是团学组织了一场团建，地点是在一个比较偏僻的山区，像平常野炊烧烤那种远离城市，在山区里的那种山庄。</p><p>但其实团建的内容并不多，不知怎么，我来到那个山庄的后面，这里有一大片墓地，是中式那种坟墓，不过因为是白天，并没多恐怖。奇怪的是，这片墓地中有一栋老式单元楼。我靠近看，一楼的窗户完全看不见室内，像是被窗帘或者其他什么东西挡着似的。我绕着单元楼走了几圈，发现这一楼居然没有门，而且也没有上楼的路！我感觉很奇怪，于是又找了找，发现了一个半人高两人宽水泥砌的小门。趴着往里一钻，发现又是一个洞，不过这只能勉强一人爬过。我勉强钻了进去，发现前面是一个深渊。再往前是一个一人高的跳台，跳台上则是新版SCP重收里的那种重型铁门（？）。我发现没有开铁门的方式，而且这个跳台我也跳不上去。这个狭窄的空间给我很不好的感觉，于是我打算打道回府。然而就当我准备转身钻出去的时候，我突然进入了一楼的客厅，一个小男孩“𪠽𪠽”的出现在我面前。我观察了一下一楼客厅，屋子里暗暗的，窗户全部被窗帘遮住，阳光从暗红色窗帘透射进来，让屋子不是完全的黑。我觉得面前这个小男孩蛮活泼可爱的，便和他聊了许久。后来我发现了这栋楼的楼梯便慢慢往楼上爬去。这栋楼虽然外面看着是那种小的老式单元楼，但是进去后却是像电影大鱼海棠里那种大的老式单元楼，不过样式不是那种。楼里十分昏暗，没有窗户。我不敢往楼里进去太多，就打算往上爬。就在我爬到某一楼时，一个让我头皮发麻的东西在楼里的暗处看着我，我只看到发光的眼睛，看不见身体。我心里一紧，赶紧往上爬。爬到大概六楼后，这里一半是单元楼的走廊，一半是那种从大型洞穴里往外面看的景象。不过洞穴外好像是悬崖，我就没靠近。洞穴外的阳光通过藤蔓照了进来，让这层楼亮堂了很多。突然，我感觉有什么东西从我身后飘过，转身一看有什么东西飘进了单元楼暗处。我打算离开，连忙下楼。找到之前那个小洞，钻了出去……</p><p>时间来到晚上，不知道是谁也发现了这栋单元楼，拉着一群人打算探索一下。我说里面有不好的东西，建议大家不要进去，但是一群人还是打算进去。这时，那个小男孩突然出现，还多了个小女孩。一开始大家不知道怎么进去，我说我知道一个洞可以进去。结果就当我伸手准备爬进去的时候，摸出了一手的小骷髅头！我吓了一跳，准备继续劝大家不要进去，这时不知道是谁找到了上去的楼梯，大家都开始上楼。没办法，我带着小男孩也上了楼。上楼途中，我不断看到有什么东西从我身边路过，便提醒大家，结果大家说我疑神疑鬼，我也懒得管了。等上到我之前去的六楼，这里已经特别暗了，大家坐在地上休息。突然，我发现那个小女孩不见了，我就跟这个小男孩说不要来这个地方，这个地方是个杀人灭口的好地方，特别容易藏着坏人。休息了一会，我打算去找找小女孩，这时突然从暗处出来许多怪物，皮肤像僵尸那样灰败，但是又有丧尸般的速度。我拉着小男孩准备下楼，发现那些怪物居然不攻击我，我想起小男孩的种种，有点怀疑他，不过因为时间紧迫，我也没管那么多。下了一楼后，突然有人说出不去了。我从楼梯处的一个小孔往楼下看，发现楼外出去的人正在被一大堆怪物攻击。我拉着小男孩找了个暗处躲着，其他几个人也和我们躲在一起，原来的大部队也不知所踪。然而不知怎么，我突然被传送出了单元楼，正庆幸时，突然发现小男孩不见了。我不断问着从楼里逃出的人有没有看到一个小男孩和小女孩，但他们只让我快跑。这时一个怪物朝我冲了过来，就在战斗正激烈时，小男孩穿着一个披风出现，还递给我一件黑色披风。我穿上披风，发现还蛮好看的，而且那些怪物居然不攻击我了。小男孩拉着我准备离开这里，然后闹钟就响了……</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;起始是团学组织了一场团建，地点是在一个比较偏僻的山区，像平常野炊烧烤那种远离城市，在山区里的那种山庄。&lt;/p&gt;
&lt;p&gt;但其实团建的内容并不多，不知怎么，我来到那个山庄的后面，这里有一大片墓地，是中式那种坟墓，不过因为是白天，并没多恐怖。奇怪的是，这片墓地中有一栋老式单元楼。</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="梦" scheme="https://blog.goodboyboy.top/tags/%E6%A2%A6/"/>
    
  </entry>
  
  <entry>
    <title>OpenPGP邮件加密——关于测试邮件握手的思考</title>
    <link href="https://blog.goodboyboy.top/posts/643318964.html"/>
    <id>https://blog.goodboyboy.top/posts/643318964.html</id>
    <published>2025-11-26T14:17:53.000Z</published>
    <updated>2025-11-26T14:17:53.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>和网友互换了OpenPGP公钥，然后测试了下加密邮件，然后有了下面的思考：</p><p>如何“规范”的进行加密邮件测试？</p><h2 id="结论">结论</h2><p>这里先给出我的结论：进行三轮握手。</p><blockquote><p>Tips：以上结论用于子密钥分担不同职责的情况。</p></blockquote><h2 id="原因">原因</h2><p>OpenPGP密钥有四个职能：认证、加密、验证、签名。</p><p>一般来说，主密钥担任认证职责，三个子密钥分别担任加密、验证、签名职责。</p><p>目前市面上的OpenPGP 物理安全密钥会有三个插槽，分别对应存储三个子密钥，主密钥则离线冷存储。</p><p>当两个人互换OpenPGP公钥后，准备发送测试邮件测试邮件加密功能：</p><p>这里使用A和B区分用户</p><blockquote><p>第一次握手：A向B（也可以是B向A）发测试邮件（发起握手请求）</p></blockquote><p>A的邮件客户端会使用B的OpenPGP公钥中的“加密”子密钥的公钥，对邮件内容进行加密，并使用自己的OpenPGP公钥中的“签名”子密钥对邮件进行签名。</p><p>B在收到邮件后，邮件客户端会使用自己的OpenPGP公钥中的“加密”子密钥的私钥对邮件内容进行解密，并且使用A的OpenPGP公钥中的“签名”子密钥的公钥对签名进行检查，如果检查通过，那么代表：</p><div class="note success flat"><p>A什么都还不知道（B还未作出回应）</p><p>B知道了自己的OpenPGP公钥中的“加密”子密钥功能正常（邮件客户端正常解密邮件），A的OpenPGP公钥中的“签名”子密钥功能正常（邮件客户端正确显示邮件签名）</p></div><blockquote><p>第二次握手：B向A发送测试邮件</p></blockquote><p>这次和第一次流程是反过来的</p><p>B的邮件客户端会使用A的OpenPGP公钥中的“加密”子密钥的公钥，对邮件内容进行加密，并使用自己的OpenPGP公钥中的“签名”子密钥对邮件进行签名。</p><p>A在收到邮件后，邮件客户端会使用自己的OpenPGP公钥中的“加密”子密钥的私钥对邮件内容进行解密，并且使用B的OpenPGP公钥中的“签名”子密钥的公钥对签名进行检查，如果检查通过，那么代表：</p><div class="note success flat"><p>A知道了自己的OpenPGP公钥中的“加密”子密钥功能正常（邮件客户端正常解密邮件），B的OpenPGP公钥中的“签名”子密钥功能正常（邮件客户端正确显示邮件签名），自己的OpenPGP公钥中的“签名”子密钥功能正常（否则B也不会回复测试成功），B的OpenPGP公钥中的“加密”子密钥功能正常（否则B也不会回复测试成功）。</p><p>B还是仅知道自己的OpenPGP公钥中的“加密”子密钥功能正常，A的OpenPGP公钥中的“签名”子密钥功能正常</p></div><blockquote><p>第三次握手：A向B发送完成测试邮件</p></blockquote><p>同样是B在收到邮件后，邮件客户端会使用自己的OpenPGP公钥中的“加密”子密钥的私钥对邮件内容进行解密，并且使用A的OpenPGP公钥中的“签名”子密钥的公钥对签名进行检查，如果检查通过，那么代表：</p><div class="note success flat"><p>A已知全部</p><p>B知道了自己的OpenPGP公钥中的“加密”子密钥功能正常（第一轮握手已知），A的OpenPGP公钥中的“签名”子密钥功能正常（第一轮握手已知），自己的OpenPGP公钥中的“签名”子密钥功能正常（不然A也不会回复测试成功），A的OpenPGP公钥中的“加密”子密钥功能正常（不然A也不会回复测试成功）。</p></div><p>整理成表格如下：</p><table><thead><tr><th>轮数</th><th>A</th><th>B</th></tr></thead><tbody><tr><td>第一轮握手A-&gt;B</td><td>A什么都还不知道</td><td>B的“加密”子密钥功能正常、A的“签名”子密钥功能正常</td></tr><tr><td>第二轮握手B-&gt;A</td><td>A的“加密”子密钥功能正常、B的“签名”子密钥功能正常、A的“签名”子密钥功能正常、B的“加密”子密钥功能正常</td><td>B的“加密”子密钥功能正常、A的“签名”子密钥功能正常</td></tr><tr><td>第三轮握手A-&gt;B</td><td>A的“加密”子密钥功能正常、B的“签名”子密钥功能正常、A的“签名”子密钥功能正常、B的“加密”子密钥功能正常</td><td>B的“加密”子密钥功能正常、A的“签名”子密钥功能正常、B的“签名”子密钥功能正常、A的“加密”子密钥功能正常</td></tr></tbody></table><p>整理成mermaid如下：</p><pre><code class="highlight mermaid">sequenceDiagram    autonumber    participant A    participant B    Note over A,B: 握手过程开始    %% 第一轮    rect rgb(240, 248, 255)    Note left of A: 状态: A什么都还不知道    A-&gt;&gt;B: 第一轮握手 (A -&gt; B)    Note right of B: 状态: &lt;br/&gt;1. A的“签名”子密钥功能正常&lt;br/&gt;2. B的“加密”子密钥功能正常    end    %% 第二轮    rect rgb(255, 250, 240)    B-&gt;&gt;A: 第二轮握手 (B -&gt; A)&lt;br/&gt;（隐含B的1、2点状态）    Note left of A: 状态: &lt;br/&gt;1. A的“加密”子密钥功能正常&lt;br/&gt;2. B的“签名”子密钥功能正常&lt;br/&gt;3. A的“签名”子密钥功能正常&lt;br/&gt;4. B的“加密”子密钥功能正常    Note right of B: (B维持上一轮状态)    end    %% 第三轮    rect rgb(240, 255, 240)    A-&gt;&gt;B: 第三轮握手 (A -&gt; B)    Note left of A: (A维持全正常状态)    Note right of B: 状态: &lt;br/&gt;1. A的“加密”子密钥功能正常&lt;br/&gt;2. B的“签名”子密钥功能正常&lt;br/&gt;3. A的“签名”子密钥功能正常&lt;br/&gt;4. B的“加密”子密钥功能正常    end</code></pre><p>至此，A与B都已知自己和对方的邮件签名和加密功能正常。</p><h2 id="后记">后记</h2><p>怎么感觉像是TCP的三次握手（</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;和网友互换了OpenPGP公钥，然后测试了下加密邮件，然后有了下面的思考：&lt;/p&gt;
&lt;p&gt;如何“规范”的进行加密邮件测试？&lt;/p&gt;
&lt;h2 id=&quot;结论&quot;&gt;结论&lt;/h2&gt;
&lt;p&gt;这里先给出我的结论：进行三轮握手。&lt;/p&gt;
&lt;block</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Software" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Software/"/>
    
    
    <category term="OpenPGP" scheme="https://blog.goodboyboy.top/tags/OpenPGP/"/>
    
    <category term="邮件加密" scheme="https://blog.goodboyboy.top/tags/%E9%82%AE%E4%BB%B6%E5%8A%A0%E5%AF%86/"/>
    
  </entry>
  
  <entry>
    <title>疯狂动物城2太好看了（无具体剧透）</title>
    <link href="https://blog.goodboyboy.top/posts/3999786379.html"/>
    <id>https://blog.goodboyboy.top/posts/3999786379.html</id>
    <published>2025-11-26T13:54:36.000Z</published>
    <updated>2025-11-26T13:54:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p><img src="https://pic.goodboyboy.top/imgs/2025/11/26/zowcqe.webp" alt="海报"></p><p>今天疯狂动物城2上映，前两天就订了票，今天吃完晚饭去看了看。</p><p>省流：非常好看😆</p><h2 id="正文">正文</h2><p>剧情上来说，有搞笑，也有爱情，还有深度，而且没有毁IP，人物刻画特别棒，剧情张度也有，不是平淡无奇的那种，最后懂得都懂，肯定是Happy Ending啦</p><p>画面上来说，这点完全可以相信迪士尼，我看过的迪士尼动画画面就没有难看的，不仅是尼克和朱迪的面部表情刻画的很到位，其他角色也是非常不错。而且新角色猞猁（芝士猞猁bushi）颜值真的不错（逃）</p><p>角色表现上来说，人物刻画很立体，每个角色都很栩栩如生</p><p>总而言之，非常值得一看</p><h2 id="后记">后记</h2><p>不要乱磕CP，会被制裁😂</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.goodboyboy.top/imgs/2025/11/26/zowcqe.webp&quot; alt=&quot;海报&quot;&gt;&lt;/p&gt;
&lt;p&gt;今天疯狂动物城2上映，前两天就订了票，今天吃完晚饭去看了看。&lt;/p&gt;</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="疯狂动物城2" scheme="https://blog.goodboyboy.top/tags/%E7%96%AF%E7%8B%82%E5%8A%A8%E7%89%A9%E5%9F%8E2/"/>
    
    <category term="Zootopia 2" scheme="https://blog.goodboyboy.top/tags/Zootopia-2/"/>
    
  </entry>
  
  <entry>
    <title>进程调度——时间片轮转</title>
    <link href="https://blog.goodboyboy.top/posts/2351378595.html"/>
    <id>https://blog.goodboyboy.top/posts/2351378595.html</id>
    <published>2025-11-23T05:35:36.000Z</published>
    <updated>2025-11-23T05:35:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>时间片轮转调度是一种最古老，最简单，最公平且使用最广的算法，又称RR调度。每个进程被分配一个时间段，称作它的时间片，即该进程允许运行的时间。</p><p>更多介绍请看-&gt; <a href="https://baike.baidu.com/item/%E6%97%B6%E9%97%B4%E7%89%87%E8%BD%AE%E8%BD%AC/7256857">时间片轮转_百度百科</a></p><p>自己用C简单实现了一下模拟时间片轮换，列队采用单向链表，在PCB释放上稍显啰嗦，如果用双向链表或者改用C++的vector容器的话代码会清晰很多。</p><h2 id="代码">代码</h2><blockquote><p>应该没什么奇怪的Bug了（确信</p></blockquote><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">enum</span> <span class="title">pstate</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    READY,</span><br><span class="line">    RUNNING,</span><br><span class="line">    FINISHED</span><br><span class="line">&#125; pstate;</span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">PCB</span></span></span><br><span class="line"><span class="class">&#123;</span></span><br><span class="line">    <span class="comment">// 进程号</span></span><br><span class="line">    <span class="type">int</span> pid;</span><br><span class="line">    <span class="comment">// 进程状态</span></span><br><span class="line">    pstate state;</span><br><span class="line">    <span class="comment">// 到达时间</span></span><br><span class="line">    <span class="type">int</span> arrivetime;</span><br><span class="line">    <span class="comment">// 还需要运行时间</span></span><br><span class="line">    <span class="type">int</span> runtime;</span><br><span class="line">    <span class="comment">// 优先级</span></span><br><span class="line">    <span class="type">int</span> prior;</span><br><span class="line">    <span class="comment">// 下一个PCB指针</span></span><br><span class="line">    <span class="class"><span class="keyword">struct</span> <span class="title">PCB</span> *<span class="title">next</span>;</span></span><br><span class="line">&#125; PCB;</span><br><span class="line"></span><br><span class="line"><span class="type">int</span> <span class="title function_">main</span><span class="params">()</span></span><br><span class="line">&#123;</span><br><span class="line">    srand(<span class="number">20</span>);</span><br><span class="line">    <span class="comment">// 时间片</span></span><br><span class="line">    <span class="type">int</span> pian = <span class="number">3</span>;</span><br><span class="line">    <span class="comment">// 进程数量</span></span><br><span class="line">    <span class="type">int</span> p_num = <span class="number">5</span>;</span><br><span class="line">    <span class="comment">// 初始化进程列队</span></span><br><span class="line">    <span class="type">int</span> pid_count = <span class="number">1</span>;</span><br><span class="line">    PCB *head = (PCB *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(PCB));</span><br><span class="line">    head-&gt;pid = <span class="number">-1</span>;</span><br><span class="line">    head-&gt;prior = <span class="number">-1</span>;</span><br><span class="line">    head-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line">    PCB *current = head;</span><br><span class="line">    <span class="keyword">while</span> (p_num &gt; <span class="number">0</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        PCB *new_pcb = (PCB *)<span class="built_in">malloc</span>(<span class="keyword">sizeof</span>(PCB));</span><br><span class="line"></span><br><span class="line">        new_pcb-&gt;pid = pid_count;</span><br><span class="line">        pid_count++;</span><br><span class="line">        new_pcb-&gt;state = READY;</span><br><span class="line">        new_pcb-&gt;arrivetime = rand() % <span class="number">20</span>;</span><br><span class="line">        new_pcb-&gt;runtime = rand() % <span class="number">10</span> + <span class="number">1</span>;</span><br><span class="line">        new_pcb-&gt;prior = rand() % <span class="number">10</span> + <span class="number">1</span>;</span><br><span class="line">        new_pcb-&gt;next = <span class="literal">NULL</span>;</span><br><span class="line"></span><br><span class="line">        current-&gt;next = new_pcb;</span><br><span class="line">        current = current-&gt;next;</span><br><span class="line">        p_num--;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 开始</span></span><br><span class="line">    <span class="type">int</span> now_time = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> (<span class="number">1</span>)</span><br><span class="line">    &#123;</span><br><span class="line">        PCB *ahead_current = head;</span><br><span class="line">        current = head-&gt;next;</span><br><span class="line">        <span class="comment">// 当列队中所有pcb已执行完毕</span></span><br><span class="line">        <span class="keyword">if</span> (current == <span class="literal">NULL</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 获取已到达的优先级最高的进程</span></span><br><span class="line">        PCB *ahead_pcb = <span class="literal">NULL</span>;</span><br><span class="line">        PCB *max_prior_pcb = head;</span><br><span class="line">        <span class="keyword">while</span> (current != <span class="literal">NULL</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">if</span> (current-&gt;arrivetime &lt;= now_time &amp;&amp; current-&gt;state == READY &amp;&amp; current-&gt;prior &gt;= max_prior_pcb-&gt;prior)</span><br><span class="line">            &#123;</span><br><span class="line">                max_prior_pcb = current;</span><br><span class="line">                ahead_pcb = ahead_current;</span><br><span class="line">            &#125;</span><br><span class="line">            ahead_current = current;</span><br><span class="line">            current = current-&gt;next;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 当列队中均等待</span></span><br><span class="line">        <span class="keyword">if</span> (max_prior_pcb-&gt;pid &lt; <span class="number">0</span>)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;当前时间为:%d 等待程序到达中……\n&quot;</span>,now_time);</span><br><span class="line">            now_time += <span class="number">1</span>;</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        &#125;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 开始执行</span></span><br><span class="line">        <span class="comment">// 切换PCB状态</span></span><br><span class="line">        max_prior_pcb-&gt;state = RUNNING;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">&quot;当前执行程序：PID:%d 到达时间:%d 剩余时间:%d 优先级:%d\n&quot;</span>, max_prior_pcb-&gt;pid, max_prior_pcb-&gt;arrivetime, max_prior_pcb-&gt;runtime, max_prior_pcb-&gt;prior);</span><br><span class="line">        <span class="comment">// 判断时间片内是否执行完</span></span><br><span class="line">        <span class="keyword">if</span> (max_prior_pcb-&gt;runtime &lt;= pian)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 当前时间增加</span></span><br><span class="line">            now_time += max_prior_pcb-&gt;runtime;</span><br><span class="line">            <span class="comment">// pcb剩余时间归零</span></span><br><span class="line">            max_prior_pcb-&gt;runtime = <span class="number">0</span>;</span><br><span class="line">            <span class="comment">// pcb状态完成</span></span><br><span class="line">            max_prior_pcb-&gt;state = FINISHED;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;当前程序执行完成：PID:%d 剩余时间:%d 状态:已完成 当前时间:%d\n\n&quot;</span>, max_prior_pcb-&gt;pid, max_prior_pcb-&gt;runtime,now_time);</span><br><span class="line">            <span class="comment">// 移出列队</span></span><br><span class="line">            ahead_pcb-&gt;next = max_prior_pcb-&gt;next;</span><br><span class="line">            <span class="built_in">free</span>(max_prior_pcb);</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        &#123;</span><br><span class="line">            <span class="comment">// 当前时间增加</span></span><br><span class="line">            now_time += pian;</span><br><span class="line">            <span class="comment">// 计算pcb剩余时间</span></span><br><span class="line">            max_prior_pcb-&gt;runtime = (max_prior_pcb-&gt;runtime - pian);</span><br><span class="line">            <span class="comment">// pcb状态就绪</span></span><br><span class="line">            max_prior_pcb-&gt;state = READY;</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">&quot;当前程序时间片已耗费完：PID:%d 剩余时间:%d 状态:等待继续 当前时间:%d\n\n&quot;</span>, max_prior_pcb-&gt;pid, max_prior_pcb-&gt;runtime,now_time);</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">&quot;所有程序已执行完毕：花费时间：%d\n&quot;</span>, now_time);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;时间片轮转调度是一种最古老，最简单，最公平且使用最广的算法，又称RR调度。每个进程被分配一个时间段，称作它的时间片，即该进程允许运行的时间。&lt;/p&gt;
&lt;p&gt;更多介绍请看-&amp;gt; &lt;a href=&quot;https://baike.baid</summary>
      
    
    
    
    <category term="笔记" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/"/>
    
    <category term="操作系统" scheme="https://blog.goodboyboy.top/categories/%E7%AC%94%E8%AE%B0/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
    
    <category term="时间片轮转" scheme="https://blog.goodboyboy.top/tags/%E6%97%B6%E9%97%B4%E7%89%87%E8%BD%AE%E8%BD%AC/"/>
    
    <category term="进程调度" scheme="https://blog.goodboyboy.top/tags/%E8%BF%9B%E7%A8%8B%E8%B0%83%E5%BA%A6/"/>
    
  </entry>
  
  <entry>
    <title>效果是真的好，劲也是真的大</title>
    <link href="https://blog.goodboyboy.top/posts/1868954851.html"/>
    <id>https://blog.goodboyboy.top/posts/1868954851.html</id>
    <published>2025-11-09T05:52:24.000Z</published>
    <updated>2025-11-09T05:52:24.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近湖南又降温了（湖南的天气只有冬天和夏天，以及冬夏频繁交互的季节🤣），又是流感高发期，不出意外我又又又得流感了。。。</p><h2 id="前期">前期</h2><p>一开始我就当普通感冒没管，结果过了一天病情突然加重，死命的咳嗽，半夜也猛猛咳嗽，联想到最近班上同学的感冒情况，大概又是得流感了</p><h2 id="看医">看医</h2><p>一开始是打算去校医院买要，毕竟医保可以报销一部分药，结果开出来tm全是OTC中成药。。。</p><p>虽然我知道我们学校校医院也是水得要命，已经不抱什么希望了，不过还是打算先吃几天看看。</p><p>吃了大概两三天，效果是有一点点，鼻涕少了一些，头痛好了很多，但是还是咳嗽，并没有治本，于是打算自己买药</p><h2 id="买药">买药</h2><p>我一般买药是在网上买，懒得跑去线下被药店各种推销</p><p>首先就是奥司他韦，这玩意抗流感效果是真的好，而且也有国产，效果也不错（原研奥司他韦还是蛮贵的，一盒好像是两百多块）</p><p>然后看推荐搭配有999感冒灵，于是顺带也买了</p><p>到货后我妈说让我买点消炎药，因为我喉炎也比较严重，一感冒喉炎就发，翻了下柜子，突然发现还有半盒没吃完的罗红霉素</p><p>挨个看了下说明书，感冒灵主要是不能和对乙酰氨基酚药物同时使用，奥司他韦主要成分就是磷酸奥司他韦，罗红霉素顾名思义。</p><p>奥司他韦的话主要是可能和减毒活流感疫苗出现相互作用，在接种减毒活流感疫苗两周内不建议服用奥司他韦</p><p>罗红霉素的话说明书中的药物相互作用一栏内的药我也没吃</p><p>综合下来就是止咳+抗病毒（抗流感）+抗生素（消炎）</p><h2 id="效果">效果</h2><p>吃了两天，效果立竿见影</p><p>白天基本上只少部分时间可能会轻微咳嗽，晚上也只是咳嗽一两次</p><p>不过副作用也挺明显，奥司他韦和罗红霉素两种药物不良反应中都有恶心、呕吐</p><p>之前我都是饭后才吃，虽然也有轻微恶心症状，但还算好，今早空腹吃了一次，穿完衣服就开始恶心了😂（药效发挥的属实是太快了）</p><p>没办法只好去吃袁记云饺，吃点清淡的，结果越吃越恶心，看来是一点油都沾不了😂</p><h2 id="后记">后记</h2><p>999也是催眠高手，吃完后昏昏欲睡，精神不振（感冒药通病），难怪说明书上特别写着服用后禁止驾驶机、车、船🤣。</p><p>希望这次感冒快点好吧。。。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近湖南又降温了（湖南的天气只有冬天和夏天，以及冬夏频繁交互的季节🤣），又是流感高发期，不出意外我又又又得流感了。。。&lt;/p&gt;
&lt;h2 id=&quot;前期&quot;&gt;前期&lt;/h2&gt;
&lt;p&gt;一开始我就当普通感冒没管，结果过了一天病情突然加重，死命的</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="流感" scheme="https://blog.goodboyboy.top/tags/%E6%B5%81%E6%84%9F/"/>
    
  </entry>
  
  <entry>
    <title>不买立省100%</title>
    <link href="https://blog.goodboyboy.top/posts/2583638282.html"/>
    <id>https://blog.goodboyboy.top/posts/2583638282.html</id>
    <published>2025-11-01T03:21:40.000Z</published>
    <updated>2025-11-01T03:21:40.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近想入手一下OPPO Pad4 Pro，刚好也是双十一，结果给我拉了坨大的</p><h2 id="正文">正文</h2><p>之前就准备买OPPO Pad4 Pro的16+512，四代比三代好看多了，而且各种配置看起来也不错，不过新品发售价格不美丽</p><p>众所周知，国产电子产品一年后价格基本上都跳水严重，所以打算蹲一手</p><p>本来说等到今年10月那会pad 5发售，看看能不能降价，结果就降了200。。。你的pad3 pro可不是只降这么点</p><p>16+512的从4099降到3899，12+512的从3899降到3699</p><p>算上国补500块16+512还到3399，12+512则是3199</p><p>属实是一点没给我补，全补商家去了</p><p>不过要是开京东plus，一年99，去除购买费用，那么16+512还可以补290，价格来到3109，12+512的补270，价格来到2929</p><p>而且学生购机还送OPPO Pencil 2，虽然说是价值399，这会打个折差不多也350左右</p><p>算是勉强到我心理预期了（虽然我的心理预期是3000+送笔😆），吃相都一个样懒得喷</p><p>但是这一切的前提是能抢到国补🤣</p><p>众所周知，湖南国补那点券能抢到真就是走狗屎运了，所以不出意外的还是没抢到😅</p><p>虽然京东自己开了补贴，用京东支付不用抢国补，但是16+512的配置只减389，反而是12+512的减500</p><p>这样的话那基本上就只能选择12+512了，也不是不能用</p><h2 id="不买立省100">不买立省100%</h2><p>不过就在我把资金汇总的时候，越想越气，发布了一年新款还出来了结果就只减200，当时10月的时候就写着活动时间是10.15-10.31，以为到11.1价格会改一下，结果只是改个活动日期，活动继续，价格不变😅</p><p>而且，你要说有保价不好降官网价，那至少发个优惠券呀，还不发优惠券，那双十一双了个寂寞，第三方店还可以3000减200</p><p>最后国补还没抢到</p><p>反正又不是刚需，不买立省100%，谁爱买谁买😅</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近想入手一下OPPO Pad4 Pro，刚好也是双十一，结果给我拉了坨大的&lt;/p&gt;
&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;之前就准备买OPPO Pad4 Pro的16+512，四代比三代好看多了，而且各种配置看起来也不错，不</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="购物" scheme="https://blog.goodboyboy.top/tags/%E8%B4%AD%E7%89%A9/"/>
    
    <category term="平板" scheme="https://blog.goodboyboy.top/tags/%E5%B9%B3%E6%9D%BF/"/>
    
    <category term="国补" scheme="https://blog.goodboyboy.top/tags/%E5%9B%BD%E8%A1%A5/"/>
    
  </entry>
  
  <entry>
    <title>十月小记</title>
    <link href="https://blog.goodboyboy.top/posts/734778049.html"/>
    <id>https://blog.goodboyboy.top/posts/734778049.html</id>
    <published>2025-10-31T08:57:40.000Z</published>
    <updated>2025-10-31T09:23:35.709Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>这个月差不多都是些零零散散的琐事，就用一篇小记来总结吧。</p><h2 id="国庆">国庆</h2><p>国庆大部分还是在学校玩，一个人去自助餐吃了一顿，然后就是最后一天去醴陵转了一圈。</p><p>不得不说，醴陵交通还是有些不方便，等部分线路公交车等半天，而且也没有共享电单车，走路脚都走痛了</p><h2 id="实验室搬迁">实验室搬迁</h2><p>由于今年学校研究生扩招，导致我们原来的实验室被划为研究生工位，一堆东西要搬走，不过我的东西倒不多</p><p>不过最难蚌的还是搬到新地方后，还没过几天，又被划为研究生工位了。。。</p><p>然后就是又搬迁……</p><h2 id="参会">参会</h2><p>然后就是参加了一个工业软件创新发展大会，不过因为下午临时有座谈会，和同学交接完工作后就打车回学校了</p><h2 id="参观工厂">参观工厂</h2><p>报名的时候以为是参观科技公司，结果发现是参观工业类的公司qwq，整个队伍里计算机专业的就两三个人，其他全是电气自动化，机械专业的，感觉报错活动了（</p><p>不过倒也蛮有趣的，上午参观了一下本地的一个生产车间（不得不说有个车间味道是真的大。。。</p><p>还有就是去参观了一个通航企业，看了一下他们公司的直升机</p><p>中午免费蹭了顿饭，好吃（逃</p><p>下午则是去参观了一家水泥厂公司，然后听了个就业讲座，感觉还不错，没白来😄</p><h2 id="团建">团建</h2><p>和部门里新来的干事们一起去大碗先生吃了顿饭，然后去KTV唱歌</p><p>他们在那里摇色子，我就在那唱歌😂</p><p>不得不说，团建人多就是好，饭钱平均下来每人30+，KTV平均下来每人才11块，还送了24瓶啤酒😂</p><hr><p>全文完，感谢阅读。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;这个月差不多都是些零零散散的琐事，就用一篇小记来总结吧。&lt;/p&gt;
&lt;h2 id=&quot;国庆&quot;&gt;国庆&lt;/h2&gt;
&lt;p&gt;国庆大部分还是在学校玩，一个人去自助餐吃了一顿，然后就是最后一天去醴陵转了一圈。&lt;/p&gt;
&lt;p&gt;不得不说，醴陵交通还是有些</summary>
      
    
    
    
    
  </entry>
  
  <entry>
    <title>新增外设漫步者G1500bar</title>
    <link href="https://blog.goodboyboy.top/posts/426277464.html"/>
    <id>https://blog.goodboyboy.top/posts/426277464.html</id>
    <published>2025-09-18T11:30:19.000Z</published>
    <updated>2025-09-18T11:30:19.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="起因">起因</h2><p>之前的那个音响坏了，用了一年多，过保没多久，没办法，只能重新买个了</p><h2 id="物色">物色</h2><p>在网上物色了一会，知道百元价位就纯听个响，也就没多苛求什么了</p><p>找了一圈，看上了g1500bar，主要还是这个外观设计比较戳我，7.1声道什么的无所谓，效果还不如不开</p><p>但是价格有点贵，日常价是199，但是经常打折到170左右</p><p>然而就当我打算买的时候，我发现这玩意居然也能用国补，能减20块钱，但总所周知，下半年的国补真的一言难尽，只能用“如补”来形容</p><p>现在湖南国补改成了每月一号抢，再看这发券量，能抢上就有鬼了，之前听有些人说抢了40多分钟才抢到，为了那20块钱浪费我半个小时实在没必要，少吃一顿就节省出来了。。。</p><p>最近打算不等了，等它降价到170多就买</p><h2 id="下单">下单</h2><p>今天发现它上了京东的国家补贴，不用去逆天云闪付抢券，又去搜刮了几块钱的券，折合下来也差不多是170多</p><p>下单的时候买了个8块的三年三包故障无忧焕新，不想再被搞心态，过保就报废。。。</p><p>因为今早下单下得早，今日达下午六点就到学校驿站了</p><h2 id="使用">使用</h2><p>听个响，中规中矩吧</p><p>试了一下麦克风，也没像网上说的那样不堪，感觉收音还不错</p><p>一开始都还不知道下面那个灯条是rgb，以为就一个颜色，看了说明书才发现原来是rgb灯条，还能音频响应（喜</p><p>而且当初也是当usb音响买的，突然想起这玩意也能用蓝牙连接，可以当蓝牙音响玩了（doge</p><p>因为电脑A口就两个，一个A口接了个USB HUB，一开始我把音响插HUB上，系统里看到了设备，但是就是无法输出声音，然后Windows就提示无法正常启动这个USB设备</p><p>我想这玩意又要从USB取电，又要传递数据，会不会是HUB的问题，接到另一个A口上后果然就正常了</p><p>然后这个音响还有软件，软件里可以调的功能还比较多，试了一圈下来我就开了个清晰度增强和动态低音，这两个功能确实是能让我明显感到变化，特别是动态低音，效果还不错（喜</p><p>来张桌面图（doge</p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/18/x3o07m.webp" alt="桌面"></p><h2 id="后记">后记</h2><p>总体来说还不错，又是满意的一次购物体验😁</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;起因&quot;&gt;起因&lt;/h2&gt;
&lt;p&gt;之前的那个音响坏了，用了一年多，过保没多久，没办法，只能重新买个了&lt;/p&gt;
&lt;h2 id=&quot;物色&quot;&gt;物色&lt;/h2&gt;
&lt;p&gt;在网上物色了一会，知道百元价位就纯听个响，也就没多苛求什么了&lt;/p&gt;
&lt;p&gt;找了一圈，看上了g1500bar，主</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="外设" scheme="https://blog.goodboyboy.top/tags/%E5%A4%96%E8%AE%BE/"/>
    
    <category term="音响" scheme="https://blog.goodboyboy.top/tags/%E9%9F%B3%E5%93%8D/"/>
    
    <category term="漫步者" scheme="https://blog.goodboyboy.top/tags/%E6%BC%AB%E6%AD%A5%E8%80%85/"/>
    
  </entry>
  
  <entry>
    <title>欢迎招行万事达加入卡包大家庭</title>
    <link href="https://blog.goodboyboy.top/posts/1436642200.html"/>
    <id>https://blog.goodboyboy.top/posts/1436642200.html</id>
    <published>2025-09-16T14:16:40.000Z</published>
    <updated>2025-09-16T14:16:40.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>上个星期去网点，结果网点说系统还没升级，只能申请金葵花卡，让我等一个星期后再看看，来之前还可以先打网点电话问问。</p><p>等了一个星期，刚好今天下午没课，择日不如撞日，那就今天吧（doge）<br>保险起见先call一下网点电话，问了一下网点现在可以开普卡了，于是打车猛猛去网点</p><h2 id="开卡">开卡</h2><p>招行分行果然没让我失望，开卡流程顺畅无比，没额外要求任何证明材料，一张身份证即可，而且柜员业务熟练，裤裤就帮我开好了</p><p>而且限额直接就是学生能开的顶级，每日5k，<br>我之前那张招行的一类卡还是花了一个月才从2k升到了5k</p><p>最后小姐姐问我能不能100块存三个月定期，他们有任务，能不能帮个忙。既然人家服务这么好，这点小忙能帮还是会帮的啦，便存了100块的三个月定期。</p><p>暂时没绑在Google play上，因为我怕把地区弄回国区了，不过PayPal上倒是绑了试了一下，可以正常绑定。</p><p>这张卡是普卡（但是卡背面印刷着platinum debit），支持开为二类户，完全不影响原先的一类卡，而且支持APP查询预授权，无每月150元的账户管理费</p><p>卡支付来说，100%冻结比例，支持3ds（非强制），支持自动兑换货币（不占用每人每年5w美元额度），人民币账户，支持绑定微信支付宝，境外消费5‰返现，每月免首笔境外ATM取款手续费，境外ATM查询手续费、货币兑换手续费全免，而且听说汇率走的是万事达的汇率，比银行汇率优惠一丢丢</p><p>可以说国内万事达借记卡中，将它称之为神卡不过分吧</p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/16/65dea9ae3e7c5bbb5242406c757596e991b3492fd52018ad27de291984254ebc.jpg" alt="卡片"></p><h2 id="后记">后记</h2><p>自从中信的金貔貅支持自动兑换货币后，邮储那张万事达在我心中的地位就跌入底谷了，毕竟强制3ds这一点真的就拒了很多海外网站</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;上个星期去网点，结果网点说系统还没升级，只能申请金葵花卡，让我等一个星期后再看看，来之前还可以先打网点电话问问。&lt;/p&gt;
&lt;p&gt;等了一个星期，刚好今天下午没课，择日不如撞日，那就今天吧（doge）&lt;br&gt;
保险起见先call一下网点电</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="万事达" scheme="https://blog.goodboyboy.top/tags/%E4%B8%87%E4%BA%8B%E8%BE%BE/"/>
    
    <category term="招行" scheme="https://blog.goodboyboy.top/tags/%E6%8B%9B%E8%A1%8C/"/>
    
  </entry>
  
  <entry>
    <title>博客十周年啦🎉</title>
    <link href="https://blog.goodboyboy.top/posts/3021178758.html"/>
    <id>https://blog.goodboyboy.top/posts/3021178758.html</id>
    <published>2025-09-04T02:04:03.000Z</published>
    <updated>2025-09-04T02:04:03.000Z</updated>
    
    <content type="html"><![CDATA[<iframe frameborder="no" border="0" marginwidth="0" marginheight="0" width=330 height=86 src="//music.163.com/outchain/player?type=2&id=554929687&auto=1&height=66"></iframe><p>今天逛了逛博客，发现已经十周年了诶😄</p><h2 id="小学">小学</h2><p>还记得最开始那会，自己什么也不懂，不懂网站，不懂域名，更不用说html，js之类的，只是觉得这些网站很神奇。</p><p>在网上兜兜转转，用搜索引擎搜索，去大佬群里问，后来不知道在哪里看到，找到了一个叫领地网的网站，开启了我最初的博客生涯</p><p>其实那会领地网的模式有点类似现在的csdn，你在它的平台上发文章，而且只能写文字，也插入不了html和js</p><p>不过确实是让我在互联网中，第一次有了一块自己的小空间，开启了我的博客1.0</p><p>后来，领地网升级改版，这个网站也就不了了之</p><p>之后转向了安卓APP，在网上找了一个叫叮铛APP的APP设计平台，都是模块化设计，不用代码知识，对于当时的我来说刚刚好</p><p>还记得那会在官方群里和各个大佬交流，特别有趣</p><p>只是好景不长，平台从2.0升级到3.0后就改成收费的了，当时群里听说3.0要出来了还特别兴奋，结果出来后就改成收费，没办法，只好放弃app</p><h2 id="初中">初中</h2><p>到初一后，家里有了电脑，我开始接触更多信息，了解到虚拟主机，便在网上找免费的虚拟主机</p><p>我记得最开始接触的是一个叫3vfree的虚拟主机网站，提供100M的免费空间，仅支持静态html和asp</p><p>虽然配置低，但是当时也玩得起劲，还在网上找了许多asp网站程序，玩得不亦乐乎，只是这个免费虚拟主机会在你的网站底部自动加上广告。。。</p><p>后面又了解到云邦互联这个网站，提供免费虚拟主机，但是好像只有半个月有效期，续期需要去各个论坛发广告审核，用了一段日子，直到一次因为审核晚了数据都被清了，就再也没用这个网站</p><p>那会还买了自己第一个域名，不过因为有点中二，后来换成了现在的域名</p><p>之后又断断续续找了很多免费的虚拟主机网站，但是都不稳定，而且那会重心也从网站转向写程序</p><p>安卓app暂时没头绪，无意间了解到C#的netframwork，开始写winform程序</p><p>一直到初三上吧，重心才又开始转向网站，中间这段混乱的时间算是我的博客2.0</p><p>时间来到初三，当时阿里云好像是有个学生机器优惠，每个月只要9.9，那会非443端口的网站还不需要备案，我便用那个优惠机器搭网站</p><p>那会开始了解到宝塔面板，最开始Windows宝塔面板还有设置GUI，可以在GUI里面调整网站配置，后面倒是全搬到web面板中了</p><p>也多亏了宝塔，让我的网站搭建之路很顺畅，不用折腾MySQL，apache这些环境</p><p>也是从这里开始，我用上了真正的博客程序，emlog，搭配了一个当时emlog中超好看的叫colorful的主题，开始我的博客3.0</p><h2 id="高中">高中</h2><p>到高一的时候，emlog从5.x升级到了7.x，emlog5被爆出有漏洞，但是colorful主题并不支持emlog7，没办法，只好舍弃了emlog</p><p>与此同时，我又了解到了wordpress，便搭建了一个wordpress，把文章全部迁移到了wordpress</p><p>但众所周知，wordpress十分臃肿，阿里的9.9小鸡根本扛不住，再加上寒假那会我还要那它开mc服务器（狠狠压榨了🤣），大部分时间其实都花在怎么优化wordpress，不过好在在我高中学业繁忙之前弄好了</p><p>到了高二高三，就真的没有时间去打理网站了，一直忙着学业，而且那会又突然喜欢上写程序，白天课余时间构思，在纸上写程序框架和逻辑，写伪代码，星期天就用3个小时的时间在家里实现</p><p>别人周末打游戏，我周末就写程序😂</p><p>不知不觉，高中生活转瞬即逝，转眼就进入了大学生活</p><h2 id="大学">大学</h2><p>到了大学，那时间就是大把大把的多😆</p><p>给自己的博客换了一个好看的主题，叫pjax sakura，同时也开始混博客圈，算是正式进入博客4.0</p><p>我记得应该是和 <a href="https://blog.moeworld.tech/">晓空</a> 互换了第一个友情链接，他博客现在用的主题就是pjax sakura</p><p>我的博客同时也于2022年12月10日加入了开往，于2022年12月31日加入了十年之约</p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/04/k5u4pq.webp" alt="开往"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/04/k5tmql.webp" alt="十年之约"></p><p>后来是实在忍受不了wordpress的臃肿，在了解到hexo后就直接转了hexo，用上了butterfly主题（也就是现在用的这个）</p><p>同时也给博客做了版本控制：</p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/04/k8s4bb.webp" alt="开始"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/09/04/k8xrbs.webp" alt="现在"></p><h2 id="未完待续">未完待续</h2><p>一路陪伴，感谢有你❤️</p>]]></content>
    
    
      
      
    <summary type="html">&lt;iframe frameborder=&quot;no&quot; border=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; width=330 height=86 src=&quot;//music.163.com/outchain/player?type=2&amp;id=5549</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E5%9B%9E%E5%BF%86/"/>
    
    
    <category term="博客" scheme="https://blog.goodboyboy.top/tags/%E5%8D%9A%E5%AE%A2/"/>
    
    <category term="十周年" scheme="https://blog.goodboyboy.top/tags/%E5%8D%81%E5%91%A8%E5%B9%B4/"/>
    
    <category term="回忆" scheme="https://blog.goodboyboy.top/tags/%E5%9B%9E%E5%BF%86/"/>
    
  </entry>
  
  <entry>
    <title>ESP32 S3开发小结</title>
    <link href="https://blog.goodboyboy.top/posts/4228956106.html"/>
    <id>https://blog.goodboyboy.top/posts/4228956106.html</id>
    <published>2025-08-23T12:30:38.000Z</published>
    <updated>2025-08-23T12:30:38.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="小结">小结</h2><p>在历经状态机设计，爆栈，中文字体缺失，URL编码问题，C++野指针，页面竞争，任务假死，二维码无法扫描等亿系列问题后，终于弄好了。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/23/xn20au.webp" alt="授权二维码"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/23/xnlaox.webp" alt="授权成功"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/23/xn8zd0.webp" alt="授权成功"></p><h2 id="目标">目标</h2><p>采用OAuth2的设备码授权方式，设备请求用户代码并向用户展示，由用户在自己的设备上进行授权，授权完成后ESP32拿到令牌，然后对用户资源进行访问。</p><h2 id="已实现功能">已实现功能</h2><h3 id="系统">系统</h3><p>采用FreeRTOS任务模式，实现多任务并发，结合排他锁解决并发竟态问题。</p><h3 id="WIFI">WIFI</h3><p>支持断线重连，当出现断线时自动切换任务。</p><h3 id="UI">UI</h3><p>支持切换不同页面，为不同功能页提供显示功能。</p><h3 id="OAuth">OAuth</h3><p>支持自动轮询授权情况，并支持当授权链接失效时自动重新获取以及生成二维码。</p><h2 id="不足">不足</h2><p>感觉还不是最佳实践，系统健壮性不高，无法支撑复杂功能（未验证）</p><p>屏幕还是太小了，128*64的分辨率一个正常包含链接的二维码都塞不下去，目前只能用二维码展示用户授权所需的用户代码，无法展示完整授权链接，可能需要制作一个专用APP用于扫码来拼接授权链接并在用户端调起授权。</p><h2 id="下一步方向">下一步方向</h2><p>寻找最佳实践的设计，增加系统健壮性，目前状态机设计还有提升空间</p><p>支持复杂的交互操作，支持16键输入控制系统以及页面，实现菜单选择等</p><p>接入NFC控件，便于用户进行碰一碰授权操作</p><p>接入蓝牙通信，动态控制设备连接附近WIFI（可能需要制作配套APP）</p><p>接入MQTT，实现远程控制（已实现样例）</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;小结&quot;&gt;小结&lt;/h2&gt;
&lt;p&gt;在历经状态机设计，爆栈，中文字体缺失，URL编码问题，C++野指针，页面竞争，任务假死，二维码无法扫描等亿系列问题后，终于弄好了。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.goodboyboy.top/imgs/20</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="ESP32" scheme="https://blog.goodboyboy.top/tags/ESP32/"/>
    
  </entry>
  
  <entry>
    <title>ESP32 S3外设小记</title>
    <link href="https://blog.goodboyboy.top/posts/2709354330.html"/>
    <id>https://blog.goodboyboy.top/posts/2709354330.html</id>
    <published>2025-08-22T11:03:36.000Z</published>
    <updated>2025-08-22T11:03:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>最近玩ESP32玩得起劲（太好玩了），光做软件上的编程还差点意思，昨天只实现了MQTT远程点灯，于是今天打算利用好这30多个GPIO口玩玩硬件上的。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/22/w9n8zx.webp" alt="点绿灯"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/22/w9v76y.webp" alt="点红灯"></p><h2 id="踩坑">踩坑</h2><p>因为是第一次玩，什么硬件知识都不懂，顶多了解了一点课上学的模电数电知识（还是非电气专业的课程，属于是基础中的基础），也不敢乱接（金属膜电阻都不会认，100欧的电阻找了半天），于是猛猛问ChatGPT</p><p>之前买了好几个有趣的外设，例如红外接收器，显示屏，有按键的数码管。</p><p>感觉有按键的数码管更好玩，16个按键可以设置16个状态，不用老是重新烧写（每次编译时间还不短。。。）</p><p>找客服要了一份资料，本来是打算只要一个管脚图的，客服发了一堆资料（手册，电路图等等），感觉事情的不简单</p><p>里面找到了一份TM1638B（驱动芯片）的Arduino工程文件，打开一看200多行代码（给刚点完灯的小白亿点点震惊）</p><p>尝试看了一下代码，嗯，完全看不懂。。。</p><p>不过无所谓，打算先烧上去再说，看看怎么玩</p><p>编译完成后，问了问ChatGPT该怎么组装</p><p>然而我发现这玩意的工作电压是5V，问了一下ChatGPT，才发现ESP32 S3是3.3V，两者不能直接连接</p><p>详细问了一下，才知道要电平转换，而且查了一下资料，这个芯片最低高电平电压是0.7*VDD，也就是至少要3.5V，3.3V完全不够，并且从TM1638B向ESP32传输数据时5V直接进GPIO口也会烧坏板子</p><p>没办法，那只能去淘宝物色一下电平转换的模块了</p><h2 id="尝试">尝试</h2><p>又看了一下红外接收器，发现也要5V，不过显示屏倒只要3.3V就能驱动，于是找ChatGPT又开始问东问西</p><p>然后就又了解到I2C是开漏输出，需要外部上拉电阻，4.4k欧或者10k欧，用于上拉信号，但是我没有4.4k欧的，只好用10k欧的</p><p>组装好电路后，找ChatGPT要了一份代码，就当我以为ok时，刷完固件显示屏直接花屏。。。</p><p>折腾过去又折腾过来，从I2C地址到线材通信等等，最后发现是我芯片提供错了，我用的这个OLED显示屏驱动芯片是SH1106，我给ChatGPT说成另一款屏幕的SSD1306了😅</p><p>ChatGPT一个流汗黄豆塞我脸上🤣</p><p>换了新的代码终于是能跑了。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/08/22/wa9mmb.webp" alt="点亮屏幕"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;最近玩ESP32玩得起劲（太好玩了），光做软件上的编程还差点意思，昨天只实现了MQTT远程点灯，于是今天打算利用好这30多个GPIO口玩玩硬件上的。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.goodboyboy.to</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
    <category term="ESP32" scheme="https://blog.goodboyboy.top/tags/ESP32/"/>
    
  </entry>
  
  <entry>
    <title>Arduino+VSCode开发ESP32-S3</title>
    <link href="https://blog.goodboyboy.top/posts/1775233746.html"/>
    <id>https://blog.goodboyboy.top/posts/1775233746.html</id>
    <published>2025-08-20T14:11:49.000Z</published>
    <updated>2025-08-20T14:11:49.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>Arduino IDE对于我来说太难用了，不过本质还是C++开发，理论上VSCode也可以。</p><h2 id="安装-Arduino-CLI">安装 Arduino CLI</h2><p>Arduino不仅提供了IDE，也提供有命令行工具</p><p>首先安装Arduino CLI，在 <a href="https://docs.arduino.cc/arduino-cli/installation/">https://docs.arduino.cc/arduino-cli/installation/</a> 中找到适合自己系统的Arduino CLI并进行安装。</p><p>安装完成后输入<code>arduino-cli help core</code>确保已经正常安装。</p><h2 id="配置-Arduino-CLI">配置 Arduino CLI</h2><p>首先需要初始化Arduino CLI</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arduino-cli config init</span><br></pre></td></tr></table></figure><p>配置“用户目录”，该目录会用于存放第三方库等等，推荐和config设置为一个路径</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arduino-cli config <span class="built_in">set</span> directories.user <span class="string">&quot;用户目录路径&quot;</span></span><br></pre></td></tr></table></figure><p>然后添加官方的加速源，否则可能下载会十分慢</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arduino-cli config <span class="built_in">set</span> board_manager.additional_urls https://jihulab.com/esp-mirror/espressif/arduino-esp32/-/raw/gh-pages/package_esp32_index_cn.json</span><br></pre></td></tr></table></figure><p>接着更新板子列表</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">arduino-cli core update-index</span><br></pre></td></tr></table></figure><p>这里我们可以先不下载。</p><h2 id="配置-VSCode与环境">配置 VSCode与环境</h2><p>安装<code>Arduino Maker Workshop</code>插件，然后打开一个文件夹用于工作目录。</p><p>插件安装完成后在侧边栏点击插件，点击<code>Maker Workshop Home</code>，即可打开配置栏。</p><p>首先进入<code>Boards Manager</code>，点击Not Installed标签，搜索<code>esp32</code>，然后点最右边的倒三角展开，版本选择<code>x.x.x-cn</code>，这个才是加速的版本</p><p>然后点击版本旁边的下载按钮开始下载。</p><p>安装完成后进入<code>Board Selection</code>，选择<code>ESP32S3 Dev Module</code>即可。</p><p>接着点击<code>Board Configuration</code>配置板子</p><p><code>Uplaod Speed</code>最好别选921600，太高板子可能承受不住，512000我的可以正常刷入，实际根据板子体质决定。</p><p><code>Flash Mode</code>根据实际情况来决定，部分板子可能支持OPI，可以通过下面命令查看（错误的配置会导致板子无法启动）：</p><blockquote><p>提示esptool找不到则是没安装esptool，如何安装esptool请自行Google</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">esptool flash-id</span><br></pre></td></tr></table></figure><p>然后回输出<code>Flash Memory Information</code>，在<code>Flash type set in eFuse</code>一栏中查看，我的板子是<code>quad (4 data lines)</code></p><p>所以我选择<code>QIO 80MHz</code>，如果你的Flash支持8 data lines则可以选择OPI</p><p><code>Flash Size</code>是多少选多少，我的是N16R8，所以我选择的是<code>16MB</code></p><p><code>Partition Scheme</code>我选的是<code>16M Flash（2MB APP/12.5MB FATFS）</code>，自己根据实际情况选择</p><p><code>PSRAM</code>一般情况下，ESP32-S3-WROOM-1-N4R8/N8R8/N16R8是支持Octal SPI的，可以选择OPI PSRAM</p><p>该文中有详细表：<a href="https://blog.csdn.net/tianizimark/article/details/125264464">https://blog.csdn.net/tianizimark/article/details/125264464</a></p><p><code>Arduino Run On</code>和<code>Events Run On</code>是否要同一个核心看你自己，不同核心的话可能会出现多线程竟态问题（存疑），如果工程简单的话都跑在一个核心上没问题</p><p>剩下的全部默认即可</p><h2 id="编译烧录">编译烧录</h2><p>点击Compile和Upload就行。</p><h2 id="飘红问题">飘红问题</h2><p>有时候安装第三方库include后会飘红，这里只需要编译（Compile）一下，就会自动补齐配置</p><p>如果还是有问题，按住<code>Ctrl+Shift+P</code>打开VSCode的命令栏，找到<code>编辑配置（UI）</code>，指定一下g++位置，包含路径中添加库文件夹即可</p><p>例如我的是<code>C:\Users\GoodBoyboy\AppData\Local\Arduino15\libraries/**</code></p><h2 id="参考">参考</h2><p><a href="https://docs.arduino.cc/arduino-cli/getting-started/">https://docs.arduino.cc/arduino-cli/getting-started/</a></p><p><a href="https://blog.csdn.net/ZHOU_YONG915/article/details/130118049">https://blog.csdn.net/ZHOU_YONG915/article/details/130118049</a></p><p><a href="https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html">https://docs.espressif.com/projects/arduino-esp32/en/latest/installing.html</a></p><p><a href="https://blog.csdn.net/tianizimark/article/details/125264464">https://blog.csdn.net/tianizimark/article/details/125264464</a></p><p><a href="https://blog.csdn.net/tianizimark/article/details/124663902">https://blog.csdn.net/tianizimark/article/details/124663902</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;Arduino IDE对于我来说太难用了，不过本质还是C++开发，理论上VSCode也可以。&lt;/p&gt;
&lt;h2 id=&quot;安装-Arduino-CLI&quot;&gt;安装 Arduino CLI&lt;/h2&gt;
&lt;p&gt;Arduino不仅提供了IDE，也提供</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hardware" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Hardware/"/>
    
    
    <category term="EPS32" scheme="https://blog.goodboyboy.top/tags/EPS32/"/>
    
    <category term="Arduino" scheme="https://blog.goodboyboy.top/tags/Arduino/"/>
    
  </entry>
  
  <entry>
    <title>EPS32-S3刷入MicroPython</title>
    <link href="https://blog.goodboyboy.top/posts/3337643602.html"/>
    <id>https://blog.goodboyboy.top/posts/3337643602.html</id>
    <published>2025-08-18T03:30:16.000Z</published>
    <updated>2025-08-18T03:30:16.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info flat"><p>本教程适合乐鑫官方ESP32-S3模组，非官方模组可能不适用</p></div><h2 id="下载固件">下载固件</h2><blockquote><p>Tips:根据 <a href="https://github.com/micropython/micropython/commit/6201e77999b3614518abc4b21773e735d9b0b0ee">Commit 6201e77</a>，现在MicroPython已经支持自动计算flash大小</p></blockquote><p>进入MicroPython的ESP32 S3的固件下载页面<a href="https://micropython.org/download/ESP32_GENERIC_S3/">https://micropython.org/download/ESP32_GENERIC_S3/</a></p><p>在<code>Firmware (Support for Octal-SPIRAM)</code>下方找到最新的一个固件，点击<code>[.bin]</code>下载bin格式的固件。</p><h2 id="安装刷入工具">安装刷入工具</h2><p>这里使用乐鑫的官方刷入工具<code>esptool</code></p><blockquote><p>没有python环境请先安装python环境</p></blockquote><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">pip install esptool</span><br></pre></td></tr></table></figure><p>安装esptool时会自动配置好环境变量</p><h2 id="刷入固件">刷入固件</h2><p>将EPS32-S3接入计算机，建议使用USB to COM口，即插即用。</p><blockquote><p>一般来说esptool会自动识别COM口，不需要在命令中手动指定；Linux环境下可能需要将命令中的<code>esptool</code>替换为<code>esptool.py</code></p></blockquote><p>首先擦除flash：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">esptool erase_flash</span><br></pre></td></tr></table></figure><p>然后刷入固件：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">esptool --baud 460800 write_flash 0 你的固件.bin</span><br></pre></td></tr></table></figure><p>如果中途刷入失败可以尝试降低或移除<code>--baud 460800</code>（一般不会）</p><h2 id="使用MicroPython">使用MicroPython</h2><p>刷完将板子重接接入计算机，使用各种交互式终端连接对应的COM口即可</p><p>可以使用下面代码查看内存和闪存情况：</p><p>查看内存：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> micropython</span><br><span class="line">micropython.mem_info()</span><br></pre></td></tr></table></figure><p>查看闪存：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> esp</span><br><span class="line">esp.flash_size()</span><br><span class="line"><span class="comment">#或者esp.flash_size()/1024/1024</span></span><br></pre></td></tr></table></figure><h2 id="自行编译固件（可选）">自行编译固件（可选）</h2><h3 id="本地编译">本地编译</h3><blockquote><p>需要良好的网络环境</p></blockquote><p>这里需要使用到IDF</p><p>目前，MicroPython支持IDF v5.2、v5.2.2、v5.3、v5.4、v5.4.1 和 v5.4.2</p><p>环境最好为Linux，Windows下则需要使用WSL</p><p>首先Clone拉取IDF</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> -b v5.4.2 --recursive https://github.com/espressif/esp-idf</span><br></pre></td></tr></table></figure><p>然后安装IDF：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> esp-idf</span><br><span class="line">./install.sh esp32</span><br><span class="line"><span class="built_in">source</span> export.sh <span class="comment">#用于设置环境变量，每个新会话都需要重新设置</span></span><br></pre></td></tr></table></figure><p>然后回到上一级目录，拉取MicroPython</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="built_in">clone</span> --recursive https://github.com/micropython/micropython</span><br></pre></td></tr></table></figure><p>构建交叉编译器</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> micropython</span><br><span class="line">make -C mpy-cross</span><br></pre></td></tr></table></figure><p>构建MicroPython</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">cd</span> ports/esp32</span><br><span class="line">make submodules</span><br><span class="line">make BOARD=ESP32_GENERIC_S3 BOARD_VARIANT=SPIRAM_OCT</span><br></pre></td></tr></table></figure><p>构建完成后可以在<code>build-ESP32_GENERIC_S3-SPIRAM_OCT</code>文件夹中找到<code>firmware.bin</code>，这就是最终的固件。</p><h3 id="GitHub-Action-编译">GitHub Action 编译</h3><p>可以使用GitHub Action来编译固件，避免网络环境问题。</p><p><a href="https://github.com/GoodBoyboy666/ESP32-S3-N16R8-Action">https://github.com/GoodBoyboy666/ESP32-S3-N16R8-Action</a></p><p>可以自行fork修改</p><h2 id="参考">参考</h2><p><a href="https://github.com/micropython/micropython/tree/master/ports/esp32">https://github.com/micropython/micropython/tree/master/ports/esp32</a></p><p><a href="https://github.com/micropython/micropython/tree/master/ports/esp32/boards/ESP32_GENERIC_S3">https://github.com/micropython/micropython/tree/master/ports/esp32/boards/ESP32_GENERIC_S3</a></p><p><a href="https://micropython.org/download/ESP32_GENERIC_S3/">https://micropython.org/download/ESP32_GENERIC_S3/</a></p><p><a href="http://micropython.com.cn/en/latet/esp32/quickref.html#installing-micropython">http://micropython.com.cn/en/latet/esp32/quickref.html#installing-micropython</a></p><p><a href="https://github.com/espressif/esp-idf/blob/master/README_CN.md">https://github.com/espressif/esp-idf/blob/master/README_CN.md</a></p><p><a href="https://www.bilibili.com/video/BV1s24y137cK?vd_source=d70f12a573c31ee545ff78eaf31116ea">https://www.bilibili.com/video/BV1s24y137cK?vd_source=d70f12a573c31ee545ff78eaf31116ea</a></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;note info flat&quot;&gt;&lt;p&gt;本教程适合乐鑫官方ESP32-S3模组，非官方模组可能不适用&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id=&quot;下载固件&quot;&gt;下载固件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;Tips:根据 &lt;a href=&quot;https://gi</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hardware" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Hardware/"/>
    
    
    <category term="EPS32" scheme="https://blog.goodboyboy.top/tags/EPS32/"/>
    
    <category term="MicroPython" scheme="https://blog.goodboyboy.top/tags/MicroPython/"/>
    
  </entry>
  
  <entry>
    <title>EPS32 S3刷入Picokeys</title>
    <link href="https://blog.goodboyboy.top/posts/3701080839.html"/>
    <id>https://blog.goodboyboy.top/posts/3701080839.html</id>
    <published>2025-08-18T02:56:57.000Z</published>
    <updated>2025-08-18T02:56:57.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>Picokeys是一个开源的安全密钥固件，支持在Raspberry Pico (RP2040, RP2350) 和 ESP32-S3上运行</p><p>目前PicoKeys有三种功能：HSM、Fido2 Passkey、OpenPGP &amp; PIV</p><h2 id="刷入固件">刷入固件</h2><p>一般EPS32 S3开发板有两个Type-c口，一个是USB直通，一个是USB to COM</p><p>使用USB直通需要进入特殊的bootloader模式才能刷入</p><p>使用USB to COM则可以直接刷入（需要安装对应芯片的驱动，我的板子上是CH343）</p><p>进入bootloader模式方法：</p><p>插入计算机，按住Boot按键后再点按RST按键，最后松开Boot按键。</p><p>然后进入Picokeys的ESP32 Flasher（<a href="https://www.picokeys.com/esp32-flasher/">https://www.picokeys.com/esp32-flasher/</a>）</p><blockquote><p>这里需要使用Edge或者Chrome浏览器，Firefox不支持</p></blockquote><p>选择想要刷入的固件，点击Connect，在浏览器弹出的窗口中选择Jtagxxxx或者Usb single serial</p><h2 id="修补">修补</h2><p>刷完固件后还需要使用Pico Commissioner来修补VIDPID</p><blockquote><p>修补是在<code>非bootloader模式</code>下进行的<br>拔出EPS32再插入（如果之前选择插入的是USB to COM，则可能需要插至USB直通）</p></blockquote><p>进入Pico Commissioner（<a href="https://www.picokeys.com/pico-commissioner/">https://www.picokeys.com/pico-commissioner/</a>）</p><p>选择一个Vendor，其他设置自己自定义，然后在Options下方勾选Initialize</p><p>最后点击<code>Commission via WebUSB</code>，选择Picokeys进行修补</p><blockquote><p>Tips：如果点击后没反应可以尝试使用手机的Edge或者Chrome试试</p></blockquote>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;Picokeys是一个开源的安全密钥固件，支持在Raspberry Pico (RP2040, RP2350) 和 ESP32-S3上运行&lt;/p&gt;
&lt;p&gt;目前PicoKeys有三种功能：HSM、Fido2 Passkey、OpenPG</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Hardware" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Hardware/"/>
    
    
    <category term="EPS32" scheme="https://blog.goodboyboy.top/tags/EPS32/"/>
    
    <category term="Picokeys" scheme="https://blog.goodboyboy.top/tags/Picokeys/"/>
    
  </entry>
  
  <entry>
    <title>Debian13安装Nvidia驱动</title>
    <link href="https://blog.goodboyboy.top/posts/2388809258.html"/>
    <id>https://blog.goodboyboy.top/posts/2388809258.html</id>
    <published>2025-08-11T10:02:36.000Z</published>
    <updated>2025-08-11T10:02:36.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="检查硬件">检查硬件</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">lspci -vnn | grep -i VGA</span><br></pre></td></tr></table></figure><p>检查输出内容中是否含有<code>Nvidia</code>字样的设备。</p><h2 id="修改源">修改源</h2><p>NVIDIA驱动属于闭源软件，需要启用<code>non-free</code>源</p><p>编辑source.list文件</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> nano /etc/apt/sources.list</span><br></pre></td></tr></table></figure><p>在每个源后面加上<code>contrib</code>和<code>non-free</code>，保存后退出。</p><p>然后更新软件包列表</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt update</span><br></pre></td></tr></table></figure><h2 id="安装驱动">安装驱动</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> apt install linux-headers-$(<span class="built_in">uname</span> -r) nvidia-driver firmware-misc-nonfree</span><br></pre></td></tr></table></figure><p>安装时会自动禁用nouveau</p><h2 id="导入签名公钥">导入签名公钥</h2><p>因为修改了内核模块，将无法通过secure boot启动，需要手动导入密钥至bios，如果主板未打开secure boot则可以跳过本节。</p><p>安装时已自动生成了密钥并对模块进行了签名，这里只需要导入签名公钥即可</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> mokutil --import /var/lib/dkms/mok.pub</span><br></pre></td></tr></table></figure><p>一般是这个路径，安装日志中会显示文件位置</p><p>然后会要求你输入密码，该密码仅用于临时验证，不需要太复杂</p><h2 id="重启机器">重启机器</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"><span class="built_in">sudo</span> reboot</span><br></pre></td></tr></table></figure><p>如果导入了签名公钥，那么在启动时会出现MOK management界面，选择<code>Enroll MOK</code>-&gt;<code>Continue</code>，然后输入刚刚使用mokutil导入公钥时输入的密码。</p><h2 id="检查驱动">检查驱动</h2><p>进入终端输入<code>nvidia-smi</code>，如果输出了显卡详细信息以及GPU进程，则代表驱动安装成功。</p><h2 id="食用方法">食用方法</h2><p>启动程序时设置环境变量<code>__NV_PRIME_RENDER_OFFLOAD=1 __GLX_VENDOR_LIBRARY_NAME=nvidia</code>即可。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;检查硬件&quot;&gt;检查硬件&lt;/h2&gt;
&lt;figure class=&quot;highlight bash&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td clas</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Software" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Software/"/>
    
    
    <category term="Nvidia" scheme="https://blog.goodboyboy.top/tags/Nvidia/"/>
    
    <category term="Debian13" scheme="https://blog.goodboyboy.top/tags/Debian13/"/>
    
  </entry>
  
  <entry>
    <title>现在小孩都这么早熟么。。。</title>
    <link href="https://blog.goodboyboy.top/posts/1421567704.html"/>
    <id>https://blog.goodboyboy.top/posts/1421567704.html</id>
    <published>2025-08-04T08:35:09.000Z</published>
    <updated>2025-08-04T08:35:09.000Z</updated>
    
    <content type="html"><![CDATA[<p>今年下午去医院取上午抽血的检查报告时，我在那里等电梯，一个小屁孩跑过来让我跟着他。我一脸懵逼的看着他，我问他干什么他也不说，就让我跟着他。</p><p>因为取结果只有我一个人，而且这会医院下午才上班，人还不是很多，所以我下意识的想着他会不会想拐我，于是站在那里没动。</p><p>不过转念一想，一个还没我一半高的小屁孩怎么拐我，看着他一直催，我又怕是真的有什么事情，他妈妈需要帮忙什么的（因为旁边就是儿科）</p><p>于是我就慢慢的跟在他后面。</p><p>我又想万一不止他一个呢？例如利用小孩让人放松警惕把我带到偏僻地方，然后出来几个大汉把我绑走什么的，或者未成年犯罪？而且看他那不怀好意的眼神（真的就是那种赤裸裸不怀好意的眼神），我又有点不想管了。</p><p>不过还没等我想完，他就已经往儿科里去了，我想那个地方怎么都不能发生绑架这种事吧，想看看他到底搞什么鬼，便和他一起进了儿科</p><p>然后令我无语的地方来了</p><p>他把我带到儿科护士值班的地方，指着那里的一个护士说让我嫁给她？？？？？？</p><p>什么跟什么？？？</p><p>然后那个护士对着我和那个小孩笑。。。</p><p>哪家小屁孩又放出来没人管了</p><p>我当即转身就准备走，懒得和这种小屁孩计较，虽然我不急但是我的时间也不是让这种人随意浪费的</p><p>然后那个小屁孩还拉着我的手在那里继续说让我嫁给她。。。</p><p>我无语的把手抽出来，对着他说我有自己的事情，然后就没理他自己走了。</p><p>真的是什么跟什么，这么屁大的孩子知道结婚的意义是什么么，也不知道是在哪学的这些。。。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;今年下午去医院取上午抽血的检查报告时，我在那里等电梯，一个小屁孩跑过来让我跟着他。我一脸懵逼的看着他，我问他干什么他也不说，就让我跟着他。&lt;/p&gt;
&lt;p&gt;因为取结果只有我一个人，而且这会医院下午才上班，人还不是很多，所以我下意识的想着他会不会想拐我，于是站在那里没动。&lt;/p</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
  </entry>
  
  <entry>
    <title>《动物迷城》二周目通关！</title>
    <link href="https://blog.goodboyboy.top/posts/2703079552.html"/>
    <id>https://blog.goodboyboy.top/posts/2703079552.html</id>
    <published>2025-07-29T09:57:51.000Z</published>
    <updated>2025-07-29T09:57:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>《动物迷城》二周目通关！非常好玩而且有意义的一款国产CRPG游戏😄</p><blockquote><p><em><strong>“逆境或许能将人毁灭，但别让它轻易把你我打败”</strong></em></p></blockquote><p><img src="https://pic.goodboyboy.top/imgs/2025/07/29/%E9%80%9A%E5%85%B3.webp" alt="通关"></p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;《动物迷城》二周目通关！非常好玩而且有意义的一款国产CRPG游戏😄&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;&lt;strong&gt;“逆境或许能将人毁灭，但别让它轻易把你我打败”&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;h</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="动物迷城" scheme="https://blog.goodboyboy.top/tags/%E5%8A%A8%E7%89%A9%E8%BF%B7%E5%9F%8E/"/>
    
    <category term="游戏" scheme="https://blog.goodboyboy.top/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>Bing索引终于恢复了</title>
    <link href="https://blog.goodboyboy.top/posts/3129869980.html"/>
    <id>https://blog.goodboyboy.top/posts/3129869980.html</id>
    <published>2025-07-22T01:41:40.000Z</published>
    <updated>2025-07-22T01:41:40.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>差不多半年前，不知道发生了什么，博客在Bing的索引直线下降，直到完全没有。</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/22/flron3.webp" alt="索引情况"></p><p>URL检查是能索引的，但是就是死活不索引。。。</p><p>后面看到有人也有这个情况，是需要向客服提交工单解决，于是大概一个月前我也向客服提了工单，中间陆陆续续收到几封客服邮件，今天收到客服邮件说已经解决了该问题</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/22/fnjh75.webp" alt="邮件"></p><p>上线Webmaster Tools看了一下，确实印象数上升了</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/22/foietp.webp" alt="印象数"></p><p>去bing搜了一下site:goodboyboy.top，也确实是能看见博客了</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/22/fqgolt.webp" alt="搜索页面"></p><h2 id="后记">后记</h2><p>长达半年的丢失索引终于解决了😂，后面只能等排名慢慢恢复了</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;p&gt;差不多半年前，不知道发生了什么，博客在Bing的索引直线下降，直到完全没有。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://pic.goodboyboy.top/imgs/2025/07/22/flron3.webp&quot; alt=&quot;</summary>
      
    
    
    
    <category term="说说" scheme="https://blog.goodboyboy.top/categories/%E8%AF%B4%E8%AF%B4/"/>
    
    
    <category term="索引" scheme="https://blog.goodboyboy.top/tags/%E7%B4%A2%E5%BC%95/"/>
    
    <category term="说说" scheme="https://blog.goodboyboy.top/tags/%E8%AF%B4%E8%AF%B4/"/>
    
  </entry>
  
  <entry>
    <title>家里蹲大学开始招生！</title>
    <link href="https://blog.goodboyboy.top/posts/108438560.html"/>
    <id>https://blog.goodboyboy.top/posts/108438560.html</id>
    <published>2025-07-21T03:39:11.000Z</published>
    <updated>2025-07-21T03:39:11.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="正文">正文</h2><p>继上文《<a href="/posts/901378813.html">家里蹲大学即将建校，欢迎各位莘莘学子来本校深造（doge</a>》，今日家里蹲大学正式建校（doge</p><p>我们将为每位同学免费分发本校的教育邮箱，教育邮箱申请方式如下：</p><p>向me#goodboyboy.top（#换成@）发送邮件进行申请，申请内容需要包含以下内容：</p><ul><li>用户名（仅允许包含A-Z，a-z，0-9）</li></ul><p>为防止被用于发送非法邮件，此邮箱使用CloudFlare邮件转发功能，只允许收信不允许发信，转发目的地为发送申请邮件的邮箱地址。</p><p>申请通过后将会向转发目的地邮箱发送一封验证邮件，请及时完整验证避免影响收信。</p><p>另外，禁止滥用教育邮箱，否则我们有权利收回教育邮箱</p><h2 id="题外话">题外话</h2><p>可以去薅薅管的不严的一些学生优惠，像GitHub Education这种特别严的就不要想了</p><p>另外因为使用邮件的是转发功能，所以收信可能会慢一些，国内的某些邮箱甚至可能收不到信，可以提前用自己的另一个邮箱测试一下。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;正文&quot;&gt;正文&lt;/h2&gt;
&lt;p&gt;继上文《&lt;a href=&quot;/posts/901378813.html&quot;&gt;家里蹲大学即将建校，欢迎各位莘莘学子来本校深造（doge&lt;/a&gt;》，今日家里蹲大学正式建校（doge&lt;/p&gt;
&lt;p&gt;我们将为每位同学免费分发本校的教育邮箱，教育邮</summary>
      
    
    
    
    <category term="推广" scheme="https://blog.goodboyboy.top/categories/%E6%8E%A8%E5%B9%BF/"/>
    
    
    <category term="大学" scheme="https://blog.goodboyboy.top/tags/%E5%A4%A7%E5%AD%A6/"/>
    
    <category term="招生" scheme="https://blog.goodboyboy.top/tags/%E6%8B%9B%E7%94%9F/"/>
    
  </entry>
  
  <entry>
    <title>家里蹲大学即将建校，欢迎各位莘莘学子来本校深造（doge</title>
    <link href="https://blog.goodboyboy.top/posts/901378813.html"/>
    <id>https://blog.goodboyboy.top/posts/901378813.html</id>
    <published>2025-07-20T16:10:26.000Z</published>
    <updated>2025-07-20T16:10:26.000Z</updated>
    
    <content type="html"><![CDATA[<p>标题是开玩笑的（doge</p><p>最近注册了一个edu.kg后缀的域名，打算当一把校长（doge，看看能不能过那些教育邮箱验证</p><p>这类野鸡域名可能难过，不过可以试试，反正注册一个也没多少钱，实在不行就拿来自己玩了</p><p>目前正在等待全球NS记录同步，到时候整个官网和域名邮箱，欢迎有意愿的同学们来本校深造，我们会给每位学子分发自己的教育邮箱（doge</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;标题是开玩笑的（doge&lt;/p&gt;
&lt;p&gt;最近注册了一个edu.kg后缀的域名，打算当一把校长（doge，看看能不能过那些教育邮箱验证&lt;/p&gt;
&lt;p&gt;这类野鸡域名可能难过，不过可以试试，反正注册一个也没多少钱，实在不行就拿来自己玩了&lt;/p&gt;
&lt;p&gt;目前正在等待全球NS记录同步</summary>
      
    
    
    
    <category term="推广" scheme="https://blog.goodboyboy.top/categories/%E6%8E%A8%E5%B9%BF/"/>
    
    
    <category term="建校" scheme="https://blog.goodboyboy.top/tags/%E5%BB%BA%E6%A0%A1/"/>
    
  </entry>
  
  <entry>
    <title>骑车去兜风~</title>
    <link href="https://blog.goodboyboy.top/posts/399226288.html"/>
    <id>https://blog.goodboyboy.top/posts/399226288.html</id>
    <published>2025-07-16T17:14:14.000Z</published>
    <updated>2025-07-16T17:14:14.000Z</updated>
    
    <content type="html"><![CDATA[<script src="/js/APlayer.min.js"></script><script>var meting_api='https://meting.furwolf.com/api?server=:server&type=:type&id=:id&r=:r';</script><script src="https://jsd.foxsay.top/npm/@xizeyoupan/meting@latest/dist/Meting.min.js"></script><h2 id="前言">前言</h2><p>最近在学校都是三点一线，早上去寝室刷牙，白天在实验室，晚上去寝室洗个澡，然后回实验室睡觉。</p><p>感觉有点乏味，是时候出去散散心了</p><h2 id="骑车">骑车</h2><p>打算骑车去散散心，刚好最近新增了另一家共享电动车，电动车设计的更合理，比原来那几家多了手机槽，喇叭也是电喇叭，还有转向灯</p><p>原来那几家共享电动车真的可以划为单车范围了😂</p><p>电喇叭什么的其实都还好，我特别喜欢那个手机槽</p><p>以前用手机导航，只能用耳机连接手机，然后把手机揣口袋里，听着导航播报</p><p>高德有时候播报又特别抽象，时不时来一个“右前方”，还特别喜欢和右转一起播报，有时候我都走上直行道了，到路口给我说要右转，有时候我都右转了，给我说偏离路线。。。</p><p>现在听到“您已偏离路线，正在为您重新规划”这句话我就ptsd</p><p>而新的共享电动车，我就可以把手机放在手机槽里，看着导航开了😁</p><p>就在我解锁后，发现运营区域居然扩大了！！！</p><p>原来只能在河的西侧，现在把几乎是整个城市都包围了起来，我的活动范围大大扩张！！！</p><p>这不美美骑一下，直接高德导航到河东的运营区边缘😄</p><h2 id="散心">散心</h2><p>虽然湖南温度晚上也高，但是开着电动车吹着风还是很舒服的</p><p>过桥时发现对面山头风景还不错，随手拍了一张</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/17/26bb86.webp" alt="对面山头"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/17/26q165.webp" alt="对面山头"></p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/17/276w3y.webp" alt="对面山头"></p><p>听着歌吹着风，看看风景，还是很不错的😄</p><p>给大家分享一下骑车时听的歌，都超好听（加载播放器可能需要一点时间，部分歌要VIP就通过歌名分享）</p><p><meting-js server="tencent" type="song" id="002TumlS3yOwI0" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="002v8w8L1v9LSO" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="004a6DUO2Y2SRR" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="003bmTHj24lyWd" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="000OSYm83BW7Bw" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="0028rrdN4EwxZW" preload='metadata'></meting-js></p><p><meting-js server="tencent" type="song" id="001kwvcn1pg6Wh" preload='metadata'></meting-js></p><p>VIP歌曲：</p><ul><li>歌曲名：面会菜，歌手名：林生祥，专辑名：大佛普拉斯 电影配乐</li><li>歌曲名：空白，歌手名：王舜禾，专辑名：伍六七之暗影宿命 原声大碟</li><li>歌曲名：时光盲盒，歌手名：ChiliChill，专辑名：2021哔哩哔哩拜年纪</li><li>歌曲名：虫儿飞，风儿吹，歌手名：小蓝背心，专辑名：百啭千声</li><li>歌曲名：天命 The Chosen One (feat.William Wu)，歌手名：且听东方/Ferkingge，专辑名：天命 The Chosen One (feat.William Wu)</li><li>歌曲名：武侯祠，歌手名：闫东炜，专辑名：天朝元素project</li><li>歌曲名：Black Myth: Wukong Main Theme (COVER版)，歌手名：Diego Mitre，专辑名：Black Myth: Wukong Main Theme (Cover)</li><li>歌曲名：以梦为马，歌手名：熊猫堂ProducePandas，专辑名：大惊小怪</li><li>歌曲名：淋雨一直走，歌手名：张韶涵，专辑名：有形的翅膀</li></ul><h2 id="返回">返回</h2><p>返回的时候不打算原路返回，打算围着运营区边缘绕着回去。</p><p>相较于河东这边的窄公路，还是绕城的大路骑起来更爽😁</p><p>下面是过另一座桥时拍的夜晚风景</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/17/2ax3i8.webp" alt="夜晚风景"></p><p>中途在一个立交桥下还遇到了卖臭豆腐的小摊（走不动路了）</p><p>停下来买了份臭豆腐，不过当时时间有点晚了，要赶着回寝室洗澡（十一点半要关门），就直接挂在车上</p><p>开了一会后发现车摇来摇去容易撒，只好停在一个垃圾桶旁边吃（偷感超重😂）</p><p>最难蚌的是，我选的这个地方明明很隐蔽，为啥还有人会路过？？？</p><p>我当时是背着那几个人的，我明显看到他们几个路过我的时候还专门看了我几眼。。。怕不是被看成乞丐了🤣</p><p>吃完赶紧润，抓紧时间赶路，最后成功到达宿舍。</p><p>整个行程花了大概两个半消失，开了33公里，花了15.5，性价比还是蛮高的</p><p><img src="https://pic.goodboyboy.top/imgs/2025/07/17/2f5e5x.webp" alt="结算"></p><h2 id="后记">后记</h2><p>以后有空还可以多转转，活动范围变广了，又有新的区域可以探索了😀</p>]]></content>
    
    
      
      
    <summary type="html">&lt;script src=&quot;/js/APlayer.min.js&quot;&gt;&lt;/script&gt;
&lt;script&gt;
var meting_api=&#39;https://meting.furwolf.com/api?server=:server&amp;type=:type&amp;id=:id&amp;r=:r&#39;;
&lt;</summary>
      
    
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="日常" scheme="https://blog.goodboyboy.top/categories/%E7%94%9F%E6%B4%BB/%E6%97%A5%E5%B8%B8/"/>
    
    
    <category term="生活" scheme="https://blog.goodboyboy.top/tags/%E7%94%9F%E6%B4%BB/"/>
    
    <category term="兜风" scheme="https://blog.goodboyboy.top/tags/%E5%85%9C%E9%A3%8E/"/>
    
    <category term="骑车" scheme="https://blog.goodboyboy.top/tags/%E9%AA%91%E8%BD%A6/"/>
    
  </entry>
  
  <entry>
    <title>OAuth2授权码、客户端凭证、PKCE、设备码授权流程详解</title>
    <link href="https://blog.goodboyboy.top/posts/3907798914.html"/>
    <id>https://blog.goodboyboy.top/posts/3907798914.html</id>
    <published>2025-07-15T04:49:21.000Z</published>
    <updated>2025-07-15T04:49:21.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><div class="note info flat"><p>本教程将结合Gemini 2.5 Pro来为各位进行讲解</p></div><p>OAuth 2.0 是一个行业标准的授权框架，它允许第三方应用程序在不获取用户凭证（如用户名和密码）的情况下，有限度地访问用户在某一网站上存储的私有资源。</p><p>OAuth 2.0 中的四个核心角色：</p><ul><li><p>资源所有者 (Resource Owner)：通常是终端用户，拥有受保护资源的最终控制权。</p></li><li><p>客户端 (Client)：希望访问资源所有者受保护资源的第三方应用程序。</p></li><li><p>授权服务器 (Authorization Server)：负责验证资源所有者的身份，并在获得资源所有者授权后，向客户端颁发访问令牌（Access Token）。</p></li><li><p>资源服务器 (Resource Server)：存储受保护资源，并接受和验证访问令牌，以允许客户端访问资源。</p></li></ul><h2 id="授权码模式-Authorization-Code-Grant">授权码模式 (Authorization Code Grant)</h2><p>这是功能最完善、安全性最高的授权模式，因为需要保持client_secret非公开，推荐用于传统的 Web 应用（即拥有后端的应用）。</p><blockquote><p>下文的<code>客户端</code>包括客户端的前端与后端，资源所有者一般为用户</p></blockquote><pre><code class="highlight mermaid">sequenceDiagram    participant ResourceOwner as 资源所有者    participant Client as 客户端    participant AuthServer as 授权服务器    participant ResourceServer as 资源服务器    ResourceOwner-&gt;&gt;Client: 1. 访问客户端    Client--&gt;&gt;ResourceOwner: 2. 返回授权链接    ResourceOwner-&gt;&gt;AuthServer: 3. 通过链接访问授权页面    AuthServer--&gt;&gt;ResourceOwner: 4. 展示授权界面    ResourceOwner-&gt;&gt;AuthServer: 5. 确认授权    AuthServer-&gt;&gt;Client: 6. 重定向回调（携带code）    Client-&gt;&gt;AuthServer: 7. 发送code + client_secret请求token    AuthServer--&gt;&gt;Client: 8. 返回access_token    Client-&gt;&gt;ResourceServer: 9. 携带access_token请求资源    ResourceServer--&gt;&gt;Client: 10. 返回受保护资源    note left of ResourceOwner: 用户操作流    note right of AuthServer: 安全校验：    note right of AuthServer: - 验证code有效性&lt;br/&gt;- 验证client_secret&lt;br/&gt;- 检查重定向URI</code></pre><h3 id="发起授权请求">发起授权请求</h3><p>当用户使用客户端时，客户端需要发起授权请求。</p><p>该请求实际由用户发起，客户端负责构建一个包含<code>client_id</code>、<code>redirect_uri</code>、<code>response_type</code> 和<code>scope</code>等参数的URL授权请求链接：</p><p><code>Base URL</code>：授权服务器的授权Endpoint，例如<code>https://xxx.com/api/authorize</code><br><code>response_type</code>：<code>code</code><br><code>client_id</code>：客户端ID<br><code>redirect_uri</code>：回调URL<br><code>scope</code>：资源（权限）范围，例如<code>openid</code>、<code>email</code>、<code>profile</code>等<br><code>state</code>：随机字符，可选（推荐），用于防止跨站请求伪造（CSRF）攻击</p><p>例如：</p><figure class="highlight http"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">GET /authorize?response_type=code&amp;client_id=CLIENT_ID&amp;redirect_uri=CALLBACK_URL&amp;scope=SCOPE</span><br></pre></td></tr></table></figure><h3 id="确认授权">确认授权</h3><p>用户定向到授权链接，如果此时用户未登录，则会要求用户进行登录</p><p>登录完成后，授权服务器会展示本次授权请求相关信息，例如客户端的详情，请求的资源内容等</p><p>如果用户确认授权，则重定向至redirect_uri（上文示例中的CALLBACK_URL内容）并在URL参数中携带本次确认授权的 AUTHORIZATION_CODE</p><blockquote><p>Tips：正常情况下，授权服务器会对redirect_uri的内容进行校验，确保当前授权链接中的redirect_uri内容与客户端在授权服务器注册时预留的redirect_uri内容一致，否则重定向至钓鱼链接会导致本次确认授权的 AUTHORIZATION_CODE 泄露</p></blockquote><h3 id="客户端请求access-token">客户端请求access_token</h3><p>客户端通过redirect_uri拿到本次授权的 AUTHORIZATION_CODE 后，使用 AUTHORIZATION_CODE 和 client_secret 向授权服务器请求 access_token</p><p>如果客户端启用了 state ，还会校验当前回调链接中的 state 值是否和当初授权链接中的 state 值一致，确保 AUTHORIZATION_CODE 仅用于本次授权请求会话，防止跨站请求伪造（CSRF）攻击</p><p>Base URL：授权服务器的令牌Endpoint，例如<code>https://xxx.com/api/token</code></p><p>客户端向Base URL发送POST请求，请求体<code>Content-Type</code>为<code>application/x-www-form-urlencoded</code>，请求体内容如下：</p><p><code>grant_type</code>：<code>authorization_code</code><br><code>code</code>：上文的 AUTHORIZATION_CODE<br><code>redirect_uri</code>：回调URL<br><code>client_id</code>：客户端ID<br><code>client_secret</code>：客户端Secret</p><div class="note warning flat"><p>client_secret不可直接暴露给客户端前端，必须由安全的客户端后端使用，否则任何人（包括攻击者）只需要拿到 AUTHORIZATION_CODE 即可向授权服务器发起access_token请求</p></div><h3 id="客户端请求资源">客户端请求资源</h3><p>当授权服务器返回access_token后，使用access_token向资源服务器请求所需要的资源</p><p>资源服务器对access_token进行一系列校验，确认身份后返回客户端所需要的资源</p><h2 id="客户端凭证模式-Client-Credentials-Grant">客户端凭证模式 (Client Credentials Grant)</h2><p>该模式适用于没有特定用户参与的场景，即客户端以自己的名义访问资源（例如，机器对机器的通信）。</p><p>因为没有用户参与，因此这里客户端可以直接向令牌Endpoint请求access_token</p><p>该模式需要具体参考授权服务器的文档，例如authentik身份识别基于服务账户，身份验证基于应用密码令牌（client_secret），因此还需要传递服务账户的username和password，这里仅示例通用情况。</p><h3 id="客户端请求access-token-2">客户端请求access_token</h3><p>Base URL：授权服务器的令牌Endpoint，例如<code>https://xxx.com/api/token</code></p><p>客户端向Base URL发送POST请求，请求体<code>Content-Type</code>为<code>application/x-www-form-urlencoded</code>，请求体内容如下：</p><p><code>grant_type</code>：<code>client_credentials</code><br><code>scope</code>：权限范围，具体参考授权服务器文档</p><p>请求头：</p><p><code>Authorization</code>：<code>Basic $&#123;将 client_id:client_secret 进行 Base64 编码后的字符串&#125;</code></p><p>当然也可以将客户端凭证放在请求体中：</p><p><code>grant_type</code>：<code>client_credentials</code><br><code>scope</code>：权限范围，具体参考授权服务器文档<br><code>client_id</code>：客户端ID<br><code>client_secret</code>：客户端Secret</p><h3 id="客户端请求资源-2">客户端请求资源</h3><p>当授权服务器返回access_token后，客户端使用access_token向资源服务器请求所需要的资源</p><p>资源服务器对access_token进行一系列校验，确认身份后返回客户端所需要的资源</p><h2 id="授权码-PKCE-Proof-Key-for-Code-Exchange-模式">授权码 + PKCE (Proof Key for Code Exchange)模式</h2><p>PKCE 是对授权码模式的增强，现在被认为是所有类型客户端（包括原生应用、单页应用和传统 Web 应用）的最佳实践。</p><p>核心思想：在授权请求时，客户端生成一个随机的验证器（<code>code_verifier</code>），并将其哈希值（<code>code_challenge</code>）发送给授权服务器。当客户端用授权码交换访问令牌时，必须同时提供原始的 <code>code_verifier</code>。授权服务器会验证 <code>code_verifier</code> 和 <code>code_challenge</code> 是否匹配，从而确保即使授权码被截获，攻击者也无法在没有 <code>code_verifier</code> 的情况下冒用。</p><pre><code class="highlight mermaid">sequenceDiagram    participant C as 客户端 (App)    participant U as 资源所有者    participant AS as 授权服务器    participant RS as 资源服务器    Note over C: 1. 生成 code_verifier, &lt;br/&gt;   计算 code_challenge    C-&gt;&gt;U: 2. 发起授权请求 (携带 code_challenge)    U-&gt;&gt;AS: 用户浏览器重定向至授权服务器    AS--&gt;&gt;U: 要求用户登录并授权    U-&gt;&gt;AS: 同意授权    AS--&gt;&gt;C: 4. 重定向并返回授权码 (code)    Note over C: 截获此处的 code 也无用，&lt;br/&gt;因为攻击者没有 code_verifier    C-&gt;&gt;AS: 5. 交换令牌请求 &lt;br/&gt;(携带 code 和 code_verifier)    Note over AS: 6. 验证 code_verifier 和 &lt;br/&gt;   之前存储的 code_challenge 是否匹配    AS--&gt;&gt;C: 验证通过，返回 Access Token    C-&gt;&gt;RS: 7. 使用 Access Token 请求资源    RS--&gt;&gt;C: 返回受保护的资源</code></pre><h3 id="发起授权请求-2">发起授权请求</h3><p>客户端首先生成一个随机的 <code>code_verifier</code>，将这个 <code>code_verifier</code> 存储在本地（例如，App 的内存或浏览器的 <code>sessionStorage</code> 中），根据 <code>code_verifier</code> 计算出对应的 <code>code_challenge</code>。</p><div class="note warning flat"><p><code>code_challenge</code>由<code>code_verifier</code>先按照<code>code_challenge_method</code>进行计算，然后进行<code>Base64URL</code>编码</p></div><p>然后构建授权请求链接：</p><p><code>Base URL</code>：授权服务器的授权Endpoint，例如<code>https://xxx.com/api/authorize</code><br><code>response_type</code>：<code>code</code><br><code>client_id</code>：客户端ID<br><code>redirect_uri</code>：回调URL<br><code>scope</code>：资源（权限）范围，例如<code>openid</code>、<code>email</code>、<code>profile</code>等<br><code>state</code>：随机字符，可选（推荐），用于防止跨站请求伪造（CSRF）攻击<br><code>code_challenge</code>：第一步通过code_verifier计算出的code_challenge<br><code>code_challenge_method</code>：<code>S256</code>（具体看授权服务器的支持类型）</p><p>授权服务器收到请求后，会存储 code_challenge 并将其与即将生成的授权码关联起来。</p><h3 id="确认授权-2">确认授权</h3><p>用户在授权服务器的页面上登录，并同意授权给客户端。</p><p>然后重定向至redirect_uri，并附带<code>code</code>与<code>state</code>内容</p><h3 id="客户端请求access-token-3">客户端请求access_token</h3><p>与标准的授权码模式相比，请求体中必须额外包含第一步生成的<code>code_verifier</code></p><p>Base URL：授权服务器的令牌Endpoint，例如<code>https://xxx.com/api/token</code></p><p>客户端向Base URL发送POST请求，请求体<code>Content-Type</code>为<code>application/x-www-form-urlencoded</code>，请求体内容如下：</p><p><code>grant_type</code>：<code>authorization_code</code><br><code>code</code>：上文的返回的code<br><code>redirect_uri</code>：回调URL<br><code>client_id</code>：客户端ID<br><code>code_verifier</code>：第一步生成的code_verifier</p><p>收到请求后，授权服务器计算<code>code_verifier</code>在使用算法（S256）后是否与开始提供的<code>code_challenge</code>一致，一致则下发<code>access_token</code>。</p><h3 id="客户端请求资源-3">客户端请求资源</h3><p>当授权服务器返回access_token后，客户端使用access_token向资源服务器请求所需要的资源</p><p>资源服务器对access_token进行一系列校验，确认身份后返回客户端所需要的资源。</p><h2 id="设备码流程-Device-Code-Flow">设备码流程 (Device Code Flow)</h2><p>设备码流程（Device Code Flow）非常巧妙地解决了那些没有浏览器或输入不方便的设备（比如智能电视、游戏机、命令行工具、树莓派等）如何进行 OAuth 2.0 授权的问题。</p><p>整个流程的核心思想是：<strong>在输入受限的设备上发起授权，然后在另一个功能齐全的设备（如手机或电脑）上完成授权确认</strong>。</p><pre><code class="highlight mermaid">sequenceDiagram    participant TV as 客户端设备 (智能电视)    participant User as 用户    participant AS as 授权服务器    participant Phone as 授权设备 (手机)    TV-&gt;&gt;AS: 请求设备码和用户码    AS--&gt;&gt;TV: 返回 device_code, user_code 等    TV-&gt;&gt;User: 显示 user_code 和验证网址    User-&gt;&gt;Phone: 在手机上访问网址    Phone-&gt;&gt;AS: 提交 user_code 并登录授权    Note over TV, AS: 设备在后台持续轮询, 直到用户授权成功    AS--&gt;&gt;TV: (轮询成功后) 返回 Access Token    TV-&gt;&gt;User: 显示登录成功</code></pre><h3 id="设备发起授权请求">设备发起授权请求</h3><p>设备向授权服务器的一个特定端点——设备授权端点（Device Authorization Endpoint）发起POST请求，</p><p>Base URL：授权服务器的设备授权Endpoint，例如<code>https://xxx.com/api/device_authorization</code></p><p>请求体<code>Content-Type</code>为<code>application/x-www-form-urlencoded</code>，请求体内容如下：</p><p><code>client_id</code>：客户端ID<br><code>scope</code>：资源（权限）范围，例如<code>openid</code>、<code>email</code>、<code>profile</code>等</p><p>授权服务器将返回临时凭证</p><p>示例：</p><figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="punctuation">&#123;</span></span><br><span class="line">  <span class="attr">&quot;device_code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;GmRhmhtR4Q1d74VklbV_g9s-265aKqrC&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;user_code&quot;</span><span class="punctuation">:</span> <span class="string">&quot;WDJB-MJHT&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;verification_uri&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://example.com/activate&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;verification_uri_complete&quot;</span><span class="punctuation">:</span> <span class="string">&quot;https://example.com/activate?user_code=WDJB-MJHT&quot;</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;expires_in&quot;</span><span class="punctuation">:</span> <span class="number">1800</span><span class="punctuation">,</span></span><br><span class="line">  <span class="attr">&quot;interval&quot;</span><span class="punctuation">:</span> <span class="number">5</span></span><br><span class="line"><span class="punctuation">&#125;</span></span><br></pre></td></tr></table></figure><p><code>device_code</code>：设备代码，是保存在设备上的代码<br><code>verification_uri</code>：显示给最终用户以输入代码的 URL<br><code>verification_uri_complete</code>：与上述相同的 URL，不同之处在于代码已被预填充，用户无需再输入代码<br><code>user_code</code>：最终用户输入的原始代码<br><code>expires_in</code>：此令牌将在多少秒后过期<br><code>interval</code>：设备应多久检查一次令牌状态的时间间隔（以秒为单位）</p><h3 id="设备端显示信息并开始轮询">设备端显示信息并开始轮询</h3><p>设备开始向用户展示<code>verification_uri</code>与<code>user_code</code>并引导用户访问该网址，填写代码</p><blockquote><p>感觉和HMCL的登录MC正版账户流程很像啊</p></blockquote><p>然后设备开始轮询，按照建议的<code>interval</code>，持续向授权服务器的令牌Endpoint发起POST请求。</p><p>请求体<code>Content-Type</code>同样为<code>application/x-www-form-urlencoded</code>，请求体内容如下：</p><p><code>grant_type</code>：<code>urn:ietf:params:oauth:grant-type:device_code</code>（设备码流程专用）<br><code>device_code</code>：上文的device_code<br><code>client_id</code>：客户端ID</p><div class="note info flat"><p>需要注意的是，部分授权服务器返回的device_code过于抽象（说的就是你authentik），可能会内嵌部分需要转义的字符，因此返回的device_code内容是已经加了<code>\</code>转义符的，但是该转义符不属于device_code内容，如果设备对于发出请求的内容自带转义将会使<code>\</code>也被提交，导致出现<code>invalid_grant</code>错误！</p></div><h3 id="确认授权-3">确认授权</h3><p>用户访问展示的<code>verification_uri</code>，并填入<code>user_code</code>，在授权页面确认授权</p><p>当然也可以直接展示<code>verification_uri_complete</code></p><h3 id="设备获取access-token">设备获取access_token</h3><p>在用户同意授权后，下一次轮询将获得授权服务器下发的access_token</p><h3 id="设备请求资源">设备请求资源</h3><p>当授权服务器返回access_token后，设备使用access_token向资源服务器请求所需要的资源</p><p>资源服务器对access_token进行一系列校验，确认身份后返回客户端所需要的资源。</p><h2 id="总结">总结</h2><p>隐式授权模式和密码凭证模式这两个不安全的模式就不写了。</p><table><thead><tr><th>授权模式</th><th>适用场景</th><th>安全性</th><th>推荐度</th></tr></thead><tbody><tr><td>授权码 + PKCE</td><td>所有类型的应用，特别是公共客户端（SPA、移动应用）和机密客户端（Web应用）</td><td>非常高</td><td>强烈推荐</td></tr><tr><td>授权码模式</td><td>有后端的 Web 应用（机密客户端）</td><td>高</td><td>推荐</td></tr><tr><td>客户端凭证模式</td><td>机器对机器（M2M）通信，无用户参与</td><td>高</td><td>推荐</td></tr><tr><td>设备码流程</td><td>无浏览器或输入受限的设备</td><td>中高</td><td>特定场景推荐</td></tr><tr><td>隐式授权模式</td><td>已废弃</td><td>低</td><td>不推荐</td></tr><tr><td>密码凭证模式</td><td>已废弃，仅用于高度信任的遗留系统</td><td>非常低</td><td>不推荐</td></tr></tbody></table><h2 id="后记">后记</h2><p>暑假意外的高产😁</p>]]></content>
    
    
      
      
    <summary type="html">&lt;h2 id=&quot;前言&quot;&gt;前言&lt;/h2&gt;
&lt;div class=&quot;note info flat&quot;&gt;&lt;p&gt;本教程将结合Gemini 2.5 Pro来为各位进行讲解&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;OAuth 2.0 是一个行业标准的授权框架，它允许第三方应用程序在不获取用户凭证（如用户名</summary>
      
    
    
    
    <category term="教程" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/"/>
    
    <category term="Web" scheme="https://blog.goodboyboy.top/categories/%E6%95%99%E7%A8%8B/Web/"/>
    
    
    <category term="OAuth2" scheme="https://blog.goodboyboy.top/tags/OAuth2/"/>
    
  </entry>
  
</feed>
