<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>jiangmiemie Blog</title>
        <link>https://jiangmiemie.com/blog/</link>
        <description>jiangmiemie Blog</description>
        <lastBuildDate>Thu, 30 Apr 2026 00:00:00 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <language>en</language>
        <item>
            <title><![CDATA[勇敢的为自己的判断下注]]></title>
            <link>https://jiangmiemie.com/blog/2026/4/30/</link>
            <guid>https://jiangmiemie.com/blog/2026/4/30/</guid>
            <pubDate>Thu, 30 Apr 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[一些生活感悟]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2026_4_30_.mp3" preload="metadata"></audio><p>炒股、赌博、买房都有可能让你一夜暴富，也有可能让你的净资产清零，但是它们本质上并不是同一种游戏。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="游戏">游戏<a href="https://jiangmiemie.com/blog/2026/4/30/#%E6%B8%B8%E6%88%8F" class="hash-link" aria-label="Direct link to 游戏" title="Direct link to 游戏" translate="no">​</a></h2>
<p>任何一种金融活动，本质上都属于三种游戏之一：</p>
<ul>
<li class="">正和   →  整个蛋糕在变大，所有参与者可以同时获益</li>
<li class="">零和   →  蛋糕大小不变，谁赚多就有人赚少</li>
<li class="">负和   →  扣掉摩擦成本,参与者整体在变穷</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="股市">股市<a href="https://jiangmiemie.com/blog/2026/4/30/#%E8%82%A1%E5%B8%82" class="hash-link" aria-label="Direct link to 股市" title="Direct link to 股市" translate="no">​</a></h2>
<p>股市是最容易让人混淆的一个——因为它同时是正和、零和、和负和。</p>
<p>股票本质上是对公司未来现金流的所有权。当公司经营产生利润、提高生产效率时，蛋糕在变大——所有股东可以同时变富，不需要谁亏才有谁赚。美股 S&amp;P 500 从 1928 年至今年化总回报约 10%，这是企业实际生产出来的财富。</p>
<p>但任何一笔具体交易都是零和的。<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>200</mn><mtext>卖出</mtext><mi>N</mi><mi>V</mi><mi>D</mi><mi>A</mi><mtext>，对手方以</mtext></mrow><annotation encoding="application/x-tex">200 卖出 NVDA，对手方以 </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">200</span><span class="mord cjk_fallback">卖出</span><span class="mord mathnormal" style="margin-right:0.109em">N</span><span class="mord mathnormal" style="margin-right:0.2222em">V</span><span class="mord mathnormal" style="margin-right:0.0278em">D</span><span class="mord mathnormal">A</span><span class="mord cjk_fallback">，对手方以</span></span></span></span>200 买入，未来涨到 <span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mn>250</mn><mtext>时他赚</mtext></mrow><annotation encoding="application/x-tex">250 时他赚 </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">250</span><span class="mord cjk_fallback">时他赚</span></span></span></span>50，原卖方少赚 $50。</p>
<p>如果加上佣金、印花税、买卖价差、滑点、税收——短期博弈整体上是负和的。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="抽水">抽水<a href="https://jiangmiemie.com/blog/2026/4/30/#%E6%8A%BD%E6%B0%B4" class="hash-link" aria-label="Direct link to 抽水" title="Direct link to 抽水" translate="no">​</a></h2>
<p>但在生活里，纯负和的系统其实比股市更常见。先看两个数据：博彩和彩票，谁抽得更狠？</p>
<table><thead><tr><th>类型</th><th>抽水率</th><th>玩家期望回报</th></tr></thead><tbody><tr><td>体育博彩</td><td>~4.5%</td><td>95.5%</td></tr><tr><td>老虎机等游戏机</td><td>5–15%</td><td>85–95%</td></tr><tr><td>刮刮乐</td><td>30–40%</td><td>60–70%</td></tr><tr><td>彩票</td><td>40–60%</td><td>40–60%</td></tr></tbody></table>
<p>博彩是"吃流水的薄利多销"，必须给你较高的回报率，否则没人愿意一直玩。彩票是"收智商税的暴利垄断"，卖的是希望。</p>
<p>为什么彩票能抽这么狠？因为它是非刚需，民众可以选择不买——不买的人不会暴动。</p>
<p>这是所有抽水系统的潜规则：剥削率的上限，由"愤怒的临界点"决定，而不是由经济效率决定。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="垄断">垄断<a href="https://jiangmiemie.com/blog/2026/4/30/#%E5%9E%84%E6%96%AD" class="hash-link" aria-label="Direct link to 垄断" title="Direct link to 垄断" translate="no">​</a></h2>
<p>把这个逻辑反过来用。国家机器最暴利的产品，都满足三个条件：</p>
<ul>
<li class="">刚需或强诱惑（盐、烟、油、房、希望、货币）</li>
<li class="">替代品被政策切断（专营、牌照、外汇管制）</li>
<li class="">政治上不可挑战（公共财政依赖 + 民众接受度高）</li>
</ul>
<p>按隐蔽度从低到高：</p>
<p>烟草：中国烟草总公司年上缴税利约 1.2 万亿元，占中央财政 6–7%。一包零售价 ¥20 的烟里 55–65% 是税，利润率比 Apple 还高。</p>
<p>燃油税：欧洲一升汽油里 50–65% 是税（英国 ~60%、法国 ~58%、意大利 ~62%）。它躲在"市场油价"的浮动里，绝大多数人不会觉得是在交税。这是政治学意义上最聪明的税——隐蔽 + 普遍 + 无替代品。</p>
<p>土地出让金：2021 年中国土地出让金 8.7 万亿元，占地方政府收入 40%+，是当年彩票销售（3700 亿）的 23 倍。本质上是"刚需税"——把 70 年土地租金一次性折现卖给开发商，开发商再加价卖给购房者。</p>
<p>盐：人类历史上最长寿的国家垄断。中国从公元前 119 年汉武帝盐铁专营开始，到 2017 年才彻底放开。盐之所以特殊，是因为它不是奢侈品，而是生存品：做饭要盐，腌肉要盐，保存食物也要盐。垄断越深，财政收益越高；但盐税有一个天然上限，一旦越过临界点，它就是起义的导火索。</p>
<p>彩票抽走 50%，没人造反，因为你可以不买。</p>
<p>烟草税很高，没人造反，因为你可以戒烟。</p>
<p>燃油税很重，民众会抗议，但还能忍，因为它不是每天入口的生存品。</p>
<p>盐税很重，黄巢起义和法国大革命就是例子。</p>
<p>这些垄断之上，还有一个更深的——一个几乎从不被讨论的终极抽水机。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="印钞">印钞<a href="https://jiangmiemie.com/blog/2026/4/30/#%E5%8D%B0%E9%92%9E" class="hash-link" aria-label="Direct link to 印钞" title="Direct link to 印钞" translate="no">​</a></h2>
<p>铸币税 / 通胀税——这是所有政府垄断里最深、最不被讨论的一个，印钞权本身。</p>
<p>机制很简单：</p>
<ul>
<li class="">央行发行货币，新印的钱进入经济</li>
<li class="">流通中的钱变多 → 同样的资产 / 商品要更多钱去买 → 通胀</li>
<li class="">持有现金的人对应的购买力下降 → 等于被"征税"</li>
<li class="">这部分价值被政府（通过财政赤字货币化）和最先拿到新钱的人吃掉</li>
</ul>
<p>明面上全世界政府通过税收拿走 GDP 的 20–40%，而长期通胀会让你每 10 年的购买力损失 20%。</p>
<p>它跟前面所有抽水系统最大的区别在于它是温水煮青蛙式的：</p>
<p>只要你在这个国家生活、领工资、消费——你的购买力就被绑定在它的贬值轨道上。没有出口，也没有"愤怒的临界点"——因为它的剥削是缓慢的、累积的、被通胀曲线掩盖的，永远不会引发民变。</p>
<p>这是为什么有钱人想方设法持有非现金资产（房产、股票、黄金、加密货币）。如果你不参与，便是在让通胀吃掉你的财富。</p>
<p>成功的反面不是失败，而是长期无所作为。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="轮�次">轮次<a href="https://jiangmiemie.com/blog/2026/4/30/#%E8%BD%AE%E6%AC%A1" class="hash-link" aria-label="Direct link to 轮次" title="Direct link to 轮次" translate="no">​</a></h2>
<p>现在我们知道了如何决策：</p>
<ul>
<li class="">避开负和系统：博彩、彩票、超杠杆衍生品、长期持有纯现金</li>
<li class="">承认结构性垄断：烟、油、地、税、通胀无法回避，把它当成"生活成本"接受</li>
<li class="">少做零和游戏：短线交易、择时博弈，没有信息或速度优势就别玩</li>
<li class="">多做正和事情：长期持有优质企业 / 指数、自身能力建设、生产力工具</li>
</ul>
<p>但这里还有一个更现实的问题：人在不同阶段，对财富的态度就不该一样。</p>
<p><strong>穷则求变，福则求稳。</strong></p>
<p>对于一个还在上升期的人来说，过早追求资产的均匀配置——黄金、现金、债券、股票各来一点——看起来很成熟，实际上本金太小的时候，分散配置最大的作用不是分散风险，而是分散阶级跃升的希望。</p>
<p>当本金还小，真正能在相对短期内积累原始资本的正和机会并不多。大多数看似"快钱"的东西，本质上是零和甚至负和：短线追涨杀跌、杠杆合约、彩票式炒币、情绪化赌博。</p>
<p>相对而言，普通人能接触到的进攻型正和游戏，主要只有两类：</p>
<ul>
<li class="">IPO 打新 / 新股申购</li>
<li class="">美股优质企业 / 指数</li>
</ul>
<p>港股 IPO 现在不是稳赚不赔，过去新股总体破发率并不低，约四成破发意味着失败概率始终存在；但反过来看，胜率仍然大于一半。再加上主要持股人通常有一段禁售期，上市初期至少不用立刻面对核心股东集中砸盘。</p>
<p>但 IPO 的窗口也不是无限的。保荐人、承销商、早期资金都有自己的退出节奏，市场也会提前交易这种预期。很多新股如果前期涨得太猛，几个月后的解禁和业绩验证都会导致有短期盈利压力的承销商退潮。散户如果要参与，就必须明白打新是一场有时间限制的概率游戏。要跑，请趁早。</p>
<p>股票也是一样。长期指数化持有是正和，但这不代表任何时候闭眼买入都舒服。对于想更主动一点的人，能做的不是每天猜涨跌，而是围绕几个周期观察市场：</p>
<ul>
<li class="">财报周期   →  大约 3 个月一次，验证公司增长是否还在</li>
<li class="">估值周期   →  判断价格是否已经透支未来</li>
<li class="">情绪周期   →  观察市场是在恐慌、平静，还是过度贪婪</li>
</ul>
<p>换句话说，普通人不需要成为华尔街交易员，但至少要知道自己正在追什么。如果没有纪律，很容易滑回零和游戏。</p>
<p>加密货币则更特殊。它不像股票那样有清晰的利润表，也不像 IPO 那样有固定的发行、禁售和解禁节奏。它更像是把"货币""技术""能源""社区共识"揉在一起的市场，所以不能简单地把它理解成"股票的高波动版本"。</p>
<p>从普通人的视角，可以把它拆成三层：</p>
<ul>
<li class="">比特币     →  对抗货币贬值的叙事，接近数字黄金</li>
<li class="">以太坊     →  智能合约与链上应用的底层资产，接近数字世界的基础设施</li>
<li class="">山寨币     →  叙事、社区、流动性和情绪的混合博弈</li>
</ul>
<p>比特币的核心不是"公司赚钱"，而是"法币长期贬值"这个大背景。前面讲印钞，本质上就是解释为什么一部分人愿意相信比特币：如果现金注定被缓慢稀释，那么一个总量受限、全球流通、无法被单一政府随意增发的资产，就天然会拥有一部分避险叙事。</p>
<p>以太坊则不只是"另一个币"。它更像一个链上系统的底座：有人在上面发行资产、做交易、写合约、搭应用。它的价值来源不是单纯稀缺，而是生态是否真的有人用。换句话说，比特币更像"货币叙事"，以太坊更像"产业叙事"。</p>
<p>但山寨币要单独看。绝大多数山寨币没有长期现金流，也没有稳定护城河，更多靠社区、故事、交易所流动性和短期情绪推动。涨的时候像改变命运，跌的时候像彩票刮完。它可能给人暴富机会，但从系统属性看，更接近高波动的零和游戏，甚至是负和游戏。</p>
<p>所以加密货币不是不能碰，而是必须分清自己在买什么：</p>
<ul>
<li class="">买比特币   →  买的是通胀对冲和长期共识</li>
<li class="">买以太坊   →  买的是链上基础设施和生态增长</li>
<li class="">买山寨币   →  买的是叙事扩散、社区热度和退出速度</li>
</ul>
<p>其中最容易被忽略的，就是政策边界。股票市场虽然也有监管差异，但大体上都是被国家承认的金融资产；加密货币不一样，它在不同国家和地区的身份差异极大。</p>
<p>可以粗略分成三类：</p>
<ul>
<li class="">禁止型   →  中国大陆：认定虚拟货币相关业务活动属于非法金融活动，交易、撮合、代币发行都被严格限制</li>
<li class="">承认型   →  美国、日本、德国、新加坡、瑞士、阿联酋：允许持有或交易，但通过牌照、税务、反洗钱规则纳入监管</li>
<li class="">观望型   →  香港、俄罗斯、印度：并非简单放开，也不是完全禁止，而是在税务、牌照、资本流动或立法框架里试探边界</li>
</ul>
<p>这意味着，加密货币的风险不只来自价格波动，还来自<strong>你能不能合法、安全、低摩擦地买入、持有、交易和出金。</strong></p>
<p>它的机会在于：当全球流动性宽松、技术叙事成立、社区共识扩散时，价格弹性会远大于股票。它的危险也在于：当流动性退潮、叙事证伪、社区互相踩踏时，下跌同样没有底线。</p>
<p>因此，加密货币更适合放在"原始资本阶段"的进攻仓位里，而不适合作为全部身家的底仓。它可以是年轻人追求非线性机会的一部分，但不能成为用来证明自己勇敢的赌桌。</p>
<p>所以年轻时完全求稳，可能错过改变命运的窗口；有钱后还只会冒险，则可能把前半生的积累一次还给市场。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="变量">变量<a href="https://jiangmiemie.com/blog/2026/4/30/#%E5%8F%98%E9%87%8F" class="hash-link" aria-label="Direct link to 变量" title="Direct link to 变量" translate="no">​</a></h2>
<p>知道了游戏属性，也知道了自己在哪一轮，还有一个问题：每天的信息那么多，你到底该追什么？</p>
<ul>
<li class="">长期且关键、但消息最少     →  利率、人口结构、能源成本、技术范式</li>
<li class="">短期且高噪音、但消息最多   →  IPO 热度、概念题材、短线行情、社交平台情绪</li>
</ul>
<p>更重要的是知道信息的重要性，并比别人更快的知道或推测出你要的信息。</p>
<p>AI、新能源、机器人，这些是互联网之后最大的一轮技术变革。是上一代周期里不具备的新变量。但 AI 也是噪声最大的赛道。每天的新模型、新 demo、新概念股，绝大部分属于"短期且高噪音"。真正值得跟踪的是少数几个慢变量：底层模型能力的代际、计算成本曲线、能源约束、产品分发效率。</p>
<p>改进蜡烛得不到电灯，马训练得再好也变不成汽车，新问题强迫我们回到第一性原理重新思考，对于AI来说，只有每天高强度的使用AI，才能更好的评估出其价值。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="能力">能力<a href="https://jiangmiemie.com/blog/2026/4/30/#%E8%83%BD%E5%8A%9B" class="hash-link" aria-label="Direct link to 能力" title="Direct link to 能力" translate="no">​</a></h2>
<p>变化加速的时代，几条值得长期建设的能力：</p>
<ul>
<li class="">执行能力：知道和做到之间永远有一道鸿沟。跑步成绩不会因为"知道"而提升，只会因为"训练"而提升。让 AI 替你学习，就像请机器人替你健身。</li>
<li class="">英语：越来越像驾照。不是高门槛技能，但长期有用。</li>
<li class="">学习判断：用"30 法则"过滤新技术——30 小时、30 个月、30 年后，它分别给给我的生活带来怎样的影响？</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="下注">下注<a href="https://jiangmiemie.com/blog/2026/4/30/#%E4%B8%8B%E6%B3%A8" class="hash-link" aria-label="Direct link to 下注" title="Direct link to 下注" translate="no">​</a></h2>
<p>长期看，收益来自承担可理解的风险；短期看，偶尔会出现收益风险比极高的窗口。真正重要的是：出现窗口时，你是否已经准备好。</p>
<p>下注之前，先分清两类决策：</p>
<ul>
<li class="">单向门   →  不可逆。例：辞职、迁居、All-in、加杠杆、私钥外泄</li>
<li class="">双向门   →  可逆。例：开账户、试用工具、定投试水、读一本新领域的书</li>
</ul>
<p>对单向门保持极度谨慎，对双向门保持极度宽容——这是把"试错预算"花对地方的关键。最常见的错误，是把双向门当单向门来纠结（"我该不该学这个"），又把单向门当双向门来冲动（"All-in 这个币吧，反正能再来一次"）。</p>
<p>压力管理可以降低冲动决策概率，和精力分配一样，都是成年人的必修课。</p>
<p>最后，普通人的经济学，就是勇敢地为自己的判断下注。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2026-4-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2026%2F4%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E5%8B%87%E6%95%A2%E7%9A%84%E4%B8%BA%E8%87%AA%E5%B7%B1%E7%9A%84%E5%88%A4%E6%96%AD%E4%B8%8B%E6%B3%A8%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>学习</category>
            <category>技术</category>
            <category>生活</category>
        </item>
        <item>
            <title><![CDATA[AI水平依然与用户挂钩]]></title>
            <link>https://jiangmiemie.com/blog/2026/2/28/</link>
            <guid>https://jiangmiemie.com/blog/2026/2/28/</guid>
            <pubDate>Sat, 28 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[关于AI的使用依然非常吃技术基础，上下文依然是模型能力的关键]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2026_2_28_.mp3" preload="metadata"></audio><p>我是 <span style="position:relative;display:inline-block"><span style="background:linear-gradient(transparent 70%, #FFFF00 30%)">Docusaurus<sup style="color:red;font-size:0.7em;margin-left:2px;font-weight:bold">?</sup></span></span> 的老用户了。这次我想实现一个小需求：在文档标题旁出现一个“复制为 Markdown”按钮。</p>
<p>我刻意模仿传统用户、有基础的用户、深度用户，想看看强模型下，用户的技术深度是否还有很好的影响力。</p>
<p>本文使用的是 Cursor 版的 <span style="position:relative;display:inline-block"><span style="background:linear-gradient(transparent 70%, #FFFF00 30%)">Opus 4.6<sup style="color:red;font-size:0.7em;margin-left:2px;font-weight:bold">?</sup></span></span>。每次都用 Cursor Agent 模式。因为 Opus 4.6 比较贵，我给自己加了一个限制：每个阶段只问 7 次。这样一个小需求，7 次应该差不多了吧。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="小白">小白<a href="https://jiangmiemie.com/blog/2026/2/28/#%E5%B0%8F%E7%99%BD" class="hash-link" aria-label="Direct link to 小白" title="Direct link to 小白" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 1 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">https://github.com/FlyNumber/markdown_docusaurus_plugin</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">这个项目的样式很不错，我希望像它这样实现。你看能不能仅在本地实现？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：普通的开局。</li>
<li class=""><strong>Gemini3点评</strong>：典型的“甩手掌柜”式开局。只给参考链接而不说明具体逻辑，强行让 AI 进行逆向工程。虽然 Opus 4.6 能够读取网页，但这种缺乏上下文的提问会让 AI 生成大量通用代码，而非针对你现有项目的适配方案。</li>
<li class=""><strong>GPT5.3点评</strong>：目标存在，但约束不足。没有说明当前项目结构、技术路径或限制条件，模型只能进行高层猜测，容易走向泛化方案而非可执行实现。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：给了一个参考项目链接，但没有说清楚"像它这样"具体指哪部分——是按钮的位置、交互方式、还是视觉风格？"仅在本地实现"的约束也比较模糊（是指不发布 npm 包？还是不依赖外部服务？）。模型只能靠猜测来填补这些空白，第一步的方向偏差就此埋下。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 2 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">https://www.npmjs.com/package/docusaurus-plugin-includes?activeTab</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">code</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">我模仿这个插件设置了我的 Markdown Copy Button，但是按钮位置不正确。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">请你获取这个包，查看并比较其代码，尤其是关于如何定位按钮元素的部分，帮我分析可能的原因并修复。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：继续等待结果。</li>
<li class=""><strong>Gemini3点评</strong>：此时用户陷入了“找参考”的循环。试图通过让 AI 比较两个第三方库来解决本地的样式问题，这其实增加了 AI 的推理成本，容易导致它在处理 DOM 选择器时产生幻觉。</li>
<li class=""><strong>GPT5.3点评</strong>：明显提升。开始提供对比对象 + 具体问题 + 分析任务。但仍缺少当前代码片段，模型需要“想象你的实现”，错误概率较高。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：引入了第二个参考项目来做对比分析，思路不错。问题在于：用户自己也不清楚按钮位置为什么不对，把"诊断"和"修复"同时甩给模型，相当于让模型在两个未知代码库之间做 diff 推理——这对上下文窗口和推理准确度都是很大的压力。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 3 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">https://github.com/FlyNumber/markdown_docusaurus_plugin</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">请你仔细参考官方样式，确保 </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain">:1 复刻。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：开始着急，语气也更强硬了。</li>
<li class=""><strong>Gemini3点评</strong>：情绪化提示词。这里的“1:1 复刻”是一个非常模糊的指令，因为 CSS 表现受到父级容器、全局样式和 Docusaurus 版本的共同影响。对 AI 施压通常无法获得技术上的突破。</li>
<li class=""><strong>GPT5.3点评</strong>：需求变得严格，但信息反而减少。强调结果而非路径，会导致模型反复调整样式层，而不是定位架构问题。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：典型的"加压式提示"——用"仔细""确保""1:1 复刻"来强调期望，但没有提供任何新的技术信息。模型并不会因为你说"仔细"就变得更仔细；它缺的是具体的 CSS 选择器或 DOM 结构差异描述，而不是更高的情绪压力。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 4 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">我将其调整至 Markdown 的顶部，但样式上应该与标题横向对齐，请你思考如何处理。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：这个提示词开始有用，但如果方向不对，只会让注意力越跑越偏。</li>
<li class=""><strong>Gemini3点评</strong>：终于开始描述具体的 UI 布局问题。但由于没有提供 HTML 结构片段或 CSS 现状，AI 只能靠猜（例如猜测是 Flex 布局还是 Absolute 定位）。</li>
<li class=""><strong>GPT5.3点评</strong>：开始进入“具体问题空间”，这是有效转折点。但仍停留在 CSS 层，未验证是否属于组件挂载层错误。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：终于给出了一个具体的布局约束——"与标题横向对齐"。这是整个小白阶段最有技术含量的一句提示。遗憾的是，此时模型可能已经在错误的实现路径上走了三轮，积累了大量错误上下文，纠偏成本已经很高。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 5 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">还有其他方案吗？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：意识到方向不对，开始发散思维。</li>
<li class=""><strong>Gemini3点评</strong>：在没有解决前一个方案 Bug 的情况下开启新方案，是“小白模式”失败的预兆。这会让 Agent 在文件系统中创建更多冗余代码，增加项目混乱度。</li>
<li class=""><strong>GPT5.3点评</strong>：良好的纠偏行为，但过于开放。模型会生成多个架构级方案，反而增加试错成本。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：短小但关键的一个转折。主动让模型跳出当前方案是正确的直觉。但更好的做法是附上"当前方案的问题是什么"——比如"当前方案用了绝对定位导致响应式布局错位，有没有用 flex 布局的方案？"这样模型才能真正换一条路，而不是在同一棵树上换根枝。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 6 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">试试：方案 </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：继续尝试。</li>
<li class=""><strong>Gemini3点评</strong>：盲目试错。此时已经完全失去了对技术实现的掌控感，纯粹在靠 AI 的随机性碰运气。</li>
<li class=""><strong>GPT5.3点评</strong>：典型“AI 驱动试错”。没有重新校验问题定义，只是在既定错误路径上继续前进。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：极度简短，完全依赖上一轮模型给出的方案列表。如果模型上一轮的"方案 2"本身描述就有歧义，这一轮就是在盲选。一个更稳妥的做法是用自己的话复述方案 2 的核心思路，确认双方理解一致后再执行。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 7 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">Module not found: Error: Can</span><span class="token string" style="color:rgb(163, 21, 21)">'t resolve '</span><span class="token plain">@theme/PwaReloadPopup</span><span class="token string" style="color:rgb(163, 21, 21)">' in '</span><span class="token plain">C:</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">Users</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">jiang</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">Desktop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">github</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">jiangyangcreate.github.io</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">node_modules</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">@docusaurus</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">plugin-pwa</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">lib'</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：直接丢报错。遗憾的是，修复后样式依然不正确，7 次机会用完了。</li>
<li class=""><strong>Gemini3点评</strong>：典型的“报错驱动开发”。当对话进入修 Bug 环节时，如果底层逻辑（方案 2）本身就不适配 Docusaurus 的架构，即便消除了报错，功能依然无法达成。</li>
<li class=""><strong>GPT5.3点评</strong>：属于被动调试阶段。模型只能修补表层错误，无法回溯最初的设计偏差。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：直接粘贴报错是最省力的提示方式，对于明确的编译错误来说效率很高。但此时核心问题已经不是这个 import 错误，而是整体架构方向的偏差。7 轮中有 5 轮都在"修补"而非"重新审视"，这是小白阶段失败的根本原因：缺乏在中途叫停、重新定义问题的能力。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="基础">基础<a href="https://jiangmiemie.com/blog/2026/2/28/#%E5%9F%BA%E7%A1%80" class="hash-link" aria-label="Direct link to 基础" title="Direct link to 基础" translate="no">​</a></h2>
<p>我再模仿“有技术背景、但不熟悉 <span style="position:relative;display:inline-block"><span style="background:linear-gradient(transparent 70%, #FFFF00 30%)">Docusaurus 用户<sup style="color:red;font-size:0.7em;margin-left:2px;font-weight:bold">?</sup></span></span>”的提示词：</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 1 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">目前这个项目 https://www.flynumber.com/docs/，点击按钮获取 Markdown 的逻辑是什么，怎么实现的？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：看到这个项目已经有“加按钮”的实现，于是我引导模型去分析这个网站。</li>
<li class=""><strong>Gemini3点评</strong>：比小白阶段聪明的一点是：先问逻辑。理解逻辑后再动手，比直接要代码更稳健。</li>
<li class=""><strong>GPT5.3点评</strong>：这是明显升级。开始利用现成正确实现作为 ground truth，减少模型幻想空间。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：比小白阶段高明得多的开局——先"理解"再"动手"。让模型分析一个已经跑通的实现，相当于做逆向工程，能帮自己建立对技术方案的全局认知。不过，让模型分析线上网站存在一个风险：模型可能只能看到前端代码，看不到构建配置和插件注册逻辑，分析结果可能不完整。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 2 轮提示词</p><p>按钮定位思路来自第一轮对话结果的分析</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">这是我的按钮定位思路：</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">插件接入层：通过 index.js 的 getThemePath</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 暴露 theme/，让 Docusaurus 使用自定义的 theme/Root.js 作为根组件入口。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain">页面 </span><span class="token operator" style="color:rgb(0, 0, 0)">&amp;</span><span class="token plain"> DOM 选择：在 Root.js 中用 useLocation</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 拿到 pathname，仅在以 /docs/ 开头的文档页执行逻辑；通过 document.querySelector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">'article .markdown header'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 精确找到文档标题所在的 header。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain">挂载点注入：在该 header 内新建一个 div.markdown-actions-container，并作为最后一个子节点 append 进去，再用 createRoot</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">container</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">.render</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain">MarkdownActionsDropdown /</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 把按钮组件挂载到这个容器。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain">样式层定位：在站点 CSS 中把 article .markdown header 设为 display: flex，h1 设为 flex: </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"> auto，并给 .markdown-actions-container 设置 margin-left: auto（以及移动端、RTL 的补充样式），从而实现「标题在左，按钮在右，且在不同布局下表现良好」。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">请你按照我的思路，修改现有的 CopyMarkdownButton 组件。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：根据模型给出的分析结果继续执行。这里其实有个问题：模型会出错。上一步分析结果也可能是错的；如果你没有能力判断其正确性，反而应该先让模型“直接模仿目标网站”把功能跑通。</li>
<li class=""><strong>Gemini3点评</strong>：这是一个<strong>结构化指令</strong>的范本。它包含了“注入层、逻辑层、挂载点、样式层”的完整思考。虽然用 <code>querySelector</code> 操作 DOM 在 React 框架中不是最优解，但其工程描述非常清晰。</li>
<li class=""><strong>GPT5.3点评</strong>：高质量提示词。提供完整架构推理链，使模型进入“执行模式”。但风险在于：若前提分析错误，后续全部建立在错误基础上。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：信息密度最高的一条提示词。四层架构（插件层、页面层、挂载层、样式层）描述得非常清晰，模型几乎不需要猜测。问题在于：这个方案本身用了 querySelector + createRoot 的命令式注入，绕开了 Docusaurus 的声明式主题体系，这意味着会遇到 SSR/hydration 不一致、路由切换时组件不刷新等问题。方案的"结构化程度"很高，但"方向正确性"存疑——有时候，过早地给出详细方案反而会锁死模型的探索空间。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 3 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">试着给 Blog 插件下的文档页注入这个按钮。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：由于模型实现有误，此时发现不对劲，于是继续引导到插件层。</li>
<li class=""><strong>Gemini3点评</strong>：开始探索 Docusaurus 的多实例特性。用户意识到仅靠 <code>Root.js</code> 这种“全局补丁”方式可能在不同路由下有兼容性问题。</li>
<li class=""><strong>GPT5.3点评</strong>：正确的方向修正。从页面层开始上移到插件生命周期，是工程思维提升的表现。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：开始意识到 docs 和 blog 是两套不同的插件体系，需要分别处理。提示词本身简洁合理，但"试着"这个词暗示用户自己也不确定可行性——如果能补一句"Blog 插件的布局组件是哪个？"先确认技术可行性，会更稳。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 4 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">如何给 docs 也注入这个按钮？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：给一个开放式问题，让模型自由发挥。</li>
<li class=""><strong>Gemini3点评</strong>：提示词略显后退，变得模糊了。但在经历过报错后，给模型一定的“自主权”有时能激发它找到更符合官方推荐（Best Practice）的路径。</li>
<li class=""><strong>GPT5.3点评</strong>：开放式探索适合此阶段，但最好附带限制（swizzle / theme override / plugin API）。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：在前几轮过于具体的指导之后，这里切换成开放式问题是一个很好的节奏调整。让模型自己选择 docs 插件的注入方式，可能会发现比用户预设方案更好的路径。这体现了一个重要的提示技巧：在你不确定的领域，给模型自由度比给模型指令更有效。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 5 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">Compiled with problems:</span><br></div><div class="token-line" style="color:#000000"><span class="token plain">×</span><br></div><div class="token-line" style="color:#000000"><span class="token plain">ERROR </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> ./src/theme/BlogPostPage/index.js</span><br></div><div class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">..</span><span class="token plain">.</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：这里模型多次报错，最后还是人工介入才解决。</li>
<li class=""><strong>Gemini3点评</strong>：AI 在自动修改 <code>node_modules</code> 或 <code>swizzle</code> 出来的文件时，经常会发生重复声明或导入路径错误。这里的人工介入体现了“基础”用户虽然懂代码，但被 AI 的粗心带进了坑里。</li>
<li class=""><strong>GPT5.3点评</strong>：说明模型已进入复杂重构区。缺乏上下文完整性时，AI 很难维持大型文件的一致性。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：重复声明错误说明模型在修改文件时没有正确处理已有的 export——这是 Agent 模式下常见的"部分覆盖"问题。直接贴报错让模型修是对的，但如果能同时说一句"你在追加代码时没有删除原有的 default export"，模型定位问题会快一个数量级。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 6 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">为什么我打开网页，没有第一时间出现这个按钮，反而是刷新一下就有了？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：新的 BUG 出现了。</li>
<li class=""><strong>Gemini3点评</strong>：这是一个非常深刻的<strong>单页应用（SPA）生命周期</strong>问题。这种观察力是区分小白与基础用户的关键：小白只会说“不行”，而基础用户能发现“路由切换不触发，刷新才触发”的规律。</li>
<li class=""><strong>GPT5.3点评</strong>：优秀的问题类型。开始关注生命周期与 hydration，而非表面功能。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：这个问题描述非常精准——"首次加载没有，刷新后有"直接指向了客户端渲染时机的问题（大概率是 useEffect + querySelector 在 SPA 路由切换时没有重新执行）。好的 bug 描述就是最好的提示词，这一轮做得很到位。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 7 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">改成「不用 querySelector，直接在 Docusaurus 的文档布局里声明式渲染」</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：最终结论是：这个阶段并没有在 7 轮对话内完成项目。</li>
<li class=""><strong>Gemini3点评</strong>：这是一个极其关键的转折。用户意识到“命令式（DOM操作）”走不通，开始要求转向“声明式（React组件注入）”。可惜 7 次额度已满，否则这一步将是通往成功的曙光。</li>
<li class=""><strong>GPT5.3点评</strong>：这是关键跃迁：从 DOM 操作 → 框架声明式扩展。说明用户开始主导架构，而不是让模型主导。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：这条提示词本质上是在第 7 轮推翻了第 2 轮的整体架构——从命令式注入转向声明式渲染。方向完全正确，这正是 Docusaurus 的正统做法（swizzle 主题组件）。遗憾的是来得太晚了：如果这条出现在第 2 或第 3 轮，整个基础阶段大概率能在 7 轮内完成。这再次印证了一个规律：越早纠正架构方向，越省后续的调试轮次。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="熟悉">熟悉<a href="https://jiangmiemie.com/blog/2026/2/28/#%E7%86%9F%E6%82%89" class="hash-link" aria-label="Direct link to 熟悉" title="Direct link to 熟悉" translate="no">​</a></h2>
<p>作为熟悉 Docusaurus 的用户，我最终的提示词是：</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 1 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">Docusaurus 通常把一些组件/插件隐式运行，但用户可以在 swizzle（导出）后进行替换。这段话在官方文档哪里？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：引导注意力机制到合适的技术方案上。</li>
<li class=""><strong>Gemini3点评</strong>：<strong>降维打击。</strong> 专家级用户不直接要代码，而是先确认“底层规则”。通过 <code>Swizzle</code>（Docusaurus 的核心机制）来切入，这直接排除了前两个阶段中所有“暴力操作 DOM”产生的无效路径。</li>
<li class=""><strong>GPT5.3点评</strong>：优秀的“注意力校准提示词”。不是解决问题，而是先定位正确知识源。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：高手开局。不是直接说"帮我加按钮"，而是先让模型定位到 swizzle 机制的官方文档。这一步的价值在于：(1) 确认模型对 swizzle 的理解是否正确；(2) 把模型的注意力锚定在 Docusaurus 的官方扩展范式上，避免它走弯路去搞 querySelector 注入。用一个"知识确认"问题来校准模型的认知基线，是非常老练的提示技巧。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 2 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">请你接管我的电脑，找到合适的组件，让我可以在博客标题旁渲染 </span><span class="token string" style="color:rgb(163, 21, 21)">"复制为 Markdown"</span><span class="token plain"> 这个按钮。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：再次引导注意力机制到合适的技术方案上，给出模糊的目标。</li>
<li class=""><strong>Gemini3点评</strong>：基于第一步确立的 <code>Swizzle</code> 共识，专家给出了极大的自由度。因为路径正确，此时的“模糊目标”反而能让 AI 精准找到 <code>DocItem/Header</code> 或 <code>BlogPostPage</code> 等核心组件。</li>
<li class=""><strong>GPT5.3点评</strong>：高阶提示方式。目标明确但路径开放，使模型执行搜索与决策，而非生成代码。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：在第 1 轮已经锚定了 swizzle 范式后，这里故意给出模糊目标——"找到合适的组件"。这不是偷懒，而是策略：让模型自己去判断该 swizzle 哪个组件（DocItem/Layout？BlogPostPage？），这比用户硬指定一个可能错误的组件要安全得多。在正确的框架约束下给出模糊目标，是让模型发挥最大价值的甜蜜点。</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>第 3 轮提示词</p><div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">思考下，@custom.css </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1719</span><span class="token plain">-1721</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 这个样式会被应用到 @index.js </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">13</span><span class="token plain">-15</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> 的 title 吗？如果不会，如何调整最优雅？</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div></code></pre></div></div></div></div>
<ul>
<li class=""><strong>我的点评</strong>：精准给出 AI 能理解的样式异常。</li>
<li class=""><strong>Gemini3点评</strong>：这是最高级的反馈：<strong>“代码行级别的精准定位”</strong>。不再泛泛而谈“样式不对”，而是直接指出 CSS 选择器与 JS 组件的对应关系。这消除了 AI 的所有猜测空间。</li>
<li class=""><strong>GPT5.3点评</strong>：接近专家级提示词。特点：明确作用域 + 指定文件位置 + 明确假设验证</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：教科书级别的提示词。三个亮点：(1) 用 @文件名 (行号) 精确引用代码位置，消除歧义；(2) 问题本身是一个可验证的 yes/no 判断（"会不会被应用到"），模型容易给出准确答案；(3) 追问"如何调整最优雅"而不是"帮我修"，给了模型设计空间。整个"熟悉"阶段只用了 3 轮就接近完成，和小白阶段的 7 轮未果形成鲜明对比。</li>
</ul>
<hr>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="体会">体会<a href="https://jiangmiemie.com/blog/2026/2/28/#%E4%BD%93%E4%BC%9A" class="hash-link" aria-label="Direct link to 体会" title="Direct link to 体会" translate="no">​</a></h2>
<p>不得不说，Opus 4.6 还是相当强悍。模型是 <span style="position:relative;display:inline-block"><span style="background:linear-gradient(transparent 70%, #FFFF00 30%)">本体放大器<sup style="color:red;font-size:0.7em;margin-left:2px;font-weight:bold">?</sup></span></span>：你越能提出结构化问题、越能判断中间结果，模型就越强。</p>
<ul>
<li class=""><strong>我的点评</strong>：这次实验非常真实地展示了“提示词质量决定上限，工程判断力决定下限”。如果把 AI 当成一个高水平但会犯错的搭档，而不是“全自动执行器”，效率会更高、返工会更少。2026 年，你依然值得深入学习编程。</li>
<li class=""><strong>Gemini3点评</strong>：完全赞同。小白在“求药”，基础用户在“开方”，而专家用户在“定规矩”。<strong>2026 年的编程，不再是手写每一行代码的体力活，而是从海量可能性中快速“剪枝”的判断力竞争。</strong></li>
<li class=""><strong>GPT5.3点评</strong>：实验核心结论成立：模型不是替代工程能力，而是放大工程能力的乘数。用户水平越高，AI 从“代码生成器”越接近“协同架构师”。</li>
<li class=""><strong>Opus 4.6(当事人)点评</strong>：这篇博客最有价值的发现是：三个阶段使用的是同一个模型、同一个需求，但轮次消耗差异巨大（7轮失败 → 7轮未完成 → 3轮接近完成）。这说明在强模型时代，提示词的边际收益远高于模型能力的边际收益。小白阶段的核心问题不是"模型不够强"，而是用户无法在中途判断方向对不对、该不该推翻重来。"本体放大器"这个比喻非常精准——模型放大的不只是知识，更是你的"元认知能力"：知道自己不知道什么、知道什么时候该叫停、知道该把哪些决策权交给模型。2026 年学编程的意义，或许正在从"会写代码"转向"会驾驭写代码的 AI"。</li>
</ul>
<p>题外话：我也试着让<strong>Qwen3.5-Plus</strong>点评，但是同样的提示词只点评全文，不点评每一次的提示词，国产模型依然任重道远。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2026-2-28.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2026%2F2%2F28%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22AI%E6%B0%B4%E5%B9%B3%E4%BE%9D%E7%84%B6%E4%B8%8E%E7%94%A8%E6%88%B7%E6%8C%82%E9%92%A9%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>学习</category>
            <category>技术</category>
            <category>生活</category>
        </item>
        <item>
            <title><![CDATA[2025年年末总结与回顾]]></title>
            <link>https://jiangmiemie.com/blog/2025/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2025/12/30/</guid>
            <pubDate>Tue, 30 Dec 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[关于学习方法的思考、技术成长的反思以及生活旅行中的感悟]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2025_12_30_.mp3" preload="metadata"></audio><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习">学习<a href="https://jiangmiemie.com/blog/2025/12/30/#%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="Direct link to 学习" title="Direct link to 学习" translate="no">​</a></h2>
<p>学习可以分为两个核心过程：<strong>记忆</strong>与<strong>抽象</strong>。</p>
<p>传统观点认为，记忆依赖重复：</p>
<ul>
<li class="">短时间内重复的内容越少、重复次数越多，记忆越牢固；</li>
<li class="">反之，若一次塞入大量内容，即使重复，也难以深入记忆。</li>
</ul>
<p>因此，人们常通过<strong>精简信息</strong>来提升记忆效率。例如，将"<code>long double</code> 在不同平台上的长度不一致"简化为一句结论，以减少认知负担。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>新发现</div><div class="admonitionContent_BuS1"><p>但最近我发现：<strong>适当增加"易于吸收"的背景知识，反而能增强记忆效果</strong>。</p></div></div>
<p>比如，了解以下背景：</p>
<blockquote>
<p>1980年代初，Intel 推出了 x87 浮点协处理器（8087），采用 80 位（10 字节）扩展精度格式，显著提升了科学计算的精度。<br>
<!-- -->Linux 和 GCC 选择充分利用这一硬件特性，将 <code>long double</code> 实现为 80 位；<br>
<!-- -->而 Microsoft 在 Visual Studio 中则采取保守策略，兼容性优先。将 <code>long double</code> 等同于 64 位的 <code>double</code>。</p>
</blockquote>
<p>这段看似"额外"的信息，因其具有<strong>历史脉络、技术动机和对比逻辑</strong>，反而更容易被记住——甚至比孤立的结论记得更牢。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="建立联系">建立联系<a href="https://jiangmiemie.com/blog/2025/12/30/#%E5%BB%BA%E7%AB%8B%E8%81%94%E7%B3%BB" class="hash-link" aria-label="Direct link to 建立联系" title="Direct link to 建立联系" translate="no">​</a></h3>
<p>这让我意识到：<strong>有效的记忆不仅依赖重复，更依赖"联系"</strong>。</p>
<p>这种联系有两种关键形式：</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="向外连接教学视角">向外连接（教学视角）<a href="https://jiangmiemie.com/blog/2025/12/30/#%E5%90%91%E5%A4%96%E8%BF%9E%E6%8E%A5%E6%95%99%E5%AD%A6%E8%A7%86%E8%A7%92" class="hash-link" aria-label="Direct link to 向外连接（教学视角）" title="Direct link to 向外连接（教学视角）" translate="no">​</a></h4>
<p>将新知识与学习者已有的知识网络通过<strong>故事性、情境化的方式</strong>连接起来。例如，用"Intel 为何设计 80 位？"这个问题，把抽象的数据类型与真实的技术演进挂钩。</p>
<p>关键在于：<strong>找到那个能触发共鸣的"锚点"</strong>——它可能是历史事件、生活类比，或一个引人好奇的矛盾。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="向内连接自我解释视角">向内连接（自我解释视角）<a href="https://jiangmiemie.com/blog/2025/12/30/#%E5%90%91%E5%86%85%E8%BF%9E%E6%8E%A5%E8%87%AA%E6%88%91%E8%A7%A3%E9%87%8A%E8%A7%86%E8%A7%92" class="hash-link" aria-label="Direct link to 向内连接（自我解释视角）" title="Direct link to 向内连接（自我解释视角）" translate="no">​</a></h4>
<p>在尝试向他人解释前，先自问：</p>
<ul>
<li class="">我会问自己哪些问题？</li>
<li class="">是否用陌生术语解释了另一个陌生术语？</li>
<li class="">小学生能听懂吗？</li>
<li class="">能否换一种更直观的说法？</li>
</ul>
<p>这个过程迫使你<strong>反复梳理逻辑、提炼本质</strong>，本质上是<strong>在重复中完成抽象</strong>，在抽象中强化记忆。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="正反馈机制">正反馈机制<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%AD%A3%E5%8F%8D%E9%A6%88%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="Direct link to 正反馈机制" title="Direct link to 正反馈机制" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>学习陷阱</div><div class="admonitionContent_BuS1"><p>但仅有联系还不够：学习必须有<strong>明确的正反馈机制</strong></p><p>就像游戏通过音效、金币、等级等<strong>即时、直观的反馈</strong>激励玩家持续行动，学习也需要清晰的"进度信号"和"成功标志"。否则，极易陷入两种陷阱：</p><ul>
<li class=""><strong>过度发散</strong>：例如初学 C 语言时，执着于深挖 <code>printf</code> 的源码实现，而忽略了基础语法体系的完整性；</li>
<li class=""><strong>方向迷失</strong>：没有阶段性目标，不知道"学到什么程度算掌握"，导致焦虑或低效重复。</li>
</ul></div></div>
<p>因此，<strong>好的学习规划必须包含可衡量的标记</strong>：</p>
<ul>
<li class="">
<p>✅ <strong>好的标记</strong>：</p>
<ul>
<li class="">"本段需全文背诵"（可自我检测）</li>
<li class="">"能独立写出一个使用 long double 的示例程序"（行为可验证）</li>
<li class="">"能向同学解释为什么 GCC 和 MSVC 对 long double 处理不同"（输出即检验）</li>
</ul>
</li>
<li class="">
<p>❌ <strong>模糊的标记</strong>：</p>
<ul>
<li class="">"重要知识点"（重要到什么程度？怎么验证？）</li>
<li class="">"理解即可"（"理解"是主观感受，容易自我欺骗）</li>
</ul>
</li>
</ul>
<p>这些明确的反馈节点，不仅提供<strong>成就感</strong>，还能<strong>划定学习边界</strong>——知道何时该深入，何时该暂停、转向下一模块。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="高效学习">高效学习<a href="https://jiangmiemie.com/blog/2025/12/30/#%E9%AB%98%E6%95%88%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="Direct link to 高效学习" title="Direct link to 高效学习" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>学习公式</div><div class="admonitionContent_BuS1"><p><strong>高效学习 = 联系 × 重复 × 反馈</strong></p></div></div>
<p>真正的学习不是被动重复，也不是无边界的探索，而是在<strong>建立联系的过程中，通过有反馈的重复与抽象，逐步构建可验证、可迁移的知识网络</strong>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="技术">技术<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%8A%80%E6%9C%AF" class="hash-link" aria-label="Direct link to 技术" title="Direct link to 技术" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="𝝅ython">𝝅ython<a href="https://jiangmiemie.com/blog/2025/12/30/#%F0%9D%9D%85ython" class="hash-link" aria-label="Direct link to 𝝅ython" title="Direct link to 𝝅ython" translate="no">​</a></h3>
<p>现在的Python 就像是这几年的英雄联盟，你想新手入门到大师，需要了解上百个英雄和技能和游戏机制。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>学习感悟</div><div class="admonitionContent_BuS1"><p>前期是非常痛苦的，但是一旦上手你就会想：好久没有新英雄了。多出几个吧。</p><p>Python 的基础已经很久没有新鲜玩意儿了，我希望多出几个。</p><p>重做对新人也很友好，新选手永远有机会，假设当某一个特性被重做了，那么我之前的所有的熟练度都消失了，新人和老人站在同一跑线上。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="面向服务器管理环境">面向服务器管理环境<a href="https://jiangmiemie.com/blog/2025/12/30/#%E9%9D%A2%E5%90%91%E6%9C%8D%E5%8A%A1%E5%99%A8%E7%AE%A1%E7%90%86%E7%8E%AF%E5%A2%83" class="hash-link" aria-label="Direct link to 面向服务器管理环境" title="Direct link to 面向服务器管理环境" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>环境管理误区</div><div class="admonitionContent_BuS1"><p>相当长一段时间，我被教如何给windows配置环境变量，也在这样教别人。</p><p>如果你只是一个初学者，或者你本身不是编程人员只在找"他山石"。那么这样做是没有问题的。</p><p>但如果要真正的从事生产开发的话，你的所有的环境管理一定是面向服务器的。服务器很少是windows环境，大部分是Linux环境，你所学习的内容无法帮助你解决工作的环境管理问题。</p></div></div>
<p>所以首先我要反思的就是我花了太多时间在windows的环境管理和设计上。<strong>所有的工作都应该基于Linux，面向服务器</strong>。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="过早设计项目">过早设计项目<a href="https://jiangmiemie.com/blog/2025/12/30/#%E8%BF%87%E6%97%A9%E8%AE%BE%E8%AE%A1%E9%A1%B9%E7%9B%AE" class="hash-link" aria-label="Direct link to 过早设计项目" title="Direct link to 过早设计项目" translate="no">​</a></h3>
<p>但现在回过头来看，当年设计的项目其实都非常的愚蠢，就是你在学习了一些基本的代码知识之后，然后你用它去实现完成的项目往往包含着：</p>
<ul>
<li class="">大量的重复；</li>
<li class="">没有做到一处修改，处处生效；</li>
<li class="">非常长的if else；</li>
<li class="">相同函数的复制粘贴。</li>
</ul>
<p>随着年纪的增长，你对项目的结构会有相当大的变化。</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>争议讨论</div><div class="admonitionContent_BuS1"><p>这里也许有人有争议，心想如果你之前不做那些愚蠢的项目，你后面怎么能够量变引起质变呢？</p><p>当然有可能在代码的一次又一次重构过程中堆积的能力是一次又一次的提升。会对设计模式的理解更加的深刻。</p><p>所以这里是一个保留的争议项。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="专注">专注<a href="https://jiangmiemie.com/blog/2025/12/30/#%E4%B8%93%E6%B3%A8" class="hash-link" aria-label="Direct link to 专注" title="Direct link to 专注" translate="no">​</a></h3>
<p>许多有价值的项目都有着大量的成熟产品的替代，在发展过程当中也有可能有别人会来抢你的饭碗，应该坚持找一个方向持续不停的把它做下去。即便大厂和你相似，你也能够聚焦某一个细分领域，把它做得出彩。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>项目理念</div><div class="admonitionContent_BuS1"><p><strong>项目不在于多，而在于精细、深入。</strong></p></div></div>
<p>很多人在大学期间就开始尝试构建自己的影响力，比如说做自媒体或者是做技术科普或者做产品，那么我的方法是写博客，那这种影响力其实相对比较低的。他也和我自身的性格有关，我认为我只有在某一个领域走得非常深入，我才有资格向别人传授一些东西。</p>
<p>现在看来，其实你并不用做到像Python核心开发者那样才可以去教一些Python内容，你只要把某一个基础的东西讲的很清楚，你就可以去做自己的影响力内容，比如说很简单的列表。你可以用动画的方式把它呈现出来，你可能没有那么专业，但特别好懂。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="低代码工作流平台">低代码工作流平台<a href="https://jiangmiemie.com/blog/2025/12/30/#%E4%BD%8E%E4%BB%A3%E7%A0%81%E5%B7%A5%E4%BD%9C%E6%B5%81%E5%B9%B3%E5%8F%B0" class="hash-link" aria-label="Direct link to 低代码工作流平台" title="Direct link to 低代码工作流平台" translate="no">​</a></h3>
<p>所有的数据通信都是通过网络来完成的，也就是一个再简单的图片拼接，这样用opencv几行代码就能完成的工作，你也需要配置一台服务器，然后给他写上各种参数，无疑是增加了一些成本的。</p>
<p>有一定成本的免费服务往往不可靠，在低代码平台当中想要编写一个健壮的工作流，需要额外增加许多节点。 而一旦有一个节点失效，他就会整个工作流崩溃。</p>
<p>低代码工作流不可靠，玩一下可以。别当真了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="风险">风险<a href="https://jiangmiemie.com/blog/2025/12/30/#%E9%A3%8E%E9%99%A9" class="hash-link" aria-label="Direct link to 风险" title="Direct link to 风险" translate="no">​</a></h3>
<p>谁承担风险，谁做主要决策。避免不对称的风险，是我们的必修课。如果你承担大部分风险，但是仅获取少部分利润。</p>
<p>例如公司希望你调整自己的职业发展（你承担大部分风险），但是利润并没有额外分配给你，这就是风险不匹配。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="世界是熵增的">世界是熵增的<a href="https://jiangmiemie.com/blog/2025/12/30/#%E4%B8%96%E7%95%8C%E6%98%AF%E7%86%B5%E5%A2%9E%E7%9A%84" class="hash-link" aria-label="Direct link to 世界是熵增的" title="Direct link to 世界是熵增的" translate="no">​</a></h3>
<p>加速的变化，混沌的信息
如果不加干预，不施改变，熵增不停。</p>
<p>如何干预？设置信息过滤系统。</p>
<ul>
<li class="">1.可信度（屏蔽不加核实仅转载的媒体）</li>
<li class="">2.传播度（关注跨行业出圈的信息）</li>
<li class="">3.相关度（聚焦自身领域的信息，实时整理，确保知识成体系）</li>
</ul>
<p>对信息要使用自主筛选机制，即:我需要什么，而不是使用视屏流或被动接受信息推送</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="生活">生活<a href="https://jiangmiemie.com/blog/2025/12/30/#%E7%94%9F%E6%B4%BB" class="hash-link" aria-label="Direct link to 生活" title="Direct link to 生活" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="南方装修建议">南方装修建议<a href="https://jiangmiemie.com/blog/2025/12/30/#%E5%8D%97%E6%96%B9%E8%A3%85%E4%BF%AE%E5%BB%BA%E8%AE%AE" class="hash-link" aria-label="Direct link to 南方装修建议" title="Direct link to 南方装修建议" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>入户设计</div><div class="admonitionContent_BuS1"><p>入户一侧是洗手间、浴室，方便放伞、宠物淋雨后及时洗澡、客人借用厕所。
内置伞架，脏衣篮</p><p>入户另一侧是鞋架，换鞋凳</p></div></div>
<p>再进一步便是客餐厅</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>厨房设计</div><div class="admonitionContent_BuS1"><p>封闭式回型厨房适用于中餐加工+岛台（可以用作餐桌+桌游桌），工具使用排排挂钩。</p></div></div>
<p>客厅设有电脑连接大屏电视，供游戏娱乐。</p>
<p>客厅、卧室外通阳台。大阳台方便晾晒大量衣物。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai眼镜的一些坏处">AI眼镜的一些坏处<a href="https://jiangmiemie.com/blog/2025/12/30/#ai%E7%9C%BC%E9%95%9C%E7%9A%84%E4%B8%80%E4%BA%9B%E5%9D%8F%E5%A4%84" class="hash-link" aria-label="Direct link to AI眼镜的一些坏处" title="Direct link to AI眼镜的一些坏处" translate="no">​</a></h3>
<div class="theme-admonition theme-admonition-warning admonition_xJq3 alert alert--warning"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 16 16"><path fill-rule="evenodd" d="M8.893 1.5c-.183-.31-.52-.5-.887-.5s-.703.19-.886.5L.138 13.499a.98.98 0 0 0 0 1.001c.193.31.53.501.886.501h13.964c.367 0 .704-.19.877-.5a1.03 1.03 0 0 0 .01-1.002L8.893 1.5zm.133 11.497H6.987v-2.003h2.039v2.003zm0-3.004H6.987V5.987h2.039v4.006z"></path></svg></span>使用限制</div><div class="admonitionContent_BuS1"><p>进一些不让携带电子设备的场所例如:考场、涉密单位可能会有一些隐患</p><p>下雨的时候会担心它烧坏</p><p>耳朵不舒服，需要准备两种眼镜腿</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="普通话">普通话<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%99%AE%E9%80%9A%E8%AF%9D" class="hash-link" aria-label="Direct link to 普通话" title="Direct link to 普通话" translate="no">​</a></h3>
<p>我每天都在说普通话，应该考个证书证明，查了一下才发现，普通话一级的通过率不到2%。</p>
<p>于是我找了一个一级甲等的老师，每次1个小时的课程，加课后3个小时的练习。通过5次授课提升到了普通话一级。可以满足省级播音员及出镜记者的要求了，以后参与线下活动也更有话语权了。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="旅行">旅行<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%97%85%E8%A1%8C" class="hash-link" aria-label="Direct link to 旅行" title="Direct link to 旅行" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="湛江">湛江<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%B9%9B%E6%B1%9F" class="hash-link" aria-label="Direct link to 湛江" title="Direct link to 湛江" translate="no">​</a></h3>
<p>在一个记不清的小吃街里，出于好奇买了一个炸虾饼，饼又硬又嚼不动，虾更是毫无新鲜可言，于是我得出了虾饼很难吃的结论。</p>
<p>上周去了趟湛江，在一家舌尖上的中国打卡店铺里吃海鲜面，同事发现有虾饼可以卖，想尝一下。老板从桶里抓出三只鲜虾，用特别的器皿混着面糊在油锅中晃荡。随后沥油切块。面饼酥脆，虾仁Q弹鲜香。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>美食感悟</div><div class="admonitionContent_BuS1"><p>原来，难吃的不是虾饼。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="澳门">澳门<a href="https://jiangmiemie.com/blog/2025/12/30/#%E6%BE%B3%E9%97%A8" class="hash-link" aria-label="Direct link to 澳门" title="Direct link to 澳门" translate="no">​</a></h3>
<p>口岸到机场有免费的往返接驳车，叫"发财车"。一到MGM就看到了一辆劳斯莱斯小金人。Peoebe在车上很害怕，一路上问我会不会拉到赌场里就不让出来了，我说这里又不是东南亚。</p>
<p>进去赌场，phoebe 被要求查验身份，一问知道如果年纪太小不让进。这里赌博的地方叫娱乐区。连成片的赌场穷奢极欲。这些娱乐场不仅提供西式博彩，还融合酒店、购物、表演等元素，大量的艺术装置随处摆放。</p>
<p>赌场外连着其他赌场，连成一片的澳门威尼斯人、巴黎人、伦敦人建了对应城市的模拟地标：大本钟、埃菲尔铁塔、水道。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>观察发现</div><div class="admonitionContent_BuS1"><p>赌博的人有帅哥美女，有老头大叔。并不都是想象中肥头大耳的暴发户。服务人员也并不都是美女荷官，也有大爷大妈。</p><p>去的第一个赌场有个机器最低3.8币一局，威尼斯人最低20块，涉及到真人发牌的最少1000块一局，多的3000。赌场里有免费的软饮，不同的赌场有不同的香水味，非常浓厚。</p></div></div>
<p>官也街的手信店很大方，试吃都是一大块一大块的。</p>
<p>即便不博彩，也是很好的购物采风的好地方。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="香港">香港<a href="https://jiangmiemie.com/blog/2025/12/30/#%E9%A6%99%E6%B8%AF" class="hash-link" aria-label="Direct link to 香港" title="Direct link to 香港" translate="no">​</a></h3>
<p>香港随处可见东南亚、欧美国家的游客，比例要比北上广深更多，这次没备现金，不过全程主要消费区都支持微信支付宝。</p>
<p>由于刚下车时乘务员听不懂普通话，所以后面问路啥的都是优先说英语。路边还能看到外国人摆摊儿，外国人开的便利店，真有出国的感觉了。有些店似乎看出来我们是大陆游客（这么明显吗），也会主动说普通话。</p>
<div class="theme-admonition theme-admonition-note admonition_xJq3 alert alert--secondary"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M6.3 5.69a.942.942 0 0 1-.28-.7c0-.28.09-.52.28-.7.19-.18.42-.28.7-.28.28 0 .52.09.7.28.18.19.28.42.28.7 0 .28-.09.52-.28.7a1 1 0 0 1-.7.3c-.28 0-.52-.11-.7-.3zM8 7.99c-.02-.25-.11-.48-.31-.69-.2-.19-.42-.3-.69-.31H6c-.27.02-.48.13-.69.31-.2.2-.3.44-.31.69h1v3c.02.27.11.5.31.69.2.2.42.31.69.31h1c.27 0 .48-.11.69-.31.2-.19.3-.42.31-.69H8V7.98v.01zM7 2.3c-3.14 0-5.7 2.54-5.7 5.68 0 3.14 2.56 5.7 5.7 5.7s5.7-2.55 5.7-5.7c0-3.15-2.56-5.69-5.7-5.69v.01zM7 .98c3.86 0 7 3.14 7 7s-3.14 7-7 7-7-3.12-7-7 3.14-7 7-7z"></path></svg></span>城市观察</div><div class="admonitionContent_BuS1"><p>路上很热也很晒，但是当地人似乎刻意美黑，少有人打伞。路上很干净，我刻意数了一下，一个商品市场只有2个垃圾。</p><p>这里吸烟、乱扔垃圾罚款都很高。最低工资7400港币，公交车吸烟罚款5000港币。等价于北上广深吸烟罚款1500+</p></div></div>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="两人一日游花费">两人一日游花费<a href="https://jiangmiemie.com/blog/2025/12/30/#%E4%B8%A4%E4%BA%BA%E4%B8%80%E6%97%A5%E6%B8%B8%E8%8A%B1%E8%B4%B9" class="hash-link" aria-label="Direct link to 两人一日游花费" title="Direct link to 两人一日游花费" translate="no">​</a></h4>
<table><thead><tr><th style="text-align:left">项目</th><th style="text-align:center">费用</th><th style="text-align:right">备注</th></tr></thead><tbody><tr><td style="text-align:left">高铁（往返2人）</td><td style="text-align:center">300人民币</td><td style="text-align:right">直接到市中心</td></tr><tr><td style="text-align:left">小巴</td><td style="text-align:center">5×2港币</td><td style="text-align:right">划算</td></tr><tr><td style="text-align:left">香港故宫门票</td><td style="text-align:center">136港币</td><td style="text-align:right">划算</td></tr><tr><td style="text-align:left">地铁</td><td style="text-align:center">10×2+5×2港币</td><td style="text-align:right"></td></tr><tr><td style="text-align:left">天星小轮</td><td style="text-align:center">6.5×2港币</td><td style="text-align:right"></td></tr><tr><td style="text-align:left">二层公交（往返2人）</td><td style="text-align:center">44港币</td><td style="text-align:right">中环到赤柱广场海边</td></tr><tr><td style="text-align:left">水溶C</td><td style="text-align:center">15港币</td><td style="text-align:right"></td></tr><tr><td style="text-align:left">果粒橙</td><td style="text-align:center">11港币</td><td style="text-align:right"></td></tr><tr><td style="text-align:left">牛角包</td><td style="text-align:center">18港币</td><td style="text-align:right"></td></tr><tr><td style="text-align:left">肯德基</td><td style="text-align:center">58港币</td><td style="text-align:right">实惠</td></tr><tr><td style="text-align:left">富豪雪糕</td><td style="text-align:center">13港币</td><td style="text-align:right">还好</td></tr><tr><td style="text-align:left">云南米线</td><td style="text-align:center">62港币</td><td style="text-align:right">好吃</td></tr></tbody></table>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>总花费</div><div class="admonitionContent_BuS1"><p><strong>以上410港币+300人民币，约677人民币</strong></p></div></div><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2025-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2025%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%222025%E5%B9%B4%E5%B9%B4%E6%9C%AB%E6%80%BB%E7%BB%93%E4%B8%8E%E5%9B%9E%E9%A1%BE%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>学习</category>
            <category>技术</category>
            <category>生活</category>
            <category>旅行</category>
        </item>
        <item>
            <title><![CDATA[AI编程与思维牢笼]]></title>
            <link>https://jiangmiemie.com/blog/2025/9/30/</link>
            <guid>https://jiangmiemie.com/blog/2025/9/30/</guid>
            <pubDate>Tue, 30 Sep 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[AI编程]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2025_9_30_.mp3" preload="metadata"></audio><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="加速">加速<a href="https://jiangmiemie.com/blog/2025/9/30/#%E5%8A%A0%E9%80%9F" class="hash-link" aria-label="Direct link to 加速" title="Direct link to 加速" translate="no">​</a></h2>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>本文仅仅探讨AI编程这个领域，现在的AI往往代指含有图像视频生成的多模态AGI。</p></div></div>
<p>2021年，我第一次接触AI编程：GitHub Copilot，当时AI的能力主要体现为：输入注释或部分代码，即可生成整段优质的代码。</p>
<p>2025年，氛围编程让更多的人可以在不了解细节的情况下完成项目的搭建。</p>
<p>4年过去了，给我感觉是：<span style="background-color:var(--highlight-color);border-radius:2px;color:#000;padding:0.2rem">AI加速了整个社会的差距</span>。</p>
<ul>
<li class="">在学校，优秀学生与垫底学生的效率相较从前更大了。</li>
</ul>
<p>之前差生至少需要通过搜索引擎查找资料，再整理加工才能完成作业。而现在只要问题描述足够具体那差生只需要两次复制粘贴就能完成作业，差生提交完的第二天，都复述不出作业的要求。</p>
<ul>
<li class="">在公司，2个初级程序员的工资约20k，反而不如聘请一个15k的中级程序员配合成本不到1k的AI助手</li>
</ul>
<p>AI能力线以下的工作岗位将更加稀缺。这意味着毕业生需要在某个领域达到超越AI的水平。这种要求客观上进一步加速了学习周期的延长，把普本计科学生推向继续教育。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="思维">思维<a href="https://jiangmiemie.com/blog/2025/9/30/#%E6%80%9D%E7%BB%B4" class="hash-link" aria-label="Direct link to 思维" title="Direct link to 思维" translate="no">​</a></h2>
<p>那为什么AI能完成的事情还要去学习呢？</p>
<p>我最近很喜欢出一些最潮流的技术项目，其一是较为有趣，其二是更能锻炼学生思维。</p>
<p>学习的过程大脑神经元应该是活跃的，如果很顺利的吸收了某个知识，那么大概率很快就会忘记。</p>
<p>如果通过发问、追问、试错、反思、总结，曲折的吸收了某个知识，神经元被激活的更加充分，理解也会更强。</p>
<p>如果你直接AI生成了答案，记忆效果会大大降低，<span style="background-color:var(--highlight-color);border-radius:2px;color:#000;padding:0.2rem">只用AI生成你不想记忆的内容</span>。</p>
<p>因此，给自己试错的时间，给大家试错的时间。</p>
<p>我们人类的学习是有结构的，<span style="background-color:var(--highlight-color);border-radius:2px;color:#000;padding:0.2rem">要想会 AI 不能完成的事，要先学那部分 AI 也能完成的事</span>。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="ai不是领导">AI不是领导<a href="https://jiangmiemie.com/blog/2025/9/30/#ai%E4%B8%8D%E6%98%AF%E9%A2%86%E5%AF%BC" class="hash-link" aria-label="Direct link to AI不是领导" title="Direct link to AI不是领导" translate="no">​</a></h2>
<p>AI会有一些愚蠢的低级错误，例如在cmd命令行中，这个命令报错：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">PS C:</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">Users</span><span class="token punctuation" style="color:rgb(4, 81, 165)">\</span><span class="token plain">allen</span><span class="token operator" style="color:rgb(0, 0, 0)">&gt;</span><span class="token plain"> bcdedit /delete /f </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain">f7f65faa-5515-11ef-b3e2-d8359383915d</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">指定的删除命令无效。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">运行</span><span class="token string" style="color:rgb(163, 21, 21)">"bcdedit /?"</span><span class="token plain">获取命令行帮助。</span><br></div><div class="token-line" style="color:#000000"><span class="token plain" style="display:inline-block"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">参数不正确。</span><br></div></code></pre></div></div>
<p>即使是当前最先进的AI模型也无法正确解答，例如<code>claude-4.5-sonnet-thinking</code>、<code>deepseek-r1</code>、<code>gork</code>、<code>gpt5-high</code>。</p>
<p>但如果你系统学习过终端命令，很快就能意识到问题所在：<code>{}</code>在PowerShell中是特殊字符（表示脚本块），需要加上双引号：</p>
<div class="language-powershell codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-powershell codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token plain">bcdedit /delete /f "{f7f65faa-5515-11ef-b3e2-d8359383915d}"</span><br></div></code></pre></div></div>
<p>和公司新来的实习的大学生一样，有一腔热情，部分也愿意学习，但是往往没有系统的学习缺少DEBUG的直觉。</p>
<p>人应该系统的学习相关的知识，不要通过AI编程补充所有的知识性的细节，不要过度依赖其DEBUG能力，当一次无法成功时，后续追问的成功率会大打折扣，立刻人工接管。</p>
<p>推荐调试流程：</p>
<ol>
<li class="">理解问题：翻译错误信息+自主思考</li>
<li class="">验证思路：与AI交流你的分析</li>
</ol>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="他人的想法">他人的想法<a href="https://jiangmiemie.com/blog/2025/9/30/#%E4%BB%96%E4%BA%BA%E7%9A%84%E6%83%B3%E6%B3%95" class="hash-link" aria-label="Direct link to 他人的想法" title="Direct link to 他人的想法" translate="no">​</a></h2>
<p>在部分领导和自媒体眼中，AI近乎无所不能，认为有了AI加持就像拥有神笔的马良。这种认知会导致他们分配超出实际负荷的工作量。</p>
<p>而<span style="background-color:var(--highlight-color);border-radius:2px;color:#000;padding:0.2rem">为了赶工期，你不得不变本加厉地使用AI，陷入无暇系统思考的恶性循环</span>。</p>
<p>和一个赌徒不停的拉动老虎机的拉杆一样，你输入提示词然后等待，期待下次AI给出答案是终极大奖。</p>
<p>我们都知道赌徒的下场。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2025-9-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2025%2F9%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22AI%E7%BC%96%E7%A8%8B%E4%B8%8E%E6%80%9D%E7%BB%B4%E7%89%A2%E7%AC%BC%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>AI编程</category>
        </item>
        <item>
            <title><![CDATA[2024年年末总结与回顾]]></title>
            <link>https://jiangmiemie.com/blog/2024/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2024/12/30/</guid>
            <pubDate>Mon, 30 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[2024年年末总结与回顾]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_12_30_.mp3" preload="metadata"></audio><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="思考">思考<a href="https://jiangmiemie.com/blog/2024/12/30/#%E6%80%9D%E8%80%83" class="hash-link" aria-label="Direct link to 思考" title="Direct link to 思考" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="需要避免的变化">需要避免的变化<a href="https://jiangmiemie.com/blog/2024/12/30/#%E9%9C%80%E8%A6%81%E9%81%BF%E5%85%8D%E7%9A%84%E5%8F%98%E5%8C%96" class="hash-link" aria-label="Direct link to 需要避免的变化" title="Direct link to 需要避免的变化" translate="no">​</a></h3>
<p>随着年龄的增长，有两种变化需要避免：</p>
<ul>
<li class="">固执自己的世界观，忽视其他年龄段人群的需求与视角。</li>
<li class="">夸夸其谈自己的想法，却对事情的真相一无所知。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="教育供应商">教育供应商<a href="https://jiangmiemie.com/blog/2024/12/30/#%E6%95%99%E8%82%B2%E4%BE%9B%E5%BA%94%E5%95%86" class="hash-link" aria-label="Direct link to 教育供应商" title="Direct link to 教育供应商" translate="no">​</a></h2>
<p>原本用于考核学生的标准被用来考核指导老师，导致老师倾向于选择提供答案的厂商。机构与教师的核心目标是消课，提供适合长度的 PPT/教案。</p>
<p>在 AI 时代，可以采用 AI 智能课的形式辅助学生学习：将电脑屏幕二分，一侧显示课件，另一侧提供 AI 助手，便于学生提问。这样，机构和教师的工作量转变为考核学生及处理问题。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="飞轮">飞轮<a href="https://jiangmiemie.com/blog/2024/12/30/#%E9%A3%9E%E8%BD%AE" class="hash-link" aria-label="Direct link to 飞轮" title="Direct link to 飞轮" translate="no">​</a></h3>
<p>为了实现某个场景学习技术
这个场景强化技术
取得的收益会持续提供正向奖励并提供新的场景</p>
<p>譬如英语。为了看懂国外的科技文献，学习了英语。因此获得了出国留学的机会。留学的经历又会进一步强化英语。不断向前，最终形成了正向循环。</p>
<p>常见的飞轮还有：技术、建模、驾车</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="维度">维度<a href="https://jiangmiemie.com/blog/2024/12/30/#%E7%BB%B4%E5%BA%A6" class="hash-link" aria-label="Direct link to 维度" title="Direct link to 维度" translate="no">​</a></h3>
<p>有些事情对生活帮助很大，但是对工作帮助很小。
譬如读书、旅游、运动。</p>
<p>有些事情对生活帮助很小，但是对工作帮助很大。
譬如技术、项目、方案。</p>
<p>换个角度，有的技术改变对自己提升很大，但是对产品帮助很小。
譬如异步、K8S、Docker。你花了大部分时间，但是大部分情况下用户感知不到。</p>
<p>在选择做事的时候，选择每个维度都能收益的，才是最优解。一些技术革新不易推动或者手下的人忙活许久产品没有起色的原因，可能就是没有让每个人的每个维度都收益。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="整理">整理<a href="https://jiangmiemie.com/blog/2024/12/30/#%E6%95%B4%E7%90%86" class="hash-link" aria-label="Direct link to 整理" title="Direct link to 整理" translate="no">​</a></h3>
<p>项目的高度重复性促使我创建一个通用的第三方库。在开发中，代码的简洁易读是首要任务。</p>
<p>2024 年做了很多碎片化的工作，这里花了一周的时间把可以复用的功能整理到 etool 工具库中了。</p>
<p>2024 年出游了国内的一些 4A、5A 景区。</p>
<p>搬回了深圳，换了新家，花了很多心思装点这个家。</p>
<p>我喜欢未知，愿意接受新事物。
在别人的车上，别人放什么歌我就听什么歌。不会想着切自己的音乐。聚餐吃饭，除了很特别的食物（如折耳根）我都可以接受并愿意尝试。随手拿起一本书，一部电影，我都愿意发现它们有价值的一面。</p>
<p>我觉得人生是一种经历，我会期待更丰富的经历。
走路会更喜欢去没去过的路线、没吃过的小吃，同样一部很好看的电视剧或者综艺，我也最多会刷两遍，当然对应的，我会在第一次看它们的时候，就全神贯注，努力记住并体会它们的优秀。</p>
<p>我会把有价值的经历长久记录下来。
譬如读书、方案、照片。并且定期回看至少每年都会回顾、复读。确保经历对自己的长久影响，不让这些有价值的记忆在角落蒙尘。</p>
<p>我会定期整理收藏夹。
一段时间内（一个月）不清空收藏夹就停止新知识的学习，以此来不让自己成为收藏夹大师。</p>
<p>我做事喜欢全神贯注。
吃饭过程中想到一个方案会马上放下食物，去完成这个方案。我觉得饭每天都吃，但灵感不是每刻都有。</p>
<p>我讨厌无意义的制度。
因为我珍惜并享受我的生命，我也热爱智能家居并做了很多研究，因为我觉得这在节省我的时间，让我能全身心投入到生活中。</p>
<p>我会记大账，不喜欢记细账。
譬如这个月最主要花销是哪些，不会在意今天这顿饭多吃一点少吃一点</p>
<p>我只能学习当下能学以致用的知识。
因为过于长远的未来总是不确定的，当下 5 年以内的未来是确定的。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习">学习<a href="https://jiangmiemie.com/blog/2024/12/30/#%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="Direct link to 学习" title="Direct link to 学习" translate="no">​</a></h3>
<p>这里重点的学习了大模型相关的知识，并尝试了使用大模型来解决一些问题。</p>
<p>2025 年，我想放慢更新博客的频率，每个季度更新一次，并尝试写一些有深度的项目和文章，毕竟项目在优不在多。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="日常">日常<a href="https://jiangmiemie.com/blog/2024/12/30/#%E6%97%A5%E5%B8%B8" class="hash-link" aria-label="Direct link to 日常" title="Direct link to 日常" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习建模技术">学习建模技术<a href="https://jiangmiemie.com/blog/2024/12/30/#%E5%AD%A6%E4%B9%A0%E5%BB%BA%E6%A8%A1%E6%8A%80%E6%9C%AF" class="hash-link" aria-label="Direct link to 学习建模技术" title="Direct link to 学习建模技术" translate="no">​</a></h3>
<p>最近我间歇性学习建模技术，发现自己更倾向于选择中间款软件，它能快速生成及格的作品。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="一些阅读摘要">一些阅读摘要<a href="https://jiangmiemie.com/blog/2024/12/30/#%E4%B8%80%E4%BA%9B%E9%98%85%E8%AF%BB%E6%91%98%E8%A6%81" class="hash-link" aria-label="Direct link to 一些阅读摘要" title="Direct link to 一些阅读摘要" translate="no">​</a></h3>
<ul>
<li class="">
<p>“愿意自由换取保障的人，既得不到自由，也得不到保障。”——哈耶克</p>
</li>
<li class="">
<p>“只有金钱会向穷人伸手，而权力不会。”——哈耶克</p>
</li>
<li class="">
<p>“如果允许人类自由迁徙，那么人流的方向，就是文明的方向。”——哈耶克</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="房间布网">房间布网<a href="https://jiangmiemie.com/blog/2024/12/30/#%E6%88%BF%E9%97%B4%E5%B8%83%E7%BD%91" class="hash-link" aria-label="Direct link to 房间布网" title="Direct link to 房间布网" translate="no">​</a></h3>
<p>网络知识
核心知识 1: 信号在穿墙后会衰减
核心知识 2:路由器的信号芯片优于大部分手机/电脑的天线</p>
<p>主路由器发射穿墙信号，墙另一侧，无线中继路由器接收到的信号大于设备 A 大于设备 B。于是，可以让设备 A、设备 B 连接无线中继路由器，实现与无线中继路由器一样的网速。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="猫尿清洗说明">猫尿清洗说明<a href="https://jiangmiemie.com/blog/2024/12/30/#%E7%8C%AB%E5%B0%BF%E6%B8%85%E6%B4%97%E8%AF%B4%EF%BF%BD%EF%BF%BD%E6%98%8E" class="hash-link" aria-label="Direct link to 猫尿清洗说明" title="Direct link to 猫尿清洗说明" translate="no">​</a></h3>
<p>猫尿具有留存时间长，渗透性高</p>
<p>若猫尿在沙发枕套上，需要拆开枕套、枕芯。</p>
<p>枕套使用专用除猫尿清洗剂+汰渍/奥妙，浸泡一夜+洗衣液洗净，自然阴干。</p>
<p>枕芯被污染需要直接更换，尺寸为枕套的尺寸+5cm（80cm<em>50cm 的枕套，配 85cm</em>55cm 的枕芯）</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="购车后">购车后<a href="https://jiangmiemie.com/blog/2024/12/30/#%E8%B4%AD%E8%BD%A6%E5%90%8E" class="hash-link" aria-label="Direct link to 购车后" title="Direct link to 购车后" translate="no">​</a></h3>
<p>买车了，买完车除了要交保险之外，还需买一些必要的物品：行车记录仪、实习车标、挪车号码牌、车载除甲醛香薰、手机导航支架。</p>
<p>侧方位停车复习：开至肩膀与库中齐平，向车库反向打成 45 度，倒车回方向直至左右两边距离合适停正。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="通勤学习">通勤学习<a href="https://jiangmiemie.com/blog/2024/12/30/#%E9%80%9A%E5%8B%A4%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="Direct link to 通勤学习" title="Direct link to 通勤学习" translate="no">​</a></h3>
<p>指定学习计划是利用碎片化时间的首要目标，阅读书籍、观看 TED 演讲或自己的收藏会让学习过程更有成就感。应避免泛信息输入（如新闻、推荐刷屏），而应选择适当的半精准信息输入（如读书、博客、GitHub 等）。通勤后及时整理记录。</p>
<p>随着职业地位的提升，不必要的内耗逐渐减少。高中时非常在意学校的排名，而如今在大厂面前都统一成了“双非”。想要进入世界一流的企业，需要有相应的世界排名。只有世界级的排名与项目才能证明你的价值。</p>
<p>每个阶段有不同的评价标准。从学生时期的院校评价，到工作初期的薪资待遇，再到中年的事业与家庭评价，均体现出人生的不同阶段。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="平淡生活的解药">平淡生活的解药<a href="https://jiangmiemie.com/blog/2024/12/30/#%E5%B9%B3%E6%B7%A1%E7%94%9F%E6%B4%BB%E7%9A%84%E8%A7%A3%E8%8D%AF" class="hash-link" aria-label="Direct link to 平淡生活的解药" title="Direct link to 平淡生活的解药" translate="no">​</a></h3>
<p>平淡生活源于外部世界缺乏新输入。当工作多年没有变化，内部的平淡便开始显现，只有不断成长，才能支撑更远的目标与更好的生活。</p>
<p>如果我们把感情看作 0 和游戏。那么总会会有人因长期利益受损而对这段关系感到不满。</p>
<p>因此，只有当一方的所求不是另一方的付出时，0 和才会被打破。即：某一行为是二者都收益的。</p>
<p>企业与员工关系亦是如此，企业提供平台员工发挥，员工将在平台创造的利润与企业分成。</p>
<p>最近我发现迷你工作室非常适合我。迷你工作室通常由 1-5 人组成，项目可以是软件、游戏或网站。</p>
<p>成立工作室是为了开发票，能接到更多的项目。在 AI 时代，有两种发展方向：加入大公司研究通用人工智能，或选择中小型公司做垂类人工智能，专注于特定领域的模型开发。</p>
<p>除了开发人工智能模型外，还可以拓展其应用，如语音控制家庭设备。技术的爆发得益于高速通信和丰富的硬件资源。</p>
<p>经济下行时创业或找工作的挑战包括投资回报难、企业扩张减慢及岗位的消失，传统岗位正在逐步被淘汰，需尽早转型。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="电脑新配">电脑新配<a href="https://jiangmiemie.com/blog/2024/12/30/#%E7%94%B5%E8%84%91%E6%96%B0%E9%85%8D" class="hash-link" aria-label="Direct link to 电脑新配" title="Direct link to 电脑新配" translate="no">​</a></h3>
<p>最近新买了一台台式机，主要用于编程（高速大内存）、建模跑模型（显存优先）和数据分析（高速硬盘）。</p>
<p>对于大模型来说，显存优先。32B 的大模型本地需要 20G、常规的文生图模型本地需要 24G。</p>
<p>消费级显卡性价比更高，3090 Ti 支持 Nvlink 很适合后期组双卡，或升级5090。</p>
<table><thead><tr><th>配件</th><th>描述</th><th>价格 (元)</th></tr></thead><tbody><tr><td>显卡</td><td>微星 超龙 RTX3090Ti 24G</td><td>8099</td></tr><tr><td>CPU</td><td>AMD 锐龙 R9 7950X 16 核 32 线程</td><td>3695</td></tr><tr><td>硬盘</td><td>英睿达固态硬盘 1T M.2 PCIE5.0</td><td>1767</td></tr><tr><td>内存</td><td>光威内存 龙武 32G*2 64G 6400 C32 马甲条</td><td>1330</td></tr><tr><td>主板</td><td>华硕 TUF GAMING B650M PLUS 蓝牙 WIFI DDR5</td><td>1170</td></tr><tr><td>电源</td><td>航嘉 MVP1200 额定 1200W 白金全模组 黑色</td><td>1258</td></tr><tr><td>机箱及风扇</td><td>航嘉 GX750A 掠夺者 黑色 ATX 360 + 链力无光风扇*6</td><td>300</td></tr><tr><td>水冷散热</td><td>钛钽 SJ-A080 360WH</td><td>295</td></tr><tr><td>屏幕</td><td>乐视显示器 32 英寸 1K 75hz</td><td>699</td></tr><tr><td>键盘</td><td>Lofree 洛斐小浪蓝牙机械键盘（旅行版）</td><td>599</td></tr><tr><td>鼠标</td><td>Razer 雷蛇炼狱蝰蛇 V2X 极速版双模无线电池笔记本蓝牙电竞鼠标</td><td>249</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="工具推荐">工具推荐<a href="https://jiangmiemie.com/blog/2024/12/30/#%E5%B7%A5%E5%85%B7%E6%8E%A8%E8%8D%90" class="hash-link" aria-label="Direct link to 工具推荐" title="Direct link to 工具推荐" translate="no">​</a></h3>
<p>Windows 11 的 PowerToys 是一个非常强大的工具，它可以帮助你更高效地使用 Windows 系统。找到鼠标、窗口永久置顶、截图定格等功能。</p>
<p>Windows平台的显示键盘按键的产品</p>
<table><thead><tr><th>软件名称</th><th>费用</th><th>特色功能</th><th>推荐指数</th></tr></thead><tbody><tr><td>Carnac</td><td>免费</td><td>C#开发，极快、极小、无BUG</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>Keyviz</td><td>免费</td><td>界面最美观，动画效果好，windows下有一些显示BUG</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>NohBoard</td><td>免费</td><td>全键盘虚拟键盘显示，高度可定制</td><td>⭐⭐⭐⭐</td></tr><tr><td>showKeyBoard</td><td>免费</td><td>功能最全面，支持统计分析，界面丑，快，无BUG</td><td>⭐⭐⭐⭐⭐</td></tr><tr><td>KeyCastOW</td><td>免费</td><td>较小体积，绿色便携</td><td>⭐⭐⭐⭐</td></tr></tbody></table><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%222024%E5%B9%B4%E5%B9%B4%E6%9C%AB%E6%80%BB%E7%BB%93%E4%B8%8E%E5%9B%9E%E9%A1%BE%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>life</category>
        </item>
        <item>
            <title><![CDATA[摄像头云台控制指令解析]]></title>
            <link>https://jiangmiemie.com/blog/2024/6/30/</link>
            <guid>https://jiangmiemie.com/blog/2024/6/30/</guid>
            <pubDate>Sun, 30 Jun 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录个人实现通过RS232协议手册进行USB控制]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_6_30_.mp3" preload="metadata"></audio><p>购买了一款云台摄像头，你可以在淘宝搜这个关键词知道它长什么样子。</p>
