<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>Rocky‘s Blog</title>
    <subtitle>月更 技术博客 CXX优先</subtitle>
    <link rel="self" type="application/atom+xml" href="https://suchaharcan.github.io/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-10-21T00:00:00+00:00</updated>
    <id>https://suchaharcan.github.io/atom.xml</id>
    <entry xml:lang="en">
        <title>求真 求实</title>
        <published>2026-10-21T00:00:00+00:00</published>
        <updated>2026-10-21T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_Essay/qiu-zhen-qiu-shi/"/>
        <id>https://suchaharcan.github.io/01Write_blog_Essay/qiu-zhen-qiu-shi/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_Essay/qiu-zhen-qiu-shi/">&lt;p&gt;&lt;span style = &#39; font-size:20px;&#39;&gt; 谮言 并非是 空洞的 务虚的口号， 而是 一个人 踩过的坑&lt;/span&gt;，&lt;br/&gt;
&lt;strong&gt;或许 只有 亲身经历才能理解谮言本身的含义&lt;/strong&gt;，&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;span style = &#39; color:red; font-size:26px;&#39;&gt; 人教人教不会，事教人一遍就成。 人只能教谮言， 但谮言本身的含义需要受教人亲自去领会才可以 ；&lt;/span&gt; &lt;br/&gt; &lt;br/&gt; &lt;br/&gt;
再多的言语 和 再多的细节 都是苍白无力的，在这之前，求真求实 是 受教人的基础，也是尽可能的降低受损；&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;狂妄自负 在清醒后的代价 ，在领悟谮言后 会变得 可笑 &lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自己 拥有过的，自己亲眼见过的 才可宣之于口， 吹嘘 就是一种虚荣的表现， 在 恋人 朋友之前 吹嘘
能带来什么呢？ 什么都不会有，因为时间的暴露你的本质，恋人朋友迟早会直到你的本质
但 惧怕暴露 并非是 拒绝虚荣的理由，与其说 拒绝虚荣，不如 直面自己来的正当 ；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;—— 记 失恋后 反思自己过错的 小总结&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-10-20T12:00:00+00:00</published>
        <updated>2026-10-20T12:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-10-20t12-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-10-20t12-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-10-20t12-00-00z/">&lt;p&gt;2026年10月20日 20:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;rss-atom-ding-yue-zhi-jian-bu-fen-wen-zhang-shua-bu-chu-xin-wen-gen-yin-ding-wei-yu-xiu-fu-fang-an&quot;&gt;RSS/Atom 订阅只见部分文章、刷不出新文：根因定位与修复方案&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮排查「订阅后仅获取部分文章、且无法刷新获取后续新增文章」的问题。结论是：&lt;strong&gt;不是订阅器不刷新，也不是 feed 没更新，而是站点没有全站 RSS/Atom，只有分板块 feed；而订阅入口只暴露了 Nanolog 和「Blog(01Write_blog)」两个板块，后者基本是空的，新文章都发在别的板块里，所以订阅者永远刷不到。&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;无全站 feed&lt;/strong&gt;：&lt;code&gt;zola.toml&lt;/code&gt; 只写了 &lt;code&gt;feed_filenames&lt;/code&gt;，缺 &lt;code&gt;generate_feeds = true&lt;/code&gt;，Zola 因此不生成根目录 &lt;code&gt;/atom.xml&lt;/code&gt;、&lt;code&gt;/rss.xml&lt;/code&gt;（线上 404）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;只有分板块 feed&lt;/strong&gt;：各板块 &lt;code&gt;_index.md&lt;/code&gt; 里 &lt;code&gt;generate_feeds = true&lt;/code&gt;，各自生成独立 feed；自动发现只暴露 &lt;code&gt;feed_sections&lt;/code&gt; 里声明的 Nanolog 与 Blog 两个板块；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;「Blog」板块几乎没文章&lt;/strong&gt;：&lt;code&gt;01Write_blog&lt;/code&gt; 实际只有 2 篇 6 月的测试文，长文分散在 CXX20 / Share / Debug / Math 等十几个板块；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新文都发在别的板块&lt;/strong&gt;：最近新增文章全部落在 &lt;code&gt;01Write_blog_CXX20&lt;/code&gt; 与 &lt;code&gt;03Share_blog&lt;/code&gt;，不在被订阅的板块里；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;加密文章被过滤&lt;/strong&gt;：&lt;code&gt;scripts/post-build.mjs&lt;/code&gt; 会把 &lt;code&gt;encrypt = true&lt;/code&gt; 的文章从 feed 与搜索索引中移除（当前约 8 篇）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-xian-xiang&quot;&gt;一、现象&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;订阅 RSS / Atom 之后，只能看到&lt;strong&gt;一部分&lt;/strong&gt;文章；&lt;/li&gt;
&lt;li&gt;之后站点持续更新，但订阅器&lt;strong&gt;刷新也拿不到新增文章&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;er-gen-yin-ding-wei&quot;&gt;二、根因定位&lt;/h2&gt;
&lt;h3 id=&quot;2-1-zhan-dian-ji-feed-cong-wei-sheng-cheng-zhu-yin&quot;&gt;2.1 站点级 feed 从未生成（主因）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;zola.toml&lt;/code&gt; 里只配置了：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;feed_filenames&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;atom.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;rss.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;但全文件没有 &lt;code&gt;generate_feeds = true&lt;/code&gt;。Zola 只有开了 &lt;code&gt;generate_feeds&lt;/code&gt; 才会生成根目录的 &lt;code&gt;atom.xml&lt;/code&gt; / &lt;code&gt;rss.xml&lt;/code&gt;。实测同版本 Zola（0.23.6）：不开该开关时构建产物里没有根 feed，线上 &lt;code&gt;https://suchaharcan.github.io/atom.xml&lt;/code&gt; 返回 &lt;strong&gt;404&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;2-2-shi-ji-cun-zai-de-zhi-you-fen-ban-kuai-feed-zi-dong-fa-xian-zhi-bao-lu-2-ge-ban-kuai&quot;&gt;2.2 实际存在的只有「分板块」feed，自动发现只暴露 2 个板块&lt;/h3&gt;
&lt;p&gt;主题 &lt;code&gt;partials/head.html&lt;/code&gt; 会按 &lt;code&gt;zola.toml&lt;/code&gt; 的 &lt;code&gt;feed_sections&lt;/code&gt; 输出订阅链接，目前只有：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名称&lt;/th&gt;&lt;th&gt;板块&lt;/th&gt;&lt;th&gt;feed 地址&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Nanolog&lt;/td&gt;&lt;td&gt;&lt;code&gt;@/nanolog/_index.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/nanolog/atom.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Blog&lt;/td&gt;&lt;td&gt;&lt;code&gt;@/01Write_blog/_index.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/01Write_blog/atom.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;于是从首页点订阅，只能选到这两个之一。而 &lt;code&gt;generate_feeds = true&lt;/code&gt; 的板块其实有十几个，每个板块各自生成独立 feed。&lt;/p&gt;
&lt;h3 id=&quot;2-3-bei-dang-zuo-blog-de-01write-blog-ban-kuai-ji-hu-mei-you-wen-zhang&quot;&gt;2.3 被当作「Blog」的 01Write_blog 板块几乎没有文章&lt;/h3&gt;
&lt;p&gt;线上 &lt;code&gt;/01Write_blog/atom.xml&lt;/code&gt; 实际只有 2 条，都是 6 月的测试文（&lt;code&gt;One&lt;/code&gt;、&lt;code&gt;Third&lt;/code&gt;）。真正的长文全部分散在：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;板块&lt;/th&gt;&lt;th&gt;文章数&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;03Share_blog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;15&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;00Read_blog_Math&lt;/code&gt;&lt;/td&gt;&lt;td&gt;8&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;00Read_blog_English&lt;/code&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;02Engineer_blog_Debug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;7&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;01Write_blog_CXX20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;01Write_blog_CMake&lt;/code&gt; / &lt;code&gt;01Write_blog_AlgorithmDesign&lt;/code&gt;&lt;/td&gt;&lt;td&gt;各 5&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;其余写作子板块&lt;/td&gt;&lt;td&gt;各 1–2&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-4-xin-wen-zhang-qia-hao-du-fa-zai-mei-bei-ding-yue-de-ban-kuai&quot;&gt;2.4 新文章恰好都发在「没被订阅」的板块&lt;/h3&gt;
&lt;p&gt;最近一次提交 &lt;code&gt;Create New Blogs And Update Old Blogs&lt;/code&gt; 的新增文章全部落在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;01Write_blog_CXX20/2026-10-15-CMake&lt;/code&gt;、&lt;code&gt;2026-10-15-Markdown&lt;/code&gt;、&lt;code&gt;2026-10-15-Zola-Blog&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;03Share_blog/2026-10-15-ASCII-Mac&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这些板块既不在自动发现列表里，也和用户订阅的 Nanolog / Blog 无关。所以即使部署成功、对应板块 feed 也更新了，订阅器刷新时依旧一个「新文章」都看不到。&lt;/p&gt;
&lt;h3 id=&quot;2-5-jia-mi-wen-zhang-bei-zhu-dong-ti-chu&quot;&gt;2.5 加密文章被主动剔除&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;scripts/post-build.mjs&lt;/code&gt; 会把所有 &lt;code&gt;encrypt = true&lt;/code&gt; 的文章从 feed 与搜索索引中过滤掉（约 8 篇），这是设计行为（正文加密，feed 不放明文），也让「部分文章缺失」更明显。&lt;/p&gt;
&lt;h2 id=&quot;san-xiu-fu-fang-an&quot;&gt;三、修复方案&lt;/h2&gt;
&lt;h3 id=&quot;fang-an-a-tui-jian-yi-bu-dao-wei-sheng-cheng-quan-zhan-feed&quot;&gt;方案 A（推荐，一步到位）：生成全站 feed&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;zola.toml&lt;/code&gt; 顶层补一行：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;generate_feeds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;feed_filenames&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;atom.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;rss.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样根目录会生成 &lt;code&gt;/atom.xml&lt;/code&gt; 与 &lt;code&gt;/rss.xml&lt;/code&gt;，收录&lt;strong&gt;全站所有带 &lt;code&gt;date&lt;/code&gt; 的文章&lt;/strong&gt;（跨板块，按日期倒序）。本地已用同版本 Zola 验证：开启后根 feed 同时包含不同板块的文章。订阅者只需订阅这一个地址即可收到全站更新。&lt;/p&gt;
&lt;h3 id=&quot;fang-an-b-kuo-chong-zi-dong-fa-xian-de-ban-kuai&quot;&gt;方案 B：扩充自动发现的板块&lt;/h3&gt;
&lt;p&gt;把真正在更新的板块补进 &lt;code&gt;feed_sections&lt;/code&gt;，例如：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;feed_sections&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Nanolog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/nanolog/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Blog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/01Write_blog/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CXX20&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/01Write_blog_CXX20/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Share&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/03Share_blog/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;首页订阅入口会相应多出这些板块的 feed 链接，但订阅者仍需分别订阅每个关心的板块。&lt;/p&gt;
&lt;h3 id=&quot;fang-an-c-ding-yue-zhe-ce-lin-shi-ban-fa&quot;&gt;方案 C（订阅者侧临时办法）&lt;/h3&gt;
&lt;p&gt;直接订阅具体板块的 feed，例如：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;https://suchaharcan.github.io/01Write_blog_CXX20/atom.xml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;https://suchaharcan.github.io/03Share_blog/atom.xml&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;si-zhu-yi&quot;&gt;四、注意&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;全站 feed 只收录&lt;strong&gt;带 &lt;code&gt;date&lt;/code&gt; 字段&lt;/strong&gt;、且未被 &lt;code&gt;include_in_feeds = false&lt;/code&gt; 排除的文章；&lt;code&gt;design&lt;/code&gt;、&lt;code&gt;kanban&lt;/code&gt; 等无 &lt;code&gt;date&lt;/code&gt; 的页面不会进入 feed；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;encrypt = true&lt;/code&gt; 的文章仍会被 &lt;code&gt;scripts/post-build.mjs&lt;/code&gt; 过滤，这是加密功能的设计行为；&lt;/li&gt;
&lt;li&gt;新增文章后需触发一次构建/部署，feed 才会更新（CI 已在每次推送时自动构建部署）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/&quot;&gt;首页&lt;/a&gt; · &lt;a href=&quot;/nanolog/&quot;&gt;Nanolog 列表&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine&quot;&gt;Ametrine 主题&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake</title>
        <published>2026-10-15T00:00:00+00:00</published>
        <updated>2026-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CXX20/cmake/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CXX20/cmake/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CXX20/cmake/">&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;定期更新 该博客&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;总结CMake常用命令之前，先明确为什么要使用CMake?&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;C++ 源码 编译链接 的原理， 在代码膨胀 到多文件， 项目复杂度，代码文件管理难度 ，跨平台等问题， 需要一个 更智能 更现代的 构建工具。 因为以上的问题和缺陷，所以需要CMake;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rmbuild&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ..&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 并行构建&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Markdown</title>
        <published>2026-10-15T00:00:00+00:00</published>
        <updated>2026-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CXX20/markdown/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CXX20/markdown/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CXX20/markdown/">&lt;blockquote&gt;
&lt;p&gt;`同步翻译 整理 Markdown 官方 和 其他优秀归纳文章即可&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;参考 &lt;a class=&quot;external&quot; rel=&quot;external&quot; title=&quot;博客布局 和 主题细节应用 推荐 优先参考&quot; href=&quot;https://daudix.one/&quot;&gt;Ametrine主题开发者本人网站&lt;/a&gt;， &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://tangled.org/daudix.one/daudix.one&quot;&gt;博客源码参照&lt;/a&gt;
而 主题内置的 样例博客可作为重要参考&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;对自身的要求仅是 熟练使用，无 迁移 晋升的 空间&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;markdown&quot;&gt;Markdown&lt;/h1&gt;
&lt;p&gt;Text can be &lt;strong&gt;bold&lt;/strong&gt;, &lt;em&gt;italic&lt;/em&gt;, &lt;del&gt;strikethrough&lt;/del&gt;, and &lt;em&gt;&lt;strong&gt;&lt;del&gt;all at the same time&lt;/del&gt;&lt;/strong&gt;&lt;/em&gt;. &lt;br/&gt;
&lt;a href=&quot;../cmake&quot;&gt;Link to another page&lt;/a&gt;&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-2-1&quot;&gt;&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fn-2&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id=&quot;biao-ti&quot;&gt;标题&lt;/h2&gt;
&lt;p&gt;There should be whitespace between paragraphs&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-1-1&quot;&gt;&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fn-1&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;| &lt;strong&gt;段落&lt;/strong&gt; |&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;要创建段落，请使用空行分隔一行或多行文本。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;换行&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;借助 Alfred 的快捷文本 &lt;code&gt;mkbr&lt;/code&gt;进行快速触发 &lt;code&gt;&amp;lt;br/&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;“Original content is original only for a few seconds before getting old”&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Rule #21 of the internet
&lt;strong&gt;加粗字体&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;**&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;yin-yong-kuai-white-check-mark&quot;&gt;引用块 ✅&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;嵌套引用块 &lt;code&gt;要创建引用块，请在段落前添加 &amp;gt;。&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;h2 id=&quot;yin-yong-kuai-ke-yi-qian-tao-zai-yao-qian-tao-de-duan-luo-qian-tian-jia&quot;&gt;引用块可以嵌套。在要嵌套的段落前添加 &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;。&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;包含其他元素的引用块&lt;/li&gt;
&lt;li&gt;引用块可以包含&lt;strong&gt;其他 Markdown 格式的元素&lt;/strong&gt;。&lt;code&gt;并非所有元素&lt;/code&gt;都可以使用——你需要进行实验以查看哪些元素有效。&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;Useful information that users should know, even when skimming content.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
&lt;p&gt;Helpful advice for doing things better or more easily.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-important&quot;&gt;
&lt;p&gt;Key information users need to know to achieve their goal.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-warning&quot;&gt;
&lt;p&gt;Urgent info that needs immediate user attention to avoid problems.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote class=&quot;markdown-alert-caution&quot;&gt;
&lt;p&gt;Advises about risks or negative outcomes of certain actions.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;有序列表&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;添加带有数字和句号的行项目。数字不必按数字顺序排列，但列表应从数字一开头。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;无序列表&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在行项目前添加破折号 (-)、星号 (*) 或加号 (+)。&lt;br/&gt;
&lt;code&gt;缩进&lt;/code&gt;一个或多个项目以创建嵌套列表。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;为了兼容性，请不要在同一列表中&lt;code&gt;混合&lt;/code&gt;和匹配分隔符——选择一个并坚持使用它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;第一项&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第二项&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第三项&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;缩进项&lt;/li&gt;
&lt;li&gt;缩进项&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;第四项&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Item 1&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Item 2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Item 2.1&lt;/li&gt;
&lt;li&gt;Item 2.2&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Item 3&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;Item 4&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;Perform step #1&lt;/li&gt;
&lt;li&gt;Proceed to step #2&lt;/li&gt;
&lt;li&gt;Conclude with step #3&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Milk&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Eggs&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Flour&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Coffee&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Combustible lemons&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;要在列表中&lt;code&gt;添加另一个元素&lt;/code&gt;，同时保留列表的连续性，请将元素缩进四个空格或一个制表符，如下例所示。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;This is the first list item.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Here’s the second list item.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A blockquote would look great below the second list item.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;And here’s the third list item.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;代码&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;Character&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Show&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;Quotes&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Derpy Hooves&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;My Little Pony&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;I just don’t know what went wrong&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Gir&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Invader ZIM&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;GUESS WHO MADE WAAAAFFLES?!!&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;WALL-E&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;WALL-E&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Ooooo 0.0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;Taco&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;Inanimate Insanity&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;SOUR CREAM!&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;rust&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;let&lt;/span&gt;&lt;span&gt; highlight&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;scss&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;10&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;pre&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; mark&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;12&lt;/span&gt;&lt;span&gt;  display&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; block&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;13&lt;/span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; currentcolor&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;14&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;15&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;pre&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; table&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; td&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;nth-of-type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;17&lt;/span&gt;&lt;span&gt;  color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;6b6b6b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l z-l-hl z-d-hl&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;18&lt;/span&gt;&lt;span&gt;  font-style&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; italic&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span aria-hidden=&quot;true&quot; class=&quot;giallo-ln&quot;&gt;19&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;水平线 ✅&lt;/strong&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;单独的一行上使用三个或更多星号 (***)、破折号 (—) 或下划线 (___)&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-3-1&quot;&gt;&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fn-3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;components-zu-jian&quot;&gt;Components - 组件&lt;/h2&gt;
&lt;p&gt;Ametrine provides a few useful &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://keats.github.io/tera/#components&quot;&gt;components&lt;/a&gt; that simplify some tasks. They can be used on all pages.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;As of version 0.21.0, Zola supports &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://docs.github.com/en/get-started/writing-on-github/getting-started-with-writing-and-formatting-on-github/basic-writing-and-formatting-syntax#alerts&quot;&gt;GitHub flavored alerts&lt;/a&gt; natively, without this component. It can be enabled by adding the following to &lt;code&gt;zola.toml&lt;/code&gt;:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_alerts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;p&gt;Required variables are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;icon&lt;/code&gt;: Icon from &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://phosphoricons.com&quot;&gt;phosphoricons.com&lt;/a&gt; that will be used in the alert.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;title&lt;/code&gt;: Title of the alert.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Optional variables are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;color&lt;/code&gt;: Color that the alert should be colored into. Available colors are: &lt;code&gt;red&lt;/code&gt;, &lt;code&gt;orange&lt;/code&gt;, &lt;code&gt;yellow&lt;/code&gt;, &lt;code&gt;green&lt;/code&gt;, &lt;code&gt;blue&lt;/code&gt;, and &lt;code&gt;purple&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote
  class=&quot;markdown-alert-blue&quot;
  style=&quot;
    --alert-title: &#39;Fake Warning XD&#39;;
    --alert-icon: url(&#39;data:image/svg+xml,%3Csvg%20role%3D%22img%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2232%22%20height%3D%2232%22%20fill%3D%22currentColor%22%20viewBox%3D%220%200%20256%20256%22%3E%3Cpath%20d%3D%22M240.26%2C186.1%2C152.81%2C34.23h0a28.74%2C28.74%2C0%2C0%2C0-49.62%2C0L15.74%2C186.1a27.45%2C27.45%2C0%2C0%2C0%2C0%2C27.71A28.31%2C28.31%2C0%2C0%2C0%2C40.55%2C228h174.9a28.31%2C28.31%2C0%2C0%2C0%2C24.79-14.19A27.45%2C27.45%2C0%2C0%2C0%2C240.26%2C186.1Zm-20.8%2C15.7a4.46%2C4.46%2C0%2C0%2C1-4%2C2.2H40.55a4.46%2C4.46%2C0%2C0%2C1-4-2.2%2C3.56%2C3.56%2C0%2C0%2C1%2C0-3.73L124%2C46.2a4.77%2C4.77%2C0%2C0%2C1%2C8%2C0l87.44%2C151.87A3.56%2C3.56%2C0%2C0%2C1%2C219.46%2C201.8ZM116%2C136V104a12%2C12%2C0%2C0%2C1%2C24%2C0v32a12%2C12%2C0%2C0%2C1-24%2C0Zm28%2C40a16%2C16%2C0%2C1%2C1-16-16A16%2C16%2C0%2C0%2C1%2C144%2C176Z%22/%3E%3C/svg%3E&#39;);
  &quot;&gt;
  &lt;p&gt;Hi, I’m a fake custom alert.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;I’m a list with an &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://example.org&quot;&gt;inline&lt;/a&gt; link.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;lian-jie&quot;&gt;链接 ⭐&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;必须是英文引号 填充悬浮提示&lt;/code&gt; &lt;br/&gt;
添加标题
您可以选择为链接添加标题。当用户将鼠标悬停在链接上时，它将显示为工具提示。要添加标题，请在 URL 后用引号将其括起来。&lt;br/&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;eg: &lt;a class=&quot;external&quot; rel=&quot;external&quot; title=&quot;The best search engine for privacy&quot; href=&quot;https://duckduckgo.com&quot;&gt;Duck Duck Go&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;Duck Duck Go&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;https://duckduckgo.com&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;The best search engine for privacy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;Spotify&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;https://open.spotify.com/playlist/7zbBvAvpb9NJfkO0e7lJx3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;images-and-videos&quot;&gt;Images and Videos&lt;/h3&gt;
&lt;p&gt;By default images and videos come with some generic styling, such as rounded corners and shadow. To fine-tune these, you can use components with different argument combinations.&lt;/p&gt;
&lt;p&gt;Available variables are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;url&lt;/code&gt;: URL to an image.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;url_min&lt;/code&gt;: URL to compressed version of an image, original can be opened by clicking on the image.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;alt&lt;/code&gt;: Alt text, same as if the text were inside square brackets in Markdown.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;full&lt;/code&gt;: Forces image to be full-width.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;: Float image to the start of paragraph and scale it down.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;end&lt;/code&gt;: Float image to the end of paragraph and scale it down.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pixels&lt;/code&gt;: Uses nearest neighbor algorithm for scaling, useful for keeping pixel-art sharp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;has_alpha&lt;/code&gt;: Removes rounded corners and shadow, useful for images with transparency.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;drop_shadow&lt;/code&gt;: Uses drop shadow instead of box shadow, useful for images with transparency.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no_hover&lt;/code&gt;: Removes zoom on hover. 悬停取消缩放&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spoiler&lt;/code&gt;: Blurs image until hovered over/pressed on, useful for plot rich game screenshots. 模糊图像，直到悬停/点击 适用 内容丰富敏感的内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;spoiler&lt;/code&gt; with &lt;code&gt;solid&lt;/code&gt;: Ditto, but makes the image completely hidden.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;span&gt; src&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;graph.png&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; alt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;This is an image&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;no-hover&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;image src=&quot;graph.png&quot; alt=&quot;This is an image&quot; class=&quot;no-hover&quot;/&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img
class=&quot;no-hover&quot;
alt=&quot;Portal Gun blueprint&quot;
src=&quot;https://i1.theportalwiki.net/img/2/23/Ashpd_blueprint.jpg&quot;
 /&gt;&lt;/p&gt;
&lt;figcaption&gt;Image with an alt text and without zoom on hover&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;a href=&quot;https://upload.wikimedia.org/wikipedia/commons/b/b4/JPEG_example_JPG_RIP_100.jpg&quot;&gt;
&lt;img
class=&quot;no-hover&quot;
alt=&quot;The gravestone of J.P.G.&quot;
src=&quot;https://upload.wikimedia.org/wikipedia/commons/3/38/JPEG_example_JPG_RIP_010.jpg&quot;
 /&gt;
&lt;/a&gt;
&lt;figcaption&gt;Image with compressed version, an alt text, and without zoom on hover&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;p&gt;&lt;img
class=&quot;spoiler&quot;
alt=&quot;Portal Gun blueprint&quot;
src=&quot;https://files.catbox.moe/lk7nee.jpg&quot;
 /&gt;&lt;/p&gt;
&lt;figcaption&gt;Image with an alt text, hidden behind a spoiler&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;p&gt;Alternatively, you can append the following URL anchors. It can be more handy in some cases, e.g. such images will render normally in any Markdown editor, opposed to the Zola components.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;#full&lt;/code&gt;: Forces image to be full-width.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#start&lt;/code&gt;: Float image to the start of paragraph and scale it down.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#end&lt;/code&gt;: Float image to the end of paragraph and scale it down.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#pixels&lt;/code&gt;: Uses nearest neighbor algorithm for scaling, useful for keeping pixel-art sharp.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#has-alpha&lt;/code&gt;: Removes rounded corners and shadow, useful for images with transparency.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#drop-shadow&lt;/code&gt;: Uses drop shadow instead of box shadow, useful for images with transparency.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#no-hover&lt;/code&gt;: Removes zoom on hover.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#spoiler&lt;/code&gt;: Blurs image until hovered over/pressed on, useful for plot rich game screenshots.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#spoiler&lt;/code&gt; with &lt;code&gt;#solid&lt;/code&gt;: Ditto, but makes the image completely hidden.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;figure&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://containertoolbx.org&quot;&gt;&lt;img src=&quot;https://containertoolbx.org/assets/toolbx.gif#full#pixels#has-alpha#drop-shadow#no-hover&quot; alt=&quot;Toolbx header image&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;figcaption&gt;Full-width image with an alt text, pixel-art rendering, drop shadow, and with no rounded corners and zoom on hover&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;br /&gt;
&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/6/65/2005_Ford_Mustang_V6_Premium_Convertible.jpg/330px-2005_Ford_Mustang_V6_Premium_Convertible.jpg#start&quot; alt=&quot;2005 Ford Mustang V6 Premium Convertible&quot; /&gt;
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magnam aliquam quaerat voluptatem. Ut enim aeque doleamus animo, cum corpore dolemus, fieri tamen permagna accessio potest, si aliquod aeternum et infinitum impendere malum nobis opinemur.&lt;/p&gt;
&lt;p&gt;For videos it’s all the same except for a few differences: &lt;code&gt;no_hover&lt;/code&gt; and &lt;code&gt;url_min&lt;/code&gt; variables are not available.&lt;/p&gt;
&lt;p&gt;Additionally, the following &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://developer.mozilla.org/en-US/docs/Web/HTML/Element/video#attributes&quot;&gt;attributes&lt;/a&gt; can be set:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;autoplay&lt;/code&gt;: Start playing the video automatically.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;controls&lt;/code&gt;: Display video controls such as volume control, seeking and pause/resume.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;loop&lt;/code&gt;: Play the video again once it ends.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;muted&lt;/code&gt;: Turn off the audio by default.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;playsinline&lt;/code&gt;: Prevent the video from playing in fullscreen by default (depends on the browser).&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;video&lt;/span&gt;&lt;span&gt; sources&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;video.webm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span&gt; alt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;This is a video&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; controls&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure&gt;
&lt;video preload=&quot;auto&quot; aria-title=&quot;Duckling preening&quot; controls&gt;
&lt;source src=&quot;https://upload.wikimedia.org/wikipedia/commons/transcoded/0/0e/Duckling_preening_%2881313%29.webm/Duckling_preening_%2881313%29.webm.720p.vp9.webm&quot; type=&quot;video/webm&quot;&gt;
&lt;/video&gt;
&lt;figcaption&gt;Duckling preening&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure&gt;
&lt;video preload=&quot;auto&quot; aria-title=&quot;Duckling preening&quot; controls&gt;
&lt;source src=&quot;https://player.bilibili.com/player.html?isOutside=true&amp;aid=117215848307384&amp;bvid=BV1gRtk6CEry&amp;cid=41595440421&amp;p=1&amp;high_quality=1&quot; type=&quot;video/html?isOutside=true&amp;aid=117215848307384&amp;bvid=BV1gRtk6CEry&amp;cid=41595440421&amp;p=1&amp;high_quality=1&quot;&gt;
&lt;/video&gt;
&lt;figcaption&gt;Duckling preening&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;iframe src=&quot;//player.bilibili.com/player.html?isOutside=true&amp;aid=117215848307384&amp;bvid=BV1gRtk6CEry&amp;cid=41595440421&amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/iframe&gt;
&lt;h3 id=&quot;crt&quot;&gt;CRT&lt;/h3&gt;
&lt;p&gt;Alright, this one doesn’t simplify anything, it just puts ASCII art into a CRT-like box.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;As this element is intended to be purely decorative (e.g. for displaying ASCII art), it is hidden from screen readers unless a &lt;code&gt;label&lt;/code&gt; is supplied. Ensure that no vital content is wrapped in it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;crt&lt;/span&gt;&lt;span&gt; label&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;ASCII illustration of public library halls.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;-&amp;gt; ASCII art &amp;lt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;crt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;crt&quot;  role=&quot;img&quot; aria-label=&quot;ASCII illustration of public library halls.&quot;&gt;&lt;code aria-hidden=&quot;true&quot;&gt;&lt;span&gt;
---

|.&#39;&#39;, Public_Library_Halls ,&#39;&#39;.|
|.&#39;.&#39;&#39;, ,&#39;&#39;.&#39;.|
|.&#39;.&#39;.&#39;&#39;, ,&#39;&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;&#39;, ,&#39;&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.| |.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|===; ;===|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|:::|&#39;, ,&#39;|:::|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|---|&#39;.|, _______ ,|.&#39;|---|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|:::|&#39;.|&#39;|???????|&#39;|.&#39;|:::|.&#39;.&#39;.&#39;.&#39;.|
|,&#39;,&#39;,&#39;,&#39;,|---|&#39;,|&#39;|???????|&#39;|,&#39;|---|,&#39;,&#39;,&#39;,&#39;,|
|.&#39;.&#39;.&#39;.&#39;.|:::|&#39;.|&#39;|???????|&#39;|.&#39;|:::|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|---|&#39;,&#39; /%%%\ &#39;,&#39;|---|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|===:&#39; /%%%%%\ &#39;:===|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;.|%%%%%%%%%%%%%%%%%%%%%%%%%|.&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;.&#39;,&#39; /%%%%%%%%%\ &#39;,&#39;.&#39;.&#39;.&#39;.|
|.&#39;.&#39;.&#39;,&#39; /%%%%%%%%%%%\ &#39;,&#39;.&#39;.&#39;.|
|.&#39;.&#39;,&#39; /%%%%%%%%%%%%%\ &#39;,&#39;.&#39;.|
|.&#39;,&#39; /%%%%%%%%%%%%%%%\ &#39;,&#39;.|
|;________****/%%%%%Spicer%%%%%%\_****_______;|
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Alternatively, if you have &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.getzola.org/documentation/content/syntax-highlighting/&quot;&gt;syntax highlighting&lt;/a&gt; enabled and you need to preserve whitespace, you can use a code block with &lt;code&gt;crt=true&lt;/code&gt; added right after three backticks.&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;The downside of this approach is that it will keep the ASCII art accessible to screen readers, which is bad for accessebility. Whitespace issue should hopefully be fixed with the release of Zola 0.23.0. See &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine/issues/116&quot;&gt;#116&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;```crt=true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  /\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; /  \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/____\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;```&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot; data-crt=&quot;true&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  /\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; /  \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/____\&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;audio&quot;&gt;Audio&lt;/h3&gt;
&lt;p&gt;Places a useless audio button with a funny hover animation. Needs &lt;code&gt;extra.audio_button&lt;/code&gt; to be enabled on page, section, or config level for it to work.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;audio&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Party!&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;party-horn.mp3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Hi everyone! You know what I like doing? That’s right, throwing
&lt;button class=&quot;audio&quot; data-audio=&quot;party-horn.mp3&quot;&gt;Parties&lt;i class=&quot;icon speaker-high&quot; style=&quot;--icon: url(&#39;data:image/svg+xml,%3Csvg%20role%3D%22img%22%20xmlns%3D%22http%3A//www.w3.org/2000/svg%22%20width%3D%2232%22%20height%3D%2232%22%20fill%3D%22currentColor%22%20viewBox%3D%220%200%20256%20256%22%3E%3Cpath%20d%3D%22M157.27%2C21.22a12%2C12%2C0%2C0%2C0-12.64%2C1.31L75.88%2C76H32A20%2C20%2C0%2C0%2C0%2C12%2C96v64a20%2C20%2C0%2C0%2C0%2C20%2C20H75.88l68.75%2C53.47A12%2C12%2C0%2C0%2C0%2C164%2C224V32A12%2C12%2C0%2C0%2C0%2C157.27%2C21.22ZM36%2C100H68v56H36Zm104%2C99.46L92%2C162.13V93.87l48-37.33ZM212%2C128a44%2C44%2C0%2C0%2C1-11%2C29.11%2C12%2C12%2C0%2C1%2C1-18-15.88%2C20%2C20%2C0%2C0%2C0%2C0-26.43%2C12%2C12%2C0%2C0%2C1%2C18-15.86A43.94%2C43.94%2C0%2C0%2C1%2C212%2C128Zm40%2C0a83.87%2C83.87%2C0%2C0%2C1-21.39%2C56%2C12%2C12%2C0%2C0%2C1-17.89-16%2C60%2C60%2C0%2C0%2C0%2C0-80%2C12%2C12%2C0%2C1%2C1%2C17.88-16A83.87%2C83.87%2C0%2C0%2C1%2C252%2C128Z%22/%3E%3C/svg%3E&#39;);&quot;&gt;&lt;/i&gt;&lt;/button&gt;
! Actually I don’t I just wanted to show off audio button.&lt;/p&gt;
&lt;h3 id=&quot;youtube&quot;&gt;YouTube&lt;/h3&gt;
&lt;p&gt;Allows to embed a YouTube video using youtube-nocookie.&lt;/p&gt;
&lt;p&gt;Available variables are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;autoplay&lt;/code&gt;: Whether the video should autoplay.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;start&lt;/code&gt;: On which second video should start.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;youtube&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0Da8ZhKcNKQ&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;iframe
  class=&quot;youtube-embed&quot;
  src=&quot;https://www.youtube-nocookie.com/embed/0Da8ZhKcNKQ&quot;
  allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot;
  referrerpolicy=&quot;strict-origin-when-cross-origin&quot; allowfullscreen&gt;
&lt;/iframe&gt;
&lt;h3 id=&quot;vimeo&quot;&gt;Vimeo&lt;/h3&gt;
&lt;p&gt;Allows to embed a Vimeo video.&lt;/p&gt;
&lt;p&gt;Available variables are:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;autoplay&lt;/code&gt;: Whether the video should autoplay.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;vimeo&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;869483483&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; }}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;iframe
  class=&quot;vimeo-embed&quot;
  src=&quot;https://player.vimeo.com/video/869483483&quot;
  allow=&quot;autoplay; fullscreen; picture-in-picture&quot;
  allowfullscreen&gt;
&lt;/iframe&gt;
&lt;h3 id=&quot;bilibili&quot;&gt;BiliBili&lt;/h3&gt;
&lt;blockquote class=&quot;markdown-alert-important&quot;&gt;
&lt;p&gt;[!NOTE]
B站版本的视频调用方式我要仿写实现&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;overflow-auto&quot;&gt;Overflow Auto&lt;/h3&gt;
&lt;p&gt;Sometimes, an element gets too wide, and it’s not possible to make it adaptive in any sensible way (think tables), this is when this component comes in.&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;overflow_auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Table (for example)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;overflow_auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Accepts either of the two optional arguments:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;overshoot&lt;/code&gt;: Adds a vertical overshoot, to make the cutoff visually nicer.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;overshoot_row&lt;/code&gt;: Ditto, but horizontal.&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;jinja&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt;overflow_auto&lt;/span&gt;&lt;span&gt; overshoot_row&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| #   | Song                          | Artist        | Duration | Popularity | Genres | Year | Added      |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| --- | ----------------------------- | ------------- | -------- | ---------- | ------ | ---- | ---------- |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| 1   | Good Morning                  | gifting guide | 03:22    | 2          |        | 2025 | 2026-01-30 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| 2   | On Little Cat Feet            | Nightmargin   | 02:35    | 46         |        | 2016 | 2025-12-21 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;| 3   | Take Responsibility (Hear Me) | Koa           | 03:25    | 11         |        | 2024 | 2025-12-21 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;overflow_auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; %}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;overflow-auto overshoot-row&quot;&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;Song&lt;/th&gt;&lt;th&gt;Artist&lt;/th&gt;&lt;th&gt;Duration&lt;/th&gt;&lt;th&gt;Popularity&lt;/th&gt;&lt;th&gt;Genres&lt;/th&gt;&lt;th&gt;Year&lt;/th&gt;&lt;th&gt;Added&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;Good Morning&lt;/td&gt;&lt;td&gt;gifting guide&lt;/td&gt;&lt;td&gt;03:22&lt;/td&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2025&lt;/td&gt;&lt;td&gt;2026-01-30&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;On Little Cat Feet&lt;/td&gt;&lt;td&gt;Nightmargin&lt;/td&gt;&lt;td&gt;02:35&lt;/td&gt;&lt;td&gt;46&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2016&lt;/td&gt;&lt;td&gt;2025-12-21&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;Take Responsibility (Hear Me)&lt;/td&gt;&lt;td&gt;Koa&lt;/td&gt;&lt;td&gt;03:25&lt;/td&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;2024&lt;/td&gt;&lt;td&gt;2025-12-21&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id=&quot;description-list&quot;&gt;Description List&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Something&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;And its description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;dl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;dl&gt;
&lt;dt&gt;Name&lt;/dt&gt;
&lt;dd&gt;Godzilla&lt;/dd&gt;
&lt;dt&gt;Born&lt;/dt&gt;
&lt;dd&gt;1952&lt;/dd&gt;
&lt;dt&gt;Birthplace&lt;/dt&gt;
&lt;dd&gt;Japan&lt;/dd&gt;
&lt;dt&gt;Color&lt;/dt&gt;
&lt;dd&gt;Green&lt;/dd&gt;
&lt;/dl&gt;
&lt;h2 id=&quot;form-input&quot;&gt;Form Input&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
  &lt;li&gt;
    &lt;input type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Milk&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Eggs&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Flour&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;checkbox&quot; checked /&gt;
    &lt;label&gt;Coffee&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;checkbox&quot; disabled /&gt;
    &lt;label&gt;Combustible lemons&lt;/label&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With &lt;code&gt;switch&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;switch&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Milk&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Eggs&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Flour&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch&quot; type=&quot;checkbox&quot; checked /&gt;
    &lt;label&gt;Coffee&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch&quot; type=&quot;checkbox&quot; disabled /&gt;
    &lt;label&gt;Combustible lemons&lt;/label&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With &lt;code&gt;switch&lt;/code&gt; and &lt;code&gt;big&lt;/code&gt; classes:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;switch big&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Checkbox&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch big&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Milk&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch big&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Eggs&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch big&quot; type=&quot;checkbox&quot; /&gt;
    &lt;label&gt;Flour&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch big&quot; type=&quot;checkbox&quot; checked /&gt;
    &lt;label&gt;Coffee&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input class=&quot;switch big&quot; type=&quot;checkbox&quot; disabled /&gt;
    &lt;label&gt;Combustible lemons&lt;/label&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With &lt;code&gt;radio&lt;/code&gt; type:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;radio&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;test&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Radio&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;ul&gt;
  &lt;li&gt;
    &lt;input type=&quot;radio&quot; name=&quot;test&quot; /&gt;
    &lt;label&gt;Milk&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;radio&quot; name=&quot;test&quot; /&gt;
    &lt;label&gt;Eggs&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;radio&quot; name=&quot;test&quot; /&gt;
    &lt;label&gt;Flour&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;radio&quot; name=&quot;test&quot; checked /&gt;
    &lt;label&gt;Coffee&lt;/label&gt;
  &lt;/li&gt;
  &lt;li&gt;
    &lt;input type=&quot;radio&quot; name=&quot;test&quot; disabled /&gt;
    &lt;label&gt;Combustible lemons&lt;/label&gt;
  &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With &lt;code&gt;color&lt;/code&gt; type:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Color:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;label&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#000000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;label for=&quot;color&quot;&gt;Color:&lt;/label&gt;
&lt;input id=&quot;color&quot; type=&quot;color&quot; value=&quot;#b57edc&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;label for=&quot;color&quot;&gt;Disabled:&lt;/label&gt;
&lt;input id=&quot;color&quot; type=&quot;color&quot; value=&quot;#b57edc&quot; disabled /&gt;&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;range&lt;/code&gt; type:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;input&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; max&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;33&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; /&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;input type=&quot;range&quot; max=&quot;100&quot; value=&quot;33&quot; id=&quot;range&quot;&gt;
&lt;!-- For the demo purposes only --&gt;
&lt;small id=&quot;range-value&quot;&gt;&lt;/small&gt;
&lt;!-- End --&gt;
&lt;h2 id=&quot;figure-captions&quot;&gt;Figure Captions&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&amp;gt; Whatever content &amp;lt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;figcaption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Caption of content above&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;figcaption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;figure&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;figure&gt;
&lt;p&gt;&lt;img src=&quot;https://i.ibb.co/MPDJRsT/ImMAXM3.png&quot; alt=&quot;The Office&quot; /&gt;&lt;/p&gt;
  &lt;figcaption&gt;The Office where Stanley works, it has yellow floor and beige walls&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;h2 id=&quot;accordion&quot;&gt;Accordion&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Accordion title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;summary&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&amp;gt; Contents here &amp;lt;-&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;details&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;details&gt;
  &lt;summary&gt;Reveal accordion&lt;/summary&gt;
&lt;p&gt;Get it? I know, it’s an awful pun.
&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/1/1b/PianoAccordeon.jpg/916px-PianoAccordeon.jpg#has-alpha#no-hover&quot; alt=&quot;Piano Accordion&quot; /&gt;&lt;/p&gt;
&lt;/details&gt;
&lt;h2 id=&quot;side-comment&quot;&gt;Side Comment&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;small&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Small, cute text that doesn&amp;#39;t catch attention.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;small&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;small&gt;Small, cute text that doesn’t catch attention.&lt;/small&gt;&lt;/p&gt;
&lt;h2 id=&quot;abbreviation&quot;&gt;Abbreviation&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;abbr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;American Standard Code for Information Interchange&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;ASCII&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;abbr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The &lt;abbr title=&quot;American Standard Code for Information Interchange&quot;&gt;ASCII&lt;/abbr&gt; art is awesome!&lt;/p&gt;
&lt;h2 id=&quot;aside&quot;&gt;Aside&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;aside&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;-&amp;gt; Contents here &lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;aside&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;aside&gt;
&lt;p&gt;Quill and a parchment&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/thumb/b/b9/%D7%A7%D7%9C%D7%A3%2C_%D7%A0%D7%95%D7%A6%D7%94_%D7%95%D7%93%D7%99%D7%95.jpg/326px-%D7%A7%D7%9C%D7%A3%2C_%D7%A0%D7%95%D7%A6%D7%94_%D7%95%D7%93%D7%99%D7%95.jpg&quot; alt=&quot;Quill and a parchment&quot; /&gt;&lt;/p&gt;
&lt;/aside&gt;
&lt;p&gt;A quill is a writing tool made from a moulted flight feather (preferably a primary wing-feather) of a large bird. Quills were used for writing with ink before the invention of the dip pen, the metal-nibbed pen, the fountain pen, and, eventually, the ballpoint pen.&lt;/p&gt;
&lt;p&gt;As with the earlier reed pen (and later dip pen), a quill has no internal ink reservoir and therefore needs to periodically be dipped into an inkwell during writing. The hand-cut goose quill is rarely used as a calligraphy tool anymore because many papers are now derived from wood pulp and would quickly wear a quill down. However it is still the tool of choice for a few scribes who have noted that quills provide an unmatched sharp stroke as well as greater flexibility than a steel pen.&lt;/p&gt;
&lt;h2 id=&quot;keyboard-input&quot;&gt;Keyboard Input&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;kbd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;⌘ Command&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;kbd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;To switch the keyboard layout, press &lt;kbd&gt;⌘ Super&lt;/kbd&gt; + &lt;kbd&gt;Space&lt;/kbd&gt;.&lt;/p&gt;
&lt;h2 id=&quot;mark-text&quot;&gt;Mark Text&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Marked text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;mark&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You know what? I’m gonna say some &lt;mark&gt;very important&lt;/mark&gt; stuff, so &lt;mark&gt;important&lt;/mark&gt; that even &lt;strong&gt;bold&lt;/strong&gt; is not enough.&lt;/p&gt;
&lt;h2 id=&quot;deleted-and-inserted-text&quot;&gt;Deleted and Inserted Text&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;del&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Something deleted&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;del&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;ins&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Something added&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;ins&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;del&gt;Text deleted&lt;/del&gt; &lt;ins&gt;Text added&lt;/ins&gt;&lt;/p&gt;
&lt;h2 id=&quot;progress-indicator&quot;&gt;Progress Indicator&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;33&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; max&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;100&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;progress&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;progress&gt;&lt;/progress&gt;
&lt;progress value=&quot;33&quot; max=&quot;100&quot;&gt;&lt;/progress&gt;&lt;/p&gt;
&lt;h2 id=&quot;sample-output&quot;&gt;Sample Output&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;samp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Sample Output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;samp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;samp&gt;Sample Output&lt;/samp&gt;&lt;/p&gt;
&lt;h2 id=&quot;inline-quotation&quot;&gt;Inline Quotation&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Someone said something&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;q&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Blah blah &lt;q&gt;Inline Quote&lt;/q&gt; hmm.&lt;/p&gt;
&lt;h2 id=&quot;unarticulated-annotation&quot;&gt;Unarticulated Annotation&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Gmarrar mitsakes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;u&gt;Yeet&lt;/u&gt; the &lt;u&gt;sus&lt;/u&gt; drip while &lt;u&gt;vibing&lt;/u&gt; with the &lt;u&gt;TikTok&lt;/u&gt; &lt;u&gt;fam&lt;/u&gt; on a cap-free boomerang.&lt;/p&gt;
&lt;h2 id=&quot;titles&quot;&gt;Titles&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;strong&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Title-Looking Text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;strong&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong class=&quot;title&quot;&gt;Title-Looking Text&lt;/strong&gt;&lt;/p&gt;
&lt;h2 id=&quot;external-links&quot;&gt;External Links&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;external&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://example.org&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;External link&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; href=&quot;https://example.org&quot;&gt;Link to site&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;spoilers&quot;&gt;Spoilers&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;spoiler&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Some spoiler&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You know, &lt;span class=&quot;spoiler&quot;&gt;Ametrines are very pretty.&lt;/span&gt; I know, crazy.&lt;/p&gt;
&lt;p&gt;With &lt;code&gt;solid&lt;/code&gt; class:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;spoiler solid&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Some spoiler&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;span&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;You know, &lt;span class=&quot;spoiler solid&quot;&gt;Ametrines are very pretty.&lt;/span&gt; I know, crazy.&lt;/p&gt;
&lt;h2 id=&quot;buttons&quot;&gt;Buttons&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;buttons&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#top&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Go to Top&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;suggested external&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://example.org&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Example&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;buttons&quot;&gt;
  &lt;a href=&quot;#top&quot;&gt;Go to Top&lt;/a&gt;
  &lt;a class=&quot;suggested external&quot; href=&quot;https://example.org&quot;&gt;Example&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;With &lt;code&gt;centered&lt;/code&gt; and &lt;code&gt;big&lt;/code&gt; classes:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;buttons centered big&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;suggested&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Do Something…&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;div&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;buttons centered big&quot;&gt;
  &lt;button class=&quot;suggested&quot;&gt;Do Something…&lt;/button&gt;
&lt;/div&gt;
&lt;p&gt;Standalone:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;suggested&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Do Something…&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;button external&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://example.org&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Example&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;button class=&quot;suggested&quot;&gt;Do Something…&lt;/button&gt;
&lt;a class=&quot;button external&quot; href=&quot;https://example.org&quot;&gt;Example&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Disabled:&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; disabled&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;suggested&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;Do Something…&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; aria-disabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;button external&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://example.org&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;gt;&lt;/span&gt;&lt;span&gt;Example&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;button disabled class=&quot;suggested&quot;&gt;Do Something…&lt;/button&gt;
&lt;a aria-disabled=&quot;true&quot; class=&quot;button external&quot; href=&quot;https://example.org&quot;&gt;Example&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;accent-color&quot;&gt;Accent Color&lt;/h2&gt;
&lt;p&gt;For demo purposes only, usually it should be changed from the config file.&lt;/p&gt;
&lt;!-- For the demo purposes only --&gt;
&lt;input type=&quot;range&quot; max=&quot;360&quot; value=&quot;0&quot; id=&quot;range-h&quot; class=&quot;hollow&quot;&gt;
&lt;input type=&quot;range&quot; max=&quot;100&quot; value=&quot;0&quot; id=&quot;range-s&quot; class=&quot;hollow&quot;&gt;
&lt;input type=&quot;range&quot; max=&quot;100&quot; value=&quot;0&quot; id=&quot;range-l&quot; class=&quot;hollow&quot;&gt;
&lt;p&gt;&lt;code&gt;hsl(&lt;span id=&quot;range-h-value&quot;&gt;&lt;/span&gt;, &lt;span id=&quot;range-s-value&quot;&gt;&lt;/span&gt;, &lt;span id=&quot;range-l-value&quot;&gt;&lt;/span&gt;)&lt;/code&gt;&lt;/p&gt;
&lt;!-- End --&gt;
&lt;h2 id=&quot;xia-zai-zhi-ding-lu-jing-zhong-de-wen-jian&quot;&gt;下载指定路径中的文件&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;例如 当前博客文件夹中的playlist.csv&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;若图片文件能索引到，可以更好的显示&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; id&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;download-csv&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; class&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;card&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; href&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;playlist.csv&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; playlist.csv&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; •&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9.1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; kB&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/blockquote&gt;
&lt;h2 id=&quot;url-he-dian-zi-you-jian-di-zhi&quot;&gt;URL 和电子邮件地址&lt;/h2&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://open.spotify.com/playlist/7zbBvAvpb9NJfkO0e7lJx3&quot;&gt;Spotify&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;要快速将 URL 或电子邮件地址变成链接，请用尖括号将其括起来&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-4-1&quot;&gt;&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fn-4&quot;&gt;[4]&lt;/a&gt;&lt;/sup&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;http://markdownguide.cn&quot;&gt;http://markdownguide.cn&lt;/a&gt;
&lt;a href=&quot;mailto:fake@example.com&quot;&gt;fake@example.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;font size=&quot;5&quot;&gt;呈现的输出如下所示&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;http://markdownguide.cn&lt;/p&gt;
&lt;h2 id=&quot;ge-shi-hua-lian-jie-white-check-mark&quot;&gt;格式化链接 ⭐✅&lt;/h2&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING] &lt;code&gt;&amp;gt; [!WARNING]&lt;/code&gt; 警告
要 强调 链接，请在方括号和圆括号前后添加星号。要将链接表示为 代码，请在方括号中添加反引号。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;yin-yong-shi-lian-jie&quot;&gt;引用式链接&lt;/h2&gt;
&lt;p&gt;⚠️ 文内 引用 跨文引用 ，找更直观的理解&lt;/p&gt;
&lt;p&gt;引用式链接是一种特殊的链接，它使 URL 在 Markdown 中更易于显示和阅读。引用式链接由两部分构成：一部分与文本保持一致，另一部分存储在文件中的其他位置，以保持文本易于阅读。&lt;/p&gt;
&lt;h2 id=&quot;tu-xiang&quot;&gt;图像&lt;sup class=&quot;footnote-reference&quot; id=&quot;fr-5-1&quot;&gt;&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fn-5&quot;&gt;[5]&lt;/a&gt;&lt;/sup&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;添加一个感叹号 (!)，后跟方括号中的备用文本，以及括号中图片资源的路径或 URL。您可以在路径或 URL 后添加引号中的标题（可选）。 &lt;code&gt;![图片名称](图片URL &quot;图片悬浮信息&quot;)&lt;/code&gt; &lt;br/&gt;
路径是相对于该博客路径为基础，相对于图片的位置，若图片和博客为同一路径，直接书写图片名称即可&lt;br/&gt;
推荐&lt;code&gt;png&lt;/code&gt;格式&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/graph.png&quot; alt=&quot;Graph chart with three criteria: BPM, Energy, and Loud (Db). BPM goes up and down with regular intervals relatively smoothly, Energy goes from low to high, with three drops in the first half, and Loud (Db) is smooth except in the places of said Energy drops.&quot; title=&quot;图片悬浮信息&quot; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.geologyin.com/2021/04/the-colorful-charm-of-ametrine.html&quot;&gt;&lt;img src=&quot;https://files.catbox.moe/7uisx8.jpg&quot; alt=&quot;Rough Ametrine from Bolivia. 在线网络图片&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&quot;heading-ids&quot;&gt;标题 ID \&lt;/h2&gt;
&lt;p&gt;许多 Markdown 处理器支持 标题 的自定义 ID——一些 Markdown 处理器会自动添加它们。添加自定义 ID 允许您直接链接到标题并使用 CSS 修改它们。要添加自定义标题 ID，请在与标题同行的花括号中括起自定义 ID。&lt;/p&gt;
&lt;h3 id=&quot;custom-id&quot;&gt;My Great Heading \&lt;/h3&gt;
&lt;p&gt;HTML 如下所示&lt;/p&gt;
&lt;h3 id=&quot;custom-id&quot;&gt;My Great Heading&lt;/h3&gt;
&lt;p&gt;链接到标题 ID
您可以通过创建带有数字符号 (#) 和自定义标题 ID 的 标准链接 来链接到文件中带有自定义 ID 的标题。这些通常称为锚链接。&lt;/p&gt;
&lt;p&gt;Markdown HTML 呈现的输出
&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#heading-ids&quot;&gt;标题 ID&lt;/a&gt; &lt;a href=&quot;#heading-ids&quot;&gt;标题 ID&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;标题 ID
其他网站可以通过将自定义标题 ID 添加到网页的完整 URL 来链接到标题（例如，&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;http://markdownguide.cn/extended-syntax#heading-ids&quot;&gt;标题 ID&lt;/a&gt;）。&lt;/p&gt;
&lt;h1 id=&quot;umldeng-tu&quot;&gt;UML等图&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;前置条件&lt;/code&gt;: 项目中需要引入指定的js文件实现渲染转换，后续再引入该功能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn-2&quot;&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://example.org&quot;&gt;Footnote (link)&lt;/a&gt; &lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fr-2-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-1&quot;&gt;
&lt;p&gt;Footnote &lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fr-1-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-3&quot;&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://genius.com/37573135&quot;&gt;https://genius.com/37573135&lt;/a&gt; &lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fr-3-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-4&quot;&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://genius.com/29300699&quot;&gt;https://genius.com/29300699&lt;/a&gt; &lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fr-4-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn-5&quot;&gt;
&lt;p&gt;Update: between first revision of this post and the time I write this at we played it again after such a &lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_CXX20/markdown/#fr-5-1&quot;&gt;↩&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zola</title>
        <published>2026-10-15T00:00:00+00:00</published>
        <updated>2026-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CXX20/zola-blog/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CXX20/zola-blog/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CXX20/zola-blog/">&lt;blockquote&gt;
&lt;p&gt;本文受众：Zola博客引擎， ametrine博客主题， 复现本博客网站的爱好者，以及 &lt;code&gt;¯\(°_o)/¯&lt;/code&gt; &lt;code&gt;me&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;单独说明，若是我个人针对ametrine博客主题添加的网站特写会单独说明 &lt;br/&gt;
&lt;code&gt;tldr：&lt;/code&gt; 直接去主题开发者 或 你熟知的 github.io 参考 &lt;code&gt;workflows&lt;/code&gt;中的部署yml文件进行本地部署复现&lt;br/&gt;
然后 根据 文档 和 AI 进行逐行熟悉 源项目 再 魔改成自己的&lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;blog-md-biao-qian-tou&quot;&gt;Blog-md 标签头&lt;/h1&gt;
&lt;h2 id=&quot;yan-se&quot;&gt;颜色&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;色相（Hue）‌：颜色在色轮上的位置，范围 0–360 度。0 是红色、120 是绿色、240 是蓝色。&lt;/li&gt;
&lt;li&gt;饱和度（Saturation）‌：颜色的鲜艳程度，0% 是灰色，100% 是最鲜艳的纯色。&lt;/li&gt;
&lt;li&gt;亮度（Lightness）‌：颜色的明暗程度，0% 是黑色，100% 是白色。‌‌&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;可借助&lt;code&gt;Snipaste-截图贴图&lt;/code&gt;中的取色器获取到RGB值 ， 在&lt;a class=&quot;external&quot; rel=&quot;external&quot; title=&quot;若有更好的网站 后续可替换&quot; href=&quot;https://www.ol-tools.com/color-converter&quot;&gt;RGB转HSL在线网站&lt;/a&gt;转换即可&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;red&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;blue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;orange&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;green&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 懒惰写法&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(123, 33%, 60%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(27.567572, 87%, 67%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 更符合人类感知&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;hsl(123,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 86%,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 33%&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 柔和草绿&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Has several modes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; - Use one of the presets (applies to both light and dark modes):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   accent_color = &amp;quot;&amp;lt;red, orange, yellow, green, blue, purple&amp;gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; - Use a single HSL color for both light and dark modes:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   accent_color = &amp;quot;hsl(270, 50%, 60%)&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; - Use separate colors for light and dark modes (it&amp;#39;s possible to mix both&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; presets and HSL colors):&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   Presets:    accent_color = [&amp;quot;red&amp;quot;, &amp;quot;blue&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   Preset + HSL:   accent_color = [&amp;quot;red&amp;quot;, &amp;quot;hsl(270, 50%, 60%)&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   HSLs: accent_color = [&amp;quot;hsl(270, 50%, 60%)&amp;quot;, &amp;quot;hsl(27.567572, 87%, 67%)&amp;quot;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Custom colors must be in HSL format. You can also define your own color&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;rss-atomding-yue&quot;&gt;RSS/Atom订阅&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-10-15&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-10-15&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 该字段必须要有的&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;gui-lei&quot;&gt;归类&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;优先使用现有归类，除非 后续博客产出 过多，否则不单独 新增 归类&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Doc&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Tracking&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 需要持续迭代更新的帮助文档&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;zi-ti-zi-hao&quot;&gt;字体字号&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;全局字体 位置：&lt;a href=&quot;/Users/songhoujin/00BlogZola/sass/fonts.scss:5&quot;&gt;sass/fonts.scss (line 5)&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;scss&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;root&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;  --font-sans-serif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Golos Text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;  --font-monospace&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Commit Mono&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;主题的 body 直接消费它（themes/ametrine/sass/citrine/sass/base/_base.scss:33）：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;scss&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;body&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  font-family&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; var&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;--font-sans-serif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;--font-system-ui&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;var&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;--font-emoji&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以改 –font-sans-serif 就能改全站默认正文/UI 字体；代码块仍走 –font-monospace。如果换成新字体，先在同一个文件里补 @font-face，再把变量指过去&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;文章标题&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-10-21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;body_font_size&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;19px&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可选，不写则继承全局 21px&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;body_font&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;pop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div class=&quot;overflow-auto overshoot-row&quot;&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;body_font取值&lt;/th&gt;&lt;th&gt;字体字典&lt;/th&gt;&lt;th&gt;Duration&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;golos Golos Text&lt;/td&gt;&lt;td&gt;golos Golos Text&lt;/td&gt;&lt;td&gt;主题默认字体&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;&lt;code&gt;pop&lt;/code&gt;&lt;/td&gt;&lt;td&gt;华康 POP1 体&lt;/td&gt;&lt;td&gt;Identify-V 中文&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;essay&lt;/td&gt;&lt;td&gt;Essay Text&lt;/td&gt;&lt;td&gt;Identify-V 英文&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;mono&lt;/td&gt;&lt;td&gt;Commit Mono&lt;/td&gt;&lt;td&gt;等宽&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;wenkai&lt;/td&gt;&lt;td&gt;霞鹜文楷&lt;/td&gt;&lt;td&gt;主题默认字体&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;fangsong&lt;/td&gt;&lt;td&gt;仿宋&lt;/td&gt;&lt;td&gt;Identify-V 中文&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;sarasa&lt;/td&gt;&lt;td&gt;纱黑体&lt;/td&gt;&lt;td&gt;Identify-V 英文&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;pingfang&lt;/td&gt;&lt;td&gt;系统 PingFang SC（Apple 设备）&lt;/td&gt;&lt;td&gt;等宽&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;
&lt;h2 id=&quot;jia-jie-mi&quot;&gt;加解密&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;个人功能&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://suchaharcan.github.io/02Engineer_blog_Debug/deny-website-littlesnitch/&quot;&gt;跳转链接查看示例效果&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;通过 Little Snitch 屏蔽网站&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;基础教程&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-06-21&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-06-20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Network&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(145 22% 34%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(145 28% 50%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;extra.encryption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;encrypt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ping-bi-rss-atomding-yue&quot;&gt;屏蔽RSS/Atom订阅&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;个人功能
正确写法是放在 front matter 顶层（不要放进 [extra]）
该文章会从根 feed 和所在板块 feed 中消失，文章本身仍能正常访问。它只影响订阅源，不影响页面发布；如果还想让它不进搜索，再另加 in_search_index = false&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;encrypt = true 的文章因为 post-build.mjs 的过滤，本身已经不会出现在 feed 里；include_in_feeds = false 更适合“不加密、但就是不想进 RSS”的普通文章。两者都写时也不冲突，include_in_feeds = false 会在 Zola 生成 feed 阶段就先排除。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;不进入 RSS 的文章&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-10-20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;include_in_feeds&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;banner&quot;&gt;Banner&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Untitled 2025.m3u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;My musical preferences of 2025, in a playlist form.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2026-07-04&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Music&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Playlist&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(209.49, 35.76%, 32.35%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(200.0, 15.19%, 69.02%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;banner&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;banner.webp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;styles&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;blog/2025-playlist/style.css&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;blog-md-nei-rong-zhu-ti&quot;&gt;Blog-md 内容主体&lt;/h2&gt;
&lt;blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;[!WARNING] &lt;code&gt;&amp;gt; [!WARNING]&lt;/code&gt; 警告&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;kan-ban&quot;&gt;看板&lt;/h2&gt;
&lt;h1 id=&quot;zhu-ti-geng-xin-ametrine&quot;&gt;主题更新 -ametrine&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;以&lt;code&gt;ametrine&lt;/code&gt;主题为 当前核心主题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/00BlogZola&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ① 先回到主仓库当前记录的提交，确保是干净基线（可选但推荐）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ② 拉取新版主题：main 分支最新 + 初始化并递归更新嵌套子模块&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    （--init --recursive 会拉取 sass/citrine，这是新版能编译的关键）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-remote&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ③ 先编译验证（与 CI 完全一致的完整流程用 ./build-site.sh）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ④ 编译失败 → 撤销本次拉取，回到主仓库记录的旧提交&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; diff&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; themes/ametrine 应不再出现&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 前面无 + / - 符号即已回到记录提交&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;如果第 ④ 步提示本地有改动不让覆盖，加 --force：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-force&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 上述是给读者详解，以下是 个人一键命令使用的&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/00BlogZola&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-remote&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;✅ 新版主题编译通过（尚未记录，确认保留后再提交）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❌ 编译失败，自动撤销本次拉取&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;关键提醒&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;回退为什么有效：主仓库「记录的」子仓库提交始终是旧的 fc6f62c217ae，
只要你在成功之前不执行 &lt;code&gt;git add themes/ametrine&lt;/code&gt;，&lt;code&gt;git submodule update themes/ametrine&lt;/code&gt;（不带 –remote）就能把工作区拉回这个记录提交，相当于放弃新版。&lt;/li&gt;
&lt;li&gt;确认保留新版时才提交：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;upgrade ametrine theme&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; 提交之后，「记录提交」就变成新版了，此后第&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ④&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 步会回退到新版而不是旧版。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;citrine 残留无害：回退后 &lt;code&gt;themes/ametrine/sass/citrine&lt;/code&gt; 这个目录可能还留在本地，旧版主题不引用它，不影响编译，不用特意删。&lt;/li&gt;
&lt;li&gt;更确定的拉取方式（可选）：如果不想依赖 –remote 对嵌套子模块的自动行为，也可以进子仓库手动拉取，与 CI 完全一致&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;cd ~/00BlogZola/themes/ametrine
git fetch origin main
git checkout origin/main
git submodule update –init –recursive
cd ~/00BlogZola&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; 之后的编译验证和回退步骤同上。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>ASCII - 表情符号在博客文章</title>
        <published>2026-10-15T00:00:00+00:00</published>
        <updated>2026-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/ascii-mac/"/>
        <id>https://suchaharcan.github.io/03Share_blog/ascii-mac/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/ascii-mac/">&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;rocket&lt;/code&gt;菜单栏常驻 双击``触发 可模糊搜索&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;博客文章编写， 代码注释， 聊天通讯 均可使用 ，但含义必须明确通用&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;技术性博客 编写： 基于 场景 需求 约束 目标 步骤 验证 复现 这6点顺序编写&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;zi-dian-ying-she-gui-ze-ji-he&quot;&gt;字典映射规则集合&lt;/h1&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;关键字&lt;/th&gt;&lt;th&gt;图标含义&lt;/th&gt;&lt;th&gt;图标&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;star&lt;/td&gt;&lt;td&gt;重点醒目提示&lt;/td&gt;&lt;td&gt;⭐&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;white-check-mark&lt;/td&gt;&lt;td&gt;可行性提醒 完成状态 安全&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;interrobang&lt;/td&gt;&lt;td&gt;有疑问&lt;/td&gt;&lt;td&gt;⁉️&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;pushpin&lt;/td&gt;&lt;td&gt;置顶提醒&lt;/td&gt;&lt;td&gt;📌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;gear&lt;/td&gt;&lt;td&gt;配置 规则&lt;/td&gt;&lt;td&gt;⚙️&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;warning&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;⚠️&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-10-13T14:07:00+00:00</published>
        <updated>2026-10-13T14:07:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-10-13t14-07-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-10-13t14-07-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-10-13t14-07-00z/">&lt;p&gt;2026年10月13日 22:07（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-ming-ming-yu-url-wei-yi-hua-duo-tian-quan-tian-shang-wu-xia-wu-wan-shang-wu-lei-ge-zi-du-li-ke-da-xiu-fu-path-collisions&quot;&gt;看板命名与 URL 唯一化：多天 / 全天 / 上午 / 下午 / 晚上 五类各自独立可达 · 修复 path collisions&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮处理新建看板后&lt;strong&gt;构建直接失败&lt;/strong&gt;的问题，并一次把它根治：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;报错&lt;/strong&gt;：新建 2026-10-13 晚上看板后，构建报 &lt;code&gt;Found path collisions&lt;/code&gt;，两块不同日期的看板抢同一条 URL；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;根因&lt;/strong&gt;：Zola 会把文件名开头的 &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 当成页面日期&lt;strong&gt;剥离&lt;/strong&gt;，只剩「晚上」参与 slug，于是 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; 与 &lt;code&gt;2026-10-13_晚上.md&lt;/code&gt; 都会变成 &lt;code&gt;/kanban/wan-shang/&lt;/code&gt;；编辑器此前只保证&lt;strong&gt;文件名&lt;/strong&gt;唯一，没管 &lt;strong&gt;URL&lt;/strong&gt; 唯一；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复（URL）&lt;/strong&gt;：每块看板都由编辑器自动写入 &lt;code&gt;slug&lt;/code&gt;（= URL 安全化的文件名），让五类看板各有唯一可达的 URL；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复（命名与锁定）&lt;/strong&gt;：多天看板改用 &lt;code&gt;周开始-周结束-打开编辑器时的时分&lt;/code&gt; 命名（如 &lt;code&gt;2026-06-16-06-22-2236.md&lt;/code&gt;），从文件名上就和单日「全天」区分开；同时收紧编辑锁定 —— 单日看板的周开始、周结束都锁定，多天看板只锁定周开始；新建时还会提示「该时间段已有看板」；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收尾&lt;/strong&gt;：把 2026-06/07 创建的 4 块多天看板也统一迁移到新命名，并用 &lt;code&gt;aliases&lt;/code&gt; 保住旧 URL。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-bao-cuo-xian-xiang&quot;&gt;一、报错现象&lt;/h2&gt;
&lt;p&gt;在 GUI 里新建单日看板，按提示在仓库里创建文件、粘贴生成的 Markdown 并保存后，本地 &lt;code&gt;zola serve&lt;/code&gt; 与 &lt;code&gt;zola build&lt;/code&gt; 同时失败：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR Failed to build the site&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR Found path collisions:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- `/kanban/wan-shang/` from files&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {content/kanban/2026-08-11_晚上.md, content/kanban/2026-10-13_晚上.md}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;粘贴的 Markdown 本身没有语法问题：front matter 合法、栏目与卡片规则也正确。问题出在&lt;strong&gt;文件名 → URL&lt;/strong&gt; 这一层。&lt;/p&gt;
&lt;h2 id=&quot;er-gen-yin-wen-jian-ming-de-ri-qi-duan-bei-bo-chi-cheng-ye-mian-ri-qi&quot;&gt;二、根因：文件名的日期段被剥离成页面日期&lt;/h2&gt;
&lt;p&gt;Zola 会把页面文件名开头的 &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 当作页面日期，并从 slug 里去掉，只让剩下的部分参与 URL：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;生成的 URL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-16.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-08-11_晚上.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/wan-shang/&lt;/code&gt; ← 只剩「晚上」被转写成拼音&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-10-13_晚上.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/wan-shang/&lt;/code&gt; ← 与上一行撞车&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;结论：&lt;strong&gt;只要两块单日看板的时段相同&lt;/strong&gt;（上午 / 下午 / 晚上），无论日期差多远，都会落到同一条输出路径。命名规则 &lt;code&gt;week_start_时段&lt;/code&gt; 只保证了文件名唯一，而 Zola 恰好把日期前缀吃掉了。&lt;/p&gt;
&lt;p&gt;复现方式：在最小 Zola 工程里放两个不同日期、同一时段的文件，得到一字不差的同一条报错；给其中一块补上 &lt;code&gt;slug&lt;/code&gt; 后立刻构建通过。&lt;/p&gt;
&lt;h2 id=&quot;san-xiu-fu-fang-an&quot;&gt;三、修复方案&lt;/h2&gt;
&lt;h3 id=&quot;3-1-bian-ji-qi-zi-dong-xie-ru-slug&quot;&gt;3.1 编辑器自动写入 slug&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;：新增时段拼音映射与 &lt;code&gt;buildUrlSlug()&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;上午 → &lt;code&gt;shang-wu&lt;/code&gt;、下午 → &lt;code&gt;xia-wu&lt;/code&gt;、晚上 → &lt;code&gt;wan-shang&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;stateToBoard()&lt;/code&gt; 把 &lt;code&gt;slug = URL 安全化的文件名&lt;/code&gt; 写进 front matter（五类看板都写，不再依赖 Zola 从文件名推导）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;：&lt;code&gt;serializeMarkdown()&lt;/code&gt; 在 &lt;code&gt;date&lt;/code&gt; 之后输出 &lt;code&gt;slug&lt;/code&gt; 行；解析器本来就能读任意顶层键，所以用 GUI 修改已有看板时也不会把 &lt;code&gt;slug&lt;/code&gt; 弄丢。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-2-wen-jian-ming-yu-url-fang-an&quot;&gt;3.2 文件名与 URL 方案&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;看板类型&lt;/th&gt;&lt;th&gt;文件名&lt;/th&gt;&lt;th&gt;生成的 URL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;多天（跨天周计划）&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-16-06-22-2236.md&lt;/code&gt;（周开始 - 周结束的月-日 - 打开编辑器时的时分）&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16-06-22-2236/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日「全天」（不选时段）&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 上午&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_上午.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-shang-wu/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 下午&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_下午.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-xia-wu/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 晚上&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_晚上.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-wan-shang/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;文件名同时就是「生成并复制到剪贴板 / 同步到仓库」提示的目标文件名；多天看板的时分取自&lt;strong&gt;打开 GUI 编辑器的那一刻&lt;/strong&gt;，编辑过程中不再变化；&lt;/li&gt;
&lt;li&gt;修改已有看板时沿用原文件名、并保留已有 &lt;code&gt;slug&lt;/code&gt;，所以改内容不会改 URL。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-3-bian-ji-suo-ding-gui-ze&quot;&gt;3.3 编辑锁定规则&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;看板类型&lt;/th&gt;&lt;th&gt;周开始&lt;/th&gt;&lt;th&gt;周结束&lt;/th&gt;&lt;th&gt;时段&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;单日（含「全天」）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;td&gt;&lt;strong&gt;锁定&lt;/strong&gt;（起止同一天）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多天（跨天）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;td&gt;可改（开始 +13 天以内）&lt;/td&gt;&lt;td&gt;不适用&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-4-xian-you-wen-jian-yu-wen-dang&quot;&gt;3.4 现有文件与文档&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;出问题的 &lt;code&gt;content/kanban/2026-10-13_晚上.md&lt;/code&gt; 补上 &lt;code&gt;slug = &quot;2026-10-13-wan-shang&quot;&lt;/code&gt;，构建立刻恢复；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;旧的 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; &lt;strong&gt;保持原样&lt;/strong&gt;，URL 仍是 &lt;code&gt;/kanban/wan-shang/&lt;/code&gt;，不影响既有链接；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;2026-06/07 创建的 4 块多天看板已统一迁移到新命名，并同时写入 &lt;code&gt;slug&lt;/code&gt;（新 URL）与 &lt;code&gt;aliases&lt;/code&gt;（旧 URL）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;旧文件名&lt;/th&gt;&lt;th&gt;新文件名&lt;/th&gt;&lt;th&gt;新 URL&lt;/th&gt;&lt;th&gt;旧 URL（redirect）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-16.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-16-06-22-0934.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16-06-22-0934/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-22.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-22-06-23-0934.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-22-06-23-0934/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-22/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-25.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-25-06-30-1316.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-25-06-30-1316/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-25/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-07-13.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-07-13-07-19-1800.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-07-13-07-19-1800/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-07-13/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;（迁移用的时分取自各文件原本的最后修改时间；旧 URL 会 301/跳转到新 URL，历史 nanolog 里指向 &lt;code&gt;/kanban/2026-06-16/&lt;/code&gt; 的链接依旧可用。）&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt; 补上命名规则、URL 对照表、编辑锁定规则、带 &lt;code&gt;slug&lt;/code&gt; 的 front matter 示例与字段说明；&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt; 同步按新规则推导输出目录（多天 / 全天 / 时段三种命名都能校验）。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-5-xin-jian-shi-de-zhong-fu-kan-ban-ti-shi&quot;&gt;3.5 新建时的重复看板提示&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;编辑器会读取列表页内嵌的看板清单（热力图容器的 &lt;code&gt;data-json&lt;/code&gt;），在&lt;strong&gt;新建&lt;/strong&gt;时判断所选时间段是否与已有看板重叠；&lt;/li&gt;
&lt;li&gt;完全相同 → 提示「该时间段已有看板：&amp;lt;核心任务&amp;gt;（起 ~ 止），建议点它的「✎ 编辑」修改」；部分重叠 → 提示会并存两块重叠看板；&lt;/li&gt;
&lt;li&gt;修改已有看板时不显示该提示。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-6-rang-aliases-zai-gui-xiu-gai-hou-reng-ran-bao-liu&quot;&gt;3.6 让 aliases 在 GUI 修改后仍然保留&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;kanban-rules.js&lt;/code&gt;：&lt;code&gt;parseFrontMatter()&lt;/code&gt; 识别顶层 &lt;code&gt;aliases = [&quot;…&quot;]&lt;/code&gt;，&lt;code&gt;serializeMarkdown()&lt;/code&gt; 在 &lt;code&gt;slug&lt;/code&gt; 之后重新输出 &lt;code&gt;aliases&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kanban-editor.js&lt;/code&gt;：&lt;code&gt;boardToState()&lt;/code&gt; 读入 aliases、&lt;code&gt;stateToBoard()&lt;/code&gt; 写回；&lt;/li&gt;
&lt;li&gt;这样用 GUI 编辑迁移后的看板再保存，旧 URL 的跳转不会丢。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;si-yan-zheng&quot;&gt;四、验证&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;逻辑 + 端到端&lt;/strong&gt;：直接加载真实的规则引擎、并从编辑器源码里抽取真实的 &lt;code&gt;buildSlug()&lt;/code&gt; / &lt;code&gt;buildUrlSlug()&lt;/code&gt; 跑用例（新建五类 + 修改三类 + 同一天「多天 vs 全天」互不冲突），再把生成的 Markdown 放进一个最小 Zola 工程构建 —— 五类看板的 URL 各自唯一，无冲突；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;重复提示&lt;/strong&gt;：用真实的看板清单数据跑冲突判定 —— 完全相同 / 部分重叠 / 不重叠 / 修改模式四种情况结果正确；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;front matter 回写&lt;/strong&gt;：解析后再序列化，&lt;code&gt;slug&lt;/code&gt; 与 &lt;code&gt;aliases&lt;/code&gt; 都能原样保留；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;真站构建&lt;/strong&gt;：&lt;code&gt;zola build&lt;/code&gt; 通过（285 个页面 = 原有页面 + 4 个旧 URL 跳转页），&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt; 通过（6 块看板，列表卡片与周页一一对应）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;页面可达&lt;/strong&gt;：新看板详情页 &lt;code&gt;/kanban/2026-10-13-wan-shang/&lt;/code&gt;、迁移后的 4 个新 URL 全部生成；4 个旧 URL 均生成跳转页（如 &lt;code&gt;/kanban/2026-06-16/&lt;/code&gt; → &lt;code&gt;/kanban/2026-06-16-06-22-0934/&lt;/code&gt;）；旧看板 &lt;code&gt;/kanban/wan-shang/&lt;/code&gt; 不受影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wu-zhu-yi-shi-xiang&quot;&gt;五、注意事项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;新命名生效后，多天、全天、上午、下午、晚上五类看板&lt;strong&gt;可以在同一天共存&lt;/strong&gt;，URL 各自唯一；4 块历史多天看板已迁移到新命名并通过 &lt;code&gt;aliases&lt;/code&gt; 保住旧链接，只有更早的 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; 还保留着「URL 只剩余下时段」的历史形态；&lt;/li&gt;
&lt;li&gt;旧的 2026-08-11 晚上看板如果日后用 GUI 编辑并保存，会自动获得 &lt;code&gt;slug = &quot;2026-08-11-wan-shang&quot;&lt;/code&gt;，其 URL 会从 &lt;code&gt;/kanban/wan-shang/&lt;/code&gt; 变为 &lt;code&gt;/kanban/2026-08-11-wan-shang/&lt;/code&gt;（如需保住旧链接，可再加 &lt;code&gt;aliases&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;新建看板若与已有看板时间段重叠，编辑面板会给出提示，避免无意间建出两块同周看板；&lt;/li&gt;
&lt;li&gt;顺带调整：&lt;code&gt;/kanban/&lt;/code&gt; 热力图的月份选择器改为默认&lt;strong&gt;当前月份&lt;/strong&gt;；若当月还没有看板，卡片列表会自动回退展示最近一个有看板的月份并给出提示，避免整屏空白。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/&quot;&gt;周计划看板&lt;/a&gt; · &lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine&quot;&gt;Ametrine 主题&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2026-10-13 晚上 计划</title>
        <published>2026-10-13T00:00:00+00:00</published>
        <updated>2026-10-13T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/2026-10-13-wan-shang/"/>
        <id>https://suchaharcan.github.io/kanban/2026-10-13-wan-shang/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/2026-10-13-wan-shang/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h1 id=&quot;jin-xing-zhong&quot;&gt;进行中&lt;/h1&gt;
&lt;h2 id=&quot;dan-ci-su-ji&quot;&gt;单词速记&lt;/h2&gt;
&lt;p&gt;@start 2026-10-13
@due 2026-10-13
@priority 3
@goal risk
@top purple
@cover full&lt;/p&gt;
&lt;h2 id=&quot;kao-yan-bao-ming-cai-liao-zhun-bei&quot;&gt;考研报名 - 材料准备&lt;/h2&gt;
&lt;p&gt;@start 2026-10-13
@due 2026-10-13
@priority 3
@goal risk
@top purple
@cover full&lt;/p&gt;
&lt;p&gt;15日后正式报名不可错过&lt;/p&gt;
&lt;h1 id=&quot;yi-wan-cheng&quot;&gt;已完成&lt;/h1&gt;
&lt;h2 id=&quot;tealdeer-cmake-shou-ce-wei-hu&quot;&gt;Tealdeer - cmake 手册维护&lt;/h2&gt;
&lt;p&gt;@start 2026-10-13
@due 2026-10-13
@priority 1
@goal complete
@bg yellow
@top green
@cover half&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
cmake - 自定义页面&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
sc-cmake - 自定义页面&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;学习 掌握 TLDR语法
维护cmake 自定义页面&lt;/p&gt;
&lt;h2 id=&quot;zhu-ti-cang-ku-geng-xin-tera2&quot;&gt;主题仓库更新 - Tera2&lt;/h2&gt;
&lt;p&gt;@start 2026-10-13
@due 2026-10-13
@priority 4
@goal complete
@bg blue&lt;/p&gt;
&lt;h1 id=&quot;jin-du&quot;&gt;进度&lt;/h1&gt;
&lt;h2 id=&quot;10-13-zhou-er&quot;&gt;10-13 周二&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
主题更新&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>谮言 · 滞后性</title>
        <published>2026-10-11T00:00:00+00:00</published>
        <updated>2026-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_Essay/zhi-hou-xing/"/>
        <id>https://suchaharcan.github.io/01Write_blog_Essay/zhi-hou-xing/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_Essay/zhi-hou-xing/">&lt;p&gt;结果有滞后性， 习惯培养有滞后性， 法律本身就是滞后性，
可 我们有时候 就很简单直接的 没有预见这个问题， 将失败当作结果， 没有坚持下去。&lt;/p&gt;
&lt;p&gt;我在这里并非是 去 歌颂坚持或 解构 放弃， 而是 站在 事物发展的角度上思考 ，如何具体的审视 是否存在滞后性，若存在该如何判断&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tealdeer v1.8安装教程</title>
        <published>2026-10-11T00:00:00+00:00</published>
        <updated>2026-10-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/tealdeer-mac-config/"/>
        <id>https://suchaharcan.github.io/03Share_blog/tealdeer-mac-config/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/tealdeer-mac-config/">&lt;h1 id=&quot;tldr&quot;&gt;TLDR&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Tealdeer 是Rust版的TLDR工具；
个人感觉 比tldr(tlrc) 更好用；
但 文档 不清晰，现有教程落后，补充当前可用操作；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;an-zhuang-he-tong-yong-pei-zhi-ming-ling&quot;&gt;安装和通用配置命令&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tealdeer&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;通过Homebrew  安装tealdeer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tldr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-seed-config&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 创建默认配置 必须要操作&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;https://docs.tealdeer.org/stable/
简单查看配置中 节点说明
默认配置中会直接设置在线文档的URL，既往搜索记录均是错误 这是一个踩坑点 &lt;br/&gt;
默认配置中手动指定语言，与tlrc和既往版本不一致 &lt;br/&gt;
若 仓库已经安装过tldr 或 tlrc ,必须先 brew unlink tldr/tlrc&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;chang-jian-ming-ling&quot;&gt;常见命令&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tldr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-show-paths&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tldr&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-edit-page&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 修改自定义页面&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tldr&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-edit-patch&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 修改 自定义补丁页面&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;chang-jian-chang-jing&quot;&gt;常见场景：&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;上游现有页面&lt;/li&gt;
&lt;li&gt;自定义页面（覆盖同名1） &lt;command&gt;.page.md&lt;/li&gt;
&lt;li&gt;扩展现有页面 (追加 1 ) &lt;command&gt;.patch.md  警告 ，扩展不对 自定义页面服务&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;后期 定期 将 自定义路径中 扩展页面上传到仓库中归档保存备份&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;wei-he-yao-yong-tldr&quot;&gt;为何要用TLDR ?&lt;/h1&gt;
&lt;p&gt;tldr 在日常开发和系统管理工作中扮演着重要的角色，极大地提升了效率：&lt;/p&gt;
&lt;p&gt;优点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;尊重时间： 用户普遍认为 tldr 在最短时间内提供了最直接、可操作的命令示例，极大地提升了日常工作效率。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;极高的易用性和记忆效率： 简洁的格式不仅易于快速消化，也更容易被用户记住。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;社区驱动的活力： 开放的贡献模式使得内容能够持续更新和完善。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;灵活的跨平台支持： 多样化的客户端满足了不同用户和环境的需求。
缺点与权衡：&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;深度和全面性不足： 这是最常被提及的缺点。tldr 为了简洁而牺牲了全面性，对于不常见的用例或需要理解命令底层工作原理的场景，用户仍需回归 man 页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;覆盖范围有限： 对于一些较新、较小众或特定领域的命令行工具，可能不存在对应的 tldr 页面。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;示例可能过于简化： 在某些情况下，tldr 提供的示例可能无法满足中高级用户的复杂需求。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;潜在的依赖风险： 一些经验丰富的用户担忧，过度依赖 tldr 可能会让新手养成“只知其然，不知其所以然”的习惯，从而阻碍他们深入学习和理解 shell 命令及操作系统。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;以实例为中心&lt;/strong&gt;： 这是 tldr 最受赞誉的特点。它不解释命令的每一个参数，而是直接展示 80% 最常见的用例。例如，对于 tar 或 ffmpeg 等拥有大量复杂参数的命令，tldr 直接提供“解压一个 .tar.gz 文件”或“从视频中提取音频”等具体示例，让用户能够快速上手。 &lt;code&gt;比手册man更快&lt;/code&gt; &lt;br/&gt;
&lt;strong&gt;简洁易读的格式&lt;/strong&gt;： tldr 的信息结构简洁明了，通常只包含几行文字和几个代码示例。输出通常带有语法高亮，格式清晰统一，非常适合快速扫读和复制粘贴。&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;离线访问能力&lt;/strong&gt;： 大多数 tldr 客户端在首次运行时会下载并缓存所有页面到本地。这意味着一旦页面被缓存，即使在没有网络连接的环境下，用户也能快速查询命令用法，确保了工作流的连续性&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;自定义页面/补丁扩展页面&lt;/strong&gt;: 解决在线文档没有覆盖但个人需要的部分&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>github_proxy：一个开关接管 zsh、git 与 Homebrew 的 GitHub 加速</title>
        <published>2026-10-02T00:00:00+00:00</published>
        <updated>2026-10-02T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/github-proxy-zsh-brew/"/>
        <id>https://suchaharcan.github.io/03Share_blog/github-proxy-zsh-brew/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/github-proxy-zsh-brew/">&lt;h1 id=&quot;github-proxy-yi-ge-kai-guan-jie-guan-zsh-git-yu-homebrew-de-github-jia-su&quot;&gt;github_proxy：一个开关接管 zsh、git 与 Homebrew 的 GitHub 加速&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR：无代理、无 VPN 的国内网络下，&lt;code&gt;github_proxy on&lt;/code&gt; 让 zsh 里的 &lt;code&gt;git clone/fetch&lt;/code&gt;、&lt;code&gt;curl/wget&lt;/code&gt;，以及 &lt;strong&gt;Homebrew 升级时对 GitHub 的直连&lt;/strong&gt; 全部改走镜像；&lt;code&gt;github_proxy off&lt;/code&gt; 一键恢复直连。核心依据是三个实测结论：brew 调用外部命令时会&lt;strong&gt;过滤非 &lt;code&gt;HOMEBREW_&lt;/code&gt; 前缀的环境变量&lt;/strong&gt;；&lt;code&gt;HOMEBREW_ARTIFACT_DOMAIN&lt;/code&gt; 在这版 brew 里&lt;strong&gt;只管 ghcr.io&lt;/strong&gt;；真正能接管 brew 网络请求的是它的 &lt;strong&gt;shim（&lt;code&gt;HOMEBREW_CURL&lt;/code&gt; / &lt;code&gt;HOMEBREW_GIT&lt;/code&gt;）&lt;/strong&gt;。实测同一个 GitHub 托管的 cask：直连 &lt;strong&gt;240 秒超时失败&lt;/strong&gt;，走镜像 &lt;strong&gt;2 秒完成&lt;/strong&gt;，且文件 SHA-256 与官方一致。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-qian-zhi-tiao-jian-yu-gua-yong-huan-jing&quot;&gt;1. 前置条件与适用环境&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;本机实测值&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;系统&lt;/td&gt;&lt;td&gt;macOS 27.2 / Apple Silicon&lt;/td&gt;&lt;td&gt;Intel 机器同样适用&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Shell&lt;/td&gt;&lt;td&gt;zsh 5.9 + Oh My Zsh&lt;/td&gt;&lt;td&gt;依赖交互式 zsh 加载 &lt;code&gt;~/.zshrc&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Homebrew&lt;/td&gt;&lt;td&gt;7.0.7（&lt;code&gt;/opt/homebrew&lt;/code&gt;）&lt;/td&gt;&lt;td&gt;接管 Homebrew 需要 4.x 以上&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;git / curl&lt;/td&gt;&lt;td&gt;git 2.56.0 / curl 8.7.1&lt;/td&gt;&lt;td&gt;macOS 自带或 brew 安装均可&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;网络&lt;/td&gt;&lt;td&gt;国内直连，无代理无 VPN&lt;/td&gt;&lt;td&gt;hf-mirror、gh-proxy 可达&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;镜像&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://gh-proxy.com/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;可用 &lt;code&gt;GITHUB_PROXY_MIRROR&lt;/code&gt; 替换&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;已存在的本机镜像&lt;/td&gt;&lt;td&gt;USTC：API / bottles / brew.git / homebrew-core.git&lt;/td&gt;&lt;td&gt;与本方案互补，不冲突&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;前置认知&lt;/strong&gt;：镜像只能解决“能不能下、下得快不快“，不能改变下载内容——所有经镜像下载的文件仍由原工具按 SHA-256 校验，校验不过就重来，不存在被镜像掉包的风险。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;适用边界&lt;/strong&gt;：本方案面向“在终端里干活“的场景。&lt;br/&gt;
浏览器、VS Code、npm/pip/go、以及程序内自建 HTTP 客户端的下载（例如 &lt;code&gt;focr&lt;/code&gt;）不经过 zsh 也不经过 brew，&lt;br/&gt;
函数无法接管——那类工具要用它自己的镜像参数（如 &lt;code&gt;--manifest&lt;/code&gt;、&lt;code&gt;PIP_INDEX_URL&lt;/code&gt;）。&lt;/p&gt;
&lt;hr /&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;gt; **需求场景描述**&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol&gt;
&lt;li&gt;Homebrew 下载 更新 （cask类型； Formula –build-form-source 类型； 第三方Tap 走github做仓库） brew update, brew upgrade, brew install –build-from-source&lt;/li&gt;
&lt;li&gt;Github url 安装 更新 拉取模型，例如 &lt;code&gt;focr&lt;/code&gt; focr pull&lt;/li&gt;
&lt;li&gt;Github 代码仓库 git clone , git pull ,git push&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;2-wen-jian-yu-lu-jing-yi-lan&quot;&gt;2. 文件与路径一览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;th&gt;需要手动提供？&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.zsh/functions/github_proxy.zsh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;主脚本（约 590 行），由 &lt;code&gt;~/.zshrc&lt;/code&gt; 自动 source&lt;/td&gt;&lt;td&gt;✅ &lt;strong&gt;唯一需要你放的文件&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/state/github-proxy/state&lt;/code&gt;&lt;/td&gt;&lt;td&gt;开关状态文件，&lt;strong&gt;唯一权威来源&lt;/strong&gt;（内容为 &lt;code&gt;on&lt;/code&gt; / &lt;code&gt;off&lt;/code&gt;）&lt;/td&gt;&lt;td&gt;❌ 首次 &lt;code&gt;on&lt;/code&gt;/&lt;code&gt;off&lt;/code&gt; 时自动生成&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/state/github-proxy/bin/brew-curl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自动生成的 curl 包装器（镜像地址写死在文件内）&lt;/td&gt;&lt;td&gt;❌ 加载脚本时自动生成&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/state/github-proxy/bin/brew-git&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自动生成的 git 包装器&lt;/td&gt;&lt;td&gt;❌ 加载脚本时自动生成&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/state/github-proxy/debug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;调试开关的标记文件（存在即记录）&lt;/td&gt;&lt;td&gt;❌ 仅 &lt;code&gt;debug on&lt;/code&gt; 时创建&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/state/github-proxy/brew.log&lt;/code&gt;（含 &lt;code&gt;.1&lt;/code&gt;）&lt;/td&gt;&lt;td&gt;调试日志：包装器实际请求的地址，超 1 MB 自动轮转&lt;/td&gt;&lt;td&gt;❌ 仅调试时写入&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;结论：你只需要提供 1 个文件&lt;/strong&gt;——主脚本（附录 A）。&lt;br/&gt;
其余 5 个都是运行时产物，删掉后下次开 shell 会自动重建；反过来，把它们拷贝给别人也没有意义（包装器里写死了镜像地址与绝对路径）。&lt;br/&gt;&lt;/p&gt;
&lt;p&gt;附录 B 列出了自动生成文件的具体内容，方便先审阅再落地。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;加载链路&lt;/strong&gt;：&lt;code&gt;github_proxy.zsh&lt;/code&gt; 放在哪个目录由你决定，关键是&lt;strong&gt;在 &lt;code&gt;~/.zshrc&lt;/code&gt; 里写出这个路径并 source 它&lt;/strong&gt;——这就是全部的“安装动作“：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ~/.zshrc —— 指向你自己存放该脚本的位置（本项目示例放在 ~/.zsh/functions/）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zsh/functions/github_proxy.zsh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若习惯把自定义函数集中管理，也可以整目录遍历加载（此时无需逐个写文件名）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ~&lt;/span&gt;&lt;span&gt;/.zsh/functions &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    for&lt;/span&gt;&lt;span&gt; func&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        source&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;状态目录则固定在 &lt;code&gt;XDG_STATE_HOME&lt;/code&gt;（默认 &lt;code&gt;~/.local/state&lt;/code&gt;）下，属于“可重建的运行态“，删掉也能自动重建。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-gong-neng&quot;&gt;3. 功能&lt;/h2&gt;
&lt;h3 id=&quot;3-1-ming-ling-su-cha&quot;&gt;3.1 命令速查&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy            # 看状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy on         # 开启（默认状态）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy off        # 关闭，全部直连&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy toggle     # 切换&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy test       # 实测镜像 vs 直连速度&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy url &amp;lt;URL&amp;gt;  # 只看改写结果，方便排查&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy brew       # 看 Homebrew 接管状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_proxy debug on   # 记录包装器实际请求的地址（排查用）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-jie-guan-fan-wei-ju-zhen&quot;&gt;3.2 接管范围矩阵&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;是否接管&lt;/th&gt;&lt;th&gt;走向&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git clone / fetch / pull / ls-remote / submodule&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;走镜像&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;&lt;td&gt;➖ 不动&lt;/td&gt;&lt;td&gt;仍走你自己的 SSH（见 4.2）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl&lt;/code&gt; / &lt;code&gt;wget&lt;/code&gt; 中的 github 域名&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;走镜像&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Homebrew 升级时的 cask 包 / formula 源码 / tap 定义&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;走镜像&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Homebrew 的 API / bottles / 核心仓库&lt;/td&gt;&lt;td&gt;➖ 不动&lt;/td&gt;&lt;td&gt;你已有的 USTC 镜像&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gh&lt;/code&gt; CLI&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;自带客户端，只能用 &lt;code&gt;HTTPS_PROXY&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;npm / pip / go / VS Code / 浏览器 / focr&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;不经过 zsh，需各自配置&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;SSH 形式 &lt;code&gt;git@github.com:…&lt;/code&gt;&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;保持直连（国内一般可用）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-3-san-chong-zhuang-tai-yu-yi&quot;&gt;3.3 三种状态语义&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;持久化&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;on&lt;/code&gt;&lt;/td&gt;&lt;td&gt;走镜像（默认）&lt;/td&gt;&lt;td&gt;写入 state 文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;off&lt;/code&gt;&lt;/td&gt;&lt;td&gt;完全直连，且不残留任何环境变量&lt;/td&gt;&lt;td&gt;写入 state 文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GITHUB_PROXY_FORCE=off zsh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只影响这次会话的临时覆盖&lt;/td&gt;&lt;td&gt;不动 state 文件&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-she-ji-san-ceng-jie-guan&quot;&gt;4. 设计：三层接管&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;你在 zsh 里敲命令&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;git / curl / wget 函数包装层&amp;lt;br/&amp;gt;改写参数里的 URL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;brew upgrade / fetch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; D&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HOMEBREW_CURL_PATH&amp;lt;br/&amp;gt;HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    D &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; E&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;生成的包装器&amp;lt;br/&amp;gt;brew-curl / brew-git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    B &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; F&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://gh-proxy.com/https://github.com/…&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    E &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; F&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    F &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; G&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;镜像回源并返回&amp;lt;br/&amp;gt;原工具仍校验 SHA-256&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;4-1-di-yi-ceng-zsh-han-shu-gai-xie-can-shu&quot;&gt;4.1 第一层：zsh 函数改写参数&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;curl&lt;/code&gt; / &lt;code&gt;wget&lt;/code&gt; 被函数包裹，只改写&lt;strong&gt;以 &lt;code&gt;http(s)://&lt;/code&gt; 开头的参数&lt;/strong&gt;，其余参数（&lt;code&gt;-o&lt;/code&gt;、&lt;code&gt;-H&lt;/code&gt;、&lt;code&gt;--data&lt;/code&gt; 等）原样透传：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      *)&lt;/span&gt;&lt;span&gt;                  args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改写是&lt;strong&gt;双向可逆&lt;/strong&gt;的：&lt;code&gt;_gp_unmirror&lt;/code&gt; 会先剥掉已有的镜像前缀再按当前开关决定，所以从浏览器复制来的 &lt;code&gt;gh-proxy.com/https://github.com/…&lt;/code&gt; 在关闭状态下会自动还原成直连地址。&lt;/p&gt;
&lt;h3 id=&quot;4-2-di-er-ceng-jie-git-zi-ji-de-url-zhong-xie-gui-ze&quot;&gt;4.2 第二层：借 git 自己的 URL 重写规则&lt;/h3&gt;
&lt;p&gt;git 函数不直接改参数，而是注入 git 原生的重写配置——这样&lt;strong&gt;仓库里记录的 remote 地址仍然是原始 GitHub 地址&lt;/strong&gt;，关掉开关就自动恢复直连，不会把镜像地址固化进 &lt;code&gt;.git/config&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  .&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;           g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;url.&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.insteadOf=https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;git push&lt;/code&gt; 不做任何注入，保持原样——本机全局配置里本来就有 &lt;code&gt;pushInsteadOf = https://github.com/&lt;/code&gt;（推送改走 SSH），所以写操作永远不受影响。&lt;/p&gt;
&lt;p&gt;唯一需要补救的是 &lt;code&gt;git clone&lt;/code&gt;：实测 git 会把&lt;strong&gt;实际使用的地址&lt;/strong&gt;写进 &lt;code&gt;.git/config&lt;/code&gt;。因此 clone 结束后脚本会把 remote 还原成原始地址，子模块一并处理：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; rc&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;     _gp_clone_target_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_fix_remotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_fix_remotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;PWD&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;4-3-di-san-ceng-homebrew-de-shim-cai-shi-jie-guan-dian&quot;&gt;4.3 第三层：Homebrew 的 shim 才是接管点&lt;/h3&gt;
&lt;p&gt;brew 是 Ruby 程序，它发出的请求不经过 zsh。但它调用外部命令时会先经过自己的 shim，而 shim 会执行 &lt;code&gt;$HOMEBREW_CURL&lt;/code&gt; / &lt;code&gt;$HOMEBREW_GIT&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; /opt/homebrew/Library/Homebrew/shims/shared/curl（节选）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;try_exec_non_system&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;safe_exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/usr/bin/curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;而 &lt;code&gt;brew.sh&lt;/code&gt; 的 &lt;code&gt;setup_curl()&lt;/code&gt; / &lt;code&gt;setup_git()&lt;/code&gt; 会优先采纳环境变量：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;elif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  HOMEBREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;于是 &lt;code&gt;github_proxy on&lt;/code&gt; 只要生成两个包装器脚本并导出两个变量，brew 的全部 curl/git 调用就都过我们的手了。验证方式极简——让 brew 自己告诉我们它用的是谁：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;$ HOMEBREW_CURL_PATH=/path/to/wrapper brew config | grep &amp;#39;^Curl:&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Curl: 8.7.1 =&amp;gt; /path/to/wrapper&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;4-4-san-ge-fan-zhi-jue-de-shi-ce-jie-lun&quot;&gt;4.4 三个反直觉的实测结论&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;① brew 会过滤非 &lt;code&gt;HOMEBREW_&lt;/code&gt; 前缀的环境变量。&lt;/strong&gt; 用一个只记录参数的探针包装器挂在 &lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt; 上，同时导出 &lt;code&gt;GITHUB_PROXY_MIRROR&lt;/code&gt; 和 &lt;code&gt;GITHUB_PROXY_DEBUG&lt;/code&gt;，包装器收到的是空值：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MIRROR_ENV=[] DEBUG_ENV=[]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;结论&lt;/strong&gt;：镜像地址不能靠环境变量传给包装器，必须在生成包装器时&lt;strong&gt;写死进文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;② &lt;code&gt;HOMEBREW_ARTIFACT_DOMAIN&lt;/code&gt; 在这版 brew 里只管 ghcr.io。&lt;/strong&gt; 翻源码可以看到它只对 GitHub Packages 域名生效：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;ruby&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Library/Homebrew/download_strategy/curl_download_strategy.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sub&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;%r{&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;^https?://&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;GitHubPackages&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;URL_DOMAIN&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;#{&lt;/span&gt;&lt;span&gt;domain&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; github_packages.rb: URL_DOMAIN = &amp;quot;ghcr.io&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;所以网上那套“设置 &lt;code&gt;HOMEBREW_ARTIFACT_DOMAIN&lt;/code&gt; 就能给所有下载加速“的说法，在 7.x 上对 github.com 无效。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;③ 导出的开关变量会泄漏，导致“关了却还是开着“。&lt;/strong&gt; 早期版本把 &lt;code&gt;GITHUB_PROXY&lt;/code&gt; 导出给子进程判断，结果它被子进程继承，新终端里读到的仍是 &lt;code&gt;1&lt;/code&gt;，状态文件写着 &lt;code&gt;off&lt;/code&gt; 却依然走镜像。修法是让&lt;strong&gt;状态文件成为唯一权威&lt;/strong&gt;，&lt;code&gt;GITHUB_PROXY&lt;/code&gt; 只做本 shell 内镜像变量且不导出；需要临时覆盖时用语义明确的 &lt;code&gt;GITHUB_PROXY_FORCE&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;④ 有些请求的命令行里根本没有 URL。&lt;/strong&gt; &lt;code&gt;brew update&lt;/code&gt; 更新第三方 tap 时执行的是 &lt;code&gt;git -C &amp;lt;tap目录&amp;gt; fetch --force origin&lt;/code&gt;——地址来自仓库 &lt;code&gt;.git/config&lt;/code&gt; 里的 &lt;code&gt;remote.origin.url&lt;/code&gt;。只改写命令行参数的包装器对这类请求完全无效，于是 20 个 tap 各自裸连 github.com，各卡满 75 秒连接超时。&lt;strong&gt;修法&lt;/strong&gt;是让包装器额外注入 git 原生的重写规则：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;url.&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.insteadOf=https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; …改写命令行参数后一并传入&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证方式是用 &lt;code&gt;GIT_TRACE=1&lt;/code&gt; 看真实连接，修复后变成 &lt;code&gt;git-remote-https origin https://gh-proxy.com/https://github.com/&amp;lt;user&amp;gt;/homebrew-tap&lt;/code&gt;；同一台机器上 &lt;code&gt;brew update&lt;/code&gt; 从「20 个 tap 全部 75 秒超时」变成 &lt;strong&gt;14 秒完成、0 失败&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-guan-jian-shi-xian-pian-duan&quot;&gt;5. 关键实现片段&lt;/h2&gt;
&lt;p&gt;生成的 curl 包装器（&lt;code&gt;brew-curl&lt;/code&gt;，由主脚本按当前镜像生成）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#!&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 由 github_proxy.zsh 自动生成，请勿手改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://gh-proxy.com/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/usr/bin/curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    *)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;几个刻意的设计选择：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;只改写白名单域名&lt;/strong&gt;，&lt;code&gt;https://itsycal.s3.amazonaws.com/…&lt;/code&gt; 这类非 GitHub 地址原样直连，避免把镜像当成通用代理而拖垮无关下载。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;REAL&lt;/code&gt; 写死为真实 curl 路径&lt;/strong&gt;（默认 &lt;code&gt;/usr/bin/curl&lt;/code&gt;，设了 &lt;code&gt;HOMEBREW_FORCE_BREWED_CURL&lt;/code&gt; 则用 brew 的 curl），不通过 PATH 查找，杜绝包装器递归调用自己。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;brew-git&lt;/code&gt; 对 &lt;code&gt;push&lt;/code&gt; 直接 &lt;code&gt;exec&lt;/code&gt; 原样放行&lt;/strong&gt;，写操作绝不经过镜像。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;brew-git&lt;/code&gt; 额外注入 &lt;code&gt;-c url.*.insteadOf&lt;/code&gt;&lt;/strong&gt;：brew 更新第三方 tap 用的是 &lt;code&gt;git fetch origin&lt;/code&gt;，命令行里没有 URL，只改写参数的写法会漏掉这类请求（见 4.4 ④）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;off 时还原而非清空&lt;/strong&gt;：如果用户自己设过 &lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt;，脚本先记下原值，关闭时完整还回去。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;调试日志的埋点也很克制——包装器每次只多一次文件存在性判断，&lt;code&gt;github_proxy debug on&lt;/code&gt; 时才追加写入，日常零开销：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;== %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +%T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-ce-shi-yu-yan-zheng&quot;&gt;6. 测试与验证&lt;/h2&gt;
&lt;h3 id=&quot;6-1-tan-zhen-xian-kan-brew-dao-di-qing-qiu-liao-shen-me&quot;&gt;6.1 探针：先看 brew 到底请求了什么&lt;/h3&gt;
&lt;p&gt;把只记录、不改写的探针挂在 &lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt; 上跑一次 &lt;code&gt;brew fetch --build-from-source&lt;/code&gt;，抓到的真实地址正是 USTC 镜像覆盖不到的部分：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;https://raw.githubusercontent.com/Homebrew/homebrew-core/3a68ac0…/Formula/d/dust.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;https://codeload.github.com/bootandy/dust/tar.gz/refs/tags/v1.2.6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;https://github.com/bootandy/dust/archive/refs/tags/v1.2.6.tar.gz&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这解释了为什么配了 USTC 镜像，升级时依然会卡——元数据和 bottle 走了镜像，&lt;strong&gt;formula 定义、源码包、cask 的 app 包仍然是直连&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;6-2-su-du-dui-bi&quot;&gt;6.2 速度对比&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;直连&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;走镜像&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew fetch --cask hiddenbar&lt;/code&gt;（约 2 MB，GitHub Releases）&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;240 s 超时失败&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;2.0 s&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew fetch --cask maccy&lt;/code&gt;（约 5 MB，GitHub Releases）&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;未单独计时&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2.2 s&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew fetch --build-from-source jq&lt;/code&gt;（源码包在 GitHub）&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;单次 &amp;gt;160 s 仍未完成&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;—&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10 MB 单文件三次采样&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;158 / 11 / 45 KB/s&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24 / 51 / 44 KB/s&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;必须诚实地说：&lt;strong&gt;镜像不是恒定更快&lt;/strong&gt;。上表最后一行显示两者都在抖动区间里，本机也测到过镜像 9.4 MB/s 的高峰与几十 KB/s 的低谷。镜像的主要价值是&lt;strong&gt;可达性兜底&lt;/strong&gt;——直连会出现彻底超时（&lt;code&gt;000&lt;/code&gt;）或长时间挂住，镜像通常能救回；具体该开还是该关，用 &lt;code&gt;github_proxy test&lt;/code&gt; 当场判断。&lt;/p&gt;
&lt;h3 id=&quot;6-3-nei-rong-wan-zheng-xing&quot;&gt;6.3 内容完整性&lt;/h3&gt;
&lt;p&gt;经镜像下载的文件全部与原工具校验值一致：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;校验结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tokenizer.json&lt;/code&gt;（9.5 MB，GitHub Releases）&lt;/td&gt;&lt;td&gt;SHA-256 与官方清单一致&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Hidden-Bar-v1.11.1-macos.zip&lt;/code&gt;&lt;/td&gt;&lt;td&gt;与 cask 的 &lt;code&gt;sha256&lt;/code&gt; 一致&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Maccy.app.zip&lt;/code&gt;&lt;/td&gt;&lt;td&gt;与 cask 的 &lt;code&gt;sha256&lt;/code&gt; 一致&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;6-4-on-off-shuang-zhuang-tai-xiao-yan&quot;&gt;6.4 on/off 双状态校验&lt;/h3&gt;
&lt;p&gt;用真正走 &lt;code&gt;source ~/.zshrc&lt;/code&gt; 的全新交互式终端逐项验证：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;ON&lt;/th&gt;&lt;th&gt;OFF&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt;&lt;/td&gt;&lt;td&gt;指向 &lt;code&gt;brew-curl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;未设置&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew config&lt;/code&gt; 的 Curl 行&lt;/td&gt;&lt;td&gt;&lt;code&gt;=&amp;gt; …/bin/brew-curl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;=&amp;gt; /usr/bin/curl&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git ls-remote github.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;正常（走镜像）&lt;/td&gt;&lt;td&gt;直连，可能超时（网络本身抖动）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl&lt;/code&gt; 取 raw.githubusercontent 文件&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;td&gt;200&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew info&lt;/code&gt;（USTC API）&lt;/td&gt;&lt;td&gt;正常&lt;/td&gt;&lt;td&gt;正常&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GitHub 托管的 cask 下载&lt;/td&gt;&lt;td&gt;正常&lt;/td&gt;&lt;td&gt;依赖直连状态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;&lt;/td&gt;&lt;td&gt;走 SSH，不受影响&lt;/td&gt;&lt;td&gt;走 SSH，不受影响&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;另外专门构造了“脏环境“测试：故意 &lt;code&gt;export GITHUB_PROXY=1&lt;/code&gt; 并注入 &lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt;，在状态文件为 &lt;code&gt;off&lt;/code&gt; 时启动新终端——结果正确关闭（&lt;code&gt;HOMEBREW_CURL_PATH&lt;/code&gt; 被清掉、brew 回到 &lt;code&gt;/usr/bin/curl&lt;/code&gt;）。这正是 4.4 ③ 那个缺陷的回归验证。&lt;/p&gt;
&lt;h3 id=&quot;6-5-cai-keng-ji-lu&quot;&gt;6.5 踩坑记录&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;根因&lt;/th&gt;&lt;th&gt;处置&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;改了 &lt;code&gt;HOMEBREW_ARTIFACT_DOMAIN&lt;/code&gt; 对 github 无效&lt;/td&gt;&lt;td&gt;该变量只管 ghcr.io&lt;/td&gt;&lt;td&gt;改用 shim 接管&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;包装器拿不到镜像地址&lt;/td&gt;&lt;td&gt;brew 过滤非 &lt;code&gt;HOMEBREW_&lt;/code&gt; 变量&lt;/td&gt;&lt;td&gt;生成时写死进包装器&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;clone 出来的仓库 push 失败&lt;/td&gt;&lt;td&gt;git 把镜像地址写进了 remote&lt;/td&gt;&lt;td&gt;clone 后自动还原 + 子模块同步&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;off&lt;/code&gt; 后新终端仍走镜像&lt;/td&gt;&lt;td&gt;导出的状态变量被继承&lt;/td&gt;&lt;td&gt;状态文件唯一权威、变量不导出&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew fetch --build-from-source&lt;/code&gt; 仍很慢&lt;/td&gt;&lt;td&gt;该路径会先拉 formula 的 &lt;code&gt;.rb&lt;/code&gt; 与源码包&lt;/td&gt;&lt;td&gt;这两处现在也在白名单里&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-ju-xian-yu-bian-jie&quot;&gt;7. 局限与边界&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;只对&lt;strong&gt;交互式 zsh&lt;/strong&gt; 生效；&lt;code&gt;command git&lt;/code&gt;、绝对路径调用、脚本里的 &lt;code&gt;#!/bin/sh&lt;/code&gt; 不经过函数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;gh&lt;/code&gt; CLI 走自己的 HTTP 客户端，URL 改写对它无效，只能配 &lt;code&gt;HTTPS_PROXY&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;SSH 形式地址保持直连；若 SSH 也不通，可在 &lt;code&gt;~/.ssh/config&lt;/code&gt; 里改用 &lt;code&gt;ssh.github.com:443&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;镜像可达性取决于第三方服务，&lt;code&gt;gh-proxy.com&lt;/code&gt; 之外的其他候选（&lt;code&gt;ghfast.top&lt;/code&gt;、&lt;code&gt;ghproxy.net&lt;/code&gt;、&lt;code&gt;hk.gh-proxy.com&lt;/code&gt;）在本机实测均已失效或极慢，所以脚本保留了“主镜像 + HF 镜像兜底“的顺序，并允许用 &lt;code&gt;GITHUB_PROXY_MIRROR&lt;/code&gt; 随时替换。&lt;/li&gt;
&lt;li&gt;brew 下载的&lt;strong&gt;大件&lt;/strong&gt;（如 cask 里的几百 MB 应用）仍会受镜像带宽限制；此时 &lt;code&gt;brew upgrade&lt;/code&gt; 建议放在 &lt;code&gt;tmux&lt;/code&gt; 里跑。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-su-cha-yu-wei-hu&quot;&gt;8. 速查与维护&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 换镜像&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://你的镜像/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                 #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 重新生成包装器并生效&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只关 Homebrew 接管，保留 git/curl 接管&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BREW_ON&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 排查：看包装器实际请求了哪些地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; debug&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fetch&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-cask&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; maccy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tail&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 20&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.local/state/github-proxy/brew.log&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 体检&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; brew&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; test&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;维护要点：状态目录整体可删（下次开 shell 自动重建）；&lt;code&gt;off&lt;/code&gt; 若发现残留，先 &lt;code&gt;github_proxy off&lt;/code&gt; 再开新终端即可，因为状态文件是唯一权威。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-yi-zhi-dao-bie-ren-de-ji-qi&quot;&gt;9. 移植到别人的机器&lt;/h2&gt;
&lt;h3 id=&quot;9-1-qian-zhi-jian-cha&quot;&gt;9.1 前置检查&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zsh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-version&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 需要 zsh（macOS 自带）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 交互式 shell 的入口配置&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;第一步：决定脚本放哪。&lt;/strong&gt; 任意目录都行，下文统一以 &lt;code&gt;~/.zsh/functions/&lt;/code&gt; 举例。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二步：在 &lt;code&gt;~/.zshrc&lt;/code&gt; 里写出这个路径。&lt;/strong&gt; 这是唯一必须手工添加的一行，路径换成你实际存放的位置：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;source&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zsh/functions/github_proxy.zsh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果同时管理多个自定义函数，可以改成整目录遍历（新增脚本就不用再改 &lt;code&gt;.zshrc&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ~&lt;/span&gt;&lt;span&gt;/.zsh/functions &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    for&lt;/span&gt;&lt;span&gt; func&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        source&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;func&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;改完后可以用这一行确认路径确实被引用了：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;github_proxy\|zsh/functions&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;要求&lt;/strong&gt;：必须是&lt;strong&gt;交互式 zsh&lt;/strong&gt;（&lt;code&gt;~/.zshrc&lt;/code&gt; 只被交互式 shell 加载）。bash、fish、脚本里的 &lt;code&gt;#!/bin/sh&lt;/code&gt; 都不会生效。&lt;/p&gt;
&lt;h3 id=&quot;9-2-fang-zhi-jiao-ben&quot;&gt;9.2 放置脚本&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;方式一（推荐）&lt;/strong&gt;：下载到你选定的目录（下面以 &lt;code&gt;~/.zsh/functions/&lt;/code&gt; 为例，&lt;strong&gt;必须与 9.1 里写进 &lt;code&gt;.zshrc&lt;/code&gt; 的路径一致&lt;/strong&gt;）&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zsh/functions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;fLo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zsh/functions/github_proxy.zsh&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  https://suchaharcan.github.io/03Share_blog/github-proxy-zsh-brew/github_proxy.zsh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;方式二&lt;/strong&gt;：把文末 &lt;strong&gt;附录 A&lt;/strong&gt; 的源码整段复制进你那个路径下的 &lt;code&gt;github_proxy.zsh&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;只需要这一个文件&lt;/strong&gt;。第一次被 source 时，脚本会自己在状态目录里创建运行时文件，各文件的生成时机如下：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;运行时会生成&lt;/th&gt;&lt;th&gt;生成时机&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;bin/brew-curl&lt;/code&gt;、&lt;code&gt;bin/brew-git&lt;/code&gt;&lt;/td&gt;&lt;td&gt;每次加载脚本 / &lt;code&gt;github_proxy on&lt;/code&gt;&lt;/td&gt;&lt;td&gt;镜像地址写死在内的包装器（附录 B）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;state&lt;/code&gt;&lt;/td&gt;&lt;td&gt;第一次执行 &lt;code&gt;on&lt;/code&gt; 或 &lt;code&gt;off&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;on&lt;/code&gt; / &lt;code&gt;off&lt;/code&gt;，默认开启时不写文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;debug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;github_proxy debug on&lt;/code&gt;&lt;/td&gt;&lt;td&gt;空标记文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew.log&lt;/code&gt;（+ &lt;code&gt;.1&lt;/code&gt;）&lt;/td&gt;&lt;td&gt;调试开启且 brew 真正调用包装器时&lt;/td&gt;&lt;td&gt;实际请求的地址，超 1 MB 自动轮转&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;所以&lt;strong&gt;不要&lt;/strong&gt;把 &lt;code&gt;bin/brew-curl&lt;/code&gt; 之类拷给别人用——里面的镜像地址和 &lt;code&gt;REAL&lt;/code&gt; 路径是按本机写死的，交给别人反而失效；让他们从主脚本自动生成即可。&lt;/p&gt;
&lt;h3 id=&quot;9-3-sheng-xiao-yu-yan-shou&quot;&gt;9.3 生效与验收&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zsh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或直接开一个新终端&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 期望：开启（走镜像）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; brew&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;         #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 有 Homebrew 时期望：curl 已接管 / git 已接管&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;逐项自测清单：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;自测命令&lt;/th&gt;&lt;th&gt;期望结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;github_proxy url https://github.com/a/b&lt;/code&gt;&lt;/td&gt;&lt;td&gt;输出带镜像前缀的地址&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git ls-remote https://github.com/octocat/Hello-World.git HEAD&lt;/code&gt;&lt;/td&gt;&lt;td&gt;能拿到 commit hash&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;github_proxy test&lt;/code&gt;&lt;/td&gt;&lt;td&gt;打印镜像/直连两组速度&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew config | grep &#39;^Curl:&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ON 时指向 &lt;code&gt;…/github-proxy/bin/brew-curl&lt;/code&gt;，OFF 时是 &lt;code&gt;/usr/bin/curl&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;brew fetch --cask maccy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;日志（&lt;code&gt;github_proxy debug on&lt;/code&gt;）里出现镜像地址&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git push&lt;/code&gt;（任意自己的仓库）&lt;/td&gt;&lt;td&gt;仍走 SSH，与装之前一致&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;9-4-an-xu-diao-zheng&quot;&gt;9.4 按需调整&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量&lt;/th&gt;&lt;th&gt;默认&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GITHUB_PROXY_MIRROR&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://gh-proxy.com/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;换镜像（&lt;strong&gt;末尾斜杠必须保留&lt;/strong&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GITHUB_PROXY_BREW_ON&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;设为 &lt;code&gt;0&lt;/code&gt; 只关 Homebrew 接管，保留 git/curl 接管&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GITHUB_PROXY_FORCE&lt;/code&gt;&lt;/td&gt;&lt;td&gt;未设置&lt;/td&gt;&lt;td&gt;&lt;code&gt;on&lt;/code&gt; / &lt;code&gt;off&lt;/code&gt; 临时覆盖一次会话，不改状态文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;GITHUB_PROXY_HOSTS&lt;/code&gt;&lt;/td&gt;&lt;td&gt;源码内 7 个域名&lt;/td&gt;&lt;td&gt;要增删改写的域名，改这一处即可&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;路径与平台差异&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;状态目录遵循 XDG：&lt;code&gt;${XDG_STATE_HOME:-$HOME/.local/state}/github-proxy/&lt;/code&gt;，想挪位置改 &lt;code&gt;GITHUB_PROXY_STATE&lt;/code&gt; 一行。&lt;/li&gt;
&lt;li&gt;brew 位置自动探测：Apple Silicon &lt;code&gt;/opt/homebrew&lt;/code&gt;、Intel Mac &lt;code&gt;/usr/local&lt;/code&gt;、Linuxbrew &lt;code&gt;/home/linuxbrew/.linuxbrew&lt;/code&gt;，也可用 &lt;code&gt;HOMEBREW_PREFIX&lt;/code&gt; 显式指定。&lt;/li&gt;
&lt;li&gt;机器上没有 brew 时，Homebrew 那部分会&lt;strong&gt;静默跳过&lt;/strong&gt;，只保留 zsh 层的 git/curl 接管——Linux 用户同样可用。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;9-5-xie-zai&quot;&gt;9.5 卸载&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; off&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 先关闭，撤掉导出的 HOMEBREW_* 变量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  ~/.zsh/functions/github_proxy.zsh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 删脚本（换成你实际的存放路径）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;rf&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.local/state/github-proxy&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 删状态与自动生成的包装器（可随时重建）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zsh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;最后把 &lt;code&gt;~/.zshrc&lt;/code&gt; 里那行 &lt;code&gt;source …/github_proxy.zsh&lt;/code&gt; 一并删掉（用整目录遍历的则跳过这步）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;fu-lu-a-wan-zheng-yuan-ma&quot;&gt;附录 A：完整源码&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;与本文同步的版本共 591 行，文件名 &lt;code&gt;github_proxy.zsh&lt;/code&gt;。
直接下载：&lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/github-proxy-zsh-brew/github_proxy.zsh&quot;&gt;github_proxy.zsh&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#!&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;/usr/bin/env zsh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  github_proxy.zsh —— GitHub 国内加速开关（zsh 交互式环境）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  作用：把在 zsh 里发出的 github 相关请求自动改写到国内加速镜像；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        关闭后立刻恢复直连。默认「开启」。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  用法（github_proxy help 可随时查看）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy            # 看状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy on         # 开启（默认状态）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy off        # 关闭，全部直连&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy toggle     # 切换&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy test       # 实测镜像 vs 直连速度&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy url &amp;lt;URL&amp;gt;  # 只看改写结果，方便排查&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy brew       # 看 Homebrew 接管状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    github_proxy debug on   # 记录包装器实际请求的地址（排查用）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  覆盖范围（只在交互式 zsh 里生效，且不能用 `command xxx` / 绝对路径调用）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ✅ git clone / fetch / pull / ls-remote / submodule / archive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ✅ git push —— 完全不受影响：你自己的 pushInsteadOf 规则会把 https 推送&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       改写成 SSH，镜像只做只读加速，绝不会碰到写操作&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ✅ curl / wget 参数里出现的 github.com、raw.githubusercontent.com、&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       codeload.github.com、gist.github.com、objects.githubusercontent.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ✅ Homebrew —— 用 HOMEBREW_CURL_PATH / HOMEBREW_GIT_PATH 指向本脚本生成的&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       包装器来接管。USTC 镜像只管 API / bottles / 两个核心仓库；brew 升级时对&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       github.com、codeload.github.com、raw.githubusercontent.com 的直连&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       （cask 的 app 包、formula 的源码包、tap 的 formula 定义）由这里加速&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ❌ 程序自身发起的其它请求：npm / pip / go、VS Code、浏览器、focr 等&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       这些不经过 zsh 也不经过 brew，函数无法接管（focr 用 --manifest 方案解决）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ❌ gh CLI：走 api.github.com 且自带客户端，只能用 HTTPS_PROXY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    ❌ SSH 形式（git@github.com:…）：保持直连，国内一般可用；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       若不通，可在 ~/.ssh/config 里改用 ssh.github.com:443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  依赖：git / curl（macOS 自带或 Homebrew 安装均可）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  自定义镜像：export GITHUB_PROXY_MIRROR=&amp;quot;https://你的镜像/&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  只想关掉 Homebrew 接管（保留 git/curl 接管）：export GITHUB_PROXY_BREW_ON=0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 配置区（可用环境变量覆盖）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:=&lt;/span&gt;&lt;span&gt;https&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;gh-proxy&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;com&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 末尾斜杠必须有&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 命中这些域名就改写&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -ga&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_HOSTS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 开关状态持久化位置（默认开启，只有显式 off 才写文件）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;XDG_STATE_HOME&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/github-proxy/state&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---- Homebrew 接管（curl / git 包装器由本脚本生成，固定在状态目录里）----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BIN&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/bin&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BIN&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/brew-curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BIN&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/brew-git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/brew.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; brew 位置：优先用环境变量，缺失时按常见安装路径自动探测&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; （Apple Silicon: /opt/homebrew；Intel Mac: /usr/local；Linuxbrew: ~/.linuxbrew）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  typeset&lt;/span&gt;&lt;span&gt; _gp_p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; _gp_p&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.linuxbrew&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_gp_p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/bin/brew&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;_gp_p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; break&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;opt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;homebrew&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  unset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; _gp_p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_BREW_ON&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_ON&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 0 = 不接管 Homebrew&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 被我们改写之前的值，off 时原样还回去&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -g&lt;/span&gt;&lt;span&gt;  GITHUB_PROXY_PREV_CURL_PATH&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_GIT_PATH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;typeset&lt;/span&gt;&lt;span&gt; -gi&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_CURL_SET&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_GIT_SET&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 内部：状态读写&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_state_read&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; off&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    *)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;              print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 默认开启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 状态文件是唯一权威。GITHUB_PROXY 只作为本 shell 内的镜像变量、且不导出，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 否则它会被子进程/其它程序继承，出现「文件写着 off 但新终端仍是 on」的假象。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 需要临时覆盖时用 GITHUB_PROXY_FORCE=on|off（显式、不会被误继承）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_FORCE-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_state_read&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; on &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_set&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; want&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;want&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  export&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; GITHUB_PROXY&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 不导出：避免泄漏给子进程&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;want&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; on &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    _gp_brew_enable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    _gp_brew_disable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Homebrew 接管&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   brew 调 curl/git 时会把非 HOMEBREW_ 前缀的环境变量过滤掉（实测&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   GITHUB_PROXY_MIRROR 传不进包装器），所以镜像地址必须写死在包装器脚本里，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   每次开启时重新生成一次。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_brew_available&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_ON&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/bin/brew&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_write_brew_wrappers&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BIN&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; tpl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 还原成 brew 原本会用的真实程序&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; real_curl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/opt/curl/bin/curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_FORCE_BREWED_CURL-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;real_curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    real_curl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/usr/bin/curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; real_git&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREFIX&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/bin/git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;real_git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; real_git&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/usr/bin/git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---- curl 包装器：把 github 域名改写到镜像，其余原样放行 ----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;CURL_TPL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# 由 github_proxy.zsh 自动生成，请勿手改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;MIRROR=&amp;quot;__MIRROR__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;REAL=&amp;quot;__REAL__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;MARKER=&amp;quot;__MARKER__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;LOG=&amp;quot;__LOG__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;args=()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;for a in &amp;quot;$@&amp;quot;; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  case &amp;quot;$a&amp;quot; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    https://github.com/*|https://raw.githubusercontent.com/*|https://codeload.github.com/*|https://gist.github.com/*|https://objects.githubusercontent.com/*)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      args+=(&amp;quot;${MIRROR}${a}&amp;quot;) ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    *) args+=(&amp;quot;$a&amp;quot;) ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;if [ -e &amp;quot;$MARKER&amp;quot; ]; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  if [ -f &amp;quot;$LOG&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$(wc -c &amp;lt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null || echo 0)&amp;quot; -gt 1048576 ]; then mv -f &amp;quot;$LOG&amp;quot; &amp;quot;$LOG.1&amp;quot; 2&amp;gt;/dev/null; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  { printf &amp;#39;== %s\n&amp;#39; &amp;quot;$(date +%T)&amp;quot;; for a in &amp;quot;${args[@]}&amp;quot;; do printf &amp;#39;   %s\n&amp;#39; &amp;quot;$a&amp;quot;; done; } &amp;gt;&amp;gt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;exec &amp;quot;$REAL&amp;quot; &amp;quot;${args[@]}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;CURL_TPL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__MIRROR__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__REAL__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;real_curl&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__MARKER__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__LOG__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---- git 包装器：只读操作走镜像，push 原样放行 ----&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  关键点：brew update 更新第三方 tap 时执行的是&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      git -C &amp;lt;tap&amp;gt; fetch --force origin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  命令行里没有 URL，地址来自仓库 .git/config 里的 remote.origin.url。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  因此除了改写命令行参数，还必须注入 git 原生的 insteadOf 重写规则，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  否则这类请求会绕过镜像直接裸连 github.com。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;GIT_TPL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#!/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# 由 github_proxy.zsh 自动生成，请勿手改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;MIRROR=&amp;quot;__MIRROR__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;REAL=&amp;quot;__REAL__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;MARKER=&amp;quot;__MARKER__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;LOG=&amp;quot;__LOG__&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;sub=&amp;quot;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;for a in &amp;quot;$@&amp;quot;; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  case &amp;quot;$a&amp;quot; in -*) continue ;; *) sub=&amp;quot;$a&amp;quot;; break ;; esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;if [ &amp;quot;$sub&amp;quot; = &amp;quot;push&amp;quot; ]; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  if [ -e &amp;quot;$MARKER&amp;quot; ]; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    if [ -f &amp;quot;$LOG&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$(wc -c &amp;lt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null || echo 0)&amp;quot; -gt 1048576 ]; then mv -f &amp;quot;$LOG&amp;quot; &amp;quot;$LOG.1&amp;quot; 2&amp;gt;/dev/null; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    { printf &amp;#39;== %s (push, 原样放行)\n&amp;#39; &amp;quot;$(date +%T)&amp;quot;; for a in &amp;quot;$@&amp;quot;; do printf &amp;#39;   %s\n&amp;#39; &amp;quot;$a&amp;quot;; done; } &amp;gt;&amp;gt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  exec &amp;quot;$REAL&amp;quot; &amp;quot;$@&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# git 原生重写规则：覆盖 remote.origin.url 这类&amp;quot;写在配置里&amp;quot;的地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cfg=()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;for h in github.com raw.githubusercontent.com codeload.github.com gist.github.com; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  cfg+=(-c &amp;quot;url.${MIRROR}https://${h}/.insteadOf=https://${h}/&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;args=()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;for a in &amp;quot;$@&amp;quot;; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  case &amp;quot;$a&amp;quot; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    https://github.com/*|https://raw.githubusercontent.com/*|https://codeload.github.com/*|git@github.com:*)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      args+=(&amp;quot;${MIRROR}${a}&amp;quot;) ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    *) args+=(&amp;quot;$a&amp;quot;) ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;if [ -e &amp;quot;$MARKER&amp;quot; ]; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  if [ -f &amp;quot;$LOG&amp;quot; ] &amp;amp;&amp;amp; [ &amp;quot;$(wc -c &amp;lt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null || echo 0)&amp;quot; -gt 1048576 ]; then mv -f &amp;quot;$LOG&amp;quot; &amp;quot;$LOG.1&amp;quot; 2&amp;gt;/dev/null; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  { printf &amp;#39;== %s\n&amp;#39; &amp;quot;$(date +%T)&amp;quot;; for a in &amp;quot;${args[@]}&amp;quot;; do printf &amp;#39;   %s\n&amp;#39; &amp;quot;$a&amp;quot;; done; } &amp;gt;&amp;gt; &amp;quot;$LOG&amp;quot; 2&amp;gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;exec &amp;quot;$REAL&amp;quot; &amp;quot;${cfg[@]}&amp;quot; &amp;quot;${args[@]}&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;GIT_TPL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__MIRROR__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__REAL__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;real_git&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__MARKER__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;__LOG__&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tpl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  chmod&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 755&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_brew_enable&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_brew_available&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_write_brew_wrappers&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_CURL_SET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;     [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY_PREV_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY_PREV_CURL_SET&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  export&lt;/span&gt;&lt;span&gt; HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_GIT_SET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;     [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY_PREV_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_PROXY_PREV_GIT_SET&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  export&lt;/span&gt;&lt;span&gt; HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_brew_disable&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_CURL_SET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;       [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREV_CURL_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      export&lt;/span&gt;&lt;span&gt; HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREV_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      unset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; HOMEBREW_CURL_PATH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; GITHUB_PROXY_PREV_GIT_SET&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;       [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREV_GIT_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      export&lt;/span&gt;&lt;span&gt; HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_PREV_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      unset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; HOMEBREW_GIT_PATH&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_brew_active&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;     &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 内部：URL 改写&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_is_github_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; rest&lt;/span&gt;&lt;span&gt; host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; http://&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; https://&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  rest&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  host&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;rest&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  host&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  host&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;##&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ((&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_HOSTS&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;(I)&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 加镜像前缀&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_mirror&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_is_github_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 去掉已存在的镜像前缀（复制粘贴带前缀的地址也能正确还原）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_unmirror&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 归一化 + 按当前开关改写：这是所有包装器共用的出口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  u&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_unmirror&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    _gp_mirror&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 包装器 1：curl&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      *)&lt;/span&gt;&lt;span&gt;                  args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 包装器 2：wget&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wget&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      *)&lt;/span&gt;&lt;span&gt;                  args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; wget&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 内部：把一个仓库（含子模块）里指向镜像的 remote 地址还原成原始地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   git clone 会把&amp;quot;实际使用的地址&amp;quot;写进 .git/config，若不还原，之后 push&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   这条 remote 会指向镜像（镜像不支持写操作）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_fix_remotes_one&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span&gt; clean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; remote&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    url&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; remote&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; get-url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; continue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    clean&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_unmirror&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; remote&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; set-url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_fix_remotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; mod&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_fix_remotes_one&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; mod&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;N/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    _gp_fix_remotes_one&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;mod&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 从 clone 的参数里找出目标目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_clone_target_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; $#&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; url&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      continue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; continue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; break&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;url&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\?&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 去掉 query，取路径最后一段&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 包装器 3：git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   通过注入 git 自身的 URL 重写规则实现：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     · 读操作（clone/fetch/pull/...）自动走镜像&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     · 写操作（push）不注入任何规则，保持你原有的 SSH 推送习惯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     · clone 结束后把 remote 还原成原始 github 地址，仓库保持&amp;quot;干净&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 找出子命令（跳过选项）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; sub&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; continue&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    sub&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; break&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; -a&lt;/span&gt;&lt;span&gt; cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  for&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;           g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;url.&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.insteadOf=https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; rc&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;?&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; clone / submodule 之后收拾 remote 地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; rc&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        local&lt;/span&gt;&lt;span&gt; target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        target&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_clone_target_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_fix_remotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;target&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;      s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        _gp_fix_remotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;PWD&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  return&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;rc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 对外命令&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ---------------------------------------------------------------------------&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 帮助文本（github_proxy help / -h / --help / usage / 参数写错时显示）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_help&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;关闭（直连）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;开启（走镜像）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;github_proxy —— GitHub 国内加速开关（当前：&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy            # 看状态&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy on         # 开启（默认状态）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy off        # 关闭，全部直连&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy toggle     # 切换&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy test       # 实测镜像 vs 直连速度&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy url &amp;lt;URL&amp;gt;  # 只看改写结果，方便排查&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy brew       # 看 Homebrew 接管状态&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  github_proxy debug on   # 记录包装器实际请求的地址（排查用）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;接管范围：&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  git clone / fetch / pull / ls-remote / submodule / archive  → 走镜像&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  git push                                                   → 不受影响，仍走你的 SSH&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  curl / wget 中的 github 域名                               → 走镜像&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  Homebrew 升级时的 github 直连（cask 的 app 包、formula 源码、&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  tap 的 formula 定义 —— USTC 镜像管不到的部分）              → 走镜像&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;接管不到：&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  npm / pip / go、VS Code、浏览器、focr 等程序自身发起的请求&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  gh CLI（走 api.github.com，只能用 HTTPS_PROXY）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  SSH 形式地址 git@github.com:…&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; brew_state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;未接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_brew_active&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; brew_state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已接管（brew 的 curl/git → 包装器）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Homebrew：&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;brew_state&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;镜像：    &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   （用 GITHUB_PROXY_MIRROR 环境变量可替换）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;状态文件：&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;临时覆盖：GITHUB_PROXY_FORCE=off zsh   （只影响这一次会话，不动状态文件）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;  local&lt;/span&gt;&lt;span&gt; cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cmd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_set&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;GitHub 代理：已开启  →  &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_set&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; off&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;GitHub 代理：已关闭  →  直连 github.com（国内通常很慢或超时）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; off&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; github_proxy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; on&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      local&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;关闭（直连）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;开启（走镜像）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      local&lt;/span&gt;&lt;span&gt; brew_state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;未接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_brew_active&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; brew_state&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;GitHub 代理：&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;镜像地址： &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Homebrew： &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;brew_state&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;（github_proxy brew 看详情）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;接管的域名：&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;(&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;)&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_HOSTS&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;状态文件： &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      local&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;未接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;未接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; gen&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;缺失&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH-&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已接管&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_CURL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_GIT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; gen&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已生成&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Homebrew 接管：curl &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; / git &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  包装器：        &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;gen&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;（&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BIN&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  HOMEBREW_CURL_PATH=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_CURL_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;（未设置）&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  HOMEBREW_GIT_PATH =&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;HOMEBREW_GIT_PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;（未设置）&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ((&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+&lt;/span&gt;&lt;span&gt;commands&lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;brew&lt;/span&gt;&lt;span&gt;] &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  brew 实测：&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;^(Curl|Git):&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; sed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s/^/    /&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  说明：USTC 镜像管 API / bottles / 两个核心仓库；&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        cask 的 app 包、formula 源码包、tap 定义仍会直连 github.com，&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        开启后由本包装器改写（下载完仍由 brew 校验 sha256）。&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:-&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;          [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_STATE_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;          :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;          print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;调试日志：已开启  →  &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;          print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  （只记录 brew 经包装器发出的请求；用 github_proxy debug off 关闭）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;          ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;          command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;          print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;调试日志：已关闭（日志文件保留在 &lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;          ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        *)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;          if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_DEBUG_MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;调试日志：开启（&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_BREW_LOG&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;）&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;          else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;调试日志：关闭&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;          fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;          ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;ru2&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;用法：github_proxy url &amp;lt;URL&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_gp_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;      local&lt;/span&gt;&lt;span&gt; probe_gh&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://github.com/Dicklesworthstone/franken_ocr/releases/download/models-v1/tokenizer.json&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;探测文件：tokenizer.json (9.5 MB)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-- 镜像 --&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;sL&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-max-time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 25&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;   $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\n   速度 %{speed_download} B/s  HTTP %{http_code}\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;GITHUB_PROXY_MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;probe_gh&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-- 直连 --&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      command&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;sL&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-max-time&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 15&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   https://github.com\n   速度 %{speed_download} B/s  HTTP %{http_code}\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;probe_gh&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    *)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;ru2&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;github_proxy: 未知参数 &amp;#39;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;cmd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;ru2&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;      _gp_help&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;      return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 让本 shell 内的脚本能判断开关状态：GITHUB_PROXY 故意「不导出」，&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 免得它被子进程继承（曾导致状态文件为 off 时新终端仍判为开启）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; -n&lt;/span&gt;&lt;span&gt; GITHUB_PROXY&lt;/span&gt;&lt;span&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;unset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; GITHUB_PROXY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 同步状态 + Homebrew 接管（静默执行，加载时不打印任何东西）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; _gp_enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GITHUB_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_brew_enable&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GITHUB_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  _gp_brew_disable&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;fu-lu-b-zi-dong-sheng-cheng-de-wen-jian-chang-shen-me-yang&quot;&gt;附录 B：自动生成的文件长什么样&lt;/h2&gt;
&lt;p&gt;主脚本会在 &lt;code&gt;~/.local/state/github-proxy/&lt;/code&gt; 下生成运行时文件。它们不需要你提供，但值得先看清楚——这毕竟是一个会往你磁盘写可执行文件的操作。下面以本机为例（家目录用 &lt;code&gt;~&lt;/code&gt; 简写）。&lt;/p&gt;
&lt;h3 id=&quot;b-1-bin-brew-curl-19-xing&quot;&gt;B.1 &lt;code&gt;bin/brew-curl&lt;/code&gt;（19 行）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#!&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 由 github_proxy.zsh 自动生成，请勿手改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://gh-proxy.com/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/usr/bin/curl&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;~/.local/state/github-proxy/debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;~/.local/state/github-proxy/brew.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    *)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -gt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1048576&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mv&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;== %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +%T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;MIRROR&lt;/code&gt; 与 &lt;code&gt;REAL&lt;/code&gt; 在生成时就写死——brew 会把非 &lt;code&gt;HOMEBREW_&lt;/code&gt; 前缀的环境变量过滤掉（见 4.4 ①），靠环境变量传参行不通。&lt;/li&gt;
&lt;li&gt;只改写白名单里的 5 个 GitHub 域名，其它 URL（S3、CDN 等）原样放行。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;exec &quot;$REAL&quot;&lt;/code&gt; 用绝对路径，避免包装器递归调用自己。&lt;/li&gt;
&lt;li&gt;日志只在 &lt;code&gt;debug&lt;/code&gt; 标记存在时写入，且超过 1 MB 自动轮转成 &lt;code&gt;brew.log.1&lt;/code&gt;，忘记关也不会撑爆磁盘。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;b-2-bin-brew-git-35-xing&quot;&gt;B.2 &lt;code&gt;bin/brew-git&lt;/code&gt;（35 行）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#!&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;/bin/bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 由 github_proxy.zsh 自动生成，请勿手改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://gh-proxy.com/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/opt/homebrew/bin/git&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;~/.local/state/github-proxy/debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;~/.local/state/github-proxy/brew.log&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; continue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *)&lt;/span&gt;&lt;span&gt; sub&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; break&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;sub&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -gt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1048576&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mv&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;== %s (push, 原样放行)\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +%T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; git 原生重写规则：覆盖 remote.origin.url 这类&amp;quot;写在配置里&amp;quot;的地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; h&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cfg&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;url.&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.insteadOf=https://&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  case&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;h&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;MIRROR&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    *)&lt;/span&gt;&lt;span&gt; args&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  esac&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;MARKER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -gt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1048576&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mv&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;== %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +%T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   %s\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;LOG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;REAL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;cfg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;args&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与 curl 版的两点差异：&lt;code&gt;push&lt;/code&gt; 直接 &lt;code&gt;exec&lt;/code&gt; 原样放行，写操作绝不经过镜像；地址白名单里除 https 之外还认 &lt;code&gt;git@github.com:&lt;/code&gt; 这种 SSH 形式。&lt;/p&gt;
&lt;h3 id=&quot;b-3-ling-wai-san-ge-wen-jian&quot;&gt;B.3 另外三个文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;state&lt;/code&gt;：3 字节文本，内容 &lt;code&gt;on&lt;/code&gt; 或 &lt;code&gt;off&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;debug&lt;/code&gt;：0 字节标记文件，存在即记录、删除即停止。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew.log&lt;/code&gt; / &lt;code&gt;brew.log.1&lt;/code&gt;：纯文本追加日志，形如：&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;== 10:23:15&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   --disable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   --fail&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   --location&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   https://gh-proxy.com/https://github.com/p0deje/Maccy/releases/download/2.7.1/Maccy.app.zip&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;github_proxy debug off&lt;/code&gt; 只删除标记文件，日志保留供事后查看；想彻底清空直接删掉 &lt;code&gt;brew.log&lt;/code&gt; 即可。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git</title>
        <published>2026-09-29T00:00:00+00:00</published>
        <updated>2026-10-15T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CXX20/git/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CXX20/git/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CXX20/git/">&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;定期更新 该博客&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;日常开发中遇到的 git场景 ，在搜索应用后，总结到这里来，便于后续积累迁移&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;clone-chu-ci-la-qu&quot;&gt;clone - 初次拉取&lt;/h1&gt;
&lt;h2 id=&quot;dan-fen-zhi-wu-li-shi-ti-jiao-shi&quot;&gt;单分支无历史提交式&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;场景描述：只获取最新，分支标签关联仓库历史提交全部舍弃&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git clone --depth 1 --single-branch --branch main --no-tags \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  https://mirrors.tuna.tsinghua.edu.cn/git/llvm-project.git \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ~/00CXX_GitRes/llvm-project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;–depth 1 只取最新一条提交&lt;/li&gt;
&lt;li&gt;–single-branch 不抓其它分支（LLVM 有几千个分支，不限制会多几百 MB）&lt;/li&gt;
&lt;li&gt;–no-tags 不抓 tag（LLVM 的 tag 极多，这是体积大头之一）&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hao-xi-guan&quot;&gt;好习惯&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;克隆完立刻把“只更新 main、永不抓 tag、自动清理“固化进本地配置：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/00CXX_GitRes/llvm-project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 良好习惯，后续每次拉取都要针对该本地仓库的基础配置进行优先设置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# bat .git/config ##进行查看该本地仓库的配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; remote.origin.fetch&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;+refs/heads/main:refs/remotes/origin/main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; remote.origin.tagOpt&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-no-tags&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fetch.prune&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fetch.pruneTags&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; gc.pruneExpire&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; now&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;chang-yong-bie-ming&quot;&gt;常用别名&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 一条命令完成&amp;quot;取最新快照 + 丢弃本地提交/改动&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; alias.update&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;!git fetch --depth 1 --no-tags --prune origin main &amp;amp;&amp;amp; git reset --hard origin/main &amp;amp;&amp;amp; git log --oneline -1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 定期瘦身&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-local&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; alias.slim&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;!git reflog expire --expire=now --all &amp;amp;&amp;amp; git gc --prune=now --quiet &amp;amp;&amp;amp; git count-objects -vH&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：Git 没有持久化的“默认浅深度“配置项（fetch.depth 不是有效键，我查了本机 git 2.55 的配置文档确认过）。&lt;br/&gt;
所以 –depth 1 必须每次 fetch 时显式带上——这正是 git update 别名帮你固化的事，&lt;br/&gt;
别直接敲裸 &lt;code&gt;git pull&lt;/code&gt;。&lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;hou-xu-geng-xin-yong-yuan-zhi-you-yi-fen-kuai-zhao&quot;&gt;后续更新：永远只有一份快照&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/00CXX_GitRes/llvm-project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; = fetch --depth 1 + reset --hard，等价于下面两行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;yan-zheng-que-shi-mei-zai-zan-li-shi&quot;&gt;验证“确实没在攒历史“&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 任何时候三条命令自检：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; rev-parse&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-is-shallow-repository&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 必须是 true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; rev-list&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-count&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; HEAD&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 必须恒等于 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tag&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                         #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 必须恒等于 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; count-objects&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;vH&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; size-pack 明显膨胀时跑一次 git slim&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;如果 is-shallow-repository 变成 false，说明中间某次更新用了不带 –depth 的命令（或镜像不支持 shallow 而返回了全量），最省事的处理是删掉重克隆一次。&lt;br/&gt;
额外网络优化（可选）：git config –global http.version HTTP/1.1 和 git config –global http.postBuffer 524288000 能缓解大包传输偶发卡死；如果你本机有代理（看到你装过 Geph），可以只给 GitHub 走代理、国内镜像直连&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;dai-ma-ti-jiao-gen-zong-guan-li-gitignore&quot;&gt;代码提交跟踪管理 - .gitignore&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;忽略整个文件夹‌：logs/ 或 logs/**，匹配该目录及子目录下的所有文件。&lt;/li&gt;
&lt;li&gt;仅忽略文件夹内文件，保留文件夹本身‌：logs/*，不会忽略空目录，但会忽略其直接子文件和子目录。&lt;/li&gt;
&lt;li&gt;取消对已跟踪文件的忽略‌：.gitignore 只对未跟踪文件生效；若文件已提交，需先执行 git rm –cached &amp;lt;路径&amp;gt;，再提交删除记录&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;build/*&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;cmake搭建的C++项目，编译文件不提交，但该空目录是编译构建路径，建议提交，可采用该写法&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;logs/**&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 日志在项目运行实时产生，无需提交到仓库中进行跟踪管理&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;add-tian-jia-dao-cang-ku&quot;&gt;add - 添加到仓库&lt;/h1&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;commit-ti-jiao&quot;&gt;commit - 提交&lt;/h1&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Update File md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;push-tui-song&quot;&gt;push - 推送&lt;/h1&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; push&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; origin&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mian&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;status-zhuang-tai&quot;&gt;status - 状态&lt;/h1&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;e-wai-chang-jian-ming-ling&quot;&gt;额外常见命令&lt;/h1&gt;
&lt;h2 id=&quot;cloc-tong-ji-dai-ma-liang&quot;&gt;cloc - 统计代码量&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cloc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 在当前目录下按文件类型进行代码量统计&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-09-26T08:30:00+00:00</published>
        <updated>2026-09-26T08:30:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-09-26t08-30-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-09-26t08-30-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-09-26t08-30-00z/">&lt;p&gt;2026年09月26日 16:30（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;wang-zhan-yin-qing-sheng-ji-zola-0-23-6-ametrine-tera2-qian-yi-wan-cheng-kan-ban-gui-dang-re-li-tu-xiu-fu&quot;&gt;网站引擎升级：Zola 0.23.6 + Ametrine tera2 迁移完成 · 看板/归档/热力图修复&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮把整站从「Zola 0.22 时代」推到 &lt;strong&gt;Zola 0.23.6 + Ametrine tera2&lt;/strong&gt;，并顺手修掉三处长期不舒服的地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;引擎与主题升级&lt;/strong&gt;：主题子仓库由 &lt;code&gt;main&lt;/code&gt; 切到同仓库的 &lt;code&gt;tera2&lt;/code&gt; 分支，适配 Tera 2；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;模板全量迁移&lt;/strong&gt;：旧语法（宏导入、宏调用、shortcode、&lt;code&gt;concat&lt;/code&gt; 过滤器）逐条改写为新语法，&lt;code&gt;zola build&lt;/code&gt; 重新跑通；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能修复&lt;/strong&gt;：看板界面恢复渲染与编辑、归档剔除无标题的空链接、热力图支持月初标记与悬浮日期。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-wei-shen-me-yao-huan-dao-tera2&quot;&gt;一、为什么要换到 tera2&lt;/h2&gt;
&lt;p&gt;Zola 0.23.6 内置的模板引擎已经是 &lt;strong&gt;Tera 2&lt;/strong&gt;，它删掉了一批我们一直在用的老写法：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;旧写法（Tera 1 / 老主题 main）&lt;/th&gt;&lt;th&gt;现状&lt;/th&gt;&lt;th&gt;新写法（Zola 0.23.6）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{% import &quot;macros/macros.html&quot; as macros %}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;标签已移除，直接报 &lt;code&gt;Unknown tag&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;{% component 名字(参数) %}&lt;/code&gt; 定义，&lt;code&gt;{{ &amp;lt;名字 参数/&amp;gt; }}&lt;/code&gt; 调用&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;{{ macros::icon(name=&quot;x&quot;) }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;不再是合法表达式&lt;/td&gt;&lt;td&gt;&lt;code&gt;{{ &amp;lt;icon name=&quot;x&quot;/&amp;gt; }}&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;`{{ 列表&lt;/td&gt;&lt;td&gt;concat(with=另一个列表) }}`&lt;/td&gt;&lt;td&gt;过滤器已移除&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/shortcodes/*.html&lt;/code&gt; + &lt;code&gt;{{ 短代码() }}&lt;/code&gt;&lt;/td&gt;&lt;td&gt;shortcode 机制被组件取代&lt;/td&gt;&lt;td&gt;放到 &lt;code&gt;templates/components/*.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;trim_start_matches&lt;/code&gt; / &lt;code&gt;slice&lt;/code&gt; / &lt;code&gt;filter(attribute=…)&lt;/code&gt; / &lt;code&gt;linebreaksbr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;过滤器已移除&lt;/td&gt;&lt;td&gt;&lt;code&gt;trim_start&lt;/code&gt;、数组切片 &lt;code&gt;arr[1:-1]&lt;/code&gt;、&lt;code&gt;for&lt;/code&gt; 循环筛选&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;结论：只升级 Zola 不动主题，整站会在第一个模板处就编译失败；旧主题 &lt;code&gt;main&lt;/code&gt; 与新引擎不兼容，所以必须用为重写而生的 &lt;code&gt;tera2&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;er-zi-cang-ku-yu-gou-jian-huan-jing&quot;&gt;二、子仓库与构建环境&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;themes/ametrine&lt;/code&gt;：&lt;code&gt;main&lt;/code&gt; → &lt;code&gt;tera2&lt;/code&gt;（&lt;code&gt;f125214&lt;/code&gt;），嵌套的 &lt;code&gt;icons&lt;/code&gt; 子模块同步到 &lt;code&gt;859c0e7&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;/&quot;&gt;.gitmodules&lt;/a&gt;: 增加 &lt;code&gt;branch = tera2&lt;/code&gt;，子仓库自身的 &lt;code&gt;branch.&amp;lt;name&amp;gt;&lt;/code&gt; 也指向 &lt;code&gt;tera2&lt;/code&gt;，以后 &lt;code&gt;git submodule update --remote&lt;/code&gt; 会跟着 tera2 走；&lt;/li&gt;
&lt;li&gt;本地 &lt;code&gt;zola --version&lt;/code&gt; = &lt;code&gt;0.23.6&lt;/code&gt;，主题要求 &lt;code&gt;min_version = 0.22.1&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 切换并拉取子仓库新分支&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; origin&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prune&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; checkout&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tera2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; origin/tera2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 构建&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或 ./build-site.sh（含加密同步 + 后置校验）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;san-zhan-dian-ce-qian-yi-qing-dan&quot;&gt;三、站点侧迁移清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;宏 → 组件&lt;/strong&gt;：&lt;code&gt;article_list&lt;/code&gt;、&lt;code&gt;kanban&lt;/code&gt;、&lt;code&gt;kanban_list&lt;/code&gt;、&lt;code&gt;nanolog_list&lt;/code&gt;、&lt;code&gt;music_player&lt;/code&gt;、&lt;code&gt;badges&lt;/code&gt;、&lt;code&gt;beeper&lt;/code&gt;、&lt;code&gt;now_playing&lt;/code&gt;、&lt;code&gt;online&lt;/code&gt;、&lt;code&gt;design&lt;/code&gt;、&lt;code&gt;design_app&lt;/code&gt; 等模板里的宏调用全部换成 &lt;code&gt;{{ &amp;lt;icon …/&amp;gt; }}&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;导入 → 直接包含&lt;/strong&gt;：&lt;code&gt;basb.html&lt;/code&gt; 原本通过宏渲染 &lt;code&gt;basb_list.html&lt;/code&gt;，改为设置变量后 &lt;code&gt;{% include %}&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;未使用的宏文件 → 组件&lt;/strong&gt;：&lt;code&gt;templates/macros/encryption.html&lt;/code&gt;（早已没人调用）拆成 &lt;code&gt;templates/components/&lt;/code&gt; 下 3 个组件：&lt;code&gt;is_encrypted_page&lt;/code&gt;、&lt;code&gt;payload_data_path&lt;/code&gt;、&lt;code&gt;page_encrypt_enabled&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;区块 shortcode → 组件&lt;/strong&gt;：10 个板块首页的 ASCII 电子屏横幅由 &lt;code&gt;{% crt(label=…) %}&lt;/code&gt; 改为 &lt;code&gt;{% &amp;lt;crt label=&quot;…&quot;&amp;gt; %}&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;过滤器替换&lt;/strong&gt;：&lt;code&gt;archive.html&lt;/code&gt;、&lt;code&gt;heatmap_component.html&lt;/code&gt;、&lt;code&gt;kanban_heatmap_component.html&lt;/code&gt;、&lt;code&gt;article_list.html&lt;/code&gt; 的 &lt;code&gt;concat&lt;/code&gt; 改成展开语法；&lt;code&gt;age.html&lt;/code&gt; 的 &lt;code&gt;as_str&lt;/code&gt;/&lt;code&gt;slice&lt;/code&gt; 改成字符串拼接 + 数组切片；&lt;code&gt;games.html&lt;/code&gt; 的 &lt;code&gt;filter(attribute=…)&lt;/code&gt; 改成循环筛选；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tera 2 更严格的两点&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;子模板顶层只能出现 &lt;code&gt;extends&lt;/code&gt; / &lt;code&gt;block&lt;/code&gt; / &lt;code&gt;component&lt;/code&gt;，&lt;code&gt;index.html&lt;/code&gt;、&lt;code&gt;basb.html&lt;/code&gt;、&lt;code&gt;404.html&lt;/code&gt; 里游离的 HTML 与注释被收进区块；&lt;/li&gt;
&lt;li&gt;访问可能不存在的字段要写成可选链，例如 &lt;code&gt;page.extra.encryption?.encrypt&lt;/code&gt;、&lt;code&gt;paginator?.pages&lt;/code&gt;；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档型文章&lt;/strong&gt;：模板速查、v1.0 发布说明、4 篇 nanolog、CMake 文章里用来演示的模板代码，统一改成 Tera 的 raw 区块包裹（避免示例被当成真模板执行），页面展示内容保持不变。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;si-zhu-ti-ce-xiu-fu-tera2-reng-shu-yu-fa-bu-zhuang-tai&quot;&gt;四、主题侧修复（tera2 仍属预发布状态）&lt;/h2&gt;
&lt;p&gt;tera2 分支自带两处小毛病，已在本地补齐（后续若更新子仓库需重新打补丁，建议同时上报上游）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;templates/partials/head.html&lt;/code&gt;：&lt;code&gt;[...styles, page.extra.styles]&lt;/code&gt; 这类写法在 Tera 2 里是「把数组塞进数组」，会导致每页/每板块的 &lt;code&gt;styles&lt;/code&gt;、&lt;code&gt;scripts&lt;/code&gt; 渲染成 &lt;code&gt;/[ kanban style.css&quot;]&lt;/code&gt; 之类的乱码路径 —— &lt;strong&gt;这正是看板页 CSS/JS 全都没加载、界面只有裸骨架的根因&lt;/strong&gt;。已改为展开 + 字符串兼容写法；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;templates/partials/header.html&lt;/code&gt;：404 页没有 &lt;code&gt;section&lt;/code&gt; 变量，&lt;code&gt;section.generate_feeds&lt;/code&gt; 会直接抛错，已改为 &lt;code&gt;section?.generate_feeds&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;wu-ben-lun-gong-neng-xiu-fu&quot;&gt;五、本轮功能修复&lt;/h2&gt;
&lt;h3 id=&quot;5-1-kan-ban-kanban&quot;&gt;5.1 看板（/kanban/）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;界面恢复渲染&lt;/strong&gt;：资源路径修好后，&lt;code&gt;kanban/style.css&lt;/code&gt; 与 4 个看板脚本正常加载，卡片布局与进度条恢复正常；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认月份不再是空窗&lt;/strong&gt;：以前默认选中「当前月」，当月还没写看板时列表一片空白；现在当月没有看板会&lt;strong&gt;自动回退到最近一个有看板的月份&lt;/strong&gt;，并支持年 / 月下拉切换；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;空态提示&lt;/strong&gt;：选中的月份确实没有看板时，列表区给出「该月暂无看板，可切换月份或点击 ＋ 新建看板」的提示，而不是留白；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;新建看板可触发&lt;/strong&gt;：&lt;code&gt;＋ 新建看板&lt;/code&gt; 按钮正常出现并打开 GUI 编辑器（看板信息、列、卡片、重要等级、背景色、Markdown 预览、生成并复制、Token 同步）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编辑看板可用&lt;/strong&gt;：左上角站点图标连点 6 次进入管理员模式后，卡片右上角 &lt;code&gt;✎ 编辑&lt;/code&gt; 出现，点击即带入该看板的原始 Markdown 进入「修改」模式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-2-gui-dang-archive&quot;&gt;5.2 归档（/archive/）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;弄清「无目标文章链接」的成因&lt;/strong&gt;：归档列表之前把 &lt;code&gt;nanolog&lt;/code&gt; 的文章也一起聚合了，而 nanolog 正文没有 &lt;code&gt;title&lt;/code&gt; 字段（标题由时间生成），于是渲染出一堆只有日期、点进去也不知道是什么的空链接；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修复&lt;/strong&gt;：归档范围收缩回既定板块（英语、数学、分享、写博客、工程、Debug），&lt;strong&gt;不再收录 nanolog&lt;/strong&gt;；同时给标题加上兜底（无 &lt;code&gt;title&lt;/code&gt; 时退回 slug 或「（无标题）」），保证每条明细都有章节名。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-3-re-li-tu-gui-dang-ye-wen-zhang-ye-kan-ban-ye&quot;&gt;5.3 热力图（归档页 / 文章页 / 看板页）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;月初标记&lt;/strong&gt;：每月 1 号的格子上加了一个金色圆点 + 描边（看板年视图里是「包含 1 号的那一周」），一眼能看出月份分界；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;悬浮看日期&lt;/strong&gt;：所有格子（包括没有文章的空白格）悬浮都会显示 &lt;code&gt;年-月-日&lt;/code&gt;，有文章时附加篇数与标题，月初再加「月初」提示；&lt;/li&gt;
&lt;li&gt;空白格改用 &lt;code&gt;aria-disabled&lt;/code&gt; 而不是 &lt;code&gt;disabled&lt;/code&gt;，这样禁用状态的格子也能响应悬浮提示。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;liu-yan-zheng&quot;&gt;六、验证&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                     #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 通过：272 个 HTML 页面&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scripts/verify-kanban-build.mjs&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 通过：5 个看板周页与列表卡片一致&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;浏览器实测：&lt;code&gt;/kanban/&lt;/code&gt; 卡片显示、&lt;code&gt;＋ 新建看板&lt;/code&gt; 打开编辑器、管理员模式后 &lt;code&gt;✎ 编辑&lt;/code&gt; 带入原文、Markdown 生成与复制正常；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/archive/&lt;/code&gt; 共 55 条明细，0 条 nanolog、0 条空标题，热力图 12 个月均有月初标记；&lt;/li&gt;
&lt;li&gt;文章页热力图（近 35 天）与看板月/年视图的月初标记、悬浮日期均已生效。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;qi-yi-zhi-wen-ti-yu-hou-xu&quot;&gt;七、已知问题与后续&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;tera2 仍是预发布分支，上面两处主题补丁属于本地修改，跟上游同步后需要重新打（或等上游合并）；&lt;/li&gt;
&lt;li&gt;构建时仍有主题的弃用警告：4 处 &lt;code&gt;get_taxonomy_url(name=…)&lt;/code&gt; 建议改用 &lt;code&gt;term=&lt;/code&gt;；代码块语言 &lt;code&gt;tera&lt;/code&gt; / &lt;code&gt;git&lt;/code&gt; / &lt;code&gt;Plaintext&lt;/code&gt; 未被高亮器识别（仅警告，不影响输出）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;content/archive/_index.md&lt;/code&gt; 的 &lt;code&gt;aliases = [&quot;Archive&quot;]&lt;/code&gt; 与真实目录 &lt;code&gt;/archive/&lt;/code&gt; 在 macOS（大小写不敏感）上会互相覆盖，部署到 Linux 环境不受影响；&lt;/li&gt;
&lt;li&gt;归档目前已剔除 nanolog；如果之后希望 nanolog 也进归档，需要先给 nanolog 生成标题再放开。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/archive/&quot;&gt;归档&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划看板&lt;/a&gt; · &lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine&quot;&gt;Ametrine 主题&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>M4 Mini 外置显示器重启后 分辨率重置问题</title>
        <published>2026-09-16T00:00:00+00:00</published>
        <updated>2026-09-16T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/betterdisplay-uninstall/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/betterdisplay-uninstall/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/betterdisplay-uninstall/">&lt;p&gt;已经查清楚了。结论先给你：&lt;strong&gt;这次分辨率变成 800×600，不是某个软件或脚本“主动设置”的，而是屏幕重新上电时发生了一次热插拔抖动，系统没能读到显示器的 EDID（模式列表），于是触发了 macOS 自带的“安全模式回退”，最后落到了 800×600。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;下面是我从系统日志里还原出的完整时间线（今天 09:34:50 附近，正好是你说的最近一次关屏再开屏）：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;09:34:50.731&lt;/strong&gt; 屏幕重新上电，系统报 &lt;code&gt;Display 1 hot plug in&lt;/code&gt;。这次 EDID 读取是成功的，显示器被正确识别为 &lt;strong&gt;Kuycon G27P&lt;/strong&gt;，模式是 5120×2880，也就是你平时看到的 &lt;strong&gt;2560×1440（HiDPI）&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;09:34:51.109&lt;/strong&gt; 显示器又立刻掉线了一次，日志报 &lt;code&gt;Display 1 hot plug 0&lt;/code&gt;。这就是“上电瞬间热插拔抖动”。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;紧接着系统报出关键错误：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;Preferred mode missing: display 0x1 pref=0x0&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;No valid CA modes found for display 1&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;意思是：系统已经拿不到这个显示器的任何有效模式了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;09:34:51.723 前后&lt;/strong&gt;，一个 &lt;strong&gt;1920×1080 的虚拟屏&lt;/strong&gt;短暂顶了上来（这个是 BetterDisplay 创建的虚拟显示器）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;09:34:57.343&lt;/strong&gt; 物理屏再次接入，但这次 EDID 没读全，被系统当成了 &lt;strong&gt;“Generic Display”（无 EDID 的通用显示器）&lt;/strong&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;系统开始按安全模式枚举低分辨率：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;09:34:57.806&lt;/strong&gt; 先设成 640×480&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;09:34:58.275&lt;/strong&gt; 最终设成 &lt;strong&gt;800×600 @60Hz（RGB 8bit）&lt;/strong&gt; ← 就是你看到的 800×600。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;关于“是什么软件触发”：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我检查了安装的软件和后台项，&lt;strong&gt;没有发现 displayplacer、SwitchResX 这类专门改分辨率的工具，也没有任何脚本/定时任务去设置分辨率&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;当时在跑的 &lt;code&gt;Wine（wineloader/winedevice.exe）&lt;/code&gt; 只是 Windows 运行环境里的设备守护进程，日志显示它们只是在重新枚举鼠标键盘，并没有调用改分辨率。&lt;/li&gt;
&lt;li&gt;机器上确实装了 &lt;strong&gt;BetterDisplay&lt;/strong&gt;，而且它当时在运行，还创建了虚拟屏；它也把这个“Generic Display（800×600）”记录成了一个新显示器。但真正把物理屏设成 800×600 的，是 macOS 在“读不到 EDID、没有可用模式”时的安全回退，不是 BetterDisplay 主动设置的分辨率。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;一个很有力的佐证是，系统保存的显示配置里同时存在这两条：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;真实屏 &lt;code&gt;Kuycon G27P&lt;/code&gt; 的配置是 &lt;strong&gt;2560×1440（HiDPI，Scale 2）&lt;/strong&gt;——这是你的“原来分辨率”；&lt;/li&gt;
&lt;li&gt;另有一个新身份 &lt;code&gt;Generic Display&lt;/code&gt;（UUID 是 CADA3176…）被存成了 &lt;strong&gt;800×600&lt;/strong&gt;——这就是这次降级后的身份。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;所以本质原因是&lt;strong&gt;连接层面的 EDID 握手失败&lt;/strong&gt;，最可能是：显示器彻底断电后立刻开机造成的上电时序抖动，或者线材、接口、转接器/扩展坞接触不稳定。&lt;/p&gt;
&lt;p&gt;建议你这样处理：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;再正常开关一次显示器，或者把视频线（HDMI/DP）拔掉重插一下，让系统重新读到 EDID，通常会自动回到 2560×1440。&lt;/li&gt;
&lt;li&gt;如果经常在“彻底关屏再开屏”后变成 800×600，重点检查视频线、接口和转接器；有条件换一条线或换一个口试试。&lt;/li&gt;
&lt;li&gt;如果你在用 BetterDisplay 的虚拟屏功能，可以顺便检查它“断开物理屏时自动连接虚拟屏”的选项，避免物理屏掉线瞬间它把虚拟屏变成主屏、让画面看起来被替换。另外这台机器上的 BetterDisplay 目前程序文件不完整（缺少框架文件，命令行工具无法加载），如果你并不用它，建议修复或卸载，减少干扰因素。&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>概率论 · 核心章节</title>
        <published>2026-08-18T00:00:00+00:00</published>
        <updated>2026-08-18T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/plan/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/plan/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/plan/">&lt;p&gt;目标分数拆解
科目	满分	目标	底线	说明
数学二	150	125	110	决定上限，最大变量
408	150	115	105	你有 CS 底子，重点是捡起来
英语二	100	78	72	相对友好，稳住阅读
政治	100	70	65	后期突击为主
合计	500	388	352	目标冲 390+，底线分不够稳&lt;/p&gt;
&lt;p&gt;按 388 来拆：政治 70 + 英二 78 + 数学 125 + 408 115。数学和 408 是主战场，政治英语不能拖后腿。
总体时间轴
8.19–9.30（约 6 周）：基础强化期，数学一轮 + 408 一轮 + 英语单词阅读。
10.1–11.15（约 6.5 周）：强化提升期，数学二轮真题 + 408 二轮大题 + 英语真题 + 政治启动。
11.16–12.18（约 4.5 周）：冲刺期，全科限时成套真题/模拟 + 背诵。
12.14–12.18：收尾调整，按考试时间全真模拟 2–3 次。
分阶段详细计划
阶段一：8.19–9.30，把底子捡起来
这一阶段目标很明确：数学完成一轮，408 完成一轮选择题，英语恢复词汇和长难句，政治先不碰。
数学二（每天 5 小时，优先级最高）
第 1–2 周：高数——极限与连续、一元微分、一元积分。这是数二绝对核心，题量要足。
第 3 周：多元函数微分、二重积分、常微分方程。
第 4–5 周：线性代数——行列式、矩阵、向量组、线性方程组、特征值特征向量、二次型。
第 6 周：查漏 + 阶段小测，重点把「极限、导数、积分、方程组、特征值」这几块做扎实。
注意数二范围比数一少：不考概率、不考无穷级数、三重积分、曲线曲面积分和空间解析几何，别浪费时间在这些上。
408（每天 2.5–3 小时）
数据结构和计组各 2 周，操作系统 1.5 周，计算机网络 1 周。
顺序建议：数据结构 → 计算机组成原理 → 操作系统 → 计算机网络。
用王道四本书过一轮，只做选择题，配合看王道视频/讲义。计组的存储、CPU、指令系统是重灾区，要慢一点。
英语二（每天 1–1.5 小时）
每天背单词，用「墨墨/不背单词」刷核心词，目标 9 月底把核心词过一遍。
每周精读 3 篇英二阅读真题，逐句翻译长难句，不追求速度，先找回语感。
政治：本阶段不开，最多每天 10 分钟翻翻框架。
阶段二：10.1–11.15，上强度和真题
数学二（每天 4.5 小时）
开始做分章节真题，从较近的年份往前做，建立错题本。
薄弱模块做专题：中值定理、积分计算、线代综合题等。
10 月底至少完成近 10 年真题的分章版。
408（每天 3 小时）
二轮 + 大题专项：数据结构算法题、计组大题、OS 的 PV 操作和内存管理、网络 TCP/IP。
开始成套做 408 真题，先不限时，重点是「会分析、能写出过程」。
建立自己的背诵笔记：计组、OS、网络的概念型考点很多，后期靠它反复看。
英语二（每天 1.5 小时）
真题阅读每天 1–2 篇，二刷重点段落，总结题型套路。
10 月下旬开始练翻译和新题型。
作文 10 月底起步：先背结构和常用句式，每周写 1 篇小作文 + 1 篇大作文。
政治（10 月启动，每天 1–1.5 小时）
徐涛强化课倍速过一遍（马原、史纲、毛中特、思修），配合肖秀荣 1000 题。
目标 11 月 15 日前完成一轮选择题。
阶段三：11.16–12.18，全真冲刺
这个阶段每天基本按考试节奏练，重点变成「限时、成套、复盘」。
数学二（每天上午 4 小时）
成套真题近 10 年 + 李林 6+4 等模拟卷，严格 3 小时限时。
错题本反复看，公式卡片随身背。目标考前稳定在 120 以上。
408（每天下午 3 小时）
成套 408 真题反复做，近 8 年至少 2 遍，王道模拟挑着做。
用笔记背诵计组、OS、网络的常考点。
英语二（每天 1.5 小时）
成套真题模拟 + 作文模板定稿并背熟。
阅读保持每天手感，作文是性价比最高的提分点。
政治（每天 2 小时，逐渐加到 3 小时）
肖八 11 月出来后做选择题，反复刷错题。
肖四 12 月出来后，大题背到考前，腿姐背诵手册/肖秀荣冲刺手册二选一。
阶段四：12.14–12.18，收尾
按真实考试时间做 2–3 次全真模拟：上午政治、下午英语；第二天上午数学、下午 408。
数学只看公式和错题，408 只背笔记，英语只背作文模板，政治集中背肖四大题。
调作息到早睡早起，不要再开新的大块内容。
每日作息模板（脱产）
07:30 起床
08:00–09:00 英语单词 / 后期政治背诵
09:00–12:00 数学
12:00–14:00 午饭 + 午休
14:00–15:30 408
15:50–17:20 英语
17:20–18:30 晚饭 + 活动
18:30–20:30 数学刷题 / 408 错题
20:40–22:00 复盘 + 错题本 + 政治（后期）
每天有效学习 9–10 小时即可，关键是持续，不要熬夜换时长。
各科资料和要点
数学二：武忠祥高数 + 李永乐线代为主，张宇或李林模拟卷；真题优先。每天都要动手算，不能只看视频。
408：王道四本 + 王道真题和模拟。你有计算机基础，不要陷进教材细枝末节，以考纲和王道为准，重点是反复刷题。
英语二：英二真题（黄皮书）+ 唐迟阅读 + 田静语法长难句 + 王江涛/石雷鹏作文。单词背到考前。
政治：肖秀荣精讲精练/1000题/肖八/肖四 + 徐涛强化课 + 腿姐冲刺背诵手册。政治是后期拉分成本最低的一科，但别太早花大块时间。
报名和关键节点
9 月：关注中科大研招网和研招网，确认最新招生简章、拟招生人数和考试科目。
10 月 9 日左右：预报名。
10 月中旬：正式报名，登录研招网（yz.chsi.com.cn）填写信息。
11 月上旬：网上确认，务必按时完成，否则不能考试。
12 月 19–20 日：初试（以准考证为准）。
每周复盘规则
每周日晚上固定做四件事：统计本周各科完成率、把错题归类、判断下周是否要调整时间分配、检查有没有掉进「只看课不做题」的坑。数学和 408 用「做题量」而不是「看课量」来验收进度，这是脱产 4 个月最需要盯住的一点。
一句话总结你的策略：数学二每天雷打不动 4 小时以上，408 靠真题反复滚，英语保住阅读和作文，政治 10 月后逐步加码、最后靠肖四收口。按这个节奏冲 390，比单纯堆资料和堆时长更重要&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>C++26 反射注解：自动成员验证</title>
        <published>2026-08-17T00:00:00+00:00</published>
        <updated>2026-08-17T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CXX20/reflection-annotations-validation/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CXX20/reflection-annotations-validation/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CXX20/reflection-annotations-validation/">&lt;p&gt;在探索 C++26 系列的过程中，我之前的文章已经介绍了如何在 Ubuntu 上搭建 C++26 构建环境。之后，我探索了另一个名为模板的特性，并通过一个简单的示例讲解了反射的用法，并进一步学习了如何使用反射进行 JSON 序列化。在本文中，我将解释另一个极其强大的 C++26 特性，它叫做……注释以及它们与反思相结合如何使我们的生活更轻松。&lt;/p&gt;
&lt;p&gt;首先，让我们来看下面这个假设的MotorConfig班级：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; MotorConfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; double&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    double&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; max_temperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; device_name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    double&lt;/span&gt;&lt;span&gt; m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span&gt; m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这个类有一些私有成员m_rpm，m_maxTemperature这些m_deviceName成员在构造函数创建对象时会被初始化为特定的值。现在，假设你不希望类实例创建时使用超出某个范围的值，并且你想确保在构造时进行验证。你有哪些选择呢？你可以在构造函数中执行类似下面的操作：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;                         double&lt;/span&gt;&lt;span&gt; maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                         std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    : &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;out_of_range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m_rpm is outside the permitted range [0, 10000]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 150&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;out_of_range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m_maxTemperature is outside the permitted range [-40, 150]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;invalid_argument&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;m_deviceName is required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;太好了！但是，如果向类中添加了另一个类成员，而该成员的值也需要验证，那么您必须在构造函数中手动添加验证代码来处理新成员。手动添加很容易出错。在 C++26 中，我们可以使用注解等特性，并结合反射等特性来自动化此验证过程。&lt;/p&gt;
&lt;p&gt;使用注释
C++26 引入了注解的概念。注解的一般语法如下：&lt;/p&gt;
&lt;p&gt;[[=constant-expression]]
declaration
这意味着您可以将常量表达式与声明关联起来，然后在编译时检索这些值。我们稍后会详细介绍。此类注解的示例如下所示：&lt;/p&gt;
&lt;p&gt;[[=42]]
int value;
我们还可以使用用户自定义数据类型来定义更个性化的注释。&lt;/p&gt;
&lt;p&gt;注解的用户自定义类型
您还可以使用已定义的类型作为声明的注解，如下所示：&lt;/p&gt;
&lt;p&gt;[[=AnnotationType{arguments…}]]
declaration
例如，在我们的示例代码中，我们可以声明类型为 &lt;code&gt;and&lt;/code&gt; 的注解Range，Required如下所示：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;struct Range&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    double minimum;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    double maximum;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;struct Required&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;声明完成后，我们现在可以使用用户定义的类型注解将 MotorConfig 类重写如下：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; MotorConfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; double&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    double&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; max_temperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;nodiscard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; device_name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; noexcept&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10000&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span&gt;{-&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;40&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 150&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    double&lt;/span&gt;&lt;span&gt; m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [[&lt;/span&gt;&lt;span&gt;= &lt;/span&gt;&lt;span&gt;Required&lt;/span&gt;&lt;span&gt;{}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span&gt; m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;仔细阅读声明：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[[= Range{0.0, 10000.0}]] &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;int m_rpm;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;它表示成员变量的允许取值范围m_rpm为0.00 到10000.01。然而，目前该注解仅提供附加信息，它本身并不强制执行取值范围，除非后续代码强制执行，否则可以忽略。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;现在反思一下&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;如上文代码所示，一旦注释就位，我们现在就可以利用反射来提取它们并在代码中使用它们。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;首先，我们将编写一个循环来遍历类中的所有非静态成员MotorConfig：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;```C++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template for (constexpr std::meta::info member : &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              std::define_static_array(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;              std::meta::nonstatic_data_members_of(^^T,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                              std::meta::access_context::unchecked())))&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我在本文template for中详细讨论了这一点。简而言之，它表示类型为的反射，在本例中为。它返回一个包含所有非静态成员反射的向量。但由于该向量使用动态存储，因此不能用作的范围。要将其与一起使用，我们需要将其复制到静态数组中，这可以通过来实现。^^TTMotorConfigstd::meta::nonstatic_data_members_oftemplate fortemplate forstd::define_static_array&lt;/p&gt;
&lt;p&gt;然后，在每次迭代中，我们提取每个成员的注释：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; ranges&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                     member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;该函数std::meta::annotations_of_with_type返回一个向量，其中包含所有类型为 &lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; 的注解的反射Range。std::define_static_array它将这些反射复制到一个静态存储的数组中，并返回一个std::span指向该数组的引用。&lt;code&gt;&amp;lt;input&amp;gt;&lt;/code&gt; 通常将其元素存储在动态分配的内存中，因此其内容不能直接存储在constexpr变量中ranges。&lt;/p&gt;
&lt;p&gt;单注与多注
请记住，每种类型中只能有一个注解：&lt;/p&gt;
&lt;p&gt;[[= Range{0.0, 10000.0}]]
int m_rpm;
但是，也可以在一个类型中包含多个注解：&lt;/p&gt;
&lt;p&gt;[[=Range{0.0, 10000.0}, =Range{1000.0, 8000.0}]]
int m_rpm;
你可以用以下任何一种方式表达：&lt;/p&gt;
&lt;p&gt;[[=Range{0.0, 3000.0},
=Range{7000.0, 10000.0}]]
int m_rpm;
或者分别如下：&lt;/p&gt;
&lt;p&gt;[[=Range{0.0, 3000.0}]]
[[=Range{7000.0, 10000.0}]]
int m_rpm;
因此，在以下表达式中，ranges表示span引用注解的静态反射数组：&lt;/p&gt;
&lt;p&gt;constexpr auto ranges =
std::define_static_array(std::meta::annotations_of_with_type(
member, ^^Range));
在我们的例子中，我们只有一个注解，其反射可以用 表示ranges[0]。为了提取可用范围，我们可以这样做：&lt;/p&gt;
&lt;p&gt;constexpr Range range = std::meta::extract&lt;Range&gt;(ranges[0]);
剪接表达
我们即将能够访问每个成员的当前值并将其与允许的范围进行比较。可以使用以下拼接表达式访问成员值：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;constexpr&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;info&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                      std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nonstatic_data_members_of&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                      std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;access_context&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;unchecked&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;     constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; ranges&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;[:member:]这是一个 C++26 拼接表达式。它将反射转换回该反射所代表的实体。因此，在第一次迭代中object.[:member:]，它将给出 的值object.m_rpm，现在我们可以进行如下比较：&lt;/p&gt;
&lt;p&gt;if (value &amp;lt; range.minimum || value &amp;gt; range.maximum)
{
throw std::out_of_range(std::string{name}
+ “ is outside the permitted range [“
+ std::to_string(range.minimum) + “, “
+ std::to_string(range.maximum) + “]”);
}
在下一次迭代中，它将object.[:member:]给出值，object.m_maxTemperature依此类推。以下代码片段实现了所有这些功能：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;typename&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; validate_or_throw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; object&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    template&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;constexpr&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;info&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                      std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nonstatic_data_members_of&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                      std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;access_context&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;unchecked&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; ranges&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            constexpr&lt;/span&gt;&lt;span&gt; Range&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;extract&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;minimum&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;maximum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;out_of_range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                                    +&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; is outside the permitted range [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                                    +&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;minimum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                                    +&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;maximum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注解的处理方式Required非常相似，可以大致按如下方式实现：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; required&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;requires&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;invalid_argument&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; is required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        static_assert&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            requires&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Required annotation can only be applied to a type &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;that provides empty()&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;施工阶段验证
验证功能在以下模板函数中实现：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;typename&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; validate_or_throw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; object&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    template&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;constexpr&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;info&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                      std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nonstatic_data_members_of&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                                                           std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;access_context&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;unchecked&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        constexpr&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string_view&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;identifier_of&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Validating member: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; ranges&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; range_count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;size&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;cout&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Found &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; range_count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; range annotations for member: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            constexpr&lt;/span&gt;&lt;span&gt; Range&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;extract&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;ranges&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;minimum&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;maximum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;out_of_range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; is outside the permitted range [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                                        +&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;minimum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;, &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                                        +&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;maximum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        constexpr&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span&gt; required&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;define_static_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;meta&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;annotations_of_with_type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ^&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^&lt;/span&gt;&lt;span&gt;Required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; object&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;member&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; constexpr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;requires&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                    throw&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;invalid_argument&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;} &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; is required&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                static_assert&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                    requires&lt;/span&gt;&lt;span&gt; { &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Required annotation can only be applied to a type &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;that provides empty()&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;完整的源代码可在 GitHub 链接中找到。要编译代码，请在命令行中执行以下操作：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;g&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;26&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    -&lt;/span&gt;&lt;span&gt;freflection&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    -&lt;/span&gt;&lt;span&gt;Wall&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    -&lt;/span&gt;&lt;span&gt;Wextra&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    -&lt;/span&gt;&lt;span&gt;Wpedantic&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    reflection_validation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;cpp&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span&gt; reflection_validation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;reflection_validation&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Validating&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt; annotations&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Construction&lt;/span&gt;&lt;span&gt; failed&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;span&gt; is&lt;/span&gt;&lt;span&gt; outside&lt;/span&gt;&lt;span&gt; the&lt;/span&gt;&lt;span&gt; permitted&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10000&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Validating&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt; annotations&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Validating&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_maxTemperature&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt; annotations&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_maxTemperature&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Validating&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_deviceName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span&gt; range&lt;/span&gt;&lt;span&gt; annotations&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span&gt; member&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;m_deviceName&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Valid&lt;/span&gt;&lt;span&gt; configuration&lt;/span&gt;&lt;span&gt; created&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;RPM&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;5000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Maximum&lt;/span&gt;&lt;span&gt; temperature&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;85&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Device&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;motor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;-&lt;/span&gt;&lt;span&gt;controller&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;为了在程序启动时就启用验证，我们可以按如下方式在类validate_or_throw的构造函数中调用验证函数模板：MotorConfig&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;MotorConfig&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span&gt; rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; double&lt;/span&gt;&lt;span&gt; maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    : &lt;/span&gt;&lt;span&gt;m_rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;rpm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      m_maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span&gt;maxTemperature&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      m_deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;move&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;deviceName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    validate_or_throw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样可以确保当传递给构造函数的MotorConfig参数值超出允许范围时，构造函数会抛出异常。手动检查传递的参数值的麻烦就此消失了！&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mac-CrossOver-第五人格网络加速</title>
        <published>2026-08-17T00:00:00+00:00</published>
        <updated>2026-08-17T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/identify-v-network-fast/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/identify-v-network-fast/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/identify-v-network-fast/">&lt;h1 id=&quot;di-wu-ren-ge-crossover-geng-xin-zi-yuan-man-hai-wai-jie-dian-ding-wei-yu-jie-jue-bao-gao&quot;&gt;第五人格（CrossOver）更新资源慢：海外节点定位与解决报告&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;排查日期：2026-08-17&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;yi-huan-jing-xin-xi&quot;&gt;一、环境信息&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;操作系统&lt;/td&gt;&lt;td&gt;macOS 27.0（Build 26A5406e），Apple Silicon（arm64）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CrossOver&lt;/td&gt;&lt;td&gt;26.3（Build 26.3.0.39832）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;第五人格 PC 版&lt;/td&gt;&lt;td&gt;显示版本 &lt;code&gt;2.103.125221.2958769&lt;/code&gt;（&lt;code&gt;update.ini&lt;/code&gt; 记录 &lt;code&gt;2.103.2958769&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;游戏引擎&lt;/td&gt;&lt;td&gt;neox3 2.0.2589074（engine build：&lt;code&gt;release_2025_1217&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;网络&lt;/td&gt;&lt;td&gt;有线 Ethernet（en0 协商 100baseTX，理论峰值约 12.5MB/s）；出口 IP 杭州电信 36.24.57.87&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;运行方式&lt;/td&gt;&lt;td&gt;CrossOver 瓶子 &lt;code&gt;Identify-V&lt;/code&gt;，游戏目录 &lt;code&gt;/data/Identify-V&lt;/code&gt;（Z 盘）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;er-wen-ti-xian-xiang&quot;&gt;二、问题现象&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;通过 CrossOver 安装/更新第五人格（dwr）时，“更新资源”阶段下载速度仅 &lt;strong&gt;0.2 ~ 1MB/s&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;观察到 netease.com 相关 IP 归属为巴黎地区；&lt;/li&gt;
&lt;li&gt;期望：国内网络、网易总部在杭州，资源更新不应这么慢。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;san-pai-cha-guo-cheng-yu-zheng-ju&quot;&gt;三、排查过程与证据&lt;/h2&gt;
&lt;h3 id=&quot;3-1-geng-xin-lian-lu-yu-ming-yu-jie-xi-jie-guo&quot;&gt;3.1 更新链路域名与解析结果&lt;/h3&gt;
&lt;p&gt;游戏实际访问的更新域名全部 CNAME 到 Akamai，且固定返回巴黎节点：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;域名&lt;/th&gt;&lt;th&gt;Akamai 节点&lt;/th&gt;&lt;th&gt;归属&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;资源 CDN&lt;/td&gt;&lt;td&gt;&lt;code&gt;h55.gsf.netease.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2.22.250.108 / 2.22.250.122&lt;/code&gt;&lt;/td&gt;&lt;td&gt;法国巴黎（AS20940）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;补丁 CDN&lt;/td&gt;&lt;td&gt;&lt;code&gt;h55.gph.netease.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2.21.72.217 / 2.21.244.167&lt;/code&gt;&lt;/td&gt;&lt;td&gt;法国巴黎（AS20940）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;更新列表&lt;/td&gt;&lt;td&gt;&lt;code&gt;h55.update.netease.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;104.85.40.73&lt;/code&gt;&lt;/td&gt;&lt;td&gt;法国巴黎（AS16625）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;官方安装包&lt;/td&gt;&lt;td&gt;&lt;code&gt;a50.gdl.netease.com&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;92.123.238.200 / 92.123.238.170&lt;/code&gt;&lt;/td&gt;&lt;td&gt;法国巴黎（AS20940）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;分别使用阿里 223.5.5.5、腾讯 119.29.29.29、114.114.114.114、8.8.8.8、1.1.1.1 解析，并带 EDNS 客户端子网（杭州 / 香港 / 日本 / 新加坡）测试，&lt;strong&gt;返回结果完全一致&lt;/strong&gt;——均为上述巴黎 IP。结论：&lt;strong&gt;不是本机 DNS 设置问题，是网易这些域名被 Akamai 固定映射到了巴黎节点。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;3-2-lu-you-gen-zong-liu-liang-que-shi-chu-guo&quot;&gt;3.2 路由跟踪：流量确实出国&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;192.168.1.1（本地网关）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;→ 杭州电信骨干 202.97.x（约 10ms）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;→ GTT 国际线路 154.54.x（第 11 跳起 RTT 跳到 180~250ms）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;→ 巴黎 Akamai 节点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;杭州电信直连巴黎约 200ms+ RTT，跨国链路上单条 TCP 连接被限制在 1MB/s 左右。&lt;/p&gt;
&lt;h3 id=&quot;3-3-ben-ji-wang-luo-ben-shen-wu-wen-ti&quot;&gt;3.3 本机网络本身无问题&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;无代理/VPN 时出口为杭州电信（36.24.57.87）；&lt;/li&gt;
&lt;li&gt;使用 8 个并行连接同时下载同一文件：单连接 0.4~1.0MB/s，&lt;strong&gt;合计约 6.3MB/s&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;说明瓶颈是“跨国链路单连接限速”，而不是本机带宽或网卡。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-4-you-xi-ri-zhi-shi-chui&quot;&gt;3.4 游戏日志实锤&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;log.txt&lt;/code&gt; 中 &lt;code&gt;patch_download_info.cur_speed ≈ 1183000 B/s（1.13MB/s）&lt;/code&gt;，与用户感知一致；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloud.json&lt;/code&gt; 配置 &lt;code&gt;downloader_connect_num: 2&lt;/code&gt;，实测游戏进程只有 2 条 ESTABLISHED TCP 连接（Wine/WinINET 默认每主机 2 连接）；&lt;/li&gt;
&lt;li&gt;首次安装日志（&lt;code&gt;.dlstorage/downloading/download.log&lt;/code&gt;）显示 2026-01-29 使用 &lt;code&gt;h55-h.gdl.netease.com&lt;/code&gt; 下载 13GB，速度 &lt;strong&gt;119MB/s&lt;/strong&gt;——证明网易国内节点完全可以跑满，当前只是更新配置指向了海外。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-5-liang-ge-wu-xiao-chang-shi-de-yuan-yin-fen-xi&quot;&gt;3.5 两个“无效尝试”的原因分析&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;尝试&lt;/th&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;修改 &lt;code&gt;cloud.json&lt;/code&gt; 连接数&lt;/td&gt;&lt;td&gt;无效&lt;/td&gt;&lt;td&gt;引擎实际读取 &lt;code&gt;Documents/cloud.json&lt;/code&gt;，且&lt;strong&gt;每次启动会被引擎重写回 &lt;code&gt;downloader_connect_num: 2&lt;/code&gt;&lt;/strong&gt;；只改根目录 &lt;code&gt;cloud.json&lt;/code&gt; 不生效。另外即使连接数放开，巴黎链路单连接限速约 1MB/s，提升有限&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;网易 UU 加速器&lt;/td&gt;&lt;td&gt;无效&lt;/td&gt;&lt;td&gt;UU 只接管了 &lt;code&gt;h55.update.netease.com&lt;/code&gt;（仅 3.8KB 的列表），真正下载资源的 &lt;code&gt;h55.gsf.netease.com&lt;/code&gt; 仍直连巴黎（lsof 可见 &lt;code&gt;192.168.1.101 → 2.22.250.122&lt;/code&gt;）。游戏进程需在 UU 启动后重启，UU 才会接管该域名&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;si-gen-yin-jie-lun&quot;&gt;四、根因结论&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;网易 PC 版更新 CDN 被 Akamai 固定映射到巴黎节点&lt;/strong&gt;（&lt;code&gt;h55.gsf/gph/update.netease.com&lt;/code&gt; 等），不随 DNS/EDNS 变化；大陆直连跨国国际链路，单连接约 1MB/s；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;游戏下载器实际只维持 2 条连接&lt;/strong&gt;（配置未生效 + Wine/WinINET 默认每主机 2 连接），进一步限制吞吐；&lt;/li&gt;
&lt;li&gt;本机 100Mbps 网口（理论峰值约 12.5MB/s）不是主因，但是最终吞吐的天花板。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;wu-jie-jue-fang-an-yi-shi-shi-bing-yan-zheng&quot;&gt;五、解决方案（已实施并验证）&lt;/h2&gt;
&lt;h3 id=&quot;5-1-fang-kai-lian-jie-shu-xian-zhi&quot;&gt;5.1 放开连接数限制&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;修改根目录 &lt;code&gt;/data/Identify-V/cloud.json&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;downloader_connect_num&lt;/code&gt;: 2 → &lt;strong&gt;32&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;（&lt;code&gt;Documents/cloud.json&lt;/code&gt; 会被引擎重置，不必修改）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;向 CrossOver 瓶子 &lt;code&gt;Identify-V&lt;/code&gt; 写入注册表（解除 Wine/WinINET 每主机 2 连接限制）：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\MaxConnectionsPerServer&lt;/code&gt; = 32&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HKCU\Software\Microsoft\Windows\CurrentVersion\Internet Settings\MaxConnectionsPer1_0Server&lt;/code&gt; = 32&lt;/li&gt;
&lt;li&gt;&lt;code&gt;HKCU\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_MAXCONNECTIONS\dwrg.exe&lt;/code&gt; = 32&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1) 把瓶子名改成你自己的（默认 Identify-V）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; WINEPREFIX&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Library/Application Support/CrossOver/Bottles/Identify-V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; CX_BOTTLE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Identify-V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2) 定位 CrossOver 自带的 wine（注意：不能用系统 wine）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;test&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; WINE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Applications/CrossOver.app/Contents/SharedSupport/CrossOver/bin/wine&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3) 写入注册表：解除 WinINET 每主机 2 连接限制&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; reg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HKCU&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CurrentVersion&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Internet Settings&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; MaxConnectionsPerServer&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; REG_DWORD&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /d&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 32&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; reg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HKCU&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CurrentVersion&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Internet Settings&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; MaxConnectionsPer1_0Server&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; REG_DWORD&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /d&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 32&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; reg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HKCU&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Internet Explorer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;FeatureControl&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;FEATURE_MAXCONNECTIONS&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dwrg.exe&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; REG_DWORD&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /d&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 32&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 4) 验证是否写入成功&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; reg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HKCU&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Windows&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CurrentVersion&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Internet Settings&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; MaxConnectionsPerServer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;WINE&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; reg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; query&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HKCU&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Software&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Microsoft&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Internet Explorer&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Main&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;FeatureControl&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;FEATURE_MAXCONNECTIONS&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dwrg.exe&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;或者&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;打开 CrossOver → 选中瓶子 Identify-V → 点 运行命令…（Run Command）；&lt;/li&gt;
&lt;li&gt;输入 regedit 并运行，打开注册表编辑器；&lt;/li&gt;
&lt;li&gt;依次新建三个值：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;路径 HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Internet Settings&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;MaxConnectionsPerServer = DWORD 32&lt;/li&gt;
&lt;li&gt;MaxConnectionsPer1_0Server = DWORD 32&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;路径 HKEY_CURRENT_USER\Software\Microsoft\Internet Explorer\Main\FeatureControl\FEATURE_MAXCONNECTIONS&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;新建项 dwrg.exe = DWORD 32&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;关闭 regedit，重启游戏（先开 UU）。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;重启游戏，使配置生效。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;5-2-rang-uu-jia-su-qi-jie-guan-zi-yuan-xia-zai&quot;&gt;5.2 让 UU 加速器接管资源下载&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;先开启网易 UU 加速器（第五人格 PC 版），再启动游戏&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;重启后 UU 接管 &lt;code&gt;h55.gsf.netease.com&lt;/code&gt;，下载目标从巴黎 Akamai 变为国内节点：
&lt;ul&gt;
&lt;li&gt;122.228.15.35（浙江温州电信）&lt;/li&gt;
&lt;li&gt;183.146.26.98 / 183.146.26.91（浙江金华电信）&lt;/li&gt;
&lt;li&gt;45.253.145.166（网易北京机房，AS45062）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-3-yan-zheng-jie-guo&quot;&gt;5.3 验证结果&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指标&lt;/th&gt;&lt;th&gt;修复前&lt;/th&gt;&lt;th&gt;修复后&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;下载速度&lt;/td&gt;&lt;td&gt;0.2 ~ 1MB/s&lt;/td&gt;&lt;td&gt;&lt;strong&gt;8.5 ~ 9.5MB/s&lt;/strong&gt;（15 秒持续采样约 5.9MB/s）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;活动连接数&lt;/td&gt;&lt;td&gt;2（直连巴黎）&lt;/td&gt;&lt;td&gt;5+（经 UU 转国内节点）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;更新总量&lt;/td&gt;&lt;td&gt;3.8GB&lt;/td&gt;&lt;td&gt;预计数分钟完成&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;liu-bei-fen-yu-hui-gun&quot;&gt;六、备份与回滚&lt;/h2&gt;
&lt;p&gt;修改前的备份文件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/tmp/cloud.json.root.20260817121545.bak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tmp/cloud.json.doc.20260817121545.bak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;/tmp/user.reg.20260817121545.bak&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如需还原：停止游戏后，将对应备份复制回原路径，或删除新增注册表项。&lt;/p&gt;
&lt;h2 id=&quot;qi-ri-chang-shi-yong-jian-yi&quot;&gt;七、日常使用建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;每次游戏更新前：&lt;strong&gt;先开 UU 加速，再启动游戏&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;不要修改 &lt;code&gt;Documents/cloud.json&lt;/code&gt;（引擎启动时会重写）；根目录 &lt;code&gt;cloud.json&lt;/code&gt; 可保持 &lt;code&gt;downloader_connect_num: 32&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;若更换网络/加速器，可用 &lt;code&gt;lsof -nP -iTCP -sTCP:ESTABLISHED | rg dwrg&lt;/code&gt; 观察连接目标是否为国内节点；&lt;/li&gt;
&lt;li&gt;当前有线网口协商在 100Mbps，理论上限约 12.5MB/s；如需更高速度，检查网线/转接器是否支持千兆。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;fu-lu-guan-jian-wen-jian-yu-ming-ling&quot;&gt;附录：关键文件与命令&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;关键文件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;游戏目录：&lt;code&gt;/data/Identify-V&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;更新配置：&lt;code&gt;/data/Identify-V/cloud.json&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;运行日志：&lt;code&gt;/data/Identify-V/log.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;云下载日志：&lt;code&gt;/data/Identify-V/Documents/cloud_logs/cloud_log.txt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;旧安装日志：&lt;code&gt;/data/Identify-V/.dlstorage/downloading/download.log&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CrossOver 瓶子：&lt;code&gt;~/Library/Application Support/CrossOver/Bottles/Identify-V&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;关键命令&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看游戏进程连接目标&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;lsof&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;nP&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;iTCP&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;sTCP:ESTABLISHED&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; rg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dwrg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; DNS 对比解析（多个公共 DNS）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +short&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; h55.gsf.netease.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @223.5.5.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +short&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; h55.gsf.netease.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @8.8.8.8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 路由跟踪&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;traceroute&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 20&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; h55.gsf.netease.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 并行下载测速（验证单连接 vs 多连接）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;1..8}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 25&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 0-4194303&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /dev/null&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;:%{speed_download} &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;UR&lt;/span&gt;&lt;span&gt;L&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; wait&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T20:00:00+00:00</published>
        <updated>2026-08-11T20:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t20-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t20-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t20-00-00z/">&lt;p&gt;2026年08月12日 04:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-wei-diao-miao-shu-zheng-wen-xuan-ting-fu-ceng-kan-ban-zi-ti-jia-da-jia-cu&quot;&gt;看板微调：描述正文悬停浮层 · 看板字体加大加粗&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;卡片存在描述正文时，悬停「☰ 有描述」徽标或卡片内描述区，浮层显示完整描述（跟随鼠标、自动防溢出、离开消失）；&lt;/li&gt;
&lt;li&gt;看板界面字体整体 &lt;strong&gt;大 2 号并加粗&lt;/strong&gt;（列头 / 卡片标题 / 徽标 / 清单 / 描述 / 元信息 / 列表页卡片）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-miao-shu-zheng-wen-xuan-ting-fu-ceng&quot;&gt;1. 描述正文悬停浮层&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bindDescTooltip()&lt;/code&gt;：有内容时给「☰」徽标与内联描述区绑定 &lt;code&gt;mouseenter / mousemove / mouseleave&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;浮层 &lt;code&gt;kanban-desc-tooltip&lt;/code&gt; 复用 &lt;code&gt;renderDescription()&lt;/code&gt;（支持加粗 / 代码 / 换行），跟随鼠标偏移显示，越界自动翻转，&lt;code&gt;pointer-events: none&lt;/code&gt; 避免抖动；&lt;/li&gt;
&lt;li&gt;离开控件即隐藏。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-zi-ti-jia-da-jia-cu-2-hao&quot;&gt;2. 字体加大加粗（+2 号）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;元素&lt;/th&gt;&lt;th&gt;调整&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;列头&lt;/td&gt;&lt;td&gt;0.9rem → 1.06rem，weight 700 → 800&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列计数&lt;/td&gt;&lt;td&gt;0.72rem → 0.82rem，加粗&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片正文&lt;/td&gt;&lt;td&gt;0.82rem → 0.94rem，weight 500&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片标题&lt;/td&gt;&lt;td&gt;0.88rem → 1.06rem，weight 700&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;清单行&lt;/td&gt;&lt;td&gt;0.78rem → 0.9rem，weight 600&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片描述&lt;/td&gt;&lt;td&gt;0.78rem → 0.9rem，weight 600&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;徽标 / 标签药丸&lt;/td&gt;&lt;td&gt;0.7rem → 0.82rem / 0.68rem → 0.78rem，加粗&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;看板元信息&lt;/td&gt;&lt;td&gt;0.8rem → 0.9rem，weight 600&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;工具栏按钮&lt;/td&gt;&lt;td&gt;0.82rem → 0.92rem，weight 600&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表页周卡&lt;/td&gt;&lt;td&gt;标题 1.2rem weight 800；元信息 / 统计 0.9rem weight 700&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-yan-zheng&quot;&gt;3. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 通过；&lt;code&gt;zola build&lt;/code&gt; 0 ERROR；&lt;code&gt;verify-kanban-build&lt;/code&gt; OK（5 周看板）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T18:00:00+00:00</published>
        <updated>2026-08-11T18:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t18-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t18-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t18-00-00z/">&lt;p&gt;2026年08月12日 02:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-wei-diao-quan-feng-mian-zheng-qia-zhao-se-qia-pian-shi-jian-zhi-xian-shi-yue-ri-yi-chu-lie-tou-an-niu&quot;&gt;看板微调：全封面整卡着色 · 卡片时间只显示月-日 · 移除列头 ⋯ 按钮&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;按截图反馈做三处细节调整：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;封面区分度&lt;/strong&gt;：&lt;code&gt;@cover full&lt;/code&gt; 由“更高的色条”改为&lt;strong&gt;整卡背景着色&lt;/strong&gt;（浅色自动深字），与半封面的顶部色条一眼可辨；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡片时间格式&lt;/strong&gt;：卡片徽标中的开始/截止日期去掉年份，只显示 &lt;code&gt;MM-DD&lt;/code&gt;（悬停 tooltip 保留完整日期）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;列头按钮&lt;/strong&gt;：移除待办 / 进行中等列头右侧的 &lt;code&gt;⋯&lt;/code&gt; 按钮及其弹层（添加卡片、重命名、排序、删除入口同步清理；排序仍可在 GUI 编辑器列表面板设置，双击列名仍可重命名）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-quan-feng-mian-zheng-qia-bei-jing&quot;&gt;1. 全封面 = 整卡背景&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;详情页：&lt;code&gt;cover-full&lt;/code&gt; 时卡片背景 = &lt;code&gt;@bg&lt;/code&gt; 颜色，标题/清单/描述按背景明暗自动切换白字或深字（&lt;code&gt;isLightColor&lt;/code&gt; 判定 + &lt;code&gt;cover-text-dark&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;半封面（默认）：保持顶部色条 + 白底正文，对比明显；&lt;/li&gt;
&lt;li&gt;GUI 编辑器画布同步同款渲染，预览所见即所得。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-qia-pian-shi-jian-zhi-xian-shi-yue-ri&quot;&gt;2. 卡片时间只显示月-日&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;详情页 &lt;code&gt;startBadge&lt;/code&gt; / &lt;code&gt;dueBadge&lt;/code&gt;：&lt;code&gt;📅 06-16&lt;/code&gt;、&lt;code&gt;🕒 08-13&lt;/code&gt;（tooltip 保留 &lt;code&gt;2026-06-16&lt;/code&gt; 完整日期）；&lt;/li&gt;
&lt;li&gt;编辑器画布徽标同步 &lt;code&gt;MM-DD&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;进度列日卡标题本就是 &lt;code&gt;MM-DD 周X&lt;/code&gt;，保持一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-yi-chu-lie-tou-an-niu&quot;&gt;3. 移除列头 ⋯ 按钮&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;renderBoard&lt;/code&gt; 不再生成 &lt;code&gt;.kanban-column-menu-btn&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;删除 &lt;code&gt;openColumnMenu&lt;/code&gt; / &lt;code&gt;handleColumnAction&lt;/code&gt; / &lt;code&gt;popoverItem&lt;/code&gt; / &lt;code&gt;popoverSep&lt;/code&gt; 死代码；&lt;/li&gt;
&lt;li&gt;保留：双击列名重命名、列底「＋ 添加卡片」、看板「＋ 添加列表」、GUI 编辑器内的列排序/增删。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-yan-zheng&quot;&gt;4. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 通过；&lt;code&gt;zola build&lt;/code&gt; 0 ERROR；&lt;code&gt;verify-kanban-build&lt;/code&gt; OK（5 周看板）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T16:00:00+00:00</published>
        <updated>2026-08-11T16:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t16-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t16-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t16-00-00z/">&lt;p&gt;2026年08月11日 24:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-xiu-fu-gui-bian-ji-qi-tuo-zhuai-zhen-zheng-sheng-xiao-zhi-ding-an-niu-wan-shan-zhong-wen-shi-duan-wen-jian-ming-slug-dui-qi&quot;&gt;看板修复：GUI 编辑器拖拽真正生效 · 置顶按钮完善 · 中文时段文件名 slug 对齐&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;上一轮「画布卡片拖拽 / 置顶」在本地代码已存在，但存在三个致命细节导致实际不可用/不可见，本轮定位并修复：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;GUI 编辑器拖拽失效根因&lt;/strong&gt;：画布列元素缺少 &lt;code&gt;data-col-idx&lt;/code&gt;，放置时 &lt;code&gt;toColIdx = NaN&lt;/code&gt;，松手永远不落位；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置顶可见性与交互&lt;/strong&gt;：画布置顶图标改为可点击按钮，详情页置顶徽标改为 &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt; 且空闲态样式修正（此前 &lt;code&gt;.is-idle&lt;/code&gt; 选择器嵌套错误不生效）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;中文文件名 slug 错位&lt;/strong&gt;：Zola 将 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; 转写成拼音 URL slug &lt;code&gt;wan-shang&lt;/code&gt;，导致编辑“修改/新建”判定与 Codeberg 链接指向错误文件名。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-gui-bian-ji-qi-qia-pian-tuo-zhuai&quot;&gt;1. GUI 编辑器卡片拖拽&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;renderCanvas()&lt;/code&gt; 为每个画布列写入 &lt;code&gt;colEl.dataset.colIdx = ci&lt;/code&gt;，&lt;code&gt;setupCanvasCardDrag&lt;/code&gt; 放置逻辑可正确解析目标列；&lt;/li&gt;
&lt;li&gt;同列拖拽插入目标卡片前、跨列拖拽移入目标列（末尾或目标卡片前）；&lt;/li&gt;
&lt;li&gt;松手后 &lt;code&gt;renderAll()&lt;/code&gt; 重绘画布并刷新 &lt;strong&gt;Markdown 预览&lt;/strong&gt;，预览与拖拽结果保持一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-zhi-ding-gong-neng-wan-shan&quot;&gt;2. 置顶功能完善&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;画布卡片：📌 改为 &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;，每张卡片均可点击置顶/解除（已置顶高亮），点击不触发选中；&lt;/li&gt;
&lt;li&gt;详情页卡片：徽标行置顶按钮改为 &lt;code&gt;&amp;lt;button&amp;gt;&lt;/code&gt;；解锁模式每卡显示（未置顶 = 虚线灰 📌，已置顶 = 高亮「📌 置顶」）；锁定只读仅显示已置顶徽标；&lt;/li&gt;
&lt;li&gt;CSS 修正：&lt;code&gt;.kanban-card-badge--pin.is-idle&lt;/code&gt; 独立选择器（此前嵌套在 &lt;code&gt;.is-pinned&lt;/code&gt; 下永不生效）；&lt;code&gt;button.kanban-card-badge&lt;/code&gt; 字体继承。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-zhong-wen-shi-duan-wen-jian-ming-slug-dui-qi&quot;&gt;3. 中文时段文件名 slug 对齐&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Zola 对 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; 生成 URL slug &lt;code&gt;wan-shang&lt;/code&gt;，但仓库文件名仍是 &lt;code&gt;2026-08-11_晚上.md&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;列表页 / 明细页 &lt;code&gt;data-slug&lt;/code&gt; 与 Edit Post 链接改用 &lt;code&gt;page.relative_path&lt;/code&gt; 提取的真实文件名（&lt;code&gt;split(pat=&#39;/&#39;) | last | replace(from=&#39;.md&#39;, to=&#39;&#39;)&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;编辑器「修改/新建」判定、Codeberg 编辑链接、Token 同步目标均指向真实文件名；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;verify-kanban-build.mjs&lt;/code&gt;：纯日期 slug 仍校验输出目录；带时段的 slug 因无法确定拼音转写，改验列表页已渲染该周（&lt;code&gt;data-week-start&lt;/code&gt; 存在）+ 卡片计数一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-yan-zheng&quot;&gt;4. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用户已通过 GUI 新建出 &lt;code&gt;content/kanban/2026-08-11_晚上.md&lt;/code&gt;（单日 + 时段命名实战通过）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 0 ERROR，&lt;code&gt;verify-kanban-build&lt;/code&gt; OK（5 周看板）；&lt;/li&gt;
&lt;li&gt;构建产物：列表页 &lt;code&gt;data-slug=2026-08-11_晚上&lt;/code&gt;、明细页 &lt;code&gt;wan-shang&lt;/code&gt; 页面 Edit Post 指向真实文件名。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T14:00:00+00:00</published>
        <updated>2026-08-11T14:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t14-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t14-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t14-00-00z/">&lt;p&gt;2026年08月11日 22:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-que-xian-xiu-fu-shi-jian-li-du-1-14-tian-dan-ri-shi-duan-ming-ming-wei-yi-zhi-ding-wan-shan&quot;&gt;看板缺陷修复：时间粒度 1–14 天 · 单日时段命名唯一 · 置顶完善&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;三项修复：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;时间细化&lt;/strong&gt;：最小 1 天、最大 14 天；新建默认 &lt;strong&gt;今日 → 今日&lt;/strong&gt;；编辑已有看板时开始时间锁定；卡片开始/截止按创建时间默认填充且不越界；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;单日时段命名&lt;/strong&gt;：&lt;code&gt;YYYY-MM-DD_上午 / _下午 / _晚上&lt;/code&gt;，保证同一天多张 1 天看板文件唯一；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置顶完善&lt;/strong&gt;：详情页解锁模式每张卡片均有置顶/取消置顶切换按钮，GUI 编辑器卡片面板按钮保留。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-shi-jian-li-du-yu-yue-shu&quot;&gt;1. 时间粒度与约束&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;实现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;最小 1 天 / 最大 14 天&lt;/td&gt;&lt;td&gt;&lt;code&gt;validate()&lt;/code&gt;：&lt;code&gt;daySpan &amp;lt; 1&lt;/code&gt; 不再报错（同日合法），&lt;code&gt;&amp;gt; 14&lt;/code&gt; 报错&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;新建默认今日&lt;/td&gt;&lt;td&gt;&lt;code&gt;defaultState()&lt;/code&gt;：&lt;code&gt;weekStart = weekEnd = 今日&lt;/code&gt;，时段按当前小时预选（5–12 上午 / 12–18 下午 / 其余晚上）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;编辑时开始锁定&lt;/td&gt;&lt;td&gt;修改模式 &lt;code&gt;weekStart&lt;/code&gt; 输入 &lt;code&gt;disabled&lt;/code&gt;；时段同样锁定（文件名标识）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;最大时间不可选&lt;/td&gt;&lt;td&gt;结束日期 &lt;code&gt;max = 开始 + 13 天&lt;/code&gt;（&lt;code&gt;buildBoardPanel&lt;/code&gt; + &lt;code&gt;applyDateBounds&lt;/code&gt; 双处生效）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片默认日期&lt;/td&gt;&lt;td&gt;GUI 新增卡片 / 详情页快捷添加：&lt;code&gt;@start = @due = 今日&lt;/code&gt;，越界时自动夹取到 &lt;code&gt;[week_start, week_end]&lt;/code&gt;；后续可编辑&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-dan-ri-shi-duan-ming-ming-wei-yi&quot;&gt;2. 单日时段命名唯一&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2026-08-11_上午.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2026-08-11_下午.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2026-08-11_晚上.md&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Front Matter 新增 &lt;code&gt;period&lt;/code&gt;（无 / 上午 / 下午 / 晚上），仅单天看板参与文件名（&lt;code&gt;buildSlug()&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;多天看板忽略时段，文件名保持 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;所有「目标文件」逻辑（模式徽标、流程指引、Token 同步、Codeberg 链接）统一改用 &lt;code&gt;buildSlug()&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;列表卡片新增 &lt;code&gt;data-slug&lt;/code&gt;（= &lt;code&gt;page.slug&lt;/code&gt;），编辑器 &lt;code&gt;existingSlugs&lt;/code&gt; 与修改判定按完整文件名；&lt;/li&gt;
&lt;li&gt;列表页 / 明细页展示时段徽标（&lt;code&gt;kanban-period-chip&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;verify-kanban-build.mjs&lt;/code&gt; 正则支持 &lt;code&gt;日期_时段.md&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-zhi-ding-wan-shan&quot;&gt;3. 置顶完善&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;详情页卡片徽标行：解锁模式下每张卡片显示置顶切换（未置顶 = 灰色 📌，已置顶 = 高亮「📌 置顶」），点击切换；&lt;/li&gt;
&lt;li&gt;锁定只读模式仍显示置顶徽标（不可点击）；&lt;/li&gt;
&lt;li&gt;GUI 编辑器卡片面板「置顶 / 解除置顶」按钮 + 画布 📌 指示保留；&lt;/li&gt;
&lt;li&gt;置顶卡片始终排在同列表顶部（&lt;code&gt;sortCards()&lt;/code&gt; 置顶优先，多卡可同时置顶）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-she-ji-wen-jian&quot;&gt;4. 涉及文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;period&lt;/code&gt; Front Matter 序列化&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;默认今日/时段、开始锁定、结束上限、卡片默认日期、&lt;code&gt;buildSlug()&lt;/code&gt;、置顶按钮&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;快捷添加默认日期、置顶切换按钮、GUI 事件携带 slug&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban_list.html&lt;/code&gt; / &lt;code&gt;kanban.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;data-slug&lt;/code&gt;、时段徽标&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;支持 &lt;code&gt;日期_时段.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;时段徽标、置顶空闲态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt; / &lt;code&gt;_index.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;命名与约束文档&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;5-yan-zheng&quot;&gt;5. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 四个 JS 通过；&lt;/li&gt;
&lt;li&gt;规则测试：现有 4 看板往返无损；&lt;code&gt;period&lt;/code&gt; 序列化保留；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 无错误，&lt;code&gt;verify-kanban-build&lt;/code&gt; OK（含新的命名正则）。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T12:00:00+00:00</published>
        <updated>2026-08-11T12:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t12-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t12-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t12-00-00z/">&lt;p&gt;2026年08月11日 20:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-wei-diao-qia-pian-tuo-zhuai-xiu-fu-re-li-tu-dan-ceng-gun-dong-xiu-fu-ge-ban-kuai-ascii-dian-zi-ping-tu&quot;&gt;看板微调：卡片拖拽修复 · 热力图弹层滚动修复 · 各板块 ASCII 电子屏图&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮三项工作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;卡片拖拽恢复&lt;/strong&gt;：详情页解锁模式与 GUI 编辑器画布均改用&lt;strong&gt;指针拖拽&lt;/strong&gt;（mousedown/mousemove/mouseup + 拖拽幽灵），规避 macOS Chrome 上 HTML5 DnD 不触发的问题；列头拖拽仍走原生 DnD；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;热力图同日多篇弹层滚动修复&lt;/strong&gt;：弹层内部滚动不再触发“关闭弹层”，滚动条常驻可点；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ASCII 电子屏图&lt;/strong&gt;：参照英语板块的 &lt;code&gt;{% crt %}&lt;/code&gt; 效果，为每个板块生成主题横幅。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-qia-pian-tuo-zhuai-xiu-fu&quot;&gt;1. 卡片拖拽修复&lt;/h3&gt;
&lt;h4 id=&quot;xiang-qing-ye-jie-suo-guan-li-yuan-mo-shi&quot;&gt;详情页（解锁管理员模式）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;新增 &lt;code&gt;setupDragDrop&lt;/code&gt; 指针拖拽：按下卡片移动 ≥6px 生成 &lt;code&gt;kanban-drag-ghost&lt;/code&gt; 幽灵，高亮目标列，松手跨列移动并写入脏状态；&lt;/li&gt;
&lt;li&gt;不再依赖 HTML5 卡片 DnD（macOS Chrome 偶发不触发 dragstart），列头拖拽保留原生 DnD；&lt;/li&gt;
&lt;li&gt;拖拽期间卡片 &lt;code&gt;cursor: grabbing&lt;/code&gt;，结束自动清理幽灵/高亮。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;gui-bian-ji-qi-hua-bu&quot;&gt;GUI 编辑器（画布）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;画布卡片带 &lt;code&gt;data-col-idx / data-card-idx&lt;/code&gt;，新增 &lt;code&gt;setupCanvasCardDrag()&lt;/code&gt;：
&lt;ul&gt;
&lt;li&gt;同列拖拽：插入到目标卡片前（源卡索引位移已修正）；&lt;/li&gt;
&lt;li&gt;跨列拖拽：移入目标列末尾或目标卡片前；&lt;/li&gt;
&lt;li&gt;松手后更新 &lt;code&gt;selection&lt;/code&gt; 并 &lt;code&gt;renderAll()&lt;/code&gt; 重绘。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-re-li-tu-tong-ri-duo-pian-dan-ceng-gun-dong-xiu-fu&quot;&gt;2. 热力图同日多篇弹层滚动修复&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;修复&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;弹层内部滚动立即关闭弹层&lt;/td&gt;&lt;td&gt;&lt;code&gt;scroll&lt;/code&gt; 捕获监听改为忽略 &lt;code&gt;popoverState.el.contains(event.target)&lt;/code&gt; 的滚动，仅外层滚动关闭&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;滚动条控件消失、无法滚选&lt;/td&gt;&lt;td&gt;&lt;code&gt;.heatmap-popover-list&lt;/code&gt; 增加 &lt;code&gt;overscroll-behavior: contain&lt;/code&gt;、&lt;code&gt;scrollbar-width: thin&lt;/code&gt;、WebKit 滚动条样式，&lt;code&gt;max-height: min(190px, 45vh)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;翻转到底部后可能超出视口&lt;/td&gt;&lt;td&gt;&lt;code&gt;positionPopover&lt;/code&gt; 增加视口下限钳制&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-ge-ban-kuai-ascii-dian-zi-ping-tu&quot;&gt;3. 各板块 ASCII 电子屏图&lt;/h3&gt;
&lt;p&gt;参照英语板块 &lt;code&gt;{% crt(label=...) %}&lt;/code&gt; 短代码（CRT 扫描线 + 闪烁 + 发光），用 figlet &lt;code&gt;banner3-D&lt;/code&gt; 像素风字体生成主题横幅，插入各板块 &lt;code&gt;_index.md&lt;/code&gt;：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;板块&lt;/th&gt;&lt;th&gt;横幅&lt;/th&gt;&lt;th&gt;主题标签&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;数学&lt;/td&gt;&lt;td&gt;MATH&lt;/td&gt;&lt;td&gt;∫ ∑ √ π · 导数 微积分 线性代数 概率论 离散数学&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CMake&lt;/td&gt;&lt;td&gt;CMAKE&lt;/td&gt;&lt;td&gt;构建 · 安装 · 打包 · 导出&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CXX20&lt;/td&gt;&lt;td&gt;CXX20&lt;/td&gt;&lt;td&gt;现代 C++ · 模块 · 协程 · 范围&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Jai&lt;/td&gt;&lt;td&gt;JAI&lt;/td&gt;&lt;td&gt;语言规范 · 编译器 · 极致性能&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;论文精读&lt;/td&gt;&lt;td&gt;PAPER&lt;/td&gt;&lt;td&gt;精读 · 核心思想 · 实验 · 复现&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;算法设计&lt;/td&gt;&lt;td&gt;ALGO&lt;/td&gt;&lt;td&gt;字符串 · 树 · 图 · 排序 · 408&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;读后感&lt;/td&gt;&lt;td&gt;READING&lt;/td&gt;&lt;td&gt;书籍 · 文档 · 笔记 · 感想&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;随笔&lt;/td&gt;&lt;td&gt;ESSAY&lt;/td&gt;&lt;td&gt;随想 · 杂记 · 短思考&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Debug&lt;/td&gt;&lt;td&gt;DEBUG&lt;/td&gt;&lt;td&gt;追踪 · 剖析 · 修复（替换原房屋图）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;分享&lt;/td&gt;&lt;td&gt;SHARE&lt;/td&gt;&lt;td&gt;工具 · 技巧 · 收藏（替换原房屋图）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;4-she-ji-wen-jian&quot;&gt;4. 涉及文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;详情页指针拖拽&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;画布卡片拖拽&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/heatmap-init.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;弹层滚动关闭条件、视口钳制&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt;&lt;/td&gt;&lt;td&gt;弹层列表滚动条与 overscroll&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;拖拽幽灵 / 高亮 / 抓取光标&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;各板块 &lt;code&gt;content/**/_index.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CRT ASCII 横幅&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;5-yan-zheng&quot;&gt;5. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 四个 JS 通过；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 无错误，&lt;code&gt;verify-kanban-build&lt;/code&gt; OK；&lt;/li&gt;
&lt;li&gt;构建产物中 10 个板块页面均含 &lt;code&gt;class=&quot;crt&quot;&lt;/code&gt; 与对应横幅文本。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T10:00:00+00:00</published>
        <updated>2026-08-11T10:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t10-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t10-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t10-00-00z/">&lt;p&gt;2026年08月11日 18:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-gong-neng-wei-diao-ding-ge-shi-jian-yue-shu-mo-ren-liu-lie-bu-ju-qia-pian-zhi-ding&quot;&gt;看板功能微调：顶格时间约束 · 默认六列布局 · 卡片置顶&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;在看板 GUI 编辑器与明细页上完成三项微调：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;顶格时间约束&lt;/strong&gt;：&lt;code&gt;week_start&lt;/code&gt; / &lt;code&gt;week_end&lt;/code&gt; 必须优先设置，跨度 &lt;strong&gt;2 ~ 14 天&lt;/strong&gt;，所有卡片 &lt;code&gt;@start&lt;/code&gt; / &lt;code&gt;@due&lt;/code&gt; 不得超出该区间；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;默认新建布局&lt;/strong&gt;：待办 / 进行中 / 已完成 / 进度 四列竖向，资源 / 目标 底部并排；进度列按天生成卡片并预填勾选清单；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;卡片置顶&lt;/strong&gt;：新增 &lt;code&gt;@pin&lt;/code&gt; 指令，同列表可多卡片置顶，置顶优先显示且带 📌 徽标。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-ding-ge-shi-jian-yue-shu&quot;&gt;1. 顶格时间约束&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;规则&lt;/th&gt;&lt;th&gt;实现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;必须优先设置&lt;/td&gt;&lt;td&gt;检查器“看板信息”面板将周起止放在首位；未设置无法通过校验&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;跨度 2–14 天&lt;/td&gt;&lt;td&gt;&lt;code&gt;validate()&lt;/code&gt;：&lt;code&gt;daySpan &amp;lt; 2&lt;/code&gt; 或 &lt;code&gt;&amp;gt; 14&lt;/code&gt; 均报错并提示当前天数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片时间不得越界&lt;/td&gt;&lt;td&gt;&lt;code&gt;validate()&lt;/code&gt; 逐卡片检查 &lt;code&gt;@start&lt;/code&gt; / &lt;code&gt;@due&lt;/code&gt; 是否落在 &lt;code&gt;[week_start, week_end]&lt;/code&gt;；错误信息带列/卡片定位&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;日期选择器联动&lt;/td&gt;&lt;td&gt;周开始 &lt;code&gt;max=周结束&lt;/code&gt;、周结束 &lt;code&gt;min=周开始&lt;/code&gt;；卡片开始/截止 &lt;code&gt;min=周开始&lt;/code&gt;、&lt;code&gt;max=周结束&lt;/code&gt;（&lt;code&gt;applyDateBounds()&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-mo-ren-xin-jian-bu-ju&quot;&gt;2. 默认新建布局&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;待办    进行中    已完成    进度        ← 主流程列（竖向一排）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;资源    目标                             ← 底部并排一行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;columnKind&lt;/code&gt; 新增 &lt;strong&gt;progress&lt;/strong&gt; 识别（&lt;code&gt;进度 / progress / timeline&lt;/code&gt;），进度列青色头样式；&lt;/li&gt;
&lt;li&gt;明细页 &lt;code&gt;renderBoard&lt;/code&gt; 改为两行容器：&lt;code&gt;.kanban-board-main&lt;/code&gt;（主流程列）+ &lt;code&gt;.kanban-board-bottom&lt;/code&gt;（资源/目标并排）；&lt;/li&gt;
&lt;li&gt;编辑器画布同步两行预览（&lt;code&gt;.kanban-editor-canvas-row&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;进度列按天生成&lt;/strong&gt;：&lt;code&gt;dayCardsBetween(week_start, week_end)&lt;/code&gt;，每张卡片标题 &lt;code&gt;MM-DD 周X&lt;/code&gt;，默认预填一条勾选清单「记录当日完成内容」（可勾选/划线）；&lt;/li&gt;
&lt;li&gt;修改顶格时间且进度列仍为自动生成样式（标题匹配 &lt;code&gt;MM-DD 周X&lt;/code&gt;）时，&lt;code&gt;maybeRegenerateProgress()&lt;/code&gt; 自动重排天数（仅新建模式）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-qia-pian-zhi-ding&quot;&gt;3. 卡片置顶&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;规则引擎：&lt;code&gt;@pin&lt;/code&gt; / &lt;code&gt;@置顶&lt;/code&gt; 指令 ↔ 卡片 &lt;code&gt;pinned&lt;/code&gt; 字段，序列化往返无损；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sortCards()&lt;/code&gt; 置顶优先：同一列表置顶卡片始终排在最前（手动模式保持相对顺序；按截止/优先级等排序时置顶组仍置顶）；&lt;/li&gt;
&lt;li&gt;明细页：置顶卡片带 &lt;code&gt;📌 置顶&lt;/code&gt; 徽标（左侧强调边框），解锁模式点击徽标取消置顶；&lt;/li&gt;
&lt;li&gt;GUI 编辑器：卡片面板新增「置顶 / 解除置顶」按钮，画布卡片右上角显示 📌。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;4-she-ji-wen-jian&quot;&gt;4. 涉及文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;@pin&lt;/code&gt;、progress 列识别、置顶优先排序&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;默认六列 + 进度按天、时间校验、日期边界联动、置顶按钮&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;两行布局、置顶徽标交互&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;两行容器、进度列配色、置顶样式&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;规则与布局文档同步&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;5-yan-zheng&quot;&gt;5. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 三个 JS 通过；&lt;/li&gt;
&lt;li&gt;规则测试：现有 4 看板往返无损；&lt;code&gt;@pin&lt;/code&gt; 解析/序列化、置顶+按截止混合排序、progress 列识别全部通过；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 无错误，&lt;code&gt;verify-kanban-build&lt;/code&gt; OK。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T08:00:00+00:00</published>
        <updated>2026-08-11T08:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t08-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t08-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t08-00-00z/">&lt;p&gt;2026年08月11日 16:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-xiang-qing-ye-trello-1-1-zhong-gou-gui-ze-yin-qing-sheng-ji-gui-bian-ji-qi-bu-ju-zhong-she-ji&quot;&gt;看板详情页：Trello 1:1 重构 · 规则引擎升级 · GUI 编辑器布局重设计&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮先以产品经理视角调研 Trello（官方 Support 文档 + 开源仿 Trello 项目 Planka / Kan / kanbany），对照自建看板做差距分析；随后：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;看板详情页 UI 全盘对齐 Trello（头部/背景/列/卡片正面/筛选/菜单抽屉/快捷添加）；&lt;/li&gt;
&lt;li&gt;规则映射引擎新增 &lt;code&gt;@done&lt;/code&gt;、&lt;code&gt;@cover&lt;/code&gt;、列级 &lt;code&gt;@sort&lt;/code&gt;/&lt;code&gt;@sort-order&lt;/code&gt;，Front Matter 新增 &lt;code&gt;board_bg&lt;/code&gt;/&lt;code&gt;favorite&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;GUI 编辑器由“单列长表单”重构为 &lt;strong&gt;Trello 式「画布 + 检查器」&lt;/strong&gt; 双栏布局；&lt;/li&gt;
&lt;li&gt;映射文档与 nanolog 同步更新。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;按需求排除复杂功能：附件、成员/角色指定、评论、Power-Ups/Butler 自动化、贴纸。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-trello-diao-yan-jie-lun-gong-neng-ju-zhen&quot;&gt;1. Trello 调研结论（功能矩阵）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Trello 元素&lt;/th&gt;&lt;th&gt;核心功能&lt;/th&gt;&lt;th&gt;本轮采用&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;看板 Board&lt;/td&gt;&lt;td&gt;标题 + 收藏星标&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.favorite&lt;/code&gt;，星标状态写入 Markdown&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;看板背景&lt;/td&gt;&lt;td&gt;纯色 / 图片 / 渐变&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.board_bg&lt;/code&gt; + 12 种预置渐变 + 自定义&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;看板菜单&lt;/td&gt;&lt;td&gt;关于 / 背景 / 搜索 / 更多&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;右侧抽屉&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;筛选 Filter&lt;/td&gt;&lt;td&gt;关键词 / 标签 / 截止 / 成员 / 保存视图&lt;/td&gt;&lt;td&gt;✅（去成员/保存视图）&lt;/td&gt;&lt;td&gt;快捷键 &lt;code&gt;F&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表 List&lt;/td&gt;&lt;td&gt;头部（名+计数+⋯菜单）/ 添加列表 / 拖拽排序&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;排序（截止/优先级/标题/清单）、重命名、删除、拖拽列头&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片正面&lt;/td&gt;&lt;td&gt;标签 / 标题 / 徽标行 / 封面&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;标签药丸、封面 &lt;code&gt;@bg&lt;/code&gt;+&lt;code&gt;@cover&lt;/code&gt;、徽标行&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;截止徽标&lt;/td&gt;&lt;td&gt;灰/黄/红/粉/绿 状态色&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;&lt;code&gt;dueState()&lt;/code&gt; 5 态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;清单进度&lt;/td&gt;&lt;td&gt;卡面进度条 + x/y&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;&lt;code&gt;checklistStats()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;标记完成&lt;/td&gt;&lt;td&gt;卡面圆圈打勾&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;&lt;code&gt;@done&lt;/code&gt; 指令&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;快捷添加&lt;/td&gt;&lt;td&gt;列底“+ 添加卡片” / 右侧“+ 添加列表”&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;解锁模式，保存走 Edit Post&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;归档 / 评论 / 成员 / 附件 / Power-Up / Butler&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;需求排除&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-xiang-qing-ye-ui-zhong-gou-trello-1-1-dui-qi&quot;&gt;2. 详情页 UI 重构（Trello 1:1 对齐）&lt;/h3&gt;
&lt;h4 id=&quot;2-1-kan-ban-tou-bu&quot;&gt;2.1 看板头部&lt;/h4&gt;
&lt;p&gt;返回链接 → 标题 + &lt;strong&gt;收藏星标&lt;/strong&gt; → 元信息行（开始/截止/剩余天数/进度/星级）→ 工具栏。&lt;/p&gt;
&lt;p&gt;工具栏（管理员可见）：锁定 / &lt;strong&gt;筛选&lt;/strong&gt;（&lt;code&gt;F&lt;/code&gt;）/ &lt;strong&gt;菜单&lt;/strong&gt; / GUI 编辑 / Edit Post / ReDeplog / 映射说明。&lt;/p&gt;
&lt;h4 id=&quot;2-2-bei-jing&quot;&gt;2.2 背景&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;extra.board_bg&lt;/code&gt; 驱动 &lt;code&gt;.kanban-page&lt;/code&gt; 背景；深色背景自动切换浅色文字（&lt;code&gt;has-board-bg&lt;/code&gt;）。菜单抽屉内提供 12 色渐变 + 默认 + 自定义输入。&lt;/p&gt;
&lt;h4 id=&quot;2-3-lie&quot;&gt;2.3 列&lt;/h4&gt;
&lt;p&gt;头部 = 列名（解锁后双击内联重命名）+ 计数 + &lt;code&gt;⋯&lt;/code&gt; 菜单；菜单含：添加卡片 / 排序（手动/截止/优先级/标题/清单，升/降序）/ 删除列。解锁后列头可拖拽调整顺序。&lt;/p&gt;
&lt;h4 id=&quot;2-4-qia-pian-zheng-mian&quot;&gt;2.4 卡片正面&lt;/h4&gt;
&lt;p&gt;标签药丸（带文字、浅色自动深字）· 封面条（&lt;code&gt;@bg&lt;/code&gt;，&lt;code&gt;@cover full&lt;/code&gt; 加高）· 完成圆圈（有 &lt;code&gt;@due&lt;/code&gt; 时显示，切换 &lt;code&gt;@done&lt;/code&gt;）· 徽标行（描述 / 开始 / 截止 / 清单进度 / 优先级）。&lt;/p&gt;
&lt;p&gt;截止徽标色义（Trello）：灰=未到 · 黄=今天/即将到期 · 红=逾期 · 粉=逾期超 1 天 · 绿=已完成。&lt;/p&gt;
&lt;h4 id=&quot;2-5-shai-xuan-yu-cai-dan-chou-ti&quot;&gt;2.5 筛选与菜单抽屉&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;筛选弹层&lt;/strong&gt;：关键词 + 标签多选 + 截止状态 + 最低优先级 + 隐藏已完成；列计数实时显示 &lt;code&gt;可见/总数&lt;/code&gt;；清除一键复位。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;菜单抽屉&lt;/strong&gt;：关于此看板（进度条）· 背景色板 · 搜索卡片（回车进入筛选）· 更多（GUI 编辑 / 保存 / ReDeplog / 映射说明）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-6-kuai-jie-tian-jia&quot;&gt;2.6 快捷添加&lt;/h4&gt;
&lt;p&gt;解锁后每列底部「＋ 添加卡片」、看板右侧「＋ 添加列表」，内联输入回车提交；所有本地修改（拖拽/勾选/排序/添加/背景/收藏/完成标记）统一提示“有未保存的本地修改”，保存走 &lt;strong&gt;Edit Post&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;3-gui-ze-ying-she-yin-qing-sheng-ji-kanban-rules-js&quot;&gt;3. 规则映射引擎升级（kanban-rules.js）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;新增&lt;/th&gt;&lt;th&gt;语法&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;完成状态&lt;/td&gt;&lt;td&gt;&lt;code&gt;@done&lt;/code&gt; / &lt;code&gt;@complete&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片 &lt;code&gt;done&lt;/code&gt; 布尔，截止徽标变绿、标题划线&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;封面尺寸&lt;/td&gt;&lt;td&gt;&lt;code&gt;@cover half / full&lt;/code&gt;&lt;/td&gt;&lt;td&gt;默认 half；配合 &lt;code&gt;@bg&lt;/code&gt; 使用&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列排序&lt;/td&gt;&lt;td&gt;&lt;code&gt;@sort manual/due/priority/title/checklist&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列对象 &lt;code&gt;sort&lt;/code&gt; 字段&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;排序方向&lt;/td&gt;&lt;td&gt;&lt;code&gt;@sort-order asc/desc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列对象 &lt;code&gt;sortOrder&lt;/code&gt; 字段&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;看板背景&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.board_bg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预置色名 / 色值 / gradient&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;收藏&lt;/td&gt;&lt;td&gt;&lt;code&gt;extra.favorite&lt;/code&gt;&lt;/td&gt;&lt;td&gt;布尔，写入 front matter&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;新增辅助函数：&lt;code&gt;checklistStats()&lt;/code&gt;、&lt;code&gt;dueState()&lt;/code&gt;（5 态截止徽标）、&lt;code&gt;sortCards()&lt;/code&gt;、&lt;code&gt;resolveBoardBg()&lt;/code&gt;、&lt;code&gt;BOARD_BG_PRESETS&lt;/code&gt;。解析器新增列级指令分支；序列化按新模型往返无损（4 个现有看板测试通过）。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;兼容性说明：&lt;code&gt;@bg&lt;/code&gt; 语义由“整卡背景色”调整为 &lt;strong&gt;Trello 封面&lt;/strong&gt;（卡片正面顶部色块，正文白底），映射文档已同步。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;4-gui-bian-ji-qi-bu-ju-zhong-she-ji-trello-hua-bu-jian-cha-qi&quot;&gt;4. GUI 编辑器布局重设计（Trello 画布 + 检查器）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;区域&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;顶部&lt;/td&gt;&lt;td&gt;模式徽标（新建/修改）· 标题 · 目标文件提示 · 关闭&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;左：画布&lt;/td&gt;&lt;td&gt;实时渲染看板（背景/列/卡片封面/标签/徽标）；点击列或卡片选中；「添加列表」「添加卡片」直达&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;右：检查器&lt;/td&gt;&lt;td&gt;按选中对象切换：看板信息（含背景色板/收藏）· 列表设置（列名/排序/方向/增删移）· 卡片设置（全部 &lt;code&gt;@&lt;/code&gt; 指令，下拉/手输/色板/清单/描述）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;底部&lt;/td&gt;&lt;td&gt;可折叠 Markdown 预览 + 结果流程区（复制/创建/修改指引/Token 同步）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;原“单列长表单”改为“选中即编辑”，字段与指令一一对应，覆盖新增的 &lt;code&gt;@cover&lt;/code&gt;、&lt;code&gt;@done&lt;/code&gt;、&lt;code&gt;@sort&lt;/code&gt;、&lt;code&gt;board_bg&lt;/code&gt;、&lt;code&gt;favorite&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;5-she-ji-wen-jian&quot;&gt;5. 涉及文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新指令解析/序列化、截止状态、清单统计、排序、背景预置&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;详情页 Trello 渲染、筛选、菜单抽屉、快捷添加、列拖拽、脏状态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新头部/筛选栏/菜单抽屉结构&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;画布+检查器编辑器、字段映射、复制、创建/修改流程、Token 同步&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/partials/kanban_editor.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑器模态框新结构&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;详情页 + 编辑器新样式&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新指令/字段/布局文档&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;6-yan-zheng&quot;&gt;6. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 三个 JS 全部通过；&lt;/li&gt;
&lt;li&gt;规则引擎往返测试：现有 4 个看板列/卡片无损；新指令（&lt;code&gt;@done&lt;/code&gt;/&lt;code&gt;@cover&lt;/code&gt;/&lt;code&gt;@sort&lt;/code&gt;/&lt;code&gt;board_bg&lt;/code&gt;/&lt;code&gt;favorite&lt;/code&gt;）生成→解析→再生成全部保留；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 无错误，&lt;code&gt;verify-kanban-build&lt;/code&gt; 通过（4 周看板完整）；&lt;/li&gt;
&lt;li&gt;明细页 HTML 已包含筛选栏/菜单抽屉/收藏星标/编辑器画布等新节点。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-hou-xu-ji-hua&quot;&gt;7. 后续计划&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
真机浏览器走查：剪贴板权限、拖拽、弹层定位、深色主题；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
卡片/列表“归档 + 恢复”（Trello Archive）；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
筛选条件保存为视图（URL hash）；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
编辑器移动端布局细化。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T06:00:00+00:00</published>
        <updated>2026-08-11T06:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t06-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t06-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t06-00-00z/">&lt;p&gt;2026年08月11日 14:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-gui-bian-ji-qi-xin-jian-xiu-gai-jian-tie-ban-chuang-jian-yu-xiu-gai-liu-cheng-zhi-yin&quot;&gt;看板 GUI 编辑器：新建 / 修改 · 剪贴板 · 创建与修改流程指引&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮为看板补充 &lt;strong&gt;GUI 编辑器&lt;/strong&gt;：不再需要手写 &lt;code&gt;@&lt;/code&gt; 指令 Markdown，而是通过表单（下拉 / 手输）设置看板的每个“图标/指令“可选值，自动生成 Markdown 并&lt;strong&gt;复制到剪贴板&lt;/strong&gt;，随后给出 &lt;strong&gt;创建 or 修改&lt;/strong&gt; 的完整操作流程提示。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-ru-kou&quot;&gt;1. 入口&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;位置&lt;/th&gt;&lt;th&gt;按钮&lt;/th&gt;&lt;th&gt;模式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;列表页 &lt;code&gt;/kanban/&lt;/code&gt; 页头&lt;/td&gt;&lt;td&gt;＋ 新建看板&lt;/td&gt;&lt;td&gt;新建：默认本周一～周日 + 五列（待办/进行中/已完成/资源/目标）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表页每张周卡片&lt;/td&gt;&lt;td&gt;✎ 编辑&lt;/td&gt;&lt;td&gt;修改：读取该周已有 Markdown 载入表单&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;明细页工具栏（解锁后）&lt;/td&gt;&lt;td&gt;GUI 编辑&lt;/td&gt;&lt;td&gt;修改：读取当前看板载入表单&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;2-zi-duan-yu-zhi-ling-ying-she-xia-la-huo-shou-shu&quot;&gt;2. 字段与指令映射（下拉或手输）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;表单字段&lt;/th&gt;&lt;th&gt;生成指令&lt;/th&gt;&lt;th&gt;输入方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;开始 / 截止日期&lt;/td&gt;&lt;td&gt;&lt;code&gt;@start&lt;/code&gt; / &lt;code&gt;@due&lt;/code&gt;&lt;/td&gt;&lt;td&gt;日期选择&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;重要等级&lt;/td&gt;&lt;td&gt;&lt;code&gt;@priority 1–5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;星级下拉&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;目标类型&lt;/td&gt;&lt;td&gt;&lt;code&gt;@goal complete / risk&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下拉&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;颜色标签&lt;/td&gt;&lt;td&gt;&lt;code&gt;@labels&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预设色块多选 + 自定义色值手输&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;背景色 / 顶栏色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@bg&lt;/code&gt; / &lt;code&gt;@top&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预设色名下拉 + 自定义 &lt;code&gt;#RRGGBB&lt;/code&gt; + 实时色块&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;勾选清单&lt;/td&gt;&lt;td&gt;&lt;code&gt;- [ ] / - [x]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;逐行增删勾选&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;描述正文&lt;/td&gt;&lt;td&gt;其余 Markdown&lt;/td&gt;&lt;td&gt;多行文本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列&lt;/td&gt;&lt;td&gt;&lt;code&gt;# 列名&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列名输入 + 添加/删除 + 快速列&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周起止 / 核心任务 / 星级&lt;/td&gt;&lt;td&gt;Front Matter&lt;/td&gt;&lt;td&gt;日期 / 文本 / 下拉&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-sheng-cheng-jian-tie-ban-liu-cheng-ti-shi&quot;&gt;3. 生成 → 剪贴板 → 流程提示&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;表单右侧实时 &lt;strong&gt;Markdown 预览&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;点「生成并复制到剪贴板」：
&lt;ul&gt;
&lt;li&gt;自动复制序列化后的 Markdown；&lt;/li&gt;
&lt;li&gt;弹出流程提示，明确区分 &lt;strong&gt;创建&lt;/strong&gt; 与 &lt;strong&gt;修改&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;创建（文件不存在）：Codeberg 新建文件 → 粘贴 → 保存提交 → ReDeplog 部署 → 刷新列表；&lt;/li&gt;
&lt;li&gt;修改（文件已存在）：Codeberg 覆盖文件 → 全选替换 → 保存提交 → ReDeplog 部署 → 刷新列表；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;提供「打开 Codeberg 编辑器」「打开 ReDeplog」快捷按钮；&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;若已保存 &lt;code&gt;kanbanToken&lt;/code&gt;，可「用 Token 直接同步到仓库」（POST 创建 / PUT 覆盖，复用原 API 逻辑）。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;4-quan-xian-diao-zheng&quot;&gt;4. 权限调整&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;新建看板按钮：&lt;strong&gt;管理员模式&lt;/strong&gt;可见可触发；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Mac-Chrome&lt;/strong&gt; 浏览器（UA / platform / userAgentData 三重检测，排除 Edge/Opera/Samsung）也放行；&lt;/li&gt;
&lt;li&gt;卡片 ✎ 编辑 与明细页 GUI 编辑保持管理员门控。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;5-she-ji-wen-jian&quot;&gt;5. 涉及文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;表单渲染、字段映射、序列化、剪贴板、流程提示、Token 同步、浏览器检测&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/partials/kanban_editor.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑器模态框（列表页 / 明细页共用）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban_list.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新建看板按钮 + 卡片 ✎ 编辑 + 模态框&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;明细页 GUI 编辑 + 模态框 + 脚本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑器样式&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/_index.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;注册 &lt;code&gt;js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GUI 编辑器文档&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;6-yan-zheng&quot;&gt;6. 验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;node --check&lt;/code&gt; 语法通过；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; 无错误；&lt;code&gt;verify-kanban-build&lt;/code&gt; 通过（4 周看板完整）；&lt;/li&gt;
&lt;li&gt;用真实 &lt;code&gt;kanban-rules.js&lt;/code&gt; 做序列化往返测试：现有 4 个看板列/卡片/指令全部保持；新建模式全字段样例生成正确；校验边界（日期倒置、跨度 &amp;gt; 14 天、空列/空卡片）全部拦截；&lt;/li&gt;
&lt;li&gt;Mac-Chrome 检测 7 种 UA 场景全部正确。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;7-hou-xu-ji-hua&quot;&gt;7. 后续计划&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
真实浏览器交互走查（解锁、弹窗、剪贴板权限）；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
支持从 GUI 编辑器直接拖拽排序列 / 卡片；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
编辑器表单的移动端布局优化；&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
历史看板一键“复制为本周模板“。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping/&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-08-11T04:00:00+00:00</published>
        <updated>2026-08-11T04:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-08-11t04-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-08-11t04-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-08-11t04-00-00z/">&lt;p&gt;2026年08月11日 12:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;wen-zhang-ye-re-li-tu-jin-ri-biao-ji-35-tian-chuang-kou-tong-ri-duo-wen-zhang-dan-ceng&quot;&gt;文章页热力图：今日标记 · 35 天窗口 · 同日多文章弹层&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;临近 月中， 集中将 最近一个月的 更新内容 进行 推送&lt;/p&gt;
&lt;p&gt;本轮针对文章页（&lt;code&gt;templates/article.html&lt;/code&gt; 右上角固定挂件）热力图做三项调整：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;今日单元格醒目标记&lt;/strong&gt;（GitHub 贡献图主流的蓝色描边环）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间窗口&lt;/strong&gt;由默认 2 个月改为&lt;strong&gt;最后一个格子 = 今日、向前 35 天&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;同日多篇文章交互&lt;/strong&gt;：点击格子一次性展示当天全部文章，可手动选择任意一篇跳转。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;构建流程（&lt;code&gt;zola build&lt;/code&gt; / &lt;code&gt;zola serve&lt;/code&gt; / &lt;code&gt;./dev.sh&lt;/code&gt; / &lt;code&gt;./build-site.sh&lt;/code&gt;）与 CI 均未改动。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-jin-ri-dan-yuan-ge-xing-mu-biao-ji&quot;&gt;1. 今日单元格醒目标记&lt;/h3&gt;
&lt;p&gt;采用 GitHub 贡献图的&lt;strong&gt;主流标记方式&lt;/strong&gt;：今日格子外圈加 2px 实色描边环 + 半透明外晕，浅色模式 &lt;code&gt;#0969da&lt;/code&gt;、深色模式 &lt;code&gt;#4493f8&lt;/code&gt;；同时补充 &lt;code&gt;aria-current=&quot;date&quot;&lt;/code&gt; 与「今日」前缀的读屏标签。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;类名&lt;/td&gt;&lt;td&gt;&lt;code&gt;.heatmap-day.is-today&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;样式文件&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;逻辑&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/js/heatmap-init.js&lt;/code&gt; &lt;code&gt;renderHeatmap()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无障碍&lt;/td&gt;&lt;td&gt;&lt;code&gt;aria-current=&quot;date&quot;&lt;/code&gt; + &lt;code&gt;今日 yyyy-mm-dd：…&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;该标记对归档页/看板页同样生效（今日格子在当年视图中也会显示描边环）。&lt;/p&gt;
&lt;h3 id=&quot;2-shi-jian-chuang-kou-zui-hou-ge-zi-jin-ri-xiang-qian-35-tian&quot;&gt;2. 时间窗口：最后格子 = 今日，向前 35 天&lt;/h3&gt;
&lt;p&gt;原实现（文章模式）取「上个月 1 日 → 下个月末日」共 2 个自然月。现改为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;start = 今日 - 34 天&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;end   = 今日&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;共 35 个格子，最后一个格子始终是今日&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;实现要点：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;点&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;常量&lt;/td&gt;&lt;td&gt;&lt;code&gt;ARTICLE_DAYS = 35&lt;/code&gt;，改数值即可调整跨度&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;范围&lt;/td&gt;&lt;td&gt;&lt;code&gt;getRange(&quot;article&quot;)&lt;/code&gt; 返回 &lt;code&gt;[今日-34, 今日]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;未来格子&lt;/td&gt;&lt;td&gt;今日所在周内、今日之后的格子不再渲染（最后一个单元格 = 今日）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周对齐&lt;/td&gt;&lt;td&gt;仍按 GitHub 式“列=周“布局，首列可含窗口前空档，末列仅到今天&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;月份标签&lt;/td&gt;&lt;td&gt;以实际渲染的周列数重算 &lt;code&gt;--heatmap-weeks&lt;/code&gt;，标签不错位&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-tong-ri-duo-pian-wen-zhang-de-jiao-hu&quot;&gt;3. 同日多篇文章的交互&lt;/h3&gt;
&lt;h4 id=&quot;3-1-jiao-hu-she-ji&quot;&gt;3.1 交互设计&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;单篇文章的日期&lt;/td&gt;&lt;td&gt;悬停显示标题 tooltip；点击直接跳转（原行为不变）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多篇文章的日期&lt;/td&gt;&lt;td&gt;悬停 tooltip 汇总「N 篇：标题1、标题2…」；&lt;strong&gt;点击弹出当天全部文章列表&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;弹层内&lt;/td&gt;&lt;td&gt;每篇一行（序号 + 标题），点击任意一行跳转对应文章&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;关闭方式&lt;/td&gt;&lt;td&gt;&lt;code&gt;Esc&lt;/code&gt;、点击弹层外部、页面滚动、窗口缩放&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无障碍&lt;/td&gt;&lt;td&gt;格子带 &lt;code&gt;aria-haspopup=&quot;dialog&quot;&lt;/code&gt; / &lt;code&gt;aria-expanded&lt;/code&gt;；弹层带 &lt;code&gt;role=&quot;dialog&quot;&lt;/code&gt; 与日期+篇数标签&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;弹层默认显示在格子正上方，空间不足时自动翻转到下方（带箭头指示），水平方向自动防溢出。&lt;/p&gt;
&lt;h4 id=&quot;3-2-shi-xian&quot;&gt;3.2 实现&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;改动&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/heatmap-init.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;bindDayCell()&lt;/code&gt; 分支处理；新增 &lt;code&gt;openDayPopover()&lt;/code&gt; / &lt;code&gt;positionPopover()&lt;/code&gt; / &lt;code&gt;closePopover()&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新增 &lt;code&gt;.heatmap-popover&lt;/code&gt; 系列样式与 &lt;code&gt;.heatmap-day.is-today&lt;/code&gt; 标记&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/partials/heatmap_component.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;无改动（数据本就包含当天全部文章）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;4-yan-zheng-yu-bu-shu&quot;&gt;4. 验证与部署&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 本地验证（改动 static/ 下的 JS/CSS 后 zola serve 会自动生效）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./dev.sh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或 zola serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 打开任意文章页（如 /01Write_blog_CMake/cmake-project-fix/）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;检查点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;今日格子有蓝色描边环，深色/浅色主题各正确；&lt;/li&gt;
&lt;li&gt;热力图最右侧一列 = 本周，本周内今日之后无格子；&lt;/li&gt;
&lt;li&gt;找一个同日多篇文章的日期（如 2026-06-24），点击弹出列表并可跳转。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;构建与部署流程不变：&lt;code&gt;./build-site.sh&lt;/code&gt; 会把 &lt;code&gt;static/&lt;/code&gt; 原样拷贝进 &lt;code&gt;public/&lt;/code&gt;。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -duc-/-duct-（引导）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-duc/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-duc/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-duc/">&lt;h1 id=&quot;ci-gen-duc-duct-yin-dao&quot;&gt;词根 -duc- / -duct-（引导）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-duc- / -duct-&lt;/code&gt; 来自拉丁语 &lt;em&gt;ducere&lt;/em&gt;「引导、带领」。词族庞大，是阅读高频来源。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;introduce&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;引入、介绍&lt;/td&gt;&lt;td&gt;intro（向内）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;conduct&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;进行、实施；行为&lt;/td&gt;&lt;td&gt;con（共同）+ duct&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;reduce&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;减少&lt;/td&gt;&lt;td&gt;re（回）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;produce&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;生产；农产品&lt;/td&gt;&lt;td&gt;pro（向前）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;deduce&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;推断、演绎&lt;/td&gt;&lt;td&gt;de（向下）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;induce&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;诱导、引起&lt;/td&gt;&lt;td&gt;in（向内）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;educate&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;教育&lt;/td&gt;&lt;td&gt;e（向外）+ duc + ate&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;product&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;产品&lt;/td&gt;&lt;td&gt;pro + duct&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;productive&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;多产的、高效的&lt;/td&gt;&lt;td&gt;product + ive&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;conductor&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;指挥、导体&lt;/td&gt;&lt;td&gt;conduct + or&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;duct&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;管道&lt;/td&gt;&lt;td&gt;duct&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;seduce&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;诱惑&lt;/td&gt;&lt;td&gt;se（分开）+ duce&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;conduct an experiment / survey&lt;/td&gt;&lt;td&gt;进行实验/调查&lt;/td&gt;&lt;td&gt;They conducted a survey of 2,000 people.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;reduce … to …&lt;/td&gt;&lt;td&gt;减少到；使沦为&lt;/td&gt;&lt;td&gt;The problem can be reduced to a simple equation.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;deduce … from …&lt;/td&gt;&lt;td&gt;从…推断出&lt;/td&gt;&lt;td&gt;We can deduce the truth from the evidence.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be induced to do sth&lt;/td&gt;&lt;td&gt;被诱导做某事&lt;/td&gt;&lt;td&gt;Consumers are induced to buy more.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;introduce sth into&lt;/td&gt;&lt;td&gt;把…引入&lt;/td&gt;&lt;td&gt;The policy introduced reforms into the system.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;productive capacity&lt;/td&gt;&lt;td&gt;生产能力&lt;/td&gt;&lt;td&gt;The factory is running at full productive capacity.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;produce an effect&lt;/td&gt;&lt;td&gt;产生效果&lt;/td&gt;&lt;td&gt;The drug produced a noticeable effect.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：The researchers &lt;strong&gt;conducted&lt;/strong&gt; a series of experiments to test the hypothesis. 研究人员进行了一系列实验来验证假设。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：From these facts we can &lt;strong&gt;deduce&lt;/strong&gt; that the economy is recovering. 从这些事实我们可以推断经济正在复苏。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：Advertising can &lt;strong&gt;induce&lt;/strong&gt; people to consume beyond their needs. 广告能诱导人们超出需求地消费。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：A &lt;strong&gt;productive&lt;/strong&gt; worker benefits both the company and society. 高效的工人对公司和社会的都有益。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 -duc-/-duct-（引导）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌───────────┼───────────┬──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    introduce   conduct    reduce       produce&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    introduction conduction reduction   product&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  conductor  reducible  productive&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     deduce（演绎）   induce（诱导）   educate（教育）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     deduction      induction     education&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     deductive      inductive     educator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      seduce（诱惑） duct（管道）  aqueduct（引水渠）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;re + duce&lt;/strong&gt;：往回带 → 减少；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pro + duce&lt;/strong&gt;：向前带出来 → 生产；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;con + duct&lt;/strong&gt;：一起带着走 → 引导/进行；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;de + duce&lt;/strong&gt;：向下推导 → 演绎推断；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in + duce&lt;/strong&gt;：往内带 → 诱导；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;e + duc + ate&lt;/strong&gt;：向外引导 → 教育（把潜力引导出来）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-ject/&quot;&gt;词根 -ject-&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-pos/&quot;&gt;词根 -pos-（放置）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -fer-（携带）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-fer/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-fer/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-fer/">&lt;h1 id=&quot;ci-gen-fer-xi-dai&quot;&gt;词根 -fer-（携带）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-fer-&lt;/code&gt; 来自拉丁语 &lt;em&gt;ferre&lt;/em&gt;「带、拿、承受」。派生词多且高频，是完形/阅读的常客。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;offer&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;提供、报价&lt;/td&gt;&lt;td&gt;of（向）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;transfer&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;转移、换乘&lt;/td&gt;&lt;td&gt;trans（越过）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;refer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;提到、查阅、指代&lt;/td&gt;&lt;td&gt;re（回）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;prefer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;更喜欢&lt;/td&gt;&lt;td&gt;pre（先）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;infer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;推断&lt;/td&gt;&lt;td&gt;in（向内）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;confer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;商议、授予&lt;/td&gt;&lt;td&gt;con（共同）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;differ&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;不同、有分歧&lt;/td&gt;&lt;td&gt;dif（分开）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;suffer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;遭受、忍受&lt;/td&gt;&lt;td&gt;suf（在下）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;defer&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;推迟&lt;/td&gt;&lt;td&gt;de（下）+ fer&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;fertile&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;肥沃的、多产的&lt;/td&gt;&lt;td&gt;fer + tile&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ferry&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;渡船；摆渡&lt;/td&gt;&lt;td&gt;fer + ry&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;circumference&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;周长&lt;/td&gt;&lt;td&gt;circum（周围）+ fer + ence&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;refer to&lt;/td&gt;&lt;td&gt;指的是；查阅&lt;/td&gt;&lt;td&gt;The term “GDP” refers to gross domestic product.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;prefer A to B&lt;/td&gt;&lt;td&gt;比起 B 更喜欢 A&lt;/td&gt;&lt;td&gt;I prefer tea to coffee.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;infer … from …&lt;/td&gt;&lt;td&gt;从…推断&lt;/td&gt;&lt;td&gt;We inferred the cause from the data.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;transfer … to …&lt;/td&gt;&lt;td&gt;转移到&lt;/td&gt;&lt;td&gt;The patient was transferred to another hospital.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;offer to do sth&lt;/td&gt;&lt;td&gt;主动提出做某事&lt;/td&gt;&lt;td&gt;He offered to help with the project.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;differ from / in&lt;/td&gt;&lt;td&gt;与…不同 / 在…方面不同&lt;/td&gt;&lt;td&gt;The two versions differ in detail.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;suffer from&lt;/td&gt;&lt;td&gt;遭受…之苦&lt;/td&gt;&lt;td&gt;Many people suffer from sleep loss.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;confer a degree on sb&lt;/td&gt;&lt;td&gt;授予某人学位&lt;/td&gt;&lt;td&gt;The university conferred an honorary degree on him.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;defer payment / decision&lt;/td&gt;&lt;td&gt;推迟付款/决定&lt;/td&gt;&lt;td&gt;The decision was deferred to next month.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：The report &lt;strong&gt;refers to&lt;/strong&gt; several studies published last year. 报告提到了去年发表的几项研究。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：Readers can &lt;strong&gt;infer&lt;/strong&gt; the author’s attitude from the tone. 读者能从语气推断作者的态度。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：Remote workers &lt;strong&gt;transfer&lt;/strong&gt; files through cloud services. 远程工作者通过云服务传输文件。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：Companies that &lt;strong&gt;offer&lt;/strong&gt; flexible hours attract better talent. 提供弹性工时的公司能吸引更优秀的人才。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 -fer-（携带）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌───────────┼───────────┬──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      offer     transfer     refer      prefer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     offering   transferable reference  preference&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                          referee     preferable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      infer（推断） confer（商议/授予） differ（不同）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      inference  conference       difference&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      inferential conferral       different&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     suffer（遭受） defer（推迟） fertile（多产的）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     suffering    deferral      fertilizer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     ferry（渡船） circumference（周长）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;of + fer&lt;/strong&gt;：带到面前 → 提供；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;trans + fer&lt;/strong&gt;：从一边带到另一边 → 转移；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;re + fer&lt;/strong&gt;：带回去查 → 提及/查阅；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pre + fer&lt;/strong&gt;：优先拿 → 更喜欢；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in + fer&lt;/strong&gt;：往里带进结论 → 推断；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;con + fer&lt;/strong&gt;：把意见带到一起 → 商议；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dif + fer&lt;/strong&gt;：分开带 → 不同；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;suf + fer&lt;/strong&gt;：在下面承受 → 遭受。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-tract/&quot;&gt;词根 -tract-&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -ject-（投掷）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-ject/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-ject/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-ject/">&lt;h1 id=&quot;ci-gen-ject-tou-zhi&quot;&gt;词根 -ject-（投掷）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-ject-&lt;/code&gt; 来自拉丁语 &lt;em&gt;jacere&lt;/em&gt;「投、掷」。核心动词都带“抛向某处“的画面感。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;project&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;项目、工程；投射、计划&lt;/td&gt;&lt;td&gt;pro（向前）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;inject&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;注射、注入&lt;/td&gt;&lt;td&gt;in（向内）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;reject&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;拒绝、排斥&lt;/td&gt;&lt;td&gt;re（回）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;eject&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;弹出、逐出&lt;/td&gt;&lt;td&gt;e（向外）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;subject&lt;/td&gt;&lt;td&gt;n./adj./v.&lt;/td&gt;&lt;td&gt;主题、学科；使遭受；受…支配的&lt;/td&gt;&lt;td&gt;sub（在下）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;object&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;物体、目标；反对&lt;/td&gt;&lt;td&gt;ob（相对）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;objective&lt;/td&gt;&lt;td&gt;n./adj.&lt;/td&gt;&lt;td&gt;目标；客观的&lt;/td&gt;&lt;td&gt;object + ive&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;trajectory&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;轨迹、弹道&lt;/td&gt;&lt;td&gt;tra（穿过）+ ject + ory&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;dejected&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;沮丧的&lt;/td&gt;&lt;td&gt;de（向下）+ ject + ed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;conjecture&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;推测、猜想&lt;/td&gt;&lt;td&gt;con（共同）+ ject&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;be subject to&lt;/td&gt;&lt;td&gt;受…支配；易遭受&lt;/td&gt;&lt;td&gt;Workers are subject to strict safety rules.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;object to&lt;/td&gt;&lt;td&gt;反对&lt;/td&gt;&lt;td&gt;Many residents objected to the new plan.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be objective about&lt;/td&gt;&lt;td&gt;客观看待&lt;/td&gt;&lt;td&gt;We should be objective about the data.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;inject capital into&lt;/td&gt;&lt;td&gt;向…注入资金&lt;/td&gt;&lt;td&gt;The government injected capital into the market.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;reject an offer / proposal&lt;/td&gt;&lt;td&gt;拒绝提议&lt;/td&gt;&lt;td&gt;The committee rejected the proposal.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;carry out a project&lt;/td&gt;&lt;td&gt;实施项目&lt;/td&gt;&lt;td&gt;The team carried out the project on time.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;subject matter&lt;/td&gt;&lt;td&gt;主题内容&lt;/td&gt;&lt;td&gt;The subject matter is difficult to understand.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：The new evidence &lt;strong&gt;subjected&lt;/strong&gt; the theory to serious doubt. 新证据使该理论受到严重质疑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：Many people &lt;strong&gt;object to&lt;/strong&gt; the construction of the dam. 许多人反对修建大坝。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：The rocket’s &lt;strong&gt;trajectory&lt;/strong&gt; was calculated precisely. 火箭的弹道被精确计算。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：Don’t &lt;strong&gt;conjecture&lt;/strong&gt; without sufficient evidence. 没有充分证据不要臆测。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  -ject-（投掷）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌──────────┼───────────┬─────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     project    inject     reject      eject&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    projection  injection  rejection  ejection&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    projector   injectable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     subject（主题/使遭受）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     object（物体/反对）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     objective（目标/客观的）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     trajectory（轨迹）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     dejected（沮丧的）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     conjecture（推测）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pro + ject&lt;/strong&gt;：向前抛 → 投射 → 项目（抛出的计划）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;re + ject&lt;/strong&gt;：抛回去 → 拒绝；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;in + ject&lt;/strong&gt;：往里打 → 注射；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;e + ject&lt;/strong&gt;：往外抛 → 弹出；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sub + ject&lt;/strong&gt;：抛在下面 → 受支配 → 主题（被谈论对象）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-spect/&quot;&gt;词根 -spect-&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-duc/&quot;&gt;词根 -duc-（引导）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -pos-/-posit-（放置）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-pos/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-pos/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-pos/">&lt;h1 id=&quot;ci-gen-pos-posit-fang-zhi&quot;&gt;词根 -pos- / -posit-（放置）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-pos- / -posit-&lt;/code&gt; 来自拉丁语 &lt;em&gt;ponere&lt;/em&gt;「放、置」。许多“位置/构成/提议“类单词都源于它。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;position&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;位置、职位&lt;/td&gt;&lt;td&gt;pos + ition&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;compose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;组成、创作&lt;/td&gt;&lt;td&gt;com（共同）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;expose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;暴露、揭露&lt;/td&gt;&lt;td&gt;ex（向外）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;propose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;提议、求婚&lt;/td&gt;&lt;td&gt;pro（向前）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;impose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;强加、征税&lt;/td&gt;&lt;td&gt;im（向内）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;oppose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;反对&lt;/td&gt;&lt;td&gt;op（相反）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;deposit&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;存放、存款；押金&lt;/td&gt;&lt;td&gt;de（向下）+ posit&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;postpone&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;推迟&lt;/td&gt;&lt;td&gt;post（后）+ pone&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;dispose&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;处理、处置&lt;/td&gt;&lt;td&gt;dis（分开）+ pose&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;supposed&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;假定的、被认为的&lt;/td&gt;&lt;td&gt;sup（下）+ pose + ed&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;positive&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;积极的、正的&lt;/td&gt;&lt;td&gt;posit + ive&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;opposite&lt;/td&gt;&lt;td&gt;adj./n.&lt;/td&gt;&lt;td&gt;相反的；对立面&lt;/td&gt;&lt;td&gt;op + pos + ite&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;be composed of&lt;/td&gt;&lt;td&gt;由…组成&lt;/td&gt;&lt;td&gt;Water is composed of hydrogen and oxygen.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be exposed to&lt;/td&gt;&lt;td&gt;暴露于；接触到&lt;/td&gt;&lt;td&gt;Children are exposed to too much screen time.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;impose … on …&lt;/td&gt;&lt;td&gt;把…强加于&lt;/td&gt;&lt;td&gt;The law imposes heavy fines on polluters.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be opposed to&lt;/td&gt;&lt;td&gt;反对&lt;/td&gt;&lt;td&gt;Many experts are opposed to the plan.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be supposed to do&lt;/td&gt;&lt;td&gt;应该做&lt;/td&gt;&lt;td&gt;You are supposed to submit the report today.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;dispose of&lt;/td&gt;&lt;td&gt;处理、清除&lt;/td&gt;&lt;td&gt;The company must dispose of waste safely.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;put off / postpone&lt;/td&gt;&lt;td&gt;推迟（同义）&lt;/td&gt;&lt;td&gt;The meeting was postponed until Friday.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;make a deposit&lt;/td&gt;&lt;td&gt;存款 / 交押金&lt;/td&gt;&lt;td&gt;He made a deposit of 1,000 yuan.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：The committee &lt;strong&gt;proposed&lt;/strong&gt; a series of measures to cut costs. 委员会提出了一系列削减成本的措施。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：New taxes were &lt;strong&gt;imposed on&lt;/strong&gt; imported goods. 进口商品被征收了新税。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：The report &lt;strong&gt;exposed&lt;/strong&gt; serious problems in the system. 报告揭露了系统中的严重问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：A &lt;strong&gt;positive&lt;/strong&gt; attitude is essential for success. 积极的态度对成功至关重要。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 -pos-/-posit-（放置）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌───────────┼───────────┬──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     compose    expose     propose      impose&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    composition exposure   proposal     imposition&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    composer    exposed    proposer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     oppose（反对）   dispose（处理）  deposit（存放）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     opposite        disposal      depositor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     position（位置）  postpone（推迟） suppose（假定）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     positive（积极的）              supposed（假定的）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;com + pose&lt;/strong&gt;：放在一起 → 组成；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ex + pose&lt;/strong&gt;：放到外面 → 暴露；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pro + pose&lt;/strong&gt;：摆到前面 → 提议；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;im + pose&lt;/strong&gt;：硬放上去 → 强加；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;op + pose&lt;/strong&gt;：反着放 → 反对；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;post + pone&lt;/strong&gt;：放到后面 → 推迟。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-duc/&quot;&gt;词根 -duc-&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-tract/&quot;&gt;词根 -tract-（拉）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -spect-（看）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-spect/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-spect/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-spect/">&lt;h1 id=&quot;ci-gen-spect-kan&quot;&gt;词根 -spect-（看）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-spect- / -spic-&lt;/code&gt; 来自拉丁语 &lt;em&gt;specere&lt;/em&gt;「看」。考研中高频出现，掌握一个词根 ≈ 一串单词。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;inspect&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;检查、视察&lt;/td&gt;&lt;td&gt;in（向内）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;respect&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;尊重、方面&lt;/td&gt;&lt;td&gt;re（再次）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;prospect&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;前景、展望&lt;/td&gt;&lt;td&gt;pro（向前）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;expect&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;期望、预料&lt;/td&gt;&lt;td&gt;ex（向外）+ pect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;perspective&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;视角、观点、透视&lt;/td&gt;&lt;td&gt;per（贯穿）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;spectator&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;观众&lt;/td&gt;&lt;td&gt;spect + ator（人）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;retrospect&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;回顾&lt;/td&gt;&lt;td&gt;retro（向后）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;suspect&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;怀疑、嫌疑犯&lt;/td&gt;&lt;td&gt;sus（下）+ pect&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;spectacle&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;景象、奇观&lt;/td&gt;&lt;td&gt;spect + acle&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;conspicuous&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;显眼的、显著的&lt;/td&gt;&lt;td&gt;con + spic + uous&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;circumspect&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;谨慎周到的&lt;/td&gt;&lt;td&gt;circum（周围）+ spect&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;in respect of / with respect to&lt;/td&gt;&lt;td&gt;关于、就…而言&lt;/td&gt;&lt;td&gt;With respect to the environment, we should act now.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;in retrospect&lt;/td&gt;&lt;td&gt;回想起来&lt;/td&gt;&lt;td&gt;In retrospect, the decision was too hasty.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;from one’s perspective&lt;/td&gt;&lt;td&gt;从…的角度&lt;/td&gt;&lt;td&gt;From an economic perspective, the policy works.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;live up to one’s expectations&lt;/td&gt;&lt;td&gt;不辜负期望&lt;/td&gt;&lt;td&gt;The product lived up to our expectations.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;beyond expectation&lt;/td&gt;&lt;td&gt;出乎意料&lt;/td&gt;&lt;td&gt;The results were beyond expectation.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;a prospective buyer / employee&lt;/td&gt;&lt;td&gt;潜在的买家/雇员&lt;/td&gt;&lt;td&gt;The house attracted many prospective buyers.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;hold sb in high regard (respect)&lt;/td&gt;&lt;td&gt;高度尊重&lt;/td&gt;&lt;td&gt;He is held in high regard by his colleagues.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：Government officials should &lt;strong&gt;inspect&lt;/strong&gt; the quality of food products regularly. 政府官员应定期检查食品质量。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：From a long-term &lt;strong&gt;perspective&lt;/strong&gt;, investing in education yields the highest return. 从长远角度看，投资教育回报最高。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：&lt;strong&gt;In retrospect&lt;/strong&gt;, the company’s failure was predictable. 回想起来，公司的失败是可以预见的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：The findings are &lt;strong&gt;conspicuous&lt;/strong&gt; and cannot be ignored. 这些发现十分显著，不容忽视。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                  -spect-（看）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌──────────┼───────────┬─────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     inspect    respect    prospect     suspect&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    inspection  respectful prospective  suspicion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    inspector   respectable             suspicious&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 irrespective&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 perspective（视角）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 retrospect（回顾）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 spectator（观众）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 spectacle（奇观）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 circumspect（谨慎）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 conspicuous（显眼的）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;in + spect&lt;/strong&gt;：向里看 → 检查；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;re + spect&lt;/strong&gt;：反复看 → 重视 → 尊重；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pro + spect&lt;/strong&gt;：向前看 → 前景；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;per + spect&lt;/strong&gt;：贯穿地看 → 透视 → 视角；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sus + pect&lt;/strong&gt;：在下面偷偷看 → 怀疑。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-ject/&quot;&gt;词根 -ject-（投掷）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>词根 -tract-（拉）考研高频词</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/english-root-tract/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/english-root-tract/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/english-root-tract/">&lt;h1 id=&quot;ci-gen-tract-la&quot;&gt;词根 -tract-（拉）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;-tract-&lt;/code&gt; 来自拉丁语 &lt;em&gt;trahere&lt;/em&gt;「拉、拖」。几乎所有派生词都能用“拉“的动作理解。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;he-xin-ci-zu&quot;&gt;核心词族&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;单词&lt;/th&gt;&lt;th&gt;词性&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;拆解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;attract&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;吸引&lt;/td&gt;&lt;td&gt;at（向）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;extract&lt;/td&gt;&lt;td&gt;v./n.&lt;/td&gt;&lt;td&gt;提取、摘录&lt;/td&gt;&lt;td&gt;ex（向外）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;contract&lt;/td&gt;&lt;td&gt;n./v.&lt;/td&gt;&lt;td&gt;合同；收缩；感染&lt;/td&gt;&lt;td&gt;con（共同）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;distract&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;分散（注意力）&lt;/td&gt;&lt;td&gt;dis（分开）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;subtract&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;减去&lt;/td&gt;&lt;td&gt;sub（下）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;abstract&lt;/td&gt;&lt;td&gt;adj./n./v.&lt;/td&gt;&lt;td&gt;抽象的；摘要；提取&lt;/td&gt;&lt;td&gt;abs（离开）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;retract&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;撤回、缩回&lt;/td&gt;&lt;td&gt;re（回）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;tractor&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;拖拉机&lt;/td&gt;&lt;td&gt;tract + or（工具）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;traction&lt;/td&gt;&lt;td&gt;n.&lt;/td&gt;&lt;td&gt;牵引力、摩擦力&lt;/td&gt;&lt;td&gt;tract + ion&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;intractable&lt;/td&gt;&lt;td&gt;adj.&lt;/td&gt;&lt;td&gt;难对付的&lt;/td&gt;&lt;td&gt;in（不）+ tract + able&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;protract&lt;/td&gt;&lt;td&gt;v.&lt;/td&gt;&lt;td&gt;延长&lt;/td&gt;&lt;td&gt;pro（向前）+ tract&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kao-yan-gao-pin-duan-yu&quot;&gt;考研高频短语&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;短语&lt;/th&gt;&lt;th&gt;释义&lt;/th&gt;&lt;th&gt;例句&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;attract attention / investment&lt;/td&gt;&lt;td&gt;吸引注意/投资&lt;/td&gt;&lt;td&gt;The project attracted wide attention.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;extract … from …&lt;/td&gt;&lt;td&gt;从…提取&lt;/td&gt;&lt;td&gt;Scientists extracted DNA from the sample.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;sign / enter into a contract&lt;/td&gt;&lt;td&gt;签订合同&lt;/td&gt;&lt;td&gt;The two firms entered into a contract.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;be distracted by&lt;/td&gt;&lt;td&gt;被…分心&lt;/td&gt;&lt;td&gt;Students are easily distracted by phones.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;in the abstract&lt;/td&gt;&lt;td&gt;抽象地、理论上&lt;/td&gt;&lt;td&gt;It sounds good in the abstract.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;abstract thinking&lt;/td&gt;&lt;td&gt;抽象思维&lt;/td&gt;&lt;td&gt;Mathematics develops abstract thinking.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;contract a disease&lt;/td&gt;&lt;td&gt;感染疾病&lt;/td&gt;&lt;td&gt;He contracted a rare disease.&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;subtract A from B&lt;/td&gt;&lt;td&gt;从 B 中减去 A&lt;/td&gt;&lt;td&gt;Subtract 5 from 8 and you get 3.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zhen-ti-yu-jing-li-ju&quot;&gt;真题语境例句&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;例句 1&lt;/strong&gt;：A good leader must &lt;strong&gt;attract&lt;/strong&gt; and keep talented people. 优秀的领导者必须吸引并留住人才。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 2&lt;/strong&gt;：The company &lt;strong&gt;extracted&lt;/strong&gt; useful data from the survey. 公司从调查中提取了有用数据。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 3&lt;/strong&gt;：Social media can &lt;strong&gt;distract&lt;/strong&gt; students from their studies. 社交媒体会分散学生学习的注意力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例句 4&lt;/strong&gt;：Some problems remain &lt;strong&gt;intractable&lt;/strong&gt; despite decades of research. 尽管研究了几十年，一些问题仍难以解决。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ci-zu-kuo-zhan-shu&quot;&gt;词族扩展树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                 -tract-（拉）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ┌───────────┼───────────┬──────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     attract    extract    contract     distract&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attraction  extraction contraction  distraction&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    attractive  extractor&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     abstract（抽象的/摘要） subtract（减去）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     abstraction             subtraction&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     retract（撤回） tractor（拖拉机）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     traction（牵引力） protract（延长）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     intractable（难对付的）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ji-yi-ji-qiao&quot;&gt;记忆技巧&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;at + tract&lt;/strong&gt;：往这边拉 → 吸引；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ex + tract&lt;/strong&gt;：向外拉 → 提取；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;con + tract&lt;/strong&gt;：拉在一起 → 收缩；拉到一起签的协议 → 合同；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;dis + tract&lt;/strong&gt;：把注意力拉散 → 分心；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sub + tract&lt;/strong&gt;：往下拉掉 → 减去；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ab + stract&lt;/strong&gt;：拉离具体 → 抽象。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-pos/&quot;&gt;词根 -pos-&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_English/english-root-fer/&quot;&gt;词根 -fer-（携带）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>高等数学 · 多元微积分（偏导 / 重积分 / 线面积分）</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-calculus-multi/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-calculus-multi/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-calculus-multi/">&lt;h1 id=&quot;gao-deng-shu-xue-duo-yuan-wei-ji-fen&quot;&gt;高等数学 · 多元微积分&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;考研高数后半程：&lt;strong&gt;偏导 → 全微分 → 方向导数/梯度 → 极值 → 重积分 → 线面积分 → 三大公式&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-duo-yuan-han-shu-ji-xian-yu-lian-xu&quot;&gt;1. 多元函数极限与连续&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lim((x,y)→(x₀,y₀)) f(x,y) = A&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;判断极限不存在&lt;/strong&gt;：取两条不同路径（如 y=kx、y=x²），极限不同则不存在。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-pian-dao-shu&quot;&gt;2. 偏导数&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fₓ(x₀,y₀) = lim(Δx→0) [f(x₀+Δx, y₀) − f(x₀,y₀)] / Δx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fᵧ(x₀,y₀) = lim(Δy→0) [f(x₀, y₀+Δy) − f(x₀,y₀)] / Δy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;gao-jie-pian-dao&quot;&gt;高阶偏导&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;fₓₓ、fₓᵧ、fᵧₓ、fᵧᵧ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;若 fₓᵧ 与 fᵧₓ 连续 ⇒ 二者相等（混合偏导与次序无关）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;yin-han-shu-pian-dao&quot;&gt;隐函数偏导&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;F(x,y,z)=0&lt;/code&gt; 确定 &lt;code&gt;z=z(x,y)&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∂z/∂x = −Fₓ/F_z，∂z/∂y = −Fᵧ/F_z&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-quan-wei-fen&quot;&gt;3. 全微分&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dz = fₓ(x,y)·dx + fᵧ(x,y)·dy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;可微 ⇒ 偏导存在；偏导连续 ⇒ 可微；可微 ⇒ 连续。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;复合函数链式法则（中间变量法）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;z = f(u,v)，u=u(x,y)，v=v(x,y)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∂z/∂x = (∂z/∂u)(∂u/∂x) + (∂z/∂v)(∂v/∂x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-fang-xiang-dao-shu-yu-ti-du&quot;&gt;4. 方向导数与梯度&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;方向导数 ∂f/∂l = fₓ·cos α + fᵧ·cos β&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;梯度 grad f = (fₓ, fᵧ)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;梯度方向是函数增长最快的方向&lt;/strong&gt;，其模为方向导数最大值。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-duo-yuan-han-shu-ji-zhi&quot;&gt;5. 多元函数极值&lt;/h2&gt;
&lt;h3 id=&quot;wu-tiao-jian-ji-zhi-er-jie-pian-dao-pan-bie&quot;&gt;无条件极值（二阶偏导判别）&lt;/h3&gt;
&lt;p&gt;驻点 &lt;code&gt;(x₀,y₀)&lt;/code&gt;：&lt;code&gt;fₓ=fᵧ=0&lt;/code&gt;，记&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A = fₓₓ，B = fₓᵧ，C = fᵧᵧ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AC − B² &amp;gt; 0 且 A &amp;lt; 0 ⇒ 极大；AC − B² &amp;gt; 0 且 A &amp;gt; 0 ⇒ 极小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;AC − B² &amp;lt; 0 ⇒ 非极值（鞍点）；AC − B² = 0 ⇒ 需另判&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tiao-jian-ji-zhi-la-ge-lang-ri-cheng-shu-fa&quot;&gt;条件极值（拉格朗日乘数法）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;在 φ(x,y)=0 下求 f(x,y) 极值：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;L(x,y,λ) = f(x,y) + λ·φ(x,y)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;解 Lₓ=Lᵧ=L_λ=0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-er-zhong-ji-fen&quot;&gt;6. 二重积分&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∬(D) f(x,y) dxdy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zhi-jiao-zuo-biao&quot;&gt;直角坐标&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;区域类型&lt;/th&gt;&lt;th&gt;积分次序&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;X 型&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(a..b) dx ∫(y₁(x)..y₂(x)) f dy&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Y 型&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(c..d) dy ∫(x₁(y)..x₂(y)) f dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;ji-zuo-biao&quot;&gt;极坐标&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x = r·cos θ，y = r·sin θ，dxdy = r·drdθ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;适合圆域、被积函数含 &lt;code&gt;x²+y²&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;dui-cheng-xing&quot;&gt;对称性&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D 关于 x 轴对称：f 关于 y 为奇 ⇒ 0；为偶 ⇒ 2 倍&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D 关于 y=x 对称：∬f(x,y) = ∬f(y,x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-san-zhong-ji-fen&quot;&gt;7. 三重积分&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;适用&lt;/th&gt;&lt;th&gt;公式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;先一后二（投影法）&lt;/td&gt;&lt;td&gt;一般区域&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫∫ dxdy ∫(z₁..z₂) f dz&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;先二后一（截面法）&lt;/td&gt;&lt;td&gt;旋转体&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(a..b) dz ∬(D_z) f dxdy&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;柱坐标&lt;/td&gt;&lt;td&gt;旋转体&lt;/td&gt;&lt;td&gt;&lt;code&gt;x=r cosθ, y=r sinθ, z=z&lt;/code&gt;，dv = r drdθdz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;球坐标&lt;/td&gt;&lt;td&gt;球域&lt;/td&gt;&lt;td&gt;&lt;code&gt;x=r sinφ cosθ, …&lt;/code&gt;，dv = r² sinφ drdφdθ&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-qu-xian-ji-fen&quot;&gt;8. 曲线积分&lt;/h2&gt;
&lt;h3 id=&quot;di-yi-lei-dui-hu-chang&quot;&gt;第一类（对弧长）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(L) f(x,y) ds，参数化 x=x(t),y=y(t)：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ds = √(x&amp;#39;² + y&amp;#39;²) dt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与方向无关，物理意义：质量、弧长。&lt;/p&gt;
&lt;h3 id=&quot;di-er-lei-dui-zuo-biao&quot;&gt;第二类（对坐标）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(L) P dx + Q dy = ∫ P·x&amp;#39;(t) dt + Q·y&amp;#39;(t) dt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与方向有关。&lt;/p&gt;
&lt;h3 id=&quot;ge-lin-gong-shi&quot;&gt;格林公式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∮(L⁺) P dx + Q dy = ∬(D) (∂Q/∂x − ∂P/∂y) dxdy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;与路径无关 ⇔ ∂P/∂y = ∂Q/∂x ⇔ 存在势函数 u 使 du = P dx + Q dy&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-qu-mian-ji-fen&quot;&gt;9. 曲面积分&lt;/h2&gt;
&lt;h3 id=&quot;di-yi-lei-dui-mian-ji&quot;&gt;第一类（对面积）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∬(Σ) f dS = ∬(D) f(x,y,z(x,y))·√(1+zₓ²+zᵧ²) dxdy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;di-er-lei-dui-zuo-biao-1&quot;&gt;第二类（对坐标）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∬(Σ) P dydz + Q dzdx + R dxdy，定向曲面，与侧有关&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;gao-si-gong-shi-tong-liang&quot;&gt;高斯公式（通量）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∯(Σ) P dydz + Q dzdx + R dxdy = ∭(Ω) (∂P/∂x + ∂Q/∂y + ∂R/∂z) dv&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;si-tuo-ke-si-gong-shi-huan-liang&quot;&gt;斯托克斯公式（环量）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∮(L) P dx + Q dy + R dz = ∬(Σ) rot F · n dS&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;10-kao-yan-chang-kao-ti-xing&quot;&gt;10. 考研常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;二重积分换序 / 极坐标转换；&lt;/li&gt;
&lt;li&gt;对称性化简重积分；&lt;/li&gt;
&lt;li&gt;条件极值（拉格朗日）应用题；&lt;/li&gt;
&lt;li&gt;格林公式补线（挖洞：奇点处小圆）；&lt;/li&gt;
&lt;li&gt;高斯公式补面、方向（内侧/外侧）；&lt;/li&gt;
&lt;li&gt;方向导数与梯度求最值方向。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：&lt;code&gt;∬(D) (x²+y²) dxdy&lt;/code&gt;，D 为 &lt;code&gt;x²+y² ≤ 1&lt;/code&gt; 第一象限。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;极坐标：∫(0..π/2) dθ ∫(0..1) r²·r dr = (π/2)·(1/4) = π/8&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：求 &lt;code&gt;f(x,y)=x²+y²&lt;/code&gt; 在 &lt;code&gt;x+y=1&lt;/code&gt; 下的最小值。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;L = x²+y² + λ(x+y−1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2x+λ=0，2y+λ=0，x+y=1 ⇒ x=y=1/2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;最小值 = 1/4 + 1/4 = 1/2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;11-yi-cuo-dian-qing-dan&quot;&gt;11. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;混合偏导相等需先验证连续；&lt;/li&gt;
&lt;li&gt;二重积分换序必画区域图；&lt;/li&gt;
&lt;li&gt;极坐标别漏因子 &lt;code&gt;r&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;第二类曲线/曲面积分注意方向与侧；&lt;/li&gt;
&lt;li&gt;格林/高斯公式使用前检查封闭性与奇点。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-calculus-one/&quot;&gt;一元微积分&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-linear-algebra/&quot;&gt;线性代数&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>高等数学 · 一元微积分（积分学 + 微分方程）</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-calculus-one/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-calculus-one/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-calculus-one/">&lt;h1 id=&quot;gao-deng-shu-xue-yi-yuan-wei-ji-fen-ji-fen-xue-wei-fen-fang-cheng&quot;&gt;高等数学 · 一元微积分（积分学 + 微分方程）&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;考研高频板块：一元函数积分学 + 常微分方程。掌握 &lt;strong&gt;基本积分表 → 换元/分部 → 定积分工具 → 应用&lt;/strong&gt; 的主线。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-yuan-han-shu-yu-bu-ding-ji-fen&quot;&gt;1. 原函数与不定积分&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ f(x) dx = F(x) + C   （其中 F&amp;#39;(x) = f(x)）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;性质：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ [f(x) ± g(x)] dx = ∫ f dx ± ∫ g dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ k·f(x) dx = k·∫ f(x) dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[∫ f(x) dx]&amp;#39; = f(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-ben-ji-fen-biao-bi-bei&quot;&gt;基本积分表（必背）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;被积函数&lt;/th&gt;&lt;th&gt;积分&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;x^μ&lt;/code&gt;（μ≠−1）&lt;/td&gt;&lt;td&gt;&lt;code&gt;x^(μ+1)/(μ+1) + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;1/x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;`ln&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;e^x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;e^x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a^x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;a^x/ln a + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sin x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−cos x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cos x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sin x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sec²x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;tan x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;csc²x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−cot x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;1/(1+x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;arctan x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;1/√(1−x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;arcsin x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sec x·tan x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sec x + C&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tan x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;`ln&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-huan-yuan-ji-fen-fa&quot;&gt;2. 换元积分法&lt;/h2&gt;
&lt;h3 id=&quot;di-yi-lei-huan-yuan-cou-wei-fen&quot;&gt;第一类换元（凑微分）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ f(φ(x))·φ&amp;#39;(x) dx = ∫ f(u) du，u = φ(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常见凑微分：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x dx = ½ d(x²)；1/x dx = d(ln x)；e^x dx = d(e^x)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cos x dx = d(sin x)；1/√(1−x²) dx = d(arcsin x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;di-er-lei-huan-yuan-qu-gen-hao&quot;&gt;第二类换元（去根号）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;含根式&lt;/th&gt;&lt;th&gt;换元&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;√(a²−x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;x = a·sin t&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;√(a²+x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;x = a·tan t&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;√(x²−a²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;x = a·sec t&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;√(ax+b)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;t = √(ax+b)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-fen-bu-ji-fen-fa&quot;&gt;3. 分部积分法&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ u dv = uv − ∫ v du&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;选择 u 的口诀（反对幂指三）&lt;/strong&gt;：反三角函数 &amp;gt; 对数 &amp;gt; 幂函数 &amp;gt; 指数 &amp;gt; 三角，越靠前越优先当 u。&lt;/p&gt;
&lt;p&gt;典型：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ x·e^x dx = x·e^x − e^x + C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ ln x dx = x·ln x − x + C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ x·sin x dx = −x·cos x + sin x + C&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-you-li-han-shu-ji-fen&quot;&gt;4. 有理函数积分&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫ P(x)/Q(x) dx：先真分式，再部分分式分解：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1/(x−a)(x−b) = A/(x−a) + B/(x−b)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用技巧：分母配方 + 凑微分。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-ding-ji-fen&quot;&gt;5. 定积分&lt;/h2&gt;
&lt;h3 id=&quot;ding-yi-li-man-he&quot;&gt;定义（黎曼和）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(a..b) f(x) dx = lim(λ→0) Σ f(ξᵢ)·Δxᵢ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-ben-xing-zhi&quot;&gt;基本性质&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(a..b) f dx = −∫(b..a) f dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(a..b) [f±g] dx = ∫f dx ± ∫g dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(a..b) f dx = ∫(a..c) f dx + ∫(c..b) f dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f ≤ g ⇒ ∫f dx ≤ ∫g dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|∫(a..b) f dx| ≤ ∫(a..b) |f| dx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-fen-zhong-zhi-ding-li&quot;&gt;积分中值定理&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∃ξ∈[a,b]：∫(a..b) f(x) dx = f(ξ)·(b−a)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;niu-dun-lai-bu-ni-ci-gong-shi&quot;&gt;牛顿–莱布尼茨公式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;F&amp;#39;(x) = f(x) ⇒ ∫(a..b) f(x) dx = F(b) − F(a)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;bian-shang-xian-ji-fen&quot;&gt;变上限积分&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Φ(x) = ∫(a..x) f(t) dt  ⇒  Φ&amp;#39;(x) = f(x)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[∫(a..φ(x)) f(t) dt]&amp;#39; = f(φ(x))·φ&amp;#39;(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;chang-yong-dui-cheng-xing&quot;&gt;常用对称性&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f 为奇函数：∫(−a..a) f dx = 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f 为偶函数：∫(−a..a) f dx = 2·∫(0..a) f dx&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;hua-li-shi-dian-huo-gong-shi&quot;&gt;华里士（点火）公式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∫(0..π/2) sinⁿx dx = ∫(0..π/2) cosⁿx dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  n 为奇数：(n−1)!!/n!!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  n 为偶数：(n−1)!!/n!! · π/2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-fan-chang-ji-fen&quot;&gt;6. 反常积分&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;定义&lt;/th&gt;&lt;th&gt;收敛条件举例&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;无穷限&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(a..+∞) f dx = lim(b→+∞)∫(a..b) f dx&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(1..∞) 1/x^p dx&lt;/code&gt;：p&amp;gt;1 收敛，p≤1 发散&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;瑕积分&lt;/td&gt;&lt;td&gt;无界点处取极限&lt;/td&gt;&lt;td&gt;&lt;code&gt;∫(0..1) 1/x^p dx&lt;/code&gt;：p&amp;lt;1 收敛，p≥1 发散&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;比较判别法 / 极限比较法&lt;/strong&gt;：与 &lt;code&gt;1/x^p&lt;/code&gt; 比较。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-ding-ji-fen-ying-yong&quot;&gt;7. 定积分应用&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;应用&lt;/th&gt;&lt;th&gt;公式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;平面面积&lt;/td&gt;&lt;td&gt;`A = ∫(a..b)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;旋转体体积（绕 x 轴）&lt;/td&gt;&lt;td&gt;&lt;code&gt;V = π∫(a..b) [f(x)]² dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;旋转体体积（柱壳）&lt;/td&gt;&lt;td&gt;&lt;code&gt;V = 2π∫(a..b) x·f(x) dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;曲线弧长&lt;/td&gt;&lt;td&gt;&lt;code&gt;s = ∫(a..b) √(1+[f&#39;(x)]²) dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;旋转体侧面积&lt;/td&gt;&lt;td&gt;&lt;code&gt;S = 2π∫(a..b) f(x)·√(1+[f&#39;(x)]²) dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;变力做功 / 水压力&lt;/td&gt;&lt;td&gt;微元法：&lt;code&gt;dW = F(x) dx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-chang-wei-fen-fang-cheng&quot;&gt;8. 常微分方程&lt;/h2&gt;
&lt;h3 id=&quot;yi-jie-fang-cheng&quot;&gt;一阶方程&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;形式&lt;/th&gt;&lt;th&gt;解法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;可分离变量&lt;/td&gt;&lt;td&gt;&lt;code&gt;dy/dx = f(x)·g(y)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分离后两边积分&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;齐次方程&lt;/td&gt;&lt;td&gt;&lt;code&gt;dy/dx = φ(y/x)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;令 &lt;code&gt;u = y/x&lt;/code&gt; 化为可分离&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;一阶线性&lt;/td&gt;&lt;td&gt;&lt;code&gt;y&#39; + P(x)y = Q(x)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;公式：&lt;code&gt;y = e^(−∫P dx)·[∫Q·e^(∫P dx) dx + C]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;伯努利&lt;/td&gt;&lt;td&gt;&lt;code&gt;y&#39; + P(x)y = Q(x)·yⁿ&lt;/code&gt;&lt;/td&gt;&lt;td&gt;令 &lt;code&gt;z = y^(1−n)&lt;/code&gt; 化为一阶线性&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;er-jie-chang-xi-shu-xian-xing-fang-cheng&quot;&gt;二阶常系数线性方程&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;y&amp;#39;&amp;#39; + p·y&amp;#39; + q·y = f(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;齐次&lt;/strong&gt;（&lt;code&gt;f(x)=0&lt;/code&gt;）：特征方程 &lt;code&gt;r² + pr + q = 0&lt;/code&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特征根&lt;/th&gt;&lt;th&gt;通解&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;两不等实根 &lt;code&gt;r₁,r₂&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;C₁e^(r₁x) + C₂e^(r₂x)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;重根 &lt;code&gt;r&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(C₁ + C₂x)·e^(rx)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;共轭复根 &lt;code&gt;α±βi&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;e^(αx)·(C₁cos βx + C₂sin βx)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;非齐次&lt;/strong&gt;：通解 = 齐次通解 + 特解（待定系数法按 &lt;code&gt;f(x)&lt;/code&gt; 类型设特解，含指数/多项式/三角）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-kao-yan-chang-kao-ti-xing&quot;&gt;9. 考研常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;不定积分计算（换元 + 分部组合）；&lt;/li&gt;
&lt;li&gt;对称区间定积分（奇偶性秒杀）；&lt;/li&gt;
&lt;li&gt;变上限积分求导与极限；&lt;/li&gt;
&lt;li&gt;反常积分判敛；&lt;/li&gt;
&lt;li&gt;旋转体体积与面积；&lt;/li&gt;
&lt;li&gt;一阶线性 / 二阶常系数方程求解（初值问题）；&lt;/li&gt;
&lt;li&gt;积分中值定理与夹逼结合的极限题。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：&lt;code&gt;∫(0..π) x·sin x dx&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;分部积分：= [−x·cos x](0..π) + ∫(0..π) cos x dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        = (π) + 0 = π&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：解 &lt;code&gt;y&#39; + y/x = x²&lt;/code&gt;（一阶线性）&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P = 1/x，∫P dx = ln x，e^(∫P dx) = x&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;y = x⁻¹·[∫x²·x dx + C] = x⁻¹·(x⁴/4 + C) = x³/4 + C/x&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;10-yi-cuo-dian-qing-dan&quot;&gt;10. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;不定积分别忘了 &lt;code&gt;+C&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;∫1/x dx = ln|x|&lt;/code&gt;（带绝对值）；&lt;/li&gt;
&lt;li&gt;换元时注意积分上下限同步替换（定积分）；&lt;/li&gt;
&lt;li&gt;分部积分 &lt;code&gt;u、v&lt;/code&gt; 选错会越积越复杂；&lt;/li&gt;
&lt;li&gt;二阶非齐次特解与齐次通解“撞根“时乘 &lt;code&gt;x&lt;/code&gt; 或 &lt;code&gt;x²&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-derivatives/&quot;&gt;导数与微分&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-calculus-multi/&quot;&gt;多元微积分&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>高等数学 · 导数与微分</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-derivatives/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-derivatives/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-derivatives/">&lt;h1 id=&quot;gao-deng-shu-xue-dao-shu-yu-wei-fen&quot;&gt;高等数学 · 导数与微分&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;考研高频板块：一元函数微分学。核心是 &lt;strong&gt;定义 + 公式 + 中值定理 + 应用&lt;/strong&gt; 四件事。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-dao-shu-ding-yi&quot;&gt;1. 导数定义&lt;/h2&gt;
&lt;p&gt;函数 &lt;code&gt;y = f(x)&lt;/code&gt; 在 &lt;code&gt;x₀&lt;/code&gt; 处的导数：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&amp;#39;(x₀) = lim(Δx→0) [f(x₀+Δx) − f(x₀)] / Δx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       = lim(x→x₀) [f(x) − f(x₀)] / (x − x₀)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zuo-dao-shu-you-dao-shu&quot;&gt;左导数 / 右导数&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;名称&lt;/th&gt;&lt;th&gt;定义&lt;/th&gt;&lt;th&gt;记号&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;左导数&lt;/td&gt;&lt;td&gt;&lt;code&gt;lim(x→x₀⁻) [f(x)−f(x₀)]/(x−x₀)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;f&#39;₋(x₀)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;右导数&lt;/td&gt;&lt;td&gt;&lt;code&gt;lim(x→x₀⁺) [f(x)−f(x₀)]/(x−x₀)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;f&#39;₊(x₀)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;可导 ⇔ 左导数 = 右导数。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;ke-dao-yu-lian-xu-de-guan-xi&quot;&gt;可导与连续的关系&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;可导 ⇒ 连续；连续 ⇏ 可导&lt;/strong&gt;（反例：&lt;code&gt;y=|x|&lt;/code&gt; 在 &lt;code&gt;x=0&lt;/code&gt; 连续但不可导）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;常用等价形式（求极限题）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&amp;#39;(x₀) = lim(h→0) [f(x₀+h) − f(x₀)] / h&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-ji-ben-qiu-dao-gong-shi-biao-bi-bei&quot;&gt;2. 基本求导公式表（必背）&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;函数&lt;/th&gt;&lt;th&gt;导数&lt;/th&gt;&lt;th&gt;函数&lt;/th&gt;&lt;th&gt;导数&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;C&lt;/code&gt;（常数）&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;x^μ&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;μ·x^(μ−1)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a^x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;a^x·ln a&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;e^x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;e^x&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;log_a x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1/(x·ln a)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ln x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1/x&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sin x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cos x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cos x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−sin x&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tan x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sec²x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cot x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−csc²x&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sec x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;sec x·tan x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;csc x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−csc x·cot x&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;arcsin x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1/√(1−x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;arccos x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−1/√(1−x²)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;arctan x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;1/(1+x²)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;arccot x&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;−1/(1+x²)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-qiu-dao-fa-ze&quot;&gt;3. 求导法则&lt;/h2&gt;
&lt;h3 id=&quot;si-ze-yun-suan-fa-ze&quot;&gt;四则运算法则&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(u ± v)&amp;#39; = u&amp;#39; ± v&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(uv)&amp;#39;    = u&amp;#39;v + uv&amp;#39;          （乘积）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(u/v)&amp;#39;   = (u&amp;#39;v − uv&amp;#39;)/v²     （商，v ≠ 0）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;fu-he-han-shu-qiu-dao-lian-shi-fa-ze&quot;&gt;复合函数求导（链式法则）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;y = f(g(x))  ⇒  y&amp;#39; = f&amp;#39;(g(x)) · g&amp;#39;(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;qi-ta-chang-yong-fang-fa&quot;&gt;其他常用方法&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;适用&lt;/th&gt;&lt;th&gt;要点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;隐函数求导&lt;/td&gt;&lt;td&gt;&lt;code&gt;F(x,y)=0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;方程两边对 x 求导，把 y 看作 y(x)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;参数方程求导&lt;/td&gt;&lt;td&gt;&lt;code&gt;x=φ(t), y=ψ(t)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;dy/dx = ψ&#39;(t)/φ&#39;(t)&lt;/code&gt;；二阶：&lt;code&gt;d²y/dx² = d(dy/dx)/dt ÷ dx/dt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;反函数求导&lt;/td&gt;&lt;td&gt;&lt;code&gt;x=f(y)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(f⁻¹)&#39;(y) = 1/f&#39;(x)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;对数求导法&lt;/td&gt;&lt;td&gt;幂指函数 / 多因子乘除&lt;/td&gt;&lt;td&gt;两边取 ln 再求导&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;幂指函数&lt;/strong&gt;：&lt;code&gt;y = u(x)^v(x)&lt;/code&gt; ⇒ &lt;code&gt;ln y = v·ln u&lt;/code&gt;，再求导。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-gao-jie-dao-shu&quot;&gt;4. 高阶导数&lt;/h2&gt;
&lt;h3 id=&quot;lai-bu-ni-ci-gong-shi&quot;&gt;莱布尼茨公式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(uv)^(n) = Σ(k=0..n) C(n,k) · u^(k) · v^(n−k)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;chang-jian-gao-jie-dao-shu&quot;&gt;常见高阶导数&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;函数&lt;/th&gt;&lt;th&gt;n 阶导数&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;e^(ax)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;aⁿ·e^(ax)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sin(ax+b)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;aⁿ·sin(ax+b + nπ/2)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cos(ax+b)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;aⁿ·cos(ax+b + nπ/2)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ln(1+x)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(−1)^(n−1)·(n−1)!/(1+x)ⁿ&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;1/(ax+b)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;(−1)ⁿ·n!·aⁿ/(ax+b)^(n+1)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-wei-fen&quot;&gt;5. 微分&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dy = f&amp;#39;(x)·dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Δy ≈ dy = f&amp;#39;(x₀)·Δx     （当 Δx → 0）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;可微 ⇔ 可导&lt;/strong&gt;（一元函数）。微分用于近似计算：&lt;code&gt;f(x₀+Δx) ≈ f(x₀) + f&#39;(x₀)·Δx&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-zhong-zhi-ding-li-san-da-ding-li-luo-bi-da&quot;&gt;6. 中值定理（三大定理 + 洛必达）&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;定理&lt;/th&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;结论&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;罗尔 Rolle&lt;/td&gt;&lt;td&gt;[a,b] 连续、(a,b) 可导、f(a)=f(b)&lt;/td&gt;&lt;td&gt;∃ξ∈(a,b)：f’(ξ)=0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;拉格朗日 Lagrange&lt;/td&gt;&lt;td&gt;[a,b] 连续、(a,b) 可导&lt;/td&gt;&lt;td&gt;∃ξ：f(b)−f(a)=f’(ξ)(b−a)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;柯西 Cauchy&lt;/td&gt;&lt;td&gt;两函数满足罗尔条件且 g’(x)≠0&lt;/td&gt;&lt;td&gt;∃ξ：[f(b)−f(a)]/[g(b)−g(a)] = f’(ξ)/g’(ξ)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;luo-bi-da-fa-ze&quot;&gt;洛必达法则&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;0/0&lt;/code&gt; 或 &lt;code&gt;∞/∞&lt;/code&gt; 型：&lt;code&gt;lim f/g = lim f&#39;/g&#39;&lt;/code&gt;（满足条件时）。&lt;/p&gt;
&lt;p&gt;其他未定式转化：&lt;code&gt;0·∞ → 0/0&lt;/code&gt;、&lt;code&gt;∞−∞ → 通分&lt;/code&gt;、&lt;code&gt;1^∞ / 0⁰ / ∞⁰ → 取 ln&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-dao-shu-ying-yong&quot;&gt;7. 导数应用&lt;/h2&gt;
&lt;h3 id=&quot;dan-diao-xing-yu-ji-zhi&quot;&gt;单调性与极值&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&amp;#39;(x) &amp;gt; 0  ⇒  f 递增；f&amp;#39;(x) &amp;lt; 0  ⇒  f 递减&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;极值点：驻点（f&amp;#39;=0）或不可导点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ao-tu-xing-yu-guai-dian&quot;&gt;凹凸性与拐点&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&amp;#39;&amp;#39;(x) &amp;gt; 0  ⇒  凹（下凸）；f&amp;#39;&amp;#39;(x) &amp;lt; 0  ⇒  凸（上凸）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;拐点：f&amp;#39;&amp;#39; 变号处&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;jian-jin-xian&quot;&gt;渐近线&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;方程&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;水平&lt;/td&gt;&lt;td&gt;&lt;code&gt;lim f(x) = A&lt;/code&gt;（x→∞）&lt;/td&gt;&lt;td&gt;&lt;code&gt;y = A&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;垂直&lt;/td&gt;&lt;td&gt;&lt;code&gt;lim f(x) = ∞&lt;/code&gt;（x→x₀）&lt;/td&gt;&lt;td&gt;&lt;code&gt;x = x₀&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;斜&lt;/td&gt;&lt;td&gt;&lt;code&gt;lim f(x)/x = k&lt;/code&gt;，&lt;code&gt;lim [f(x)−kx] = b&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;y = kx + b&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;zui-zhi-bu-zou&quot;&gt;最值步骤&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;求驻点与不可导点；&lt;/li&gt;
&lt;li&gt;比较端点、驻点、不可导点函数值；&lt;/li&gt;
&lt;li&gt;取最大 / 最小。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-kao-yan-chang-kao-ti-xing&quot;&gt;8. 考研常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;用导数定义求极限（凑定义式）；&lt;/li&gt;
&lt;li&gt;分段函数在分段点可导性讨论；&lt;/li&gt;
&lt;li&gt;中值定理证明题（构造辅助函数：&lt;code&gt;F(x)=f(x)−f(a)−...&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;不等式证明（拉格朗日中值 / 单调性）；&lt;/li&gt;
&lt;li&gt;参数方程与隐函数二阶导；&lt;/li&gt;
&lt;li&gt;极值、最值、拐点、渐近线的综合题。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：设 &lt;code&gt;f(x)=x²sin(1/x) (x≠0)&lt;/code&gt;，&lt;code&gt;f(0)=0&lt;/code&gt;，讨论 &lt;code&gt;x=0&lt;/code&gt; 处可导性。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&amp;#39;(0) = lim(h→0) [h²sin(1/h) − 0]/h = lim h·sin(1/h) = 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;⇒ 可导，且 f&amp;#39;(0)=0。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：证明 &lt;code&gt;e^x ≥ 1 + x&lt;/code&gt;（x∈R）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;令 F(x)=e^x − x − 1，F(0)=0，F&amp;#39;(x)=e^x−1。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&amp;gt;0 时 F&amp;#39;&amp;gt;0 递增，x&amp;lt;0 时 F&amp;#39;&amp;lt;0 递减 ⇒ x=0 为最小值 ⇒ F(x)≥0。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-yi-cuo-dian-qing-dan&quot;&gt;9. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;可导必连续，连续不一定可导（尖点）；&lt;/li&gt;
&lt;li&gt;复合函数求导别漏内层；&lt;/li&gt;
&lt;li&gt;隐函数二阶导要先求一阶导表达式再对 x 求导；&lt;/li&gt;
&lt;li&gt;洛必达必须验证型别，且每次使用后检查是否仍为未定式；&lt;/li&gt;
&lt;li&gt;极值点未必是驻点（不可导点也可以是极值点）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-calculus-one/&quot;&gt;一元微积分（积分学 + 微分方程）&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>离散数学 · 核心章节</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-discrete/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-discrete/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-discrete/">&lt;h1 id=&quot;chi-san-shu-xue-he-xin-zhang-jie&quot;&gt;离散数学 · 核心章节&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;计算机科学的基础数学：&lt;strong&gt;逻辑 → 集合 → 关系/函数 → 图论 → 代数系统 → 组合计数&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-shu-li-luo-ji&quot;&gt;1. 数理逻辑&lt;/h2&gt;
&lt;h3 id=&quot;ming-ti-luo-ji&quot;&gt;命题逻辑&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;联结词&lt;/th&gt;&lt;th&gt;记号&lt;/th&gt;&lt;th&gt;读法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;否定&lt;/td&gt;&lt;td&gt;¬p&lt;/td&gt;&lt;td&gt;非 p&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;合取&lt;/td&gt;&lt;td&gt;p∧q&lt;/td&gt;&lt;td&gt;p 且 q&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;析取&lt;/td&gt;&lt;td&gt;p∨q&lt;/td&gt;&lt;td&gt;p 或 q&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;蕴含&lt;/td&gt;&lt;td&gt;p→q&lt;/td&gt;&lt;td&gt;若 p 则 q&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;等价&lt;/td&gt;&lt;td&gt;p↔q&lt;/td&gt;&lt;td&gt;p 当且仅当 q&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：&lt;code&gt;p→q&lt;/code&gt; 只有 &lt;code&gt;p 真 q 假&lt;/code&gt; 时为假；&lt;code&gt;p→q ≡ ¬p∨q&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;deng-zhi-shi-chang-yong&quot;&gt;等值式（常用）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;双重否定：¬¬p ≡ p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;德摩根：¬(p∧q) ≡ ¬p∨¬q；¬(p∨q) ≡ ¬p∧¬q&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;吸收律：p∨(p∧q) ≡ p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;蕴涵等值式：p→q ≡ ¬p∨q&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tui-li-gui-ze&quot;&gt;推理规则&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;假言推理（MP）：p→q，p ⇒ q&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;拒取式（MT）：p→q，¬q ⇒ ¬p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;析取三段论：p∨q，¬p ⇒ q&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;假言三段论：p→q，q→r ⇒ p→r&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;wei-ci-luo-ji&quot;&gt;谓词逻辑&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∀x P(x)：全称量词；∃x P(x)：存在量词&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;¬∀x P(x) ≡ ∃x ¬P(x)；¬∃x P(x) ≡ ∀x ¬P(x)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-ji-he-lun&quot;&gt;2. 集合论&lt;/h2&gt;
&lt;h3 id=&quot;yun-suan&quot;&gt;运算&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;并 A∪B；交 A∩B；差 A−B；补 ∁A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;对称差 A⊕B = (A−B)∪(B−A)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;heng-deng-shi&quot;&gt;恒等式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;德摩根：∁(A∩B) = ∁A∪∁B；∁(A∪B) = ∁A∩∁B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A∪(B∩C) = (A∪B)∩(A∪C)（分配律）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-shu&quot;&gt;基数&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|A∪B| = |A|+|B|−|A∩B|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|A∪B∪C| = |A|+|B|+|C|−|A∩B|−|A∩C|−|B∩C|+|A∩B∩C|（容斥）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-guan-xi&quot;&gt;3. 关系&lt;/h2&gt;
&lt;h3 id=&quot;er-yuan-guan-xi-xing-zhi&quot;&gt;二元关系性质&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;性质&lt;/th&gt;&lt;th&gt;定义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;自反&lt;/td&gt;&lt;td&gt;所有 x，(x,x)∈R&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;反自反&lt;/td&gt;&lt;td&gt;所有 x，(x,x)∉R&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;对称&lt;/td&gt;&lt;td&gt;(x,y)∈R ⇒ (y,x)∈R&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;反对称&lt;/td&gt;&lt;td&gt;(x,y)∈R 且 (y,x)∈R ⇒ x=y&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;传递&lt;/td&gt;&lt;td&gt;(x,y),(y,z)∈R ⇒ (x,z)∈R&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;deng-jia-guan-xi-yu-hua-fen&quot;&gt;等价关系与划分&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;自反 + 对称 + 传递 = 等价关系&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;等价类 [x] = {y | xRy}；等价类集合构成集合的划分&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;pian-xu-guan-xi&quot;&gt;偏序关系&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;自反 + 反对称 + 传递 = 偏序（≤）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;哈斯图（Hasse 图）画法：去掉自反环与传递边&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;极大/极小元、最大/最小元、上/下界、上/下确界&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;guan-xi-bi-bao&quot;&gt;关系闭包&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;自反闭包 r(R) = R ∪ E&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;对称闭包 s(R) = R ∪ R⁻¹&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;传递闭包 t(R) = R ∪ R² ∪ R³ ∪ …（Warshall 算法）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-han-shu&quot;&gt;4. 函数&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f: A → B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;单射（一一）：不同自变量 → 不同函数值&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;满射（到上）：值域 = B&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;双射：既单又满&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;鸽巢原理&lt;/strong&gt;：&lt;code&gt;n+1&lt;/code&gt; 个物体放入 &lt;code&gt;n&lt;/code&gt; 个盒子，至少一个盒子 ≥ 2 个。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-tu-lun&quot;&gt;5. 图论&lt;/h2&gt;
&lt;h3 id=&quot;ji-ben-gai-nian&quot;&gt;基本概念&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;G = (V, E)；无向图 / 有向图&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;握手定理：Σdeg(v) = 2|E|（无向）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;有向图：Σdeg⁺ = Σdeg⁻ = |E|&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;te-shu-tu&quot;&gt;特殊图&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;图&lt;/th&gt;&lt;th&gt;判定&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;完全图 Kₙ&lt;/td&gt;&lt;td&gt;n(n−1)/2 条边&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;二部图&lt;/td&gt;&lt;td&gt;顶点可二分，边只跨部（无奇圈）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;欧拉图&lt;/td&gt;&lt;td&gt;所有顶点度数为偶（有向：出入相等）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;哈密顿图&lt;/td&gt;&lt;td&gt;必要条件（割点/度条件），充分条件 Dirac：&lt;code&gt;deg ≥ n/2&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;shu&quot;&gt;树&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n 个顶点的树：n−1 条边，连通无圈&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;生成树：连通图包含全部顶点的树&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;最小生成树：Prim（加点）/ Kruskal（加边，并查集判环）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ping-mian-tu&quot;&gt;平面图&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;欧拉公式：V − E + F = 2（连通平面图）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;K₅ 与 K₃,₃ 是非平面图&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tu-zhao-se&quot;&gt;图着色&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;四色定理：平面图 4 色足够&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;图着色 = 相邻顶点不同色，最少色数 χ(G)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-dai-shu-xi-tong&quot;&gt;6. 代数系统&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;系统&lt;/th&gt;&lt;th&gt;公理&lt;/th&gt;&lt;th&gt;例子&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;半群&lt;/td&gt;&lt;td&gt;封闭 + 结合&lt;/td&gt;&lt;td&gt;(N,+)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;独异点&lt;/td&gt;&lt;td&gt;半群 + 单位元&lt;/td&gt;&lt;td&gt;(N,·)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;群&lt;/td&gt;&lt;td&gt;独异点 + 逆元&lt;/td&gt;&lt;td&gt;(Z,+)、(Zₙ,+)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;阿贝尔群&lt;/td&gt;&lt;td&gt;群 + 交换&lt;/td&gt;&lt;td&gt;(Z,+)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;环&lt;/td&gt;&lt;td&gt;(R,+) 阿贝尔群 + 乘法结合/分配&lt;/td&gt;&lt;td&gt;(Z,+,·)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;域&lt;/td&gt;&lt;td&gt;环 + 乘法可逆（除零外）&lt;/td&gt;&lt;td&gt;(R,+,·)、(Zₚ,+,·) p 素数&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;拉格朗日定理&lt;/strong&gt;：有限群中子群的阶整除群的阶。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-zu-he-ji-shu&quot;&gt;7. 组合计数&lt;/h2&gt;
&lt;h3 id=&quot;pai-lie-yu-zu-he&quot;&gt;排列与组合&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(n,r) = n!/(n−r)!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;C(n,r) = n!/[r!(n−r)!]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;chang-yong-heng-deng-shi&quot;&gt;常用恒等式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;C(n,r) = C(n, n−r)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;C(n+1,r) = C(n,r) + C(n,r−1)（帕斯卡）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Σ C(n,k) = 2ⁿ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-shu-ji-qiao&quot;&gt;计数技巧&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;隔板法：&lt;code&gt;n&lt;/code&gt; 个相同物分 &lt;code&gt;k&lt;/code&gt; 组非空：&lt;code&gt;C(n−1, k−1)&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;错排数：&lt;code&gt;Dₙ = n!·Σ(−1)^k/k!&lt;/code&gt;，如 &lt;code&gt;D₃=2, D₄=9&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;生成函数 / 母函数处理受限组合。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-kao-yan-ji-shi-chang-kao-ti-xing&quot;&gt;8. 考研 / 机试常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;命题公式等值演算与主范式；&lt;/li&gt;
&lt;li&gt;关系性质判断、等价类与划分；&lt;/li&gt;
&lt;li&gt;哈斯图与偏序元；&lt;/li&gt;
&lt;li&gt;图论：握手定理、欧拉/哈密顿判定、着色；&lt;/li&gt;
&lt;li&gt;最小生成树（Prim/Kruskal）与最短路（Dijkstra/Floyd）；&lt;/li&gt;
&lt;li&gt;群判定与子群；&lt;/li&gt;
&lt;li&gt;排列组合与容斥、错排。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：证明 &lt;code&gt;(p→q) ∧ p ⇒ q&lt;/code&gt;（假言推理）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p→q ≡ ¬p∨q；(¬p∨q)∧p ≡ q∧p ⇒ q&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：&lt;code&gt;K₅&lt;/code&gt; 的边数：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;5·4/2 = 10&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 3&lt;/strong&gt;：4 封信全装错信封的方法数：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D₄ = 4!·(1 − 1 + 1/2 − 1/6 + 1/24) = 9&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-yi-cuo-dian-qing-dan&quot;&gt;9. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;蕴含联结词 &lt;code&gt;→&lt;/code&gt; 与日常“因果“含义不同；&lt;/li&gt;
&lt;li&gt;自反/反自反、对称/反对称不互斥；&lt;/li&gt;
&lt;li&gt;握手定理两边都算；&lt;/li&gt;
&lt;li&gt;欧拉图关注“一笔画“，哈密顿关注“回路遍历所有顶点“；&lt;/li&gt;
&lt;li&gt;群必须封闭、结合、有单位元、有逆元四条件齐备；&lt;/li&gt;
&lt;li&gt;错排与隔板法别套错模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-probability/&quot;&gt;概率论&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>线性代数 · 核心章节</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-linear-algebra/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-linear-algebra/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-linear-algebra/">&lt;h1 id=&quot;xian-xing-dai-shu-he-xin-zhang-jie&quot;&gt;线性代数 · 核心章节&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;线代脉络：&lt;strong&gt;行列式 → 矩阵 → 向量组 → 方程组 → 特征值 → 二次型&lt;/strong&gt;，前四章是后两章的工具。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-xing-lie-shi&quot;&gt;1. 行列式&lt;/h2&gt;
&lt;h3 id=&quot;ding-yi-yu-xing-zhi&quot;&gt;定义与性质&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;det(A) = Σ σ(p) a₁p₁ a₂p₂ … aₙpₙ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;核心性质：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;|Aᵀ| = |A|&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;两行（列）互换，行列式变号；&lt;/li&gt;
&lt;li&gt;某行乘以 k，行列式乘以 k；&lt;/li&gt;
&lt;li&gt;两行成比例 ⇒ 行列式为 0；&lt;/li&gt;
&lt;li&gt;某行加另一行的 k 倍，值不变；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|AB| = |A|·|B|&lt;/code&gt;；&lt;code&gt;|A⁻¹| = 1/|A|&lt;/code&gt;；&lt;code&gt;|kA| = kⁿ|A|&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhan-kai-ding-li-dai-shu-yu-zi-shi&quot;&gt;展开定理（代数余子式）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;按第 i 行展开：|A| = Σ(j) aᵢⱼ·Aᵢⱼ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;te-shu-xing-lie-shi&quot;&gt;特殊行列式&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;结果&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;上/下三角&lt;/td&gt;&lt;td&gt;主对角线乘积&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;对角&lt;/td&gt;&lt;td&gt;对角线乘积&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;范德蒙德&lt;/td&gt;&lt;td&gt;∏(xⱼ−xᵢ)（i&amp;lt;j）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;副对角&lt;/td&gt;&lt;td&gt;&lt;code&gt;(−1)^(n(n−1)/2)·∏aᵢ,ₙ₋ᵢ₊₁&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;ke-la-mo-fa-ze&quot;&gt;克拉默法则&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Ax=b&lt;/code&gt; 且 &lt;code&gt;|A|≠0&lt;/code&gt; 时：&lt;code&gt;xᵢ = |Aᵢ|/|A|&lt;/code&gt;（Aᵢ 为替换第 i 列）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-ju-zhen&quot;&gt;2. 矩阵&lt;/h2&gt;
&lt;h3 id=&quot;yun-suan&quot;&gt;运算&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(AB)C = A(BC)；A(B+C) = AB + AC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(AB)ᵀ = BᵀAᵀ；(A+B)ᵀ = Aᵀ+Bᵀ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|AB| = |A||B|&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ni-ju-zhen&quot;&gt;逆矩阵&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A⁻¹ 存在 ⇔ |A| ≠ 0 ⇔ A 可逆 ⇔ r(A) = n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A⁻¹ = A*/|A|（伴随矩阵法）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(AB)⁻¹ = B⁻¹A⁻¹；(Aᵀ)⁻¹ = (A⁻¹)ᵀ&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;常用公式：&lt;code&gt;A·A* = |A|E&lt;/code&gt; ⇒ &lt;code&gt;A* = |A|A⁻¹&lt;/code&gt;。&lt;/p&gt;
&lt;h3 id=&quot;chu-deng-bian-huan-yu-chu-deng-ju-zhen&quot;&gt;初等变换与初等矩阵&lt;/h3&gt;
&lt;p&gt;初等行变换不改变秩；初等矩阵左乘 = 行变换，右乘 = 列变换。&lt;/p&gt;
&lt;h3 id=&quot;zhi&quot;&gt;秩&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;r(A)：非零子式的最高阶数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;r(A) ≤ min(m,n)；r(A+B) ≤ r(A)+r(B)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;r(AB) ≤ min(r(A), r(B))；r(A)+r(B) − n ≤ r(AB)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;r(A)=r(Aᵀ)；r(kA)=r(A)（k≠0）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-xiang-liang-zu&quot;&gt;3. 向量组&lt;/h2&gt;
&lt;h3 id=&quot;xian-xing-xiang-guan-wu-guan&quot;&gt;线性相关 / 无关&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;α₁,…,αₛ 线性相关 ⇔ 存在不全为 0 的 kᵢ 使 Σ kᵢαᵢ = 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;无关 ⇔ 只有全 0 系数成立&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;判定：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;s &amp;gt; n&lt;/code&gt;（n 维向量）必相关；&lt;/li&gt;
&lt;li&gt;含零向量 ⇒ 相关；&lt;/li&gt;
&lt;li&gt;部分相关 ⇒ 整体相关；整体无关 ⇒ 部分无关；&lt;/li&gt;
&lt;li&gt;等价向量组秩相同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zhi-yu-ji-da-wu-guan-zu&quot;&gt;秩与极大无关组&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;秩 = 极大线性无关组中向量个数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;向量组秩 ≤ 矩阵秩，且 r(α₁,…,αₛ) = r(矩阵)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-xian-xing-fang-cheng-zu&quot;&gt;4. 线性方程组&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;Ax = b&lt;/code&gt;（m×n）&lt;/p&gt;
&lt;h3 id=&quot;jie-de-cun-zai-xing&quot;&gt;解的存在性&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;结论&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;`r(A) &amp;lt; r(A&lt;/td&gt;&lt;td&gt;b)`&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;`r(A) = r(A&lt;/td&gt;&lt;td&gt;b) = n`&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;`r(A) = r(A&lt;/td&gt;&lt;td&gt;b) = r &amp;lt; n`&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;齐次 &lt;code&gt;Ax=0&lt;/code&gt;：非零解 ⇔ &lt;code&gt;r(A) &amp;lt; n&lt;/code&gt; ⇔ &lt;code&gt;|A|=0&lt;/code&gt;（方阵）。&lt;/p&gt;
&lt;h3 id=&quot;jie-de-jie-gou&quot;&gt;解的结构&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;非齐次通解 = 齐次通解 + 一个特解&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;齐次通解 = C₁ξ₁ + … + Cₙ₋ᵣξₙ₋ᵣ（基础解系）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-te-zheng-zhi-yu-te-zheng-xiang-liang&quot;&gt;5. 特征值与特征向量&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Ax = λx（x ≠ 0）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;特征多项式：|λE − A| = 0&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zhong-yao-xing-zhi&quot;&gt;重要性质&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Σλᵢ = tr(A)（迹）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;∏λᵢ = |A|&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;不同特征值对应的特征向量线性无关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A⁻¹ 特征值 1/λ；Aᵀ 与 A 特征值相同；A^k 特征值 λ^k&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;xiang-si-dui-jiao-hua&quot;&gt;相似对角化&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A ~ Λ ⇔ A 有 n 个线性无关特征向量 ⇔ 每个 k 重特征值对应 k 个线性无关特征向量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P⁻¹AP = diag(λ₁,…,λₙ)，P 的列 = 特征向量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Aⁿ = P·Λⁿ·P⁻¹&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-er-ci-xing&quot;&gt;6. 二次型&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f = xᵀAx（A 对称）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;biao-zhun-xing-yu-gui-fan-xing&quot;&gt;标准形与规范形&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;配方法 / 正交变换法化标准形；&lt;/li&gt;
&lt;li&gt;规范形：系数只有 &lt;code&gt;1, −1, 0&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;惯性定理&lt;/strong&gt;：正、负惯性指数唯一；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;合同&lt;/strong&gt;：&lt;code&gt;CᵀAC = B&lt;/code&gt;（C 可逆）⇔ 正负惯性指数相同。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;zheng-ding-pan-ding&quot;&gt;正定判定&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;方法&lt;/th&gt;&lt;th&gt;条件&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;特征值&lt;/td&gt;&lt;td&gt;全为正&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;顺序主子式&lt;/td&gt;&lt;td&gt;全大于 0&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;定义&lt;/td&gt;&lt;td&gt;&lt;code&gt;∀x≠0：xᵀAx &amp;gt; 0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-kao-yan-chang-kao-ti-xing&quot;&gt;7. 考研常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;行列式性质与抽象行列式计算；&lt;/li&gt;
&lt;li&gt;求逆、伴随矩阵、&lt;code&gt;A*&lt;/code&gt; 与 &lt;code&gt;A&lt;/code&gt; 的关系；&lt;/li&gt;
&lt;li&gt;秩的不等式；&lt;/li&gt;
&lt;li&gt;向量组相关性的参数讨论；&lt;/li&gt;
&lt;li&gt;含参数方程组的解判定与通解；&lt;/li&gt;
&lt;li&gt;特征值特征向量、相似对角化、&lt;code&gt;Aⁿ&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;二次型化标准形、正定判断。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：已知 &lt;code&gt;A&lt;/code&gt; 三阶，&lt;code&gt;|A|=2&lt;/code&gt;，求 &lt;code&gt;|3A⁻¹|&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|3A⁻¹| = 3³·|A⁻¹| = 27·(1/2) = 27/2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：&lt;code&gt;A&lt;/code&gt; 特征值 1, 2, 3，求 &lt;code&gt;|A²+A+E|&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;A 的特征多项式作用于 A：g(λ) = λ²+λ+1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;|g(A)| = g(1)·g(2)·g(3) = 3·7·13 = 273&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-yi-cuo-dian-qing-dan&quot;&gt;8. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;(AB)ᵀ = BᵀAᵀ&lt;/code&gt; 次序互换；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;|kA| = kⁿ|A|&lt;/code&gt; 不是 &lt;code&gt;k|A|&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;矩阵乘法不满足交换律；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;AB=0&lt;/code&gt; 推不出 &lt;code&gt;A=0&lt;/code&gt; 或 &lt;code&gt;B=0&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;相似（存在可逆 P）与合同（对称阵）别混淆；&lt;/li&gt;
&lt;li&gt;特征向量必须非零。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-calculus-multi/&quot;&gt;多元微积分&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-probability/&quot;&gt;概率论&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>概率论 · 核心章节</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_Math/math-probability/"/>
        <id>https://suchaharcan.github.io/00Read_blog_Math/math-probability/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_Math/math-probability/">&lt;h1 id=&quot;gai-lu-lun-he-xin-zhang-jie&quot;&gt;概率论 · 核心章节&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;概率主线：&lt;strong&gt;事件概率 → 随机变量分布 → 数字特征 → 极限定理 → 数理统计&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-sui-ji-shi-jian-yu-gai-lu&quot;&gt;1. 随机事件与概率&lt;/h2&gt;
&lt;h3 id=&quot;gai-lu-gong-li&quot;&gt;概率公理&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;0 ≤ P(A) ≤ 1；P(Ω)=1；互斥可加&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;gu-dian-gai-xing&quot;&gt;古典概型&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(A) = A 包含的基本事件数 / 总基本事件数（等可能）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tiao-jian-gai-lu-yu-gong-shi&quot;&gt;条件概率与公式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(A|B) = P(AB)/P(B)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;乘法公式：P(AB) = P(A|B)·P(B)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;全概率公式：P(B) = Σ P(B|Aᵢ)·P(Aᵢ)（Aᵢ 完备划分）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;贝叶斯公式：P(Aᵢ|B) = P(B|Aᵢ)P(Aᵢ) / Σ P(B|Aⱼ)P(Aⱼ)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;du-li&quot;&gt;独立&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(AB) = P(A)·P(B) ⇔ A、B 独立&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;互斥 ≠ 独立（互斥通常不独立，除非概率为 0）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-yi-wei-sui-ji-bian-liang&quot;&gt;2. 一维随机变量&lt;/h2&gt;
&lt;h3 id=&quot;fen-bu-han-shu&quot;&gt;分布函数&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;F(x) = P(X ≤ x)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;性质：单调不减、右连续、F(−∞)=0、F(+∞)=1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(a &amp;lt; X ≤ b) = F(b) − F(a)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;chi-san-xing-chang-jian-fen-bu&quot;&gt;离散型：常见分布&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分布&lt;/th&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;P(X=k)&lt;/th&gt;&lt;th&gt;期望&lt;/th&gt;&lt;th&gt;方差&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;0-1&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p^k(1−p)^(1−k)&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;p(1−p)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;二项 B(n,p)&lt;/td&gt;&lt;td&gt;n,p&lt;/td&gt;&lt;td&gt;C(n,k)p^k(1−p)^(n−k)&lt;/td&gt;&lt;td&gt;np&lt;/td&gt;&lt;td&gt;np(1−p)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;泊松 P(λ)&lt;/td&gt;&lt;td&gt;λ&lt;/td&gt;&lt;td&gt;λ^k e^(−λ)/k!&lt;/td&gt;&lt;td&gt;λ&lt;/td&gt;&lt;td&gt;λ&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;几何&lt;/td&gt;&lt;td&gt;p&lt;/td&gt;&lt;td&gt;(1−p)^(k−1)p&lt;/td&gt;&lt;td&gt;1/p&lt;/td&gt;&lt;td&gt;(1−p)/p²&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;lian-xu-xing-chang-jian-fen-bu&quot;&gt;连续型：常见分布&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分布&lt;/th&gt;&lt;th&gt;密度&lt;/th&gt;&lt;th&gt;期望&lt;/th&gt;&lt;th&gt;方差&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;均匀 U(a,b)&lt;/td&gt;&lt;td&gt;1/(b−a)&lt;/td&gt;&lt;td&gt;(a+b)/2&lt;/td&gt;&lt;td&gt;(b−a)²/12&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;指数 E(λ)&lt;/td&gt;&lt;td&gt;λe^(−λx) (x≥0)&lt;/td&gt;&lt;td&gt;1/λ&lt;/td&gt;&lt;td&gt;1/λ²&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;正态 N(μ,σ²)&lt;/td&gt;&lt;td&gt;1/(σ√2π)·e^(−(x−μ)²/2σ²)&lt;/td&gt;&lt;td&gt;μ&lt;/td&gt;&lt;td&gt;σ²&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;正态标准化&lt;/strong&gt;：&lt;code&gt;Z = (X−μ)/σ ~ N(0,1)&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;指数分布无记忆性&lt;/strong&gt;：&lt;code&gt;P(X&amp;gt;s+t | X&amp;gt;s) = P(X&amp;gt;t)&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-er-wei-sui-ji-bian-liang&quot;&gt;3. 二维随机变量&lt;/h2&gt;
&lt;h3 id=&quot;lian-he-bian-yuan-tiao-jian&quot;&gt;联合 / 边缘 / 条件&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;边缘分布：fₓ(x) = ∫ f(x,y) dy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;条件密度：f(y|x) = f(x,y)/fₓ(x)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;X、Y 独立 ⇔ f(x,y) = fₓ(x)·fᵧ(y)（连续型）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;sui-ji-bian-liang-han-shu-fen-bu&quot;&gt;随机变量函数分布&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;离散和分布：卷积公式；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Z = X+Y&lt;/code&gt;（连续独立）：&lt;code&gt;f_z(z) = ∫ fₓ(x)·fᵧ(z−x) dx&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;正态可加性&lt;/strong&gt;：独立正态之和仍正态；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max(X,Y)&lt;/code&gt; / &lt;code&gt;min(X,Y)&lt;/code&gt; 分布函数法。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-shu-zi-te-zheng&quot;&gt;4. 数字特征&lt;/h2&gt;
&lt;h3 id=&quot;qi-wang&quot;&gt;期望&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;离散：E(X) = Σ xᵢpᵢ&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;连续：E(X) = ∫ x·f(x) dx&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;性质：E(aX+bY+c) = aE(X)+bE(Y)+c（线性）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;fang-chai&quot;&gt;方差&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D(X) = E(X²) − [E(X)]²&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;D(aX+b) = a²D(X)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;X、Y 独立：D(X±Y) = D(X)+D(Y)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;xie-fang-chai-yu-xiang-guan-xi-shu&quot;&gt;协方差与相关系数&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Cov(X,Y) = E(XY) − E(X)E(Y)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ρ = Cov(X,Y) / (√D(X)·√D(Y))，|ρ| ≤ 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ρ = 0 ⇔ 不相关（独立 ⇒ 不相关，反之不一定）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ju&quot;&gt;矩&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;k 阶原点矩：E(X^k)；k 阶中心矩：E[(X−E(X))^k]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-da-shu-ding-lu-yu-zhong-xin-ji-xian-ding-li&quot;&gt;5. 大数定律与中心极限定理&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;定理&lt;/th&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;结论&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;切比雪夫不等式&lt;/td&gt;&lt;td&gt;存在 E(X)、D(X)&lt;/td&gt;&lt;td&gt;`P(&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;辛钦大数定律&lt;/td&gt;&lt;td&gt;独立同分布，E(X)=μ&lt;/td&gt;&lt;td&gt;样本均值依概率收敛于 μ&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;伯努利大数定律&lt;/td&gt;&lt;td&gt;n 次独立重复&lt;/td&gt;&lt;td&gt;频率依概率收敛于 p&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;独立同分布中心极限定理&lt;/td&gt;&lt;td&gt;方差有限&lt;/td&gt;&lt;td&gt;&lt;code&gt;(ΣXᵢ − nμ)/(σ√n) → N(0,1)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;棣莫弗–拉普拉斯&lt;/td&gt;&lt;td&gt;二项 B(n,p)&lt;/td&gt;&lt;td&gt;二项近似正态 N(np, npq)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-shu-li-tong-ji-ji-chu&quot;&gt;6. 数理统计基础&lt;/h2&gt;
&lt;h3 id=&quot;tong-ji-liang-yu-chou-yang-fen-bu&quot;&gt;统计量与抽样分布&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;样本均值 X̄ = (1/n)ΣXᵢ；样本方差 S² = 1/(n−1)·Σ(Xᵢ−X̄)²&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;总体 N(μ,σ²)：X̄ ~ N(μ, σ²/n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;χ² 分布：Σ[(Xᵢ−μ)/σ]² ~ χ²(n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;t 分布：(X̄−μ)/(S/√n) ~ t(n−1)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;F 分布：两独立 χ² 之比&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;can-shu-gu-ji&quot;&gt;参数估计&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;矩估计&lt;/strong&gt;：用样本矩估计总体矩；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;最大似然估计&lt;/strong&gt;：构造似然函数 &lt;code&gt;L(θ)=∏f(xᵢ;θ)&lt;/code&gt;，取对数求导令 0；&lt;/li&gt;
&lt;li&gt;无偏性：&lt;code&gt;E(θ̂)=θ&lt;/code&gt;；有效性：方差小者优；一致性：依概率收敛。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jia-she-jian-yan-liao-jie&quot;&gt;假设检验（了解）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;原假设 H₀ / 备择 H₁，显著性水平 α&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;拒绝域：|z| &amp;gt; z_(α/2)（正态总体均值双侧检验）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;两类错误：拒真（α）与取伪（β）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-kao-yan-chang-kao-ti-xing&quot;&gt;7. 考研常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;全概率 / 贝叶斯应用题；&lt;/li&gt;
&lt;li&gt;分布函数与密度互求、分段讨论；&lt;/li&gt;
&lt;li&gt;二维联合分布求边缘、条件、独立性；&lt;/li&gt;
&lt;li&gt;期望方差计算（用性质拆解）；&lt;/li&gt;
&lt;li&gt;切比雪夫不等式估概率；&lt;/li&gt;
&lt;li&gt;中心极限定理近似计算（二项/独立同分布）；&lt;/li&gt;
&lt;li&gt;矩估计与最大似然估计。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;li-ti-su-lan&quot;&gt;例题速览&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：&lt;code&gt;X ~ N(2, 4)&lt;/code&gt;，求 &lt;code&gt;P(|X−2| &amp;lt; 2)&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;P(|X−2| &amp;lt; 2) = P(|Z| &amp;lt; 1) = 2Φ(1) − 1 ≈ 0.6826&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：&lt;code&gt;X ~ U(0,1)&lt;/code&gt;，求 &lt;code&gt;E(X²)&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;E(X²) = ∫(0..1) x² dx = 1/3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-yi-cuo-dian-qing-dan&quot;&gt;8. 易错点清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;独立 ⇒ 不相关，不相关 ⇏ 独立（正态联合除外）；&lt;/li&gt;
&lt;li&gt;方差无线性可加（需独立）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;D(X) = E(X²) − [E(X)]²&lt;/code&gt; 别算错 E(X²)；&lt;/li&gt;
&lt;li&gt;指数分布无记忆性常考；&lt;/li&gt;
&lt;li&gt;矩估计 vs 最大似然估计方法别混；&lt;/li&gt;
&lt;li&gt;样本方差分母是 n−1。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-linear-algebra/&quot;&gt;线性代数&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/00Read_blog_Math/math-discrete/&quot;&gt;离散数学&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>考研 408 · 图核心知识点</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-graph/"/>
        <id>https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-graph/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-graph/">&lt;h1 id=&quot;kao-yan-408-tu-he-xin-zhi-shi-dian&quot;&gt;考研 408 · 图核心知识点&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;图是 408 大题最爱：&lt;strong&gt;存储 → 遍历 → 生成树 → 最短路 → 拓扑/关键路径&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-tu-de-cun-chu&quot;&gt;1. 图的存储&lt;/h2&gt;
&lt;h3 id=&quot;lin-jie-ju-zhen&quot;&gt;邻接矩阵&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      1   2   3   4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1  [  0   1   1   0 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2  [  1   0   1   1 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3  [  1   1   0   1 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4  [  0   1   1   0 ]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无向图对称；有向图按出边填写。&lt;strong&gt;判断两点是否相邻 O(1)，求度方便；但空间 O(n²)&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;lin-jie-biao&quot;&gt;邻接表&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1 → 2 → 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2 → 1 → 3 → 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;3 → 1 → 2 → 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;4 → 2 → 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;空间 O(n+e)，适合稀疏图&lt;/strong&gt;；求某点出度方便，判断相邻需扫描。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;存储&lt;/th&gt;&lt;th&gt;空间&lt;/th&gt;&lt;th&gt;判断相邻&lt;/th&gt;&lt;th&gt;求所有邻点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;邻接矩阵&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;O(n)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;邻接表&lt;/td&gt;&lt;td&gt;O(n+e)&lt;/td&gt;&lt;td&gt;O(degree)&lt;/td&gt;&lt;td&gt;O(degree)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-bian-li&quot;&gt;2. 遍历&lt;/h2&gt;
&lt;h3 id=&quot;dfs-shen-du-you-xian-yong-zhan-di-gui&quot;&gt;DFS（深度优先，用栈/递归）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;访问顶点 → 递归访问第一个未访问邻点 → 回溯&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;bfs-yan-du-you-xian-yong-dui-lie&quot;&gt;BFS（广度优先，用队列）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;访问顶点 → 邻点全部入队 → 逐个出队重复&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;复杂度&lt;/strong&gt;：邻接表 O(n+e)，邻接矩阵 O(n²)。&lt;/p&gt;
&lt;p&gt;BFS 还能求&lt;strong&gt;无权图最短路径（边数）&lt;/strong&gt;、判断连通分量数。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-zui-xiao-sheng-cheng-shu-mst&quot;&gt;3. 最小生成树 MST&lt;/h2&gt;
&lt;h3 id=&quot;prim-jia-dian&quot;&gt;Prim（加点）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;从一个顶点出发，每次选择&amp;quot;连接已选集合与未选集合的最短边&amp;quot;加入集合，直到覆盖全部顶点。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度：邻接矩阵 O(n²)；适合稠密图。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;kruskal-jia-bian&quot;&gt;Kruskal（加边）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;边按权排序，从小到大选边，用并查集避免成环，选 n−1 条为止。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度：O(e·log e)；适合稀疏图。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shi-li&quot;&gt;示例&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    1 --2-- 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    |  \    |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    2    4  3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    |    \  |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    3 --1-- 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;按 Kruskal：先取 3-4(1)、1-2(2)、1-3(2)（跳过 2-4(3)） ⇒ MST 总权 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-zui-duan-lu-jing&quot;&gt;4. 最短路径&lt;/h2&gt;
&lt;h3 id=&quot;dijkstra-dan-yuan-fei-fu-quan&quot;&gt;Dijkstra（单源，非负权）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;维护 dist[]，每次取未确定顶点中 dist 最小者，松弛其邻边。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度：邻接矩阵 O(n²)；堆优化 O((n+e)log n)。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;不能处理负权边。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;floyd-duo-yuan&quot;&gt;Floyd（多源）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;三重循环：d[i][j] = min(d[i][j], d[i][k] + d[k][j])&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度 O(n³)；可处理负权（无负环）。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shi-li-dijkstra-cong-1-chu-fa&quot;&gt;示例（Dijkstra 从 1 出发）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  1 ───── 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  | 1   1 |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  2 ───── 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dist: 1→1=0, 1→2=1, 1→3=2, 1→4=3（经 3）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-tuo-bu-pai-xu-aov-wang&quot;&gt;5. 拓扑排序（AOV 网）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;无环有向图，顶点表示活动。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;反复：选入度为 0 的顶点输出，删除其出边，直到全部输出。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;若剩余顶点仍有入度 ⇒ 存在环。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度：邻接表 O(n+e)。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shi-li-1&quot;&gt;示例&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;课程依赖：A→C, B→C, C→D&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;拓扑序之一：A B C D（不唯一）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-guan-jian-lu-jing-aoe-wang&quot;&gt;6. 关键路径（AOE 网）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;顶点 = 事件，边 = 活动（带权=耗时）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ve(最早发生) 正向取 max；vl(最迟发生) 逆向取 min&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;活动最早 e = ve(弧尾)；活动最迟 l = vl(弧头) − 权&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;e == l 的活动为关键活动，串联成关键路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;关键路径长度 = 工程最短工期&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shi-li-2&quot;&gt;示例&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   v1 ─2─▶ v2 ─3─▶ v4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     \            ▲&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      4 ────────▶ 3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ve: v1=0, v2=2, v4=5, v3=4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;vl: v1=0, v2=2, v4=5, v3=2（逆向）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;关键活动：v1→v2(2), v2→v4(3)，关键路径长 5&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-chang-kao-ti-xing&quot;&gt;7. 常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;画邻接矩阵/邻接表；&lt;/li&gt;
&lt;li&gt;给图写 DFS/BFS 序列；&lt;/li&gt;
&lt;li&gt;Prim/Kruskal 过程与总权；&lt;/li&gt;
&lt;li&gt;Dijkstra/Floyd 逐步表；&lt;/li&gt;
&lt;li&gt;拓扑排序与环检测；&lt;/li&gt;
&lt;li&gt;求 ve/vl/e/l 与关键路径；&lt;/li&gt;
&lt;li&gt;判断有向图强连通、无向图连通分量。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-yi-cuo-dian&quot;&gt;8. 易错点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Dijkstra &lt;strong&gt;不适用负权&lt;/strong&gt;，Floyd 可；&lt;/li&gt;
&lt;li&gt;MST 不含权值相等的唯一性讨论（可能不唯一）；&lt;/li&gt;
&lt;li&gt;拓扑排序不唯一；&lt;/li&gt;
&lt;li&gt;关键路径可能&lt;strong&gt;不止一条&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;BFS 求最短路只对&lt;strong&gt;无权&lt;/strong&gt;图。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-tree/&quot;&gt;树&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-sort/&quot;&gt;排序&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>考研 408 · 排序核心知识点</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-sort/"/>
        <id>https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-sort/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-sort/">&lt;h1 id=&quot;kao-yan-408-pai-xu-he-xin-zhi-shi-dian&quot;&gt;考研 408 · 排序核心知识点&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;排序是 408 高频选择题 + 偶尔大题：&lt;strong&gt;背总表、会手推过程、能判断稳定性&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-zong-biao-bi-bei&quot;&gt;1. 总表（必背）&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;算法&lt;/th&gt;&lt;th&gt;类别&lt;/th&gt;&lt;th&gt;最好&lt;/th&gt;&lt;th&gt;平均&lt;/th&gt;&lt;th&gt;最坏&lt;/th&gt;&lt;th&gt;空间&lt;/th&gt;&lt;th&gt;稳定&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;直接插入&lt;/td&gt;&lt;td&gt;插入&lt;/td&gt;&lt;td&gt;O(n)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;希尔&lt;/td&gt;&lt;td&gt;插入&lt;/td&gt;&lt;td&gt;O(n^1.3)&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;冒泡&lt;/td&gt;&lt;td&gt;交换&lt;/td&gt;&lt;td&gt;O(n)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;快速排序&lt;/td&gt;&lt;td&gt;交换&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;O(n²)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;O(log n)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;简单选择&lt;/td&gt;&lt;td&gt;选择&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(n²)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;堆排序&lt;/td&gt;&lt;td&gt;选择&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(1)&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;归并排序&lt;/td&gt;&lt;td&gt;归并&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;O(n)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;基数排序&lt;/td&gt;&lt;td&gt;分配&lt;/td&gt;&lt;td&gt;O(d(n+r))&lt;/td&gt;&lt;td&gt;O(d(n+r))&lt;/td&gt;&lt;td&gt;O(d(n+r))&lt;/td&gt;&lt;td&gt;O(r)&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;记忆点&lt;/strong&gt;：稳定的只有 直接插入 / 冒泡 / 归并 / 基数；快排最坏 O(n²)；归并空间 O(n)。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-cha-ru-lei&quot;&gt;2. 插入类&lt;/h2&gt;
&lt;h3 id=&quot;zhi-jie-cha-ru&quot;&gt;直接插入&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;初始: [3] 1 4 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第1趟: [1 3] 4 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第2趟: [1 3 4] 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第3趟: [1 2 3 4]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;思想&lt;/strong&gt;：把待排元素插入已有序前缀的合适位置。&lt;/p&gt;
&lt;h3 id=&quot;xi-er-pai-xu&quot;&gt;希尔排序&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;按增量 d 分组做直接插入，增量逐步缩小到 1（最后一次就是直接插入）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;例：d=2 时分成奇偶两组分别插入排序。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-jiao-huan-lei&quot;&gt;3. 交换类&lt;/h2&gt;
&lt;h3 id=&quot;mou-pao&quot;&gt;冒泡&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第1趟: 3 1 4 2 → 1 3 2 [4]（4 冒到末尾）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第2趟: 1 3 2 → 1 2 [3] 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第3趟: 1 [2] 3 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;无交换可提前结束&lt;/strong&gt;，最好 O(n)。&lt;/p&gt;
&lt;h3 id=&quot;kuai-su-pai-xu-fen-zhi&quot;&gt;快速排序（分治）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;选基准（通常首元素）→ 一趟划分：左小右大 → 递归两侧&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;例 [4 2 5 1 3] 以 4 为基准一趟后：[1 2 3] 4 [5]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; partition&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; pivot&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span&gt; pivot&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; pivot&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; pivot&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;快排平均 O(n log n)；若每次划分极不平衡（已有序）最坏 O(n²)。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-xuan-ze-lei&quot;&gt;4. 选择类&lt;/h2&gt;
&lt;h3 id=&quot;jian-dan-xuan-ze&quot;&gt;简单选择&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;每趟选剩余最小元素与当前位置交换：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[1] 3 4 2 → 1 [2] 4 3 → 1 2 [3] 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;比较次数固定 n(n−1)/2，与初始状态无关。&lt;/p&gt;
&lt;h3 id=&quot;dui-pai-xu&quot;&gt;堆排序&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;建大根堆 → 堆顶与末尾交换 → 下沉调整&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[4 3 2 1] 交换 1： [1 3 2] 4 → 下沉 → [3 1 2] 4 → 交换 → [2 1] 3 4 → ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;大根堆：parent ≥ children；调整（sift down）O(log n)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;建堆 O(n)；排序 O(n log n)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-gui-bing-pai-xu-er-lu&quot;&gt;5. 归并排序（二路）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;分：数组二分到底；治：两两有序合并&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[4 2 5 1] → [4 2][5 1] → [2 4][1 5] → [1 2 4 5]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; merge&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 复制到临时数组，双指针比较归并&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mergeSort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;        int&lt;/span&gt;&lt;span&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;low&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        mergeSort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        mergeSort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        merge&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; low&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; mid&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; high&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;稳定、O(n log n)、空间 O(n)&lt;/strong&gt;；适合外部排序基础。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-ji-shu-pai-xu&quot;&gt;6. 基数排序&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;按&amp;quot;位&amp;quot;分配-收集：个位 → 十位 → 百位…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;例 [12, 3, 45]：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  个位收集：3(03) 12 45 → 十位收集：3 12 45&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;复杂度 O(d(n+r))，d 位数、r 基数（十进制 10）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-408-gao-pin-jie-lun&quot;&gt;7. 408 高频结论&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;考点&lt;/th&gt;&lt;th&gt;结论&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;快排最坏&lt;/td&gt;&lt;td&gt;基本有序时退化 O(n²)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;稳定性判断&lt;/td&gt;&lt;td&gt;相邻交换类（冒泡/插入）稳定；跳跃交换不稳定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;比较次数与初始无关&lt;/td&gt;&lt;td&gt;简单选择、折半插入、基数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;一趟排序后能确定位置&lt;/td&gt;&lt;td&gt;快排基准、选择类每趟定一个&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;与初始状态有关&lt;/td&gt;&lt;td&gt;插入/冒泡/快排（趟数）；选择/归并/基数无关&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;n 较小 / 基本有序&lt;/td&gt;&lt;td&gt;直接插入最佳&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-wai-bu-pai-xu-liao-jie&quot;&gt;8. 外部排序（了解）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;归并段（run）→ 败者树多路归并 → 置换选择排序生成更长段&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;总代价 ≈ 内部归并 + I/O 次数；I/O 次数 = 2×趟数×块数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;增加归并路数、减少初始段数可减少 I/O&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-li-ti-su-lan&quot;&gt;9. 例题速览&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：&lt;code&gt;[1, 3, 2, 5, 4]&lt;/code&gt; 用直接插入排序第 2 趟结果。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第1趟: [1 3] 2 5 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第2趟: [1 2 3] 5 4&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：下列哪个排序是稳定的？直接插入 / 快排 / 堆排 / 希尔。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;答案：直接插入&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-graph/&quot;&gt;图&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>考研 408 · 字符串核心知识点</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-string/"/>
        <id>https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-string/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-string/">&lt;h1 id=&quot;kao-yan-408-zi-fu-chuan-he-xin-zhi-shi-dian&quot;&gt;考研 408 · 字符串核心知识点&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;408 中字符串以 &lt;strong&gt;模式匹配（朴素 / KMP）&lt;/strong&gt; 为绝对重点，配合字符串存储与基本操作。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-zi-fu-chuan-de-cun-chu&quot;&gt;1. 字符串的存储&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;顺序存储：char s[MAXLEN]，用 &amp;#39;\0&amp;#39; 或 length 记录长度&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;堆分配：char* s，长度动态管理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;块链存储：链表每个结点存多个字符（块），省指针空间&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;408 约定&lt;/strong&gt;：字符数组下标常从 1 开始（&lt;code&gt;s[1..n]&lt;/code&gt;），便于 next 数组推导；下标 0 存长度或不用。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-po-su-mo-shi-pi-pei-bf&quot;&gt;2. 朴素模式匹配（BF）&lt;/h2&gt;
&lt;p&gt;主串 &lt;code&gt;s&lt;/code&gt;（长 n）、模式串 &lt;code&gt;p&lt;/code&gt;（长 m）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;从主串每个位置 i 起，与 p 逐位比较；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;失配则 i 回退到 i+1，j 回到 1，继续。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;时间复杂度&lt;/strong&gt;：最坏 O(n·m)；平均 O(n+m)。&lt;/p&gt;
&lt;h3 id=&quot;tu-shi&quot;&gt;图示&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;主串: a b a b c a b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;模式: a b c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第 1 趟: a b a  失配于 c vs a → 主串从第 2 位再来&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第 2 趟:   a b a&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;第 3 趟:     a b c ✓ 匹配成功，位置 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-kmp-suan-fa&quot;&gt;3. KMP 算法&lt;/h2&gt;
&lt;h3 id=&quot;he-xin-si-xiang&quot;&gt;核心思想&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;失配时主串不回溯，模式串沿 next 数组滑动&lt;/strong&gt;，把已匹配前缀的信息利用起来。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; KMP&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; char&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; char&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        else&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 匹配位置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;next-shu-zu-ding-yi-next-1-0&quot;&gt;next 数组定义（next[1] = 0）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;next[j] = 模式串 p[1..j-1] 中&amp;quot;最长相等前后缀长度 + 1&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;失配时 j = next[j] 再比。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;qiu-jie-next-di-tui&quot;&gt;求解 next（递推）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; getNext&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; char&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            j&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            k&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tu-shi-p-a-b-a-b-a-a&quot;&gt;图示（p = a b a b a a）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;j   : 1  2  3  4  5  6  7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p   : a  b  a  b  a  a  -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;next: 0  1  1  2  3  4  2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;例：j=5 时 p[1..4] = a b a b，最长相等前后缀 &amp;quot;ab&amp;quot; 长 2 ⇒ next[5] = 3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;nextval-you-hua-next&quot;&gt;nextval（优化 next）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;若 p[j] == p[next[j]]，则 nextval[j] = nextval[next[j]]，进一步跳过相同字符比较。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;时间复杂度&lt;/strong&gt;：O(n+m)；空间 O(m)。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-chang-yong-ti-xing&quot;&gt;4. 常用题型&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;题型&lt;/th&gt;&lt;th&gt;解法要点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;求 next / nextval 数组&lt;/td&gt;&lt;td&gt;手算“最长相等前后缀“&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;主串定位&lt;/td&gt;&lt;td&gt;KMP 主循环 + next&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;循环节问题&lt;/td&gt;&lt;td&gt;周期 = m − next[m]（若整除）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;字符串相等判断&lt;/td&gt;&lt;td&gt;长度 + 逐位比较&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;模式串滑动次数&lt;/td&gt;&lt;td&gt;每趟失配后 j=next[j] 计数&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-li-ti-su-lan&quot;&gt;5. 例题速览&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;例 1&lt;/strong&gt;：主串 &lt;code&gt;ababcabcacbab&lt;/code&gt;，模式 &lt;code&gt;abcac&lt;/code&gt;，求 next 数组并用 KMP 找首次匹配。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p   : a b c a c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;next: 0 1 1 1 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;比较过程：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  a b a b c a b c a c a b&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  a b c        失配(c vs a) → j = next[3] = 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    a b c a c  匹配成功，位置 6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;例 2&lt;/strong&gt;：&lt;code&gt;next[7]&lt;/code&gt; 语义 = 当第 7 位失配时，模式串从第 &lt;code&gt;next[7]&lt;/code&gt; 位继续比较。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-yi-cuo-dian&quot;&gt;6. 易错点&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;next 数组下标从 1 开始、&lt;code&gt;next[1]=0&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;前缀/后缀都是真子串（不含自身）；&lt;/li&gt;
&lt;li&gt;KMP 主串指针&lt;strong&gt;只增不减&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;朴素匹配最坏情况如 &lt;code&gt;s=aaaaab, p=aaab&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-tree/&quot;&gt;树&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>考研 408 · 树核心知识点</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-tree/"/>
        <id>https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-tree/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-tree/">&lt;h1 id=&quot;kao-yan-408-shu-he-xin-zhi-shi-dian&quot;&gt;考研 408 · 树核心知识点&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;树是 408 数据结构大题高发区：&lt;strong&gt;性质 → 遍历 → BST/AVL → 哈夫曼 → 并查集&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-er-cha-shu-ji-ben-xing-zhi&quot;&gt;1. 二叉树基本性质&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;① 第 i 层至多 2^(i−1) 个结点&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;② 深度为 k 的二叉树至多 2^k − 1 个结点&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;③ 叶子数 n₀ = 度为 2 结点数 n₂ + 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;④ 完全二叉树 n 个结点：深度 = ⌊log₂n⌋ + 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;⑤ 顺序存储（完全二叉树）：i 的左孩子 2i、右孩子 2i+1、父 ⌊i/2⌋&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;er-cha-shu-de-xing-tai-shu&quot;&gt;二叉树的形态数&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;n 个结点的不同二叉树形态数 = 卡特兰数 C(n) = C(2n,n)/(n+1)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-bian-li&quot;&gt;2. 遍历&lt;/h2&gt;
&lt;h3 id=&quot;di-gui-xu-xian-zhong-hou&quot;&gt;递归序（先/中/后）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;先序：根 → 左 → 右     DLR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;中序：左 → 根 → 右     LDR&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;后序：左 → 右 → 根     LRD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;层序：逐层从左到右&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tu-shi&quot;&gt;图示&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         / \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        2   3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       / \   \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      4   5   6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;先序: 1 2 4 5 3 6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;中序: 4 2 5 1 3 6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;后序: 4 5 2 6 3 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;层序: 1 2 3 4 5 6&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;you-bian-li-xu-lie-que-ding-er-cha-shu&quot;&gt;由遍历序列确定二叉树&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;必须知道中序 + （先序 或 后序 之一）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;先序/后序确定根，中序划分左右子树&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;层序 + 中序亦可&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;fei-di-gui-bian-li-yao-dian&quot;&gt;非递归遍历要点&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 先序非递归：栈&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;push&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;stack&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    node&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; pop&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; visit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;right&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; push&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;right&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  push&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 层序：队列&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;enqueue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;root&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;queue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;empty&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    node&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; dequeue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; visit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  enqueue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;left&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;right&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; enqueue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;right&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-xian-suo-er-cha-shu&quot;&gt;3. 线索二叉树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;利用空指针域：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ltag = 0 左孩子 / 1 前驱；rtag = 0 右孩子 / 1 后继&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;中序线索化后，可快速找某结点的&lt;strong&gt;中序前驱/后继&lt;/strong&gt;，遍历不需要栈。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-er-cha-pai-xu-shu-bst&quot;&gt;4. 二叉排序树 BST&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;左子树 &amp;lt; 根 &amp;lt; 右子树&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;操作&lt;/th&gt;&lt;th&gt;平均复杂度&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;查找 / 插入 / 删除&lt;/td&gt;&lt;td&gt;O(log n)（树高）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;最坏（退化为链）&lt;/td&gt;&lt;td&gt;O(n)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;删除三种情况：叶子直接删；单孩子提升；双孩子用&lt;strong&gt;前驱或后继&lt;/strong&gt;替换。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-ping-heng-er-cha-shu-avl&quot;&gt;5. 平衡二叉树 AVL&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;平衡因子&lt;/strong&gt; = 左子树高 − 右子树高，绝对值 ≤ 1。&lt;/p&gt;
&lt;p&gt;插入后失衡四种调整：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LL：右旋           RR：左旋&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;LR：先左旋再右旋   RL：先右旋再左旋&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;tu-shi-ll-you-xuan&quot;&gt;图示（LL 右旋）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      3                   2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     /       右旋        / \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    2       ─────▶      1   3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   /&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;最小失衡子树调整后，整棵树恢复平衡；AVL 查找/插入/删除均 O(log n)。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-hong-hei-shu-408-yao-qiu-zhang-wo-xing-zhi-yu-cha-ru-guo-cheng&quot;&gt;6. 红黑树（408 要求掌握性质与插入过程）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;① 结点非红即黑&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;② 根是黑色&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;③ 叶子（外部空结点）黑色&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;④ 红结点的两个孩子必为黑（无连续红）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;⑤ 任一结点到其所有后代叶子的路径含相同数目的黑结点（黑高相等）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;插入调整：先染红新结点，再按叔结点颜色分情况 &lt;strong&gt;变色 / 旋转&lt;/strong&gt;；根始终染黑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;红黑树高度 ≤ 2·log₂(n+1)，保证 O(log n) 平衡查找。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-ha-fu-man-shu-yu-bian-ma&quot;&gt;7. 哈夫曼树与编码&lt;/h2&gt;
&lt;h3 id=&quot;gou-zao&quot;&gt;构造&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;每次取权值最小的两棵树合并，新根权 = 两者之和，重复至一棵树。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;xing-zhi&quot;&gt;性质&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WPL = Σ(叶权 × 路径长度) 最小&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;只有度为 0 和 2 的结点：n 个叶子 ⇒ 2n−1 个结点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shi-li-quan-7-5-2-4&quot;&gt;示例（权 7 5 2 4）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;     /  \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    7   11&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       /  \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      5    6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;          / \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         2   4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;编码（左 0 右 1）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7 → 0    5 → 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2 → 110  4 → 111&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WPL = 7×1 + 5×2 + 2×3 + 4×3 = 35&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;哈夫曼编码是最优前缀编码&lt;/strong&gt;（任一编码不是另一编码的前缀）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-shu-sen-lin-er-cha-shu&quot;&gt;8. 树 / 森林 ↔ 二叉树&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;孩子兄弟表示法：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;左孩子指针 = 第一个孩子；右孩子指针 = 下一个兄弟&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;森林转二叉树：各树根依次作为右子树连接&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;树的先序 = 对应二叉树的先序；树的后序 = 对应二叉树的中序。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-bing-cha-ji&quot;&gt;9. 并查集&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; find&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    while&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; unionSet&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; ra&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; find&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; rb&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; find&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;ra&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span&gt; rb&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; parent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;ra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; rb&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可加按秩合并&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;用途：判断连通分量、Kruskal 判环、集合合并。路径压缩 + 按秩合并后近似 O(α(n))。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;10-dui&quot;&gt;10. 堆&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;大根堆：parent ≥ children；小根堆：parent ≤ children&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;存储：完全二叉树顺序存储，下标 1 开始&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;操作&lt;/th&gt;&lt;th&gt;复杂度&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;建堆&lt;/td&gt;&lt;td&gt;O(n)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;插入 / 删除堆顶&lt;/td&gt;&lt;td&gt;O(log n)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;堆排序&lt;/td&gt;&lt;td&gt;O(n log n)&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;11-chang-kao-ti-xing&quot;&gt;11. 常考题型&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;由先序+中序还原二叉树并求后序；&lt;/li&gt;
&lt;li&gt;完全二叉树结点编号与父子关系；&lt;/li&gt;
&lt;li&gt;AVL 插入旋转过程；&lt;/li&gt;
&lt;li&gt;哈夫曼树构造与 WPL、编码；&lt;/li&gt;
&lt;li&gt;树转二叉树后的遍历关系；&lt;/li&gt;
&lt;li&gt;并查集查找次数与路径压缩；&lt;/li&gt;
&lt;li&gt;判断是否为 BST / AVL / 堆。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-string/&quot;&gt;字符串&lt;/a&gt; ｜ 下一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_AlgorithmDesign/408-graph/&quot;&gt;图&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Jai 入门 · 语法详解</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_Jai/jai-syntax-intro/"/>
        <id>https://suchaharcan.github.io/01Write_blog_Jai/jai-syntax-intro/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_Jai/jai-syntax-intro/">&lt;h1 id=&quot;jai-ru-men-yu-fa-xiang-jie&quot;&gt;Jai 入门 · 语法详解&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;Jai 是 Jonathan Blow（《Braid》《The Witness》作者）设计的&lt;strong&gt;面向性能与数据导向&lt;/strong&gt;的静态强类型语言，目标之一是做“C 的现代替代品“。本文语料主要来自 GitHub 上的 JaiPrimer 与 The Way to Jai 社区教程。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-jai-de-she-ji-zhe-xue&quot;&gt;1. Jai 的设计哲学&lt;/h2&gt;
&lt;p&gt;Jai 关注三件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;写更快的代码&lt;/strong&gt;：无 GC、无异常、无类继承包袱，程序员直接控制内存与性能特征；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;减少摩擦&lt;/strong&gt;：语法一致、重构成本低、编译快速；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据导向（Data-Oriented Design）&lt;/strong&gt;：程序本质是“填充内存的数据 + 高效算法“。&lt;/li&gt;
&lt;/ol&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;与 C/C++ 对比&lt;/th&gt;&lt;th&gt;C / C++&lt;/th&gt;&lt;th&gt;Jai&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;内存管理&lt;/td&gt;&lt;td&gt;malloc/free 或 RAII&lt;/td&gt;&lt;td&gt;&lt;code&gt;new&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt;，指针所有权 &lt;code&gt;!&lt;/code&gt; 标记，无 GC&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多态&lt;/td&gt;&lt;td&gt;虚函数 / 模板&lt;/td&gt;&lt;td&gt;函数级多态 &lt;code&gt;$T&lt;/code&gt; + 编译期代码&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建&lt;/td&gt;&lt;td&gt;Make/CMake&lt;/td&gt;&lt;td&gt;构建过程由 Jai 源码本身指定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;数据组织&lt;/td&gt;&lt;td&gt;AoS 为主&lt;/td&gt;&lt;td&gt;&lt;code&gt;struct SOA&lt;/code&gt; 一键切换 SoA/AoS&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;反射&lt;/td&gt;&lt;td&gt;无原生支持&lt;/td&gt;&lt;td&gt;全类型信息运行时可查&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-cheng-xu-ru-kou-yu-ji-ben-jie-gou&quot;&gt;2. 程序入口与基本结构&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#import&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Basic&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Hello, Jai!&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;main :: ()&lt;/code&gt; 是入口过程；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;#import&lt;/code&gt; 导入标准/自定义模块；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;print&lt;/code&gt; 支持 &lt;code&gt;%&lt;/code&gt; 占位符：&lt;code&gt;print(&quot;x = %\n&quot;, x)&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-bian-liang-yu-lei-xing&quot;&gt;3. 变量与类型&lt;/h2&gt;
&lt;h3 id=&quot;sheng-ming-yu-fa-ming-zi-lei-xing-zhi&quot;&gt;声明语法：&lt;code&gt;名字 : 类型 = 值;&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;counter&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;    : &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Jon&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;average&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;lei-xing-sheng-lue-bian-yi-qi-tui-duan-ming-zi-zhi&quot;&gt;类型省略（编译器推断）：&lt;code&gt;名字 ::= 值;&lt;/code&gt;&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;counter&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; int&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Jon&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; string&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;average&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;5&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; float&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zhi-sheng-ming-bu-chu-shi-hua&quot;&gt;只声明不初始化&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;counter&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;flag&lt;/span&gt;&lt;span&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; bool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-ben-lei-xing&quot;&gt;基本类型&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bool&lt;/code&gt;、&lt;code&gt;int&lt;/code&gt;、&lt;code&gt;int8/16/32/64&lt;/code&gt;、&lt;code&gt;uint&lt;/code&gt;、&lt;code&gt;float&lt;/code&gt;、&lt;code&gt;float32/64&lt;/code&gt;、&lt;code&gt;string&lt;/code&gt;、&lt;code&gt;rawptr&lt;/code&gt; 等。整数和浮点不隐式混用，需显式转换（&lt;code&gt;cast&lt;/code&gt;）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-han-shu-guo-cheng&quot;&gt;4. 函数（过程）&lt;/h2&gt;
&lt;p&gt;语法统一：&lt;strong&gt;局部函数、匿名函数、全局函数写法完全一致&lt;/strong&gt;，这是 Jai 重构友好的核心设计。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Sum: %&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;匿名函数：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_one&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;::&lt;/code&gt; 表示“绑定一个常量名字到右侧值“；过程、结构体、枚举、常量都用它声明。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-jie-gou-ti-mei-ju-lian-he&quot;&gt;5. 结构体 / 枚举 / 联合&lt;/h2&gt;
&lt;h3 id=&quot;struct&quot;&gt;struct&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Vector3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    z&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;Vector3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;成员可以带默认值。&lt;strong&gt;没有构造函数/析构函数&lt;/strong&gt;（Jai 刻意去掉 RAII）。&lt;/p&gt;
&lt;h3 id=&quot;enum&quot;&gt;enum&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; enum&lt;/span&gt;&lt;span&gt; u16&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    RED&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GREEN&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    BLUE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 80&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ALPHA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;union&quot;&gt;union&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; union&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    i&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    f&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-shu-zu-yu-qie-pian&quot;&gt;6. 数组与切片&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;50&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 定长数组&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;b&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span&gt;..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; int;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 动态数组&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;c&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; int;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 切片（宽指针，携带长度）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;数组&lt;strong&gt;不会退化为指针&lt;/strong&gt;，自带长度信息 &lt;code&gt;count&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;print_int_array&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; int) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;count&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;0..n&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;array[%] = %&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;7-kong-zhi-liu&quot;&gt;7. 控制流&lt;/h2&gt;
&lt;h3 id=&quot;if-else&quot;&gt;if / else&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;equal&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; if&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;greater&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;less&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;if-case-dui-zhi-lie-biao-pi-pei&quot;&gt;if-case（对值列表匹配）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span&gt; x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;small&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;other&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;for&quot;&gt;for&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;0..9&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 范围&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;items&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 遍历集合&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; item&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;while&quot;&gt;while&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;while&lt;/span&gt;&lt;span&gt; count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;defer-zuo-yong-yu-tui-chu-shi-zhi-xing&quot;&gt;defer（作用域退出时执行）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    defer&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; delete&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 离开作用域时自动释放&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;8-zhi-zhen-yu-nei-cun&quot;&gt;8. 指针与内存&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; new&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 分配&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 42&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;              //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 解引用（后缀 .*）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;delete&lt;/span&gt;&lt;span&gt; p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;              //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 释放&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;结构体指针所有权：成员类型前加 &lt;code&gt;!&lt;/code&gt; 表示“该指针由本结构体拥有，删除结构体时一并删除“：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    owned_a&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; null&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;example&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; new&lt;/span&gt;&lt;span&gt; node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;example&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;owned_a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; new&lt;/span&gt;&lt;span&gt; node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;delete&lt;/span&gt;&lt;span&gt; example&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; owned_a 也会被释放&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Jai &lt;strong&gt;没有 GC 与自动内存管理&lt;/strong&gt;，但用所有权标注 + &lt;code&gt;defer&lt;/code&gt; 让手动管理可控。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;9-han-shu-ji-duo-tai-t&quot;&gt;9. 函数级多态（&lt;code&gt;$T&lt;/code&gt;）&lt;/h2&gt;
&lt;p&gt;Jai 的多态在&lt;strong&gt;函数级&lt;/strong&gt;，参数前加 &lt;code&gt;$&lt;/code&gt; 声明类型变量：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f3&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; float + float&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;i3&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;       //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; int + int&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;类型由 &lt;code&gt;$&lt;/code&gt; 标记的参数推断，并可以做类型特化（&lt;code&gt;#if&lt;/code&gt; 按类型分支）。&lt;/p&gt;
&lt;h3 id=&quot;any-lei-xing&quot;&gt;Any 类型&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;print_any&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; Any&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; Type_Info_Tag&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;FLOAT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;a is float&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;Any&lt;/code&gt; 携带类型信息，适合需要“任意类型“参数的场景。&lt;/p&gt;
&lt;h3 id=&quot;jin-jie-1-lei-xing-yue-shu-t-foo-yu-t-interface&quot;&gt;进阶 1：类型约束（&lt;code&gt;$T/Foo&lt;/code&gt; 与 &lt;code&gt;$T/interface&lt;/code&gt;）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;$T&lt;/code&gt; 不限制类型；要约束“必须拥有某组字段/成员“，用 &lt;code&gt;/&lt;/code&gt; 写法（类似 trait / interface）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Vec3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; z&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dot_product&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;interface&lt;/span&gt;&lt;span&gt; Vec3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 任何&amp;quot;拥有 x/y/z float 字段&amp;quot;的结构体都能传入，不必继承 Vec3&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;区别：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;写法&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a: $T&lt;/code&gt;&lt;/td&gt;&lt;td&gt;任意编译期已知类型&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a: Foo($T)&lt;/code&gt;&lt;/td&gt;&lt;td&gt;必须是 &lt;code&gt;Foo&lt;/code&gt; 的某种特化，内层 &lt;code&gt;$T&lt;/code&gt; 任意&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a: $T/Foo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只要结构体内 &lt;strong&gt;using 了 Foo&lt;/strong&gt; 即可（组件式组合）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;a: $T/interface Foo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;只要拥有 Foo 的全部字段即可（结构鸭子类型）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;jin-jie-2-duo-tai-jie-gou-ti-bian-yi-qi-can-shu-hua&quot;&gt;进阶 2：多态结构体（编译期参数化）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span&gt;(T:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    some_data&lt;/span&gt;&lt;span&gt; : &lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 运行时成员，随 T 变化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;f&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Foo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =&amp;gt; int&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译期参数不止类型，还可以是常量值，甚至函数：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Foo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fun: (T) -&amp;gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 编译期烘焙，不占运行时内存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    value&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 运行时数据&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;多态结构体的“模式匹配“写法——三种等价风格：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hash_Table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span&gt; (K:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; V:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; N:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    keys&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;   [&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; K;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    values&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; V;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1) 显式模式匹配&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;f1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Hash_Table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; K&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2) $T/类型 + T.K 访问参数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;f2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;/&lt;/span&gt;&lt;span&gt;Hash_Table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3) 隐式多态：直接用具体类型访问其编译期参数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;f4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; Hash_Table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; k&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;K&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; t&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;V&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;jin-jie-3-duo-tai-shu-zu-chang-du-yu-yuan-su-lei-xing-du-shi-lei-xing-de-yi-bu-fen&quot;&gt;进阶 3：多态数组（长度与元素类型都是类型的一部分）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt;$T) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%: %, %&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; type_of&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; N&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;foo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =&amp;gt; s64: 4, s64（N 本身是编译期 int）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：&lt;code&gt;[4] int&lt;/code&gt; 与 &lt;code&gt;[5] int&lt;/code&gt; 是&lt;strong&gt;不同类型&lt;/strong&gt;，不能互相赋值。&lt;/p&gt;
&lt;h3 id=&quot;jin-jie-4-you-can-shu-tui-dao-fan-hui-lei-xing-helper-jie-gou-ti-run&quot;&gt;进阶 4：由参数推导返回类型（Helper 结构体 + &lt;code&gt;#run&lt;/code&gt;）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Helper&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span&gt;(A:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; B:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Type&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span&gt; #run&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; helper&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 编译期计算返回类型&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;helper&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 这里可以做类型层面的逻辑&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;combine&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; -&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Helper&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;jin-jie-5-modify-bian-yi-qi-xiao-yan-bian-huan-duo-tai-can-shu&quot;&gt;进阶 5：&lt;code&gt;#modify&lt;/code&gt;——编译期校验/变换多态参数&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;do_something&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; Type&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; bool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    ti&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cast&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span&gt;Type_Info&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; ti&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;INTEGER&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; ti&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;ENUM&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span&gt; ti&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span&gt;POINTER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;dest&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; value&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span&gt; T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#modify&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; do_something&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;T&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; false =&amp;gt; 编译错误&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 运行时实现&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;#modify&lt;/code&gt; 在每次调用解析时执行，可检查参数类型、做约束，是 Jai 在“类型层“做特化的入口。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;10-bian-yi-qi-zhi-xing-yuan-bian-cheng-he-xin&quot;&gt;10. 编译期执行（元编程核心）&lt;/h2&gt;
&lt;h3 id=&quot;run-bian-yi-qi-yun-xing-ren-yi-dai-ma&quot;&gt;#run：编译期运行任意代码&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;generate_table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;256&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    for&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;0..255&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; pow&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 255&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt; table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;srgb_table&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt; #run&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; generate_table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 编译期生成，运行期直接查表&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;编译期函数由编译器解释执行，结果直接烘焙进二进制。&lt;/p&gt;
&lt;h3 id=&quot;if-bian-yi-qi-tiao-jian&quot;&gt;#if：编译期条件&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; OS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;windows&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Windows build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; else&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Other build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;#if&lt;/code&gt; 也可用于结构体字段与枚举值的条件定义。&lt;/p&gt;
&lt;h3 id=&quot;bake-can-shu-hong-bei&quot;&gt;#bake：参数烘焙&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_one&lt;/span&gt;&lt;span&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt; #bake&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 等价于单参数函数&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;11-shu-ju-dao-xiang-jie-gou-soa&quot;&gt;11. 数据导向结构（SOA）&lt;/h2&gt;
&lt;p&gt;普通 AoS 与 &lt;code&gt;struct SOA&lt;/code&gt; 只差一个关键字，内存布局自动切换：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Vector3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; AoS：x y z x y z ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    x&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    y&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    z&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Vector3SOA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; struct&lt;/span&gt;&lt;span&gt; SOA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; SoA：x x x y y y z z z&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;    z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; float&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对缓存友好、批量更新场景（游戏实体、粒子系统）收益明显，且业务代码无需改动。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;12-fan-she-yu-yun-xing-shi-lei-xing-xin-xi&quot;&gt;12. 反射与运行时类型信息&lt;/h2&gt;
&lt;p&gt;程序数据段保存完整类型表，可在运行时遍历：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span&gt; _type_table&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    print&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; it&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;可用于序列化、网络复制、存档、调试器等（C/C++ 需要手写或宏实现）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;13-mo-kuai-yu-xiang-mu-zu-zhi&quot;&gt;13. 模块与项目组织&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#import&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Basic&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#load&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;part2.jai&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 追加编译另一个源文件&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;大型项目常用 &lt;code&gt;main.jai&lt;/code&gt; 作为结构总览：&lt;code&gt;#import&lt;/code&gt; 模块、&lt;code&gt;#load&lt;/code&gt; 分片源文件，再定义 &lt;code&gt;main()&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;14-xue-xi-lu-jing-jian-yi&quot;&gt;14. 学习路径建议&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;语法骨架&lt;/strong&gt;：变量 → 过程 → 结构体 → 控制流；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;内存&lt;/strong&gt;：指针、&lt;code&gt;new/delete&lt;/code&gt;、所有权 &lt;code&gt;!&lt;/code&gt;、&lt;code&gt;defer&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;元编程&lt;/strong&gt;：&lt;code&gt;#run&lt;/code&gt;、&lt;code&gt;#if&lt;/code&gt;、&lt;code&gt;$T&lt;/code&gt; 多态、&lt;code&gt;#bake&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据导向&lt;/strong&gt;：&lt;code&gt;struct SOA&lt;/code&gt;、数组/切片、缓存局部性；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实战&lt;/strong&gt;：参考 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/Ivo-Balbaert/The_Way_to_Jai&quot;&gt;The Way to Jai&lt;/a&gt; 与 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/BSVino/JaiPrimer&quot;&gt;JaiPrimer&lt;/a&gt; 的示例项目。&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;注意：Jai 仍处于开发期，语法细节随编译器迭代可能变化，以官方最新文档为准。&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>23 种设计模式 · C++ 版优缺点与应用场景</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_PaperReading/design-patterns-23-cxx/"/>
        <id>https://suchaharcan.github.io/01Write_blog_PaperReading/design-patterns-23-cxx/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_PaperReading/design-patterns-23-cxx/">&lt;h1 id=&quot;23-chong-she-ji-mo-shi-c-ban-you-que-dian-yu-ying-yong-chang-jing&quot;&gt;23 种设计模式 · C++ 版优缺点与应用场景&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;GoF《设计模式》23 种，按目的分三类：&lt;strong&gt;创建型（5）· 结构型（7）· 行为型（11）&lt;/strong&gt;。本文给出每种模式的意图、C++ 关键代码、优缺点与典型应用场景。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;zong-lan&quot;&gt;总览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类别&lt;/th&gt;&lt;th&gt;模式&lt;/th&gt;&lt;th&gt;一句话&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;创建型&lt;/td&gt;&lt;td&gt;单例 Singleton&lt;/td&gt;&lt;td&gt;全局唯一实例&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;创建型&lt;/td&gt;&lt;td&gt;工厂方法 Factory Method&lt;/td&gt;&lt;td&gt;子类决定创建哪个类&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;创建型&lt;/td&gt;&lt;td&gt;抽象工厂 Abstract Factory&lt;/td&gt;&lt;td&gt;创建一族相关对象&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;创建型&lt;/td&gt;&lt;td&gt;建造者 Builder&lt;/td&gt;&lt;td&gt;分步构建复杂对象&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;创建型&lt;/td&gt;&lt;td&gt;原型 Prototype&lt;/td&gt;&lt;td&gt;复制已有对象&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;适配器 Adapter&lt;/td&gt;&lt;td&gt;接口转换&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;桥接 Bridge&lt;/td&gt;&lt;td&gt;抽象与实现分离&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;组合 Composite&lt;/td&gt;&lt;td&gt;树形整体-部分&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;装饰 Decorator&lt;/td&gt;&lt;td&gt;动态附加职责&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;外观 Facade&lt;/td&gt;&lt;td&gt;统一门面接口&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;享元 Flyweight&lt;/td&gt;&lt;td&gt;共享细粒度对象&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;结构型&lt;/td&gt;&lt;td&gt;代理 Proxy&lt;/td&gt;&lt;td&gt;替身控制访问&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;责任链 Chain of Responsibility&lt;/td&gt;&lt;td&gt;请求沿链传递&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;命令 Command&lt;/td&gt;&lt;td&gt;请求封装为对象&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;解释器 Interpreter&lt;/td&gt;&lt;td&gt;文法解释&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;迭代器 Iterator&lt;/td&gt;&lt;td&gt;顺序访问集合&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;中介者 Mediator&lt;/td&gt;&lt;td&gt;对象间解耦通信&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;备忘录 Memento&lt;/td&gt;&lt;td&gt;保存/恢复状态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;观察者 Observer&lt;/td&gt;&lt;td&gt;一对多通知&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;状态 State&lt;/td&gt;&lt;td&gt;状态行为切换&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;策略 Strategy&lt;/td&gt;&lt;td&gt;算法族可替换&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;模板方法 Template Method&lt;/td&gt;&lt;td&gt;骨架固定、步骤可变&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;行为型&lt;/td&gt;&lt;td&gt;访问者 Visitor&lt;/td&gt;&lt;td&gt;数据结构与操作分离&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;yi-chuang-jian-xing-mo-shi&quot;&gt;一、创建型模式&lt;/h1&gt;
&lt;h2 id=&quot;1-dan-li-singleton&quot;&gt;1. 单例 Singleton&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：确保一个类只有一个实例，并提供全局访问点。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Logger&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    static&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Logger&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; instance&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        static&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Logger&lt;/span&gt;&lt;span&gt; inst&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; C++11 线程安全&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; inst&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    Logger&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;全局唯一、省资源&lt;/td&gt;&lt;td&gt;隐藏依赖，难测试&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;延迟初始化&lt;/td&gt;&lt;td&gt;多线程初始化需注意&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：日志系统、配置中心、线程池、连接池。&lt;/p&gt;
&lt;h2 id=&quot;2-gong-han-fang-fa-factory-method&quot;&gt;2. 工厂方法 Factory Method&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：定义一个创建对象的接口，让子类决定实例化哪个类。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Product&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; ConcreteA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Product &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Factory&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; FactoryA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Factory&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Product&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; create&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;make_unique&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;ConcreteA&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;解耦创建与使用&lt;/td&gt;&lt;td&gt;每加一个产品需加子类&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;开闭原则友好&lt;/td&gt;&lt;td&gt;类数量膨胀&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：框架中由子类决定对象类型（如游戏单位工厂）。&lt;/p&gt;
&lt;h2 id=&quot;3-chou-xiang-gong-han-abstract-factory&quot;&gt;3. 抽象工厂 Abstract Factory&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：提供创建&lt;strong&gt;一族&lt;/strong&gt;相关对象的接口。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; WinButton&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Button &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; UIFactory&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; makeButton&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; WinFactory&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; UIFactory&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; makeButton&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;make_unique&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;WinButton&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;保证产品族一致&lt;/td&gt;&lt;td&gt;新增产品族类型困难&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;隔离具体类&lt;/td&gt;&lt;td&gt;新增产品（方法）违反开闭&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：跨平台 UI 组件、数据库访问层（不同方言）。&lt;/p&gt;
&lt;h2 id=&quot;4-jian-zao-zhe-builder&quot;&gt;4. 建造者 Builder&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：分步骤构建复杂对象，步骤可复用于不同表示。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; PizzaBuilder&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    PizzaBuilder&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; size&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; size_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Pizza&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Pizza&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;size_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; size_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 使用：PizzaBuilder{}.size(12).build();&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;构造参数可读、不可变&lt;/td&gt;&lt;td&gt;需要额外类&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;复用构建流程&lt;/td&gt;&lt;td&gt;简单对象反而过度设计&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：复杂配置对象、文档/查询构建器。&lt;/p&gt;
&lt;h2 id=&quot;5-yuan-xing-prototype&quot;&gt;5. 原型 Prototype&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：通过克隆已有对象创建新对象。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; ~Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; default&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; clone&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Circle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Shape &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; clone&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;make_unique&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Circle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;避免重复构造开销&lt;/td&gt;&lt;td&gt;深拷贝语义易出错&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;动态类型克隆&lt;/td&gt;&lt;td&gt;含资源成员需自定义拷贝&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：编辑器复制图形、游戏单位克隆、配置模板。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;er-jie-gou-xing-mo-shi&quot;&gt;二、结构型模式&lt;/h1&gt;
&lt;h2 id=&quot;6-gua-pei-qi-adapter&quot;&gt;6. 适配器 Adapter&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：将不兼容接口转换为客户端期望的接口。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Target&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Adaptee&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; specific&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Adapter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Target&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; request&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; adaptee_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;specific&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Adaptee&lt;/span&gt;&lt;span&gt; adaptee_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;复用已有类，不改源码&lt;/td&gt;&lt;td&gt;过度使用使架构混乱&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;符合开闭原则&lt;/td&gt;&lt;td&gt;有性能微开销&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：接入第三方库、新旧接口桥接。&lt;/p&gt;
&lt;h2 id=&quot;7-qiao-jie-bridge&quot;&gt;7. 桥接 Bridge&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：将抽象部分与实现部分分离，各自独立变化。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Renderer&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; draw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    explicit&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Renderer&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; r_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Renderer&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; r_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Circle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    using&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;Shape&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; draw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; r_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;draw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;抽象与实现可独立扩展&lt;/td&gt;&lt;td&gt;增加系统复杂度&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;符合开闭原则&lt;/td&gt;&lt;td&gt;需提前识别维度&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：图形渲染后端（OpenGL/Vulkan）、跨平台设备驱动。&lt;/p&gt;
&lt;h2 id=&quot;8-zu-he-composite&quot;&gt;8. 组合 Composite&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：将对象组织成树形结构，一致对待叶子与容器。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Component&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; render&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Leaf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Component&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; render&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Composite&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Component&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; children_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; render&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; children_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;render&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Component&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; children_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;树形结构统一操作&lt;/td&gt;&lt;td&gt;叶子与容器接口耦合&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;易扩展新节点&lt;/td&gt;&lt;td&gt;违反接口隔离&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：文件系统、UI 控件树、组织架构。&lt;/p&gt;
&lt;h2 id=&quot;9-zhuang-shi-decorator&quot;&gt;9. 装饰 Decorator&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：动态给对象添加职责，替代继承。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Stream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; write&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; FileStream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Stream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; write&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; EncryptedStream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Stream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    explicit&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; EncryptedStream&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Stream&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; write&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;write&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;encrypt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Stream&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;组合优于继承，灵活&lt;/td&gt;&lt;td&gt;层数多时难调试&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;运行时叠加能力&lt;/td&gt;&lt;td&gt;小对象过多&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：IO 流加缓冲/加密/压缩、中间件管道。&lt;/p&gt;
&lt;h2 id=&quot;10-wai-guan-facade&quot;&gt;10. 外观 Facade&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：为复杂子系统提供统一简化的入口。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; VideoConverter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; convert&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        codec_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;load&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        filter_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;apply&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        mux_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;save&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Codec&lt;/span&gt;&lt;span&gt; codec_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; Filter&lt;/span&gt;&lt;span&gt; filter_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; Muxer&lt;/span&gt;&lt;span&gt; mux_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;客户端使用简单&lt;/td&gt;&lt;td&gt;可能变成“上帝对象“&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;隔离子系统变化&lt;/td&gt;&lt;td&gt;隐藏了灵活性&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：编译模块入口、播放器/转换器统一 API。&lt;/p&gt;
&lt;h2 id=&quot;11-xiang-yuan-flyweight&quot;&gt;11. 享元 Flyweight&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：共享细粒度对象，减少内存占用。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; CharStyle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; font&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; StyleCache&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; CharStyle&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; get&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; font&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; size&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;        auto&lt;/span&gt;&lt;span&gt; key&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; font&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;to_string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;size&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;        auto&lt;/span&gt;&lt;span&gt; it&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; cache_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;it&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span&gt; cache_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;end&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            it&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; cache_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;emplace&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; CharStyle&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;font&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; size&lt;/span&gt;&lt;span&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;first&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span&gt; it&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span&gt;second&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unordered_map&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; CharStyle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; cache_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;大幅减少内存&lt;/td&gt;&lt;td&gt;外部状态管理复杂&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;提高缓存命中&lt;/td&gt;&lt;td&gt;引入共享对象并发问题&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：文本编辑器字符样式、游戏贴图/粒子模板、连接池。&lt;/p&gt;
&lt;h2 id=&quot;12-dai-li-proxy&quot;&gt;12. 代理 Proxy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：提供替身控制对真实对象的访问（延迟/权限/缓存）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Image&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; show&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; RealImage&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Image&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; show&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; ImageProxy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Image&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; show&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;real_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; real_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;make_unique&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;RealImage&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        real_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;show&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 延迟加载&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;unique_ptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;RealImage&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; real_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;延迟加载、访问控制、日志&lt;/td&gt;&lt;td&gt;增加间接层&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;透明代理&lt;/td&gt;&lt;td&gt;过度代理增加延迟&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：懒加载图片、智能指针、远程调用（RPC stub）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h1 id=&quot;san-xing-wei-xing-mo-shi&quot;&gt;三、行为型模式&lt;/h1&gt;
&lt;h2 id=&quot;13-ze-ren-lian-chain-of-responsibility&quot;&gt;13. 责任链 Chain of Responsibility&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：多个处理者串成链，请求沿链传递直到被处理。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Handler&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Handler&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Handler&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; next_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; this&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; handle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; level&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;canHandle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;level&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        else&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;next_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; next_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;handle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;level&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; bool&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; canHandle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Handler&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; next_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; nullptr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;发送者与处理者解耦&lt;/td&gt;&lt;td&gt;请求可能无人处理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;灵活增删处理者&lt;/td&gt;&lt;td&gt;调试链长时困难&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：日志级别过滤、事件冒泡、中间件管道。&lt;/p&gt;
&lt;h2 id=&quot;14-ming-ling-command&quot;&gt;14. 命令 Command&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：把请求封装成对象，支持参数化、队列、撤销。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Command&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; execute&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; undo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; CopyCommand&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Command&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; execute&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; undo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;支持撤销/重做、任务队列&lt;/td&gt;&lt;td&gt;每个操作一个类&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;请求可参数化延迟执行&lt;/td&gt;&lt;td&gt;类数量增加&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：编辑器撤销栈、事务、宏录制、线程任务。&lt;/p&gt;
&lt;h2 id=&quot;15-jie-shi-qi-interpreter&quot;&gt;15. 解释器 Interpreter&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：为文法定义解释器，求值表达式。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Expr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; eval&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Num&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Expr &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; eval&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; Expr &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Expr&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; eval&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; l&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; +&lt;/span&gt;&lt;span&gt; r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;eval&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;文法易扩展&lt;/td&gt;&lt;td&gt;复杂文法维护困难&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;领域语言表达力强&lt;/td&gt;&lt;td&gt;性能较低&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：SQL/正则/数学表达式引擎、脚本解析。&lt;/p&gt;
&lt;h2 id=&quot;16-die-dai-qi-iterator&quot;&gt;16. 迭代器 Iterator&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：不暴露内部结构，顺序访问集合元素。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Iter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; bool&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; hasNext&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; RangeIter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Iter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; cur_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; end_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    RangeIter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cur_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; end_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    bool&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; hasNext&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; cur_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;=&lt;/span&gt;&lt;span&gt; end_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; next&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span&gt; cur_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;集合遍历与结构解耦&lt;/td&gt;&lt;td&gt;简单集合反而多余&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;支持多种遍历策略&lt;/td&gt;&lt;td&gt;遍历中修改集合需约定&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：STL 迭代器、分页遍历、树遍历。&lt;/p&gt;
&lt;h2 id=&quot;17-zhong-jie-zhe-mediator&quot;&gt;17. 中介者 Mediator&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：用一个中介对象协调多个对象的交互。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Mediator&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; notify&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;string&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; msg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; colleagues_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;receive&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;msg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Colleague&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; colleagues_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Colleague&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; colleagues_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;减少对象间网状依赖&lt;/td&gt;&lt;td&gt;中介者可能过于庞大&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;交互集中管理&lt;/td&gt;&lt;td&gt;单点故障&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：聊天室、UI 控件协调、航班调度。&lt;/p&gt;
&lt;h2 id=&quot;18-bei-wang-lu-memento&quot;&gt;18. 备忘录 Memento&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：在不破坏封装的前提下保存并恢复对象状态。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;struct&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Memento&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; int&lt;/span&gt;&lt;span&gt; state&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Originator&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    Memento&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; save&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; const&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt;state_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; restore&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Memento&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; state_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;state&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    int&lt;/span&gt;&lt;span&gt; state_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;状态快照与恢复简单&lt;/td&gt;&lt;td&gt;大对象快照开销高&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;不破坏封装&lt;/td&gt;&lt;td&gt;历史过多占内存&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：编辑器撤销、游戏存档、事务回滚。&lt;/p&gt;
&lt;h2 id=&quot;19-guan-cha-zhe-observer&quot;&gt;19. 观察者 Observer&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：定义一对多依赖，状态变化自动通知。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Observer&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; update&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Subject&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; attach&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Observer&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; obs_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;push_back&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; notify&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;auto&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span&gt; obs_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt; o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;update&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Observer&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; obs_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;主题与观察者解耦&lt;/td&gt;&lt;td&gt;通知顺序不确定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;广播机制天然&lt;/td&gt;&lt;td&gt;级联更新难排查&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：事件总线、MVC 视图刷新、发布订阅。&lt;/p&gt;
&lt;h2 id=&quot;20-zhuang-tai-state&quot;&gt;20. 状态 State&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：对象状态改变时行为随之改变，替代大量 if-else。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; handle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; IdleState&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; handle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; RunningState&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; State&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; handle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;状态行为内聚、可扩展&lt;/td&gt;&lt;td&gt;状态类数量多&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;消除巨型条件分支&lt;/td&gt;&lt;td&gt;状态转换逻辑分散&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：播放器状态、订单状态机、网络连接状态。&lt;/p&gt;
&lt;h2 id=&quot;21-ce-lue-strategy&quot;&gt;21. 策略 Strategy&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：定义算法族并封装，运行时切换。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; SortStrategy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; QuickSort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; SortStrategy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; MergeSort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; SortStrategy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Sorter&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; setStrategy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;SortStrategy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; run&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;std&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;::&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;vector&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;int&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sort&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;    SortStrategy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt; s_&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;算法可替换、开闭原则&lt;/td&gt;&lt;td&gt;客户端需了解策略差异&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;消除条件分支&lt;/td&gt;&lt;td&gt;策略对象数量增加&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：排序算法选择、压缩/加密算法、价格计算。&lt;/p&gt;
&lt;h2 id=&quot;22-mo-ban-fang-fa-template-method&quot;&gt;22. 模板方法 Template Method&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：定义算法骨架，子类实现可变步骤。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; DataParser&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; parse&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                 //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 骨架固定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        open&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; close&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;protected&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; process&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可变步骤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;private&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; open&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; close&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;复用公共流程&lt;/td&gt;&lt;td&gt;骨架修改影响全部子类&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;约束子类实现范围&lt;/td&gt;&lt;td&gt;违反 LSP 风险（子类改变骨架）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：框架生命周期（初始化-运行-清理）、解析器流程。&lt;/p&gt;
&lt;h2 id=&quot;23-fang-wen-zhe-visitor&quot;&gt;23. 访问者 Visitor&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;意图&lt;/strong&gt;：在不修改类的前提下，为对象结构增加新操作。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Visitor&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; accept&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; TextNode&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; public&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;    void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; accept&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt; v&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt; override&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; Visitor&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;public&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    virtual&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; void&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; visit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt;TextNode&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;优点&lt;/th&gt;&lt;th&gt;缺点&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;数据结构与操作分离，易加操作&lt;/td&gt;&lt;td&gt;新增节点类型需改所有访问者&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;操作内聚&lt;/td&gt;&lt;td&gt;破坏封装（需暴露内部）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;场景&lt;/strong&gt;：AST 编译/解释、对象结构统计与序列化。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;xuan-xing-su-cha&quot;&gt;选型速查&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;推荐模式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;全局唯一&lt;/td&gt;&lt;td&gt;单例&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;创建复杂对象&lt;/td&gt;&lt;td&gt;建造者 / 工厂 / 抽象工厂&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;接口不兼容&lt;/td&gt;&lt;td&gt;适配器&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;动态加职责&lt;/td&gt;&lt;td&gt;装饰&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;树形结构&lt;/td&gt;&lt;td&gt;组合&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;延迟/控制访问&lt;/td&gt;&lt;td&gt;代理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;一对多通知&lt;/td&gt;&lt;td&gt;观察者&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;运行时换算法&lt;/td&gt;&lt;td&gt;策略&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;状态行为切换&lt;/td&gt;&lt;td&gt;状态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;撤销重做&lt;/td&gt;&lt;td&gt;命令 + 备忘录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;为结构加新操作&lt;/td&gt;&lt;td&gt;访问者&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;原则提醒：&lt;strong&gt;优先组合而非继承、面向接口而非实现、对扩展开放对修改关闭&lt;/strong&gt;。模式是工具，不要为模式而模式。&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>《纯粹理性批判》读后感</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-kant-critique/"/>
        <id>https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-kant-critique/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-kant-critique/">&lt;h1 id=&quot;chun-cui-li-xing-pi-pan-du-hou-gan&quot;&gt;《纯粹理性批判》读后感&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;康德（Immanuel Kant）1781 年初版《纯粹理性批判》。本次精读&lt;strong&gt;先验感性论&lt;/strong&gt;与&lt;strong&gt;先验分析论&lt;/strong&gt;，兼及辩证论的开头部分。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-wen-ti-yi-shi-xian-tian-zong-he-pan-duan-ru-he-ke-neng&quot;&gt;一、问题意识：先天综合判断如何可能&lt;/h2&gt;
&lt;p&gt;康德面对两派：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;学派&lt;/th&gt;&lt;th&gt;立场&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;唯理论（莱布尼茨）&lt;/td&gt;&lt;td&gt;理性演绎一切&lt;/td&gt;&lt;td&gt;脱离经验，独断&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;经验论（休谟）&lt;/td&gt;&lt;td&gt;一切知识来自经验&lt;/td&gt;&lt;td&gt;因果等必然性无法保证&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;康德的问题是：&lt;strong&gt;存在既先于经验（先天）、又扩展知识（综合）的判断吗？&lt;/strong&gt; 数学与自然科学就是例子：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;7 + 5 = 12        先天综合（不靠经验，却扩展了知识）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;一切事件都有原因  先天综合（因果性不能从经验归纳出来）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;回答这个问题，需要&lt;strong&gt;批判理性自身的能力与边界&lt;/strong&gt;——这就是“纯粹理性批判“。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;er-ge-bai-ni-shi-ge-ming&quot;&gt;二、哥白尼式革命&lt;/h2&gt;
&lt;p&gt;传统认为认识必须符合对象；康德反转为：&lt;strong&gt;对象必须符合我们的认识形式&lt;/strong&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;不是知识围绕对象转，而是对象围绕我们的认知结构转&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;我们只能认识“对我们显现的现象“，而不能认识独立于我们的“物自体（Ding an sich）“。物自体不可知，但它的存在被设定为现象的根据。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;san-xian-yan-gan-xing-lun-shi-kong&quot;&gt;三、先验感性论：时空&lt;/h2&gt;
&lt;h3 id=&quot;1-shi-jian-yu-kong-jian-shi-zhi-guan-xing-shi&quot;&gt;1. 时间与空间是直观形式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;空间：外感官的形式——外部事物必须在空间中呈现&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;时间：内感官的形式——一切表象（含思维）都在时间中&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;时空不是经验中抽象出来的概念，而是&lt;strong&gt;感性的先天形式&lt;/strong&gt;：它们使经验成为可能，也因此只适用于现象。&lt;/p&gt;
&lt;h3 id=&quot;2-shu-xue-wei-shen-me-ke-neng&quot;&gt;2. 数学为什么可能&lt;/h3&gt;
&lt;p&gt;几何基于空间的先天直观，算术基于时间的先天直观——这解释了数学的“普遍必然性“。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;si-xian-yan-fen-xi-lun-fan-chou-yu-zhi-xing&quot;&gt;四、先验分析论：范畴与知性&lt;/h2&gt;
&lt;h3 id=&quot;1-zhi-guan-wu-gai-nian-ze-mang-gai-nian-wu-zhi-guan-ze-kong&quot;&gt;1. 直观无概念则盲，概念无直观则空&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;思维无内容则空，直观无概念则盲&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;感性提供材料，知性用&lt;strong&gt;范畴&lt;/strong&gt;整理材料，两者结合才产生知识。&lt;/p&gt;
&lt;h3 id=&quot;2-shi-er-fan-chou-zhi-xing-de-xian-tian-gai-nian&quot;&gt;2. 十二范畴（知性的先天概念）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;量&lt;/th&gt;&lt;th&gt;质&lt;/th&gt;&lt;th&gt;关系&lt;/th&gt;&lt;th&gt;样式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;单一性&lt;/td&gt;&lt;td&gt;实在性&lt;/td&gt;&lt;td&gt;依存性与实体&lt;/td&gt;&lt;td&gt;可能性&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多数性&lt;/td&gt;&lt;td&gt;否定性&lt;/td&gt;&lt;td&gt;因果性与依存&lt;/td&gt;&lt;td&gt;现实性&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;全体性&lt;/td&gt;&lt;td&gt;限制性&lt;/td&gt;&lt;td&gt;协同性（共联）&lt;/td&gt;&lt;td&gt;必然性&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-tong-jue-de-xian-yan-tong-yi&quot;&gt;3. 统觉的先验统一&lt;/h3&gt;
&lt;p&gt;“我思“必须能够伴随我的一切表象——这是知识统一的最高原理。范畴通过&lt;strong&gt;先验统觉&lt;/strong&gt;把杂多表象综合为对象。&lt;/p&gt;
&lt;h3 id=&quot;4-ren-wei-zi-ran-li-fa&quot;&gt;4. 人为自然立法&lt;/h3&gt;
&lt;p&gt;因果性、实体性等范畴是&lt;strong&gt;知性加到现象上&lt;/strong&gt;的，而不是从自然里“读出来“的。因此：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;自然界的普遍规律，是知性先天地规定的——“人为自然立法”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;wu-xian-yan-bian-zheng-lun-yin-zi-li-xing-de-yue-jie&quot;&gt;五、先验辩证论（引子）：理性的越界&lt;/h2&gt;
&lt;p&gt;理性不满足于现象，总想把握“无条件者“，于是产生三类理念：&lt;strong&gt;灵魂、世界、上帝&lt;/strong&gt;。理性把它们当作对象去认识，就会陷入幻相（如二律背反：世界有无开端、自由与必然等矛盾）。康德的任务不是消灭理性，而是&lt;strong&gt;为理性划界&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;现象界：可认识（知性 + 感性）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;本体界（物自体）：不可认识，只能思维（实践理性另论）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;liu-yue-du-ti-hui&quot;&gt;六、阅读体会&lt;/h2&gt;
&lt;h3 id=&quot;1-hua-jie-bi-hui-da-geng-shen-ke&quot;&gt;1. “划界“比“回答“更深刻&lt;/h3&gt;
&lt;p&gt;康德最打动我的不是某个结论，而是&lt;strong&gt;问题的提法&lt;/strong&gt;：与其争论上帝存在与否，不如先问“我们能认识什么“。这种“先问能力边界“的姿态，和工程中的“先定义问题域“非常接近——很多争论之所以无解，是因为双方在错误的层面争论。&lt;/p&gt;
&lt;h3 id=&quot;2-shi-kong-yu-jie-kou&quot;&gt;2. 时空与“接口“&lt;/h3&gt;
&lt;p&gt;把时空理解为“认知的接口“，是一个现代比喻：我们永远只能通过这个接口读取“外部系统“的数据，接口之外（物自体）只能假设其存在。这与软件中“接口隔离““内部实现不可见“的思想惊人地同构。&lt;/p&gt;
&lt;h3 id=&quot;3-fan-chou-ren-zhi-de-nei-zhi-dsl&quot;&gt;3. 范畴 = 认知的“内置 DSL“&lt;/h3&gt;
&lt;p&gt;因果、实体、必然等范畴，像是人类认知系统内置的“领域语言“：没有它们，经验只是杂乱的数据流。这也提醒我：&lt;strong&gt;工具（语言、框架）不仅描述世界，也在塑造我们能“看见“什么&lt;/strong&gt;——正如范畴塑造经验。&lt;/p&gt;
&lt;h3 id=&quot;4-dui-ke-xue-bian-jie-de-qing-xing&quot;&gt;4. 对科学边界的清醒&lt;/h3&gt;
&lt;p&gt;康德既为科学辩护（先天综合判断使牛顿力学成为可能），又为科学划界（物自体不可知）。这种“既肯定又限制“的平衡，在今天（AI 与科学的边界、数学公理系统的哥德尔界限）依然有回响。&lt;/p&gt;
&lt;h3 id=&quot;5-yue-du-nan-du-yu-ce-lue&quot;&gt;5. 阅读难度与策略&lt;/h3&gt;
&lt;p&gt;《纯粹理性批判》公认难读：术语密集、论证层层嵌套。我的策略是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先读导论与感性论（约前 80 页）建立框架；&lt;/li&gt;
&lt;li&gt;用“表格化“整理十二范畴与判断表；&lt;/li&gt;
&lt;li&gt;配合二手导读（如邓晓芒《康德&amp;lt;纯粹理性批判&amp;gt;句读》）逐段对照；&lt;/li&gt;
&lt;li&gt;不求一次读通，先抓住“先天综合判断、现象/物自体、范畴、统觉“四个锚点。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;qi-zhi-de-hui-wei-de-ju-zi&quot;&gt;七、值得回味的句子&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;哥白尼式的革命：不是知识依照对象，而是对象依照知识。&lt;/p&gt;
&lt;p&gt;思维无内容则空，直观无概念则盲。&lt;/p&gt;
&lt;p&gt;我不得不限制知识，以便为信仰留出地盘。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ba-yan-shen-yue-du&quot;&gt;八、延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;邓晓芒《康德哲学讲演录》；&lt;/li&gt;
&lt;li&gt;韩水法译《实践理性批判》；&lt;/li&gt;
&lt;li&gt;叔本华《作为意志和表象的世界》（康德批判哲学的继承与反叛）；&lt;/li&gt;
&lt;li&gt;波普尔《客观知识》（康德的“人为自然立法“在科学哲学中的回声）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;上一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-schopenhauer-world/&quot;&gt;《作为意志和表象的世界》读后感&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>《作为意志和表象的世界》读后感</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-schopenhauer-world/"/>
        <id>https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-schopenhauer-world/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-schopenhauer-world/">&lt;h1 id=&quot;zuo-wei-yi-zhi-he-biao-xiang-de-shi-jie-du-hou-gan&quot;&gt;《作为意志和表象的世界》读后感&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;叔本华（Arthur Schopenhauer）1818 年出版《作为意志和表象的世界》。本次精读第一、二篇（世界作为表象 / 世界作为意志），兼及第三篇的审美思想。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-zuo-zhe-yu-xie-zuo-bei-jing&quot;&gt;一、作者与写作背景&lt;/h2&gt;
&lt;p&gt;叔本华在 30 岁前完成此书，自视极高，却长期无人问津；直到晚年（《附录与补遗》）才获得声誉。他承康德之余绪，却把康德“物自体“推演为&lt;strong&gt;意志&lt;/strong&gt;，由此建立了一套以“痛苦与解脱“为核心的哲学。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;er-di-yi-pian-shi-jie-zuo-wei-biao-xiang&quot;&gt;二、第一篇：世界作为表象&lt;/h2&gt;
&lt;h3 id=&quot;1-biao-xiang-de-shi-jie&quot;&gt;1. 表象的世界&lt;/h3&gt;
&lt;p&gt;叔本华开篇即断言：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“世界是我的表象。”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;我所能经验到的一切，都是&lt;strong&gt;我的表象&lt;/strong&gt;——颜色、声音、时间、空间，都离不开认识主体而独立存在。这继承了康德的“现象/物自体“之分：我们能认识的只是显现给我们的现象。&lt;/p&gt;
&lt;h3 id=&quot;2-chong-zu-li-you-lu&quot;&gt;2. 充足理由律&lt;/h3&gt;
&lt;p&gt;表象世界受&lt;strong&gt;充足理由律&lt;/strong&gt;支配：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;生成的理由（因果律）：万物皆有其因&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;认识的理由：判断须有依据&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;存在的理由：时间与空间中的位置关系&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;行为的理由（动机律）：人的行动有其动机&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;充足理由律是现象世界的“形式骨架“，但它只在表象领域有效。&lt;/p&gt;
&lt;h3 id=&quot;3-zhi-guan-xian-yu-gai-nian&quot;&gt;3. 直观先于概念&lt;/h3&gt;
&lt;p&gt;叔本华特别强调**直观（Anschauung）**先于概念：概念是直观的抽象，是“表象的表象“。真正的认识从直观开始，科学是对直观关系的整理。这一立场使他与黑格尔式的抽象思辨划清界限，也预示了后来的现象学思路。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;san-di-er-pian-shi-jie-zuo-wei-yi-zhi&quot;&gt;三、第二篇：世界作为意志&lt;/h2&gt;
&lt;h3 id=&quot;1-cong-biao-xiang-shen-ru-dao-yi-zhi&quot;&gt;1. 从表象深入到意志&lt;/h3&gt;
&lt;p&gt;表象背后是什么？叔本华认为：&lt;strong&gt;世界的内核是意志（Wille）&lt;/strong&gt;——一种无意识、无目的的欲求与冲动。现象世界的“物自体“就是意志。&lt;/p&gt;
&lt;h3 id=&quot;2-shen-ti-shi-yi-zhi-de-ke-jian-xing&quot;&gt;2. 身体是意志的可见性&lt;/h3&gt;
&lt;p&gt;身体是理解意志的钥匙：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;我的身体同时是&lt;strong&gt;表象&lt;/strong&gt;（对象）与&lt;strong&gt;意志&lt;/strong&gt;（内在体验）；&lt;/li&gt;
&lt;li&gt;牙齿的“咬合欲“、胃的“消化欲“、性欲——器官本身就是客体化的意志；&lt;/li&gt;
&lt;li&gt;饥饿、疼痛、欲望，都是意志的直接显现。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;由此，&lt;strong&gt;一切现象都是意志的客体化&lt;/strong&gt;：从低级无机物到高级动物，层层上升，直到人。&lt;/p&gt;
&lt;h3 id=&quot;3-yi-zhi-de-te-zheng&quot;&gt;3. 意志的特征&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;特征&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;无目的&lt;/td&gt;&lt;td&gt;意志没有终极目标，欲求永不停息&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;盲目&lt;/td&gt;&lt;td&gt;不服从理性，理性只是它的工具&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;不可满足&lt;/td&gt;&lt;td&gt;满足一个欲望，立刻生出新的欲望&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;4-tong-ku-yu-wu-liao&quot;&gt;4. 痛苦与无聊&lt;/h3&gt;
&lt;p&gt;由此推出叔本华著名的&lt;strong&gt;钟摆论&lt;/strong&gt;：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;人生就是欲望与满足之间的钟摆：欲望不得满足则痛苦，得到满足则无聊。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;si-di-san-pian-yan-shen-shen-mei-zuo-wei-jie-tuo&quot;&gt;四、第三篇（延伸）：审美作为解脱&lt;/h2&gt;
&lt;p&gt;审美是暂时的解脱：当主体沉浸于直观，忘记欲望，对象脱离功利关系时，主体与客体都“上升“为纯粹的理念。音乐尤其如此——它不是表象的摹本，而是意志本身的直接写照。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;wu-yue-du-ti-hui&quot;&gt;五、阅读体会&lt;/h2&gt;
&lt;h3 id=&quot;1-yu-kang-de-de-guan-xi&quot;&gt;1. 与康德的关系&lt;/h3&gt;
&lt;p&gt;叔本华把康德“物自体不可知“的谨慎立场，替换为“物自体就是意志“的大胆断言。这种替换使形而上学重新可能，但也把康德批判哲学留下的“知识边界“再次跨越了。读此书最好先读过康德《纯粹理性批判》的先验感性论与分析论，否则“表象/物自体“这对概念会缺少锚点。&lt;/p&gt;
&lt;h3 id=&quot;2-dui-xian-dai-ren-de-hong-dong&quot;&gt;2. 对现代人的触动&lt;/h3&gt;
&lt;p&gt;在消费主义与效率至上的今天，“意志永不满足“几乎可以翻译为：&lt;strong&gt;欲望是生产与消费的动力系统&lt;/strong&gt;。广告、算法推荐都在制造新的欲求；而叔本华提醒我们，满足之后是空虚。这不是要人禁欲，而是让人看清欲望的结构，从而获得一点抽离。&lt;/p&gt;
&lt;h3 id=&quot;3-bei-guan-zhu-yi-de-ji-ji-mian&quot;&gt;3. 悲观主义的积极面&lt;/h3&gt;
&lt;p&gt;叔本华的悲观不是消沉，而是&lt;strong&gt;清醒&lt;/strong&gt;：把人生的底色看清楚，反而能减少不切实际的期待。正如他说的，期望是痛苦的来源之一；降低对“外部世界必然回报“的预期，是一种心理上的减震。&lt;/p&gt;
&lt;h3 id=&quot;4-dui-ji-shu-gong-zuo-de-qi-fa&quot;&gt;4. 对技术工作的启发&lt;/h3&gt;
&lt;p&gt;作为程序员，我常把“意志的客体化“读成&lt;strong&gt;系统的演化逻辑&lt;/strong&gt;：商业系统的目标是增长（无目的的意志），个体在其中只是功能单元（客体化的器官）。理解这一点，有助于在工程决策中区分“系统自身的欲求“与“真实的需求“，避免被卷进盲目迭代。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;liu-zhi-de-hui-wei-de-ju-zi&quot;&gt;六、值得回味的句子&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;世界是我的表象。——这不是说世界是幻觉，而是说我们对世界的认识离不开认识的形式。&lt;/p&gt;
&lt;p&gt;生命意志的本质就是挣扎。&lt;/p&gt;
&lt;p&gt;一切满足都只是暂时的，新的欲求立刻接踵而至。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;qi-yan-shen-yue-du&quot;&gt;七、延伸阅读&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;康德《纯粹理性批判》（先验感性论、分析论）；&lt;/li&gt;
&lt;li&gt;尼采《悲剧的诞生》（意志哲学的反转：肯定生命）；&lt;/li&gt;
&lt;li&gt;张汝伦《现代西方哲学十五讲》（叔本华章）；&lt;/li&gt;
&lt;li&gt;叔本华《附录与补遗》（更易读的通俗篇）。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;下一篇：&lt;a href=&quot;https://suchaharcan.github.io/01Write_blog_ReadingNotes/readingnotes-kant-critique/&quot;&gt;《纯粹理性批判》读后感&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>本机命令与类库总览：4271 个可执行文件 / 782 个 Homebrew 公式</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/mac-commands-catalog/"/>
        <id>https://suchaharcan.github.io/03Share_blog/mac-commands-catalog/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/mac-commands-catalog/">&lt;h1 id=&quot;ben-ji-ming-ling-yu-lei-ku-zong-lan&quot;&gt;本机命令与类库总览&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;数据来源：&lt;code&gt;print -l ${(k)commands} | sort | while read -r name; do print -- &quot;$(whence -p -- &quot;$name&quot;)  $name&quot;; done&lt;/code&gt; 共 &lt;strong&gt;4271&lt;/strong&gt; 条命令；&lt;code&gt;brew list --formula&lt;/code&gt; 共 &lt;strong&gt;782&lt;/strong&gt; 个公式；&lt;code&gt;brew list --cask&lt;/code&gt; 共 &lt;strong&gt;69&lt;/strong&gt; 个 cask。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-tong-ji-zong-lan&quot;&gt;1. 统计总览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;来源目录&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;命令数&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;2588&lt;/td&gt;&lt;td&gt;Homebrew 公式主目录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/usr/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;858&lt;/td&gt;&lt;td&gt;macOS 系统命令&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/usr/sbin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;217&lt;/td&gt;&lt;td&gt;系统管理命令&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/llvm/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;167&lt;/td&gt;&lt;td&gt;LLVM 工具链&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/ccache/libexec&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;76&lt;/td&gt;&lt;td&gt;ccache 包装层&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/sbin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;72&lt;/td&gt;&lt;td&gt;系统引导/管理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Users/songhoujin/.ghcup/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;64&lt;/td&gt;&lt;td&gt;Haskell 工具链&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/postgresql@17/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;37&lt;/td&gt;&lt;td&gt;PostgreSQL 客户端&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;36&lt;/td&gt;&lt;td&gt;macOS 基础命令&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;(builtin/alias/function)&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;31&lt;/td&gt;&lt;td&gt;zsh 内建/别名/函数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/ruby/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;26&lt;/td&gt;&lt;td&gt;Ruby 工具链&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Users/songhoujin/.cargo/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;24&lt;/td&gt;&lt;td&gt;Rust/Cargo 工具&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/sbin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;23&lt;/td&gt;&lt;td&gt;Homebrew 系统命令&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Applications/iTerm.app/Contents/Resources/utilities&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;17&lt;/td&gt;&lt;td&gt;iTerm 自带工具&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;14&lt;/td&gt;&lt;td&gt;第三方/手动安装&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Users/songhoujin/.local/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;7&lt;/td&gt;&lt;td&gt;pipx/手动安装&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Users/songhoujin/Jai/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;6&lt;/td&gt;&lt;td&gt;Jai 编译器&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/gawk/libexec/gnubin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Users/songhoujin/.craft/bin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew/opt/make/libexec/gnubin&lt;/code&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;1&lt;/td&gt;&lt;td&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;2-fen-lei-su-cha-he-xin-yong-fa&quot;&gt;2. 分类速查（核心用法）&lt;/h2&gt;
&lt;p&gt;按功能场景分组，选每个场景最常用的命令，给出直接可用的核心用法：&lt;/p&gt;
&lt;h3 id=&quot;gou-jian-yu-bian-yi&quot;&gt;构建与编译&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cmake&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跨平台构建系统（C++ 主力）&lt;/td&gt;&lt;td&gt;&lt;code&gt;cmake -B build -G Ninja &amp;amp;&amp;amp; cmake --build build -j$(nproc)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ninja&lt;/code&gt;&lt;/td&gt;&lt;td&gt;极速构建后端&lt;/td&gt;&lt;td&gt;&lt;code&gt;ninja -C build&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mold&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高速链接器（替代系统 ld）&lt;/td&gt;&lt;td&gt;&lt;code&gt;cmake -B build -DCMAKE_EXE_LINKER_FLAGS=-fuse-ld=mold&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ccache&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编译缓存（C/C++）&lt;/td&gt;&lt;td&gt;&lt;code&gt;export CC=&#39;ccache clang&#39; CXX=&#39;ccache clang++&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;bear&lt;/code&gt;&lt;/td&gt;&lt;td&gt;生成 compile_commands.json（喂给 clangd）&lt;/td&gt;&lt;td&gt;&lt;code&gt;bear -- cmake --build build&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;meson&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Python 风格构建系统&lt;/td&gt;&lt;td&gt;&lt;code&gt;meson setup build &amp;amp;&amp;amp; meson compile -C build&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;c-c-he-xin-lei-ku&quot;&gt;C/C++ 核心类库&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fmt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;现代格式化（std::format 前身）&lt;/td&gt;&lt;td&gt;&lt;code&gt;fmt::print(&quot;{}\n&quot;, 42);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;spdlog&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高性能日志库&lt;/td&gt;&lt;td&gt;&lt;code&gt;spdlog::info(&quot;Hello {}&quot;, name);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nlohmann-json&lt;/code&gt;&lt;/td&gt;&lt;td&gt;JSON 解析/序列化&lt;/td&gt;&lt;td&gt;&lt;code&gt;nlohmann::json j = nlohmann::json::parse(s);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;boost&lt;/code&gt;&lt;/td&gt;&lt;td&gt;C++ 标准库扩展大全&lt;/td&gt;&lt;td&gt;&lt;code&gt;brew install boost &amp;amp;&amp;amp; #include &amp;lt;boost/asio.hpp&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eigen&lt;/code&gt;&lt;/td&gt;&lt;td&gt;线性代数模板库&lt;/td&gt;&lt;td&gt;&lt;code&gt;#include &amp;lt;Eigen/Dense&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;taskflow&lt;/code&gt;&lt;/td&gt;&lt;td&gt;并行任务流（DAG）&lt;/td&gt;&lt;td&gt;&lt;code&gt;tf::Taskflow tf; auto [a,b]=tf.emplace(f1,f2);&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;yu-yan-yun-xing-shi-yu-gong-ju-lian&quot;&gt;语言运行时与工具链&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llvm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Clang/LLVM 工具链全家桶&lt;/td&gt;&lt;td&gt;&lt;code&gt;clang++ -std=c++26 -O2 main.cpp -o main&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rustup&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rust 工具链管理器&lt;/td&gt;&lt;td&gt;&lt;code&gt;rustup update stable &amp;amp;&amp;amp; cargo new hello&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cargo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rust 构建/包管理&lt;/td&gt;&lt;td&gt;&lt;code&gt;cargo build --release &amp;amp;&amp;amp; cargo test&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;go&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Go 编译/工具链&lt;/td&gt;&lt;td&gt;&lt;code&gt;go build ./... &amp;amp;&amp;amp; go vet ./...&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;uv&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Python 包管理（极快）&lt;/td&gt;&lt;td&gt;&lt;code&gt;uv add requests &amp;amp;&amp;amp; uv run main.py&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;node&lt;/code&gt;&lt;/td&gt;&lt;td&gt;JavaScript 运行时&lt;/td&gt;&lt;td&gt;&lt;code&gt;node --version &amp;amp;&amp;amp; npm init -y&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;jai&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Jai 编译器（内测）&lt;/td&gt;&lt;td&gt;&lt;code&gt;jai-macos hello.jai&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;ban-ben-kong-zhi-yu-xie-zuo&quot;&gt;版本控制与协作&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git&lt;/code&gt;&lt;/td&gt;&lt;td&gt;版本控制&lt;/td&gt;&lt;td&gt;&lt;code&gt;git add -A &amp;amp;&amp;amp; git commit -m &#39;msg&#39; &amp;amp;&amp;amp; git push&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;lazygit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Git 终端 TUI&lt;/td&gt;&lt;td&gt;&lt;code&gt;lazygit&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;git-delta&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高亮 diff 分页器&lt;/td&gt;&lt;td&gt;&lt;code&gt;git config --global core.pager delta&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;difftastic&lt;/code&gt;&lt;/td&gt;&lt;td&gt;结构化 diff&lt;/td&gt;&lt;td&gt;&lt;code&gt;difft file1 file2&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cloc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;代码行数统计&lt;/td&gt;&lt;td&gt;&lt;code&gt;cloc --exclude-dir=build,.git .&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;zhong-duan-xiao-lu-yu-mei-hua&quot;&gt;终端效率与美化&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;atuin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;历史命令检索（SQLite）&lt;/td&gt;&lt;td&gt;&lt;code&gt;atuin search cmake --interactive&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zoxide&lt;/code&gt;&lt;/td&gt;&lt;td&gt;智能目录跳转&lt;/td&gt;&lt;td&gt;&lt;code&gt;z blog &amp;amp;&amp;amp; zi&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fzf&lt;/code&gt;&lt;/td&gt;&lt;td&gt;模糊查找器&lt;/td&gt;&lt;td&gt;&lt;code&gt;fzf --preview &#39;bat {}&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;bat&lt;/code&gt;&lt;/td&gt;&lt;td&gt;语法高亮 cat&lt;/td&gt;&lt;td&gt;&lt;code&gt;bat main.cpp&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;eza&lt;/code&gt;&lt;/td&gt;&lt;td&gt;现代 ls&lt;/td&gt;&lt;td&gt;&lt;code&gt;eza --long --tree --level=2 --git --icons&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;fd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;现代 find&lt;/td&gt;&lt;td&gt;&lt;code&gt;fd &#39;\.cpp$&#39; src&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ripgrep&lt;/code&gt;&lt;/td&gt;&lt;td&gt;极速 grep&lt;/td&gt;&lt;td&gt;&lt;code&gt;rg &#39;TODO&#39; --type cpp&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;starship&lt;/code&gt;&lt;/td&gt;&lt;td&gt;跨 shell 提示符&lt;/td&gt;&lt;td&gt;&lt;code&gt;starship init zsh | source&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;wang-luo-yu-xia-zai&quot;&gt;网络与下载&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;curl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;HTTP 请求&lt;/td&gt;&lt;td&gt;&lt;code&gt;curl -OL https://example.com/file.tar.gz&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;xh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;人类友好 curl（httpie 风格）&lt;/td&gt;&lt;td&gt;&lt;code&gt;xh GET api.example.com/users&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mtr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;网络路径+丢包诊断&lt;/td&gt;&lt;td&gt;&lt;code&gt;mtr -rw example.com&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap&lt;/code&gt;&lt;/td&gt;&lt;td&gt;端口/服务扫描&lt;/td&gt;&lt;td&gt;&lt;code&gt;nmap -sV 192.168.1.1&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;rclone&lt;/code&gt;&lt;/td&gt;&lt;td&gt;云盘同步&lt;/td&gt;&lt;td&gt;&lt;code&gt;rclone sync local: remote:backup&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;shu-ju-ku-yu-cun-chu&quot;&gt;数据库与存储&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;postgresql@17&lt;/code&gt;&lt;/td&gt;&lt;td&gt;PostgreSQL 数据库&lt;/td&gt;&lt;td&gt;&lt;code&gt;brew services start postgresql@17 &amp;amp;&amp;amp; psql -d postgres&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sqlite&lt;/code&gt;&lt;/td&gt;&lt;td&gt;嵌入式 SQL 数据库&lt;/td&gt;&lt;td&gt;&lt;code&gt;sqlite3 data.db &#39;SELECT * FROM t;&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;duckdb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分析型列式数据库&lt;/td&gt;&lt;td&gt;&lt;code&gt;duckdb -c &#39;SELECT count(*) FROM read_csv_auto(f.csv)&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;redis&lt;/code&gt;&lt;/td&gt;&lt;td&gt;内存键值库&lt;/td&gt;&lt;td&gt;&lt;code&gt;redis-cli SET k v &amp;amp;&amp;amp; GET k&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zstd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;高压缩比压缩&lt;/td&gt;&lt;td&gt;&lt;code&gt;zstd -19 -o out.zst file &amp;amp;&amp;amp; zstd -d out.zst&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;mei-ti-yu-tu-xiang&quot;&gt;媒体与图像&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ffmpeg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;音视频转码/处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;ffmpeg -i in.mp4 -c:v libx264 -crf 23 out.mp4&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mpv&lt;/code&gt;&lt;/td&gt;&lt;td&gt;极简播放器&lt;/td&gt;&lt;td&gt;&lt;code&gt;mpv --hwdec=auto video.mkv&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;imagemagick&lt;/code&gt;&lt;/td&gt;&lt;td&gt;图像处理 CLI&lt;/td&gt;&lt;td&gt;&lt;code&gt;magick input.png -resize 800x out.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tesseract&lt;/code&gt;&lt;/td&gt;&lt;td&gt;OCR 文字识别&lt;/td&gt;&lt;td&gt;&lt;code&gt;tesseract scan.png out -l eng&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;ai-yu-ji-qi-xue-xi&quot;&gt;AI 与机器学习&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;llama.cpp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;本地 LLM 推理&lt;/td&gt;&lt;td&gt;&lt;code&gt;llama-cli -m model.gguf -p &#39;Hello&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ggml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GGML 张量库&lt;/td&gt;&lt;td&gt;&lt;code&gt;#include &amp;lt;ggml.h&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;onnx&lt;/code&gt;&lt;/td&gt;&lt;td&gt;ONNX 模型运行时&lt;/td&gt;&lt;td&gt;&lt;code&gt;python3 -c &#39;import onnx&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;openvino&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Intel 推理优化&lt;/td&gt;&lt;td&gt;&lt;code&gt;benchmark_app -m model.xml&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;shu-xue-yu-ke-xue-ji-suan&quot;&gt;数学与科学计算&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;openblas&lt;/code&gt;&lt;/td&gt;&lt;td&gt;BLAS 线性代数&lt;/td&gt;&lt;td&gt;&lt;code&gt;brew info openblas&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphviz&lt;/code&gt;&lt;/td&gt;&lt;td&gt;图/依赖可视化&lt;/td&gt;&lt;td&gt;&lt;code&gt;dot -Tpng graph.dot -o graph.png&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gnuplot&lt;/code&gt;&lt;/td&gt;&lt;td&gt;科学绘图&lt;/td&gt;&lt;td&gt;&lt;code&gt;gnuplot -e &quot;plot &#39;data.txt&#39; u 1:2&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;octave&lt;/code&gt;&lt;/td&gt;&lt;td&gt;MATLAB 兼容计算&lt;/td&gt;&lt;td&gt;&lt;code&gt;octave --eval &#39;A=[1 2;3 4]; inv(A)&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;an-quan-yu-jia-mi&quot;&gt;安全与加密&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;openssl&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TLS/加密 CLI&lt;/td&gt;&lt;td&gt;&lt;code&gt;openssl s_client -connect example.com:443&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gnupg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GPG 加解密/签名&lt;/td&gt;&lt;td&gt;&lt;code&gt;gpg --encrypt --recipient key file&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;密码管理（GPG）&lt;/td&gt;&lt;td&gt;&lt;code&gt;pass insert email/me &amp;amp;&amp;amp; pass show email/me&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;hashcat&lt;/code&gt;&lt;/td&gt;&lt;td&gt;密码哈希破解&lt;/td&gt;&lt;td&gt;&lt;code&gt;hashcat -m 0 hash.txt wordlist.txt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;semgrep&lt;/code&gt;&lt;/td&gt;&lt;td&gt;代码静态安全扫描&lt;/td&gt;&lt;td&gt;&lt;code&gt;semgrep scan --config auto .&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;xi-tong-yu-jian-kong&quot;&gt;系统与监控&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;btop&lt;/code&gt;&lt;/td&gt;&lt;td&gt;系统资源监控 TUI&lt;/td&gt;&lt;td&gt;&lt;code&gt;btop&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mactop&lt;/code&gt;&lt;/td&gt;&lt;td&gt;macOS 进程/温度监控&lt;/td&gt;&lt;td&gt;&lt;code&gt;mactop&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tracy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;C++ 性能剖析&lt;/td&gt;&lt;td&gt;&lt;code&gt;tracy-profiler &amp;amp; 然后代码里 TRACY_ZONE_SCOPED&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;valgrind&lt;/code&gt;&lt;/td&gt;&lt;td&gt;内存检测&lt;/td&gt;&lt;td&gt;&lt;code&gt;valgrind --leak-check=full ./a.out&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;samply&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rust/Swift 采样剖析&lt;/td&gt;&lt;td&gt;&lt;code&gt;samply record ./app&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;wen-ben-yu-shu-ju-chu-li&quot;&gt;文本与数据处理&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;核心用法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;jq&lt;/code&gt;&lt;/td&gt;&lt;td&gt;JSON 处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;curl -s api | jq &#39;.items[].name&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gawk&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GNU awk（文本处理）&lt;/td&gt;&lt;td&gt;&lt;code&gt;gawk &#39;{s+=$1} END{print s}&#39; nums.txt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;ast-grep&lt;/code&gt;&lt;/td&gt;&lt;td&gt;结构化代码搜索/重构&lt;/td&gt;&lt;td&gt;&lt;code&gt;ast-grep -p &#39;unwrap\(\)&#39; -l rust&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;pandoc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文档格式转换&lt;/td&gt;&lt;td&gt;&lt;code&gt;pandoc a.md -o a.pdf --pdf-engine=xelatex&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;3-homebrew-yi-zhuang-gong-shi-wan-zheng-qing-dan-an-gong-neng-fen-lei&quot;&gt;3. Homebrew 已装公式完整清单（按功能分类）&lt;/h2&gt;
&lt;p&gt;共 782 个公式；&lt;code&gt;：&lt;/code&gt; 后为要点说明。完整原始清单见附录。&lt;/p&gt;
&lt;h3 id=&quot;gou-jian-yu-bian-yi-34&quot;&gt;构建与编译（34）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;autoconf&lt;/code&gt;，&lt;code&gt;automake&lt;/code&gt;，&lt;code&gt;bazel&lt;/code&gt;：Google 构建系统
&lt;code&gt;bear&lt;/code&gt;：compile_commands 生成，&lt;code&gt;binutils&lt;/code&gt;，&lt;code&gt;bison&lt;/code&gt;
&lt;code&gt;build2&lt;/code&gt;：C/C++ 构建工具链，&lt;code&gt;ccache&lt;/code&gt;：编译缓存，&lt;code&gt;clang-format&lt;/code&gt;：clang 格式化
&lt;code&gt;clang-include-graph&lt;/code&gt;：头文件依赖图，&lt;code&gt;clang-uml&lt;/code&gt;：clang UML 图，&lt;code&gt;clangql&lt;/code&gt;：Clang AST 查询
&lt;code&gt;cmake&lt;/code&gt;：CMake 构建系统，&lt;code&gt;cmake-docs&lt;/code&gt;，&lt;code&gt;corrosion&lt;/code&gt;
&lt;code&gt;gnu-getopt&lt;/code&gt;，&lt;code&gt;just&lt;/code&gt;，&lt;code&gt;just-lsp&lt;/code&gt;
&lt;code&gt;libtool&lt;/code&gt;，&lt;code&gt;lld&lt;/code&gt;：LLVM 链接器，&lt;code&gt;lld@21&lt;/code&gt;
&lt;code&gt;llvm&lt;/code&gt;：LLVM/Clang 全家桶，&lt;code&gt;llvm@21&lt;/code&gt;，&lt;code&gt;m4&lt;/code&gt;
&lt;code&gt;make&lt;/code&gt;，&lt;code&gt;meson&lt;/code&gt;：Meson 构建，&lt;code&gt;mold&lt;/code&gt;：高速链接器
&lt;code&gt;ninja&lt;/code&gt;：Ninja 构建，&lt;code&gt;pkg-config-wrapper&lt;/code&gt;，&lt;code&gt;pkgconf&lt;/code&gt;
&lt;code&gt;re2c&lt;/code&gt;，&lt;code&gt;sc-cmake&lt;/code&gt;，&lt;code&gt;swig&lt;/code&gt;
&lt;code&gt;xdg-ninja&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;c-c-he-xin-lei-ku-185&quot;&gt;C/C++ 核心类库（185）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;abseil&lt;/code&gt;，&lt;code&gt;adaptivecpp&lt;/code&gt;，&lt;code&gt;argparse&lt;/code&gt;
&lt;code&gt;argtable&lt;/code&gt;，&lt;code&gt;armadillo&lt;/code&gt;，&lt;code&gt;asio&lt;/code&gt;
&lt;code&gt;atomic_queue&lt;/code&gt;，&lt;code&gt;aws-crt-cpp&lt;/code&gt;，&lt;code&gt;aws-sdk-cpp&lt;/code&gt;
&lt;code&gt;behaviortree.cpp&lt;/code&gt;，&lt;code&gt;blaze&lt;/code&gt;，&lt;code&gt;blitz&lt;/code&gt;
&lt;code&gt;boost&lt;/code&gt;：Boost 库，&lt;code&gt;boost-build&lt;/code&gt;，&lt;code&gt;boost-python3&lt;/code&gt;
&lt;code&gt;capnp&lt;/code&gt;，&lt;code&gt;catch2&lt;/code&gt;：测试框架，&lt;code&gt;cereal&lt;/code&gt;
&lt;code&gt;cli11&lt;/code&gt;，&lt;code&gt;concurrentqueue&lt;/code&gt;，&lt;code&gt;cpp-gsl&lt;/code&gt;
&lt;code&gt;cpp-httplib&lt;/code&gt;，&lt;code&gt;cpp-peglib&lt;/code&gt;，&lt;code&gt;cppcheck&lt;/code&gt;
&lt;code&gt;cppinsights&lt;/code&gt;，&lt;code&gt;cpplint&lt;/code&gt;，&lt;code&gt;cppman&lt;/code&gt;
&lt;code&gt;cpptest&lt;/code&gt;，&lt;code&gt;cpptrace&lt;/code&gt;，&lt;code&gt;cppunit&lt;/code&gt;
&lt;code&gt;cpputest&lt;/code&gt;，&lt;code&gt;cppzmq&lt;/code&gt;，&lt;code&gt;cpr&lt;/code&gt;
&lt;code&gt;crow&lt;/code&gt;，&lt;code&gt;ctre&lt;/code&gt;，&lt;code&gt;cxxopts&lt;/code&gt;
&lt;code&gt;dbg-macro&lt;/code&gt;，&lt;code&gt;dispenso&lt;/code&gt;，&lt;code&gt;doctest&lt;/code&gt;：单头测试框架
&lt;code&gt;drogon&lt;/code&gt;，&lt;code&gt;dylibbundler&lt;/code&gt;，&lt;code&gt;eigen&lt;/code&gt;：线性代数库
&lt;code&gt;eigen@3&lt;/code&gt;，&lt;code&gt;entt&lt;/code&gt;，&lt;code&gt;eventpp&lt;/code&gt;
&lt;code&gt;fast_float&lt;/code&gt;，&lt;code&gt;flatbuffers&lt;/code&gt;，&lt;code&gt;flecs&lt;/code&gt;
&lt;code&gt;fmt&lt;/code&gt;：格式化库，&lt;code&gt;frozen&lt;/code&gt;，&lt;code&gt;glaze&lt;/code&gt;
&lt;code&gt;glib&lt;/code&gt;，&lt;code&gt;glibmm&lt;/code&gt;，&lt;code&gt;glibmm@2.66&lt;/code&gt;
&lt;code&gt;glog&lt;/code&gt;，&lt;code&gt;google-benchmark&lt;/code&gt;：微基准库，&lt;code&gt;googletest&lt;/code&gt;：Google 测试
&lt;code&gt;gsl&lt;/code&gt;：GNU 科学库，&lt;code&gt;highway&lt;/code&gt;，&lt;code&gt;hiredis&lt;/code&gt;
&lt;code&gt;hopscotch-map&lt;/code&gt;，&lt;code&gt;icu4c@78&lt;/code&gt;，&lt;code&gt;immer&lt;/code&gt;
&lt;code&gt;inja&lt;/code&gt;，&lt;code&gt;json-c&lt;/code&gt;，&lt;code&gt;jsoncpp&lt;/code&gt;
&lt;code&gt;kokkos&lt;/code&gt;，&lt;code&gt;leveldb&lt;/code&gt;，&lt;code&gt;libaec&lt;/code&gt;
&lt;code&gt;libassuan&lt;/code&gt;，&lt;code&gt;libb2&lt;/code&gt;，&lt;code&gt;libcbor&lt;/code&gt;
&lt;code&gt;libcds&lt;/code&gt;，&lt;code&gt;libcerf&lt;/code&gt;，&lt;code&gt;libcutl&lt;/code&gt;
&lt;code&gt;libdatrie&lt;/code&gt;，&lt;code&gt;libdeflate&lt;/code&gt;，&lt;code&gt;libepoxy&lt;/code&gt;
&lt;code&gt;libev&lt;/code&gt;，&lt;code&gt;libevent&lt;/code&gt;，&lt;code&gt;libff&lt;/code&gt;
&lt;code&gt;libffi&lt;/code&gt;，&lt;code&gt;libfido2&lt;/code&gt;，&lt;code&gt;libghthash&lt;/code&gt;
&lt;code&gt;libgit2&lt;/code&gt;，&lt;code&gt;libgpg-error&lt;/code&gt;，&lt;code&gt;libgrape-lite&lt;/code&gt;
&lt;code&gt;libharu&lt;/code&gt;，&lt;code&gt;libidn&lt;/code&gt;，&lt;code&gt;libidn2&lt;/code&gt;
&lt;code&gt;libimagequant&lt;/code&gt;，&lt;code&gt;libjson-rpc-cpp&lt;/code&gt;，&lt;code&gt;libksba&lt;/code&gt;
&lt;code&gt;liblinear&lt;/code&gt;，&lt;code&gt;libmagic&lt;/code&gt;，&lt;code&gt;libmicrohttpd&lt;/code&gt;
&lt;code&gt;libmpc&lt;/code&gt;，&lt;code&gt;libmpdclient&lt;/code&gt;，&lt;code&gt;libnetworkit&lt;/code&gt;
&lt;code&gt;libnghttp2&lt;/code&gt;，&lt;code&gt;libnghttp3&lt;/code&gt;，&lt;code&gt;libngtcp2&lt;/code&gt;
&lt;code&gt;libomp&lt;/code&gt;，&lt;code&gt;libpaper&lt;/code&gt;，&lt;code&gt;libpcap&lt;/code&gt;
&lt;code&gt;libphonenumber&lt;/code&gt;，&lt;code&gt;libplacebo&lt;/code&gt;，&lt;code&gt;libpq&lt;/code&gt;
&lt;code&gt;libpqxx&lt;/code&gt;，&lt;code&gt;libpsl&lt;/code&gt;，&lt;code&gt;libraqm&lt;/code&gt;
&lt;code&gt;librdkafka&lt;/code&gt;，&lt;code&gt;librsvg&lt;/code&gt;，&lt;code&gt;libsigc++&lt;/code&gt;
&lt;code&gt;libsigc++@2&lt;/code&gt;，&lt;code&gt;libstxxl&lt;/code&gt;，&lt;code&gt;libtasn1&lt;/code&gt;
&lt;code&gt;libthai&lt;/code&gt;，&lt;code&gt;libtins&lt;/code&gt;，&lt;code&gt;libtomcrypt&lt;/code&gt;
&lt;code&gt;libtommath&lt;/code&gt;，&lt;code&gt;libudfread&lt;/code&gt;，&lt;code&gt;libunibreak&lt;/code&gt;
&lt;code&gt;libunicode&lt;/code&gt;，&lt;code&gt;libunistring&lt;/code&gt;，&lt;code&gt;libusb&lt;/code&gt;
&lt;code&gt;libuv&lt;/code&gt;，&lt;code&gt;libx11&lt;/code&gt;，&lt;code&gt;libxau&lt;/code&gt;
&lt;code&gt;libxc&lt;/code&gt;，&lt;code&gt;libxcb&lt;/code&gt;，&lt;code&gt;libxdmcp&lt;/code&gt;
&lt;code&gt;libxext&lt;/code&gt;，&lt;code&gt;libxfixes&lt;/code&gt;，&lt;code&gt;libxi&lt;/code&gt;
&lt;code&gt;libxrender&lt;/code&gt;，&lt;code&gt;libxtst&lt;/code&gt;，&lt;code&gt;libyaml&lt;/code&gt;
&lt;code&gt;libzip&lt;/code&gt;，&lt;code&gt;log4cplus&lt;/code&gt;，&lt;code&gt;log4cpp&lt;/code&gt;
&lt;code&gt;log4cxx&lt;/code&gt;，&lt;code&gt;lzlib&lt;/code&gt;，&lt;code&gt;magic_enum&lt;/code&gt;
&lt;code&gt;msgpack&lt;/code&gt;，&lt;code&gt;mysql&lt;/code&gt;，&lt;code&gt;nlohmann-json&lt;/code&gt;：JSON 库
&lt;code&gt;oatpp&lt;/code&gt;，&lt;code&gt;opentelemetry-cpp&lt;/code&gt;，&lt;code&gt;parallel-hashmap&lt;/code&gt;
&lt;code&gt;pcaudiolib&lt;/code&gt;，&lt;code&gt;pegtl&lt;/code&gt;，&lt;code&gt;pistache&lt;/code&gt;
&lt;code&gt;plog&lt;/code&gt;，&lt;code&gt;poco&lt;/code&gt;，&lt;code&gt;prometheus-cpp&lt;/code&gt;
&lt;code&gt;pugixml&lt;/code&gt;，&lt;code&gt;pybind11&lt;/code&gt;，&lt;code&gt;quill&lt;/code&gt;
&lt;code&gt;range-v3&lt;/code&gt;，&lt;code&gt;rapidjson&lt;/code&gt;，&lt;code&gt;readerwriterqueue&lt;/code&gt;
&lt;code&gt;redis&lt;/code&gt;：内存 KV，&lt;code&gt;robin-map&lt;/code&gt;，&lt;code&gt;rocksdb&lt;/code&gt;：KV 存储引擎
&lt;code&gt;scnlib&lt;/code&gt;，&lt;code&gt;simdjson&lt;/code&gt;，&lt;code&gt;simdutf&lt;/code&gt;
&lt;code&gt;soci&lt;/code&gt;，&lt;code&gt;spdlog&lt;/code&gt;：日志库，&lt;code&gt;sqlite&lt;/code&gt;：SQLite
&lt;code&gt;ta-lib&lt;/code&gt;，&lt;code&gt;taskflow&lt;/code&gt;，&lt;code&gt;tbb&lt;/code&gt;
&lt;code&gt;tinyxml2&lt;/code&gt;，&lt;code&gt;tl-expected&lt;/code&gt;，&lt;code&gt;tomlplusplus&lt;/code&gt;
&lt;code&gt;utf8cpp&lt;/code&gt;，&lt;code&gt;xsimd&lt;/code&gt;，&lt;code&gt;xtensor&lt;/code&gt;
&lt;code&gt;xtl&lt;/code&gt;，&lt;code&gt;yalantinglibs&lt;/code&gt;，&lt;code&gt;yaml-cpp&lt;/code&gt;
&lt;code&gt;zeromq&lt;/code&gt;，&lt;code&gt;zug&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;yu-yan-yun-xing-shi-yu-gong-ju-lian-34&quot;&gt;语言运行时与工具链（34）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bun&lt;/code&gt;，&lt;code&gt;delve&lt;/code&gt;：Go 调试器，&lt;code&gt;deno&lt;/code&gt;
&lt;code&gt;elan-init&lt;/code&gt;：Lean 工具链，&lt;code&gt;gcc&lt;/code&gt;，&lt;code&gt;go&lt;/code&gt;：Go 语言
&lt;code&gt;gobject-introspection&lt;/code&gt;，&lt;code&gt;golangci-lint&lt;/code&gt;：Go 聚合 linter，&lt;code&gt;gopls&lt;/code&gt;：Go LSP
&lt;code&gt;gource&lt;/code&gt;，&lt;code&gt;lua&lt;/code&gt;，&lt;code&gt;lua-language-server&lt;/code&gt;
&lt;code&gt;luajit&lt;/code&gt;，&lt;code&gt;node&lt;/code&gt;：Node.js，&lt;code&gt;nvm&lt;/code&gt;：Node 版本管理
&lt;code&gt;odin&lt;/code&gt;：Odin 语言，&lt;code&gt;openjdk&lt;/code&gt;：Java 工具链，&lt;code&gt;openjdk@21&lt;/code&gt;
&lt;code&gt;php&lt;/code&gt;，&lt;code&gt;python-setuptools&lt;/code&gt;，&lt;code&gt;python@3.11&lt;/code&gt;
&lt;code&gt;python@3.12&lt;/code&gt;，&lt;code&gt;python@3.13&lt;/code&gt;，&lt;code&gt;python@3.14&lt;/code&gt;：Python 3.14
&lt;code&gt;ruby&lt;/code&gt;：Ruby 语言，&lt;code&gt;ruby-install&lt;/code&gt;，&lt;code&gt;rust&lt;/code&gt;：Rust 语言
&lt;code&gt;rust-analyzer&lt;/code&gt;：Rust LSP，&lt;code&gt;rustnet&lt;/code&gt;，&lt;code&gt;rustup&lt;/code&gt;：Rust 工具链
&lt;code&gt;staticcheck&lt;/code&gt;：Go 静态检查，&lt;code&gt;swiftlint&lt;/code&gt;，&lt;code&gt;zig&lt;/code&gt;：Zig 语言
&lt;code&gt;zigoku&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;ban-ben-kong-zhi-yu-xie-zuo-12&quot;&gt;版本控制与协作（12）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;cloc&lt;/code&gt;：代码统计，&lt;code&gt;cscope&lt;/code&gt;，&lt;code&gt;czg&lt;/code&gt;：Commitizen Go 提交规范
&lt;code&gt;difftastic&lt;/code&gt;：结构化 diff，&lt;code&gt;ghidra&lt;/code&gt;：逆向分析，&lt;code&gt;ghostscript&lt;/code&gt;
&lt;code&gt;git&lt;/code&gt;：版本控制，&lt;code&gt;git-delta&lt;/code&gt;：diff 高亮，&lt;code&gt;global&lt;/code&gt;
&lt;code&gt;lazygit&lt;/code&gt;：Git TUI，&lt;code&gt;tokei&lt;/code&gt;：代码统计(Rust)，&lt;code&gt;universal-ctags&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;zhong-duan-xiao-lu-yu-mei-hua-42&quot;&gt;终端效率与美化（42）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ack&lt;/code&gt;，&lt;code&gt;ast-grep&lt;/code&gt;：AST 搜索，&lt;code&gt;atuin&lt;/code&gt;：历史检索
&lt;code&gt;bat&lt;/code&gt;：高亮 cat，&lt;code&gt;borders&lt;/code&gt;：窗口边框，&lt;code&gt;btop&lt;/code&gt;：系统监控
&lt;code&gt;carapace&lt;/code&gt;，&lt;code&gt;cheat&lt;/code&gt;，&lt;code&gt;direnv&lt;/code&gt;：目录环境
&lt;code&gt;eza&lt;/code&gt;：现代 ls，&lt;code&gt;fastfetch&lt;/code&gt;，&lt;code&gt;fd&lt;/code&gt;：现代 find
&lt;code&gt;fzf&lt;/code&gt;：模糊查找，&lt;code&gt;has&lt;/code&gt;，&lt;code&gt;hashcat&lt;/code&gt;：哈希破解
&lt;code&gt;hexyl&lt;/code&gt;，&lt;code&gt;jless&lt;/code&gt;，&lt;code&gt;lf&lt;/code&gt;
&lt;code&gt;mactop&lt;/code&gt;：macOS 监控，&lt;code&gt;mise&lt;/code&gt;：多运行时版本管理，&lt;code&gt;mprocs&lt;/code&gt;
&lt;code&gt;navi&lt;/code&gt;，&lt;code&gt;onefetch&lt;/code&gt;，&lt;code&gt;reddix&lt;/code&gt;
&lt;code&gt;ripgrep&lt;/code&gt;：极速搜索，&lt;code&gt;sketchybar&lt;/code&gt;：菜单栏定制，&lt;code&gt;starship&lt;/code&gt;：提示符
&lt;code&gt;tealdeer&lt;/code&gt;，&lt;code&gt;the_silver_searcher&lt;/code&gt;，&lt;code&gt;tmux&lt;/code&gt;：终端复用
&lt;code&gt;tree-sitter&lt;/code&gt;：增量解析器，&lt;code&gt;typioca&lt;/code&gt;，&lt;code&gt;usage&lt;/code&gt;
&lt;code&gt;why&lt;/code&gt;，&lt;code&gt;yabai&lt;/code&gt;：平铺窗口管理，&lt;code&gt;yazi&lt;/code&gt;
&lt;code&gt;zoxide&lt;/code&gt;：目录跳转，&lt;code&gt;zsh-autocomplete&lt;/code&gt;，&lt;code&gt;zsh-completions&lt;/code&gt;
&lt;code&gt;zsh-patina&lt;/code&gt;，&lt;code&gt;zsh-syntax-highlighting&lt;/code&gt;，&lt;code&gt;zsh-you-should-use&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;wang-luo-yu-xia-zai-24&quot;&gt;网络与下载（24）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;bind&lt;/code&gt;，&lt;code&gt;croc&lt;/code&gt;，&lt;code&gt;curl&lt;/code&gt;：HTTP 客户端
&lt;code&gt;curlpp&lt;/code&gt;，&lt;code&gt;dnsmasq&lt;/code&gt;，&lt;code&gt;httpie&lt;/code&gt;：HTTP 客户端
&lt;code&gt;ipatool&lt;/code&gt;，&lt;code&gt;mirrord&lt;/code&gt;，&lt;code&gt;mtr&lt;/code&gt;：网络诊断
&lt;code&gt;netcat&lt;/code&gt;，&lt;code&gt;netwatch&lt;/code&gt;，&lt;code&gt;nexttrace&lt;/code&gt;
&lt;code&gt;nmap&lt;/code&gt;：网络扫描，&lt;code&gt;openssh&lt;/code&gt;，&lt;code&gt;rclone&lt;/code&gt;：云盘同步
&lt;code&gt;sniffnet&lt;/code&gt;，&lt;code&gt;socat&lt;/code&gt;，&lt;code&gt;speedtest-cli&lt;/code&gt;
&lt;code&gt;syncthing&lt;/code&gt;：P2P 同步，&lt;code&gt;tailscale&lt;/code&gt;：VPN 组网，&lt;code&gt;telegram-downloader&lt;/code&gt;
&lt;code&gt;wget&lt;/code&gt;：下载，&lt;code&gt;xh&lt;/code&gt;：HTTPie 风格 curl，&lt;code&gt;yt-dlp&lt;/code&gt;：视频下载&lt;/p&gt;
&lt;h3 id=&quot;shu-ju-ku-yu-cun-chu-15&quot;&gt;数据库与存储（15）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;brotli&lt;/code&gt;：压缩，&lt;code&gt;cassandra-cpp-driver&lt;/code&gt;，&lt;code&gt;cypher-shell&lt;/code&gt;
&lt;code&gt;duckdb&lt;/code&gt;：分析型数据库，&lt;code&gt;libarchive&lt;/code&gt;，&lt;code&gt;lz4&lt;/code&gt;
&lt;code&gt;lzo&lt;/code&gt;，&lt;code&gt;minizip&lt;/code&gt;，&lt;code&gt;neo4j&lt;/code&gt;
&lt;code&gt;postgresql@17&lt;/code&gt;：PostgreSQL，&lt;code&gt;snappy&lt;/code&gt;，&lt;code&gt;xz&lt;/code&gt;：压缩
&lt;code&gt;zlib&lt;/code&gt;，&lt;code&gt;zlib-ng-compat&lt;/code&gt;，&lt;code&gt;zstd&lt;/code&gt;：压缩&lt;/p&gt;
&lt;h3 id=&quot;rong-qi-yu-xu-ni-hua-3&quot;&gt;容器与虚拟化（3）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ansible&lt;/code&gt;，&lt;code&gt;colima&lt;/code&gt;，&lt;code&gt;lima&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;mei-ti-yu-tu-xiang-82&quot;&gt;媒体与图像（82）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;asciinema&lt;/code&gt;，&lt;code&gt;cairo&lt;/code&gt;，&lt;code&gt;cairomm@1.14&lt;/code&gt;
&lt;code&gt;chafa&lt;/code&gt;，&lt;code&gt;cmatrix&lt;/code&gt;，&lt;code&gt;cowsay&lt;/code&gt;
&lt;code&gt;dav1d&lt;/code&gt;，&lt;code&gt;ffmpeg&lt;/code&gt;：音视频处理，&lt;code&gt;figlet&lt;/code&gt;
&lt;code&gt;flac&lt;/code&gt;，&lt;code&gt;fltk&lt;/code&gt;，&lt;code&gt;fontconfig&lt;/code&gt;
&lt;code&gt;fortune&lt;/code&gt;，&lt;code&gt;freetype&lt;/code&gt;，&lt;code&gt;giflib&lt;/code&gt;
&lt;code&gt;glbinding&lt;/code&gt;，&lt;code&gt;glew&lt;/code&gt;，&lt;code&gt;glfw&lt;/code&gt;
&lt;code&gt;glm&lt;/code&gt;，&lt;code&gt;graphicsmagick&lt;/code&gt;，&lt;code&gt;gtk+3&lt;/code&gt;
&lt;code&gt;harfbuzz&lt;/code&gt;，&lt;code&gt;imagemagick&lt;/code&gt;：图像处理，&lt;code&gt;imath&lt;/code&gt;
&lt;code&gt;imlib2&lt;/code&gt;，&lt;code&gt;jp2a&lt;/code&gt;，&lt;code&gt;jpeg-turbo&lt;/code&gt;
&lt;code&gt;jpeg-xl&lt;/code&gt;，&lt;code&gt;leptonica&lt;/code&gt;，&lt;code&gt;libass&lt;/code&gt;
&lt;code&gt;libavif&lt;/code&gt;，&lt;code&gt;libbluray&lt;/code&gt;，&lt;code&gt;libcaca&lt;/code&gt;
&lt;code&gt;libde265&lt;/code&gt;，&lt;code&gt;libexif&lt;/code&gt;，&lt;code&gt;libheif&lt;/code&gt;
&lt;code&gt;libogg&lt;/code&gt;，&lt;code&gt;libopenmpt&lt;/code&gt;，&lt;code&gt;libpng&lt;/code&gt;
&lt;code&gt;libsamplerate&lt;/code&gt;，&lt;code&gt;libsndfile&lt;/code&gt;，&lt;code&gt;libtiff&lt;/code&gt;
&lt;code&gt;libvmaf&lt;/code&gt;，&lt;code&gt;libvorbis&lt;/code&gt;，&lt;code&gt;libvpx&lt;/code&gt;
&lt;code&gt;little-cms2&lt;/code&gt;，&lt;code&gt;lolcat&lt;/code&gt;，&lt;code&gt;mlpack&lt;/code&gt;
&lt;code&gt;molten-vk&lt;/code&gt;，&lt;code&gt;mpg123&lt;/code&gt;，&lt;code&gt;mpv&lt;/code&gt;：播放器
&lt;code&gt;opencv&lt;/code&gt;：计算机视觉，&lt;code&gt;openexr&lt;/code&gt;，&lt;code&gt;openjpeg&lt;/code&gt;
&lt;code&gt;openjph&lt;/code&gt;，&lt;code&gt;opus&lt;/code&gt;，&lt;code&gt;pango&lt;/code&gt;
&lt;code&gt;poppler&lt;/code&gt;，&lt;code&gt;qt5compat&lt;/code&gt;，&lt;code&gt;qtbase&lt;/code&gt;
&lt;code&gt;qtdeclarative&lt;/code&gt;，&lt;code&gt;qtsvg&lt;/code&gt;，&lt;code&gt;qttools&lt;/code&gt;
&lt;code&gt;raylib&lt;/code&gt;，&lt;code&gt;rubberband&lt;/code&gt;，&lt;code&gt;sdl2&lt;/code&gt;
&lt;code&gt;sdl2-compat&lt;/code&gt;，&lt;code&gt;sdl2_image&lt;/code&gt;，&lt;code&gt;sdl3&lt;/code&gt;
&lt;code&gt;sfml&lt;/code&gt;，&lt;code&gt;shaderc&lt;/code&gt;，&lt;code&gt;sound-touch&lt;/code&gt;
&lt;code&gt;svt-av1&lt;/code&gt;，&lt;code&gt;taglib&lt;/code&gt;，&lt;code&gt;tesseract&lt;/code&gt;：OCR
&lt;code&gt;tgui&lt;/code&gt;，&lt;code&gt;vtk&lt;/code&gt;，&lt;code&gt;vulkan-headers&lt;/code&gt;
&lt;code&gt;vulkan-loader&lt;/code&gt;，&lt;code&gt;webp&lt;/code&gt;，&lt;code&gt;x264&lt;/code&gt;
&lt;code&gt;x265&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;ai-yu-ji-qi-xue-xi-7&quot;&gt;AI 与机器学习（7）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;faiss&lt;/code&gt;：向量检索，&lt;code&gt;ggml&lt;/code&gt;：张量库，&lt;code&gt;libtensorflow&lt;/code&gt;
&lt;code&gt;llama.cpp&lt;/code&gt;：本地 LLM，&lt;code&gt;llmfit&lt;/code&gt;，&lt;code&gt;onnx&lt;/code&gt;：ONNX 运行时
&lt;code&gt;openvino&lt;/code&gt;：Intel 推理&lt;/p&gt;
&lt;h3 id=&quot;shu-xue-yu-ke-xue-ji-suan-50&quot;&gt;数学与科学计算（50）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;arpack&lt;/code&gt;，&lt;code&gt;autodiff&lt;/code&gt;，&lt;code&gt;bandicoot&lt;/code&gt;
&lt;code&gt;cbc&lt;/code&gt;，&lt;code&gt;ceres-solver&lt;/code&gt;，&lt;code&gt;cgal&lt;/code&gt;
&lt;code&gt;cgl&lt;/code&gt;，&lt;code&gt;cln&lt;/code&gt;，&lt;code&gt;clp&lt;/code&gt;
&lt;code&gt;coinutils&lt;/code&gt;，&lt;code&gt;cppad&lt;/code&gt;，&lt;code&gt;dlib&lt;/code&gt;
&lt;code&gt;ensmallen&lt;/code&gt;，&lt;code&gt;fftw&lt;/code&gt;，&lt;code&gt;flint&lt;/code&gt;
&lt;code&gt;geographiclib&lt;/code&gt;，&lt;code&gt;gismo&lt;/code&gt;，&lt;code&gt;glpk&lt;/code&gt;
&lt;code&gt;gmp&lt;/code&gt;：大数库，&lt;code&gt;gnuplot&lt;/code&gt;：科学绘图，&lt;code&gt;graph-tool&lt;/code&gt;
&lt;code&gt;graphviz&lt;/code&gt;：图可视化，&lt;code&gt;hdf5&lt;/code&gt;，&lt;code&gt;hdf5-mpi&lt;/code&gt;
&lt;code&gt;highs&lt;/code&gt;，&lt;code&gt;hypre&lt;/code&gt;，&lt;code&gt;igraph&lt;/code&gt;
&lt;code&gt;kahip&lt;/code&gt;，&lt;code&gt;lapack&lt;/code&gt;：LAPACK，&lt;code&gt;lbfgspp&lt;/code&gt;
&lt;code&gt;lemon&lt;/code&gt;，&lt;code&gt;metis&lt;/code&gt;，&lt;code&gt;mpfr&lt;/code&gt;
&lt;code&gt;netcdf&lt;/code&gt;，&lt;code&gt;networkit&lt;/code&gt;，&lt;code&gt;nlopt&lt;/code&gt;
&lt;code&gt;octave&lt;/code&gt;：数值计算，&lt;code&gt;openblas&lt;/code&gt;：BLAS，&lt;code&gt;osi&lt;/code&gt;
&lt;code&gt;petsc&lt;/code&gt;，&lt;code&gt;proj&lt;/code&gt;，&lt;code&gt;quantlib&lt;/code&gt;
&lt;code&gt;s2geometry&lt;/code&gt;，&lt;code&gt;scalapack&lt;/code&gt;，&lt;code&gt;scip&lt;/code&gt;
&lt;code&gt;scipy&lt;/code&gt;，&lt;code&gt;scotch&lt;/code&gt;，&lt;code&gt;suite-sparse&lt;/code&gt;
&lt;code&gt;sundials&lt;/code&gt;，&lt;code&gt;ttmath&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;an-quan-yu-jia-mi-25&quot;&gt;安全与加密（25）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;argon2&lt;/code&gt;，&lt;code&gt;blake3&lt;/code&gt;，&lt;code&gt;botan&lt;/code&gt;
&lt;code&gt;cbmc&lt;/code&gt;：C 模型检查，&lt;code&gt;clamav&lt;/code&gt;，&lt;code&gt;cryptopp&lt;/code&gt;
&lt;code&gt;esbmc&lt;/code&gt;：BMC 验证，&lt;code&gt;flawfinder&lt;/code&gt;，&lt;code&gt;gnupg&lt;/code&gt;：GPG
&lt;code&gt;gnutls&lt;/code&gt;，&lt;code&gt;gpgme&lt;/code&gt;，&lt;code&gt;gpgmepp&lt;/code&gt;
&lt;code&gt;libgcrypt&lt;/code&gt;，&lt;code&gt;libsodium&lt;/code&gt;，&lt;code&gt;libssh&lt;/code&gt;
&lt;code&gt;libssh2&lt;/code&gt;，&lt;code&gt;mbedtls&lt;/code&gt;，&lt;code&gt;openssl@3&lt;/code&gt;
&lt;code&gt;openssl@4&lt;/code&gt;，&lt;code&gt;pass&lt;/code&gt;：密码管理，&lt;code&gt;pinentry&lt;/code&gt;
&lt;code&gt;secp256k1&lt;/code&gt;，&lt;code&gt;semgrep&lt;/code&gt;：静态安全扫描，&lt;code&gt;xxhash&lt;/code&gt;
&lt;code&gt;yara&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;wen-dang-yu-ban-gong-11&quot;&gt;文档与办公（11）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;doxygen&lt;/code&gt;：代码文档，&lt;code&gt;groff&lt;/code&gt;，&lt;code&gt;libxml++&lt;/code&gt;
&lt;code&gt;libxml2&lt;/code&gt;，&lt;code&gt;mermaid-cli&lt;/code&gt;：Mermaid 渲染，&lt;code&gt;pandoc&lt;/code&gt;：文档转换
&lt;code&gt;plantuml&lt;/code&gt;：UML 图，&lt;code&gt;pstoedit&lt;/code&gt;，&lt;code&gt;psutils&lt;/code&gt;
&lt;code&gt;texinfo&lt;/code&gt;，&lt;code&gt;xerces-c&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;xi-tong-yu-jian-kong-11&quot;&gt;系统与监控（11）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;coreutils&lt;/code&gt;：GNU 核心工具，&lt;code&gt;duf&lt;/code&gt;，&lt;code&gt;gawk&lt;/code&gt;：GNU awk
&lt;code&gt;gperftools&lt;/code&gt;：性能工具集，&lt;code&gt;moreutils&lt;/code&gt;：附加工具，&lt;code&gt;ncdu&lt;/code&gt;
&lt;code&gt;osx-cpu-temp&lt;/code&gt;，&lt;code&gt;samply&lt;/code&gt;：采样剖析，&lt;code&gt;tracy&lt;/code&gt;：性能剖析
&lt;code&gt;uutils-coreutils&lt;/code&gt;：Rust 版 coreutils，&lt;code&gt;valgrind&lt;/code&gt;：内存检测&lt;/p&gt;
&lt;h3 id=&quot;wen-ben-yu-shu-ju-chu-li-7&quot;&gt;文本与数据处理（7）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;jq&lt;/code&gt;：JSON 处理，&lt;code&gt;qhull&lt;/code&gt;，&lt;code&gt;qrencode&lt;/code&gt;
&lt;code&gt;qrupdate&lt;/code&gt;，&lt;code&gt;qscintilla2&lt;/code&gt;，&lt;code&gt;qtshadertools&lt;/code&gt;
&lt;code&gt;quantum++&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;kai-fa-gong-ju-za-xiang-13&quot;&gt;开发工具杂项（13）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;diu&lt;/code&gt;，&lt;code&gt;hyperfine&lt;/code&gt;：基准测试，&lt;code&gt;macpow&lt;/code&gt;
&lt;code&gt;merve&lt;/code&gt;，&lt;code&gt;mole&lt;/code&gt;，&lt;code&gt;paneru&lt;/code&gt;
&lt;code&gt;sag&lt;/code&gt;，&lt;code&gt;songsee&lt;/code&gt;，&lt;code&gt;summarize&lt;/code&gt;
&lt;code&gt;syswatch&lt;/code&gt;，&lt;code&gt;topgrade&lt;/code&gt;：一键升级，&lt;code&gt;watchman&lt;/code&gt;：文件监听
&lt;code&gt;zen-mode&lt;/code&gt;&lt;/p&gt;
&lt;h3 id=&quot;qi-ta-kai-fa-xi-tong-ku-227&quot;&gt;其他开发/系统库（227）&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;ada-url&lt;/code&gt;，&lt;code&gt;aklomp-base64&lt;/code&gt;，&lt;code&gt;alloy-analyzer&lt;/code&gt;
&lt;code&gt;ampl-asl&lt;/code&gt;，&lt;code&gt;aom&lt;/code&gt;，&lt;code&gt;apache-arrow&lt;/code&gt;
&lt;code&gt;apex&lt;/code&gt;，&lt;code&gt;apr&lt;/code&gt;，&lt;code&gt;apr-util&lt;/code&gt;
&lt;code&gt;async_simple&lt;/code&gt;，&lt;code&gt;asyncplusplus&lt;/code&gt;，&lt;code&gt;at-spi2-core&lt;/code&gt;
&lt;code&gt;autojump&lt;/code&gt;，&lt;code&gt;aws-c-auth&lt;/code&gt;，&lt;code&gt;aws-c-cal&lt;/code&gt;
&lt;code&gt;aws-c-common&lt;/code&gt;，&lt;code&gt;aws-c-compression&lt;/code&gt;，&lt;code&gt;aws-c-event-stream&lt;/code&gt;
&lt;code&gt;aws-c-http&lt;/code&gt;，&lt;code&gt;aws-c-io&lt;/code&gt;，&lt;code&gt;aws-c-mqtt&lt;/code&gt;
&lt;code&gt;aws-c-s3&lt;/code&gt;，&lt;code&gt;aws-c-sdkutils&lt;/code&gt;，&lt;code&gt;aws-checksums&lt;/code&gt;
&lt;code&gt;bash&lt;/code&gt;，&lt;code&gt;bc&lt;/code&gt;，&lt;code&gt;beecrypt&lt;/code&gt;
&lt;code&gt;bitwise&lt;/code&gt;，&lt;code&gt;bitwuzla&lt;/code&gt;，&lt;code&gt;boxes&lt;/code&gt;
&lt;code&gt;brew-gem&lt;/code&gt;，&lt;code&gt;bstring&lt;/code&gt;，&lt;code&gt;c-ares&lt;/code&gt;
&lt;code&gt;c4core&lt;/code&gt;，&lt;code&gt;ca-certificates&lt;/code&gt;，&lt;code&gt;cabin&lt;/code&gt;
&lt;code&gt;caddy&lt;/code&gt;，&lt;code&gt;caf&lt;/code&gt;，&lt;code&gt;ccrypt&lt;/code&gt;
&lt;code&gt;certifi&lt;/code&gt;，&lt;code&gt;cffi&lt;/code&gt;，&lt;code&gt;cgns&lt;/code&gt;
&lt;code&gt;chezmoi&lt;/code&gt;，&lt;code&gt;choose-rust&lt;/code&gt;，&lt;code&gt;chuck&lt;/code&gt;
&lt;code&gt;clblast&lt;/code&gt;，&lt;code&gt;cliamp&lt;/code&gt;，&lt;code&gt;cocoapods&lt;/code&gt;
&lt;code&gt;conan&lt;/code&gt;：C++ 包管理，&lt;code&gt;cryptography&lt;/code&gt;，&lt;code&gt;ctemplate&lt;/code&gt;
&lt;code&gt;dbus&lt;/code&gt;，&lt;code&gt;deheader&lt;/code&gt;，&lt;code&gt;doppler&lt;/code&gt;
&lt;code&gt;double-conversion&lt;/code&gt;，&lt;code&gt;dragonbox&lt;/code&gt;，&lt;code&gt;dwarfutils&lt;/code&gt;
&lt;code&gt;edencommon&lt;/code&gt;，&lt;code&gt;elio&lt;/code&gt;，&lt;code&gt;enet&lt;/code&gt;
&lt;code&gt;enkits&lt;/code&gt;，&lt;code&gt;epstool&lt;/code&gt;，&lt;code&gt;espeak-ng&lt;/code&gt;
&lt;code&gt;fastlane&lt;/code&gt;，&lt;code&gt;fb303&lt;/code&gt;，&lt;code&gt;fblog&lt;/code&gt;
&lt;code&gt;fbthrift&lt;/code&gt;，&lt;code&gt;fig2dev&lt;/code&gt;，&lt;code&gt;fizz&lt;/code&gt;
&lt;code&gt;flux&lt;/code&gt;，&lt;code&gt;folly&lt;/code&gt;，&lt;code&gt;freetds&lt;/code&gt;
&lt;code&gt;fribidi&lt;/code&gt;，&lt;code&gt;fruit&lt;/code&gt;，&lt;code&gt;functionalplus&lt;/code&gt;
&lt;code&gt;fuzzy-find&lt;/code&gt;，&lt;code&gt;gd&lt;/code&gt;，&lt;code&gt;gdb&lt;/code&gt;
&lt;code&gt;gdbm&lt;/code&gt;，&lt;code&gt;gdk-pixbuf&lt;/code&gt;，&lt;code&gt;gem-doing&lt;/code&gt;
&lt;code&gt;gettext&lt;/code&gt;，&lt;code&gt;gflags&lt;/code&gt;，&lt;code&gt;gl2ps&lt;/code&gt;
&lt;code&gt;glow&lt;/code&gt;，&lt;code&gt;gmssl&lt;/code&gt;，&lt;code&gt;gpk&lt;/code&gt;
&lt;code&gt;gputils&lt;/code&gt;，&lt;code&gt;graphite2&lt;/code&gt;，&lt;code&gt;grpc&lt;/code&gt;
&lt;code&gt;gsettings-desktop-schemas&lt;/code&gt;，&lt;code&gt;gsoap&lt;/code&gt;，&lt;code&gt;gts&lt;/code&gt;
&lt;code&gt;gumbo-parser&lt;/code&gt;，&lt;code&gt;gzip&lt;/code&gt;，&lt;code&gt;hdrhistogram_c&lt;/code&gt;
&lt;code&gt;helix&lt;/code&gt;，&lt;code&gt;hicolor-icon-theme&lt;/code&gt;，&lt;code&gt;howard-hinnant-date&lt;/code&gt;
&lt;code&gt;hwloc&lt;/code&gt;，&lt;code&gt;ical-buddy&lt;/code&gt;，&lt;code&gt;iguana&lt;/code&gt;
&lt;code&gt;include-what-you-use&lt;/code&gt;，&lt;code&gt;indicators&lt;/code&gt;，&lt;code&gt;ipopt&lt;/code&gt;
&lt;code&gt;isl&lt;/code&gt;，&lt;code&gt;jansson&lt;/code&gt;，&lt;code&gt;jasper&lt;/code&gt;
&lt;code&gt;jbig2dec&lt;/code&gt;，&lt;code&gt;jemalloc&lt;/code&gt;，&lt;code&gt;kfr&lt;/code&gt;
&lt;code&gt;krb5&lt;/code&gt;，&lt;code&gt;lager&lt;/code&gt;，&lt;code&gt;lame&lt;/code&gt;
&lt;code&gt;lcov&lt;/code&gt;，&lt;code&gt;ldns&lt;/code&gt;，&lt;code&gt;ledger&lt;/code&gt;
&lt;code&gt;litehtml&lt;/code&gt;，&lt;code&gt;llhttp&lt;/code&gt;，&lt;code&gt;lpeg&lt;/code&gt;
&lt;code&gt;luv&lt;/code&gt;，&lt;code&gt;m-cli&lt;/code&gt;，&lt;code&gt;mas&lt;/code&gt;
&lt;code&gt;matplotplusplus&lt;/code&gt;，&lt;code&gt;md4c&lt;/code&gt;，&lt;code&gt;meta-package-manager&lt;/code&gt;
&lt;code&gt;mfem&lt;/code&gt;，&lt;code&gt;mimalloc&lt;/code&gt;，&lt;code&gt;mpdecimal&lt;/code&gt;
&lt;code&gt;mujs&lt;/code&gt;，&lt;code&gt;mvfst&lt;/code&gt;，&lt;code&gt;nativefiledialog-extended&lt;/code&gt;
&lt;code&gt;nbytes&lt;/code&gt;，&lt;code&gt;ncurses&lt;/code&gt;，&lt;code&gt;neovim&lt;/code&gt;
&lt;code&gt;net-snmp&lt;/code&gt;，&lt;code&gt;netpbm&lt;/code&gt;，&lt;code&gt;nettle&lt;/code&gt;
&lt;code&gt;nginx&lt;/code&gt;，&lt;code&gt;nng&lt;/code&gt;，&lt;code&gt;nowplaying-cli&lt;/code&gt;
&lt;code&gt;npth&lt;/code&gt;，&lt;code&gt;nspr&lt;/code&gt;，&lt;code&gt;nss&lt;/code&gt;
&lt;code&gt;numpy&lt;/code&gt;，&lt;code&gt;nuraft&lt;/code&gt;，&lt;code&gt;onedpl&lt;/code&gt;
&lt;code&gt;oniguruma&lt;/code&gt;，&lt;code&gt;open-mpi&lt;/code&gt;，&lt;code&gt;openldap&lt;/code&gt;
&lt;code&gt;or-tools&lt;/code&gt;，&lt;code&gt;oterm&lt;/code&gt;，&lt;code&gt;p11-kit&lt;/code&gt;
&lt;code&gt;pcre2&lt;/code&gt;，&lt;code&gt;physunits&lt;/code&gt;，&lt;code&gt;pillow&lt;/code&gt;
&lt;code&gt;pipx&lt;/code&gt;：Python 应用隔离安装，&lt;code&gt;pixman&lt;/code&gt;，&lt;code&gt;plotutils&lt;/code&gt;
&lt;code&gt;pmix&lt;/code&gt;，&lt;code&gt;popt&lt;/code&gt;，&lt;code&gt;portaudio&lt;/code&gt;
&lt;code&gt;pre-commit&lt;/code&gt;，&lt;code&gt;protobuf&lt;/code&gt;，&lt;code&gt;protobuf-c&lt;/code&gt;
&lt;code&gt;proxygen&lt;/code&gt;，&lt;code&gt;prrte&lt;/code&gt;，&lt;code&gt;pv&lt;/code&gt;
&lt;code&gt;py3cairo&lt;/code&gt;，&lt;code&gt;pycparser&lt;/code&gt;，&lt;code&gt;pydantic&lt;/code&gt;
&lt;code&gt;pyenv&lt;/code&gt;，&lt;code&gt;pygobject3&lt;/code&gt;，&lt;code&gt;pyinstaller&lt;/code&gt;
&lt;code&gt;re2&lt;/code&gt;，&lt;code&gt;readline&lt;/code&gt;，&lt;code&gt;remindctl&lt;/code&gt;
&lt;code&gt;rm-safely&lt;/code&gt;，&lt;code&gt;rpds-py&lt;/code&gt;，&lt;code&gt;rsync&lt;/code&gt;
&lt;code&gt;rttr&lt;/code&gt;，&lt;code&gt;s2n&lt;/code&gt;，&lt;code&gt;sentry-native&lt;/code&gt;
&lt;code&gt;seqan3&lt;/code&gt;，&lt;code&gt;serialize&lt;/code&gt;，&lt;code&gt;sevenzip&lt;/code&gt;
&lt;code&gt;shared-mime-info&lt;/code&gt;，&lt;code&gt;sl&lt;/code&gt;，&lt;code&gt;sleepwatcher&lt;/code&gt;
&lt;code&gt;span-lite&lt;/code&gt;，&lt;code&gt;spark&lt;/code&gt;，&lt;code&gt;stow&lt;/code&gt;
&lt;code&gt;superlu&lt;/code&gt;，&lt;code&gt;tcpdump&lt;/code&gt;，&lt;code&gt;television&lt;/code&gt;
&lt;code&gt;telnet&lt;/code&gt;，&lt;code&gt;terminal-notifier&lt;/code&gt;，&lt;code&gt;theora&lt;/code&gt;
&lt;code&gt;thrift&lt;/code&gt;，&lt;code&gt;tidy-html5&lt;/code&gt;，&lt;code&gt;tlrc&lt;/code&gt;
&lt;code&gt;tlx&lt;/code&gt;，&lt;code&gt;tomcat&lt;/code&gt;，&lt;code&gt;trash&lt;/code&gt;
&lt;code&gt;tre&lt;/code&gt;，&lt;code&gt;tree&lt;/code&gt;，&lt;code&gt;uchardet&lt;/code&gt;
&lt;code&gt;udunits&lt;/code&gt;，&lt;code&gt;unbound&lt;/code&gt;，&lt;code&gt;unibilium&lt;/code&gt;
&lt;code&gt;unixodbc&lt;/code&gt;，&lt;code&gt;usbutils&lt;/code&gt;，&lt;code&gt;userspace-rcu&lt;/code&gt;
&lt;code&gt;utf8proc&lt;/code&gt;，&lt;code&gt;uv&lt;/code&gt;：Python 包管理，&lt;code&gt;uvwasi&lt;/code&gt;
&lt;code&gt;vapoursynth&lt;/code&gt;，&lt;code&gt;vcpkg&lt;/code&gt;：C++ 包管理，&lt;code&gt;vim&lt;/code&gt;
&lt;code&gt;wangle&lt;/code&gt;，&lt;code&gt;websocketpp&lt;/code&gt;，&lt;code&gt;xcbeautify&lt;/code&gt;
&lt;code&gt;xorgproto&lt;/code&gt;，&lt;code&gt;yyjson&lt;/code&gt;，&lt;code&gt;z3&lt;/code&gt;
&lt;code&gt;zimg&lt;/code&gt;，&lt;code&gt;zola&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&quot;4-fei-homebrew-ming-ling-an-lai-yuan&quot;&gt;4. 非 Homebrew 命令（按来源）&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;来源&lt;/th&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.ghcup/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;ghc&lt;/code&gt;, &lt;code&gt;cabal&lt;/code&gt;, &lt;code&gt;ghcup&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Haskell 工具链（ghcup 管理）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.cargo/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cargo&lt;/code&gt;, &lt;code&gt;cargo-clippy&lt;/code&gt;, &lt;code&gt;cargo-fmt&lt;/code&gt;, &lt;code&gt;cargo-miri&lt;/code&gt;, &lt;code&gt;cargo-install-update&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Rust 构建/检查/格式化（rustup 管理）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/Jai/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;jai&lt;/code&gt;, &lt;code&gt;jai-macos&lt;/code&gt;, &lt;code&gt;lld&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Jai 编译器（内测）与配套链接器&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.elan/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;elan&lt;/code&gt;, &lt;code&gt;lean&lt;/code&gt;, &lt;code&gt;lake&lt;/code&gt;, &lt;code&gt;leanc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Lean 证明助手工具链&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.mcpp/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;mcpp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;C 预处理器（可移植实现）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.local/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;clop&lt;/code&gt;, &lt;code&gt;focr&lt;/code&gt;, &lt;code&gt;mpm&lt;/code&gt;, &lt;code&gt;pdf2zh&lt;/code&gt;, &lt;code&gt;rcc&lt;/code&gt;, &lt;code&gt;rcmd&lt;/code&gt;&lt;/td&gt;&lt;td&gt;pipx 安装的 Python 工具（含 OCR/PDF 翻译）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.craft/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;craft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;C/C++ 轻量构建工作流工具&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.cache/lm-studio/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;lm-studio 相关&lt;/td&gt;&lt;td&gt;LM Studio 本地模型辅助脚本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/usr/local/bin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;container&lt;/code&gt;, &lt;code&gt;update-container.sh&lt;/code&gt; 等&lt;/td&gt;&lt;td&gt;手动安装的 macOS 容器/更新脚本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/Applications/iTerm.app/.../utilities&lt;/code&gt;&lt;/td&gt;&lt;td&gt;iTerm 集成工具&lt;/td&gt;&lt;td&gt;终端模拟器自带工具&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;5-macos-xi-tong-ming-ling-jian-biao&quot;&gt;5. macOS 系统命令简表&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;分组&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;示例&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;ls/cp/mv/rm/mkdir&lt;/td&gt;&lt;td&gt;文件与目录基本操作&lt;/td&gt;&lt;td&gt;&lt;code&gt;ls -lah &amp;amp;&amp;amp; mkdir -p dir &amp;amp;&amp;amp; cp -R src dst&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;cat/less/head/tail&lt;/td&gt;&lt;td&gt;查看文件&lt;/td&gt;&lt;td&gt;&lt;code&gt;less big.log &amp;amp;&amp;amp; tail -f app.log&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;grep/find/xargs&lt;/td&gt;&lt;td&gt;搜索与批处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;grep -rn &#39;TODO&#39; src &amp;amp;&amp;amp; find . -name &#39;*.cpp&#39; | xargs wc -l&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;sed/awk(→gawk)&lt;/td&gt;&lt;td&gt;流式文本处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;sed -i &#39;s/old/new/g&#39; f.txt&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;sort/uniq/wc/cut/tr&lt;/td&gt;&lt;td&gt;文本管道处理&lt;/td&gt;&lt;td&gt;&lt;code&gt;cut -d, -f1 data.csv | sort | uniq -c&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;tar/gzip/bzip2/xz/zip&lt;/td&gt;&lt;td&gt;压缩归档&lt;/td&gt;&lt;td&gt;&lt;code&gt;tar -czf out.tgz dir/ &amp;amp;&amp;amp; unzip a.zip&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;chmod/chown&lt;/td&gt;&lt;td&gt;权限管理&lt;/td&gt;&lt;td&gt;&lt;code&gt;chmod +x script.sh &amp;amp;&amp;amp; chown -R user:staff dir&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ps/kill/top&lt;/td&gt;&lt;td&gt;进程管理&lt;/td&gt;&lt;td&gt;&lt;code&gt;ps aux | rg nvim &amp;amp;&amp;amp; kill -9 PID&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;df/du&lt;/td&gt;&lt;td&gt;磁盘占用&lt;/td&gt;&lt;td&gt;&lt;code&gt;df -h &amp;amp;&amp;amp; du -sh ~/* | sort -h&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;diskutil/mount&lt;/td&gt;&lt;td&gt;磁盘与挂载&lt;/td&gt;&lt;td&gt;&lt;code&gt;diskutil list &amp;amp;&amp;amp; diskutil info disk3&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;defaults/plutil&lt;/td&gt;&lt;td&gt;macOS 偏好与 plist&lt;/td&gt;&lt;td&gt;&lt;code&gt;defaults read com.apple.dock &amp;amp;&amp;amp; plutil -p Info.plist&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;launchctl&lt;/td&gt;&lt;td&gt;守护进程管理&lt;/td&gt;&lt;td&gt;&lt;code&gt;launchctl list | rg brew &amp;amp;&amp;amp; brew services list&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;scutil/networksetup&lt;/td&gt;&lt;td&gt;网络配置&lt;/td&gt;&lt;td&gt;&lt;code&gt;scutil --proxy &amp;amp;&amp;amp; networksetup -listallhardwareports&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;system_profiler/sw_vers&lt;/td&gt;&lt;td&gt;系统信息&lt;/td&gt;&lt;td&gt;&lt;code&gt;system_profiler SPHardwareDataType &amp;amp;&amp;amp; sw_vers&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;xcode-select/xcrun&lt;/td&gt;&lt;td&gt;开发工具链选择&lt;/td&gt;&lt;td&gt;&lt;code&gt;xcode-select -p &amp;amp;&amp;amp; xcrun --show-sdk-path&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;codesign/security&lt;/td&gt;&lt;td&gt;签名与钥匙串&lt;/td&gt;&lt;td&gt;&lt;code&gt;codesign -dv App.app &amp;amp;&amp;amp; security find-certificate -c &#39;Apple Dev&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ssh/scp/rsync&lt;/td&gt;&lt;td&gt;远程与同步&lt;/td&gt;&lt;td&gt;&lt;code&gt;ssh host &amp;amp;&amp;amp; scp f.txt host: &amp;amp;&amp;amp; rsync -avz dir/ host:dir/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;ping/traceroute/curl&lt;/td&gt;&lt;td&gt;网络诊断&lt;/td&gt;&lt;td&gt;&lt;code&gt;ping -c 3 host &amp;amp;&amp;amp; traceroute host&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;lsof/netstat/ifconfig&lt;/td&gt;&lt;td&gt;端口与接口&lt;/td&gt;&lt;td&gt;&lt;code&gt;lsof -iTCP:8000 &amp;amp;&amp;amp; netstat -rn &amp;amp;&amp;amp; ifconfig en0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;open/osascript/say&lt;/td&gt;&lt;td&gt;macOS 集成&lt;/td&gt;&lt;td&gt;&lt;code&gt;open -a Safari &amp;amp;&amp;amp; osascript -e &#39;beep&#39; &amp;amp;&amp;amp; say hello&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;mdfind/mdls&lt;/td&gt;&lt;td&gt;Spotlight 索引&lt;/td&gt;&lt;td&gt;&lt;code&gt;mdfind &#39;kMDItemFSName == *.cpp&#39; &amp;amp;&amp;amp; mdls file&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;file/strings/otool/nm&lt;/td&gt;&lt;td&gt;二进制分析&lt;/td&gt;&lt;td&gt;&lt;code&gt;file a.out &amp;amp;&amp;amp; strings a.out | rg pass &amp;amp;&amp;amp; otool -L a.out&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;pbcopy/pbpaste&lt;/td&gt;&lt;td&gt;剪贴板&lt;/td&gt;&lt;td&gt;&lt;code&gt;pwd | pbcopy &amp;amp;&amp;amp; pbpaste&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;sips/textutil&lt;/td&gt;&lt;td&gt;图像/文档小工具&lt;/td&gt;&lt;td&gt;&lt;code&gt;sips -Z 800 in.png --out out.png &amp;amp;&amp;amp; textutil -convert html a.rtf&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;shasum/md5&lt;/td&gt;&lt;td&gt;校验和&lt;/td&gt;&lt;td&gt;&lt;code&gt;shasum -a 256 file.dmg&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;defaults/plutil&lt;/td&gt;&lt;td&gt;配置读写&lt;/td&gt;&lt;td&gt;&lt;code&gt;defaults write com.apple.finder AppleShowAllFiles YES&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;6-fu-lu-yuan-shi-shu-ju-yu-fu-xian&quot;&gt;6. 附录：原始数据与复现&lt;/h2&gt;
&lt;p&gt;原始命令清单（4271 行）已归档为 &lt;code&gt;commands-full-list.txt&lt;/code&gt;，与本文档同目录。复现命令：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;commands&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; while&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  print&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;whence&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;  $&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;done&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; commands-full-list.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-formula&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;提示：&lt;code&gt;whence -p&lt;/code&gt; 对 zsh 内建/别名/函数返回空路径，因此清单中含少量非可执行条目，统计时已单独归组。&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zsh 配置体系体检与优化：启动链路分析</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/zsh-config-optimization/"/>
        <id>https://suchaharcan.github.io/03Share_blog/zsh-config-optimization/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/zsh-config-optimization/">&lt;h1 id=&quot;zsh-pei-zhi-ti-xi-ti-jian-yu-you-hua-qi-dong-lian-lu-fen-xi&quot;&gt;Zsh 配置体系体检与优化：启动链路分析&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;TL;DR：本机 &lt;code&gt;zsh -i&lt;/code&gt; 启动实测 &lt;strong&gt;~715ms → 仅移除「每次启动自动运行 fortune|lolcat|cowsay」一项即降到 ~271ms（快 2.4 倍）&lt;/strong&gt;。其余慢点集中在 compinit/compaudit 补全扫描，已通过 &lt;code&gt;ZSH_DISABLE_COMPFIX&lt;/code&gt;、去重重复加载、清理死配置进一步收敛。全部优化不损失任何功能，改动均带 &lt;code&gt;[OPT]&lt;/code&gt; 标记。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-pei-zhi-ti-xi-di-tu&quot;&gt;1. 配置体系地图&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; TD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    A&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zsh 启动&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; B&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.zshenv&amp;lt;br/&amp;gt;cargo env&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    B &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; C&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.zprofile&amp;lt;br/&amp;gt;仅登录 shell&amp;lt;br/&amp;gt;brew shellenv / OrbStack / pipx&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    C &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; D&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.zshrc&amp;lt;br/&amp;gt;交互式 shell&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    D &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; E&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p10k instant prompt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    E &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; F&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;brew shellenv&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    F &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; G&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Oh My Zsh 框架&amp;lt;br/&amp;gt;plugins: z git history brew sudo ...&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    G &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; H&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.zsh/paths 细分路径&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    H &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; I&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span&gt;~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.zsh/functions 自定义函数&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    I &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; J&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;compinit 补全初始化&amp;lt;br/&amp;gt;最大开销所在&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    J &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; K&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zsh&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;autocomplete + fzf&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tab&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    K &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; L&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;别名 / Vi 模式 / 历史&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    L &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; M&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p10k 主题&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    M &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; N&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span&gt;❌&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 旧版&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;每日箴言自动运行&amp;lt;br/&amp;gt;&lt;/span&gt;&lt;span&gt;✅&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 优化版&lt;/span&gt;&lt;span&gt;：&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;改为按需 qotd&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;)]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;2-qi-dong-hao-shi-gou-cheng-shi-ce&quot;&gt;2. 启动耗时构成（实测）&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;实测环境&lt;/strong&gt;：&lt;code&gt;hyperfine --warmup 2 --runs 5 &#39;zsh -i -c exit&#39;&lt;/code&gt;；耗时追踪用 &lt;code&gt;zsh -ixc exit 2&amp;gt;&amp;amp;1 | ts -i &#39;%.s&#39; | sort -rn | head -20&lt;/code&gt;。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;版本&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;平均启动耗时&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;用户态&lt;/th&gt;&lt;th style=&quot;text-align: right&quot;&gt;系统态&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;优化前（原始 .zshrc）&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;714.9 ms&lt;/strong&gt;（次轮 652.3 ms）&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;272.7 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;387.7 ms&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;仅移除自动每日箴言&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;&lt;strong&gt;270.9 ms&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;123.0 ms&lt;/td&gt;&lt;td style=&quot;text-align: right&quot;&gt;120.7 ms&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;启动耗时分布（估算，基于 -x 追踪与进程数）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;compinit/compaudit 补全扫描  ██████████████████████████  约 60-70%（系统态高）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;每日箴言 fortune|lolcat|cowsay ████████                    约 20-25%（3 个子进程）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Oh My Zsh + p10k + 其余       ████                        约 10-15%&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;pie&lt;/span&gt;&lt;span&gt; title 优化前启动耗时构成（估算）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    &amp;quot;compinit/compaudit 扫描&amp;quot; &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt; 65&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    &amp;quot;每日箴言 3 进程&amp;quot; &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt; 22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    &amp;quot;OMZ + p10k + 其他&amp;quot; &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt; 13&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;说明：测试沙箱中无法写入 &lt;code&gt;~/.zcompdump&lt;/code&gt;，两次对比都走了 compinit 全量扫描路径，因此绝对数值偏大、但&lt;strong&gt;相对节省量真实可信&lt;/strong&gt;。你本机有正常缓存时，优化后的实际数值会更低。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;3-you-hua-dian-qing-dan&quot;&gt;3. 优化点清单&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;#&lt;/th&gt;&lt;th&gt;优化点&lt;/th&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;影响&lt;/th&gt;&lt;th&gt;处理&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;每日箴言自动运行&lt;/td&gt;&lt;td&gt;每次开 shell 都 fork &lt;code&gt;fortune | lolcat | cowsay&lt;/code&gt; 3 个子进程&lt;/td&gt;&lt;td&gt;&lt;strong&gt;实测省 ~380ms（启动减半以上）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;改为按需函数 &lt;code&gt;qotd()&lt;/code&gt;，&lt;code&gt;# qotd&lt;/code&gt; 注释即恢复&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;compaudit 安全扫描&lt;/td&gt;&lt;td&gt;冷启动时对 2000+ 补全文件做权限审计（追踪 TOP 慢点全在这）&lt;/td&gt;&lt;td&gt;冷启动数百 ms&lt;/td&gt;&lt;td&gt;&lt;code&gt;export ZSH_DISABLE_COMPFIX=true&lt;/code&gt;（OMZ 官方支持，可一键还原）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;ghcup env 加载 3 次&lt;/td&gt;&lt;td&gt;&lt;code&gt;.zshrc&lt;/code&gt; 顶部 + 底部 + &lt;code&gt;env_path.sh&lt;/code&gt; 各一次&lt;/td&gt;&lt;td&gt;重复 IO 与 PATH 追加&lt;/td&gt;&lt;td&gt;统一收敛到 &lt;code&gt;~/.zsh/paths/env_path.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;direnv hook 加载 2 次&lt;/td&gt;&lt;td&gt;&lt;code&gt;.zshrc&lt;/code&gt; 底部与 &lt;code&gt;env_path.sh&lt;/code&gt; 重复 eval&lt;/td&gt;&lt;td&gt;双倍 hook 开销&lt;/td&gt;&lt;td&gt;保留 &lt;code&gt;env_path.sh&lt;/code&gt; 一份&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;perl5 环境块 2 份&lt;/td&gt;&lt;td&gt;&lt;code&gt;.zshrc&lt;/code&gt; 底部与 &lt;code&gt;env_path.sh&lt;/code&gt; 重复&lt;/td&gt;&lt;td&gt;重复 export&lt;/td&gt;&lt;td&gt;保留 &lt;code&gt;env_path.sh&lt;/code&gt; 一份&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;补全 menu zstyle 冲突&lt;/td&gt;&lt;td&gt;先 &lt;code&gt;menu select&lt;/code&gt; 后 &lt;code&gt;menu no&lt;/code&gt;，后者覆盖前者，死配置&lt;/td&gt;&lt;td&gt;无功能损失但易误导&lt;/td&gt;&lt;td&gt;只保留 fzf-tab 需要的 &lt;code&gt;menu no&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;autosuggestions 死变量&lt;/td&gt;&lt;td&gt;&lt;code&gt;ZSH_AUTOSUGGEST_*&lt;/code&gt; 已设置，但插件从未加载&lt;/td&gt;&lt;td&gt;无效配置&lt;/td&gt;&lt;td&gt;注释保留，附启用说明&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;&lt;code&gt;alias .. =cd ..&lt;/code&gt; 空格 bug&lt;/td&gt;&lt;td&gt;等号两侧有空格，别名实际不生效&lt;/td&gt;&lt;td&gt;&lt;code&gt;..&lt;/code&gt; 回上级目录失效&lt;/td&gt;&lt;td&gt;修正为 &lt;code&gt;alias ..=&#39;cd ..&#39;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;历史策略冲突&lt;/td&gt;&lt;td&gt;&lt;code&gt;appendhistory&lt;/code&gt; 与 OMZ 的 &lt;code&gt;INC_APPEND_HISTORY&lt;/code&gt; 冲突&lt;/td&gt;&lt;td&gt;历史追加行为不确定&lt;/td&gt;&lt;td&gt;统一为 &lt;code&gt;INC_APPEND_HISTORY SHARE_HISTORY&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;&lt;code&gt;echo&lt;/code&gt; 改 &lt;code&gt;print -n&lt;/code&gt;&lt;/td&gt;&lt;td&gt;precmd/preexec 用 echo 输出光标控制序列&lt;/td&gt;&lt;td&gt;闪烁与额外开销&lt;/td&gt;&lt;td&gt;改用 &lt;code&gt;print -n&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;autojump 残留加载&lt;/td&gt;&lt;td&gt;&lt;code&gt;/usr/local/etc/profile.d/autojump.sh&lt;/code&gt; 是 Intel 时代路径（本机不存在），OMZ 插件已覆盖&lt;/td&gt;&lt;td&gt;死代码&lt;/td&gt;&lt;td&gt;移除&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;已经做得很好的部分（保留不动）&lt;/strong&gt;：nvm 懒加载、kubectl 懒补全、&lt;code&gt;.zcompdump&lt;/code&gt; 24 小时缓存策略、&lt;code&gt;typeset -U path fpath&lt;/code&gt; 去重、p10k instant prompt。这些是标准做法，无需改动。&lt;/p&gt;
&lt;h2 id=&quot;4-fu-xian-yu-yan-zheng&quot;&gt;4. 复现与验证&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1. 启动耗时基准&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;hyperfine&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-warmup&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zsh -i -c exit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2. 定位启动慢点（Top 20）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zsh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;ixc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; exit&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; ts&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%.s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;rn&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; head&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3. 精确分析（zprof）：临时在 .zshrc 顶部打开 zmodload zsh/zprof，底部执行 zprof&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zmodload&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zsh/zprof&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 顶部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zprof&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 底部，退出前输出耗时表&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;5-ying-yong-you-hua-san-bu-zou&quot;&gt;5. 应用优化（三步走）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 0) 备份&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc.bak-20260811&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1) 用优化版替换（文件在 outputs/zshrc.optimized；先 diff 确认差异）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;diff&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/zshrc.optimized&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; less&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/zshrc.optimized&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zshrc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2) 重建补全缓存并重启&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.zcompdump&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; exec&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zsh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3) 验证：功能检查 + 启动时间复测&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zsh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;ixc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; exit&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&amp;amp;1&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; ts&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%.s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sort&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;rn&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; head&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;hyperfine&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-warmup&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zsh -i -c exit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;想完全还原：&lt;code&gt;cp ~/.zshrc.bak-20260811 ~/.zshrc &amp;amp;&amp;amp; exec zsh&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;6-qi-ta-wen-jian-de-xiao-gai-ke-xuan&quot;&gt;6. 其他文件的小改（可选）&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;修改&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.zsh/paths/env_path.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;LC_ALL=&quot;en_US.UTF-8&quot;&lt;/code&gt; 重复两行，删一行&lt;/td&gt;&lt;td&gt;重复赋值&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.zsh/paths/env_path.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;HOMEBREW_SSL_NO_VERIFY=1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;⚠️ 安全项：关闭了 Homebrew 全部 TLS 证书校验。若 USTC 镜像证书正常，建议删除并实测 &lt;code&gt;brew update&lt;/code&gt;；若必须保留，至少知晓风险&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;~/.zsh/paths/lang_rust.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;其中的 &lt;code&gt;source ~/.cargo/env&lt;/code&gt; 与 &lt;code&gt;.zshenv&lt;/code&gt; 重复&lt;/td&gt;&lt;td&gt;重复加载；保留 &lt;code&gt;.zshenv&lt;/code&gt; 一份即可（非交互 shell 也需要）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;7-jie-lun&quot;&gt;7. 结论&lt;/h2&gt;
&lt;p&gt;本次优化&lt;strong&gt;没有删除任何功能&lt;/strong&gt;：箴言变成按需调用、补全冲突收敛、重复加载去重、两处 bug 修复。核心收益在启动速度：实测单项优化即可把 715ms 压到 271ms，叠加 compinit 与去重优化后预期进入 &lt;strong&gt;200ms 以内&lt;/strong&gt;（以你机器 zprof 实测为准）。优化后的 &lt;code&gt;.zshrc&lt;/code&gt; 全文与原始版 diff 已随文档归档，可随时对照或还原。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2026-08-11 下午 计划</title>
        <published>2026-08-11T00:00:00+00:00</published>
        <updated>2026-08-11T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/wan-shang/"/>
        <id>https://suchaharcan.github.io/kanban/wan-shang/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/wan-shang/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h1 id=&quot;jin-xing-zhong&quot;&gt;进行中&lt;/h1&gt;
&lt;h1 id=&quot;yi-wan-cheng&quot;&gt;已完成&lt;/h1&gt;
&lt;h2 id=&quot;bo-ke-re-li-tu-die-dai&quot;&gt;博客- 热力图 迭代&lt;/h2&gt;
&lt;p&gt;@start 2026-08-11
@due 2026-08-11
@priority 3
@goal complete
@labels orange, sky
@bg orange
@top orange
@cover full&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
222&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
3333&lt;/li&gt;
&lt;/ul&gt;
&lt;ol&gt;
&lt;li&gt;修复 单日多博客 可滚动选择跳转问题&lt;/li&gt;
&lt;li&gt;更新最后一个单元格 为 当日, 往前获取 近35天内博客数据&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;bo-ke-kan-ban-die-dai&quot;&gt;博客-看板 迭代&lt;/h2&gt;
&lt;p&gt;@start 2026-08-11
@due 2026-08-11
@priority 1
@goal complete
@bg red
@top sky&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;看板仿 Trello&lt;/li&gt;
&lt;li&gt;置顶功能 搁置, 似乎实现不了 ?&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;jin-du&quot;&gt;进度&lt;/h1&gt;
&lt;h2 id=&quot;08-11-zhou-er&quot;&gt;08-11 周二&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
验证01&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
验证0222&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;zi-yuan&quot;&gt;资源&lt;/h1&gt;
&lt;h1 id=&quot;mu-biao&quot;&gt;目标&lt;/h1&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Homebrew 回退到历史版本：以 zola 0.22.1 为例</title>
        <published>2026-08-06T00:00:00+00:00</published>
        <updated>2026-08-06T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-zola-0-22-1-rollback/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-zola-0-22-1-rollback/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-zola-0-22-1-rollback/">&lt;h1 id=&quot;homebrew-hui-tui-dao-li-shi-ban-ben-yi-zola-0-22-1-wei-li&quot;&gt;Homebrew 回退到历史版本：以 zola 0.22.1 为例&lt;/h1&gt;
&lt;p&gt;TL;DR: 任何包管理器装“旧版本“都只能是固定快照——apt 装旧包、Homebrew 装历史公式都一样，因为 &lt;code&gt;homebrew/core&lt;/code&gt; 里的 zola 永远只有最新版，旧版本天然无法“自动升级“。正确的姿势是：&lt;strong&gt;装旧版时用本地 tap 装历史公式，想升级时切回 core 的新公式&lt;/strong&gt;，两步就回来了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-bei-jing-wei-shen-me-yao-hui-tui&quot;&gt;1. 背景：为什么要回退&lt;/h2&gt;
&lt;p&gt;zola 0.23.0 是破坏性版本（Tera v2：宏 / 短代码被替换为组件语法）。如果正在使用的主题（如 Ametrine）还没适配 0.23，站点会直接构建失败：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR Failed to render page content of ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ERROR Reason: error: `load_data`: ... doesn&amp;#39;t exist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;此时最稳妥的做法是暂时留在 0.22.1，等主题适配后再升级。&lt;/p&gt;
&lt;h2 id=&quot;2-wei-shen-me-bu-neng-zhi-jie-brew-install-jiu-ban-ben&quot;&gt;2. 为什么不能直接 &lt;code&gt;brew install&lt;/code&gt; 旧版本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;homebrew/core&lt;/code&gt; 的每个公式只有一个定义，永远指向最新稳定版，没有 &lt;code&gt;zola@0.22.1&lt;/code&gt; 这种版本化公式；&lt;/li&gt;
&lt;li&gt;旧版本公式只存在于 homebrew-core 的 git 历史中，需要“捞“出来；&lt;/li&gt;
&lt;li&gt;新版 Homebrew 不允许直接安装游离的本地 &lt;code&gt;.rb&lt;/code&gt;（&lt;code&gt;brew install ./zola.rb&lt;/code&gt; 会报 &lt;code&gt;Homebrew requires formulae to be in a tap&lt;/code&gt;）；&lt;/li&gt;
&lt;li&gt;Homebrew 官方推荐的做法是 &lt;code&gt;brew extract&lt;/code&gt; 到自己的 tap；本文用手动方式做等价操作，每一步都看得见。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-hui-tui-an-zhuang-zola-0-22-1&quot;&gt;3. 回退：安装 zola 0.22.1&lt;/h2&gt;
&lt;h3 id=&quot;3-1-cong-homebrew-core-li-shi-qu-gong-shi-wen-jian&quot;&gt;3.1 从 homebrew-core 历史取公式文件&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;Formula/z/zola.rb&lt;/code&gt; 在提交 &lt;code&gt;da70294&lt;/code&gt; 时对应 0.22.1（公式里 &lt;code&gt;url&lt;/code&gt; 为 v0.22.1.tar.gz，&lt;code&gt;sha256&lt;/code&gt; 为 &lt;code&gt;0f59479e…&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/Downloads&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;fsSL&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola.rb&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://raw.githubusercontent.com/Homebrew/homebrew-core/da702940397d32e261f7e1a577555f7d49929a31/Formula/z/zola.rb&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-fang-jin-ben-di-tap-zai-an-zhuang&quot;&gt;3.2 放进本地 tap 再安装&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tap-new&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-no-git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; local/zola-old&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;TAP_DIR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Library/Taps/local/homebrew-zola-old&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;TAP_DIR&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Formula&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cp&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/Downloads/zola.rb&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;TAP_DIR&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Formula/zola.rb&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; local/zola-old/zola&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; pin&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;验证：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-version&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; zola 0.22.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-versions&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;几点说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;公式自带 bottle（arm64 Tahoe/Sequoia/Sonoma 等），匹配的 macOS 直接下载预编译包；其他平台自动走源码编译（会自动装 rust，稍慢）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;brew pin zola&lt;/code&gt; 防止手滑 &lt;code&gt;brew upgrade&lt;/code&gt; 把 zola 升走；&lt;/li&gt;
&lt;li&gt;公式的 url/sha256 指向官方 v0.22.1 源码包，来源可靠。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-3-bei-xuan-wan-quan-bu-guan-brew-de-lin-shi-fang-an&quot;&gt;3.3 备选：完全不管 brew 的临时方案&lt;/h3&gt;
&lt;p&gt;如果旧版只是临时用一下、之后 brew 永远保持最新版，也可以直接放官方二进制到 &lt;code&gt;~/.local/bin&lt;/code&gt;（这条脱离 brew 管理，不适合“想统一用 brew 管理“的需求）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/Downloads&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;OL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; https://github.com/getzola/zola/releases/download/v0.22.1/zola-v0.22.1-aarch64-apple-darwin.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;tar&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;xzf&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola-v0.22.1-aarch64-apple-darwin.tar.gz&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.local/bin&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; mv&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/.local/bin/zola&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;（Intel 机器把文件名换成 &lt;code&gt;zola-v0.22.1-x86_64-apple-darwin.tar.gz&lt;/code&gt;）&lt;/p&gt;
&lt;h2 id=&quot;4-sheng-ji-qie-hui-zui-xin-ban&quot;&gt;4. 升级：切回最新版&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; unpin&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; untap&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; local/zola-old&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; upgrade&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 从 homebrew/core 拿最新版&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;万一 &lt;code&gt;upgrade&lt;/code&gt; 有残留报错：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; uninstall&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; “升级能力“没有丢，只是它不在旧版本快照里，而在“随时可以切回 core“这个动作里。这正是 Homebrew 官方对“安装旧版本“的标准做法（&lt;code&gt;brew extract&lt;/code&gt; 到自己的 tap），手动复制 &lt;code&gt;.rb&lt;/code&gt; 只是等价实现。&lt;/p&gt;
&lt;h2 id=&quot;5-he-shi-sheng-ji-deng-zhu-ti-wan-quan-zhi-chi-0-23-0&quot;&gt;5. 何时升级：等主题完全支持 0.23.0&lt;/h2&gt;
&lt;p&gt;zola 0.23.0 属于破坏性版本，主题需要把旧的宏 / 短代码迁移到新组件语法才能兼容。在正在使用的 Zola 主题（如 Ametrine）&lt;strong&gt;完全支持 0.23.0 之前&lt;/strong&gt;，建议保持 0.22.1 不要升级；等主题适配完成、站点用 0.23.x 构建无报错后，再执行第 4 节的升级命令。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake 未来项目 预研内容 </title>
        <published>2026-07-28T00:00:00+00:00</published>
        <updated>2026-07-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CMake/cmake-project-fix/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CMake/cmake-project-fix/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CMake/cmake-project-fix/">&lt;p&gt;在 macOS 平台上使用 &lt;strong&gt;LLVM/Clang + CMake&lt;/strong&gt; 构建中大型 C++ 项目（尤其是在金融量化、高频交易、计算密集型等对性能、稳定性和工程化要求极高的工业场景），行业内的工具链和工程范式在近年来已经发生了非常显著的升级。&lt;/p&gt;
&lt;p&gt;除了你提到的基础套装（&lt;code&gt;clang-format&lt;/code&gt;、&lt;code&gt;clang-tidy&lt;/code&gt;、&lt;code&gt;GoogleTest&lt;/code&gt;），目前工业界主流的中大型 C++ 工程架构通常围绕以下几个核心维度进行搭建：&lt;/p&gt;
&lt;h2 id=&quot;1-gou-jian-su-du-yu-bian-yi-jia-su-build-acceleration&quot;&gt;1. 构建速度与编译加速（Build Acceleration）&lt;/h2&gt;
&lt;p&gt;对于中大型 C++ 项目，编译速度直接决定研发效率。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Ninja 替代 Make / Xcode 项目文件&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 CMake 配置时使用 &lt;code&gt;-G Ninja&lt;/code&gt;。Ninja 的并行依赖调度比传统 Make 快得多，几乎是当前 C++ 工业界的标准 Generator。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ccache / sccache&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 编译结果本地/分布式缓存。配合 CMake 使用：&lt;code&gt;set(CMAKE_CXX_COMPILER_LAUNCHER ccache)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 切分支或 clean build 时，90% 以上的增量编译可以实现秒级完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;预编译头文件（PCH, Precompiled Headers）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;利用 CMake 3.16+ 原生支持的 &lt;code&gt;target_precompile_headers&lt;/code&gt;。将 &lt;code&gt;&amp;lt;vector&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;string&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;memory&amp;gt;&lt;/code&gt;, &lt;code&gt;boost&lt;/code&gt; 等通用常用头文件预编译，通常能提升 30%~60% 的编译速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;LLVM LLD 链接器&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 macOS 上，默认的 &lt;code&gt;ld64&lt;/code&gt; 在处理巨大符号表时较慢。可以尝试设置 &lt;code&gt;-fuse-ld=lld&lt;/code&gt; 使用 LLVM 的 &lt;code&gt;lld&lt;/code&gt;，能大幅缩短大型目标文件的 Link 时间。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-bao-guan-li-yu-yi-lai-kong-zhi-dependency-management&quot;&gt;2. 包管理与依赖控制（Dependency Management）&lt;/h2&gt;
&lt;p&gt;告别手动下载或依赖系统全局安装库（如 Brew 安装导致的版本冲突），现代化项目讲究&lt;strong&gt;自包含&lt;/strong&gt;与&lt;strong&gt;确定性构建&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;vcpkg 或 Conan 2.x&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;目前 &lt;strong&gt;vcpkg&lt;/strong&gt;（微软主导）和 &lt;strong&gt;Conan 2.0&lt;/strong&gt; 是业界两大主力。通过 &lt;code&gt;vcpkg.json&lt;/code&gt; 或 &lt;code&gt;conanfile.txt&lt;/code&gt; 声明依赖版本，实现跨平台/跨团队的零成本环境复现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMake FetchContent + CPM.cmake&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对于轻量级依赖或内部私有 Git 仓库，结合 CMake 3.14+ 的 &lt;code&gt;FetchContent&lt;/code&gt; 或其封装库 &lt;code&gt;CPM.cmake&lt;/code&gt;，实现构建时动态拉取和按需编译，避免将第三方代码直接 Commit 到源码库中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-dong-tai-yun-xing-shi-fen-xi-yu-nei-cun-an-quan-sanitizers-dynamic-analysis&quot;&gt;3. 动态运行时分析与内存安全（Sanitizers &amp;amp; Dynamic Analysis）&lt;/h2&gt;
&lt;p&gt;在金融/量化等领域，内存泄露、并发竞态（Data Race）或未定义行为（UB）是致命的。Clang 原生集成的 &lt;strong&gt;Sanitizers&lt;/strong&gt; 是最强大的防御线：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ASan (AddressSanitizer)：&lt;/strong&gt; 检测内存越界访问、内存泄露、Use-After-Free。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;TSan (ThreadSanitizer)：&lt;/strong&gt; 专门检测多线程代码中的&lt;strong&gt;数据竞态&lt;/strong&gt;（Data Race），金融高并发系统必开。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;UBSan (UndefinedBehaviorSanitizer)：&lt;/strong&gt; 检测整数溢出、空指针解引用等未定义行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;MSan (MemorySanitizer)：&lt;/strong&gt; 检测读取未初始化的内存。&lt;/li&gt;
&lt;/ul&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;工程落地范式：&lt;/strong&gt; 在 CMake 中增加 Option，如 &lt;code&gt;-DENABLE_SANITIZER_ADDRESS=ON&lt;/code&gt;。要求 CI/CD 流水线中所有的单元测试必须在开启 ASan/TSan 的环境下运行通过。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-jing-tai-dai-ma-fen-xi-yu-dai-ma-zhi-liang-kong-zhi-static-analysis-quality-control&quot;&gt;4. 静态代码分析与代码质量控制（Static Analysis &amp;amp; Quality Control）&lt;/h2&gt;
&lt;p&gt;除了基本的 &lt;code&gt;clang-tidy&lt;/code&gt;，工业界还会叠加多重防护：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Include-What-You-Use (IWYU)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;配合 CMake 运行：&lt;code&gt;set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE &quot;include-what-you-use&quot;)&lt;/code&gt;。分析项目头文件，自动移除冗余的 &lt;code&gt;#include&lt;/code&gt;，防止头文件膨胀拖慢编译速度。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;cppcheck / SonarQube&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;作为 &lt;code&gt;clang-tidy&lt;/code&gt; 的补充，提供更多的规则集（如 MISRA C++ 标准）和安全漏洞扫描。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;pre-commit 框架&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;使用 Python 的 &lt;code&gt;pre-commit&lt;/code&gt; 工具挂载 Git Hooks，在开发者本地 &lt;code&gt;git commit&lt;/code&gt; 时自动触发 &lt;code&gt;clang-format&lt;/code&gt; 和简易静态检查，防止脏代码提交到远程仓库。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-cmake-xiang-mu-jia-gou-fan-shi-modern-cmake-paradigm&quot;&gt;5. CMake 项目架构范式（Modern CMake Paradigm）&lt;/h2&gt;
&lt;p&gt;现代 CMake（CMake 3.20+）的写作风格已完全走向 &lt;strong&gt;基于 Target 的面向对象范式&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Strict Target/Property Scope（严禁全局污染）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;废弃全局的 &lt;code&gt;include_directories()&lt;/code&gt; / &lt;code&gt;link_libraries()&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;全部使用 &lt;code&gt;target_include_directories()&lt;/code&gt;、&lt;code&gt;target_link_libraries()&lt;/code&gt;，并严格区分 &lt;code&gt;PUBLIC&lt;/code&gt; / &lt;code&gt;PRIVATE&lt;/code&gt; / &lt;code&gt;INTERFACE&lt;/code&gt; 传递属性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CMakePresets.json 标准化&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;CMake 3.19 引入的标准。在项目根目录下放置 &lt;code&gt;CMakePresets.json&lt;/code&gt;，定义统一的 Debug/Release 配置、编译器路径、构建目录。&lt;/li&gt;
&lt;li&gt;开发者在终端直接运行 &lt;code&gt;cmake --preset debug&lt;/code&gt; 或在 VS Code/CLion/Xcode 中一键选择 preset，实现团队环境的无缝统一。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;支持 C++ Modules (C++20/23)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;CMake 3.28+ 对 C++20 Modules 提供了正式支持。在新项目中，逐步用 Module 替换传统头文件，从根源上解决头文件重复解析的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;1-yu-yan-fu-wu-yu-ide-kai-fa-ti-yan-language-server-protocol&quot;&gt;1. 语言服务与 IDE 开发体验（Language Server Protocol）&lt;/h2&gt;
&lt;p&gt;过去大家习惯用 Xcode 生成项目或用 VS Code 插件粗暴扫描，现在全行业基本上都在向 &lt;strong&gt;&lt;code&gt;clangd&lt;/code&gt;&lt;/strong&gt; 靠拢。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;clangd + &lt;code&gt;compile_commands.json&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地位：&lt;/strong&gt; LLVM 官方出品的 LSP 服务端，目前在代码补全、跳转、重构和实时错误提示上全面超越传统的 C/C++ 插件。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt; 搭配 CMake 的 &lt;code&gt;set(CMAKE_EXPORT_COMPILE_COMMANDS ON)&lt;/code&gt;，生成 &lt;code&gt;compile_commands.json&lt;/code&gt; 软链接到项目根目录。所有开发者（无论用 VS Code、Neovim 还是 CLion）都能享受毫秒级的精确代码分析与符号跳转。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-yun-xing-shi-xing-neng-pou-xi-yu-zhen-duan-profiling-benchmarking&quot;&gt;2. 运行时性能剖析与诊断（Profiling &amp;amp; Benchmarking）&lt;/h2&gt;
&lt;p&gt;在金融与高频领域，“能跑通”只是第一步，“跑得有多快、延迟波动多大”才是核心竞争力。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Benchmark&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; C++ 微基准测试（Microbenchmarking）的标准工具。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;场景：&lt;/strong&gt; 针对关键算法、数据结构（如无锁队列、定点数计算）编写性能测试代码，输出精确的 CPU 时间、内存带宽以及 Iterations/sec。可以集成到 CI 中防止&lt;strong&gt;性能退化（Performance Regression）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;macOS 原生工具链：Instruments / &lt;code&gt;dtrace&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 macOS 上，不需要再去折腾 Linux 的 &lt;code&gt;perf&lt;/code&gt;。直接使用 Xcode 自带的 &lt;strong&gt;Instruments&lt;/strong&gt;（尤其是 &lt;em&gt;Time Profiler&lt;/em&gt;, &lt;em&gt;Allocations&lt;/em&gt;, &lt;em&gt;System Trace&lt;/em&gt;），在图形界面中查看 CPU 缓存缺失（Cache Miss）、锁竞争以及指令周期（IPC）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tracy Profiler&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 极低开销的实时帧/事件 Profiler（带超强 GUI）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;场景：&lt;/strong&gt; 相比于传统的抽样 Profiler，Tracy 支持在代码中注入微秒级 Mark，实时观察多线程协同、事件循环（Event Loop）延迟和内存分配轨迹，非常适合低延迟/高吞吐系统。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ce-shi-wei-du-de-shen-du-kuo-zhan-advanced-testing-strategies&quot;&gt;3. 测试维度的深度扩展（Advanced Testing Strategies）&lt;/h2&gt;
&lt;p&gt;除了普通的单元测试，现代工程还会加入以下两类强化手段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;模糊测试（Fuzzing）—— &lt;code&gt;libFuzzer&lt;/code&gt; / &lt;code&gt;AFL++&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 给你的 API 输入随机生成的海量变异数据，强行引发 Crash、内存越界或逻辑未定义。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; LLVM 原生集成了 &lt;strong&gt;libFuzzer&lt;/strong&gt;（通过 &lt;code&gt;-fsanitize=fuzzer&lt;/code&gt; 编译），专门用于解析器、网络协议包、数据序列化/反序列化（如 FIX 协议、Protobuf）的健壮性测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;属性/基于策略的测试（Property-Based Testing）—— &lt;code&gt;RapidCheck&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 类似 Haskell 的 QuickCheck。你只需要定义“这个函数的输入与输出应该满足什么数学属性”，工具会自动生成上万组边缘边界条件（例如极值、空值、非法组合）进行验证。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-yi-lai-an-quan-xing-yu-er-jin-zhi-ke-zhui-su-xing-supply-chain-observability&quot;&gt;4. 依赖安全性与二进制可追溯性（Supply Chain &amp;amp; Observability）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Doxygen + Breathe + Sphinx / MkDocs&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;现代 C++ 项目不再直接看裸露的文档网页。主流做法是用 &lt;strong&gt;Doxygen&lt;/strong&gt; 提取头文件注释生成 XML，再通过 &lt;strong&gt;Breathe&lt;/strong&gt; 接入 &lt;strong&gt;Sphinx/MkDocs&lt;/strong&gt;，构建出类似 Stripe / Rust 官方文档一样精美且可检索的 API 站点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;SBOM (Software Bill of Materials) 与依赖安全扫描&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;金融合规与安全防护的要求。配合 Conan 2.x 或 vcpkg，在构建时自动导出 SBOM 文件，并通过 &lt;code&gt;trivy&lt;/code&gt; 或 &lt;code&gt;grype&lt;/code&gt; 扫描第三方库是否存在已知漏洞（CVE）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-ji-zhi-jia-su-mo-kuai-hua-yu-fen-bu-shi-gou-jian-next-gen-build-systems&quot;&gt;5. 极致加速：模块化与分布式构建（Next-Gen Build Systems）&lt;/h2&gt;
&lt;p&gt;如果你的项目达到了百万行级别，单机 &lt;code&gt;ccache&lt;/code&gt; + &lt;code&gt;Ninja&lt;/code&gt; 依然无法满足秒级编译：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;BuildBuddy / Bazel&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;虽然 CMake 是行业通用标准，但在很多超大型金融量化巨头内部，会逐步转向 &lt;strong&gt;Bazel&lt;/strong&gt;。 Bazel 依靠严格的“沙盒机制”保障绝对的构建确定性（Hermetic Builds），并天然支持分布式远程编译与全局缓存（Remote Build Execution, RBE）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;FASTBuild&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;如果依然保留 CMake，可以借助 FASTBuild 作为 Backend，实现跨局域网多台机器协同编译。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;zong-jie-xian-dai-c-xiang-mu-gong-cheng-hua-quan-jia-tong-yi-lan&quot;&gt;总结：现代 C++ 项目工程化“全家桶”一览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;基础工具（你已提到）&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;现代化演进补充 (2023-2026 工业落地)&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;代码格式与风格&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;clang-format&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;pre-commit&lt;/code&gt; hook 自动化触发&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;静态代码分析&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;clang-tidy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Include-What-You-Use&lt;/code&gt; (IWYU), &lt;code&gt;clangd&lt;/code&gt; 实时 LSP&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;单元测试&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;GoogleTest&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Google Benchmark&lt;/code&gt; (微基准), &lt;code&gt;libFuzzer&lt;/code&gt; (模糊测试)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;动态分析与内存&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Sanitizers全家桶&lt;/strong&gt; (&lt;code&gt;ASan&lt;/code&gt;/&lt;code&gt;TSan&lt;/code&gt;/&lt;code&gt;UBSan&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;构建与加速&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CMake&lt;/td&gt;&lt;td&gt;CMake + &lt;strong&gt;Ninja&lt;/strong&gt; + &lt;strong&gt;ccache&lt;/strong&gt; + &lt;strong&gt;CMakePresets&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;包与依赖管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;手动 / Brew&lt;/td&gt;&lt;td&gt;&lt;strong&gt;vcpkg&lt;/strong&gt; / &lt;strong&gt;Conan 2.x&lt;/strong&gt; / &lt;code&gt;FetchContent&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;性能诊断&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;-&lt;/td&gt;&lt;td&gt;macOS &lt;strong&gt;Instruments&lt;/strong&gt;, &lt;strong&gt;Tracy Profiler&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;3-qiang-hua-ce-shi-yu-dai-ma-lu-bang-xing-fuzzing-advanced-testing&quot;&gt;3. 强化测试与代码鲁棒性（Fuzzing &amp;amp; Advanced Testing）&lt;/h2&gt;
&lt;p&gt;单元测试（GoogleTest/Catch2）只能覆盖“开发者能想到的边界”，而现代工程会引入&lt;strong&gt;模糊测试（Fuzzing）**与**属性测试（Property-based Testing）&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;libFuzzer&lt;/code&gt; / AFL++ (American Fuzzy Lop)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; Clang 原生集成的结构化模糊测试工具（基于 &lt;code&gt;-fsanitize=fuzzer&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;场景：&lt;/strong&gt; 自动化生成数百万种变态的畸形输入数据（如网络报文解析、协议解码器、JSON/FIX 协议解析），结合 ASan 自动捕捉 Crash 和潜在的溢出漏洞。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Catch2 / doctest&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在新建项目中，很多团队正在用 &lt;strong&gt;Catch2 v3&lt;/strong&gt; 或 &lt;strong&gt;doctest&lt;/strong&gt; 替代 GoogleTest。它们支持更现代的 BDD 语法（&lt;code&gt;GIVEN&lt;/code&gt; / &lt;code&gt;WHEN&lt;/code&gt; / &lt;code&gt;THEN&lt;/code&gt;），且 &lt;code&gt;doctest&lt;/code&gt; 的编译速度极快。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-yi-lai-an-quan-xing-yu-dai-ma-fang-fu-dependency-guardrails&quot;&gt;4. 依赖安全性与代码防腐（Dependency Guardrails）&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;include-cleaner&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;LLVM 官方出品的新一代头文件清理工具（&lt;code&gt;clang-tidy&lt;/code&gt; 的衍生组件），比旧版的 IWYU 更精准，能自动标注未使用的头文件以及缺失的直接依赖头文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mold (Linker)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;虽然 macOS 上默认推荐 LLVM &lt;code&gt;lld&lt;/code&gt; 或 Xcode 的 &lt;code&gt;ld64&lt;/code&gt;/&lt;code&gt;new-ld&lt;/code&gt;，但在 Linux/macOS 交叉编译或容器构建场景下，&lt;strong&gt;mold&lt;/strong&gt; 是目前业界公认最快的链接器，能将几秒到几分钟的链接时间缩短至毫秒级。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-bian-yi-qi-jian-cha-yu-xian-dai-hua-yu-yan-gui-fan&quot;&gt;5. 编译期检查与现代化语言规范&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;static_assert&lt;/code&gt; + C++20 Concepts&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式改变：&lt;/strong&gt; 淘汰过去复杂的 SFINAE 模板黑魔法。全面使用 C++20 的 &lt;code&gt;concept&lt;/code&gt; 和 &lt;code&gt;requires&lt;/code&gt; 子句来约束模板参数。不仅编译错误信息变得极其人性化，而且能将大量的类型检查提前到编译期完成。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;constexpr&lt;/code&gt; / &lt;code&gt;consteval&lt;/code&gt; 静态计算&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;将金融业务中的静态查找表（LUT）、协议哈希计算、常量配置提前在编译期生成，做到零运行时开销（Zero-overhead abstraction）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;6-xian-dai-c-zui-jia-gong-cheng-shi-jian-qing-dan-zong-jie&quot;&gt;6. 现代 C++ 最佳工程实践清单总结&lt;/h2&gt;
&lt;p&gt;如果将现代中大型 C++ 工程的质量防护体系比作流水线，它的完整形态通常是：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;阶段&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;采用工具 / 范式&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;解决的核心问题&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;代码编写&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;clangd&lt;/code&gt; + &lt;code&gt;clang-format&lt;/code&gt; + &lt;code&gt;pre-commit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;统一代码规范、拼写与风格，防止低级错误进入仓库&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;构建管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;CMakePresets + Ninja + &lt;code&gt;ccache&lt;/code&gt; + vcpkg&lt;/td&gt;&lt;td&gt;一键跨平台配置、秒级增量编译、依赖确定性&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;编译检查&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Strict Warnings (&lt;code&gt;-Wall -Werror&lt;/code&gt;) + C++20 Concepts&lt;/td&gt;&lt;td&gt;编译期拦截潜在 Bug 与模板滥用&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;动态测试&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;GTest / Catch2 + ASan / TSan / UBSan&lt;/td&gt;&lt;td&gt;运行期捕捉内存泄露、野指针与多线程数据竞态&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;质量安全&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;libFuzzer&lt;/code&gt; + Google Benchmark&lt;/td&gt;&lt;td&gt;自动发现隐蔽崩溃点，防止性能退化&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;xian-dai-hua-lian-jie-qi-ti-dai&quot;&gt;现代化链接器替代&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;mold (或 sold/Apple ld64 优化版)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;由 Rui Ueyama 开发的下一代链接器 &lt;code&gt;mold&lt;/code&gt; 是目前速度最快（近乎达到硬件 I/O 极限）的链接器。在 macOS (ARM64/x86_64) 上，使用现代链接器替代旧版 &lt;code&gt;ld&lt;/code&gt;，可以将大型金融系统的增量链接时间从十几秒压缩到 &lt;strong&gt;1 秒以内&lt;/strong&gt;，极大提升 Edit-Compile-Test 循环体验。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-xian-dai-xing-neng-profiling-yu-nei-cun-zhui-zong-jin-rong-liang-hua-he-xin&quot;&gt;2. 现代性能 Profiling 与内存追踪（金融量化核心）&lt;/h2&gt;
&lt;p&gt;在金融高频交易或低延迟服务中，性能调优不能靠猜，必须依靠低开销的 Sampling（采样）与 Frame-based Profiling。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tracy Profiler&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;目前游戏界和量化界极具口碑的实时帧/低延迟 Profiler。侵入性极低，支持 CPU 线程甘特图、内存分配（Allocations）、锁竞争（Lock Contention）以及硬件 PMU 指标分析。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Perfetto (Google)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;支持跨平台的系统级追踪分析，能够把 C++ 业务逻辑、OS 系统调用以及内存堆分配打通在一张 Web 时间轴图表中。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;mimalloc / jemalloc / tcmalloc 替代与分析&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;金融系统很少直接使用系统默认的 &lt;code&gt;malloc&lt;/code&gt;（在 macOS 上是 &lt;code&gt;libSystem&lt;/code&gt; 的 malloc）。工业界常采用 &lt;strong&gt;Microsoft mimalloc&lt;/strong&gt; 或 &lt;strong&gt;jemalloc&lt;/strong&gt;，配合内存分配分析工具（如 &lt;code&gt;bytehound&lt;/code&gt;），实现无锁高并发内存分配并精确追踪内存碎片。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-dai-ma-sheng-cheng-yu-rpc-xu-lie-hua-jia-gou&quot;&gt;3. 代码生成与 RPC / 序列化架构&lt;/h2&gt;
&lt;p&gt;中大型工程往往涉及跨语言（C++ 与 Python/Rust）调用，或者分布式节点通信。现代工程范式倾向于&lt;strong&gt;数据结构驱动代码生成&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;FlatBuffers / Cap’n Proto&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在金融行情/交易系统等要求 Zero-Copy（零拷贝）的场景中，逐渐取代传统的 Protocol Buffers。它们允许直接在内存缓存区中读取结构体，无需昂贵的 Unpack/Deserialize 过程。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;reflect-cpp / C++20 反射过渡方案&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 C++26 静态反射正式落地前，目前工业界广泛采用基于 C++20 的编译期反射库（如 &lt;code&gt;reflect-cpp&lt;/code&gt;），用极低的编译期开销自动生成 JSON/CBOR 的序列化与反序列化代码，淘汰手工编写的模板代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-zi-dong-hua-mo-hu-ce-shi-fuzz-testing&quot;&gt;4. 自动化模糊测试（Fuzz Testing）&lt;/h2&gt;
&lt;p&gt;对于金融交易系统或处理外部非信任数据（如 API 报文解析、网络协议栈）的模块，传统的单元测试只能覆盖“已知边界”，而 &lt;strong&gt;Fuzzing&lt;/strong&gt; 能跑出大量的“未知崩溃”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;libFuzzer (Clang 集成) / Honggfuzz&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt; 配合 &lt;code&gt;-fsanitize=fuzzer,address&lt;/code&gt; 编译旗标。让 Fuzzer 自动生成随机输入向量，高强度轰炸解析函数。在 CI/CD 中定期（如夜间构建）运行 Fuzzing 测试，能提前拦截 90% 以上的内存越界与崩溃漏洞。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-xian-dai-hua-dai-ma-zhi-liang-yu-an-quan-fan-shi&quot;&gt;3. 现代化代码质量与安全范式&lt;/h2&gt;
&lt;p&gt;除了静态检查（clang-tidy），现代 C++ 更强调在编译期和代码设计层面将错误杜绝。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IWYU (Include-What-You-Use)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;用来清理头文件包含循环和冗余依赖。直接集成到 CMake：&lt;code&gt;set(CMAKE_CXX_INCLUDE_WHAT_YOU_USE &quot;include-what-you-use&quot;)&lt;/code&gt;。大型 C++ 项目经常通过清理 &lt;code&gt;#include&lt;/code&gt; 将整体编译时间缩短 40% 以上。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Coverage 报告工具 (llvm-cov + gcovr)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在使用 Clang 构建时，加上 &lt;code&gt;-fprofile-instr-generate -fcoverage-mapping&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;结合 &lt;code&gt;llvm-profdata&lt;/code&gt; 和 &lt;code&gt;llvm-cov&lt;/code&gt; 生成 HTML 覆盖率报告（或集成到 Codecov/SonarQube），强制要求新代码的单元测试覆盖率达到 80%+。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Contract-Based Programming (契约式编程/断言体系)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在金融系统中，虽然 C++26 的 Contracts 标准还在演进，但工业界普遍使用类似 &lt;code&gt;gsl::Expects()&lt;/code&gt; / &lt;code&gt;gsl::Ensures()&lt;/code&gt; 或自研的强力断言系统（Assertion System），在 &lt;strong&gt;Debug/Sanitizer 构建中强制 Crash&lt;/strong&gt;，在 &lt;strong&gt;Release 构建中通过分支预测优化 (like &lt;code&gt;[[likely]]&lt;/code&gt;) 去除开销&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;1-xian-dai-hua-zi-dong-hua-ce-shi-yu-yan-zheng-gong-ju-chao-yue-chuan-tong-gtest&quot;&gt;1. 现代化自动化测试与验证工具（超越传统 GTest）&lt;/h2&gt;
&lt;p&gt;虽然 GoogleTest 依然是行业标准，但在追求极致安全和高吞吐量的工业场景下，单靠手动编写的单元测试远远不够：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Fuzz Testing（模糊测试：libFuzzer / LLVM-Fuzz）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;适用场景：&lt;/strong&gt; 解析器、网络协议栈（如 FIX 协议、自定义二进制 RPC）、数据序列化模块。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt; 利用 Clang 原生的 &lt;code&gt;-fsanitize=fuzzer&lt;/code&gt;。Fuzzing 引擎会自动生成海量的变异边界数据注入你的函数，结合 AddressSanitizer（ASan）自动捕捉非常隐蔽的空指针、内存越界和崩溃点。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Property-Based Testing（基于属性的测试：RapidCheck）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念：&lt;/strong&gt; 类似于 Rust 社区的 &lt;code&gt;QuickCheck&lt;/code&gt; 或 Python 的 &lt;code&gt;Hypothesis&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点：&lt;/strong&gt; 你不需要手动写具体的 &lt;code&gt;EXPECT_EQ(a, b)&lt;/code&gt;，而是声明“属性规则”（例如：“不管输入什么数组，排序算法输出的结果必须递增”），测试框架会自动生成几万组极限边界用例来寻找打破规则的反例。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-he-xin-jia-gou-she-ji-yu-gong-cheng-fan-shi-modern-c-paradigms&quot;&gt;2. 核心架构设计与工程范式（Modern C++ Paradigms）&lt;/h2&gt;
&lt;p&gt;为了在大型项目中减少人造成的 Bug，工业界正在推行一种&lt;strong&gt;在编译期就把错误杜绝&lt;/strong&gt;的编码设计范式：&lt;/p&gt;
&lt;h3 id=&quot;fang-qi-c-exception-quan-mian-zhuan-xiang-std-expected-tl-expected&quot;&gt;放弃 C++ Exception，全面转向 &lt;code&gt;std::expected&lt;/code&gt; / &lt;code&gt;tl::expected&lt;/code&gt;&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工业背景：&lt;/strong&gt; 在高频金融或低延迟系统中，&lt;code&gt;try-catch&lt;/code&gt; 带来的栈展开（Stack Unwinding）开销是不可接受的，且隐式抛出异常会导致代码执行路径难以预测。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt; 采用 C++23 的 &lt;code&gt;std::expected&amp;lt;T, E&amp;gt;&lt;/code&gt;（或 C++20 下的 &lt;code&gt;tl::expected&lt;/code&gt;），将“错误”作为显式返回值类型返回。强制调用方必须显式处理错误，从设计层面解决未捕获异常崩溃的问题。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cpp&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;//&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 现代 C++ 显式错误处理示范&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;auto&lt;/span&gt;&lt;span&gt; result&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; parse_financial_packet&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;buffer&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;!&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    log_error&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 编译期提醒必须处理 Error&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;use_payload&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span&gt;result&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;qiang-lei-xing-feng-zhuang-strong-types-opaque-typedefs&quot;&gt;强类型封装（Strong Types / Opaque Typedefs）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;痛点：&lt;/strong&gt; 传统代码中容易混淆含义相同的基本类型，比如 &lt;code&gt;void place_order(int price, int quantity)&lt;/code&gt;，调换参数顺序编译依然能过。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;解决方案：&lt;/strong&gt; 使用强类型库（如 &lt;code&gt;named_type&lt;/code&gt; 或内嵌轻量 struct 封装）：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;place_order(Price{100}, Quantity{500}); // 传反参数直接报编译错误&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-gao-ji-jing-tai-fen-xi-yu-shen-du-lou-dong-sao-miao-bi-clang-tidy-geng-shen&quot;&gt;3. 高级静态分析与深度漏洞扫描（比 clang-tidy 更深）&lt;/h2&gt;
&lt;p&gt;当代码库规模达到数十万甚至上百万行时，普通的 AST 规则匹配（clang-tidy）很难捕捉跨文件、跨函数的深层逻辑缺陷：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;PVS-Studio / Klocwork / SonarQube（商业级全栈扫描）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;能力：&lt;/strong&gt; 具备跨文件的&lt;strong&gt;数据流追踪（Data Flow Analysis）**和**污染分析（Taint Analysis）&lt;/strong&gt;。例如：从网络 socket 读入的未清洗数据（Taint Input），经过层层传递最终作为数组下标使用，这类复杂漏洞只有商业级 SAST 才能精准识别。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CppDepend（架构可视化与依赖治理）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 专门分析 C++ 项目结构。它可以将代码包、类之间的循环依赖转化为依赖矩阵（DSM），帮助架构师监控代码腐化、防止高层模块反向依赖底层实现。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;&quot;&gt;&lt;/h2&gt;
&lt;h2 id=&quot;4-da-xing-xiang-mu-gou-jian-yu-ci-cd-you-hua&quot;&gt;4. 大型项目构建与 CI/CD 优化&lt;/h2&gt;
&lt;p&gt;随着项目膨胀，CMake 自身可能也会遇到性能瓶颈：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;分布式构建（BuildBuddy / Remote Execution）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对于极大型 C++ 项目，本地 8 核/16 核 CPU 编译依然缓慢。金融大型团队会部署 Remote Build Execution (RBE) 集群，将编译任务并发分发到云端上百个 Node 同步编译，将半小时的 Build 缩短至几十秒。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bazel 构建系统（替代 CMake 的备选项）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 Google、Meta 以及部分头部量化巨头中，如果项目属于庞大的 &lt;strong&gt;Monorepo（单体大仓库）&lt;/strong&gt;，通常会用 Bazel 替代 CMake。Bazel 的依赖图判定极其严格且具备强大的分布式缓存能力，能做到绝对准确的“增量构建”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在中大型 C++ 项目（尤其是在&lt;strong&gt;高频量化、金融系统、游戏引擎、实时渲染与分布式计算&lt;/strong&gt;）中，如果我们跳出传统的“编译-测试-静态检查”三板斧，目前业界（2024–2026年）在&lt;strong&gt;极致性能优化、内存分配策略、ABI 稳定性治理、供应链安全与分布式调试&lt;/strong&gt;等深水区领域，还有以下非常落地且硬核的现代工程工具与范式。&lt;/p&gt;
&lt;h2 id=&quot;1-yun-xing-shi-nei-cun-fen-pei-yu-huan-cun-you-hua-memory-cache-operations&quot;&gt;1. 运行时内存分配与缓存优化（Memory &amp;amp; Cache Operations）&lt;/h2&gt;
&lt;p&gt;对于对延迟和吞吐极其敏感的中大型系统，C++ 默认的 &lt;code&gt;malloc/free&lt;/code&gt;（或 macOS 系统原生的 &lt;code&gt;malloc&lt;/code&gt;）会带来严重的&lt;strong&gt;内存碎片&lt;/strong&gt;和&lt;strong&gt;锁竞争&lt;/strong&gt;，也是造成系统 Latency Spike（延迟毛刺）的罪魁祸首。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mimalloc (微软) / JeMalloc (Meta) / TCMalloc (Google)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地方案：&lt;/strong&gt; 现代化项目通常会强行替换系统的内存分配器。在 CMake 中链接 &lt;code&gt;mimalloc&lt;/code&gt; 或 &lt;code&gt;jemalloc&lt;/code&gt;，或者通过 &lt;code&gt;DYLD_INSERT_LIBRARIES&lt;/code&gt; 注入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 在多线程高并发场景下，直接提升 10%~30% 的整体内存吞吐量，同时大幅降低内存碎片。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自研/定制定制化 Allocator (&lt;code&gt;std::pmr&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;使用 C++17 引入的 &lt;strong&gt;PMR (Polymorphic Memory Resource)&lt;/strong&gt;。对于局部短生命周期的大量临时对象（如交易引擎处理单笔订单），直接使用 &lt;code&gt;std::pmr::monotonic_buffer_resource&lt;/code&gt; 在栈上或提前分配好的 Arena 内存池中高速分配，几乎零开销，且避免频繁触发系统调用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-bian-yi-qi-yu-er-jin-zhi-ceng-mian-you-hua-pgo-bolt&quot;&gt;2. 编译期与二进制层面优化（PGO &amp;amp; BOLT）&lt;/h2&gt;
&lt;p&gt;对于性能要求达到“微秒级”的中大型系统，单纯开 &lt;code&gt;-O3&lt;/code&gt; 已经不够用了。现代工业界会通过反馈驱动优化（Profile-Guided Optimization）来挖掘 CPU 的极限。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;PGO (Profile-Guided Optimization)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一阶段：&lt;/strong&gt; CMake 加上 &lt;code&gt;-fprofile-generate&lt;/code&gt; 构建二进制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二阶段：&lt;/strong&gt; 运行真实的生产线/仿真压力测试数据，生成 &lt;code&gt;.profraw&lt;/code&gt; 运行轨迹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三阶段：&lt;/strong&gt; 用 &lt;code&gt;llvm-profdata&lt;/code&gt; 汇总数据，再以 &lt;code&gt;-fprofile-use&lt;/code&gt; 重新构建。&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理与效果：&lt;/strong&gt; LLVM 会根据真实运行轨迹，自动优化分支预测（Branch Prediction）、重新编排 Basic Block 顺序以最大化 CPU L1 Instruction Cache Hit Rate，通常能获得 5%~15% 的无套利性能提升。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LLVM BOLT (Binary Optimization and Layout Tool)&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定位：&lt;/strong&gt; Meta 开源的二进制后优化工具。在 PGO 构建出二进制文件后，BOLT 在二进制汇编级别重新编排函数和代码块位置，降低 CPUTLB miss 和 Instruction Cache miss。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-gong-ying-lian-an-quan-yu-er-jin-zhi-yi-lai-zhi-li-sbom-abi-safety&quot;&gt;3. 供应链安全与二进制依赖治理 (SBOM &amp;amp; ABI Safety)&lt;/h2&gt;
&lt;p&gt;在中大型金融与工业级软件中，开源合规与供应链安全已提升到前所未有的高度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SBOM (Software Bill of Materials，软件物料清单)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;利用 &lt;strong&gt;Syft&lt;/strong&gt; 或 &lt;strong&gt;vcpkg/Conan&lt;/strong&gt; 自动导出 SPDX / CycloneDX 格式的 SBOM 文件。明确记录当前项目编译出的二进制文件中包含了哪些开源库、什么版本、什么 License（防止 GPL 污染）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ABI / API 兼容性检测 (&lt;code&gt;abi-compliance-checker&lt;/code&gt; / &lt;code&gt;libabigail&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对于以动态库（&lt;code&gt;.dylib&lt;/code&gt; / &lt;code&gt;.so&lt;/code&gt;）形式对外交付的 C++ 基础设施项目，使用 &lt;code&gt;libabigail&lt;/code&gt;（&lt;code&gt;abidiff&lt;/code&gt;）在 CI 流水线中检查新旧版本之间的二进制 ABI 是否破坏。防止因隐式修改了类成员变量顺序或虚函数表（vtable）导致下游调用方崩溃。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-quan-ju-kua-yu-yan-yu-fen-bu-shi-fen-bu-shi-gen-zong-tracing-telemetry&quot;&gt;4. 全局跨语言与分布式分布式跟踪（Tracing &amp;amp; Telemetry）&lt;/h2&gt;
&lt;p&gt;对于服务化、微服务化或复杂管道式的中大型 C++ 架构，崩溃和性能瓶颈往往不在单个 C++ 进程内。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;OpenTelemetry C++ SDK (OTel)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;概念：&lt;/strong&gt; 云原生时代的分布式链路追踪标准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; 在 C++ 关键函数和跨网络 RPC 节点中植入 OpenTelemetry Spans，将性能轨迹、日志与指标统一推送到 Jaeger / Datadog 等平台。让你清晰看到“从客户端发起请求，到 C++ 核心引擎处理，再到写盘”的完整耗时拓扑图。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sentry C++ SDK / Crashpad&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定位：&lt;/strong&gt; 生产环境崩溃（Crash）捕获与符号化报告。&lt;/li&gt;
&lt;li&gt;利用 Google 的 &lt;strong&gt;Crashpad&lt;/strong&gt; 机制，当 C++ 程序在客户现场或生产服务器发生 Segfault 崩溃时，后台进程会自动捕获 Minidump 堆栈文件，自动上传到内部 Sentry 服务器，并通过 symbolicate 工具还原出崩溃发生的具体文件和行号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在&lt;strong&gt;航天航空（Aerospace）、国防、医疗器械、自动驾驶以及核工业&lt;/strong&gt;等对安全性、可靠性有“零容忍（Mission-Critical / Safety-Critical）”要求的行业中，对 C++ 的使用范式与普通互联网或金融高频交易有很大区别。&lt;/p&gt;
&lt;p&gt;在这些行业，&lt;strong&gt;“性能最高”往往要让位于“行为绝对可预测（Deterministic）”&lt;/strong&gt;。以下是这些行业在 LLVM/Clang + CMake 体系下落地的核心规范、限制与工程实践：&lt;/p&gt;
&lt;h2 id=&quot;1-xing-ye-ding-ji-bian-ma-biao-zhun-coding-standards&quot;&gt;1. 行业顶级编码标准（Coding Standards）&lt;/h2&gt;
&lt;p&gt;在航天和安全敏感领域，你写的每一行 C++ 都必须通过合规性扫描（Compliance Check）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;MISRA C++:2023&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地位：&lt;/strong&gt; 目前安全关键领域的 &lt;strong&gt;“天花板”标准&lt;/strong&gt;。2023 版将旧版的 MISRA C++:2008 与汽车业的 AUTOSAR C++14 进行了全面合并，&lt;strong&gt;专门针对 C++17&lt;/strong&gt; 进行了重构。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心理念：&lt;/strong&gt; 彻底杜绝 C++ 语言中的未定义行为（Undefined Behavior, UB）、隐式类型转换、复杂多重继承等安全隐患。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DO-178C (DAL A/B) 指南&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;地位：&lt;/strong&gt; 机载航空系统（如飞控、航电）软件认证的国际标准。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;要求：&lt;/strong&gt; 代码不仅要通过测试，还需要提供从 &lt;strong&gt;需求 -&amp;gt; 架构 -&amp;gt; 源代码 -&amp;gt; 汇编代码&lt;/strong&gt; 的 100% 双向追溯性（Traceability）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NASA JPL C++ Coding Standard (喷气推进实验室规范)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;NASA JPL 著名的“安全关键代码十条规则”（The Power of Ten Rules）：
&lt;ol&gt;
&lt;li&gt;限制所有控制流为简单的结构（&lt;strong&gt;禁用递归&lt;/strong&gt;，确保所有循环有固定的上界）。&lt;/li&gt;
&lt;li&gt;变量作用域尽可能最小化。&lt;/li&gt;
&lt;li&gt;必须检查所有函数的返回值。&lt;/li&gt;
&lt;li&gt;限制指针的使用层级（禁止双重指针/多级指针）。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-nei-cun-yu-yun-xing-shi-de-jin-ji-yu-she-ji-mo-shi&quot;&gt;2. 内存与运行时的“禁忌”与设计模式&lt;/h2&gt;
&lt;p&gt;为了保证系统在连续运行几年甚至几年内&lt;strong&gt;绝对不崩溃、不卡顿&lt;/strong&gt;，航天级 C++ 规范对语言特性做出了极严苛的剥离：&lt;/p&gt;
&lt;h3 id=&quot;che-di-jin-yong-dong-tai-nei-cun-fen-pei-no-malloc-no-new&quot;&gt;彻底禁用动态内存分配（No &lt;code&gt;malloc&lt;/code&gt; / No &lt;code&gt;new&lt;/code&gt;）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么：&lt;/strong&gt; 动态内存分配会导致&lt;strong&gt;内存碎片化&lt;/strong&gt;（Memory Fragmentation），并在不可预知的时间点引发不确定的分配耗时（Non-deterministic Time）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;所有内存必须在系统启动的初始化阶段（Initialization Phase）一次性静态分配好，主循环运行期（Runtime Phase）&lt;strong&gt;严禁分配或释放内存&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;使用 &lt;code&gt;std::array&lt;/code&gt; 或类似 &lt;code&gt;etl::vector&lt;/code&gt;（Embedded Template Library）替代 &lt;code&gt;std::vector&lt;/code&gt;，容器容量必须在编译期确定（Fixed Capacity）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jin-yong-c-yi-chang-no-exceptions-fno-exceptions&quot;&gt;禁用 C++ 异常（No Exceptions: &lt;code&gt;-fno-exceptions&lt;/code&gt;）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么：&lt;/strong&gt; C++ 异常处理机制（&lt;code&gt;try-catch&lt;/code&gt;）的栈展开过程会导致无法预测的执行时间，且会隐式增加大量的二进制体积。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地方案：&lt;/strong&gt; 编译选项强制开启 &lt;code&gt;-fno-exceptions&lt;/code&gt;。错误处理全面采用显示返回值模式（如前文提到的 &lt;code&gt;std::expected&lt;/code&gt; 或状态码）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;jin-yong-rtti-no-runtime-type-information-fno-rtti&quot;&gt;禁用 RTTI（No Runtime Type Information: &lt;code&gt;-fno-rtti&lt;/code&gt;）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么：&lt;/strong&gt; 避免 &lt;code&gt;dynamic_cast&lt;/code&gt; 带来的运行期虚表查找开销与不确定性，减少虚函数表 overhead。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-fu-gai-lu-yu-ce-shi-ji-gao-biao-zhun-mc-dc-fu-gai-lu&quot;&gt;3. 覆盖率与测试极高标准（MC/DC 覆盖率）&lt;/h2&gt;
&lt;p&gt;在常规工业界，代码覆盖率达到 80% 的行覆盖（Line Coverage）已经算优秀；但在航天级（如 DO-178C DAL-A 级别）项目中，测试覆盖率必须达到 &lt;strong&gt;MC/DC（Modified Condition/Decision Coverage，修正条件/判定覆盖）&lt;/strong&gt; 100%。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;什么是 MC/DC：&lt;/strong&gt; 不仅要求每个函数、每行代码被跑过，还要求复合条件判断中的&lt;strong&gt;每一个独立条件&lt;/strong&gt;在其他条件不变的情况下，能够单独影响最终的判定结果。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;LLVM 工具支持：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 Clang 编译器的源码级覆盖率工具：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;clang++ -fprofile-instr-generate -fcoverage-mapping ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;llvm-profdata merge ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;llvm-cov show ./binary -instr-profile=... -show-branches=count&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配合 &lt;strong&gt;Polyspace&lt;/strong&gt;, &lt;strong&gt;Helix QAC&lt;/strong&gt; 或 &lt;strong&gt;VectorCAST&lt;/strong&gt; 等专业工具输出审计合规报告。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-xing-shi-hua-yan-zheng-yu-gao-ji-fen-xi-formal-verification&quot;&gt;4. 形式化验证与高级分析（Formal Verification）&lt;/h2&gt;
&lt;p&gt;在极端敏感场景，传统的“编写单元测试”被认为不足以证明代码 100% 正确，航天领域会引入&lt;strong&gt;形式化验证（Formal Verification）&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;抽象解释（Abstract Interpretation）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;工具如 &lt;strong&gt;Polyspace Bug Finder / Code Prover&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;它利用数学公式证明你的代码在&lt;strong&gt;所有可能的输入组合下&lt;/strong&gt;，都绝对不会发生：除零错误、缓冲区溢出、数组越界、空指针解引用。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬件在环测试（HIL - Hardware-in-the-Loop）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;配合 CMake 的构建流水线，代码编译完成后自动烧录至真实的 SoC 芯片（如 Xilinx Zynq、RISC-V 航天级芯片或 PowerPC），并在模拟器模拟的极热、极冷、高辐射环境下运行抗干扰测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-hang-tian-an-quan-ji-cmake-yu-xiang-mu-gong-cheng-fan-li&quot;&gt;5. 航天/安全级 CMake 与项目工程范例&lt;/h2&gt;
&lt;p&gt;在安全敏感项目中，CMake 的编写同样需要符合“可重复构建（Reproducible Build）”和“严谨性”要求：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cmake_minimum_required(VERSION 3.25)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;project(AerospaceControlSystem LANGUAGES C CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 强制确定性编译（去除编译路径差异，保证二进制构建结果 100% 一致）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_compile_options(-ffile-prefix-map=${CMAKE_SOURCE_DIR}=.)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 剥离运行时不确定特性&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_compile_options(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -fno-exceptions      # 禁用异常&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -fno-rtti            # 禁用 RTTI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    -fno-threadsafe-statics # 禁用局部静态变量的隐式加锁保护（防止死锁）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 开启最严格的警告，将一切警告视为错误&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if(CMAKE_CXX_COMPILER_ID MATCHES &amp;quot;Clang&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    add_compile_options(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -Wall -Wextra -Werror&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -Wconversion         # 阻止隐式缩窄转换&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -Wshadow             # 阻止变量作用域遮蔽&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -Wcast-qual          # 阻止指针 const 属性被强转剥离&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        -Wdouble-promotion   # 警告 float 隐式转为 double（航天 FPU 性能损耗点）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    )&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;endif()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 4. 集成 MISRA C++ / 静态检查分析门槛&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_CLANG_TIDY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;quot;clang-tidy;--checks=-*,misra-c++2023-*,bugprone-*,cert-*&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;zong-jie-bi-jiao-pu-tong-gong-ye-vs-hang-tian-an-quan-min-gan-ling-yu&quot;&gt;总结比较：普通工业 vs 航天安全敏感领域&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;普通工业/金融高频&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;航天/航空/安全敏感领域&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;优先目标&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;极低延迟、高吞吐、快速迭代&lt;/td&gt;&lt;td&gt;&lt;strong&gt;绝对确定性、零故障、可预测&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内存管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Mimalloc / PMR 内存池 / Arena&lt;/td&gt;&lt;td&gt;&lt;strong&gt;零动态分配 (No Heap)&lt;/strong&gt; / 编译期静态分配&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;错误处理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;std::expected&lt;/code&gt; / 异常捕获&lt;/td&gt;&lt;td&gt;禁用 Exception，强校验返回值 / 降级策略&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;代码规范&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Google C++ Style / Modern C++&lt;/td&gt;&lt;td&gt;&lt;strong&gt;MISRA C++:2023 / NASA JPL 10 条禁律&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;测试标准&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;行覆盖率 / 分支覆盖率 (~80%)&lt;/td&gt;&lt;td&gt;&lt;strong&gt;100% MC/DC 覆盖率&lt;/strong&gt; + 形式化数学证明&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;在航天航空、国防、医疗器械、自动驾驶和核工业等&lt;strong&gt;高安全与高可靠性（Safety-Critical）*&lt;em&gt;领域，代码设计的核心哲学是*&lt;/em&gt;“把不确定性（Non-determinism）在编译期彻底抹杀”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;在 LLVM/Clang + CMake 现代架构下，这些领域除了严格限制语言特性外，还有以下极其深度的工程落地范式：&lt;/p&gt;
&lt;h2 id=&quot;1-ti-dai-stl-de-ling-dui-nei-cun-biao-zhun-ku-fixed-capacity-containers&quot;&gt;1. 替代 STL 的零堆内存标准库（Fixed-Capacity Containers）&lt;/h2&gt;
&lt;p&gt;由于 &lt;code&gt;std::vector&lt;/code&gt;、&lt;code&gt;std::unordered_map&lt;/code&gt; 等 STL 容器依赖堆内存（Heap）并在扩容时重新分配，这在安全敏感领域是绝对禁忌。工业界普遍采用&lt;strong&gt;编译期静态容量容器&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;ETL (Embedded Template Library)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;定位：&lt;/strong&gt; 安全领域替代/补充标准 STL 的行业标杆库。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用法：&lt;/strong&gt; 使用 &lt;code&gt;etl::vector&amp;lt;T, Capacity&amp;gt;&lt;/code&gt; 替代 &lt;code&gt;std::vector&amp;lt;T&amp;gt;&lt;/code&gt;。内存直接分配在栈上或 &lt;code&gt;.bss&lt;/code&gt; 静态数据段中，完全禁用 &lt;code&gt;malloc&lt;/code&gt; / &lt;code&gt;free&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优点：&lt;/strong&gt; 保持了类似 STL 的迭代器与算法接口，同时在编译期锁定最大内存边界。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;std::array&lt;/code&gt; + &lt;code&gt;std::span&lt;/code&gt; (C++20)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;现代 C++ 代码中，函数参数传递严禁使用指针和引用偏移，统一采用 &lt;code&gt;std::span&lt;/code&gt; 进行边界安全的连续内存视图传递。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-zhuang-tai-ji-yu-kong-zhi-liu-de-yan-ge-xian-zhi-no-dynamic-flow&quot;&gt;2. 状态机与控制流的严格限制（No Dynamic Flow）&lt;/h2&gt;
&lt;p&gt;在飞控系统或医疗泵控制逻辑中，复杂的 &lt;code&gt;if-else&lt;/code&gt; 或嵌套循环极易隐藏未覆盖的分支条件。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;编译期确定界限（Bounded Loops）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;禁止出现 &lt;code&gt;while(true)&lt;/code&gt; 或没有显式上限的 &lt;code&gt;while(condition)&lt;/code&gt; 循环。&lt;/li&gt;
&lt;li&gt;所有循环必须写成固定次数上限的形式，防止死循环导致看门狗（Watchdog）触发系统复位：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 航天级规范循环示范&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;constexpr size_t MAX_SENSOR_RETRIES = 10;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;for (size_t i = 0; i &amp;lt; MAX_SENSOR_RETRIES; ++i) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if (try_read_sensor()) break;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;表驱动 / 形式化有限状态机（FSM）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;业务逻辑必须重构成明确的状态转换矩阵（State Transition Matrix），通过 &lt;code&gt;std::variant&lt;/code&gt; + &lt;code&gt;std::visit&lt;/code&gt; 在编译期进行状态穷尽性检查（Exhaustive Matching）。如果少处理了一个状态，编译器直接报错。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-luan-xu-zhi-xing-yu-ying-jian-ceng-mian-de-que-ding-xing-memory-barriers-volatile&quot;&gt;3. 乱序执行与硬件层面的确定性（Memory Barriers &amp;amp; Volatile）&lt;/h2&gt;
&lt;p&gt;在核工业控制或高辐射环境中，除了软件逻辑错误，还需要抵御硬件故障（如单粒子翻转 Single Event Upset, SEU）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;数据三模冗余（TMR - Triple Modular Redundancy）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 关键变量（如当前轨道姿态控制参数）在内存中同时存放 3 份，每次读取时进行“三选二”表决（Majority Voting）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码范式：&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template &amp;lt;typename T&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class RedundantVar {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T val1, val2, val3;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T get() const {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (val1 == val2) return val1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (val1 == val3) return val1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        return val2; // 自动纠正单粒子翻转（SEU）带来的比特位突变&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;指令重排控制（Compiler Barriers）&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Clang 的优化器非常强大，但在配合内存映射 I/O（MMIO）读写硬件寄存器时，代码重排可能导致致命后果。代码中会大量引入 &lt;code&gt;std::atomic_thread_fence(std::memory_order_seq_cst)&lt;/code&gt; 或 &lt;code&gt;asm volatile(&quot;&quot; ::: &quot;memory&quot;)&lt;/code&gt; 来约束 Clang 优化器的指令重排。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-zi-dong-hua-ruan-jian-yan-zheng-gong-ju-lian-toolchain-validation&quot;&gt;4. 自动化软件验证工具链（Toolchain Validation）&lt;/h2&gt;
&lt;p&gt;在 DO-178C / ISO 26262 认证中，&lt;strong&gt;“不仅你的代码要有保障，你用来编译代码的编译器本身也必须是安全可靠的”&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compiler Qualification（编译器鉴定）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;你不能随意从网络下载一个开源版的 LLVM/Clang 直接编译飞控软件。需要使用通过认证的&lt;strong&gt;商业级安全 Clang 编译器&lt;/strong&gt;（例如 Tasking、Green Hills 或 Solid Sands 的 SuperTest 工具包认证后的 Clang）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 运行数百万个严格的语言边界测试集，证明当前 Clang 编译出的机器码汇编与 C++ 源码语义 100% 严格一致，没有编译优化带来的额外 Bug。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态分析门槛：自动导出 SARIF 格式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;CMake 构建过程中集成静态分析，生成标准的 &lt;strong&gt;SARIF (Static Analysis Results Interchange Format)&lt;/strong&gt; 文件，直接挂载到 CI 门的合规性审计系统中，做到“有警告即拒绝构建”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-xian-dai-an-quan-ji-xiang-mu-zheng-ti-gong-zuo-liu-jia-gou&quot;&gt;5. 现代安全级项目整体工作流架构&lt;/h2&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; C++20/23 源码 (禁用 Exception, RTTI, Heap Memory)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ├── 编码设计: ETL 容器 + std::expected + 三模冗余 (TMR)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ├── 编译期拦截 (Clang + MISRA C++:2023 / NASA JPL 规则集)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │     ├── -Werror (警告转错误)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │     ├── -fno-exceptions -fno-rtti&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │     └── Clang-Tidy (SARIF 自动化输出)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ├── 形式化验证与抽象解释 (Polyspace / Helix QAC)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │     └── 验证：彻底排除除零、越界、死循环&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ├── 测试覆盖率检查 (llvm-cov)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │     └── 必须满足：100% MC/DC (修正条件/判定覆盖)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   └── 硬件在环测试 (HIL - Hardware-in-the-Loop)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         └── 烧录至真实板卡，进行高低温、辐射模拟与看门狗喂狗测试&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在这种工程范式下，C++ 不再是一个追求“灵活与便利”的语言，而是一个被极其严格的规则围墙圈起来的、具备&lt;strong&gt;高度数学确定性&lt;/strong&gt;的硬核系统描述工具。&lt;/p&gt;
&lt;p&gt;在安全性敏感与高可靠性行业（Safety-Critical Systems），除了严格限制 C++ 的语言子集（禁用动态内存、禁用异常、遵从 MISRA C++:2023）之外，整个&lt;strong&gt;软件工程生命周期、编译器基础设施、代码运行机制&lt;/strong&gt;都有着非常独特的工业落地范式。&lt;/p&gt;
&lt;p&gt;继续深入来看，这些行业在 &lt;strong&gt;LLVM/Clang + CMake&lt;/strong&gt; 体系以及硬件落地层面，还有以下极具代表性的工程设计：&lt;/p&gt;
&lt;h2 id=&quot;1-bian-yi-qi-he-ge-hua-ren-zheng-compiler-qualification-safety-manual&quot;&gt;1. 编译器合格化认证（Compiler Qualification / Safety Manual）&lt;/h2&gt;
&lt;p&gt;在普通行业，我们可以随意升级到最新的 Clang 18 或 GCC 14；但在航天、汽车（ISO 26262）和医疗（IEC 62304）行业，&lt;strong&gt;编译器本身被视为潜在的故障源&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;安全认证编译器（Qualified Compilers）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地工具：&lt;/strong&gt; 工业界通常不会直接使用未认证的开源 Clang，而是使用经过安全认证的商业化 LLVM/Clang 发行版，如 &lt;strong&gt;Solid Sands SuperTest&lt;/strong&gt; 测试套件认证过的编译器，或者 &lt;strong&gt;HighTec / Tasking Toolset&lt;/strong&gt;（基于 Clang 的车规/航天级编译器）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Safety Manual（安全手册遵守）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;编译器厂商会随工具链提供一份《Safety Manual》，其中明确规定了哪些编译器优化选项（Optimization Flags）是安全的。例如：禁止开启 &lt;code&gt;-Ofast&lt;/code&gt; 或某些可能改变浮点数精度的指令重排优化，只允许在特定可预测的优化级别（如 &lt;code&gt;-O2&lt;/code&gt; 或特定指令集裁剪选项）下运行。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-ruan-ying-jian-rong-yu-yu-kan-men-gou-jia-gou-she-ji-redundancy-fail-safe&quot;&gt;2. 软硬件冗余与“看门狗”架构设计（Redundancy &amp;amp; Fail-Safe）&lt;/h2&gt;
&lt;p&gt;单一代码库再完美，也无法抵御宇宙射线导致的比特翻转（Single Event Upset, SEU）或硬件老化。因此，代码架构设计上必须建立&lt;strong&gt;容错与降级机制&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;双工 / 三工模冗余 (2oo2 / 2oo3 TMR Architecture)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地范式：&lt;/strong&gt; 关键控制逻辑（如飞控系统）由 3 个独立的硬件通道（可以是 3 块相同的 DSP/FPGA 或不同架构的 CPU）同时运行同一段 C++ 代码。在 CMake 中会将代码编译为 3 个独立构建的目标，运行时通过 &lt;strong&gt;表决器（Voter）&lt;/strong&gt; 对输出结果进行“少数服从多数”的裁决。如果某一通道出现逻辑偏差或死锁，立刻剥离该通道。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;状态机硬上限与 Watchdog（看门狗）超时&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;主循环必须严格遵从 &lt;strong&gt;Deterministic Execution Window（确定性时间窗口）&lt;/strong&gt;。每一个 Task（任务）都有严格的 Worst-Case Execution Time (WCET，最坏情况执行时间) 预算。&lt;/li&gt;
&lt;li&gt;如果在指定的微秒数内，C++ 任务没有向硬件 Watchdog 定时器“喂狗”，硬件看门狗将直接复位 CPU 或切入 &lt;strong&gt;Safe-Mode（安全降级模式）&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ying-jian-di-ceng-jie-kou-ge-chi-fan-shi-hardware-abstraction-defensive-c&quot;&gt;3. 硬件/底层接口隔离范式（Hardware Abstraction &amp;amp; Defensive C++）&lt;/h2&gt;
&lt;p&gt;在极高可靠性系统中，C++ 扮演着连接硬件寄存器与上层算法的桥梁，这要求对硬件访问做出极致的安全防御：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;使用 &lt;code&gt;volatile&lt;/code&gt; 与内存映射 I/O（MMIO）的严谨封装&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;禁止使用原始指针直接读取内存映射寄存器。必须通过强类型、模板化的寄存器抽象层（Register Abstraction Layer）进行读写，防止编译器对硬件状态的读取进行过度的“优化消除”。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防乱序与内存屏障（Memory Barriers）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在多核航天级芯片或 DMA 传输控制中，即使禁用多线程，也要显式插入 LLVM 内建屏障指令（如 &lt;code&gt;__builtin_arm_dmb(15)&lt;/code&gt; 或 &lt;code&gt;asm volatile(&quot;&quot; ::: &quot;memory&quot;)&lt;/code&gt;），防止 CPU 乱序执行导致硬件指令生效顺序错乱。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-zi-dong-hua-traceability-xu-qiu-dai-ma-ce-shi-100-lian-lu-zhui-su&quot;&gt;4. 自动化 Traceability（需求-代码-测试 100% 链路追溯）&lt;/h2&gt;
&lt;p&gt;在 DO-178C 或 ISO 26262 审核中，最耗费工程师精力的往往不是写代码，而是证明“每一行 C++ 代码都有据可查，且被测试覆盖”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DO-178C 追溯标注范式&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在 CMake 项目的头文件和源文件中，所有的类和关键函数都必须带有符合 Traceability 工具（如 &lt;strong&gt;ReqIF / Doors / Jama&lt;/strong&gt;）识别的注释标签：&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;/**&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * @brief 计算飞控舵机偏转角&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * @requirement REQ-AERO-2026-0812  &amp;lt;-- 对应软件需求文档编号&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * @safety_level DAL-A&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; * @verification TEST_SUITE_SERVO_003&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; */&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;int32_t calculate_actuator_angle(const SensorData&amp;amp; sensor_input) noexcept {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    // 逻辑实现...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建自动化关联&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;利用 CMake 在构建阶段运行 Python/Clang-AST 扫描脚本，提取代码中的需求 ID。如果有任何新增代码没有关联需求 ID，或者有需求没有对应的 C++ 单元测试用例，&lt;strong&gt;构建流水线（CI）直接中断并报错&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-ji-yu-shu-xing-yu-mo-xing-de-zi-dong-dai-ma-sheng-cheng-model-based-design-codegen&quot;&gt;5. 基于属性与模型的自动代码生成（Model-Based Design &amp;amp; CodeGen）&lt;/h2&gt;
&lt;p&gt;在现代航天（如 SpaceX、NASA）和汽车控制领域，最为核心的控制算法（如姿态控制、轨迹规划）往往&lt;strong&gt;不是工程师手写 C++&lt;/strong&gt; 的，而是通过模型自动生成的：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simulink / Embedded Coder -&amp;gt; C++ 自动化导出&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;控制算法工程师在 MATLAB/Simulink 中建立数学模型并通过仿真验证。&lt;/li&gt;
&lt;li&gt;使用 Embedded Coder 生成符合 MISRA C++ 规范的 C++ 代码，并直接丢进 CMake 项目工程中进行编译。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;手动 C++ 代码的角色&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;软件工程师主要编写 &lt;strong&gt;手写 C++ 框架&lt;/strong&gt;，负责系统初始化、驱动适配、通信协议栈、安全监控（Safety Monitor）以及将自动生成的控制算法代码“粘合”起来。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;hang-tian-an-quan-ji-c-ti-xi-jie-gou-quan-mao&quot;&gt;航天/安全级 C++ 体系结构全貌&lt;/h2&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               ┌──────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               │         上层控制需求 (Doors / Jama)          │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               └──────────────────────┬───────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                      │ (双向追溯标签)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               ┌──────────────────────▼───────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               │  模型/手写 C++ (符合 MISRA C++:2023 / JPL 规范)│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               └──────────────────────┬───────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                      │ (禁止 Heap / 异常 / 多重继承)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               ┌──────────────────────▼───────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               │    静态验证/形式化证明 (Polyspace / VectorCAST)│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               └──────────────────────┬───────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                      │ (100% MC/DC 覆盖率)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               ┌──────────────────────▼───────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               │   通过 Safety Manual 认证的 LLVM/Clang 工具链 │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               └──────────────────────┬───────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                      │ (确定性编译选项 &amp;amp; WCET 计算)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               ┌──────────────────────▼───────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               │     2oo3 三工模硬件 / 硬件看门狗 (Fail-Safe)   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;               └──────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这种“近乎偏执”的工程约束，虽然牺牲了现代 C++ 的部分灵活度与开发速度，但换来的是&lt;strong&gt;在极端的太空辐射、剧烈震动和高压环境下，系统依然能够零故障连续运行数年乃至数十年&lt;/strong&gt;的绝对可靠性。&lt;/p&gt;
&lt;p&gt;在中大型 Safety-Critical（航天/国防/核工业/车规自动驾驶）系统中，除了编译器认证、容错硬件和确定性内存策略外，&lt;strong&gt;工程体系的演进目前正在发生深层次的变革&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;结合 2024–2026 年现代 C++ 工业界的最新发展，在对安全性与可靠性“零容忍”的领域，还有以下几项极其关键且正在大规模落地的&lt;strong&gt;高级工程范式与硬核技术&lt;/strong&gt;：&lt;/p&gt;
&lt;h2 id=&quot;1-c-yu-rust-de-hun-he-an-quan-jia-gou-c-rust-interop&quot;&gt;1. C++ 与 Rust 的混合安全架构（C++ / Rust Interop）&lt;/h2&gt;
&lt;p&gt;这是当前安全敏感行业（尤其是自动驾驶、新一代国防与航天地面系统）最显著的趋势之一：&lt;strong&gt;用 Rust 编写新安全模块，并与现有百万行 C++ 代码库无缝缝合。&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;为什么产生：&lt;/strong&gt; 即使有 MISRA C++，C++ 的内存安全（Memory Safety）依然依赖工程师的自觉。美国 NSA、CISA 及各大国防/车规巨头都在推动向内存安全语言过渡。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;落地范式（CXX / cbindgen）：&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;利用 &lt;strong&gt;&lt;code&gt;cxx&lt;/code&gt;&lt;/strong&gt;（Rust/C++ 互操作库），在 C++ 和 Rust 之间建立&lt;strong&gt;编译期强类型绑定&lt;/strong&gt;，无需编写繁琐且易错的 C 风格 FFI 接口。&lt;/li&gt;
&lt;li&gt;在 CMake 项目中，通过 &lt;strong&gt;&lt;code&gt;Corrosion&lt;/code&gt;&lt;/strong&gt;（CMake 的 Rust 集成插件）将 Rust 编写的安全核心（如加密模块、网络解析器、状态机）直接作为 CMake Target 链接进 Clang 构建流水线。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-yun-xing-shi-zhan-an-quan-yu-zhi-ling-ji-ji-fang-hu-hardware-assisted-security&quot;&gt;2. 运行时栈安全与指令集级防护（Hardware-Assisted Security）&lt;/h2&gt;
&lt;p&gt;在极高安全级别的系统中，代码不仅要防逻辑 Bug，还要防硬件层面的恶意攻击或辐射导致的物理篡改（如缓冲区溢出攻击、ROP 攻击）。现代 Clang 编译器提供了指令集级别的安全防御能力：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shadow Call Stack (SCS / &lt;code&gt;-fsanitize=shadow-call-stack&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; 在 LLVM 编译时，将函数的返回地址（Return Address）额外备份在一个不可读取的硬件“阴影栈”中。当函数返回时对比两个栈的值，如果因为缓冲区溢出导致栈破坏，立刻触发硬件中断。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Control Flow Integrity (CFI / &lt;code&gt;-fsanitize=cfi&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;原理：&lt;/strong&gt; LLVM 的控制流完整性校验。防止攻击者通过破坏虚函数表（vtable）或函数指针，强行跳转到未授权的代码区域（如跳转到危险的系统指令）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stack Canaries &amp;amp; Stack Clash Protection (&lt;code&gt;-fstack-protector-strong&lt;/code&gt;)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;强制在栈帧中插入随机保护金丝雀值（Canary），在每个函数返回前校验，彻底杜绝栈越界攻击。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ying-jian-zui-pi-qing-kuang-zhi-xing-shi-jian-wcet-ji-suan-yu-wei-jia-gou-fen-xi&quot;&gt;3. 硬件最坏情况执行时间（WCET）计算与微架构分析&lt;/h2&gt;
&lt;p&gt;在航天和实时控制中，如果一个 C++ 函数绝大多数时候执行耗时 10 微秒，但因为 CPU Cache Miss 或分支预测失败，偶发耗时 200 微秒，这就叫 &lt;strong&gt;Non-deterministic（不可确定）&lt;/strong&gt;，在硬实时系统中是致命的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;抽象解释与微架构分析工具（如 AbsInt aiT）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;流程：&lt;/strong&gt; 工具直接读取 LLVM/Clang 编译出的二进制文件，配合目标芯片（如 ARM Cortex-R5/R8、PowerPC 或 RISC-V）的微架构模型（Pipeline, Cache, Memory Bus）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 给出该段 C++ 代码在数学上&lt;strong&gt;绝对不可能超过的最坏执行时间（WCET）&lt;/strong&gt;，并指出哪几行 C++ 代码会导致严重的 CPU Cache 缺失，指导工程师精细化重构。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-fu-dian-shu-determinism-kua-ping-tai-jue-dui-yi-zhi-xing&quot;&gt;4. 浮点数 determinism（跨平台绝对一致性）&lt;/h2&gt;
&lt;p&gt;在轨迹计算、姿态演算等数学密集型航天算法中，即使相同的 C++ 代码，在不同编译器、不同 CPU 指令集（如 x86 AVX 与 ARM Neon）或不同优化级别下，&lt;strong&gt;浮点数计算结果的最后几位小数可能会有微小差异&lt;/strong&gt;。在大尺度航天计算中，这种微小差异会在几千公里外放大成巨大偏差。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;严格 IEEE 754 模式（Strict Floating-Point Standard）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;禁用项：&lt;/strong&gt; 严禁使用 &lt;code&gt;-ffast-math&lt;/code&gt; 或 &lt;code&gt;-funsafe-math-optimizations&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译选项：&lt;/strong&gt; 在 Clang 中显式配置 &lt;code&gt;-fno-fast-math -ffp-model=strict&lt;/code&gt;，强制要求编译器完全按照 IEEE 754 规范顺序执行浮点运算，禁用可能改变精度的指令合并（如某些隐式的 FMA 指令重排）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;软浮点（Soft-Float）与定点数（Fixed-Point Arithmetic）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;对于极端敏感的核控制或飞控核心算法，甚至会放弃 CPU 的硬件浮点运算单元（FPU），使用 C++ 模板编写 &lt;strong&gt;定点数类（Fixed-Point Class）&lt;/strong&gt;，彻底消除不同硬件 FPU 带来的浮点不确定性。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-kua-tuan-dui-gong-ying-lian-de-fang-wu-ran-cmake-ge-chi-fan-shi&quot;&gt;5. 跨团队/供应链的“防污染”CMake 隔离范式&lt;/h2&gt;
&lt;p&gt;在国防和大型航天工程中，项目通常由数家不同研发单位共同开发。如何防止下游单位写的“垃圾代码”污染整个主工程的质量？&lt;/p&gt;
&lt;p&gt;在 CMake 架构中，现代工业界采用了非常严格的隔离手段：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 针对第三方或子系统代码强制设置安全沙箱&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_subdirectory(third_party/subsystem_a)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 强行屏蔽第三方代码库抛出的警告，防止干扰主代码编译&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_include_directories(subsystem_a SYSTEM PRIVATE ...)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 对特定外部依赖关闭某些不合规的编译选项&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set_target_properties(subsystem_a PROPERTIES&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    COMPILE_FLAGS &amp;quot;-w&amp;quot; # 忽略第三方警告&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 强制在主工程链接阶段扫描未定义符号与隐藏依赖&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_SHARED_LINKER_FLAGS &amp;quot;${CMAKE_SHARED_LINKER_FLAGS} -Wl,--no-undefined&amp;quot;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;ji-gao-an-quan-deng-ji-c-gong-cheng-luo-di-quan-jing-lu-xian-tu&quot;&gt;极高安全等级 C++ 工程落地全景路线图&lt;/h2&gt;
&lt;p&gt;如果你要带领团队搭建一套完全符合现代&lt;strong&gt;安全敏感行业标准&lt;/strong&gt;的 C++ 项目体系，你的全套基础设施可以概括为以下五道防线：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一道防线（代码编写期）：&lt;/strong&gt; ISO/MISRA C++:2023 规范 + &lt;code&gt;clangd&lt;/code&gt; + 禁止动态内存/异常 + &lt;code&gt;std::expected&lt;/code&gt; / Rust 安全组件扩展。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二道防线（静态与形式化验证）：&lt;/strong&gt; Clang-Tidy (MISRA 规则集) + Polyspace 抽象解释（证明绝对无 UB、无除零、无溢出）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三道防线（编译构建期）：&lt;/strong&gt; 认证版 LLVM/Clang + &lt;code&gt;-fno-exceptions -fno-rtti&lt;/code&gt; + &lt;code&gt;-fsanitize=cfi,shadow-call-stack&lt;/code&gt; + 100% MC/DC 覆盖率测试。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第四道防线（二进制与时间分析）：&lt;/strong&gt; 二进制 WCET 最坏执行时间数学演算 + IEEE 754 严格浮点确定性控制。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第五道防线（硬件运行期）：&lt;/strong&gt; 2oo3 三工模硬件表决 + 硬件看门狗超时强行降级安全模式（Fail-Safe）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;在前面讨论的“确定性控制、代码硬隔离、硬件安全防护、Rust 混合架构”基础之上，如果将视角进一步延伸到 &lt;strong&gt;2024–2026 年最前沿的现代 C++ 工业实践&lt;/strong&gt;，在航天、国防、医疗器械、核工业及自动驾驶等领域，&lt;strong&gt;工程范式正在从“事后验证与测试”向“编译期安全与数学级证明”全面演进&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以下是行业内正在落地、极具推荐价值的高级工程实践与工具链选择：&lt;/p&gt;
&lt;h2 id=&quot;1-bian-yi-qi-yu-fa-an-quan-yu-yuan-bian-cheng-compile-time-safety-metaprogramming&quot;&gt;1. 编译期语法安全与元编程（Compile-Time Safety &amp;amp; Metaprogramming）&lt;/h2&gt;
&lt;p&gt;在安全敏感领域，&lt;strong&gt;最安全的代码是根本不需要在运行时运行的代码&lt;/strong&gt;。利用 C++20 / C++23 的 &lt;code&gt;constexpr&lt;/code&gt; / &lt;code&gt;consteval&lt;/code&gt; 和模板元编程，可以将极多的运行时逻辑、物理单位换算以及状态机校验彻底移到编译期。&lt;/p&gt;
&lt;h3 id=&quot;1-1-wu-li-dan-wei-bian-yi-qi-lei-xing-jian-cha-si-units-compile-time-dimensions&quot;&gt;1.1 物理单位编译期类型检查（SI Units / Compile-Time Dimensions）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;痛点：&lt;/strong&gt; 历史上最著名的航天惨剧之一——NASA 火星气候轨道器（Mars Climate Orbiter）失事，原因就是一方使用的是英制单位（磅·秒），而另一方使用的是公制单位（牛顿·秒），数据直接传递导致轨道计算错误。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;推荐方案：&lt;/strong&gt; 引入强类型的物理单位库（如 &lt;strong&gt;&lt;code&gt;mp-units&lt;/code&gt;&lt;/strong&gt;，即 C++26 强类型单位标准提案的实现库）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 试图把“米”赋值给“秒”，或者将“力”和“速度”直接相加，&lt;strong&gt;在编译期就会报错&lt;/strong&gt;，且运行时零性能开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;mp-units/systems/si/si.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;using namespace mp_units::si::unit_symbols;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 强类型参数定义&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;void apply_thrust(mp_units::quantity&amp;lt;N&amp;gt; force, mp_units::quantity&amp;lt;s&amp;gt; duration) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    // ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;int main() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    // apply_thrust(100 * m, 5 * s); // 编译直接报错！无法将 &amp;#39;m&amp;#39; (米) 传给 &amp;#39;N&amp;#39; (牛顿)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    apply_thrust(100 * N, 5 * s);    // 编译通过&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;1-2-bian-yi-qi-ling-kai-xiao-zhuang-tai-ji-compile-time-finite-state-machine-fsm&quot;&gt;1.2 编译期零开销状态机（Compile-Time Finite State Machine, FSM）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐方案：&lt;/strong&gt; 使用 Boost.SML 或基于 C++20 强类型实现的编译期 FSM。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势：&lt;/strong&gt; 传统的 &lt;code&gt;switch-case&lt;/code&gt; 或状态模式容易漏掉未定义的转换状态。编译期 FSM 能在构建阶段对状态转换矩阵进行穷举校验。如果定义了无效的状态跳转（例如“直接从 &lt;code&gt;INIT&lt;/code&gt; 跳到 &lt;code&gt;LAUNCH&lt;/code&gt; 忽略了 &lt;code&gt;CHECK&lt;/code&gt;”），编译器拒绝生成二进制。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-ji-yu-llvm-clang-de-ding-zhi-hua-domain-specific-checks-ling-yu-zi-ding-yi-jian-cha&quot;&gt;2. 基于 LLVM/Clang 的定制化 Domain-Specific Checks（领域自定义检查）&lt;/h2&gt;
&lt;p&gt;只用 Clang-Tidy 内置的 MISRA 规则往往不够，因为每个航天或医疗项目都有自己特定的架构约束（例如：“所有通信报文序列化类必须包含 &lt;code&gt;checksum()&lt;/code&gt; 方法”或“禁止在驱动层调用任何标准库头文件”）。&lt;/p&gt;
&lt;h3 id=&quot;tui-jian-shi-jian-bian-xie-zi-ding-yi-libtooling-clang-plugin&quot;&gt;推荐实践：编写自定义 LibTooling / Clang Plugin&lt;/h3&gt;
&lt;p&gt;利用 LLVM 的 &lt;strong&gt;LibTooling&lt;/strong&gt; API，针对项目编写专属的 Clang 语法树（AST）扫描插件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;AST Matchers 编写：&lt;/strong&gt; 捕获不符合项目内部架构规约的代码模式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;集成到 CMake：&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 将自定义 Clang 插件挂载到 CMake 编译指令中&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_compile_options(-Xclang -load -Xclang ${CMAKE_BINARY_DIR}/libMySafetyPlugin.so)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;落地效果：&lt;/strong&gt; 在开发者点击编译的瞬间，对违规的项目专属逻辑弹出编译器级别的 Fatal Error，阻止非法架构蔓延。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;3-gao-gao-ji-jing-tai-duan-yan-yu-zi-yu-shi-dai-ma-she-ji-defensive-execution-fail-safe&quot;&gt;3. 高高级静态断言与自愈式代码设计（Defensive Execution &amp;amp; Fail-Safe）&lt;/h2&gt;
&lt;p&gt;即使在静态分析阶段做到了极致，硬件层面的不可抗力（如粒子翻转导致内存比特位变异，Bit Flip）依然可能发生。因此，代码本身的自我防御（Defensive Programming）至关重要：&lt;/p&gt;
&lt;h3 id=&quot;3-1-nei-cun-mo-fa-shu-yu-shu-ju-xiao-yan-magic-numbers-poisoning&quot;&gt;3.1 内存魔法数与数据校验（Magic Numbers &amp;amp; Poisoning）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;在关键的 C++ 类或结构体头部加入魔数校验字段（Magic Word / Canary）：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;struct SensorPayload {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uint32_t header_magic = 0xDEADBEEF; // 固定的结构有效性魔数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    float altitude;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    float velocity;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uint32_t crc32;                     // 内存数据 CRC 校验码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;运行时防御：&lt;/strong&gt; 函数在处理该结构体前，必须先校验 &lt;code&gt;header_magic&lt;/code&gt; 和 &lt;code&gt;crc32&lt;/code&gt;。如果发现被内存翻转污染，&lt;strong&gt;拒绝继续执行&lt;/strong&gt;并直接抛出硬件中断，切入安全降级分支。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-2-bian-liang-san-jue-redundancy-software-based-tmr&quot;&gt;3.2 变量三决 redundancy（Software-Based TMR）&lt;/h3&gt;
&lt;p&gt;在没有硬件三模块冗余（TMR）支持的低成本航天/车规节点上，可以采用&lt;strong&gt;软件级三重冗余存储&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&amp;lt;typename T&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class SafetyValue {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;private:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T v1, v2, v3; // 同一变量在不同内存偏移处备份三次&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    T get() const {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (v1 == v2) return v1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (v1 == v3) return v1;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        if (v2 == v3) return v2;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        // 三个值都不一致，说明遭遇了严重硬件比特翻转！触发安全自愈或紧急降级&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        trigger_safety_fault_handler();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;4-luo-di-jian-yi-xian-dai-an-quan-min-gan-xiang-mu-de-zheng-ti-gong-cheng-tui-jian-ju-zhen&quot;&gt;4. 落地建议：现代安全敏感项目的整体工程推荐矩阵&lt;/h2&gt;
&lt;p&gt;如果想为你的团队引入最符合当下趋势的优秀设计与规范，推荐按照以下分层路线逐步配置：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;推荐引入工具 / 范式&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;预期收益&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;语言规范&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;MISRA C++:2023&lt;/strong&gt; + NASA JPL 10 条禁律&lt;/td&gt;&lt;td&gt;彻底排除隐式类型转换、死循环与未定义行为&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;物理/逻辑安全&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;mp-units&lt;/code&gt;&lt;/strong&gt; + &lt;strong&gt;&lt;code&gt;Boost.SML&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;编译期杜绝单位算错、非法状态跳转&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内存与并发&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;etl&lt;/code&gt; (Embedded Template Library)&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;替代 &lt;code&gt;std::vector&lt;/code&gt;，做到零动态堆分配&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;定制扫描&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;LLVM LibTooling Custom Plugins&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;自动化强制约束项目专属的架构规则&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;静态验证&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Polyspace Code Prover / SonarQube&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;获得除零、越界、空指针的 100% 数学证明&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;硬件安全&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Clang &lt;code&gt;-fsanitize=cfi,shadow-call-stack&lt;/code&gt;&lt;/td&gt;&lt;td&gt;硬件指令层防控制流篡改与栈破坏&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;测试硬指标&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;VectorCAST / Sonar&lt;/strong&gt; (达到 100% MC/DC)&lt;/td&gt;&lt;td&gt;满足航天 DO-178C DAL-A 级软件审计要求&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;-1&quot;&gt;&lt;/h2&gt;
&lt;p&gt;在把&lt;strong&gt;语言子集裁切（MISRA）、编译期计算（constexpr/mp-units）、形式化证明（Polyspace）、定制化 Clang 插件与硬件级安全（CFI/Shadow Call Stack）*&lt;em&gt;都配置到位后，现代 Safety-Critical（航天、车规、核能、国防）行业在 2024–2026 年的工程前沿，开始聚焦于*&lt;/em&gt;“系统级确定性（Deterministic System Design）”、“软硬件协同分析”以及“基于大模型的安全审计与形式化代码生成”&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;以下是这一领域的最新深度落地推荐与核心工程范式：&lt;/p&gt;
&lt;h2 id=&quot;1-bian-yi-qi-que-ding-xing-bian-pai-yu-shi-jian-sha-he-time-triggered-architecture-tta&quot;&gt;1. 编译期确定性编排与时间沙盒（Time-Triggered Architecture, TTA）&lt;/h2&gt;
&lt;p&gt;在极端敏感的实时控制系统中，传统的“多线程/抢占式 OS 调度”被认为具有不确定性（线程切换时刻不可预测、死锁概率不为零）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;时间触发架构（TTA）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 放弃传统的事件驱动（Event-Driven）和抢占式调度，转向&lt;strong&gt;绝对时间触发&lt;/strong&gt;。整个系统的所有 C++ 任务被划分在极度严格的离散时间片（Time Slots）内。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;编译期排程：&lt;/strong&gt; 使用 CMake 在构建阶段调用离线排程算法，为每一个 C++ 模块生成一份静态执行表（Schedule Table）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;时间沙盒（Execution Sandboxing）：&lt;/strong&gt; 结合芯片的硬件定时器（如 ARM Generic Timer），如果某个 C++ 任务的执行时间超过了分配的微秒级时间片，硬件将触发不可屏蔽中断（NMI），强行将该任务挂起并记录故障日志，确保后续其他关键任务的时间绝对不受影响。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-ji-yu-llvm-ir-de-quan-ju-kua-mo-kuai-zhi-ling-ji-zhui-zong-cross-translation-unit-llvm-pass&quot;&gt;2. 基于 LLVM IR 的全局跨模块指令级追踪（Cross-Translation-Unit LLVM Pass）&lt;/h2&gt;
&lt;p&gt;仅仅在 C++ 源码层做检查（如 AST Matchers）有时无法发现由&lt;strong&gt;编译器优化导致的隐患&lt;/strong&gt;。现代安全团队正在深度利用 LLVM 架构的中间表示（LLVM IR）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义 LLVM Opt Pass&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地场景：&lt;/strong&gt; 编写在 LLVM IR 级别运行的自定义分析 Pass，在优化阶段之后、汇编生成之前介入。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;检查项：&lt;/strong&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;隐式指令膨胀检查：&lt;/strong&gt; 检查编译器是否自动生成了未预期的昂贵浮点指令或复杂的隐式函数调用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;死代码与未达路径彻底擦除：&lt;/strong&gt; 确保安全敏感模块编译出的 IR 中不存在任何可能被利用的未初始化跳转分支。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;寄存器清零（Data Wiping Pass）：&lt;/strong&gt; 在安全密码学或核心控制逻辑函数返回前，利用 LLVM Pass 自动插入寄存器和栈空间重写指令，防止密钥或敏感状态留在 CPU 寄存器中。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ji-yu-mo-xing-de-zi-dong-dai-ma-sheng-cheng-yu-ai-qu-dong-de-an-quan-ji-zhong-gou&quot;&gt;3. 基于模型的自动代码生成与 AI 驱动的“安全级重构”&lt;/h2&gt;
&lt;p&gt;在 SpaceX、NASA 等新一代航天公司中，自动化与大模型（AI Agents）正在改变 Safety-Critical 代码的编写范式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Simulink/Stateflow 到 C++20 的合规代码自动生成&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;工业界正在从手写复杂状态机彻底转向“模型驱动（Model-Based Design）”。使用严格约束的生成器（如 MathWorks Embedded Coder），直接导出 100% 符合 MISRA C++:2023 标准的现代 C++20/23 代码。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;AI + 形式化验证 Agent（AI-Assisted Formal Verification）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;2025–2026 最新实践：&lt;/strong&gt; 将 AI Agents（基于 LLVM 编译上下文）集成到 CI/CD 流水线中。当工程师提交 C++ 代码时，AI Agent 不仅检查语法，还会&lt;strong&gt;自动提取代码的逻辑约束，并尝试用 Z3 SMT Solver（定理证明器）生成形式化数学证明&lt;/strong&gt;，或者自动撰写符合 DO-178C 审计要求的规范文档。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-ruan-jian-ding-yi-ying-jian-yu-risc-v-hang-tian-ji-zhi-ling-tuo-zhan-custom-isa-c-bindings&quot;&gt;4. 软件定义硬件与 RISC-V 航天级指令拓展（Custom ISA &amp;amp; C++ Bindings）&lt;/h2&gt;
&lt;p&gt;随着 RISC-V 在国防、航天以及汽车电子领域的快速崛起，C++ 工程正在与&lt;strong&gt;自定义硬件指令&lt;/strong&gt;紧密结合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;C++ 内建函数与自定义指令的绑定&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;在特定航天级 RISC-V 芯片上，硬件工程师会设计专门针对“三模冗余校验”、“矩阵运算”或“CRC 硬件加速”的自定义指令集。&lt;/li&gt;
&lt;li&gt;在 C++ 代码中，通过 Clang 的 &lt;code&gt;__builtin_riscv_*&lt;/code&gt; 或内联汇编将这些底层硬件指令直接映射为 C++ 的内联函数。CMake 会自动感知硬件平台的指令集扩展标志（&lt;code&gt;-march=rv64gc_zXcustom&lt;/code&gt;），实现最高效率且绝对确定性的硬件级控制。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-ji-gao-an-quan-c-yan-fa-quan-sheng-ming-zhou-qi-lian-tiao-end-to-end-safety-pipeline&quot;&gt;5. 极高安全 C++ 研发全生命周期链条（End-to-End Safety Pipeline）&lt;/h2&gt;
&lt;p&gt;最终，将这所有的优秀实践连结起来，构成了一个能够应对航天、深空探测、核设施等&lt;strong&gt;零容忍&lt;/strong&gt;场景的现代化 C++ 项目范式矩阵：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ┌─────────────────────────────────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │ 1. 需求与建模: Jama / DOORS + Simulink MBD 自动生成 C++20│&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       └────────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ┌────────────────────────────▼────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │ 2. 源码级约束: MISRA C++:2023 + mp-units (物理单位编译校验) │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │                + etl (零堆内存) + std::expected         │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       └────────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ┌────────────────────────────▼────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │ 3. 静态与形式化证明: LibTooling 自定义插件 + Polyspace   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │                      + Z3 形式化数学推理 (证明零 UB)     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       └────────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ┌────────────────────────────▼────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │ 4. 编译器级安全: 认证版 LLVM/Clang + 自定义 IR Pass     │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │                  + Shadow Call Stack + CFI 控制流保护   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       └────────────────────────────┬────────────────────────────┘&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                                    │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       ┌────────────────────────────▼────────────────────────────┐&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │ 5. 目标机与硬件: 时间触发架构(TTA) + 2oo3 TMR 三模硬件表决  │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       │                  + 硬件看门狗 + 100% MC/DC 覆盖率测试   │&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       └─────────────────────────────────────────────────────────┘&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;如果你正在规划或重构一个极高可靠性的 C++ 工业/航天项目，建议以 &lt;strong&gt;“零动态内存”、“编译期强类型/物理单位校验”、“100% MC/DC 覆盖” 以及 “LLVM 自定义安全分析 Pass”&lt;/strong&gt; 作为首批落地的核心突破口。&lt;/p&gt;
&lt;p&gt;理解了！前面的讨论确实偏向了航天、国防等极限安全领域。对于&lt;strong&gt;大多数通用但追求高品质、高可维护性、高编译效率的中大型 C++ 项目&lt;/strong&gt;（如中大型桌面软件、高性能后端服务、量化引擎、游戏服务端等），我们不需要那些过于苛刻的规范（比如禁用堆内存或写形式化数学证明），而是需要&lt;strong&gt;兼顾“工程效率”与“代码质量”的现代通用最佳实践&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;下面为你梳理一套&lt;strong&gt;现代（2023年至今）通用且优秀的中大型 C++ 项目的标准范式与工具链组合&lt;/strong&gt;：&lt;/p&gt;
&lt;h2 id=&quot;1-xian-dai-hua-gou-jian-yu-gong-ju-lian-ji-chu-she-shi-build-tooling&quot;&gt;1. 现代化构建与工具链基础设施（Build &amp;amp; Tooling）&lt;/h2&gt;
&lt;p&gt;在中大型项目中，项目配置的规范性直接决定了团队协作的顺畅度。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;CMakePresets.json（项目入口标准化）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;作用：&lt;/strong&gt; 解决“在我的电脑上能编，在别人电脑上编不过”的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 项目根目录下放一个 &lt;code&gt;CMakePresets.json&lt;/code&gt;，把 Debug/Release 配置、编译器路径、生成目录统一写好。开发者无论是用 CLI、VS Code、CLion 还是 Xcode，只需选择 Preset，一键构建。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;ccache + Ninja（开发体验提升首选）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;方案：&lt;/strong&gt; CMake 配置 &lt;code&gt;-G Ninja&lt;/code&gt;，并开启 &lt;code&gt;set(CMAKE_CXX_COMPILER_LAUNCHER ccache)&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 团队日常切分支、增量编译的等待时间通常能从数分钟缩短到数秒。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CPM.cmake / vcpkg（轻量级依赖管理）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 放弃在代码库里放 &lt;code&gt;.a&lt;/code&gt; / &lt;code&gt;.dylib&lt;/code&gt; 二进制库，推荐使用 &lt;strong&gt;CPM.cmake&lt;/strong&gt;（基于 &lt;code&gt;FetchContent&lt;/code&gt; 的轻量封装）。只需几行 CMake 代码，就能在编译阶段自动下载、构建第三方依赖（如 &lt;code&gt;spdlog&lt;/code&gt;, &lt;code&gt;fmt&lt;/code&gt;, &lt;code&gt;nlohmann_json&lt;/code&gt;），非常干净。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-dai-ma-bian-xie-yu-xian-dai-c-gui-fan-modern-coding-paradigms&quot;&gt;2. 代码编写与现代 C++ 规范（Modern Coding Paradigms）&lt;/h2&gt;
&lt;p&gt;现代 C++（C++20/23）提供了许多能显著提升表达力和代码安全性的内置特性：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;全面采用 &lt;code&gt;std::expected&lt;/code&gt; / &lt;code&gt;std::optional&lt;/code&gt; 处理错误&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 放弃使用 C 风格的错误码（如返回 &lt;code&gt;-1&lt;/code&gt;）或抛出复杂的 Exception。用 &lt;code&gt;std::expected&amp;lt;T, E&amp;gt;&lt;/code&gt;（C++23）显式表达“成功返回 T，失败返回 Error”。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优势：&lt;/strong&gt; 强制调用方在编译期关注错误处理，逻辑清晰且无运行时异常开销。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;采用 &lt;code&gt;fmt&lt;/code&gt; (或 &lt;code&gt;std::format&lt;/code&gt;) 替代 &lt;code&gt;std::cout&lt;/code&gt; / &lt;code&gt;printf&lt;/code&gt;&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优势：&lt;/strong&gt; 类型安全、编译期校验格式化字符串、性能远超 &lt;code&gt;std::cout&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;使用 &lt;code&gt;clangd&lt;/code&gt; + &lt;code&gt;.clangd&lt;/code&gt; 文件作为统一 IDE 引擎&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 在根目录放一个配置文件 &lt;code&gt;.clangd&lt;/code&gt;，在里面统一开启 &lt;code&gt;ClangTidy&lt;/code&gt; 诊断、未使用的 &lt;code&gt;#include&lt;/code&gt; 自动提示（Unused Includes）等，让团队所有人的编辑器行为保持一致。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-dai-ma-zhi-liang-yu-zi-dong-hua-lan-jie-quality-control-pre-commit&quot;&gt;3. 代码质量与自动化拦截（Quality Control &amp;amp; Pre-commit）&lt;/h2&gt;
&lt;p&gt;把代码检查做成&lt;strong&gt;无感自动化&lt;/strong&gt;，不给开发者增加心理负担。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;pre-commit 自动化框架&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; 使用 Python 的 &lt;code&gt;pre-commit&lt;/code&gt;，在本地 &lt;code&gt;.git/hooks/pre-commit&lt;/code&gt; 挂载任务。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 在开发者执行 &lt;code&gt;git commit&lt;/code&gt; 的那一刻，自动跑一遍 &lt;code&gt;clang-format&lt;/code&gt; 修复格式、检查是否不小心提交了数 MB 的大文件或敏感配置，有问题直接在本地拦截。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态分析三件套（CMake 零侵入配置）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;clang-tidy&lt;/code&gt;（代码潜在逻辑漏洞检查）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;include-what-you-use (IWYU)&lt;/code&gt;（自动清理无用的头文件，缩短编译时间）&lt;/li&gt;
&lt;li&gt;在 CMake 中开启基础但严谨的编译警告：&lt;code&gt;-Wall -Wextra -Wshadow -Wconversion&lt;/code&gt;，并将警告当成错误处理（&lt;code&gt;-Werror&lt;/code&gt;）。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-zi-dong-hua-ce-shi-yu-dong-tai-fen-xi-testing-sanitizers&quot;&gt;4. 自动化测试与动态分析（Testing &amp;amp; Sanitizers）&lt;/h2&gt;
&lt;p&gt;保证代码质量最省力的方式是“自动化”，而不是人工 Code Review。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Catch2 或 Doctest（比 GoogleTest 更现代化）&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;优点：&lt;/strong&gt; 相比于 GoogleTest 的繁重，Catch2 / Doctest 支持 Header-only 或非常轻量级的引入，语法更加现代化，支持 BD-style（&lt;code&gt;GIVEN&lt;/code&gt;, &lt;code&gt;WHEN&lt;/code&gt;, &lt;code&gt;THEN&lt;/code&gt;）测试写作，对现代 CMake 整合非常友好。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Sanitizers 作为 CI 的标准步骤&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;无需安装复杂软件，只需在构建时加上编译标志：
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;-fsanitize=address&lt;/code&gt; (ASan)：抓取野指针、内存越界、内存泄露。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;-fsanitize=undefined&lt;/code&gt; (UBSan)：抓取整数溢出、空指针等未定义行为。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 本地正常开发，但在 GitHub Actions / GitLab CI 自动化测试流水线中，强制在开启 Sanitizer 的模式下跑完所有单元测试。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;5-yi-ge-tong-yong-xian-dai-hua-de-xiang-mu-wen-jian-jie-gou-fan-li&quot;&gt;5. 一个通用、现代化的项目文件结构范例&lt;/h2&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;my_cpp_project/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakeLists.txt              # 主配置文件（干净、基于 Target 组织）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakePresets.json           # 统一的构建预设 (Debug/Release/ASan)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .clang-format               # 代码格式化规范&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .clang-tidy                 # 静态代码检查规则&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .clangd                     # 语言服务器 (clangd) 配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .pre-commit-config.yaml     # Git 提交前自动化检查&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── cmake/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── CPM.cmake               # 依赖自动化管理脚本&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── include/my_project/         # 对外暴露的头文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── src/                        # 核心业务实现代码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── main.cpp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── tests/                      # 单元测试代码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ├── CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    └── test_main.cpp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ji-jian-qie-you-ya-de-zhu-cmakelists-txt-can-kao&quot;&gt;极简且优雅的主 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 参考&lt;/h3&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cmake_minimum_required(VERSION 3.22)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;project(MyModernProject VERSION 1.0.0 LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_STANDARD_REQUIRED ON)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 自动生成 compile_commands.json 给 IDE / clangd 用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_EXPORT_COMPILE_COMMANDS ON)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 自动启用 ccache 编译加速&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;find_program(CCACHE_PROGRAM ccache)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if(CCACHE_PROGRAM)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    set(CMAKE_CXX_COMPILER_LAUNCHER &amp;quot;${CCACHE_PROGRAM}&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;endif()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 引入自动依赖管理 CPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include(cmake/CPM.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 引入现代化第三方库示例 (自动下载管理)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    NAME fmt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_REPOSITORY fmtlib/fmt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GIT_TAG 10.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    NAME Catch2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GITHUB_REPOSITORY catchorg/Catch2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GIT_TAG v3.4.0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 添加源代码子目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_subdirectory(src)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 4. 自动化测试开关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if(BUILD_TESTING)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    enable_testing()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    add_subdirectory(tests)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;endif()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;zong-jie-luo-di-qing-dan&quot;&gt;总结落地清单&lt;/h2&gt;
&lt;p&gt;对于&lt;strong&gt;绝大多数通用优秀 C++ 项目&lt;/strong&gt;，你只需要引入这几样东西，工程质量和研发体验就会有质的飞跃：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;构建与依赖：&lt;/strong&gt; &lt;code&gt;CMakePresets.json&lt;/code&gt; + &lt;code&gt;Ninja&lt;/code&gt; + &lt;code&gt;ccache&lt;/code&gt; + &lt;code&gt;CPM.cmake&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码体验：&lt;/strong&gt; &lt;code&gt;clangd&lt;/code&gt; + &lt;code&gt;C++20&lt;/code&gt; + &lt;code&gt;std::expected&lt;/code&gt; + &lt;code&gt;fmt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;自动化拦截：&lt;/strong&gt; &lt;code&gt;pre-commit&lt;/code&gt; (跑 clang-format) + CI 中跑 &lt;code&gt;ASan&lt;/code&gt; / &lt;code&gt;Catch2&lt;/code&gt; 单测&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;在放弃了“禁用动态堆内存”、“写形式化证明”等航天极危领域的极端束缚后，我们回归到&lt;strong&gt;桌面客户端、高并发后端、量化交易引擎、游戏服务端&lt;/strong&gt;等通用的工业级场景。&lt;/p&gt;
&lt;p&gt;一个&lt;strong&gt;兼顾极致工程效率、代码鲁棒性、构建速度与开发者幸福感&lt;/strong&gt;的中大型现代 C++ 项目（基于 macOS/Linux + LLVM/Clang + CMake），其“深入但不苛刻”的落地范式主要体现在以下 5 个核心维度：&lt;/p&gt;
&lt;h2 id=&quot;1-shen-du-cmake-yu-gou-jian-xi-tong-jia-gou-advanced-cmake-practices&quot;&gt;1. 深度 CMake 与构建系统架构 (Advanced CMake Practices)&lt;/h2&gt;
&lt;p&gt;中大型项目最忌讳“全局变量污染”和“编译慢”。现代 CMake 的深度玩法在于&lt;strong&gt;模块化 Target 划分&lt;/strong&gt;与&lt;strong&gt;确定性预设&lt;/strong&gt;。&lt;/p&gt;
&lt;h3 id=&quot;1-cmakepresets-json-cmakeuserpresets-json-ge-chi-fan-shi&quot;&gt;① &lt;code&gt;CMakePresets.json&lt;/code&gt; + &lt;code&gt;CMakeUserPresets.json&lt;/code&gt; 隔离范式&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;工程落地：&lt;/strong&gt; &lt;code&gt;CMakePresets.json&lt;/code&gt; 进 Git 仓库（定义 CI、Debug、Release、ASan 的统一生成参数）。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发体验：&lt;/strong&gt; 允许开发者新建 &lt;code&gt;.gitignore&lt;/code&gt; 掉的 &lt;code&gt;CMakeUserPresets.json&lt;/code&gt;，用来覆盖本地特有的 LLVM 路径或本地缓存路径，做到&lt;strong&gt;团队预设与个人环境绝对解耦&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-yan-ge-de-chun-target-qu-dong-she-ji-interface-libraries&quot;&gt;② 严格的“纯 Target 驱动”设计 (Interface Libraries)&lt;/h3&gt;
&lt;p&gt;废弃所有的 &lt;code&gt;include_directories()&lt;/code&gt; 或全局 &lt;code&gt;add_compile_options()&lt;/code&gt;。使用 &lt;code&gt;INTERFACE&lt;/code&gt; Target 封装项目通用的“编译选项库”：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 声明一个纯接口 Target 用于管理全局 Warning / Compiler Flags&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_library(project_warnings INTERFACE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_compile_options(project_warnings INTERFACE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    $&amp;lt;$&amp;lt;CXX_COMPILER_ID:Clang&amp;gt;:-Wall -Wextra -Wshadow -Wconversion -Wnon-virtual-dtor&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 声明一个纯接口 Target 用于开启 Sanitizer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_library(project_sanitizers INTERFACE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if(ENABLE_ASan)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    target_compile_options(project_sanitizers INTERFACE -fsanitize=address -fno-omit-frame-pointer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    target_link_options(project_sanitizers INTERFACE -fsanitize=address)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;endif()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 业务模块直接继承，避免选项隐式污染子模块&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_link_libraries(my_service PRIVATE project_warnings project_sanitizers)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-unity-build-bian-yi-jia-su-zhong-ji-wu-qi&quot;&gt;③ Unity Build（编译加速终极武器）&lt;/h3&gt;
&lt;p&gt;对于上百个 &lt;code&gt;.cpp&lt;/code&gt; 的大型 Target，在 CMake 3.16+ 中一键开启 Unity Build：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set_target_properties(my_service PROPERTIES&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    UNITY_BUILD ON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    UNITY_BUILD_BATCH_SIZE 16 # 将 16 个 cpp 合并为一个编译单元&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 能将整体编译时间缩短 &lt;strong&gt;50%~80%&lt;/strong&gt;，同时依然保持代码源文件的物理分离。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2-yi-lai-guan-li-zhi-li-vcpkg-manifest-binary-caching&quot;&gt;2. 依赖管理治理 (vcpkg Manifest + Binary Caching)&lt;/h2&gt;
&lt;p&gt;很多中大型项目死于“第三方库版本乱套”或“每个工程师都要重新编译一遍 Heavy Deps (如 Boost / OpenSSL)”。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;vcpkg Manifest 模式 (vcpkg.json) + Lockfile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;把 vcpkg 当作 npm/cargo 来用，在根目录放置 &lt;code&gt;vcpkg.json&lt;/code&gt;，声明所有依赖及其明确的版本约束（Baselines）。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;私有二进制缓存 (Binary Caching)&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;在中大型团队中，配置 CMake 环境变量 &lt;code&gt;VCPKG_BINARY_STAGING_DIR&lt;/code&gt; 指向团队内部的 S3/NFS 缓存。当 CI 或新同事拉取代码时，vcpkg &lt;strong&gt;直接下载编译好的 &lt;code&gt;.dylib&lt;/code&gt; / &lt;code&gt;.a&lt;/code&gt;&lt;/strong&gt;，无需在本地重新编译 Boost，节省数小时环境准备时间。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-yun-xing-shi-guan-ce-yu-jia-gou-fang-fu-observability-architecture&quot;&gt;3. 运行时观测与架构防腐 (Observability &amp;amp; Architecture)&lt;/h2&gt;
&lt;p&gt;通用优秀项目对运行时的掌控力体现在&lt;strong&gt;低开销日志、诊断&lt;/strong&gt;与&lt;strong&gt;架构约束&lt;/strong&gt;上。&lt;/p&gt;
&lt;h3 id=&quot;1-di-yan-chi-yi-bu-ri-zhi-spdlog-quill&quot;&gt;① 低延迟异步日志 (spdlog / Quill)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;规范：&lt;/strong&gt; 业务线程&lt;strong&gt;严禁发生同步 Disk I/O&lt;/strong&gt;。全量采用 &lt;code&gt;spdlog&lt;/code&gt; 的 &lt;code&gt;spdlog::create_async&amp;lt;spdlog::sinks::basic_file_sink_mt&amp;gt;&lt;/code&gt;，日志写入无锁环形队列（RingBuffer），由后台单线程刷盘。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;语义化日志：&lt;/strong&gt; 引入 &lt;code&gt;fmt&lt;/code&gt; 编译期校验，禁止拼字符串。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-nei-cun-fen-pei-qi-wu-feng-ti-huan-mimalloc&quot;&gt;② 内存分配器无缝替换 (Mimalloc)&lt;/h3&gt;
&lt;p&gt;在通用场景下，不禁用堆内存，但&lt;strong&gt;严禁直接用系统默认的 &lt;code&gt;malloc&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;利用 CMake 将微软开源的 &lt;code&gt;Mimalloc&lt;/code&gt; 设为全局覆盖：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 全局替换 malloc/free，高并发下内存碎片减少，性能提升 15%+&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;find_package(mimalloc CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_link_libraries(my_service PRIVATE mimalloc-static)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-mo-kuai-jian-yin-shi-ou-he-fang-hu-std-span-std-string-view&quot;&gt;③ 模块间隐式耦合防护 (&lt;code&gt;std::span&lt;/code&gt; &amp;amp; &lt;code&gt;std::string_view&lt;/code&gt;)&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;范式：&lt;/strong&gt; 跨模块函数调用接口&lt;strong&gt;严禁使用&lt;/strong&gt; &lt;code&gt;const std::vector&amp;lt;T&amp;gt;&amp;amp;&lt;/code&gt; 或 &lt;code&gt;const std::string&amp;amp;&lt;/code&gt; 作为入参，全面替换为 &lt;code&gt;std::span&amp;lt;const T&amp;gt;&lt;/code&gt; 和 &lt;code&gt;std::string_view&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;收益：&lt;/strong&gt; 彻底解除对特定容器实现的依赖，避免不必要的深拷贝（Deep Copy）与临时对象产生。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;4-zeng-liang-jing-tai-sao-miao-yu-ci-zi-dong-hua-lan-jie-strict-ci-pipeline&quot;&gt;4. 增量静态扫描与 CI 自动化拦截 (Strict CI Pipeline)&lt;/h2&gt;
&lt;p&gt;不需要开启令人抓狂的全量检查，而是强调“谁修改，谁负责”的增量检查。&lt;/p&gt;
&lt;h3 id=&quot;1-git-clang-format-zeng-liang-jian-cha&quot;&gt;① &lt;code&gt;git-clang-format&lt;/code&gt; 增量检查&lt;/h3&gt;
&lt;p&gt;在 &lt;code&gt;pre-commit&lt;/code&gt; 或 CI 脚本中，不全量扫历史脏代码，只扫描本次 Diff：&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 只检查本次 Commit 涉及改动的行，避免全量重构历史代码的负担&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git-clang-format --diff HEAD~1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-clang-tidy-zeng-liang-ji-cheng-clang-tidy&quot;&gt;② &lt;code&gt;clang-tidy&lt;/code&gt; 增量集成 (.clang-tidy)&lt;/h3&gt;
&lt;p&gt;在 CMake 中使用 &lt;code&gt;CMAKE_CXX_CLANG_TIDY&lt;/code&gt; 属性。重点开启以下工业级高收益规则：&lt;/p&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Checks: &amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -*,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  bugprone-*,          # 捕获潜在 Bug (如未初始化的变量、死锁)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  performance-*,        # 捕获性能开销 (如不必要的拷贝、按值传递大对象)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  modernize-use-auto,   # 代码现代风格&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  modernize-use-using,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  readability-redundant-smartptr-get&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;WarningsAsErrors: &amp;#39;bugprone-*,performance-*&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;5-xian-dai-hua-diao-shi-yu-crash-dump-fang-yu-post-mortem-debugging&quot;&gt;5. 现代化调试与 Crash Dump 防御 (Post-Mortem Debugging)&lt;/h2&gt;
&lt;p&gt;在生产环境或用户桌面端发生 Segfault 崩溃时，要能够&lt;strong&gt;离线还原现场&lt;/strong&gt;。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Google Crashpad 集成&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; 在进程启动时初始化 Crashpad 进程。当发生崩溃时，Crashpad 在后台静默捕捉当前的线程上下文、寄存器状态和调用栈，生成 &lt;code&gt;.dmp&lt;/code&gt; (Minidump) 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;符号表离线还原 (DSYM / PDB Store)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;构建系统在 Release 模式下生成单独的符号文件（macOS 下的 &lt;code&gt;.dSYM&lt;/code&gt;，Windows 的 &lt;code&gt;.pdb&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;配合 Sentry 或自建的 Minidump 还原服务，在收到崩溃日志后，自动化还原出崩溃发生在源代码的&lt;strong&gt;哪一行&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;xian-dai-tong-yong-you-xiu-c-xiang-mu-luo-di-ju-zhen-zong-jie&quot;&gt;现代通用优秀 C++ 项目落地矩阵总结&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;维度&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;落地工具/范式&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;引入后的工程提升&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;构建管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;CMakePresets.json&lt;/code&gt; + &lt;code&gt;INTERFACE Targets&lt;/code&gt;&lt;/td&gt;&lt;td&gt;环境绝对统一，CMake 代码解耦无全局污染&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;编译加速&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Unity Build&lt;/strong&gt; + &lt;code&gt;ccache&lt;/code&gt; + &lt;code&gt;Ninja&lt;/code&gt;&lt;/td&gt;&lt;td&gt;大型项目增量构建速度提升 50%~80%&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;依赖管理&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;vcpkg Manifest&lt;/code&gt; + 私有 Binary Cache&lt;/td&gt;&lt;td&gt;依赖版本锁定，无需本地重复编译大大型 C++ 库&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;错误/接口&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;std::expected&lt;/code&gt; + &lt;code&gt;std::span&lt;/code&gt; + &lt;code&gt;std::string_view&lt;/code&gt;&lt;/td&gt;&lt;td&gt;强制显示错误处理，接口无隐式深拷贝开销&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;内存/日志&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Mimalloc&lt;/code&gt; + &lt;code&gt;spdlog&lt;/code&gt; (Async Queue)&lt;/td&gt;&lt;td&gt;显著降低多线程内存碎片与主线程 I/O 阻塞&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;质量拦截&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;git-clang-format&lt;/code&gt; + &lt;code&gt;clang-tidy&lt;/code&gt; (增量模式)&lt;/td&gt;&lt;td&gt;不纠结历史旧代码，对新增改动做自动化拦截&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;崩溃防御&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;Crashpad&lt;/code&gt; + Minidump 离线符号还原&lt;/td&gt;&lt;td&gt;生产环境 Segfault 崩溃秒级定位具体代码行&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;xian-dai-hua-ide-yu-zhen-duan-ti-yan-clangd-diagnostician&quot;&gt;. 现代化 IDE 与诊断体验 (&lt;code&gt;.clangd&lt;/code&gt; + Diagnostician)&lt;/h2&gt;
&lt;p&gt;目前工业界中大型团队（特别是使用 VS Code, CLion, Neovim, Nova 等工具的团队）正全面转向以 &lt;strong&gt;&lt;code&gt;clangd&lt;/code&gt;&lt;/strong&gt; 作为核心语言服务器。与普通的 IDE 补全插件不同，通过在项目根目录深度配置 &lt;code&gt;.clangd&lt;/code&gt; 文件，可以将代码质量检查&lt;strong&gt;无感融入日常敲代码的过程&lt;/strong&gt;中：&lt;/p&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 项目根目录下的 .clangd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CompileFlags:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Add:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - &amp;quot;-Wall&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - &amp;quot;-Wextra&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - &amp;quot;-Wconversion&amp;quot;      # 实时提醒隐式类型截断/精度丢失&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    - &amp;quot;-Iinclude&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Remove: [-Werror]       # 在 IDE 编辑时不要把 Warning 显示为阻碍编辑的 Error&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Diagnostics:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  UnusedIncludes: Strict # 实时高亮显示没有用到的头文件，引导开发者清理 include&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ClangTidy:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Add:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - performance-*     # 实时提示按值传递大对象等性能损耗&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - bugprone-*        # 实时提示死锁、野指针隐患&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - modernize-*       # 引导写出更现代的 C++20 代码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Remove:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - readability-implicit-bool-conversion&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;InlayHints:               # 编辑器内直接嵌入类型与参数名提示&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Designators: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Enabled: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ParameterNames: true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  DeducedTypes: true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;落地收益：&lt;/strong&gt; 开发者在打字的瞬间就能看到隐藏的性能与逻辑漏洞，无需等到本地编译甚至 CI 流水线报错才发现问题。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;2-cmake-dai-ma-ge-shi-hua-yu-zi-dong-hua-linter-cmake-format-cmake-lint&quot;&gt;2. CMake 代码格式化与自动化 Linter (cmake-format &amp;amp; cmake-lint)&lt;/h2&gt;
&lt;p&gt;在一个多人协作的中大型 C++ 项目中，大家往往关注了 &lt;code&gt;.cpp&lt;/code&gt; / &lt;code&gt;.h&lt;/code&gt; 的格式，却忽略了 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 本身也是需要维护的代码。漫天飞舞、格式错乱的 CMake 代码是项目“腐化”的重灾区。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;cmakelang&lt;/code&gt; (cmake-format / cmake-lint)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; 引入 Python 工具链中的 &lt;code&gt;cmake-format&lt;/code&gt;，并在 &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; 中配置。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;效果：&lt;/strong&gt; 自动将项目的 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 统一排版（例如缩进、参数换行规范、指令小写等），并使用 &lt;code&gt;cmake-lint&lt;/code&gt; 检查是否存在废弃函数调用或未用变量。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;YAML&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# .pre-commit-config.yaml 中的 CMake 拦截片段&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  - repo: https://github.com/cheshirekow/cmakelang&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    rev: v0.6.13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    hooks:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - id: cmake-format&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;      - id: cmake-lint&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;3-ji-su-dan-ce-yu-yi-lai-mock-fan-shi-catch2-v3-doctest-fakeit&quot;&gt;3. 极速单测与依赖 Mock 范式 (Catch2 v3 / Doctest + FakeIt)&lt;/h2&gt;
&lt;p&gt;传统 GoogleTest 的问题在于构建较重、需要编译单独的库，且 Mock 语法（GoogleMock）相对繁琐。现代通用 C++ 项目更推荐以下轻量且现代化的单元测试范式：&lt;/p&gt;
&lt;h3 id=&quot;1-catch2-v3-doctest-de-xian-dai-dan-ce-xie-fa&quot;&gt;① Catch2 v3 / Doctest 的现代单测写法&lt;/h3&gt;
&lt;p&gt;Catch2 v3 已经改为了静态库链接模式（大幅提升单测编译速度），并原生支持由 C++20 驱动的 &lt;strong&gt;BDD（Behavior-Driven Development）&lt;/strong&gt; 风格：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;catch2/catch_test_macros.hpp&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;SCENARIO(&amp;quot;Order book processes incoming limit orders&amp;quot;, &amp;quot;[matching_engine]&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    GIVEN(&amp;quot;An empty order book&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        OrderBook book;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        WHEN(&amp;quot;A new buy limit order is placed&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            auto result = book.place_order(Price{100}, Quantity{10}, Side::Buy);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            THEN(&amp;quot;The order should be accepted and added to the book&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                REQUIRE(result.has_value());&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                REQUIRE(book.buy_levels_count() == 1);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-jie-he-wei-zao-kuang-jia-fakeit-trompeloeil-ge-chi-wai-bu-yi-lai&quot;&gt;② 结合伪造框架 (FakeIt / Trompeloeil) 隔离外部依赖&lt;/h3&gt;
&lt;p&gt;避免编写繁琐的继承与宏定义。利用 &lt;strong&gt;&lt;code&gt;FakeIt&lt;/code&gt;&lt;/strong&gt; 这类 Header-only 的轻量 Mock 框架，针对接口类（Pure Virtual Interface）在单测中快速模拟依赖行为（如网络 Socket、数据库连接）：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 快速 Mock 一个网络发送接口，而无需引入复杂的 GMock 宏&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Mock&amp;lt;INetworkClient&amp;gt; mock_network;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;When(Method(mock_network, send_packet)).AlwaysReturn(true);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;INetworkClient&amp;amp; client = mock_network.get();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 将 client 注入待测业务类中运行测试...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;4-yi-lai-xiang-sheng-ji-yu-an-quan-lou-dong-jian-kong-dependabot-renovate&quot;&gt;4. 依赖项升级与安全漏洞监控 (Dependabot / Renovate)&lt;/h2&gt;
&lt;p&gt;在中大型通用项目中，通常会依赖上百个第三方开源库（通过 &lt;code&gt;vcpkg.json&lt;/code&gt; 或 &lt;code&gt;CPM.cmake&lt;/code&gt; 引入）。如果长期不升级，不仅错过性能优化，还容易埋下安全 CVE 漏洞。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Renovate Bot (针对 vcpkg / Conan / CMake 的自动化依赖升级)&lt;/strong&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;落地：&lt;/strong&gt; 在 Git 托管平台（GitHub / GitLab）配置 Renovate。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;机制：&lt;/strong&gt; 机器人每周会自动扫描你的 &lt;code&gt;vcpkg.json&lt;/code&gt; 或 &lt;code&gt;CPMAddPackage&lt;/code&gt; 脚本，如果发现 &lt;code&gt;spdlog&lt;/code&gt; 或 &lt;code&gt;fmt&lt;/code&gt; 发布了新版本，会自动提一个 PR，并附带该版本的 ChangeLog。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配合 CI：&lt;/strong&gt; 只要 CI 流水线（编译 + 跑单测 + ASan 测试）自动通过，架构师只需点击一下 Approve 即可无痛保持项目依赖处于最新状态。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;-2&quot;&gt;&lt;/h2&gt;
&lt;h2 id=&quot;1-abi-symbol-visibility-control-fu-hao-dao-chu-kong-zhi-yu-ku-shou-shen&quot;&gt;1. ABI &amp;amp; Symbol Visibility Control (符号导出控制与库瘦身)&lt;/h2&gt;
&lt;p&gt;在中大型 C++ 项目中（特别是包含 &lt;code&gt;.dylib&lt;/code&gt; / &lt;code&gt;.so&lt;/code&gt; 动态库的项目），如果不显式控制符号导出，所有内部函数默认都会被导出到符号表中。这不仅会导致&lt;strong&gt;动态库体积膨胀&lt;/strong&gt;，还会增加 &lt;strong&gt;Dynamic Linker (dyld)&lt;/strong&gt; 在程序启动时的加载耗时（Symbol Binding / Fixups）。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;默认隐藏所有符号 (&lt;code&gt;-fvisibility=hidden&lt;/code&gt;)&lt;/strong&gt; 在 CMake 中全局开启默认隐藏标志，仅显式标记要对外暴露的 API：&lt;/p&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_VISIBILITY_PRESET hidden)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_VISIBILITY_INLINES_HIDDEN ON)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;使用属性选择性导出&lt;/strong&gt; 使用现代导出头文件控制宏（CMake 提供了 &lt;code&gt;GenerateExportHeader&lt;/code&gt; 模块自动为你生成这个文件）：&lt;/p&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;quot;my_engine_export.h&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 只有标记了 MY_ENGINE_EXPORT 的类/函数才会被导出到 .dylib 符号表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class MY_ENGINE_EXPORT EngineCore {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    void start();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 内部实现类，外部无法感知，符号完全隐藏&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;class InternalScheduler {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    void do_work();&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;收益：&lt;/strong&gt; 动态库体积缩减 20%~40%，程序启动加载速度提升，同时防止了外部使用者非法 Hook 或直接调用你的内部非公开函数。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;2-bian-yi-qi-fan-she-yu-xu-lie-hua-fan-shi-compile-time-reflection-serialization&quot;&gt;2. 编译期反射与序列化范式 (Compile-Time Reflection &amp;amp; Serialization)&lt;/h2&gt;
&lt;p&gt;在中大型项目（如后端 RPC、游戏配置加载、桌面端 JSON 解析）中，传统的“手写 &lt;code&gt;to_json&lt;/code&gt; / &lt;code&gt;from_json&lt;/code&gt; 序列化”是代码冗余和 Bug 的温床。现代 C++ 倾向于利用 &lt;strong&gt;C++20 Struct Binding (结构体绑定) 与 模板元编程&lt;/strong&gt; 实现零开销/近乎无痛的自动序列化。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;结合 &lt;code&gt;nlohmann/json&lt;/code&gt; + &lt;code&gt;magic_enum&lt;/code&gt; + Aggregate Struct&lt;/strong&gt; 对于普通的 C++ 聚合结构体（Aggregate Structs），引入像 &lt;code&gt;glaze&lt;/code&gt; 或利用 &lt;code&gt;magic_enum&lt;/code&gt; 实现枚举字符串与数值的零成本转换：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;glaze/glaze.hpp&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;magic_enum.hpp&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enum class OrderType { Limit, Market, Stop };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;struct OrderRequest {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    std::string symbol;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    double price;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    int quantity;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    OrderType type;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 使用 Glaze / Modern Reflection 方案&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 无需手写繁琐的 parse 函数，编译期自动做映射&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;void process_json(std::string_view json_str) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    OrderRequest req;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    auto ec = glz::read_json(req, json_str);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if (!ec) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        // 解析成功，直接使用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        log_info(&amp;quot;Order type: {}&amp;quot;, magic_enum::enum_name(req.type));&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;3-kua-ping-tai-tuan-dui-tong-yi-de-gong-ju-gou-jian-jiao-ben-task-runners-just&quot;&gt;3. 跨平台/团队统一的工具构建脚本 (Task Runners / Just)&lt;/h2&gt;
&lt;p&gt;虽然有了 &lt;code&gt;CMakePresets.json&lt;/code&gt;，但是在日常开发中，工程师除了 &lt;code&gt;cmake --build&lt;/code&gt; 之外，往往还需要运行格式化、跑本地 CI 模拟测试、清理缓存、更新依赖等。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;放弃复杂的 Makefile / Bash 脚本，转向 &lt;code&gt;just&lt;/code&gt; (Just a Command Runner)&lt;/strong&gt; 在中大型团队中，推荐在项目根目录提供一个 &lt;code&gt;justfile&lt;/code&gt;。&lt;code&gt;just&lt;/code&gt; 是一个现代化的命令运行工具（比 &lt;code&gt;make&lt;/code&gt; 更简洁且专门用于任务调度）：&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码段&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#根目录下的 justfile 示例&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 默认打印帮助信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;default:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    @just --list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 本地一键配置并构建 Debug 模式&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;build:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cmake --preset debug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cmake --build --preset debug -j&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 运行全套单元测试并开启 Sanitizer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cmake --preset asan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cmake --build --preset asan&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ctest --preset asan --output-on-failure&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 运行格式化与 clang-tidy 检查&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;check:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    git-clang-format HEAD~1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    cmake --build --preset debug --target clang-tidy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;收益：&lt;/strong&gt; 新员工入职第一天，克隆仓库后只需输入 &lt;code&gt;just build&lt;/code&gt; 或 &lt;code&gt;just test&lt;/code&gt;，即可拉起整套现代化流程，不需要去记忆冗长的 &lt;code&gt;cmake&lt;/code&gt; 命令行参数。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;4-quan-tao-gong-ye-ji-jia-gou-liu-shui-xian-shi-jiao-full-modern-architecture-pipeline&quot;&gt;4. 全套工业级架构流水线视角 (Full Modern Architecture Pipeline)&lt;/h2&gt;
&lt;p&gt;至此，我们将这套“深入、现代化、通用且高效”的中大型 C++ 工程架构归纳为如下清晰的协作闭环：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ 编码与开发阶段 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 语义表达: C++20/23 (std::expected, std::span, std::string_view)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 交互辅助: .clangd 嵌入式诊断 + justfile 统一命令调度&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  └── 依赖管理: vcpkg Manifest (vcpkg.json) + CPM.cmake 自动管理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ 提交与增量拦截 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 本地 Check: pre-commit 脚本 (git-clang-format / cmake-format)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  └── 隐式保护: 符号隐蔽 (-fvisibility=hidden) + 强类型屏蔽隐式类型转换&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ CI/CD 极速构建 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 编译引擎: Ninja + ccache + Unity Build (增量秒级构建)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 依赖加速: vcpkg Binary Cache (二进制预编译缓存，跳过源码构建)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  └── 自动化测试: Catch2 v3 (BDD 风格) + ASan / UBSan 动态检查&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[ 生产部署与观测 ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ├── 内存/日志: Mimalloc (取代默认 malloc) + spdlog (无锁环形队列日志)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  └── 崩溃追踪: Crashpad (自动捕获 Minidump) + DSYM 符号表离线还原&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;luo-di-shi-shi-jian-yi-zong-jie&quot;&gt;落地实施建议总结&lt;/h2&gt;
&lt;p&gt;如果你准备将你的 C++ 项目进行全面升级，建议采取“循序渐进”的引入策略，而不是一次性重构：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;第一周（基础打底）：&lt;/strong&gt; 引入 &lt;code&gt;.clang-format&lt;/code&gt; + &lt;code&gt;CMakePresets.json&lt;/code&gt; + &lt;code&gt;ccache&lt;/code&gt;，解决构建环境不一致与编译慢的问题。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第二周（质量防护）：&lt;/strong&gt; 配置 &lt;code&gt;.pre-commit-config.yaml&lt;/code&gt; 跑增量 &lt;code&gt;git-clang-format&lt;/code&gt;，并在 CI 中挂载 &lt;code&gt;Catch2&lt;/code&gt; + &lt;code&gt;AddressSanitizer&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第三周（现代架构演进）：&lt;/strong&gt; 在 CMake 中引入 &lt;code&gt;INTERFACE&lt;/code&gt; Targets，并在代码中新编写的模块里全面推广 &lt;code&gt;std::expected&lt;/code&gt; / &lt;code&gt;std::span&lt;/code&gt; 替代 C 风格接口。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第四周（生产准备）：&lt;/strong&gt; 挂载 &lt;code&gt;Mimalloc&lt;/code&gt; 与 &lt;code&gt;Crashpad&lt;/code&gt;，建立符号表存储机制，实现生产环境 Segment Fault 的精准离线定位。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;既然你的目标是&lt;strong&gt;学习&lt;/strong&gt;现代优秀 C++ 项目的设计范式与前沿工具，而不是重构旧项目，那么最有效的方法就是通过“剖析标杆开源项目” + “用极简 Sandbox 手操搭建”来建立直观认知。&lt;/p&gt;
&lt;p&gt;以下为你梳理一套适合学习和消化这些前沿工具与范式的方法论，以及最值得你直接 clone 下来阅读的代码库：&lt;/p&gt;
&lt;h2 id=&quot;1-chai-jie-xue-xi-mu-qian-gong-ren-you-xiu-de-xian-dai-c-biao-gan-xiang-mu&quot;&gt;1. 拆解学习：目前公认优秀的“现代 C++ 标杆项目”&lt;/h2&gt;
&lt;p&gt;看优秀开源项目的 CMake 怎么写、代码怎么组织，是学习现代范式最快的方式。建议去 GitHub 克隆并仔细阅读以下几个仓库：&lt;/p&gt;
&lt;h3 id=&quot;tui-jian-kai-yuan-cang-ku-qing-dan&quot;&gt;推荐开源仓库清单&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;strong&gt;仓库名称 / 作者&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;建议重点看什么&lt;/strong&gt;&lt;/th&gt;&lt;th&gt;&lt;strong&gt;学习价值&lt;/strong&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;fmtlib/fmt&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Formatting Library)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;• &lt;code&gt;CMakeLists.txt&lt;/code&gt; 的纯 Target 设计 • C++20 &lt;code&gt;constexpr&lt;/code&gt; 编译期字符串解析与元编程&lt;/td&gt;&lt;td&gt;&lt;strong&gt;C++ 工业界第一标杆&lt;/strong&gt;。代码极其干净，是学习现代 CMake、符号隐藏（&lt;code&gt;-fvisibility=hidden&lt;/code&gt;）和现代 C++ 模板的最佳范本。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;quill&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Quill Asynchronous Logger)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;• 低延迟环形缓冲区（RingBuffer）设计 • C++20 强类型与无锁队列（Lock-free Queue）&lt;/td&gt;&lt;td&gt;&lt;strong&gt;高频/量化级别的通用日志库&lt;/strong&gt;。展示了如何用现代化 C++ 榨干 CPU 性能，且工程结构非常规整。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;velox&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Meta 开源 C++ 执行引擎)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;• 大型项目的 &lt;code&gt;CMakePresets.json&lt;/code&gt; 与模块拆分 • 内存分配器（Arena/Memory Pool）与矢量化计算&lt;/td&gt;&lt;td&gt;&lt;strong&gt;Meta 级别的现代 C++ 大体量工程&lt;/strong&gt;。展示了现代中大型 C++ 基础设施是如何组织依赖、处理异常和利用矢量化 (SIMD) 的。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;glaze&lt;/code&gt;&lt;/strong&gt; &lt;em&gt;(Glaze JSON/Serialization)&lt;/em&gt;&lt;/td&gt;&lt;td&gt;• C++20 Compile-time Reflection（编译期反射） • 极简现代 C++ 接口设计，完全无宏设计&lt;/td&gt;&lt;td&gt;&lt;strong&gt;现代 C++ 模板与反射的巅峰之作&lt;/strong&gt;。看它如何完全抛弃旧式的反射和宏，做到超越 C 的解析性能。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h2 id=&quot;2-dong-shou-xue-xi-lu-xian-cong-ling-da-zao-ni-de-xian-dai-c-xue-xi-jiao-shou-jia&quot;&gt;2. 动手学习路线：从零打造你的“现代 C++ 学习脚手架”&lt;/h2&gt;
&lt;p&gt;学习这些工具最好的方式，是在本地 macOS 上&lt;strong&gt;从零搭建一个微型 Sandbox 项目&lt;/strong&gt;，亲自跑通一遍流水线：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;my-modern-cpp-sandbox/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakeLists.txt            # 1. 学习 Interface Target &amp;amp; CPM.cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── CMakePresets.json         # 2. 学习统一环境配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .clang-format             # 3. 学习 LLVM 代码排版规约&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .clangd                   # 4. 学习 clangd 实时诊断配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── .pre-commit-config.yaml   # 5. 学习 Git Hook 自动化拦截&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── src/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    └── main.cpp              # 6. 练习 C++20 std::expected / std::span / fmt&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;xue-xi-ren-wu-bu-zou-jian-yi&quot;&gt;学习任务步骤建议：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;第 1 步（构建体验）：&lt;/strong&gt; 尝试配置 &lt;code&gt;.clangd&lt;/code&gt; 和 &lt;code&gt;CMakePresets.json&lt;/code&gt;，在 VS Code / CLion 中体验打字时 &lt;code&gt;clangd&lt;/code&gt; 给出的实时 &lt;code&gt;performance-*&lt;/code&gt; 诊断提示。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 2 步（依赖体验）：&lt;/strong&gt; 尝试在 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 中用 &lt;code&gt;CPM.cmake&lt;/code&gt; 自动抓取 &lt;code&gt;fmt&lt;/code&gt; 和 &lt;code&gt;Catch2&lt;/code&gt;，体会“无额外安装、开箱即用”的干净依赖管理。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 3 步（安全体验）：&lt;/strong&gt; 在 CMake 中写一个 &lt;code&gt;-DENABLE_ASAN=ON&lt;/code&gt; 开关，故意写一个内存越界（Heap Out-of-Bounds）或野指针，跑一遍单测，直观感受 &lt;strong&gt;AddressSanitizer (ASan)&lt;/strong&gt; 打印出的精确崩溃堆栈。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;第 4 步（代码范式）：&lt;/strong&gt; 用 &lt;code&gt;std::expected&lt;/code&gt; 重新写一个简单的文件读取或网络解析逻辑，对比旧时代抛 &lt;code&gt;std::runtime_error&lt;/code&gt; 异常或返回 &lt;code&gt;int err_code&lt;/code&gt; 的感官差异。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;3-ji-jian-sandbox-dai-ma-shi-cao-ke-zhi-jie-fu-zhi-chang-shi&quot;&gt;3. 极简 Sandbox 代码实操 (可直接复制尝试)&lt;/h2&gt;
&lt;p&gt;你可以直接在本地创建以下两个文件，体验现代 CMake 与现代 C++ 语法的结合：&lt;/p&gt;
&lt;h3 id=&quot;1-cmakelists-txt-xian-dai-target-feng-ge-cpm-yi-lai-huo-qu&quot;&gt;① &lt;code&gt;CMakeLists.txt&lt;/code&gt;（现代 Target 风格 + CPM 依赖获取）&lt;/h3&gt;
&lt;p&gt;CMake&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cmake_minimum_required(VERSION 3.22)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;project(ModernCppSandbox LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_CXX_STANDARD_REQUIRED ON)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;set(CMAKE_EXPORT_COMPILE_COMMANDS ON)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 自动集成 ccache 编译加速&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;find_program(CCACHE_PROGRAM ccache)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;if(CCACHE_PROGRAM)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    set(CMAKE_CXX_COMPILER_LAUNCHER &amp;quot;${CCACHE_PROGRAM}&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;endif()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 轻量级获取现代化依赖&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;include(gh:cpm-cmake/CPM.cmake@0.38.7)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&amp;quot;gh:fmtlib/fmt#10.1.1&amp;quot;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 声明项目的主 Target&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_executable(sandbox_app src/main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_link_libraries(sandbox_app PRIVATE fmt::fmt)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 4. 严谨的 Warning 控制 Target (接口继承)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;add_library(project_warnings INTERFACE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_compile_options(project_warnings INTERFACE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    $&amp;lt;$&amp;lt;CXX_COMPILER_ID:Clang&amp;gt;:-Wall -Wextra -Wconversion -Wshadow&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;target_link_libraries(sandbox_app PRIVATE project_warnings)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-src-main-cpp-xian-dai-c-20-cuo-wu-chu-li-ge-shi-hua&quot;&gt;② &lt;code&gt;src/main.cpp&lt;/code&gt;（现代 C++20 / 错误处理 / 格式化）&lt;/h3&gt;
&lt;p&gt;C++&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;fmt/core.h&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;expected&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;string_view&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#include &amp;lt;span&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 现代范式 1: 使用 std::expected 显式传递错误&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enum class ParseError { InvalidFormat, OutOfRange };&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;std::expected&amp;lt;int, ParseError&amp;gt; parse_port(std::string_view input) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if (input.empty()) return std::unexpected(ParseError::InvalidFormat);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if (input == &amp;quot;8080&amp;quot;) return 8080;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return std::unexpected(ParseError::OutOfRange);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;// 现代范式 2: 使用 std::span 接收连续内存片段，无拷贝且解耦 vector&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;void print_bytes(std::span&amp;lt;const uint8_t&amp;gt; bytes) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fmt::print(&amp;quot;Buffer size: {} bytes, first byte: {:#x}\n&amp;quot;, bytes.size(), bytes.empty() ? 0 : bytes[0]);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;int main() {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    // 体验 std::expected 的显示错误处理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    auto result = parse_port(&amp;quot;8080&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if (result) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        fmt::print(&amp;quot;Successfully parsed port: {}\n&amp;quot;, *result);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    } else {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        fmt::print(&amp;quot;Failed to parse port.\n&amp;quot;);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uint8_t dummy_data[] = {0xDE, 0xAD, 0xBE, 0xEF};&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    print_bytes(dummy_data); // 自动隐式转换为 std::span&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    return 0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;4-xue-xi-zong-jie-yu-he-xin-shou-huo&quot;&gt;4. 学习总结与核心收获&lt;/h2&gt;
&lt;p&gt;以学习和理解为目的时，你只需要在头脑中建立起这套&lt;strong&gt;现代 C++ 工程思维图谱&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;构建不是写脚本，而是“搞面向对象”：&lt;/strong&gt; 现代 CMake 核心是 &lt;code&gt;Target&lt;/code&gt; 和 &lt;code&gt;Property&lt;/code&gt; 的传递（&lt;code&gt;PUBLIC/PRIVATE/INTERFACE&lt;/code&gt;），放弃全局变量。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;错误处理不再依靠“猜”或“捕获”：&lt;/strong&gt; 现代化 C++ 倾向于用 &lt;code&gt;std::expected&lt;/code&gt; / &lt;code&gt;std::optional&lt;/code&gt; 在编译期强迫开发者处理错误分支。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;性能优化靠“接口设计”而非“奇技淫巧”：&lt;/strong&gt; 接口多用 &lt;code&gt;std::span&lt;/code&gt; 和 &lt;code&gt;std::string_view&lt;/code&gt;，减少深拷贝；分配用 &lt;code&gt;Mimalloc&lt;/code&gt;，从源头解决碎片与并发锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;高质量代码靠“工具链防御”：&lt;/strong&gt; 依靠 &lt;code&gt;clangd&lt;/code&gt; 的实时 Diagnostician、&lt;code&gt;ASan&lt;/code&gt; 的动态抓取、&lt;code&gt;clang-format&lt;/code&gt; 的自动纠偏，把“人工审查”的负担降到最低。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;1-bian-liang-ti-huan-yin-qing-yu-jiao-hu-shi-wen-da-template-parameterization-interactive-prompts&quot;&gt;1. 变量替换引擎与交互式问答（Template Parameterization &amp;amp; Interactive Prompts）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;痛点：&lt;/strong&gt; 应用模板（&lt;code&gt;apply&lt;/code&gt;）后，用户往往需要手动去修改 &lt;code&gt;project(000_Single_Exe_Module)&lt;/code&gt;、&lt;code&gt;namespace&lt;/code&gt;、作者名字、C++ 标准等。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优化方案：&lt;/strong&gt; 引入轻量模版引擎（如 Liquid / Handlebars / Jinja），在模板根目录下支持 &lt;code&gt;.sc-cmake.toml&lt;/code&gt; 参数配置文件。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;效果：&lt;/strong&gt; 运行 &lt;code&gt;sc-cmake apply 000_Single_Exe_Module my_project&lt;/code&gt; 时，CLI 自动开启交互式提问（或解析命令行参数）：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;? Project Name: my_finance_engine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;? C++ Standard: [C++20 / C++23 / C++17] (默认 C++20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;? Include License: [MIT / Apache-2.0 / None]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;? Enable Sanitizers (ASan/UBSan)? [Y/n]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;? Dependency Manager: [vcpkg / CPM.cmake / Conan / None]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;随后在解压模板时，自动填充 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 中的 &lt;code&gt;project({{project_name}})&lt;/code&gt; 以及源文件中的 &lt;code&gt;#include &amp;lt;{{project_name}}/core.hpp&amp;gt;&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;er-cli-jiao-hu-yu-kai-fa-ti-yan-you-hua-developer-experience&quot;&gt;二、 CLI 交互与开发体验优化（Developer Experience）&lt;/h2&gt;
&lt;h3 id=&quot;1-mo-hu-sou-suo-yu-jiao-hu-shi-tui-cai-dan-interactive-fuzzy-finder&quot;&gt;1. 模糊搜索与交互式 TUI 菜单（Interactive Fuzzy Finder）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;痛点：&lt;/strong&gt; 模板多了之后，用户记不住具体名字，每次都要先 &lt;code&gt;sc-cmake list&lt;/code&gt; 看一眼，再复制名字 &lt;code&gt;apply&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;优化方案：&lt;/strong&gt; 如果用户直接运行 &lt;code&gt;sc-cmake apply&lt;/code&gt; 或 &lt;code&gt;sc-cmake info&lt;/code&gt;（不带参数），自动唤起类似 &lt;code&gt;fzf&lt;/code&gt; 的终端 TUI 选择界面（终端方向键选择模板，并实时预览模板简介/目录树）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;2-yu-lan-mo-shi-dry-run&quot;&gt;2. 预览模式（Dry-Run）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;优化方案：&lt;/strong&gt; 增加 &lt;code&gt;-n&lt;/code&gt; / &lt;code&gt;--dry-run&lt;/code&gt; 选项。&lt;/p&gt;
&lt;p&gt;Bash&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sc-cmake apply 000_Single_Exe_Module my_project --dry-run&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只打印出&lt;strong&gt;即将创建哪些文件、替换哪些变量&lt;/strong&gt;，而不真正写入磁盘。这在用户担心覆盖当前目录已有文件时非常有用。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;3-zhi-neng-jian-kang-jian-cha-yu-huan-jing-zhen-duan-sc-cmake-doctor&quot;&gt;3. 智能健康检查与环境诊断（&lt;code&gt;sc-cmake doctor&lt;/code&gt;）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;现状：&lt;/strong&gt; 你已经有了 &lt;code&gt;check&lt;/code&gt;（模板健康检测），这非常棒！&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;扩展：&lt;/strong&gt; 可以提供一个 &lt;code&gt;sc-cmake doctor&lt;/code&gt; 专门检查&lt;strong&gt;本地 C++ 研发环境&lt;/strong&gt;是否齐全：
&lt;ul&gt;
&lt;li&gt;[✓] CMake version 3.25.1&lt;/li&gt;
&lt;li&gt;[✓] Clang 18.0.0&lt;/li&gt;
&lt;li&gt;[✓] Ninja generator found&lt;/li&gt;
&lt;li&gt;[✓] ccache detected&lt;/li&gt;
&lt;li&gt;[!] vcpkg not found in PATH (Optional)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;si-ji-ke-xi-jie-yu-kai-fa-zhe-ti-yan-ux-polish&quot;&gt;四、 极客细节与开发者体验（UX Polish）&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;终端彩色输出与格式对齐 (Chalk / Lipgloss 风格)：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;使用高亮色彩区分：&lt;code&gt;SUCCESS&lt;/code&gt; (绿色), &lt;code&gt;WARNING&lt;/code&gt; (黄色), &lt;code&gt;PATH&lt;/code&gt; (蓝色/下划线)。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;在生成项目后，打印出漂亮的 &lt;strong&gt;“Next Steps”（下一步指南）&lt;/strong&gt;：&lt;/p&gt;
&lt;p&gt;Plaintext&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🎉 Project [my_finance_app] created successfully!&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Next steps:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  1. cd my_finance_app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  2. cmake --preset debug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  3. cmake --build --preset debug&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  4. ./build/debug/my_finance_app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;支持命令别名（Aliases）：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;比如允许 &lt;code&gt;sc-cmake a&lt;/code&gt; 代表 &lt;code&gt;sc-cmake apply&lt;/code&gt;，&lt;code&gt;sc-cmake ls&lt;/code&gt; 代表 &lt;code&gt;sc-cmake list&lt;/code&gt;，提升极客打字效率。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake 接入 clang-tidy：从开关到可维护门禁</title>
        <published>2026-07-20T00:00:00+00:00</published>
        <updated>2026-07-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CMake/clang-tidy-cmake/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CMake/clang-tidy-cmake/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CMake/clang-tidy-cmake/">&lt;h1 id=&quot;cmake-jie-ru-clang-tidy&quot;&gt;CMake 接入 clang-tidy&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;clang-tidy&lt;/code&gt; 适合当工程的&lt;strong&gt;静态门禁&lt;/strong&gt;：比编译器警告更靠近「现代 C++ 习惯」和「API 误用」。难点通常不在「能不能跑」，而在 &lt;strong&gt;CMake 怎么挂、配置怎么钉死、本地与 CI 怎么一致&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;本文按「能开关 → 能复现 → 能长期维护」三条线整理。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-xian-nong-qing-liang-chong-gua-fa&quot;&gt;1. 先弄清两种挂法&lt;/h2&gt;
&lt;h3 id=&quot;1-1-bian-yi-shi-zi-dong-pao-cmake-cxx-clang-tidy&quot;&gt;1.1 编译时自动跑（&lt;code&gt;CMAKE_CXX_CLANG_TIDY&lt;/code&gt;）&lt;/h3&gt;
&lt;p&gt;CMake 会把 tidy 绑到每个编译命令上：改一个 &lt;code&gt;.cpp&lt;/code&gt;，编译时顺带分析。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;option&lt;/span&gt;&lt;span&gt;(CXX_ENABLE_CLANG_TIDY &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Attach clang-tidy to CXX compile&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; OFF&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span&gt;(CXX_ENABLE_CLANG_TIDY)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  find_program&lt;/span&gt;&lt;span&gt;(CLANG_TIDY_EXE &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;NAMES&lt;/span&gt;&lt;span&gt; clang-tidy REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_CLANG_TIDY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;${CLANG_TIDY_EXE};-warnings-as-errors=*&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    CACHE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; STRING&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; FORCE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;endif&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;适合：&lt;strong&gt;小目标 / 模块化工程 / 想强制「脏代码编不过」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;代价：全量编译变慢；增量时只扫改过的 TU。&lt;/p&gt;
&lt;h3 id=&quot;1-2-du-li-mu-biao-jiao-ben-sao-bu-bang-bian-yi&quot;&gt;1.2 独立目标 / 脚本扫（不绑编译）&lt;/h3&gt;
&lt;p&gt;用 &lt;code&gt;compile_commands.json&lt;/code&gt; + 自己的 &lt;code&gt;clang-tidy&lt;/code&gt; 调用：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_EXPORT_COMPILE_COMMANDS=ON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;clang-tidy&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; src/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.cpp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;适合：&lt;strong&gt;大仓库、只想在 PR 跑、或 tidy 与构建解耦&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-pei-zhi-wen-jian-ba-gui-ze-ding-zai-cang-ku-li&quot;&gt;2. 配置文件：把规则钉在仓库里&lt;/h2&gt;
&lt;p&gt;优先放仓库根或 &lt;code&gt;cmake/&lt;/code&gt; 旁的 &lt;code&gt;.clang-tidy&lt;/code&gt;，避免每人本机「默认检查集」不一致。&lt;/p&gt;
&lt;p&gt;最小可用示例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;C&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;hecks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  -*,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  bugprone-*,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  modernize-use-nullptr,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  modernize-use-override,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  readability-identifier-naming,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  performance-unnecessary-copy-initialization&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;W&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;arningsAsErrors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;H&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;eaderFilterRegex&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;F&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;ormatStyle&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;one&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;经验：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;做法&lt;/th&gt;&lt;th&gt;建议&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;一上来开 &lt;code&gt;*&lt;/code&gt;&lt;/td&gt;&lt;td&gt;噪音爆炸，团队会关掉 tidy&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;从 &lt;code&gt;bugprone-*&lt;/code&gt; + 少量 modernize 起步&lt;/td&gt;&lt;td&gt;易落地&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;WarningsAsErrors: &#39;*&#39;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;适合 CI 门禁；本地可先关&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;第三方头文件&lt;/td&gt;&lt;td&gt;用 &lt;code&gt;HeaderFilterRegex&lt;/code&gt; 限定自己的源码树&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-yu-cmake-fen-ceng-ji-jian-de-chang-jian-jie-fa&quot;&gt;3. 与 CMake 分层基建的常见接法&lt;/h2&gt;
&lt;p&gt;现代工程常把开关放在 &lt;code&gt;CompilerWarnings.cmake&lt;/code&gt; / &lt;code&gt;ProjectSetup.cmake&lt;/code&gt; 一类文件里，例如：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# cmake/CompilerWarnings.cmake（示意）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;function&lt;/span&gt;&lt;span&gt;(cxx_enable_clang_tidy &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;NOT&lt;/span&gt;&lt;span&gt; CXX_ENABLE_CLANG_TIDY)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  endif&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  find_program&lt;/span&gt;&lt;span&gt;(CLANG_TIDY_EXE &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;NAMES&lt;/span&gt;&lt;span&gt; clang-tidy)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;NOT&lt;/span&gt;&lt;span&gt; CLANG_TIDY_EXE)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    message&lt;/span&gt;&lt;span&gt;(WARNING &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;clang-tidy not found; skip&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    return&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  endif&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  set_target_properties&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;${target}&lt;/span&gt;&lt;span&gt; PROPERTIES&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    CXX_CLANG_TIDY &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;${CLANG_TIDY_EXE};--config-file=${CMAKE_SOURCE_DIR}/.clang-tidy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;endfunction&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对 &lt;strong&gt;C++23 modules / &lt;code&gt;import std&lt;/code&gt;&lt;/strong&gt; 工程：确认 tidy 用的 clang 版本与编译器同源（Homebrew LLVM 场景尤其常见），否则会出现「编译过、tidy 解析失败」。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-ben-di-gong-zuo-liu-tui-jian&quot;&gt;4. 本地工作流（推荐）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; PATH&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/opt/homebrew/opt/llvm/bin:&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;PATH&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 默认关闭 tidy，日常编译快&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ninja&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 需要门禁时显式打开&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ninja&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCXX_ENABLE_CLANG_TIDY=ON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;把「默认 OFF、CI ON」写进 README / preset，比强迫人人开 tidy 更可持续。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-ci-men-jin-qing-dan&quot;&gt;5. CI 门禁清单&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
&lt;code&gt;CMAKE_EXPORT_COMPILE_COMMANDS=ON&lt;/code&gt;（若用独立扫）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
固定 &lt;code&gt;clang-tidy&lt;/code&gt; 版本（或固定 LLVM formula 大版本）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
&lt;code&gt;.clang-tidy&lt;/code&gt; 进仓库&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
PR 必跑；main 上偶发全量&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
第三方目录进 &lt;code&gt;.clang-tidy&lt;/code&gt; 忽略或 &lt;code&gt;HeaderFilterRegex&lt;/code&gt; 排除&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-xiao-jie&quot;&gt;6. 小结&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;目标&lt;/th&gt;&lt;th&gt;做法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;开发时提醒&lt;/td&gt;&lt;td&gt;本机可选 &lt;code&gt;CXX_ENABLE_CLANG_TIDY=ON&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;合入质量&lt;/td&gt;&lt;td&gt;CI 打开 + &lt;code&gt;warnings-as-errors&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;长期可维护&lt;/td&gt;&lt;td&gt;仓库内 &lt;code&gt;.clang-tidy&lt;/code&gt; + 窄检查集逐步加宽&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;下一篇会写 &lt;strong&gt;&lt;code&gt;.cmake&lt;/code&gt; 模块拆分与 &lt;code&gt;CMakePresets.json&lt;/code&gt; 的使用技巧&lt;/strong&gt;，和 tidy 开关如何一起放进 preset。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake .cmake 模块与 Preset：可复现构建的拆分技巧</title>
        <published>2026-07-20T00:00:00+00:00</published>
        <updated>2026-07-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CMake/cmake-modules-presets/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CMake/cmake-modules-presets/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CMake/cmake-modules-presets/">&lt;h1 id=&quot;cmake-mo-kuai-yu-preset-shi-yong-ji-qiao&quot;&gt;&lt;code&gt;.cmake&lt;/code&gt; 模块与 Preset 使用技巧&lt;/h1&gt;
&lt;p&gt;根目录 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 一旦堆满 &lt;code&gt;find_package&lt;/code&gt;、警告选项、生成器判定，项目会很快「能编但难讲」。更稳的做法是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;按职责拆 &lt;code&gt;.cmake&lt;/code&gt; 模块&lt;/strong&gt;（工具链 / 生成器 / 警告 / 日志 / 安装）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;用 &lt;code&gt;CMakePresets.json&lt;/code&gt; 固定常用组合&lt;/strong&gt;（本机 Ninja、CI Release、开 tidy 等）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本文是实操向清单，偏 CMake 3.20+ / 4.x。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-wei-shen-me-yao-chai-cmake&quot;&gt;1. 为什么要拆 &lt;code&gt;.cmake&lt;/code&gt;&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;拆模块后&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;新人不知道改哪&lt;/td&gt;&lt;td&gt;README 写「改 &lt;code&gt;cmake/ToolchainClang.cmake&lt;/code&gt;」&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;AppleClang / Homebrew LLVM 混用&lt;/td&gt;&lt;td&gt;工具链探测集中一处&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;生成器搞错（modules 需要 Ninja）&lt;/td&gt;&lt;td&gt;&lt;code&gt;Generator.cmake&lt;/code&gt; 统一 FATAL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;选项满天飞&lt;/td&gt;&lt;td&gt;preset 命名表达意图&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;建议分层（名字可自定，职责别混）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cmake/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Generator.cmake          # 强制/探测生成器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ToolchainClang.cmake     # 编译器、sysroot、modules JSON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  StdlibConfig.cmake       # import std / stdlib 探测&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  CompilerWarnings.cmake   # -Wall 与可选 tidy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  BuildLog.cmake           # 彩色日志 / tee&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  ProjectSetup.cmake       # 打印关键变量摘要&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Modules.cmake            # 挂 CXX modules 相关&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 只做：&lt;code&gt;project()&lt;/code&gt;、&lt;code&gt;add_subdirectory&lt;/code&gt; / &lt;code&gt;add_executable&lt;/code&gt;、按顺序 &lt;code&gt;include()&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-cmake-bian-xie-ji-qiao&quot;&gt;2. &lt;code&gt;.cmake&lt;/code&gt; 编写技巧&lt;/h2&gt;
&lt;h3 id=&quot;2-1-yong-option-cache-bao-lu-kai-guan-mo-ren-bao-shou&quot;&gt;2.1 用 &lt;code&gt;option()&lt;/code&gt; / &lt;code&gt;CACHE&lt;/code&gt; 暴露开关，默认保守&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;option&lt;/span&gt;&lt;span&gt;(CXX_ENABLE_CLANG_TIDY &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Enable clang-tidy&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; OFF&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;option&lt;/span&gt;&lt;span&gt;(CXX_ENABLE_GTEST &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Build tests&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; OFF&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CXX_PREFERRED_COMPILER &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;clang++&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; CACHE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; STRING&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;clang++|g++&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;默认 OFF，避免「拉下来编不过」。&lt;/p&gt;
&lt;h3 id=&quot;2-2-zhi-ming-tiao-jian-yong-qing-xi-dan-xing-zi-fu-chuan&quot;&gt;2.2 致命条件用清晰单行字符串&lt;/h3&gt;
&lt;p&gt;CMake 的 &lt;code&gt;list&lt;/code&gt; 与多参数 &lt;code&gt;set(msg &quot;a&quot; &quot;b&quot;)&lt;/code&gt; 容易把 &lt;code&gt;FATAL_ERROR&lt;/code&gt; 显示成空白。拼错误信息时用 &lt;code&gt;string(APPEND)&lt;/code&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(_err &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;string&lt;/span&gt;&lt;span&gt;(APPEND _err &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Ninja is required for C++23 modules.&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;string&lt;/span&gt;&lt;span&gt;(APPEND _err &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Hint: export CMAKE_GENERATOR=Ninja or use -G Ninja&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;message&lt;/span&gt;&lt;span&gt;(FATAL_ERROR &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;${_err}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-3-sheng-cheng-qi-zao-shi-bai&quot;&gt;2.3 生成器：早失败&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;if&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;NOT&lt;/span&gt;&lt;span&gt; CMAKE_GENERATOR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; STREQUAL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Ninja&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  message&lt;/span&gt;&lt;span&gt;(FATAL_ERROR &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Use Ninja (C++ modules / import std). Got: ${CMAKE_GENERATOR}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;endif&lt;/span&gt;&lt;span&gt;()&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配合根目录 &lt;code&gt;.envrc&lt;/code&gt;：&lt;code&gt;export CMAKE_GENERATOR=Ninja&lt;/code&gt;，减少「裸 &lt;code&gt;cmake ..&lt;/code&gt; 掉进 Unix Makefiles」的缓存坑。&lt;/p&gt;
&lt;h3 id=&quot;2-4-include-shun-xu-yao-wen-ding&quot;&gt;2.4 include 顺序要稳定&lt;/h3&gt;
&lt;p&gt;典型顺序：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/Generator.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/ToolchainClang.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/StdlibConfig.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# … project() 之后再：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/CompilerWarnings.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/ProjectSetup.cmake)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;工具链相关尽量在 &lt;code&gt;project()&lt;/code&gt; 前完成；依赖 &lt;code&gt;PROJECT_*&lt;/code&gt; 的摘要放后面。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-cmakepresets-json-ji-qiao&quot;&gt;3. &lt;code&gt;CMakePresets.json&lt;/code&gt; 技巧&lt;/h2&gt;
&lt;h3 id=&quot;3-1-zui-xiao-jie-gou&quot;&gt;3.1 最小结构&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;json&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;{&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span&gt;version&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 6&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span&gt;configurePresets&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;displayName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Dev (Ninja RelWithDebInfo)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;generator&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Ninja&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;binaryDir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;${sourceDir}/build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;cacheVariables&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span&gt;CMAKE_BUILD_TYPE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;RelWithDebInfo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span&gt;CXX_PREFERRED_COMPILER&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;clang++&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span&gt;CXX_ENABLE_CLANG_TIDY&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;OFF&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tidy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;inherits&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;displayName&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Dev + clang-tidy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      &amp;quot;&lt;/span&gt;&lt;span&gt;cacheVariables&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;quot;&lt;/span&gt;&lt;span&gt;CXX_ENABLE_CLANG_TIDY&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;ON&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;      }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span&gt;buildPresets&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;configurePreset&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;dev&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    {&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tidy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;configurePreset&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tidy&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-shi-yong-xi-guan&quot;&gt;3.2 实用习惯&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;技巧&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;inherits&lt;/code&gt;&lt;/td&gt;&lt;td&gt;共用 &lt;code&gt;generator&lt;/code&gt; / &lt;code&gt;binaryDir&lt;/code&gt;，只覆盖差异&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;binaryDir&lt;/code&gt; 固定 &lt;code&gt;build/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;与文档「进 build 再 cmake」一致&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;显式写 &lt;code&gt;generator: Ninja&lt;/code&gt;&lt;/td&gt;&lt;td&gt;不依赖环境变量也正确&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;分开 &lt;code&gt;dev&lt;/code&gt; / &lt;code&gt;ci&lt;/code&gt; / &lt;code&gt;tidy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;意图可读，少口头约定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;勿把本机绝对路径写进 preset&lt;/td&gt;&lt;td&gt;用 &lt;code&gt;${sourceDir}&lt;/code&gt;、环境变量&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-3-ming-ling&quot;&gt;3.3 命令&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-preset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-preset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dev&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-preset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tidy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-preset&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tidy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无 preset 时等价习惯：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;G&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ninja&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ..&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-he-clang-tidy-de-zu-he&quot;&gt;4. 和 clang-tidy 的组合&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;日常：&lt;code&gt;dev&lt;/code&gt; preset，tidy OFF&lt;/li&gt;
&lt;li&gt;合入前 / CI：&lt;code&gt;tidy&lt;/code&gt; preset 或 &lt;code&gt;-DCXX_ENABLE_CLANG_TIDY=ON&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;规则文件：仓库根 &lt;code&gt;.clang-tidy&lt;/code&gt;（见专栏上一篇）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样「模块拆分」负责&lt;strong&gt;机制&lt;/strong&gt;，「preset」负责&lt;strong&gt;场景&lt;/strong&gt;，两边都不膨胀。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-pai-zhang-su-cha&quot;&gt;5. 排障速查&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;处理&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cmake ..&lt;/code&gt; 后生成器是 Makefiles&lt;/td&gt;&lt;td&gt;&lt;code&gt;rm -rf build &amp;amp;&amp;amp; mkdir build&lt;/code&gt;，再用 Ninja / preset&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;FATAL 信息空白&lt;/td&gt;&lt;td&gt;检查是否把错误字符串写成了 CMake list&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;tidy 找不到&lt;/td&gt;&lt;td&gt;PATH 含 Homebrew LLVM；或 &lt;code&gt;find_program&lt;/code&gt; 失败时明确 WARNING&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;preset 不生效&lt;/td&gt;&lt;td&gt;确认 &lt;code&gt;CMakePresets.json&lt;/code&gt; 在源码根；CMake ≥ 3.19（建议 3.23+ / 4.x）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-xiao-jie&quot;&gt;6. 小结&lt;/h2&gt;
&lt;p&gt;把「怎么探测环境」放进 &lt;code&gt;.cmake&lt;/code&gt;，把「这次我想怎样编」放进 preset。根 &lt;code&gt;CMakeLists.txt&lt;/code&gt; 保持薄，专栏工程和脚手架模板就能共用同一套心智模型。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>提前体验 macOS 时：Homebrew 被过旧 Xcode 卡住怎么办</title>
        <published>2026-07-20T00:00:00+00:00</published>
        <updated>2026-07-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-xcode-early-macos/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-xcode-early-macos/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/homebrew-xcode-early-macos/">&lt;h1 id=&quot;ti-qian-ti-yan-macos-mei-you-dui-kou-xcode-shi-zen-me-geng-xin-homebrew&quot;&gt;提前体验 macOS：没有对口 Xcode 时怎么更新 Homebrew&lt;/h1&gt;
&lt;p&gt;预装 / 抢先升级到新版 macOS（例如 27）时，常出现尴尬窗口：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;系统已是 &lt;strong&gt;macOS 27&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;本机仍装着 &lt;strong&gt;Xcode 26.x&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Homebrew 已要求 &lt;strong&gt;Xcode 27.0&lt;/strong&gt;（或提示 delete it）&lt;/li&gt;
&lt;li&gt;Command Line Tools 可能已经是 27，但 &lt;code&gt;brew install&lt;/code&gt; / &lt;code&gt;brew upgrade&lt;/code&gt; 照样 &lt;strong&gt;fatal&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这和某个 formula 是否用 LLVM 编译无关：拦在 Homebrew 的前置诊断。本文记录&lt;strong&gt;根因&lt;/strong&gt;、&lt;strong&gt;临时方案&lt;/strong&gt;、&lt;strong&gt;恢复方案&lt;/strong&gt;（本机已验证）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-xian-xiang&quot;&gt;1. 现象&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Error: Your Xcode (26.3) at /Applications/Xcode.app is too outdated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Please update to Xcode 27.0 (or delete it).&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若只在 &lt;code&gt;/Applications&lt;/code&gt; 里改名，仍可能看到：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Your Xcode (26.x =&amp;gt; /Applications/Xcode-….app.bak/Contents/Developer)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;at /Applications/Xcode-….app.bak is too outdated.&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同时 &lt;code&gt;brew&lt;/code&gt; 可能警告：当前 macOS 为预发布 / Tier 2——那是支持策略提示；&lt;strong&gt;真正挡住安装的是 Xcode 最低版本检查&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-gen-yin-fen-xi&quot;&gt;2. 根因分析&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;点&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;谁在查&lt;/td&gt;&lt;td&gt;Homebrew &lt;code&gt;MacOS::Xcode&lt;/code&gt;（&lt;code&gt;os/mac/xcode.rb&lt;/code&gt;）+ &lt;code&gt;check_xcode_minimum_version&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;怎么找&lt;/td&gt;&lt;td&gt;先看 &lt;code&gt;/Applications/Xcode.app&lt;/code&gt;；否则用 &lt;strong&gt;Spotlight&lt;/strong&gt;：&lt;code&gt;mdfind&lt;/code&gt; + bundle id&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;为何「只改名」无效&lt;/td&gt;&lt;td&gt;&lt;code&gt;.app.bak&lt;/code&gt; 仍带 &lt;code&gt;com.apple.dt.Xcode&lt;/code&gt;，Spotlight 仍命中&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;与 CLT 的关系&lt;/td&gt;&lt;td&gt;即便 &lt;code&gt;xcode-select&lt;/code&gt; 已指向 CLT 27，只要 &lt;code&gt;mdfind&lt;/code&gt; 还能找到旧 Xcode，检查仍失败&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;两条诊断命令（验收用）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mdfind&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kMDItemCFBundleIdentifier == &amp;quot;com.apple.dt.Xcode&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Xcode|CLT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;结论：&lt;/strong&gt; 临时绕过的成败标准是 —— &lt;strong&gt;&lt;code&gt;mdfind&lt;/code&gt; 对 Xcode bundle id 的结果必须为空&lt;/strong&gt;；不能只改文件名。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-lin-shi-fang-an-yi-yan-zheng&quot;&gt;3. 临时方案（已验证）&lt;/h2&gt;
&lt;p&gt;前提：已装好 &lt;strong&gt;Command Line Tools 27&lt;/strong&gt;（&lt;code&gt;brew config&lt;/code&gt; 里 &lt;code&gt;CLT: 27.…&lt;/code&gt;）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; A. 开发目录切到 CLT&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; xcode-select&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Library/Developer/CommandLineTools&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; B. 看清 Spotlight / Applications 里有哪些 Xcode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mdfind&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kMDItemCFBundleIdentifier == &amp;quot;com.apple.dt.Xcode&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ls&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Applications/Xcode&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; C. 移到 /opt 下「永不索引」目录（不要留在 /Applications）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /opt/xcode-stash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; touch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /opt/xcode-stash/.metadata_never_index&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mv&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Applications/Xcode.app&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /opt/xcode-stash/Xcode-26.6.app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 若之前已改名，把对应路径一并移进 /opt/xcode-stash/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; D. 关键：mdfind 必须为空&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mdfind&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kMDItemCFBundleIdentifier == &amp;quot;com.apple.dt.Xcode&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 若仍有路径：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   sudo mdutil -E /opt/xcode-stash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或挪到外置未索引盘 / 删除该 .app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; E. 确认后安装 / 升级&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Xcode|CLT&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 期望 Xcode: N/A ；CLT: 27.…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; sc-cmake&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或 brew upgrade / 任意 formula&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;无效做法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;仅 &lt;code&gt;mv /Applications/Xcode.app /Applications/Xcode-….app.bak&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;指望与本检查无关的 &lt;code&gt;HOMEBREW_*&lt;/code&gt; 跳过变量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;长期方案：从 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://developer.apple.com/download/all/&quot;&gt;Apple Developer Downloads&lt;/a&gt; 安装对口 &lt;strong&gt;Xcode 27+&lt;/strong&gt;，或彻底删除旧 Xcode。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-hui-fu-fang-an-brew-yong-wan-hou-hui-fu-ide&quot;&gt;4. 恢复方案（brew 用完后恢复 IDE）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mv&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /opt/xcode-stash/Xcode-26.6.app&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Applications/Xcode.app&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; xcode-select&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Applications/Xcode.app/Contents/Developer&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;xcode-select&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mdfind&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kMDItemCFBundleIdentifier == &amp;quot;com.apple.dt.Xcode&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 又能找到，属正常&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;注意：恢复后若再跑 &lt;code&gt;brew install&lt;/code&gt; / &lt;code&gt;upgrade&lt;/code&gt;，旧 Xcode 会再次触发同样错误；需要 brew 时再执行第三节，或升级到对口 Xcode。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-he-ti-qian-ti-yan-macos-de-guan-xi&quot;&gt;5. 和「提前体验 macOS」的关系&lt;/h2&gt;
&lt;p&gt;抢先升级系统时，&lt;strong&gt;系统版本、CLT、完整 Xcode&lt;/strong&gt; 三者经常不同步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CLT 往往先跟上（能撑日常编译）&lt;/li&gt;
&lt;li&gt;完整 Xcode 滞后（体积大、渠道慢）&lt;/li&gt;
&lt;li&gt;Homebrew 按「当前 macOS → 最低 Xcode」做硬检查&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;因此「尴尬期」的务实策略是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;编译&lt;/strong&gt;：CLT +（如需要）Homebrew LLVM&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;装 brew 包&lt;/strong&gt;：临时 stash 旧 Xcode，让 &lt;code&gt;mdfind&lt;/code&gt; 为空&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;写 App / 开 Interface Builder&lt;/strong&gt;：再恢复 &lt;code&gt;/Applications/Xcode.app&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;把 stash 路径、恢复命令写进自己的笔记或 formula 文档（例如 &lt;code&gt;Formula/README.md&lt;/code&gt;），避免下次又在 &lt;code&gt;/Applications&lt;/code&gt; 里改名并误以为修好了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-xiao-jie&quot;&gt;6. 小结&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;步骤&lt;/th&gt;&lt;th&gt;命令意图&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;诊断&lt;/td&gt;&lt;td&gt;&lt;code&gt;mdfind&lt;/code&gt; + &lt;code&gt;brew config | grep Xcode|CLT&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;临时&lt;/td&gt;&lt;td&gt;stash 到 &lt;code&gt;/opt/xcode-stash&lt;/code&gt; + &lt;code&gt;.metadata_never_index&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;验收&lt;/td&gt;&lt;td&gt;&lt;code&gt;mdfind&lt;/code&gt; 空；&lt;code&gt;Xcode: N/A&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;恢复&lt;/td&gt;&lt;td&gt;搬回 &lt;code&gt;Xcode.app&lt;/code&gt; + &lt;code&gt;xcode-select&lt;/code&gt; 切回&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;根因一句话：&lt;strong&gt;Homebrew 用 Spotlight（&lt;code&gt;mdfind&lt;/code&gt; + bundle id）找 Xcode；只在 &lt;code&gt;/Applications&lt;/code&gt; 改名仍会被扫到。&lt;/strong&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>7.13 – 7.19 第一周</title>
        <published>2026-07-13T00:00:00+00:00</published>
        <updated>2026-07-13T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/2026-07-13-07-19-1800/"/>
        <id>https://suchaharcan.github.io/kanban/2026-07-13-07-19-1800/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/2026-07-13-07-19-1800/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h2 id=&quot;professional-cmake-a-practical-guide-tong-du&quot;&gt;Professional CMake: A Practical Guide 通读&lt;/h2&gt;
&lt;p&gt;@start 2026-07-13
@due 2026-06-26
@priority 5
@labels red, orange,green,blue
@top red&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
基础通识&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
下载与导出&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
库（接口，静态，动态）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先通读，再精读。
生词后续纳入Eudic
最后 在本地 重写 理解，编写XMind 文档&lt;/p&gt;
&lt;h2 id=&quot;ying-yu-dan-ci&quot;&gt;英语 单词&lt;/h2&gt;
&lt;p&gt;@due 2026-06-29
@priority 3
@labels blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
墨墨记单词&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Eudic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单词重新捡起来&lt;/p&gt;
&lt;h1 id=&quot;zi-yuan&quot;&gt;资源&lt;/h1&gt;
&lt;h2 id=&quot;ben-di-cang-ku-da-jian&quot;&gt;本地仓库搭建&lt;/h2&gt;
&lt;p&gt;@start 2026-06-15
@priority 2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Zola 本地 &lt;code&gt;build --force&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Codeberg 仓库写入权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;content/kanban/&lt;/code&gt; 目录、ReDeplog 流水线。&lt;/p&gt;
&lt;h2 id=&quot;can-kao-su-cai&quot;&gt;参考素材&lt;/h2&gt;
&lt;p&gt;@priority 1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
article_details 图标行&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Trello 列布局截图&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-07-12T17:30:00+00:00</published>
        <updated>2026-07-12T17:30:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-07-12t17-30-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-07-12t17-30-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-07-12t17-30-00z/">&lt;p&gt;2026年07月12日 17:30（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;re-li-tu-se-chai-diao-zheng-wen-zhang-ye-yin-le-bo-fang-qi-jin-du-tiao-ben-di-seek-gen-yin&quot;&gt;热力图色差调整 · 文章页音乐播放器 · 进度条本地 seek 根因&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮三件事：&lt;strong&gt;归档/文章页热力图色阶分离&lt;/strong&gt;、&lt;strong&gt;文章页可选音乐播放器（FLAC/MP3 + LRC）&lt;/strong&gt;、&lt;strong&gt;本地 &lt;code&gt;zola serve&lt;/code&gt; 下进度条无法跳转的根因与修复&lt;/strong&gt;。日常构建流程（&lt;code&gt;zola build&lt;/code&gt; / &lt;code&gt;zola serve&lt;/code&gt; / &lt;code&gt;./dev.sh&lt;/code&gt; / &lt;code&gt;./build-site.sh&lt;/code&gt;）&lt;strong&gt;未改&lt;/strong&gt;；CI 无需改动。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-re-li-tu-se-chai-diao-zheng&quot;&gt;1. 热力图色差调整&lt;/h3&gt;
&lt;h4 id=&quot;1-1-mu-biao&quot;&gt;1.1 目标&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;归档页&lt;/strong&gt;（&lt;code&gt;/archive/&lt;/code&gt;）：沿用 GitHub 贡献图 &lt;strong&gt;绿色&lt;/strong&gt; 四档色阶，空格子与 L1 对比清晰。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文章页&lt;/strong&gt;（右上角固定挂件）：使用 &lt;strong&gt;紫色&lt;/strong&gt; 四档色阶，与全站 accent 一致，避免与归档页混淆。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;1-2-shi-xian&quot;&gt;1.2 实现&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;CSS 类&lt;/th&gt;&lt;th&gt;文件&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;归档&lt;/td&gt;&lt;td&gt;&lt;code&gt;.blog-heatmap--archive&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章&lt;/td&gt;&lt;td&gt;&lt;code&gt;.blog-heatmap--article&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;色阶变量（浅色模式示例）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;档位&lt;/th&gt;&lt;th&gt;归档（绿）&lt;/th&gt;&lt;th&gt;文章（紫）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;empty&lt;/td&gt;&lt;td&gt;&lt;code&gt;#ebedf0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#ebedf0&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L1&lt;/td&gt;&lt;td&gt;&lt;code&gt;#9be9a8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#e9d5ff&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L2&lt;/td&gt;&lt;td&gt;&lt;code&gt;#40c463&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#c084fc&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L3&lt;/td&gt;&lt;td&gt;&lt;code&gt;#30a14e&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#9333ea&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;L4&lt;/td&gt;&lt;td&gt;&lt;code&gt;#216e39&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;#6b21a8&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;深色模式在 &lt;code&gt;@media (prefers-color-scheme: dark)&lt;/code&gt; 下各有一套对应值。&lt;/p&gt;
&lt;p&gt;文章页热力图与音乐播放器叠放在 &lt;code&gt;.article-widgets-fixed&lt;/code&gt;（&lt;code&gt;templates/article.html&lt;/code&gt;），固定于右上角，移动端改到底部右侧。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-yin-le-bo-fang-qi-she-ji-si-lu&quot;&gt;2. 音乐播放器：设计思路&lt;/h3&gt;
&lt;h4 id=&quot;2-1-chan-pin-xing-wei&quot;&gt;2.1 产品行为&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;启用粒度&lt;/td&gt;&lt;td&gt;全站 &lt;code&gt;zola.toml&lt;/code&gt; 开关 + &lt;strong&gt;单篇文章&lt;/strong&gt; front matter&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;默认态&lt;/td&gt;&lt;td&gt;仅显示大号播放按钮；悬停/聚焦展开元信息、歌词、控制条&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;音源&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/music/&lt;/code&gt; 下 &lt;code&gt;歌手-歌名.flac&lt;/code&gt; 或 &lt;code&gt;.mp3&lt;/code&gt;，优先 MP3&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;歌词&lt;/td&gt;&lt;td&gt;同名 &lt;code&gt;.lrc&lt;/code&gt;，UTF-8 / GB18030 自动识别；卡拉 OK + 横向滚动&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;元数据&lt;/td&gt;&lt;td&gt;文件名 &lt;code&gt;歌手-歌名&lt;/code&gt; + LRC &lt;code&gt;[ti:]&lt;/code&gt; / &lt;code&gt;[ar:]&lt;/code&gt;，不用 ID3 标签库&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;音量&lt;/td&gt;&lt;td&gt;点击循环：25% → 50% → 75% → 100% → 静音；喇叭图标自下而上填充&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;进度条&lt;/td&gt;&lt;td&gt;细轨道 + 圆点滑块；点击/拖动任意位置跳转&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;循环&lt;/td&gt;&lt;td&gt;默认关；图标 &lt;code&gt;arrow-clockwise&lt;/code&gt; / &lt;code&gt;repeat&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多曲&lt;/td&gt;&lt;td&gt;&lt;code&gt;tracks&lt;/code&gt; 多于 1 首时显示随机下一首&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Safari&lt;/td&gt;&lt;td&gt;检测后整组件移除（FLAC / seek 兼容性差）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;2-2-wen-jian-jie-gou&quot;&gt;2.2 文件结构&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;zola.toml                          # [extra.music_player] 全站开关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;templates/article.html               # .article-widgets-fixed 挂载热力图 + 播放器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;templates/partials/music_player.html # 挂件 markup + data-tracks JSON&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;static/css/music-player.css          # 三行布局：meta / lyric / bar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;static/js/music-player.js          # 播放、LRC、seek、音量、Blob 兜底&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;static/music/                      # 音频与 LRC（构建时原样拷贝到 public/music/）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;2-3-dan-pian-qi-yong-shi-li&quot;&gt;2.3 单篇启用示例&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;music_player&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tracks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;庄心妍-繁星点点&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;周杰伦-青花瓷&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;测试文章：&lt;code&gt;content/01Write_blog_CMake/2026-07-12-Libs-Manager/index.md&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&quot;2-4-guan-jian-dai-ma-xi-jie&quot;&gt;2.4 关键代码细节&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;模板&lt;/strong&gt;：&lt;code&gt;data-tracks&lt;/code&gt; 注入曲目列表；&lt;code&gt;data-base&lt;/code&gt; 为 &lt;code&gt;/music&lt;/code&gt;（可配 &lt;code&gt;base_url&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;resolveAudio()&lt;/code&gt;&lt;/strong&gt;：HEAD 探测，&lt;strong&gt;优先 MP3&lt;/strong&gt;，其次 FLAC。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;歌词&lt;/strong&gt;：&lt;code&gt;parseLrc()&lt;/code&gt; 解析时间轴；&lt;code&gt;isMetaLyric()&lt;/code&gt; 过滤作词作曲等元信息行；&lt;code&gt;syncLyric()&lt;/code&gt; 按 &lt;code&gt;timeupdate&lt;/code&gt; 切换行并用 &lt;code&gt;clip-path&lt;/code&gt; 做逐字高亮。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;进度条&lt;/strong&gt;：不用 &lt;code&gt;&amp;lt;input type=&quot;range&quot;&amp;gt;&lt;/code&gt;（会被主题全局 range 样式覆盖成粗条+白块）。改为 &lt;code&gt;div&lt;/code&gt; 轨道 + &lt;code&gt;--progress-pct&lt;/code&gt; CSS 变量 + &lt;code&gt;pointerdown/move/up&lt;/code&gt; 计算 &lt;code&gt;clientX&lt;/code&gt; 比例后设 &lt;code&gt;audio.currentTime&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;音量&lt;/strong&gt;：&lt;code&gt;VOLUME_LEVELS = [0.25, 0.5, 0.75, 1, 0]&lt;/code&gt;，&lt;code&gt;clip-path: inset(...)&lt;/code&gt; 在喇叭图标上显示填充比例。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-ben-di-wu-fa-tuo-dong-gen-yin-fen-xi&quot;&gt;3. 本地无法拖动：根因分析&lt;/h3&gt;
&lt;h4 id=&quot;3-1-xian-xiang&quot;&gt;3.1 现象&lt;/h4&gt;
&lt;p&gt;在本地 &lt;code&gt;zola serve&lt;/code&gt; 下，点击或拖动进度条后，播放位置回到 &lt;strong&gt;00:00 附近&lt;/strong&gt;（像「从头重播」），而非跳到指定时间。&lt;/p&gt;
&lt;h4 id=&quot;3-2-fu-xian-shu-ju-chrome-zi-dong-hua&quot;&gt;3.2 复现数据（Chrome 自动化）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;环境&lt;/th&gt;&lt;th&gt;&lt;code&gt;audio.seekable.end&lt;/code&gt;&lt;/th&gt;&lt;th&gt;设 &lt;code&gt;currentTime = 50%&lt;/code&gt; 后&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;4.73s → &lt;strong&gt;0.23s&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;支持 Range 的静态服务&lt;/td&gt;&lt;td&gt;&lt;strong&gt;255.49&lt;/strong&gt;（全长）&lt;/td&gt;&lt;td&gt;正常跳到 &lt;strong&gt;118.6s&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;3-3-gen-yin&quot;&gt;3.3 根因&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;不是进度条 UI 坐标算错&lt;/strong&gt;，而是 &lt;strong&gt;HTML5 音频 seek 依赖 HTTP &lt;code&gt;Accept-Ranges: bytes&lt;/code&gt;&lt;/strong&gt;：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;浏览器需对音频 URL 发 &lt;strong&gt;Range 分段请求&lt;/strong&gt; 才能建立可 seek 区间；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;zola serve&lt;/code&gt; 不返回 &lt;code&gt;Accept-Ranges&lt;/code&gt;&lt;/strong&gt;，&lt;code&gt;curl -H &quot;Range: bytes=0-1023&quot;&lt;/code&gt; 仍得 &lt;code&gt;200&lt;/code&gt; 而非 &lt;code&gt;206&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;此时 &lt;code&gt;audio.seekable&lt;/code&gt; 为空，设置 &lt;code&gt;currentTime&lt;/code&gt; 无效，位置回到 0 附近。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;线上 &lt;strong&gt;GitHub Pages&lt;/strong&gt; 支持 Range，部署后（且 &lt;code&gt;static/music/&lt;/code&gt; 已发布）应能&lt;strong&gt;直接&lt;/strong&gt;拖动，无需播完整首。&lt;/p&gt;
&lt;h4 id=&quot;3-4-xiu-fu-fang-an&quot;&gt;3.4 修复方案&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;方案&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;播放器 JS&lt;/td&gt;&lt;td&gt;&lt;code&gt;ensureSeekable()&lt;/code&gt; Blob 兜底&lt;/td&gt;&lt;td&gt;首次点击进度条时 &lt;code&gt;fetch&lt;/code&gt; 整首音频为 Blob URL，再 seek；&lt;strong&gt;不必播完一整首&lt;/strong&gt;，但大 FLAC 首次可能需等待下载&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;本地可选&lt;/td&gt;&lt;td&gt;&lt;code&gt;scripts/serve-with-ranges.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;带 byte-range 的静态服务，用于本地立刻验证 seek&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;日常流程&lt;/td&gt;&lt;td&gt;&lt;strong&gt;保持&lt;/strong&gt; &lt;code&gt;./dev.sh&lt;/code&gt; → &lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;不强制改用户习惯&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CI / 部署&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不改&lt;/strong&gt; &lt;code&gt;deploy_pages.yml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;仍 &lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;dev.sh&lt;/code&gt; 已恢复为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scripts/encrypt-content.mjs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-ben-di-bu-shu-ming-ling-dui-zhao&quot;&gt;4. 本地 / 部署命令对照&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;进度条 seek&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;日常预览&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build&lt;/code&gt; → &lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;首次拖可能等 Blob 下载；之后正常&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;加密文章开发&lt;/td&gt;&lt;td&gt;&lt;code&gt;./dev.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;正式构建 / CI&lt;/td&gt;&lt;td&gt;&lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;构建产物；线上 GitHub Pages 可直接 seek&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;本地想立刻拖&lt;/td&gt;&lt;td&gt;见下方两行&lt;/td&gt;&lt;td&gt;与线上一致，无需等 Blob&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;本地立刻可 seek（可选，不影响日常）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-base-url&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; http://127.0.0.1:1111/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scripts/serve-with-ranges.mjs&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-no-watch&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1111&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;浏览器打开 &lt;code&gt;http://127.0.0.1:1111/&lt;/code&gt;。&lt;code&gt;--base-url&lt;/code&gt; 仅修正本地资源链接，&lt;strong&gt;seek 能力来自 &lt;code&gt;serve-with-ranges.mjs&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;5-bu-shu-zhu-yi&quot;&gt;5. 部署注意&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;音乐文件须纳入仓库 &lt;code&gt;static/music/&lt;/code&gt;，随 &lt;code&gt;./build-site.sh&lt;/code&gt; 进入 &lt;code&gt;public/music/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;当前若线上 &lt;code&gt;/music/...&lt;/code&gt; 为 404，播放器无法加载音频；推送含音乐的构建后即可。&lt;/li&gt;
&lt;li&gt;Workflow &lt;strong&gt;无需修改&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;6-xiang-guan-wen-dang&quot;&gt;6. 相关文档&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;用法速查已写入 &lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/&quot;&gt;@/03Share_blog/2026-06-22-zola-template-markdown-guide/index.md&lt;/a&gt; &lt;strong&gt;§8.1 音乐播放器&lt;/strong&gt;、&lt;strong&gt;§8.2 构建命令对照&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake Lib Manager </title>
        <published>2026-07-12T00:00:00+00:00</published>
        <updated>2026-07-12T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CMake/libs-manager/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CMake/libs-manager/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CMake/libs-manager/">&lt;h1 id=&quot;c-di-san-fang-lei-ku-ben-di-guan-li&quot;&gt;C++ 第三方类库本地管理&lt;/h1&gt;
&lt;p&gt;面向本机（macOS / Homebrew / vcpkg）的三种主流方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;系统包管理器（Homebrew、vcpkg）&lt;/li&gt;
&lt;li&gt;仅有源码：CPM / FetchContent&lt;/li&gt;
&lt;li&gt;Git submodule&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;原则：&lt;strong&gt;钉版本、可复现、优先项目内声明依赖&lt;/strong&gt;，少往 &lt;code&gt;/usr/local&lt;/code&gt; 全局乱装。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;0-ben-ji-lu-jing-su-cha&quot;&gt;0. 本机路径速查&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;路径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Homebrew 前缀&lt;/td&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 根目录&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg&lt;/code&gt;（即 &lt;code&gt;/Users/songhoujin/vcpkg&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 安装前缀（给 CMake 用）&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/installed/arm64-osx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 构建暂存&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/packages/&amp;lt;pkg&amp;gt;_arm64-osx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg toolchain&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;归档工具&lt;/td&gt;&lt;td&gt;&lt;code&gt;AR=/usr/bin/ar&lt;/code&gt;（勿用 binutils 的 GNU &lt;code&gt;ar&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP 代理（Clash）&lt;/td&gt;&lt;td&gt;&lt;code&gt;http://127.0.0.1:17890&lt;/code&gt;（&lt;code&gt;http_proxy&lt;/code&gt;/&lt;code&gt;https_proxy&lt;/code&gt;/&lt;code&gt;all_proxy&lt;/code&gt; 均用 &lt;strong&gt;http://&lt;/strong&gt;，勿对 17890 使用 &lt;code&gt;socks5://&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; AR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;bin&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;ar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; VCPKG_ROOT&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; http_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; https_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; HTTP_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;http_proxy&lt;/span&gt;&lt;span&gt; HTTPS_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;https_proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; all_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;span&gt; ALL_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;all_proxy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-xi-tong-bao-guan-li-qi-homebrew-vcpkg&quot;&gt;1. 系统包管理器：Homebrew / vcpkg&lt;/h2&gt;
&lt;p&gt;有 formula / port 时优先用包管理器：多项目共用、升级清晰、&lt;code&gt;find_package&lt;/code&gt; 友好。&lt;/p&gt;
&lt;h3 id=&quot;1-1-homebrew&quot;&gt;1.1 Homebrew&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fmt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ftxui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; entt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fmt&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看单包前缀&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/lib/cmake&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CMake 使用：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(fmt CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; fmt::fmt)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;安装位置：&lt;/strong&gt; &lt;code&gt;/opt/homebrew/{include,lib,lib/cmake,share}&lt;/code&gt;（Apple Silicon）。&lt;/p&gt;
&lt;h3 id=&quot;1-2-vcpkg&quot;&gt;1.2 vcpkg&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; AR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;bin&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;ar&lt;/span&gt;&lt;span&gt; VCPKG_ROOT&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 代理见上文；确认：env | grep -i proxy 中不应出现 socks5://127.0.0.1:17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;vcpkg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; libassert&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; unordered-dense&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mp-units&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;vcpkg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CMake 使用（推荐带 toolchain）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_TOOLCHAIN_FILE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(libassert CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; libassert::assert)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;安装位置：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给编译器用的：&lt;code&gt;$HOME/vcpkg/installed/arm64-osx/{include,lib,share}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages/&lt;/code&gt; 仅为构建中转，&lt;strong&gt;不要&lt;/strong&gt;把它当 &lt;code&gt;CMAKE_PREFIX_PATH&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-3-he-shi-yong-brew-he-shi-yong-vcpkg&quot;&gt;1.3 何时用 brew、何时用 vcpkg&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情况&lt;/th&gt;&lt;th&gt;建议&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;有 brew formula，且要系统级共用&lt;/td&gt;&lt;td&gt;Homebrew&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无 brew / 要与 CMake 深度集成 / 钉 triplet&lt;/td&gt;&lt;td&gt;vcpkg&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;macOS 预发布导致 bottle 异常&lt;/td&gt;&lt;td&gt;可改 vcpkg，或 &lt;code&gt;brew install --build-from-source&lt;/code&gt;（视公式而定）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-jin-you-yuan-ma-cpm-fetchcontent&quot;&gt;2. 仅有源码：CPM / FetchContent&lt;/h2&gt;
&lt;p&gt;无 brew、无 vcpkg port（或故意跟 git）时，在 &lt;strong&gt;本项目 CMake&lt;/strong&gt; 里拉取源码。默认只进当前 &lt;code&gt;build/&lt;/code&gt;，不污染系统。&lt;/p&gt;
&lt;p&gt;典型库：&lt;code&gt;NVIDIA/stdexec&lt;/code&gt;、&lt;code&gt;alibaba/yalantinglibs&lt;/code&gt; 等。&lt;/p&gt;
&lt;h3 id=&quot;2-1-yuan-sheng-fetchcontent&quot;&gt;2.1 原生 FetchContent&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(FetchContent)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FetchContent_Declare(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GIT_REPOSITORY https://github.com/NVIDIA/stdexec.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GIT_TAG        &amp;lt;钉死的 tag 或 commit&amp;gt;   &lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 勿长期裸追 main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FetchContent_MakeAvailable(stdexec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)  &lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 目标名以该库文档为准&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;落盘位置（配置后）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-src/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载的源码&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-build/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;该依赖的构建目录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-subbuild/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载用子工程&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;删除 &lt;code&gt;build/&lt;/code&gt; 即清除缓存；换机器需重新 &lt;code&gt;cmake -B build&lt;/code&gt;（需能访问 Git 仓库）。&lt;/p&gt;
&lt;h3 id=&quot;2-2-cpm-cmake-tui-jian-feng-zhuang&quot;&gt;2.2 CPM.cmake（推荐封装）&lt;/h3&gt;
&lt;p&gt;一次引入 CPM，之后一行加依赖：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;fsSL&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cmake/CPM.cmake&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/CPM.cmake&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/CPM.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 形式：gh:owner/repo#tag_or_commit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;gh:NVIDIA/stdexec#&amp;lt;钉死的版本&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CPM 仍基于 FetchContent，缓存同样在 &lt;code&gt;build/_deps/&lt;/code&gt;（也可设 &lt;code&gt;CPM_SOURCE_CACHE&lt;/code&gt; 指向如 &lt;code&gt;$HOME/.cache/CPM&lt;/code&gt; 跨项目复用下载）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCPM_SOURCE_CACHE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.cache/CPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-3-ke-xuan-an-zhuang-dao-yong-hu-qian-zhui-duo-wan-ju-xiang-mu-gong-yong&quot;&gt;2.3 可选：安装到用户前缀（多玩具项目共用）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/stdexec&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_INSTALL_PREFIX=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.local&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_BUILD_TYPE=Release&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 其它项目：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;落盘：&lt;/strong&gt; &lt;code&gt;$HOME/.local/{include,lib,lib/cmake}&lt;/code&gt;。正式项目仍更推荐 FetchContent/CPM 钉在仓库内。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-git-submodule&quot;&gt;3. Git submodule&lt;/h2&gt;
&lt;p&gt;需要源码进仓库、可审计、可离线构建时使用。&lt;/p&gt;
&lt;h3 id=&quot;3-1-tian-jia-yu-geng-xin&quot;&gt;3.1 添加与更新&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/your-project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; https://github.com/NVIDIA/stdexec.git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 钉到具体提交&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; checkout&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;commi&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Pin stdexec to &amp;lt;commit&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 新克隆机器：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; clone&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recurse-submodules&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;your-repo-ur&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或已克隆后：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-cmake-jie-ru&quot;&gt;3.2 CMake 接入&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_subdirectory&lt;/span&gt;&lt;span&gt;(third_party/stdexec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若上游不是「可 &lt;code&gt;add_subdirectory&lt;/code&gt; 的 CMake 工程」，可改为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_include_directories&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; third_party/some_header_only/include)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-3-luo-pan-wei-zhi&quot;&gt;3.3 落盘位置&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;项目&amp;gt;/third_party/&amp;lt;库&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;源码（随 submodule 提交指针版本）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;你自己工程的构建树（依赖若被 &lt;code&gt;add_subdirectory&lt;/code&gt;，对象文件也在 build 里）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-san-chong-fang-shi-zen-me-xuan&quot;&gt;4. 三种方式怎么选&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;选&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;有 brew / vcpkg，多项目共用&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§1 包管理器&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无发行包、跟上游、单项目&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§2 CPM / FetchContent&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;要进 git、审计、离线 CI&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§3 submodule&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;仅本机随便玩&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/.local&lt;/code&gt; 或 &lt;code&gt;~/src/...&lt;/code&gt;（非正式）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;共同要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;钉 &lt;strong&gt;tag / commit&lt;/strong&gt;，避免默默漂在 &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CI 与文档写清：代理、&lt;code&gt;AR&lt;/code&gt;、&lt;code&gt;CMAKE_TOOLCHAIN_FILE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同一依赖不要 brew + vcpkg + FetchContent 混装三份，除非有意隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-zui-xiao-ke-nian-tie-gong-cheng-gu-jia&quot;&gt;5. 最小可粘贴工程骨架&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;myapp/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cmake/CPM.cmake          # 若用 CPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  third_party/...          # 若用 submodule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  src/main.cpp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CMakeLists.txt&lt;/code&gt; 混合示例（包管理器 + CPM）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(myapp LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 来自 brew / vcpkg（需 CMAKE_PREFIX_PATH 或 vcpkg toolchain）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(fmt CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 仅有源码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/CPM.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;gh:NVIDIA/stdexec#&amp;lt;version&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(myapp src/main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(myapp &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; fmt::fmt STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置示例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只用 brew&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只用 vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_TOOLCHAIN_FILE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; brew + vcpkg 同时找包时，toolchain + PREFIX 可一起设（注意别重复链接同一库的两套）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-pai-cuo-su-ji&quot;&gt;6. 排错速记&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;处理&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;vcpkg &lt;code&gt;curl 35&lt;/code&gt; / SSL timeout&lt;/td&gt;&lt;td&gt;检查代理：&lt;code&gt;all_proxy&lt;/code&gt; 勿对 Clash HTTP 口用 &lt;code&gt;socks5://&lt;/code&gt;；统一 &lt;code&gt;http://127.0.0.1:17890&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg &lt;code&gt;archive member &#39;/&#39; not a mach-o&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;export AR=/usr/bin/ar&lt;/code&gt;，并从 &lt;code&gt;PATH&lt;/code&gt; 去掉 &lt;code&gt;binutils&lt;/code&gt; 的 &lt;code&gt;ar&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;find_package&lt;/code&gt; 找不到&lt;/td&gt;&lt;td&gt;查 &lt;code&gt;CMAKE_TOOLCHAIN_FILE&lt;/code&gt; / &lt;code&gt;CMAKE_PREFIX_PATH&lt;/code&gt;；vcpkg 用 &lt;code&gt;installed/arm64-osx&lt;/code&gt; 而非 &lt;code&gt;packages/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;FetchContent 每次重下&lt;/td&gt;&lt;td&gt;设 &lt;code&gt;CPM_SOURCE_CACHE&lt;/code&gt;，或改用 submodule&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;文档用途：本机第三方 C++ 库管理备忘。可按项目需要删减示例中的库名与版本钉点。&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake Lib Manager </title>
        <published>2026-07-12T00:00:00+00:00</published>
        <updated>2026-07-12T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_Jai/first-blog/"/>
        <id>https://suchaharcan.github.io/01Write_blog_Jai/first-blog/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_Jai/first-blog/">&lt;h1 id=&quot;c-di-san-fang-lei-ku-ben-di-guan-li&quot;&gt;C++ 第三方类库本地管理&lt;/h1&gt;
&lt;p&gt;面向本机（macOS / Homebrew / vcpkg）的三种主流方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;系统包管理器（Homebrew、vcpkg）&lt;/li&gt;
&lt;li&gt;仅有源码：CPM / FetchContent&lt;/li&gt;
&lt;li&gt;Git submodule&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;原则：&lt;strong&gt;钉版本、可复现、优先项目内声明依赖&lt;/strong&gt;，少往 &lt;code&gt;/usr/local&lt;/code&gt; 全局乱装。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;0-ben-ji-lu-jing-su-cha&quot;&gt;0. 本机路径速查&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;路径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Homebrew 前缀&lt;/td&gt;&lt;td&gt;&lt;code&gt;/opt/homebrew&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 根目录&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg&lt;/code&gt;（即 &lt;code&gt;/Users/songhoujin/vcpkg&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 安装前缀（给 CMake 用）&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/installed/arm64-osx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg 构建暂存&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/packages/&amp;lt;pkg&amp;gt;_arm64-osx&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg toolchain&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;归档工具&lt;/td&gt;&lt;td&gt;&lt;code&gt;AR=/usr/bin/ar&lt;/code&gt;（勿用 binutils 的 GNU &lt;code&gt;ar&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;HTTP 代理（Clash）&lt;/td&gt;&lt;td&gt;&lt;code&gt;http://127.0.0.1:17890&lt;/code&gt;（&lt;code&gt;http_proxy&lt;/code&gt;/&lt;code&gt;https_proxy&lt;/code&gt;/&lt;code&gt;all_proxy&lt;/code&gt; 均用 &lt;strong&gt;http://&lt;/strong&gt;，勿对 17890 使用 &lt;code&gt;socks5://&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; AR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;bin&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;ar&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; VCPKG_ROOT&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; http_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; https_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; HTTP_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;http_proxy&lt;/span&gt;&lt;span&gt; HTTPS_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;https_proxy&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; all_proxy&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;http&lt;/span&gt;&lt;span&gt;://&lt;/span&gt;&lt;span&gt;127&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;17890&lt;/span&gt;&lt;span&gt; ALL_PROXY&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;all_proxy&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;1-xi-tong-bao-guan-li-qi-homebrew-vcpkg&quot;&gt;1. 系统包管理器：Homebrew / vcpkg&lt;/h2&gt;
&lt;p&gt;有 formula / port 时优先用包管理器：多项目共用、升级清晰、&lt;code&gt;find_package&lt;/code&gt; 友好。&lt;/p&gt;
&lt;h3 id=&quot;1-1-homebrew&quot;&gt;1.1 Homebrew&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fmt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ftxui&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; entt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fmt&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看单包前缀&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ls&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/lib/cmake&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CMake 使用：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(fmt CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; fmt::fmt)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;安装位置：&lt;/strong&gt; &lt;code&gt;/opt/homebrew/{include,lib,lib/cmake,share}&lt;/code&gt;（Apple Silicon）。&lt;/p&gt;
&lt;h3 id=&quot;1-2-vcpkg&quot;&gt;1.2 vcpkg&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;export&lt;/span&gt;&lt;span&gt; AR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;usr&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;bin&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;ar&lt;/span&gt;&lt;span&gt; VCPKG_ROOT&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 代理见上文；确认：env | grep -i proxy 中不应出现 socks5://127.0.0.1:17890&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;vcpkg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; libassert&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; unordered-dense&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mp-units&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;vcpkg&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;CMake 使用（推荐带 toolchain）：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_TOOLCHAIN_FILE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(libassert CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; libassert::assert)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;安装位置：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;给编译器用的：&lt;code&gt;$HOME/vcpkg/installed/arm64-osx/{include,lib,share}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;packages/&lt;/code&gt; 仅为构建中转，&lt;strong&gt;不要&lt;/strong&gt;把它当 &lt;code&gt;CMAKE_PREFIX_PATH&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;1-3-he-shi-yong-brew-he-shi-yong-vcpkg&quot;&gt;1.3 何时用 brew、何时用 vcpkg&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情况&lt;/th&gt;&lt;th&gt;建议&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;有 brew formula，且要系统级共用&lt;/td&gt;&lt;td&gt;Homebrew&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无 brew / 要与 CMake 深度集成 / 钉 triplet&lt;/td&gt;&lt;td&gt;vcpkg&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;macOS 预发布导致 bottle 异常&lt;/td&gt;&lt;td&gt;可改 vcpkg，或 &lt;code&gt;brew install --build-from-source&lt;/code&gt;（视公式而定）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;2-jin-you-yuan-ma-cpm-fetchcontent&quot;&gt;2. 仅有源码：CPM / FetchContent&lt;/h2&gt;
&lt;p&gt;无 brew、无 vcpkg port（或故意跟 git）时，在 &lt;strong&gt;本项目 CMake&lt;/strong&gt; 里拉取源码。默认只进当前 &lt;code&gt;build/&lt;/code&gt;，不污染系统。&lt;/p&gt;
&lt;p&gt;典型库：&lt;code&gt;NVIDIA/stdexec&lt;/code&gt;、&lt;code&gt;alibaba/yalantinglibs&lt;/code&gt; 等。&lt;/p&gt;
&lt;h3 id=&quot;2-1-yuan-sheng-fetchcontent&quot;&gt;2.1 原生 FetchContent&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(FetchContent)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FetchContent_Declare(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GIT_REPOSITORY https://github.com/NVIDIA/stdexec.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  GIT_TAG        &amp;lt;钉死的 tag 或 commit&amp;gt;   &lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 勿长期裸追 main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;FetchContent_MakeAvailable(stdexec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)  &lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 目标名以该库文档为准&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;落盘位置（配置后）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-src/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载的源码&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-build/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;该依赖的构建目录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/_deps/&amp;lt;name&amp;gt;-subbuild/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下载用子工程&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;删除 &lt;code&gt;build/&lt;/code&gt; 即清除缓存；换机器需重新 &lt;code&gt;cmake -B build&lt;/code&gt;（需能访问 Git 仓库）。&lt;/p&gt;
&lt;h3 id=&quot;2-2-cpm-cmake-tui-jian-feng-zhuang&quot;&gt;2.2 CPM.cmake（推荐封装）&lt;/h3&gt;
&lt;p&gt;一次引入 CPM，之后一行加依赖：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;fsSL&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cmake/CPM.cmake&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  https://github.com/cpm-cmake/CPM.cmake/releases/latest/download/CPM.cmake&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/CPM.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 形式：gh:owner/repo#tag_or_commit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;gh:NVIDIA/stdexec#&amp;lt;钉死的版本&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CPM 仍基于 FetchContent，缓存同样在 &lt;code&gt;build/_deps/&lt;/code&gt;（也可设 &lt;code&gt;CPM_SOURCE_CACHE&lt;/code&gt; 指向如 &lt;code&gt;$HOME/.cache/CPM&lt;/code&gt; 跨项目复用下载）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCPM_SOURCE_CACHE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.cache/CPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;2-3-ke-xuan-an-zhuang-dao-yong-hu-qian-zhui-duo-wan-ju-xiang-mu-gong-yong&quot;&gt;2.3 可选：安装到用户前缀（多玩具项目共用）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/stdexec&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_INSTALL_PREFIX=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.local&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_BUILD_TYPE=Release&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-build&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /tmp/stdexec-build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 其它项目：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/.local&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;落盘：&lt;/strong&gt; &lt;code&gt;$HOME/.local/{include,lib,lib/cmake}&lt;/code&gt;。正式项目仍更推荐 FetchContent/CPM 钉在仓库内。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;3-git-submodule&quot;&gt;3. Git submodule&lt;/h2&gt;
&lt;p&gt;需要源码进仓库、可审计、可离线构建时使用。&lt;/p&gt;
&lt;h3 id=&quot;3-1-tian-jia-yu-geng-xin&quot;&gt;3.1 添加与更新&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /path/to/your-project&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; https://github.com/NVIDIA/stdexec.git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 钉到具体提交&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; checkout&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;commi&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; third_party/stdexec&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Pin stdexec to &amp;lt;commit&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 新克隆机器：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; clone&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recurse-submodules&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;your-repo-ur&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或已克隆后：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-cmake-jie-ru&quot;&gt;3.2 CMake 接入&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(demo LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_subdirectory&lt;/span&gt;&lt;span&gt;(third_party/stdexec)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(demo main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若上游不是「可 &lt;code&gt;add_subdirectory&lt;/code&gt; 的 CMake 工程」，可改为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_include_directories&lt;/span&gt;&lt;span&gt;(demo &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; third_party/some_header_only/include)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-3-luo-pan-wei-zhi&quot;&gt;3.3 落盘位置&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;内容&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;项目&amp;gt;/third_party/&amp;lt;库&amp;gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;源码（随 submodule 提交指针版本）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;你自己工程的构建树（依赖若被 &lt;code&gt;add_subdirectory&lt;/code&gt;，对象文件也在 build 里）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;4-san-chong-fang-shi-zen-me-xuan&quot;&gt;4. 三种方式怎么选&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;选&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;有 brew / vcpkg，多项目共用&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§1 包管理器&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;无发行包、跟上游、单项目&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§2 CPM / FetchContent&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;要进 git、审计、离线 CI&lt;/td&gt;&lt;td&gt;&lt;strong&gt;§3 submodule&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;仅本机随便玩&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME/.local&lt;/code&gt; 或 &lt;code&gt;~/src/...&lt;/code&gt;（非正式）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;共同要求：&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;钉 &lt;strong&gt;tag / commit&lt;/strong&gt;，避免默默漂在 &lt;code&gt;main&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;CI 与文档写清：代理、&lt;code&gt;AR&lt;/code&gt;、&lt;code&gt;CMAKE_TOOLCHAIN_FILE&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;同一依赖不要 brew + vcpkg + FetchContent 混装三份，除非有意隔离&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;5-zui-xiao-ke-nian-tie-gong-cheng-gu-jia&quot;&gt;5. 最小可粘贴工程骨架&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;myapp/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  CMakeLists.txt&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  cmake/CPM.cmake          # 若用 CPM&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  third_party/...          # 若用 submodule&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  src/main.cpp&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CMakeLists.txt&lt;/code&gt; 混合示例（包管理器 + CPM）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;cmake&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;cmake_minimum_required&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;VERSION&lt;/span&gt;&lt;span&gt; 3.24)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;project&lt;/span&gt;&lt;span&gt;(myapp LANGUAGES CXX)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;set&lt;/span&gt;&lt;span&gt;(CMAKE_CXX_STANDARD 20)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 来自 brew / vcpkg（需 CMAKE_PREFIX_PATH 或 vcpkg toolchain）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;find_package&lt;/span&gt;&lt;span&gt;(fmt CONFIG REQUIRED)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;# 仅有源码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;include&lt;/span&gt;&lt;span&gt;(cmake/CPM.cmake)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CPMAddPackage(&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;gh:NVIDIA/stdexec#&amp;lt;version&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;add_executable&lt;/span&gt;&lt;span&gt;(myapp src/main.cpp)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;target_link_libraries&lt;/span&gt;&lt;span&gt;(myapp &lt;/span&gt;&lt;span&gt;PRIVATE&lt;/span&gt;&lt;span&gt; fmt::fmt STDEXEC::stdexec)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置示例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只用 brew&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;DCMAKE_PREFIX_PATH=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-prefix&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只用 vcpkg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;B&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;DCMAKE_TOOLCHAIN_FILE=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span&gt;/vcpkg/scripts/buildsystems/vcpkg.cmake&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; brew + vcpkg 同时找包时，toolchain + PREFIX 可一起设（注意别重复链接同一库的两套）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;6-pai-cuo-su-ji&quot;&gt;6. 排错速记&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;处理&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;vcpkg &lt;code&gt;curl 35&lt;/code&gt; / SSL timeout&lt;/td&gt;&lt;td&gt;检查代理：&lt;code&gt;all_proxy&lt;/code&gt; 勿对 Clash HTTP 口用 &lt;code&gt;socks5://&lt;/code&gt;；统一 &lt;code&gt;http://127.0.0.1:17890&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;vcpkg &lt;code&gt;archive member &#39;/&#39; not a mach-o&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;export AR=/usr/bin/ar&lt;/code&gt;，并从 &lt;code&gt;PATH&lt;/code&gt; 去掉 &lt;code&gt;binutils&lt;/code&gt; 的 &lt;code&gt;ar&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;find_package&lt;/code&gt; 找不到&lt;/td&gt;&lt;td&gt;查 &lt;code&gt;CMAKE_TOOLCHAIN_FILE&lt;/code&gt; / &lt;code&gt;CMAKE_PREFIX_PATH&lt;/code&gt;；vcpkg 用 &lt;code&gt;installed/arm64-osx&lt;/code&gt; 而非 &lt;code&gt;packages/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;FetchContent 每次重下&lt;/td&gt;&lt;td&gt;设 &lt;code&gt;CPM_SOURCE_CACHE&lt;/code&gt;，或改用 submodule&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;文档用途：本机第三方 C++ 库管理备忘。可按项目需要删减示例中的库名与版本钉点。&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Fast Open CodeProject</title>
        <published>2026-07-12T00:00:00+00:00</published>
        <updated>2026-07-12T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/fast-open-codeproject/"/>
        <id>https://suchaharcan.github.io/03Share_blog/fast-open-codeproject/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/fast-open-codeproject/">&lt;blockquote&gt;
&lt;p&gt;进入项目目录， 按照指定编辑器打开&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; pwd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                            ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;/Users/songhoujin/00BlogZola&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zed&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                          ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; existing&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; alias&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; You&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; use:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Habit Rebuild</title>
        <published>2026-06-25T00:00:00+00:00</published>
        <updated>2026-06-25T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/habit-rebuild/"/>
        <id>https://suchaharcan.github.io/03Share_blog/habit-rebuild/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/habit-rebuild/">&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;抛去 旧习惯， 在 立刻行动  中 寻找 意义&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;bo-ke-kan-ban-blog-kanban&quot;&gt;博客看板 - Blog Kanban&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;每天主动编写博客， 根据你的活动 和 规划， 有意识的去 编写看板，
看板并非 随意编写，请 郑重对待， 那是 你的承诺， 言之有物，&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;自己做了什么，就写什么。
量化 自己的行为， 直观的感受 自己的变化；&lt;/p&gt;
&lt;p&gt;每天在 kanban/中 进行更新 当日的完成的核心事项；&lt;/p&gt;
&lt;h2 id=&quot;ruan-jian-kan-ban-stacks&quot;&gt;软件看板 - Stacks&lt;/h2&gt;
&lt;p&gt;自己主动的有意识 推进和 记录 进步地方， 后续 可 进行 整理复盘；&lt;/p&gt;
&lt;h2 id=&quot;focus-zhuan-zhu-mo-shi&quot;&gt;Focus - 专注模式&lt;/h2&gt;
&lt;p&gt;自己在 SnippetsLab -&amp;gt; DevonThink 中 基于 专注模式的产品想法
自己就 培养 这样的 工作习惯，
精简自己的工作环境。&lt;/p&gt;
&lt;h2 id=&quot;zai-hou-xu-dong-yao-shi-can-yu-lao-dong&quot;&gt;在后续 动摇时 参与劳动&lt;/h2&gt;
&lt;p&gt;去跑个外卖 或 出门 跑一跑 ，清醒下脑袋&lt;/p&gt;
&lt;h2 id=&quot;xi-guan-zhu-dong-qu-yue-du-kai-yuan-dai-ma&quot;&gt;习惯： 主动去阅读开源代码&lt;/h2&gt;
&lt;p&gt;搜狗C++后台项目， 腾讯广告C++ 项目， 等都是优秀的项目 去阅读吸收理解， 提高自己的代码架构理解和设计；&lt;/p&gt;
&lt;h2 id=&quot;xi-guan-yin-le-tao-ye-xin-xu-pi-bei-shi-lian-lian-ji-ta&quot;&gt;习惯： 音乐， 陶冶心绪， 疲惫时 练练吉他&lt;/h2&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zola 模板开发要点与 Markdown 语法速查</title>
        <published>2026-06-25T00:00:00+00:00</published>
        <updated>2026-10-13T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/"/>
        <id>https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/">&lt;p&gt;&lt;strong&gt;Zola 模板&lt;/strong&gt;的核心机制（结合 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.getzola.org/documentation/&quot;&gt;Zola 官方文档&lt;/a&gt; 与本站实践），以及参考 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one/tree/main/content&quot;&gt;daudix.one/content&lt;/a&gt; 整理的 &lt;strong&gt;Markdown / Shortcode&lt;/strong&gt; 写法示例。 &lt;br/&gt;&lt;/p&gt;
&lt;blockquote class=&quot;markdown-alert-warning&quot;&gt;
&lt;p&gt;&lt;strong&gt;警告：&lt;code&gt;zola.toml&lt;/code&gt;若启用新功能， 记得在该文档中 更新说明 使用方法&lt;/strong&gt;&lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 拉取更新主题&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看当前子模块状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-init&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 已克隆主仓库后递归拉取子模块&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; submodule&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; update&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-recursive&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-remote&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 更新所有子模块到最新版本&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 提交推送博客到仓库&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Update MD file or Add new md file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; push&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 构建 检测是否存在语法问题&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zols&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 本机运行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;yi-zola-mo-ban-mu-lu-yu-you-xian-ji&quot;&gt;一、Zola 模板：目录与优先级&lt;/h2&gt;
&lt;p&gt;Zola 的模板引擎是 &lt;strong&gt;Tera&lt;/strong&gt;（语法接近 Jinja2 / Liquid）。站点根目录结构：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── config.toml          # 全局配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── content/             # Markdown 内容（按 section 组织）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── templates/           # 站点级模板（优先级高于 theme）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── static/              # 原样拷贝的静态资源&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── sass/                # 可选，编译为 CSS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── themes/ametrine/     # 主题（可被 templates/ 同名文件覆盖）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;覆盖规则&lt;/strong&gt;：&lt;code&gt;templates/&lt;/code&gt; 下与主题同路径的文件会&lt;strong&gt;完全替换&lt;/strong&gt;主题模板。例如：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{# templates/article.html — 只改文章页，不动 theme #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% extends &amp;quot;ametrine/templates/article.html&amp;quot; %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% block content %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; super() &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{# 追加滚动条、热力图等 #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% endblock %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;原则：&lt;strong&gt;不改 &lt;code&gt;themes/&lt;/code&gt; 内文件&lt;/strong&gt;，在 &lt;code&gt;templates/&lt;/code&gt; 里 extends + block 扩展。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;er-mo-ban-lei-xing-yu-front-matter-bang-ding&quot;&gt;二、模板类型与 front matter 绑定&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模板文件&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;典型绑定方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;base.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全站骨架（&lt;code&gt;&amp;lt;html&amp;gt;&lt;/code&gt;、header、sidebar、footer）&lt;/td&gt;&lt;td&gt;被其他模板 extends&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;section.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Section 索引页（&lt;code&gt;_index.md&lt;/code&gt;）&lt;/td&gt;&lt;td&gt;section 默认模板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;page.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;独立 Page&lt;/td&gt;&lt;td&gt;page 默认模板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;article.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;单篇文章&lt;/td&gt;&lt;td&gt;&lt;code&gt;page_template = &quot;article.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;article_list.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文章列表 + 分页&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;article_list.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;自定义如 &lt;code&gt;archive.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;归档页等特殊布局&lt;/td&gt;&lt;td&gt;&lt;code&gt;_index.md&lt;/code&gt; 中 &lt;code&gt;template = &quot;archive.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;Section 的 &lt;code&gt;_index.md&lt;/code&gt; 示例（参考 daudix 的 blog/_index.md）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;效率-工作流&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sort_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article_list.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 列表页模板&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;page_template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 该 section 下每篇文章的模板&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;paginate_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;generate_feeds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;no_header&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 传给模板，控制是否渲染 h1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;san-tera-he-xin-yu-fa&quot;&gt;三、Tera 核心语法&lt;/h2&gt;
&lt;h3 id=&quot;3-1-ji-cheng-yu-kuai-extends-block-super&quot;&gt;3.1 继承与块（extends / block / super）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% extends &amp;quot;ametrine/templates/base.html&amp;quot; %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% block content %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; section.content | safe &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% endblock content %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;在子模板中调用父块内容：&lt;code&gt;super()&lt;/code&gt; 过滤器（写作 &lt;code&gt;&amp;amp;#123;&amp;amp;#123; super() &amp;amp;#125;&amp;amp;#125;&lt;/code&gt;）（本站 &lt;code&gt;article.html&lt;/code&gt; 即此模式）。&lt;/p&gt;
&lt;h3 id=&quot;3-2-yin-ru-pian-duan-include-import&quot;&gt;3.2 引入片段（include / import）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% include &amp;quot;partials/heatmap_component.html&amp;quot; %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% import &amp;quot;macros/macros.html&amp;quot; as macros %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; macros::translate(key=&amp;quot;skip_to_content&amp;quot;, default=&amp;quot;Skip&amp;quot;, language_strings=language_strings) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-3-chang-yong-bian-liang-gou-jian-shi-zhu-ru&quot;&gt;3.3 常用变量（构建时注入）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;变量&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;config&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; 全文，含 &lt;code&gt;config.extra.*&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;page&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前页面（title、date、content、permalink、taxonomies…）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;section&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前 section（pages 列表、title…）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;lang&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前语言&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;current_url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前页面 URL&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-4-chang-yong-han-shu-yu-guo-lu-qi&quot;&gt;3.4 常用函数与过滤器&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{# 跨 section 拉取文章 — archive.html 中的用法 #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% set sec = get_section(path=&amp;quot;03Share_blog/_index.md&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% set posts = sec.pages | sort(attribute=&amp;quot;date&amp;quot;) | reverse %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{# 加载外部数据 #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% set strings = load_data(path=&amp;quot;i18n/en.toml&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{# 过滤器链 #}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; page.date | date(format=&amp;quot;%Y-%m-%d&amp;quot;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; heat_data | json_encode() | safe &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% for year, posts in all_posts | group_by(attribute=&amp;quot;year&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-5-tu-pian-chu-li-build-shi&quot;&gt;3.5 图片处理（build 时）&lt;/h3&gt;
&lt;p&gt;主题 &lt;code&gt;base.html&lt;/code&gt; 中常见写法：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% set blurnail = resize_image(path=page.colocated_path ~ banner, width=4, height=2, op=&amp;quot;fill&amp;quot;, format=&amp;quot;webp&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;page.colocated_path&lt;/code&gt; 指向与 &lt;code&gt;index.md&lt;/code&gt; 同目录，便于 co-located 资源。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;si-shortcode-duan-dai-ma&quot;&gt;四、Shortcode（短代码）&lt;/h2&gt;
&lt;p&gt;放在 &lt;code&gt;templates/shortcodes/*.html&lt;/code&gt;，Markdown 中写作：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% shortcode_name(param=&amp;quot;value&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;内容&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% end %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;或自闭合：&lt;code&gt;{%% icon(name=&quot;github&quot;) %%}&lt;/code&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;在 Markdown 正文中展示 shortcode 字面量时，用 &lt;code&gt;{%%&lt;/code&gt; / &lt;code&gt;%%}&lt;/code&gt; 转义，避免被 Zola 当作 shortcode 执行。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;查找顺序&lt;/strong&gt;：站点 &lt;code&gt;templates/shortcodes/&lt;/code&gt; → 主题 &lt;code&gt;themes/ametrine/templates/shortcodes/&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;wu-markdown-yu-fa-shi-li&quot;&gt;五、Markdown 语法示例&lt;/h2&gt;
&lt;p&gt;以下示例整理自 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one/tree/main/content&quot;&gt;daudix.one&lt;/a&gt; 的常见写法，并标注 ametrine 支持情况。&lt;/p&gt;
&lt;h3 id=&quot;5-1-front-matter-toml&quot;&gt;5.1 Front matter（TOML）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;文章标题&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;摘要，用于列表卡片与 SEO&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 草稿，需 zola build --drafts&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Zola&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Devlog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Featured&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;toc&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(254 44% 55%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(290 20% 71%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 浅色/深色强调色&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;banner&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;banner.webp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;              #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 与 index.md 同目录的横幅图&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fediverse&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;vmst.io&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;user&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;113295812044964246&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;           #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 启用 Fediverse 评论&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;sectionji-index-md&quot;&gt;section级(_index.md)&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CMake 4.0 技术细节整理 专栏&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;My writings, I suppose.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sort_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article_list.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;page_template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;paginate_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;generate_feeds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytic/umami.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 启用访客来源统计&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;no_header&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;pageji-index-md&quot;&gt;page级(index.md)&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Mac 本地网络 配置优化方案&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;提升网络访问性能，减少硬件性能损耗&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-20&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 最新更新时间， 若 section的_index.md 中设置以时间排序，以这个为准&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-20&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;              #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 👈 确保这里有规范的日期&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zsh&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Mac&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 标签&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Hot&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 分类&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(26.511627 25% 34%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(26.75676 31% 53%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-2-nei-bu-lian-jie&quot;&gt;5.2 内部链接&lt;/h3&gt;
&lt;p&gt;Zola 专用 &lt;code&gt;@/&lt;/code&gt; 前缀，构建时解析为正确 permalink：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;详见 &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;网站重写 Devlog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;@/blog/2023-08-13-site-and-blog-devlog/index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;脚注式引用：&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;为什么叫这个名字？&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;@/03Share_blog/2025-10-04-Zola-build-deploy-circle/index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-2-0-ye-jian-kua-ye-tiao-zhuan&quot;&gt;5.2.0 页间跨页跳转&lt;/h3&gt;
&lt;p&gt;``TODO` 待补充&lt;/p&gt;
&lt;h3 id=&quot;5-2-1-ye-nei-kuai-tiao-zhuan&quot;&gt;5.2.1 页内块跳转&lt;/h3&gt;
&lt;p&gt;``TODO` 待补充&lt;/p&gt;
&lt;h3 id=&quot;5-3-biao-ti-yu-mu-lu&quot;&gt;5.3 标题与目录&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;##&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 二级标题        → 自动生成锚点&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;###&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 三级标题&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; toc = true  → 文章顶部自动生成目录&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-4-wen-ben-yang-shi&quot;&gt;5.4 文本样式&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span class=&quot; z-l-b z-d-b&quot;&gt;粗体&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;  *&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt;斜体&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ~~&lt;/span&gt;&lt;span&gt;删除线&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;~~&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  `&lt;/span&gt;&lt;span&gt;行内代码&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;`&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt; 引用块&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt; 可以多行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;上标脚注引用&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt;，文末定义脚注内容。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;^1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;Dependency hell&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;https://en.wikipedia.org/wiki/Dependency_hell&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-5-shu-yu-kuai-daudix-feng-ge&quot;&gt;5.5 术语块（daudix 风格）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span class=&quot; z-l-b z-d-b&quot;&gt;SSG：&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span&gt; Static Site Generator，将 Markdown 转为静态 HTML 的构建工具。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-6-biao-ge&quot;&gt;5.6 表格&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span&gt; 页面&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span&gt; 旧仓库&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span&gt; 新仓库&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ----&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ------&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ------&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span&gt; Home&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span&gt; pages&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  |&lt;/span&gt;&lt;span&gt; website&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;|&lt;/span&gt;&lt;span&gt; Blog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span&gt; blog-source&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;span&gt; website&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; |&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-7-dai-ma-kuai&quot;&gt;5.7 代码块&lt;/h3&gt;
&lt;p&gt;支持语法高亮（本站 &lt;code&gt;zola.toml&lt;/code&gt; 配置 monokai-pro 主题）：&lt;/p&gt;
&lt;p&gt;TOML 配置示例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;smart_punctuation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_alerts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;HTML 模板示例（Tera 语法，写作时用 &lt;code&gt;{%%&lt;/code&gt; / &lt;code&gt;%%}&lt;/code&gt; 转义可在正文中展示字面量）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% extends &amp;quot;base.html&amp;quot; %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% block content %%}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#123;&lt;/span&gt;&lt;span&gt; page.content | safe &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;#125;&lt;/span&gt;&lt;span&gt;{%% endblock %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Shell 命令：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-force&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-drafts&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-8-github-alerts-github-alerts-true-shi&quot;&gt;5.8 GitHub Alerts（&lt;code&gt;github_alerts = true&lt;/code&gt; 时）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;!NOTE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt; 这是提示框，无需手写 shortcode。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;!WARNING&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt; 警告信息。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;!TIP&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-l-i z-d-4 z-d-i&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot; z-l-i z-d-i&quot;&gt; 小技巧。&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等价的 shortcode 写法（ametrine &lt;code&gt;alert.html&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% alert(title=&amp;quot;Note&amp;quot;, icon=&amp;quot;info&amp;quot;, color=&amp;quot;note&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;自定义图标与颜色的提示块。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% end %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-9-tu-pian&quot;&gt;5.9 图片&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;普通 Markdown 图片&lt;/strong&gt;（与 &lt;code&gt;index.md&lt;/code&gt; 同目录放 &lt;code&gt;photo.png&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;Obsidian 附件目录配置&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;obsidian-attachments.png&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;daudix 技巧：URL 锚点控制样式&lt;/strong&gt;（无需 Kramdown 的 &lt;code&gt;{: .class}&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;透明背景 PNG&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;context-menu.png#transparent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;像素风渲染&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;sprite.png#pixels&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;![&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;无 hover 效果&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-l-u z-d-5 z-d-u&quot;&gt;logo.png#transparent#no-hover&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;对应 SCSS 选择器示例：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;scss&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;#transparent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; background&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; transparent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;img&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;src&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;#pixels&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;       {&lt;/span&gt;&lt;span&gt; image-rendering&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-1 z-d-3&quot;&gt; pixelated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Shortcode 图片&lt;/strong&gt;（更多参数）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% image(url=&amp;quot;banner.webp&amp;quot;, alt=&amp;quot;横幅&amp;quot;, full=true, drop_shadow=true) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-10-ascii-crt-yi-shu-zi&quot;&gt;5.10 ASCII / CRT 艺术字&lt;/h3&gt;
&lt;p&gt;Section 首页与 daudix blog 首页常用的 &lt;code&gt;crt&lt;/code&gt; shortcode：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% crt(label=&amp;quot;ASCII 插画：左侧卡车，中间房屋，右侧火箭&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;         *                 *&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  *&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;              _________##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;                @\\\\\\\\\##&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-10 z-d-8&quot;&gt;             @@@\\\\\\\\##\&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% end %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;渲染为 &lt;code&gt;.crt&lt;/code&gt; 样式的 &lt;code&gt;&amp;lt;pre&amp;gt;&lt;/code&gt;，带 CRT 扫描线效果。&lt;/p&gt;
&lt;h3 id=&quot;5-11-qian-ru-mei-ti&quot;&gt;5.11 嵌入媒体&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;YouTube&lt;/strong&gt;（隐私增强域名，需 CSP 允许 &lt;code&gt;youtube-nocookie.com&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% youtube(id=&amp;quot;dQw4w9WgXcQ&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% youtube(id=&amp;quot;abc123&amp;quot;, start=30, autoplay=false) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Vimeo / 本地视频 / 音频&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% vimeo(id=&amp;quot;123456789&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% video(url=&amp;quot;clip.mp4&amp;quot;, controls=true, loop=true, muted=true) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% audio(url=&amp;quot;podcast.mp3&amp;quot;, name=&amp;quot;播客片段&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-12-tu-biao&quot;&gt;5.12 图标&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% icon(name=&amp;quot;github&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% icon(name=&amp;quot;terminal&amp;quot;, inline=true) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;图标来自 Phosphor SVG，主题 &lt;code&gt;icons/phosphor/&lt;/code&gt; 目录。&lt;/p&gt;
&lt;h3 id=&quot;5-13-emoji-shortcode&quot;&gt;5.13 Emoji shortcode&lt;/h3&gt;
&lt;p&gt;当 &lt;code&gt;render_emoji = false&lt;/code&gt; 时，可用 shortcode 插入：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%% emoji(name=&amp;quot;🦀&amp;quot;) %%}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;5-14-ben-zhan-zi-ding-yi-shortcode&quot;&gt;5.14 本站自定义 shortcode&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;templates/shortcodes/&lt;/code&gt; 下还有：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Shortcode&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;badges&lt;/code&gt;&lt;/td&gt;&lt;td&gt;徽章展示&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;polaroid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;宝丽来相框图片&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;window&lt;/code&gt;&lt;/td&gt;&lt;td&gt;窗口 UI 框&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;masonry&lt;/code&gt;&lt;/td&gt;&lt;td&gt;瀑布流图片墙&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;todo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TODO 列表&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;now_playing&lt;/code&gt;&lt;/td&gt;&lt;td&gt;正在播放&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;online&lt;/code&gt;&lt;/td&gt;&lt;td&gt;在线状态&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;用法均为 &lt;code&gt;{%% name(参数) %%}...{%% end %%}&lt;/code&gt;，具体参数见对应 html 文件。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;liu-mo-ban-kai-fa-zhu-yi-dian-qing-dan&quot;&gt;六、模板开发注意点清单&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;不要改 theme&lt;/strong&gt;：在 &lt;code&gt;templates/&lt;/code&gt; 覆盖或 extends。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;safe&lt;/code&gt; 过滤器&lt;/strong&gt;：&lt;code&gt;page.content&lt;/code&gt;、&lt;code&gt;| markdown | safe&lt;/code&gt; 输出已解析 HTML；纯文本勿加 safe。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Section 路径&lt;/strong&gt;：&lt;code&gt;get_section(path=&quot;03Share_blog/_index.md&quot;)&lt;/code&gt; 路径相对 &lt;code&gt;content/&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;全局变量&lt;/strong&gt;：&lt;code&gt;{%% set_global x = ... %%}&lt;/code&gt; 在 loop 内累加时使用。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP&lt;/strong&gt;：嵌入 iframe / 外部脚本需在 &lt;code&gt;zola.toml&lt;/code&gt; 的 &lt;code&gt;[extra.csp]&lt;/code&gt; 声明域名。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;静态资源&lt;/strong&gt;：JS/CSS 放 &lt;code&gt;static/&lt;/code&gt;，引用 &lt;code&gt;/js/xxx.js&lt;/code&gt;；Sass 放 &lt;code&gt;sass/&lt;/code&gt; 由 Zola 编译。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Co-located 资源&lt;/strong&gt;：图片与 &lt;code&gt;index.md&lt;/code&gt; 同目录，构建后 permalink 同路径，便于搬运整文件夹。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;分页&lt;/strong&gt;：&lt;code&gt;paginate_by = 10&lt;/code&gt; + 模板中使用 &lt;code&gt;section.pages&lt;/code&gt; 与 paginator partial。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;多语言&lt;/strong&gt;：&lt;code&gt;content/&lt;/code&gt; 下按语言分子目录，配合 &lt;code&gt;i18n/*.toml&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;调试&lt;/strong&gt;：&lt;code&gt;zola build --force&lt;/code&gt; 强制重建；&lt;code&gt;zola serve --open&lt;/code&gt; 热重载预览。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;qi-ben-zhan-shi-jian-dui-zhao&quot;&gt;七、本站实践对照&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;/th&gt;&lt;th&gt;实现位置&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;文章页扩展（热力图、滚动条、音乐）&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/article.html&lt;/code&gt; extends + include partials&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;归档页 + 年份热力图&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/archive.html&lt;/code&gt; + &lt;code&gt;heatmap_component.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章页音乐播放器&lt;/td&gt;&lt;td&gt;&lt;code&gt;partials/music_player.html&lt;/code&gt; + &lt;code&gt;static/js/music-player.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;自定义列表模板&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/article_list.html&lt;/code&gt; / &lt;code&gt;nanolog_list.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;全局配置&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;config.extra.*&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;主题变量（颜色）&lt;/td&gt;&lt;td&gt;ametrine &lt;code&gt;--bg-muted-1&lt;/code&gt;、&lt;code&gt;--accent-color&lt;/code&gt; 等 CSS 变量&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;ba-gou-jian-liu-cheng&quot;&gt;八、构建流程&lt;/h2&gt;
&lt;h3 id=&quot;8-1-yin-le-bo-fang-qi-ru-he-zai-xin-bo-ke-zhong-qi-yong&quot;&gt;8.1 音乐播放器：如何在新博客中启用&lt;/h3&gt;
&lt;h4 id=&quot;quan-zhan-kai-guan-zola-toml-yi-pei-zhi-ke-tiao-guo&quot;&gt;全站开关（&lt;code&gt;zola.toml&lt;/code&gt;，已配置可跳过）&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;music_player&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/music&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 对应 static/music/ → public/music/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;dan-pian-wen-zhang-front-matter&quot;&gt;单篇文章 front matter&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;music_player&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tracks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;歌手-歌名&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;周杰伦-青花瓷&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;zi-yuan-wen-jian-ming-ming-fang-zai-static-music&quot;&gt;资源文件命名（放在 &lt;code&gt;static/music/&lt;/code&gt;）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;歌手-歌名.mp3&lt;/code&gt; 或 &lt;code&gt;.flac&lt;/code&gt;&lt;/td&gt;&lt;td&gt;音频；&lt;strong&gt;优先使用 MP3&lt;/strong&gt;（体积更小、seek 更稳）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;歌手-歌名.lrc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;歌词；UTF-8 或 GB18030&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;file&lt;/code&gt; 字段&lt;strong&gt;不带扩展名&lt;/strong&gt;，播放器自动探测 &lt;code&gt;.mp3&lt;/code&gt; → &lt;code&gt;.flac&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&quot;xing-wei-zhai-yao&quot;&gt;行为摘要&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;挂件在文章页右上角（热力图下方），默认只显示播放按钮，悬停展开控制条。&lt;/li&gt;
&lt;li&gt;进度条：细轨道 + 圆点，点击/拖动跳转。&lt;/li&gt;
&lt;li&gt;音量：点击喇叭循环 25% → 50% → 75% → 100% → 静音。&lt;/li&gt;
&lt;li&gt;Safari 不显示播放器（脚本内检测后移除组件）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;8-2-gou-jian-yu-yu-lan-ming-ling-dui-zhao&quot;&gt;8.2 构建与预览命令对照&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;命令&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;th&gt;进度条能否立刻拖&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;日常预览&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build&lt;/code&gt; → &lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;改样式、普通文章足够&lt;/td&gt;&lt;td&gt;首次拖可能需等整首下载（Blob 兜底）；之后正常&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;加密文章开发&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;./dev.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;先 &lt;code&gt;encrypt-content.mjs&lt;/code&gt;，再 &lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;正式部署 / CI&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;加密 → build → post-build → kanban 校验&lt;/td&gt;&lt;td&gt;线上 GitHub Pages 支持 Range，&lt;strong&gt;可直接拖&lt;/strong&gt;（需 &lt;code&gt;static/music/&lt;/code&gt; 已部署）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;本地想立刻拖&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;见下方两行&lt;/td&gt;&lt;td&gt;可选；不改日常习惯&lt;/td&gt;&lt;td&gt;&lt;strong&gt;立刻可拖&lt;/strong&gt;，与线上一致&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;日常预览与加密开发（标准流程，&lt;strong&gt;未改&lt;/strong&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 普通文章&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 新增/修改加密文章&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./dev.sh&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正式部署：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; CI 同：.github/workflows/deploy_pages.yml → ./build-site.sh --output-dir ../public_html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;本地立刻验证进度条 seek（可选）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-base-url&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; http://127.0.0.1:1111/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scripts/serve-with-ranges.mjs&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-no-watch&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1111&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;然后访问 &lt;code&gt;http://127.0.0.1:1111/&lt;/code&gt;。说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;--base-url&lt;/code&gt; 让构建出的 CSS/JS 链接指向本地，避免指向 &lt;code&gt;suchaharcan.github.io&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;seek 能力来自 &lt;code&gt;serve-with-ranges.mjs&lt;/code&gt;&lt;/strong&gt;（发送 &lt;code&gt;Accept-Ranges: bytes&lt;/code&gt;），不是 &lt;code&gt;zola serve&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola serve&lt;/code&gt; 不支持 Range，故默认本地首次拖动会触发播放器 &lt;strong&gt;Blob 兜底&lt;/strong&gt;（下载整首后再跳），&lt;strong&gt;不需要&lt;/strong&gt;从头播到尾。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;其他常用命令：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-force&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 清空 output 后重建&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; check&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;           #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 检查链接，不输出站点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;设计细节与根因分析见 &lt;a href=&quot;https://suchaharcan.github.io/nanolog/2026-07-12t17-30-00z/&quot;&gt;Nanolog · 热力图与音乐播放器&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;8-3-yuan-gou-jian-ming-ling-su-cha&quot;&gt;8.3 原构建命令速查&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可选；若存在新增加密博客则必选&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-force&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; check&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;jiu-bu-shu-yu-fa-bu&quot;&gt;九、部署与发布&lt;/h2&gt;
&lt;blockquote class=&quot;markdown-alert-tip&quot;&gt;
&lt;p&gt;部署源码 参考 &lt;code&gt;.github/workflows/deploy.yml&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;shi-zola-toml-pei-zhi-jie-dian-zuo-yong-jie-du&quot;&gt;十、Zola.toml 配置 节点作用解读&lt;/h2&gt;
&lt;h3 id=&quot;quan-ju-zola-toml&quot;&gt;全局(zola.toml)&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Rocky‘s Blog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://suchaharcan.github.io/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;月更 技术博客 CXX优先&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;theme&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;ametrine&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;compile_sass&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;minify_html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;feed_filenames&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;atom.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;rss.xml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 生成的 RSS/Atom 订阅文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;build_search_index&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 生成搜索索引&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;author&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Suchaharcan&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; feed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; paginate_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; feed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                                               #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 分类和标签的配置&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;markdown&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;render_emoji&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;smart_punctuation&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;lazy_async_image&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;bottom_footnotes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;             #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 脚注显示在底部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;external_links_class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;external&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;github_alerts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 显示 GitHub 警告&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;markdown&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;highlighting&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;style&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;class&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;light_theme&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;monokai-pro-light&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dark_theme&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;monokai-pro&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;extra_themes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;themes/ametrine/giallo/themes/monokai-pro-light.json&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;themes/ametrine/giallo/themes/monokai-pro.json&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Put all your custom variables here&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 全站 Umami：static/analytic/umami.js（覆盖首页 / 文章 / 标签 / 404 等所有页面）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytic/umami.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;feed_sections&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Nanolog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/nanolog/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Blog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; path&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;@/01Write_blog/_index.md&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                                 #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 手动指定 哪些导航栏中的 RSS 可订阅项 sections &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(270 13% 48%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(290 20% 71%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; home_url = &amp;quot;@/home/index.md&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;issues_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://github.com/SuchaharCan/SuchaharCan.github.io/issues/new&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 弃用 &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;source_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://codeberg.org/SuzhaharCan/SuzhaharCan.codeberg.page&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 网站源码在Codeberg ，可跳转直接在线修改博客， 在 kanban/ nanolog/ 中使用 &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;replog_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://github.com/SuchaharCan/SuchaharCan.github.io/actions/workflows/deploy_pages.yml&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 网站部署在 github.io， 可跳转点击 触发重新部署 。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;copy_button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_reading_time&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_backlinks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date_format&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%d %B %Y&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date_format_long&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%d %B %Y, %R (%Z)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date_locale&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;en_IE&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; zola 暂不支持中文， 默认 英文&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Asia/Shanghai&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;               #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 时区， HTML/JS 业务逻辑判断 使用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;show_comments_qr&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;评论二维码， 暂时禁用， 我有 社交账号，但我暂无 海外运营想法 禁用，若文章有价值， 我会直接 分享到HackerNews 上&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;csp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; directive&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;font-src&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; domains&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;#39;self&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 内容安全策略，启用，限制外部脚本注入，提高网站 安全性， 若 后续功能开发的模块需要 JS脚本，此处需要 同步更新&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;music_player&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;base_url&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/music&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 音乐资源：static/music/ → /music/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;单篇文章启用播放器：在文章 front matter 增加 &lt;code&gt;[extra.music_player]&lt;/code&gt;，见 &lt;strong&gt;§8.1&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;手动指定 文章分类， 用于 文章列表页面 的 分类显示
大类划分 : 归档， 有价值， 热门&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[[&lt;/span&gt;&lt;span&gt;extra.categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;name&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Tracking&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Posts that need to be continuously updated.&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;green&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;icon&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fire&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;gou-jian-jiao-ben-shuo-ming-dev-sh-yu-build-site-sh&quot;&gt;构建脚本说明：&lt;code&gt;dev.sh&lt;/code&gt; 与 &lt;code&gt;build-site.sh&lt;/code&gt;&lt;/h1&gt;
&lt;p&gt;本站有两条常用入口脚本，分别对应&lt;strong&gt;本地开发预览&lt;/strong&gt;与&lt;strong&gt;正式构建&lt;/strong&gt;。二者都会在 Zola 构建前同步加密文章密文，但后续步骤不同。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-lan&quot;&gt;一览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;脚本&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;th&gt;输出&lt;/th&gt;&lt;th&gt;典型场景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;./dev.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;本地开发 + 热重载预览&lt;/td&gt;&lt;td&gt;不强调完整 &lt;code&gt;public/&lt;/code&gt; 产物&lt;/td&gt;&lt;td&gt;改文章、改样式、调试加密页&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;正式静态站点构建&lt;/td&gt;&lt;td&gt;&lt;code&gt;public/&lt;/code&gt;（或 &lt;code&gt;--output-dir&lt;/code&gt; 指定目录）&lt;/td&gt;&lt;td&gt;部署前、CI、需要完整校验&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;dev-sh-ben-di-kai-fa&quot;&gt;&lt;code&gt;dev.sh&lt;/code&gt; — 本地开发&lt;/h2&gt;
&lt;h3 id=&quot;zuo-yong&quot;&gt;作用&lt;/h3&gt;
&lt;p&gt;在本地启动 &lt;strong&gt;Zola 开发服务器&lt;/strong&gt;（&lt;code&gt;zola serve&lt;/code&gt;），保存文件后自动重建并刷新预览。&lt;/p&gt;
&lt;h3 id=&quot;zhi-xing-bu-zou&quot;&gt;执行步骤&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;① node scripts/encrypt-content.mjs   # 同步加密文章密文&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;② zola serve [你传入的参数]          # 本地预览（默认 http://127.0.0.1:1111）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;yuan-ma&quot;&gt;源码&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scripts/encrypt-content.mjs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;exec&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;he-shi-shi-yong&quot;&gt;何时使用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;新增或修改了加密文章&lt;/strong&gt;（&lt;code&gt;[extra.encryption] encrypt = true&lt;/code&gt;）时，需先跑密文同步再预览。&lt;/li&gt;
&lt;li&gt;改普通文章、模板、样式、JS/CSS 时，也可用本脚本（密文同步幂等，多跑无害）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;bu-hui-zuo-de-shi&quot;&gt;不会做的事&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;不执行 &lt;code&gt;post-build.mjs&lt;/code&gt;（RSS/Atom、搜索索引&lt;strong&gt;不会&lt;/strong&gt;剔除加密文章条目）。&lt;/li&gt;
&lt;li&gt;不执行 &lt;code&gt;verify-kanban-build.mjs&lt;/code&gt;（看板产物完整性校验）。&lt;/li&gt;
&lt;li&gt;不负责生成可部署的完整发布包；部署请用 &lt;code&gt;build-site.sh&lt;/code&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chang-yong-shi-li&quot;&gt;常用示例&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./dev.sh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 默认端口 1111&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./dev.sh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-open&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;             #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 构建后自动打开浏览器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./dev.sh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3000&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 指定端口&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;shuo-ming&quot;&gt;说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zola serve&lt;/code&gt; &lt;strong&gt;不支持&lt;/strong&gt; HTTP &lt;code&gt;Accept-Ranges&lt;/code&gt;，本地音乐播放器进度条首次拖动可能需 Blob 兜底（见 Nanolog &lt;code&gt;2026-07-12&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;若仅改非加密内容、密文已存在，也可手动：&lt;code&gt;zola build &amp;amp;&amp;amp; zola serve&lt;/code&gt;（跳过加密同步）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;build-site-sh-zheng-shi-gou-jian&quot;&gt;&lt;code&gt;build-site.sh&lt;/code&gt; — 正式构建&lt;/h2&gt;
&lt;h3 id=&quot;zuo-yong-1&quot;&gt;作用&lt;/h3&gt;
&lt;p&gt;生成可部署的静态站点目录，并完成加密相关的&lt;strong&gt;构建后处理&lt;/strong&gt;与&lt;strong&gt;看板校验&lt;/strong&gt;。CI（&lt;code&gt;.github/workflows/deploy_pages.yml&lt;/code&gt;）调用的是本脚本。&lt;/p&gt;
&lt;h3 id=&quot;zhi-xing-bu-zou-1&quot;&gt;执行步骤&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;① node scripts/encrypt-content.mjs      # 全量同步加密密文&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;② zola build [可选参数]                  # 输出静态 HTML 到 public/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;③ node scripts/post-build.mjs           # 从 RSS/Atom、搜索索引移除加密文章&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;④ node scripts/verify-kanban-build.mjs  # 校验 kanban 周页是否均已生成&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;ge-zi-bu-zou-zhi-ze&quot;&gt;各子步骤职责&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;步骤&lt;/th&gt;&lt;th&gt;脚本&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;构建前&lt;/td&gt;&lt;td&gt;&lt;code&gt;encrypt-content.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;扫描 &lt;code&gt;content/&lt;/code&gt;，对 &lt;code&gt;encrypt = true&lt;/code&gt; 的文章重加密；删除已取消加密的多余 JSON&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Zola 原生编译：Markdown → HTML，拷贝 &lt;code&gt;static/&lt;/code&gt; → &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建后&lt;/td&gt;&lt;td&gt;&lt;code&gt;post-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;加密页不出现在订阅源与站内搜索索引中&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建后&lt;/td&gt;&lt;td&gt;&lt;code&gt;verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;确保 &lt;code&gt;content/kanban/YYYY-MM-DD.md&lt;/code&gt; 在输出目录均有对应页面&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;he-shi-shi-yong-1&quot;&gt;何时使用&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;推送 / 部署到 GitHub Pages 之前。&lt;/li&gt;
&lt;li&gt;需要验证看板、加密、订阅源行为是否正确时。&lt;/li&gt;
&lt;li&gt;本地想确认与线上一致的完整产物时。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;chang-yong-shi-li-1&quot;&gt;常用示例&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-output-dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ../public_html&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; CI 用法；并 export ZOLA_OUTPUT_DIR 供后置脚本&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;can-shu&quot;&gt;参数&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;支持将额外参数原样传给 &lt;code&gt;zola build&lt;/code&gt;（如 &lt;code&gt;--output-dir&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;--output-dir&lt;/code&gt; 会设置环境变量 &lt;code&gt;ZOLA_OUTPUT_DIR&lt;/code&gt;，供 &lt;code&gt;post-build.mjs&lt;/code&gt; 与 &lt;code&gt;verify-kanban-build.mjs&lt;/code&gt; 读取正确输出目录。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;dui-bi-he-shi-yong-na-ge&quot;&gt;对比：何时用哪个&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;需求&lt;/th&gt;&lt;th&gt;推荐命令&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;本地边改边看&lt;/td&gt;&lt;td&gt;&lt;code&gt;./dev.sh&lt;/code&gt; 或 &lt;code&gt;zola serve&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;改了加密文章并要本地解密预览&lt;/td&gt;&lt;td&gt;&lt;code&gt;./dev.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;部署前完整构建&lt;/td&gt;&lt;td&gt;&lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;只改样式、不涉及加密&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build &amp;amp;&amp;amp; zola serve&lt;/code&gt; 即可&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;本地立刻验证音乐进度条 seek&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build --base-url http://127.0.0.1:1111/&lt;/code&gt; 后 &lt;code&gt;node scripts/serve-with-ranges.mjs --no-watch -p 1111&lt;/code&gt;（可选，见模板指南 §8.2）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yu-ci-de-guan-xi&quot;&gt;与 CI 的关系&lt;/h2&gt;
&lt;p&gt;GitHub Actions 工作流 &lt;strong&gt;不调用&lt;/strong&gt; &lt;code&gt;dev.sh&lt;/code&gt;，部署步骤为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-output-dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ../public_html&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;与本地正式构建一致，无需单独改 workflow。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;xiang-guan-wen-jian&quot;&gt;相关文件&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/encrypt-content.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;构建前加密同步&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/post-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;构建后 feed / 搜索过滤&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板产物校验&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/encryption-lib.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;加密与 feed 处理共享库&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/serve-with-ranges.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;可选：带 byte-range 的本地静态服务（非 &lt;code&gt;dev.sh&lt;/code&gt; 默认流程）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;更细的加密架构与命令对照见：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/content/nanolog/2026-06-24T20:00:00Z.md&quot;&gt;Nanolog · 加密模块重构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/content/nanolog/2026-07-12T17:30:00Z.md&quot;&gt;Nanolog · 热力图与音乐播放器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/content/03Share_blog/2026-06-22-zola-template-markdown-guide/index.md&quot;&gt;Zola 模板指南 · §8 构建流程&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;can-kao&quot;&gt;参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.getzola.org/documentation/&quot;&gt;Zola Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://keats.github.io/tera/&quot;&gt;Tera Template Engine&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one/tree/main/content&quot;&gt;daudix.one content&lt;/a&gt; — 本文 Markdown 示例主要来源&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://daudix.one/blog/2024-10-12-zola-vs-jekyll/&quot;&gt;daudix: Zola vs Jekyll&lt;/a&gt; — 目录结构与模板覆盖的详细说明&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://daudix.one/blog/2024-12-14-my-blog-workflow/&quot;&gt;daudix: My Blog Workflow&lt;/a&gt; — front matter 模板与图片工作流&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;本文即按上述规范编写：&lt;code&gt;toc = true&lt;/code&gt; 启用目录，&lt;code&gt;accent_color&lt;/code&gt; 设置页面强调色，内部链接使用 &lt;code&gt;@/&lt;/code&gt; 语法。&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>6.25 – 6.30 验证计划</title>
        <published>2026-06-25T00:00:00+00:00</published>
        <updated>2026-06-25T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/2026-06-25-06-30-1316/"/>
        <id>https://suchaharcan.github.io/kanban/2026-06-25-06-30-1316/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/2026-06-25-06-30-1316/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h2 id=&quot;professional-cmake-a-practical-guide-tong-du&quot;&gt;Professional CMake: A Practical Guide 通读&lt;/h2&gt;
&lt;p&gt;@start 2026-06-25
@due 2026-06-26
@priority 5
@labels red, orange,green,blue
@top red&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
基础通识&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
下载与导出&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
库（接口，静态，动态）&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
etc&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;先通读，再精读。
生词后续纳入Eudic
最后 在本地 重写 理解，编写XMind 文档&lt;/p&gt;
&lt;h2 id=&quot;c-20-yu-yan&quot;&gt;C++20 预研&lt;/h2&gt;
&lt;p&gt;@due 2026-06-28
@priority 3
@labels blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
第一章节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一章节的内容就很多&lt;/p&gt;
&lt;h2 id=&quot;408-dong-shou&quot;&gt;408 动手&lt;/h2&gt;
&lt;p&gt;@due 2026-06-30
@priority 3
@labels blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
408 - 数据结构&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;408 备考是最重要的
下半年的核心事项。&lt;/p&gt;
&lt;h2 id=&quot;ying-yu-dan-ci&quot;&gt;英语 单词&lt;/h2&gt;
&lt;p&gt;@due 2026-06-29
@priority 3
@labels blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
墨墨记单词&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Eudic&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;单词重新捡起来&lt;/p&gt;
&lt;h1 id=&quot;yi-wan-cheng&quot;&gt;已完成&lt;/h1&gt;
&lt;h2 id=&quot;ben-di-cang-ku-da-jian&quot;&gt;本地仓库搭建&lt;/h2&gt;
&lt;p&gt;@start 2026-06-25
@due 2026-06-25
@priority 5
@labels red, blue
@bg #FFF8E1
@top orange&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
01_cmake&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
02_cpp_syntax&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
03_algorithms&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Codeberg仓库建立 ok
架构设计完成 ok
初次版本 已推送 ok
2026-06-25 19:05:12&lt;/p&gt;
&lt;h1 id=&quot;zi-yuan&quot;&gt;资源&lt;/h1&gt;
&lt;h2 id=&quot;ben-di-cang-ku-da-jian-1&quot;&gt;本地仓库搭建&lt;/h2&gt;
&lt;p&gt;@start 2026-06-15
@priority 2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Zola 本地 &lt;code&gt;build --force&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Codeberg 仓库写入权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;content/kanban/&lt;/code&gt; 目录、ReDeplog 流水线。&lt;/p&gt;
&lt;h2 id=&quot;can-kao-su-cai&quot;&gt;参考素材&lt;/h2&gt;
&lt;p&gt;@priority 1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
article_details 图标行&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Trello 列布局截图&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;mu-biao&quot;&gt;目标&lt;/h1&gt;
&lt;h2 id=&quot;wan-cheng-hou-jin-ru-zhuang-tai&quot;&gt;完成后：进入状态&lt;/h2&gt;
&lt;p&gt;@priority 5
@goal complete&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
进入学习状态&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
远离 小说 熬夜 虚度光阴的 环节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现 Trello 式五列看板，替代纯 Markdown 表格维护。&lt;/p&gt;
&lt;h2 id=&quot;wei-wan-cheng-jin-du-shi-kong-yu-shi-xiao&quot;&gt;未完成：进度失控与失效&lt;/h2&gt;
&lt;p&gt;@priority 4
@goal risk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
继续 沉迷，浪费时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;jin-du-hui-bao&quot;&gt;进度 汇报&lt;/h1&gt;
&lt;h2 id=&quot;2026nian-06yue-25ri-di-yi-tian&quot;&gt;2026年06月25日 第一天&lt;/h2&gt;
&lt;p&gt;@priority 5
@goal complete
@bg #FFF8E1&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CMAKE，C++，Algo 前置环境 代码搭建&lt;/li&gt;
&lt;li&gt;小说卸载，家务打扫，决定 不再点外卖， 自己做。&lt;/li&gt;
&lt;li&gt;游戏， 熬夜等 不再参与， 晚上11点后就休息&lt;/li&gt;
&lt;li&gt;无关事项：刷新更新， 看无意义的内容 拒绝&lt;/li&gt;
&lt;li&gt;主动有意思的使用博客进行记录和整理&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
远离 小说 熬夜 虚度光阴的 环节&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一天， 坚持下去
今天剩余的时间：
1小时单词
1小时 技术文档通读
1小时 原子习惯阅读&lt;/p&gt;
&lt;h2 id=&quot;2026nian-06yue-26ri-dao-yue-di&quot;&gt;2026年06月26日 到月底&lt;/h2&gt;
&lt;p&gt;@priority 5
@goal complete
@bg #FFF8E1&lt;/p&gt;
&lt;p&gt;CXX项目临时更新 暂时搁置&lt;/p&gt;
&lt;p&gt;2026年07月09日 提交， 回归正常 ，档期 回归&lt;/p&gt;
</content>
        
    </entry>
    
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-24T14:00:00+00:00</published>
        <updated>2026-06-24T14:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-24t14-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-24t14-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-24t14-00-00z/">&lt;p&gt;2026年06月24日 09:40（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;kan-ban-xian-shang-que-shi-pai-cha-ametrine-zi-mo-kuai-geng-xin-xin-wen-zhang-qia-pian-yang-shi&quot;&gt;看板线上缺失排查 · Ametrine 子模块更新 · 新文章卡片样式&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮三件事：&lt;strong&gt;周计划看板本地/线上一致性排查&lt;/strong&gt;、&lt;strong&gt;Ametrine 主题子模块更新到 &lt;code&gt;6d1c244&lt;/code&gt;（New article card design）&lt;/strong&gt;、&lt;strong&gt;Debug 专栏应用两种文章卡片样式&lt;/strong&gt;。看板本地可用 &lt;code&gt;zola build&lt;/code&gt; / &lt;code&gt;zola serve&lt;/code&gt;；正式部署推荐 &lt;code&gt;./build-site.sh&lt;/code&gt;（含看板产物校验）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-kan-ban-lie-biao-jin-xian-shi-1-zhang-qia-pian&quot;&gt;1. 看板列表仅显示 1 张卡片&lt;/h3&gt;
&lt;h4 id=&quot;1-1-wen-ti&quot;&gt;1.1 问题&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;环境&lt;/th&gt;&lt;th&gt;&lt;code&gt;/kanban/&lt;/code&gt; 列表&lt;/th&gt;&lt;th&gt;&lt;code&gt;/kanban/2026-06-16/&lt;/code&gt; 明细&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;本地 &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2 张卡片&lt;/td&gt;&lt;td&gt;可打开&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;线上 gh-pages&lt;/td&gt;&lt;td&gt;1 张卡片&lt;/td&gt;&lt;td&gt;&lt;strong&gt;404&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;1-2-pai-cha-liu-cheng-yuan-ma-gou-jian&quot;&gt;1.2 排查流程（源码 → 构建）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;阶段 A：源码&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;本地 &lt;code&gt;00BlogZola&lt;/code&gt;&lt;/th&gt;&lt;th&gt;Codeberg &lt;code&gt;content/kanban/&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-16.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-22.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;week_start&lt;/code&gt; / &lt;code&gt;week_end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;均已配置&lt;/td&gt;&lt;td&gt;一致&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;结论：&lt;strong&gt;源码两侧一致，问题不在 Markdown 缺失。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;阶段 B：构建产物&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;本地 &lt;code&gt;public/kanban/&lt;/code&gt;&lt;/th&gt;&lt;th&gt;GitHub &lt;code&gt;gh-pages/kanban/&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;index.html&lt;/code&gt; 中 &lt;code&gt;.kanban-week-card&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;data-json&lt;/code&gt; 热力图条目&lt;/td&gt;&lt;td&gt;2 条&lt;/td&gt;&lt;td&gt;1 条&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-16/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✓ 存在&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不存在&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;2026-06-22/index.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;td&gt;✓&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;结论：&lt;strong&gt;线上 gh-pages 是旧/不完整部署&lt;/strong&gt;，并非前端 JS 把第二张卡片藏起来——HTML 里根本没有第二张卡片，明细页目录也未生成，手动输入 URL 必然 404。&lt;/p&gt;
&lt;h4 id=&quot;1-3-gen-yin&quot;&gt;1.3 根因&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;线上 gh-pages 某次部署产物不完整&lt;/strong&gt;（缺少 &lt;code&gt;2026-06-16/&lt;/code&gt; 目录与列表第二张卡片），与本地是否使用 &lt;code&gt;./build-site.sh&lt;/code&gt; &lt;strong&gt;无直接关系&lt;/strong&gt;——GitHub Actions 同样只跑 &lt;code&gt;zola build&lt;/code&gt;，看板理论上应能完整生成。部署流水线原先缺少 kanban 产物校验，异常未能被及时发现。&lt;/p&gt;
&lt;h4 id=&quot;1-4-xiu-fu&quot;&gt;1.4 修复&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;改动&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;对比 &lt;code&gt;content/kanban/20*.md&lt;/code&gt; 数量与 &lt;code&gt;public/kanban/*/index.html&lt;/code&gt;、列表卡片数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;构建末尾调用 verify&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.github/workflows/deploy_pages.yml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;改用 &lt;code&gt;./build-site.sh&lt;/code&gt; + submodule init + verify&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;重新部署后&lt;/strong&gt;（GitHub → Actions → &lt;code&gt;Build Zola and Deploy to GitHub Pages&lt;/code&gt; → Run workflow），线上应出现 2 张卡片且 &lt;code&gt;/kanban/2026-06-16/&lt;/code&gt; 可访问。&lt;/p&gt;
&lt;h4 id=&quot;1-5-bu-chong-ben-di-wei-he-zhi-yong-zola-build-zola-serve-jiu-neng-wan-zheng-shi-xian-kan-ban&quot;&gt;1.5 补充：本地为何只用 &lt;code&gt;zola build&lt;/code&gt; / &lt;code&gt;zola serve&lt;/code&gt; 就能完整实现看板？&lt;/h4&gt;
&lt;p&gt;日常开发若只用 &lt;code&gt;zola build&lt;/code&gt;、&lt;code&gt;zola serve&lt;/code&gt;，&lt;strong&gt;不主动跑&lt;/strong&gt; &lt;code&gt;./build-site.sh&lt;/code&gt;，看板依然完整——这是预期行为，因为看板整条链路都在 Zola 原生构建内，不依赖 &lt;code&gt;build-site.sh&lt;/code&gt; 额外步骤。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;zola build&lt;/code&gt; 已覆盖看板所需：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;content/kanban/*.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓  Zola 读取 front matter（week_start、stats…）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;templates/kanban_list.html / kanban.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓  load_data 内嵌原始 Markdown 到 HTML&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;static/js/kanban-*.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ↓  浏览器解析、渲染热力图 / Trello 看板&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;public/kanban/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;列表页与明细页模板在&lt;strong&gt;构建时&lt;/strong&gt;用 &lt;code&gt;load_data&lt;/code&gt; 把 Markdown 写进 HTML（无需 &lt;code&gt;static/kanban/&lt;/code&gt; 副本）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;templates/kanban_list.html&lt;/code&gt; — 每张周卡片内嵌 &lt;code&gt;&amp;lt;textarea class=&quot;kanban-raw-source&quot;&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt; — 明细页 &lt;code&gt;#kanban-raw-markdown&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;只要 &lt;code&gt;content/kanban/&lt;/code&gt; 下有带 &lt;code&gt;week_start&lt;/code&gt; 的 &lt;code&gt;.md&lt;/code&gt;，&lt;code&gt;zola build&lt;/code&gt; 就会生成对应页面与列表卡片；&lt;code&gt;zola serve&lt;/code&gt; 仅本地预览 &lt;code&gt;public/&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;build-site.sh&lt;/code&gt; 在四步中，看板只依赖第 ② 步：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;步骤&lt;/th&gt;&lt;th&gt;脚本&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;th&gt;看板是否需要&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;①&lt;/td&gt;&lt;td&gt;&lt;code&gt;encrypt-content.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;为 &lt;code&gt;[extra.encryption] encrypt = true&lt;/code&gt; 的文章生成 &lt;code&gt;static/encryption/pages/*.json&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;否&lt;/strong&gt; — kanban 未开加密&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;②&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola build&lt;/code&gt;&lt;/td&gt;&lt;td&gt;生成全部静态页&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt; — 看板全靠这步&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;③&lt;/td&gt;&lt;td&gt;&lt;code&gt;patch-search-index.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;修补 elasticlunr 搜索索引&lt;/td&gt;&lt;td&gt;&lt;strong&gt;否&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;④&lt;/td&gt;&lt;td&gt;&lt;code&gt;verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;对比源码周数与构建卡片数&lt;/td&gt;&lt;td&gt;&lt;strong&gt;否&lt;/strong&gt; — 仅部署前防回归&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;何时才需要 &lt;code&gt;./build-site.sh&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;推荐命令&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;本地调试看板、普通文章&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola serve&lt;/code&gt;（或先 &lt;code&gt;zola build&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;本地调试&lt;strong&gt;加密文章&lt;/strong&gt;详情&lt;/td&gt;&lt;td&gt;需先跑 ①，或直接 &lt;code&gt;./build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;正式部署&lt;/strong&gt;前&lt;/td&gt;&lt;td&gt;&lt;code&gt;./build-site.sh&lt;/code&gt;（加密 + 搜索 + 看板校验）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;与「线上少一张看板」的关系（再强调）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;本地 &lt;code&gt;zola build&lt;/code&gt;&lt;/th&gt;&lt;th&gt;线上 gh-pages（问题当时）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;源码&lt;/td&gt;&lt;td&gt;2 个 kanban &lt;code&gt;.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Codeberg 同样 2 个 ✓&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;产物&lt;/td&gt;&lt;td&gt;&lt;code&gt;public/kanban/&lt;/code&gt; 含 2026-06-16 + 2026-06-22&lt;/td&gt;&lt;td&gt;仅 2026-06-22，2026-06-16 &lt;strong&gt;目录缺失&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;结论：&lt;strong&gt;看板 = Zola 模板 + content + static JS，&lt;code&gt;zola build&lt;/code&gt; 已足够；&lt;code&gt;build-site.sh&lt;/code&gt; 是站点其他能力（加密、搜索、部署校验）的包装，不是看板运行的前提。&lt;/strong&gt; 线上问题来自 gh-pages 部署产物不完整，而非本地少用了 &lt;code&gt;build-site.sh&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-ametrine-zi-mo-kuai-geng-xin&quot;&gt;2. Ametrine 子模块更新&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cd&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fetch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; origin&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; main&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; checkout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; pull&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 父仓库记录新 commit&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项目&lt;/th&gt;&lt;th&gt;值&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;远程&lt;/td&gt;&lt;td&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine&quot;&gt;codeberg.org/daudix/ametrine&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;目标 commit&lt;/td&gt;&lt;td&gt;&lt;code&gt;6d1c244&lt;/code&gt; — &lt;em&gt;New article card design&lt;/em&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;参考效果&lt;/td&gt;&lt;td&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://daudix.one/blog/&quot;&gt;daudix.one/blog&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;主要变化：&lt;code&gt;templates/partials/article_list.html&lt;/code&gt; 卡片布局（banner 缩略图置顶）、&lt;code&gt;article_details.html&lt;/code&gt; 元数据分行、&lt;code&gt;_article-list.scss&lt;/code&gt; 渐变/accent 视觉。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-liang-chong-wen-zhang-qia-pian-yang-shi-ru-he-yin-yong&quot;&gt;3. 两种文章卡片样式如何引用&lt;/h3&gt;
&lt;p&gt;Ametrine 通过 front matter &lt;strong&gt;组合&lt;/strong&gt;决定卡片形态（与 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://daudix.one/blog/&quot;&gt;daudix 博客&lt;/a&gt; 一致）：&lt;/p&gt;
&lt;h4 id=&quot;yang-shi-a-dai-heng-fu-tu-has-banner-has-accent-color&quot;&gt;样式 A — 带横幅图（&lt;code&gt;has-banner&lt;/code&gt; + &lt;code&gt;has-accent-color&lt;/code&gt;）&lt;/h4&gt;
&lt;p&gt;列表卡片顶部有大图；&lt;strong&gt;明细页开头&lt;/strong&gt;由 &lt;code&gt;base.html&lt;/code&gt; 的 &lt;code&gt;#banner&lt;/code&gt; 渲染同目录图片。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(210 25% 34%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(210 31% 53%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 浅色 / 深色各一组 HSL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;banner&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;banner.jpg&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;           #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 与 index.md 同目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;banner_position&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;50% 40%&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可选，缩略图裁剪焦点&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;图片放在文章文件夹内，如 &lt;code&gt;content/…/my-post/banner.jpg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;构建时 Zola &lt;code&gt;resize_image&lt;/code&gt; 自动生成 WebP 缩略图&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;本站示例（Debug 专栏）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文章&lt;/th&gt;&lt;th&gt;目录&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Mac Chrome ReOpen&lt;/td&gt;&lt;td&gt;&lt;code&gt;02Engineer_blog_Debug/2026-06-23-Chrome-ReOpen/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;VPN 断网排查&lt;/td&gt;&lt;td&gt;&lt;code&gt;02Engineer_blog_Debug/2026-06-20-VPN-noNet/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;yang-shi-b-chun-accent-jian-bian-has-accent-color-wu-banner&quot;&gt;样式 B — 纯 accent 渐变（&lt;code&gt;has-accent-color&lt;/code&gt;，无 banner）&lt;/h4&gt;
&lt;p&gt;无列表缩略图；可展示 &lt;strong&gt;发布日 + 更新日 + 作者&lt;/strong&gt; 等元数据行。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-21&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 与 date 不同则显示「更新」图标&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;authors&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;SuchaharCan&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可选，显示 By …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(145 22% 34%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(145 28% 50%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 不写 banner&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;本站示例：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文章&lt;/th&gt;&lt;th&gt;特征&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Little Snitch 教程&lt;/td&gt;&lt;td&gt;仅 accent + &lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;One (Teardown)&lt;/td&gt;&lt;td&gt;accent + &lt;code&gt;authors&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;ming-xi-ye-heng-fu&quot;&gt;明细页横幅&lt;/h4&gt;
&lt;p&gt;只要设置了 &lt;code&gt;banner&lt;/code&gt;，&lt;strong&gt;列表与明细共用&lt;/strong&gt;同一字段；明细页无需额外模板，主题 &lt;code&gt;base.html&lt;/code&gt; 自动在正文前插入 &lt;code&gt;#banner&lt;/code&gt; 大图（与 daudix 一致）。&lt;/p&gt;
&lt;h4 id=&quot;accent-color-ge-shi&quot;&gt;accent_color 格式&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;推荐&lt;/strong&gt;：&lt;code&gt;[&quot;hsl(H S% L%)&quot;, &quot;hsl(H S% L%)&quot;]&lt;/code&gt; — 分别为浅色/深色模式&lt;/li&gt;
&lt;li&gt;也支持单字符串 &lt;code&gt;&quot;hsl(270 50% 60%)&quot;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-ben-di-yan-zheng&quot;&gt;4. 本地验证&lt;/h3&gt;
&lt;p&gt;看板调试可直接：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正式部署或需加密/搜索/校验时：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 期望输出：kanban verify OK: 2 week(s), list cards match&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;页面&lt;/th&gt;&lt;th&gt;检查&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2026 年 6 月分组下 2 张卡片&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Trello 五列看板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/02Engineer_blog_Debug/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2 张带图卡片 + 2 张纯渐变卡片&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/02Engineer_blog_Debug/chrome-reopen/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;顶部 banner 大图&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/&quot;&gt;看板列表&lt;/a&gt; · &lt;a href=&quot;/02Engineer_blog_Debug/&quot;&gt;Debug 专栏&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/daudix/ametrine&quot;&gt;Ametrine 主题&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://daudix.one/blog/&quot;&gt;daudix 博客卡片参考&lt;/a&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;5-kan-ban-lie-biao-qia-pian-ui-re-li-tu-jin-tian-ben-zhou-biao-ji&quot;&gt;5. 看板列表卡片 UI · 热力图「今天 / 本周」标记&lt;/h3&gt;
&lt;h4 id=&quot;5-1-kan-ban-zhou-qia-pian-lie-biao-ye&quot;&gt;5.1 看板周卡片（列表页）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;需求：&lt;/strong&gt; 元数据参考 Ametrine 文章详情图标盒式风格；标题以下第二、三行加粗并居中；字号随卡片高度变化；天数跨度与卡片高度的视觉区分需更明显。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;模板结构&lt;/strong&gt;（&lt;code&gt;templates/kanban_list.html&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;h3 标题（左对齐 + accent 竖线）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─ .kanban-week-body（居中容器）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   ├─ .kanban-week-meta-row  日期 / 剩余 / 进度 / 星级&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;   └─ .kanban-week-stats      共 N 项 · 已完成 · 待办 · 进行中&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─ .kanban-week-span-spacer  （flex 占位，不再重复叠加高度）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;样式要点&lt;/strong&gt;（&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;实现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;图标&lt;/td&gt;&lt;td&gt;恢复 Ametrine &lt;code&gt;.icon&lt;/code&gt; 盒式：&lt;code&gt;box-shadow&lt;/code&gt; + 圆角背景 + &lt;code&gt;accent-color&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;元数据加粗&lt;/td&gt;&lt;td&gt;&lt;code&gt;.kanban-week-meta-row&lt;/code&gt;、&lt;code&gt;.kanban-week-stats&lt;/code&gt; → &lt;code&gt;font-weight: 600&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;居中&lt;/td&gt;&lt;td&gt;&lt;code&gt;.kanban-week-body&lt;/code&gt; + &lt;code&gt;justify-content: center&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;字号联动&lt;/td&gt;&lt;td&gt;&lt;code&gt;font-size: calc(0.78rem × var(--kanban-meta-scale))&lt;/code&gt;，图标同理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片高度&lt;/td&gt;&lt;td&gt;单一变量 &lt;code&gt;--kanban-card-body-height&lt;/code&gt;，去掉「基础高度 + spacer 再叠一层」&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;高度 / 字号映射&lt;/strong&gt;（SSR 与 JS 共用同一公式，&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt; → &lt;code&gt;applyListCardMetrics&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--kanban-card-body-height = 88px + 280px × (span_days / 7)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--kanban-meta-scale       = 0.85 + 0.35 × (span_days / 7)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;看板&lt;/th&gt;&lt;th&gt;跨度&lt;/th&gt;&lt;th&gt;卡片高度&lt;/th&gt;&lt;th&gt;meta-scale&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;2026-06-22&lt;/td&gt;&lt;td&gt;2 天&lt;/td&gt;&lt;td&gt;168px&lt;/td&gt;&lt;td&gt;0.95&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2026-06-16&lt;/td&gt;&lt;td&gt;7 天&lt;/td&gt;&lt;td&gt;368px&lt;/td&gt;&lt;td&gt;1.20&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;kanban-list.js&lt;/code&gt; 与 &lt;code&gt;kanban-heatmap.js&lt;/code&gt; 筛选后均调用 &lt;code&gt;KanbanRules.applyListCardMetrics()&lt;/code&gt;，避免两套算法不一致。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;CSS 变量&lt;/strong&gt;（&lt;code&gt;:root&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;css&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--kanban-week-body-min: 88px;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;--kanban-week-span-height: 280px;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;若需进一步拉大/缩小高度差，优先调 &lt;code&gt;--kanban-week-span-height&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&quot;5-2-re-li-tu-jin-tian-ben-zhou-biao-ji&quot;&gt;5.2 热力图「今天 / 本周」标记&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;需求：&lt;/strong&gt; 全年视图（周格子）与单月视图（天格子）下方，用空心三角标出当前周或当天；时区与站点一致；不破坏现有热力图样式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;时区：&lt;/strong&gt; 读取 &lt;code&gt;#kanban-week-list&lt;/code&gt; 的 &lt;code&gt;data-timezone&lt;/code&gt;（来自 &lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;extra.timezone&lt;/code&gt;，当前 &lt;code&gt;Asia/Shanghai&lt;/code&gt;），复用 &lt;code&gt;KanbanRules.clockInTimezone&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;显示规则：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;视图&lt;/th&gt;&lt;th&gt;标记位置&lt;/th&gt;&lt;th&gt;显示条件&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;全年（周格）&lt;/td&gt;&lt;td&gt;对应周格子下方&lt;/td&gt;&lt;td&gt;所选年份 = 今年，且该周包含今天&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单月（天格）&lt;/td&gt;&lt;td&gt;对应天格子下方&lt;/td&gt;&lt;td&gt;所选年/月 = 当前年/月，且该格 = 今天&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;DOM 结构：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;.kanban-heatmap-week-slot / .kanban-heatmap-day-slot&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├─ button.heatmap-week-cell / .heatmap-day-cell&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└─ span.kanban-heatmap-today-marker   ← 仅 .is-current 时可见&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;样式&lt;/strong&gt;（&lt;code&gt;static/css/heatmap.css&lt;/code&gt;，仅作用于 Kanban 热力图）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;空心三角：&lt;code&gt;::before&lt;/code&gt; 描边 + &lt;code&gt;::after&lt;/code&gt; 内层 &lt;code&gt;--bg-muted-1&lt;/code&gt; 镂空，尖端朝上指向格子&lt;/li&gt;
&lt;li&gt;非当前格不预留占位，避免整行高度被撑开&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;涉及文件：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;改动&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-heatmap.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;getTodayContext&lt;/code&gt;、&lt;code&gt;wrapWeekCell&lt;/code&gt;、&lt;code&gt;wrapDayCell&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;.kanban-heatmap-today-marker&lt;/code&gt; 及 slot 布局&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;5-3-ben-di-yan-zheng-kan-ban-ui-re-li-tu&quot;&gt;5.3 本地验证（看板 UI + 热力图）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;页面&lt;/th&gt;&lt;th&gt;检查&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt; 首次打开&lt;/td&gt;&lt;td&gt;年份 = 当前年、月份 = 当前月（日视图 + 当月卡片）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt; 全年&lt;/td&gt;&lt;td&gt;6 月对应周格下方有空心上三角；2 天 / 7 天卡片高度差明显&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt; 选 6 月&lt;/td&gt;&lt;td&gt;24 日格下方有标记；元数据两行居中加粗&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;切换年份&lt;/td&gt;&lt;td&gt;非当前年不显示周标记&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; build&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 打开 http://127.0.0.1:1111/kanban/&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;5-4-re-li-tu-mo-ren-xuan-zhong-dang-qian-nian-dang-qian-yue&quot;&gt;5.4 热力图默认选中当前年 / 当前月&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;需求：&lt;/strong&gt; 进入 &lt;code&gt;/kanban/&lt;/code&gt; 时，右上角年份、月份下拉不再默认「最近有数据的年份 + 全年」，而是直接落在&lt;strong&gt;当前年、当前月&lt;/strong&gt;（按站点时区），省去手动切换。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;默认逻辑&lt;/strong&gt;（&lt;code&gt;static/js/kanban-heatmap.js&lt;/code&gt; → &lt;code&gt;init()&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;var&lt;/span&gt;&lt;span&gt; todayCtx&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; getTodayContext&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;siteTimezone&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;var&lt;/span&gt;&lt;span&gt; activeYear&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; years&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;indexOf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;todayCtx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ?&lt;/span&gt;&lt;span&gt; todayCtx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; :&lt;/span&gt;&lt;span&gt; years&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;var&lt;/span&gt;&lt;span&gt; activeMonth&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; =&lt;/span&gt;&lt;span&gt; activeYear&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ===&lt;/span&gt;&lt;span&gt; todayCtx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;year&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ?&lt;/span&gt;&lt;span&gt; todayCtx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span&gt;month&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;情况&lt;/th&gt;&lt;th&gt;年份&lt;/th&gt;&lt;th&gt;月份&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;当前年有看板数据&lt;/td&gt;&lt;td&gt;当前年&lt;/td&gt;&lt;td&gt;当前月（日视图热力图 + 当月卡片列表）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;当前年无数据，回退到最近年份&lt;/td&gt;&lt;td&gt;&lt;code&gt;years[0]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;（全年）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;时区：&lt;/strong&gt; 与 §5.2 相同，读 &lt;code&gt;#kanban-week-list&lt;/code&gt; 的 &lt;code&gt;data-timezone&lt;/code&gt;（&lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;extra.timezone&lt;/code&gt;）。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;未改动的交互：&lt;/strong&gt; 用户手动切换年份时，月份仍会重置为「全年」（原有行为）；仅&lt;strong&gt;首次加载&lt;/strong&gt;默认当前年/月。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;验证：&lt;/strong&gt; 刷新 &lt;code&gt;/kanban/&lt;/code&gt;，右上角应显示「年份: 2026」「月份: 6 月」，热力图为按天网格，下方列表为 6 月卡片，无需再点选月份。&lt;/p&gt;
&lt;p&gt;最后补充： 优先 使用 Codeberg中的 workflow.此处是 第一源 ，同步给  github&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-24T10:00:00+00:00</published>
        <updated>2026-06-24T10:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-24t10-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-24t10-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-24t10-00-00z/">&lt;p&gt;2026年06月24日 10:11（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;github-pages-bu-shu-liu-shui-xian-enametoolong-kan-ban-markdown-wu-wei-symlink&quot;&gt;GitHub Pages 部署流水线 ENAMETOOLONG · 看板 Markdown 误为 symlink&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/SuchaharCan/SuchaharCan.github.io/actions/runs/28070059084/job/83102555353&quot;&gt;SuchaharCan.github.io Actions #28&lt;/a&gt; 在 &lt;strong&gt;Init theme submodule and build&lt;/strong&gt; 阶段失败：&lt;code&gt;encrypt-content.mjs&lt;/code&gt; 遍历 &lt;code&gt;content/&lt;/code&gt; 时对 &lt;code&gt;content/kanban/2026-06-16.md&lt;/code&gt; 调用 &lt;code&gt;statSync&lt;/code&gt; 抛出 &lt;code&gt;ENAMETOOLONG&lt;/code&gt;。本地 macOS 复现困难，Linux CI 必现。&lt;/p&gt;
&lt;p&gt;根因：&lt;strong&gt;该文件在 Git 索引中被误记为 symlink（mode &lt;code&gt;120000&lt;/code&gt;），但 blob 内容是整篇 Markdown&lt;/strong&gt;；Linux 检出后符号链接目标 ≈ 2500 字符的「伪路径」，&lt;code&gt;stat&lt;/code&gt; 解析失败。附带修复了 &lt;code&gt;build-site.sh&lt;/code&gt; 与 CI 验证路径问题。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-xian-xiang&quot;&gt;1. 现象&lt;/h3&gt;
&lt;h4 id=&quot;1-1-ci-bao-cuo-zhai-yao&quot;&gt;1.1 CI 报错摘要&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Error: ENAMETOOLONG: name too long, stat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  &amp;#39;.../zola_source/content/kanban/2026-06-16.md&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    at walkMd (scripts/encrypt-content.mjs:52)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    at main (scripts/encrypt-content.mjs:81)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;流水线：&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/SuchaharCan/SuchaharCan.github.io/blob/master/.github/workflows/deploy_pages.yml&quot;&gt;deploy_pages.yml&lt;/a&gt; — Codeberg 拉源码 → &lt;code&gt;./build-site.sh --output-dir ../public_html&lt;/code&gt; → 首步即 &lt;code&gt;node scripts/encrypt-content.mjs&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&quot;1-2-wei-he-ben-di-wei-bao-cuo&quot;&gt;1.2 为何本地未报错&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;环境&lt;/th&gt;&lt;th&gt;&lt;code&gt;2026-06-16.md&lt;/code&gt; 磁盘形态&lt;/th&gt;&lt;th&gt;&lt;code&gt;encrypt-content.mjs&lt;/code&gt; 行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;本地 macOS&lt;/td&gt;&lt;td&gt;普通文件 &lt;code&gt;-rw-r--r--&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;stat&lt;/code&gt; 正常&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Linux CI&lt;/td&gt;&lt;td&gt;Git 检出为 &lt;strong&gt;symlink&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;stat&lt;/code&gt; 跟随链接 → 目标为整段 Markdown → &lt;code&gt;ENAMETOOLONG&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;表面看报错路径长度正常（约 100 字符），容易误判为路径拼接 bug；需结合 &lt;strong&gt;Git 对象 mode&lt;/strong&gt; 才能定位。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-gen-yin-ding-wei-si-kao-lian&quot;&gt;2. 根因定位（思考链）&lt;/h3&gt;
&lt;h4 id=&quot;2-1-pai-chu-xiang&quot;&gt;2.1 排除项&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;假设&lt;/th&gt;&lt;th&gt;结论&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;import.meta.url.pathname&lt;/code&gt; 在 Linux 上算错 ROOT&lt;/td&gt;&lt;td&gt;可能改进，但无法解释仅 &lt;strong&gt;单个 kanban 文件&lt;/strong&gt; 失败&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/&lt;/code&gt; 存在目录级 symlink 循环&lt;/td&gt;&lt;td&gt;本地 &lt;code&gt;find -type l&lt;/code&gt; 无异常；问题在 &lt;strong&gt;单文件 mode&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;kanban 需加密导致读文件失败&lt;/td&gt;&lt;td&gt;kanban 未开 &lt;code&gt;[extra.encryption]&lt;/code&gt;；失败发生在 &lt;strong&gt;walk 阶段&lt;/strong&gt;，尚未读内容&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;2-2-guan-jian-ming-ling&quot;&gt;2.2 关键命令&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ls-files&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; content/kanban/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 120000 71584b78...  content/kanban/2026-06-16.md   ← symlink mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 100644 18e34c47...  content/kanban/2026-06-22.md   ← 正常文件&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;Git mode &lt;strong&gt;&lt;code&gt;120000&lt;/code&gt;&lt;/strong&gt; = symlink；blob 内本应只存 &lt;strong&gt;目标路径字符串&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;实际 blob 大小 &lt;strong&gt;2526 字节&lt;/strong&gt;，内容为 &lt;code&gt;+++&lt;/code&gt; 开头的完整周计划 Markdown&lt;/li&gt;
&lt;li&gt;Linux &lt;code&gt;git clone&lt;/code&gt; 按 symlink 检出 → 链接目标 = 整篇文档文本 → &lt;code&gt;statSync&lt;/code&gt; / &lt;code&gt;readlink&lt;/code&gt; 解析时触发 &lt;strong&gt;&lt;code&gt;ENAMETOOLONG&lt;/code&gt;&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-3-cheng-yin-tui-ce&quot;&gt;2.3 成因推测&lt;/h4&gt;
&lt;p&gt;某次提交或合并时，该文件被错误标记为 symlink（可能来自错误 &lt;code&gt;git add&lt;/code&gt;、工具导入或复制粘贴异常），而 blob 仍写入 Markdown 正文。macOS 工作区可能曾被手动覆盖为普通文件，故与 CI 表现不一致。&lt;/p&gt;
&lt;h4 id=&quot;2-4-fu-dai-wen-ti-xiu-fu-ci-quan-liu-cheng-shi-fa-xian&quot;&gt;2.4 附带问题（修复 CI 全流程时发现）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;问题&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build-site.sh&lt;/code&gt; 未导出 &lt;code&gt;ZOLA_OUTPUT_DIR&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;./build-site.sh --output-dir ../public_html&lt;/code&gt; 时，&lt;code&gt;patch-search-index.mjs&lt;/code&gt; / &lt;code&gt;verify-kanban-build.mjs&lt;/code&gt; 仍读 &lt;code&gt;public/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;workflow 验证路径错误&lt;/td&gt;&lt;td&gt;构建输出在 &lt;code&gt;../public_html&lt;/code&gt;，步骤却检查 &lt;code&gt;zola_source/public_html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-xiu-fu-nei-rong&quot;&gt;3. 修复内容&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;改动&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/2026-06-16.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;git rm --cached&lt;/code&gt; 后重新 &lt;code&gt;git add&lt;/code&gt;，索引 mode &lt;strong&gt;&lt;code&gt;100644&lt;/code&gt;&lt;/strong&gt;（普通文件）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/encrypt-content.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;walkMd&lt;/code&gt; 用 &lt;code&gt;readdirSync({ withFileTypes: true })&lt;/code&gt;，&lt;strong&gt;跳过 symlink&lt;/strong&gt;；&lt;code&gt;ROOT&lt;/code&gt; 改用 &lt;code&gt;fileURLToPath&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;build-site.sh&lt;/code&gt;&lt;/td&gt;&lt;td&gt;解析 &lt;code&gt;--output-dir&lt;/code&gt;，&lt;strong&gt;export &lt;code&gt;ZOLA_OUTPUT_DIR&lt;/code&gt;&lt;/strong&gt; 供后续 Node 脚本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/patch-search-index.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;读取 &lt;code&gt;ZOLA_OUTPUT_DIR&lt;/code&gt; 定位搜索索引；输出目录不存在时安全退出&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts/verify-kanban-build.mjs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;fileURLToPath&lt;/code&gt; 统一 ROOT&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;.github/workflows/deploy_pages.yml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;验证步骤改为 &lt;code&gt;[ -d &quot;../public_html&quot; ]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;加固后的 &lt;code&gt;walkMd&lt;/code&gt; 逻辑（即使将来再误入 symlink 也不会拖垮构建）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;javascript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;const&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; ent&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; of&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; readdirSync&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; withFileTypes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span&gt;ent&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;isSymbolicLink&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; continue&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  //&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ...&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-jie-jue-bu-zou&quot;&gt;4. 解决步骤&lt;/h3&gt;
&lt;p&gt;部署架构：&lt;strong&gt;Codeberg 私有源码&lt;/strong&gt; + &lt;strong&gt;GitHub.io 仅托管 workflow 与 gh-pages 静态页&lt;/strong&gt;。&lt;/p&gt;
&lt;h4 id=&quot;4-1-tui-song-codeberg-bi-xu&quot;&gt;4.1 推送 Codeberg（必须）&lt;/h4&gt;
&lt;p&gt;仓库：&lt;code&gt;codeberg.org/SuzhaharCan/SuzhaharCan.codeberg.page&lt;/code&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; content/kanban/2026-06-16.md&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        scripts/encrypt-content.mjs&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        scripts/patch-search-index.mjs&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        scripts/verify-kanban-build.mjs&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        build-site.sh&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fix: kanban week file git mode and CI build output paths&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; push&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; origin&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; main&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或当前默认分支&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;4-2-tong-bu-github-io-workflow-ruo-yu-codeberg-fu-ben-bu-yi-zhi&quot;&gt;4.2 同步 GitHub.io workflow（若与 Codeberg 副本不一致）&lt;/h4&gt;
&lt;p&gt;仓库：&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/SuchaharCan/SuchaharCan.github.io&quot;&gt;SuchaharCan/SuchaharCan.github.io&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;将 &lt;code&gt;deploy_pages.yml&lt;/code&gt; 中 &lt;strong&gt;Verify Kanban build output&lt;/strong&gt; 的路径修正同步到该仓库（&lt;code&gt;../public_html&lt;/code&gt;）。&lt;/p&gt;
&lt;h4 id=&quot;4-3-zhong-pao-liu-shui-xian&quot;&gt;4.3 重跑流水线&lt;/h4&gt;
&lt;p&gt;GitHub → &lt;strong&gt;Actions&lt;/strong&gt; → &lt;strong&gt;Build Zola and Deploy to GitHub Pages&lt;/strong&gt; → &lt;strong&gt;Run workflow&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;期望日志顺序：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;encryption: N page(s) → static/encryption/pages/&lt;/code&gt;（无 ENAMETOOLONG）&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build&lt;/code&gt; → &lt;code&gt;Done in …ms&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;kanban verify OK: 2 week(s), list cards match&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;✅ 验证通过：public_html … index.html&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Deploy push 至 &lt;code&gt;gh-pages&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;4-4-xian-shang-yan-shou&quot;&gt;4.4 线上验收&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;期望&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;2 张周卡片&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;200，非 404&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建日志&lt;/td&gt;&lt;td&gt;无 &lt;code&gt;encrypt-content.mjs&lt;/code&gt; 栈追踪&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;5-ben-di-yan-zheng&quot;&gt;5. 本地验证&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 模拟 CI 自定义输出目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ZOLA_OUTPUT_DIR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;u&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;b&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;_&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; ./build-site.sh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-output-dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; public_test&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 期望：kanban verify OK: 2 week(s), list cards match&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 确认 Git 索引 mode&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ls-files&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; content/kanban/2026-06-16.md&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 期望：100644 ...&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;6-jing-yan-xiao-jie&quot;&gt;6. 经验小结&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;ENAMETOOLONG&lt;/code&gt; + 路径看起来不长&lt;/strong&gt; → 优先查 &lt;strong&gt;symlink 目标&lt;/strong&gt; 与 &lt;strong&gt;&lt;code&gt;git ls-files -s&lt;/code&gt; mode&lt;/strong&gt;，不要只看路径字符串长度。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;跨平台构建&lt;/strong&gt; → 加密/遍历类脚本应 &lt;strong&gt;不跟随 symlink&lt;/strong&gt;，并用 &lt;code&gt;fileURLToPath&lt;/code&gt; 解析 ESM 路径。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;build-site.sh&lt;/code&gt; 包装多步&lt;/strong&gt; → &lt;code&gt;--output-dir&lt;/code&gt; 须 &lt;strong&gt;显式传播&lt;/strong&gt; 给所有读 &lt;code&gt;public/&lt;/code&gt; 的后置脚本。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CI 与本地目录布局不同&lt;/strong&gt; → workflow 验证路径要与 &lt;code&gt;zola build --output-dir&lt;/code&gt; &lt;strong&gt;同一基准&lt;/strong&gt;（本次为 &lt;code&gt;zola_source&lt;/code&gt; 的上一级 &lt;code&gt;public_html&lt;/code&gt;）。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;相关链接：&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/SuchaharCan/SuchaharCan.github.io/blob/master/.github/workflows/deploy_pages.yml&quot;&gt;deploy workflow&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/SuchaharCan/SuchaharCan.github.io/actions/runs/28070059084&quot;&gt;失败 Run #28&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;看板列表&lt;/a&gt; · &lt;a href=&quot;/nanolog/2026-06-24t14-00-00z/&quot;&gt;前一篇 Nanolog（看板 UI / 热力图）&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-24T04:00:00+00:00</published>
        <updated>2026-06-24T04:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-24t04-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-24t04-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-24t04-00-00z/">&lt;p&gt;2026年06月24日 12:00（东八区 / 北京时间）&lt;/p&gt;
&lt;h2 id=&quot;zhan-dian-geng-xin-zong-jie-umami-tong-ji-wen-zhang-jia-jie-mi-guan-li-yuan-te-quan-fang-ke-sui-ji-jie-mi-bian-ji-an-niu-men-kong&quot;&gt;站点更新总结：Umami 统计 · 文章加解密 · 管理员特权 · 访客随机解密 · 编辑按钮门控&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本轮迭代围绕 &lt;strong&gt;可观测性（Umami）&lt;/strong&gt;、&lt;strong&gt;内容保护（构建期加密 + 运行时解密）&lt;/strong&gt;、&lt;strong&gt;特权与访客双模式&lt;/strong&gt; 以及 &lt;strong&gt;编辑类按钮的可见性控制&lt;/strong&gt; 展开。所有改动均在站点根目录 &lt;code&gt;templates/&lt;/code&gt;、&lt;code&gt;static/&lt;/code&gt;、&lt;code&gt;scripts/&lt;/code&gt;、&lt;code&gt;zola.toml&lt;/code&gt; 完成，&lt;strong&gt;未修改 &lt;code&gt;themes/&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;构建入口统一为：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; encrypt-content.mjs → zola build → patch-search-index.mjs&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-umami-liu-liang-tong-ji&quot;&gt;1. Umami 流量统计&lt;/h3&gt;
&lt;h4 id=&quot;1-1-wen-ti-yu-gen-yin&quot;&gt;1.1 问题与根因&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;现象&lt;/th&gt;&lt;th&gt;原因&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;Umami 控制台长期无数据&lt;/td&gt;&lt;td&gt;&lt;code&gt;self_hosted_url&lt;/code&gt; 误填为博客域名，脚本指向不存在的 &lt;code&gt;/script.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;控制台 CSP 报错&lt;/td&gt;&lt;td&gt;&lt;code&gt;script-src&lt;/code&gt; / &lt;code&gt;connect-src&lt;/code&gt; 未放行 Umami Cloud&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;gateway.umami.is/api/send&lt;/code&gt; 被拦截&lt;/td&gt;&lt;td&gt;Umami 新版上报端点未加入 CSP&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;1-2-xiu-fu-yao-dian&quot;&gt;1.2 修复要点&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置 / 文件&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; &lt;code&gt;[extra.analytics]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;service = &quot;umami&quot;&lt;/code&gt;；&lt;strong&gt;留空&lt;/strong&gt; &lt;code&gt;self_hosted_url&lt;/code&gt;（走 Umami Cloud）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; &lt;code&gt;[extra.csp]&lt;/code&gt; &lt;code&gt;connect-src&lt;/code&gt;&lt;/td&gt;&lt;td&gt;新增 &lt;code&gt;gateway.umami.is&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/analytic/umami.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全站幂等加载器；&lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;scripts = [&quot;analytic/umami.js&quot;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/nanolog.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;合并重复副本，统一路径&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;主题 &lt;code&gt;build&lt;/code&gt; 模式仍会注入 &lt;code&gt;cloud.umami.is/script.js&lt;/code&gt;；站点层脚本作兜底，避免漏统计。&lt;/p&gt;
&lt;h4 id=&quot;1-3-yan-zheng&quot;&gt;1.3 验证&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Network：&lt;code&gt;cloud.umami.is/script.js&lt;/code&gt; → 200；&lt;code&gt;gateway.umami.is/api/send&lt;/code&gt; 无 CSP 拦截&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/analytics/eu/websites/cdf54193-b449-4454-884b-029e82434c32&quot;&gt;Umami 控制台&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;更细的调用链见同目录较早条目：&lt;code&gt;2026-06-23T12:00:00Z.md&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-wen-zhang-jia-jie-mi-di-ceng-tong-yong-neng-li&quot;&gt;2. 文章加解密（底层通用能力）&lt;/h3&gt;
&lt;h4 id=&quot;2-1-she-ji-yuan-ze&quot;&gt;2.1 设计原则&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;构建期加密&lt;/strong&gt;：正文不进 HTML 明文，降低「查看源代码」直接可读的风险&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;运行时解密&lt;/strong&gt;：依赖 Web Crypto（需 HTTPS 或 localhost）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;任意目录通用&lt;/strong&gt;：凡 front matter 声明加密即纳入流水线，与板块路径无关&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-2-qi-yong-fang-shi-dan-pian-wen-zhang&quot;&gt;2.2 启用方式（单篇文章）&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;encryption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;encrypt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;建议 &lt;code&gt;[extra]&lt;/code&gt; 写在 &lt;code&gt;[extra.encryption]&lt;/code&gt; &lt;strong&gt;之前&lt;/strong&gt;，避免 TOML 表顺序导致解析异常。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h4 id=&quot;2-3-wen-jian-jie-gou&quot;&gt;2.3 文件结构&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;路径&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;站点配置&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;[extra.encryption]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;构建脚本&lt;/td&gt;&lt;td&gt;&lt;code&gt;scripts/encrypt-content.mjs&lt;/code&gt;、&lt;code&gt;scripts/encryption-lib.mjs&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;密文输出&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/encryption/pages/&amp;lt;相对路径&amp;gt;.json&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;清单&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/encryption/manifest.json&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;全站注入&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/base.html&lt;/code&gt; → &lt;code&gt;partials/encryption_config.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;加密文章 UI&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/partials/encrypted_article.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章模板&lt;/td&gt;&lt;td&gt;&lt;code&gt;templates/article.html&lt;/code&gt;（判断 &lt;code&gt;encrypt&lt;/code&gt; 后 include）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;前端&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/encryption/config.js&lt;/code&gt;、&lt;code&gt;admin.js&lt;/code&gt;、&lt;code&gt;visitor.js&lt;/code&gt;、&lt;code&gt;crypto.js&lt;/code&gt;、&lt;code&gt;article.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;样式&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/encryption/admin.css&lt;/code&gt;、&lt;code&gt;article.css&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;2-4-gou-jian-yu-csp&quot;&gt;2.4 构建与 CSP&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;配置与密文通过 &lt;strong&gt;&lt;code&gt;&amp;lt;textarea hidden&amp;gt;&lt;/code&gt;&lt;/strong&gt; 注入页面，避免内联 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 触发 CSP 拦截&lt;/li&gt;
&lt;li&gt;&lt;code&gt;script-src&lt;/code&gt; 允许 &lt;code&gt;&#39;self&#39;&lt;/code&gt;、&lt;code&gt;cdn.jsdelivr.net&lt;/code&gt;（marked）、主题合并的 &lt;code&gt;cloud.umami.is&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;未跑加密脚本仅 &lt;code&gt;zola build&lt;/code&gt; 时，页面会提示「密文未找到，请先运行 &lt;code&gt;./build-site.sh&lt;/code&gt;」&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;2-5-ce-shi-wen-zhang&quot;&gt;2.5 测试文章&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;路径&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/00Read_blog_Math/2026-06-03-First Base Chater/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;数学板块加密试点&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/02Engineer_blog_Debug/2026-06-23-Chrome-ReOpen/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Debug 板块加密验证&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-guan-li-yuan-te-quan-mo-shi&quot;&gt;3. 管理员特权模式&lt;/h3&gt;
&lt;h4 id=&quot;3-1-jin-ru-fang-shi&quot;&gt;3.1 进入方式&lt;/h4&gt;
&lt;p&gt;连续点击左上角 &lt;strong&gt;&lt;code&gt;#site-sidebar-header&lt;/code&gt;&lt;/strong&gt;（站点图标）&lt;strong&gt;6 次&lt;/strong&gt;：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;点击次数&lt;/th&gt;&lt;th&gt;反馈&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;第 3–5 次&lt;/td&gt;&lt;td&gt;Toast：「再点击 N 次可进入管理员模式」&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;第 6 次&lt;/td&gt;&lt;td&gt;Toast：「你已经是管理员，可浏览所有加密博客啦」&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;已是管理员&lt;/td&gt;&lt;td&gt;鼠标悬停图标显示「你已经是管理员」&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;状态保存在 &lt;code&gt;sessionStorage&lt;/code&gt;（&lt;code&gt;blog-encryption-admin-until&lt;/code&gt;）。&lt;/p&gt;
&lt;h4 id=&quot;3-2-you-xiao-qi-admin-ttl-secs&quot;&gt;3.2 有效期（&lt;code&gt;admin_ttl_secs&lt;/code&gt;）&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;admin_ttl_secs&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 秒，到期自动恢复访客&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;进入特权时按 TTL 设置 &lt;strong&gt;精确 &lt;code&gt;setTimeout&lt;/code&gt;&lt;/strong&gt;，并每 500ms 兜底检查&lt;/li&gt;
&lt;li&gt;到期触发 &lt;code&gt;encryption-admin-expired&lt;/code&gt;：移除 &lt;code&gt;html.encryption-admin-active&lt;/code&gt;、文章重新上锁、看板恢复只读&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-3-guan-li-yuan-neng-li&quot;&gt;3.3 管理员能力&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;解密所有 &lt;code&gt;encrypt = true&lt;/code&gt; 的文章&lt;/li&gt;
&lt;li&gt;显示并可用 Nanolog / 看板上的 &lt;strong&gt;ReDeplog、Edit Post&lt;/strong&gt; 等编辑入口&lt;/li&gt;
&lt;li&gt;看板在 &lt;code&gt;week_start&lt;/code&gt;～&lt;code&gt;week_end&lt;/code&gt; 窗口内可解锁拖拽；截止日当日 &lt;strong&gt;23:00&lt;/strong&gt;（&lt;code&gt;extra.timezone&lt;/code&gt;）前仍可编辑&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-fang-ke-mo-shi-yu-sui-ji-jie-mi&quot;&gt;4. 访客模式与随机解密&lt;/h3&gt;
&lt;h4 id=&quot;4-1-mo-ren-zhan-shi&quot;&gt;4.1 默认展示&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;加密文显示：「🔒 本文已加密」&lt;/li&gt;
&lt;li&gt;提示语：「随机刷新时，可能会触发解密哦。」&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-2-sui-ji-jie-mi-luo-ji-static-encryption-visitor-js&quot;&gt;4.2 随机解密逻辑（&lt;code&gt;static/encryption/visitor.js&lt;/code&gt;）&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;visitor_refresh_min&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;visitor_refresh_max&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;每篇文章、每个浏览器 &lt;strong&gt;session&lt;/strong&gt; 独立计数&lt;/li&gt;
&lt;li&gt;首次访问随机抽取阈值（9～20 次刷新之间）&lt;/li&gt;
&lt;li&gt;刷新次数达到阈值后 &lt;strong&gt;自动解密&lt;/strong&gt;（无需管理员）&lt;/li&gt;
&lt;li&gt;解密状态在该 session 内对该文保持&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;5-bian-ji-lei-an-niu-men-kong-jiao-hu-yin-cang&quot;&gt;5. 编辑类按钮门控（交互隐藏）&lt;/h3&gt;
&lt;p&gt;原则：&lt;strong&gt;访客只见只读；编辑入口仅在管理员特权下出现。&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;位置&lt;/th&gt;&lt;th&gt;访客&lt;/th&gt;&lt;th&gt;管理员&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Nanolog 列表&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;隐藏 ReDeplog、Edit Post、发布按钮&lt;/td&gt;&lt;td&gt;显示&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;看板明细&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;锁定按钮固定「🔒 只读」，不可解锁&lt;/td&gt;&lt;td&gt;有效期内可解锁；显示工具栏；截止日 23:00 后变「只读（已过期）」&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;加密文侧边栏 TOC&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;非管理员隐藏&lt;/td&gt;&lt;td&gt;管理员显示&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;实现：元素加 class &lt;code&gt;encryption-admin-only&lt;/code&gt;；&lt;code&gt;html.encryption-admin-active&lt;/code&gt; 时由 &lt;code&gt;admin.css&lt;/code&gt; 显示。看板逻辑在 &lt;code&gt;kanban-board.js&lt;/code&gt; 中额外校验 &lt;code&gt;EncryptionAdmin.isAdminActive()&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;6-guan-lian-gai-dong-ben-lun-yi-bing-shou-lian&quot;&gt;6. 关联改动（本轮一并收敛）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;看板数据源&lt;/td&gt;&lt;td&gt;统一为 &lt;code&gt;content/kanban/&lt;/code&gt;，构建时内嵌 MD，移除多余 &lt;code&gt;kanban/&lt;/code&gt; 副本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nanolog 列表宽度&lt;/td&gt;&lt;td&gt;&lt;code&gt;sass/nanolog/style.scss&lt;/code&gt; 调至与正文同宽&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;nanolog.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;移除不存在的 &lt;code&gt;save-token-btn&lt;/code&gt; 控制台警告&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;7-pei-zhi-su-cha-zola-toml&quot;&gt;7. 配置速查（&lt;code&gt;zola.toml&lt;/code&gt;）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytic/umami.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytics&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;service&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;umami&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cdf54193-b449-4454-884b-029e82434c32&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exclude_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;encryption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;enabled&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;algorithm&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;AES-GCM&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;key&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;rocky-blog-dev-key-change-in-production&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 生产环境请更换&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;admin_ttl_secs&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 60&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;visitor_refresh_min&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;visitor_refresh_max&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 20&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;CSP &lt;code&gt;connect-src&lt;/code&gt; 需包含：&lt;code&gt;gateway.umami.is&lt;/code&gt;（以及主题自动合并的 &lt;code&gt;cloud.umami.is&lt;/code&gt;、&lt;code&gt;*.umami.dev&lt;/code&gt;）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;8-zi-ce-qing-dan&quot;&gt;8. 自测清单&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
&lt;code&gt;./build-site.sh&lt;/code&gt; 无报错，控制台输出 &lt;code&gt;encryption: N page(s)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
加密文：访客默认上锁；连点 6 次进入管理员可解密；TTL 到期后恢复上锁&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
加密文：无痕窗口反复刷新，约 9～20 次后访客随机解密&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Nanolog / 看板：访客无 Edit Post、ReDeplog；管理员可见&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
看板：截止日 23:00 前可解锁，之后只读；列表剩余天数与明细一致&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Chrome DevTools 无 CSP inline script 报错；Umami 上报 200&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;9-kan-ban-lie-biao-re-li-tu-bian-ji-chuang-kou-pan-ding-zhui-jia&quot;&gt;9. 看板列表 / 热力图 · 编辑窗口判定（追加）&lt;/h3&gt;
&lt;h4 id=&quot;9-1-lie-biao-ye-yu-re-li-tu&quot;&gt;9.1 列表页与热力图&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;项&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;页头&lt;/td&gt;&lt;td&gt;移除大标题「周计划」；副标题居中加粗；补充「单个看板时间跨度 1 ~ 14 天」&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;年份 / 月份下拉&lt;/td&gt;&lt;td&gt;修复脚本重复加载导致菜单无法展开；月份含全年 + 1–12 月&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;年度视图&lt;/td&gt;&lt;td&gt;1–6 月 / 7–12 月两行；月份块间距 + 虚线分隔&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周格填充&lt;/td&gt;&lt;td&gt;有效天数 / 7 比例自下而上着色；未满 7 天为部分填充&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;月份视图&lt;/td&gt;&lt;td&gt;切换具体月份后展开为&lt;strong&gt;按天&lt;/strong&gt;网格，直观显示哪些日期纳入看板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;验证数据&lt;/td&gt;&lt;td&gt;&lt;code&gt;content/kanban/2026-06-22.md&lt;/code&gt;（06-22 ~ 06-23，2 天）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;涉及文件：&lt;code&gt;templates/kanban_list.html&lt;/code&gt;、&lt;code&gt;static/js/kanban-heatmap.js&lt;/code&gt;、&lt;code&gt;static/css/heatmap.css&lt;/code&gt;、&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;。&lt;/p&gt;
&lt;h4 id=&quot;9-2-zhi-du-ke-bian-ji-pan-ding-jie-zhi-ri-23-00&quot;&gt;9.2 只读 / 可编辑判定（截止日 23:00）&lt;/h4&gt;
&lt;p&gt;原先按&lt;strong&gt;日历日&lt;/strong&gt;比较 &lt;code&gt;week_end&lt;/code&gt;，导致截止日当天 0 点起即只读。现改为：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;截止日 &lt;code&gt;week_end&lt;/code&gt; 当日 &lt;strong&gt;23:00 之前&lt;/strong&gt;仍可解锁、拖拽、Edit Post&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;23:00 及之后&lt;/strong&gt;（站点时区）永久只读&lt;/li&gt;
&lt;li&gt;时区读取 &lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;[extra] timezone&lt;/code&gt;（当前 &lt;code&gt;Asia/Shanghai&lt;/code&gt;），经模板 &lt;code&gt;data-timezone&lt;/code&gt; 注入前端&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;例：截止 &lt;strong&gt;06-23&lt;/strong&gt;，则 6 月 23 日 22:59 仍可编辑，23:00 起变只读。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;位置&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;明细页锁定按钮&lt;/td&gt;&lt;td&gt;访客：&lt;code&gt;🔒 只读&lt;/code&gt;；超期：&lt;code&gt;只读（已过期）&lt;/code&gt;；管理员且未超期：可锁定 / 解锁&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表剩余天数&lt;/td&gt;&lt;td&gt;截止日 23:00 前显示「今天」；当日 23:00 后显示「已截止」&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;公共逻辑：&lt;code&gt;KanbanRules.isEditableWindow()&lt;/code&gt;、&lt;code&gt;daysRemainingLabel()&lt;/code&gt;（&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;）；看板页 &lt;code&gt;data-timezone&lt;/code&gt; 在 &lt;code&gt;templates/kanban.html&lt;/code&gt;，列表页在 &lt;code&gt;#kanban-week-list&lt;/code&gt;。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; zola.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;timezone&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Asia/Shanghai&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;参考： &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one&quot;&gt;daudix.one&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/analytics/eu/websites/cdf54193-b449-4454-884b-029e82434c32&quot;&gt;Umami 控制台&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>网站版本 1.0 正式版</title>
        <published>2026-06-24T00:00:00+00:00</published>
        <updated>2026-06-24T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/website-v1-release/"/>
        <id>https://suchaharcan.github.io/03Share_blog/website-v1-release/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/website-v1-release/">&lt;p&gt;本文面向 &lt;strong&gt;访客与自建站参考者&lt;/strong&gt;，说明本站 &lt;strong&gt;v1.0 正式版&lt;/strong&gt; 的目录结构、设计架构，以及撰写博客时在 &lt;code&gt;+++&lt;/code&gt;（TOML front matter）中可用的全部字段。技术栈为 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.getzola.org/&quot;&gt;Zola&lt;/a&gt; + &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://ametrine.daudix.one&quot;&gt;Ametrine&lt;/a&gt; 主题；站点级定制在仓库根目录，&lt;strong&gt;不修改 &lt;code&gt;themes/&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;更细的模板 / Markdown 写法见 &lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/&quot;&gt;Zola 模板开发要点与 Markdown 语法速查&lt;/a&gt;；本轮功能迭代见 &lt;a href=&quot;https://suchaharcan.github.io/nanolog/2026-06-24t04-00-00z/&quot;&gt;Nanolog 更新总结&lt;/a&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;yi-ban-ben-1-0-neng-li-zong-lan&quot;&gt;一、版本 1.0 能力总览&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;模块&lt;/th&gt;&lt;th&gt;路径 / 入口&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;首页 Hub&lt;/td&gt;&lt;td&gt;&lt;code&gt;/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;个人介绍、徽章、联系方式&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;In - Reading&lt;/td&gt;&lt;td&gt;&lt;code&gt;/00Read_blog_Math/&lt;/code&gt; 等&lt;/td&gt;&lt;td&gt;在读笔记（可加密）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Out - Writing&lt;/td&gt;&lt;td&gt;&lt;code&gt;/01Write_blog_CXX20/&lt;/code&gt; 等&lt;/td&gt;&lt;td&gt;原创技术文&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Out - Share&lt;/td&gt;&lt;td&gt;&lt;code&gt;/03Share_blog/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;工作流、工具分享&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Debug&lt;/td&gt;&lt;td&gt;&lt;code&gt;/02Engineer_blog_Debug/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;排障记录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周计划看板&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Trello 风格 + Markdown 规则引擎&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Design&lt;/td&gt;&lt;td&gt;&lt;code&gt;/design/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;产品 / CLI / 插件展示&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nanolog&lt;/td&gt;&lt;td&gt;&lt;code&gt;/nanolog/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站点开发短日志&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;BasB&lt;/td&gt;&lt;td&gt;&lt;code&gt;/basb/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;笔记树状整理&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Archive&lt;/td&gt;&lt;td&gt;&lt;code&gt;/archive/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全站文章归档 + 热力图&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Umami 统计&lt;/td&gt;&lt;td&gt;全站&lt;/td&gt;&lt;td&gt;隐私友好访问量&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;文章加密&lt;/td&gt;&lt;td&gt;按文启用&lt;/td&gt;&lt;td&gt;构建期 AES-GCM + 管理员 / 访客双模式解密&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;构建命令：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;./build-site.sh&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 加密 → zola build → 搜索索引补丁&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; serve&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;         #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 本地预览（加密解密需 localhost 或 HTTPS）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;er-yuan-ma-mu-lu-shu&quot;&gt;二、源码目录树&lt;/h2&gt;
&lt;p&gt;以下为 &lt;strong&gt;访客可见逻辑相关的仓库结构&lt;/strong&gt;（省略 &lt;code&gt;public/&lt;/code&gt; 构建产物与主题内 demo 细节）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;00BlogZola/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── zola.toml                 # 全站配置（导航、CSP、统计、加密、分类…）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── build-site.sh             # 正式构建入口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── scripts/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── encrypt-content.mjs   # 构建前：加密标记文章 → static/encryption/pages/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── encryption-lib.mjs    # 加密路径 / front matter 解析共用库&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── patch-search-index.mjs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── content/                  # 所有页面内容（Markdown）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── _index.md             # 首页&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── 00Read_blog_Math/     # 在读 · 数学&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── 00Read_blog_English/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── 01Write_blog_*/       # 写作各子专栏（CMake / CXX / 论文…）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── 02Engineer_blog_Debug/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── 03Share_blog/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kanban/               # 周计划（列表 + 每周 .md）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── nanolog/              # 开发日志（单文件即一篇）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── design/               # Design 页 + apps/* 子应用&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── basb/                 # 树状笔记&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── archive/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── templates/                # 覆盖主题的 Tera 模板（优先级高于 theme）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── base.html             # 全站：加密配置 + admin.js 注入&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── article.html          # 文章：普通 / 加密分支&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── partials/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── encrypted_article.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   ├── encryption_config.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   │   └── heatmap_component.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kanban.html / kanban_list.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── nanolog.html / nanolog_list.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── design.html / design_app.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── archive.html / basb.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── shortcodes/           # Markdown 短代码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── macros/encryption.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── static/                   # 原样拷贝到站点根 URL&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── analytic/umami.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── encryption/           # 加解密运行时（admin / visitor / crypto / article）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── js/                   # kanban、nanolog、热力图、滚动条…&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── kanban/ …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── sass/                     # 站点 SCSS（编译为 CSS）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kanban/ nanolog/ design/ home/ …&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── themes/ametrine/          # 上游主题（勿改；用 templates/ 扩展）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;模板覆盖原则：&lt;/strong&gt; &lt;code&gt;templates/foo.html&lt;/code&gt; 与主题同名时 &lt;strong&gt;完全替换&lt;/strong&gt; 主题文件；常用模式为 &lt;code&gt;{%% extends &quot;ametrine/templates/....html&quot; %%}&lt;/code&gt; + &lt;code&gt;{%% block %%}&lt;/code&gt; 扩展。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;san-she-ji-jia-gou&quot;&gt;三、设计架构&lt;/h2&gt;
&lt;h3 id=&quot;3-1-fen-ceng-shi-yi&quot;&gt;3.1 分层示意&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;flowchart&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; TB&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  subgraph&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; build &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;构建期&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    MD&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;content/*.md&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ENC&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;scripts/encrypt&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;content.mjs&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ZOLA&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;zola build&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    MD &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ENC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ENC &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;|&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;密文 JSON&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; STATIC_ENC&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;static/encryption/pages/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    MD &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ZOLA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    STATIC_ENC &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ZOLA&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ZOLA &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; PUBLIC&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;public/ 静态站点&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  subgraph&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; runtime &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;浏览器运行时&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    PUBLIC &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; HTML&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;HTML + textarea 配置&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ADMIN&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;admin.js 特权模式&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; VISITOR&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;visitor.js 随机解密&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ARTICLE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article.js 解密渲染&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ADMIN &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ARTICLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    VISITOR &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; ARTICLE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; UMAMI&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;umami.js 统计&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; KANBAN&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kanban&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;board.js&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; NANO&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nanolog.js&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  subgraph&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; theme &lt;/span&gt;&lt;span&gt;[&lt;/span&gt;&lt;span&gt;Ametrine &lt;/span&gt;&lt;span&gt;主题层&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    BASE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;base.html 骨架&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    SIDE&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;sidebar 导航&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HEAD&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;head.html CSP/脚本&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  end&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  HTML &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; BASE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  BASE &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; SIDE&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  BASE &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;--&amp;gt;&lt;/span&gt;&lt;span&gt; HEAD&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;3-2-nei-rong-mo-ban-bang-ding&quot;&gt;3.2 内容 → 模板绑定&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;内容类型&lt;/th&gt;&lt;th&gt;front matter 关键字段&lt;/th&gt;&lt;th&gt;渲染模板&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;专栏列表&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;article_list.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文章卡片列表&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;普通文章&lt;/td&gt;&lt;td&gt;&lt;code&gt;page_template = &quot;article.html&quot;&lt;/code&gt;（section 默认）&lt;/td&gt;&lt;td&gt;文章页 + 可选热力图&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;加密文章&lt;/td&gt;&lt;td&gt;&lt;code&gt;[extra.encryption] encrypt = true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;partials/encrypted_article.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周计划列表&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;kanban_list.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;周卡片 + 进度&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周计划明细&lt;/td&gt;&lt;td&gt;&lt;code&gt;page_template = &quot;kanban.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;五列看板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nanolog 列表&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;nanolog_list.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;时间线短帖&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Nanolog 单篇&lt;/td&gt;&lt;td&gt;&lt;code&gt;page_template = &quot;nanolog.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;单条日志&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Design&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;design.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;产品网格&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Archive&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;archive.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;归档 + 热力图&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;BasB&lt;/td&gt;&lt;td&gt;&lt;code&gt;template = &quot;basb.html&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;树状笔记索引&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;3-3-an-quan-yu-te-quan-mo-xing&quot;&gt;3.3 安全与特权模型&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;mermaid&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;stateDiagram-v2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;  [*]&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 默认&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Admin&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 连点左上角图标 6 次&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Admin&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; admin_ttl_secs 到期&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; LuckyDecrypt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 同文刷新 9~20 次 session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  LuckyDecrypt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Visitor&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 关闭标签页 / 新 session&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  Admin&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Decrypted&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 全部加密文可读&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  LuckyDecrypt&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; --&amp;gt;&lt;/span&gt;&lt;span&gt; Decrypted&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 单篇可读&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;访客：&lt;/strong&gt; 加密文默认上锁；看板固定「只读（已过期）」样式；隐藏 Edit Post / ReDeplog。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;管理员：&lt;/strong&gt; &lt;code&gt;html.encryption-admin-active&lt;/code&gt; 时显示编辑按钮、可解密、看板在有效期内可解锁。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;配置：&lt;/strong&gt; &lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;[extra.encryption]&lt;/code&gt;（见下文站点级表）。&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;si-front-matter-zi-duan-su-cha&quot;&gt;四、Front matter（&lt;code&gt;+++&lt;/code&gt;）字段速查&lt;/h2&gt;
&lt;p&gt;Zola 使用 &lt;strong&gt;TOML&lt;/strong&gt; 作为 front matter。以下汇总 &lt;strong&gt;本站实际可用&lt;/strong&gt; 的字段；未列出的键也可写入 &lt;code&gt;[extra]&lt;/code&gt;，但需自行在模板中读取才会生效。&lt;/p&gt;
&lt;h3 id=&quot;4-1-ding-ceng-tong-yong-zi-duan-page-section-jun-ke&quot;&gt;4.1 顶层通用字段（Page / Section 均可）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;必填&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;推荐&lt;/td&gt;&lt;td&gt;标题；侧边栏、&lt;code&gt;&amp;lt;title&amp;gt;&lt;/code&gt;、列表卡片&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;推荐&lt;/td&gt;&lt;td&gt;摘要；SEO、&lt;code&gt;og:description&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;date&lt;/code&gt;&lt;/td&gt;&lt;td&gt;date&lt;/td&gt;&lt;td&gt;文章推荐&lt;/td&gt;&lt;td&gt;发布日期，如 &lt;code&gt;2026-06-24&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;updated&lt;/code&gt;&lt;/td&gt;&lt;td&gt;date&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;更新日期，显示在文章元信息&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; 时默认不构建；需 &lt;code&gt;zola build --drafts&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;weight&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;排序权重（配合 &lt;code&gt;sort_by = &quot;weight&quot;&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;sort_by&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Section&lt;/td&gt;&lt;td&gt;子页排序：&lt;code&gt;date&lt;/code&gt; / &lt;code&gt;weight&lt;/code&gt; / &lt;code&gt;title&lt;/code&gt; 等&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;template&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Section&lt;/td&gt;&lt;td&gt;&lt;strong&gt;当前页&lt;/strong&gt;使用的模板文件名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;page_template&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;Section&lt;/td&gt;&lt;td&gt;&lt;strong&gt;子页面&lt;/strong&gt;默认模板&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;paginate_by&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;Section&lt;/td&gt;&lt;td&gt;列表分页条数，如 &lt;code&gt;10&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;generate_feeds&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;Section&lt;/td&gt;&lt;td&gt;是否生成 atom/rss&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;aliases&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;URL 别名，如 &lt;code&gt;[&quot;home&quot;]&lt;/code&gt;、&lt;code&gt;[&quot;Dev_log&quot;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;authors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;多作者（主题支持时显示）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;transparent&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;可选&lt;/td&gt;&lt;td&gt;用于 Archive / BasB 等透明背景布局&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;Section &lt;code&gt;_index.md&lt;/code&gt; 示例：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;效率-工作流&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sort_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article_list.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;page_template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;article.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;paginate_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;generate_feeds&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;no_header&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytic/umami.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-2-taxonomies-fen-lei-fa&quot;&gt;4.2 &lt;code&gt;[taxonomies]&lt;/code&gt; 分类法&lt;/h3&gt;
&lt;p&gt;本站 &lt;code&gt;zola.toml&lt;/code&gt; 启用：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; feed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; paginate_by&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;  {&lt;/span&gt;&lt;span&gt; name&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; feed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;自由标签，如 &lt;code&gt;[&quot;Zola&quot;, &quot;CXX&quot;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;categories&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;分类；&lt;strong&gt;枚举值&lt;/strong&gt;见下表&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;categories&lt;/code&gt; 可选枚举（&lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;[[extra.categories]]&lt;/code&gt;）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;值&lt;/th&gt;&lt;th&gt;含义&lt;/th&gt;&lt;th&gt;主题色&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Archived&lt;/code&gt;&lt;/td&gt;&lt;td&gt;归档文&lt;/td&gt;&lt;td&gt;purple&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Featured&lt;/code&gt;&lt;/td&gt;&lt;td&gt;精选&lt;/td&gt;&lt;td&gt;yellow&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;Hot&lt;/code&gt;&lt;/td&gt;&lt;td&gt;热门&lt;/td&gt;&lt;td&gt;red&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-3-extra-ye-mian-zhuan-lan-kuo-zhan-ametrine-ben-zhan&quot;&gt;4.3 &lt;code&gt;[extra]&lt;/code&gt; — 页面 / 专栏扩展（Ametrine + 本站）&lt;/h3&gt;
&lt;p&gt;继承规则：&lt;strong&gt;页面 &lt;code&gt;page.extra.*&lt;/code&gt; 优先，否则回退 &lt;code&gt;section.extra.*&lt;/code&gt;，再回退 &lt;code&gt;config.extra.*&lt;/code&gt;。&lt;/strong&gt;&lt;/p&gt;
&lt;h4 id=&quot;bu-ju-yu-zhan-shi&quot;&gt;布局与展示&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;枚举 / 格式&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;no_header&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;不渲染正文顶部 &lt;code&gt;&amp;lt;h1&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;backlinks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文末显示反向链接（需全局 &lt;code&gt;show_backlinks&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;toc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;&lt;/td&gt;&lt;td&gt;侧栏目录（实际由文内标题 + Zola &lt;code&gt;page.toc&lt;/code&gt; 生成）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent_color&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string 或 [string, string]&lt;/td&gt;&lt;td&gt;见下方 &lt;strong&gt;强调色枚举&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;页面主题色 / &lt;code&gt;theme-color&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;accent_color_dark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;HSL 或预设名&lt;/td&gt;&lt;td&gt;仅深色模式强调色（可选）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;banner&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;文件名&lt;/td&gt;&lt;td&gt;与 &lt;code&gt;index.md&lt;/code&gt; 同目录的横幅图&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;banner_position&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;CSS 值，如 &lt;code&gt;center top&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表缩略图裁剪位置&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;banner_pixels&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt;&lt;/td&gt;&lt;td&gt;横幅像素风渲染&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;accent_color&lt;/code&gt; 枚举与格式（主题文档）：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;写法&lt;/th&gt;&lt;th&gt;示例&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;预设名（双色同用）&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;blue&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;浅色/深色各用主题预设&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;预设数组&lt;/td&gt;&lt;td&gt;&lt;code&gt;[&quot;red&quot;, &quot;blue&quot;]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;浅色 red、深色 blue&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单色 HSL&lt;/td&gt;&lt;td&gt;&lt;code&gt;&quot;hsl(270 50% 60%)&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;两模式同色&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;HSL 数组&lt;/td&gt;&lt;td&gt;&lt;code&gt;[&quot;hsl(26 25% 34%)&quot;, &quot;hsl(27 31% 53%)&quot;]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;浅色 / 深色各一&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;预设名可选：&lt;code&gt;red&lt;/code&gt; · &lt;code&gt;orange&lt;/code&gt; · &lt;code&gt;yellow&lt;/code&gt; · &lt;code&gt;green&lt;/code&gt; · &lt;code&gt;blue&lt;/code&gt; · &lt;code&gt;purple&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;yuan-shu-ju-yu-she-jiao-qia-pian-extra-meta&quot;&gt;元数据与社交卡片 &lt;code&gt;[extra.meta]&lt;/code&gt;&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;meta.card&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;自定义 OG 卡片图（相对页面路径）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;meta.favicon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;页级 favicon&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;meta.apple_touch_icon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string / bool&lt;/td&gt;&lt;td&gt;页级 Apple 图标&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;sheng-ming-kuai-wen-zhang-ding-bu-ti-shi&quot;&gt;声明块（文章顶部提示）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;archive&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string (markdown)&lt;/td&gt;&lt;td&gt;归档说明条&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;trigger&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string (markdown)&lt;/td&gt;&lt;td&gt;内容预警条&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;disclaimer&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string (markdown)&lt;/td&gt;&lt;td&gt;免责声明条&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;zi-yuan-jia-zai&quot;&gt;资源加载&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;格式&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;styles&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;相对 &lt;code&gt;static/&lt;/code&gt; 或 sass 输出&lt;/td&gt;&lt;td&gt;额外 CSS，如 &lt;code&gt;[&quot;kanban/style.css&quot;]&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;scripts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;[string]&lt;/td&gt;&lt;td&gt;相对 &lt;code&gt;static/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;额外 JS；页面级覆盖 section&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;常用 &lt;code&gt;scripts&lt;/code&gt; 值：&lt;/strong&gt;&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;值&lt;/th&gt;&lt;th&gt;用途&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;analytic/umami.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Umami 统计&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;js/nanolog.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Nanolog 发布 / 编辑&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板规则引擎&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板明细交互&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;js/kanban-list.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板列表&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;js/design-apps.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Design 应用网格&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;encryption/*.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;由 &lt;code&gt;base.html&lt;/code&gt; 全站注入，一般无需手写&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;gong-neng-kai-guan&quot;&gt;功能开关&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;copy_button&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;代码块复制按钮（可覆盖全站 &lt;code&gt;copy_button&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;audio_button&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;文章朗读按钮&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;fediverse-ping-lun-extra-fediverse&quot;&gt;Fediverse 评论 &lt;code&gt;[extra.fediverse]&lt;/code&gt;&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;host&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;实例域名，如 &lt;code&gt;vmst.io&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;user&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;用户名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;帖子 ID；&lt;strong&gt;三者齐全时&lt;/strong&gt;加载评论线程&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;ce-lan-mei-ti-extra-music-extra-weather&quot;&gt;侧栏媒体 &lt;code&gt;[extra.music]&lt;/code&gt; / &lt;code&gt;[extra.weather]&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;music&lt;/strong&gt; — 数组，每项：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;键&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;枚举 / 说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;type&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;album&lt;/code&gt; · &lt;code&gt;track&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;mbid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;MusicBrainz ID（可选）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;artist&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;艺术家名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;曲名 / 专辑名&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;weather&lt;/strong&gt; — 表：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;键&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;枚举 / 说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;condition&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;描述文字&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;style&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;cloudy&lt;/code&gt; · &lt;code&gt;showers&lt;/code&gt; · &lt;code&gt;snowing&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;icon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://phosphoricons.com&quot;&gt;Phosphor&lt;/a&gt; 图标名&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;temp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;温度数值&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;unit&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;&lt;code&gt;C&lt;/code&gt;（默认）或 &lt;code&gt;F&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-4-extra-encryption-ben-zhan-jia-mi-dan-pian-wen-zhang&quot;&gt;4.4 &lt;code&gt;[extra.encryption]&lt;/code&gt; — 本站加密（单篇文章）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;encrypt&lt;/code&gt;&lt;/td&gt;&lt;td&gt;bool&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; 时构建期加密正文&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;站点级开关与密钥在 &lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;[extra.encryption]&lt;/code&gt;，&lt;strong&gt;不要&lt;/strong&gt;写在单篇文章里。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-5-kan-ban-zhuan-yong-extra-content-kanban-md&quot;&gt;4.5 看板专用 &lt;code&gt;[extra]&lt;/code&gt;（&lt;code&gt;content/kanban/*.md&lt;/code&gt;）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;week_start&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;周一开始 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;week_end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;周日结束 &lt;code&gt;YYYY-MM-DD&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;core_tasks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;string&lt;/td&gt;&lt;td&gt;列表页 / 明细页核心任务一行摘要&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;importance&lt;/code&gt;&lt;/td&gt;&lt;td&gt;int&lt;/td&gt;&lt;td&gt;1–5 重要等级（列表五星）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;stats&lt;/code&gt;&lt;/td&gt;&lt;td&gt;table&lt;/td&gt;&lt;td&gt;&lt;code&gt;{ total, done, todo, doing, progress_pct }&lt;/code&gt; 预计算进度&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-6-design-ye-zhuan-yong-extra-content-design-index-md&quot;&gt;4.6 Design 页专用 &lt;code&gt;[extra]&lt;/code&gt;（&lt;code&gt;content/design/index.md&lt;/code&gt;）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;cli&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array of tables&lt;/td&gt;&lt;td&gt;&lt;code&gt;{ name, icon, repo, summary }&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;plugins&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array of tables&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;apps&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array of tables&lt;/td&gt;&lt;td&gt;&lt;code&gt;{ name, slug, icon, summary, description }&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;子应用页：&lt;code&gt;content/design/apps/&amp;lt;slug&amp;gt;/index.md&lt;/code&gt; 使用 &lt;code&gt;template = &quot;design_app.html&quot;&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-7-shou-ye-zhuan-yong-extra-content-index-md&quot;&gt;4.7 首页专用 &lt;code&gt;[extra]&lt;/code&gt;（&lt;code&gt;content/_index.md&lt;/code&gt;）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;类型&lt;/th&gt;&lt;th&gt;子键&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;graphics&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;text&lt;/code&gt;, &lt;code&gt;url?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;顶部图形徽章&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;badges&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;url?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;88×31 风格徽章 GIF&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;contacts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;url&lt;/code&gt;, &lt;code&gt;favorite?&lt;/code&gt;&lt;/td&gt;&lt;td&gt;联系方式&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;socials&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;td&gt;社交网络&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;forges&lt;/code&gt;&lt;/td&gt;&lt;td&gt;array&lt;/td&gt;&lt;td&gt;同上&lt;/td&gt;&lt;td&gt;代码托管 / 部署链接&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-8-nanolog-dan-pian&quot;&gt;4.8 Nanolog 单篇&lt;/h3&gt;
&lt;p&gt;可为空 front matter：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;正文直接写 Markdown；日期由 &lt;strong&gt;文件名&lt;/strong&gt; &lt;code&gt;YYYY-MM-DDTHH:MM:SSZ.md&lt;/code&gt; 决定。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;4-9-wan-zheng-wen-zhang-shi-li-han-chang-yong-zi-duan&quot;&gt;4.9 完整文章示例（含常用字段）&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;文章标题&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;摘要，用于 SEO 与列表&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;updated&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-24&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;taxonomies&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;tags&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Zola&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;CXX&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;categories&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Featured&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;accent_color&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(254 44% 55%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;hsl(290 20% 71%)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;banner&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cover.webp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;no_header&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;copy_button&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;encryption&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;encrypt&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;fediverse&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;host&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;vmst.io&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;user&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;username&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;113295812044964246&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;wu-zola-toml-zhan-dian-ji-pei-zhi-fei-dan-pian-front-matter&quot;&gt;五、&lt;code&gt;zola.toml&lt;/code&gt; 站点级配置（非单篇 front matter）&lt;/h2&gt;
&lt;p&gt;访客了解全站行为时可查阅：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;段&lt;/th&gt;&lt;th&gt;关键字段&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra.analytics]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;service&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;goatcounter&lt;/code&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;code&gt;umami&lt;/code&gt;&lt;/strong&gt; · &lt;strong&gt;&lt;code&gt;plausible&lt;/code&gt;&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;各平台追踪 ID&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;self_hosted_url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;自托管根 URL；&lt;strong&gt;Umami Cloud 留空&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;exclude_hash&lt;/code&gt; / &lt;code&gt;exclude_search&lt;/code&gt; / &lt;code&gt;do_not_track&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Umami 选项&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra.encryption]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;enabled&lt;/code&gt;, &lt;code&gt;key&lt;/code&gt;, &lt;code&gt;algorithm&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全站加密开关（&lt;code&gt;AES-GCM&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;admin_ttl_secs&lt;/code&gt;&lt;/td&gt;&lt;td&gt;管理员特权秒数&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;visitor_refresh_min&lt;/code&gt; / &lt;code&gt;max&lt;/code&gt;&lt;/td&gt;&lt;td&gt;访客随机解密刷新次数区间&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra.csp]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;directive&lt;/code&gt; + &lt;code&gt;domains&lt;/code&gt;&lt;/td&gt;&lt;td&gt;CSP 白名单扩展&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra.nav]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;links&lt;/code&gt;&lt;/td&gt;&lt;td&gt;侧栏导航树&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra.categories]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;name&lt;/code&gt;, &lt;code&gt;color&lt;/code&gt;, &lt;code&gt;icon&lt;/code&gt;&lt;/td&gt;&lt;td&gt;分类元数据&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;[extra]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;scripts&lt;/code&gt;, &lt;code&gt;source_url&lt;/code&gt;, &lt;code&gt;replog_url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全站脚本与编辑链接&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;liu-markdown-yu-shortcode-zheng-wen-nei&quot;&gt;六、Markdown 与 Shortcode（正文内）&lt;/h2&gt;
&lt;p&gt;正文除标准 Markdown 外，常用扩展包括：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;能力&lt;/th&gt;&lt;th&gt;写法&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;站内链接&lt;/td&gt;&lt;td&gt;&lt;code&gt;[文字](@/03Share_blog/xxx/index.md)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;GitHub Alerts&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt; / &lt;code&gt;WARNING&lt;/code&gt; / &lt;code&gt;TIP&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;图片 URL 样式&lt;/td&gt;&lt;td&gt;&lt;code&gt;![](pic.png#transparent#pixels#no-hover)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Shortcode&lt;/td&gt;&lt;td&gt;&lt;code&gt;{%% youtube(id=&quot;…&quot;) %%}&lt;/code&gt;、&lt;code&gt;{%% crt() %%}…{%% end %%}&lt;/code&gt; 等&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;本站 &lt;code&gt;templates/shortcodes/&lt;/code&gt; 额外提供：&lt;code&gt;badges&lt;/code&gt; · &lt;code&gt;polaroid&lt;/code&gt; · &lt;code&gt;window&lt;/code&gt; · &lt;code&gt;masonry&lt;/code&gt; · &lt;code&gt;todo&lt;/code&gt; · &lt;code&gt;now_playing&lt;/code&gt; · &lt;code&gt;online&lt;/code&gt; · &lt;code&gt;games&lt;/code&gt; · &lt;code&gt;age&lt;/code&gt; · &lt;code&gt;icons&lt;/code&gt; · &lt;code&gt;beeper&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;qi-can-kao-lian-jie&quot;&gt;七、参考链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://www.getzola.org/documentation/&quot;&gt;Zola 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://ametrine.daudix.one&quot;&gt;Ametrine 主题&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one&quot;&gt;daudix.one 参考站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;本站模板速查：&lt;a href=&quot;https://suchaharcan.github.io/03Share_blog/zola-template-markdown-guide/&quot;&gt;@/03Share_blog/2026-06-22-zola-template-markdown-guide/index.md&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;本站 v1.0 迭代记录：&lt;a href=&quot;https://suchaharcan.github.io/nanolog/2026-06-24t04-00-00z/&quot;&gt;@/nanolog/2026-06-24T04:00:00Z.md&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;p&gt;&lt;em&gt;v1.0 正式版：在「毛坯房但够用」的基础上，补齐统计、加密、看板与文档化；后续版本将在此基础上迭代，而不推翻目录结构。&lt;/em&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-23T12:00:00+00:00</published>
        <updated>2026-06-23T12:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-23t12-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-23t12-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-23t12-00-00z/">&lt;p&gt;2026年06月23日（东八区）&lt;/p&gt;
&lt;h2 id=&quot;gong-neng-diao-shi-umami-liu-liang-tong-ji-wei-sheng-xiao&quot;&gt;功能调试：Umami 流量统计未生效&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;站点启用 Ametrine 主题内置的 Umami 统计后，&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/analytics/eu/websites/cdf54193-b449-4454-884b-029e82434c32&quot;&gt;Umami 控制台&lt;/a&gt; 长期无访客数据。本次排查确认根因为 &lt;code&gt;zola.toml&lt;/code&gt; 中 &lt;code&gt;self_hosted_url&lt;/code&gt; 误填为博客域名，导致追踪脚本指向不存在的 &lt;code&gt;/script.js&lt;/code&gt;，且 CSP 未放行 Umami Cloud 域名。修复后仅改动站点根目录 &lt;code&gt;zola.toml&lt;/code&gt;，&lt;strong&gt;未修改 &lt;code&gt;themes/&lt;/code&gt;&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;1-umami-zai-yuan-dai-ma-zhong-de-she-ji-luo-ji-yu-diao-yong-lian&quot;&gt;1. Umami 在源代码中的设计逻辑与调用链&lt;/h3&gt;
&lt;p&gt;Ametrine 主题（参考 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one&quot;&gt;daudix.one&lt;/a&gt;）将统计能力拆为 &lt;strong&gt;配置 → CSP 白名单 → 脚本注入&lt;/strong&gt; 三层，全部在 &lt;code&gt;themes/ametrine/templates/partials/&lt;/code&gt; 中实现。&lt;/p&gt;
&lt;h4 id=&quot;1-1-pei-zhi-ru-kou-zola-toml&quot;&gt;1.1 配置入口：&lt;code&gt;zola.toml&lt;/code&gt;&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;analytics&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;service&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;umami&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                                          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 统计服务：goatcounter | umami | plausible&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cdf54193-b449-4454-884b-029e82434c32&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Umami Cloud 的 website ID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; self_hosted_url = &amp;quot;https://stats.example.com&amp;quot;            # 仅自托管 Umami 时填写&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;exclude_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; true&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                                        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 可选：不采集 URL hash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; exclude_search = false                                   # 可选：不采集 URL 查询参数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; do_not_track = false                                     # 可选：尊重浏览器 DNT&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;service&lt;/code&gt;&lt;/td&gt;&lt;td&gt;选择统计后端，决定加载哪段 partial&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;id&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Umami 的 &lt;code&gt;data-website-id&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;self_hosted_url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;自托管&lt;/strong&gt;实例根 URL；留空则走 Umami Cloud（&lt;code&gt;cloud.umami.is&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;exclude_hash&lt;/code&gt; / &lt;code&gt;exclude_search&lt;/code&gt; / &lt;code&gt;do_not_track&lt;/code&gt;&lt;/td&gt;&lt;td&gt;映射为 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt; 上的 &lt;code&gt;data-*&lt;/code&gt; 属性&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;主题默认示例见 &lt;code&gt;themes/ametrine/config.toml&lt;/code&gt; 的 &lt;code&gt;[extra.analytics]&lt;/code&gt; 段（daudix 使用自托管 &lt;code&gt;https://stats.daudix.one&lt;/code&gt;）。&lt;/p&gt;
&lt;h4 id=&quot;1-2-csp-bai-ming-dan-partials-csp-html&quot;&gt;1.2 CSP 白名单：&lt;code&gt;partials/csp.html&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;页面 &lt;code&gt;&amp;lt;head&amp;gt;&lt;/code&gt; 内生成 &lt;code&gt;Content-Security-Policy&lt;/code&gt;，决定是否允许加载外部脚本与上报数据：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;config.extra.csp（zola.toml 自定义域）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;csp.html 合并 analytics 域&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        ↓&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;meta http-equiv=&amp;quot;Content-Security-Policy&amp;quot; …&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Umami 相关逻辑&lt;/strong&gt;（&lt;code&gt;themes/ametrine/templates/partials/csp.html&lt;/code&gt;）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;&lt;code&gt;script-src&lt;/code&gt; 追加&lt;/th&gt;&lt;th&gt;&lt;code&gt;connect-src&lt;/code&gt; 追加&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;设置了 &lt;code&gt;self_hosted_url&lt;/code&gt;&lt;/td&gt;&lt;td&gt;该 URL&lt;/td&gt;&lt;td&gt;该 URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;未设置 + &lt;code&gt;service == &quot;umami&quot;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;cloud.umami.is&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;*.umami.dev cloud.umami.is&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;若误填 &lt;code&gt;self_hosted_url&lt;/code&gt; 为博客地址，CSP &lt;strong&gt;不会&lt;/strong&gt;自动加入 &lt;code&gt;cloud.umami.is&lt;/code&gt;，脚本即使写对也会被策略拦截。&lt;/p&gt;
&lt;h4 id=&quot;1-3-jiao-ben-zhu-ru-partials-head-html-partials-analytics-html&quot;&gt;1.3 脚本注入：&lt;code&gt;partials/head.html&lt;/code&gt; → &lt;code&gt;partials/analytics.html&lt;/code&gt;&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;触发条件&lt;/strong&gt;（&lt;code&gt;themes/ametrine/templates/partials/head.html&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%- if config.mode != &amp;quot;serve&amp;quot; and config.extra.analytics.service -%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {%- include &amp;quot;partials/analytics.html&amp;quot; -%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{%- endif -%}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;要点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;zola serve&lt;/code&gt; 开发模式不注入&lt;/strong&gt; — 本地热重载页面无统计脚本，属预期行为。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;zola build&lt;/code&gt; 产物才包含&lt;/strong&gt; — 部署到 GitHub Pages 后访客才会被追踪。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Umami 脚本生成&lt;/strong&gt;（&lt;code&gt;themes/ametrine/templates/partials/analytics.html&lt;/code&gt;）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;输出&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;self_hosted_url&lt;/code&gt; 有值&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;script … src=&quot;{{ self_hosted_url }}/script.js&quot; data-website-id=&quot;{{ id }}&quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;self_hosted_url&lt;/code&gt; 为空&lt;/td&gt;&lt;td&gt;&lt;code&gt;&amp;lt;script … src=&quot;https://cloud.umami.is/script.js&quot; data-website-id=&quot;{{ id }}&quot;&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;等价于官方嵌入代码：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;html&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; defer&lt;/span&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt; src&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://cloud.umami.is/script.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;  data-website-id&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cdf54193-b449-4454-884b-029e82434c32&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;script&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h4 id=&quot;1-4-wan-zheng-diao-yong-lian-sheng-chan-huan-jing&quot;&gt;1.4 完整调用链（生产环境）&lt;/h4&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;zola build&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → head.html 读取 config.extra.analytics&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → csp.html 写入 script-src / connect-src 白名单&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → analytics.html 输出 &amp;lt;script defer src=&amp;quot;cloud.umami.is/script.js&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → 浏览器加载 script.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → script.js 向 *.umami.dev / cloud.umami.is 上报 pageview&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  → Umami 控制台展示数据&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;2-ben-ci-cuo-wu-yuan-yin-yu-xiu-fu-fang-an&quot;&gt;2. 本次错误原因与修复方案&lt;/h3&gt;
&lt;h4 id=&quot;2-1-xian-xiang&quot;&gt;2.1 现象&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;修复前（线上）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;页面 &lt;code&gt;&amp;lt;script&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;src=&quot;https://suchaharcan.github.io/script.js&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;脚本 HTTP 状态&lt;/td&gt;&lt;td&gt;&lt;strong&gt;404&lt;/strong&gt;（GitHub Pages 无此文件）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CSP &lt;code&gt;script-src&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;&#39;self&#39; https://suchaharcan.github.io …&lt;/code&gt;（&lt;strong&gt;无&lt;/strong&gt; &lt;code&gt;cloud.umami.is&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CSP &lt;code&gt;connect-src&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;无&lt;/strong&gt; &lt;code&gt;*.umami.dev&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Umami 控制台&lt;/td&gt;&lt;td&gt;无访客记录&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;2-2-gen-yin&quot;&gt;2.2 根因&lt;/h4&gt;
&lt;p&gt;复制 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one&quot;&gt;daudix.one&lt;/a&gt; 配置时，将 &lt;code&gt;self_hosted_url&lt;/code&gt; 设成了&lt;strong&gt;博客域名&lt;/strong&gt; &lt;code&gt;https://suchaharcan.github.io&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;daudix 的 &lt;code&gt;self_hosted_url = &quot;https://stats.daudix.one&quot;&lt;/code&gt; 指向&lt;strong&gt;独立的 Umami 自托管实例&lt;/strong&gt;；本站点使用的是 &lt;strong&gt;Umami Cloud&lt;/strong&gt;，不应填写 &lt;code&gt;self_hosted_url&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;连锁影响：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;脚本 URL 错误&lt;/strong&gt; — 主题从 &lt;code&gt;博客域名/script.js&lt;/code&gt; 加载，文件不存在。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;CSP 错误&lt;/strong&gt; — 白名单指向博客域名，未放行 &lt;code&gt;cloud.umami.is&lt;/code&gt; 与 &lt;code&gt;*.umami.dev&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;即使手动改 script 地址&lt;/strong&gt;，上报请求仍会被 CSP 拦截。&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;2-3-xiu-fu&quot;&gt;2.3 修复&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;文件&lt;/strong&gt;：&lt;code&gt;zola.toml&lt;/code&gt;（仅此一处，未改 &lt;code&gt;themes/&lt;/code&gt;）&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;diff&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; [extra.analytics]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; service = &amp;quot;umami&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; id = &amp;quot;cdf54193-b449-4454-884b-029e82434c32&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;self_hosted_url = &amp;quot;https://suchaharcan.github.io&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; exclude_hash = true&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;修复后 &lt;code&gt;zola build&lt;/code&gt; 产物对比：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;检查项&lt;/th&gt;&lt;th&gt;修复后&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;脚本&lt;/td&gt;&lt;td&gt;&lt;code&gt;src=&quot;https://cloud.umami.is/script.js&quot;&lt;/code&gt; → &lt;strong&gt;200&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;CSP&lt;/td&gt;&lt;td&gt;&lt;code&gt;script-src … cloud.umami.is&lt;/code&gt;；&lt;code&gt;connect-src … *.umami.dev cloud.umami.is&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;website ID&lt;/td&gt;&lt;td&gt;&lt;code&gt;cdf54193-b449-4454-884b-029e82434c32&lt;/code&gt; ✓&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;部署提醒&lt;/strong&gt;：本地 build 已正确，需 push 触发 GitHub Pages 重建后线上才生效。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;3-yan-zheng-fang-shi-yu-shi-yong-zhu-yi-dian&quot;&gt;3. 验证方式与使用注意点&lt;/h3&gt;
&lt;h4 id=&quot;3-1-bu-shu-hou-yan-zheng-tui-jian&quot;&gt;3.1 部署后验证（推荐）&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;浏览器 Network&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;打开 https://suchaharcan.github.io/&lt;/li&gt;
&lt;li&gt;DevTools → Network，筛选 &lt;code&gt;script.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;确认来源为 &lt;code&gt;cloud.umami.is&lt;/code&gt;，状态 &lt;strong&gt;200&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;查看页面源码&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;搜索 &lt;code&gt;data-website-id&lt;/code&gt;，应出现 &lt;code&gt;cdf54193-b449-4454-884b-029e82434c32&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;搜索 &lt;code&gt;Content-Security-Policy&lt;/code&gt;，应含 &lt;code&gt;cloud.umami.is&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Umami 控制台&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;登录 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/analytics/eu/websites/cdf54193-b449-4454-884b-029e82434c32&quot;&gt;Analytics 面板&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;刷新博客首页，Realtime / 今日访客应在数秒内更新&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;命令行快速检查&lt;/strong&gt;（可选）&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;sL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://suchaharcan.github.io/&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;o&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cloud.umami.is/script.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 应输出：cloud.umami.is/script.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;curl&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;sI&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;https://cloud.umami.is/script.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; head&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 应输出：HTTP/2 200&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h4 id=&quot;3-2-shi-yong-zhu-yi-dian&quot;&gt;3.2 使用注意点&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;场景&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;&lt;code&gt;zola serve&lt;/code&gt; 本地开发&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;不注入 analytics，Network 中看不到 Umami 脚本 — &lt;strong&gt;正常&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Umami Cloud vs 自托管&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;Cloud 用户&lt;strong&gt;不要&lt;/strong&gt;填 &lt;code&gt;self_hosted_url&lt;/code&gt;；自托管才填实例根 URL（如 &lt;code&gt;https://stats.example.com&lt;/code&gt;）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;CSP 自定义域&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt; 的 &lt;code&gt;[extra.csp]&lt;/code&gt; 与主题自动合并；Umami Cloud 域由主题在 &lt;code&gt;self_hosted_url&lt;/code&gt; 为空时自动追加&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;参考 daudix.one&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;可借鉴导航、CSP 结构等；&lt;code&gt;self_hosted_url&lt;/code&gt; 不能直接照搬（daudix 为自托管）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;不修改 themes/&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;统计逻辑已在主题内；站点级只需正确配置 &lt;code&gt;zola.toml&lt;/code&gt; 并 build 部署&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;隐私 / 分享&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;数据分享页：https://cloud.umami.is/share/2hWVbYvlPUkk98Yz&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;AdBlock / 隐私扩展&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;访客若安装拦截器，可能不上报 — 控制台数据为「可统计访客」子集&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;3-3-pei-zhi-dui-zhao-su-cha&quot;&gt;3.3 配置对照速查&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;部署方式&lt;/th&gt;&lt;th&gt;&lt;code&gt;service&lt;/code&gt;&lt;/th&gt;&lt;th&gt;&lt;code&gt;id&lt;/code&gt;&lt;/th&gt;&lt;th&gt;&lt;code&gt;self_hosted_url&lt;/code&gt;&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Umami Cloud（本站）&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;umami&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Cloud 控制台 website ID&lt;/td&gt;&lt;td&gt;&lt;strong&gt;留空&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;自托管 Umami&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;umami&lt;/code&gt;&lt;/td&gt;&lt;td&gt;实例中的 website ID&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://你的-umami-域名&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;GoatCounter / Plausible&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;对应 service 名&lt;/td&gt;&lt;td&gt;各服务文档&lt;/td&gt;&lt;td&gt;自托管时填实例 URL&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;xiu-gai-wen-jian&quot;&gt;修改文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;变更&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;zola.toml&lt;/code&gt;&lt;/td&gt;&lt;td&gt;删除错误的 &lt;code&gt;self_hosted_url = &quot;https://suchaharcan.github.io&quot;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;p&gt;相关链接：&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/analytics/eu/websites/cdf54193-b449-4454-884b-029e82434c32&quot;&gt;Umami 控制台&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://cloud.umami.is/share/2hWVbYvlPUkk98Yz&quot;&gt;数据分享页&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://github.com/daudix/daudix.one&quot;&gt;daudix.one 参考仓库&lt;/a&gt; · &lt;a href=&quot;/nanolog/2026-06-21t08-30-00z/&quot;&gt;热力图 + 统计启用记录&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mac Chrome ReOpen</title>
        <published>2026-06-23T00:00:00+00:00</published>
        <updated>2026-06-23T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/chrome-reopen/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/chrome-reopen/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/chrome-reopen/">&lt;p&gt;问题描述：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Chrome 用 Command+Q 强制关闭程序后，程序在 Dock 栏自己弹了弹又重新弹起来了。&lt;/p&gt;
&lt;p&gt;每次都要强制关闭两次以上才能真正把 Chrome 关掉。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;Mac 本身的日志功能要多使用，有时能够反应出一定的问题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查看系统的终端报错日志（揪出幕后黑手）&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;eventMessage CONTAINS[c] &amp;quot;launch&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;运行后，终端会进入监听状态。此时你去对 Chrome 执行 &lt;code&gt;Command + Q&lt;/code&gt;。 * 观察 Chrome 自动弹起的那一瞬间，终端里跳出来的日志。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;bat&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2026-06-23 09:21:30.454905+0800 ... loginwindow: [com.apple.loginwindow.logging:TAL] -[PersistentAppsSupport appShouldBeRelaunched:] &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; entered. checking app: Google Chrome&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2026-06-23 09:21:30.454921+0800 ... loginwindow: [com.apple.loginwindow.logging:TAL] -[PersistentAppsSupport saveLogoutPersistentState:finalSnapshot:] &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt;            Adding to relaunchArray: Google Chrome&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;解释：&lt;/strong&gt; &lt;strong&gt;&lt;code&gt;loginwindow&lt;/code&gt;&lt;/strong&gt; 是 macOS 的登录窗口及会话管理进程。这里的 &lt;strong&gt;&lt;code&gt;TAL&lt;/code&gt; (Transparent App Lifecycle)&lt;/strong&gt; 和 &lt;strong&gt;&lt;code&gt;PersistentAppsSupport&lt;/code&gt;&lt;/strong&gt; 是 macOS 的“窗口恢复/持久化应用”机制。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;翻译成白话：&lt;/strong&gt; 在 09:21:30 时，macOS 的系统级进程 &lt;code&gt;loginwindow&lt;/code&gt; 介入，检测了 Chrome 的状态。它认为 Chrome &lt;strong&gt;“应该被重新拉起（appShouldBeRelaunched）”&lt;/strong&gt;，并直接把它塞进了重启队列（Adding to relaunchArray）里。&lt;/p&gt;
&lt;p&gt;随后在 09:21:34 左右，系统底层的 &lt;code&gt;duetexpertd&lt;/code&gt;（苹果的智能预测/行为建议服务）和 &lt;code&gt;runningboardd&lt;/code&gt; 协同，再次把 Chrome 给捞了起来。&lt;/p&gt;
&lt;p&gt;日志时间线（08:41:01）
时间	事件	含义
.637
checkAgainstApp: Google Chrome
TAL 开始评估 Chrome 是否该被恢复
.638
appShouldBeRelaunched → Adding to relaunchArray
系统判定：Chrome 退出后应被重新拉起
.827
自动填充 (Google Chrome) state 3→4, quit
Chrome 密码自动填充助手先退出
.855
appDeath for com.google.Chrome
Chrome 主进程死亡
.855–.848
Google Chrome state 3→4, quit
主程序走完退出流程
.850（+6s）
previouslyRunningApps 仍含 Chrome
TAL 快照里 Chrome 未被清除
关键：relaunchArray 写入发生在 Chrome 真正退出之前（.638 vs .855）。说明 macOS 在退出流程早期就决定了要恢复 Chrome，不是事后误判。&lt;/p&gt;
&lt;p&gt;两个直接原因&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;TAL 持久列表里已有 Chrome
你的 ~/Library/Preferences/ByHost/com.apple.loginwindow.*.plist 中：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BundleID = “com.google.chrome”
BackgroundState = 3
Path = “/Applications/Google Chrome.app”
BackgroundState = 2：前台运行、有窗口 → 应恢复
BackgroundState = 3：后台/hidden 状态 → 仍会被记录&lt;/p&gt;
&lt;p&gt;每次 CMD+Q，loginwindow 都会重新评估并再次写入 relaunchArray。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;NSQuitAlwaysKeepsWindows 未设置
defaults read com.google.Chrome NSQuitAlwaysKeepsWindows&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;key-not-found&quot;&gt;→ key not found&lt;/h1&gt;
&lt;p&gt;未设置时，macOS 默认行为是 退出时保留窗口状态（Resume）。有窗口的 Chrome 退出 → appShouldBeRelaunched 返回 YES → 进 relaunchArray。&lt;/p&gt;
&lt;p&gt;exit_type: Normal 已修复，但 TAL 仍会因「有窗口 + 保留状态」而恢复。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;自动填充 (Google Chrome) 是什么？
这是 Chrome 的密码自动填充系统组件，在 loginwindow 里被当作独立 Application 跟踪。退出时它先于主进程退出，可能让 TAL 认为 Chrome 生态尚未完全结束，加剧恢复判定。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;针对这份日志的修复（按顺序）
第一步：强制 Chrome 退出时不保留窗口
Chrome 必须正在运行时执行：&lt;/p&gt;
&lt;p&gt;defaults write com.google.Chrome NSQuitAlwaysKeepsWindows -bool false
然后 按住 Option 再按 CMD+Q（或菜单：Chrome → 退出时按住 Option 变为「退出并保留窗口关闭」）。&lt;/p&gt;
&lt;p&gt;第二步：从 TAL 持久列表移除 Chrome
killall “Google Chrome” 2&amp;gt;/dev/null
python3 &amp;lt;&amp;lt; ‘PY’
import plistlib, os, subprocess, re
uuid = re.search(r’“IOPlatformUUID” = “([^”]+)“’,
subprocess.check_output([“ioreg”,“-rd1”,“-c”,“IOPlatformExpertDevice”], text=True)).group(1)
path = os.path.expanduser(f“~/Library/Preferences/ByHost/com.apple.loginwindow.{uuid}.plist“)
with open(path, “rb”) as f: d = plistlib.load(f)
before = len(d.get(“TALAppsToRelaunchAtLogin”, []))
d[“TALAppsToRelaunchAtLogin”] = [
a for a in d.get(“TALAppsToRelaunchAtLogin”, [])
if “chrome” not in a.get(“BundleID”, “”).lower()
]
with open(path, “wb”) as f: plistlib.dump(d, f)
print(f“Removed Chrome from TAL: {before} -&amp;gt; {len(d[‘TALAppsToRelaunchAtLogin’])} apps“)
PY
第三步：关闭 Chrome 密码自动填充系统扩展
系统设置 → 密码 → 密码选项 → 自动填充
取消勾选 Google Chrome（或 Chrome 相关自动填充项）。&lt;/p&gt;
&lt;p&gt;这会让 自动填充 (Google Chrome) 不再作为独立进程被 loginwindow 跟踪。&lt;/p&gt;
&lt;p&gt;第四步：验证
log stream –predicate ‘process == “loginwindow” AND eventMessage CONTAINS[c] “Chrome”’ –style compact
CMD+Q 后，不应再出现 Adding to relaunchArray: Google Chrome。&lt;/p&gt;
&lt;p&gt;与之前分析的关系
项目	当前状态
Yandex Mail.app
已删除 ✓
exit_type
已是 Normal ✓
系统后台项
已关闭 ✓
TAL 持久列表
仍有 Chrome ← 当前主因
NSQuitAlwaysKeepsWindows
未设置 ← 触发 appShouldBeRelaunched
自动填充助手
日志中可见，建议关闭
这份日志说明：不是 Chrome 崩溃重启，而是 macOS TAL 正常的窗口恢复机制在 CMD+Q 时主动标记 Chrome 为「应 relaunch」。根因是 TAL 列表 + 退出时保留窗口，而非后台项或 flags。&lt;/p&gt;
&lt;h2 id=&quot;macos-pai-cha-chang-yong-cli-su-cha&quot;&gt;macOS 排查常用 CLI 速查&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;排查 Chrome 自动拉起时用到的主要是 sfltool、log、pgrep。下面按工具整理常见用法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;sfltool — 后台项 / 登录项
注意：不是 stltool，正确命令是 sfltool（Shared File List tool）。
主要用于查看 Login Items 和 Allow in the Background（后台允许） 注册信息。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;基本命令&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;查看帮助
&lt;code&gt;sfltool&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;最常用：导出所有 Background Task Management (BTM) 条目
&lt;code&gt;sfltool dumpbtm&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;筛选 Chrome / Google 相关
&lt;code&gt;sfltool dumpbtm | grep -i -A12 &quot;Google Chrome&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;只看后台任务类型
&lt;code&gt;sfltool dumpbtm | grep -i -B2 -A8 &quot;background tasks&quot;&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;其他子命令（较少用）&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sfltool&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;          #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 列出 shared file list&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sfltool&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list-info&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;     #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 详细信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sfltool&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; csinfo&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; codesign 信息&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sfltool&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; resetbtm&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ⚠️ 重置全部 BTM，慎用&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;典型排查场景&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;确认 Chrome 是否在系统后台项中注册 &lt;br/&gt;
&lt;code&gt;sfltool dumpbtm 2&amp;gt;/dev/null | grep -i -E &#39;chrome|google&#39;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;对比：传统登录项（osascript 方式）&lt;br/&gt;
&lt;code&gt;osascript -e &#39;tell application &quot;System Events&quot; to get the name of every login item&#39;&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;log — 统一日志系统（Unified Logging）
macOS 10.12+ 的日志不再散落在文本文件里，主要靠 log stream（实时）和 log show（历史）。&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;实时监听&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; —&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; 基础：监听&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; loginwindow&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 所有日志&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;排查&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Chrome&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 被&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; TAL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 拉起（我们用的）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot; AND eventMessage CONTAINS[c] &amp;quot;Chrome&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;更宽：任何含&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; launch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 的日志，再&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Chrome&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;eventMessage CONTAINS[c] &amp;quot;launch&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;监听&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; TAL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 子系统&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;subsystem == &amp;quot;com.apple.loginwindow.logging&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;多进程联合监听&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot; OR process == &amp;quot;runningboardd&amp;quot; OR process == &amp;quot;duetexpertd&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; chrome&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;历史查询&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; —&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;最近&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 小时&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; loginwindow&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 里含&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Chrome&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 的日志&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-last&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2h&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot; AND eventMessage CONTAINS[c] &amp;quot;Chrome&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;最近&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 7&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 天：quit&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; relaunch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; unexpectedly&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 相关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-last&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 7d&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;eventMessage CONTAINS &amp;quot;Google Chrome&amp;quot; AND (eventMessage CONTAINS &amp;quot;quit&amp;quot; OR eventMessage CONTAINS &amp;quot;relaunch&amp;quot; OR eventMessage CONTAINS &amp;quot;unexpectedly&amp;quot;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;只看错误级别&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-last&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 1h&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-level&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; error&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;–predicate 语法要点
写法	说明
process == “loginwindow”
精确匹配进程名
eventMessage CONTAINS[c] “Chrome”
消息含 Chrome，[c] = 忽略大小写
subsystem == “com.apple.talagent”
按子系统过滤
messageType == error
只看 error
AND / OR
组合条件
实用技巧
输出到文件，避免刷屏
log stream –predicate ‘process == “loginwindow” AND eventMessage CONTAINS[c] “Chrome”’ &lt;br /&gt;
–style compact &amp;gt; ~/Desktop/chrome-quit.log&lt;/p&gt;
&lt;h1 id=&quot;shi-jian-fan-wei-li-shi&quot;&gt;时间范围（历史）&lt;/h1&gt;
&lt;p&gt;log show –start “2026-06-25 08:40:00” –end “2026-06-25 08:42:00” &lt;br /&gt;
–predicate ‘process == “loginwindow”’ –style compact
我们抓到的关键日志模式
appShouldBeRelaunched: Google Chrome
Adding to relaunchArray: Google Chrome
applicationQuit: for app:Google Chrome
appDeath for com.google.Chrome
previouslyRunningApps: ( … com.google.chrome … )
3. pgrep — 按名称查进程
比 ps aux | grep 更干净（不会 grep 到自己）。&lt;/p&gt;
&lt;p&gt;基本用法&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 进程是否存在（静默，适合脚本判断）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Chrome 在运行&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 列出 PID + 完整命令行（排查最有用）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 不区分大小写&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;chrome|google chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 只输出 PID&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;常见组合&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; CMD+Q 后确认是否还有残留&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;已完全退出&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 看 Chrome 各 Helper 进程&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Chrome Helper&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 统计 Chrome 相关进程数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; chrome&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 配合 killall 做彻底退出&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;killall&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/dev/null&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sleep&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 应无输出&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;pgrep 常用选项
选项	含义
-l
显示进程名
-f
匹配完整命令行（而不只是进程名）
-i
忽略大小写
-x
精确匹配进程名
-u $USER
只查当前用户的进程
4. 配套命令（同一套排查里常用）
TAL 持久恢复列表&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 读取「注销/重启时重新打开的应用」列表&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;UUID&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ioreg&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;rd1&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; IOPlatformExpertDevice&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; awk&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;F&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/IOPlatformUUID/{print $4}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;currentHost&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; com.apple.loginwindow&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; TALAppsToRelaunchAtLogin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 或直接看 plist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;plutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/Library/Preferences/ByHost/com.apple.loginwindow.&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;UUID&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.plist&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;A5&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; chrome&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;launchctl&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; —&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 启动项&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 服务&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 当前用户已加载的服务，筛 Chrome/Google&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;launchctl&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; list&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;chrome|google&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看 LaunchAgent 内容&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;plutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~/Library/LaunchAgents/com.google.GoogleUpdater.wake.plist&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; —&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 应用偏好&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Chrome 是否保留退出时的窗口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; com.google.Chrome&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; NSQuitAlwaysKeepsWindows&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 强制关闭保留窗口（Chrome 运行中执行）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; write&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; com.google.Chrome&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; NSQuitAlwaysKeepsWindows&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;bool&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; false&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 全局：退出时是否关闭窗口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; NSGlobalDomain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; NSQuitAlwaysKeepsWindows&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pluginkit&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; —&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 系统扩展&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 自动填充&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看 Chrome 相关系统插件（如自动填充）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pluginkit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;A&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;E&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;chrome|google|autofill&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;5.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 一套完整排查流程（可复制）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; === 1. 静态状态 ===&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sfltool&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dumpbtm&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;A10&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;defaults&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;currentHost&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; read&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; com.apple.loginwindow&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; TALAppsToRelaunchAtLogin&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; chrome&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; === 2. 开终端 A：实时日志 ===&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stream&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot; AND eventMessage CONTAINS[c] &amp;quot;Chrome&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; === 3. 对 Chrome 执行 CMD+Q ===&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; === 4. 终端 B：确认进程 ===&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;pgrep&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;lf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Google Chrome&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;OK: 无残留&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; === 5. 历史补查 ===&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-last&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 5m&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;process == &amp;quot;loginwindow&amp;quot; AND eventMessage CONTAINS[c] &amp;quot;relaunch&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-style&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; compact&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;常见坑
问题	说明
log stream 刷屏
必须加 –predicate，否则 I/O 日志量极大
log show 很慢
务必加 –last 1h 或 –start/–end 限定范围
pgrep 匹配过宽
-i chrome 会匹配到 Cursor 的 chrome_crashpad_handler，必要时加 |Google Chrome 精确匹配
sfltool 与系统设置不一致
UI 显示 Google Chrome.app，dumpbtm 可能还有独立的 background tasks 条目
defaults read 报 key not found
不等于 false，可能意味着「未设置、走系统默认」&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;xi-tong-ri-zhi-hen-hao-yong&quot;&gt;系统日志 很好用&lt;/h2&gt;
&lt;p&gt;需求 1：macOS 系统日志功能（Unified Logging）使用要点整理
macOS 自 10.12 引进 统一日志系统 (Unified Logging System) 后，日志不再零散存储于各个文本文件中，而是由 diagnosticd 统一收集并二进制压缩存储。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;核心命令工具：log
实时流监控 (log stream)：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;要点：它类似于传统 Linux 的 tail -f，但必须配合 –predicate（谓词过滤器）使用，否则海量的系统级 I/O 日志会瞬间刷屏，导致终端卡死。&lt;/p&gt;
&lt;p&gt;历史日志检索 (log show)：&lt;/p&gt;
&lt;p&gt;要点：用于查看过去发生的事情。必须限定时间范围，否则检索极其缓慢。&lt;/p&gt;
&lt;p&gt;示例：查看过去 10 分钟内关于 Chrome 的报错：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; show&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-last&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 10m&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-predicate&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;eventMessage CONTAINS[c] &amp;quot;Chrome&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-level&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; error&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;谓词过滤 (–predicate) 的高级语法
谓词基于 Apple 的 NSPredicate 架构，大小写敏感（除非加 [c] 表示忽略大小写）：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;process == “loginwindow”：精准匹配进程名。&lt;/p&gt;
&lt;p&gt;processImageUUID CONTAINS[c] “Chrome”：匹配进程路径或动态库中包含 Chrome 的行为（对抓取 Helper 应用极有效）。&lt;/p&gt;
&lt;p&gt;messageType == error 或 messageType == fault：只看错误或严重故障（fault）。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;日志等级的隐蔽陷阱
macOS 日志分为五个等级：Default、Info、Debug、Error、Fault。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;痛点：出于性能和隐私考虑，Info 和 Debug 等级的日志默认是不写入磁盘，也不在实时流中展示的。&lt;/p&gt;
&lt;p&gt;解决办法：如果你在调自建脚本（如你的自定义自动化脚本）发现看不到详细日志，需要手动为该进程开启 Debug 级写入：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; log&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; config&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-mode&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;level:debug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-subsystem&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; com.your.app&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;需求 2：开源 macOS (Darwin xnu) 代码架构与设计思路
你拉取的仓库实际上是 Darwin（macOS 的开源核心），其内核名为 XNU（X is Not Unix）。XNU 是一个独特的混合内核 (Hybrid Kernel)，它融合了 Mach 的灵活性和 BSD 的成熟稳定性。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;核心代码架构（目录结构解密）
在官方开源的 xnu 仓库中，核心架构主要由以下四大板块交织而成：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;xnu/&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── mach/               # Mach 微内核层（核心调度与 IPC）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kern/           # 线程调度、时钟、任务管理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── vm/             # 虚拟内存管理 (VM Object, Pager)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── bsd/                # BSD 层（提供 POSIX 标准与上层抽象）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── kern/           # 进程管理 (PID)、credentials、sysent&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   ├── vfs/            # 虚拟文件系统切换 (Virtual File System)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── netinet/        # TCP/IP 网络协议栈&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── iokit/              # I/O Kit（C++ 驱动框架，负责硬件交互）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;│   └── Drivers/        # 磁盘、网络、USB 等基础驱动抽象&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;├── libkern/            # 内核基础库（C++ 运行时支持、容器类）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;└── pexpert/            # 平台专家层（处理不同硬件架构如 ARM64/Intel 的引导初始化）&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;核心设计思路
⚙️ 思路一：微内核与宏内核的“双管齐下”（混合内核）
Mach（微内核）：只负责最底层、最极致的单一任务——进程间通信 (IPC/Mach Ports)、进程隔离、底层线程调度。Mach 认为万物皆为 “Port”（端口）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;BSD（宏内核）：由于微内核频繁进行上下文切换（Context Switch）会导致性能低下，苹果在内核空间里直接嵌套了一个改版的 BSD。BSD 把 Mach 的底层概念包装成 POSIX 标准。&lt;/p&gt;
&lt;p&gt;逻辑关系：系统调用进来，上层看到的是 BSD 的 PID（进程 ID），但 BSD 底层其实映射的是 Mach 的 Task。&lt;/p&gt;
&lt;p&gt;🔒 思路二：严格的权限与资源断言机制（RunningBoard 的由来）
为什么你会在前面的日志里频繁看到 runningboardd、ttl 和 assertion（断言）？&lt;/p&gt;
&lt;p&gt;在 XNU 的设计进化中（特别是引入 iOS 和 Apple Silicon 移动架构后），内核极其看重功耗与生命周期管理。&lt;/p&gt;
&lt;p&gt;XNU 引入了 Assertion（资源断言） 机制。一个应用（如 Chrome）在前台时，runningboardd 会向内核申请一个 frontmost 强断言，内核据此分配高优先级 CPU 和能效核心（E-cores/P-cores）。当应用转入后台或准备退出时，断言被 Invalidating（作废），内核会瞬间限制或冻结其 Helper 进程，这也是导致多页面 Chrome 回收假死而被系统强制拉起的底层诱因。&lt;/p&gt;
&lt;p&gt;💻 思路三：面向对象的驱动安全（I/O Kit &amp;amp; DriverKit）
传统的 Unix 驱动是用 C 语言写的，一死全死。XNU 独辟蹊径，在内核中实现了一个受限的 C++ 运行时 (libkern)。&lt;/p&gt;
&lt;p&gt;设计目的：利用 C++ 的面向对象特性（如依托 OSMetaClass 管理生命周期），让驱动程序对象化。如今苹果正逐步将 I/O Kit 迁移到用户空间（DriverKit），让绝大多数驱动在内核外运行，即使崩溃也不会导致 Mac 蓝屏/紫屏。&lt;/p&gt;
&lt;p&gt;通过结合这两点，你会发现：你用 log stream 抓到的每一行状态，其实都是 XNU 内核中 Mach Task、BSD 进程状态以及 RunningBoard 断言在系统层面的具象化表现。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-22T12:00:00+00:00</published>
        <updated>2026-06-22T12:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-22t12-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-22t12-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-22t12-00-00z/">&lt;p&gt;2026年06月22日（东八区）&lt;/p&gt;
&lt;h2 id=&quot;da-ban-ben-geng-xin-zhou-ji-hua-kan-ban-v1-0-design-ye&quot;&gt;大版本更新：周计划看板 v1.0 + Design 页&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;本次为站点 &lt;strong&gt;Out - Projects&lt;/strong&gt; 区的一次大功能迭代：上线 &lt;strong&gt;周计划看板&lt;/strong&gt;（列表 + 明细 + 规则引擎 + 加权进度），并同步完成 &lt;strong&gt;Design 应用网格&lt;/strong&gt; 样式对齐。数据与 &lt;code&gt;content/&lt;/code&gt; 同级存放在 &lt;code&gt;kanban/&lt;/code&gt;，未修改 &lt;code&gt;themes/&lt;/code&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;geng-xin-ming-xi&quot;&gt;更新明细&lt;/h3&gt;
&lt;h4 id=&quot;1-zhou-ji-hua-kan-ban-jia-gou&quot;&gt;1. 周计划看板 · 架构&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;层级&lt;/th&gt;&lt;th&gt;路径 / 文件&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;数据源&lt;/td&gt;&lt;td&gt;&lt;code&gt;kanban/&amp;lt;周一日期&amp;gt;.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Zola 分区&lt;/td&gt;&lt;td&gt;&lt;code&gt;content/kanban/&lt;/code&gt;（symlink 指向数据源）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;静态读取&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/kanban/&lt;/code&gt; → 前端 fetch 原始 MD&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;规则引擎&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;明细 UI&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt; + &lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表 UI&lt;/td&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-list.js&lt;/code&gt; + &lt;code&gt;templates/kanban_list.html&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;样式&lt;/td&gt;&lt;td&gt;&lt;code&gt;sass/kanban/style.scss&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;映射文档&lt;/td&gt;&lt;td&gt;&lt;code&gt;kanban/kanban-mapping.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;Edit 缓冲&lt;/td&gt;&lt;td&gt;&lt;code&gt;kanban/_edit-buffer.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;入口：&lt;strong&gt;侧边栏 → Out - Projects → 周计划&lt;/strong&gt; → &lt;code&gt;/kanban/&lt;/code&gt;&lt;/p&gt;
&lt;h4 id=&quot;2-lie-biao-ye-tu-yi&quot;&gt;2. 列表页（图一）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;标题显示 &lt;strong&gt;&lt;code&gt;core_tasks&lt;/code&gt;&lt;/strong&gt;（如「看板规则引擎 · Trello 明细页…」），不显示日期区间&lt;/li&gt;
&lt;li&gt;元信息一行（article 图标风格）：&lt;strong&gt;开始 · 截止 · 剩余天数 · 进度% · 重要等级（5 星）&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;剩余天数 = 截止日 − 基准日（东八区；早于 &lt;code&gt;week_start&lt;/code&gt; 时以开始日为基准）&lt;/li&gt;
&lt;li&gt;统计行：共 N 项 / 已完成 / 待办 / 进行中&lt;/li&gt;
&lt;li&gt;背景色：&lt;strong&gt;待办 &amp;gt; 3&lt;/strong&gt; → 全红；全完成 → 浅绿；其余 → 按加权进度渐变&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;3-ming-xi-ye-tu-er-trello-wu-lie&quot;&gt;3. 明细页（图二 · Trello 五列）&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;列&lt;/th&gt;&lt;th&gt;参与进度&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;待办 / 进行中 / 已完成&lt;/td&gt;&lt;td&gt;✅&lt;/td&gt;&lt;td&gt;可拖拽（解锁后）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;资源&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;淡绿托盘，列出所需资源&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;目标&lt;/td&gt;&lt;td&gt;❌&lt;/td&gt;&lt;td&gt;&lt;code&gt;@goal complete&lt;/code&gt; 淡蓝 / &lt;code&gt;@goal risk&lt;/code&gt; 灰爆样式&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;页头仅显示 &lt;strong&gt;本周核心&lt;/strong&gt;（&lt;code&gt;core_tasks&lt;/code&gt;），无重复日期标题&lt;/li&gt;
&lt;li&gt;卡片：&lt;strong&gt;顶栏色&lt;/strong&gt;（&lt;code&gt;@top&lt;/code&gt;）+ &lt;strong&gt;标签条&lt;/strong&gt;（&lt;code&gt;@labels&lt;/code&gt;）+ checklist + 描述；&lt;strong&gt;不显示&lt;/strong&gt;开始/截止/星级（这些只在列表页）&lt;/li&gt;
&lt;li&gt;列头深色块：待办蓝 / 进行中橙 / 已完成绿 / 资源绿 / 目标灰&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;4-suo-ding-jie-suo-bao-cun&quot;&gt;4. 锁定 / 解锁 / 保存&lt;/h4&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;锁定&lt;/strong&gt;（默认）&lt;/td&gt;&lt;td&gt;不可拖拽；隐藏 ReDeplog / Edit Post / 映射说明&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;解锁&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;仅在 &lt;code&gt;week_start&lt;/code&gt;～&lt;code&gt;week_end&lt;/code&gt;（东八区）内可切换；可拖拽跨列（本地预览）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;Edit Post&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;点击前按规则引擎序列化 → 写入 buffer → 复制剪贴板 /（可选 Token）API 覆盖 &lt;code&gt;kanban/&amp;lt;周&amp;gt;.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;超期&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;超过 &lt;code&gt;week_end&lt;/code&gt; 永久只读&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h4 id=&quot;5-jia-quan-jin-du-gong-shi&quot;&gt;5. 加权进度公式&lt;/h4&gt;
&lt;p&gt;以 &lt;strong&gt;50%&lt;/strong&gt; 为基准，仅统计前三列：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;列&lt;/th&gt;&lt;th&gt;单项贡献&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;待办&lt;/td&gt;&lt;td&gt;&lt;strong&gt;−10% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;进行中&lt;/td&gt;&lt;td&gt;&lt;strong&gt;+5% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;已完成&lt;/td&gt;&lt;td&gt;&lt;strong&gt;+15% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;&lt;code&gt;n&lt;/code&gt; = 该卡片 &lt;code&gt;@labels&lt;/code&gt; 数量（无标签时 &lt;code&gt;n = 1&lt;/code&gt;）。结果 clamp 至 0–100%，写入 &lt;code&gt;stats.progress_pct&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;示例（6.16–6.22 周）：待办 4 / 进行中 2 / 已完成 2 → &lt;strong&gt;45%&lt;/strong&gt;；待办 &amp;gt; 3 → 列表背景红色。&lt;/p&gt;
&lt;h4 id=&quot;6-design-ye-tong-qi&quot;&gt;6. Design 页（同期）&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;/design/&lt;/code&gt; 应用网格对齐 &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://ensili.co/&quot;&gt;ensili.co&lt;/a&gt; More apps 布局&lt;/li&gt;
&lt;li&gt;文件：&lt;code&gt;templates/design.html&lt;/code&gt;、&lt;code&gt;sass/design/style.scss&lt;/code&gt;、&lt;code&gt;static/js/design-apps.js&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id=&quot;7-qi-ta&quot;&gt;7. 其他&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;zola.toml&lt;/code&gt; 导航增加 &lt;strong&gt;周计划&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;示例看板：&lt;code&gt;kanban/2026-06-16.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;完整映射：&lt;code&gt;kanban/kanban-mapping.md&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;kan-ban-jian-yi-ying-she-gui-ze&quot;&gt;看板简易映射规则&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 列名          → 看板一列（待办 / 进行中 / 已完成 / 资源 / 目标）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 卡片标题     → 一张卡片&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@start 2026-06-16    开始（数据用，列表页展示）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@due 2026-06-22      截止&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@priority 4          重要等级 1–5（列表页星级）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@top orange          明细页顶部粗色条&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@labels red, blue    明细页顶部细色条 + 进度权重 n&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@bg #FFF8E1          卡片背景色&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@goal complete       目标看板 · 完成效果（淡蓝）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@goal risk           目标看板 · 未完成后果（灰爆）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- [ ] / - [x]        checklist 勾选框&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Front Matter 要点：&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-06-16&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_end&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-06-22&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;core_tasks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;本周核心任务一句话&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;importance&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; total&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 8&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; todo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; doing&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; progress_pct&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 45&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;xia-ci-geng-xin-ji-hua&quot;&gt;下次更新计划&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;测试解锁后编辑功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解锁 → 拖拽跨列 / 勾选 checklist → 点击 &lt;strong&gt;Edit Post&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;验证序列化往返、&lt;code&gt;kanban/_edit-buffer.md&lt;/code&gt; 缓冲、Codeberg 粘贴 / Token 同步&lt;/li&gt;
&lt;li&gt;确认 ReDeplog 部署后列表进度与明细一致&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;针对特定设备显示解锁功能&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;评估移动端 / 平板是否展示「解锁 · 可拖拽」（触摸拖拽与桌面差异）&lt;/li&gt;
&lt;li&gt;可按 viewport 或 UA 限制：小屏只读、桌面可编辑；或提供显式「桌面模式」提示&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping.md&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/2026-06-16/&quot;&gt;示例看板&lt;/a&gt; · &lt;a href=&quot;/kanban/&quot;&gt;周计划列表&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-22T02:00:00+00:00</published>
        <updated>2026-06-22T02:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-22t02-00-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-22t02-00-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-22t02-00-00z/">&lt;p&gt;2026年06月22日（东八区）&lt;/p&gt;
&lt;h2 id=&quot;gong-neng-geng-xin-zhou-ji-hua-kan-ban-kanban-pu-bu-liu&quot;&gt;功能更新：周计划看板（Kanban 瀑布流）&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;新增 &lt;strong&gt;周计划&lt;/strong&gt; 模块：列表 + 明细双模板，数据存放在仓库根目录 &lt;code&gt;kanban/&lt;/code&gt;（与 &lt;code&gt;content/&lt;/code&gt; 同级），一份 Markdown 对应一个自然周。&lt;/p&gt;
&lt;h3 id=&quot;he-xin-neng-li&quot;&gt;核心能力&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Markdown 规则引擎&lt;/strong&gt;（&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;# 一级标题&lt;/code&gt; → 看板&lt;strong&gt;列&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;## 二级标题&lt;/code&gt; → &lt;strong&gt;卡片&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@due&lt;/code&gt; · &lt;code&gt;@labels&lt;/code&gt; · &lt;code&gt;@bg&lt;/code&gt; · &lt;code&gt;@top&lt;/code&gt; · &lt;code&gt;- [ ]&lt;/code&gt; 与看板元素映射&lt;/li&gt;
&lt;li&gt;同步时按当前 UI 状态 &lt;strong&gt;序列化回写&lt;/strong&gt; Markdown&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;明细页 Trello 风格&lt;/strong&gt;（&lt;code&gt;templates/kanban.html&lt;/code&gt;）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;多列布局、标签条、顶栏色、截止日期、checklist&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;锁定 / 解锁&lt;/strong&gt;：仅在 &lt;code&gt;week_start&lt;/code&gt;～&lt;code&gt;week_end&lt;/code&gt;（东八区）内可编辑&lt;/li&gt;
&lt;li&gt;解锁后可 &lt;strong&gt;拖拽卡片跨列&lt;/strong&gt;；&lt;strong&gt;同步&lt;/strong&gt; 按钮写回 &lt;code&gt;kanban/&amp;lt;周&amp;gt;.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Edit Post / ReDeplog 链接对齐 Nanolog 工作流&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;列表页进度视觉&lt;/strong&gt;（&lt;code&gt;templates/kanban_list.html&lt;/code&gt;）&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;展示本周起止、核心任务、完成统计&lt;/li&gt;
&lt;li&gt;全完成 → 浅绿；完成 &amp;lt; 3 → 全红；其余 → 进度渐变&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;wen-dang-yu-shi-li&quot;&gt;文档与示例&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;映射说明：&lt;code&gt;kanban/kanban-mapping.md&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;示例看板：&lt;code&gt;kanban/2026-06-16.md&lt;/code&gt;（6.16 – 6.22）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ru-kou&quot;&gt;入口&lt;/h3&gt;
&lt;p&gt;侧边栏 &lt;strong&gt;Site Dev Log → 周计划&lt;/strong&gt; → &lt;code&gt;/kanban/&lt;/code&gt;&lt;/p&gt;
</content>
        
    </entry>
    
    <entry xml:lang="en">
        <title>谮言 · 简单的总结</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_Essay/placeholder/"/>
        <id>https://suchaharcan.github.io/01Write_blog_Essay/placeholder/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_Essay/placeholder/">&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;人不能活在别人的评价里&lt;/strong&gt; &lt;br/&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;沉默成本 不参与重大决策&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mac Asesome Software Tool</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/mac-awesome-software-tool/"/>
        <id>https://suchaharcan.github.io/03Share_blog/mac-awesome-software-tool/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/mac-awesome-software-tool/">&lt;h1 id=&quot;net&quot;&gt;Net&lt;/h1&gt;
&lt;h2 id=&quot;vpn-quantumult-x&quot;&gt;VPN - Quantumult X&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;尝试过并排除的方案: 小火箭 ，Surge , Loon;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;fang-huo-qiang-little-snitch&quot;&gt;防火墙 - Little Snitch&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;优点：非VPN情况下，网络设备终端直接屏蔽
路由器为 网络终端， 屏蔽等级 比 设备防火墙 高；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;rss&quot;&gt;RSS&lt;/h1&gt;
&lt;h2 id=&quot;netnewwire&quot;&gt;NetNewWire&lt;/h2&gt;
&lt;h1 id=&quot;twm&quot;&gt;TWM&lt;/h1&gt;
&lt;h2 id=&quot;yabai&quot;&gt;Yabai&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;最新支持系统版本 Mac26;&lt;/p&gt;
&lt;/blockquote&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>常见详细排查命令</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/verbose-debug-command/"/>
        <id>https://suchaharcan.github.io/03Share_blog/verbose-debug-command/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/verbose-debug-command/">&lt;h1 id=&quot;ssh&quot;&gt;SSH&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;ssh 排查 问题&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ssh&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;vvvT&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git@codeberg.org&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;cmake&quot;&gt;CMake&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;cmake 构建 明细排查&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cmake&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-verbose&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;zola&quot;&gt;Zola&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;zola 博客搭建&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;zola&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; check&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  Try to build the project without rendering it. Checks links&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>6.22 – 6.23 验证计划</title>
        <published>2026-06-22T00:00:00+00:00</published>
        <updated>2026-06-22T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/2026-06-22-06-23-0934/"/>
        <id>https://suchaharcan.github.io/kanban/2026-06-22-06-23-0934/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/2026-06-22-06-23-0934/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h2 id=&quot;gao-deng-shu-xue-di-yi-zhang&quot;&gt;高等数学第一章&lt;/h2&gt;
&lt;p&gt;@start 2026-06-22
@due 2026-06-23
@priority 4
@labels red, orange
@top red&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
极限与连续&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
导数基础习题&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;第一章精读，配合习题巩固。&lt;/p&gt;
&lt;h2 id=&quot;cmake-wen-dang-yue-du&quot;&gt;CMake 文档阅读&lt;/h2&gt;
&lt;p&gt;@due 2026-06-23
@priority 3
@labels blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
install / target 章节&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
与 Zola 构建脚本对照&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通读官方文档，记录与当前项目相关的要点。&lt;/p&gt;
&lt;h1 id=&quot;jin-xing-zhong&quot;&gt;进行中&lt;/h1&gt;
&lt;h2 id=&quot;wang-zhan-ban-ben-1-0-fa-bu&quot;&gt;网站版本 1.0 发布&lt;/h2&gt;
&lt;p&gt;@start 2026-06-22
@due 2026-06-23
@priority 5
@labels green, yellow, purple
@bg #E8F5E9
@top green&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
架构文档&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
部署流水线确认&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
发布公告&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;汇总加解密、统计、热力图等模块，准备对外发布。&lt;/p&gt;
&lt;h2 id=&quot;c-20-yu-yan&quot;&gt;C++20 预研&lt;/h2&gt;
&lt;p&gt;@start 2026-06-22
@due 2026-06-23
@priority 3
@labels sky, pink&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
concepts 语法速览&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
ranges 与现有代码对照&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;为后续工程化改造做技术储备。&lt;/p&gt;
&lt;h1 id=&quot;yi-wan-cheng&quot;&gt;已完成&lt;/h1&gt;
&lt;h2 id=&quot;jia-jie-mi-mo-kuai&quot;&gt;加解密模块&lt;/h2&gt;
&lt;p&gt;@priority 4
@labels green&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
构建时加密 content&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
访客幸运解密与管理端解锁&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;wang-zhan-liu-liang-tong-ji-mo-kuai&quot;&gt;网站流量统计模块&lt;/h2&gt;
&lt;p&gt;@priority 3
@labels sky, blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Umami Cloud 接入&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
CSP connect-src 放行&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;re-li-tu-mo-kuai&quot;&gt;热力图模块&lt;/h2&gt;
&lt;p&gt;@priority 4
@labels orange, blue&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
年度按周 · 部分填充&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
月份按天视图&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;guan-li-yuan-mo-shi-yin-cang-an-niu&quot;&gt;管理员模式隐藏按钮&lt;/h2&gt;
&lt;p&gt;@priority 3
@labels pink&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
六连击侧边栏标题&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Edit Post 按钮门控&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;ben-zhou-jia-wu&quot;&gt;本周家务&lt;/h2&gt;
&lt;p&gt;@priority 2
@labels lime&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
整理桌面与备份&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;kan-ban-gong-neng-kai-fa&quot;&gt;看板功能开发&lt;/h2&gt;
&lt;p&gt;@priority 5
@labels yellow, purple&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
规则引擎映射&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Trello 明细页与列表进度条&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-21T19:30:00+00:00</published>
        <updated>2026-06-21T19:30:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-21t19-30-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-21t19-30-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-21t19-30-00z/">&lt;p&gt;2026年06月21日（东八区）&lt;/p&gt;
&lt;h2 id=&quot;gong-neng-diao-shi-edit-post-ti-jiao-hou-kan-ban-ming-xi-kong-bai&quot;&gt;功能调试：Edit Post 提交后看板明细空白&lt;/h2&gt;
&lt;h3 id=&quot;bei-jing&quot;&gt;背景&lt;/h3&gt;
&lt;p&gt;按 &lt;a href=&quot;/nanolog/2026-06-22t12-00-00z/&quot;&gt;v1.0 发布说明&lt;/a&gt;「下次更新计划」第 1 项，测试 &lt;strong&gt;解锁 → 拖拽 → Edit Post → Codeberg 粘贴提交 → ReDeplog 重建&lt;/strong&gt; 全流程。&lt;/p&gt;
&lt;p&gt;触发变更：&lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/SuzhaharCan/SuzhaharCan.codeberg.page/commit/c02b75a4b50681ff31b64843e8e237826ff85aff&quot;&gt;Codeberg commit c02b75a&lt;/a&gt;（更新 &lt;code&gt;kanban/2026-06-16.md&lt;/code&gt;）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;xian-xiang&quot;&gt;现象&lt;/h3&gt;
&lt;p&gt;ld&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;页面&lt;/th&gt;&lt;th&gt;提交前&lt;/th&gt;&lt;th&gt;提交后&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;列表页&lt;/strong&gt; &lt;code&gt;/kanban/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;正常：stats、进度条、星级&lt;/td&gt;&lt;td&gt;正常：待办 3 / 进行中 3 / 进度 60% 已更新&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;明细页&lt;/strong&gt; &lt;code&gt;/kanban/2026-06-16/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;五列 + 卡片 + 拖拽&lt;/td&gt;&lt;td&gt;&lt;strong&gt;空白&lt;/strong&gt;：仅标题与「已锁定」，无列无卡片&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;初看像「映射规则解析失败」，因为明细区完全无 DOM 输出。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;wen-ti-ding-wei&quot;&gt;问题定位&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;排除解析层&lt;/strong&gt;&lt;br /&gt;
用 &lt;code&gt;kanban-rules.js&lt;/code&gt; 对提交后的 &lt;code&gt;kanban/2026-06-16.md&lt;/code&gt; 做 &lt;code&gt;parseMarkdown&lt;/code&gt;：仍得到 &lt;strong&gt;5 列、12 张卡片&lt;/strong&gt;，映射规则本身无异常。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;对比 commit diff&lt;/strong&gt;&lt;br /&gt;
用户粘贴的 Markdown 在 front matter 中&lt;strong&gt;删掉了&lt;/strong&gt;：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;styles&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kanban/style.css&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;scripts&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;js/kanban-rules.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;js/kanban-board.js&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;根因是 &lt;code&gt;serializeMarkdown()&lt;/code&gt; 序列化时&lt;strong&gt;不会写回&lt;/strong&gt;这两项，Edit Post 往返必然丢失。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;脚本加载链&lt;/strong&gt;&lt;br /&gt;
明细页看板 &lt;strong&gt;100% 客户端渲染&lt;/strong&gt;：&lt;code&gt;kanban-board.js&lt;/code&gt; fetch &lt;code&gt;/kanban/&amp;lt;slug&amp;gt;.md&lt;/code&gt; → &lt;code&gt;parseMarkdown&lt;/code&gt; → 写 DOM。&lt;br /&gt;
脚本来源（&lt;code&gt;themes/ametrine&lt;/code&gt; 的 &lt;code&gt;head.html&lt;/code&gt;）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;有 &lt;code&gt;page.extra.scripts&lt;/code&gt; → 用页面级&lt;/li&gt;
&lt;li&gt;否则 → 回退 &lt;code&gt;section.extra.scripts&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;配置&lt;/th&gt;&lt;th&gt;实际加载&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;页面 FM 含 &lt;code&gt;scripts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;kanban-rules.js&lt;/code&gt; + &lt;strong&gt;&lt;code&gt;kanban-board.js&lt;/code&gt;&lt;/strong&gt; ✓&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;页面 FM &lt;strong&gt;无&lt;/strong&gt; &lt;code&gt;scripts&lt;/code&gt;&lt;/td&gt;&lt;td&gt;section 仅 &lt;code&gt;kanban-rules.js&lt;/code&gt; + &lt;code&gt;kanban-list.js&lt;/code&gt; ✗ &lt;strong&gt;缺 board.js&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;列表页只需 &lt;code&gt;kanban-list.js&lt;/code&gt;，故列表正常；明细页缺 &lt;code&gt;kanban-board.js&lt;/code&gt;，故空白。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;jie-jue-si-lu&quot;&gt;解决思路&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;原则&lt;/strong&gt;：明细页核心脚本不应依赖 front matter 是否被 Edit Post 保留。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;
模板内固定注入 &lt;code&gt;kanban-rules.js&lt;/code&gt; + &lt;code&gt;kanban-board.js&lt;/code&gt;（与已有 inline &lt;code&gt;kanban/style.css&lt;/code&gt; 一致），脱离 &lt;code&gt;page.extra.scripts&lt;/code&gt;。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/strong&gt;&lt;br /&gt;
解析结果 &lt;code&gt;columns&lt;/code&gt; 为空时，在 &lt;code&gt;#kanban-status&lt;/code&gt; 输出明确错误，便于与「脚本未加载」区分。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;正反映射&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;parseMarkdown&lt;/code&gt; → &lt;code&gt;serializeMarkdown&lt;/code&gt; → &lt;code&gt;parseMarkdown&lt;/code&gt; 往返：列/卡片/stats 保持一致；FM 的 &lt;code&gt;styles&lt;/code&gt;/&lt;code&gt;scripts&lt;/code&gt; 非看板数据，不写入序列化输出，避免与模板重复加载。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;xiu-gai-wen-jian&quot;&gt;修改文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;变更&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;文末 &lt;code&gt;&amp;lt;script defer&amp;gt;&lt;/code&gt; 加载 rules + board&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;空解析结果时 status 报错&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;yan-zheng&quot;&gt;验证&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Node 往返：5 列 → 5 列，12 卡 → 12 卡&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zola build --force&lt;/code&gt; 通过；产物 &lt;code&gt;/kanban/2026-06-16/&lt;/code&gt; 含 &lt;code&gt;kanban-board.js&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;部署后：即使 FM 无 &lt;code&gt;scripts&lt;/code&gt;（与远程 commit 一致），明细页也应正常渲染&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h3 id=&quot;jing-yan&quot;&gt;经验&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;列表与明细共用 section，但脚本需求不同&lt;/strong&gt; → 明细模板应自包含，不能假设 page FM 永远完整。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Edit Post 是数据回写路径&lt;/strong&gt; → 序列化只负责看板 Markdown 本体；运行时依赖放模板/静态层更稳。&lt;/li&gt;
&lt;li&gt;排查时先区分「&lt;strong&gt;没加载 JS&lt;/strong&gt;」与「&lt;strong&gt;JS 加载但解析失败&lt;/strong&gt;」：前者 DOM 容器空、无报错；后者可在 status / console 看到线索。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;相关链接：&lt;a href=&quot;/kanban/kanban-mapping.md&quot;&gt;映射说明&lt;/a&gt; · &lt;a href=&quot;/kanban/2026-06-16/&quot;&gt;示例看板&lt;/a&gt; · &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://codeberg.org/SuzhaharCan/SuzhaharCan.codeberg.page/commit/c02b75a4b50681ff31b64843e8e237826ff85aff&quot;&gt;问题 commit&lt;/a&gt;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-21T08:30:00+00:00</published>
        <updated>2026-06-21T08:30:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-21t08-30-00z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-21t08-30-00z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-21t08-30-00z/">&lt;p&gt;2026年06月21日&lt;/p&gt;
&lt;h2 id=&quot;gong-neng-geng-xin-wen-zhang-fa-bu-re-li-tu-contribution-heatmap&quot;&gt;功能更新：文章发布热力图 (Contribution Heatmap)&lt;/h2&gt;
&lt;h3 id=&quot;gai-shu&quot;&gt;概述&lt;/h3&gt;
&lt;p&gt;新增基于全站文章数据的 GitHub 风格热力图组件，支持在文章页与归档页以不同尺寸和配色展示写作活跃度。&lt;/p&gt;
&lt;h3 id=&quot;he-xin-neng-li&quot;&gt;核心能力&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;双模式展示&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;文章页 (&lt;code&gt;article&lt;/code&gt;)&lt;/strong&gt;：右侧 &lt;code&gt;sticky&lt;/code&gt; 固定，仅显示&lt;strong&gt;上个月 + 本月&lt;/strong&gt;；深紫背景、淡紫渐变格点，参考 GitHub 紧凑尺寸。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;归档页 (&lt;code&gt;archive&lt;/code&gt;)&lt;/strong&gt;：插入于 &lt;code&gt;Total: N posts&lt;/code&gt; 与分隔线之间，展示&lt;strong&gt;当年&lt;/strong&gt;完整热力图；GitHub 标准绿色配色。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;交互&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;悬浮：显示当天&lt;strong&gt;标签数最多&lt;/strong&gt;的文章标题（同天多篇时按 &lt;code&gt;tags&lt;/code&gt; 数量降序取首篇）。&lt;/li&gt;
&lt;li&gt;点击：跳转至对应文章。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;模块化文件&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;templates/partials/heatmap_component.html&lt;/code&gt; — 聚合各板块文章数据并渲染容器&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/css/heatmap.css&lt;/code&gt; — 布局与双主题样式&lt;/li&gt;
&lt;li&gt;&lt;code&gt;static/js/heatmap-init.js&lt;/code&gt; — 轻量渲染逻辑（无 Heat.js 重型 UI）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;ji-cheng-fang-shi&quot;&gt;集成方式&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;文章页&lt;/strong&gt;（&lt;code&gt;templates/article.html&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;aside class=&amp;quot;article-heatmap-sidebar&amp;quot;&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {% set heatmap_mode = &amp;quot;article&amp;quot; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  {% include &amp;quot;partials/heatmap_component.html&amp;quot; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&amp;lt;/aside&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;归档页&lt;/strong&gt;（&lt;code&gt;templates/archive.html&lt;/code&gt;）：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% set heatmap_mode = &amp;quot;archive&amp;quot; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;{% include &amp;quot;partials/heatmap_component.html&amp;quot; %}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;she-ji-shuo-ming&quot;&gt;设计说明&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;放弃 Heat.js 默认「Heat.js [ Map ]」大标题 UI，改用自研紧凑渲染，更接近 GitHub Contributions 视觉。&lt;/li&gt;
&lt;li&gt;移动端（≤960px）热力图自动移至正文上方，避免遮挡阅读。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;qi-yong-zhu-ti-nei-zhi-shu-ju-tong-ji-gong-neng&quot;&gt;启用  主题内置 数据统计功能；&lt;/h3&gt;
&lt;p&gt;[extra.analytics]
service = “umami”
id = “cdf54193-b449-4454-884b-029e82434c32”
self_hosted_url = “https://suchaharcan.github.io”
exclude_hash = true&lt;/p&gt;
&lt;p&gt;https://cloud.umami.is/share/2hWVbYvlPUkk98Yz 是数据分享页面&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-21T07:49:32+00:00</published>
        <updated>2026-06-21T07:49:32+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-21t07-49-32z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-21t07-49-32z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-21t07-49-32z/">&lt;p&gt;2026年06月21日&lt;/p&gt;
&lt;p&gt;功能模块说明：智能滚动导航组件 (Smart Scroll-Navigation)&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;概述
本组件是一个常驻于页面右下角的圆形交互按钮，集成了全屏滚动进度展示与双向智能导航功能。它能够根据用户的阅读深度，动态调整自身视觉形态与交互行为。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;核心交互机制
该模块基于页面滚动深度（Scroll Progress）实现智能状态切换：&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;视觉状态同步：&lt;/p&gt;
&lt;p&gt;顶部进度条：固定于视窗顶部的 3px 极细线性进度条，同步反馈阅读进度。&lt;/p&gt;
&lt;p&gt;环形按钮进度：按钮外圈环绕的 SVG 进度条与顶部进度条完全同步，保证视觉一致性。&lt;/p&gt;
&lt;p&gt;统一圆形形态：按钮采用 border-radius: 50% 设计，内部进度条绕圆心延伸，无视觉断层。&lt;/p&gt;
&lt;p&gt;上下文智能导航：&lt;/p&gt;
&lt;p&gt;区域 A（阅读深度 &amp;lt; 50%）：组件处于“向下”状态，箭头指向底部。点击触发 smooth scroll 至页面尾部，方便用户快速跳过开头进入正文或评论区。&lt;/p&gt;
&lt;p&gt;区域 B（阅读深度 &amp;gt; 50%）：组件处于“向上”状态，箭头翻转 180 度指向顶部。点击触发 smooth scroll 至页面头部，方便用户回溯文章。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;架构方案
本功能采用轻量级模块化设计，无外部依赖，确保页面加载性能：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;HTML (Partial)：负责结构定义，通过 partials 引入，实现代码解耦。&lt;/p&gt;
&lt;p&gt;CSS (Static)：采用 CSS Flexbox 实现内容垂直居中，利用 SVG stroke-dasharray 属性实现环形进度条的高性能渲染。&lt;/p&gt;
&lt;p&gt;JavaScript (Static)：通过 requestAnimationFrame 优化滚动监听性能，利用 dataset 属性安全管理组件的导航方向状态。&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;应用场景与设计哲学
极简审美：摒弃传统“回顶按钮”单一、生硬的交互，将阅读感知融入组件中。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;空间优化：将进度反馈与导航功能合并，减少 UI 元素对屏幕空间的占用。&lt;/p&gt;
&lt;p&gt;自适应体验：逻辑完全基于 scrollHeight 动态计算，无论是几百字的小短文还是长篇技术分析，导航阈值均能自动适配，无需手动维护。&lt;/p&gt;
&lt;p&gt;安装与集成提示
模块引入：在你的 article.html 中通过 {% include “partials/scroll-progress-bar.html” %} 引入结构。&lt;/p&gt;
&lt;p&gt;资源引用：在模板的头部引入 scroll-progress-bar.css，底部引入 scroll-progress-bar.js。&lt;/p&gt;
&lt;p&gt;性能保障：由于使用了 requestAnimationFrame，即使在复杂的长文档页面中，该组件也不会导致页面滚动时的视觉卡顿，满足极客对高性能页面的要求。&lt;/p&gt;
&lt;p&gt;如果你需要将此模块部署到其他页面（如 index.html 或 archive.html），只需在相应模板中重复以上引用步骤即可。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>看板 Markdown 映射说明</title>
        <published>2026-06-21T00:00:00+00:00</published>
        <updated>2026-06-21T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/kanban-mapping/"/>
        <id>https://suchaharcan.github.io/kanban/kanban-mapping/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/kanban-mapping/">&lt;h1 id=&quot;zhou-ji-hua-kan-ban-markdown-ying-she-shuo-ming&quot;&gt;周计划看板 · Markdown 映射说明&lt;/h1&gt;
&lt;p&gt;看板数据统一存放在 &lt;strong&gt;&lt;code&gt;content/kanban/&lt;/code&gt;&lt;/strong&gt;（&lt;strong&gt;一个 &lt;code&gt;.md&lt;/code&gt; 文件 = 一个自然周，或单日「上午 / 下午 / 晚上」时段看板&lt;/strong&gt;）。&lt;br /&gt;
Zola 构建时将原始 Markdown 内嵌到页面，规则引擎直接解析，无需 &lt;code&gt;static/&lt;/code&gt; 副本。&lt;/p&gt;
&lt;h2 id=&quot;wen-jian-ming-ming&quot;&gt;文件命名&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;规则&lt;/th&gt;&lt;th&gt;示例&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;多天（跨天周计划）&lt;/strong&gt;：&lt;code&gt;周开始-周结束(月-日)-打开编辑器时的时分&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-16-06-22-2236.md&lt;/code&gt;（= 6.16 – 6.22，22:36 打开 GUI）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;单日「全天」&lt;/strong&gt;（不选时段）：&lt;code&gt;周开始&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;单日 + 时段&lt;/strong&gt;：&lt;code&gt;周开始_时段&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_上午.md&lt;/code&gt; / &lt;code&gt;2026-10-13_下午.md&lt;/code&gt; / &lt;code&gt;2026-10-13_晚上.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;修改已有看板&lt;/td&gt;&lt;td&gt;沿用原文件名，不会因为改内容而改 URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;路径&lt;/td&gt;&lt;td&gt;&lt;code&gt;content/kanban/&amp;lt;文件名&amp;gt;.md&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;文件名同时是「生成并复制到剪贴板 / 同步到仓库」时提示的目标文件名（新建时按上面的规则生成，时分取自&lt;strong&gt;打开 GUI 编辑器的那一刻&lt;/strong&gt;，编辑过程中不再变化）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;URL 唯一性（重要）&lt;/strong&gt;：Zola 会把文件名开头的 &lt;code&gt;YYYY-MM-DD&lt;/code&gt; 当成页面日期并从 slug 中&lt;strong&gt;剥离&lt;/strong&gt;，只剩余下部分参与 URL。因此每块看板都在 front matter 里显式写 &lt;code&gt;slug&lt;/code&gt;（= URL 安全化的文件名），否则会出现两类事故：不同日期的同一时段撞车（&lt;code&gt;2026-08-11_晚上.md&lt;/code&gt; 与 &lt;code&gt;2026-10-13_晚上.md&lt;/code&gt; 都会变成 &lt;code&gt;/kanban/wan-shang/&lt;/code&gt;，构建报 &lt;code&gt;Found path collisions&lt;/code&gt;）；多天与单日「全天」也会混淆。GUI 新建 / 编辑时都会自动写入 &lt;code&gt;slug&lt;/code&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;看板类型&lt;/th&gt;&lt;th&gt;文件名&lt;/th&gt;&lt;th&gt;生成的 URL&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;多天（跨天周计划）&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-06-16-06-22-2236.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-06-16-06-22-2236/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日「全天」（不选时段）&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 上午&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_上午.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-shang-wu/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 下午&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_下午.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-xia-wu/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;单日 晚上&lt;/td&gt;&lt;td&gt;&lt;code&gt;2026-10-13_晚上.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;/kanban/2026-10-13-wan-shang/&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;因为多天看板的文件名带上了结束日期与创建时分，&lt;strong&gt;多天、全天、上午、下午、晚上这五类看板可以在同一天共存，且 URL 各自唯一&lt;/strong&gt;。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;历史文件&lt;/strong&gt;：2026-06/07 创建的 4 块多天看板已统一迁移为新命名（&lt;code&gt;2026-06-16-06-22-0934.md&lt;/code&gt; 等），
并在 front matter 里加了 &lt;code&gt;slug&lt;/code&gt;（新 URL）与 &lt;code&gt;aliases&lt;/code&gt;（旧 URL），老链接照常可访问；
用 GUI 修改这些看板并保存时，&lt;code&gt;slug&lt;/code&gt; 与 &lt;code&gt;aliases&lt;/code&gt; 都会被保留。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;bian-ji-shi-de-suo-ding-gui-ze&quot;&gt;编辑时的锁定规则&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;看板类型&lt;/th&gt;&lt;th&gt;周开始&lt;/th&gt;&lt;th&gt;周结束&lt;/th&gt;&lt;th&gt;时段&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;单日（含「全天」）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;td&gt;&lt;strong&gt;锁定&lt;/strong&gt;（起止同一天）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;多天（跨天）&lt;/td&gt;&lt;td&gt;锁定&lt;/td&gt;&lt;td&gt;可改（开始 +13 天以内）&lt;/td&gt;&lt;td&gt;不适用&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;blockquote&gt;
&lt;p&gt;修改已有看板时不会重命名文件、也不会改写已有 &lt;code&gt;slug&lt;/code&gt;，因此 URL 保持稳定。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;xin-jian-shi-de-zhong-fu-ti-shi&quot;&gt;新建时的重复提示&lt;/h3&gt;
&lt;p&gt;新建看板时，如果所选时间段与&lt;strong&gt;已有看板重叠&lt;/strong&gt;，编辑面板会直接提示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完全相同（起止一致）→ 「该时间段已有看板：&amp;lt;核心任务&amp;gt;（起 ~ 止），建议到列表里点它的「✎ 编辑」修改，而不是新建。」&lt;br/&gt;&lt;/li&gt;
&lt;li&gt;部分重叠 → 「该时间段与已有看板重叠：&amp;lt;核心任务&amp;gt;（起 ~ 止），继续新建会同时存在两块时间重叠的看板。」&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;提示数据来自列表页内嵌的看板清单，随你调整起止日期实时更新；修改已有看板时不会出现该提示。&lt;/p&gt;
&lt;h2 id=&quot;front-matter-ye-mian-yuan-shu-ju&quot;&gt;Front Matter（页面元数据）&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;6.16 – 6.22 周计划&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;description&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;列表页摘要，可选&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-06-16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kanban.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-06-16&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_end&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-06-22&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;core_tasks&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;本周核心任务一句话&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;stats&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;span&gt; total&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 8&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; done&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; todo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;,&lt;/span&gt;&lt;span&gt; doing&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;单日看板（带时段）额外写一行 &lt;code&gt;slug&lt;/code&gt;，GUI 新建 / 编辑时会自动带上：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;toml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;title&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-10-13 晚上 计划&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;date&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span&gt; 2026-10-13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;slug&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-10-13-wan-shang&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;template&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;kanban.html&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;extra&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_start&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-10-13&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;week_end&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2026-10-13&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;period&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;晚上&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-l-u z-d-9 z-d-i z-d-u&quot;&gt;+++&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;字段&lt;/th&gt;&lt;th&gt;说明&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;week_start&lt;/code&gt; / &lt;code&gt;week_end&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;顶格时间约束&lt;/strong&gt;：必须优先设置；跨度 &lt;strong&gt;1 ~ 14 天&lt;/strong&gt;（默认新建 = 今日到今日）；修改已有看板时 &lt;code&gt;week_start&lt;/code&gt; &lt;strong&gt;锁定&lt;/strong&gt;，单日看板 &lt;code&gt;week_end&lt;/code&gt; 一并锁定、多天看板 &lt;code&gt;week_end&lt;/code&gt; 最大为开始 +13 天；全部卡片的 &lt;code&gt;@start&lt;/code&gt; / &lt;code&gt;@due&lt;/code&gt; 必须落在该区间内（GUI 编辑器校验并限制日期选择）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;period&lt;/code&gt;&lt;/td&gt;&lt;td&gt;时段：&lt;code&gt;上午&lt;/code&gt; / &lt;code&gt;下午&lt;/code&gt; / &lt;code&gt;晚上&lt;/code&gt;（仅单天看板参与文件名与 URL；配合自动生成的 &lt;code&gt;slug&lt;/code&gt; 保证同日多看板 URL 唯一）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;slug&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;看板 URL&lt;/strong&gt;（= URL 安全化的文件名）：多天 &lt;code&gt;2026-06-16-06-22-2236&lt;/code&gt;、全天 &lt;code&gt;2026-10-13&lt;/code&gt;、时段 &lt;code&gt;2026-10-13-wan-shang&lt;/code&gt;。GUI 新建、编辑时自动写入；手写文件时必须自己补，否则会和其它看板撞 URL&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;core_tasks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表卡片展示的核心任务&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;board_bg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板背景（预置色名或 &lt;code&gt;#RRGGBB&lt;/code&gt; / &lt;code&gt;gradient(...)&lt;/code&gt;，Trello 风格）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;favorite&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;true&lt;/code&gt; / &lt;code&gt;false&lt;/code&gt;，看板标题旁星标收藏（需保存生效）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;stats&lt;/code&gt;&lt;/td&gt;&lt;td&gt;进度统计（按列名自动计算）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;jie-gou-ying-she&quot;&gt;结构映射&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;Markdown&lt;/th&gt;&lt;th&gt;看板元素&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;# 列表名&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;一列&lt;/strong&gt;（待办 / 进行中 / 已完成 / 资源 / 目标）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;## 卡片标题&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;一张卡片&lt;/strong&gt;，归属上方最近的 &lt;code&gt;#&lt;/code&gt; 列表&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;列顺序 = 文件中 &lt;code&gt;#&lt;/code&gt; 出现顺序。&lt;br /&gt;
卡片顺序 = 各列内 &lt;code&gt;##&lt;/code&gt; 出现顺序。&lt;/p&gt;
&lt;p&gt;列表级可选指令（写在 &lt;code&gt;# 列名&lt;/code&gt; 之后、第一张卡片之前）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指令&lt;/th&gt;&lt;th&gt;语法&lt;/th&gt;&lt;th&gt;看板表现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;列内排序&lt;/td&gt;&lt;td&gt;&lt;code&gt;@sort manual / due / priority / title / checklist&lt;/code&gt;&lt;/td&gt;&lt;td&gt;明细页按该规则排序显示（默认 manual）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;排序方向&lt;/td&gt;&lt;td&gt;&lt;code&gt;@sort-order asc / desc&lt;/code&gt;&lt;/td&gt;&lt;td&gt;升序（默认）/ 降序&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;qia-pian-shu-xing-gui-ze-yin-qing-zhi-ling&quot;&gt;卡片属性 · 规则引擎指令&lt;/h2&gt;
&lt;p&gt;指令单独占一行，写在 &lt;code&gt;## 标题&lt;/code&gt; 之后、正文之前。以 &lt;code&gt;@&lt;/code&gt; 开头，&lt;strong&gt;大小写不敏感&lt;/strong&gt;。&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;指令&lt;/th&gt;&lt;th&gt;语法&lt;/th&gt;&lt;th&gt;看板表现&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;截止日期&lt;/td&gt;&lt;td&gt;&lt;code&gt;@due 2026-06-20&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片底部截止图标 + 日期&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;开始日期&lt;/td&gt;&lt;td&gt;&lt;code&gt;@start 2026-06-16&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片底部开始图标 + 日期&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;重要等级&lt;/td&gt;&lt;td&gt;&lt;code&gt;@priority 4&lt;/code&gt; 或 &lt;code&gt;@importance 4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1–5 星（淡黄色，满星填充）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;目标类型&lt;/td&gt;&lt;td&gt;&lt;code&gt;@goal complete&lt;/code&gt; / &lt;code&gt;@goal risk&lt;/code&gt;&lt;/td&gt;&lt;td&gt;目标看板：完成效果（淡蓝）/ 未完成后果（灰爆）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;颜色标签&lt;/td&gt;&lt;td&gt;&lt;code&gt;@labels red, blue&lt;/code&gt; 或 &lt;code&gt;@label green&lt;/code&gt;&lt;/td&gt;&lt;td&gt;明细页顶栏色条（权重 n）；列表页不显示&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;顶栏色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@top red&lt;/code&gt; 或 &lt;code&gt;@top orange&lt;/code&gt;&lt;/td&gt;&lt;td&gt;明细页卡片顶部粗色条（Trello 顶栏）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;封面尺寸&lt;/td&gt;&lt;td&gt;&lt;code&gt;@cover half&lt;/code&gt; / &lt;code&gt;@cover full&lt;/code&gt;&lt;/td&gt;&lt;td&gt;半封面（默认）= 顶部色条；&lt;strong&gt;全封面 = 整卡背景着色&lt;/strong&gt;（浅色自动深字）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;完成状态&lt;/td&gt;&lt;td&gt;&lt;code&gt;@done&lt;/code&gt; 或 &lt;code&gt;@complete&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片正面打勾、标题划线、截止徽标变绿（Trello “标记完成”）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;置顶&lt;/td&gt;&lt;td&gt;&lt;code&gt;@pin&lt;/code&gt; 或 &lt;code&gt;@置顶&lt;/code&gt;&lt;/td&gt;&lt;td&gt;同一列表可多卡片置顶；置顶卡片优先显示，卡片带 📌 徽标&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;背景封面色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@bg orange&lt;/code&gt; 或 &lt;code&gt;@bg #FFE0B2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片封面：半封面 = 顶部色条；配合 &lt;code&gt;@cover full&lt;/code&gt; = 整卡背景着色&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;顶栏色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@top red&lt;/code&gt; 或 &lt;code&gt;@top #E53935&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片顶部细色条（Trello 顶栏）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;勾选框&lt;/td&gt;&lt;td&gt;&lt;code&gt;- [ ] 未完成&lt;/code&gt; / &lt;code&gt;- [x] 已完成&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片内 checklist&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;yu-zhi-biao-qian-se-ming&quot;&gt;预置标签色名&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;red&lt;/code&gt; · &lt;code&gt;orange&lt;/code&gt; · &lt;code&gt;yellow&lt;/code&gt; · &lt;code&gt;green&lt;/code&gt; · &lt;code&gt;blue&lt;/code&gt; · &lt;code&gt;purple&lt;/code&gt; · &lt;code&gt;pink&lt;/code&gt; · &lt;code&gt;sky&lt;/code&gt; · &lt;code&gt;lime&lt;/code&gt; · &lt;code&gt;black&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;也支持 &lt;code&gt;#RGB&lt;/code&gt; / &lt;code&gt;#RRGGBB&lt;/code&gt; 十六进制。&lt;/p&gt;
&lt;h3 id=&quot;miao-shu-zheng-wen&quot;&gt;描述正文&lt;/h3&gt;
&lt;p&gt;除 &lt;code&gt;@&lt;/code&gt; 指令与 checkbox 行以外的 Markdown（段落、列表、加粗等）→ 卡片&lt;strong&gt;描述区&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;wan-zheng-shi-li&quot;&gt;完整示例&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;markdown&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 待办&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;##&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 规则引擎文档&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@due 2026-06-18&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@labels blue, green&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@top purple&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span&gt; [ ] 编写 kanban-rules.js&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span&gt; [ ] 补充映射说明&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;完成 &lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span class=&quot; z-l-b z-d-b&quot;&gt;Markdown ↔ 看板&lt;/span&gt;&lt;span class=&quot;z-l-5 z-l-b z-d-4 z-d-b&quot;&gt;**&lt;/span&gt;&lt;span&gt; 双向转换说明。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 进行中&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;##&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 看板 UI&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@bg #FFF3E0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@top orange&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@due 2026-06-20&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; Trello 列布局&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span&gt; [ ] 拖拽交互&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 已完成&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;##&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 需求梳理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;@labels green&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;-&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span&gt; 对齐 article / nanolog 结构&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;bian-ji-fang-shi&quot;&gt;编辑方式&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;状态&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;锁定&lt;/strong&gt;（默认）&lt;/td&gt;&lt;td&gt;不可拖拽；隐藏 ReDeplog / Edit Post / 映射说明&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;解锁&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;仅在 &lt;code&gt;week_start&lt;/code&gt;～&lt;code&gt;week_end&lt;/code&gt; 窗口内可切换；可拖拽卡片跨列（本地预览）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;保存&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;点击 &lt;strong&gt;Edit Post&lt;/strong&gt;：先将当前看板按映射规则序列化写入 &lt;code&gt;content/kanban/_edit-buffer.md&lt;/code&gt;（缓冲），再覆盖 &lt;code&gt;content/kanban/&amp;lt;周&amp;gt;.md&lt;/code&gt;；无 Token 时复制到剪贴板并在 Codeberg 编辑器粘贴&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;strong&gt;超期&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;截止日 &lt;code&gt;week_end&lt;/code&gt; 当日 &lt;strong&gt;23:00&lt;/strong&gt;（站点 &lt;code&gt;zola.toml&lt;/code&gt; → &lt;code&gt;extra.timezone&lt;/code&gt;）之后永久只读，无法解锁&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;kan-ban-xiang-qing-ye-trello-dui-qi&quot;&gt;看板详情页（Trello 对齐）&lt;/h2&gt;
&lt;p&gt;明细页 UI 全盘参考 Trello 重构：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;区域&lt;/th&gt;&lt;th&gt;行为&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;看板头部&lt;/td&gt;&lt;td&gt;返回链接 · 标题 · &lt;strong&gt;收藏星标&lt;/strong&gt;（&lt;code&gt;extra.favorite&lt;/code&gt;）· 开始/截止/剩余天数/进度/星级 元信息行&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;背景&lt;/td&gt;&lt;td&gt;由 &lt;code&gt;extra.board_bg&lt;/code&gt; 控制；菜单 → 背景 可快速切换 12 种预置渐变（需保存生效）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;工具栏&lt;/td&gt;&lt;td&gt;锁定 / &lt;strong&gt;筛选&lt;/strong&gt;（快捷键 &lt;code&gt;F&lt;/code&gt;）/ &lt;strong&gt;菜单&lt;/strong&gt; / GUI 编辑 / Edit Post / ReDeplog / 映射说明&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;筛选&lt;/td&gt;&lt;td&gt;关键词 + 标签 + 截止状态（已逾期/即将到期/无截止）+ 最低优先级 + 隐藏已完成；列计数显示 &lt;code&gt;可见/总数&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列&lt;/td&gt;&lt;td&gt;头部 = 列名 + 计数 + &lt;code&gt;⋯&lt;/code&gt; 菜单（添加卡片 / 排序 / 重命名 / 删除列）；解锁后可拖拽列头调整顺序&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;卡片正面&lt;/td&gt;&lt;td&gt;标签药丸（带文字）· 封面（&lt;code&gt;@bg&lt;/code&gt; + &lt;code&gt;@cover&lt;/code&gt;）· 完成圆圈（&lt;code&gt;@due&lt;/code&gt; 时显示，切换 &lt;code&gt;@done&lt;/code&gt;）· 置顶 📌 徽标（&lt;code&gt;@pin&lt;/code&gt;）· 徽标行（描述/开始/截止/清单进度/优先级）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;截止徽标&lt;/td&gt;&lt;td&gt;按 Trello 色义：灰色（未到）· 黄（今天/即将到期）· 红（逾期）· 粉（逾期超 1 天）· 绿（已完成）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;菜单抽屉&lt;/td&gt;&lt;td&gt;关于此看板（进度条）· 背景色板 · 搜索卡片（回车进入筛选）· 更多（GUI 编辑 / 保存 / ReDeplog / 映射说明）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;快捷添加&lt;/td&gt;&lt;td&gt;解锁后每列底部「＋ 添加卡片」、看板右侧「＋ 添加列表」，回车即插入（保存走 Edit Post）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;以上所有本地修改都会提示“有未保存的本地修改”，统一通过 &lt;strong&gt;Edit Post&lt;/strong&gt; 序列化保存。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;gui-bian-ji-qi-xin-jian-xiu-gai-kan-ban&quot;&gt;GUI 编辑器（新建 / 修改看板）&lt;/h2&gt;
&lt;p&gt;除了直接编写 Markdown，看板提供 &lt;strong&gt;GUI 方式&lt;/strong&gt;生成 / 修改：按「看板图标 / 指令的可选值」用&lt;strong&gt;下拉框或手动输入&lt;/strong&gt;设置，自动生成 Markdown。&lt;/p&gt;
&lt;h3 id=&quot;bu-ju-trello-feng-ge-hua-bu-jian-cha-qi&quot;&gt;布局（Trello 风格：画布 + 检查器）&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;左侧画布&lt;/strong&gt;：实时渲染当前看板（背景、列、卡片封面/标签/徽标），点击列或卡片即可选中编辑；底部/右侧可「添加列表」「添加卡片」。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;右侧检查器&lt;/strong&gt;：根据选中对象切换编辑面板：
&lt;ul&gt;
&lt;li&gt;未选中（看板）：&lt;strong&gt;周起止（顶格时间：先设置；1–14 天；新建默认今日；修改时开始锁定）&lt;/strong&gt; / &lt;strong&gt;时段 period（单天唯一性）&lt;/strong&gt; / 核心任务 / 标题 / 描述 / 星级 / 收藏 / &lt;strong&gt;看板背景色板&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;选中列表：列名 / &lt;code&gt;@sort&lt;/code&gt; 排序 / &lt;code&gt;@sort-order&lt;/code&gt; 方向 / 添加卡片 / 上移下移 / 删除列 / 卡片列表；&lt;/li&gt;
&lt;li&gt;选中卡片：标题 / 开始 / 截止（&lt;strong&gt;新建时默认按创建时间=今日填充，可编辑但限制在周起止区间内&lt;/strong&gt;）/ 优先级 / 目标 / &lt;strong&gt;封面&lt;/strong&gt;（&lt;code&gt;@bg&lt;/code&gt; + &lt;code&gt;@cover&lt;/code&gt;）/ 顶栏色 / 标签 / 完成 &lt;code&gt;@done&lt;/code&gt; / &lt;strong&gt;置顶 &lt;code&gt;@pin&lt;/code&gt;&lt;/strong&gt; / 勾选清单 / 描述。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Markdown 预览&lt;/strong&gt;：底部可折叠，输入时实时更新。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;ru-kou&quot;&gt;入口&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;位置&lt;/th&gt;&lt;th&gt;按钮&lt;/th&gt;&lt;th&gt;模式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;列表页 &lt;code&gt;/kanban/&lt;/code&gt; 页头&lt;/td&gt;&lt;td&gt;&lt;strong&gt;＋ 新建看板&lt;/strong&gt;（管理员可见；Mac-Chrome 浏览器也可见）&lt;/td&gt;&lt;td&gt;新建：默认 &lt;strong&gt;今日 → 今日&lt;/strong&gt;（单天，按当前时间预选 上午/下午/晚上）+ 六列（待办 / 进行中 / 已完成 / 进度 / 资源 / 目标）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列表页每张周卡片&lt;/td&gt;&lt;td&gt;&lt;strong&gt;✎ 编辑&lt;/strong&gt;（管理员可见）&lt;/td&gt;&lt;td&gt;修改：读取该周已有 Markdown 载入表单&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;明细页工具栏（解锁后）&lt;/td&gt;&lt;td&gt;&lt;strong&gt;GUI 编辑&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;修改：读取当前看板载入表单&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;zi-duan-yu-zhi-ling-dui-ying-mei-ge-tu-biao-de-ke-xuan-zhi&quot;&gt;字段与指令对应（每个“图标“的可选值）&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;表单字段&lt;/th&gt;&lt;th&gt;生成指令&lt;/th&gt;&lt;th&gt;输入方式&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;开始日期&lt;/td&gt;&lt;td&gt;&lt;code&gt;@start YYYY-MM-DD&lt;/code&gt;&lt;/td&gt;&lt;td&gt;日期下拉（默认按创建时间=今日填充，限 [week_start, week_end]）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;截止日期&lt;/td&gt;&lt;td&gt;&lt;code&gt;@due YYYY-MM-DD&lt;/code&gt;&lt;/td&gt;&lt;td&gt;日期下拉（默认按创建时间=今日填充，限 [week_start, week_end]）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;重要等级&lt;/td&gt;&lt;td&gt;&lt;code&gt;@priority 1–5&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下拉（1–5 星 / 无）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;目标类型&lt;/td&gt;&lt;td&gt;&lt;code&gt;@goal complete / risk&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下拉（完成效果 / 未完成后果 / 无）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;颜色标签&lt;/td&gt;&lt;td&gt;&lt;code&gt;@labels red, blue, …&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预设色块多选 + 手输自定义（&lt;code&gt;#RRGGBB&lt;/code&gt; 或颜色名，逗号分隔）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;背景封面色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@bg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预设色名下拉 + 自定义色值手输 + 实时色块（Trello 封面）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;封面尺寸&lt;/td&gt;&lt;td&gt;&lt;code&gt;@cover&lt;/code&gt;&lt;/td&gt;&lt;td&gt;下拉（默认半封面 / 全封面）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;顶栏色&lt;/td&gt;&lt;td&gt;&lt;code&gt;@top&lt;/code&gt;&lt;/td&gt;&lt;td&gt;预设色名下拉 + 自定义色值手输 + 实时色块&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;完成状态&lt;/td&gt;&lt;td&gt;&lt;code&gt;@done&lt;/code&gt;&lt;/td&gt;&lt;td&gt;复选框&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;置顶&lt;/td&gt;&lt;td&gt;&lt;code&gt;@pin&lt;/code&gt;&lt;/td&gt;&lt;td&gt;卡片面板「置顶 / 解除置顶」按钮；同一列表可多卡片置顶&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;勾选清单&lt;/td&gt;&lt;td&gt;&lt;code&gt;- [ ] / - [x]&lt;/code&gt;&lt;/td&gt;&lt;td&gt;逐行添加：勾选状态 + 文本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;描述正文&lt;/td&gt;&lt;td&gt;其余 Markdown&lt;/td&gt;&lt;td&gt;多行文本&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;列&lt;/td&gt;&lt;td&gt;&lt;code&gt;# 列名&lt;/code&gt; + &lt;code&gt;@sort&lt;/code&gt; / &lt;code&gt;@sort-order&lt;/code&gt;&lt;/td&gt;&lt;td&gt;画布添加/删除 + 检查器列名/排序&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;周起止 / 核心任务 / 星级&lt;/td&gt;&lt;td&gt;Front Matter&lt;/td&gt;&lt;td&gt;日期 / 文本 / 下拉&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;看板背景 / 收藏&lt;/td&gt;&lt;td&gt;Front Matter&lt;/td&gt;&lt;td&gt;背景色板 / 复选框&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;时段 period&lt;/td&gt;&lt;td&gt;Front Matter（单天命名）&lt;/td&gt;&lt;td&gt;下拉：无 / 上午 / 下午 / 晚上&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;mo-ren-xin-jian-bu-ju&quot;&gt;默认新建布局&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;待办    进行中    已完成    进度        ← 主流程列（竖向一排）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;资源    目标                             ← 底部并排一行&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;进度列&lt;/strong&gt;：从 &lt;code&gt;week_start&lt;/code&gt; 到 &lt;code&gt;week_end&lt;/code&gt; 每一天生成一张卡片（标题如 &lt;code&gt;07-13 周一&lt;/code&gt;），每张默认含一条勾选清单「记录当日完成内容」（可勾选 / 划线）；&lt;/li&gt;
&lt;li&gt;修改顶格时间且进度列仍为自动生成样式（标题匹配 &lt;code&gt;MM-DD 周X&lt;/code&gt;）时，编辑器会自动重排天数；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;置顶&lt;/strong&gt;：置顶卡片始终显示在同列表顶部（多个可同时置顶），卡片正面带 📌 徽标；解锁模式下每张卡片都有「📌 置顶 / 📌 置顶中」切换按钮，点击即置顶/取消置顶；GUI 编辑器卡片面板同样提供按钮。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&quot;sheng-cheng-jian-tie-ban-chuang-jian-xiu-gai-liu-cheng&quot;&gt;生成 → 剪贴板 → 创建 / 修改流程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;填写表单，右侧 &lt;strong&gt;Markdown 预览&lt;/strong&gt;实时更新（也可点「仅复制 Markdown」）。&lt;/li&gt;
&lt;li&gt;点 &lt;strong&gt;生成并复制到剪贴板&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;自动将序列化后的 Markdown &lt;strong&gt;复制到剪贴板&lt;/strong&gt;；&lt;/li&gt;
&lt;li&gt;弹出操作流程提示，明确区分 &lt;strong&gt;创建&lt;/strong&gt; 还是 &lt;strong&gt;修改&lt;/strong&gt;：
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;创建&lt;/strong&gt;（&lt;code&gt;content/kanban/&amp;lt;周&amp;gt;.md&lt;/code&gt; 不存在）：打开 Codeberg 新建文件 → 粘贴 → 保存提交 → ReDeplog 部署 → 刷新列表；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;修改&lt;/strong&gt;（文件已存在 / 编辑已有看板）：打开 Codeberg 覆盖文件 → 全选替换 → 保存提交 → ReDeplog 部署 → 刷新列表。&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;若浏览器已保存 &lt;code&gt;kanbanToken&lt;/code&gt;，可点 &lt;strong&gt;用 Token 直接同步到仓库&lt;/strong&gt;（文件不存在走 POST 创建，存在走 PUT 覆盖），再打开 ReDeplog 部署。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;xiang-guan-wen-jian&quot;&gt;相关文件&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/partials/kanban_editor.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑器模态框（列表页 / 明细页共用）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;表单生成、字段映射、序列化、剪贴板复制、流程提示、Token 同步&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;lie-biao-ye-jin-du-se&quot;&gt;列表页进度色&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;仅「待办 / 进行中 / 已完成」三列参与进度；「资源 / 目标」不参与。&lt;/strong&gt;&lt;/p&gt;
&lt;h3 id=&quot;bei-jing-se-gui-ze&quot;&gt;背景色规则&lt;/h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;条件&lt;/th&gt;&lt;th&gt;卡片背景&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;todo &amp;gt; 3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;全红 &lt;code&gt;#FFEBEE&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;done == total&lt;/code&gt; 且 total &amp;gt; 0&lt;/td&gt;&lt;td&gt;浅绿 &lt;code&gt;#E8F5E9&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;其余&lt;/td&gt;&lt;td&gt;按加权进度百分比渐变（红 → 黄 → 绿）&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;h3 id=&quot;jia-quan-jin-du-gong-shi&quot;&gt;加权进度公式&lt;/h3&gt;
&lt;p&gt;以 &lt;strong&gt;50%&lt;/strong&gt; 为基准，逐卡片累加（标签数 &lt;code&gt;n&lt;/code&gt; 为权重，无标签时 &lt;code&gt;n = 1&lt;/code&gt;）：&lt;/p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;所在列&lt;/th&gt;&lt;th&gt;单项贡献&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;待办&lt;/td&gt;&lt;td&gt;&lt;strong&gt;−10% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;进行中&lt;/td&gt;&lt;td&gt;&lt;strong&gt;+5% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;已完成&lt;/td&gt;&lt;td&gt;&lt;strong&gt;+15% × n&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;例：进行中列卡片有 2 个 &lt;code&gt;@labels&lt;/code&gt; → &lt;strong&gt;+5% × 2 = +10%&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;结果 clamp 至 0–100%，写入 front matter &lt;code&gt;stats.progress_pct&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;列表页标题显示 &lt;code&gt;core_tasks&lt;/code&gt;（非日期）；元信息行含开始 / 截止 / 剩余天数 / 星级（&lt;code&gt;importance&lt;/code&gt; 字段，1–5）。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2 id=&quot;xiang-guan-wen-jian-1&quot;&gt;相关文件&lt;/h2&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;文件&lt;/th&gt;&lt;th&gt;作用&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板 Markdown 唯一维护目录&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-rules.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;解析 / 序列化规则引擎&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-board.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;看板 UI、锁定、拖拽、Edit Post 缓冲写入&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-list.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;列表页剩余天数、动态刷新进度&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;static/js/kanban-editor.js&lt;/code&gt;&lt;/td&gt;&lt;td&gt;GUI 编辑器：表单生成、剪贴板复制、创建 / 修改流程提示&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/partials/kanban_editor.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;编辑器模态框&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;content/kanban/_edit-buffer.md&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Edit Post 前的 Markdown 缓冲文件&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;周计划明细（Trello 风格）&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;templates/kanban_list.html&lt;/code&gt;&lt;/td&gt;&lt;td&gt;周计划列表&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;p&gt;示例看板：&lt;code&gt;content/kanban/2026-06-16.md&lt;/code&gt;&lt;/p&gt;
</content>
        
    </entry>
    
    <entry xml:lang="en">
        <title>after close VPN, analyze why no Net</title>
        <published>2026-06-20T00:00:00+00:00</published>
        <updated>2026-06-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog_Debug/vpn-nonet/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog_Debug/vpn-nonet/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog_Debug/vpn-nonet/">&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;tl; dr&lt;/code&gt;  =&amp;gt;    &lt;a href=&quot;https://suchaharcan.github.io/02Engineer_blog_Debug/vpn-nonet/#section00&quot;&gt;&lt;strong&gt;通用解决方案&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;qian-zhi-zhi-shi&quot;&gt;前置知识&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;VPN原理&lt;/strong&gt;
VPN 改动 DNS服务器地址
虚拟DNS 服务器， 所有的 DNS请求都会走虚拟DNS服务器， 相当于 代理工具 接管系统DNS服务器，再由 虚拟DNS服务器 处理 发往真正的DNS服务器
关闭代理工具， 但 虚拟DNS服务器 按理来说是不存在，应当消失， 回归 系统DNS服务器；&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;gai-wen-ti-hong-fa-chang-jing&quot;&gt;该问题触发场景&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;日常使用 时 尽量 避免&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;VPN不关闭 且 &amp;lt; 熄屏 或 休眠 太久&amp;gt; 重新打开&lt;/li&gt;
&lt;li&gt;多个DNS软件 同时使用 （ Adguard，VPN， 等）覆写DNS时 被其他软件 接管或中断&lt;/li&gt;
&lt;li&gt;小众VPN 套壳Clash 是老版本， MacOS 新版本中 网络模块没有相应的 补丁修复 Github 上 有相关的issue&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;优化点：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol&gt;
&lt;li&gt;VPN 用完就关&lt;/li&gt;
&lt;li&gt;尽量使用 小火箭 QX Surge 等及时 更进 系统更新 有网络补丁 和 协议支持的 软件&lt;/li&gt;
&lt;li&gt;Install  &lt;a class=&quot;external&quot; rel=&quot;external&quot; href=&quot;https://tracebar.app/&quot;&gt;TraceBar&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;没有遥测数据，没有分析数据，也没有账户。所有数据都保存在内存中，退出后就会丢失 &lt;br/&gt;
可视化示数据通过互联网传输到目的地的路径，并显示沿途的任何网络问题。
它可以帮助您诊断和定位网络问题，从而确定是您的 Wi-Fi 故障、互联网连接故障、网络服务提供商故障，还是其他原因导致的
同类 专业级软件：Pingplotter&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tap&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tracebar-app/tracebar&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-cask&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tracebar&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;常用命令&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看当前DNS服务器地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /etc/resolv.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看默认的DNS服务器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; nameserver&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 路由信息查看&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;netstat&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; DNS 解析域名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @[DNS服务器]&lt;/span&gt;&lt;span&gt; [域名&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;lian-jie-vpn-qian&quot;&gt;连接VPN 前&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cat&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /etc/resolv.conf&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nameserver&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nameserver&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS 指向局域网网关 &lt;code&gt;192.168.231.1&lt;/code&gt; 和 &lt;code&gt;192.168.1.1&lt;/code&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                          ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;DNS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; configuration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[1]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 7&lt;/span&gt;&lt;span&gt; (en0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000002&lt;/span&gt;&lt;span&gt; (Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 254.169.in-addr.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 8.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300400&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 9.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300600&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; a.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300800&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; b.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 301000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;DNS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; configuration&lt;/span&gt;&lt;span&gt; (for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scoped&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; queries&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[1]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 7&lt;/span&gt;&lt;span&gt; (en0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Scoped,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000002&lt;/span&gt;&lt;span&gt; (Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; grep&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; nameserver&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                        ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[1]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[1]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;说明 DNS …&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;lian-jie-vpn-hou&quot;&gt;连接VPN 后&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cat&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /etc/resolv.conf&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nameserver&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 198.18.0.2&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote&gt;
&lt;p&gt;DNS 依然被锁定在 198.18.0.2（这通常是 Clash 等代理/VPN 工具使用的 Fake IP 或者是其内置 TUN 模式的 DNS 服务地址）
前后比对，DNS解析地址 被替换， 路由信息被更新“
当 VPN 关闭后，这个 IP 变得不可达，导致你的 Mac 无法解析任何域名，从而“断网”。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;命令方式解析 dig @[DNS服务器] [域名]&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @114.114.114.114&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; www.baidu.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;一、 命令行定位与分析步骤
既然怀疑是 DNS 问题，我们可以通过以下命令行组合进行精准排查：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;验证是否只是 DNS 解析失败（排除物理断网）
在终端中尝试直接 ping 一个公网 IP（如 Google 或 腾讯的公共 DNS），再 ping 一个域名：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ping&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 114.114.114.114&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ping&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分析： 如果 ping 114.114.114.114 能通，但 ping baidu.com 提示 cannot resolve baidu.com: Unknown host，说明网络连接完全正常，100% 是 DNS 的锅。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;查看 macOS 真正的 DNS 配置
正如你截图中 macOS 自带的警告所说，macOS 并不真正依赖 /etc/resolv.conf，它有自己的系统配置框架（Configuration Daemon）。
执行以下命令查看当前生效的 DNS：&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分析： 检查输出中的 nameserver[0]。你会发现即使关闭了 VPN，这里可能依然残留着 198.18.0.2。这是因为 VPN 客户端退出时，未能正常调用系统 API 将修改的 DNS 还原。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;查看网络服务（以 Wi-Fi 为例）的硬件 DNS 设置&lt;/li&gt;
&lt;/ol&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;networksetup&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;getdnsservers&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Wi-Fi&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;分析： 如果这里输出了 198.18.0.2 或提示存在特定的 DNS，说明 VPN 直接修改了你网卡的硬配置。如果输出 There aren’t any DNS Servers set on Wi-Fi.，说明走的是 DHCP 自动获取（这是正常的，不正常的配置残留在内存的 scutil 守护进程中）。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 114.114.114.114&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;PING&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 114.114.114.114&lt;/span&gt;&lt;span&gt; (114.114.114.114&lt;/span&gt;&lt;span&gt;): 56 data bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 114.114.114.114:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;3.109&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 114.114.114.114:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1.630&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 114.114.114.114:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1.009&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 114.114.114.114&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; statistics&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packets&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; transmitted,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packets&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; received,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 0.0%&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; loss&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;round-trip&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; min/avg/max/stddev&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 1.009/1.916/3.109/0.881&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ──────────────────────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:45:41&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                      ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;PING&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;span&gt; (124.237.177.164&lt;/span&gt;&lt;span&gt;): 56 data bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 124.237.177.164:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;4.223&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 124.237.177.164:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;1.734&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; from&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 124.237.177.164:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; icmp_seq=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ttl=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; time=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0.817&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;---&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; statistics&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packets&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; transmitted,&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packets&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; received,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 0.0%&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; packet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; loss&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;round-trip&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; min/avg/max/stddev&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 0.817/2.258/4.223/1.439&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ──────────────────────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:45:49&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-dns&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                             ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;DNS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; configuration&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 198.18.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 24&lt;/span&gt;&lt;span&gt; (utun11&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Supplemental,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000003&lt;/span&gt;&lt;span&gt; (Reachable,Transient&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 102200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 198.18.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 24&lt;/span&gt;&lt;span&gt; (utun11&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000003&lt;/span&gt;&lt;span&gt; (Reachable,Transient&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 200000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; local&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 254.169.in-addr.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300200&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 8.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300400&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 9.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300600&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; a.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 300800&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;8&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  domain&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; b.e.f.ip6.arpa&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  options&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mdns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  timeout&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000000&lt;/span&gt;&lt;span&gt; (Not&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  order&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 301000&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;DNS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; configuration&lt;/span&gt;&lt;span&gt; (for&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; scoped&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; queries&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[1]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 7&lt;/span&gt;&lt;span&gt; (en0&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Scoped,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000002&lt;/span&gt;&lt;span&gt; (Reachable&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;resolver&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  nameserver[0]&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 198.18.0.2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  if_index&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 24&lt;/span&gt;&lt;span&gt; (utun11&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  flags&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Scoped,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; A&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Request&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AAAA&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; records&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;  reach&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;    :&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0x00000003&lt;/span&gt;&lt;span&gt; (Reachable,Transient&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Connection&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ──────────────────────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:45:55&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                           ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ✘&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; took&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 7s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:49:05&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                          ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /etc/resolv.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nameserver&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;nameserver&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ──────────────────────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:49:16&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ping&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                           ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;^C&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ────────────────────────────────────&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; INT&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ✘&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; took&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 6s&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; system&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Node&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; at&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 08:49:28&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; AM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @192.168.231.1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; www.baidu.com&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                         ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; communications&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; error&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 192.168.231.1#53:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; timed&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; communications&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; error&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 192.168.231.1#53:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; timed&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; communications&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; error&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; to&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 192.168.231.1#53:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; timed&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; DiG&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9.20.24&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; @192.168.231.1&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;; (1 server found)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;;; no servers could be reached&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ─────────────────────────────────────────── took 15s  system Node  at 08:49:59 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯                                                                                          ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;cat /etc/resolv.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:52:48 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ ping -c 3 192.168.231.1                                                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;PING 192.168.231.1 (192.168.231.1): 56 data bytes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;64 bytes from 192.168.231.1: icmp_seq=0 ttl=63 time=4.427 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;64 bytes from 192.168.231.1: icmp_seq=1 ttl=63 time=1.954 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;64 bytes from 192.168.231.1: icmp_seq=2 ttl=63 time=2.018 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;--- 192.168.231.1 ping statistics ---&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;3 packets transmitted, 3 packets received, 0.0% packet loss&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;round-trip min/avg/max/stddev = 1.954/2.800/4.427/1.151 ms&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:52:54 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ netstat -nr | grep default                                                               ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default            192.168.1.1        UGScg                 en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun0                            UGcIg               utun0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun1                            UGcIg               utun1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun2                            UGcIg               utun2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun3                            UGcIg               utun3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun12                           UGcIg              utun12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun13                           UGcIg              utun13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:53:20 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ sudo route -n delete default 192.168.1.1                                                 ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Password:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;delete net default: gateway 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ──────────────────────────────────────────── took 4s  system Node  at 08:56:11 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ sudo route -n add default 192.168.231.1                                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;add net default: gateway 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:56:25 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ cat /etc/resolv.conf                                                                     ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:58:04 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ netstat -nr | grep default                                                               ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default            192.168.1.1        UGScg                 en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun0                            UGcIg               utun0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun1                            UGcIg               utun1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun2                            UGcIg               utun2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun3                            UGcIg               utun3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun12                           UGcIg              utun12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun13                           UGcIg              utun13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:58:14 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ sudo route -n delete default 192.168.1.1                                                 ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;delete net default: gateway 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:58:23 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ sudo route -n add default 192.168.231.1                                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;route: writing to routing socket: Network is unreachable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;add net default: gateway 192.168.231.1: Network is unreachable&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:58:31 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ cat /etc/resolv.conf                                                                     ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;# This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;nameserver 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:58:40 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;❯ netstat -nr | grep default                                                               ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun0                            UGcIg               utun0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun1                            UGcIg               utun1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun2                            UGcIg               utun2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun3                            UGcIg               utun3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun12                           UGcIg              utun12&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;default                                 fe80::%utun13                           UGcIg              utun13&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;❯ ping -c 3 192.168.231.1                                                                  ─╯&lt;/p&gt;
&lt;p&gt;PING 192.168.231.1 (192.168.231.1): 56 data bytes&lt;/p&gt;
&lt;p&gt;64 bytes from 192.168.231.1: icmp_seq=0 ttl=63 time=4.427 ms&lt;/p&gt;
&lt;p&gt;64 bytes from 192.168.231.1: icmp_seq=1 ttl=63 time=1.954 ms&lt;/p&gt;
&lt;p&gt;64 bytes from 192.168.231.1: icmp_seq=2 ttl=63 time=2.018 ms&lt;/p&gt;
&lt;p&gt;— 192.168.231.1 ping statistics —&lt;/p&gt;
&lt;p&gt;3 packets transmitted, 3 packets received, 0.0% packet loss&lt;/p&gt;
&lt;p&gt;round-trip min/avg/max/stddev = 1.954/2.800/4.427/1.151 ms&lt;/p&gt;
&lt;p&gt; ~ ────────────────────────────────────────────────────── system Node  at 08:52:54 AM ─╮&lt;/p&gt;
&lt;p&gt;❯ netstat -nr | grep default                                                               ─╯&lt;/p&gt;
&lt;p&gt;default            192.168.1.1        UGScg                 en0&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun0                            UGcIg               utun0&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun1                            UGcIg               utun1&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun2                            UGcIg               utun2&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun3                            UGcIg               utun3&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun12                           UGcIg              utun12&lt;/p&gt;
&lt;p&gt;default                                 fe80::%utun13                           UGcIg              utun13&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;破案了！这是一起非常典型的多网卡/双网关路由冲突引发的“高级故障”。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;你的测试结果给出了最关键的线索：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ping 192.168.231.1 可以通，说明物理链路和该网段是通的。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;netstat -nr | grep default 暴露了致命问题：你的 IPv4 默认网关（default）指向的是 192.168.1.1，走的是 en0 接口。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;一、 深度原理分析：为什么会断网？&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;回到你上一张图的 /etc/resolv.conf：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Plaintext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nameserver 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nameserver 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;你当前系统里其实并存了两个物理网络（或者一个多网段的复杂网络），一个是 192.168.231.x，另一个是 192.168.1.x。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;数据包的迷路过程：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;当你执行 dig @192.168.231.1 www.baidu.com 时，系统查路由表发现，要前往 192.168.231.1 不需要走默认网关，因为它属于本地直连网段。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;但是，你的默认路由（负责所有外网流量）被死死绑定在了 192.168.1.1 上。当 VPN 关闭后，192.168.1.1 这个网关可能根本没有通往外网的权限，或者它是个死网关。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;总结： 你的 Mac 目前误把没有外网能力的 192.168.1.1 当作了主力出口，而把真正能上网的 192.168.231.1 晾在了一边。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;二、 命令行解决方案&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;我们需要明确告诉 macOS：把外网出口（默认网关）切换回 192.168.231.1。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 1：手动修正 IPv4 默认路由&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;强行删除错误的 192.168.1.1 默认网关，并指向正确的 192.168.231.1：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 删除当前指向 192.168.1.1 的默认路由&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo route -n delete default 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 添加真正能上网的 192.168.231.1 作为默认网关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo route -n add default 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 2：彻底清除残留的 utun 虚拟接口路由（可选）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;你的输出中有一大堆 utun0 到 utun13 的 IPv6 残留。虽然它们是 IPv6，但为了防止干扰，可以直接让网络服务重新加载：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 触发网络接口配置更新（将 en0 软重启）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo ifconfig en0 down &amp;amp;&amp;amp; sudo ifconfig en0 up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 3：调整 macOS 网络服务优先级（长久之计）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;如果你的 Mac 同时连接了多个网络接口（比如 Wi-Fi 和以太网，或者两个不同的虚拟网络），你需要让提供 192.168.231.x 的那个接口在系统里处于最高优先级。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;先查看你所有的网络服务名称：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;networksetup -listnetworkserviceorder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;假设你的以太网叫 USB 10/100/1000 LAN，Wi-Fi 叫 Wi-Fi。如果你希望以太网优先，可以使用以下命令调整顺序（把你希望优先的服务写在最前面）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 示例命令，请根据你上一步查到的实际名称修改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo networksetup -ordernetworkservices &amp;quot;USB 10/100/1000 LAN&amp;quot; &amp;quot;Wi-Fi&amp;quot; &amp;quot;Bluetooth PAN&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;三、 验证网络&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;完成路由调整后，请再次测试：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 再次检查默认网关是否已变为 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;netstat -nr | grep default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 测试域名解析&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dig www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 3. 测试外网是否畅通&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ping -c 3 baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;当 VPN 关闭后发生断网，其根本原因通常是 VPN 软件未能干净地撤销它对系统网络栈（DNS、路由表、虚拟网卡、防火墙）的接管。按照一个标准的数据包从“域名解析”到“物理网卡发出”的 正常网络访问链路，我们可以从上到下、由表及里地梳理出一套完整的命令行（CLI）排查与验证指南。🌐 正常网络访问链路排查总览为了方便记忆，排查链路分为以下 5 个核心节点：应用层/DNS 映射（/etc/resolv.conf）系统 DNS 解析引擎（mDNSResponder / scutil）网络层路由转发（netstat / route）链路层/物理网卡状态（ifconfig / networksetup）系统防火墙与流量拦截（pfctl）🛠️ 各链路节点排查与命令总结节点 1：配置文件层（检查基础 DNS 地址）数据包发出的第一步，是检查系统基础的域名解析服务器指向。查看命令：Bashcat /etc/resolv.conf&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;异常表现： nameserver 后面依然残留 VPN 的私有 DNS（如 198.18.0.2 等 Fake IP 映射地址）。正常表现： 应该指向你的局域网网关（如 192.168.1.1）或公共 DNS（如 114.114.114.114）。节点 2：系统 DNS 解析层（检查实际 DNS 路由与解析能力）macOS 并不直接依赖上一步的配置文件，而是通过配置画布（Configuration Daemon）管理。查看实际生效 DNS：Bashscutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;检查 nameserver[0] 是否为有效的外网 DNS。测试指定 DNS 接口解析：Bash# 强制使用你本地的网关（如 192.168.231.1）去解析外网域名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dig @192.168.231.1 www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;测试系统默认 DNS 解析：Bashdig www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;异常表现： dig 提示 timed out 或 no servers could be reached（即使网关能 ping 通）。此节点修复命令（刷新 DNS 缓存）：Bashsudo killall -HUP mDNSResponder&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;节点 3：网络层路由转发（检查默认网关）DNS 解析成功（或直接访问 IP）后，数据包需要知道从哪一个“出口”发往外网。查看全局路由表（特别是默认网关）：Bashnetstat -nr | grep default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;测试物理网关的连通性：Bash# 替换为你实际的网关 IP&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ping -c 3 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;异常表现： 1. 存在多个 default 路由，导致路由冲突。2. default 错误的指向了已关闭的 VPN 虚拟网卡（如 utunX），或者指向了一个没有外网能力的死网关（如多网卡环境下的错误内网网关）。此节点修复命令（重置默认路由）：Bash# 删除错误的网关，并添加正确的物理网关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo route -n delete default 192.168.1.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo route -n add default 192.168.231.1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;节点 4：链路层与硬件接口（检查物理网卡状态）确保你的物理网卡（以太网/Wi-Fi）处于激活状态，且获得了正确的 IP 分配。查看所有网络接口状态：Bashifconfig&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;检查你的物理网卡（如 en0）是否带有 status: active 以及正确的 inet (IP 地址)。查看硬件端口与服务的绑定关系：Bashnetworksetup -listallhardwareports&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;此节点修复命令（网卡软重启/重新触发 DHCP）：Bash# 以 en0 为例，先禁用再启用，强制重新向路由器申请 IP 和路由&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo ifconfig en0 down &amp;amp;&amp;amp; sudo ifconfig en0 up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;节点 5：防火墙与安全策略层（检查流量拦截）很多现代 VPN 软件（如 Clash 增强模式、Surge、Tailscale 等）会写入内核级别的防火墙（PF）转发规则。软件关闭时如果未清理，会把所有非 VPN 流量直接丢弃（Drop）。查看防火墙状态与规则：Bashsudo pfctl -s rules&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;异常表现： 存在大量指向 127.0.0.1 或是虚拟网卡的 redirect (rdr) 转发规则。此节点修复命令（强制关闭 PF 防火墙拦截）：Bashsudo pfctl -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;📋 快速排查口诀表排查顺序检查目标核心 CLI 命令正常标准Step 1配置文件cat /etc/resolv.confnameserver 为物理网关或公网 DNSStep 2DNS 解析dig www.baidu.com能正确返回 A 记录（IP 地址）Step 3路由网关netstat -nr | grep defaultdefault 唯一且指向真正能上网的物理网关Step 4物理链路ping -c 3 [网关IP]0% packet loss（延迟通常在几毫秒内）Step 5流量拦截sudo pfctl -d彻底关闭可能残留的防火墙拦截规则&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;终极病灶分析：什么是 link#27？&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;看看你之前的路由表输出：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Plaintext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;default            link#27            UCSg                utun16&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;在 macOS 中，link#X（如 link#27）代表的是系统内核直接绑定的链路层接口（Link-layer Interface）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;当 VPN 软件（特别是开启了 TUN 模式、Enhance 模式或智能路由的客户端）运行时，它会在内核中创建一个名为 utun16 的虚拟网卡，并把全局默认路由的下一跳直接绑死在物理链路 link#27 上。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;这就是为什么你断开 VPN 后依然无法访问的原因：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;普通的 sudo route delete default 只能删除常规的 IP 路由，但这种由 VPN 强行写入内核、绑定在 link# 上的链路层条件路由（UCSg 标记）具有极高的优先级，它像胶水一样粘在系统里。即使你以为 VPN 关了，系统在发送 SSH 数据包时，依然通过 link#27 丢给了已经失效的 utun16，导致 Codeberg 的服务器直接断开或根本收不到正确的握手包。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🛠️ 终极命令行解决方案&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;我们必须用点“暴力”手段，将这些残留的虚拟网卡接口和内核路由彻底抹去。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 1：强行卸载/关停残留的 utun16 接口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;既然流量总是被吸进 utun16，我们直接在链路层把它禁用：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo ifconfig utun16 down&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;(如果执行后路由表里还有别的 utunX 占领 default，可以针对性地将其 down 掉)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 2：强制刷新 macOS 内核路由表（终极重置）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;既然常规命令删不掉 link#27，我们直接通过重启 macOS 网络核心配置框架，逼迫系统重新扫描物理网卡：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 1. 强制清理并重置系统的网络配置守护进程（这会顺便冲刷掉内核残留的 link 路由）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo configd -b -d&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 2. 软重启你的物理网卡 en0，让它重新拿回唯一的 default 控制权&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sudo ifconfig en0 down &amp;amp;&amp;amp; sudo ifconfig en0 up&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;步骤 3：验证路由表是否恢复纯净&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;现在执行以下命令，观察输出：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;netstat -nr | grep default&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;【正确标准】： 此时输出应该有且只有一行，且必须指向你的物理网关，绝对不能再出现 link# 或 utun：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Plaintext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;default            192.168.1.1        UGSc           en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🧪 最终验证&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;当路由表被彻底清洗干净，只剩下物理网卡 en0 后，再次发起冲击：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ssh -vT git@codeberg.org&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;这一次，数据包终于能顺着真正的物理网线飞往 Codeberg 了！&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;从这份最新的路由表来看，你的 IPv4 路由表现在是非常干净且正确的：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;只有一个 IPv4 默认网关 default 指向 192.168.1.1，并且成功绑定在物理网卡 en0 上。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;之前残留的 link#27 和 utun16 的 IPv4 拦截已经彻底消失了。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;剩下的 utun0 到 utun13 都是 IPv6 的本地链路多播路由（fe80:: 开头），属于 macOS 的正常系统组件（或 OrbStack 的内部通信），不会影响你的 IPv4 外网访问。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;既然 IPv4 路由表已经完全正常，为什么 ssh -vT git@codeberg.org 依然卡在 kex_exchange_identification？&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;这就排除了路由表的嫌疑，问题被锁死在以下两个最后可能的原因：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🔍 终极原因定位与验证&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;1. 终端的环境变量中残留了代理&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;虽然你的 VPN 软件关闭了，路由也清干净了，但如果你当前使用的这个终端窗口是在关闭 VPN 之前打开的，它里面可能依然保留着旧的 ALL_PROXY 或 HTTP_PROXY 环境变量。SSH 会尝试去走这个已经死掉的代理端口，导致连接直接被挂断。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;验证与解决命令：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;在当前终端直接执行以下命令，清空所有可能的代理变量：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;unset http_proxy https_proxy all_proxy HTTP_PROXY HTTPS_PROXY ALL_PROXY&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;或者，直接新开一个全新的终端标签页（Terminal Tab）来测试。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;2. 运营商或本地宽带网络对 Codeberg 的 22 端口进行了封锁&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Codeberg（217.197.84.140）的服务器在海外。在不挂 VPN 的纯国内物理网络下，部分地区的运营商（如移动、长城宽带等）常常会直接拦截或干扰境外非主流 Git 平台的 22 端口（SSH 握手包被审查直接阻断）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;验证命令（测试 22 端口是否能正常建立流传输）：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nc -vzt codeberg.org 22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;或者使用带有探测性质的 curl：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;curl -v ssh://codeberg.org:22&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;分析： 如果执行 nc 很久没反应，或者显示 Connection refused，说明你的物理宽带网络在没有 VPN 的情况下，本身就无法直接连接 Codeberg 的 SSH 服务。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🛠️ 终极解决方案&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;如果你清空了环境变量（或换了新终端），并且发现不挂 VPN 就是连不上 Codeberg 的 22 端口，请使用以下两个终极对策：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;对策 A：使用 Codeberg 官方提供的 SSH 备用端口（443）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;为了应对 22 端口被防火墙或运营商封锁的情况，Codeberg 官方支持通过 443 端口（通常用于 HTTPS，不易被封）来走 SSH 协议。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;修改你的 ~/.ssh/config，将 codeberg 的配置改成这样：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Plaintext&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Host codeberg.org&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    HostName altssh.codeberg.org&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    User git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    Port 443&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    IdentityFile ~/.ssh/id_ed25519_codeberg&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    IdentitiesOnly yes&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;修改完后，直接测试：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ssh -vT git@codeberg.org&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;这个方法非常有效，它依然走的是你的 SSH 密钥认证，但完美绕过了被运营商封锁的 22 端口。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;对策 B：切换为 HTTPS 协议克隆/推送&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;如果 SSH 无论如何都不通，最省心的办法就是放弃 SSH 协议，改用 HTTPS 协议（通过 Codeberg 的账号 + Token/密码）进行代码管理：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 修改你本地 Git 仓库的远程连接地址为 HTTPS&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git remote set-url origin https://codeberg.org/你的用户名/你的仓库名.git&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ ping baidu.com                               ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ping: cannot resolve baidu.com: Unknown host&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ~ &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ cat /etc/resolv.conf                         ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# macOS Notice&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# This file is not consulted for DNS hostname resolution, address&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# resolution, or the DNS query routing mechanism used by most&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# processes on this system.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# To view the DNS configuration used by this system, use:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#   scutil --dns&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# SEE ALSO&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#   dns-sd(1), scutil(8)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# This file is automatically generated.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;nameserver 223.5.5.5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt; ~ ────────── system Node  at 10:39:09 AM ─╮&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ dig @223.5.5.5 www.baidu.com                 ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;; communications error to 223.5.5.5#53: timed out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;; communications error to 223.5.5.5#53: timed out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;; communications error to 223.5.5.5#53: timed out&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;; &amp;lt;&amp;lt;&amp;gt;&amp;gt; DiG 9.20.24 &amp;lt;&amp;lt;&amp;gt;&amp;gt; @223.5.5.5 www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;; (1 server found)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;; global options: +cmd&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;;; no servers could be reached&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;现在的问题和之前的 Hosts 已经没有关系了。这就是最典型、最致命的 “VPN 关闭/残留引发的系统全局 DNS 死锁”。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;看这三个连续的致命报错：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Could not resolve host: mirrors.aliyun.com（连国内的阿里云都无法解析）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ping: cannot resolve baidu.com: Unknown host（百度无法解析）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;dig @223.5.5.5 www.baidu.com ... timed out（直接向阿里公共 DNS 53端口发包全完超时）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;🔍 根源分析：你的 Mac 经历了什么？&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;虽然你的 /etc/resolv.conf 里写着 nameserver 223.5.5.5，但因为你之前开启过 VPN（TUN 模式、增强模式或系统代理），VPN 在断开或者关闭时，没有干净地把接管的系统底层路由表（Routing Table）和虚拟网卡（utun）卸载掉。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;导致的结果是：你的 Mac 依然盲目地把所有 DNS 流量（53端口）丢给一个已经不存在的 VPN 虚拟网关，导致你现在连国内网络、DNS 服务器全部失联。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;强行重置 macOS 网络层&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;# 🛠️ 针对以太网的终极修复步骤&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;## 找出你当前以太网的准确“服务名称”&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;不同的扩展坞，以太网在系统里的名字不一样。我们先用这个命令列出你所有的网络接口：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;```Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;networksetup -listallnetworkservices&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;❯ networksetup -listallnetworkservices                                                           ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;An asterisk (*) denotes that a network service is disabled.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Ethernet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Thunderbolt Bridge&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Wi-Fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Shadowrocket&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;看一眼输出结果：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;你会看到类似 AX88179A、USB 10/100/1000 LAN、Thunderbolt Ethernet 或 Ethernet 的名字。请记住这个名字（下面以 Ethernet 为例，如果你的叫别的，请自行替换）。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;tong-yong-jie-jue-fang-an&quot;&gt;通用解决方案&lt;/h1&gt;
&lt;p&gt;&lt;a id=&quot;section00&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;网络环境描述：关闭VPN 软件； 网络保留一种（有线或无线）简化排查和解决难度&lt;br/&gt;
方案 默认使用有线网络Ethernet ， 根据你自己的 网络 微调&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;qiang-xing-gei-yi-tai-wang-zhu-ru-guo-nei-gu-gan-dns&quot;&gt;强行给以太网注入国内骨干 DNS&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;用官方命令强行把你的有线网络 DNS 冲刷干净，彻底摆脱 VPN 残留：&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; &amp;quot;Ethernet&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; networksetup&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;setdnsservers&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 223.5.5.5&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 119.29.29.29&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;wu-li-ceng-zhong-qi-yi-tai-wang-qia-zhong-xi-lu-you-biao&quot;&gt;物理层重启以太网卡（重洗路由表）&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;我们需要让你的有线网卡重新向路由器申请一次内网 IP 和网关。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;查明以太网的物理设备名：&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;networksetup&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;listallhardwareports&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;找到你以太网服务对应的&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Device（比如&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en0&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 或&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en2）。&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;强行断开并重启该网卡：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Bash&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 是 en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ifconfig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en0&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; down&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ifconfig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en0&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; up&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 定位到是en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; networksetup&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;listallhardwareports&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                             ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ethernet&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; d0:11:e5:8a:4f:6c&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Adapter&lt;/span&gt;&lt;span&gt; (en5&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 9a:86:59:a9:af:e2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Adapter&lt;/span&gt;&lt;span&gt; (en6&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en6&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 9a:86:59:a9:af:e3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Adapter&lt;/span&gt;&lt;span&gt; (en7&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en7&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 9a:86:59:a9:af:e5&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Thunderbolt&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Bridge&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bridge0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 36:fd:e1:09:fc:c0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Wi-Fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; d0:11:e5:79:c5:4f&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Thunderbolt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 36:fd:e1:09:fc:c0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Thunderbolt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en3&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 36:fd:e1:09:fc:c4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Hardware&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Port:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Thunderbolt&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Device:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; en4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Ethernet&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Address:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 36:fd:e1:09:fc:cc&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;VLAN&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Configurations&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;shun-jian-chong-shua-quan-wang-dns-huan-cun&quot;&gt;瞬间冲刷全网 DNS 缓存&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; dscacheutil&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;flushcache&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; killall&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;HUP&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; mDNSResponder&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;test-tube-yan-zheng-wang-luo&quot;&gt;🧪 验证网络&lt;/h2&gt;
&lt;p&gt;现在，拔掉再重新插一下你的以太网网线，让它亮起绿灯。然后再次在终端测试：&lt;br/&gt;
该步骤 不可省略， 有时就是这步没有操作&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ping&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;c&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 3&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;dig&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; @223.5.5.5&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; www.baidu.com&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;只要 ping 能够通，你的系统网络就彻底复活了！&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Mac 本地网络 配置优化方案</title>
        <published>2026-06-20T00:00:00+00:00</published>
        <updated>2026-06-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/host-littlesnitch-deploy/"/>
        <id>https://suchaharcan.github.io/03Share_blog/host-littlesnitch-deploy/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/host-littlesnitch-deploy/">&lt;h1 id=&quot;ruan-jian-da-pei&quot;&gt;软件搭配&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;SwitchHosts&lt;/li&gt;
&lt;li&gt;AdguardHome ： https://github.com/AdguardTeam/AdGuardHome#automated-install-linux-and-mac&lt;/li&gt;
&lt;li&gt;LittleSnitch&lt;/li&gt;
&lt;/ul&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 打印出到底是哪个进程在占用 53 端口&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;sudo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; lsof&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :53&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;P&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th style=&quot;text-align: left&quot;&gt;特性 / 维度&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;💻 SwitchHosts&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;🛡️ AdGuard Home&lt;/th&gt;&lt;th style=&quot;text-align: left&quot;&gt;🧱 Little Snitch&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;软件定位&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;本地 &lt;code&gt;hosts&lt;/code&gt; 文件快捷管理工具&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;全局 DNS 拦截与隐私防火墙&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;macOS 专用的应用级网络防火墙&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;主要应用场景&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;* 后端/前端开发本地环境切换&lt;br&gt;* 简单的域名静态重定向（如 &lt;code&gt;127.0.0.1 myproject.test&lt;/code&gt;）&lt;br&gt;* 手动拉取固定的阻断列表&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;* 局域网/全机&lt;strong&gt;全局去广告&lt;/strong&gt;与恶意追踪拦截&lt;br&gt;* 屏蔽恶劣高频设备心跳包&lt;br&gt;* 自建加密 DNS 服务器&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;* &lt;strong&gt;监控单个软件&lt;/strong&gt;的联网行为&lt;br&gt;* 阻止特定 App 后台偷偷上传隐私或心跳包&lt;br&gt;* 发现并拦截未授权的入站/出站连接&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;工作机制&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;系统文件层&lt;/strong&gt;：通过直接修改 macOS 系统的 &lt;code&gt;/etc/hosts&lt;/code&gt; 文件，在系统发起网络请求的第一步（DNS 解析前）强行指定域名的 IP。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;DNS 层&lt;/strong&gt;：作为本地的“域名翻译官”。当软件请求域名时，如果是黑名单域名，直接返回空 IP（&lt;code&gt;0.0.0.0&lt;/code&gt;），在解析阶段将其阻断。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;系统内核/网络扩展层&lt;/strong&gt;：接管 macOS 的网络驱动。不管域名怎么解析，它直接监控**哪个进程（Process）**在往哪个 IP/域名发包，属于 IP/端口拦截。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;使用方法 (如何配置维护)&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1. 手动添加规则（如 &lt;code&gt;0.0.0.0 bad-telemetry.com&lt;/code&gt;）。&lt;br&gt;2. 支持配置远程 URL 定时刷新（但不支持复杂的 AdGuard 过滤语法）。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1. 配置上游加密 DNS。&lt;br&gt;2. 在界面中添加支持正则、通配符的&lt;strong&gt;动态 DNS 黑白名单&lt;/strong&gt;。&lt;br&gt;3. 自动 24 小时后台静默维护。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;1. 运行时采用“交互模式”：有软件联网时弹窗询问“允许”或“拒绝”。&lt;br&gt;2. 可以在规则面板里针对特定 App 封杀特定域名或端口。&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;拦截颗粒度&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;最粗&lt;/strong&gt;：只能精确匹配一个域名，不支持 &lt;code&gt;*.com&lt;/code&gt; 这种泛解析，无法拦截特定端口。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;中等&lt;/strong&gt;：可以支持通配符和正则表达式（如 `&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td style=&quot;text-align: left&quot;&gt;&lt;strong&gt;系统资源占用&lt;/strong&gt;&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;极低（只在切换文件时写入，日常运行几乎不占 CPU/内存）。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;较低（作为一个轻量级后台服务，常驻处理 DNS 请求）。&lt;/td&gt;&lt;td style=&quot;text-align: left&quot;&gt;中等（因为要实时审计网卡上每一个进出的数据包，对 CPU 会有一定常驻开销）。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>6.16 – 6.22 周计划</title>
        <published>2026-06-16T00:00:00+00:00</published>
        <updated>2026-06-16T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/kanban/2026-06-16-06-22-0934/"/>
        <id>https://suchaharcan.github.io/kanban/2026-06-16-06-22-0934/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/kanban/2026-06-16-06-22-0934/">&lt;h1 id=&quot;dai-ban&quot;&gt;待办&lt;/h1&gt;
&lt;h2 id=&quot;gui-ze-yin-qing-dan-yuan-ce-shi&quot;&gt;规则引擎单元测试&lt;/h2&gt;
&lt;p&gt;@start 2026-06-16
@due 2026-06-18
@priority 4
@labels blue, purple&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
parseMarkdown 覆盖全部指令&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
serializeMarkdown 往返无损&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;编写 &lt;code&gt;kanban-rules.js&lt;/code&gt; 的解析与序列化测试用例。&lt;/p&gt;
&lt;h2 id=&quot;ying-she-shuo-ming-wen-dang&quot;&gt;映射说明文档&lt;/h2&gt;
&lt;p&gt;@due 2026-06-17
@priority 3
@labels green&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
补充颜色名对照表&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
增加边界情况说明&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;见 &lt;code&gt;content/kanban/kanban-mapping.md&lt;/code&gt;。&lt;/p&gt;
&lt;h2 id=&quot;lie-biao-jin-du-tiao-yang-shi&quot;&gt;列表进度条样式&lt;/h2&gt;
&lt;p&gt;@due 2026-06-19
@priority 3
@labels orange&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
待办 &amp;gt; 3 全红&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
加权进度公式&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
图标 + 星级元信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;jin-xing-zhong&quot;&gt;进行中&lt;/h1&gt;
&lt;h2 id=&quot;kan-ban-ming-xi-ye-ui&quot;&gt;看板明细页 UI&lt;/h2&gt;
&lt;p&gt;@start 2026-06-16
@due 2026-06-20
@priority 5
@labels yellow, blue
@bg #FFF8E1
@top orange&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Trello 多列布局&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
拖拽跨列&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
锁定 / 解锁&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考 Trello 列 + 卡片顶栏色；标签仅参与权重计算。&lt;/p&gt;
&lt;h2 id=&quot;tong-bu-hui-xie-codeberg&quot;&gt;同步回写 Codeberg&lt;/h2&gt;
&lt;p&gt;@due 2026-06-21
@priority 4
@labels sky
@top sky&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
读取 raw markdown&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
PUT 更新 content/kanban 路径&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;nanolog-gong-neng-gong-gao&quot;&gt;Nanolog 功能公告&lt;/h2&gt;
&lt;p&gt;@due 2026-06-22
@priority 2
@labels pink&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
东八区时间&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
附映射文档链接&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;yi-wan-cheng&quot;&gt;已完成&lt;/h1&gt;
&lt;h2 id=&quot;xu-qiu-yu-mu-lu-jie-gou&quot;&gt;需求与目录结构&lt;/h2&gt;
&lt;p&gt;@priority 3
@labels green&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
看板 Markdown 统一放在 &lt;code&gt;content/kanban/&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
一级标题 = 列表，二级 = 卡片&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&quot;article-nanolog-jie-gou-dui-qi&quot;&gt;article / nanolog 结构对齐&lt;/h2&gt;
&lt;p&gt;@priority 2
@labels lime&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
列表 + 明细模板分离&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Edit Post / ReDeplog 链接&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;zi-yuan&quot;&gt;资源&lt;/h1&gt;
&lt;h2 id=&quot;kai-fa-huan-jing-yu-quan-xian&quot;&gt;开发环境与权限&lt;/h2&gt;
&lt;p&gt;@start 2026-06-16
@priority 2&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Zola 本地 &lt;code&gt;build --force&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
Codeberg 仓库写入权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;code&gt;content/kanban/&lt;/code&gt; 目录、ReDeplog 流水线。&lt;/p&gt;
&lt;h2 id=&quot;can-kao-su-cai&quot;&gt;参考素材&lt;/h2&gt;
&lt;p&gt;@priority 1&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
article_details 图标行&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot; checked=&quot;&quot;/&gt;
Trello 列布局截图&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id=&quot;mu-biao&quot;&gt;目标&lt;/h1&gt;
&lt;h2 id=&quot;wan-cheng-hou-zhou-ji-hua-ke-shi-hua-guan-li&quot;&gt;完成后：周计划可视化管理&lt;/h2&gt;
&lt;p&gt;@priority 5
@goal complete&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
列表页一眼看清加权进度&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
明细页拖拽预览 + Edit Post 回写&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实现 Trello 式五列看板，替代纯 Markdown 表格维护。&lt;/p&gt;
&lt;h2 id=&quot;wei-wan-cheng-jin-du-shi-kong-yu-shi-xiao&quot;&gt;未完成：进度失控与失效&lt;/h2&gt;
&lt;p&gt;@priority 4
@goal risk&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
待办堆积超过 3 条&lt;/li&gt;
&lt;li&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;/&gt;
长期不更新周计划&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;列表页标红警示；周计划失去追踪意义，部署与开发节奏脱节。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zsh Autocomplete DIY</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/zsh-autocomplete-diy/"/>
        <id>https://suchaharcan.github.io/03Share_blog/zsh-autocomplete-diy/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/zsh-autocomplete-diy/">&lt;blockquote&gt;
&lt;p&gt;契机：zsh 智能提示 和 BSH 两个都想要，但是 不兼容， Gemini 推荐 zsh-autocomplete插件， 简单尝试下，果断切换
问题：默认zsh智能补全自带的， 需手动 添加 homebrew中的zsh补全文件， 自定义的cli命令/函数 的 智能补全方案的尝试
主要 集中 和 常用的就是 自定义 函数 如何进行加载&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;该文件 提前加载进来 ， 补充 &lt;code&gt;_cs_completion&lt;/code&gt;和 &lt;code&gt;compdef _cs_completion cs&lt;/code&gt;即可&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;2026年06月10日&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 功能： 防爆折行、严选护眼相位、哈希去重消费，融入了现代化的实时补全系统&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cs&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/00Fortunes/bin&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; src_dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/00Fortunes/src&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 新增：源码目录变量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; pool_file&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; map_file&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_map&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; temp_output&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_current&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 新增参数解析：支持 --edit 参数跳转&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;--edit&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;src_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;📂 [词库编辑]: 正在前往源码目录...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            cd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;src_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🚨 [路径错误]: 未找到源码目录 &lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;src_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;，正在为你创建...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;src_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;src_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    elif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-10 z-l-i z-d-8 z-d-i&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;        #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 如果输入了其他不认识的参数，给予友好提示&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;💡 [使用提示]:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        cs         - 随机读取一条未读格言 (彩虹小牛)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;        cs --edit  - 快速跳转至词库源码目录进行编辑&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        return&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 严选护眼相位池&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 45&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 15&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 135&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 150&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 165&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 315&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 330&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; random_idx&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;RANDOM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; )&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; chosen_phase&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;random_idx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;md5&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    !&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; command&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; md5&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;md5sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 逻辑 1：桶初始化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🔄 [哈希重置]: 正在为你的精美词库建立全量唯一哈希索引池...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        local&lt;/span&gt;&lt;span&gt; raw_all&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        for&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.dat &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.tmp &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.pool &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.map &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                raw_all&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\n%\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;raw_all&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            BEGIN { RS=&amp;quot;\n%\n&amp;quot;; block=&amp;quot;&amp;quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                clean_block = $0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                gsub(/^[ \t\n]+|[ \t\n]+$/, &amp;quot;&amp;quot;, clean_block);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                if (clean_block != &amp;quot;&amp;quot; &amp;amp;&amp;amp; clean_block != &amp;quot;%&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print &amp;quot;---BLOCK_START---&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print $0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print &amp;quot;---BLOCK_END---&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;---BLOCK_START---&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            elif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;---BLOCK_END---&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; my_hash&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;{print $1}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==HASH:&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;my_hash&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;my_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            shuf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 逻辑 2：精准消费&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; target_hash&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;head&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; \t\r\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;target_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        sed&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/==HASH:&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;target_hash&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==/,/^%%/p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1d;/\^%%/d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/^%%/d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 【全新护眼抗洪核心】：折行防爆 + 动态方框&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1. 展开 Tab 键，同时利用 fold 命令限制单行视觉最大显示宽为 90（支持中文智能截断）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    这样超长命令会自动换到下一行，绝不会把方框和 lolcat 撑爆！&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; clean_text&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;expand&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; fold&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 90&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2. 动态精准计算截断后的最大列宽&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                    ((&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line_w&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                done&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean_text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                ((&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 24&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 绘制方框顶部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  ╭&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;─%.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;╮\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3. 完美包裹折行后的正文&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; total_spaces&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;padding_x&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;total_spaces&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                done&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean_text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 绘制方框底部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  ╰&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;─%.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;╯\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            )&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;chosen_phase&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;F&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0.20&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 4. 灰色小牛独立打印&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[1;30m         &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   ^__^&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;          \\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  (oo)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;_______&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             (__)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       )&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 ||----w |&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 ||     ||\033[0m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 5. 裁剪哈希桶&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            local&lt;/span&gt;&lt;span&gt; tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.tmp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            tail&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            cat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 6. 统计剩余数量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            local&lt;/span&gt;&lt;span&gt; remain_count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[0;37m📊 [词库统计]: 今日箴言已读。池子里还剩 💡 \033[1;32m&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;remain_count&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[0;37m 条未读内容。\033[0m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            fortune&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🚨 [异常触发]: 索引映射发生错位，正在强制重置重洗...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        fortune&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ==============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 专属 cs 函数的 Zsh 智能补全脚本（完美适配 zsh-autocomplete / fzf-tab）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ==============================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;_cs_completion&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 核心要点：描述必须紧跟在参数后面的中括号内，不能用冒号分隔！&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 这样 zsh-autocomplete 的正则引擎才能百分之百解析它是一个合法 Option&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;    _arguments&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; \&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;--edit[📂 跳转至词库源码目录进行编辑]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 注册绑定&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;compdef&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; _cs_completion&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cs&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Fortune - 适配改造分享</title>
        <published>2026-06-06T00:00:00+00:00</published>
        <updated>2026-06-06T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/fortune-diy/"/>
        <id>https://suchaharcan.github.io/03Share_blog/fortune-diy/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/fortune-diy/">&lt;h1 id=&quot;fortune-que-xian-miao-shu&quot;&gt;fortune 缺陷描述&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;默认词库不合心意，但可手动维护&lt;/li&gt;
&lt;li&gt;纯随机算法，无法保证每条摘录能出现&lt;/li&gt;
&lt;li&gt;默认输出文本颜色样式呆板&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;she-ji-si-lu&quot;&gt;设计思路&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;lolcat , cowsay 解决 呆板， 实现彩虹色 输出&lt;/li&gt;
&lt;li&gt;fortune 参数可指定 词库，但无记忆统计功能&lt;/li&gt;
&lt;li&gt;哈希桶 思路解决 记忆&lt;/li&gt;
&lt;li&gt;编写Makefile实现自动编译并生成哈希文件&lt;/li&gt;
&lt;li&gt;编写Function 适配&lt;/li&gt;
&lt;li&gt;词库直接由坚果云同步，解决备份不丢失问题&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;最初我只描述 实现效果，没有参与逻辑设计，被动测试和把控；&lt;br/&gt;
随机生成的思路 一眼假 或者说是 似是而非，总是有漏洞，所以 AI还需要发展，需要设计者 参与核心思路的设计 和 主动把控；&lt;br/&gt;
AI作为 解放代码和快速编写还是 很不错的，快速生成，简单审核内容和逻辑是否偏离&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;使用哈希 一次性 将 所有内容 哈希化，不依赖原生fortune直接调用，因为它是纯随机的，通过哈希可以主动校验&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;微调lolcat 避免彩虹干扰眼睛       &lt;br&gt;&lt;br /&gt;
微调 cowsay对中文，过长文本的排版错乱限制，手动动态生成 边框 &lt;br/&gt;
统计打印输出剩余可读数量&lt;br/&gt;
初次AI使用 rm命令，我系统 rm已被safely-rm接管，除非手动指出绝对路径，但 本身的思路就是不对，只需要将文件内容清空而非 删除再重建&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1 id=&quot;an-zhuang&quot;&gt;安装&lt;/h1&gt;
&lt;h2 id=&quot;ji-chu-bao&quot;&gt;基础包&lt;/h2&gt;
&lt;p&gt;仅安装这一个 其余通过脚本来满足个性化现代改造&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; install&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fortune&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;提供基础fortune设置词库和解析词库的能力&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h3 id=&quot;yan-zheng-shi-fou-an-zhuang-cheng-gong&quot;&gt;验证：是否安装成功&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; brew&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; info&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fortune&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                                                   ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fortune&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ✔:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; stable&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9708&lt;/span&gt;&lt;span&gt; (bottled&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Infamous&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; electronic&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; fortune-cookie&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; generator&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;https://www.ibiblio.org/pub/linux/games/amusements/fortune/!INDEX.html&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Installed&lt;/span&gt;&lt;span&gt; (on&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; request&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;From:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; https://mirrors.ustc.edu.cn/homebrew-core.git/Formula/f/fortune.rb&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;License:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; BSD-4-Clause-UC&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;=&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Installed&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Kegs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; and&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Versions&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;fortune&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ✔&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 9708&lt;/span&gt;&lt;span&gt; (85&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; files,&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 2.6MB&lt;/span&gt;&lt;span&gt;) &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;Linked&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;chuang-jian-ge-ren-ci-ku&quot;&gt;创建个人词库&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;创建 词库根文件夹，示例提供的是00Fortunes
下方 提供 目录结构 bin 存储编译结果， Makefile为编译工具， src存放词库
因为 src 文件 走坚果云同步所以是引用文件夹，也一并补充 具体内容&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tree&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                                                                ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;│  &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cli_tools&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;│  &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cli_tools.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;│  &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; micro_think&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;│  &lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; └──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; micro_think.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Makefile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;└──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; src&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/Library/CloudStorage/坚果云/src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; tree&lt;/span&gt;&lt;span&gt;                                                        &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;.&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;├──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; cli_tools&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;└──&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; micro_think&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;chuang-jian-han-shu-jiao-ben&quot;&gt;创建函数脚本&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;建议创建独立的zsh脚本文件，引入到你的配置文件中 或者直接复制粘贴到你的配置文件（.zshrc/.bashrc)中 &lt;br/&gt;
默认函数名称 cs 和 fortune-sync 可修改&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2026年06月06日&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 打印输出函数 &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; fortune_cs.zsh文件形式保存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-1 z-l-i z-d-3 z-d-i&quot;&gt;function&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; cs&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/00Fortunes/bin&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; pool_file&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; map_file&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_map&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; temp_output&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_current&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 严选护眼相位池&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 45&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 60&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 15&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 135&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 150&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 165&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 315&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 330&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; random_idx&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;RANDOM&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; )&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; chosen_phase&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;eye_safe_phases&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;random_idx&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;md5&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    !&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; command&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;v&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; md5&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;md5sum&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 逻辑 1：桶初始化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ||&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🔄 [哈希重置]: 正在为你的精美词库建立全量唯一哈希索引池...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;        local&lt;/span&gt;&lt;span&gt; raw_all&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        for&lt;/span&gt;&lt;span&gt; f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; in&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.dat &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.tmp &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.pool &lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;:&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; !=&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; *&lt;/span&gt;&lt;span&gt;.map &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                raw_all&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\r&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\n%\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;raw_all&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            BEGIN { RS=&amp;quot;\n%\n&amp;quot;; block=&amp;quot;&amp;quot; }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                clean_block = $0;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                gsub(/^[ \t\n]+|[ \t\n]+$/, &amp;quot;&amp;quot;, clean_block);&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                if (clean_block != &amp;quot;&amp;quot; &amp;amp;&amp;amp; clean_block != &amp;quot;%&amp;quot;) {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print &amp;quot;---BLOCK_START---&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print $0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                    print &amp;quot;---BLOCK_END---&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;            }&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;        &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;---BLOCK_START---&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;                block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            elif&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; ==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;---BLOCK_END---&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; my_hash&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;md5_cmd&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; awk&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;{print $1}&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==HASH:&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;my_hash&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%%&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;my_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -z&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;block_content&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;|&lt;/span&gt;&lt;span&gt; block_content&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;+=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;            fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        done&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            shuf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.raw&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 逻辑 2：精准消费&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =================================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;    local&lt;/span&gt;&lt;span&gt; target_hash&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;head&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; \t\r\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;target_hash&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        sed&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/==HASH:&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;target_hash&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;==/,/^%%/p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;map_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;1d;/\^%%/d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; sed&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/^%%/d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        if&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; [[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; then&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; ✨ 【全新护眼抗洪核心】：折行防爆 + 动态方框&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            (&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1. 展开 Tab 键，同时利用 fold 命令限制单行视觉最大显示宽为 90（支持中文智能截断）&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    这样超长命令会自动换到下一行，绝不会把方框和 lolcat 撑爆！&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; clean_text&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;expand&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;t&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 4&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; fold&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;w&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 90&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2. 动态精准计算截断后的最大列宽&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;0&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                    ((&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line_w&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                done&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean_text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                local&lt;/span&gt;&lt;span&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;                ((&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 24&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ))&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span&gt; max_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;2&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;4&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 绘制方框顶部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  ╭&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;─%.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;╮\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 3. 完美包裹折行后的正文&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                while&lt;/span&gt;&lt;span&gt; IFS&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; read&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;r&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; do&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;#&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;                    local&lt;/span&gt;&lt;span&gt; total_spaces&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; line_w&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;padding_x&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;%s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;line&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;total_spaces&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                    printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;                done&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&amp;lt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;clean_text&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  │&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; %.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;│\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;                #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 绘制方框底部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  ╰&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;─%.0s&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; {1..&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;max_w&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; padding_x&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;                printf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;╯\n&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;            )&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span&gt;chosen_phase&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;F&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 0.20&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;S&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt; 1&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 4. 灰色小牛独立打印&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[1;30m         &lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;   ^__^&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;          \\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  (oo)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;_______&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;             (__)&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;       )&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-3 z-d-6&quot;&gt;\\&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 ||----w |&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                 ||     ||\033[0m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 5. 裁剪哈希桶&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; =========================================================&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            local&lt;/span&gt;&lt;span&gt; tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;{&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-4 z-d-7&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.tmp&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            tail&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;n&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; +2&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            cat&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;tmp_pool&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;            #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 6. 统计剩余数量&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-l-i z-d-9 z-d-i&quot;&gt;            local&lt;/span&gt;&lt;span&gt; remain_count&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wc&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;l&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; tr&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;#39;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            echo&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;e&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[0;37m📊 [词库统计]: 今日箴言已读。池子里还剩 💡 \033[1;32m&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;remain_count&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;\033[0;37m 条未读内容。\033[0m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;            fortune&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;        fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    else&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🚨 [异常触发]: 索引映射发生错位，正在强制重置重洗...&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;pool_file&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;        fortune&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;fortune_dir&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; |&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; lolcat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;    fi&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;    [&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; -f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; ]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; :&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt; &amp;gt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;temp_output&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2026年06月06日&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 功能清单：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1. 编译生成 bat源词库&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2. 清理既往中间池， 保证 源词库 与 中间池一致的问题&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; Makefile 文件 &lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2026年06月06日&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 功能清单：&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 1. 编译生成 fortune 专用 .dat 源词库&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 2. 生成最新哈希文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 路径定义&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; bin&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;STRFILE&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /opt/homebrew/bin/strfile&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 【核心升级】定义最新的哈希池与哈希映射表文件路径&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;HASH_POOL&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_pool&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;HASH_MAP&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;  =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/.fortune_hash_map&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 获取 src 下所有没有后缀的文件名&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SOURCES&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;wildcard&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 定义目标文件：每个源文件在 bin 目录下都要有一个对应的文本和 .dat 文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;TARGET_TEXTS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;patsubst&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/%,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/%,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SOURCES&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;TARGET_DATS&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; =&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;patsubst&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/%,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/%.dat,&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SOURCES&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;all:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;TARGET_DATS&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 创建 bin 目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	mkdir&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;p&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 规则：当 src 下的文本更新时，同步到 bin 并生成 .dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;/%.dat: &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;SRC_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;/%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	@echo&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;🛠️  Processing: $&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	@cp&lt;/span&gt;&lt;span&gt; $&lt;/span&gt;&lt;span class=&quot;z-l-9 z-d-9&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	@$(STRFILE&lt;/span&gt;&lt;span&gt;) -s &lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;$(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;$&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt;*&lt;/span&gt;&lt;span&gt;.dat&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;	#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 【数据一致性联动】只要有任何源文件更新，使用原生系统命令绝对路径强刷哈希桶与字典&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;	#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 绕过 rm-safely 的物理删除，迫使 cs 函数在下次运行时重新全量生成哈希字典并打散洗牌&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	@/bin/rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;HASH_POOL&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;HASH_MAP&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;clean:&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;	rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;rf&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; $(&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BIN_DIR&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;.PHONY:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; all&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; clean&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; fortune-sync.zsh独立文件形式保存&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;fortune-sync&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; (&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; {&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;	(&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;		cd&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span&gt;$&lt;/span&gt;&lt;span&gt;HOME&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;/00Fortunes&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;amp;&amp;amp;&lt;/span&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; make&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;	)&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h1 id=&quot;shi-yong&quot;&gt;使用&lt;/h1&gt;
&lt;h2 id=&quot;ci-ku-wei-hu-fortun-sync&quot;&gt;词库维护 &lt;code&gt;fortun-sync&lt;/code&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;前置安装 工作完成，并重启刷新配置文件；
样例词库 cli_tools; &lt;br/&gt;
每条以%作为分隔符&lt;br/&gt;
编辑完成后 &lt;code&gt;fortune-sync&lt;/code&gt; 生成词库文件&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm-safely更安全&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-help&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;查看帮助&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rmbuild&lt;/span&gt;&lt;span class=&quot;z-l-4 z-l-i z-d-7 z-d-i&quot;&gt; *&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 清空build编译输出目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-list-trash&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 列出&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;-empty-trash&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;清空&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;/bin/rm&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;f&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;系统内置rm命令地址&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ccache&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;重置统计&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;ccache&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;s&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;查看统计&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;container&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; start&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;i&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; gcc16&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 交互模式进入容器&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;brewup&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;批量更新工具链&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;mo&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; optimize&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 硬件优化&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; music&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;跳转已进入的目录&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;autojump&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 底层是这个，后续有更复杂需求&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ，编写函数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;fortune&lt;/span&gt;&lt;span&gt;  -&lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 个人谮言&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /备忘录&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /Users/songhoujin/00Fortunes/src&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;fortune-sync&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;      #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;编辑更新完 同步更新生成最新哈希值&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cs&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 基于哈希桶的带有记忆功能的fortune函数&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Little&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; Snitch&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 网络出关设置&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Object-See&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;BlockBlock&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 检测持久化拦截&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;KnockKnock&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 恶意软件检测&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;p10k&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; configure&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 自带的配置流程&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;cloc&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; -&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 静态代码信息打印输出&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;%&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;da-yin-shu-chu-cs&quot;&gt;打印输出 &lt;code&gt;cs&lt;/code&gt;&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;直接 输入cs 即可查看效果&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://suchaharcan.github.io/03Share_blog/fortune-diy/fortune-output.png&quot; alt=&quot;输出样例&quot; /&gt;&lt;/p&gt;
&lt;h1 id=&quot;zhi-shi-zheng-liu-zheng-li&quot;&gt;知识蒸馏整理&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;通过 编写自定义脚本，和AI交互中，学到哪些新的知识和技能？&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;cha-kan-man-bang-zhu-shou-ce-cao-zuo&quot;&gt;查看 man 帮助手册操作&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;默认使用 &lt;code&gt;less&lt;/code&gt; 文本阅读器
所以man 命令的快捷键 和 less 一致；
&lt;strong&gt;基础翻页&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;f（Forward&lt;/span&gt;&lt;span&gt;) 向下翻一页； Sace, PageDown&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;b&lt;/span&gt;&lt;span&gt; (Backward&lt;/span&gt;&lt;span&gt;) 向上翻一页； PageUp&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;d&lt;/span&gt;&lt;span&gt; (Down&lt;/span&gt;&lt;span&gt;) 向下翻半页；&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;u&lt;/span&gt;&lt;span&gt; (Up&lt;/span&gt;&lt;span&gt;) 向上翻半页； &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;微调滚行&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;j&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :向下滚动一行&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;k&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; :向上滚动一行&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;瞬间跃迁&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;g:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 手册顶部&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;G:手册底部&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;强力搜索&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;/+关键字&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ，向下搜索内容，&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; eg:&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; /---stream&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; ，高亮所有匹配项&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;？+关键字，&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; 向上搜索内容&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;n(Next&lt;/span&gt;&lt;span&gt;)：配合搜索使用， 跳转到下一个高亮关键字&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;N（Shift+n&lt;/span&gt;&lt;span&gt;) 配合搜索使用， 反向跳转上一个高亮关键字&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;退出&lt;/strong&gt;
q(QUit) 退出手册，切回控制台&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;bat&lt;/code&gt; , &lt;code&gt;cat&lt;/code&gt; 获取文件内容&lt;/li&gt;
&lt;li&gt;&lt;code&gt;pbcopy&lt;/code&gt; 将管道内容粘贴到剪切板中&lt;/li&gt;
&lt;li&gt;&lt;code&gt;tree&lt;/code&gt; 打印输出目录结构&lt;/li&gt;
&lt;li&gt;&lt;code&gt;cloc&lt;/code&gt; 代码行统计工具&lt;/li&gt;
&lt;/ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>One</title>
        <published>2026-06-05T00:00:00+00:00</published>
        <updated>2024-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/00Read_blog_English/test-one/"/>
        <id>https://suchaharcan.github.io/00Read_blog_English/test-one/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/00Read_blog_English/test-one/">&lt;p&gt;墨墨记单词 周进度和 安排&lt;/p&gt;
</content>
        
    </entry>
    
    <entry xml:lang="en">
        <title>One</title>
        <published>2026-06-05T00:00:00+00:00</published>
        <updated>2024-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog/test-one/"/>
        <id>https://suchaharcan.github.io/01Write_blog/test-one/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog/test-one/">&lt;h2 id=&quot;ce-shi&quot;&gt;测试&lt;/h2&gt;
&lt;p&gt;TL;DR: Fun game.&lt;/p&gt;
&lt;p&gt;As you may know, I occasionally play games, which is shocking in itself, but even more shocking is that I’ve never blogged about it, so let’s change that! (well, I just don’t know what to blog about xD)&lt;/p&gt;
&lt;h2 id=&quot;ce-shi-1&quot;&gt;测试&lt;/h2&gt;
&lt;p&gt;Teardown is a game released back in 2022, but I have played the early access version released in 2020 on YouTube (as in, I watched let’s plays). Recently I decided to replay it, and it’s been pretty fun, the process of&lt;/p&gt;
&lt;h3 id=&quot;ce-shi-de&quot;&gt;测试的&lt;/h3&gt;
&lt;p&gt;carefully coming up with an optimal route and then executing it in under 60 seconds is pretty entertaining. My little brother seems to enjoy watching all this happen as well.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>CMake 学习</title>
        <published>2026-06-05T00:00:00+00:00</published>
        <updated>2026-06-26T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog_CMake/first-base-chater/"/>
        <id>https://suchaharcan.github.io/01Write_blog_CMake/first-base-chater/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog_CMake/first-base-chater/">&lt;blockquote class=&quot;markdown-alert-note&quot;&gt;
&lt;p&gt;官方文档 和 Professional CMake: A Practical Guide 是第一信息源
本地 仓库 已建立
2026-06-25 开始到月底30号  共计 5天 ，搞定它 时间足够充裕&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一天速通 CMake 的“核心困难“不在语法，而在心智模型。官方文档是参考手册而不是教程，按顺序读很容易陷入“每个命令都认识、但就是不会搭项目“的状态。核心困难点大致如下：
三阶段心智模型（最大的坎）
CMake 不是“怎么编译“的脚本，而是“配置 → 生成 → 构建“三阶段：cmake -S . -B build 只做 configure + generate，生成 Ninja/Makefile 后才真正编译。所有变量和条件判断都在配置期求值，没有“运行时“概念。不理解这一点，后面所有现象都会显得“莫名其妙“。&lt;/p&gt;
&lt;p&gt;新旧两种范式并存，必须只学新的
旧风格是改全局变量（include_directories、add_definitions、CMAKE_CXX_FLAGS），新风格（Modern CMake）是以 target 为中心：target_include_directories、target_link_libraries、target_compile_features，靠 PUBLIC / PRIVATE / INTERFACE 传播依赖。官方文档里两种风格混着写，网上旧答案更是遍地旧风格。困难在于：你要主动忽略旧范式，否则会学出“能跑但一扩展就崩“的项目。&lt;/p&gt;
&lt;p&gt;生成器表达式（Generator Expressions）
$&amp;lt;BUILD_INTERFACE:…&amp;gt;、$&amp;lt;TARGET_PROPERTY:…&amp;gt; 这类 $&amp;lt;…&amp;gt; 是“生成期“才求值的语法，等于又加了一层求值时机。写库的导出、条件编译、路径传播时绕不开，是新手最容易卡住的地方。&lt;/p&gt;
&lt;p&gt;依赖管理的丛林
find_package（MODULE vs CONFIG 模式）、FetchContent、add_subdirectory、ExternalProject、imported target 概念。真实项目 70% 的 CMake 时间都花在这里。一天内只掌握 find_package + FetchContent 两个就够用，其余的知道存在即可。&lt;/p&gt;
&lt;p&gt;官方文档是“字典“，不是“路线图“
文档按命令/变量/属性组织，读了不会形成“项目该怎么分层、目录怎么放、哪些用 target 属性哪些用 cache 变量“的结构感。速通的关键是对照真实小项目读，而不是线性读文档。&lt;/p&gt;
&lt;p&gt;调试体验差
报错往往信息量低（“No rule to make target”、policy 警告、IMPORTED_LOCATION 未设置）。你得会 cmake –trace、message() 打日志、–debug-output，否则卡住时只能瞎猜。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>One</title>
        <published>2026-06-05T00:00:00+00:00</published>
        <updated>2024-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog/test-one/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog/test-one/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog/test-one/">&lt;h2 id=&quot;ce-shi&quot;&gt;测试&lt;/h2&gt;
&lt;p&gt;TL;DR: Fun game.&lt;/p&gt;
&lt;p&gt;As you may know, I occasionally play games, which is shocking in itself, but even more shocking is that I’ve never blogged about it, so let’s change that! (well, I just don’t know what to blog about xD)&lt;/p&gt;
&lt;h2 id=&quot;ce-shi-1&quot;&gt;测试&lt;/h2&gt;
&lt;p&gt;Teardown is a game released back in 2022, but I have played the early access version released in 2020 on YouTube (as in, I watched let’s plays). Recently I decided to replay it, and it’s been pretty fun, the process of&lt;/p&gt;
&lt;h3 id=&quot;ce-shi-de&quot;&gt;测试的&lt;/h3&gt;
&lt;p&gt;carefully coming up with an optimal route and then executing it in under 60 seconds is pretty entertaining. My little brother seems to enjoy watching all this happen as well.&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-04T05:14:12+00:00</published>
        <updated>2026-06-04T05:14:12+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-04t05-14-12z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-04t05-14-12z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-04t05-14-12z/">&lt;h1 id=&quot;done&quot;&gt;Done&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;归档功能 - 适配 多分类下的 综合展示 跳转&lt;/li&gt;
&lt;li&gt;移植 Blog - Article 核心功能可用状态&lt;/li&gt;
&lt;li&gt;尝试 产品展示页面 浮动特效 失败&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;undo&quot;&gt;Undo&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;模板数据 未移除&lt;/li&gt;
&lt;li&gt;电子屏的ASCII 有软件进行生成&lt;/li&gt;
&lt;/ol&gt;
&lt;h1 id=&quot;doing&quot;&gt;Doing&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;今天就动手学习 CMake&lt;/li&gt;
&lt;/ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-03T10:02:29+00:00</published>
        <updated>2026-06-03T10:02:29+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-03t10-02-29z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-03t10-02-29z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-03t10-02-29z/">&lt;p&gt;碎碎念&lt;/p&gt;
&lt;p&gt;目前环境网络波动， 容易损耗 镜面屏电容寿命，心疼。
购买华为UPS800W(间接限定后续服务器的瓦数)&lt;/p&gt;
&lt;p&gt;目前基础 后端服务 搭载在公网上， 流水线借助GitHub(编译后清空源码信息)
后面 使用 自有服务器；
暂定的DIY方案&lt;/p&gt;
&lt;p&gt;🛠 EPYC 7502 编译服务器搭建方案📊 硬件配置与预算清单部件推荐型号/规格价格 (元)选型理由CPUAMD EPYC 7502 (正代正式版)~100032核64线程，并行编译的绝对主力，Zen2 架构。主板永擎 (Asrock Rack) ROMED8-2T 或 超微 H12SSL-i~900SP3插槽（支持7002系列）。自带 IPMI 远程管理，带双千兆或万兆网口。内存DDR4 2666MHz ECC REG 16G × 4 (共64G)~280C++ 编译大型项目非常吃内存，先上 4 根跑满 4 通道，后期可补满 8 根。系统/编译盘三星 PM9A1 1TB 或 致态 TiPro7000 1TB~450编译时会产生密集的 I/O 读写，必须用高质量、高性能的 PCIe 4.0 NVMe 固态。散热器拓普龙/超微 SP3 4热管/6热管风冷~120专为服务器 LGA4094/SP3 接口设计的散热器。电源长城巨龙 1250W 或 海韵/全汉 750W 品牌二手~150 - 2007502 的 TDP 是 180W，满载编译加上主板内存，额定 650W - 750W 比较稳妥。机箱普通 ATX 兼容大机箱 / 4U 工业机箱~80只要能塞下 ATX 主板和服务器散热器即可。总计约 2980 元万元以内无敌的编译生产力工具&lt;/p&gt;
&lt;p&gt;💡 方案深度解析与注意事项&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;为什么主板这么贵？（服务器主板的灵魂：IPMI）
服务器主板（如永擎、超微）自带一颗特殊的芯片叫 IPMI（远程管理卡）。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;不需要显卡： 这颗 CPU 没有核显，主板自带了基础显示芯片，你甚至不需要插独立显卡。&lt;/p&gt;
&lt;p&gt;盲操远程： 只要插上电源和网线，你在你日常用的笔记本上，通过浏览器输入服务器的 IP 地址，就能远程看屏幕、进 BIOS、挂载本地 ISO 镜像重装 Linux 系统、远程开断电。这才是纯正的服务器体验。&lt;/p&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;为什么选 16G × 4 内存？
C++ 并行编译的黄金法则是：每个编译线程（Thread）至少分配 2GB - 4GB 的内存。
你现在有 64 个线程：&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如果只给 16G/32G 内存，当 make -j64 全开时，内存会瞬间爆掉，导致触发 Linux 的 OOM Killer 机制直接崩溃。&lt;/p&gt;
&lt;p&gt;64G 内存是这颗 32 核处理器的及格线。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;网络与存储扩展
这类工业级主板上通常带有 SlimSAS 或 Oculink 接口，以及大量的 PCIe 插槽。这意味着，如果你以后想让它兼顾 NAS 存储功能，你不需要买任何转换卡，直接可以挂载 8-16 块大容量机械硬盘，或者插满 4 块 NVMe 固态硬盘做高速编译缓存。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;选项 A：AMD EPYC 7502（推荐：更先进、带宽高）
核心参数： 32核 64线程，基础频率 2.5GHz，加速 3.3GHz。&lt;/p&gt;
&lt;p&gt;CPU价格： ~1000 元（随着 7002/7003 系列退役，目前性价比极高）。&lt;/p&gt;
&lt;p&gt;为什么选它： 它是 Zen 2 架构（7nm），单核性能比老一代大涨。更恐怖的是它支持 8通道 DDR4 内存。C++ 编译在链接（Linking）阶段需要极高的内存吞吐，8通道是无敌的存在。&lt;/p&gt;
&lt;p&gt;围绕 AMD EPYC 7502 这颗 CPU 搭建的服务器，整机的功耗（瓦数）需要分三个场景来看：待机功耗、日常轻载功耗、以及最关键的多核全满载编译功耗。以下是具体的瓦数测算和电源选型建议：📊 整机功耗（瓦数）实测预估运行场景CPU 自身功耗整机总功耗（含主板/内存/SSD）10小时电费估算 (按0.6元/度)1. 远程待机 (挂机/写代码不编译)~30W - 40W约 70W - 90W~0.5 元2. 日常轻载 (跑几个Docker/轻量运行)~50W - 60W约 100W - 120W~0.7 元3. C++ 多核全满载编译 (make -j64)180W (满TDP)约 240W - 260W~1.5 元&lt;/p&gt;
&lt;p&gt;总计 3000 元;&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Third</title>
        <published>2026-06-03T00:00:00+00:00</published>
        <updated>2024-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/01Write_blog/zola-shu-ju-mo-ban-xi-jie/"/>
        <id>https://suchaharcan.github.io/01Write_blog/zola-shu-ju-mo-ban-xi-jie/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/01Write_blog/zola-shu-ju-mo-ban-xi-jie/">&lt;p&gt;一、 彻底搞懂 paginator 与 section在 Zola 中，section 和 paginator 是两个最核心的上下文对象，它们决定了数据如何流向模板。1. 什么是 section.pages？是什么：它代表当前目录（Section）下包含的所有文章（Pages）的集合（一个数组）。判定与生效机制：结构判定：无论是单文件 hello.md，还是文件夹包裹的 hello/index.md，只要它们躺在 content/01Write_blog/ 目录下，Zola 就会把它们识别为该目录的 Page。致命的过滤判定（为什么你之前会失踪）：Zola 默认是按照时间（Date）对 section.pages 进行排序的。如果你的 .md 文件中：没有写 date 字段。或者 date 格式不规范。或者你没有在 _index.md 中显式指定 sort_by = “date”。Zola 在渲染 section.pages 时，可能会因为排序混乱或未发布（如误识别为草稿），导致计算出的 section.pages | length 变成 0。2. 什么是 paginator.pages？是什么：它是当前分页切片后的文章集合（比如第 1 页的 10 篇文章）。判定与生效机制：它不会自动产生。只有当你在该目录的 _index.md 中，显式地配置了 paginate_by = 数字 时，Zola 才会实例化 paginator 对象。一旦开启，section.pages 的控制权就会移交给 paginator.pages。📊 它们在模板中的各自作用对象属性存在条件主要作用section.pages只要目录下有有效文章就有值用来不分页地一次性循环输出所有文章。paginator.pages必须在 _index.md 中配置 paginate_by用来做翻页导航（上一页/下一页），只展示当前页内容。&lt;/p&gt;
&lt;p&gt;在 Zola 中，section.pages 默认只能抓取到当前目录下直属的文章。
比如，你的归档页面在 content/archives/_index.md，如果你把博客都放在 content/01Write_blog/ 下，由于它们是平级（兄弟）关系，或者是完全独立的树枝，archives 页面去读取 section.pages 时，拿到的结果必然是空的（长度为 0），因此它什么都渲染不出来。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Third</title>
        <published>2026-06-03T00:00:00+00:00</published>
        <updated>2024-09-28T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/02Engineer_blog/zola-shu-ju-mo-ban-xi-jie/"/>
        <id>https://suchaharcan.github.io/02Engineer_blog/zola-shu-ju-mo-ban-xi-jie/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/02Engineer_blog/zola-shu-ju-mo-ban-xi-jie/">&lt;p&gt;一、 彻底搞懂 paginator 与 section在 Zola 中，section 和 paginator 是两个最核心的上下文对象，它们决定了数据如何流向模板。1. 什么是 section.pages？是什么：它代表当前目录（Section）下包含的所有文章（Pages）的集合（一个数组）。判定与生效机制：结构判定：无论是单文件 hello.md，还是文件夹包裹的 hello/index.md，只要它们躺在 content/01Write_blog/ 目录下，Zola 就会把它们识别为该目录的 Page。致命的过滤判定（为什么你之前会失踪）：Zola 默认是按照时间（Date）对 section.pages 进行排序的。如果你的 .md 文件中：没有写 date 字段。或者 date 格式不规范。或者你没有在 _index.md 中显式指定 sort_by = “date”。Zola 在渲染 section.pages 时，可能会因为排序混乱或未发布（如误识别为草稿），导致计算出的 section.pages | length 变成 0。2. 什么是 paginator.pages？是什么：它是当前分页切片后的文章集合（比如第 1 页的 10 篇文章）。判定与生效机制：它不会自动产生。只有当你在该目录的 _index.md 中，显式地配置了 paginate_by = 数字 时，Zola 才会实例化 paginator 对象。一旦开启，section.pages 的控制权就会移交给 paginator.pages。📊 它们在模板中的各自作用对象属性存在条件主要作用section.pages只要目录下有有效文章就有值用来不分页地一次性循环输出所有文章。paginator.pages必须在 _index.md 中配置 paginate_by用来做翻页导航（上一页/下一页），只展示当前页内容。&lt;/p&gt;
&lt;p&gt;在 Zola 中，section.pages 默认只能抓取到当前目录下直属的文章。
比如，你的归档页面在 content/archives/_index.md，如果你把博客都放在 content/01Write_blog/ 下，由于它们是平级（兄弟）关系，或者是完全独立的树枝，archives 页面去读取 section.pages 时，拿到的结果必然是空的（长度为 0），因此它什么都渲染不出来。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title></title>
        <published>2026-06-01T23:05:22+00:00</published>
        <updated>2026-06-01T23:05:22+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/nanolog/2026-06-01t23-05-22z/"/>
        <id>https://suchaharcan.github.io/nanolog/2026-06-01t23-05-22z/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/nanolog/2026-06-01t23-05-22z/">&lt;p&gt;2026年06月02日&lt;/p&gt;
&lt;h2 id=&quot;xiu-fu&quot;&gt;修复&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;修复 Nanolog Edit编辑 不在 源代码的问题 (直接 编辑源码,但 不 立即推送更新到 公开仓库)&lt;/li&gt;
&lt;li&gt;重置 Nanolog 内容, 书写 自己的 网站 维护内容&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;xi-jie-da-mo&quot;&gt;细节打磨&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;博客网页 Nanolog处 添加 ReDeplog 按钮，同 Edit Post 一致 （编辑 源码，重编译推送） 已添加&lt;/li&gt;
&lt;li&gt;定时发送邮件 提醒自己 手动更新博客 待添加&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;kai-fa-jin-du&quot;&gt;开发进度&lt;/h2&gt;
&lt;h3 id=&quot;done&quot;&gt;Done&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;源码推送在Codeberg, 网站15天后自动拉取编译更新网站github.io ; 实现 源码/网站 分离 (优点: 高频推送隐私信息剥离,后续可加装 密码解锁网页;  缺点: 构建  与  推送 分离 需 单独管理)&lt;/li&gt;
&lt;li&gt;拆分一级板块:&lt;code&gt;Read&lt;/code&gt;, &lt;code&gt;Write&lt;/code&gt;,&lt;code&gt;Share&lt;/code&gt;,&lt;code&gt;Project&lt;/code&gt;, &lt;code&gt;Site Dev Log&lt;/code&gt; ; 及其 二级分类&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Nanolog&lt;/code&gt; 模块开发完成 . 处于可用状态 (展示,可 直接 Edit)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Blog&lt;/code&gt;模块 未完成(需 编写 index.html 及 blog.html 2个模板文件)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Basb&lt;/code&gt;模块开发完成,并处于 可用状态, 暂定 该模块 用来进行 周记录 ,  考虑 将  EditPost/ReDeplog功能同步过去 ;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;undo&quot;&gt;UnDo&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;熟悉 该主题文件 的MD 博客编辑模式(该模式 精细,具有观赏性)&lt;/li&gt;
&lt;li&gt;搜索功能 待开发(index.html 自有功能)&lt;/li&gt;
&lt;li&gt;密码封锁 爬虫 和 无关访客 (该模块优先 开发 ,最小可用方案推出,后续迭代)&lt;/li&gt;
&lt;li&gt;在Nanolog 中 添加 固定 格式： 约定更新时间， 考虑 添加 网页倒计时，并提前1小时 发送邮件提醒 给自己 该功能 可考虑&lt;/li&gt;
&lt;li&gt;Codeberg 中 补充 CI/CD 流水线, 该功能 还是必要的;&lt;/li&gt;
&lt;li&gt;后续添加后端服务 (C++编写 核心模块,  Go/.NET 进行Web后端API开发) 在 Vercel 或者 Cloudflare 中 进行 部署&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;doing&quot;&gt;Doing&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;Blog&lt;/code&gt; 模块 正在开发调试中&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&quot;xi-jie-bu-chong&quot;&gt;细节补充&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;完整流程阐述:&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;本地拉取 私有源码仓库 Codeberg, 更新构建成功后推送(Zed 编辑 模板, Obsidian 编辑 MD); 手动触发公开博客网站Github.io仓库workflow拉取编译最新源码; 菜单栏Deplog 提醒 构建推送状态;  NetNewWire 对网站进行RSS订阅&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;熟悉 了解 Zola功能 及 Ametrine主题功能&lt;/li&gt;
&lt;li&gt;对其他博主博客有趣 基础刚性功能 务必添加,但柔和功能考虑添加&lt;/li&gt;
&lt;li&gt;补充 CICD 流水线, 虽然本地是编译成功, github跨网站拉取codeberg 私有库也成功, 但 还是有必要进行构建cicd流水线的 熟悉流水线搭建,还有保证 环境搭建的流程 能够复现出来 ,例如 拉取主题仓库,更新依赖git模块, mac环境模拟zola 等细节 ;  该功能属于基础自动化功能,一旦实现,后续受益&lt;/li&gt;
&lt;li&gt;评论区? 自认为有价值 适合分享的文章, 我会 主动发布到 HackerNew 上的; 我个人 不加载 和存储 评论数据, 使用HackerNew 足够了;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&quot;chang-yong-ming-ling&quot;&gt;常用 命令&lt;/h3&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; pull&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 拉取最新代码，因为Nanolog 存在线上Edit Post，所以 本地修改需谨慎，优先拉取最新代码&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; add&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; .&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;   #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 添加所有修改的文件&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 查看修改状态&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; commit&lt;/span&gt;&lt;span&gt; -&lt;/span&gt;&lt;span&gt;m&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;update nanolog&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;  #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 提交修改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; push&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;    #&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 推送修改&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;上述操作 均是在本地编辑Codeberg仓库 ，与 公开网站Github无关&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt;#&lt;/span&gt;&lt;span class=&quot;z-l-6 z-l-i z-d-2 z-d-i&quot;&gt; 若基础信息更改， github 的编译流水线yml文件需同步修改，否则拉取编译失败&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;h2 id=&quot;yue-ding-yu-ding-xia-ci-geng-xin-shi-jian&quot;&gt;约定/预订 下次更新时间&lt;/h2&gt;
&lt;p&gt;本周六&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2026年5月广告与产品收入对账单</title>
        <published>2026-05-31T00:00:00+00:00</published>
        <updated>2026-05-31T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/工作开发/收入小结/5yue-zhang-dan/"/>
        <id>https://suchaharcan.github.io/basb/工作开发/收入小结/5yue-zhang-dan/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/工作开发/收入小结/5yue-zhang-dan/">&lt;p&gt;这里是三级明细《5月账单》的内容。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>2026年5月广告与产品收入对账单</title>
        <published>2026-05-31T00:00:00+00:00</published>
        <updated>2026-05-31T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/独立开发/收入小结/5yue-zhang-dan/"/>
        <id>https://suchaharcan.github.io/basb/独立开发/收入小结/5yue-zhang-dan/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/独立开发/收入小结/5yue-zhang-dan/">&lt;p&gt;这里是三级明细《5月账单》的内容。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git 常用 命令 集合</title>
        <published>2026-05-30T00:00:00+00:00</published>
        <updated>2026-05-30T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/git/"/>
        <id>https://suchaharcan.github.io/basb/git/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/git/">&lt;h2 id=&quot;fang-qi-ben-di-mou-wen-jian-xiu-gai&quot;&gt;放弃 本地 某文件修改&lt;/h2&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; gst&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                                                                                                         ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; m&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; M&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola.toml&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git submodule update --init --recursive --checkout --force themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;作用： 这行命令会强制（–force）将 themes/ametrine 子模块恢复到当前主项目 master 分支所记录的那个精确的 Commit 节点，直接抹去本地所有未提交的修改&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;cd themes/ametrine&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git reset --hard HEAD&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;git clean -fd&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;操作后，&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;❯&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; status&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;                                                                                                                                                                  ─╯&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; existing&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; alias&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;git status&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; You&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; use:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;gst&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt;Found&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; existing&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; git&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; alias&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; for&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;status&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; You&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; should&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; use:&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt; &amp;quot;&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt;git st&lt;/span&gt;&lt;span class=&quot;z-l-5 z-d-4&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span class=&quot;z-l-2 z-d-5&quot;&gt; M&lt;/span&gt;&lt;span class=&quot;z-l-8 z-d-10&quot;&gt; zola.toml&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gemini: Exe</title>
        <published>2026-05-30T00:00:00+00:00</published>
        <updated>2026-05-30T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/xue-xi-bi-ji/"/>
        <id>https://suchaharcan.github.io/basb/xue-xi-bi-ji/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/xue-xi-bi-ji/">&lt;h2 id=&quot;the-rewrite&quot;&gt;The Rewrite&lt;/h2&gt;
&lt;p&gt;The first rewrite attempt happened pretty much right after I published&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>自制 Zola 效率插件高效发布博客</title>
        <published>2026-05-30T00:00:00+00:00</published>
        <updated>2026-05-30T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/工作开发/工具软件/zolacha-jian/"/>
        <id>https://suchaharcan.github.io/basb/工作开发/工具软件/zolacha-jian/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/工作开发/工具软件/zolacha-jian/">&lt;p&gt;这里是三级明细《Zola插件》的内容。&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>自制 Zola 效率插件高效发布博客</title>
        <published>2026-05-30T00:00:00+00:00</published>
        <updated>2026-05-30T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/独立开发/工具软件/zolacha-jian/"/>
        <id>https://suchaharcan.github.io/basb/独立开发/工具软件/zolacha-jian/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/独立开发/工具软件/zolacha-jian/">&lt;p&gt;这里是三级明细《Zola插件》的内容。&lt;/p&gt;
&lt;pre class=&quot;giallo z-l-code z-d-code&quot; &gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        Reply    18&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ShioWSX      2024 年 10 月 18 日
建议是 AMD 的 9950X （预算不够就 7950X ） 64G ddr5 6400
1 、上半年我做过测试 笔记本的 6800H 7950X 双路 6133 以及 两个云服务器（ 32c 64G 配置） 一个 epyc 一个三代铂金志强
2 、综合下来 7950X 是最快的，我编译的是 Linux 5.10 和 mysql 5.8 全量编译,
3 、C++工程模版展开以及内联多是比较吃 cpu 的，C 系的工程相对开销小一点
4 、最关键的是最后的链接环节基本上是单核的，9950X 比服务器的 U 单核强的不是一点
5 、最后可以先上个云服务试一下，反正可以按小时计费，配置拉满测试一天也花不了多少，可以看看 Geekbench 多核跑分榜单
6 、如果项目确实很大，且长时间编译的话，得上服务器的 ECC 大内存了，毕竟家用只能上 128G 就到顶了&lt;/p&gt;
&lt;p&gt;一步到位&lt;/p&gt;
&lt;p&gt;C++编译 这个 条件足够使用了；&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Gemini: Exploring the Cozy World of Capsules and Space</title>
        <published>2026-05-20T00:00:00+00:00</published>
        <updated>2026-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/basb/bian-cheng/"/>
        <id>https://suchaharcan.github.io/basb/bian-cheng/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/basb/bian-cheng/">&lt;h2 id=&quot;backstory&quot;&gt;Backstory&lt;/h2&gt;
&lt;p&gt;It’s been about 4 months since the last post, all this time I’ve been procrastinating, doing some side projects, learning Blender, and… rewriting my website from scratch!&lt;/p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Zola Blog Site build deploy share</title>
        <published>2025-10-04T00:00:00+00:00</published>
        <updated>2025-10-04T00:00:00+00:00</updated>
        
        <author>
          <name>Suchaharcan</name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://suchaharcan.github.io/03Share_blog/zola-build-deploy-circle/"/>
        <id>https://suchaharcan.github.io/03Share_blog/zola-build-deploy-circle/</id>
        
        <content type="html" xml:base="https://suchaharcan.github.io/03Share_blog/zola-build-deploy-circle/">&lt;h2 id=&quot;shu-ju-liu-xiang-mo-ban-xi-jie&quot;&gt;数据流向 模板细节&lt;/h2&gt;
&lt;p&gt;分页 和 时间排序 必须选一个；
一、 彻底搞懂 paginator 与 section在 Zola 中，section 和 paginator 是两个最核心的上下文对象，它们决定了数据如何流向模板。1. 什么是 section.pages？是什么：它代表当前目录（Section）下包含的所有文章（Pages）的集合（一个数组）。判定与生效机制：结构判定：无论是单文件 hello.md，还是文件夹包裹的 hello/index.md，只要它们躺在 content/01Write_blog/ 目录下，Zola 就会把它们识别为该目录的 Page。致命的过滤判定（为什么你之前会失踪）：Zola 默认是按照时间（Date）对 section.pages 进行排序的。如果你的 .md 文件中：没有写 date 字段。或者 date 格式不规范。或者你没有在 _index.md 中显式指定 sort_by = “date”。Zola 在渲染 section.pages 时，可能会因为排序混乱或未发布（如误识别为草稿），导致计算出的 section.pages | length 变成 0。2. 什么是 paginator.pages？是什么：它是当前分页切片后的文章集合（比如第 1 页的 10 篇文章）。判定与生效机制：它不会自动产生。只有当你在该目录的 _index.md 中，显式地配置了 paginate_by = 数字 时，Zola 才会实例化 paginator 对象。一旦开启，section.pages 的控制权就会移交给 paginator.pages。📊 它们在模板中的各自作用对象属性存在条件主要作用section.pages只要目录下有有效文章就有值用来不分页地一次性循环输出所有文章。paginator.pages必须在 _index.md 中配置 paginate_by用来做翻页导航（上一页/下一页），只展示当前页内容。&lt;/p&gt;
&lt;p&gt;在 Zola 中，section.pages 默认只能抓取到当前目录下直属的文章。
比如，你的归档页面在 content/archives/_index.md，如果你把博客都放在 content/01Write_blog/ 下，由于它们是平级（兄弟）关系，或者是完全独立的树枝，archives 页面去读取 section.pages 时，拿到的结果必然是空的（长度为 0），因此它什么都渲染不出来。&lt;/p&gt;
&lt;h2 id=&quot;bu-chong&quot;&gt;补充&lt;/h2&gt;
&lt;p&gt;后面要 抓取 补充 主题开发者 的文档信息 ；&lt;/p&gt;
&lt;p&gt;常见媒体的样式写法整理&lt;/p&gt;
</content>
        
    </entry>
</feed>