<p>它默认能通过 RS232 协议控制云台转动，但是现在新的主板已经没有这种圆形的接口了，基本都是 USB。</p>
<p>他也可以通过遥控器控制，但是我想尝试自己编写逻辑代码通过键盘控制。</p>
<p>效果是通过监听键盘上下左右等事件，调用对应云台运动的指令，运动到合适角度之后可以按下空格停止云台运动，按下 ESC 退出控制程序。</p>
<p>也可以按下某个按键如数字1，直接运动到预设角度。</p>
<p>咨询商家后，商家提供了 RS232 协议的指令集，所以这里通过 python 的 serial 库尝试通过 USB 口对其云台调用。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="rs232-协议说明书">RS232 协议说明书<a href="https://jiangmiemie.com/blog/2024/6/30/#rs232-%E5%8D%8F%E8%AE%AE%E8%AF%B4%E6%98%8E%E4%B9%A6" class="hash-link" aria-label="Direct link to RS232 协议说明书" title="Direct link to RS232 协议说明书" translate="no">​</a></h2>
<table><thead><tr><th>Command</th><th>Command Packet</th><th>Comments</th></tr></thead><tbody><tr><td>Stop</td><td>8x 01 06 01 VV WW 03 03 FF</td><td>VV: Pan Speed</td></tr><tr><td>Left</td><td>8x 01 06 01 VV WW 01 03 FF</td><td>WW: Tilt Speed</td></tr><tr><td>Right</td><td>8x 01 06 01 VV WW 02 03 FF</td><td>YYYY: Pan Position</td></tr><tr><td>Up</td><td>8x 01 06 01 VV WW 03 01 FF</td><td>ZZZZ: Tilt Position</td></tr><tr><td>Down</td><td>8x 01 06 01 VV WW 03 02 FF</td><td></td></tr><tr><td>UpLeft</td><td>8x 01 06 01 VV WW 01 01 FF</td><td></td></tr><tr><td>UpRight</td><td>8x 01 06 01 VV WW 02 01 FF</td><td></td></tr><tr><td>DownLeft</td><td>8x 01 06 01 VV WW 01 02 FF</td><td></td></tr><tr><td>DownRight</td><td>8x 01 06 01 VV WW 02 02 FF</td><td></td></tr><tr><td>Absolute Position</td><td>8x 01 06 02 VV WW 0Y 0Y 0Y 0Y 0Z 0Z 0Z 0Z FF</td><td></td></tr><tr><td>Relative Position</td><td>8x 01 06 03 VV WW 0Y 0Y 0Y 0Y 0Z 0Z 0Z 0Z FF</td><td></td></tr><tr><td>Home</td><td>8x 01 06 04 FF</td><td></td></tr><tr><td>Reset</td><td>8x 01 06 05 FF</td><td></td></tr></tbody></table>
<p>这里有一些复合指令，譬如 UpRight：向上的同时向右，如果是手柄控制比较好，键盘控制比较鸡肋，所以这里我们实现：上下左右、暂停、复位、绝对定位这几个能用到与可能会用到的。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="基数转换">基数转换<a href="https://jiangmiemie.com/blog/2024/6/30/#%E5%9F%BA%E6%95%B0%E8%BD%AC%E6%8D%A2" class="hash-link" aria-label="Direct link to 基数转换" title="Direct link to 基数转换" translate="no">​</a></h2>
<p>这里的绝对定位和相对定位部分，出现了<code>0Y 0Y 0Y 0Y</code>和 <code>0Z 0Z 0Z 0Z</code>,我希望传入一个 10 进制的角度，譬如0、90、180，怎么映射到其中呢？这就体现我们学完二进制之后的敏感度了，把 20 转成 2 进制的过程是：</p>
<div class="language-bash codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-bash codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv"><div class="token-line" style="color:#000000"><span class="token number" style="color:rgb(9, 134, 88)">20</span><span class="token plain"> ÷ </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token plain"> 余数: </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain"></span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token plain"> ÷ </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"> 余数: </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain"></span><span class="token number" style="color:rgb(9, 134, 88)">5</span><span class="token plain"> ÷ </span><span class="token assign-left variable" style="color:rgb(9, 134, 88)">2</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain"> 余数: </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain"></span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain"> ÷ </span><span class="token assign-left variable" style="color:rgb(9, 134, 88)">2</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"> 余数: </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain"></span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"> ÷ </span><span class="token assign-left variable" style="color:rgb(9, 134, 88)">2</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> 余数: </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span><br></div><div class="token-line" style="color:#000000"><span class="token plain">按余数倒序排列: </span><span class="token number" style="color:rgb(9, 134, 88)">10100</span><br></div></code></pre></div></div>
<p>这里我们观察范例，对数据做了拆分，即如果需要把10进制映射到16进制上，譬如17转成16进制是11，那么应该变成0101。每个位置之间插入<code>0</code>。</p>
<p>所以可以写出如下代码：</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    HEX_VALUES </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">4096</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">256</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 定义常量</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_ints </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">enumerate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">HEX_VALUES</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">//</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">%=</span><span class="token plain"> value</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)"># 转换为2位16进制字符串</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_strs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">i</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token string-interpolation interpolation format-spec">02X</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_strs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 将17转化为16进制，应该是11，拆分加0，应该是0101</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 前方补0到总长度为8位，结果与我们预期一致</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">17</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 00000101</span></span><br></div></code></pre></div></div>
<p>接下来通过代入0到6000这样的数值传输给串口后发现，只能向左转。</p>
<p>0对应居中，4500对应向左转180，数字再大也是转到底。</p>
<p>4500比180 = 25比1，所以我们输入角度，乘以25就得到了对应的信号值。</p>
<p>根据手册说明水平转动范围为355度，一半则是177.5度，与肉眼观察基本一致，Z轴的范围是上下各21度。</p>
<p>刚刚只能向左转，那么向右转的答案就呼之欲出了，要么是补码（异或运算后加1），要么是首位为符号位。我们添加上限位和映射，先用补码试试完成这个函数（结果直接成了）。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> axis_type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    计算轴（旋转）的位置字节。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    参数:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_pos_value (int): 位置值，</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    axis_type (str): 轴的类型 ('y' or 'Y' for Y-axis, others for Z-axis)</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    返回:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_step_str (str): 计算得到的平移位置字节，格式为十六进制字符串。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> axis_type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"y"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">177.5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">177.5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 限制取值范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">21</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">21</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 限制取值范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">int</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">25</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 将角度转换为步长</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_direction </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"-"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"+"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 设定旋转方向</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">abs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 取绝对值</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    HEX_VALUES </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">4096</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">256</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 定义常量</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_ints </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">enumerate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">HEX_VALUES</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> pan_direction </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"+"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">//</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 异或操作</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">//</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token operator" style="color:rgb(0, 0, 0)">^</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0xF</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 最后一个数字，取反后加1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">%=</span><span class="token plain"> value</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)"># 转换为2位16进制字符串</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_strs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">i</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token string-interpolation interpolation format-spec">02X</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_strs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="代码目标效果">代码目标效果<a href="https://jiangmiemie.com/blog/2024/6/30/#%E4%BB%A3%E7%A0%81%E7%9B%AE%E6%A0%87%E6%95%88%E6%9E%9C" class="hash-link" aria-label="Direct link to 代码目标效果" title="Direct link to 代码目标效果" translate="no">​</a></h2>
<p>希望具体的指令都可以通过 Python 函数来实现，同时暴露出所有可能需要修改的参数。最后关联键盘事件。例如:</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">camera_control.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> keyboard</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> usbcamera </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain">  </span><span class="token operator" style="color:rgb(0, 0, 0)">*</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> usbcamera </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> move_to_absolute_position</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">设备 "/dev/ttyUSB0" 的云台旋转至绝对定位：</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Y轴转到180度，速度为9.</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">Z轴转到30度，速度为10</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">move_to_absolute_position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">9</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Y</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">180</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Z</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">30</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 关联键盘事件和控制函数</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"up"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> turn_up</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"down"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> turn_down</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"left"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> turn_left</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"right"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> turn_right</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"enter"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> move_home</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"space"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> turn_stop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 按下数字1则转动到水平最左，垂直最下，可以根据自己需要多预设几个目标角度。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">on_press_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"1"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">lambda</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">_</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> move_to_absolute_position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Y</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">180</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Z</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">30</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"COM16"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 让脚本保持运行状态以捕获事件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">keyboard</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">wait</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"esc"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 按 'esc' 键退出</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="信号机制">信号机制<a href="https://jiangmiemie.com/blog/2024/6/30/#%E4%BF%A1%E5%8F%B7%E6%9C%BA%E5%88%B6" class="hash-link" aria-label="Direct link to 信号机制" title="Direct link to 信号机制" translate="no">​</a></h2>
<ul>
<li class="">
<p>当收到左转信号时，摄像头会持续左转，直到到达限位位置或接收到新指令。</p>
</li>
<li class="">
<p>如果想要提前结束左转，可以在发送左转信号一定时间后发送停止指令，摄像头收到停止指令时会停止。</p>
</li>
<li class="">
<p>每个云台旋转操作会持续一定时间，如果在旋转期间收到其他指令，会终止旧指令，执行当前指令。</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="逻辑代码">逻辑代码<a href="https://jiangmiemie.com/blog/2024/6/30/#%E9%80%BB%E8%BE%91%E4%BB%A3%E7%A0%81" class="hash-link" aria-label="Direct link to 逻辑代码" title="Direct link to 逻辑代码" translate="no">​</a></h2>
<p>通常在 Windows 系统上，串口名称通常是 COMx（如 COM1、COM2），而在 Linux 系统上通常是/dev/ttyUSBx（如/dev/ttyUSB0）。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">usbcamera.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token comment" style="color:rgb(0, 128, 0)">#!/usr/bin/env python3</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># coding:utf-8</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> serial</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> serial</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">list_ports</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> time</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># VISCA命令集</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">commands </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"stop"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0303FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"left"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0103FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"right"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0203FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"up"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0301FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"down"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0302FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"upleft"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0101FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"upright"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0201FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"downleft"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0102FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"downright"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010601{vv}{ww}0202FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"absolute_position"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010602{vv}{ww}{Y}{Z}FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"relative_position"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010603{vv}{ww}{Y}{Z}FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"home"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010604FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"reset"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"81010605FF"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    通过串口向摄像机发送VISCA命令。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    参数:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    command (str): 要发送的VISCA命令，格式为十六进制字符串。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    返回:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    response (bytes): 从摄像机接收到的响应。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">try</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ser </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> serial</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Serial</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">9600</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> timeout</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 初始化串口</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        command_bytes </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">bytearray</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">fromhex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 将命令转换为字节</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ser</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">write</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">command_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 发送命令</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ser</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">read_all</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 读取响应</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ser</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">close</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 关闭串口</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> response</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">except</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ports_list </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">serial</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">tools</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">list_ports</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">comports</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ports_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"未发现端口"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> comport </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> ports_list</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"USB"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">comport</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"发现USB端口："</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> comport</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> comport</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">description</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">calculate_pan_speed_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_speed_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    计算轴（旋转）的位置字节。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    参数:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_speed_value (int): 速度值，0-16</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    返回:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_step_str (str): 计算得到的平移位置字节，格式为十六进制字符串。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_speed_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_speed_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 限制取值范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)"># 转为2位16进制</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">pan_speed_value</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token string-interpolation interpolation format-spec">02X</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> axis_type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    计算轴（旋转）的位置字节。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    参数:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_pos_value (int): 位置值，</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    axis_type (str): 轴的类型 ('y' or 'Y' for Y-axis, others for Z-axis)</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    返回:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    pan_step_str (str): 计算得到的平移位置字节，格式为十六进制字符串。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> axis_type</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">lower</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"y"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">177.5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">177.5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 限制取值范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">max</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">21</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">min</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">21</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 限制取值范围</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">int</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">*</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">25</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 将角度转换为步长</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_direction </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"-"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"+"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 设定旋转方向</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">abs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 取绝对值</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    HEX_VALUES </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">4096</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">256</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)"># 定义常量</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_ints </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> value </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">enumerate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">HEX_VALUES</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> pan_direction </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"+"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">//</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 异或操作</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">//</span><span class="token plain"> value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token operator" style="color:rgb(0, 0, 0)">^</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0xF</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> i </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">3</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 最后一个数字，取反后加1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token operator" style="color:rgb(0, 0, 0)">-</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        pan_pos_value </span><span class="token operator" style="color:rgb(0, 0, 0)">%=</span><span class="token plain"> value</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)"># 转换为2位16进制字符串</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pan_pos_strs </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">i</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token string-interpolation interpolation format-spec">02X</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> i </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> pan_pos_ints</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pan_pos_strs</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">command_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Y</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Z</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    创建VISCA命令。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    参数:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    command_key (str): 命令键名。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    vv (str): 水平方向速度，取值范围为0-16</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    ww (str): 垂直方向速度，取值范围为0-16</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    Y (str): 控制水平旋转的位置。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    Z (str): 控制垂直旋转的位置。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    返回:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    command (str): 格式化后的VISCA命令字符串。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="display:inline-block;color:rgb(163, 21, 21)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    异常:</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    ValueError: 当命令需要Y和Z参数时，若未提供，则抛出异常。</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">    """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> command_key </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"home"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"reset"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> commands</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">command_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> command_key </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"absolute_position"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"relative_position"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> Y </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">or</span><span class="token plain"> Z </span><span class="token keyword" style="color:rgb(0, 0, 255)">is</span><span class="token plain"> </span><span class="token boolean">None</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">raise</span><span class="token plain"> ValueError</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"Y和Z为位置命令,必须提供"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> commands</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">command_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">format</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_speed_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_speed_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            Y</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">Y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"y"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            Z</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_position_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">Z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"z"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> commands</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">command_key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">format</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_speed_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">calculate_pan_speed_bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 控制函数示例</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">turn_stop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"stop"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">turn_left</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"left"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">turn_right</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"right"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">turn_up</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"up"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">turn_down</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"down"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">move_home</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"home"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">move_to_absolute_position</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">vv</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">10</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Y</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Z</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"/dev/ttyUSB0"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> send_visca_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">create_command</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"absolute_position"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> vv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> ww</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Y</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> Z</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> device</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="后话">后话<a href="https://jiangmiemie.com/blog/2024/6/30/#%E5%90%8E%E8%AF%9D" class="hash-link" aria-label="Direct link to 后话" title="Direct link to 后话" translate="no">​</a></h2>
<p>硬件相比软件来说，资料比较少，所以编写过程主要靠经验。</p>
<p>猜测轴旋转的角度和 4 个参数对应关系是最有意思的过程，有趣的功能背后全是数学。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-6-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F6%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E6%91%84%E5%83%8F%E5%A4%B4%E4%BA%91%E5%8F%B0%E6%8E%A7%E5%88%B6%E6%8C%87%E4%BB%A4%E8%A7%A3%E6%9E%90%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>smarthome</category>
        </item>
        <item>
            <title><![CDATA[自制智能家居流程]]></title>
            <link>https://jiangmiemie.com/blog/2024/4/30/</link>
            <guid>https://jiangmiemie.com/blog/2024/4/30/</guid>
            <pubDate>Tue, 30 Apr 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录个人对单片机的研究]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_4_30_.mp3" preload="metadata"></audio><p>如果你想要实现这样一个功能：当窗外开始下雨，窗户自动关闭</p>
<p>如果你想知道解决方案，可以直接跳到最后一部分。</p>
<p>我们仅看前半部分，那么你需要：检测窗外是否有雨水，并把这个信息传递给窗户控制器</p>
<p>这个过程中，你需要：</p>
<ul>
<li class="">传感器：检测窗外是否有雨水/或者获取网络上的天气信息</li>
<li class="">单片机主控板：可以接收传感器的数据，并收发网络请求</li>
<li class="">执行器：窗户控制器，可以接收单片机的指令，控制窗户的开关</li>
<li class="">供电：保证传感器和主控板的正常工作</li>
</ul>
<p>这个过程你需要知道以下内容：单片机如何烧录程序、传感器如何连接、如何获取传感器数据、如何发送网络数据、如何制作外壳（例如 3D 打印）。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传感器基础知识">传感器基础知识<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BC%A0%E6%84%9F%E5%99%A8%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86" class="hash-link" aria-label="Direct link to 传感器基础知识" title="Direct link to 传感器基础知识" translate="no">​</a></h2>
<ul>
<li class="">负极表示符号： - / G / Gnd / 黑色</li>
<li class="">正极表示符号：+ / V / Vcc / 红色</li>
<li class="">信号管脚： S 可以表示信号，根据传感器的不同，参数范围是 0-1023 或 0 1</li>
<li class="">模拟量信号管脚表示符号： A 参数范围在 0-1023</li>
<li class="">数字量信号管脚表示符号：D 参数为 0 或 1</li>
</ul>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>如果标识与颜色发生冲突，一般以标识为准：例如接口上写着 V，但连接线颜色为黑，一般当作正极处理。</p></div></div>
<p>对于绝大多数单片机来说，当单片机通电时，所有的引脚都带电（含信号管脚）。因此传感器的正负极<code>理论上</code>可以任意连接，只需保证信号管脚连接指定的即可。</p>
<p>A 口的功能比 D 口更加强大，因为 A 口可以接收模拟信号，而 D 口只能接收数字信号。因此部分传感器 D 接 A 也可以正常读数。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>信号管脚可读可写。</p><p>如果某个信号管脚未接任何传感器（即：悬空状态），亦可读出<code>高/低电平</code>，悬空状态引脚的电平是不稳定的，易受其他接口影响跳变（单片机常常会有端口冲突的概念，即某个引脚的某个功能会影响其他引脚）。为了解决这一问题，推荐使用上拉和下拉。</p><ul>
<li class="">如果接线方式是GND-大电阻（10KΩ）-信号管脚，则信号管脚的电压会被拉低，此时读数会固定到0。称为下拉。</li>
<li class="">如果接线方式是VCC-大电阻（10KΩ）-信号管脚，则信号管脚的电压会被拉高，此时读数会固定到1。称为上拉。</li>
</ul><p>接上传感器后，信号管脚的电压会随着传感器的变化而变化（因为大部分的传感器工作原理都是敏感电阻。）。</p><p>把电阻换成蜂鸣器，写入数值（即控制信号管脚通电的强度），则蜂鸣器会根据写入数值发出不同的声音。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="两管脚">两管脚<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%B8%A4%E7%AE%A1%E8%84%9A" class="hash-link" aria-label="Direct link to 两管脚" title="Direct link to 两管脚" translate="no">​</a></h3>
<p>常见的有扬声器、电机（俗称马达）。</p>
<p>这类设备因为较为特殊，一般有专门的接口，或者占用 2 个信号端口，通过信号的变化来工作。</p>
<p>马达往往需要更大的工作电压，如果没有专门的连接口，有可能需要在板上使用跳针切换工作电压。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="三管脚">三管脚<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%B8%89%E7%AE%A1%E8%84%9A" class="hash-link" aria-label="Direct link to 三管脚" title="Direct link to 三管脚" translate="no">​</a></h3>
<p>这类传感器数量最多，往往由 GVA 或者 GVD 组成。</p>
<p>使用时，正负极与单片机正负极连接，信号线与板上标注的 A 或 D 进行连接。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="四管脚">四管脚<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%9B%9B%E7%AE%A1%E8%84%9A" class="hash-link" aria-label="Direct link to 四管脚" title="Direct link to 四管脚" translate="no">​</a></h3>
<p>四管脚传感器分为很多类</p>
<p>特殊接口的，譬如：人体温度传感器</p>
<p>正负极与信号口一般都专门对应的位置供连接。</p>
<p>双信号接口的，譬如：超声波</p>
<p>一般有四个接口：GVTE，其中 GV 正常连接，T 和 E 都接在信号管脚上。</p>
<p>同时接收 AD 的，譬如：烟雾传感器</p>
<p>一般有四个接口：GVAD，其中 GV 正常连接，D 表示有没有烟雾，A 表示烟雾浓度。分别接在对应的信号管脚即可。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="五管脚">五管脚<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BA%94%E7%AE%A1%E8%84%9A" class="hash-link" aria-label="Direct link to 五管脚" title="Direct link to 五管脚" translate="no">​</a></h3>
<p>譬如：摇杆传感器</p>
<p>一般五个接口为：GVXYB，其中 GV 正常连接，X 表示 X 轴（是模拟量接 A）、Y 表示 Y 轴（是模拟量接 A）、B 表示按钮（是数字量接 D）</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="其他特殊类">其他特殊类<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%85%B6%E4%BB%96%E7%89%B9%E6%AE%8A%E7%B1%BB" class="hash-link" aria-label="Direct link to 其他特殊类" title="Direct link to 其他特殊类" translate="no">​</a></h3>
<p>其他特殊的传感器一般有特殊接口，譬如：摄像头、屏幕等。</p>
<p>根据说明接入即可。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传感器一般原理">传感器一般原理<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BC%A0%E6%84%9F%E5%99%A8%E4%B8%80%E8%88%AC%E5%8E%9F%E7%90%86" class="hash-link" aria-label="Direct link to 传感器一般原理" title="Direct link to 传感器一般原理" translate="no">​</a></h2>
<p>传感器是一种信息转换装置，<strong>大部分传感器</strong>的工作原理是将非电量（力、速、声、光、热、磁等）通过<strong>敏感原件</strong>（光敏材料、热敏材料）感受，再通过<strong>转换原件</strong>转换为电参量（例如电压）。最后通过<strong>转换电路</strong>把电参量通过放大、过滤等方式转化为线性可读的电量。</p>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>传感器的应用例子：</p><p>山地车在出发前需要检查轮胎气压，需要车手用手按在轮胎上感受气压，需要一定的经验。使用传感器来检测轮胎气压，无需经验，即可获得<strong>更加客观的结果</strong>。</p><p>桥梁上需要很多螺丝，且使用一段时间后螺丝会松动，需要加固。传统方式是人为设定一个固定的检查间隔时间，逐一检查螺丝是否拧紧。变色螺栓就是一种传感器，当螺丝压力较小（拧的不紧）时，螺栓颜色较浅，当螺丝压力较大（拧的较紧）时，螺栓颜色较深。极大的<strong>提高了检查效率</strong>。</p></div></div>
<ul>
<li class="">敏感材料是传感器的灵魂，主要是材料学的范畴。</li>
<li class="">转换原件和转换电路需要一定的电路设计能力和算法能力。主要是嵌入式开发的范畴。</li>
</ul>
<div class="theme-admonition theme-admonition-info admonition_xJq3 alert alert--info"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 14 16"><path fill-rule="evenodd" d="M7 2.3c3.14 0 5.7 2.56 5.7 5.7s-2.56 5.7-5.7 5.7A5.71 5.71 0 0 1 1.3 8c0-3.14 2.56-5.7 5.7-5.7zM7 1C3.14 1 0 4.14 0 8s3.14 7 7 7 7-3.14 7-7-3.14-7-7-7zm1 3H6v5h2V4zm0 6H6v2h2v-2z"></path></svg></span>info</div><div class="admonitionContent_BuS1"><p>不是所有的传感器的都是这样的组成结构，譬如：中国的称。使用结构来测量质量。</p><p>不过随着我们需要测定的量要求越来越精准：例如精确到0.1g，传统的结构称就难以胜任了。</p><p>通过找到某种<strong>压敏</strong>材料，可以在不同压力下呈现不同的电阻，我们可以测定其电阻来反推出质量。</p><p>这种方式可以使我们测量<strong>精度</strong>提高的同时，<strong>量程</strong>也更大（测量的范围）。</p><p>不过有的压敏材料在极端高温和低温下电阻也会发生较大变化，不同的传感器有不同的<strong>工作环境</strong></p><p>总的发展趋势是找到某个的敏感材料或者多个敏感材料组合然后测定。</p></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="发展趋势">发展趋势<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%8F%91%E5%B1%95%E8%B6%8B%E5%8A%BF" class="hash-link" aria-label="Direct link to 发展趋势" title="Direct link to 发展趋势" translate="no">​</a></h3>
<table><thead><tr><th>阶段</th><th>特点</th><th>代表性传感器</th></tr></thead><tbody><tr><td>结构传感器</td><td>通过机械结构与基本常识，经久耐用，基本上都是转换式传感器（不需要额外电源）</td><td>液压称、中国称</td></tr><tr><td>物性传感器</td><td>通过结合光敏材料、热敏材料等敏感元件的物理性质测量，基本上都是有源式（需要先供电才能工作）</td><td>光敏传感器、热敏传感器</td></tr><tr><td>集成芯片传感器</td><td>在前一代的基础上集成迷你芯片，进行滤波、增强等基本功能</td><td>RGB数码相机光敏传感器</td></tr><tr><td>智能传感器</td><td>在前一代基础上集成了软件算法，让传感器在亮度、色彩上表现更好</td><td>RGBW数码相机光敏传感器</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="传感器的分类">传感器的分类<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BC%A0%E6%84%9F%E5%99%A8%E7%9A%84%E5%88%86%E7%B1%BB" class="hash-link" aria-label="Direct link to 传感器的分类" title="Direct link to 传感器的分类" translate="no">​</a></h3>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="按照工作原理分类">按照工作原理分类<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%8C%89%E7%85%A7%E5%B7%A5%E4%BD%9C%E5%8E%9F%E7%90%86%E5%88%86%E7%B1%BB" class="hash-link" aria-label="Direct link to 按照工作原理分类" title="Direct link to 按照工作原理分类" translate="no">​</a></h4>
<p>生物传感器：利用生物酶、抗体、组织、细胞、微生物、生物等。譬如云南洱海的<strong>海菜花</strong>对水质要求极高，如果死亡则说明水质较差，可用于辅助测量水质。</p>
<p>化学传感器：利用各种化学吸附、化学反应的方式获取信息的，例如某些溶液测酸碱性。</p>
<p>物理传感器：数量最多，细分为结构性、物性型，光敏、声敏、热敏等等，不计其数。</p>
<h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="按照工作特性分类">按照工作特性分类<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%8C%89%E7%85%A7%E5%B7%A5%E4%BD%9C%E7%89%B9%E6%80%A7%E5%88%86%E7%B1%BB" class="hash-link" aria-label="Direct link to 按照工作特性分类" title="Direct link to 按照工作特性分类" translate="no">​</a></h4>
<p>能量控制型传感器：需要通过外部供能的传感器，例如电子称需要有电源才能工作。</p>
<p>能量转换型传感器：由被测物体供能，例如：水银式人体温度计，通过将人的体温转换为水银的膨胀读数，无需供能。</p>
<p>同个目的可能会有多种传感器：例如测距离有红外传感器、毫米波、超声波。</p>
<p>同个传感器也可能有不同目的：例如二氧化碳气体传感器也可以用于测量空气质量PM2.5。（因为其工作原理是检测空气中吸收红外的物质的量，二氧化碳和PM都吸收红外）</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传感器的特性">传感器的特性<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BC%A0%E6%84%9F%E5%99%A8%E7%9A%84%E7%89%B9%E6%80%A7" class="hash-link" aria-label="Direct link to 传感器的特性" title="Direct link to 传感器的特性" translate="no">​</a></h2>
<table><thead><tr><th>静态特性指标</th><th>说明</th></tr></thead><tbody><tr><td>灵敏度</td><td>传感器输出与输入的比值，值越大，越灵敏</td></tr><tr><td>线性度</td><td>传感器输出与输入的线性程度</td></tr><tr><td>迟滞性</td><td>传感器在正反向输入时，输出不一致的程度</td></tr><tr><td>重复性</td><td>传感器在相同输入时，输出不一致的程度</td></tr><tr><td>分辨率</td><td>传感器能够分辨的最小输入变化量</td></tr><tr><td>稳定性</td><td>传感器在长时间工作时，输出不一致的程度</td></tr><tr><td>漂移</td><td>传感器数值整体偏移的程度</td></tr></tbody></table>
<table><thead><tr><th>动态特性指标</th><th>说明</th></tr></thead><tbody><tr><td>响应度</td><td>传感器对被测数据能否紧密跟随。</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="传感器的误差">传感器的误差<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%BC%A0%E6%84%9F%E5%99%A8%E7%9A%84%E8%AF%AF%E5%B7%AE" class="hash-link" aria-label="Direct link to 传感器的误差" title="Direct link to 传感器的误差" translate="no">​</a></h2>
<p>没有人在实验室环境下使用传感器，专业的传感器厂商会在不同温度、湿度、光照等环境下进行测试，并给出误差范围，不同的环境误差有大有小，被称为总误差带。</p>
<p>不确定传感器是否准确时，则需要校准，以温度传感器为例，需要在实验室构建三相点并保持：液态水、固态冰、气态水蒸气。此时温度为 0.01℃，此时读数为 0.01℃，则认为传感器准确。</p>
<p>但是这样的方式费时费力，因为在实验室中校准的传感器作为“标准传感器”，将待检测的传感器与标准传感器进行对比，以此评判待检测传感器的准确性。通常会测量：零点、满量程、中间点。</p>
<p>定期校准是保证传感器准确性的重要手段，也能避免重大事故的发生。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="与单片机通信">与单片机通信<a href="https://jiangmiemie.com/blog/2024/4/30/#%E4%B8%8E%E5%8D%95%E7%89%87%E6%9C%BA%E9%80%9A%E4%BF%A1" class="hash-link" aria-label="Direct link to 与单片机通信" title="Direct link to 与单片机通信" translate="no">​</a></h2>
<p>单片机（Microcontroller Unit，简称 MCU）是指一个微型计算机集成在一个单独的微型芯片中，它包括处理器（CPU）、内存（通常包括 RAM 和 ROM）、以及各种输入/输出（I/O）接口等在内的完整计算设备。</p>
<p>单片机设计用于嵌入式应用，通常在硬件设备中执行特定任务。例如，你的电视遥控器可能就是由一个单片机控制的，它可以接收你的输入，然后发送相应的信号到电视上。其他常见的单片机应用包括玩具、家用电器、医疗设备、汽车等。</p>
<p>有的单片机可以使用完整的 Python，譬如华硕的 thinker edge R、部分树莓派，有的 Arduino 板子、ESP32 等只能使用简化的 MicroPython。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>当我们希望通过 windows 计算机的 USB 接口和单片机设备进行串口通信时，需要将 USB 接口转换为标准的串行接口，这个过程需要一个介于 USB 和串口之间的翻译，我下面的驱动就是这个翻译。</p><p>信号线的损坏的表现除了信号中断无法传输，也可能导致信号到达时间提前或滞后。</p><p>并非所有接口一样的数据线都具有相同功能：有的线仅能慢速充电，有的线可以快速充电，有的线只能充电不能传输数据。确保专线专用。</p></div></div>
<p>在搜索引擎中搜 CH341SER 驱动</p>
<blockquote>
<p>过程中所有弹窗有下一步点下一步，有确认点确认</p>
</blockquote>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="在编程软件中识别单片机">在编程软件中识别单片机<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%9C%A8%E7%BC%96%E7%A8%8B%E8%BD%AF%E4%BB%B6%E4%B8%AD%E8%AF%86%E5%88%AB%E5%8D%95%E7%89%87%E6%9C%BA" class="hash-link" aria-label="Direct link to 在编程软件中识别单片机" title="Direct link to 在编程软件中识别单片机" translate="no">​</a></h3>
<p>常用的编程软件有：Scratch、Mixly、Mixly2、MaixPy 等。</p>
<p>有的支持图形化编程与代码编程，有的需要仅支持代码编程。</p>
<p>下载对应的编程软件后，打开软件。</p>
<p>选择主控这个环节，不同软件的选择方式不同。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><ul>
<li class="">
<p>Vegeta 这样基于 Scratch 的编程软件，需要从左下角选择添加对应的主控型号。</p>
</li>
<li class="">
<p>Mixly 从右下角，串口旁的下拉菜单选择对应的主控型号。</p>
</li>
<li class="">
<p>Mixly2 从登录菜单中主控型号后，进入代码编辑页，右上角选择串口旁可以选择更加详细的主控型号。</p>
</li>
<li class="">
<p>MaixPy 从上方的工具页面中选择开发板型号。</p>
</li>
</ul></div></div>
<p>通过连接线连接电脑与单片机。此时可能会有多种情况：</p>
<ol>
<li class="">会提示：有串口连接，并弹出且仅弹出 1 个串口。</li>
<li class="">识别计算机上的所有串口，需要自己选择（可以通过反复插拔确认新增的端口号）。</li>
<li class="">不弹出任何串口，需要主控通电启动后才识别串口。</li>
<li class="">也有的串口时有时无，此时可以考虑：连接线接触不良（更换连接线），或者是主控/USB 电压不稳定——常见于学校机房（主控或电脑独立供电）</li>
<li class="">还有的默认的波特率需要调整，否则无法识别传输信号。</li>
</ol>
<p>连接成功后记得初始化固件，使其恢复到软件对应的固件版本。类似 Android 手机的刷机/恢复出厂设置。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="单片机编程">单片机编程<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%8D%95%E7%89%87%E6%9C%BA%E7%BC%96%E7%A8%8B" class="hash-link" aria-label="Direct link to 单片机编程" title="Direct link to 单片机编程" translate="no">​</a></h2>
<p>这里的传感器特指狭义的通过半导体检测物理量的传感器，如温度传感器、湿度传感器、光敏传感器等。这些传感器的特点是：输出信号是数字/模拟信号。</p>
<p>数字量传感器的输出信号是数字信号，他的特点是只 返回/发出 两种状态：高电平和低电平。对应在代码中是 1 和 0 。</p>
<ul>
<li class="">
<p>如声音传感器如果是数字量传感器，当检测到声音时输出高电平，否则输出低电平。</p>
</li>
<li class="">
<p>如小灯，输出高电平表示亮，输出低电平表示灭。</p>
</li>
</ul>
<p>模拟量传感器的输出信号是模拟信号，他的特点是输出的电压值是连续变化的。对应在代码中是 0-1023（通常如此，并非绝对） 。</p>
<ul>
<li class="">
<p>还是以声音传感器为例，如果是模拟量传感器，当检测到声音时输出的电压值会随着声音的大小而变化。</p>
</li>
<li class="">
<p>还是以小灯为例，输出最大值表示最亮，输出最小值表示最暗，亮度会随输出的电压值变化。</p>
</li>
</ul>
<p>有的传感器同时支持数字量和模拟量输出，有的不是。</p>
<p>因此，对于<code>不确认</code>的传感器，我们一般先假设传感器是模拟量传感器，如果不是，再当作数据量处理。</p>
<p>单片机的运行内存往往很小，当创建一个非常复杂的代码时，有可能会导致内存问题，对应各种报错都有可能。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="模拟量传感器读取">模拟量传感器读取<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%A8%A1%E6%8B%9F%E9%87%8F%E4%BC%A0%E6%84%9F%E5%99%A8%E8%AF%BB%E5%8F%96" class="hash-link" aria-label="Direct link to 模拟量传感器读取" title="Direct link to 模拟量传感器读取" translate="no">​</a></h3>
<p>下面以 32 接口为例</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> machine</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">adc32 </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">ADC</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">32</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">while</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">adc32</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">read_u16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="模拟量传感器输出">模拟量传感器输出<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%A8%A1%E6%8B%9F%E9%87%8F%E4%BC%A0%E6%84%9F%E5%99%A8%E8%BE%93%E5%87%BA" class="hash-link" aria-label="Direct link to 模拟量传感器输出" title="Direct link to 模拟量传感器输出" translate="no">​</a></h3>
<p>下面以 0 接口为例</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> machine</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm0 </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">PWM</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">duty_u16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">duty_u16</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">255</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<p>然而，有些动力类传感器需要设置占空比：占空比主要与脉冲宽度调制（Pulse Width Modulation，PWM）相关，它是一种模拟信号的数字化表示方法。在 PWM 中，一个周期内的高电平时间占总周期时间的比例就是占空比。</p>
<p>传感器的输出类型可以有多种，包括模拟电压、模拟电流、数字信号（如 I2C、SPI、UART 等）、频率、PWM 等。只有在使用 PWM 输出的传感器时，才需要设置占空比。例如，一些伺服电机会使用 PWM 信号来控制其位置，这时就需要设置占空比。</p>
<p>对于其他类型的传感器，如模拟电压输出的传感器、数字信号输出的传感器等，就不需要设置占空比。这些传感器的输出通常是连续的或者是特定的数字信号，不涉及到占空比的概念。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> machine </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> PWM</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> time</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 创建一个PWM对象</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> PWM</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 设置PWM信号的频率为50Hz</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 每秒50个周期，所以每个周期的时间是1秒/50，即20ms。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">freq</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">50</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 一般来说，当PWM信号的高电平时间为1ms时，舵机转到0度；</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 当高电平时间为2ms时，舵机转到最大角度。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 这个范围内的其他高电平时间对应的是0到180度之间的其他角度。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 转到0度（）</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">duty</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">52</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 1ms / 20ms * 1024 = 51.2 取不低于最小值的整:52</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 等待一段时间让舵机转到指定位置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 转到180度</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">duty</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">102</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 2ms / 20ms * 1024 = 102.4 取不高于最大值的整：102</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sleep</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)"># 等待一段时间让舵机转到指定位置</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 关闭PWM</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pwm</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">deinit</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="数字量传感器读取">数字量传感器读取<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%95%B0%E5%AD%97%E9%87%8F%E4%BC%A0%E6%84%9F%E5%99%A8%E8%AF%BB%E5%8F%96" class="hash-link" aria-label="Direct link to 数字量传感器读取" title="Direct link to 数字量传感器读取" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> machine</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pin0 </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">IN</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">while</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">pin0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="数字量传感器输出">数字量传感器输出<a href="https://jiangmiemie.com/blog/2024/4/30/#%E6%95%B0%E5%AD%97%E9%87%8F%E4%BC%A0%E6%84%9F%E5%99%A8%E8%BE%93%E5%87%BA" class="hash-link" aria-label="Direct link to 数字量传感器输出" title="Direct link to 数字量传感器输出" translate="no">​</a></h3>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> machine</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> time</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">pin13 </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">13</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> machine</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Pin</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">OUT</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">while</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pin13</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sleep_ms</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">50</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    pin13</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">value</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    time</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">sleep_ms</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">50</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="单片机网络通信">单片机网络通信<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%8D%95%E7%89%87%E6%9C%BA%E7%BD%91%E7%BB%9C%E9%80%9A%E4%BF%A1" class="hash-link" aria-label="Direct link to 单片机网络通信" title="Direct link to 单片机网络通信" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="获取天气">获取天气<a href="https://jiangmiemie.com/blog/2024/4/30/#%E8%8E%B7%E5%8F%96%E5%A4%A9%E6%B0%94" class="hash-link" aria-label="Direct link to 获取天气" title="Direct link to 获取天气" translate="no">​</a></h3>
<p>心知天气 API 分为免费版、付费版等多个版本，不同的版本返回的数据数量有所不同。</p>
<p>免费版仅返回三种基本数据，付费版可以返回多种数据。mixly 中默认的 KEY 为高级付费版，可返回全部数据。</p>
<p>数据返回的格式为字典，因此可以通过如下方式进行解包，下面的代码提供了部分数据解包的方法。</p>
<p>需要注意的是，该功能为联网功能，需要在联网环境下使用，确保 wifi 名和密码正确。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> mixiot</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> machine</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> seniverse_api</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">mixiot</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">wlan_connect</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">'wifiname'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token string" style="color:rgb(163, 21, 21)">'wifipassword'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">seniverse_api</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">weather_now</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">'SGJl0ExVN-4j27msR'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token string" style="color:rgb(163, 21, 21)">'北京'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="onenet-物联网传输数据至云端">onenet 物联网传输数据至云端<a href="https://jiangmiemie.com/blog/2024/4/30/#onenet-%E7%89%A9%E8%81%94%E7%BD%91%E4%BC%A0%E8%BE%93%E6%95%B0%E6%8D%AE%E8%87%B3%E4%BA%91%E7%AB%AF" class="hash-link" aria-label="Direct link to onenet 物联网传输数据至云端" title="Direct link to onenet 物联网传输数据至云端" translate="no">​</a></h3>
<p>onenet 物联网是中国移动推出的物联网交互平台，主要面向一般开发者，因此 AIbox 这款设备可以使用 onenet 物联网平台进行数据传输。</p>
<p>相比于 mixio 这样专注于单片机的物联网平台来说，onenet 的文档与接口可能会频繁变动，如有出入以官网教程为准。</p>
<p>onenet 物联网平台网址：<a href="https://open.iot.10086.cn/doc/" target="_blank" rel="noopener noreferrer" class="">https://open.iot.10086.cn/doc/</a></p>
<p>文档中提供了传输文本与文件 2 种方式</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> json</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> asyncio</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> websockets</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> uuid </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> uuid4</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 音频文件测试路径。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">audioFile </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"test.mp3"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)"># 使用自己产品Id和apikey替换下列参数。</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">productId </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"x"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">apikey </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"x"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">#发送文本请求</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">textRequest</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"aiType"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token string" style="color:rgb(163, 21, 21)">"dm"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"topic"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">'nlu.input.text'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"recordId"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> uuid4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">hex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"refText"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"测试"</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">#修改文本请求的输入</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">try</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">send</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">recv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">except</span><span class="token plain"> websockets</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">exceptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">ConnectionClosed </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> exp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">exp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">#发送音频请求</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">audioRequest</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"aiType"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"dm"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">#可选dm/asr, dm获取对话结果，asr只获取asr结果</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"topic"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"recorder.stream.start"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"recordId"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> uuid4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">hex</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"audio"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"audioType"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"mp3"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">#修改为测试文件的类型</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"sampleRate"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">16000</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">#修改为测试文件的sampleRate</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"channel"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)">#修改为测试文件的channel</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"sampleBytes"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">2</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#修改为测试文件的sampleBytes</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token string" style="color:rgb(163, 21, 21)">"asrParams"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"realBack"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#实时返回asr结果</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"enableVAD"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#启动VAD</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"enablePunctuation"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#返回结果是否带拼音</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"enableTone"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#返回结果是否带声调</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"enableConfidence"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">   </span><span class="token comment" style="color:rgb(0, 128, 0)">#返回结果是否带置信度</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"enableNumberConvert"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">#返回结果是否进行数字转换</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">try</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)">#发送文本消息</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">send</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 发送音频消息</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">with</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">open</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">audioFile</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">'rb'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">while</span><span class="token plain"> </span><span class="token boolean">True</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                chunk </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> f</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">read</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token number" style="color:rgb(9, 134, 88)">400</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">#wav buffsize=3200 其他的400</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> chunk</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">send</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token builtin" style="color:rgb(0, 112, 193)">bytes</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> encoding</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token keyword" style="color:rgb(0, 0, 255)">break</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token builtin" style="color:rgb(0, 112, 193)">len</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">chunk</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">send</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">chunk</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> message </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            resp </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">message</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">'dm'</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> resp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token keyword" style="color:rgb(0, 0, 255)">break</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">except</span><span class="token plain"> websockets</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">exceptions</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">ConnectionClosed </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> exp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">exp</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        ws</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">close</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">dds_demo</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">f"ws://botai-dsg.and-home.cn:4443/dsg/v1/prod?productId=</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">productId</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">&amp;apikey=</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string-interpolation interpolation">apikey</span><span class="token string-interpolation interpolation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token string-interpolation string" style="color:rgb(163, 21, 21)">"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">print</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">with</span><span class="token plain"> websockets</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">connect</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> websocket</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)">#await textRequest(websocket)  #发送文本请求</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> audioRequest</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">websocket</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">#发送音频请求</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">asyncio</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get_event_loop</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">run_until_complete</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">dds_demo</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div></code></pre></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="后话">后话<a href="https://jiangmiemie.com/blog/2024/4/30/#%E5%90%8E%E8%AF%9D" class="hash-link" aria-label="Direct link to 后话" title="Direct link to 后话" translate="no">​</a></h2>
<p>最后，通过大量的学习和试错打样，你发现米家雨水传感器，淘宝 46 包邮，搞活动更便宜，这大概是你最后的选择。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-4-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F4%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E8%87%AA%E5%88%B6%E6%99%BA%E8%83%BD%E5%AE%B6%E5%B1%85%E6%B5%81%E7%A8%8B%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>smarthome</category>
        </item>
        <item>
            <title><![CDATA[乐高、激光切割与3D打印]]></title>
            <link>https://jiangmiemie.com/blog/2024/3/31/</link>
            <guid>https://jiangmiemie.com/blog/2024/3/31/</guid>
            <pubDate>Sun, 31 Mar 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录个人硬件产品的结构设计]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_3_31_.mp3" preload="metadata"></audio><p>内容为最近一年的个人硬件产品的结构设计的对比分析，作为 DIY 爱好者，必然会有不足之处，欢迎指正。</p>
<p>假设你想自己制作一个桥梁模型送给朋友，手工制作一个当然很好，使用木头、或者捏一个土坯然后烧制、又或者直接使用车床加工。但是这需要一定的技艺，以及各种器具。</p>
<p>但是除了手工制作之外，你依然有很多种方式可以选择：</p>
<ul>
<li class="">
<p>乐高搭建，你只需要知道乐高拼搭基础，设计出图纸后导出并购买零件（正版与非正版价格差距极大）。</p>
</li>
<li class="">
<p>3D 打印，3D 打印有多种不同的原理，材料可选类型也比较多，设计出模型之后切片打印即可。</p>
</li>
<li class="">
<p>激光切割，使用激光切割机切割亚克力板或者木板，之后拼搭。</p>
</li>
</ul>
<p>简短对比 ：</p>
<table><thead><tr><th>技术</th><th>乐高</th><th>3D 打印（FDM）</th><th>激光切割</th></tr></thead><tbody><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><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><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><tr><td>优点总结</td><td>1. 适合所有年龄层，易于上手 <br> 2. 可重复使用，具有高度的灵活性 <br> 3. 无需特殊工具或设备</td><td>1. 可以制作出复杂的三维结构 <br> 2. 可以打印出定制的零件，适合个性化设计</td><td>1. 可以精确地切割出复杂的二维结构 <br> 2. 结构稳固，适合制作承受重负的结构</td></tr><tr><td>缺点总结</td><td>1. 结构可能不够稳固，不适合制作大型或承受重负的结构 <br> 2. 设计和功能可能受到乐高模块种类和数量的限制</td><td>1. 打印速度较慢，大型结构可能需要很长时间 <br> 2. 需要一定的设计和操作技能，学习曲线较陡峭</td><td>1. 设备价格高昂，运行和维护成本也较高 <br> 2. 需要一定的设计和操作技能，学习曲线较陡峭</td></tr></tbody></table>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="乐高类">乐高类<a href="https://jiangmiemie.com/blog/2024/3/31/#%E4%B9%90%E9%AB%98%E7%B1%BB" class="hash-link" aria-label="Direct link to 乐高类" title="Direct link to 乐高类" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="优点">优点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E4%BC%98%E7%82%B9" class="hash-link" aria-label="Direct link to 优点" title="Direct link to 优点" translate="no">​</a></h3>
<ul>
<li class="">
<p>设计快速、简单，易于拆卸，非常适合快速验证创新想法。</p>
</li>
<li class="">
<p>乐高模型可以随时调整，拆解后的部件可再次使用，避免了材料的直接损耗。相比之下，3D 打印和激光切割等技术一旦出现错误，调整难度较大，材料利用率相对较低。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="缺点">缺点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E7%BC%BA%E7%82%B9" class="hash-link" aria-label="Direct link to 缺点" title="Direct link to 缺点" translate="no">​</a></h3>
<ul>
<li class="">
<p>乐高结构的强度有限，不适合承受较大的力，因此更适合轻量级的应用。</p>
</li>
<li class="">
<p>乐高零件种类有限，对复杂结构的设计造成一定限制。</p>
</li>
<li class="">
<p>乐高零件的精度也有限，主要的结构单位和半个单位，这意味着你的模型尺寸需要是 0.5 个单位长度的倍数。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习心得">学习心得<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97" class="hash-link" aria-label="Direct link to 学习心得" title="Direct link to 学习心得" translate="no">​</a></h3>
<p>搜索一些搭建图纸，可以帮助你更好地理解乐高的设计原理和技巧。不用管书籍的语言是德语还是英语。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="软件">软件<a href="https://jiangmiemie.com/blog/2024/3/31/#%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="Direct link to 软件" title="Direct link to 软件" translate="no">​</a></h3>
<p>乐高结构设计软件：<a href="https://studiohelp.bricklink.com/hc/en-us" target="_blank" rel="noopener noreferrer" class="">https://studiohelp.bricklink.com/hc/en-us</a></p>
<p>优点：软件可以导出零件名称，一键跳转采购。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="总结">总结<a href="https://jiangmiemie.com/blog/2024/3/31/#%E6%80%BB%E7%BB%93" class="hash-link" aria-label="Direct link to 总结" title="Direct link to 总结" translate="no">​</a></h3>
<p>乐高设计快，但是采购之后自己拼搭比较耗时，遇到问题时可以先思考我之前有没有见过类似的图纸，没有见过而且比较复杂的话，一般选择 3D 打印。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="3d-打印">3D 打印<a href="https://jiangmiemie.com/blog/2024/3/31/#3d-%E6%89%93%E5%8D%B0" class="hash-link" aria-label="Direct link to 3D 打印" title="Direct link to 3D 打印" translate="no">​</a></h2>
<p>3D 打印是个人制造的一种重要方式，它可以将数字模型转化为实体物体。一张 A4 纸的大小大约是 210mm×297mm，可以在此基础上选购合适的成型尺寸。</p>
<p>3D 打印分为多种技术，常见的有 FDM（熔融沉积成型）、SLA（光固化成型）、SLS（激光烧结成型）等。其中 FDM 是最常见的 3D 打印技术，也是我使用的技术。</p>
<p>3D 打印目前主要有：</p>
<ul>
<li class="">定制手办方向</li>
</ul>
<blockquote>
<p>需要深入的学习建模软件</p>
</blockquote>
<blockquote>
<p>学习调色与上色</p>
</blockquote>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>目前桌面级打印机难以直接获得彩色精美手办。大多是光固化再上色或彩色 FDM 打印后打磨。</p><p>设备需要常维护：使用洗涤器清洗底板、挪动后重新调平。便宜的设备往往打印慢的同时需要调试：层纹错位、堵头、首层不平、拉丝翘边、悬空下垂等问题。</p></div></div>
<ul>
<li class="">工业设计</li>
</ul>
<blockquote>
<p>简单的学习建模软件</p>
</blockquote>
<blockquote>
<p>深入学习螺丝螺母磁铁钢针等材料的嵌入</p>
</blockquote>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="嵌入螺丝与螺母">嵌入螺丝与螺母<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%B5%8C%E5%85%A5%E8%9E%BA%E4%B8%9D%E4%B8%8E%E8%9E%BA%E6%AF%8D" class="hash-link" aria-label="Direct link to 嵌入螺丝与螺母" title="Direct link to 嵌入螺丝与螺母" translate="no">​</a></h4><p>暂停埋入螺母，预留 0.2mm 的间隙，然后再埋入螺母，可以避免打印头碰到螺母。</p><p>暂停层设置方法：切片后点右边的 z 轴预览条,右键可以选择：添加暂停打印</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="嵌入磁铁">嵌入磁铁<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%B5%8C%E5%85%A5%E7%A3%81%E9%93%81" class="hash-link" aria-label="Direct link to 嵌入磁铁" title="Direct link to 嵌入磁铁" translate="no">​</a></h4><p>普通磁铁与 N52 磁铁价格相差较大，但依旧推荐使用 N52 磁铁。因为普通磁铁在打印件中，磁吸力会有所衰减，而 N52 磁铁衰减后依然有不错的吸力。如果因为吸力不够导致打印件整体作废得不偿失。</p><p>设计孔位时磁铁最好下沉，齐平与突出都会让磁铁被撞碎。下沉太多会导致吸力下降。也侧水平设置槽位，让磁铁便于更换。</p><p>留出旷量给胶水（慢干胶与UHU胶水会腐蚀结构件，推荐快干胶502）、或者使用过盈、或者暂停+封顶（选择强磁，否则吸力下降严重）</p><p>不同尺寸、磁力的磁铁阵列排布时，距离过近会互相影响。常见的有：6mm直径 2mm 的N55磁铁、10mm直径的磁铁</p><p>分辨磁铁NS极可以使用一个3d打印件，一头标注N，一头标注S，放置磁铁后，吸起来哪个就放进去。</p><h4 class="anchor anchorTargetStickyNavbar_Vzrq" id="嵌入钢针">嵌入钢针<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%B5%8C%E5%85%A5%E9%92%A2%E9%92%88" class="hash-link" aria-label="Direct link to 嵌入钢针" title="Direct link to 嵌入钢针" translate="no">​</a></h4><p>钢针是最为常见的材料，可以选择的尺寸最多，将钢针以不同角度垂直嵌入 3D 打印件中可以提高打印件的强度。</p><p>想要将钢针水平嵌入到 3D 打印件中同时避免磕碰打印头、保持与打印件接触紧密，可以通过将打印一个辅助件完成：<code>长方体的内切圆柱（剪切掉内切圆柱）</code>，然后将钢针嵌入到辅助件中，再通过暂停层将辅助件嵌入到打印件中。</p><p>另外也可以利用钢针制作合页等结构，比纯3D打印更耐用。</p></div></div>
<p>在 3D 打印过程中，材料的选择对打印效果和性能有重要影响。下面是部分常见材料及其价格与特点。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>不同品牌价格不同，仅供参考，以下是一些材料的前缀与后缀的简要解释：</p><ul>
<li class="">CR ，表示更多色彩</li>
<li class="">CF ，表示碳纤维复合</li>
<li class="">Matte ，表示哑光质感</li>
<li class="">Silk ，表示丝绸质感</li>
<li class="">Hyper/Fast ，表示高速打印</li>
</ul></div></div>
<table><thead><tr><th>材料</th><th>全称</th><th>特点及应用说明</th><th>价格</th></tr></thead><tbody><tr><td>ABS</td><td>丙烯腈-丁二烯-苯乙烯共聚物</td><td>强度高、耐热性好、易加工，适用于一般性的 3D 打印项目。</td><td>59 元/KG</td></tr><tr><td>PETG</td><td>改性聚对苯二甲酸乙二醇酯</td><td>耐热、透明度高、耐化学性强，适用于透明或耐热性能的打印项目。</td><td>59 元/KG</td></tr><tr><td>PLA</td><td>聚乳酸</td><td>生物降解、环保、易于打印、无毒，适用于一般性的 3D 打印项目。</td><td>69 元/KG</td></tr><tr><td>PA</td><td>聚酰胺/尼龙 (Nylon)</td><td>机械性能更强，耐热，用于制作普通机械强度要求的打印项目。</td><td>79 元/KG</td></tr><tr><td>TPU</td><td>热塑性聚氨酯</td><td>弹性好、耐磨性强，常用于制作柔软的零件或弹性组件。</td><td>98 元/KG</td></tr><tr><td>PET-CF</td><td>碳纤维增强聚对苯二甲酸乙二醇酯</td><td>更高的强度和刚性，适用于要求更高机械性能的打印项目。</td><td>108 元/KG</td></tr><tr><td>PLA-CF</td><td>碳纤维增强聚乳酸</td><td>更高的强度和刚性，适用于要求更高机械性能的打印项目。</td><td>129 元/KG</td></tr><tr><td>ASA</td><td>聚酰胺酸酯</td><td>工程塑料，耐热性和机械性能优异，适用于高强度和耐热性的打印项目。</td><td>169 元/KG</td></tr><tr><td>PC</td><td>聚碳酸酯</td><td>抗冲击性和透明度优异，常用于制作耐用的零件或透明的构件。</td><td>219 元/KG</td></tr><tr><td>PA-CF</td><td>碳纤维增强聚酰胺/尼龙碳纤维</td><td>更高的强度和耐热性，适用于要求更高机械性能的打印项目。</td><td>249 元/KG</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="建模软件">建模软件<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%BB%BA%E6%A8%A1%E8%BD%AF%E4%BB%B6" class="hash-link" aria-label="Direct link to 建模软件" title="Direct link to 建模软件" translate="no">​</a></h3>
<p>建模软件是 3D 打印的基础，可选的非常多，譬如<code>Fusion 360</code>、<code>Blender</code>。</p>
<p>模型可以从 0 开始建，也在别人的基础上修改，由于家用3D打印机尺寸较小，工具物品难以一体成型，因此模块化设计思维较为重要。</p>
<p>成品模型库：</p>
<ul>
<li class="">
<p><a href="https://www.crealitycloud.cn/" target="_blank" rel="noopener noreferrer" class="">https://www.crealitycloud.cn/</a></p>
</li>
<li class="">
<p><a href="https://makerworld.com/" target="_blank" rel="noopener noreferrer" class="">https://makerworld.com/</a></p>
</li>
<li class="">
<p><a href="https://www.thingiverse.com/" target="_blank" rel="noopener noreferrer" class="">https://www.thingiverse.com/</a></p>
</li>
<li class="">
<p><a href="https://cults3d.com/" target="_blank" rel="noopener noreferrer" class="">https://cults3d.com/</a></p>
</li>
<li class="">
<p><a href="https://www.printables.com/" target="_blank" rel="noopener noreferrer" class="">https://www.printables.com/</a></p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="优点-1">优点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E4%BC%98%E7%82%B9-1" class="hash-link" aria-label="Direct link to 优点" title="Direct link to 优点" translate="no">​</a></h3>
<ul>
<li class="">
<p>只需要一个晚上就可以验证你的复杂创意。</p>
</li>
<li class="">
<p>提升空间大，可以选择一体成型，或者碳纤维材料，也可以使用暂停打印嵌入螺丝、螺母、磁石、金属棒等来创作一些强度极高的混合材质的工具。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="缺点-1">缺点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E7%BC%BA%E7%82%B9-1" class="hash-link" aria-label="Direct link to 缺点" title="Direct link to 缺点" translate="no">​</a></h3>
<ul>
<li class="">
<p>连接处的强度不够需要使用人工介入使用特殊手段提升。</p>
</li>
<li class="">
<p>打印时间长而且偶尔成品有瑕疵。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习心得-1">学习心得<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97-1" class="hash-link" aria-label="Direct link to 学习心得" title="Direct link to 学习心得" translate="no">​</a></h3>
<p>3D 打印的知识相对来说比较碎片化，需要持续学习与实战验证。可以关注一些 3D 打印博主、逛逛 3D 打印社区，可以学习到很多建模、切片、机器的调试、嵌入等技巧。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="软件-1">软件<a href="https://jiangmiemie.com/blog/2024/3/31/#%E8%BD%AF%E4%BB%B6-1" class="hash-link" aria-label="Direct link to 软件" title="Direct link to 软件" translate="no">​</a></h3>
<p>从 0 开始 3D 打印需要用到 3D 建模软件与切片软件</p>
<p>建模软件就是构建出你要打印的物品的模型的软件。</p>
<p>切片软件则是把这个模型切割为一层一层，控制 3D 打印机的喷嘴运动路径等参数的软件。目前我的 3D 打印机只认切片后的文件。</p>
<p>这里建模软件推荐找个教程，教程上用什么跟着学也用什么。</p>
<p>切片软件一般厂家有提供。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="激光切割">激光切割<a href="https://jiangmiemie.com/blog/2024/3/31/#%E6%BF%80%E5%85%89%E5%88%87%E5%89%B2" class="hash-link" aria-label="Direct link to 激光切割" title="Direct link to 激光切割" translate="no">​</a></h2>
<p>激光切割机主要用于切割和雕刻材料，如亚克力板、金属片、木板等。激光切割机通过激光束对材料进行加热，使其熔化或气化，然后通过气流将熔化或气化的材料吹走，从而实现切割。</p>
<p>可以通过调整激光头的运行速度和激光强度来实现穿透切割和表面雕刻。</p>
<p>激光强度大，激光头移动速度慢，可以实现穿透切割，即将材料完全切断（速度：10 分钟级别）。</p>
<p>激光强度小，激光头移动速度快，可以实现表面雕刻，即在材料表面刻出图案或文字（速度：秒级别）。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="优点-2">优点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E4%BC%98%E7%82%B9-2" class="hash-link" aria-label="Direct link to 优点" title="Direct link to 优点" translate="no">​</a></h3>
<ul>
<li class="">
<p>刻字速度极快，立等可取。</p>
</li>
<li class="">
<p>支持材料多样。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="缺点-2">缺点<a href="https://jiangmiemie.com/blog/2024/3/31/#%E7%BC%BA%E7%82%B9-2" class="hash-link" aria-label="Direct link to 缺点" title="Direct link to 缺点" translate="no">​</a></h3>
<ul>
<li class="">
<p>设备占地较大，气味明显需要单独通风，水冷型的需要偶尔换水。</p>
</li>
<li class="">
<p>部分材料切割容易边缘不光滑、发黑。</p>
</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="学习心得-2">学习心得<a href="https://jiangmiemie.com/blog/2024/3/31/#%E5%AD%A6%E4%B9%A0%E5%BF%83%E5%BE%97-2" class="hash-link" aria-label="Direct link to 学习心得" title="Direct link to 学习心得" translate="no">​</a></h3>
<p>激光切割主要是调试激光能量强度与材料的关系。常见的材料有以下几种：</p>
<p>亚克力板，比较常见的像一块 30*30cm 5mm 厚的透明板材</p>
<p>个人很喜欢的材料，透明的材质用来装日用摆件类的单片机很有“探索版”的感觉。做工具用比较脆，有一定韧性，但保存不当会产生划痕。</p>
<p>金属片：强度比木板要好不少，相比于亚克力板的硬、脆,金属片可以在切割后折弯，用来制作需要弯曲且强度要求高的结构。</p>
<p>无可替代的优势，你永远可以相信金属。</p>
<p>木板：木板具有良好的硬度和强度，面积较大的区域有一定韧性，但细的地方极其容易断裂。另外木板在潮湿的环境下可能会变形，因此需要在适当的环境中存储和使用。</p>
<p>用来制作各种家居装饰、艺术品和模型。木板的颜色和纹理使得切割出来的产品具有自然的美感和温馨的氛围。此外，木板也可以通过砂纸或者涂料进行后期处理，以改变其颜色和质感，增加产品的美观性和耐用性。</p>
<p>有些材料理论上可行，但是我实际工作中没有使用，不便评价：玻璃和陶瓷、织物和皮革、塑料和橡胶</p>
<p>相比前面两项个人级别的制作，激光切割家用较少，其一是气味较大，需要单独通风，有些激光切割机还需要用水桶接冷凝水。其二是占地面积较大，3D 打印机可以放在桌子上，激光切割机需要放在地上，且需要有一定的安全距离。</p>
<p>在学校、工作室等场所，通常会有激光切割机，可以提供激光切割服务。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="软件-2">软件<a href="https://jiangmiemie.com/blog/2024/3/31/#%E8%BD%AF%E4%BB%B6-2" class="hash-link" aria-label="Direct link to 软件" title="Direct link to 软件" translate="no">​</a></h3>
<p>厂家附赠非开源软件。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-3-31.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F3%2F31%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E4%B9%90%E9%AB%98%E3%80%81%E6%BF%80%E5%85%89%E5%88%87%E5%89%B2%E4%B8%8E3D%E6%89%93%E5%8D%B0%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>xiaoai</category>
            <category>tutorial</category>
            <category>ai</category>
        </item>
        <item>
            <title><![CDATA[服务迁移群晖完整指南]]></title>
            <link>https://jiangmiemie.com/blog/2024/2/28/</link>
            <guid>https://jiangmiemie.com/blog/2024/2/28/</guid>
            <pubDate>Wed, 28 Feb 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录挂载在宝塔服务如何迁移至群晖]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_2_28_.mp3" preload="metadata"></audio><p>群晖是一款非常优秀的 NAS 产品，它可以提供文件存储、多媒体服务、远程访问等功能。一般来说，一台群晖的寿命 4-6 年，折合下来比服务器便宜一点点。因此，我决定做云时代的逆行者，将服务器上的一些服务迁移到群晖上。</p>
<p>注意：云服务器的优点有很多，包括：更加安全、更加灵活、更加便宜等等，迁移需谨慎。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="原环境分析">原环境分析<a href="https://jiangmiemie.com/blog/2024/2/28/#%E5%8E%9F%E7%8E%AF%E5%A2%83%E5%88%86%E6%9E%90" class="hash-link" aria-label="Direct link to 原环境分析" title="Direct link to 原环境分析" translate="no">​</a></h2>
<p>租用的服务器是阿里云产品，选择了宝塔面板进行管理。</p>
<p>网站使用了前后端分离的设计模式，前端基于 Vue 生成的静态页面，后端则基于 Java。后端允许上传一些文件，使用的是 3000 端口进行通信，文件传输则在 8000 端口，路径设置为/upload/。通过 Nginx 进行了反向代理，将/upload/路径的请求转发到 8080 端口，将其他请求（80 端口）转发到 3000 端口。因此，对于这个网站，通信主要通过 80 端口和 8080 端口进行。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>如果你遇到了类似的问题，只需要梳理出我们最终通过宝塔面板的哪些端口访问就可以了。</p></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="迁移策略">迁移策略<a href="https://jiangmiemie.com/blog/2024/2/28/#%E8%BF%81%E7%A7%BB%E7%AD%96%E7%95%A5" class="hash-link" aria-label="Direct link to 迁移策略" title="Direct link to 迁移策略" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="服务器迁移">服务器迁移<a href="https://jiangmiemie.com/blog/2024/2/28/#%E6%9C%8D%E5%8A%A1%E5%99%A8%E8%BF%81%E7%A7%BB" class="hash-link" aria-label="Direct link to 服务器迁移" title="Direct link to 服务器迁移" translate="no">​</a></h3>
<p>创建一个 Docker 容器（如果原本用的是宝塔面板，那就继续使用宝塔面板），并按照原来的部署文档在容器内部重新运行服务。</p>
<p>将相关的命令设置为开机自启动。</p>
<p>另外，重要的文件等资料需要单独挂载，并可以设置为只读模式，以防止数据丢失同时更加安全。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="端口映射">端口映射<a href="https://jiangmiemie.com/blog/2024/2/28/#%E7%AB%AF%E5%8F%A3%E6%98%A0%E5%B0%84" class="hash-link" aria-label="Direct link to 端口映射" title="Direct link to 端口映射" translate="no">​</a></h3>
<p>Docker 的镜像可以通过端口映射的方式，将容器内的端口映射到宿主机（群晖）的端口上。</p>
<p>路由器可以将外网流量转发到宿主机（群晖）上，因此只需要在路由器上设置端口转发即可。</p>
<div class="theme-admonition theme-admonition-tip admonition_xJq3 alert alert--success"><div class="admonitionHeading_Gvgb"><span class="admonitionIcon_Rf37"><svg viewBox="0 0 12 16"><path fill-rule="evenodd" d="M6.5 0C3.48 0 1 2.19 1 5c0 .92.55 2.25 1 3 1.34 2.25 1.78 2.78 2 4v1h5v-1c.22-1.22.66-1.75 2-4 .45-.75 1-2.08 1-3 0-2.81-2.48-5-5.5-5zm3.64 7.48c-.25.44-.47.8-.67 1.11-.86 1.41-1.25 2.06-1.45 3.23-.02.05-.02.11-.02.17H5c0-.06 0-.13-.02-.17-.2-1.17-.59-1.83-1.45-3.23-.2-.31-.42-.67-.67-1.11C2.44 6.78 2 5.65 2 5c0-2.2 2.02-4 4.5-4 1.22 0 2.36.42 3.22 1.19C10.55 2.94 11 3.94 11 5c0 .66-.44 1.78-.86 2.48zM4 14h5c-.23 1.14-1.3 2-2.5 2s-2.27-.86-2.5-2z"></path></svg></span>tip</div><div class="admonitionContent_BuS1"><p>需要注意的是，群晖的部分端口可能已被群晖自身使用，可以通过群晖官网<a href="https://kb.synology.cn/zh-cn/DSM/tutorial/What_network_ports_are_used_by_Synology_services" target="_blank" rel="noopener noreferrer" class="">查询</a>。外网的部分端口（如 80 端口）可能被运营商封掉，或者路由器自身需要使用。因此，我们需要选择一些不常用的端口，以避免出现服务异常。</p></div></div>
<p>因此有了以下的端口映射规则（你可以先停止容器再设置）：</p>
<table><thead><tr><th>容器内端口（宝塔）</th><th>宿主机端口（群晖）</th><th>外网端口</th></tr></thead><tbody><tr><td>80</td><td>4080</td><td>4080</td></tr><tr><td>8080</td><td>8080</td><td>4880</td></tr></tbody></table>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="域名解析">域名解析<a href="https://jiangmiemie.com/blog/2024/2/28/#%E5%9F%9F%E5%90%8D%E8%A7%A3%E6%9E%90" class="hash-link" aria-label="Direct link to 域名解析" title="Direct link to 域名解析" translate="no">​</a></h3>
<p>现在我们需要将域名解析到服务器上，由于 80 端口不能直接访问，并且小区和域名供应商都会要求备案，这就需要我们使用 Cloudflare 的 DNS 解析服务。Cloudflare 可以充当中间人，将流量转发到服务器上。</p>
<blockquote>
<p>即无法通过 <a href="http://www.xxx.com/" target="_blank" rel="noopener noreferrer" class="">http://www.xxx.com</a> 直接访问到服务器，只能通过域名+端口号如 <a href="http://www.xxx.com:8080/" target="_blank" rel="noopener noreferrer" class="">http://www.xxx.com:8080</a> 访问。</p>
</blockquote>
<p>在 cloudflare 中添加域名，全程按照提示操作添加即可。</p>
<p>添加完成后，选择规则-&gt;回源（Origin Rules）。因为 Java 用到了两个端口，所以需要添加两个端口转发规则：</p>
<ul>
<li class="">
<p>当满足条件时（访问域名且路径不以/upload/开头），将流量转发到服务器的 4080 端口。</p>
</li>
<li class="">
<p>当满足条件时（访问域名且路径以/upload/开头），将流量转发到服务器的 4880 端口。</p>
</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="结果">结果<a href="https://jiangmiemie.com/blog/2024/2/28/#%E7%BB%93%E6%9E%9C" class="hash-link" aria-label="Direct link to 结果" title="Direct link to 结果" translate="no">​</a></h2>
<p>通过以上步骤，我们成功地将网站迁移到了新服务器上。用户访问网站时，流程如下：</p>
<ul>
<li class="">通过 DNS 解析，找到 cloudflare 的服务器。</li>
<li class="">cloudflare 根据规则，把 80 流量转发到路由器的 4080 上。</li>
<li class="">服务器接收到流量，把流量转发到群晖的 4080 端口。</li>
<li class="">群晖接收到流量，把流量转发到容器的 80 端口。</li>
<li class="">容器接收到流量，通过 Nginx 分配数据。</li>
<li class="">Nginx 根据规则，把流量转发到容器内的 8080 端口。</li>
<li class="">数据按照原本的路径逐一返回至 cloudflare。</li>
<li class="">cloudflare 把数据返回给访问者。</li>
</ul>
<p>如法炮制可以继续迁移其他站点。</p>
<p>这种迁移方式不仅保证了原有服务的连续性，也确保了服务器不会被外网直接访问，从而提高了网络安全性。即使网站被黑，也不会影响到其他服务，只需重启这个容器即可恢复原状。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="后话">后话<a href="https://jiangmiemie.com/blog/2024/2/28/#%E5%90%8E%E8%AF%9D" class="hash-link" aria-label="Direct link to 后话" title="Direct link to 后话" translate="no">​</a></h2>
<p>这次的迁移过程体现了分层思想的重要性，这主要来自《白帽子讲 Web 安全》这本书。整个过程没有遇到什么问题，只需要对容器化和 Cloudflare 有一定的了解。我希望我的经验能给读者带来一些启示。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-2-28.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F2%2F28%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E6%9C%8D%E5%8A%A1%E8%BF%81%E7%A7%BB%E7%BE%A4%E6%99%96%E5%AE%8C%E6%95%B4%E6%8C%87%E5%8D%97%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>remove</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[生成式AI提取博客精华]]></title>
            <link>https://jiangmiemie.com/blog/2024/1/31/</link>
            <guid>https://jiangmiemie.com/blog/2024/1/31/</guid>
            <pubDate>Wed, 31 Jan 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[记录自己博客如何实现生成式AI文本摘要]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2024_1_31_.mp3" preload="metadata"></audio><p>前段时间偶然间看到了一些生成式 AI 文本摘要项目，觉得很有意思。个人不太信任第三方服务，于是就加到待办里，想着自己也实现一个，最近终于有空了。</p>
<p>逻辑上的核心功能是：自动生成，无需人工干预，一次生成，再次生成消耗 key</p>
<p>样式上的核心功能是：逐字显示，好像是个机器人真的在实时生成。</p>
<p>本篇文章将记录如何实现这个功能。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="原型">原型<a href="https://jiangmiemie.com/blog/2024/1/31/#%E5%8E%9F%E5%9E%8B" class="hash-link" aria-label="Direct link to 原型" title="Direct link to 原型" translate="no">​</a></h2>
<p>博客是基于 Docusaurus 搭建的，而 Docusaurus 是基于 React 的，文章内容是通过 markdown 文件写的，所以需要设计一个 React 组件，传入 markdown 文件内的文本内容，每次有请求时，将文章内容转换为文本摘要。</p>
<p>但是这样做有一些问题，主要的是重复的每次请求都会消耗 key，因此需要储存已请求内容。</p>
<p>判断条件可以设为如果内容不存在，则直接调用，否则就重新生成，然后存储。</p>
<p>由此可知我们至少需要：内容（用来判断是否重复）、摘要（用来显示）</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token string-property property">"This is the text to summarize"</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"This is the summary"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token string-property property">"This is the text to summarize 2"</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"This is the summary 2"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span></span><br></div></code></pre></div></div>
<p>如果储存是需要成本的，我们可以使用hash值来判断内容是否相同，如果hash值相同，那么就不需要重新生成摘要了。这样不要存储一篇文章，只需要存储hash值和摘要就可以了。</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string-property property">"248ae1890a0084b3bbc30bd3c0c2e17e"</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"summary"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span></span><br></div></code></pre></div></div>
<p>如果有多个文章如何每次请求只请求指定的文章呢？</p>
<p>我们可以使用路径来区分不同的文章，在服务器上我们的方法就太多了。</p>
<p>但是静态的话我使用文件名来区分不同的文章。将文章路径中的<code>/</code>替换为<code>_</code>，然后加上<code>.json</code>后缀，就可以了。</p>
<div class="language-js codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">blog_1.json</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-js codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token string-property property">"248ae1890a0084b3bbc30bd3c0c2e17e"</span><span class="token operator" style="color:rgb(0, 0, 0)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"summary"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span></span><br></div></code></pre></div></div>
<p>把这个代码逻辑插入到 React 组件中就可以实现了，根据你调用的API不同，你也许可以设置返回的摘要长度等参数。</p>
<p>记得别直接把key写在代码里，而是通过环境变量传入。如果你的项目通过github pages部署，那么可以在项目的setting中设置环境变量<code>REACT_APP_API_KEY</code>，然后在代码中通过<code>process.env.REACT_APP_API_KEY</code>来获取。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="实现">实现<a href="https://jiangmiemie.com/blog/2024/1/31/#%E5%AE%9E%E7%8E%B0" class="hash-link" aria-label="Direct link to 实现" title="Direct link to 实现" translate="no">​</a></h2>
<p>当然，这只是一个比较粗糙的想法，接下来让我们完善下代码细节，让它优雅的同时，可以在博客中使用。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="逻辑功能">逻辑功能<a href="https://jiangmiemie.com/blog/2024/1/31/#%E9%80%BB%E8%BE%91%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="Direct link to 逻辑功能" title="Direct link to 逻辑功能" translate="no">​</a></h3>
<p>我在<a href="https://github.com/reflex-dev/reflex-chat/pull/20" target="_blank" rel="noopener noreferrer" class="">reflex-chat#20</a>里提交了关于百度API的实现，在这个仓库里你应该能找到其他API的操作方式。</p>
<div class="language-python codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockTitle_OeMC">main.py</div><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-python codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> os</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> json</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> time</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> hashlib</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> pathlib</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> requests</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> feedparser</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> parsel </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> Selector</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> datetime </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> datetime</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">from</span><span class="token plain"> jinja2 </span><span class="token keyword" style="color:rgb(0, 0, 255)">import</span><span class="token plain"> Environment</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> FileSystemLoader</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">BaiduAI</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">__init__</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BAIDU_API_KEY </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">getenv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"BAIDU_API_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BAIDU_SECRET_KEY </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">getenv</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"BAIDU_SECRET_KEY"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">token </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get_access_token</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_access_token</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">"""</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">        :return: access_token</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token triple-quoted-string string" style="color:rgb(163, 21, 21)">        """</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"https://aip.baidubce.com/oauth/2.0/token"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        params </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"grant_type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"client_credentials"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"client_id"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BAIDU_API_KEY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"client_secret"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">BAIDU_SECRET_KEY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">post</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> params</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">params</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"access_token"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">get_result</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">str</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        messages </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">dumps</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token string" style="color:rgb(163, 21, 21)">"messages"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token string" style="color:rgb(163, 21, 21)">"role"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"user"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"阅读下面的博文，然后尽可能接近50个词的范围内，提供一个总结。只需要回复总结后的文本：{}"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token builtin" style="color:rgb(0, 112, 193)">format</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                            text</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        session </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> requests</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">request</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"POST"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token string" style="color:rgb(163, 21, 21)">"https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/completions_pro?access_token="</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">token</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            headers</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"Content-Type"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"application/json"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            data</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">messages</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        json_data </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">loads</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">session</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"result"</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">keys</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            answer_text </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> json_data</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"result"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> answer_text</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">class</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Jsonsummary</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">__init__</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        root </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> pathlib</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">Path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">__file__</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">parent</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">resolve</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">root</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token string" style="color:rgb(163, 21, 21)">"summary"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"https://jiangmiemie.com/"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">pages </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">load_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 加载JSON文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        loaded_dict </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">with</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">open</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"r"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> encoding</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> json_file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">url </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"_"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"/"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">".json"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">load</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">json_file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> loaded_dict</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">save_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain">loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 将字典存入JSON文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> key </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            key_path </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"/"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"_"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">".json"</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            save_path </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> key_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">with</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">open</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">save_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"w"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> encoding</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token string" style="color:rgb(163, 21, 21)">"utf-8"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">as</span><span class="token plain"> json_file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">dump</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">key</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> json_file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> indent</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token number" style="color:rgb(9, 134, 88)">4</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">clean_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 根据RSS结果清理JSON文件</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">listdir</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">not</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">pages</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">remove</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">os</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">self</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">json_file_path</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token builtin" style="color:rgb(0, 112, 193)">file</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">blog_summary</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">feed_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    jsdata </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> Jsonsummary</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    loaded_dict </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> jsdata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">load_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">for</span><span class="token plain"> page </span><span class="token keyword" style="color:rgb(0, 0, 255)">in</span><span class="token plain"> feed_content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"link"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">split</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"#"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        jsdata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">pages</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">append</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">jsdata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"/"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"_"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">".json"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token comment" style="color:rgb(0, 128, 0)"># 剪切掉摘要部分，仅保留正文</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> page</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"content"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"value"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        selector </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> Selector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            text</span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">split</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"此内容根据文章生成，仅用于文章内容的解释与总结"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token number" style="color:rgb(9, 134, 88)">1</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        content_format </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">join</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">selector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">xpath</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">".//text()"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">getall</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        content_hash </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> hashlib</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">md5</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">content_format</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">encode</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">hexdigest</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">and</span><span class="token plain"> loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"content_hash"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> content_hash</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token keyword" style="color:rgb(0, 0, 255)">continue</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">else</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            ai </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> BaiduAI</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            summary </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> ai</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">get_result</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">content_format</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">update</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">                </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token string" style="color:rgb(163, 21, 21)">"content_hash"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> content_hash</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"summary"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> summary</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">            </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    jsdata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">save_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">loaded_dict</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    jsdata</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">clean_json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">def</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch_blog</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    content </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> feedparser</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token plain">parse</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"https://jiangmiemie.com/blog/rss.xml"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"entries"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    blog_summary</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">content</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> __name__ </span><span class="token operator" style="color:rgb(0, 0, 0)">==</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"__main__"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    fetch_blog</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span></span><br></div></code></pre></div></div>
<p>把<code>BAIDU_API_KEY</code>和<code>BAIDU_SECRET_KEY</code>传入git action的环境中的示例：</p>
<div class="language-yaml codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-yaml codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token punctuation" style="color:rgb(4, 81, 165)">-</span><span class="token plain"> </span><span class="token key atrule">name</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> Update</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule">run</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> python build_readme.py</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token key atrule">env</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule">BAIDU_API_KEY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> secrets.BAIDU_API_KEY </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token key atrule">BAIDU_SECRET_KEY</span><span class="token punctuation" style="color:rgb(4, 81, 165)">:</span><span class="token plain"> $</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"> secrets.BAIDU_SECRET_KEY </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span></span><br></div></code></pre></div></div>
<p>完整代码参考我的<a href="https://github.com/jiangyangcreate/jiangyangcreate" target="_blank" rel="noopener noreferrer" class="">github仓库</a></p>
<p>这样我访问<code>部署网址/summary/博客路径</code>就可以精准得到对应的摘要了，接下来就是在博客中使用了。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="样��式功能">样式功能<a href="https://jiangmiemie.com/blog/2024/1/31/#%E6%A0%B7%E5%BC%8F%E5%8A%9F%E8%83%BD" class="hash-link" aria-label="Direct link to 样式功能" title="Direct link to 样式功能" translate="no">​</a></h3>
<p>样式上的核心功能是：逐字显示，好像是个机器人真的在实时生成。可以更详细的拆为：获取摘要、逐字显示、放入框架。</p>
<div class="language-jsx codeBlockContainer_Ckt0 theme-code-block" style="--prism-color:#000000;--prism-background-color:#ffffff"><div class="codeBlockContent_QJqH"><pre tabindex="0" class="prism-code language-jsx codeBlock_bY9V thin-scrollbar" style="color:#000000;background-color:#ffffff"><code class="codeBlockLines_e6Vv codeBlockLinesWithNumbering_o6Pm" style="counter-reset:line-count 0"><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token comment" style="color:rgb(0, 128, 0)">//逐字显示</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(0, 0, 255)">TypingComponent</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token parameter"> text</span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token parameter"> speed </span><span class="token parameter operator" style="color:rgb(0, 0, 0)">=</span><span class="token parameter"> </span><span class="token parameter number" style="color:rgb(9, 134, 88)">100</span><span class="token parameter"> </span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">displayedText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> setDisplayedText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">useState</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">''</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token function" style="color:rgb(0, 0, 255)">useEffect</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">let</span><span class="token plain"> index </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">0</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> typingInterval </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">setInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token function" style="color:rgb(0, 0, 255)">setDisplayedText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token parameter">prevText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">index </span><span class="token operator" style="color:rgb(0, 0, 0)">&lt;</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">length</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> prevText </span><span class="token operator" style="color:rgb(0, 0, 0)">+</span><span class="token plain"> text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">index</span><span class="token operator" style="color:rgb(0, 0, 0)">++</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">else</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token function" style="color:rgb(0, 0, 255)">clearInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">typingInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">          </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> prevText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> speed</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">clearInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">typingInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">text</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> speed</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain">displayedText</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// 获取摘要</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(0, 0, 255)">JsonReader</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token parameter"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token parameter">  fieldToMatch</span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token parameter"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token parameter"></span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">// 替换url与/</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> path </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> fieldToMatch</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token regex regex-delimiter">/</span><span class="token regex regex-source language-regex">https:</span><span class="token regex regex-source language-regex escape">\/</span><span class="token regex regex-source language-regex escape">\/</span><span class="token regex regex-source language-regex">jiangmiemie</span><span class="token regex regex-source language-regex char-set class-name" style="color:rgb(38, 127, 153)">.</span><span class="token regex regex-source language-regex">com</span><span class="token regex regex-source language-regex escape">\/</span><span class="token regex regex-delimiter">/</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">""</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">replace</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token regex regex-delimiter">/</span><span class="token regex regex-source language-regex escape">\/</span><span class="token regex regex-delimiter">/</span><span class="token regex regex-flags">g</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"_"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> url </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token template-string template-punctuation string" style="color:rgb(163, 21, 21)">`</span><span class="token template-string string" style="color:rgb(163, 21, 21)">https://jiangmiemie.com/jiangyangcreate/summary/</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(4, 81, 165)">${</span><span class="token template-string interpolation">path</span><span class="token template-string interpolation interpolation-punctuation punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token template-string string" style="color:rgb(163, 21, 21)">.json</span><span class="token template-string template-punctuation string" style="color:rgb(163, 21, 21)">`</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">jsonData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> setJsonData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">useState</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword null nil" style="color:rgb(0, 0, 255)">null</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token function" style="color:rgb(0, 0, 255)">useEffect</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(0, 0, 255)">fetchData</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">async</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">try</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> response </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">fetch</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> data </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">await</span><span class="token plain"> response</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">json</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token function" style="color:rgb(0, 0, 255)">setJsonData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">data</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"> </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">catch</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">error</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">        </span><span class="token console class-name" style="color:rgb(38, 127, 153)">console</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">error</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token string" style="color:rgb(163, 21, 21)">"Error fetching JSON:"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> error</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token function" style="color:rgb(0, 0, 255)">fetchData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">url</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token function-variable function" style="color:rgb(0, 0, 255)">getFieldData</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">if</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token operator" style="color:rgb(0, 0, 0)">!</span><span class="token plain">jsonData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag class-name" style="color:rgb(38, 127, 153)">TypingComponent</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">text</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">'</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">摘要生成中...</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">'</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">speed</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(4, 81, 165)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript number" style="color:rgb(9, 134, 88)">100</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">/&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token comment" style="color:rgb(0, 128, 0)">// 根据字段进行匹配</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> matchingField </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> jsonData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token string" style="color:rgb(163, 21, 21)">"summary"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag class-name" style="color:rgb(38, 127, 153)">TypingComponent</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">text</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(4, 81, 165)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)">matchingField</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">speed</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(4, 81, 165)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript number" style="color:rgb(9, 134, 88)">100</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">/&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token keyword control-flow" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token function" style="color:rgb(0, 0, 255)">getFieldData</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain" style="display:inline-block"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// 放入框架</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token function-variable function maybe-class-name" style="color:rgb(0, 0, 255)">Aisummary</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token parameter"> children </span><span class="token parameter punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain">  </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">post-ai</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-title</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">a</span><span class="token tag" style="color:rgb(128, 0, 0)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token tag" style="color:rgb(128, 0, 0)">        </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-title-left</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag" style="color:rgb(128, 0, 0)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token tag" style="color:rgb(128, 0, 0)">        </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">href</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">/blog/2024/1/31/</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag" style="color:rgb(128, 0, 0)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token tag" style="color:rgb(128, 0, 0)">        </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">title</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">查看详情</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag" style="color:rgb(128, 0, 0)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token tag" style="color:rgb(128, 0, 0)">        </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">data-pjax-state</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag" style="color:rgb(128, 0, 0)"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token tag" style="color:rgb(128, 0, 0)">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">        </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-title-text</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text">文章摘要</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">a</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-explanation</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(4, 81, 165)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript literal-property property" style="color:rgb(128, 0, 0)">display</span><span class="token tag script language-javascript operator" style="color:rgb(0, 0, 0)">:</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript string" style="color:rgb(163, 21, 21)">"block"</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      &lt;JsonReader fieldToMatch = </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain">children</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain-text">/&gt;</span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-suggestions</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-bottom</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">      </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"> </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">class</span><span class="token tag attr-value punctuation attr-equals" style="color:rgb(4, 81, 165)">=</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag attr-value" style="color:rgb(128, 0, 0)">ai-tips</span><span class="token tag attr-value punctuation" style="color:rgb(4, 81, 165)">"</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text">此内容根据文章生成，仅用于文章内容的解释与总结</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain-text">  </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain"></span></span><br></div><div class="token-line codeLine_lJS_" style="color:#000000"><span class="codeLineNumber_Tfdd"></span><span class="codeLineContent_feaV"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span></span><br></div></code></pre></div></div>
<p>以上所有代码构成了你现在在本篇文章中看到的效果。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2024-1-31.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2024%2F1%2F31%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E7%94%9F%E6%88%90%E5%BC%8FAI%E6%8F%90%E5%8F%96%E5%8D%9A%E5%AE%A2%E7%B2%BE%E5%8D%8E%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>blog</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[博客写作回顾]]></title>
            <link>https://jiangmiemie.com/blog/2023/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2023/12/30/</guid>
            <pubDate>Sat, 30 Dec 2023 00:00:00 GMT</pubDate>
            <description><![CDATA[记录自己是如何写博客的]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2023_12_30_.mp3" preload="metadata"></audio><p>写博客对我而言，是一种爱好，可以追溯到 2009 年，这篇文章记录了一些博客写作过程之中的实践。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="设计博客">设计博客<a href="https://jiangmiemie.com/blog/2023/12/30/#%E8%AE%BE%E8%AE%A1%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="Direct link to 设计博客" title="Direct link to 设计博客" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="广泛的查看别人的博客">广泛的查看别人的博客<a href="https://jiangmiemie.com/blog/2023/12/30/#%E5%B9%BF%E6%B3%9B%E7%9A%84%E6%9F%A5%E7%9C%8B%E5%88%AB%E4%BA%BA%E7%9A%84%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="Direct link to 广泛的查看别人的博客" title="Direct link to 广泛的查看别人的博客" translate="no">​</a></h3>
<p>设计博客好比画画，从零开始画出一幅好画比较困难，但是如果临摹大师的作品就会相对容易一些。你可以搜索一些博客聚合类站点，查看成员的博客配置，对博客站点的设计有个大概的印象。这类站点通常有比较好的可迁移性。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="不需要买域名和服务器">不需要买域名和服务器<a href="https://jiangmiemie.com/blog/2023/12/30/#%E4%B8%8D%E9%9C%80%E8%A6%81%E4%B9%B0%E5%9F%9F%E5%90%8D%E5%92%8C%E6%9C%8D%E5%8A%A1%E5%99%A8" class="hash-link" aria-label="Direct link to 不需要买域名和服务器" title="Direct link to 不需要买域名和服务器" translate="no">​</a></h3>
<p>我建议个人博客使用 markdown 编写，存在 GitHub 并绑定自己默认是个非常好的选择。如果你从服务器开始搭建，不光会耗尽初始的热情，也会由于更新不便，服务器异常而无法专注于内容。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="博客美化切记过度">博客美化切记过度<a href="https://jiangmiemie.com/blog/2023/12/30/#%E5%8D%9A%E5%AE%A2%E7%BE%8E%E5%8C%96%E5%88%87%E8%AE%B0%E8%BF%87%E5%BA%A6" class="hash-link" aria-label="Direct link to 博客美化切记过度" title="Direct link to 博客美化切记过度" translate="no">​</a></h3>
<p>起初，写技术博客对我来说是一件容易的事，因为我无时无刻都有很多想法。我添加许多炫酷的特效在我的博客上，包括但不限于鼠标特效、点击特效、全局画布、一言、看板娘、音乐播放器、随机背景图、各种悬浮点击渐变特效。但这些美化难以做到不同设备上的兼容。此时我开始删减博客中我曾经认为“增色”的部分：内容不是越多越好。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="更新方式">更新方式<a href="https://jiangmiemie.com/blog/2023/12/30/#%E6%9B%B4%E6%96%B0%E6%96%B9%E5%BC%8F" class="hash-link" aria-label="Direct link to 更新方式" title="Direct link to 更新方式" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="周更">周更<a href="https://jiangmiemie.com/blog/2023/12/30/#%E5%91%A8%E6%9B%B4" class="hash-link" aria-label="Direct link to 周更" title="Direct link to 周更" translate="no">​</a></h3>
<p>周更的使用者是阮一峰老师，他从 2018 年开始每周都会定期更新，周更压力在于：不知道这周写什么。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="双周更">双周更<a href="https://jiangmiemie.com/blog/2023/12/30/#%E5%8F%8C%E5%91%A8%E6%9B%B4" class="hash-link" aria-label="Direct link to 双周更" title="Direct link to 双周更" translate="no">​</a></h3>
<p>双周更理论上能够很好的保持足够的输入，但实际操作中更容易遇到一整周都很忙的情况。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="月更">月更<a href="https://jiangmiemie.com/blog/2023/12/30/#%E6%9C%88%E6%9B%B4" class="hash-link" aria-label="Direct link to 月更" title="Direct link to 月更" translate="no">​</a></h3>
<p>月更是我坚持最久的更新方式，一个月足以输入足够的知识和内容。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="载体选择">载体选择<a href="https://jiangmiemie.com/blog/2023/12/30/#%E8%BD%BD%E4%BD%93%E9%80%89%E6%8B%A9" class="hash-link" aria-label="Direct link to 载体选择" title="Direct link to 载体选择" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="纯文字">纯文字<a href="https://jiangmiemie.com/blog/2023/12/30/#%E7%BA%AF%E6%96%87%E5%AD%97" class="hash-link" aria-label="Direct link to 纯文字" title="Direct link to 纯文字" translate="no">​</a></h3>
<p>纯文字的内容往往更能加载更快、获得国际流量的青睐、非常易于检索。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="多媒体">多媒体<a href="https://jiangmiemie.com/blog/2023/12/30/#%E5%A4%9A%E5%AA%92%E4%BD%93" class="hash-link" aria-label="Direct link to 多媒体" title="Direct link to 多媒体" translate="no">​</a></h3>
<p>只在必要的地方加入多媒体。注意：我并不是在否定文字以外的媒介，越来越多的知识不局限于通过书籍的方式传播：视频、音频、图片、动态网页、互动游戏。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="整理博客">整理博客<a href="https://jiangmiemie.com/blog/2023/12/30/#%E6%95%B4%E7%90%86%E5%8D%9A%E5%AE%A2" class="hash-link" aria-label="Direct link to 整理博客" title="Direct link to 整理博客" translate="no">​</a></h2>
<p>好的博客离不开定期整理，包括：</p>
<ul>
<li class="">清除无法访问的链接</li>
<li class="">汇总合并类似的章节</li>
<li class="">将碎片的知识串联成体系</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="标签分类">标签分类<a href="https://jiangmiemie.com/blog/2023/12/30/#%E6%A0%87%E7%AD%BE%E5%88%86%E7%B1%BB" class="hash-link" aria-label="Direct link to 标签分类" title="Direct link to 标签分类" translate="no">​</a></h2>
<p>我个人建议：表头的栏目推荐为 4-5 个，如有折叠展开：展开内容为 3-5 个。我们信息加工能力的局限<sup><a href="https://jiangmiemie.com/blog/2023/12/30/#user-content-fn-1-62f364" id="user-content-fnref-1-62f364" data-footnote-ref="true" aria-describedby="footnote-label" class="anchorTargetStickyNavbar_Vzrq">1</a></sup></p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="风格化">风格化<a href="https://jiangmiemie.com/blog/2023/12/30/#%E9%A3%8E%E6%A0%BC%E5%8C%96" class="hash-link" aria-label="Direct link to 风格化" title="Direct link to 风格化" translate="no">​</a></h2>
<p>这一步是要将你的站点与其他站点区分开来，风格化过程中会涉及到一些编程相关的知识，但主要是审美。</p>
<div class="playgroundContainer_XwyR"><div class="playgroundHeader_EIHj"><div class="playgroundHeaderContent_Kpsj">Live Editor</div><div class="playgroundHeaderButtons_kAaH"><button type="button" aria-label="Reset code to original" title="Reset" class="clean-btn resetButton_EgHb"><svg class="resetButtonIcon_yysN" viewBox="0 0 16 16" fill="currentColor" aria-hidden="true"><path d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z"></path><path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z"></path></svg>Reset</button></div></div><div class="playgroundEditor_L2Ll"><pre class="prism-code language-tsx" style="margin:0;outline:none;padding:10px;font-family:inherit;color:#000000;background-color:#ffffff" spellcheck="false"><span class="token-line" style="color:#000000"><span class="token comment" style="color:rgb(0, 128, 0)">// 一个足够简单的单元，配上无数次的重复即可呈现一个有趣的画面</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token comment" style="color:rgb(0, 128, 0)">// 一张小巧无缝矢量图即可实现用极小的内存平铺满整个背景。</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token keyword" style="color:rgb(0, 0, 255)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">example</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">props</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">// 使用 XPath 查询选择输出框</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> xpathSelector </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">"/html/body/div/div[2]/div/div/main/article/div/div[2]/div[4]"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> myElement </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token dom variable" style="color:rgb(9, 134, 88)">document</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">evaluate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    xpathSelector</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token dom variable" style="color:rgb(9, 134, 88)">document</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">null</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token maybe-class-name">XPathResult</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token constant" style="color:rgb(129, 31, 63)">FIRST_ORDERED_NODE_TYPE</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">null</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">singleNodeValue</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">// 你可以在这里查看或修改这个SVG图片</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">// 譬如 https://jiangmiemie.com/img/logo-192.svg</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  myElement</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">style</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">backgroundImage</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token string" style="color:rgb(163, 21, 21)">'url("https://jiangmiemie.com/img/protruding-squares.svg")'</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  myElement</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">style</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token property-access">backgroundColor</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token string" style="color:rgb(163, 21, 21)">"ee5522"</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"> </span><span class="token comment" style="color:rgb(0, 128, 0)">// 使用 backgroundColor，而不是 background-color</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token comment" style="color:rgb(0, 128, 0)">// 添加一个时钟</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">[</span><span class="token plain">date</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> setDate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">]</span><span class="token plain"> </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">useState</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Date</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token function" style="color:rgb(0, 0, 255)">useEffect</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">const</span><span class="token plain"> timerID </span><span class="token operator" style="color:rgb(0, 0, 0)">=</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">setInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token arrow operator" style="color:rgb(0, 0, 0)">=&gt;</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">tick</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token plain"> </span><span class="token number" style="color:rgb(9, 134, 88)">1000</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000">
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token keyword" style="color:rgb(0, 0, 255)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">cleanup</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">      </span><span class="token function" style="color:rgb(0, 0, 255)">clearInterval</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain">timerID</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000">
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">function</span><span class="token plain"> </span><span class="token function" style="color:rgb(0, 0, 255)">tick</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token function" style="color:rgb(0, 0, 255)">setDate</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token keyword" style="color:rgb(0, 0, 255)">new</span><span class="token plain"> </span><span class="token class-name" style="color:rgb(38, 127, 153)">Date</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token keyword" style="color:rgb(0, 0, 255)">return</span><span class="token plain"> </span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag" style="color:rgb(128, 0, 0)"></span>
</span><span class="token-line" style="color:#000000"><span class="token tag" style="color:rgb(128, 0, 0)">      </span><span class="token tag attr-name" style="color:rgb(255, 0, 0)">style</span><span class="token tag script language-javascript script-punctuation punctuation" style="color:rgb(4, 81, 165)">=</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"></span>
</span><span class="token-line" style="color:#000000"><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)">        color</span><span class="token tag script language-javascript operator" style="color:rgb(0, 0, 0)">:</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript string" style="color:rgb(163, 21, 21)">'white'</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"></span>
</span><span class="token-line" style="color:#000000"><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)">        height</span><span class="token tag script language-javascript operator" style="color:rgb(0, 0, 0)">:</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript string" style="color:rgb(163, 21, 21)">"200px"</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">,</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"> </span><span class="token tag script language-javascript comment" style="color:rgb(0, 128, 0)">// 适当调整高度</span><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)"></span>
</span><span class="token-line" style="color:#000000"><span class="token tag script language-javascript" style="color:rgb(128, 0, 0)">      </span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag script language-javascript punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;</span><span class="token tag" style="color:rgb(128, 0, 0)">h1</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token punctuation" style="color:rgb(4, 81, 165)">{</span><span class="token plain">date</span><span class="token punctuation" style="color:rgb(4, 81, 165)">.</span><span class="token method function property-access" style="color:rgb(0, 0, 255)">toLocaleTimeString</span><span class="token punctuation" style="color:rgb(4, 81, 165)">(</span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">h1</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain-text"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain-text">    </span>
</span><span class="token-line" style="color:#000000"><span class="token plain-text">    </span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&lt;/</span><span class="token tag" style="color:rgb(128, 0, 0)">div</span><span class="token tag punctuation" style="color:rgb(4, 81, 165)">&gt;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain">  </span><span class="token punctuation" style="color:rgb(4, 81, 165)">)</span><span class="token punctuation" style="color:rgb(4, 81, 165)">;</span><span class="token plain"></span>
</span><span class="token-line" style="color:#000000"><span class="token plain"></span><span class="token punctuation" style="color:rgb(4, 81, 165)">}</span>
</span></pre></div><div class="playgroundHeader_EIHj"><div class="playgroundHeaderContent_Kpsj">Result</div></div><div class="playgroundPreview_bYPY"><div>Loading...</div></div></div>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="放平心态">放平心态<a href="https://jiangmiemie.com/blog/2023/12/30/#%E6%94%BE%E5%B9%B3%E5%BF%83%E6%80%81" class="hash-link" aria-label="Direct link to 放平心态" title="Direct link to 放平心态" translate="no">​</a></h2>
<p>由于各种问题都会发生，譬如国内忽然不能访问 Github 了，那么容灾和冗余就决定了你是否能够快速恢复站点（如果不能的话，对你的打击会非常大）</p>
<p>博客的流量和短视频相比差的太多了，数年无人问津更是常态。不要急于求成，否则只会适得其反。这里推荐几个真正在玩博客的前辈：</p>
<ul>
<li class=""><a href="https://soulteary.com/" target="_blank" rel="noopener noreferrer" class="">苏洋博客</a> —— 一个 real man 一个乐于分享的前辈。</li>
<li class=""><a href="https://www.ruanyifeng.com/blog/weekly" target="_blank" rel="noopener noreferrer" class="">阮一峰的网络日志</a> —— 科技爱好者周刊已经成了我每周必看的内容，阮老师是真正的布道者。</li>
</ul>
<!-- -->
<section data-footnotes="true" class="footnotes"><h2 class="anchor anchorTargetStickyNavbar_Vzrq sr-only" id="footnote-label">Footnotes<a href="https://jiangmiemie.com/blog/2023/12/30/#footnote-label" class="hash-link" aria-label="Direct link to Footnotes" title="Direct link to Footnotes" translate="no">​</a></h2>
<ol>
<li class="anchorTargetStickyNavbar_Vzrq" id="user-content-fn-1-62f364">
<p>Miller, G. A. (1956). 神奇的数字：7±2；我们信息加工能力的局限（The magical number seven, plus or minus two: Some limits on our capacity for processing information） <a href="https://jiangmiemie.com/blog/2023/12/30/#user-content-fnref-1-62f364" data-footnote-backref="" aria-label="Back to reference 1" class="data-footnote-backref">↩</a></p>
</li>
</ol>
</section><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2023-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2023%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E5%8D%9A%E5%AE%A2%E5%86%99%E4%BD%9C%E5%9B%9E%E9%A1%BE%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>blog</category>
            <category>tutorial</category>
        </item>
        <item>
            <title><![CDATA[我的世界观反思]]></title>
            <link>https://jiangmiemie.com/blog/2022/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2022/12/30/</guid>
            <pubDate>Fri, 30 Dec 2022 00:00:00 GMT</pubDate>
            <description><![CDATA[记录自己的原则]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2022_12_30_.mp3" preload="metadata"></audio><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="做个现实的人">做个现实的人<a href="https://jiangmiemie.com/blog/2022/12/30/#%E5%81%9A%E4%B8%AA%E7%8E%B0%E5%AE%9E%E7%9A%84%E4%BA%BA" class="hash-link" aria-label="Direct link to 做个现实的人" title="Direct link to 做个现实的人" translate="no">​</a></h2>
<p>一切精神源于物质：一份镇定剂可以改变人的情绪，一杯咖啡能让人振作。精神世界与虚拟网络世界都是基于现实的物质存在的，或许它让你感到挫折和压抑，但是事实就是如此。</p>
<p>因此：直面现实，用行动代替祈祷才能真正的改变世界。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="记录下所有">记录下所有<a href="https://jiangmiemie.com/blog/2022/12/30/#%E8%AE%B0%E5%BD%95%E4%B8%8B%E6%89%80%E6%9C%89" class="hash-link" aria-label="Direct link to 记录下所有" title="Direct link to 记录下所有" translate="no">​</a></h2>
<p>现实生活不比游戏里角色，人的知识一定会走向遗忘，你常用的那一部分会被记住，你不常用的另一部分最终会被遗忘，所以在你大规模的学习知识的时候，应该成体系地把它记录下来，衡量笔记质量的指标：能否快速复现知识。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="保持开放心态">保持开放心态<a href="https://jiangmiemie.com/blog/2022/12/30/#%E4%BF%9D%E6%8C%81%E5%BC%80%E6%94%BE%E5%BF%83%E6%80%81" class="hash-link" aria-label="Direct link to 保持开放心态" title="Direct link to 保持开放心态" translate="no">​</a></h2>
<p>我们这代人身处漩涡的中心，有着独特的使命与难以想象的机遇，当然也需要应对前所未有的挑战。在接下来加速自己的学习计划，探索世界真相。</p>
<p>每个人都有自己的目标和世界观，请尤其注意群体标签不等于个体实际。</p>
<p>我看到因癌症离世的开源社区工作者写下：“Even if I keep on failing, as long as hope is still there, I will try and try again and try again. Because when I give up, that's it.”</p>
<p>来自世界各地的开源爱好者为开源社区无私奉献，非宗教的跨地域的共同体的雏形让我相信人类必能团结一心。</p>
<p>工业革命使得人类的生产力大大提高，大部分简单劳动被机器代替，由此催生了资本。人工智能革命或许没有那么强的划时代性，但是它也逐步使得简单脑力(驾驶、决策)得到替代。</p>
<p>因此相信平等与自由，所以我相信社会主义，一切都预示着我们正走向一个命运共同体。</p>
<p>在生活上，明确并公示自己的目标和世界观可以帮助自己更快达成目的：找到志同道合的朋友，获得他人的帮助、避免不必要的误会。</p>
<p>在软件上，初学者开源可以增强表达能力，获得指点。成熟者开源可以补充细节，完善项目，获得簇拥者。‌</p>
<p>我们越是成长，越是积累。越是需要保持开放心态，向他人学习。</p>
<p>平等自由的第一阶段是古中国：只有皇帝是是自由的，其他人都必须依附皇帝的意志。
平等自由的第二阶段是古希腊：被认可的阶级是平等自由的，奴隶主阶级彼此同等的享有投票权且都只能投一票。
平等自由的第三阶段是新教改革：在精神上用上帝面前人人平等肯定了人和人都是平等的，包括奴隶，也包括皇帝。
平等自由的第四阶段是社会主义：人们彼此即在精神上平等，也在物质上共有。</p>
<p>我相信平等自由，也相信社会主义 。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="一切皆要独立">一切皆要独立<a href="https://jiangmiemie.com/blog/2022/12/30/#%E4%B8%80%E5%88%87%E7%9A%86%E8%A6%81%E7%8B%AC%E7%AB%8B" class="hash-link" aria-label="Direct link to 一切皆要独立" title="Direct link to 一切皆要独立" translate="no">​</a></h2>
<p>个人的美好生活只有自己争取：子女不应寄希望于父母，父母亦不应寄希望于子女。伴侣不应当寄希望于对方，公民不应当寄希望于政府。亲属可能突然离世，政府也会换届倒台。
自己的美好生活应当做好独立实现的准备，能让自己赢得美好生活的只有自己。</p>
<p>不光是人需要独立，软件也是如此。在电子信息如此广博的当下，社会分工越发细致。譬如微信公众号，QQ 空间，但你没有办法拒绝其中的广告服务，你也无法阻止他们做出变更，譬如发表的内容和次数做限制。因此要永远相信自己的系统，做好随时脱钩的准备。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="理性交流">理性交流<a href="https://jiangmiemie.com/blog/2022/12/30/#%E7%90%86%E6%80%A7%E4%BA%A4%E6%B5%81" class="hash-link" aria-label="Direct link to 理性交流" title="Direct link to 理性交流" translate="no">​</a></h2>
<ul>
<li class="">交流可以代指讨论、辩论等深入的意见交流。区别于情绪交流（如：I think my boss is a bad guy）</li>
<li class="">所有的会议的目的应当是指向一个明确的结果，譬如：明确责任、具体的战略或方案执行。（高层探讨战略执行，一线探讨方案执行）</li>
</ul>
<p>脱离明确的结果的讨论会导致胜负欲的出现。</p>
<p>最大规模的探讨冲突地为：娱乐与社科，这里对想要情绪交流的人使用了意见交流的一套方案，而对想要意见交流的人，使用的情绪交流的方法。因此从一开始，额外的冲突就是注定的。</p>
<ul>
<li class="">所有我的建议是：在混乱未被规范之前，避免在未明的冲突区讨论。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="客观认识权威">客观认识权威<a href="https://jiangmiemie.com/blog/2022/12/30/#%E5%AE%A2%E8%A7%82%E8%AE%A4%E8%AF%86%E6%9D%83%E5%A8%81" class="hash-link" aria-label="Direct link to 客观认识权威" title="Direct link to 客观认识权威" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="权威的人">权威的人<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%9D%83%E5%A8%81%E7%9A%84%E4%BA%BA" class="hash-link" aria-label="Direct link to 权威的人" title="Direct link to 权威的人" translate="no">​</a></h3>
<p>在成长过程之中，人自然会遇到一些权威的人，他们在同样的道路上比你走的更远。但是要时刻记住，辩证的对待权威。因为权威在专业领域之外，往往表现的与普通人一致。</p>
<p>所以当权威的人就一个领域外的问题提出并不那么深刻的见解时，不要因此盲从，也不要否认他在本领域的专业性。</p>
<p>养成自己的辨别能力很重要，探寻深层次的问题，例如五次追问，现场还原等等。</p>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="权威的规则">权威的规则<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%9D%83%E5%A8%81%E7%9A%84%E8%A7%84%E5%88%99" class="hash-link" aria-label="Direct link to 权威的规则" title="Direct link to 权威的规则" translate="no">​</a></h3>
<p>法律是一种权威的规则。</p>
<p>规则的最终约束力不取决于人性的高贵，而是违约后果。</p>
<p>明文的规则是国家法律条款，违约后果的执行有国家公信力保证。如果国家公信力不能保证，譬如一个强大的军阀借了政府巨额资产不还，政府往往是没有办法的。再譬如农民借了地主的债务导致要被逼死选择起义。地主如果没有足够的武装力量，也是会被推翻。并且胜利的农民会写下：这是正义的起义。</p>
<p>客观的认识国家法律需要意识到 2 点：</p>
<ul>
<li class="">同个国家的法律是不停在变化的</li>
<li class="">不同国家的法律对同个行为的规定是不同的</li>
</ul>
<p>常见的法律的变化譬如：防疫政策的改变。
常见的法律的不同譬如：禁毒、禁酒。有的国家禁，有的国家不禁。</p>
<p>刑法威慑存在三个维度：严厉性、确定性、及时性
刑法惩罚的三种类型：财产刑、自由刑、生命刑</p>
<ul>
<li class="">严厉性
人民朴素的认为：只要提高刑法的严厉性就能预防犯罪，然而实际上二者并非一次函数那样线性相关。高强度的恐惧下往往会激起对立情绪。</li>
</ul>
<p>“严打”之后的八年（1984 年至 1991 年）中，凶杀案平均每年递增 30%，强奸案每年递增 20%，伤害案每年递增 35%，抢劫案每年递增 80%。</p>
<p>而相反，在死刑复核权收回最高法之后，恶性的案件有所下降。这也能理解，假设打架是死刑，那么可想而知每一次打架的暴力程度都会急剧上升。</p>
<ul>
<li class="">确定性
确定性 = 实际受到惩罚的犯罪/应该受到惩罚的犯罪
我国的破案率在 33%--40%之间，相信在看到这个数字之后，会有一些人萌发了犯罪的想法。当旁观者看见大量的犯罪者没有受到惩罚的时候，对旁观者而言，刑法就会失去威慑作用，进而催化犯罪。也是违法犯罪呈现区域化的原因。而相反，如果一个区域的犯罪都会被及时的处罚，那么大家更容易遵守。</li>
<li class="">及时性
及时性：惩罚距离犯罪发生的间隔有多长
譬如吸毒人员回家后的一年每天都有概率被随机抽查是否复吸，在这样随机且高频度的检查下，吸毒人员的犯罪行为与惩罚间隔非常近，因此能够取得一定的成效。</li>
</ul>
<p>因此在现代社会下，如果想要参与预防犯罪的发生这一过程里，可以多多从身边小事做起，勿以恶小而为之。</p>
<p>放大到国与国之间，明文的规则是国际法律条款，而只有拥有追偿能力的国家，才能成为世界经济的中心。如 A 国没有追偿能力，拥有 A 债的国家选择违约不偿还则很容易。常见的追偿能力包括：全世界第一的军费开支/各种国际组织的主导地位。二战之后主战国重新制定世界规则，所以法律的本质是一种当下的临时的规范，规范的前提是在这个框架下所有人的生活会更好。一旦这个前提不存在了，衍生品自然也不复存在。譬如 A 国失败的禁酒令。</p>
<p>因此到这里，要思考规则为什么此时得以存在和得以维持，才能在某些可以打破规则的契机出现时，通过打破规则来创造新的规则。而在未搞清楚规则得以维持的条件之前，打破规则的出头鸟下场不言而喻。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="体系化学习">体系化学习<a href="https://jiangmiemie.com/blog/2022/12/30/#%E4%BD%93%E7%B3%BB%E5%8C%96%E5%AD%A6%E4%B9%A0" class="hash-link" aria-label="Direct link to 体系化学习" title="Direct link to 体系化学习" translate="no">​</a></h2>
<p>体系的知识才能创造价值</p>
<p>如果你仅仅知道胡萝卜长出根须需要多长时间，那么这是一条有用的知识。</p>
<p>但是，单独的这条知识并没有什么价值。</p>
<p>但如果你同时还知道关于胡萝卜生长叶片所需营养的所有信息，那么这条知识就有了价值。甚至可能有胡萝卜企业愿意请你去做顾问。</p>
<p>当你不知道怎么做的时候，应该去看一看别人是怎么做的。那些已经做出来的人，他们的文档与目录，不应该是俄罗斯方块式学习，而是拼图式学习，你知道一共多少块拼图，你现在在哪儿。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="客观看待失败">客观看待失败<a href="https://jiangmiemie.com/blog/2022/12/30/#%E5%AE%A2%E8%A7%82%E7%9C%8B%E5%BE%85%E5%A4%B1%E8%B4%A5" class="hash-link" aria-label="Direct link to 客观看待失败" title="Direct link to 客观看待失败" translate="no">​</a></h2>
<p>失败只是意味着：这个方案行不通。所以你需要换个方案，仅此而已。
再次尝试的额外成本是在方案内的，因此我并不会过度在意。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="置身与规划之中">置身与规划之中<a href="https://jiangmiemie.com/blog/2022/12/30/#%E7%BD%AE%E8%BA%AB%E4%B8%8E%E8%A7%84%E5%88%92%E4%B9%8B%E4%B8%AD" class="hash-link" aria-label="Direct link to 置身与规划之中" title="Direct link to 置身与规划之中" translate="no">​</a></h2>
<p>总结与规划是一种习惯，也是一种能力。需要坚持，也需要学习。同时它并不是个阶段性的技能：总结与规划是一件伴随一身的技能，不论是在校、在职、从政还是创业，甚至可以说你走的越远，此项能力便越重要。我建议你找到人生目标之后，可以每天都可以思考自己今天做了什么，明天要做什么。它是否和你人生目标一致。如此一来，你可以避免冲动的抉择，享受坚持的快乐，脱离低级趣味。定期的归纳和总结的磨练过程会带来许多衍生收益，譬如：定时的作息、冷静的性格、结构化思考。</p>
<p>在我自我成长的过程中之后踩了许多坑，真实的成长：获得学历认证、掌握领域通用技能；虚假的成长：学习使用公司独有系统、盘点资产。总结的规律是</p>
<ul>
<li class="">可迁移、可考核、可量化的能力才能提升称之为成长</li>
</ul>
<p>我看到一事无成者花了大把时间担忧自己的健康，我看到毫无资本者小心翼翼的避开未知的挑战。不由得开始思考起人生的层级关系来，我想这个世界重要的事情并无太多，患得患失是陋习。人生的成长过程中，一些我曾经付出资源的爱好没有继续陪伴我走下去，或者说没有达到我自己预定目标，这样的事情如果放在一家公司里，可以称之为<strong>产投研失败。</strong></p>
<p>随着我不断的成长，这样的产投研失败是逐渐增多的，当然产投研成功也在增多。我回看这些事迹，如果我同时关注的项目很多，那么可能这些项目都会失败，因此我需要<strong>适当的集中精力</strong>，保持广泛的认知的同时，警惕雨露均沾。</p>
<ul>
<li class="">人生有一些事情是重要的，这些事情是明确的无需过多探索的。</li>
</ul>
<p>一旦清楚了这一点，我们便可以有意识的介入自己的行为，把它从自动挡切换为手动挡。就像瑜伽练习者有意识的呼吸一样。人的一生是有限的，如果不能依据层级分配精力，日后只会成为他人口中才华横溢却一事无成的小镇青年。我一直相信：有意识的规划大于临时的选择。</p>
<p>从大的方向来说，如果你有一个大学 4 年的详细规划，那么一定好过没有大学 4 年的规划。从小的细节上来说，如果你在逛超市之前有一个规划，比如购物清单。那么采购的效率有好过漫无目的的闲逛。在或者在打开手机之前思考要用手机做什么事情，比漫无目的的打开手机有效率。有规划者，心无杂念。无规划者，情绪被他人晕染。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="明确目标">明确目标<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%98%8E%E7%A1%AE%E7%9B%AE%E6%A0%87" class="hash-link" aria-label="Direct link to 明确目标" title="Direct link to 明确目标" translate="no">​</a></h2>
<p>我父亲的目标是开一家属于自己的大超市。</p>
<p>我前任公司老板的目标就是把智能教育做到 L5。</p>
<p>多年前工作室的老板的目标就是在 45 岁前挣到 500 万退休。</p>
<p>一位高中同学的目标就是住上大别墅，种花养草，已经他在老家基本实现。</p>
<p>买衣服也是，花点时间一次系统的学习：色彩、衣服材质、尺寸选择、和版式。当你明确要买什么颜色、材质、尺寸、版式的时候，整个购物过程就已经完成了一大半。</p>
<ul>
<li class="">当你决定要出发,最困难的部分其实已经完成了。</li>
</ul>
<p>明确目标的益处：</p>
<ul>
<li class="">帮助做决策：与目标契合的决策都应该做，反之不能做。</li>
<li class="">便于他人帮助你：吸引志同道合的人，提前避免观念不同的合伙人</li>
</ul>
<p>如何选择目标？</p>
<p>到了 18 岁之后，过去我没得选，现在我有很多选择，因此机会成本便如影随形（选择去 A 店打工便意味着放弃了 B 店）。</p>
<p>但是如果你迟迟不做出选择，每个选择都会变得更差。</p>
<ul>
<li class="">如果你能果断做出选择并坚持，每个选择都比开始更好。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="如何养成习惯">如何养成习惯<a href="https://jiangmiemie.com/blog/2022/12/30/#%E5%A6%82%E4%BD%95%E5%85%BB%E6%88%90%E4%B9%A0%E6%83%AF" class="hash-link" aria-label="Direct link to 如何养成习惯" title="Direct link to 如何养成习惯" translate="no">​</a></h2>
<p>生活是一个复杂的系统，养成的习惯是我们各自的存量。当你的行为不符合习惯时，需要花较长的时间来改变，这意味着你想变得更好或者更差都需要一定的时间。同一个行为被不停的强化会形成增量反馈，譬如：运动、早起、坚守原则。当然也包括：不运动、晚睡、放弃底线。我们的行为很多，完整分析容易导致精力极度分散，因此给自己行为区分系统，闹钟响了就起床，时间到了就看书，就已经能超过大部分成年人了。</p>
<p>我司有一位公认的技术专家，他精通各类技术。代码写的层次清晰，性能卓越。但我仍然希望自己能够在某个细分领域超越他。这里的”他“是哲学意义上我对自己限制。对我来说，保持某个领域的卓越是一种习惯。好比每天去跑步的习惯，跑步过程中一旦暂停，再次起跑就会格外困难。</p>
<ul>
<li class="">按系统规划目的，像管理军队一样管理自己的生活和言行，可以更容易实现自己的个人目标。</li>
<li class="">要每天不间断做有重大意义的事，保持卓越</li>
<li class="">立即去做，做错也比不做好</li>
<li class="">连续的执行才能看见效果 习惯像刷牙，每天都要刷。 一天不刷牙，三天就白刷。</li>
<li class="">重复，再重复。用潜移默化的方式改变的语言系统或是生活习惯</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="效率预估">效率预估<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%95%88%E7%8E%87%E9%A2%84%E4%BC%B0" class="hash-link" aria-label="Direct link to 效率预估" title="Direct link to 效率预估" translate="no">​</a></h2>
<p>我时常低估自己的效率，也时常高估自己的效率。</p>
<p>譬如我可能坐在椅子前写策划案写一天只能写一半，也可能原本要两天的框架浸提一口气就补完了细节。令人遗憾的是，我曾经准备多场考试，最终有部分仅差几分未能通过，这符合<strong>侯世达定律</strong>。因此在后续的行动中，如果我预估这个项目需要花费我 4 周，我会预留出 6 周的时间以确保此事的顺利完成。对于预估失败的项目（预估与最终结果的耗时相差过多或过少）记录下反思。</p>
<p>我明明比任何人都了解我自己，为何无法做出准确的预估呢？</p>
<p>前段时间我找到了一部分答案，主要有四点原因。</p>
<ul>
<li class="">第一点对我而言影响最小：主观能动性。或许大部分人有过不想做某事导致效率低下的情况，但是这样的事情往往不多。</li>
<li class="">第二点对我而言影响较大：熟练程度。当然没有任何一件事情和过去一模一样，但是总归有相似的部分，相似的越多我越容易再次完成它。但是这依然不能解决大部分问题，因为业务调整期遇到的都是新需求，而且很多需要你出圈解决。</li>
<li class="">第三点较为重要：详细的做事安排。我如果要做这件事需要预估出每天不受打扰的时间，然后乘以 1.5 进行安排，它能搞定大部分冗长项目拖延问题，当然营造不受打扰的时间也是有技巧的，我是习惯 25 分钟专注，25 分钟杂事（看邮件看钉钉看微信处理各种生活同事房东朋友的问题），然后下一个 25 分钟开始专注，这样别人也不会一直找不到你，你也能更容易进入心流的状态。但是依然解决不了我一坐一整天的情形。</li>
<li class="">最后一点是关键，明确这个事情怎么做，并且自己写到示例并确认方向是否正确。
譬如我写了一个策划案，写了第一个小活动，如果给到对应的批语便能很好的继续开展下去。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="时间规划">时间规划<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%97%B6%E9%97%B4%E8%A7%84%E5%88%92" class="hash-link" aria-label="Direct link to 时间规划" title="Direct link to 时间规划" translate="no">​</a></h2>
<p>时间规划最难的在于两端,即长远规划与细项规划，我的细线规划的逻辑顺序</p>
<ul>
<li class=""><strong>我有什么</strong>我的时间只有 24 小时,这是固定值.</li>
<li class=""><strong>我做什么</strong>相同的事情在不同的时间段执行,效果不同.
对上文的解释:效果差的规划表不一定是细项不合理,可能是分配的时间段不合理.
举例:我们读书时有忘我的高效状态,解题时有思如泉涌的状态,我们要找到这种状态出现的原因.可能原因包括:<strong>时间段/光线/心情/主观意愿</strong>等</li>
<li class=""><strong>常见提效</strong>工具的选择分为三个级别 1.被工具掣肘 2.带着需求找/做工具 3.被工具赋能,超出你的期望</li>
<li class=""><strong>超车提效</strong>沟通是把双刃剑 1.当你找到了正确的沟通对象时,你的效率提升极为巨大 2.当你找到错误的沟通对象,talk is cheap.
诀窍:可靠数据源要存档</li>
<li class=""><strong>框架比细项重要</strong> 1.在规定时间内,五件事情都做了 80 分,比只做了 4 件要好. 2.我们可以不做到 100 分,但是需要具备做到 100 分的能力,有的工作只会选择那些能做到 100 的人.这是出于我们的选择,而不是受制于能力.</li>
<li class=""><strong>定期整理</strong> 1.获取有效信息后,收藏至待整理 2.每周清理一次待整理,把特定代码,优化为通用代码 3.我有纸质本,名为待整理,作用为收藏自己的有效信息,定期放在电子设备上</li>
</ul>
<p>合理的时间安排表：吃饭 30 分钟；不合理的时间安排表：12:00-12:30 吃饭</p>
<p>另外也需要注意：不要把压力留给未来的自己，未来的自己会有属于未来的压力。未来市场是无法预测的，我相信我会在未来活着，但也相信我会在未来猝死。</p>
<ul>
<li class="">保持最好的状态的目的就是：让明天能有更大的概率存活。</li>
<li class="">对具体事情的规划好过对时间的规划。事件在前，时间在后。</li>
</ul>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="使用技术进行信息过滤">使用技术进行信息过滤<a href="https://jiangmiemie.com/blog/2022/12/30/#%E4%BD%BF%E7%94%A8%E6%8A%80%E6%9C%AF%E8%BF%9B%E8%A1%8C%E4%BF%A1%E6%81%AF%E8%BF%87%E6%BB%A4" class="hash-link" aria-label="Direct link to 使用技术进行信息过滤" title="Direct link to 使用技术进行信息过滤" translate="no">​</a></h2>
<p>公司昨天有人没关窗户，结果现在开始安排值日关窗了。</p>
<p>他说：“你看，这个就是相信管理，如果要是相信技术的公司，就会安装一个自动闭门器，相信什么是刻在公司基因里的。”</p>
<p>我是一个相信技术的人。</p>
<p>信息过滤是一件长久的事情，因为不论是自己还是媒体，都会投己所好。国内与国外的媒体面对外交友邦或者敌对国家的报道可能截然不同，信息源的选取要包含正反两面。</p>
<p>关于信息过滤我有三条原则： 1.超过 2 次虚假或极端片面的媒体会被永久过滤，互联网没有记忆，但数据库有。</p>
<p>2.过滤无法核实的推测的信息源：警惕一天发 10 条新闻的媒体，他们可能不会对信息进行严格的核实。</p>
<p>3.过滤所有的信息讨论，讨论区无法上传证据图片、完整的有结构的论述（字数限制）因此讨论区是一个忽略过程而追求结论的地方，这里的信息不具备参考价值，因为有价值的是一体化的论证过程与结论。</p>
<p>过滤信息是为了利用过滤后的信息来解释并预测这个世界，因此我的纠偏逻辑是：避免无法证伪的思想，积极的世界做出预测并反思自己的逻辑。</p>
<p>这个过程我会经历许多的失败，这些失败是我停步不前的原因，对于一个程序员来说，找到问题时，问题就已经解决了一半。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="正视不安的情绪">正视不安的情绪<a href="https://jiangmiemie.com/blog/2022/12/30/#%E6%AD%A3%E8%A7%86%E4%B8%8D%E5%AE%89%E7%9A%84%E6%83%85%E7%BB%AA" class="hash-link" aria-label="Direct link to 正视不安的情绪" title="Direct link to 正视不安的情绪" translate="no">​</a></h2>
<p>当面对难以解决的困难之时，正视不安与焦虑会促使我处理这一难题以摆脱这种焦虑。</p>
<p>哪些我回头看来成长最快的阶段，大多来源于从不安与焦虑症中挣扎的想出了一个我此前从未想到的绝妙方案。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2022-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2022%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E6%88%91%E7%9A%84%E4%B8%96%E7%95%8C%E8%A7%82%E5%8F%8D%E6%80%9D%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>原则</category>
            <category>记录</category>
        </item>
        <item>
            <title><![CDATA[自动化与高效搬家技巧]]></title>
            <link>https://jiangmiemie.com/blog/2021/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2021/12/30/</guid>
            <pubDate>Thu, 30 Dec 2021 00:00:00 GMT</pubDate>
            <description><![CDATA[记录自己在最近关于智能家居的思考]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2021_12_30_.mp3" preload="metadata"></audio><h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="完美的家庭自动化需要解决哪些问题">完美的家庭自动化需要解决哪些问题？<a href="https://jiangmiemie.com/blog/2021/12/30/#%E5%AE%8C%E7%BE%8E%E7%9A%84%E5%AE%B6%E5%BA%AD%E8%87%AA%E5%8A%A8%E5%8C%96%E9%9C%80%E8%A6%81%E8%A7%A3%E5%86%B3%E5%93%AA%E4%BA%9B%E9%97%AE%E9%A2%98" class="hash-link" aria-label="Direct link to 完美的家庭自动化需要解决哪些问题？" title="Direct link to 完美的家庭自动化需要解决哪些问题？" translate="no">​</a></h2>
<ul>
<li class="">不必适应技术</li>
</ul>
<p>应用程序不能成为生活的遥控器，如果你的手机没电了怎么办？</p>
<ul>
<li class="">你不是家庭自动化的唯一用户</li>
</ul>
<p>常见自动化是当在客厅看电影或连续剧时让灯光变暗。但它只有在每个人都在观看电影的情况下才有效。</p>
<ul>
<li class="">限制误报和漏报的影响</li>
</ul>
<p>如果它不起作用会有什么影响？</p>
<ul>
<li class="">系统应该在家里运行，而不是在云端运行</li>
</ul>
<p>互联网可能会停止工作，更新可能出错或运行云的服务器崩溃。发生这种情况时，智能家居应该能够继续运转。云应该被视为智能家居的扩展，而不是在云上运行。</p>
<ul>
<li class="">完美的应用程序不是应用程序</li>
</ul>
<p>大多数时候，最好的应用就是没有应用。以 Apple 为例：控制 HomeKit 设备的唯一方法是使用 Siri。语音界面也不完美。发出命令的速度很慢，因为必须等待响应。命令的可发现性、口音的识别以及对云处理语音的依赖性也存在问题。</p>
<ul>
<li class="">全屋智能需要考虑合并同类项</li>
</ul>
<p>房间如果太多，那么语音控制和全屋智能对应的成本也会上升，转换空间也会产生不适感。合并具有相同或类似功能的物品。不影响质量的情况下减少数量，空间感是最值钱的。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="从折叠家具到租房选择">从折叠家具到租房选择<a href="https://jiangmiemie.com/blog/2021/12/30/#%E4%BB%8E%E6%8A%98%E5%8F%A0%E5%AE%B6%E5%85%B7%E5%88%B0%E7%A7%9F%E6%88%BF%E9%80%89%E6%8B%A9" class="hash-link" aria-label="Direct link to 从折叠家具到租房选择" title="Direct link to 从折叠家具到租房选择" translate="no">​</a></h2>
<p>毕业之后，租房不便，因为工资不高，只能选择租一个很小很小的小单间，如果你想做点什么，得把多余的物品收起来，之后再放回去。</p>
<p>我买了很多折叠和收纳的物品，但是发现所有的折叠和收纳物品都在浪费自己时间，一个正常的桌子可以直接被使用，一个折叠的桌子需要 2 分钟的展开与收回；正常我洗漱用品放在洗手台上直接取用，合租时放在床底每次取用耗时增加 2 分钟。</p>
<p>因此我得出一个简单的结论，日常生活的耗时与空间呈相关性：空间为 1 时，日常行动耗时增加。空间增加时，日常行动耗时减少。</p>
<p>所以我开始换个方式去计算自己的租房成本：人的一天有 24 小时</p>
<p>A 房间的实际房租为：租金+水电物维网+通勤费用+通勤时间+空间折算时间</p>
<p>时间最终会换算为：
可折现时间（加班获得报酬）</p>
<p>不可折现时间（加班费用固定，花费更多的时间也不会获得更多的报酬，且你无其他变现方式，则多余的加班时间为不可折现时间）</p>
<p>如果你刚毕业有的是时间，可以选择一个地方远空间小有地铁的地方</p>
<p>如果你已经步入中层时间已经不够用的，可以思考自己每天还需要多少时间。或许在原地换个大房子也能解决问题，因为大空间会让你的日常生活的速度变快。</p>
<p>举个具体的例子：
A 住在公司附近，每天加班 1 小时，每个月可以拿到 1000 的加班费，房租 2500+交通 0 元+空间折算时间 300 元。</p>
<p>B 住在隔壁区，每天不加班，房租 1500+交通 300+空间折算时间 0 元。</p>
<p>实际算下来：每月花费相当，而 A 获得了项目经验+可能的职位晋升，B 获得了通勤感悟。</p>
<p>这个例子并不是鼓励大家加班，只是给出一个公式化的方法，让我自己能够客观理性的在租房上班这件事上获取最大收益：有的公司不给加班费，有的公司加班费给的很多，有的公司加班也获得不了经验，有的公司加班可以获得很多经验，具体问题具体分析。</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="稳定可靠与南北方天气">稳定可靠与南北方天气<a href="https://jiangmiemie.com/blog/2021/12/30/#%E7%A8%B3%E5%AE%9A%E5%8F%AF%E9%9D%A0%E4%B8%8E%E5%8D%97%E5%8C%97%E6%96%B9%E5%A4%A9%E6%B0%94" class="hash-link" aria-label="Direct link to 稳定可靠与南北方天气" title="Direct link to 稳定可靠与南北方天气" translate="no">​</a></h2>
<p>在广深呆了久了再来到北上之后,很显然的需要增添衣物以及储物空间</p>
<p>首先就是袜子,在深圳,一年四季一套中筒袜.
到北上之后,10 月底就要开始准备长袜了，一直到次年的 3-4 月才能脱下.</p>
<p>其次就是冬裤,可以选择单条厚实的长裤,也可选择秋裤+长裤
我是一个极度讨厌叠穿裤子的人,我也很讨厌寒冷的冬天.
坦诚来说广州的天气也不如深圳.</p>
<p>最后就是外套,我对外套倒是没有那么排斥,但是很讨厌羽绒服,老棉衣.
这些短小的服装以至于稍微一活动就露出肢体,寒冷便顺着露出的肢体刺入血肉之中.</p>
<p>这给我的感觉就是:棉衣与棉裤很不可靠,也许是我身高较高,所以合适的衣服本就难买,更别提棉衣裤.还是深圳好.</p>
<h2 class="anchor anchorTargetStickyNavbar_Vzrq" id="搬家指南">搬家指南<a href="https://jiangmiemie.com/blog/2021/12/30/#%E6%90%AC%E5%AE%B6%E6%8C%87%E5%8D%97" class="hash-link" aria-label="Direct link to 搬家指南" title="Direct link to 搬家指南" translate="no">​</a></h2>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="1知道你有多少物品">1.知道你有多少物品<a href="https://jiangmiemie.com/blog/2021/12/30/#1%E7%9F%A5%E9%81%93%E4%BD%A0%E6%9C%89%E5%A4%9A%E5%B0%91%E7%89%A9%E5%93%81" class="hash-link" aria-label="Direct link to 1.知道你有多少物品" title="Direct link to 1.知道你有多少物品" translate="no">​</a></h3>
<ul>
<li class="">盘点物品数量</li>
<li class="">扔掉过期的消耗品</li>
<li class="">挂闲鱼：百元以下，一年未用</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="2计算你的身家">2.计算你的身家<a href="https://jiangmiemie.com/blog/2021/12/30/#2%E8%AE%A1%E7%AE%97%E4%BD%A0%E7%9A%84%E8%BA%AB%E5%AE%B6" class="hash-link" aria-label="Direct link to 2.计算你的身家" title="Direct link to 2.计算你的身家" translate="no">​</a></h3>
<ul>
<li class="">物品分类（易碎品）</li>
<li class="">物品估价</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="3分类打包">3.分类打包<a href="https://jiangmiemie.com/blog/2021/12/30/#3%E5%88%86%E7%B1%BB%E6%89%93%E5%8C%85" class="hash-link" aria-label="Direct link to 3.分类打包" title="Direct link to 3.分类打包" translate="no">​</a></h3>
<ul>
<li class="">对于高估价且易碎的物品，纸箱+木箱</li>
<li class="">其他物品分类后打入纸箱</li>
<li class="">对每个纸箱生成一个二维码贴纸，二维码指向一个你自己的链接，你可以扫码查看并修改这个纸箱内的物品信息，方便查找。</li>
</ul>
<h3 class="anchor anchorTargetStickyNavbar_Vzrq" id="4快递上门">4.快递上门<a href="https://jiangmiemie.com/blog/2021/12/30/#4%E5%BF%AB%E9%80%92%E4%B8%8A%E9%97%A8" class="hash-link" aria-label="Direct link to 4.快递上门" title="Direct link to 4.快递上门" translate="no">​</a></h3>
<ul>
<li class="">顺丰中有个快递慢运，价格合适</li>
</ul>
<p>以上适用于跨省、跨国搬家。同城搬家有驾照还是自租车最划算。</p><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2021-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2021%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E8%87%AA%E5%8A%A8%E5%8C%96%E4%B8%8E%E9%AB%98%E6%95%88%E6%90%AC%E5%AE%B6%E6%8A%80%E5%B7%A7%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>家居</category>
            <category>记录</category>
        </item>
        <item>
            <title><![CDATA[阳光到深海的内心探索]]></title>
            <link>https://jiangmiemie.com/blog/2020/12/30/</link>
            <guid>https://jiangmiemie.com/blog/2020/12/30/</guid>
            <pubDate>Wed, 30 Dec 2020 00:00:00 GMT</pubDate>
            <description><![CDATA[记录自己一段连续的梦境与现实，一次内心探索的旅程]]></description>
            <content:encoded><![CDATA[<div class="post-ai"><div class="ai-title"><a class="ai-title-left" href="https://jiangmiemie.com/blog/2024/1/31/" title="查看详情" data-pjax-state=""><div class="ai-title-text">文章摘要</div></a></div><div class="ai-explanation" style="display:block"></div><div class="ai-suggestions"></div><div class="ai-bottom"><div class="ai-tips">此内容根据文章生成，仅用于文章内容的解释与总结</div></div></div><audio src="https://ai.jiangmiemie.com/static/summary/blog_2020_12_30_.mp3" preload="metadata"></audio><p>天空是被明码标价的，在一线城市生活多年的我早已知道这条潜规则：能看见天空的房间和看不见天空的房间价格是不同，今年天空的价格大概是 300 块一个月。价格不算便宜，但为了能看见阳光，我还是买了。</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>就这样我们整理出了一套非常严谨全面的航海生存手册，可是我的船员从 100 个变成了 80 个，60 个 20 个，最后只剩下我。</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><div class="margin-vert--lg" style="display:flex;align-items:center;justify-content:center"><a class="button button--link" href="https://github.com/jiangyangcreate/jiangyangcreate.github.io/blob/main/blog/2020-12-30.mdx" target="_blank" rel="noreferrer noopener" aria-label="edit on github" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 512 512" height="20" width="20" style="margin-right:7px"><g transform="translate(0.000000,512.000000) scale(0.100000,-0.100000)" fill="url(#grad1)" stroke="none"><path d="M2384 5060 c-1012 -69 -1891 -738 -2235 -1703 -53 -146 -102 -349 -125 -512 -23 -157 -25 -496 -5 -655 102 -816 575 -1526 1287 -1932 164 -94 418 -200 483 -202 51 -1 94 20 116 57 18 30 19 50 16 267 -1 129 -3 236 -4 236 -1 1 -38 -4 -82 -12 -263 -43 -497 16 -646 165 -58 58 -76 86 -134 206 -94 196 -149 271 -255 348 -78 56 -120 98 -120 119 0 50 121 67 217 30 125 -47 208 -119 299 -258 126 -191 284 -276 485 -261 77 6 233 49 245 68 3 6 13 38 20 71 19 80 68 181 110 228 40 45 44 42 -86 60 -103 14 -282 60 -368 94 -362 143 -571 410 -649 829 -25 134 -25 463 0 567 36 149 103 285 195 398 l43 53 -15 47 c-52 161 -46 370 16 564 20 61 24 67 54 73 107 20 352 -68 576 -206 l98 -61 87 20 c204 47 298 57 553 57 256 0 349 -10 553 -57 l88 -20 77 48 c153 96 304 167 407 193 85 21 159 31 191 25 28 -5 33 -12 52 -72 57 -178 67 -404 23 -542 l-21 -65 20 -25 c98 -121 175 -269 212 -409 26 -98 36 -348 19 -488 -74 -608 -407 -935 -1041 -1023 -120 -16 -118 -15 -83 -53 46 -48 90 -134 115 -223 20 -74 22 -106 27 -529 7 -492 5 -482 66 -507 47 -20 102 -13 200 26 348 135 622 311 884 569 417 410 679 942 752 1527 20 159 18 498 -5 655 -173 1219 -1151 2131 -2373 2215 -161 11 -175 11 -339 0z"></path></g></svg></a><a class="button button--link" href="https://twitter.com/intent/tweet?url=https%3A%2F%2Fjiangmiemie.com%2Fblog%2F2020%2F12%2F30%2F&amp;text=%E6%88%91%E5%88%9A%E5%88%9A%E8%AF%BB%E4%BA%86%20%22%E9%98%B3%E5%85%89%E5%88%B0%E6%B7%B1%E6%B5%B7%E7%9A%84%E5%86%85%E5%BF%83%E6%8E%A2%E7%B4%A2%22%20by%20%40jiangyangcreate" target="_blank" rel="noreferrer noopener" aria-label="share on twitter" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 24 24" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><path d="M18.244 2.25h3.308l-7.227 8.26 8.502 11.24H16.17l-5.214-6.817L4.99 21.75H1.68l7.73-8.835L1.254 2.25H8.08l4.713 6.231zm-1.161 17.52h1.833L7.084 4.126H5.117z"></path></g></svg></a><a class="button button--link" href="https://jiangmiemie.com/blog/rss.xml" target="_blank" rel="noreferrer noopener" aria-label="rss reader link" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 16 16" height="20" width="20" style="margin-right:7px"><g fill="url(#grad1)"><linearGradient id="grad1" x1="0%" y1="0%" x2="100%" y2="100%"><stop offset="0%" style="stop-color:#D8262C;stop-opacity:1"></stop><stop offset="100%" style="stop-color:#E6B800;stop-opacity:1"></stop></linearGradient><circle cx="3" cy="13" r="2"></circle><path d="M1 5.667v2.667A6.674 6.674 0 0 1 7.667 15h2.666c0-5.146-4.187-9.333-9.333-9.333z"></path><path d="M1 1v2.667C7.25 3.667 12.334 8.75 12.334 15H15C15 7.28 8.72 1 1 1z"></path></g></svg></a><a class="button button--link" href="mailto:jiangyangcreate@gmail.com" target="_blank" rel="noreferrer noopener" aria-label="send email" style="display:inline-flex;align-items:center"><svg version="1.1" xmlns="http://www.w3.org/2000/svg" x="0px" y="0px" viewBox="0 0 1024 1024" style="margin-right:7px;height:20px;width:20px"><g><path style="opacity:0.996;fill:url(#grad1)" d="M 243.5,420.5 C 189.523,379.185 135.857,337.518 82.5,295.5C 140.987,183.298 229.487,104.632 348,59.5C 432.42,30.213 518.587,23.713 606.5,40C 693.576,57.6997 769.243,96.6997 833.5,157C 787.833,202.667 742.167,248.333 696.5,294C 695.5,294.667 694.5,294.667 693.5,294C 642.378,246.775 581.711,222.942 511.5,222.5C 407.283,227.337 327.117,273.337 271,360.5C 259.938,379.624 250.771,399.624 243.5,420.5 Z"></path></g><g><path style="opacity:0.996;fill:url(#grad1)" d="M 82.5,295.5 C 135.857,337.518 189.523,379.185 243.5,420.5C 223.5,481.168 223.5,541.835 243.5,602.5C 189.523,643.815 135.857,685.482 82.5,727.5C 31.7513,624.612 18.5846,516.945 43,404.5C 51.5465,366.35 64.7132,330.016 82.5,295.5 Z"></path></g><g><path style="opacity:0.998;fill:url(#grad1)" d="M 829.5,876.5 C 777.833,835.833 726.167,795.167 674.5,754.5C 725.318,718.61 756.985,669.944 769.5,608.5C 683.503,607.5 597.503,607.167 511.5,607.5C 511.5,546.167 511.5,484.833 511.5,423.5C 662.5,423.5 813.5,423.5 964.5,423.5C 979.017,509.532 974.517,594.532 951,678.5C 928.206,755.703 887.706,821.703 829.5,876.5 Z"></path></g><g><path style="opacity:0.997;fill:url(#grad1)" d="M 243.5,602.5 C 274.71,690.744 334.043,751.577 421.5,785C 487.78,805.861 553.78,804.861 619.5,782C 638.723,774.388 657.056,765.222 674.5,754.5C 726.167,795.167 777.833,835.833 829.5,876.5C 762.129,936.339 683.462,972.839 593.5,986C 437.233,1008.45 300.566,967.451 183.5,863C 141.888,823.583 108.222,778.416 82.5,727.5C 135.857,685.482 189.523,643.815 243.5,602.5 Z"></path></g></svg></a></div>]]></content:encoded>
            <category>梦</category>
            <category>记录</category>
        </item>
    </channel>
</rss>