<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Voider</title>
  
  
  <link href="https://night-da.github.io/atom.xml" rel="self"/>
  
  <link href="https://night-da.github.io/"/>
  <updated>2026-05-19T16:00:00.000Z</updated>
  <id>https://night-da.github.io/</id>
  
  <author>
    <name>Voider</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>年度总结（一）</title>
    <link href="https://night-da.github.io/posts/9df73d67.html/"/>
    <id>https://night-da.github.io/posts/9df73d67.html/</id>
    <published>2026-05-17T16:00:00.000Z</published>
    <updated>2026-05-19T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>为什么要在这时候写年度总结？</p><p>因为前 2 年我也是这样做的：以转专业为节点。刚好明天就是转专业一周年了，所以在此记录一下。</p><p>时间过的真快，大二又要结束了，好像一切都来不及了 …</p><p>哎，其实要总结好像也没啥能说的。用几个关键词概括的话，我想是：放松，探索，亲情，遗憾 …</p><h2 id="1-放松">1 放松</h2><p>去年 9 月份开学之前的我怎么也不会想到，今年的自己会如此“摆烂”。以前天天早出晚归，待在教学楼自习；呃当然并没有啥效率（不然怎么能菜成这样）。今年基本宅宿舍，想玩就玩，想学就学，然后就形成惰性了：回过头来看虽然没有彻底摆烂，但学的东西还是不太多吧。</p><p>但我觉得，之前自己已经拼了那么久；也是时候休息一下了。有人说，大学是人生的暑假，我也觉得以后很难有这种比较自由且安逸的日子了，所以并不后悔去牺牲一些自己的能力上限换取更良好的身心状态。</p><div class="note info no-icon flat"><p>珍惜这段独处、自由、不被打扰的时光吧；这样的日子不会持续太久。</p></div><h2 id="2-探索">2 探索</h2><p>虽然表面上看，今年没有搞大创，进组，或者弄出一些不错的成果；但眼界确实开阔了许多。首先，见识了很多厉害的人：大多是一些 QQ 群聊的活跃人士，以及自己瞎逛时看到的大佬们的博客；有同辈，也有一些读研读博的前辈。看到大佬们丰富、辉煌的经历不得不感慨计算机的大佬就是多呀，和其他专业根本不是一个次元的。</p><p>同时也认识到自己的能力有限。虽然自己在不断进步，甚至觉得达到“巅峰期”了；但就算是在中大，不算很顶尖的大学，也有这么多厉害的人：我欣赏他们的勇气与想法，在博客中获益良多，了解到一个个活生生的人。这才是我眼中的 CS 人才呀！</p><p>另外也在尝试探索计算机系统这一方向，尝试报名了北大的高性能计算比赛、华为软挑、CTF 校赛。结果也是很难绷：北大的那玩意登不上去，<code>docker</code> 启动失败，只能在本地盲做，水了 4 题不干了；华为软挑，今年的题目出的很不用心，做了 2 ~ 3 天打到了 31w 分不想做了。</p><p>然后了解到了昇腾算子、计算机系统能力等比赛，但以现在的水平连题目都弄不懂，希望明年可以尝试一下呢。</p><h2 id="3-亲情">3 亲情</h2><p>来之不易的胜利：转专业成功。让我卸下了包袱，希望认真感受生活。其中让我最感触的就是亲情吧，这里指的更多是广义的各种亲戚。与父母的亲情是一直存在的，而今年我对以前弄不明白的亲戚们有了更多的感受。等到我们这一代到而立之年，过年期间这样热闹或许就不会再有了。</p><p>由于涉及比较多的私人问题，点到为止，不展开了。</p><h2 id="4-遗憾">4 遗憾</h2><p>这 … 能称之为遗憾吗？</p><p>首先是我一直存在的问题，但想要改变很困难：学习效率不够高，学习深度也不够，缺少自己充分的思考。虽然每天多少学了点东西，但回过头来发现很多只是学了个皮毛。这可能也是我未能进入超算队的原因：</p><p><img src="/img/src/2026-05-18-1.png" alt=""></p><div class="note info no-icon flat"><p>保持热爱，继续前行。凡事有利有弊。</p></div><h3 id="关于超算队">关于超算队</h3><p>既然说到了超算队，那就在这里谈谈吧。</p><p>总的来说，超算队给我的印象很好，招新题出的很用心，给了合理的指导（虽然还是难度爆炸，要做的东西很多）。所以每年报名七八十个人，最后能去面试的不会超过 20 人，很多人看到题目就不想做了，因为确实要了解很多东西，学习曲线陡峭。所以说能坚持完成题目，过去面试的人都是高手了。虽然没进去吧，自己也心心念念了挺久，但想了想确实自己的能力还不够，或者可能有些 OI 选手。哎，要是我中学阶段接触到计算机，能够做出一些尝试，或许真的不会是现在这样了，但又何必自责呢？没有中学阶段的努力，我还能来中大吗？</p><p><img src="/img/src/2026-05-18-2.png" alt=""></p><p>扯远了，面试完我就有点自责，但又有些感动。感动在大佬间的惺惺相惜（并非大佬），面试的时候有很多问题，由于时间间隔过长（隔了一个多月）忘掉了，或者只能说个大概。所以到后面我直接“投降”了哈哈，说前一天有考试，准备不充分，抱歉。</p><p>但其实面试的同学们还是很真诚的，更多的是一种交流的态度，比如对于某个实验数据不符合预期想问问我的想法，一些做的比较好的地方的优化思路，以及告诉我一些地方还可以怎么做的更好。最后走的时候还集体鼓掌，感谢我大老远的来参加面试，这还是让我挺感触的。</p><p>虽然大概率无法在本科阶段在这方面更进一步了，但我可能后面会写一些自己在其中学到的东西吧，敬请期待。</p><h3 id="关于未来选择">关于未来选择</h3><p>好了，话说回来，另一个我觉得可惜的事情是没有决定在去年年末的时候积极组队，报个大创，或者说进组吧。我当时的想法是刚来到软工，还是想自己多多探索一下；哎，探索个蛋，这下要等到大三才能做一些东西了，如果要保研的话，24 届是实锤了保研时间提前的，还来得及吗？</p><p>说到保研，其实我还是没有想好要不要读研呢？最近也是了解了一些，好像对实习和工作没有那么抗拒了。打算做做就业方面的准备，想到了 2-3 个准备深挖学习的项目（软工集市一直没看，也要学习一下），然后大二结束四大件也学完了，还有就是重启力扣。不能再一味逃避了。</p><h2 id="尾声">尾声</h2><p>既然失败是主旋律，但生命本来就有大把的事情，比“成功”二字更有意义。</p><p>最后，引用 <code>wu-kan</code> 学长的话作为结尾：</p><div class="note info no-icon flat"><p>定义你最终归宿的，一定是你能力和欲望综合的那个真实的你。… 残酷的社会压力逼迫我们通过复制所谓的成功道路来获取社会资源，而完全忽视了<strong>人的内在动能才是决定你位置的根本因素</strong>。</p><p>这些东西最终会决定你愿意为什么奋斗，最终会决定你对一份事业的热情和责任心，最终会决定你把自己放在什么样的位置是舒服的，最终会决定你人生的意义。</p></div>]]></content>
    
    
    <summary type="html">年度总结（一）</summary>
    
    
    
    <category term="日常随笔" scheme="https://night-da.github.io/categories/%E6%97%A5%E5%B8%B8%E9%9A%8F%E7%AC%94/"/>
    
    
    <category term="日记" scheme="https://night-da.github.io/tags/%E6%97%A5%E8%AE%B0/"/>
    
  </entry>
  
  <entry>
    <title>W4terCTF 2026 WriteUp</title>
    <link href="https://night-da.github.io/posts/933bf8f5.html/"/>
    <id>https://night-da.github.io/posts/933bf8f5.html/</id>
    <published>2026-05-02T16:00:00.000Z</published>
    <updated>2026-05-20T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言：题目总览">前言：题目总览</h2><table><thead><tr><th style="text-align:center">题目类型</th><th style="text-align:center">题目名称</th><th style="text-align:center">难度</th><th style="text-align:center">解出情况</th></tr></thead><tbody><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">(Multi) Constructed Dataline</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">Constructed Dataline</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">Feedback</td><td style="text-align:center"><span style="color:rgb(246,80,98)">Trivial</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">SignIn</td><td style="text-align:center"><span style="color:rgb(246,80,98)">Trivial</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">优质 Flag 募集中！</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">心理念写</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(40,146,104)">Misc</span></td><td style="text-align:center">红芯铸魂・码践初心</td><td style="text-align:center"><span style="color:rgb(246,80,98)">Trivial</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Broken AES</td><td style="text-align:center"><span style="color:rgb(155,57,206)">Expert</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Hyper Substitution</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Leak CKKS</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Noisy LCG</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Scale CKKS</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">Weird RSA</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(108,60,216)">Crypto</span></td><td style="text-align:center">手撕平方根</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">御坂网络</td><td style="text-align:center"><span style="color:rgb(155,57,206)">Expert</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">御坂美琴</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">相互置换</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">等长条</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">能力开发・缺陷电气</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">能力开发・路径穿过</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">能力开发・鸟瞰把握</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(216,54,51)">Pwn</span></td><td style="text-align:center">超电磁炮</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">Fail Open</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">Safe Store</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">Terraria 百科</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">ez blog</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">ez xss</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">不明意味</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(52,111,193)">Web</span></td><td style="text-align:center">乌萨奇的硬币</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(233,142,15)">Reverse</span></td><td style="text-align:center">Bluntstone</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(233,142,15)">Reverse</span></td><td style="text-align:center">FunSokoban</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(233,142,15)">Reverse</span></td><td style="text-align:center">Strange puts</td><td style="text-align:center"><span style="color:rgb(75,151,218)">Hard</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(233,142,15)">Reverse</span></td><td style="text-align:center">Vigorcheck</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(233,142,15)">Reverse</span></td><td style="text-align:center">开始电力运输</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(74,87,218)">Forensics</span></td><td style="text-align:center">损坏的 Sysprep</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(44,132,153)">PPC</span></td><td style="text-align:center">10 秒不顶号就毁 flag</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(44,132,153)">PPC</span></td><td style="text-align:center">日历</td><td style="text-align:center"><span style="color:rgb(155,57,206)">Expert</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(44,132,153)">PPC</span></td><td style="text-align:center">日历・序章</td><td style="text-align:center"><span style="color:rgb(249,195,33)">Normal</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(154,52,180)">Pentest</span></td><td style="text-align:center">内网迷踪</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(224,92,20)">OSINT</span></td><td style="text-align:center">Find Me</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr><tr><td style="text-align:center"><span style="color:rgb(224,92,20)">OSINT</span></td><td style="text-align:center">Journey across</td><td style="text-align:center"><span style="color:rgb(91,197,32)">Medium</span></td><td style="text-align:center">❌</td></tr><tr><td style="text-align:center"><span style="color:rgb(224,92,20)">OSINT</span></td><td style="text-align:center">无论到哪都爱吃麦麦</td><td style="text-align:center"><span style="color:rgb(236,158,27)">Easy</span></td><td style="text-align:center">✅</td></tr></tbody></table><h2 id="1-Misc">1 Misc</h2><h3 id="1-2-Constructed-Dataline">1.2 Constructed Dataline</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>我翻开附件一查，这附件没有后缀，歪歪斜斜的每叶上都写着 <code>Dataline</code> 几个字。我横竖睡不着，仔细看了半夜，才从字缝里看出字来，整个文件都写着几个字是 <code>flag</code>!</p></div><p>打开附件，发现由大量重复格式的 <code>Dataline</code> 数据行构成：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">Dataline(32202,32204,0.80,1.26,0.00,0.00);</span><br><span class="line">Dataline(32202,32216,0.80,0.80,0.00,0.00);</span><br><span class="line">Dataline(32204,32221,1.26,1.26,0.00,0.00);</span><br><span class="line">...</span><br><span class="line">Dataline(36317,36320,1.02,0.85,0.00,0.00);</span><br><span class="line">Dataline(36322,36322,1.10,1.06,0.00,0.00);</span><br></pre></td></tr></table></figure><p>根据提示，对所有数据行进行解析，还原每条线段并做适当的变换，最终可在生成的图片中看出 <code>flag</code>。</p><p>观察数据特征可知，每行最后两项数值恒为 <code>0.00</code>，属于无效信息；前四项为有效参数，可分别解析为线段端点坐标 <code>(x1, x2)</code> 与 <code>(y1, y2)</code>，其中 <code>x1</code>、<code>x2</code> 为整数类型，<code>y1</code>、<code>y2</code> 为小数类型。</p><p>由于 <code>y</code> 方向的数值很小，直接画出来会很扁，需要放大。尝试放大 100 倍：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"></span><br><span class="line">Y_SCALE = <span class="number">100</span>  <span class="comment"># 纵轴放大倍数</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;flag&quot;</span>, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>, errors=<span class="string">&quot;ignore&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        text = f.read()</span><br><span class="line"></span><br><span class="line">    fig, ax = plt.subplots(figsize=(<span class="number">16</span>, <span class="number">4</span>), dpi=<span class="number">400</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 正则提取所有 Dataline 坐标</span></span><br><span class="line">    <span class="keyword">for</span> x1, x2, y1, y2 <span class="keyword">in</span> re.findall(</span><br><span class="line">        <span class="string">r&quot;Dataline\((\d+),(\d+),([0-9.]+),([0-9.]+),[0-9.]+,[0-9.]+\);&quot;</span>, text</span><br><span class="line">    ):</span><br><span class="line">        ax.plot([<span class="built_in">int</span>(x1), <span class="built_in">int</span>(x2)], [<span class="built_in">float</span>(y1) * Y_SCALE, <span class="built_in">float</span>(y2) * Y_SCALE], <span class="string">&quot;k-&quot;</span>, lw=<span class="number">0.25</span>)</span><br><span class="line"></span><br><span class="line">    ax.axis(<span class="string">&quot;off&quot;</span>)</span><br><span class="line">    fig.savefig(<span class="string">&quot;yup_100.png&quot;</span>, bbox_inches=<span class="string">&quot;tight&quot;</span>, pad_inches=<span class="number">0</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p><img src="/img/src/2026-05-03-1.png" alt=""></p><p>可以看到图片本身的比例不合适，需要对整体纵向压缩。同时，首字母类似 <code>M</code> 而不是 <code>W</code>，说明还需要上下翻转图像。</p><p>发现当压缩系数设置为 <code>0.1</code> 时，可以输出较为清晰的图案：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> io</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> matplotlib.pyplot <span class="keyword">as</span> plt</span><br><span class="line"><span class="keyword">from</span> PIL <span class="keyword">import</span> Image</span><br><span class="line"></span><br><span class="line">Y_SCALE = <span class="number">100.0</span>  <span class="comment"># 纵轴放大倍数</span></span><br><span class="line">Y_SQUISH = <span class="number">0.1</span>  <span class="comment"># 垂直压缩系数</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="literal">None</span>:</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;flag&quot;</span>, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>, errors=<span class="string">&quot;ignore&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        text = f.read()</span><br><span class="line"></span><br><span class="line">    segs = re.findall(</span><br><span class="line">        <span class="string">r&quot;Dataline\((\d+),(\d+),([0-9.]+),([0-9.]+),[0-9.]+,[0-9.]+\);&quot;</span>, text</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 计算最大纵坐标，用于上下翻转图像</span></span><br><span class="line">    max_y = <span class="built_in">max</span>(<span class="built_in">max</span>(<span class="built_in">float</span>(y1), <span class="built_in">float</span>(y2)) <span class="keyword">for</span> _, _, y1, y2 <span class="keyword">in</span> segs)</span><br><span class="line"></span><br><span class="line">    fig, ax = plt.subplots(figsize=(<span class="number">16</span>, <span class="number">4</span>), dpi=<span class="number">400</span>)</span><br><span class="line">    <span class="keyword">for</span> x1, x2, y1, y2 <span class="keyword">in</span> segs:</span><br><span class="line">        ax.plot(</span><br><span class="line">            [<span class="built_in">int</span>(x1), <span class="built_in">int</span>(x2)],</span><br><span class="line">            [(max_y - <span class="built_in">float</span>(y1)) * Y_SCALE, (max_y - <span class="built_in">float</span>(y2)) * Y_SCALE],</span><br><span class="line">            <span class="string">&quot;k-&quot;</span>,</span><br><span class="line">            lw=<span class="number">0.25</span>,</span><br><span class="line">        )</span><br><span class="line"></span><br><span class="line">    ax.axis(<span class="string">&quot;off&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将图片保存到内存缓冲区</span></span><br><span class="line">    buf = io.BytesIO()</span><br><span class="line">    fig.savefig(buf, <span class="built_in">format</span>=<span class="string">&quot;png&quot;</span>, bbox_inches=<span class="string">&quot;tight&quot;</span>, pad_inches=<span class="number">0</span>)</span><br><span class="line">    plt.close(fig)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 从内存区读取图片</span></span><br><span class="line">    buf.seek(<span class="number">0</span>)</span><br><span class="line">    img = Image.<span class="built_in">open</span>(buf)</span><br><span class="line">    w, h = img.size</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 垂直压缩图片</span></span><br><span class="line">    img = img.resize((w, <span class="built_in">max</span>(<span class="number">1</span>, <span class="built_in">int</span>(h * Y_SQUISH))), Image.Resampling.LANCZOS)</span><br><span class="line">    img.save(<span class="string">&quot;inv_squish_10.png&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p><img src="/img/src/2026-05-03-2.png" alt=""></p><p>从图片中读出 <code>flag</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;Ev3ryb0dy_plz_V_Hachiwa0_50_bcUz_He_i5_soOoOoOoOo_hUn9rY_on_KFCCrazyThurs&#125;</span><br></pre></td></tr></table></figure><h3 id="1-3-Feedback">1.3 Feedback</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>感谢参与 W4terCTF 2026！我们准备了一份问卷，期待你来填写，给我们你的反馈，帮助我们做得更好。</p></div><p>填写问卷，完成赛事反馈后获得 <code>flag</code>。</p><p><img src="/img/src/2026-05-03-3.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;4_w33k_70_r3m3mb3r_4nd_533_y0u_n3x7_71m3&#125;</span><br></pre></td></tr></table></figure><h3 id="1-4-SignIn">1.4 SignIn</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>欢迎关注中山大学网络空间安全协会，祝你比赛顺利。</p></div><p>网页内嵌简易终端，在内置 <code>shell</code> 中浏览工作目录，发现并读取 <code>flag</code> 文件。</p><p><img src="/img/src/2026-05-03-4.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;Welc0me_t0_W4terCTF2026!!!&#125;</span><br></pre></td></tr></table></figure><h3 id="1-7-红芯铸魂・码践初心">1.7 红芯铸魂・码践初心</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>社会主义核心价值观正是凝聚民族力量、引领青年前行的精神旗帜，为传承红色基因、践行社会主义核心价值观，现核心价值观关键词进行安全编码传输，请解出其中蕴含的秘密。</p></div><p>附件为「核心价值观」编码这一常见的趣味编码形式，借助在线解码器还原明文得到 <code>flag</code>。</p><p><img src="/img/src/2026-05-03-5.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;Br41nW4sh1n9_5uck5&#125;</span><br></pre></td></tr></table></figure><h2 id="2-Crypto">2 Crypto</h2><h3 id="2-2-Hyper-Substitution">2.2 Hyper Substitution</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>破译密文得 <code>flag</code>。</p></div><p>首先，将题目给出的密文保存为 <code>ciphertext</code>。每一次创建实例时生成的密文不相同，以下是解题所用密文：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">z#D!+; h#e&gt;GCC&lt; :cG v!g&gt;/c /y&gt;G;:&gt;/:&lt; c#/ /EG;: c&gt;/ g&gt;CG:&gt;BG /:+dS&gt;;&quot; #y:&gt;\G \!gy#;!G/ #;d dGGE y#\G/ &gt;; #gg E#D:/ !C :cG ?!DgdT &#125;; ;&gt;;G:GG; C!D:S&#x27;G&gt;&quot;c:&lt; cG ?G;: :! *#$G `&gt;\+ &gt;; :cG -!;&quot;! :! !A/GD\G # ;G? \!gy#;! ?c&gt;yc cG g#:GD ;#BGd `&gt;:+D!T h#e&gt;GCC ?#/ #AgG :! /G: +E c&gt;/ y#BE \GDS yg!/G :! :cG \!gy#;! ?c&gt;gG &gt;: ?#/ GD+E:&gt;;&quot; \&gt;!gG;:gST hc!+&quot;c cG B#;#&quot;Gd :! :#$G # ;+BAGD !C AD&gt;gg&gt;#;: Ec!:!&quot;D#Ec/&lt; cG y!+gd ;!: /:#S ;G#D :cG \!gy#;! C!D \GDS g!;&quot;T zG ;!:&gt;yGd :c#: # D&gt;\GD !C g&gt;Q+&gt;d D!y$ ?#/ y!B&gt;;&quot; :!?#Dd/ c&gt;BT &#125;: :cDG#:G;Gd :! /+DD!+;d c&gt;B y!BEgG:GgS&lt; A+: h#e&gt;GCC B#;#&quot;Gd :! G/y#EG F+/: &gt;; :&gt;BGT zG ?#&gt;:Gd +;:&gt;g :cG \!gy#;! AGy#BG Q+&gt;G: #;d cG ?#/ #AgG :! DG:+D; :?! d#S/ g#:GDT hc&gt;/ :&gt;BG&lt; cG B#;#&quot;Gd :! yg&gt;BA &gt;;:! :cG B!+:c !C `&gt;:+D! /! :c#: cG y!+gd :#$G Ec!:!&quot;D#Ec/ #;d BG#/+DG :GBEGD#:+DG/T h#e&gt;GCC c#/ !C:G; D&gt;/$Gd c&gt;/ g&gt;CG &gt;; :c&gt;/ ?#ST zG c#/ AGG; #AgG :! :Ggg +/ B!DG #A!+: #y:&gt;\G \!gy#;!G/ :c#; #;S B#; #g&gt;\GT</span><br></pre></td></tr></table></figure><p>将明文候选字符集固定为：<code>空格 + a-z + .,'\&quot;;:!?-</code>（共 36 个符号），与密文字符集建立一一映射即可建模本题。映射总数对应 36 阶排列，精确枚举不可行，故采用脚本在启发式框架下搜索较优结果。</p><p>实现要点如下：</p><ol><li><strong>初始化</strong>：依据密文字符频率构造初始映射 —— 高频符号优先对应空格，其余位置参考英文常用字母频率顺序 <code>etaoin...</code> 排列字母与标点；将映射修正为合法排列，并对空格位置施加约束以保证密文空格与明文空格对齐。</li><li><strong>评分</strong>：对解密结果中提取的长度不小于 2 的连续小写字母串，使用 <code>wordfreq.zipf_frequency</code> 累加词频得分；对「字母 – 标点 – 字母」这类不合理片段施加惩罚，并对连续空格、重复标点等现象扣分；对 <code>&quot; the &quot;</code>、<code>&quot; and &quot;</code>、<code>&quot; to &quot;</code>、<code>&quot; of &quot;</code> 等常见片段给予小幅加分以稳定搜索。</li><li><strong>搜索</strong>：在保持双射的前提下，每一步随机交换映射中的两个位置；评分上升则接受，下降则以模拟退火准则按温度接受扰动解，温度由约 <code>5.0</code> 按指数衰减至约 <code>0.05</code>。脚本采用多组随机种子重启（默认 12 轮，每轮约 <code>120_000</code> 次迭代），取全局最优映射及对应明文。</li></ol><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> __future__ <span class="keyword">import</span> annotations</span><br><span class="line"></span><br><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> sys</span><br><span class="line"><span class="keyword">from</span> collections <span class="keyword">import</span> Counter</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">Dict</span>, <span class="type">List</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> wordfreq <span class="keyword">import</span> zipf_frequency</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">PUNCT = <span class="string">&quot;.,&#x27;\&quot;;:!?-&quot;</span>  <span class="comment"># 标点符号集合</span></span><br><span class="line">PLAINTEXT_ALPHABET = <span class="string">&quot; &quot;</span> + <span class="string">&quot;abcdefghijklmnopqrstuvwxyz&quot;</span> + PUNCT  <span class="comment"># 明文字符集</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">read_cipher</span>(<span class="params">path: <span class="built_in">str</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;读取密文文件&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">open</span>(path, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>).read()</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">initial_mapping</span>(<span class="params">cipher_alpha: <span class="built_in">str</span>, plain_alpha: <span class="built_in">str</span>, cipher: <span class="built_in">str</span></span>) -&gt; <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot; 根据字符频率初始化映射表（模拟退火初始解）&quot;&quot;&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 统计密文字符出现频率，从高到低排序</span></span><br><span class="line">    cipher_counts = Counter(cipher)</span><br><span class="line">    cipher_sorted = [c <span class="keyword">for</span> c, _ <span class="keyword">in</span> cipher_counts.most_common()]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 英文最高频字母顺序（用于初始映射）</span></span><br><span class="line">    target_order = (</span><br><span class="line">            [<span class="string">&quot; &quot;</span>]</span><br><span class="line">            + <span class="built_in">list</span>(<span class="string">&quot;etaoinshrdlucmfwypvbgkjqxz&quot;</span>)</span><br><span class="line">            + <span class="built_in">list</span>(<span class="string">&quot;.,&#x27;\&quot;;:!?-&quot;</span>)</span><br><span class="line">    )</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 过滤掉不在明文字符集中的字符</span></span><br><span class="line">    target_order = [c <span class="keyword">for</span> c <span class="keyword">in</span> target_order <span class="keyword">if</span> c <span class="keyword">in</span> plain_alpha]</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(target_order) != <span class="built_in">len</span>(plain_alpha) <span class="keyword">or</span> <span class="built_in">len</span>(<span class="built_in">set</span>(target_order)) != <span class="built_in">len</span>(plain_alpha):</span><br><span class="line">        target_order = <span class="built_in">list</span>(plain_alpha)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 密文与明文字符集长度必须一致</span></span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(cipher_alpha) != <span class="built_in">len</span>(plain_alpha):</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">f&quot;alphabet size mismatch: cipher=<span class="subst">&#123;<span class="built_in">len</span>(cipher_alpha)&#125;</span> plain=<span class="subst">&#123;<span class="built_in">len</span>(plain_alpha)&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 拼接完整的目标映射顺序</span></span><br><span class="line">    remaining = [c <span class="keyword">for</span> c <span class="keyword">in</span> plain_alpha <span class="keyword">if</span> c <span class="keyword">not</span> <span class="keyword">in</span> target_order]</span><br><span class="line">    perm = target_order + remaining</span><br><span class="line">    perm = perm[: <span class="built_in">len</span>(plain_alpha)]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 构建初始映射表</span></span><br><span class="line">    mapping = &#123;c: perm[idx] <span class="keyword">for</span> idx, c <span class="keyword">in</span> <span class="built_in">enumerate</span>(cipher_sorted)&#125;</span><br><span class="line">    <span class="comment"># 未匹配到的字符随机补充</span></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> cipher_alpha:</span><br><span class="line">        mapping.setdefault(c, random.choice(plain_alpha))</span><br><span class="line">    <span class="keyword">return</span> mapping</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 正则表达式：提取连续的英文单词（至少两个字母）</span></span><br><span class="line">WORD_RE = re.<span class="built_in">compile</span>(<span class="string">r&quot;[a-z]&#123;2,&#125;&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">score_plaintext</span>(<span class="params">pt: <span class="built_in">str</span></span>) -&gt; <span class="built_in">float</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;文本评分函数&quot;&quot;&quot;</span></span><br><span class="line">    pt_low = pt.lower()</span><br><span class="line">    words = WORD_RE.findall(pt_low)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 如果没有有效单词，直接返回极低分</span></span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> words:</span><br><span class="line">        <span class="keyword">return</span> -<span class="number">1e9</span></span><br><span class="line"></span><br><span class="line">    s = <span class="number">0.0</span></span><br><span class="line">    <span class="comment"># 根据英文真实词频加分，越常见的单词分数越高</span></span><br><span class="line">    <span class="keyword">for</span> w <span class="keyword">in</span> words:</span><br><span class="line">        z = zipf_frequency(w, <span class="string">&quot;en&quot;</span>)</span><br><span class="line">        s += <span class="built_in">max</span>(-<span class="number">5.0</span>, <span class="built_in">min</span>(<span class="number">7.0</span>, z))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 惩罚：单词中间出现标点（不符合英文语法）</span></span><br><span class="line">    inside_word = re.findall(<span class="string">rf&quot;[a-z][<span class="subst">&#123;re.escape(PUNCT)&#125;</span>][a-z]&quot;</span>, pt_low)</span><br><span class="line">    s -= <span class="number">25.0</span> * <span class="built_in">len</span>(inside_word)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 惩罚：连续空格、重复符号</span></span><br><span class="line">    s -= <span class="number">5.0</span> * pt_low.count(<span class="string">&quot;  &quot;</span>)</span><br><span class="line">    s -= <span class="number">1.5</span> * pt_low.count(<span class="string">&quot;..&quot;</span>)</span><br><span class="line">    s -= <span class="number">1.5</span> * pt_low.count(<span class="string">&quot;,,&quot;</span>)</span><br><span class="line">    s -= <span class="number">1.0</span> * pt_low.count(<span class="string">&quot;&#x27;&#x27;&quot;</span>)</span><br><span class="line">    s -= <span class="number">1.0</span> * pt_low.count(<span class="string">&#x27;&quot;&quot;&#x27;</span>)</span><br><span class="line">    s -= <span class="number">1.0</span> * pt_low.count(<span class="string">&quot;--&quot;</span>)</span><br><span class="line">    s -= <span class="number">2.0</span> * pt_low.count(<span class="string">&quot;?&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 加分：正常英文标点</span></span><br><span class="line">    s += <span class="number">1.0</span> * (pt_low.count(<span class="string">&quot;.&quot;</span>) + pt_low.count(<span class="string">&quot;,&quot;</span>))</span><br><span class="line">    s += <span class="number">0.5</span> * (pt_low.count(<span class="string">&quot;&#x27;&quot;</span>) + pt_low.count(<span class="string">&quot;!&quot;</span>))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 强力加分：英文高频词组</span></span><br><span class="line">    <span class="keyword">for</span> tri <span class="keyword">in</span> (<span class="string">&quot; the &quot;</span>, <span class="string">&quot; and &quot;</span>, <span class="string">&quot; to &quot;</span>, <span class="string">&quot; of &quot;</span>):</span><br><span class="line">        s += <span class="number">6.0</span> * pt_low.count(tri)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> s</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">decrypt_with_mapping</span>(<span class="params">cipher: <span class="built_in">str</span>, mapping: <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]</span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;根据当前映射表，将密文转换为候选明文&quot;&quot;&quot;</span></span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>.join(mapping.get(ch, ch) <span class="keyword">for</span> ch <span class="keyword">in</span> cipher)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">anneal</span>(<span class="params"></span></span><br><span class="line"><span class="params">        cipher: <span class="built_in">str</span>,</span></span><br><span class="line"><span class="params">        cipher_alpha: <span class="built_in">str</span>,</span></span><br><span class="line"><span class="params">        plain_alpha: <span class="built_in">str</span>,</span></span><br><span class="line"><span class="params">        *,</span></span><br><span class="line"><span class="params">        iters: <span class="built_in">int</span>,</span></span><br><span class="line"><span class="params">        seed: <span class="built_in">int</span>,</span></span><br><span class="line"><span class="params"></span>) -&gt; <span class="built_in">tuple</span>[<span class="built_in">float</span>, <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>], <span class="built_in">str</span>]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;模拟退火主算法&quot;&quot;&quot;</span></span><br><span class="line">    rnd = random.Random(seed)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 根据频率初始化映射排列</span></span><br><span class="line">    plain_perm = [initial_mapping(cipher_alpha, plain_alpha, cipher)[c] <span class="keyword">for</span> c <span class="keyword">in</span> cipher_alpha]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 空格必须映射为空格，固定不变</span></span><br><span class="line">    <span class="keyword">if</span> <span class="string">&quot; &quot;</span> <span class="keyword">in</span> cipher_alpha <span class="keyword">and</span> <span class="string">&quot; &quot;</span> <span class="keyword">in</span> plain_alpha:</span><br><span class="line">        space_idx = cipher_alpha.index(<span class="string">&quot; &quot;</span>)</span><br><span class="line">        plain_perm[space_idx] = <span class="string">&quot; &quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 确保映射表无重复、无遗漏字符</span></span><br><span class="line">    used = <span class="built_in">set</span>()</span><br><span class="line">    missing = [c <span class="keyword">for</span> c <span class="keyword">in</span> plain_alpha <span class="keyword">if</span> c <span class="keyword">not</span> <span class="keyword">in</span> plain_perm]</span><br><span class="line">    mi = <span class="number">0</span></span><br><span class="line">    <span class="keyword">for</span> idx, ch <span class="keyword">in</span> <span class="built_in">enumerate</span>(plain_perm):</span><br><span class="line">        <span class="keyword">if</span> ch <span class="keyword">in</span> used:</span><br><span class="line">            plain_perm[idx] = missing[mi]</span><br><span class="line">            mi += <span class="number">1</span></span><br><span class="line">        used.add(plain_perm[idx])</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 将排列转为映射字典</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">perm_to_map</span>(<span class="params">pp: <span class="type">List</span>[<span class="built_in">str</span>]</span>) -&gt; <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>]:</span><br><span class="line">        <span class="keyword">return</span> <span class="built_in">dict</span>(<span class="built_in">zip</span>(cipher_alpha, pp))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 初始化解密状态</span></span><br><span class="line">    mapping = perm_to_map(plain_perm)</span><br><span class="line">    cur_pt = decrypt_with_mapping(cipher, mapping)</span><br><span class="line">    cur_score = score_plaintext(cur_pt)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 记录当前最优解</span></span><br><span class="line">    best_score = cur_score</span><br><span class="line">    best_perm = plain_perm[:]</span><br><span class="line">    best_pt = cur_pt</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 模拟退火温度参数，温度随迭代指数下降</span></span><br><span class="line">    t0 = <span class="number">5.0</span></span><br><span class="line">    t1 = <span class="number">0.05</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> step <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, iters + <span class="number">1</span>):</span><br><span class="line">        <span class="comment"># 计算当前温度</span></span><br><span class="line">        frac = step / iters</span><br><span class="line">        t = t0 * ((t1 / t0) ** frac)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 随机选择两个位置交换映射（跳过空格）</span></span><br><span class="line">        a = rnd.randrange(<span class="built_in">len</span>(plain_perm))</span><br><span class="line">        b = rnd.randrange(<span class="built_in">len</span>(plain_perm))</span><br><span class="line">        <span class="keyword">if</span> <span class="string">&quot; &quot;</span> <span class="keyword">in</span> cipher_alpha:</span><br><span class="line">            fixed = cipher_alpha.index(<span class="string">&quot; &quot;</span>)</span><br><span class="line">            <span class="keyword">if</span> a == fixed <span class="keyword">or</span> b == fixed:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line">        <span class="keyword">if</span> a == b:</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 执行交换</span></span><br><span class="line">        plain_perm[a], plain_perm[b] = plain_perm[b], plain_perm[a]</span><br><span class="line">        mapping2 = perm_to_map(plain_perm)</span><br><span class="line">        pt2 = decrypt_with_mapping(cipher, mapping2)</span><br><span class="line">        sc2 = score_plaintext(pt2)</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 计算分数差</span></span><br><span class="line">        d = sc2 - cur_score</span><br><span class="line">        <span class="comment"># 模拟退火接受准则：更优 或 按概率接受</span></span><br><span class="line">        accept = d &gt;= <span class="number">0</span> <span class="keyword">or</span> rnd.random() &lt; math.exp(d / <span class="built_in">max</span>(<span class="number">1e-9</span>, t))</span><br><span class="line"></span><br><span class="line">        <span class="keyword">if</span> accept:</span><br><span class="line">            <span class="comment"># 接受新解</span></span><br><span class="line">            cur_score = sc2</span><br><span class="line">            cur_pt = pt2</span><br><span class="line">            <span class="keyword">if</span> sc2 &gt; best_score:</span><br><span class="line">                best_score = sc2</span><br><span class="line">                best_perm = plain_perm[:]</span><br><span class="line">                best_pt = pt2</span><br><span class="line">        <span class="keyword">else</span>:</span><br><span class="line">            <span class="comment"># 不接受，撤销交换</span></span><br><span class="line">            plain_perm[a], plain_perm[b] = plain_perm[b], plain_perm[a]</span><br><span class="line"></span><br><span class="line">        <span class="comment"># 定期重启，避免陷入局部最优</span></span><br><span class="line">        <span class="keyword">if</span> step % (iters // <span class="number">5</span>) == <span class="number">0</span> <span class="keyword">and</span> step != iters:</span><br><span class="line">            plain_perm = best_perm[:]</span><br><span class="line">            <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">20</span>):</span><br><span class="line">                i = rnd.randrange(<span class="built_in">len</span>(plain_perm))</span><br><span class="line">                j = rnd.randrange(<span class="built_in">len</span>(plain_perm))</span><br><span class="line">                plain_perm[i], plain_perm[j] = plain_perm[j], plain_perm[i]</span><br><span class="line">            mapping = perm_to_map(plain_perm)</span><br><span class="line">            cur_pt = decrypt_with_mapping(cipher, mapping)</span><br><span class="line">            cur_score = score_plaintext(cur_pt)</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> best_score, perm_to_map(best_perm), best_pt</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>() -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="comment"># 读取密文</span></span><br><span class="line">    cipher_path = sys.argv[<span class="number">1</span>] <span class="keyword">if</span> <span class="built_in">len</span>(sys.argv) &gt; <span class="number">1</span> <span class="keyword">else</span> <span class="string">&quot;ciphertext&quot;</span></span><br><span class="line">    cipher = read_cipher(cipher_path)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 构建密文字符集</span></span><br><span class="line">    cipher_alpha = <span class="string">&quot;&quot;</span>.join(<span class="built_in">sorted</span>(<span class="built_in">set</span>(cipher)))</span><br><span class="line">    <span class="keyword">if</span> <span class="built_in">len</span>(cipher_alpha) != <span class="built_in">len</span>(PLAINTEXT_ALPHABET):</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;[-] Cipher alphabet size:&quot;</span>, <span class="built_in">len</span>(cipher_alpha), <span class="string">&quot;expected:&quot;</span>, <span class="built_in">len</span>(PLAINTEXT_ALPHABET))</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">&quot;    cipher alphabet repr:&quot;</span>, <span class="built_in">repr</span>(cipher_alpha))</span><br><span class="line">        <span class="keyword">return</span> <span class="number">2</span></span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[*] Cipher length:&quot;</span>, <span class="built_in">len</span>(cipher), flush=<span class="literal">True</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[*] Alphabet:&quot;</span>, <span class="built_in">repr</span>(cipher_alpha), flush=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 多起点搜索，避免局部最优，共 12 轮</span></span><br><span class="line">    best_score = <span class="built_in">float</span>(<span class="string">&quot;-inf&quot;</span>)</span><br><span class="line">    best_map: <span class="type">Dict</span>[<span class="built_in">str</span>, <span class="built_in">str</span>] = &#123;&#125;</span><br><span class="line">    best_pt = <span class="string">&quot;&quot;</span></span><br><span class="line">    starts = <span class="number">12</span></span><br><span class="line">    iters = <span class="number">120_000</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">for</span> s <span class="keyword">in</span> <span class="built_in">range</span>(starts):</span><br><span class="line">        seed = <span class="number">1337</span> + s * <span class="number">99991</span></span><br><span class="line">        sc, mp, pt = anneal(cipher, cipher_alpha, PLAINTEXT_ALPHABET, iters=iters, seed=seed)</span><br><span class="line">        <span class="keyword">if</span> sc &gt; best_score:</span><br><span class="line">            best_score, best_map, best_pt = sc, mp, pt</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">f&quot;[+] New best score <span class="subst">&#123;best_score:<span class="number">.2</span>f&#125;</span> at start <span class="subst">&#123;s&#125;</span>&quot;</span>, flush=<span class="literal">True</span>)</span><br><span class="line">            preview = pt[:<span class="number">300</span>].replace(<span class="string">&quot;\n&quot;</span>, <span class="string">&quot; &quot;</span>)</span><br><span class="line">            <span class="built_in">print</span>(<span class="string">&quot;    preview:&quot;</span>, preview, flush=<span class="literal">True</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 保存最优明文</span></span><br><span class="line">    out_txt = os.path.join(os.path.dirname(cipher_path) <span class="keyword">or</span> <span class="string">&quot;.&quot;</span>, <span class="string">&quot;decrypted_best.txt&quot;</span>)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(out_txt, <span class="string">&quot;w&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        f.write(best_pt)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 保存最优替换表</span></span><br><span class="line">    out_map = os.path.join(os.path.dirname(cipher_path) <span class="keyword">or</span> <span class="string">&quot;.&quot;</span>, <span class="string">&quot;mapping_best.txt&quot;</span>)</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(out_map, <span class="string">&quot;w&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        <span class="keyword">for</span> c <span class="keyword">in</span> cipher_alpha:</span><br><span class="line">            f.write(<span class="string">f&quot;<span class="subst">&#123;<span class="built_in">repr</span>(c)&#125;</span> -&gt; <span class="subst">&#123;<span class="built_in">repr</span>(best_map[c])&#125;</span>\n&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[*] Wrote:&quot;</span>, out_txt, flush=<span class="literal">True</span>)</span><br><span class="line">    <span class="built_in">print</span>(<span class="string">&quot;[*] Wrote:&quot;</span>, out_map, flush=<span class="literal">True</span>)</span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    <span class="keyword">raise</span> SystemExit(main())</span><br></pre></td></tr></table></figure><p>运行上述脚本得到的较优明文：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">jaroun .axieff! the ;olish scientist! has spent his lifetime studying active volcanoes and deep caves in all parts of the world, -n nineteen fortyzeight! he went to ?ake &#x27;ivu in the :ongo to observe a new volcano which he later named &#x27;ituro, .axieff was able to set up his camp very close to the volcano while it was erupting violently, .hough he managed to take a number of brilliant photographs! he could not stay near the volcano for very long, je noticed that a river of liquid rock was coming towards him, -t threatened to surround him completely! but .axieff managed to escape &quot;ust in time, je waited until the volcano became quiet and he was able to return two days later, .his time! he managed to climb into the mouth of &#x27;ituro so that he could take photographs and measure temperatures, .axieff has often risked his life in this way, je has been able to tell us more about active volcanoes than any man alive,</span><br></pre></td></tr></table></figure><p>脚本不能保证还原出正确明文，在处理完毕后可能差几个字符，需要人工校正（因为大写字母无法还原）。</p><table><thead><tr><th style="text-align:center">密文符号</th><th style="text-align:center">求解器给出</th><th style="text-align:center">正确明文</th><th style="text-align:center">典型出现</th></tr></thead><tbody><tr><td style="text-align:center"><code>z</code></td><td style="text-align:center"><code>j</code></td><td style="text-align:center"><code>H</code></td><td style="text-align:center">Haroun, He</td></tr><tr><td style="text-align:center"><code>h</code></td><td style="text-align:center"><code>.</code></td><td style="text-align:center"><code>T</code></td><td style="text-align:center">Tazieff, Though, This</td></tr><tr><td style="text-align:center"><code>v</code></td><td style="text-align:center"><code>;</code></td><td style="text-align:center"><code>P</code></td><td style="text-align:center">Polish</td></tr><tr><td style="text-align:center"><code>&#125;</code></td><td style="text-align:center"><code>-</code></td><td style="text-align:center"><code>I</code></td><td style="text-align:center">In, It</td></tr><tr><td style="text-align:center"><code>'</code></td><td style="text-align:center"><code>z</code></td><td style="text-align:center"><code>-</code></td><td style="text-align:center">forty-eight</td></tr><tr><td style="text-align:center"><code>*</code></td><td style="text-align:center"><code>?</code></td><td style="text-align:center"><code>L</code></td><td style="text-align:center">Lake</td></tr><tr><td style="text-align:center"><code>`</code></td><td style="text-align:center"><code>'</code></td><td style="text-align:center"><code>K</code></td><td style="text-align:center">Kivu, Kituro</td></tr><tr><td style="text-align:center"><code>-</code></td><td style="text-align:center"><code>:</code></td><td style="text-align:center"><code>C</code></td><td style="text-align:center">Congo</td></tr><tr><td style="text-align:center"><code>e</code></td><td style="text-align:center"><code>x</code></td><td style="text-align:center"><code>z</code></td><td style="text-align:center">Tazieff, axieff, zeight</td></tr><tr><td style="text-align:center"><code>F</code></td><td style="text-align:center"><code>&quot;</code></td><td style="text-align:center"><code>j</code></td><td style="text-align:center">just</td></tr><tr><td style="text-align:center"><code>T</code></td><td style="text-align:center"><code>,</code></td><td style="text-align:center"><code>.</code></td><td style="text-align:center">句号</td></tr><tr><td style="text-align:center"><code>&lt;</code></td><td style="text-align:center"><code>!</code></td><td style="text-align:center"><code>,</code></td><td style="text-align:center">逗号</td></tr></tbody></table><p>可以根据英语经验，搜索专有名词反复试验得出最终正确的明文：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Haroun Tazieff, the Polish scientist, has spent his lifetime studying active volcanoes and deep caves in all parts of the world. In nineteen forty-eight, he went to Lake Kivu in the Congo to observe a new volcano which he later named Kituro. Tazieff was able to set up his camp very close to the volcano while it was erupting violently. Though he managed to take a number of brilliant photographs, he could not stay near the volcano for very long. He noticed that a river of liquid rock was coming towards him. It threatened to surround him completely, but Tazieff managed to escape just in time. He waited until the volcano became quiet and he was able to return two days later. This time, he managed to climb into the mouth of Kituro so that he could take photographs and measure temperatures. Tazieff has often risked his life in this way. He has been able to tell us more about active volcanoes than any man alive.</span><br></pre></td></tr></table></figure><p><img src="/img/src/2026-05-03-6.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;sTa7ls7ICS_15_7h3_BIg6esT_EnEmy_OF_ClaSs1CA1_cryPtO6raPHY&#125;</span><br></pre></td></tr></table></figure><div class="note success no-icon flat"><p><strong>明文来源</strong>：<a href="https://newconceptenglish.com/index.php?id=2-067">新概念英语第 2 册 Lesson 67 Volcanoes 火山</a></p></div><h3 id="2-3-Leak-CKKS">2.3 Leak CKKS</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>CKKS 是一种可以使用浮点数运算的全同态加密算法，a1wAys 在上现代密码学课程的时候不小心泄漏了一些明密文对，你能据此得到他的私钥吗 🤓？</p></div><p><strong><font size = 4>(1) 题目分析</font></strong></p><p>本题基于 TenSEAL 的 CKKS 方案。服务端对全零明文做对称加密后执行 <code>multiply</code>，在 <strong>rescale 之前</strong> 把乘法密文的系数数组 <code>ct</code> 以及 <code>decrypt</code> 得到的明文系数 <code>dec</code> 一并输出。同时用派生密钥对 <code>flag</code> 做 AES-ECB 加密。</p><p>关键代码如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">sk_active = dump_dyn_array(sk.data())[: <span class="built_in">len</span>(active_moduli) * N]</span><br><span class="line">key = sha256(<span class="string">&quot;,&quot;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, sk_active)).encode()).hexdigest()[:<span class="number">32</span>]</span><br></pre></td></tr></table></figure><p>AES 密钥由 <code>sk_active</code> 决定：<code>sk.data()</code> 在 NTT 域下，对每个当前 RNS 模数 $q_j$ 取一段长度为 $N$ 的系数。只要恢复这 $L \times N$ 个整数，就能复现 <code>key</code> 并解密 <code>flag</code>。</p><p><code>generate_instance</code> 中循环 <code>NUM_SAMPLES = 2</code> 次，每次独立加密全零、平方、解密，得到两组 <code>(ct, dec)</code>。两组样本的私钥相同，但密文随机性不同，因而得到两条不同的代数方程。</p><p><strong><font size = 4>(2) 建立方程</font></strong></p><p>乘法后密文为 3 分量 $(c_0, c_1, c_2)$。在模素数 $q$、系数位置 $i$ 上，解密满足：</p><p>$$<br>\text{dec} \equiv c_0 + c_1 \cdot s + c_2 \cdot s^2 \pmod q<br>$$</p><p>其中 $s$ 为私钥在该模数、该位置上的 NTT 系数。移项：</p><p>$$<br>c_2 s^2 + c_1 s + (c_0 - \text{dec}) \equiv 0 \pmod q<br>$$</p><p>记 $A = c_0 - \text{dec}$，$B = c_1$，$C = c_2$，则</p><p>$$<br>C s^2 + B s + A \equiv 0 \pmod q<br>$$</p><p>这是 $\mathbb{F}_q$ 上的二次方程。单独解它会有两个根，无法唯一确定 $s$。题目提供两组样本，正是为了在 <strong>不单独求二次根</strong> 的前提下，用联立方程直接解出 $s$。</p><p><strong><font size = 4>(3) 联立消元</font></strong></p><p>设两组样本对应系数 $(A_0, B_0, C_0)$ 与 $(A_1, B_1, C_1)$，共享未知数 $s$：</p><p>$$<br>C_0 s^2 + B_0 s + A_0 \equiv 0 \pmod q<br>$$</p><p>$$<br>C_1 s^2 + B_1 s + A_1 \equiv 0 \pmod q<br>$$</p><p>第一式乘 $C_1$、第二式乘 $C_0$ 后相减，消去 $s^2$：</p><p>$$<br>(B_0 C_1 - B_1 C_0), s + (A_0 C_1 - A_1 C_0) \equiv 0 \pmod q<br>$$</p><p>记 $\Delta = B_0 C_1 - B_1 C_0$。当 $\Delta \not\equiv 0 \pmod q$ 时，</p><p>$$<br>s \equiv \Delta^{-1} (A_1 C_0 - A_0 C_1) \pmod q<br>$$</p><p>对 <code>active_moduli</code> 中每个模数 $q_j$、每个 $i \in [0, N)$ 各算一次，拼接结果即为 <code>sk_active</code>。模数由 <code>CoeffModulus.Create</code> 生成，均为奇素数；随机实例下 $\Delta \equiv 0$ 的概率极低。</p><p><strong><font size = 4>(4) 数据格式与下标</font></strong></p><p>程序打印两行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">[+] ciphertext: &lt;hex&gt;</span><br><span class="line">[+] challenge data: &lt;json&gt;</span><br></pre></td></tr></table></figure><p><code>challenge data</code> 中含 <code>poly_modulus_degree</code>、<code>active_moduli</code>、<code>samples</code> 等字段。每个 sample 有 <code>ct</code>、<code>dec</code>，以及 <code>ciphertext_size = 3</code>、<code>coeff_modulus_size = L</code>。</p><p><code>ct</code> 按 SEAL 动态数组顺序展开：先密文分量，再 RNS 模数，再多项式系数。令 <code>total = L * N</code>：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ct[comp * total + j * N + i]   分量 comp ∈ &#123;0, 1, 2&#125;，模数 j，位置 i</span><br><span class="line">dec[j * N + i]                 模数 j，位置 i</span><br></pre></td></tr></table></figure><p>运行以下脚本拉取远程输出并保存为 <code>output.txt</code>：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line">param(</span><br><span class="line">  [string]<span class="variable">$HostName</span> = <span class="string">&quot;127.0.0.1&quot;</span>,</span><br><span class="line">  [int]<span class="variable">$Port</span> = xxxxx,</span><br><span class="line">  [string]<span class="variable">$OutFile</span> = <span class="string">&quot;output.txt&quot;</span></span><br><span class="line">)</span><br><span class="line"></span><br><span class="line"><span class="variable">$client</span> = <span class="variable">$null</span></span><br><span class="line"><span class="variable">$stream</span> = <span class="variable">$null</span></span><br><span class="line"></span><br><span class="line">try &#123;</span><br><span class="line">  <span class="variable">$client</span> = New-Object System.Net.Sockets.TcpClient(<span class="variable">$HostName</span>, <span class="variable">$Port</span>)</span><br><span class="line">  <span class="variable">$stream</span> = <span class="variable">$client</span>.GetStream()</span><br><span class="line"></span><br><span class="line">  <span class="variable">$req</span> = [Text.Encoding]::ASCII.GetBytes(<span class="string">&quot;GET / HTTP/1.0`r`nHost: <span class="variable">$HostName</span>`r`n`r`n&quot;</span>)</span><br><span class="line">  <span class="variable">$stream</span>.Write(<span class="variable">$req</span>, 0, <span class="variable">$req</span>.Length)</span><br><span class="line"></span><br><span class="line">  <span class="variable">$out</span> = New-Object System.IO.MemoryStream</span><br><span class="line">  <span class="variable">$buf</span> = New-Object byte[] 65536</span><br><span class="line">  <span class="keyword">while</span> ((<span class="variable">$n</span> = <span class="variable">$stream</span>.Read(<span class="variable">$buf</span>, <span class="number">0</span>, <span class="variable">$buf</span>.Length)) -gt 0) &#123;</span><br><span class="line">    <span class="variable">$out</span>.Write(<span class="variable">$buf</span>, 0, <span class="variable">$n</span>)</span><br><span class="line">  &#125;</span><br><span class="line"></span><br><span class="line">  [IO.File]::WriteAllBytes(<span class="variable">$OutFile</span>, <span class="variable">$out</span>.ToArray())</span><br><span class="line">  <span class="string">&quot;saved <span class="subst">$($out.Length)</span> bytes -&gt; <span class="variable">$OutFile</span>&quot;</span></span><br><span class="line">&#125; catch &#123;</span><br><span class="line">  Write-Error <span class="string">&quot;connect/read failed: <span class="subst">$($_.Exception.Message)</span>&quot;</span></span><br><span class="line">  <span class="built_in">exit</span> 1</span><br><span class="line">&#125; finally &#123;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable">$stream</span>) &#123; <span class="variable">$stream</span>.Close() &#125;</span><br><span class="line">  <span class="keyword">if</span> (<span class="variable">$client</span>) &#123; <span class="variable">$client</span>.Close() &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p><strong><font size = 4>(5) 完整解题脚本</font></strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> hashlib <span class="keyword">import</span> sha256</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> Crypto.Cipher <span class="keyword">import</span> AES</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> inverse</span><br><span class="line"><span class="keyword">from</span> Crypto.Util.Padding <span class="keyword">import</span> unpad</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">derive_key</span>(<span class="params">active_sk_ntt</span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;从恢复出的私钥推导 AES 密钥&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 将私钥数组转为逗号连接的字符串，再编码为字节</span></span><br><span class="line">    blob = <span class="string">&quot;,&quot;</span>.join(<span class="built_in">map</span>(<span class="built_in">str</span>, active_sk_ntt)).encode()</span><br><span class="line">    <span class="comment"># SHA256 哈希后取前 32 个十六进制字符作为 AES 密钥</span></span><br><span class="line">    <span class="keyword">return</span> sha256(blob).hexdigest()[:<span class="number">32</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">parse_input</span>(<span class="params">text: <span class="built_in">str</span></span>):</span><br><span class="line">    <span class="string">&quot;&quot;&quot;解析题目输出文本：提取密文和 JSON 数据&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 正则提取 ciphertext 后的十六进制密文</span></span><br><span class="line">    ct_m = re.search(<span class="string">r&quot;ciphertext:\s*([0-9a-fA-F]+)&quot;</span>, text)</span><br><span class="line">    <span class="comment"># 正则提取 challenge data 后的 JSON 数据</span></span><br><span class="line">    json_m = re.search(<span class="string">r&quot;challenge data:\s*(\&#123;.*\&#125;)&quot;</span>, text, flags=re.S)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> (ct_m <span class="keyword">and</span> json_m):</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">&quot;unexpected output format&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> ct_m.group(<span class="number">1</span>).strip(), json.loads(json_m.group(<span class="number">1</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recover_active_secret_key</span>(<span class="params">data: <span class="built_in">dict</span></span>) -&gt; <span class="built_in">list</span>[<span class="built_in">int</span>]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    核心：利用两组明密文对，联立二次方程，逐位求解私钥 s</span></span><br><span class="line"><span class="string">    每个 (j, i) 对应一个模数 q_j 和一个系数位置 i</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 多项式阶 N</span></span><br><span class="line">    N = <span class="built_in">int</span>(data[<span class="string">&quot;poly_modulus_degree&quot;</span>])</span><br><span class="line">    <span class="comment"># 所有 RNS 模数 q_l</span></span><br><span class="line">    moduli = [<span class="built_in">int</span>(x) <span class="keyword">for</span> x <span class="keyword">in</span> data[<span class="string">&quot;active_moduli&quot;</span>]]</span><br><span class="line">    L = <span class="built_in">len</span>(moduli)</span><br><span class="line">    total = L * N</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 获取两组样本（同一私钥，不同随机数）</span></span><br><span class="line">    s0, s1 = data[<span class="string">&quot;samples&quot;</span>]</span><br><span class="line">    ct_0, dec_0 = s0[<span class="string">&quot;ct&quot;</span>], s0[<span class="string">&quot;dec&quot;</span>]</span><br><span class="line">    ct_1, dec_1 = s1[<span class="string">&quot;ct&quot;</span>], s1[<span class="string">&quot;dec&quot;</span>]</span><br><span class="line">    <span class="comment"># 存储最终恢复的私钥系数</span></span><br><span class="line">    recovered = [<span class="number">0</span>] * total</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 密文 ct 下标计算：分量 comp，模数 j，系数 i</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">ct_idx</span>(<span class="params">comp, j, i</span>):</span><br><span class="line">        <span class="keyword">return</span> comp * total + j * N + i</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 明文 dec 下标计算：模数 j，系数 i</span></span><br><span class="line">    <span class="keyword">def</span> <span class="title function_">dec_idx</span>(<span class="params">j, i</span>):</span><br><span class="line">        <span class="keyword">return</span> j * N + i</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 遍历每个模数、每个系数位置，求解 s</span></span><br><span class="line">    <span class="keyword">for</span> j, q <span class="keyword">in</span> <span class="built_in">enumerate</span>(moduli):</span><br><span class="line">        <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(N):</span><br><span class="line">            <span class="comment"># 读取第一组样本 c0, c1, 2 和解密值 d0</span></span><br><span class="line">            c00 = ct_0[ct_idx(<span class="number">0</span>, j, i)] % q</span><br><span class="line">            c01 = ct_0[ct_idx(<span class="number">1</span>, j, i)] % q</span><br><span class="line">            c02 = ct_0[ct_idx(<span class="number">2</span>, j, i)] % q</span><br><span class="line">            d0 = dec_0[dec_idx(j, i)] % q</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 读取第二组样本 c0, c1, 2 和解密值 d1</span></span><br><span class="line">            c10 = ct_1[ct_idx(<span class="number">0</span>, j, i)] % q</span><br><span class="line">            c11 = ct_1[ct_idx(<span class="number">1</span>, j, i)] % q</span><br><span class="line">            c12 = ct_1[ct_idx(<span class="number">2</span>, j, i)] % q</span><br><span class="line">            d1 = dec_1[dec_idx(j, i)] % q</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 构造方程：C * s² + B * s + A = 0 mod q</span></span><br><span class="line">            A0, B0, C0 = (c00 - d0) % q, c01, c02</span><br><span class="line">            A1, B1, C1 = (c10 - d1) % q, c11, c12</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 联立消元，直接解出 s</span></span><br><span class="line">            <span class="comment"># s = (A1 * C0 - A0 * C1) / (B0 * C1 - B1 * C0) mod q</span></span><br><span class="line">            den = (B0 * C1 - B1 * C0) % q</span><br><span class="line">            num = (A1 * C0 - A0 * C1) % q</span><br><span class="line">            recovered[j * N + i] = num * inverse(den, q) % q</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> recovered</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="comment"># 读取远程输出文件</span></span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;output.txt&quot;</span>, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>, errors=<span class="string">&quot;ignore&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        text = f.read()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 解析出 AES 密文和题目参数</span></span><br><span class="line">    ciphertext_hex, data = parse_input(text)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 核心：恢复私钥</span></span><br><span class="line">    sk_active = recover_active_secret_key(data)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 用恢复的私钥推导 AES 密钥</span></span><br><span class="line">    key = derive_key(sk_active)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># AES-ECB 解密 flag</span></span><br><span class="line">    aes = AES.new(<span class="built_in">bytes</span>.fromhex(key), AES.MODE_ECB)</span><br><span class="line">    flag = unpad(aes.decrypt(<span class="built_in">bytes</span>.fromhex(ciphertext_hex)), AES.block_size)</span><br><span class="line">    <span class="built_in">print</span>(flag.decode(errors=<span class="string">&quot;replace&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>运行脚本得出 <code>flag</code>。</p><p><img src="/img/src/2026-05-03-7.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;7H15_is_AN_34sY_PrO8lEM_1oR_YOU_AnD_dO_N0t_b3_a1RaId&#125;</span><br></pre></td></tr></table></figure><h3 id="2-5-Scale-CKKS">2.5 Scale CKKS</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>CKKS 的 Scale 是什么？a1wAys 在 rescale 的时候没有按照标准去做，他觉得好像没什么大不了的 😊 ，你能发现他的错误并得到他的 <code>flag</code> 🚩 吗？</p></div><p><strong><font size = 4>(1) 题目分析</font></strong></p><p>本题基于 TenSEAL 的 CKKS 方案。服务端将 <code>flag</code> 按字节编码为向量并加密，随后执行 50 次随机线性查询：每次生成一个 7 稀疏的 <code>±1</code> 系数行 <code>row</code>、两个小扰动系数 <code>g1, g2</code>，调用 <code>buggy_measurement()</code> 计算一个整数，叠加有界噪声后取模输出。全部查询参数与答案以 JSON 形式公开。</p><p>关键代码如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">def</span> <span class="title function_">buggy_measurement</span>(<span class="params">..., ct_flag, row, g1, g2</span>):</span><br><span class="line">  pt_row = encode_vector(..., row, ct_flag.scale, ct_flag.parms_id())</span><br><span class="line">  ev.multiply_plain(ct_flag, pt_row, ct_mul)</span><br><span class="line">  ct_sum = slot_sum(ev, galois_keys, ct_mul, nslots)</span><br><span class="line"></span><br><span class="line">  pt_g1 = encode_vector(..., [g1], ct_sum.scale, ct_sum.parms_id())</span><br><span class="line">  ev.multiply_plain(ct_sum, pt_g1, ct_tmp)</span><br><span class="line">  ev.rescale_to_next_inplace(ct_tmp)</span><br><span class="line">  ct_tmp.scale = <span class="built_in">float</span>(delta)         <span class="comment"># BUG 1</span></span><br><span class="line"></span><br><span class="line">  pt_g2 = encode_vector(..., [g2], ct_tmp.scale, ct_tmp.parms_id())</span><br><span class="line">  ev.multiply_plain(ct_tmp, pt_g2, ct_out)</span><br><span class="line">  ev.rescale_to_next_inplace(ct_out)</span><br><span class="line">  ct_out.scale = <span class="built_in">float</span>(delta)         <span class="comment"># BUG 2</span></span><br><span class="line"></span><br><span class="line">  decoded = decrypt_first_slot(dec, encoder, ct_out)</span><br><span class="line">  <span class="keyword">return</span> <span class="built_in">int</span>(<span class="built_in">round</span>(decoded / report_scale))</span><br></pre></td></tr></table></figure><p>以及外层采样逻辑：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">row = random_sparse_row(rng_py, <span class="built_in">len</span>(flag_vec), ROW_WEIGHT)   <span class="comment"># ROW_WEIGHT = 7</span></span><br><span class="line">g1 = <span class="number">1.0</span> + rng_py.randint(-<span class="number">80</span>, <span class="number">80</span>) / (<span class="number">2</span> ** <span class="number">12</span>)</span><br><span class="line">g2 = <span class="number">1.0</span> + rng_py.randint(-<span class="number">80</span>, <span class="number">80</span>) / (<span class="number">2</span> ** <span class="number">12</span>)</span><br><span class="line">raw_answer = buggy_measurement(...)</span><br><span class="line">e = rng_py.randint(-ERROR_BOUND, ERROR_BOUND)</span><br><span class="line">answer = centered_mod(raw_answer + e, LWE_MODULUS)</span><br></pre></td></tr></table></figure><p>CKKS 中 <code>rescale_to_next</code> 会沿模数链丢弃尾部素数模，使密文 scale 约除以该模数。题目在每次 rescale 后强行把 <code>ct.scale</code> 改回 <code>delta = 2 ** 30</code>，导致解密时按更小的 scale 解释同一密文，底层数值被额外放大。这一错误把同态运算结果变成了关于 flag 的 <strong>可预测线性泄露</strong>。</p><p><strong><font size = 4>(2) 建立方程</font></strong></p><p><strong>内积折叠</strong>：<code>multiply_plain(ct_flag, pt_row)</code> 后每个 slot 近似为 <code>flag[j] * row[j]</code>；<code>slot_sum()</code> 通过 Galois 旋转把所有 slot 累加到第 0 槽，得到内积：</p><p>$$<br>s = \langle row, flag\rangle = \sum_j row_j \cdot flag_j<br>$$</p><p><strong>scale 篡改带来的放大</strong>：设两次 rescale 丢弃的模数分别为 $q_{n-1}, q_{n-2}$（即 JSON 中 <code>active_coeff_moduli</code> 的最后两项），第 0 槽在最终解密前的真实量级约为：</p><p>$$<br>v \approx \frac{\Delta^4}{q_{n-1} q_{n-2}} \cdot g_1 g_2 \cdot s, \qquad \Delta = 2^{30}<br>$$</p><p>除以 <code>report_scale</code> 并四舍五入，得到 <code>raw_answer</code>；服务端再叠加噪声并取模（cmod 即 <code>centered_mod</code>）：</p><p>$$<br>ans \equiv \mathrm{cmod}!\left(\mathrm{round}(H \cdot s) + e,; p\right) \pmod p<br>$$</p><p>其中：</p><p>$$<br>H = \frac{\Delta^4}{q_{n-1} q_{n-2} \cdot R} \cdot g_1 g_2, \qquad R = \text{report_scale} = 2^{40}, \qquad |e| \le B = 1024<br>$$</p><p>$H$ 完全由公开参数确定，<code>g1, g2</code> 也在 JSON 里。CKKS 舍入误差被吸收进 $e$，在 <code>ERROR_BOUND</code> 基础上额外留约 256 的 slack 便可覆盖。</p><p><strong>内积上界</strong>：每条 <code>row</code> 仅有 7 个 <code>±1</code>，flag 字节为可打印 ASCII（32 ~ 126），故：</p><p>$$<br>|s| \le 7 \times 126 = 882<br>$$</p><p>取值空间极小，可对每条 query 逐一枚举 $s$，检查是否与观测 <code>answer</code> 在模 $p$ 意义下足够接近。</p><p><strong><font size = 4>(3) 筛选候选与 Z3 求解</font></strong></p><p>对第 $k$ 条 query，定义候选集合：</p><p>$$<br>C_k = { s \mid -882 \le s \le 882,\ \mathrm{dist}_p(\mathrm{ans}_k, \mathrm{round}(H_k s)) \le B + slack }<br>$$</p><p>其中 $\mathrm{dist}_p(a, b)$ 是模 $p$ 下的中心距离：</p><p>$$<br>\mathrm{dist}_p(a, b) = |\mathrm{cmod}(a - b, p)|<br>$$</p><p>又记：</p><p>$$<br>H_k = H \cdot g_{1,k} \cdot g_{2,k}<br>$$</p><p>实测每条 query 的 $|C_k|$ 通常只有 1 ~ 2 个。</p><p>建立整数变量 $c_0, \ldots, c_{n-1}$，约束 $32 \le c_i \le 126$，并对每条 query 添加：</p><p>$$<br>\langle \mathrm{row}_k, c \rangle \in C_k<br>$$</p><p>50 条稀疏线性约束足以唯一确定 <code>flag</code>。</p><p><strong><font size = 4>(4) 数据格式与下标</font></strong></p><p>程序输出一行：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[+] challenge data: &lt;json&gt;</span><br></pre></td></tr></table></figure><p>JSON 主要字段：</p><table><thead><tr><th style="text-align:center">字段</th><th style="text-align:center">含义</th></tr></thead><tbody><tr><td style="text-align:center"><code>num_slots_used</code></td><td style="text-align:center"><code>flag</code> 字节数 $n$</td></tr><tr><td style="text-align:center"><code>active_coeff_moduli</code></td><td style="text-align:center">当前 RNS 模数链，取最后两项作为 $q_{n-1}, q_{n-2}$</td></tr><tr><td style="text-align:center"><code>delta</code>, <code>report_scale</code></td><td style="text-align:center">$\Delta$ 与 $R$</td></tr><tr><td style="text-align:center"><code>lwe_modulus</code>, <code>error_bound</code></td><td style="text-align:center">模数 $p$ 与噪声界 $B$</td></tr><tr><td style="text-align:center"><code>rows[k][j]</code></td><td style="text-align:center">第 $k$ 条 query 的稀疏系数，长度 $n$</td></tr><tr><td style="text-align:center"><code>g1[k]</code>, <code>g2[k]</code></td><td style="text-align:center">第 $k$ 条 query 的扰动系数</td></tr><tr><td style="text-align:center"><code>answers[k]</code></td><td style="text-align:center">第 $k$ 条 query 的模加噪输出</td></tr></tbody></table><p>运行以下脚本拉取远程输出并保存为 <code>instance.json</code>：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    host, port = <span class="string">&quot;127.0.0.1&quot;</span>, xxxxx</span><br><span class="line">    out_path = <span class="string">&quot;instance.json&quot;</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">with</span> socket.create_connection((host, port), timeout=<span class="number">5.0</span>) <span class="keyword">as</span> s:</span><br><span class="line">        buf = <span class="string">b&quot;&quot;</span></span><br><span class="line">        <span class="keyword">while</span> <span class="literal">True</span>:</span><br><span class="line">            d = s.recv(<span class="number">65536</span>)</span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> d:</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line">            buf += d</span><br><span class="line"></span><br><span class="line">    txt = buf.decode(errors=<span class="string">&quot;replace&quot;</span>)</span><br><span class="line"></span><br><span class="line">    m = re.search(<span class="string">r&quot;\[\+\] challenge data: (\&#123;.*\&#125;)&quot;</span>, txt, re.S)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> m:</span><br><span class="line">        <span class="keyword">raise</span> SystemExit(<span class="string">&quot;[-] could not find challenge JSON in response&quot;</span>)</span><br><span class="line"></span><br><span class="line">    obj = json.loads(m.group(<span class="number">1</span>))</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(out_path, <span class="string">&quot;w&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        json.dump(obj, f)</span><br><span class="line"></span><br><span class="line">    <span class="built_in">print</span>(<span class="string">f&quot;[+] saved <span class="subst">&#123;out_path&#125;</span>&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p><strong><font size = 4>(5) 完整解题脚本</font></strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> json</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">from</span> typing <span class="keyword">import</span> <span class="type">List</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> ArithRef, Int, IntVal, Or, Solver, Sum, sat</span><br><span class="line"></span><br><span class="line">CHAR_MIN = <span class="number">32</span></span><br><span class="line">CHAR_MAX = <span class="number">126</span></span><br><span class="line"></span><br><span class="line">NOISE_SLACK = <span class="number">256</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">centered_mod</span>(<span class="params">x: <span class="built_in">int</span>, mod: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;中心模运算：把结果映射到 [-mod/2, mod/2) 区间&quot;&quot;&quot;</span></span><br><span class="line">    x %= mod</span><br><span class="line">    <span class="keyword">return</span> x - mod <span class="keyword">if</span> x &gt; mod // <span class="number">2</span> <span class="keyword">else</span> x</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">mod_dist</span>(<span class="params">a: <span class="built_in">int</span>, b: <span class="built_in">int</span>, mod: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;计算模 p 下的中心距离&quot;&quot;&quot;</span></span><br><span class="line">    d = (a - b) % mod</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">abs</span>(d - mod) <span class="keyword">if</span> d &gt; mod // <span class="number">2</span> <span class="keyword">else</span> <span class="built_in">abs</span>(d)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">parse_instance</span>(<span class="params">text: <span class="built_in">str</span></span>) -&gt; <span class="built_in">dict</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;从题目输出文本中解析 JSON 格式的挑战数据&quot;&quot;&quot;</span></span><br><span class="line">    m = re.search(<span class="string">r&quot;\[\+\]\s*challenge data:\s*(\&#123;.*\&#125;)&quot;</span>, text, re.S)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> m:</span><br><span class="line">        <span class="keyword">raise</span> ValueError(<span class="string">&quot;challenge JSON not found&quot;</span>)</span><br><span class="line">    <span class="keyword">return</span> json.loads(m.group(<span class="number">1</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">scale_factor</span>(<span class="params">inst: <span class="built_in">dict</span></span>) -&gt; <span class="built_in">float</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    核心：计算题目 BUG 造成的固定放大系数 H</span></span><br><span class="line"><span class="string">    H = delta⁴ / (q_&#123;n-1&#125; * q_&#123;n-2&#125; * report_scale)</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    delta = inst[<span class="string">&quot;delta&quot;</span>]</span><br><span class="line">    report_scale = inst[<span class="string">&quot;report_scale&quot;</span>]</span><br><span class="line">    <span class="comment"># 取模数链最后两个素数（两次 rescale 丢弃的模数）</span></span><br><span class="line">    q_last, q_prev = inst[<span class="string">&quot;active_coeff_moduli&quot;</span>][-<span class="number">1</span>], inst[<span class="string">&quot;active_coeff_moduli&quot;</span>][-<span class="number">2</span>]</span><br><span class="line">    <span class="keyword">return</span> (delta ** <span class="number">4</span>) / (q_last * q_prev * report_scale)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">candidate_dots</span>(<span class="params">inst: <span class="built_in">dict</span></span>) -&gt; <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    对每条查询，枚举出合法的内积 s</span></span><br><span class="line"><span class="string">    s = row · flag</span></span><br><span class="line"><span class="string">    满足：观测答案 ≈ round(H * g1 * g2 * s) + e</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    p = inst[<span class="string">&quot;lwe_modulus&quot;</span>]</span><br><span class="line">    <span class="comment"># 总误差界 = 题目给定误差 + 额外余量</span></span><br><span class="line">    err = inst[<span class="string">&quot;error_bound&quot;</span>] + NOISE_SLACK</span><br><span class="line">    base = scale_factor(inst)</span><br><span class="line"></span><br><span class="line">    all_cands: <span class="type">List</span>[<span class="type">List</span>[<span class="built_in">int</span>]] = []</span><br><span class="line">    <span class="comment"># 遍历每一条查询</span></span><br><span class="line">    <span class="keyword">for</span> row, g1, g2, ans <span class="keyword">in</span> <span class="built_in">zip</span>(inst[<span class="string">&quot;rows&quot;</span>], inst[<span class="string">&quot;g1&quot;</span>], inst[<span class="string">&quot;g2&quot;</span>], inst[<span class="string">&quot;answers&quot;</span>]):</span><br><span class="line">        <span class="comment"># 本次查询的整体系数：H * g1 * g2</span></span><br><span class="line">        coef = base * g1 * g2</span><br><span class="line">        <span class="comment"># s 的理论最大绝对值</span></span><br><span class="line">        bound = CHAR_MAX * <span class="built_in">sum</span>(<span class="built_in">abs</span>(x) <span class="keyword">for</span> x <span class="keyword">in</span> row)</span><br><span class="line">        <span class="comment"># 枚举所有可能 s，筛选出距离足够近的候选</span></span><br><span class="line">        cands = [</span><br><span class="line">            s</span><br><span class="line">            <span class="keyword">for</span> s <span class="keyword">in</span> <span class="built_in">range</span>(-bound, bound + <span class="number">1</span>)</span><br><span class="line">            <span class="keyword">if</span> mod_dist(centered_mod(<span class="built_in">round</span>(coef * s), p), ans, p) &lt;= err</span><br><span class="line">        ]</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> cands:</span><br><span class="line">            <span class="keyword">raise</span> ValueError(<span class="string">f&quot;empty candidate set at query <span class="subst">&#123;<span class="built_in">len</span>(all_cands)&#125;</span>&quot;</span>)</span><br><span class="line">        all_cands.append(cands)</span><br><span class="line">    <span class="keyword">return</span> all_cands</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recover_flag</span>(<span class="params">inst: <span class="built_in">dict</span></span>) -&gt; <span class="built_in">str</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;</span></span><br><span class="line"><span class="string">    用 Z3 求解器：</span></span><br><span class="line"><span class="string">    给定 50 条稀疏线性约束 row·flag = s</span></span><br><span class="line"><span class="string">    求唯一满足所有约束的 ASCII 字节数组 flag</span></span><br><span class="line"><span class="string">    &quot;&quot;&quot;</span></span><br><span class="line">    n = inst[<span class="string">&quot;num_slots_used&quot;</span>]</span><br><span class="line">    <span class="comment"># 获取每条查询的候选内积集合</span></span><br><span class="line">    cands = candidate_dots(inst)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 定义 Z3 变量：flag 的每个字节 c_0 ... c_n</span></span><br><span class="line">    chars: <span class="type">List</span>[ArithRef] = [Int(<span class="string">f&quot;c_<span class="subst">&#123;i&#125;</span>&quot;</span>) <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(n)]</span><br><span class="line">    solver = Solver()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 约束 1：每个字节必须是可打印 ASCII</span></span><br><span class="line">    <span class="keyword">for</span> c <span class="keyword">in</span> chars:</span><br><span class="line">        solver.add(c &gt;= CHAR_MIN, c &lt;= CHAR_MAX)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 约束 2：每条查询的内积必须落在候选集合里</span></span><br><span class="line">    <span class="keyword">for</span> row, cand <span class="keyword">in</span> <span class="built_in">zip</span>(inst[<span class="string">&quot;rows&quot;</span>], cands):</span><br><span class="line">        lin = Sum([IntVal(row[j]) * chars[j] <span class="keyword">for</span> j <span class="keyword">in</span> <span class="built_in">range</span>(n)])</span><br><span class="line">        solver.add(Or(*(lin == IntVal(v) <span class="keyword">for</span> v <span class="keyword">in</span> cand)))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 求解</span></span><br><span class="line">    <span class="keyword">if</span> solver.check() != sat:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;Z3 UNSAT&quot;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 把解转为字符串</span></span><br><span class="line">    model = solver.model()</span><br><span class="line">    <span class="keyword">return</span> <span class="string">&quot;&quot;</span>.join(<span class="built_in">chr</span>(model[c].as_long()) <span class="keyword">for</span> c <span class="keyword">in</span> chars)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="keyword">with</span> <span class="built_in">open</span>(<span class="string">&quot;instance.json&quot;</span>, <span class="string">&quot;r&quot;</span>, encoding=<span class="string">&quot;utf-8&quot;</span>) <span class="keyword">as</span> f:</span><br><span class="line">        inst = json.load(f)</span><br><span class="line">    <span class="built_in">print</span>(recover_flag(inst))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>运行脚本得出 <code>flag</code>。</p><p><img src="/img/src/2026-05-03-8.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;Us3_tHE_5cA13_WEIL_4nD_r3scalE_Wi7h_cARE!&#125;</span><br></pre></td></tr></table></figure><h3 id="2-7-手撕平方根">2.7 手撕平方根</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>看，我能手撕平方根！</p></div><p><strong><font size = 4>(1) 题目分析</font></strong></p><p>服务端生成 1024-bit RSA，公钥指数 $e = 2147483647 = 2^{31}-1$，明文为 <code>flag || random_padding</code>（总长 120 字节）。除输出 <code>n</code>、<code>c</code> 外，还提供最多 <strong>50 次</strong>平方根 Oracle：输入 $a \in [0, 10000)$，若 $a$ 是模 $n$ 的二次剩余则返回一个平方根，否则报错。</p><p>关键代码如下：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">p, q = mpz(getPrime(<span class="number">1024</span>)), mpz(getPrime(<span class="number">1024</span>))</span><br><span class="line">n = p * q</span><br><span class="line">m = mpz(<span class="built_in">int</span>.from_bytes(flag + urandom(<span class="number">120</span> - <span class="built_in">len</span>(flag)), byteorder=<span class="string">&quot;big&quot;</span>))</span><br><span class="line">c = powmod(m, <span class="number">2147483647</span>, n)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">50</span>):</span><br><span class="line">    a = mpz(<span class="built_in">input</span>())</span><br><span class="line">    sp, sq = Sqrt(a, p), Sqrt(a, q)</span><br><span class="line">    <span class="keyword">if</span> sp <span class="keyword">is</span> <span class="literal">None</span> <span class="keyword">or</span> sq <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;there does not exist an integer x such that x * x % n == <span class="subst">&#123;<span class="built_in">int</span>(a)&#125;</span>&quot;</span>)</span><br><span class="line">    <span class="keyword">else</span>:</span><br><span class="line">        x = <span class="built_in">min</span>(CRT(sp, sq), CRT(sp, -sq), CRT(-sp, sq), CRT(-sp, -sq))</span><br><span class="line">        <span class="built_in">print</span>(<span class="string">f&quot;the least non-negative integer x such that x * x % n == <span class="subst">&#123;<span class="built_in">int</span>(a)&#125;</span> is <span class="subst">&#123;<span class="built_in">int</span>(x)&#125;</span>&quot;</span>)</span><br></pre></td></tr></table></figure><p>模 $n = pq$ 下，二次方程 $x^2 \equiv a \pmod n$ 若有解，共有 <strong>4 个</strong>平方根（来自 $(\pm sp, \pm sq)$ 的 CRT 组合）。服务端固定返回其中 <strong>最小非负</strong> 的那一个。</p><p><strong><font size = 4>(2) 分解原理</font></strong></p><p>若找到 $x_0, x_1$ 满足：</p><p>$$<br>x_0^2 \equiv x_1^2 \pmod n, \qquad x_0 \not\equiv \pm x_1 \pmod n,<br>$$</p><p>则 $(x_0 - x_1)(x_0 + x_1) \equiv 0 \pmod n$，而 $n \nmid (x_0 - x_1)$、$n \nmid (x_0 + x_1)$，故：</p><p>$$<br>\gcd(x_0 - x_1, n) \in {p, q}<br>\quad\text{或}\quad<br>\gcd(x_0 + x_1, n) \in {p, q}.<br>$$</p><p>得到 $p, q$ 后即可正常 RSA 解密。本题的核心是：在 50 次查询内构造 <strong>同一数的两个不同平方根</strong>。</p><p><strong><font size = 4>(3) 构造两个不同的平方根</font></strong></p><p>找三个小素数 $\alpha, \beta, \gamma$，满足：</p><ul><li>各自是模 $n$ 的 <strong>二次非剩余</strong>（Oracle 对单查返回不存在）；</li><li>两两乘积 $\alpha\beta,\ \alpha\gamma,\ \beta\gamma$ 均为 <strong>二次剩余</strong>。</li></ul><p>对每对乘积向 Oracle 查询，记：</p><p>$$<br>x = \sqrt{\alpha\beta},\quad y = \sqrt{\alpha\gamma},\quad z = \sqrt{\beta\gamma}.<br>$$</p><p>则：</p><p>$$<br>(xyz)^2 \equiv (\alpha\beta)(\alpha\gamma)(\beta\gamma) \equiv \alpha^2\beta^2\gamma^2 \equiv (\alpha\beta\gamma)^2 \pmod n.<br>$$</p><p>令：</p><p>$$<br>x_0 = xyz \bmod n, \qquad x_1 = \alpha\beta\gamma,<br>$$</p><p>两者都是 $(\alpha\beta\gamma)^2$ 的平方根。由于 $x_0$ 由 Oracle 返回值相乘得到、$x_1$ 是小于 $10000$ 的整数，通常 $x_0 \not\equiv \pm x_1 \pmod n$，一次 $\gcd$ 即可分解。</p><p><strong><font size = 4>(4) 查询流程</font></strong></p><p>在 $[2, 100)$ 的小素数中随机扫描，维护三条并行 <strong>链</strong>。每条链形如：</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">[(α, []), (β, [√(αβ)]), (γ, [√(αγ), √(βγ)]), ...]</span><br></pre></td></tr></table></figure><p>对素数 $p$：</p><ol><li>若 $p$ 是二次剩余，跳过；</li><li>若某条链为空，将 $p$ 作为链首（第一个非剩余）；</li><li>否则查询 $p \cdot \text{链首}$：若仍是非剩余则换链；若是剩余则把 $p$ 加入链，并记录 Oracle 返回的平方根；</li><li>链长 $\ge 3$ 时，对新加入的 $p$ 再查 $p \cdot \text{链中第 } k \text{ 个素数}$，按公式计算候选 $(x_0, x_1)$ 并尝试 $\gcd$。</li></ol><p>三条链对应不同的链首非剩余，提高在 50 次内凑齐合法三元组的概率。实测通常 <strong>10 次以内</strong> 即可分解。</p><p><strong><font size = 4>(5) 完整解题脚本</font></strong></p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> random</span><br><span class="line"><span class="keyword">import</span> re</span><br><span class="line"><span class="keyword">import</span> socket</span><br><span class="line"></span><br><span class="line"><span class="keyword">from</span> Crypto.Util.number <span class="keyword">import</span> GCD, inverse, isPrime, long_to_bytes</span><br><span class="line"></span><br><span class="line"><span class="comment"># 目标服务端地址</span></span><br><span class="line">HOST = <span class="string">&quot;127.0.0.1&quot;</span></span><br><span class="line">PORT = xxxxx</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_until</span>(<span class="params">sock: socket.socket, marker: <span class="built_in">bytes</span>, limit: <span class="built_in">int</span> = <span class="number">200_000</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;辅助函数：从 socket 接收数据直到遇到指定标记&quot;&quot;&quot;</span></span><br><span class="line">    data = <span class="string">b&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 循环读取数据，直到找到标记或超出长度限制</span></span><br><span class="line">    <span class="keyword">while</span> marker <span class="keyword">not</span> <span class="keyword">in</span> data <span class="keyword">and</span> <span class="built_in">len</span>(data) &lt; limit:</span><br><span class="line">        chunk = sock.recv(<span class="number">4096</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        data += chunk</span><br><span class="line">    <span class="keyword">return</span> data</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">recv_line</span>(<span class="params">sock: socket.socket</span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;辅助函数：读取一行数据&quot;&quot;&quot;</span></span><br><span class="line">    data = <span class="string">b&quot;&quot;</span></span><br><span class="line">    <span class="keyword">while</span> <span class="string">b&quot;\n&quot;</span> <span class="keyword">not</span> <span class="keyword">in</span> data:</span><br><span class="line">        chunk = sock.recv(<span class="number">4096</span>)</span><br><span class="line">        <span class="keyword">if</span> <span class="keyword">not</span> chunk:</span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line">        data += chunk</span><br><span class="line">    <span class="comment"># 按换行符分割，返回第一行</span></span><br><span class="line">    <span class="keyword">return</span> data.split(<span class="string">b&quot;\n&quot;</span>, <span class="number">1</span>)[<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">query_sqrt</span>(<span class="params">sock: socket.socket, a: <span class="built_in">int</span></span>) -&gt; <span class="built_in">int</span> | <span class="literal">None</span>:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;核心交互函数：向服务端发送数字 a，请求其平方根&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 发送请求</span></span><br><span class="line">    sock.sendall(<span class="string">f&quot;<span class="subst">&#123;a&#125;</span>\n&quot;</span>.encode())</span><br><span class="line">    <span class="comment"># 读取返回结果</span></span><br><span class="line">    line = recv_line(sock)</span><br><span class="line">    <span class="comment"># 正则提取结果中的平方根</span></span><br><span class="line">    m = re.search(<span class="string">rb&quot;is (\d+)$&quot;</span>, line)</span><br><span class="line">    <span class="keyword">return</span> <span class="built_in">int</span>(m.group(<span class="number">1</span>)) <span class="keyword">if</span> m <span class="keyword">else</span> <span class="literal">None</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">factor_with_oracle</span>(<span class="params">sock: socket.socket, n: <span class="built_in">int</span></span>) -&gt; <span class="built_in">tuple</span>[<span class="built_in">int</span>, <span class="built_in">int</span>]:</span><br><span class="line">    <span class="string">&quot;&quot;&quot;核心算法：利用平方根预言机构造碰撞，分解模数 n&quot;&quot;&quot;</span></span><br><span class="line">    <span class="comment"># 生成 2-100 之间的素数列表，用于尝试构造三元组</span></span><br><span class="line">    primes = [i <span class="keyword">for</span> i <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">2</span>, <span class="number">100</span>) <span class="keyword">if</span> isPrime(i)]</span><br><span class="line">    random.shuffle(primes)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 每条链格式：[(素数 p, [p 与链内其他素数乘积的平方根...]), ...]</span></span><br><span class="line">    chains: <span class="built_in">list</span>[<span class="built_in">list</span>[<span class="built_in">tuple</span>[<span class="built_in">int</span>, <span class="built_in">list</span>[<span class="built_in">int</span>]]]] = [[], [], []]</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 遍历小素数，开始构造链</span></span><br><span class="line">    <span class="keyword">for</span> p <span class="keyword">in</span> primes:</span><br><span class="line">        <span class="comment"># 如果 p 本身是二次剩余，跳过（我们需要非剩余）</span></span><br><span class="line">        <span class="keyword">if</span> query_sqrt(sock, p) <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">None</span>:</span><br><span class="line">            <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">        <span class="comment"># 尝试将当前素数 p 加入某一条链</span></span><br><span class="line">        <span class="keyword">for</span> chain <span class="keyword">in</span> chains:</span><br><span class="line">            <span class="comment"># 如果链为空，将 p 作为这条链的起点</span></span><br><span class="line">            <span class="keyword">if</span> <span class="keyword">not</span> chain:</span><br><span class="line">                chain.append((p, []))</span><br><span class="line">                <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">            <span class="comment"># 查询 (链首素数 * p) 的平方根</span></span><br><span class="line">            root = query_sqrt(sock, chain[<span class="number">0</span>][<span class="number">0</span>] * p)</span><br><span class="line">            <span class="comment"># 如果结果不是剩余（无平方根），换一条链尝试</span></span><br><span class="line">            <span class="keyword">if</span> root <span class="keyword">is</span> <span class="literal">None</span>:</span><br><span class="line">                <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line">            <span class="comment"># 找到了！(链首素数 * p) 是剩余，将 p 加入链</span></span><br><span class="line">            chain.append((p, [root]))</span><br><span class="line"></span><br><span class="line">            <span class="comment"># 遍历链中已有的素数，组合生成新的平方根</span></span><br><span class="line">            <span class="keyword">for</span> k <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">1</span>, <span class="built_in">len</span>(chain) - <span class="number">1</span>):</span><br><span class="line">                <span class="comment"># 查询 p 和链中第 k 个素数的乘积的平方根</span></span><br><span class="line">                root_k = query_sqrt(sock, p * chain[k][<span class="number">0</span>])</span><br><span class="line">                chain[-<span class="number">1</span>][<span class="number">1</span>].append(root_k)</span><br><span class="line"></span><br><span class="line">                <span class="comment"># 关键：组合三个平方根，构造碰撞</span></span><br><span class="line">                <span class="keyword">for</span> u <span class="keyword">in</span> <span class="built_in">range</span>(k):</span><br><span class="line">                    <span class="comment"># 计算 x = sqrt(p * pk) * sqrt(p * pu) * sqrt(pk * pu)</span></span><br><span class="line">                    x = chain[-<span class="number">1</span>][<span class="number">1</span>][k] * chain[-<span class="number">1</span>][<span class="number">1</span>][u] * chain[k][<span class="number">1</span>][u] % n</span><br><span class="line">                    <span class="comment"># 计算 y = p * pk * pu</span></span><br><span class="line">                    y = chain[-<span class="number">1</span>][<span class="number">0</span>] * chain[k][<span class="number">0</span>] * chain[u][<span class="number">0</span>]</span><br><span class="line"></span><br><span class="line">                    <span class="comment"># 此时 x ^ 2 ≡ y ^ 2 (mod n)，利用 gcd 分解 n</span></span><br><span class="line">                    <span class="keyword">for</span> diff <span class="keyword">in</span> (x - y, x + y):</span><br><span class="line">                        g = GCD(diff % n, n)</span><br><span class="line">                        <span class="comment"># 找到一个有效的因子</span></span><br><span class="line">                        <span class="keyword">if</span> <span class="number">1</span> &lt; g &lt; n:</span><br><span class="line">                            <span class="keyword">return</span> g, n // g</span><br><span class="line">            <span class="comment"># 一条链处理成功，跳出循环</span></span><br><span class="line">            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">    <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;failed to factor within query budget&quot;</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># 辅助函数：从解密后的明文中提取 flag 字符串</span></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">extract_flag</span>(<span class="params">m_int: <span class="built_in">int</span>, n: <span class="built_in">int</span></span>) -&gt; <span class="built_in">bytes</span>:</span><br><span class="line">    k = (n.bit_length() + <span class="number">7</span>) // <span class="number">8</span></span><br><span class="line">    <span class="comment"># 将大整数转为原始字节</span></span><br><span class="line">    blob = long_to_bytes(m_int, k)</span><br><span class="line">    <span class="comment"># 查找 flag 特征前缀并截取</span></span><br><span class="line">    start = blob.find(<span class="string">b&quot;W4terCTF&#123;&quot;</span>)</span><br><span class="line">    <span class="keyword">if</span> start == -<span class="number">1</span>:</span><br><span class="line">        <span class="keyword">return</span> blob</span><br><span class="line">    end = blob.find(<span class="string">b&quot;&#125;&quot;</span>, start)</span><br><span class="line">    <span class="keyword">return</span> blob[start: end + <span class="number">1</span>] <span class="keyword">if</span> end != -<span class="number">1</span> <span class="keyword">else</span> blob[start:]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">def</span> <span class="title function_">main</span>():</span><br><span class="line">    <span class="comment"># 连接远程服务</span></span><br><span class="line">    sock = socket.create_connection((HOST, PORT), timeout=<span class="number">10</span>)</span><br><span class="line">    sock.settimeout(<span class="number">10</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 接收欢迎信息，提取 RSA 公钥 n 和密文 c</span></span><br><span class="line">    banner = recv_until(sock, <span class="string">b&quot;Feel free&quot;</span>)</span><br><span class="line">    ns = re.search(<span class="string">rb&quot;n = (\d+)&quot;</span>, banner)</span><br><span class="line">    cs = re.search(<span class="string">rb&quot;c = (\d+)&quot;</span>, banner)</span><br><span class="line">    <span class="keyword">if</span> <span class="keyword">not</span> ns <span class="keyword">or</span> <span class="keyword">not</span> cs:</span><br><span class="line">        <span class="keyword">raise</span> RuntimeError(<span class="string">&quot;failed to parse n/c&quot;</span>)</span><br><span class="line">    n, c = <span class="built_in">int</span>(ns.group(<span class="number">1</span>)), <span class="built_in">int</span>(cs.group(<span class="number">1</span>))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 核心：调用函数，利用 Oracle 分解 n 得到 p, q</span></span><br><span class="line">    p, q = factor_with_oracle(sock, n)</span><br><span class="line">    <span class="keyword">if</span> p &gt; q:</span><br><span class="line">        p, q = q, p</span><br><span class="line"></span><br><span class="line">    <span class="comment"># 标准 RSA 解密流程</span></span><br><span class="line">    e = <span class="number">2147483647</span>  <span class="comment"># 题目给定的公钥指数 e = 2 ^ 31 - 1</span></span><br><span class="line">    phi = (p - <span class="number">1</span>) * (q - <span class="number">1</span>)</span><br><span class="line">    d = inverse(e, phi)  <span class="comment"># 计算私钥 d</span></span><br><span class="line">    m = <span class="built_in">pow</span>(c, d, n)  <span class="comment"># 解密密文得到明文 m</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># 提取并打印 flag</span></span><br><span class="line">    <span class="built_in">print</span>(extract_flag(m, n).decode(errors=<span class="string">&quot;replace&quot;</span>))</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> __name__ == <span class="string">&quot;__main__&quot;</span>:</span><br><span class="line">    main()</span><br></pre></td></tr></table></figure><p>运行脚本得出 <code>flag</code>。</p><p><img src="/img/src/2026-05-03-9.png" alt=""></p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;H0W_TO_1aCtorI23_a_NUm83R_w1th_Qu4dRAT1c_r3sldU3&#125;</span><br></pre></td></tr></table></figure><h2 id="3-Pwn">3 Pwn</h2><h3 id="3-4-等长条">3.4 等长条</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>你好，玩家。欢迎回到 <code>W4terCTF</code> 游戏厅：Capture The Fun！</p><p>在过去的几年里，我们曾一起在 2048、贪吃蛇里冲刺高分，也共同在扫雷、推箱子中步步为营 …… 是大家的努力，让 <code>W4terCTF</code> 游戏厅仍然屹立不倒，依旧蒸蒸日上！</p><p>而在 4 月 26 日，我们游戏厅也将展开新的篇章。没错，听好了 — 游戏厅就此陷落（倒闭）！都怪你们一年里只来一个星期，我们连发奖金的钱都没了。现在只剩下这台 <code>Beyond</code> 难度的<strong>俄罗斯方块</strong>，你们凑合玩去吧。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;I&#x27;ve_833n_waITIn6_FOr_4935!_h4S_THE_PRO8A81LI7y_6Een_5eCREt1y_chaN6eD?!&#125;</span><br></pre></td></tr></table></figure><h3 id="3-5-能力开发・缺陷电气">3.5 能力开发・缺陷电气</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>数据不保证，1 ≤ q ≤ 100，开始的字符串长度 ≤ 100。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;WH3n_aLl_GUAR4n7EeS_V4nIsH,_evErythInG_CO1lAPs3S&#125;</span><br></pre></td></tr></table></figure><h3 id="3-6-能力开发・路径穿过">3.6 能力开发・路径穿过</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>穿过迷瘴，看到真相。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;wAIK_THrOu6h_tHE_P47h_tO_bEhoID_A_bE7Ter_vIEW&#125;</span><br></pre></td></tr></table></figure><h3 id="3-7-能力开发・鸟瞰把握">3.7 能力开发・鸟瞰把握</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>天空上的鸟儿，它们会看到什么？</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;I_s3aRcH_the_woR1d_fOr_yoU,_wI5H1nG_t0_5C4N_TH3_r3S7_wi7h_M3&#125;</span><br></pre></td></tr></table></figure><h2 id="4-Web">4 Web</h2><h3 id="4-2-Safe-Store">4.2 Safe Store</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>Rust 以安全著称，既然通过了编译，那这个商店就是安全的 …… 吗？</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;c0MPiLa7lON_Doe5_n0T_m34N_SAFe7y&#125;</span><br></pre></td></tr></table></figure><h3 id="4-4-ez-blog">4.4 ez blog</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>小李子的博客经历了不停的迁移，某天小李子突然看到了博客的远古版本备份，但是他用正确的账号密码怎么登录不上去？？？小李子最后发现这个 <code>blog</code> 没有他想象中那么 ez …</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;whY_WOu1d_A_r3V3rs3_shE1l_AnD_cve_4PPeaR_In_A_8lO9?&#125;</span><br></pre></td></tr></table></figure><h3 id="4-7-乌萨奇的硬币">4.7 乌萨奇的硬币</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>Usagi 撿到了一枚奇怪的硬幣，Hachiware 試著投擲了幾次，發現正反面的概率竟然不一樣！硬幣的側面有一行小字：“<code>flag</code> を探しているって聞いた？正面の確率を推測してみて！”</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;lo77Ry_1S_faK3_aND_PRopeR_use_O1_S355ION_CO0kle_Or_NAn_CAn_5Olv3_Th3_PR0BI3M&#125;</span><br></pre></td></tr></table></figure><h2 id="5-Reverse">5 Reverse</h2><h3 id="5-1-Bluntstone">5.1 Bluntstone</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>Tarnished, a hardened Bluntstone blocks your path. Shatter its compressed shell to reveal the shifting logic within. Reverse the chaotic magic and reclaim your lost Grace.</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;3VeN_A_bIun7s7oNE_can_DE1IEct_60DS&#125;</span><br></pre></td></tr></table></figure><h3 id="5-2-FunSokoban">5.2 FunSokoban</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>请逆向分析附件，找出一段正确的操作序列，使程序进入成功分支。</p><p>你需要提交的是触发成功输出所需的输入字符串。<code>flag</code> 格式为：W4terCTF{输入字符串}。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;dwwwaawdsdsssaawwssddwwwawaasdsssddwwwdwaadssssaawwwdwdsswaaawdf&#125;</span><br></pre></td></tr></table></figure><h3 id="5-3-Strange-puts">5.3 Strange puts</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>对、对吗？哦不对不对 😵‍💫。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;NIc3_CA7CH_THa7_pTr_WaS_5WAPpEd_aI1_AI0n9&#125;</span><br></pre></td></tr></table></figure><h3 id="5-4-Vigorcheck">5.4 Vigorcheck</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>The Tree Sentinel stands as the first trial for any Tarnished who dares set foot in the Lands Between. He wields three devastating strokes to shatter the resolve of the weak. Canst thou fell the golden guardian and claim thy Grace?</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;F0U1_7ArNIsh3D_P4sSED_7h3_vIgOr_cHECk!&#125;</span><br></pre></td></tr></table></figure><h3 id="5-5-开始电力运输">5.5 开始电力运输</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>《终末地的脉动：第十三号能源网络的重建》</p><p>在“佩丽卡”这片被历史遗忘的大地上，风总是带着铁锈和源石尘埃的苦涩味道。对于阿戈尔而言，这里既是流放之地，也是重生的摇篮。巨大的工业遗迹如同远古巨兽的骸骨，横亘在红色的荒原之上，而在这些骸骨之间，技术开拓者们正用双手编织着新的神经网络。</p><p>故事发生在一处代号为“扇区-09”的资源采集点。这里曾经是旧时代繁华的能源中枢，但在漫长的历史断层中，它早已沉寂，只有那些锈迹斑斑的输电塔还依稀保留着往日的威严。开拓者小队抵达这里时，迎接他们的只有死一般的寂静和警报灯微弱的闪光。这次的任务很明确，却异常艰巨：重启 扇区-09 的核心供电系统，并将周边荒废的前哨站重新接入主网络。</p><p>拉电线，听起来是一件枯燥乏味的基础体力活，但在终末地，这项工作被称为“接引生命线”。每一根沉重的线缆都承载着数万伏特的源石动能，它们不仅仅是传输电流的介质，更是连接各个分散据点的纽带。没有了这些线缆，环境改造机无法运转，滤净塔无法提供呼吸用的空气，那些在此地驻守的工程师们也将被黑暗与严寒吞噬。</p><p>女主角，年轻的开拓组组长，站在布满碎石的高地上。她的视野尽头是 扇区-09 的主控室，那里有一座巨大的变电站，像是一颗停止跳动的心脏。她手中的终端屏幕闪烁着，显示着错综复杂的电路拓扑图。她深吸一口气，通过通讯频道下达了指令：“铺设组，准备进行最后一段的架设。这根线缆一旦接通，第 13 号能源网络就能全线点亮。”</p><p>风沙骤起，打在防护服的玻璃面罩上，发出细碎的声响。重型工程机甲缓缓启动，它们的机械臂上缠绕着粗大的黑色管线。这不是普通的数据线，而是能够承受极端环境的输电主干。机甲操作员必须拥有极高的精准度，因为在狂风和崎岖地形的干扰下，将线缆对接到只有几毫米宽的接口上，无异于在风暴中穿针引线。</p><p>随着绞盘的轰鸣声，第一根线缆被拉向了远方的塔架。线缆在空中绷直，发出沉闷的低鸣，仿佛是一张巨大的弓被拉满。这就是“拉电线”的艺术 —— 它是对物理法则的挑战，也是对意志力的考验。每一个拉扯的动作都需要协同，前方的机甲在探路，后方的工程兵在固定支点，中间的观察员时刻监视着线缆的张力，防止因为过紧而崩断，或者因为过松而触地磨损。</p><p>在这个过程中，开拓者们面对的不仅仅是物理上的困难。扇区-09 的地下深处隐藏着不稳定的源石矿脉，电磁风暴时刻威胁着线路的安全。有一次，一场突如其来的地磁暴让刚刚架设好的两百米线路瞬间过载，绝缘层冒出了青烟。如果不及时切断并重新铺设，整个前哨站的备用能源都会被烧毁。</p><p>“稳住！不要慌！”组长在频道中大声喊道。她冲了上去，手动开启了紧急隔离阀。那一刻，蓝色的电弧在她头顶炸裂，将昏暗的荒原照得亮如白昼。她手动调整了变压器的输出功率，利用旧时代遗留的稳压技术，强行驯服了狂暴的电流。她的手套被高温烫得发黑，但她没有后退半步。当电流重新平稳地流过线缆时，她感觉到的不是恐惧，而是一种源自工业理性的震撼——电流在流动，意味着信息在流动，意味着文明在流动。</p><p>经过三天三夜的连续奋战，最后一根主电缆终于抵达了变电站的接口。</p><p>那个瞬间，是整段工程的高潮。所有的工程机甲都停止了轰鸣，所有的开拓者都屏住了呼吸。组长颤抖着双手，将插头对准了那深邃的接口。随着“咔哒”一声清脆的机械咬合声，仿佛命运的齿轮重新啮合。</p><p>线路接通了。</p><p>刹那间，灯光如多米诺骨牌般沿着塔架一层层亮起，原本漆黑的 扇区-09 瞬间被点亮。巨大的输电塔顶端的警示灯开始有节奏地闪烁，红色的光穿透了漫天的风沙，向远处的荒原宣告着人类的归来。电流顺着新铺设的线缆奔向远方的前哨站，那些沉寂的机器重新苏醒，滤净塔开始轰鸣，温暖的灯光驱散了室内的寒冷。</p><p>但这不仅仅是光明的降临。在变电站的屏幕上，一组组数据开始疯狂跳动。这是通信数据的潮汐，是佩丽卡协议的握手信号。通过这根物理上的电线，数字逻辑开始在网络中蔓延。分散在各地的服务器、数据库、自动防御系统，因为这一根根导线的连接，重新形成了一个统一的智能体。</p><p>组长瘫坐在碎石地上，摘下头盔，任由汗水流下。她看着远处的通明灯火，看着那些横跨天际的黑色线缆，它们在夜色中显得格外迷人。这就是终末地的浪漫——用钢铁和铜线，在绝望中编织希望。每一次接线，都是在对这片说“不”的世界说“是”。电流的嗡嗡声在耳边回响，听起来就像是这片大地重新恢复的心跳声。</p><p>在这片荒原上，没有谁是孤岛。只要电线还在连接，信号还在传输，文明的火种就不会熄灭。这便是技术开拓者的誓言，也是每一个在风沙中拉线的人，内心最深的骄傲。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;COnN3C7_0NE_8Y_OnE_wiTH1N_boM_th4t_15_EAsY_70_PerfoRM_8UT_l_PreF3r_u5In6_4_x1ranl7E_Re14Y_iNS7EAd&#125;</span><br></pre></td></tr></table></figure><h2 id="6-Forensics">6 Forensics</h2><h3 id="6-1-损坏的-Sysprep">6.1 损坏的 Sysprep</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>小李子从「LilRan 德厚门」网站上下载了一个 Windows 镜像想要重装系统，但他发现无人值守文件被删掉了，到底要怎么办口牙！</p></div><p>访问网页后得到了 <code>install.wim</code> 文件。这是 Windows 的标准映像文件，里面可能打包了多份映像。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br></pre></td><td class="code"><pre><span class="line">scc@Ubuntu:/data$ wiminfo install.wim</span><br><span class="line">WIM Information:</span><br><span class="line">----------------</span><br><span class="line">Path:           install.wim</span><br><span class="line">GUID:           0x4a14c8dcf7960a55db18143f8b82a91a</span><br><span class="line">Version:        68864</span><br><span class="line">Image Count:    2</span><br><span class="line">Compression:    LZX</span><br><span class="line">Chunk Size:     32768 bytes</span><br><span class="line">Part Number:    1/1</span><br><span class="line">Boot Index:     0</span><br><span class="line">Size:           1139056 bytes</span><br><span class="line">Attributes:     Relative path junction</span><br><span class="line"></span><br><span class="line">Available Images:</span><br><span class="line">-----------------</span><br><span class="line">Index:                  1</span><br><span class="line">Name:                   Windows 10 Pro</span><br><span class="line">Description:            Windows build 19045</span><br><span class="line">Directory Count:        6</span><br><span class="line">File Count:             1</span><br><span class="line">Total Bytes:            36</span><br><span class="line">Hard Link Bytes:        0</span><br><span class="line">Creation Time:          Mon Apr 27 02:12:05 2026 UTC</span><br><span class="line">Last Modification Time: Mon Apr 27 02:12:05 2026 UTC</span><br><span class="line">WIMBoot compatible:     no</span><br><span class="line"></span><br><span class="line">Index:                  2</span><br><span class="line">Name:                   Windows PE</span><br><span class="line">Description:            ES5S temporary recovery disk</span><br><span class="line">Directory Count:        1</span><br><span class="line">File Count:             1</span><br><span class="line">Total Bytes:            10485760</span><br><span class="line">Hard Link Bytes:        0</span><br><span class="line">Creation Time:          Mon Apr 27 02:12:05 2026 UTC</span><br><span class="line">Last Modification Time: Mon Apr 27 02:12:28 2026 UTC</span><br><span class="line">WIMBoot compatible:     no</span><br></pre></td></tr></table></figure><p>可以看到有 2 个映像。其中 <code>Windows 10 Pro</code> 只有 36 字节，是个空壳。把第二个 <code>Windows PE</code> 挂载下来：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">scc@Ubuntu:/data$ <span class="built_in">mkdir</span> mount</span><br><span class="line">scc@Ubuntu:/data$ wimextract install.wim 2 / --dest-dir mount</span><br><span class="line">Extracting file data: 10 MiB of 10 MiB (100%) <span class="keyword">done</span></span><br><span class="line">Done extracting files.</span><br><span class="line">scc@Ubuntu:/data$ <span class="built_in">ls</span> /data/mount</span><br><span class="line">windows_sysprep.img</span><br></pre></td></tr></table></figure><p>如果在 Windows 下查看，双击该文件会提示“光盘映像文件已损坏”。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">scc@Ubuntu:/data/mount$ file windows_sysprep.img</span><br><span class="line">windows_sysprep.img: DOS/MBR boot sector, code offset 0x58+2, OEM-ID <span class="string">&quot;mkfs.fat&quot;</span>, sectors 20480 (volumes &lt;=32 MB), Media descriptor 0xf8, sectors/track 32, FAT (32 bit), sectors/FAT 158, serial number 0x5f512357, unlabeled</span><br></pre></td></tr></table></figure><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;dEIe7inG_do3s_nO7_meaN_de1Et3d&#125;</span><br></pre></td></tr></table></figure><h2 id="7-PPC">7 PPC</h2><h3 id="7-3-日历・序章">7.3 日历・序章</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>小 T 在不断练习括号序列匹配问题。为了让练习更容易一些，小 T 在每天会根据日历执行一个简单的操作。这样的练习一直持续到 2026 年 12 月 31 日，然而小 T 盼望的 2027 年没有到来。相反，他回到了 2026 年 1 月 1 日。</p><p>小 T 瞬间意识到，自己进入了一个时间循环。他希望找到一个新的日历，使得即使在时间循环中也能正常完成练习。显然，小 T 不会规划每天需要执行的操作，因此他希望你能为他设计一个新的日历。</p><p>身处时间循环之外的你可以从附件中查看循环和操作的细节。</p></div><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;cONGrA7uI4tions_FOR_yOUr_FirSt_ca1eND4R_pRogr4M_k33p_0N_to_Th3_nex7_0N3&#125;</span><br></pre></td></tr></table></figure><div class="note success no-icon flat"><p><strong>官方题解</strong>：<a href="https://tiger2005.top/posts/w4terctf/2026">W4terCTF 2026 出题记录和题解</a></p></div><h2 id="9-OSINT">9 OSINT</h2><h3 id="9-1-Find-Me">9.1 Find Me</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>通常来说，在 OSINT 题里只要找到图中大致的位置就可以了。但是在 <code>W4terCTF</code> 的赛场上，似乎一切都需要更加精确才行 … ？</p><p><code>flag</code> 的内容：图中拍摄者所在地的经纬度，纬度在前经度在后，精确到小数点后七位。</p><p><code>flag</code> 样例：W4terCTF{12.3456789S,98.7654321E}</p><p><img src="/img/src/2026-05-03-10.png" alt=""></p></div><p>图片中带有 <code>Google</code> 水印，可以确定来源为谷歌街景地图。观察图片右侧的路牌提取关键信息：道路编号为 <code>N277</code> ，主路通往 <code>Zeeland</code> 和 <code>Uden</code> 两地，同时可见 <code>Wa</code> 与 <code>Wi</code> 开头的不完整地名标识。</p><p>打开 <a href="https://www.google.com/maps">谷歌地图</a>：搜索 <code>N277</code>，发现该道路位于荷兰，但无法具体定位。搜索 <code>Zeeland</code> 或 <code>Uden</code> 可以匹配到具体的城市。缩小地图发现下图所示的路口符合条件，同时确认了不完整字样为 <code>Wanroij</code> 和 <code>Wilbertoord</code> 这两处地点。</p><p><img src="/img/src/2026-05-03-11.png" alt=""></p><p>点击该路口，进入街景模式。反复尝试发现在该点位选择合适的角度可以完美匹配原图，读取网址上的经纬度。</p><p><img src="/img/src/2026-05-03-12.png" alt=""></p><p>按照指定格式构造 <code>flag</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;51.6329259N,5.7476876E&#125;</span><br></pre></td></tr></table></figure><h3 id="9-3-无论到哪都爱吃麦麦">9.3 无论到哪都爱吃麦麦</h3><div class="note info no-icon flat"><p><span class='p logo h4'><strong>题目描述</strong></span></p><p>Hachiwa0 在旅途中饥肠辘辘，走着走着竟然看到麦当劳！他毫不犹豫地点了麦麦大快朵颐，这是他吃过的最好吃的一顿麦当劳。许久之后，他翻到了这张照片，却不记得这到底是哪里了。请帮 Hachiwa0 找到这家麦当劳的电话号码和经纬度。</p><p><code>flag</code> 的内容：图中麦当劳的十位电话号码，图中 Hachiwa0 所在地的经纬度，纬度在前经度在后，精确到小数点后四位。</p><p><code>flag</code> 样例：W4terCTF{1145141919_88.8888N_88.8888E}</p><p><img src="/img/src/2026-05-03-13.png" alt=""></p></div><p>图的关键信息集中在左下角的餐车，但实在过于模糊无法辨认出与地点有关的信息。利用 <a href="https://images.google.com">谷歌识图</a> 找到了相似的店铺。</p><p><img src="/img/src/2026-05-03-14.png" alt=""></p><p>打开谷歌地图，搜索 <code>McDonald's Kokusaidori Makishi</code> 找到了店铺，并确定了店铺名称为 <code>国際通り牧志店</code>。</p><p><img src="/img/src/2026-05-03-15.png" alt=""></p><p>进入街景模式，走进左边的小路，匹配成功！读取网址上的经纬度，精确到小数点后四位。</p><p><img src="/img/src/2026-05-03-16.png" alt=""></p><p>下方给出了电话号码，但尝试过 <code>81988690719</code> 和 <code>988690719</code> 均不正确（不是十位）。</p><p><img src="/img/src/2026-05-03-17.png" alt=""></p><p>后来在 <a href="https://www.mcdonalds.co.jp">日本麦当劳官网</a> 上看到了符合要求的电话号码。</p><p><img src="/img/src/2026-05-03-18.png" alt=""></p><p>按照指定格式构造 <code>flag</code>。</p><figure class="highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">W4terCTF&#123;0988600719_26.2168N_127.6890E&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">W4terCTF 2026 WriteUp</summary>
    
    
    
    <category term="比赛题解" scheme="https://night-da.github.io/categories/%E6%AF%94%E8%B5%9B%E9%A2%98%E8%A7%A3/"/>
    
    
    <category term="CTF" scheme="https://night-da.github.io/tags/CTF/"/>
    
  </entry>
  
  <entry>
    <title>Markdown 与外挂标签</title>
    <link href="https://night-da.github.io/posts/2013454d.html/"/>
    <id>https://night-da.github.io/posts/2013454d.html/</id>
    <published>2026-03-27T16:00:00.000Z</published>
    <updated>2026-03-27T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-Markdown-语法">1. Markdown 语法</h2><h3 id="1-1-文字样式">1.1 文字样式</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">u</span>&gt;</span></span>下划线演示<span class="language-xml"><span class="tag">&lt;/<span class="name">u</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line">文字<span class="strong">**加粗**</span>演示</span><br><span class="line"></span><br><span class="line">文字<span class="emphasis">*斜体*</span>演示</span><br><span class="line"></span><br><span class="line">文本<span class="code">`高亮`</span>演示</span><br><span class="line"></span><br><span class="line">文本~~删除~~线演示</span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">font</span> <span class="attr">size</span> = <span class="string">5</span>&gt;</span></span>5号字<span class="language-xml"><span class="tag">&lt;/<span class="name">font</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">font</span> <span class="attr">face</span>=<span class="string">&quot;黑体&quot;</span>&gt;</span></span>黑体<span class="language-xml"><span class="tag">&lt;/<span class="name">font</span>&gt;</span></span></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">font</span> <span class="attr">color</span>=<span class="string">green</span>&gt;</span></span>绿色<span class="language-xml"><span class="tag">&lt;/<span class="name">font</span>&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="language-xml"><span class="tag">&lt;<span class="name">table</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">tr</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;<span class="name">td</span> <span class="attr">bgcolor</span>=<span class="string">MistyRose</span>&gt;</span></span>这里的背景色是：MistyRosen，此处输入任意想输入的内容<span class="language-xml"><span class="tag">&lt;/<span class="name">td</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">tr</span>&gt;</span></span><span class="language-xml"><span class="tag">&lt;/<span class="name">table</span>&gt;</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><p><u>下划线演示</u></p><p>文字<strong>加粗</strong>演示</p><p>文字<em>斜体</em>演示</p><p>文本<code>高亮</code>演示</p><p>文本<s>删除</s>线演示</p><p><font size = 5>5号字</font><br><font face="黑体">黑体</font><br><font color=green>绿色</font></p><table><tr><td bgcolor=MistyRose>这里的背景色是：MistyRosen，此处输入任意想输入的内容</td></tr></table><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-2-引用">1.2 引用</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">预览效果</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="quote">&gt; 北京大学</span></span><br><span class="line"><span class="quote">&gt;</span></span><br><span class="line"><span class="quote">&gt; 中山大学</span></span><br><span class="line"><span class="quote">&gt; &gt; 软件工程学院</span></span><br><span class="line"><span class="quote">&gt; &gt; 大气科学学院</span></span><br><span class="line"><span class="quote">&gt;</span></span><br><span class="line"><span class="quote">&gt; ...</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><blockquote><p>北京大学</p><p>中山大学</p><blockquote><p>软件工程学院<br>大气科学学院</p></blockquote><p>…</p></blockquote><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-3-列表">1.3 列表 (*, +, -)</h3><p>注意后面有空格。</p><h4 id="1-3-1-有序列表">1.3.1 有序列表</h4><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">1.</span> </span><br><span class="line"><span class="bullet">2.</span> </span><br><span class="line"><span class="bullet">3.</span> </span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li></li><li></li><li></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h4 id="1-3-2-无序列表">1.3.2 无序列表</h4><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">*</span> C++</span><br><span class="line"><span class="bullet">*</span> Python</span><br><span class="line"><span class="bullet">*</span> ...</span><br><span class="line"></span><br><span class="line"><span class="bullet">+</span> C++</span><br><span class="line"><span class="bullet">+</span> Python</span><br><span class="line"><span class="bullet">+</span> ...</span><br><span class="line"></span><br><span class="line"><span class="bullet">-</span> C++</span><br><span class="line"><span class="bullet">-</span> Python</span><br><span class="line"><span class="bullet">-</span> ...</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ul><li>C++</li><li>Python</li><li>…</li></ul><ul><li>C++</li><li>Python</li><li>…</li></ul><ul><li>C++</li><li>Python</li><li>…</li></ul><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-4-代码块">1.4 代码块</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">\<span class="code">```shell</span></span><br><span class="line"><span class="code"># VSCode 终端</span></span><br><span class="line"><span class="code">hexo g; hexo s</span></span><br><span class="line"><span class="code">git push</span></span><br><span class="line"><span class="code">\```</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">VSCode 终端</span></span><br><span class="line">hexo g; hexo s</span><br><span class="line">git push</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-5-分隔线">1.5 分隔线</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">---</span><br><span class="line"><span class="strong">**<span class="emphasis">*</span></span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><hr><hr><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-6-图片">1.6 图片</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">![<span class="string">yuanshen</span>](<span class="link">/img/src/2026-03-28-1.png</span>)</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><p><img src="/img/src/2026-03-28-1.png" alt="yuanshen"></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-7-表格">1.7 表格</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">| 项目标号 | 资金 | 备注 |</span><br><span class="line">| :-: | :-: | :-: |</span><br><span class="line">| 1 | 100,000 | 无 |</span><br><span class="line">| 2 | 200,000 | 无 |</span><br><span class="line">| 3 | 300,600 | 重要 |</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><table><thead><tr><th style="text-align:center">项目标号</th><th style="text-align:center">资金</th><th style="text-align:center">备注</th></tr></thead><tbody><tr><td style="text-align:center">1</td><td style="text-align:center">100,000</td><td style="text-align:center">无</td></tr><tr><td style="text-align:center">2</td><td style="text-align:center">200,000</td><td style="text-align:center">无</td></tr><tr><td style="text-align:center">3</td><td style="text-align:center">300,600</td><td style="text-align:center">重要</td></tr></tbody></table><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="1-8-公式">1.8 公式</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">预览效果</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">$$</span><br><span class="line">\Gamma(z)=\int<span class="emphasis">_&#123;0&#125;^&#123;\infty&#125;t^&#123;z-1&#125;e^&#123;-t&#125;\mathrm&#123;d&#125;t</span></span><br><span class="line"><span class="emphasis">$$</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><p>$$<br>\Gamma(z)=\int_{0}^{\infty}t^{z-1}e^{-t}\mathrm{d}t<br>$$</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h2 id="2-外挂标签">2. 外挂标签</h2><p><strong>注意：</strong> （此外挂非彼外挂，是插件的意思）该部分内容仅 <code>Hexo + Butterfly</code> 内可用；用于更高级的渲染效果。</p><h3 id="2-1-行内文本样式-text">2.1 行内文本样式 text</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-3">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;% u 文本内容 %&#125;</span><br><span class="line">&#123;% emp 文本内容 %&#125;</span><br><span class="line">&#123;% wavy 文本内容 %&#125;</span><br><span class="line">&#123;% del 文本内容 %&#125;</span><br><span class="line">&#123;% kbd 文本内容 %&#125;</span><br><span class="line">&#123;% psw 文本内容 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">1.</span> 带 &#123;% u 下划线 %&#125; 的文本</span><br><span class="line"><span class="bullet">2.</span> 带 &#123;% emp 着重号 %&#125; 的文本</span><br><span class="line"><span class="bullet">3.</span> 带 &#123;% wavy 波浪线 %&#125; 的文本</span><br><span class="line"><span class="bullet">4.</span> 带 &#123;% del 删除线 %&#125; 的文本</span><br><span class="line"><span class="bullet">5.</span> 键盘样式的文本：&#123;% kbd command %&#125; + &#123;% kbd D %&#125;</span><br><span class="line"><span class="bullet">6.</span> 密码样式的文本：&#123;% psw 这里没有验证码 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><ol><li>带 <u>下划线</u> 的文本</li><li>带 <emp>着重号</emp> 的文本</li><li>带 <wavy>波浪线</wavy> 的文本</li><li>带 <del>删除线</del> 的文本</li><li>键盘样式的文本：<kbd>command</kbd> + <kbd>D</kbd></li><li>密码样式的文本：<psw>这里没有验证码</psw></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-2-行内文本-span">2.2 行内文本 span</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% span 样式参数 (参数以空格划分), 文本内容 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>字体</code>: logo, code</li><li><code>颜色</code>: red, yellow, green, cyan, blue, gray</li><li><code>大小</code>: small, h4, h3, h2, h1, large, huge, ultra</li><li><code>对齐方向</code>: left, center, right</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> 彩色文字</span><br><span class="line">在一段话中方便插入各种颜色的标签，包括：&#123;% span red, 红色 %&#125;、&#123;% span yellow, 黄色 %&#125;、&#123;% span green, 绿色 %&#125;、&#123;% span cyan, 青色 %&#125;、&#123;% span blue, 蓝色 %&#125;、&#123;% span gray, 灰色 %&#125;。</span><br><span class="line"><span class="bullet">-</span> 超大号文字</span><br><span class="line">文档「开始」页面中的标题部分就是超大号文字。</span><br><span class="line">&#123;% span center logo large, Volantis %&#125;</span><br><span class="line">&#123;% span center small, A Wonderful Theme for Hexo %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><ul><li>彩色文字<br>在一段话中方便插入各种颜色的标签，包括：<span class='p red'>红色</span>、<span class='p yellow'>黄色</span>、<span class='p green'>绿色</span>、<span class='p cyan'>青色</span>、<span class='p blue'>蓝色</span>、<span class='p gray'>灰色</span>。</li><li>超大号文字<br>文档「开始」页面中的标题部分就是超大号文字。<br><span class='p center logo large'>Volantis</span><br><span class='p center small'>A Wonderful Theme for Hexo</span></li></ul><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-3-段落文本-p">2.3 段落文本 p</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% p 样式参数 (参数以空格划分), 文本内容 %&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>字体</code>: logo, code</li><li><code>颜色</code>: red, yellow, green, cyan, blue, gray</li><li><code>大小</code>: small, h4, h3, h2, h1, large, huge, ultra</li><li><code>对齐方向</code>: left, center, right</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="bullet">-</span> 彩色文字</span><br><span class="line">在一段话中方便插入各种颜色的标签，包括：&#123;% p red, 红色 %&#125; &#123;% p yellow, 黄色 %&#125; &#123;% p green, 绿色 %&#125; &#123;% p cyan, 青色 %&#125; &#123;% p blue, 蓝色 %&#125; &#123;% p gray, 灰色 %&#125;</span><br><span class="line"><span class="bullet">-</span> 超大号文字</span><br><span class="line">文档「开始」页面中的标题部分就是超大号文字。</span><br><span class="line">&#123;% p center logo large, Volantis %&#125;</span><br><span class="line">&#123;% p center small, A Wonderful Theme for Hexo %&#125;</span><br><span class="line"></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><ul><li>彩色文字<br>在一段话中方便插入各种颜色的标签，包括：<p class='p red'>红色</p> <p class='p yellow'>黄色</p> <p class='p green'>绿色</p> <p class='p cyan'>青色</p> <p class='p blue'>蓝色</p> <p class='p gray'>灰色</p></li><li>超大号文字<br>文档「开始」页面中的标题部分就是超大号文字。</li></ul><p class='p center logo large'>Volantis</p><p class='p center small'>A Wonderful Theme for Hexo</p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-4-引用-note">2.4 引用 note</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">通用配置</button></li><li class="tab"><button type="button" data-href="#分栏-2">语法格式</button></li><li class="tab"><button type="button" data-href="#分栏-3">参数配置</button></li><li class="tab"><button type="button" data-href="#分栏-4">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-5">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">note:</span><br><span class="line">  # Note tag style values:</span><br><span class="line">  #  - simple    bs-callout old alert style. Default.</span><br><span class="line">  #  - modern    bs-callout new (v2-v3) alert style.</span><br><span class="line">  #  - flat      flat callout style with background, like on Mozilla or StackOverflow.</span><br><span class="line">  #  - disabled  disable all CSS styles import of note tag.</span><br><span class="line">  style: simple</span><br><span class="line">  icons: false</span><br><span class="line">  border<span class="emphasis">_radius: 3</span></span><br><span class="line"><span class="emphasis">  # Offset lighter of background in % for modern and flat styles (modern: -12 | 12; flat: -18 | 6).</span></span><br><span class="line"><span class="emphasis">  # Offset also applied to label tag variables. This option can work with disabled note tag.</span></span><br><span class="line"><span class="emphasis">  light_</span>bg<span class="emphasis">_offset: 0</span></span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line"><span class="section"># 自带 icon</span></span><br><span class="line">&#123;% note [class] [no-icon] [style] %&#125;</span><br><span class="line">Any content (support inline tags too.io).</span><br><span class="line">&#123;% endnote %&#125;</span><br><span class="line"><span class="section"># 外部 icon</span></span><br><span class="line">&#123;% note [color] [icon] [style] %&#125;</span><br><span class="line">Any content (support inline tags too.io).</span><br><span class="line">&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><p><strong>1. 自带 icon</strong></p><table><thead><tr><th style="text-align:center">参数</th><th style="text-align:center">用法</th></tr></thead><tbody><tr><td style="text-align:center">class</td><td style="text-align:center">【可选】标识，不同的标识有不同的配色 (default, primary, success, info, warning, danger)</td></tr><tr><td style="text-align:center">no-icon</td><td style="text-align:center">【可选】不显示 icon</td></tr><tr><td style="text-align:center">style</td><td style="text-align:center">【可选】可以覆盖配置中的 style (simple, modern, flat, disabled)</td></tr></tbody></table><p><strong>2. 外部 icon</strong></p><table><thead><tr><th style="text-align:center">参数</th><th style="text-align:center">用法</th></tr></thead><tbody><tr><td style="text-align:center">class</td><td style="text-align:center">【可选】标识，不同的标识有不同的配色 (default, blue, pink, red, purple, orange, green)</td></tr><tr><td style="text-align:center">no-icon</td><td style="text-align:center">【可选】可配置自定义 icon (只支持 fontawesome 图标，也可以配置 no-icon)</td></tr><tr><td style="text-align:center">style</td><td style="text-align:center">【可选】可以覆盖配置中的 style (simple, modern, flat, disabled)</td></tr></tbody></table><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><details class="folding-tag" blue><summary> 1. 自带 icon </summary>              <div class='content'>              <p><strong>1. <code>simple</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note simple %&#125;默认 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note default simple %&#125;default 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note primary simple %&#125;primary 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note success simple %&#125;success 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note info simple %&#125;info 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note warning simple %&#125;warning 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note danger simple %&#125;danger 提示块标签&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>2. <code>modern</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note modern %&#125;默认 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note default modern %&#125;default 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note primary modern %&#125;primary 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note success modern %&#125;success 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note info modern %&#125;info 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note warning modern %&#125;warning 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note danger modern %&#125;danger 提示块标签&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>3. <code>flat</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note flat %&#125;默认 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note default flat %&#125;default 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note primary flat %&#125;primary 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note success flat %&#125;success 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note info flat %&#125;info 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note warning flat %&#125;warning 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note danger flat %&#125;danger 提示块标签&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>4. <code>disabled</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note disabled %&#125;默认 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note default disabled %&#125;default 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note primary disabled %&#125;primary 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note success disabled %&#125;success 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note info disabled %&#125;info 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note warning disabled %&#125;warning 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note danger disabled %&#125;danger 提示块标签&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>5. <code>no-icon</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note no-icon %&#125;默认 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note default no-icon %&#125;default 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note primary no-icon %&#125;primary 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note success no-icon %&#125;success 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note info no-icon %&#125;info 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note warning no-icon %&#125;warning 提示块标签&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note danger no-icon %&#125;danger 提示块标签&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure>              </div>            </details><details class="folding-tag" blue><summary> 2. 外部 icon </summary>              <div class='content'>              <p><strong>1. <code>simple</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note &#x27;fab fa-cc-visa&#x27; simple %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note blue &#x27;fas fa-bullhorn&#x27; simple %&#125;你要先去挖最低等级的秘银&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note pink &#x27;fas fa-car-crash&#x27; simple %&#125;小心开车 安全至上&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note red &#x27;fas fa-fan&#x27; simple%&#125;这是三片呢？还是四片？&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note orange &#x27;fas fa-battery-half&#x27; simple %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note green &#x27;fab fa-internet-explorer&#x27; simple %&#125;前端最讨厌的浏览器&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>2. <code>modern</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note &#x27;fab fa-cc-visa&#x27; modern %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note blue &#x27;fas fa-bullhorn&#x27; modern %&#125;你要先去挖最低等级的秘银&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note pink &#x27;fas fa-car-crash&#x27; modern %&#125;小心开车 安全至上&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note red &#x27;fas fa-fan&#x27; modern%&#125;这是三片呢？还是四片？&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note orange &#x27;fas fa-battery-half&#x27; modern %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note green &#x27;fab fa-internet-explorer&#x27; modern %&#125;前端最讨厌的浏览器&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>3. <code>flat</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note &#x27;fab fa-cc-visa&#x27; flat %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note blue &#x27;fas fa-bullhorn&#x27; flat %&#125;你要先去挖最低等级的秘银&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note pink &#x27;fas fa-car-crash&#x27; flat %&#125;小心开车 安全至上&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note red &#x27;fas fa-fan&#x27; flat%&#125;这是三片呢？还是四片？&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note orange &#x27;fas fa-battery-half&#x27; flat %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note green &#x27;fab fa-internet-explorer&#x27; flat %&#125;前端最讨厌的浏览器&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>4.<code>disabled</code>样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note &#x27;fab fa-cc-visa&#x27; disabled %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note blue &#x27;fas fa-bullhorn&#x27; disabled %&#125;你要先去挖最低等级的秘银&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note pink &#x27;fas fa-car-crash&#x27; disabled %&#125;小心开车 安全至上&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note red &#x27;fas fa-fan&#x27; disabled %&#125;这是三片呢？还是四片？&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note orange &#x27;fas fa-battery-half&#x27; disabled %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note green &#x27;fab fa-internet-explorer&#x27; disabled %&#125;前端最讨厌的浏览器&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure><p><strong>5. <code>no-icon</code> 样式</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">&#123;% note no-icon %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note blue no-icon %&#125;你要先去挖最低等级的秘银&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note pink no-icon %&#125;小心开车 安全至上&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note red no-icon %&#125;这是三片呢？还是四片？&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note orange no-icon %&#125;你是刷 Visa 还是 UnionPay&#123;% endnote %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% note green no-icon %&#125;前端最讨厌的浏览器&#123;% endnote %&#125;</span><br></pre></td></tr></table></figure>              </div>            </details><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-5"><details class="folding-tag" blue><summary> 1. 自带 icon </summary>              <div class='content'>              <p><strong>1.<code>simple</code> 样式</strong></p><div class="note simple"><p>默认 提示块标签</p></div><div class="note default simple"><p>default 提示块标签</p></div><div class="note primary simple"><p>primary 提示块标签</p></div><div class="note success simple"><p>success 提示块标签</p></div><div class="note info simple"><p>info 提示块标签</p></div><div class="note warning simple"><p>warning 提示块标签</p></div><div class="note danger simple"><p>danger 提示块标签</p></div><p><strong>2. <code>modern</code> 样式</strong></p><div class="note modern"><p>默认 提示块标签</p></div><div class="note default modern"><p>default 提示块标签</p></div><div class="note primary modern"><p>primary 提示块标签</p></div><div class="note success modern"><p>success 提示块标签</p></div><div class="note info modern"><p>info 提示块标签</p></div><div class="note warning modern"><p>warning 提示块标签</p></div><div class="note danger modern"><p>danger 提示块标签</p></div><p><strong>3. <code>flat</code> 样式</strong></p><div class="note flat"><p>默认 提示块标签</p></div><div class="note default flat"><p>default 提示块标签</p></div><div class="note primary flat"><p>primary 提示块标签</p></div><div class="note success flat"><p>success 提示块标签</p></div><div class="note info flat"><p>info 提示块标签</p></div><div class="note warning flat"><p>warning 提示块标签</p></div><div class="note danger flat"><p>danger 提示块标签</p></div><p><strong>4. <code>disabled</code> 样式</strong></p><div class="note disabled"><p>默认 提示块标签</p></div><div class="note default disabled"><p>default 提示块标签</p></div><div class="note primary disabled"><p>primary 提示块标签</p></div><div class="note success disabled"><p>success 提示块标签</p></div><div class="note info disabled"><p>info 提示块标签</p></div><div class="note warning disabled"><p>warning 提示块标签</p></div><div class="note danger disabled"><p>danger 提示块标签</p></div><p><strong>5. <code>no-icon</code> 样式</strong></p><div class="note no-icon flat"><p>默认 提示块标签</p></div><div class="note default no-icon flat"><p>default 提示块标签</p></div><div class="note primary no-icon flat"><p>primary 提示块标签</p></div><div class="note success no-icon flat"><p>success 提示块标签</p></div><div class="note info no-icon flat"><p>info 提示块标签</p></div><div class="note warning no-icon flat"><p>warning 提示块标签</p></div><div class="note danger no-icon flat"><p>danger 提示块标签</p></div>              </div>            </details><details class="folding-tag" blue><summary> 2. 外部 icon </summary>              <div class='content'>              <p><strong>1. <code>simple</code> 样式</strong></p><div class="note icon-padding simple"><i class="note-icon fab fa-cc-visa"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue icon-padding simple"><i class="note-icon fas fa-bullhorn"></i><p>你要先去挖最低等级的秘银</p></div><div class="note pink icon-padding simple"><i class="note-icon fas fa-car-crash"></i><p>小心开车 安全至上</p></div><div class="note red icon-padding simple"><i class="note-icon fas fa-fan"></i><p>这是三片呢？还是四片？</p></div><div class="note orange icon-padding simple"><i class="note-icon fas fa-battery-half"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note green icon-padding simple"><i class="note-icon fab fa-internet-explorer"></i><p>前端最讨厌的浏览器</p></div><p><strong>2. <code>modern</code> 样式</strong></p><div class="note icon-padding modern"><i class="note-icon fab fa-cc-visa"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue icon-padding modern"><i class="note-icon fas fa-bullhorn"></i><p>你要先去挖最低等级的秘银</p></div><div class="note pink icon-padding modern"><i class="note-icon fas fa-car-crash"></i><p>小心开车 安全至上</p></div><div class="note red icon-padding modern"><i class="note-icon fas fa-fan"></i><p>这是三片呢？还是四片？</p></div><div class="note orange icon-padding modern"><i class="note-icon fas fa-battery-half"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note green icon-padding modern"><i class="note-icon fab fa-internet-explorer"></i><p>前端最讨厌的浏览器</p></div><p><strong>3. <code>flat</code> 样式</strong></p><div class="note icon-padding flat"><i class="note-icon fab fa-cc-visa"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue icon-padding flat"><i class="note-icon fas fa-bullhorn"></i><p>你要先去挖最低等级的秘银</p></div><div class="note pink icon-padding flat"><i class="note-icon fas fa-car-crash"></i><p>小心开车 安全至上</p></div><div class="note red icon-padding flat"><i class="note-icon fas fa-fan"></i><p>这是三片呢？还是四片？</p></div><div class="note orange icon-padding flat"><i class="note-icon fas fa-battery-half"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note green icon-padding flat"><i class="note-icon fab fa-internet-explorer"></i><p>前端最讨厌的浏览器</p></div><p><strong>4. <code>disabled</code> 样式</strong></p><div class="note icon-padding disabled"><i class="note-icon fab fa-cc-visa"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue icon-padding disabled"><i class="note-icon fas fa-bullhorn"></i><p>你要先去挖最低等级的秘银</p></div><div class="note pink icon-padding disabled"><i class="note-icon fas fa-car-crash"></i><p>小心开车 安全至上</p></div><div class="note red icon-padding disabled"><i class="note-icon fas fa-fan"></i><p>这是三片呢？还是四片？</p></div><div class="note orange icon-padding disabled"><i class="note-icon fas fa-battery-half"></i><p>你是刷 Visa 还是 UnionPay</p></div><div class="note green icon-padding disabled"><i class="note-icon fab fa-internet-explorer"></i><p>前端最讨厌的浏览器</p></div><p><strong>5. <code>no-icon</code> 样式</strong></p><div class="note no-icon flat"><p>你是刷 Visa 还是 UnionPay</p></div><div class="note blue no-icon flat"><p>你要先去挖最低等级的秘银</p></div><div class="note pink no-icon flat"><p>小心开车 安全至上</p></div><div class="note red no-icon flat"><p>这是三片呢？还是四片？</p></div><div class="note orange no-icon flat"><p>你是刷 Visa 还是 UnionPay</p></div><div class="note green no-icon flat"><p>前端最讨厌的浏览器</p></div>              </div>            </details><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-5-上标标签-tip">2.5 上标标签 tip</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip [参数，可选] %&#125;文本内容&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>样式</code>: success, error, warning, bolt, ban, home, sync, cogs, key, bell</li><li><code>自定义图标</code>: 支持 fontawesome</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip %&#125;default&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip info %&#125;info&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip success %&#125;success&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip error %&#125;error&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip warning %&#125;warning&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip bolt %&#125;bolt&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip ban %&#125;ban&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip home %&#125;home&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip sync %&#125;sync&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip cogs %&#125;cogs&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip key %&#125;key&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip bell %&#125;bell&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip fa-atom %&#125;自定义 font awesome 图标&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><div class="tip "><p>default</p></div><div class="tip info"><p>info</p></div><div class="tip success"><p>success</p></div><div class="tip error"><p>error</p></div><div class="tip warning"><p>warning</p></div><div class="tip bolt"><p>bolt</p></div><div class="tip ban"><p>ban</p></div><div class="tip home"><p>home</p></div><div class="tip sync"><p>sync</p></div><div class="tip cogs"><p>cogs</p></div><div class="tip key"><p>key</p></div><div class="tip bell"><p>bell</p></div><div class="tip fa-atom"><p>自定义 font awesome 图标</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-6-动态标签-anima">2.6 动态标签 anima</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip [参数，可选] %&#125;文本内容&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><div class="note info no-icon flat"><ol><li>将所需的 CSS 类添加到图标（或 DOM 中的任何元素）。</li><li>对于父级悬停样式，需要给目标元素添加指定 CSS 类，同时还要给目标元素的父级元素添加 CSS 类 <code>faa-parent animated-hover</code>。（详情见示例及示例源码）<br>You can regulate the speed of the animation by adding the CSS class or . faa-fastfaa-slow</li><li>可以通过给目标元素添加 CSS 类 <code>faa-fast</code> 或 <code>faa-slow</code> 来控制动画快慢。</li></ol></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><p><strong>1. On DOM load（当页面加载时显示动画）</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip warning faa-horizontal animated %&#125;warning&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip ban faa-flash animated %&#125;ban&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><p><strong>2. 调整动画速度</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip warning faa-horizontal animated faa-fast %&#125;warning&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip ban faa-flash animated faa-slow %&#125;ban&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><p><strong>3. On hover（当鼠标悬停时显示动画）</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip warning faa-horizontal animated-hover %&#125;warning&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip ban faa-flash animated-hover %&#125;ban&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><p><strong>4. On parent hover（当鼠标悬停在父级元素时显示动画）</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tip warning faa-parent animated-hover %&#125;<span class="language-xml"><span class="tag">&lt;<span class="name">p</span> <span class="attr">class</span>=<span class="string">&quot;faa-horizontal&quot;</span>&gt;</span></span>warning<span class="language-xml"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span>&#123;% endtip %&#125;</span><br><span class="line">&#123;% tip ban faa-parent animated-hover %&#125;<span class="language-xml"><span class="tag">&lt;<span class="name">p</span> <span class="attr">class</span>=<span class="string">&quot;faa-flash&quot;</span>&gt;</span></span>ban<span class="language-xml"><span class="tag">&lt;/<span class="name">p</span>&gt;</span></span>&#123;% endtip %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><p><strong>1. On DOM load（当页面加载时显示动画）</strong></p><div class="tip warning faa-horizontal animated"><p>warning</p></div><div class="tip ban faa-flash animated"><p>ban</p></div><p><strong>2. 调整动画速度</strong></p><div class="tip warning faa-horizontal animated faa-fast"><p>warning</p></div><div class="tip ban faa-flash animated faa-slow"><p>ban</p></div><p><strong>3. On hover（当鼠标悬停时显示动画）</strong></p><div class="tip warning faa-horizontal animated-hover"><p>warning</p></div><div class="tip ban faa-flash animated-hover"><p>ban</p></div><p><strong>4. On parent hover（当鼠标悬停在父级元素时显示动画）</strong></p><div class="tip warning faa-parent animated-hover"><p class="faa-horizontal">warning</p></div><div class="tip ban faa-parent animated-hover"><p class="faa-flash">ban</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-7-复选列表-checkbox">2.7 复选列表 checkbox</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% checkbox 样式参数（可选）, 文本（支持简单md） %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>样式</code>：plus, minus, times</li><li><code>颜色</code>：red, yellow, green, cyan, blue, gray</li><li><code>选中状态</code>：checked</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">&#123;% checkbox 纯文本测试 %&#125;</span><br><span class="line">&#123;% checkbox checked, 支持简单的 [<span class="string">markdown</span>](<span class="link">https://markdown.com.cn</span>) 语法 %&#125;</span><br><span class="line">&#123;% checkbox red, 支持自定义颜色 %&#125;</span><br><span class="line">&#123;% checkbox green checked, 绿色 + 默认选中 %&#125;</span><br><span class="line">&#123;% checkbox yellow checked, 黄色 + 默认选中 %&#125;</span><br><span class="line">&#123;% checkbox cyan checked, 青色 + 默认选中 %&#125;</span><br><span class="line">&#123;% checkbox blue checked, 蓝色 + 默认选中 %&#125;</span><br><span class="line">&#123;% checkbox plus green checked, 增加 %&#125;</span><br><span class="line">&#123;% checkbox minus yellow checked, 减少 %&#125;</span><br><span class="line">&#123;% checkbox times red checked, 叉 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><div class='checkbox'><input type="checkbox" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="checkbox" checked="checked"/>            <p>支持简单的 <a href="https://markdown.com.cn">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="checkbox" />            <p>支持自定义颜色</p>            </div><div class='checkbox green checked'><input type="checkbox" checked="checked"/>            <p>绿色 + 默认选中</p>            </div><div class='checkbox yellow checked'><input type="checkbox" checked="checked"/>            <p>黄色 + 默认选中</p>            </div><div class='checkbox cyan checked'><input type="checkbox" checked="checked"/>            <p>青色 + 默认选中</p>            </div><div class='checkbox blue checked'><input type="checkbox" checked="checked"/>            <p>蓝色 + 默认选中</p>            </div><div class='checkbox plus green checked'><input type="checkbox" checked="checked"/>            <p>增加</p>            </div><div class='checkbox minus yellow checked'><input type="checkbox" checked="checked"/>            <p>减少</p>            </div><div class='checkbox times red checked'><input type="checkbox" checked="checked"/>            <p>叉</p>            </div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-8-单选列表-radio">2.8 单选列表 radio</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% radio 样式参数（可选）, 文本（支持简单 md） %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>颜色</code>：red, yellow, green, cyan, blue, gray</li><li><code>选中状态</code>：checked</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&#123;% radio 纯文本测试 %&#125;</span><br><span class="line">&#123;% radio checked, 支持简单的 [<span class="string">markdown</span>](<span class="link">https://markdown.com.cn</span>) 语法 %&#125;</span><br><span class="line">&#123;% radio red, 支持自定义颜色 %&#125;</span><br><span class="line">&#123;% radio green, 绿色 %&#125;</span><br><span class="line">&#123;% radio yellow, 黄色 %&#125;</span><br><span class="line">&#123;% radio cyan, 青色 %&#125;</span><br><span class="line">&#123;% radio blue, 蓝色 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><div class='checkbox'><input type="radio" />            <p>纯文本测试</p>            </div><div class='checkbox checked'><input type="radio" checked="checked"/>            <p>支持简单的 <a href="https://markdown.com.cn">markdown</a> 语法</p>            </div><div class='checkbox red'><input type="radio" />            <p>支持自定义颜色</p>            </div><div class='checkbox green'><input type="radio" />            <p>绿色</p>            </div><div class='checkbox yellow'><input type="radio" />            <p>黄色</p>            </div><div class='checkbox cyan'><input type="radio" />            <p>青色</p>            </div><div class='checkbox blue'><input type="radio" />            <p>蓝色</p>            </div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-9-时间轴-timeline">2.9 时间轴 timeline</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">&#123;% timeline 时间线标题（可选）[,color] %&#125;</span><br><span class="line">&lt;!-- timeline 时间节点（标题） --&gt;</span><br><span class="line">正文内容</span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line">&lt;!-- timeline 时间节点（标题） --&gt;</span><br><span class="line">正文内容</span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line">&#123;% endtimeline %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>title</code>：标题 / 时间线</li><li><code>color</code>：<code>timeline</code> 颜色：default(留空) / blue / pink / red / purple / orange / green</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line">&#123;% timeline 时间轴样式, blue %&#125;</span><br><span class="line"></span><br><span class="line">&lt;!-- timeline 2020-07-24 [<span class="string">2.6.6 -&gt; 3.0.0</span>](<span class="link">https://github.com/volantis-x/hexo-theme-volantis/releases/tag/3.0.0</span>) --&gt;</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> 如果有 <span class="code">`hexo-lazyload-image`</span> 插件，需要删除并重新安装最新版本，设置 <span class="code">`lazyload.isSPA: true`</span>。</span><br><span class="line"><span class="bullet">2.</span> 2.x 版本的 css 和 js 不适用于 3.x 版本，如果使用了 <span class="code">`use_cdn: true`</span> 则需要删除。</span><br><span class="line"><span class="bullet">3.</span> 2.x 版本的 fancybox 标签在 3.x 版本中被重命名为 gallery 。</span><br><span class="line"><span class="bullet">4.</span> 2.x 版本的置顶 <span class="code">`top: true`</span> 改为了 <span class="code">`pin: true`</span>，并且同样适用于 <span class="code">`layout: page`</span> 的页面。</span><br><span class="line"><span class="bullet">5.</span> 如果使用了 <span class="code">`hexo-offline`</span> 插件，建议卸载，3.0 版本默认开启了 pjax 服务。</span><br><span class="line"></span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- timeline 2020-05-15 [<span class="string">2.6.3 -&gt; 2.6.6</span>](<span class="link">https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.6</span>) --&gt;</span><br><span class="line"></span><br><span class="line">不需要额外处理。</span><br><span class="line"></span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- timeline 2020-04-20 [<span class="string">2.6.2 -&gt; 2.6.3</span>](<span class="link">https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.3</span>) --&gt;</span><br><span class="line"></span><br><span class="line"><span class="bullet">1.</span> 全局搜索 <span class="code">`seotitle`</span> 并替换为 <span class="code">`seo_title`</span>。</span><br><span class="line"><span class="bullet">2.</span> group 组件的索引规则有变，使用 group 组件的文章内，<span class="code">`group: group_name`</span> 对应的组件名必须是 <span class="code">`group_name`</span>。</span><br><span class="line"><span class="bullet">2.</span> group 组件的列表名优先显示文章的 <span class="code">`short_title`</span> 其次是 <span class="code">`title`</span>。</span><br><span class="line"></span><br><span class="line">&lt;!-- endtimeline --&gt;</span><br><span class="line"></span><br><span class="line">&#123;% endtimeline %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><div class="timeline  blue"><div class='timeline-item headline'><div class='timeline-item-title'><div class='item-circle'><p>时间轴样式</p></div></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-07-24 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/3.0.0">2.6.6 -&gt; 3.0.0</a></p></div></div><div class='timeline-item-content'><ol><li>如果有 <code>hexo-lazyload-image</code> 插件，需要删除并重新安装最新版本，设置 <code>lazyload.isSPA: true</code>。</li><li>2.x 版本的 css 和 js 不适用于 3.x 版本，如果使用了 <code>use_cdn: true</code> 则需要删除。</li><li>2.x 版本的 fancybox 标签在 3.x 版本中被重命名为 gallery 。</li><li>2.x 版本的置顶 <code>top: true</code> 改为了 <code>pin: true</code>，并且同样适用于 <code>layout: page</code> 的页面。</li><li>如果使用了 <code>hexo-offline</code> 插件，建议卸载，3.0 版本默认开启了 pjax 服务。</li></ol></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-05-15 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.6">2.6.3 -&gt; 2.6.6</a></p></div></div><div class='timeline-item-content'><p>不需要额外处理。</p></div></div><div class='timeline-item'><div class='timeline-item-title'><div class='item-circle'><p>2020-04-20 <a href="https://github.com/volantis-x/hexo-theme-volantis/releases/tag/2.6.3">2.6.2 -&gt; 2.6.3</a></p></div></div><div class='timeline-item-content'><ol><li>全局搜索 <code>seotitle</code> 并替换为 <code>seo_title</code>。</li><li>group 组件的索引规则有变，使用 group 组件的文章内，<code>group: group_name</code> 对应的组件名必须是 <code>group_name</code>。</li><li>group 组件的列表名优先显示文章的 <code>short_title</code> 其次是 <code>title</code>。</li></ol></div></div></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-10-github-徽标-ghbdage">2.10 github 徽标 ghbdage</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% bdage [right], [left], [logo] || [color], [link], [title] || [option] %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>left</code>：徽标左边的信息，必选参数。</li><li><code>right</code>: 徽标右边的信息，必选参数，</li><li><code>logo</code>：徽标图标，图标名称详见 <a href="https://simpleicons.org">simpleicons</a>，可选参数。</li><li><code>color</code>：徽标右边的颜色，可选参数。</li><li><code>link</code>：指向的链接，可选参数。</li><li><code>title</code>：徽标的额外信息，可选参数。主要用于优化 SEO，但 <code>object</code> 标签不会像 <code>a</code> 标签一样在鼠标悬停显示 <code>title</code> 信息。</li><li><code>option</code>：自定义参数，支持 <a href="https://shields.io">shields.io</a> 的全部 API 参数支持，具体参数可以参看上文中的拓展写法示例。形式为 <code>name1=value2&amp;name2=value2</code>。</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><p><strong>1. 基本参数，定义徽标左右文字和图标</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">&#123;% bdage Theme, Butterfly %&#125;</span><br><span class="line">&#123;% bdage Frame, Hexo, hexo %&#125;</span><br></pre></td></tr></table></figure><p><strong>2. 信息参数，定义徽标右侧内容背景色，指向链接</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% bdage CDN, JsDelivr, jsDelivr || abcdef, https://metroui.org.ua/index.html, 本站使用JsDelivr 为静态资源提供 CDN 加速 %&#125;</span><br><span class="line">// 如果是跨顺序省略可选参数，仍然需要写个逗号，用作分割</span><br><span class="line">&#123;% bdage Source, GitHub, GitHub ||, https://github.com %&#125;</span><br></pre></td></tr></table></figure><p><strong>3. 拓展参数，支持 shields 的 API 的全部参数内容</strong></p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&#123;% bdage Hosted, Vercel, Vercel || brightgreen, https://vercel.com, 本站采用双线部署，默认线路托管于 Vercel || style=social&amp;logoWidth=20 %&#125;</span><br><span class="line">// 如果是跨顺序省略可选参数组，仍然需要写双竖线 || 用作分割</span><br><span class="line">&#123;% bdage Hosted, Vercel, Vercel || || style=social&amp;logoWidth=20&amp;logoColor=violet %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><p><strong>1. 基本参数，定义徽标左右文字和图标</strong></p><p><object class="ghbdage" style="margin-inline:5px" title="" standby="loading..." data="https://img.shields.io/badge/Butterfly-Theme-orange?logo=&color=orange&link=&"></object><br><object class="ghbdage" style="margin-inline:5px" title="" standby="loading..." data="https://img.shields.io/badge/Hexo-Frame-orange?logo=hexo&color=orange&link=&"></object></p><p><strong>2. 信息参数，定义徽标右侧内容背景色，指向链接</strong></p><p><object class="ghbdage" style="margin-inline:5px" title="本站使用 JsDelivr 为静态资源提供 CDN 加速" standby="loading..." data="https://img.shields.io/badge/JsDelivr-CDN-orange?logo=jsDelivr&color=abcdef&link=https://metroui.org.ua/index.html&"></object><br><object class="ghbdage" style="margin-inline:5px" title="" standby="loading..." data="https://img.shields.io/badge/GitHub-Source-orange?logo=GitHub&color=orange&link=https://github.com&"></object></p><p><strong>3. 拓展参数，支持 shields 的 API 的全部参数内容</strong></p><p><object class="ghbdage" style="margin-inline:5px" title="本站采用双线部署，默认线路托管于 Vercel" standby="loading..." data="https://img.shields.io/badge/Vercel-Hosted-orange?logo=Vercel&color=brightgreen&link=https://vercel.com&style=social&logoWidth=20"></object><br><object class="ghbdage" style="margin-inline:5px" title="" standby="loading..." data="https://img.shields.io/badge/Vercel-Hosted-orange?logo=Vercel&color=&link=&style=social&logoWidth=20&logoColor=violet"></object></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-11-分栏-tab">2.11 分栏 tab</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">配置参数</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs Unique name, [index] %&#125;</span><br><span class="line">&lt;!-- tab [Tab caption] [@icon] --&gt;</span><br><span class="line">Any content (support inline tags too).</span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><p>Unique name:</p><ul><li>选项卡块标签的唯一名称，不带逗号。</li><li>将在 #id 中用作每个标签及其索引号的前缀。</li><li>如果名称中包含空格，则对于生成 #id，所有空格将由破折号代替。</li><li>仅当前帖子/页面的 URL 必须是唯一的！</li></ul></li><li><p>[index]:</p><ul><li>活动选项卡的索引号。</li><li>如果未指定，将选择第一个标签 (1)。</li><li>如果index为 -1，则不会选择任何选项卡。</li><li>可选参数。</li></ul></li><li><p>[Tab caption]:</p><ul><li>当前选项卡的标题。</li><li>如果未指定标题，则带有制表符索引后缀的唯一名称将用作制表符的标题。</li><li>如果未指定标题，但指定了图标，则标题将为空。</li><li>可选参数。</li></ul></li><li><p>[@icon]:</p><ul><li>FontAwesome 图标名称（全名，看起来像 “fas fa-font”）</li><li>可以指定带空格或不带空格；</li><li>例如 ’Tab caption @icon’ 和 ‘Tab caption@icon’.</li><li>可选参数。</li></ul></li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><p>1.Demo 1 - 预设选择第一个【默认】</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs test1 %&#125;</span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 1.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 2.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 3.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><p>2.Demo 2 - 预设选择 tabs</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs test2, 3 %&#125;</span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 1.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 2.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 3.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><p>3.Demo 3 - 没有预设值</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs test3, -1 %&#125;</span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 1.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 2.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab --&gt;</span><br><span class="line"><span class="strong">**This is Tab 3.**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><p>4.Demo 4 - 自定义 Tab 名 + icon 和 Tab 名</p><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">&#123;% tabs test4 %&#125;</span><br><span class="line">&lt;!-- tab 第一个 Tab --&gt;</span><br><span class="line"><span class="strong">**tab 名字为第一个 Tab**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line"></span><br><span class="line">&lt;!-- tab 炸弹@fas fa-bomb --&gt;</span><br><span class="line"><span class="strong">**名字 + icon**</span></span><br><span class="line">&lt;!-- endtab --&gt;</span><br><span class="line">&#123;% endtabs %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><p>1.Demo 1 - 预设选择第一个【默认】</p><div class="tabs" id="test1"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#test1-1">test1 1</button></li><li class="tab"><button type="button" data-href="#test1-2">test1 2</button></li><li class="tab"><button type="button" data-href="#test1-3">test1 3</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="test1-1"><p><strong>This is Tab 1.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test1-2"><p><strong>This is Tab 2.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test1-3"><p><strong>This is Tab 3.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><p>2.Demo 2 - 预设选择 tabs</p><div class="tabs" id="test2"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#test2-1">test2 1</button></li><li class="tab"><button type="button" data-href="#test2-2">test2 2</button></li><li class="tab active"><button type="button" data-href="#test2-3">test2 3</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="test2-1"><p><strong>This is Tab 1.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test2-2"><p><strong>This is Tab 2.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content active" id="test2-3"><p><strong>This is Tab 3.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><p>3.Demo 3 - 没有预设值</p><div class="tabs" id="test3"><ul class="nav-tabs"><li class="tab"><button type="button" data-href="#test3-1">test3 1</button></li><li class="tab"><button type="button" data-href="#test3-2">test3 2</button></li><li class="tab"><button type="button" data-href="#test3-3">test3 3</button></li></ul><div class="tab-contents"><div class="tab-item-content" id="test3-1"><p><strong>This is Tab 1.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test3-2"><p><strong>This is Tab 2.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test3-3"><p><strong>This is Tab 3.</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><p>4.Demo 4 - 自定义 Tab 名 + icon 和 Tab 名</p><div class="tabs" id="test4"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#test4-1">第一个 Tab</button></li><li class="tab"><button type="button" data-href="#test4-2"><i class="fas fa-bomb"></i>炸弹</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="test4-1"><p><strong>tab 名字为第一个 Tab</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="test4-2"><p><strong>名字 + icon</strong></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-12-诗词标签-poem">2.12 诗词标签 poem</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">参数配置</button></li><li class="tab"><button type="button" data-href="#分栏-2">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-3">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><ol><li><code>title</code>：诗词标题</li><li><code>author</code>：作者，可以不写</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">&#123;% poem 水调歌头, 苏轼 %&#125;</span><br><span class="line">丙辰中秋，欢饮达旦，大醉，作此篇，兼怀子由。</span><br><span class="line">明月几时有？把酒问青天。</span><br><span class="line">不知天上宫阙，今夕是何年？</span><br><span class="line">我欲乘风归去，又恐琼楼玉宇，高处不胜寒。</span><br><span class="line">起舞弄清影，何似在人间？</span><br><span class="line"></span><br><span class="line">转朱阁，低绮户，照无眠。</span><br><span class="line">不应有恨，何事长向别时圆？</span><br><span class="line">人有悲欢离合，月有阴晴圆缺，此事古难全。</span><br><span class="line">但愿人长久，千里共婵娟。</span><br><span class="line">&#123;% endpoem %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><div class='poem'><div class='poem-title'>水调歌头</div><div class='poem-author'> 苏轼</div><p>丙辰中秋，欢饮达旦，大醉，作此篇，兼怀子由。<br>明月几时有？把酒问青天。<br>不知天上宫阙，今夕是何年？<br>我欲乘风归去，又恐琼楼玉宇，高处不胜寒。<br>起舞弄清影，何似在人间？</p><p>转朱阁，低绮户，照无眠。<br>不应有恨，何事长向别时圆？<br>人有悲欢离合，月有阴晴圆缺，此事古难全。<br>但愿人长久，千里共婵娟。</p></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-13-阿里图标-icon">2.13 阿里图标 icon</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-2">参数配置</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% icon [icon-xxxx], [font-size] %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>icon-xxxx</code>：表示图标 <code>font-class</code>，可以在阿里矢量图标库项目的 <code>font-class</code> 引用方案内查询并复制。</li><li><code>font-size</code>：表示图标大小，单位为 <code>em</code>（直接填写数字）。图标大小默认值为 <code>1em</code>。</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">&#123;% icon icon-rat<span class="emphasis">_zi %&#125;&#123;% icon icon-rat, 2 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-ox_</span>chou, 3 %&#125;&#123;% icon icon-ox, 4 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% icon icon-tiger<span class="emphasis">_yin, 5 %&#125;&#123;% icon icon-tiger, 6 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-rabbit_</span>mao, 1 %&#125;&#123;% icon icon-rabbit, 2 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% icon icon-dragon<span class="emphasis">_chen, 3 %&#125;&#123;% icon icon-dragon, 4 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-snake_</span>si, 5 %&#125;&#123;% icon icon-snake, 6 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% icon icon-horse<span class="emphasis">_wu %&#125;&#123;% icon icon-horse, 2 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-goat_</span>wei, 3 %&#125;&#123;% icon icon-goat, 4 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% icon icon-monkey<span class="emphasis">_shen, 5 %&#125;&#123;% icon icon-monkey, 6 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-rooster_</span>you %&#125;&#123;% icon icon-rooster, 2 %&#125;</span><br><span class="line"></span><br><span class="line">&#123;% icon icon-dog<span class="emphasis">_xu, 3 %&#125;&#123;% icon icon-dog, 4 %&#125;</span></span><br><span class="line"><span class="emphasis"></span></span><br><span class="line"><span class="emphasis">&#123;% icon icon-boar_</span>hai, 5 %&#125;&#123;% icon icon-boar, 6 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><p><svg class="icon" style="width:1em; height:1em" aria-hidden="true"><use xlink:href="#icon-rat_zi"></use></svg><svg class="icon" style="width: 2em; height: 2em" aria-hidden="true"><use xlink:href="#icon-rat"></use></svg></p><p><svg class="icon" style="width: 3em; height: 3em" aria-hidden="true"><use xlink:href="#icon-ox_chou"></use></svg><svg class="icon" style="width: 4em; height: 4em" aria-hidden="true"><use xlink:href="#icon-ox"></use></svg></p><p><svg class="icon" style="width: 5em; height: 5em" aria-hidden="true"><use xlink:href="#icon-tiger_yin"></use></svg><svg class="icon" style="width: 6em; height: 6em" aria-hidden="true"><use xlink:href="#icon-tiger"></use></svg></p><p><svg class="icon" style="width: 1em; height: 1em" aria-hidden="true"><use xlink:href="#icon-rabbit_mao"></use></svg><svg class="icon" style="width: 2em; height: 2em" aria-hidden="true"><use xlink:href="#icon-rabbit"></use></svg></p><p><svg class="icon" style="width: 3em; height: 3em" aria-hidden="true"><use xlink:href="#icon-dragon_chen"></use></svg><svg class="icon" style="width: 4em; height: 4em" aria-hidden="true"><use xlink:href="#icon-dragon"></use></svg></p><p><svg class="icon" style="width: 5em; height: 5em" aria-hidden="true"><use xlink:href="#icon-snake_si"></use></svg><svg class="icon" style="width: 6em; height: 6em" aria-hidden="true"><use xlink:href="#icon-snake"></use></svg></p><p><svg class="icon" style="width:1em; height:1em" aria-hidden="true"><use xlink:href="#icon-horse_wu"></use></svg><svg class="icon" style="width: 2em; height: 2em" aria-hidden="true"><use xlink:href="#icon-horse"></use></svg></p><p><svg class="icon" style="width: 3em; height: 3em" aria-hidden="true"><use xlink:href="#icon-goat_wei"></use></svg><svg class="icon" style="width: 4em; height: 4em" aria-hidden="true"><use xlink:href="#icon-goat"></use></svg></p><p><svg class="icon" style="width: 5em; height: 5em" aria-hidden="true"><use xlink:href="#icon-monkey_shen"></use></svg><svg class="icon" style="width: 6em; height: 6em" aria-hidden="true"><use xlink:href="#icon-monkey"></use></svg></p><p><svg class="icon" style="width:1em; height:1em" aria-hidden="true"><use xlink:href="#icon-rooster_you"></use></svg><svg class="icon" style="width: 2em; height: 2em" aria-hidden="true"><use xlink:href="#icon-rooster"></use></svg></p><p><svg class="icon" style="width: 3em; height: 3em" aria-hidden="true"><use xlink:href="#icon-dog_xu"></use></svg><svg class="icon" style="width: 4em; height: 4em" aria-hidden="true"><use xlink:href="#icon-dog"></use></svg></p><p><svg class="icon" style="width: 5em; height: 5em" aria-hidden="true"><use xlink:href="#icon-boar_hai"></use></svg><svg class="icon" style="width: 6em; height: 6em" aria-hidden="true"><use xlink:href="#icon-boar"></use></svg></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div><h3 id="2-14-进度条-progress">2.14 进度条 progress</h3><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">参数配置</button></li><li class="tab"><button type="button" data-href="#分栏-2">标签语法</button></li><li class="tab"><button type="button" data-href="#分栏-3">示例源码</button></li><li class="tab"><button type="button" data-href="#分栏-4">渲染演示</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">&#123;% progress [width] [color] [text] %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><ol><li><code>width</code>：0 到 100 的阿拉伯数字</li><li><code>color</code>：颜色，取值有red, yellow, green, cyan, blue, gray</li><li><code>text</code>：进度条上的文字内容</li></ol><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><figure class="highlight markdown"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&#123;% progress 10 red 进度条样式预览 %&#125;</span><br><span class="line">&#123;% progress 30 yellow 进度条样式预览 %&#125;</span><br><span class="line">&#123;% progress 50 green 进度条样式预览 %&#125;</span><br><span class="line">&#123;% progress 70 cyan 进度条样式预览 %&#125;</span><br><span class="line">&#123;% progress 90 blue 进度条样式预览 %&#125;</span><br><span class="line">&#123;% progress 100 gray 进度条样式预览 %&#125;</span><br></pre></td></tr></table></figure><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-red"  style="width: 10%" aria-valuenow="10" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-yellow"  style="width: 30%" aria-valuenow="30" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-green"  style="width: 50%" aria-valuenow="50" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-cyan"  style="width: 70%" aria-valuenow="70" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-blue"  style="width: 90%" aria-valuenow="90" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><div class="progress"><div class="progress-bar-animated progress-bar progress-bar-striped bg-gray"  style="width: 100%" aria-valuenow="100" aria-valuemin="0" aria-valuemax="100"><p>进度条样式预览</p></div></div><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div>]]></content>
    
    
    <summary type="html">🥧 Markdown 常用语法与 Butterfly 外挂标签的用法示例，便于写作时对照查阅。</summary>
    
    
    
    <category term="网站教程" scheme="https://night-da.github.io/categories/%E7%BD%91%E7%AB%99%E6%95%99%E7%A8%8B/"/>
    
    
    <category term="演示" scheme="https://night-da.github.io/tags/%E6%BC%94%E7%A4%BA/"/>
    
  </entry>
  
  <entry>
    <title>从零开始编译 WRF</title>
    <link href="https://night-da.github.io/posts/cbb20bac.html/"/>
    <id>https://night-da.github.io/posts/cbb20bac.html/</id>
    <published>2026-03-05T16:00:00.000Z</published>
    <updated>2026-03-07T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="1-简介与注意事项">1. 简介与注意事项</h2><p>天气研究和预报模型（WRF，发音为“worf”）是一个主要用于数值天气预报（NWP）的高度并行，基于 CPU 的 Fortran 软件包。是 ISC21 中的基准测试应用程序之一。</p><div class="note warning flat"><p>Fortran 库的兼容性比较差，如果你想尽可能规避问题，可以选择与我相同的版本来完成任务。</p></div><p><strong>注意：</strong> 本文的目标仅为编译 WRF，即看到这样的 log。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line">==========================================================================</span><br><span class="line">build started:   2026年 03月 06日 星期五 17:37:20 CST</span><br><span class="line">build completed: 2026年 03月 06日 星期五 17:50:15 CST</span><br><span class="line"></span><br><span class="line">---&gt;                  Executables successfully built                  &lt;---</span><br><span class="line"></span><br><span class="line">-rwxr-xr-x 1 scc scc 43930888  3月 6日 17:50 main/ndown.exe</span><br><span class="line">-rwxr-xr-x 1 scc scc 40494584  3月 6日 17:50 main/real.exe</span><br><span class="line">-rwxr-xr-x 1 scc scc 39614120  3月 6日 17:50 main/tc.exe</span><br><span class="line">-rwxr-xr-x 1 scc scc 55235864  3月 6日 17:50 main/wrf.exe</span><br><span class="line"></span><br><span class="line">==========================================================================</span><br></pre></td></tr></table></figure><h2 id="2-前期准备">2. 前期准备</h2><p>本文基于 <strong>Rocky Linux 10</strong>，虚拟机环境。用户名设置为 <code>scc</code>，<code>hostname</code> 设定为 <code>node1</code>（模拟集群环境）。</p><table><thead><tr><th style="text-align:center">设备</th><th style="text-align:center">配置</th></tr></thead><tbody><tr><td style="text-align:center">内存</td><td style="text-align:center">8 GB</td></tr><tr><td style="text-align:center">处理器（CPU 核数）</td><td style="text-align:center">8</td></tr><tr><td style="text-align:center">硬盘</td><td style="text-align:center">25 GB</td></tr><tr><td style="text-align:center">挂载（共享）硬盘</td><td style="text-align:center">80 GB</td></tr></tbody></table><p><strong>挂载（共享）硬盘即下文出现的 <code>/data</code> 文件夹。</strong></p><p>首先，你需要有 <code>gcc</code> 和 <code>gfortran</code>，这是安装应用的常用软件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 安装</span></span><br><span class="line">[scc@node1 ~]$ <span class="built_in">sudo</span> yum install -y gcc g++ gfortran</span><br><span class="line"><span class="comment"># 查看版本</span></span><br><span class="line">[scc@node1 ~]$ gcc --version</span><br><span class="line">gcc (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2)</span><br><span class="line">[scc@node1 ~]$ g++ --version</span><br><span class="line">g++ (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2)</span><br><span class="line">[scc@node1 ~]$ gfortran --version</span><br><span class="line">GNU Fortran (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2)</span><br></pre></td></tr></table></figure><p>在你想安装的地方新建文件夹，之后的依赖软件安装和 WRF 本体安装都会在这里进行。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">[scc@node1 <span class="built_in">source</span>]$ <span class="built_in">mkdir</span> Build_WRF</span><br><span class="line">[scc@node1 Build_WRF]$ <span class="built_in">mkdir</span> LIBRARIES &amp;&amp; <span class="built_in">cd</span> LIBRARIES</span><br><span class="line">[scc@node1 LIBRARIES]$ <span class="built_in">pwd</span></span><br><span class="line">/data/software/source/Build_WRF/LIBRARIES</span><br><span class="line"><span class="comment"># 获取以下版本的安装包</span></span><br><span class="line">[scc@node1 LIBRARIES]$ <span class="built_in">ls</span></span><br><span class="line">jasper-4.2.8.tar.gz  libpng-1.6.55.tar.gz  mpich-4.3.2.tar.gz  netcdf-c-4.9.3.tar.gz  netcdf-fortran-4.6.2.tar.gz  zlib-1.3.2.tar.gz</span><br></pre></td></tr></table></figure><h2 id="3-依赖软件安装">3. 依赖软件安装</h2><div class="note info no-icon flat"><p>在这一部分，你将手动编译安装上述 6 个软件，并配置好环境变量。</p><p><strong>每一部分配置好后记得 <code>source ~/.bashrc</code> 以加载。</strong></p></div><p>这是最基本的环境变量，即 <code>gcc</code>、<code>g++</code>、<code>gfortran</code> 相关：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[scc@node1 LIBRARIES]$ vim ~/.bashrc</span><br><span class="line"><span class="built_in">export</span> DIR=/data/software/source/Build_WRF/LIBRARIES</span><br><span class="line"><span class="built_in">export</span> CC=gcc</span><br><span class="line"><span class="built_in">export</span> CXX=g++</span><br><span class="line"><span class="built_in">export</span> FC=gfortran</span><br><span class="line"><span class="built_in">export</span> FCFLAGS=-m64</span><br><span class="line"><span class="built_in">export</span> F77=gfortran</span><br><span class="line"><span class="built_in">export</span> FFLAGS=-m64</span><br></pre></td></tr></table></figure><h3 id="3-1-MPICH">3.1 MPICH</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># mpich</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf mpich-4.3.2.tar.gz &amp;&amp; <span class="built_in">cd</span> mpich-4.3.2</span><br><span class="line">[scc@node1 mpich-4.3.2]$ ./configure --prefix=/data/software/install/mpich/4.3.2</span><br><span class="line">[scc@node1 mpich-4.3.2]$ make -j4 &amp;&amp; make install</span><br><span class="line"><span class="comment"># 环境变量</span></span><br><span class="line">[scc@node1 mpich-4.3.2]$ <span class="built_in">export</span> PATH=/data/software/install/mpich/4.3.2/bin:<span class="variable">$PATH</span></span><br></pre></td></tr></table></figure><h3 id="3-2-NetCDF-C">3.2 NetCDF-C</h3><p><strong>注意：</strong>  <code>NetCDF-Fortran</code> 依赖于该软件。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># NetCDF-C</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf netcdf-c-4.9.3.tar.gz &amp;&amp; <span class="built_in">cd</span> netcdf-c-4.9.3</span><br><span class="line">[scc@node1 netcdf-c-4.9.3]$ ./configure \</span><br><span class="line">&gt; --prefix=/data/software/install/netcdf/c/4.9.3 \</span><br><span class="line">&gt; --disable-dap \</span><br><span class="line">&gt; --disable-netcdf-4 \</span><br><span class="line">&gt; --disable-shared</span><br><span class="line">[scc@node1 netcdf-c-4.9.3]$ make &amp;&amp; make install</span><br><span class="line">+-------------------------------------------------------------+</span><br><span class="line">| Congratulations! You have successfully installed netCDF!    |</span><br><span class="line">+-------------------------------------------------------------+</span><br><span class="line"><span class="comment"># 环境变量</span></span><br><span class="line">[scc@node1 netcdf-c-4.9.3]$ vim ~/.bashrc</span><br><span class="line"><span class="built_in">export</span> PATH=/data/software/install/netcdf/c/4.9.3/bin:<span class="variable">$PATH</span></span><br><span class="line"><span class="built_in">export</span> NETCDF=/data/software/install/netcdf/c/4.9.3</span><br></pre></td></tr></table></figure><h3 id="3-3-NetCDF-Fortran">3.3 NetCDF-Fortran</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># NetCDF-Fortran</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf netcdf-fortran-4.6.2.tar.gz &amp;&amp; <span class="built_in">cd</span> netcdf-fortran-4.6.2</span><br><span class="line"><span class="comment"># 指定 NetCDF-C 依赖，关闭 Fortran 严格检查</span></span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ <span class="built_in">export</span> CPPFLAGS=<span class="string">&quot;-I/data/software/install/netcdf/c/4.9.3/include&quot;</span></span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ <span class="built_in">export</span> LDFLAGS=<span class="string">&quot;-L/data/software/install/netcdf/c/4.9.3/lib -lnetcdf&quot;</span></span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ <span class="built_in">export</span> FFLAGS=<span class="string">&quot;-g -O2 -Wno-implicit-int -Wno-error=implicit-int -fPIC&quot;</span></span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ ./configure \</span><br><span class="line">&gt;   --prefix=/data/software/install/netcdf/fortran/4.6.2 \</span><br><span class="line">&gt;   --disable-shared</span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ make &amp;&amp; make install</span><br><span class="line">+-------------------------------------------------------------+</span><br><span class="line">| Congratulations! You have successfully installed the netCDF |</span><br><span class="line">| Fortran libraries.                                          |</span><br><span class="line">+-------------------------------------------------------------+</span><br><span class="line"><span class="comment"># 环境变量</span></span><br><span class="line">[scc@node1 netcdf-fortran-4.6.2]$ vim ~/.bashrc</span><br><span class="line"><span class="built_in">export</span> PATH=/data/software/install/netcdf/fortran/4.6.2/bin:<span class="variable">$PATH</span></span><br><span class="line"><span class="built_in">export</span> NETCDF_FORTRAN=/data/software/install/netcdf/fortran/4.6.2</span><br></pre></td></tr></table></figure><h3 id="3-4-zlib">3.4 zlib</h3><p><strong>注意：</strong> 此应用和后面的 <code>libpng</code>、<code>jasper</code> 要装到同一个文件夹下。</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># zlib</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf zlib-1.3.2.tar.gz</span><br><span class="line">[scc@node1 LIBRARIES]$ <span class="built_in">cd</span> zlib-1.3.2</span><br><span class="line">[scc@node1 zlib-1.3.2]$ ./configure --prefix=/data/software/install/grib2</span><br><span class="line">[scc@node1 zlib-1.3.2]$ make &amp;&amp; make install</span><br><span class="line"><span class="comment"># 环境变量</span></span><br><span class="line">[scc@node1 zlib-1.3.2]$ vim ~/.bashrc</span><br><span class="line"><span class="built_in">export</span> LDFLAGS=-L/data/software/install/grib2/lib</span><br><span class="line"><span class="built_in">export</span> CPPFLAGS=-I/data/software/install/grib2/include</span><br></pre></td></tr></table></figure><h3 id="3-5-libpng">3.5 libpng</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># libpng</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf libpng-1.6.55.tar.gz</span><br><span class="line">[scc@node1 LIBRARIES]$ <span class="built_in">cd</span> libpng-1.6.55</span><br><span class="line">[scc@node1 libpng-1.6.55]$ ./configure --prefix=/data/software/install/grib2</span><br><span class="line">[scc@node1 libpng-1.6.55]$ make &amp;&amp; make install</span><br><span class="line"><span class="comment"># 无需配置环境变量</span></span><br></pre></td></tr></table></figure><h3 id="3-6-jasper">3.6 jasper</h3><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># jasper</span></span><br><span class="line">[scc@node1 LIBRARIES]$ tar -zxvf jasper-4.2.8.tar.gz</span><br><span class="line"><span class="comment"># 软件禁止源码内构建，故在 LIBRARIES 目录下 build</span></span><br><span class="line">[scc@node1 LIBRARIES]$ <span class="built_in">mkdir</span> jasper_build &amp;&amp; <span class="built_in">cd</span> jasper_build</span><br><span class="line">[scc@node1 jasper_build]$ cmake \</span><br><span class="line">&gt;   -DCMAKE_INSTALL_PREFIX=/data/software/install/grib2 \</span><br><span class="line">&gt;   -DCMAKE_BUILD_TYPE=Release \</span><br><span class="line">&gt;   /data/software/source/Build_WRF/LIBRARIES/jasper-4.2.8</span><br><span class="line">[scc@node1 jasper_build]$ make -j4 &amp;&amp; make install</span><br><span class="line"><span class="comment"># 无需配置环境变量</span></span><br></pre></td></tr></table></figure><h2 id="4-编译-WRF">4. 编译 WRF</h2><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># WRF</span></span><br><span class="line">[scc@node1 Build_WRF]$ <span class="built_in">pwd</span></span><br><span class="line">/data/software/source/Build_WRF</span><br><span class="line"><span class="comment"># 获取 WRF 完整源码（--recursive 以获取所有子模块）</span></span><br><span class="line">[scc@node1 Build_WRF]$ git <span class="built_in">clone</span> --recursive https://github.com/wrf-model/WRF.git WRF-4.7.1</span><br><span class="line">子模组路径 <span class="string">&#x27;.ci/hpc-workflows&#x27;</span>：检出</span><br><span class="line">子模组路径 <span class="string">&#x27;phys/MYNN-EDMF&#x27;</span>：   检出</span><br><span class="line">子模组路径 <span class="string">&#x27;phys/noahmp&#x27;</span>：      检出</span><br><span class="line">[scc@node1 Build_WRF]$ <span class="built_in">cd</span> WRF-4.7.1</span><br><span class="line">[scc@node1 WRF-4.7.1]$ ./configure</span><br><span class="line">Error : Not found /data/software/install/netcdf/c/4.9.3/include/netcdf.inc</span><br><span class="line"><span class="comment"># 复制 NetCDF-Fortran 中的 netcdf.inc 以满足需求</span></span><br><span class="line">[scc@node1 include]$ <span class="built_in">pwd</span></span><br><span class="line">/data/software/install/netcdf/c/4.9.3/include</span><br><span class="line">[scc@node1 include]$ <span class="built_in">cp</span> /data/software/install/netcdf/fortran/4.6.2/include/netcdf.inc .</span><br><span class="line"><span class="comment"># 再次 ./configure，成功</span></span><br><span class="line">[scc@node1 WRF-4.7.1]$ ./configure</span><br><span class="line">*****************************************************************************</span><br><span class="line">This build of WRF will use classic (non-compressed) NETCDF format</span><br><span class="line">*****************************************************************************</span><br></pre></td></tr></table></figure><p>编译时的选项选择（具体含义可以自行查阅）：</p><p><img src="/img/src/2026-03-06-1.png" alt=""></p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 修改配置，以正确引入 NetCDF-Fortran</span></span><br><span class="line">[scc@node1 WRF-4.7.1]$ vim configure.wrf</span><br><span class="line"><span class="comment"># 保证 fortran 在 c 之前链接</span></span><br><span class="line"> LIB_EXTERNAL    = \</span><br><span class="line">                      -L$(WRF_SRC_ROOT_DIR)/external/io_netcdf -lwrfio_nf \</span><br><span class="line">                      -L/data/software/install/netcdf/fortran/4.6.2/lib -lnetcdff \</span><br><span class="line">                      -L/data/software/install/netcdf/c/4.9.3/lib  -lnetcdf       </span><br><span class="line"></span><br><span class="line">INCLUDE_MODULES =    $(MODULE_SRCH_FLAG) \</span><br><span class="line">                     $(ESMF_MOD_INC) $(ESMF_LIB_FLAGS) \</span><br><span class="line">                                           -I/data/software/install/netcdf/fortran/4.6.2/include</span><br><span class="line"></span><br><span class="line">wrfio_nf :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_netcdf ; \</span><br><span class="line">          make $(J) NETCDFPATH=<span class="string">&quot;<span class="subst">$(NETCDFPATH)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          NETCDFFPATH=<span class="string">&quot;/data/software/install/netcdf/fortran/4.6.2&quot;</span> \</span><br><span class="line">          CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span>&quot;</span> NETCDF4_DEP_LIB=<span class="string">&quot;<span class="subst">$(NETCDF4_DEP_LIB)</span>&quot;</span> \</span><br><span class="line">          FFLAGS=<span class="string">&quot;-I/data/software/install/netcdf/fortran/4.6.2/include <span class="subst">$(FFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(OMP)</span> <span class="subst">$(FCFLAGS)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br></pre></td></tr></table></figure><p><code>configure.wrf</code> 的完整内容：</p><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br><span class="line">228</span><br><span class="line">229</span><br><span class="line">230</span><br><span class="line">231</span><br><span class="line">232</span><br><span class="line">233</span><br><span class="line">234</span><br><span class="line">235</span><br><span class="line">236</span><br><span class="line">237</span><br><span class="line">238</span><br><span class="line">239</span><br><span class="line">240</span><br><span class="line">241</span><br><span class="line">242</span><br><span class="line">243</span><br><span class="line">244</span><br><span class="line">245</span><br><span class="line">246</span><br><span class="line">247</span><br><span class="line">248</span><br><span class="line">249</span><br><span class="line">250</span><br><span class="line">251</span><br><span class="line">252</span><br><span class="line">253</span><br><span class="line">254</span><br><span class="line">255</span><br><span class="line">256</span><br><span class="line">257</span><br><span class="line">258</span><br><span class="line">259</span><br><span class="line">260</span><br><span class="line">261</span><br><span class="line">262</span><br><span class="line">263</span><br><span class="line">264</span><br><span class="line">265</span><br><span class="line">266</span><br><span class="line">267</span><br><span class="line">268</span><br><span class="line">269</span><br><span class="line">270</span><br><span class="line">271</span><br><span class="line">272</span><br><span class="line">273</span><br><span class="line">274</span><br><span class="line">275</span><br><span class="line">276</span><br><span class="line">277</span><br><span class="line">278</span><br><span class="line">279</span><br><span class="line">280</span><br><span class="line">281</span><br><span class="line">282</span><br><span class="line">283</span><br><span class="line">284</span><br><span class="line">285</span><br><span class="line">286</span><br><span class="line">287</span><br><span class="line">288</span><br><span class="line">289</span><br><span class="line">290</span><br><span class="line">291</span><br><span class="line">292</span><br><span class="line">293</span><br><span class="line">294</span><br><span class="line">295</span><br><span class="line">296</span><br><span class="line">297</span><br><span class="line">298</span><br><span class="line">299</span><br><span class="line">300</span><br><span class="line">301</span><br><span class="line">302</span><br><span class="line">303</span><br><span class="line">304</span><br><span class="line">305</span><br><span class="line">306</span><br><span class="line">307</span><br><span class="line">308</span><br><span class="line">309</span><br><span class="line">310</span><br><span class="line">311</span><br><span class="line">312</span><br><span class="line">313</span><br><span class="line">314</span><br><span class="line">315</span><br><span class="line">316</span><br><span class="line">317</span><br><span class="line">318</span><br><span class="line">319</span><br><span class="line">320</span><br><span class="line">321</span><br><span class="line">322</span><br><span class="line">323</span><br><span class="line">324</span><br><span class="line">325</span><br><span class="line">326</span><br><span class="line">327</span><br><span class="line">328</span><br><span class="line">329</span><br><span class="line">330</span><br><span class="line">331</span><br><span class="line">332</span><br><span class="line">333</span><br><span class="line">334</span><br><span class="line">335</span><br><span class="line">336</span><br><span class="line">337</span><br><span class="line">338</span><br><span class="line">339</span><br><span class="line">340</span><br><span class="line">341</span><br><span class="line">342</span><br><span class="line">343</span><br><span class="line">344</span><br><span class="line">345</span><br><span class="line">346</span><br><span class="line">347</span><br><span class="line">348</span><br><span class="line">349</span><br><span class="line">350</span><br><span class="line">351</span><br><span class="line">352</span><br><span class="line">353</span><br><span class="line">354</span><br><span class="line">355</span><br><span class="line">356</span><br><span class="line">357</span><br><span class="line">358</span><br><span class="line">359</span><br><span class="line">360</span><br><span class="line">361</span><br><span class="line">362</span><br><span class="line">363</span><br><span class="line">364</span><br><span class="line">365</span><br><span class="line">366</span><br><span class="line">367</span><br><span class="line">368</span><br><span class="line">369</span><br><span class="line">370</span><br><span class="line">371</span><br><span class="line">372</span><br><span class="line">373</span><br><span class="line">374</span><br><span class="line">375</span><br><span class="line">376</span><br><span class="line">377</span><br><span class="line">378</span><br><span class="line">379</span><br><span class="line">380</span><br><span class="line">381</span><br><span class="line">382</span><br><span class="line">383</span><br><span class="line">384</span><br><span class="line">385</span><br><span class="line">386</span><br><span class="line">387</span><br><span class="line">388</span><br><span class="line">389</span><br><span class="line">390</span><br><span class="line">391</span><br><span class="line">392</span><br><span class="line">393</span><br><span class="line">394</span><br><span class="line">395</span><br><span class="line">396</span><br><span class="line">397</span><br><span class="line">398</span><br><span class="line">399</span><br><span class="line">400</span><br><span class="line">401</span><br><span class="line">402</span><br><span class="line">403</span><br><span class="line">404</span><br><span class="line">405</span><br><span class="line">406</span><br><span class="line">407</span><br><span class="line">408</span><br><span class="line">409</span><br><span class="line">410</span><br><span class="line">411</span><br><span class="line">412</span><br><span class="line">413</span><br><span class="line">414</span><br><span class="line">415</span><br><span class="line">416</span><br><span class="line">417</span><br><span class="line">418</span><br><span class="line">419</span><br><span class="line">420</span><br><span class="line">421</span><br><span class="line">422</span><br><span class="line">423</span><br><span class="line">424</span><br><span class="line">425</span><br><span class="line">426</span><br><span class="line">427</span><br><span class="line">428</span><br><span class="line">429</span><br><span class="line">430</span><br><span class="line">431</span><br><span class="line">432</span><br><span class="line">433</span><br><span class="line">434</span><br><span class="line">435</span><br><span class="line">436</span><br><span class="line">437</span><br><span class="line">438</span><br><span class="line">439</span><br><span class="line">440</span><br><span class="line">441</span><br><span class="line">442</span><br><span class="line">443</span><br><span class="line">444</span><br><span class="line">445</span><br><span class="line">446</span><br><span class="line">447</span><br><span class="line">448</span><br><span class="line">449</span><br><span class="line">450</span><br><span class="line">451</span><br><span class="line">452</span><br><span class="line">453</span><br><span class="line">454</span><br><span class="line">455</span><br><span class="line">456</span><br><span class="line">457</span><br><span class="line">458</span><br><span class="line">459</span><br><span class="line">460</span><br><span class="line">461</span><br><span class="line">462</span><br><span class="line">463</span><br><span class="line">464</span><br><span class="line">465</span><br><span class="line">466</span><br><span class="line">467</span><br><span class="line">468</span><br><span class="line">469</span><br><span class="line">470</span><br><span class="line">471</span><br><span class="line">472</span><br><span class="line">473</span><br><span class="line">474</span><br><span class="line">475</span><br><span class="line">476</span><br><span class="line">477</span><br><span class="line">478</span><br><span class="line">479</span><br><span class="line">480</span><br><span class="line">481</span><br><span class="line">482</span><br><span class="line">483</span><br><span class="line">484</span><br><span class="line">485</span><br><span class="line">486</span><br><span class="line">487</span><br><span class="line">488</span><br><span class="line">489</span><br><span class="line">490</span><br><span class="line">491</span><br><span class="line">492</span><br><span class="line">493</span><br><span class="line">494</span><br><span class="line">495</span><br><span class="line">496</span><br><span class="line">497</span><br><span class="line">498</span><br><span class="line">499</span><br><span class="line">500</span><br><span class="line">501</span><br><span class="line">502</span><br><span class="line">503</span><br><span class="line">504</span><br><span class="line">505</span><br><span class="line">506</span><br><span class="line">507</span><br><span class="line">508</span><br><span class="line">509</span><br><span class="line">510</span><br><span class="line">511</span><br><span class="line">512</span><br><span class="line">513</span><br><span class="line">514</span><br><span class="line">515</span><br><span class="line">516</span><br><span class="line">517</span><br><span class="line">518</span><br><span class="line">519</span><br><span class="line">520</span><br><span class="line">521</span><br><span class="line">522</span><br><span class="line">523</span><br><span class="line">524</span><br><span class="line">525</span><br><span class="line">526</span><br><span class="line">527</span><br><span class="line">528</span><br><span class="line">529</span><br><span class="line">530</span><br><span class="line">531</span><br><span class="line">532</span><br><span class="line">533</span><br><span class="line">534</span><br><span class="line">535</span><br><span class="line">536</span><br><span class="line">537</span><br><span class="line">538</span><br><span class="line">539</span><br><span class="line">540</span><br><span class="line">541</span><br><span class="line">542</span><br><span class="line">543</span><br><span class="line">544</span><br><span class="line">545</span><br><span class="line">546</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># configure.wrf</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># Original configure options used:</span></span><br><span class="line"><span class="comment"># ./configure </span></span><br><span class="line"><span class="comment"># Compiler choice: 35</span></span><br><span class="line"><span class="comment"># Nesting option: 1</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># This file was automatically generated by the configure script in the</span></span><br><span class="line"><span class="comment"># top level directory. You may make changes to the settings in this</span></span><br><span class="line"><span class="comment"># file but be aware they will be overwritten each time you run configure.</span></span><br><span class="line"><span class="comment"># Ordinarily, it is necessary to run configure once, when the code is</span></span><br><span class="line"><span class="comment"># first installed.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line"><span class="comment"># To permanently change options, change the settings for your platform</span></span><br><span class="line"><span class="comment"># in the file arch/configure.defaults then rerun configure.</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">SHELL           =       /bin/sh</span><br><span class="line">DEVTOP          =       `<span class="built_in">pwd</span>`</span><br><span class="line">LIBINCLUDE      =       .</span><br><span class="line">.SUFFIXES: .F .i .o .f90 .c .F90</span><br><span class="line"></span><br><span class="line"><span class="comment">#### Get core settings from environment (set in compile script)</span></span><br><span class="line"><span class="comment">#### Note to add a core, this has to be added to.</span></span><br><span class="line"></span><br><span class="line">COREDEFS = -DEM_CORE=$(WRF_EM_CORE) \</span><br><span class="line">           -DNMM_CORE=$(WRF_NMM_CORE) -DNMM_MAX_DIM=2600 \</span><br><span class="line">   -DDA_CORE=$(WRF_DA_CORE) \</span><br><span class="line">   -DWRFPLUS=$(WRF_PLUS_CORE)</span><br><span class="line"></span><br><span class="line"><span class="comment">#### Single location for defining total number of domains.  You need</span></span><br><span class="line"><span class="comment">#### at least 1 + 2*(number of total nests).  For example, 1 coarse</span></span><br><span class="line"><span class="comment">#### grid + three fine grids = 1 + 2(3) = 7, so MAX_DOMAINS=7.</span></span><br><span class="line"></span><br><span class="line">MAX_DOMAINS=21</span><br><span class="line"></span><br><span class="line"><span class="comment">#### DM buffer length for the configuration flags.</span></span><br><span class="line"></span><br><span class="line">CONFIG_BUF_LEN=65536</span><br><span class="line"></span><br><span class="line"><span class="comment">#### Size of bitmasks (in 4byte integers) of stream masks for WRF I/O</span></span><br><span class="line"></span><br><span class="line">MAX_HISTORY = 25</span><br><span class="line"></span><br><span class="line">IWORDSIZE = 4</span><br><span class="line">DWORDSIZE = 8</span><br><span class="line">LWORDSIZE = 4</span><br><span class="line"></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"><span class="comment">#### The settings in this section are defaults that may be overridden by the </span></span><br><span class="line"><span class="comment">#### architecture-specific settings in the next section.  </span></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"><span class="comment">#### NOTE:  Do not modify these default values here.  To override these </span></span><br><span class="line"><span class="comment">####        values, make changes after &quot;Architecture specific settings&quot;.  </span></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#### Native size (in bytes) of Fortran REAL data type on this architecture ####</span></span><br><span class="line"><span class="comment">#### Note:  to change real wordsize (for example, to promote REALs from </span></span><br><span class="line"><span class="comment">####        4-byte to 8-byte), modify the definition of RWORDSIZE in the </span></span><br><span class="line"><span class="comment">####        section following &quot;Architecture specific settings&quot;.  Do not </span></span><br><span class="line"><span class="comment">####        change NATIVE_RWORDSIZE as is it architecture-specific.  </span></span><br><span class="line">NATIVE_RWORDSIZE = 4</span><br><span class="line"></span><br><span class="line"><span class="comment">#### Default sed command and script for Fortran source files ####</span></span><br><span class="line"><span class="comment">#SED_FTN = sed -f $(WRF_SRC_ROOT_DIR)/arch/standard.sed</span></span><br><span class="line">SED_FTN = $(WRF_SRC_ROOT_DIR)/tools/standard.exe</span><br><span class="line"></span><br><span class="line"><span class="comment"># Hack to work around $(PWD) not changing during OSF1 build.  </span></span><br><span class="line"><span class="comment"># $(IO_GRIB_SHARE_DIR) is reset during the OSF1 build only.  </span></span><br><span class="line">IO_GRIB_SHARE_DIR = </span><br><span class="line"></span><br><span class="line"><span class="comment">#### ESMF switches                 ####</span></span><br><span class="line"><span class="comment">#### These are set up by Config.pl ####</span></span><br><span class="line"><span class="comment"># switch to use separately installed ESMF library for coupling:  1==true</span></span><br><span class="line">ESMF_COUPLING       = 0</span><br><span class="line"><span class="comment"># select dependences on module_utility.o</span></span><br><span class="line">ESMF_MOD_DEPENDENCE = $(WRF_SRC_ROOT_DIR)/external/esmf_time_f90/module_utility.o</span><br><span class="line"><span class="comment"># select -I options for external/io_esmf vs. external/esmf_time_f90</span></span><br><span class="line">ESMF_IO_INC         = -I$(WRF_SRC_ROOT_DIR)/external/esmf_time_f90</span><br><span class="line"><span class="comment"># select -I options for separately installed ESMF library, if present</span></span><br><span class="line">ESMF_MOD_INC        =  $(ESMF_IO_INC)</span><br><span class="line"><span class="comment"># select cpp token for external/io_esmf vs. external/esmf_time_f90</span></span><br><span class="line">ESMF_IO_DEFS        = </span><br><span class="line"><span class="comment"># select build target for external/io_esmf vs. external/esmf_time_f90</span></span><br><span class="line">ESMF_TARGET         = esmf_time</span><br><span class="line"></span><br><span class="line"><span class="comment"># ESMFINCLUDEGOESHERE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#### NETCDF4 pieces</span></span><br><span class="line"></span><br><span class="line">NETCDF4_IO_OPTS = -DUSE_NETCDF4_FEATURES -DWRFIO_NCD_LARGE_FILE_SUPPORT</span><br><span class="line">GPFS            =</span><br><span class="line">CURL            =</span><br><span class="line">HDF5            =</span><br><span class="line">ZLIB            =</span><br><span class="line">NETCDF4_DEP_LIB = </span><br><span class="line"></span><br><span class="line"><span class="comment"># NETCDF4INCLUDEGOESHERE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#### CTSM pieces</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># CTSMINCLUDEGOESHERE</span></span><br><span class="line"></span><br><span class="line"><span class="comment">##############################################################################</span></span><br><span class="line"></span><br><span class="line">LIBWRFLIB = libwrflib.a</span><br><span class="line"></span><br><span class="line"> LIB_BUNDLED     = \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/external/fftpack/fftpack5/libfftpack.a \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/external/io_grib1/libio_grib1.a \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/external/io_grib_share/libio_grib_share.a \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/external/io_int/libwrfio_int.a \</span><br><span class="line">                      $(ESMF_IO_LIB) \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/external/RSL_LITE/librsl_lite.a \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/frame/module_internal_header_util.o \</span><br><span class="line">                      $(WRF_SRC_ROOT_DIR)/frame/pack_utils.o</span><br><span class="line"></span><br><span class="line"> LIB_EXTERNAL    = \</span><br><span class="line">                      -L$(WRF_SRC_ROOT_DIR)/external/io_netcdf -lwrfio_nf \</span><br><span class="line">                      -L/data/software/install/netcdf/fortran/4.6.2/lib -lnetcdff \</span><br><span class="line">                      -L/data/software/install/netcdf/c/4.9.3/lib  -lnetcdf</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">#### Architecture specific settings ####</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Settings for    Linux x86_64 ppc64le, gfortran compiler with gcc   (dm+sm)</span></span><br><span class="line"><span class="comment">#</span></span><br><span class="line">DESCRIPTION     =       GNU (<span class="variable">$SFC</span>/<span class="variable">$SCC</span>)</span><br><span class="line">DMPARALLEL      =        1</span><br><span class="line">OMPCPP          =        -D_OPENMP</span><br><span class="line">OMP             =        -fopenmp</span><br><span class="line">OMPCC           =        -fopenmp</span><br><span class="line">SFC             =       gfortran</span><br><span class="line">SCC             =       gcc</span><br><span class="line">CCOMP           =       gcc</span><br><span class="line">DM_FC           =       mpif90 </span><br><span class="line">DM_CC           =       mpicc -cc=$(SCC)</span><br><span class="line">FC              =       <span class="keyword">time</span> $(DM_FC)</span><br><span class="line">CC              =       $(DM_CC) -DFSEEKO_OK </span><br><span class="line">LD              =       $(FC)</span><br><span class="line">RWORDSIZE       =       4</span><br><span class="line">PROMOTION       =       <span class="comment">#-fdefault-real-8</span></span><br><span class="line">ARCH_LOCAL      =       -DNONSTANDARD_SYSTEM_SUBR  -DWRF_USE_CLM</span><br><span class="line"><span class="comment"># to validate WRF correctness on aarch64 against x86_64; compile with x86 this alternate ARCH_LOCAL option; able to achieve identical output model on ubuntu 18.04 with gcc 10.2 (on graviton and intel processors)</span></span><br><span class="line"><span class="comment"># ARCH_LOCAL      =       -DNONSTANDARD_SYSTEM_SUBR  -DWRF_USE_CLM -DAARCH64_X86_CORRECTNESS_FIX</span></span><br><span class="line">CFLAGS_LOCAL    =       -w -O3 -c  <span class="comment"># -DRSL0_ONLY</span></span><br><span class="line">LDFLAGS_LOCAL   =       </span><br><span class="line">CPLUSPLUSLIB    =       </span><br><span class="line">ESMF_LDFLAG     =       $(CPLUSPLUSLIB)</span><br><span class="line">FCOPTIM         =       -O2 -ftree-vectorize -funroll-loops</span><br><span class="line">FCREDUCEDOPT=       $(FCOPTIM)</span><br><span class="line">FCNOOPT=       -O0</span><br><span class="line">FCDEBUG         =       <span class="comment"># -g $(FCNOOPT) # -ggdb -fbacktrace -fcheck=bounds,do,mem,pointer -ffpe-trap=invalid,zero,overflow</span></span><br><span class="line">FORMAT_FIXED    =       -ffixed-form</span><br><span class="line">FORMAT_FREE     =       -ffree-form -ffree-line-length-none</span><br><span class="line">FCSUFFIX        =       </span><br><span class="line">FCCOMPAT        =        -fallow-argument-mismatch -fallow-invalid-boz</span><br><span class="line">BYTESWAPIO      =       -fconvert=big-endian -frecord-marker=4</span><br><span class="line">FCBASEOPTS_NO_G =       -w $(FORMAT_FREE) $(BYTESWAPIO) $(FCCOMPAT)</span><br><span class="line">FCBASEOPTS      =       $(FCBASEOPTS_NO_G) $(FCDEBUG)</span><br><span class="line">MODULE_SRCH_FLAG =     </span><br><span class="line">TRADFLAG        =      -traditional-cpp</span><br><span class="line">CPP             =      /lib/cpp -P -nostdinc</span><br><span class="line">AR              =      ar</span><br><span class="line">ARFLAGS         =      ru</span><br><span class="line">M4              =      m4 -G</span><br><span class="line">RANLIB          =      ranlib</span><br><span class="line">RLFLAGS=</span><br><span class="line">CC_TOOLS        =      $(SCC) </span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">###########################################################</span></span><br><span class="line"><span class="comment">######################</span></span><br><span class="line"><span class="comment"># POSTAMBLE</span></span><br><span class="line"></span><br><span class="line">FGREP = fgrep -iq</span><br><span class="line"><span class="comment">### Used throughout the build system to inform promotion to double precision</span></span><br><span class="line">DOUBLE_PRECISION = </span><br><span class="line"></span><br><span class="line">ARCHFLAGS       =    $(COREDEFS) -DIWORDSIZE=$(IWORDSIZE) -DDWORDSIZE=$(DWORDSIZE) -DRWORDSIZE=$(RWORDSIZE) -DLWORDSIZE=$(LWORDSIZE)  \</span><br><span class="line">                     $(ARCH_LOCAL) \</span><br><span class="line">                     $(DA_ARCHFLAGS) \</span><br><span class="line">                      -DDM_PARALLEL \</span><br><span class="line">                       \</span><br><span class="line">                      -DNETCDF \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                       -DLANDREAD_STUB=1 \</span><br><span class="line">                       \</span><br><span class="line">                       \</span><br><span class="line">                      -DUSE_ALLOCATABLES \</span><br><span class="line">                      -Dwrfmodel \</span><br><span class="line">                      -DGRIB1 \</span><br><span class="line">                      -DINTIO \</span><br><span class="line">                      -DKEEP_INT_AROUND \</span><br><span class="line">                      -DLIMIT_ARGS \</span><br><span class="line">                      -DBUILD_RRTMG_FAST=0 \</span><br><span class="line">                      -DBUILD_RRTMK=0 \</span><br><span class="line">                      -DBUILD_SBM_FAST=1 \</span><br><span class="line">                      -DSHOW_ALL_VARS_USED=0 \</span><br><span class="line">                      -DCONFIG_BUF_LEN=$(CONFIG_BUF_LEN) \</span><br><span class="line">                      -DMAX_DOMAINS_F=$(MAX_DOMAINS) \</span><br><span class="line">                      -DMAX_HISTORY=$(MAX_HISTORY) \</span><br><span class="line">      -DNMM_NEST=$(WRF_NMM_NEST)</span><br><span class="line">CFLAGS          =    $(CFLAGS_LOCAL) -DDM_PARALLEL  \</span><br><span class="line">                      -DLANDREAD_STUB=1 \</span><br><span class="line">                      -DMAX_HISTORY=$(MAX_HISTORY) -DNMM_CORE=$(WRF_NMM_CORE)</span><br><span class="line">FCFLAGS         =    $(FCOPTIM) $(FCBASEOPTS)</span><br><span class="line">ESMF_LIB_FLAGS  =    </span><br><span class="line"><span class="comment"># ESMF 5 -- these are defined in esmf.mk, included above</span></span><br><span class="line"> ESMF_IO_LIB     =    -L$(WRF_SRC_ROOT_DIR)/external/esmf_time_f90 -lesmf_time</span><br><span class="line">ESMF_IO_LIB_EXT =    -L$(WRF_SRC_ROOT_DIR)/external/esmf_time_f90 -lesmf_time</span><br><span class="line">INCLUDE_MODULES =    $(MODULE_SRCH_FLAG) \</span><br><span class="line">                     $(ESMF_MOD_INC) $(ESMF_LIB_FLAGS) \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/main \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/external/io_netcdf \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/external/io_int \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/frame \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/share \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/phys \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/wrftladj \</span><br><span class="line">                      -I$(WRF_SRC_ROOT_DIR)/chem -I$(WRF_SRC_ROOT_DIR)/inc \</span><br><span class="line">                      -I$(NETCDFPATH)/include \</span><br><span class="line">                      -I/data/software/install/netcdf/fortran/4.6.2/include</span><br><span class="line">                       </span><br><span class="line">REGISTRY        =    Registry</span><br><span class="line">CC_TOOLS_CFLAGS = -DNMM_CORE=$(WRF_NMM_CORE)</span><br><span class="line"></span><br><span class="line">LIB             =    $(LIB_BUNDLED) $(LIB_EXTERNAL) $(LIB_LOCAL) $(LIB_WRF_HYDRO) </span><br><span class="line">LDFLAGS         =    $(OMP) $(FCFLAGS) $(LDFLAGS_LOCAL) </span><br><span class="line">ENVCOMPDEFS     =    </span><br><span class="line">WRF_CHEM=0 </span><br><span class="line">CPPFLAGS        =    $(ARCHFLAGS) $(ENVCOMPDEFS) -I$(LIBINCLUDE) $(TRADFLAG) </span><br><span class="line">NETCDFPATH      =    /data/software/install/netcdf/c/4.9.3</span><br><span class="line">HDF5PATH        =    </span><br><span class="line">WRFPLUSPATH     =    </span><br><span class="line">RTTOVPATH       =    </span><br><span class="line">PNETCDFPATH     =    </span><br><span class="line">ADIOS2PATH      =    </span><br><span class="line">NETCDFPAR_BUILD=    <span class="built_in">echo</span> SKIPPING</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">bundled:  io_only </span><br><span class="line">external: io_only $(WRF_SRC_ROOT_DIR)/external/RSL_LITE/librsl_lite.a gen_comms_rsllite module_dm_rsllite $(ESMF_TARGET)</span><br><span class="line">io_only:  esmf_time wrfio_nf     \</span><br><span class="line">  wrf_ioapi_includes wrfio_grib_share wrfio_grib1 wrfio_int fftpack</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment">######################</span></span><br><span class="line">externals: io_only bundled external</span><br><span class="line"></span><br><span class="line">gen_comms_serial :</span><br><span class="line">( /bin/rm -f $(WRF_SRC_ROOT_DIR)/tools/gen_comms.c )</span><br><span class="line"></span><br><span class="line">module_dm_serial :</span><br><span class="line">( <span class="keyword">if</span> [ ! -e module_dm.F ] ; <span class="keyword">then</span> /bin/cp module_dm_warning module_dm.F ; <span class="built_in">cat</span> module_dm_stubs.F &gt;&gt; module_dm.F ; <span class="keyword">fi</span> )</span><br><span class="line"></span><br><span class="line">gen_comms_rsllite :</span><br><span class="line">( <span class="keyword">if</span> [ ! -e $(WRF_SRC_ROOT_DIR)/tools/gen_comms.c ] ; <span class="keyword">then</span> \</span><br><span class="line">          /bin/cp $(WRF_SRC_ROOT_DIR)/tools/gen_comms_warning $(WRF_SRC_ROOT_DIR)/tools/gen_comms.c ; \</span><br><span class="line">          <span class="built_in">cat</span> $(WRF_SRC_ROOT_DIR)/external/RSL_LITE/gen_comms.c &gt;&gt; $(WRF_SRC_ROOT_DIR)/tools/gen_comms.c ; <span class="keyword">fi</span> )</span><br><span class="line"></span><br><span class="line">module_dm_rsllite :</span><br><span class="line">( <span class="keyword">if</span> [ ! -e module_dm.F ] ; <span class="keyword">then</span> /bin/cp module_dm_warning module_dm.F ; \</span><br><span class="line">          <span class="built_in">cat</span> $(WRF_SRC_ROOT_DIR)/external/RSL_LITE/module_dm.F &gt;&gt; module_dm.F ; <span class="keyword">fi</span> )</span><br><span class="line"></span><br><span class="line">wrfio_nf :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_netcdf ; \</span><br><span class="line">          make $(J) NETCDFPATH=<span class="string">&quot;<span class="subst">$(NETCDFPATH)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          NETCDFFPATH=<span class="string">&quot;/data/software/install/netcdf/fortran/4.6.2&quot;</span> \</span><br><span class="line">          CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span>&quot;</span> NETCDF4_DEP_LIB=<span class="string">&quot;<span class="subst">$(NETCDF4_DEP_LIB)</span>&quot;</span> \</span><br><span class="line">          FFLAGS=<span class="string">&quot;-I/data/software/install/netcdf/fortran/4.6.2/include <span class="subst">$(FFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(OMP)</span> <span class="subst">$(FCFLAGS)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">wrfio_nfpar : </span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_netcdfpar ; \</span><br><span class="line">          make $(J) NETCDFPARPATH=<span class="string">&quot;<span class="subst">$(NETCDFPATH)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> <span class="subst">$(ARCHFLAGS)</span>&quot;</span> \</span><br><span class="line">          NETCDF4_DEP_LIB=<span class="string">&quot;<span class="subst">$(NETCDF4_DEP_LIB)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(OMP)</span> <span class="subst">$(FCFLAGS)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">wrfio_pnf : </span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_pnetcdf ; \</span><br><span class="line">          make $(J) NETCDFPATH=<span class="string">&quot;<span class="subst">$(PNETCDFPATH)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> <span class="subst">$(ARCHFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(OMP)</span> <span class="subst">$(FCFLAGS)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">wrfio_adios2 : </span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_adios2 ; \</span><br><span class="line">          make $(J) ADIOS2=<span class="string">&quot;<span class="subst">$(ADIOS2PATH)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> <span class="subst">$(ARCHFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(OMP)</span> <span class="subst">$(FCFLAGS)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">wrfio_grib_share :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_grib_share ; \</span><br><span class="line">          make $(J) CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span>&quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> -I. <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(FCSUFFIX)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> archive)</span><br><span class="line"></span><br><span class="line">wrfio_grib1 :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_grib1 ; \</span><br><span class="line">          make $(J) CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span>&quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> -I. <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(FCSUFFIX)</span>&quot;</span> TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> archive)</span><br><span class="line"></span><br><span class="line">wrfio_grib2 :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_grib2 ; \</span><br><span class="line">          make $(J) CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span> &quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> \</span><br><span class="line">          CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> -I. <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(FCSUFFIX)</span>&quot;</span> TRADFLAG=<span class="string">&quot;-traditional&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> \</span><br><span class="line">          FIXED=<span class="string">&quot;<span class="subst">$(FORMAT_FIXED)</span>&quot;</span> archive)</span><br><span class="line"></span><br><span class="line">wrfio_int :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_int ; \</span><br><span class="line">          make $(J) CC=<span class="string">&quot;<span class="subst">$(CC)</span>&quot;</span> CFLAGS_LOCAL=<span class="string">&quot;<span class="subst">$(CFLAGS_LOCAL)</span>&quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(OMP)</span>&quot;</span> FGREP=<span class="string">&quot;<span class="subst">$(FGREP)</span>&quot;</span> \</span><br><span class="line">          TRADFLAG=<span class="string">&quot;<span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> ARCHFLAGS=<span class="string">&quot;<span class="subst">$(ARCHFLAGS)</span>&quot;</span> all )</span><br><span class="line"></span><br><span class="line">esmf_time :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/esmf_time_f90 ; \</span><br><span class="line">          make $(J) FC=<span class="string">&quot;<span class="subst">$(SFC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> \</span><br><span class="line">          CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> -I<span class="subst">$(WRF_SRC_ROOT_DIR)</span>/inc -I. <span class="subst">$(ARCHFLAGS)</span> <span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">fftpack :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/fftpack/fftpack5 ; \</span><br><span class="line">          make $(J) FC=<span class="string">&quot;<span class="subst">$(SFC)</span>&quot;</span> FFLAGS=<span class="string">&quot;<span class="subst">$(PROMOTION)</span> <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> \</span><br><span class="line">          ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> CPPFLAGS=<span class="string">&quot;<span class="subst">$(CPPFLAGS)</span>&quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">atm_ocn :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/atm_ocn ; \</span><br><span class="line">          make $(J) CC=<span class="string">&quot;<span class="subst">$(SCC)</span>&quot;</span> CFLAGS=<span class="string">&quot;<span class="subst">$(CFLAGS)</span> &quot;</span> RM=<span class="string">&quot;<span class="subst">$(RM)</span>&quot;</span> RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> \</span><br><span class="line">          CPP=<span class="string">&quot;<span class="subst">$(CPP)</span>&quot;</span> CPPFLAGS=<span class="string">&quot;<span class="subst">$(CPPFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(DM_FC)</span> <span class="subst">$(PROMOTION)</span> -I. <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(FCSUFFIX)</span>&quot;</span> TRADFLAG=<span class="string">&quot;-traditional&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> \</span><br><span class="line">          FIXED=<span class="string">&quot;<span class="subst">$(FORMAT_FIXED)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">$(WRF_SRC_ROOT_DIR)/external/RSL_LITE/librsl_lite.a :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/RSL_LITE ; make $(J) CC=<span class="string">&quot;<span class="subst">$(CC)</span> <span class="subst">$(CFLAGS)</span>&quot;</span> \</span><br><span class="line">          FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(FCFLAGS)</span> <span class="subst">$(OMP)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(BYTESWAPIO)</span>&quot;</span> \</span><br><span class="line">          CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> -I. <span class="subst">$(ARCHFLAGS)</span> <span class="subst">$(OMPCPP)</span> <span class="subst">$(TRADFLAG)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> ;\</span><br><span class="line">          $(RANLIB) $(WRF_SRC_ROOT_DIR)/external/RSL_LITE/librsl_lite.a )</span><br><span class="line"></span><br><span class="line"><span class="comment">######################</span></span><br><span class="line"><span class="comment">#Macros, these should be generic for all machines</span></span><br><span class="line"></span><br><span class="line">LN=<span class="built_in">ln</span> -sf</span><br><span class="line">MAKE=make -i -r</span><br><span class="line">RM= <span class="built_in">rm</span> -f</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># These sub-directory builds are identical across all architectures</span></span><br><span class="line"></span><br><span class="line">wrf_ioapi_includes :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/ioapi_share ; \</span><br><span class="line">          $(MAKE) NATIVE_RWORDSIZE=<span class="string">&quot;<span class="subst">$(NATIVE_RWORDSIZE)</span>&quot;</span> RWORDSIZE=<span class="string">&quot;<span class="subst">$(RWORDSIZE)</span>&quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line">wrfio_esmf :</span><br><span class="line">( <span class="built_in">cd</span> $(WRF_SRC_ROOT_DIR)/external/io_esmf ; \</span><br><span class="line">          make FC=<span class="string">&quot;<span class="subst">$(FC)</span> <span class="subst">$(PROMOTION)</span> <span class="subst">$(FCDEBUG)</span> <span class="subst">$(FCBASEOPTS)</span> <span class="subst">$(ESMF_MOD_INC)</span>&quot;</span> \</span><br><span class="line">          RANLIB=<span class="string">&quot;<span class="subst">$(RANLIB)</span>&quot;</span> CPP=<span class="string">&quot;<span class="subst">$(CPP)</span> <span class="subst">$(POUND_DEF)</span> &quot;</span> AR=<span class="string">&quot;<span class="subst">$(AR)</span>&quot;</span> ARFLAGS=<span class="string">&quot;<span class="subst">$(ARFLAGS)</span>&quot;</span> )</span><br><span class="line"></span><br><span class="line"><span class="comment">#There is probably no reason to modify these rules</span></span><br><span class="line"></span><br><span class="line">.F.i:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">sed -e <span class="string">&quot;s/^\!.*&#x27;.*//&quot;</span> -e <span class="string">&quot;s/^ *\!.*&#x27;.*//&quot;</span> $*.F &gt; $*.G</span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $*.G &gt; $*.i</span><br><span class="line"><span class="built_in">mv</span> $*.i $(DEVTOP)/pick/$*.f90</span><br><span class="line"><span class="built_in">cp</span> $*.F $(DEVTOP)/pick</span><br><span class="line"></span><br><span class="line">.F.o:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">sed -e <span class="string">&quot;s/^\!.*&#x27;.*//&quot;</span> -e <span class="string">&quot;s/^ *\!.*&#x27;.*//&quot;</span> $*.F &gt; $*.G</span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $(OMPCPP) $*.G  &gt; $*.bb</span><br><span class="line">$(SED_FTN) $*.bb | $(CPP) $(TRADFLAG) &gt; $*.f90</span><br><span class="line">$(RM) $*.G $*.bb</span><br><span class="line">@ <span class="keyword">if</span> <span class="built_in">echo</span> $(ARCHFLAGS) | $(FGREP) <span class="string">&#x27;DVAR4D&#x27;</span>; <span class="keyword">then</span> \</span><br><span class="line">          <span class="built_in">echo</span> COMPILING $*.F <span class="keyword">for</span> 4DVAR ; \</span><br><span class="line">          $(WRF_SRC_ROOT_DIR)/var/build/da_name_space.pl $*.f90 &gt; $*.f90.tmp ; \</span><br><span class="line">          <span class="built_in">mv</span> $*.f90.tmp $*.f90 ; \</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">$(FC) -o <span class="variable">$@</span> -c $(FCFLAGS) $(OMP) $(MODULE_DIRS) $(PROMOTION) $(FCSUFFIX) $*.f90</span><br><span class="line"></span><br><span class="line">.F90.o:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">sed -e <span class="string">&quot;s/^\!.*&#x27;.*//&quot;</span> -e <span class="string">&quot;s/^ *\!.*&#x27;.*//&quot;</span> $*.F90 &gt; $*.G</span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $(OMPCPP) $*.G  &gt; $*.bb</span><br><span class="line">$(SED_FTN) $*.bb | $(CPP) $(TRADFLAG) &gt; $*.tmp.f90</span><br><span class="line">$(RM) $*.G $*.bb</span><br><span class="line">$(FC) -o <span class="variable">$@</span> -c $(FCFLAGS) $(OMP) $(MODULE_DIRS) $(PROMOTION) $(FCSUFFIX) $*.tmp.f90</span><br><span class="line"></span><br><span class="line">.F.f90:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">sed -e <span class="string">&quot;s/^\!.*&#x27;.*//&quot;</span> -e <span class="string">&quot;s/^ *\!.*&#x27;.*//&quot;</span> $*.F &gt; $*.G</span><br><span class="line">$(SED_FTN) $*.G &gt; $*.H</span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $*.H  &gt; <span class="variable">$@</span></span><br><span class="line">$(RM) $*.G $*.H</span><br><span class="line"></span><br><span class="line">.f90.o:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(FC) -o <span class="variable">$@</span> -c $(FCFLAGS) $(PROMOTION) $(FCSUFFIX) $*.f90</span><br><span class="line"></span><br><span class="line">setfeenv.o : setfeenv.c</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(CCOMP) -o <span class="variable">$@</span> -c $(CFLAGS) $(OMPCC) $*.c</span><br><span class="line"></span><br><span class="line">.c.o:</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(CC) -o <span class="variable">$@</span> -c $(CFLAGS) $*.c</span><br><span class="line"></span><br><span class="line"><span class="comment"># A little more adventurous.  Allow full opt on </span></span><br><span class="line"><span class="comment"># mediation_integrate.o \</span></span><br><span class="line"><span class="comment"># shift_domain_em.o \</span></span><br><span class="line"><span class="comment"># solve_em.o  &lt;-- gets a little kick from SOLVE_EM_SPECIAL too, if defined</span></span><br><span class="line"><span class="comment"># mediation_feedback_domain.o : mediation_feedback_domain.F</span></span><br><span class="line"><span class="comment"># mediation_force_domain.o : mediation_force_domain.F</span></span><br><span class="line"><span class="comment"># mediation_interp_domain.o : mediation_interp_domain.F</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># compile these without high optimization to speed compile</span></span><br><span class="line">track_driver.o : track_driver.F</span><br><span class="line">convert_nmm.o : convert_nmm.F</span><br><span class="line">init_modules_em.o : init_modules_em.F</span><br><span class="line">input_wrf.o : input_wrf.F</span><br><span class="line">module_io.o : module_io.F</span><br><span class="line">module_comm_dm.o : module_comm_dm.F</span><br><span class="line">module_comm_dm_0.o : module_comm_dm_0.F</span><br><span class="line">module_comm_dm_1.o : module_comm_dm_1.F</span><br><span class="line">module_comm_dm_2.o : module_comm_dm_2.F</span><br><span class="line">module_comm_dm_3.o : module_comm_dm_3.F</span><br><span class="line">module_comm_nesting_dm.o : module_comm_nesting_dm.F</span><br><span class="line">module_configure.o : module_configure.F</span><br><span class="line">module_domain.o : module_domain.F</span><br><span class="line">module_domain_type.o : module_domain_type.F</span><br><span class="line">module_tiles.o : module_tiles.F</span><br><span class="line">module_initialize.o : module_initialize.F</span><br><span class="line">module_physics_init.o : module_physics_init.F </span><br><span class="line">module_initialize_squall2d_x.o : module_initialize_squall2d_x.F</span><br><span class="line">module_initialize_squall2d_y.o : module_initialize_squall2d_y.F</span><br><span class="line">module_initialize_scm_xy.o : module_initialize_scm_xy.F</span><br><span class="line">module_integrate.o : module_integrate.F</span><br><span class="line">module_io_mm5.o : module_io_mm5.F</span><br><span class="line">module_io_wrf.o : module_io_wrf.F</span><br><span class="line">module_si_io.o : module_si_io.F</span><br><span class="line">module_wps_io_arw.o : module_wps_io_arw.F</span><br><span class="line">module_state_description.o : module_state_description.F </span><br><span class="line">output_wrf.o : output_wrf.F</span><br><span class="line">solve_interface.o : solve_interface.F</span><br><span class="line">start_domain.o : start_domain.F</span><br><span class="line">wrf_bdyin.o : wrf_bdyin.F</span><br><span class="line">wrf_bdyout.o : wrf_bdyout.F</span><br><span class="line">wrf_ext_read_field.o : wrf_ext_read_field.F</span><br><span class="line">wrf_ext_write_field.o : wrf_ext_write_field.F</span><br><span class="line">wrf_fddaobs_in.o : wrf_fddaobs_in.F</span><br><span class="line">wrf_histin.o : wrf_histin.F</span><br><span class="line">wrf_histout.o : wrf_histout.F</span><br><span class="line">wrf_inputin.o : wrf_inputin.F</span><br><span class="line">wrf_inputout.o : wrf_inputout.F</span><br><span class="line">wrf_restartin.o : wrf_restartin.F</span><br><span class="line">wrf_restartout.o : wrf_restartout.F</span><br><span class="line">wrf_tsin.o : wrf_tsin.F</span><br><span class="line">nl_get_0_routines.o : nl_get_0_routines.F</span><br><span class="line">nl_get_1_routines.o : nl_get_1_routines.F</span><br><span class="line">nl_set_0_routines.o : nl_set_0_routines.F</span><br><span class="line">nl_set_1_routines.o : nl_set_1_routines.F</span><br><span class="line"></span><br><span class="line">track_driver.o \</span><br><span class="line">convert_nmm.o \</span><br><span class="line">init_modules_em.o \</span><br><span class="line">module_initialize.o \</span><br><span class="line">module_initialize_squall2d_x.o \</span><br><span class="line">module_initialize_squall2d_y.o \</span><br><span class="line">module_initialize_scm_xy.o \</span><br><span class="line">module_integrate.o \</span><br><span class="line">module_io_mm5.o \</span><br><span class="line">module_io_wrf.o \</span><br><span class="line">module_si_io.o \</span><br><span class="line">module_wps_io_arw.o \</span><br><span class="line">module_tiles.o \</span><br><span class="line">output_wrf.o \</span><br><span class="line">solve_interface.o \</span><br><span class="line">start_domain.o \</span><br><span class="line">wrf_fddaobs_in.o \</span><br><span class="line">wrf_tsin.o :</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(SED_FTN) $*.F &gt; $*.b </span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $(OMPCPP) $*.b  &gt; $*.f90</span><br><span class="line">$(RM) $*.b</span><br><span class="line">@ <span class="keyword">if</span> <span class="built_in">echo</span> $(ARCHFLAGS) | $(FGREP) <span class="string">&#x27;DVAR4D&#x27;</span>; <span class="keyword">then</span> \</span><br><span class="line">          <span class="built_in">echo</span> COMPILING $*.F <span class="keyword">for</span> 4DVAR ; \</span><br><span class="line">          $(WRF_SRC_ROOT_DIR)/var/build/da_name_space.pl $*.f90 &gt; $*.f90.tmp ; \</span><br><span class="line">          <span class="built_in">mv</span> $*.f90.tmp $*.f90 ; \</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">$(FC) -c $(PROMOTION) $(FCNOOPT) $(FCBASEOPTS) $(MODULE_DIRS) $(FCSUFFIX) $(OMP) $*.f90</span><br><span class="line"></span><br><span class="line"><span class="comment">#solve_em.o :</span></span><br><span class="line"><span class="comment">#$(RM) $@</span></span><br><span class="line"><span class="comment">#$(SED_FTN) $*.F &gt; $*.b </span></span><br><span class="line"><span class="comment">#$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $*.b  &gt; $*.f90</span></span><br><span class="line"><span class="comment">#$(RM) $*.b</span></span><br><span class="line"><span class="comment">#$(FC) -o $@ -c $(FCFLAGS) $(MODULE_DIRS) $(PROMOTION) $(FCSUFFIX) $(SOLVE_EM_SPECIAL) $(OMP) $*.f90</span></span><br><span class="line"></span><br><span class="line">module_sf_ruclsm.o : module_sf_ruclsm.F</span><br><span class="line"></span><br><span class="line">module_sf_ruclsm.o :</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(SED_FTN) $*.F &gt; $*.b </span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $(OMPCPP) $*.b  &gt; $*.f90</span><br><span class="line">$(RM) $*.b</span><br><span class="line">$(FC) -c $(PROMOTION) $(FCREDUCEDOPT) $(FCBASEOPTS) $(MODULE_DIRS) $(FCSUFFIX) $(OMP) $*.f90</span><br><span class="line"></span><br><span class="line">input_wrf.o \</span><br><span class="line">module_domain.o \</span><br><span class="line">module_domain_type.o \</span><br><span class="line">module_physics_init.o \</span><br><span class="line">module_io.o \</span><br><span class="line">wrf_bdyin.o \</span><br><span class="line">wrf_bdyout.o \</span><br><span class="line">wrf_ext_read_field.o \</span><br><span class="line">wrf_ext_write_field.o \</span><br><span class="line">wrf_histin.o \</span><br><span class="line">wrf_histout.o \</span><br><span class="line">wrf_inputin.o \</span><br><span class="line">wrf_inputout.o \</span><br><span class="line">wrf_restartin.o \</span><br><span class="line">wrf_restartout.o \</span><br><span class="line">module_state_description.o \</span><br><span class="line">module_comm_dm.o \</span><br><span class="line">module_comm_dm_0.o \</span><br><span class="line">module_comm_dm_1.o \</span><br><span class="line">module_comm_dm_2.o \</span><br><span class="line">module_comm_dm_3.o \</span><br><span class="line">module_comm_nesting_dm.o \</span><br><span class="line">module_configure.o :</span><br><span class="line">$(RM) <span class="variable">$@</span></span><br><span class="line">$(CPP) -I$(WRF_SRC_ROOT_DIR)/inc $(CPPFLAGS) $(OMPCPP) $*.F  &gt; $*.bb</span><br><span class="line">$(SED_FTN) $*.bb | $(CPP) $(TRADFLAG) &gt; $*.f90</span><br><span class="line">@ <span class="keyword">if</span> <span class="built_in">echo</span> $(ARCHFLAGS) | $(FGREP) <span class="string">&#x27;DVAR4D&#x27;</span>; <span class="keyword">then</span> \</span><br><span class="line">          <span class="built_in">echo</span> COMPILING $*.F <span class="keyword">for</span> 4DVAR ; \</span><br><span class="line">          $(WRF_SRC_ROOT_DIR)/var/build/da_name_space.pl $*.f90 &gt; $*.f90.tmp ; \</span><br><span class="line">          <span class="built_in">mv</span> $*.f90.tmp $*.f90 ; \</span><br><span class="line">        <span class="keyword">fi</span></span><br><span class="line">$(RM) $*.b $*.bb</span><br><span class="line">$(FC) -c $(PROMOTION) $(FCSUFFIX) $(FCNOOPT) $(FCBASEOPTS) $(MODULE_DIRS) $(OMP) $*.f90</span><br></pre></td></tr></table></figure><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 模拟编译</span></span><br><span class="line">[scc@node1 WRF-4.7.1]$ ./compile em_real &gt;&amp; log.compile</span><br><span class="line">[scc@node1 WRF-4.7.1]$ <span class="built_in">cat</span> log.compile</span><br><span class="line">-bash: ./compile: 无法执行：找不到需要的文件</span><br><span class="line"><span class="comment"># 发现 compile 为 csh 脚本，下载 csh</span></span><br><span class="line">[scc@node1 WRF-4.7.1]$ <span class="built_in">sudo</span> dnf install -y tcsh</span><br><span class="line">[scc@node1 WRF-4.7.1]$ csh ./compile em_real &gt;&amp; log.compile</span><br><span class="line">make: libwrfio_nf.a: 没有那个文件或目录</span><br><span class="line">make: *** [makefile:20：libwrfio_nf.a] 错误 127</span><br><span class="line"><span class="comment"># 错误：说明没有 libwrfio_nf.a 文件（位于 WRF-4.7.1/external/io_netcdf），进行手动编译</span></span><br><span class="line">[scc@node1 io_netcdf]$ make \</span><br><span class="line">&gt;   CC=gcc \</span><br><span class="line">&gt;   FC=mpif90 \</span><br><span class="line">&gt;   CFLAGS=<span class="string">&quot;-w -O3 -I/data/software/install/netcdf/c/4.9.3/include -I../ioapi_share&quot;</span> \</span><br><span class="line">&gt;   FFLAGS=<span class="string">&quot;-w -O2 -ffree-form -ffree-line-length-none -fallow-argument-mismatch -I/data/software/install/netcdf/c/4.9.3/include -I/data/software/install/netcdf/fortran/4.6.2/include -I../ioapi_share&quot;</span> \</span><br><span class="line">&gt;   LDFLAGS=<span class="string">&quot;-L/data/software/install/netcdf/fortran/4.6.2/lib -lnetcdff -L/data/software/install/netcdf/c/4.9.3/lib -lnetcdf&quot;</span> \</span><br><span class="line">&gt;   NETCDFPATH=/data/software/install/netcdf/c/4.9.3 \</span><br><span class="line">&gt;   all</span><br><span class="line"><span class="comment"># 打包，更新索引</span></span><br><span class="line">[scc@node1 io_netcdf]$ ar cr libwrfio_nf.a wrf_io.o field_routines.o module_wrfsi_static.o</span><br><span class="line">[scc@node1 io_netcdf]$ ranlib libwrfio_nf.a</span><br><span class="line"><span class="comment"># 重新 ./compile，成功</span></span><br><span class="line">[scc@node1 WRF-4.7.1]$ csh ./compile em_real &gt;&amp; log.compile</span><br></pre></td></tr></table></figure><p>在 <code>log.compile</code> 文件末尾你应当能看到类似如下的 log：4 个 <code>exe</code> 文件正确输出。</p><p><img src="/img/src/2026-03-06-2.png" alt=""></p>]]></content>
    
    
    <summary type="html">🍵 在 Rocky Linux 10 下从零开始编译 WRF：依赖安装、环境配置与常见报错处理。</summary>
    
    
    
    <category term="技术文档" scheme="https://night-da.github.io/categories/%E6%8A%80%E6%9C%AF%E6%96%87%E6%A1%A3/"/>
    
    
    <category term="WRF" scheme="https://night-da.github.io/tags/WRF/"/>
    
  </entry>
  
  <entry>
    <title>计算机网络笔记：第 1 章</title>
    <link href="https://night-da.github.io/posts/d155facc.html/"/>
    <id>https://night-da.github.io/posts/d155facc.html/</id>
    <published>2026-03-03T16:00:00.000Z</published>
    <updated>2026-03-03T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><strong><font size = 4>🚥 计算机网络课程笔记导航</font></strong></p><ol><li><a href="night-da.github.io/posts/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C%E7%AC%AC1%E7%AB%A0">第 1 章 计算机网络和因特网</a> ⇦ 当前位置 🪂</li></ol></div><span class='p center logo large'>第 1 章 计算机网络和因特网</span><h2 id="1-什么是因特网">1 什么是因特网</h2><p>因特网是一个世界范围的计算机网络。</p><h3 id="1-1-具体构成描述">1.1 具体构成描述</h3><ul><li><strong>节点</strong><ul><li><strong>终端节点</strong>：主机（host）及其运行的应用程序</li><li><strong>中间节点</strong>：路由器（router）、交换机（switch）等网络交换设备</li></ul></li><li><strong>边（通信链路）</strong><ul><li><strong>接入网链路（Access Link）</strong>：主机连接到互联网的链路</li><li><strong>主干链路（Backbone Link）</strong>：路由器之间的链路</li></ul></li><li><strong>计算设备</strong>：数以亿计的互联设备<ul><li><strong>主机</strong>：运行网络应用程序</li></ul></li><li><strong>分组交换设备</strong>：路由器（router）和交换机（switch），用于转发分组（packets）</li><li><strong>通信链路</strong>：光纤、同轴电缆、无线电、卫星等</li><li><strong>协议</strong>：规范和控制消息的发送和接收<ul><li>如 TCP、IP、HTTP、FTP</li><li>对等层实体沟通的标准，包括报文格式、次序及传输动作</li></ul></li></ul><h3 id="1-2-服务描述">1.2 服务描述</h3><ul><li><strong>分布式应用</strong>：如 Web、VoIP、email、游戏、电子商务、社交网络, …</li><li><strong>套接字接口（socket interface）</strong><ul><li>将收发数据的应用与互联网连接起来</li><li>为应用提供服务选择，类似于邮政服务</li></ul></li></ul><h3 id="1-3-什么是协议">1.3 什么是协议</h3><p>协议定义了在两个或多个通信实体之间交换的消息格式和次序，以及在消息传输和接收或其他事件方面所采取的动作。</p><ul><li><strong>通信模式</strong><ul><li><strong>C/S 模式（Client/Server Model）</strong>：客户端请求服务，服务器响应<ul><li>如 Web 浏览器和服务器、Email 客户端和服务器</li></ul></li><li><strong>P2P 模式（Peer-to-Peer Model）</strong>：每个主机同时是客户端和服务器<br>-如 Gnutella、KaZaA、Emule</li></ul></li><li><strong>传输协议</strong><ul><li><strong>传输控制协议（TCP：Transmission Control Protocol）</strong><ul><li>可靠、保序的数据传输</li><li>流量控制和拥塞控制</li></ul></li><li><strong>用户数据报协议（UDP：User Datagram Protocol）</strong><ul><li>无连接、不可靠、不保序的数据传输</li><li>无流量控制和拥塞控制</li></ul></li></ul></li><li><strong>应用实例</strong><ul><li>使用 TCP：HTTP、FTP、Telnet、SMTP</li><li>使用 UDP：流媒体、远程会议、DNS、Internet 电话</li></ul></li></ul><p><strong>举例子：</strong> 一种人类协议和计算机网络协议：</p><p><img src="/img/src/2026-03-04-1.png" alt=""></p><h2 id="2-网络边缘">2 网络边缘</h2><p>网络边缘包括主机（端系统）及其运行的应用程序。主机有时又被进一步划分为两类：客户端（client）和服务器 （server）；服务器通常位于数据中心。</p><h3 id="2-1-接入网">2.1 接入网</h3><p>将端系统物理连接到其边缘路由器（edge router）的网络；分为有线接入和无线接入。</p><p><strong>线缆网络（Cable Network）</strong>：电缆（Cable）、光纤（Fiber）网络将<code>家庭</code>连接到 ISP 路由器</p><ul><li>有线电视信号线缆双向改造：在不同频段传输不同信道的数据，数字电视和上网数据（上下行）</li><li>光纤和同轴电缆：线缆和光纤将家庭用户接入到 ISP 路由器，各用户贡献到线缆头端的接入网络</li></ul><p><img src="/img/src/2026-03-04-2.png" alt=""></p><p><strong>单位接入网络（企业网络）</strong>：端系统直接连接在以太网交换机上（<code>公司、大学等机构</code>）</p><p><img src="/img/src/2026-03-04-3.png" alt=""></p><h3 id="2-2-物理媒介">2.2 物理媒介</h3><p><strong>导引性媒体（Guided Media）</strong></p><ul><li><strong>同轴电缆（Coaxial Cable）</strong>：两根同轴地铜导线、双向<ul><li>基带电缆（Baseband Cable）：电缆上有单个信道</li><li>宽带电缆（Broadband Cable）：电缆上有多个信道</li></ul></li><li><strong>光纤和光缆（Fiber Optics）</strong>：光脉冲，⼀个脉冲代表 1bit，高速、低误码率、安全</li></ul><p><strong>非导引性媒体（Unguided Media）</strong></p><ul><li><strong>无线电（Radio）</strong>：开放空间传输电磁波无需物理线缆<ul><li>传播环境效应：反射、吸收、干扰</li><li>类型：地面微波、WLAN（WiFi）、wide-area（蜂窝）、卫星</li></ul></li></ul><h2 id="3-网络核心">3 网络核心</h2><p><strong>定义：</strong> 由路由器构成的网状网络。</p><h3 id="3-1-分组交换">3.1 分组交换</h3><p><strong>分组交换（Packet Switching）：</strong> 主机将应用层消息分为多个分组（packets）</p><ul><li>将要传输的数据分成一个个单位（分组），以分组为单位进行存储、转发</li><li>将分组从一个路由器传到相邻路由器（Hop）一段段最终从源端传到目标端</li><li>在转发之前，节点必须收到<code>整个分组</code></li><li>排队延迟和丢失：如果分组到达速率高于链路传输速率，分组会排队等待传输；如果路由器缓存用完了，分组会被抛弃</li></ul><p><strong>分组交换的两个核心功能</strong></p><ul><li><strong>路由（Routing）</strong>：用路由算法决定分组采用的从源到目标的路径</li><li><strong>转发（Forwarding）</strong>：将分组从路由器的输入链路转移到输出链路</li></ul><h3 id="3-2-电路交换">3.2 电路交换</h3><p><strong>电路交换（Circuit Switching）：</strong> 为每个路由/路径分配一个特定的线路</p><ul><li>为每个呼叫预留专有电路</li><li>独享资源，适合电话网</li><li>不适合计算机通信，因连接建立时间长、资源浪费</li><li>网络资源被分成片，有频分（Frequency Division）、时分（Time Division），为呼叫分配片，如果某呼叫没有数据，则其资源片处于空闲状态</li></ul><p><img src="/img/src/2026-03-04-4.png" alt=""></p><h3 id="3-3-网络的网络">3.3 网络的网络</h3><p><strong>ISP（Internet Service Provider）</strong>：向用户提供互联网接入和服务的公司或组织</p><ul><li>ISP 之间必须进行互联：任何两台主机都可以互相发送数据包</li><li>由此产生的网络嵌套非常复杂（网络的网络），且受经济和国家政策驱动影响而演化</li></ul><p>端系统通过<code>接入 ISP</code>链接到互联网，接入 ISP 是互相连接的；每个 ISP 都连接到<code>全局 ISP</code>（Global ISP），接入 ISP 和全局 ISP 往往有经济合约。</p><ul><li><strong>对等连接（Peering Connection）</strong>：对等连接是指两个或多个 ISP 之间直接互联，以交换流量，而不通过第三方网络。</li></ul><p><img src="/img/src/2026-03-04-5.png" alt=""></p><h2 id="4-分组交换网的时延、丢包和吞吐量">4 分组交换网的时延、丢包和吞吐量</h2><h3 id="4-1-分组交换网中的时延">4.1 分组交换网中的时延</h3><p><strong>分组延时（Packet Delay）</strong>：当分组从一个节点 （主机或路由器）时沿着这条路径到后继节点（主机或路由器）时，该分组在沿途的每个节点经受了 4 种不同类型的时延。</p><ol><li>（节点）处理延时：检查 bit 级差错，检查分组头部并决定将分组导向何处。</li><li>排队延时：在输出链路上等待传输的时间，依赖于路由器的拥塞程度。</li><li>传输延时：$T_{trans} = \frac{L}{R}$，其中 $R$ 是链路带宽（bps），$L$ 是分组长度（bits）。</li><li>传播延时：$T_{trans} = \frac{L}{R}$，其中 $d$ 是物理链路的长度（km），$s$ 是媒介传输速度（km/s）。</li></ol><p><strong>节点延时</strong>：$d_{nodal} = d_{proc} + d_{queue} + d_{trans} + d_{prop}$</p><h3 id="4-2-排队时延和丢包">4.2 排队时延和丢包</h3><p><strong>流量强度</strong>：$I = \frac{La}{R}$（$a$：分组到达队列的平均速率），流量强度不能超过 1。</p><p><strong>分组丢失（Packet Loss）</strong>：由于链路的队列缓冲区容量有限，当分组到达⼀个满的队列时，该分组会丢失（<code>丢包</code>）。丢失的分组可能会被前⼀个节点或端系统重传，或根本不重传。</p><h3 id="4-3-计算机网络中的吞吐量">4.3 计算机网络中的吞吐量</h3><p><strong>定义</strong>：在源端和目标端之间的传输速率（数据量/单位时间）</p><ul><li>瞬间吞吐量（Instantaneous Throughput）：某一时刻的传输速率，反映当前网络的瞬时性能。</li><li>平均吞吐量（Average Throughput）：在一段时间内的平均传输速率，反映网络的整体性能。</li><li>瓶颈链路（Bottleneck Link）：端到端的路径上，限制端到端吞吐的链路。</li></ul><p><img src="/img/src/2026-03-04-6.png" alt=""></p><h2 id="5-协议层次及其服务模型">5 协议层次及其服务模型</h2><h3 id="5-1-分层的体系结构">5.1 分层的体系结构</h3><p><strong>层次化方式实现复杂网络功能</strong></p><ul><li>将网络复杂的功能分成功能明确的分层次，每一层实现其中一组功能，功能中有其上层可以使用的功能：<code>服务</code>。</li><li>本层协议实体相互交互执行本层的协议动作，目的是实现本层功能，通过接口为上层提供更好的服务。</li><li>在实现本层协议的时候，直接利用了下层所提供的服务。</li></ul><p><strong>服务（Service）</strong>：下层实体向上层实体提供的它们之间通信的能力。</p><p><strong>原语（Primitive）</strong>：上层使用下层服务的形式，上层使用下层提供的服务以及下层向上层提供服务的都是通过服务访问原语来进行交互的。</p><p><strong>服务访问点（Service Access Point）</strong>：上层使用下层提供的服务通过的层间接口，用于下层服务区分不同的上层用户。</p><ul><li>传输层的 SAP：端口（Port）</li><li>邮箱的 SAP：地址（Address）</li></ul><p><strong>服务类型</strong></p><ul><li><strong>面向连接的服务（Connection-Oriented Service）</strong>：建立连接、通信、拆除连接，网络层的连接成为虚电路，适合传输大的数据块。</li><li><strong>无连接的服务（Connectionless Service）</strong>：两个对等层实体在通信前不需要建立连接，适用于传输。</li></ul><p><strong>互联网协议栈</strong></p><ol><li><strong>应用层（Application Layer）</strong>：为应用进程提供网络应用服务，如 FTP、SMTP、HTTP、DNS。</li><li><strong>传输层（Transport Layer）</strong>：在网络层提供的端到端通信基础上，细分为<code>进程到进程</code>的通信，如 TCP 和 UDP。</li><li><strong>网络层（Network Layer）</strong>：为数据报从源主机到目标主机选择路由，传输以分组为单位的<code>端到端</code>的数据，如 IP、路由协议。</li><li><strong>链路层（Link Layer）</strong>：<code>相邻 2 个</code>网络节点之间传输以<code>帧</code>为单位的数据，如点对点协议、802.11（WiFi）、Ethernet。</li><li><strong>物理层（Physical Layer）</strong>：在线路上传输 bit。</li></ol><p><strong>OSI 模型</strong>：比互联网协议栈多了表示层（Presentation Layer）和会话层（Session Layer）</p><ul><li><strong>表示层（Presentation Layer）</strong>：允许应用解释传输的数据，加密、压缩、机器相关的表示转换。</li><li><strong>会话层（Session Layer）</strong>：数据交换的同步、检查点、恢复。</li></ul><p><img src="/img/src/2026-03-04-7.png" alt=""></p><h3 id="5-2-封装">5.2 封装</h3><p><strong>数据单元（Data Unit）</strong></p><ul><li><strong>服务数据单元（Service Data Unit, SDU）</strong>：某一层从上层接收到的数据单元，是该层需要处理或传输的<code>有效载荷（Payload）</code>。</li><li><strong>协议数据单元（Protocol Data Unit, PDU）</strong>：头部 + 服务数据单元；如果服务数据很大，可能被拆成多份并分别加上头部；如果服务数据很小，可能和多个服务数据合成一份并加上头部。</li></ul><p><strong>各层的协议数据单元的名称</strong></p><p>不同协议层次对 PDU 的命名不同。</p><ol><li><strong>应用层（Application Layer）</strong>：报文（message）</li><li><strong>传输层（Transport Layer）</strong>：报文段（segment，TCP）或数据报（datagram，UDP）</li><li><strong>网络层（Network Layer）</strong>：（IP）分组（packet，有连接）或数据报（datagram，无连接）</li><li><strong>链路层（Link Layer）</strong>：帧（frame）</li><li><strong>物理层（Physical Layer）</strong>：位（bit）</li></ol><p><strong>封装过程：</strong></p><div class="tabs" id="分栏"><ul class="nav-tabs"><li class="tab active"><button type="button" data-href="#分栏-1">应用层</button></li><li class="tab"><button type="button" data-href="#分栏-2">传输层</button></li><li class="tab"><button type="button" data-href="#分栏-3">网络层</button></li><li class="tab"><button type="button" data-href="#分栏-4">链路层</button></li><li class="tab"><button type="button" data-href="#分栏-5">物理层</button></li></ul><div class="tab-contents"><div class="tab-item-content active" id="分栏-1"><p><img src="/img/src/2026-03-04-8.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-2"><p><img src="/img/src/2026-03-04-9.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-3"><p><img src="/img/src/2026-03-04-10.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-4"><p><img src="/img/src/2026-03-04-11.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div><div class="tab-item-content" id="分栏-5"><p><img src="/img/src/2026-03-04-12.png" alt=""></p><button type="button" class="tab-to-top" aria-label="scroll to top"><i class="fas fa-arrow-up"></i></button></div></div></div>]]></content>
    
    
    <summary type="html">计算机网络笔记：第 1 章</summary>
    
    
    
    <category term="学习笔记" scheme="https://night-da.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="计算机网络" scheme="https://night-da.github.io/tags/%E8%AE%A1%E7%AE%97%E6%9C%BA%E7%BD%91%E7%BB%9C/"/>
    
  </entry>
  
  <entry>
    <title>操作系统笔记：第 1 章</title>
    <link href="https://night-da.github.io/posts/668058a3.html/"/>
    <id>https://night-da.github.io/posts/668058a3.html/</id>
    <published>2026-03-02T16:00:00.000Z</published>
    <updated>2026-03-02T16:00:00.000Z</updated>
    
    <content type="html"><![CDATA[<div class="note info no-icon flat"><p><strong><font size = 4>🚥 操作系统课程笔记导航</font></strong></p><ol><li><a href="night-da.github.io/posts/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F%E7%AC%AC1%E7%AB%A0">第 1 章 操作系统概述</a> ⇦ 当前位置 🪂</li></ol></div><span class='p center logo large'>第 1 章 操作系统概述</span><h2 id="1-什么是操作系统">1 什么是操作系统</h2><p>操作系统有两个职责：一是对<code>硬件进行管理和抽象</code>，二是<code>为应用提供服务并进行管理</code>。操作系统的核心功能是将有限的、离散的资源高效地抽象为无限的、连续的资源，将硬件通过易用的接口提供给上层应用，从而使应用开发者和用户无需过多考虑繁琐的硬件细节。</p><p>随着硬件种类和应用需求变得越来越丰富，大量的共性功能沉淀到操作系统中，使操作系统的内涵和外延不断扩大。可以将操作系统分为<code>内核</code>、<code>系统服务</code>与<code>应用框架</code>三层，后两者统称为<code>操作系统框架</code>。</p><p>操作系统内核负责对硬件资源的管理和抽象，为操作系统框架提供基础的系统服务。系统服务则基于操作系统内核提供的功能进行进一步抽象和封装，从而方便上层应用框架的设计与开发。应用框架基于系统服务提供的功能，结合应用领域的特点，提供应用开发与运行的共性功能，从而方便开发者开发与管理。</p><p><img src="/img/src/2026-03-03-1.png" alt=""></p><h2 id="2-操作系统简史">2 操作系统简史</h2><ul><li><strong>GM-NAA I/O：批处理操作系统</strong>：1956 年，IBM704 上现了第一个实际使用的操作系统 <code>GM-NAA I/O</code>。该系统主要是对输出和输出的自动化管理，该系统解放了 “操作员”，因此该系统就被称作 “操作系统”，操作系统的名字由此而来。GM-NAA I/O 是一个<code>批处理操作系统</code>。</li><li><strong>OS/360：从专用走向通用</strong>：1964 年，IBM 发布了名为 IBM System/360 的大型机。该计算机实现了两大突破：(1) 通过定义指令集架构，将计算机架构与实现进行解耦。(2) 将操作系统与底层硬件解耦，操作系统从而进入了通用时代。</li><li><strong>Multics/UNIX/Linux：分时与多任务</strong>：Multics 的理念非常先进，使用了分时，将文件与内存进行分离的概念，也提出了文件系统、动态链接、硬件热替换、特权级分层等开创性概念。曾经参与过 Multics 项目 Ken Thompson 写了 UNIX，在 UNIX 中引入了 <code>shell</code>，并且支持管道（pipe）等进程间通信方式。Dennis Ritchie 于1972~1973年设计实现了 C 语言，并用 C 语言重写了 UNIX。由于 UNIX 系统版权复杂且收费，Andrew S. Tanenbaum 教授在1987年开源了用于教学版的 MINIX 操作系统。1991 年，Linus Torvalds 在 MINIX 基础上设计了 Linux 操作系统，Linux 成为目前世界上最成功的开源操作系统。</li><li><strong>macOS/Windows，以人为本的人机交互</strong>：最早有图形用户界面（GUI）的操作系统是 1973 年施乐公司 Xerox PARC 的 Alto 计算机。1979 年，苹果公司开发了著名的 Macintosh 系列个人计算机，后来微软开发了基于图形界面的操作系统 Windows。</li><li><strong>iOS/Androd，移动互联网时代的操作系统</strong>：2007 年苹果发布了第一代 iPhone，标志着 iOS 操作系统的诞生。iOS 的设计很大程度上复用了 macOS 的功能，针对 iPhone 等触屏设备进行了重新设计与优化。2005 年谷歌公司发布了 Android1.0 操作系统，Android 采用开源的方式构建生态，使得 Android 在移动互联网时代的操作系统中占据主流地位。</li></ul><h2 id="3-操作系统接口">3 操作系统接口</h2><p>操作系统的演进过程中形成了一些相对稳定的接口。越是下层的接口数量相对更少，变动相对不频繁，越是上层的接口数量相对更多，变化相对更频繁。</p><ul><li><strong>系统调用接口（System Call）</strong>：应用程序通过操作系统内核提供的接口向内核申请服务，这些接口通常称为系统调用接口。</li><li><strong>POSIX 接口</strong>：由于每个操作系统提供的系统调用接口各不相同，为了实现同一应用程序在不同操作系统上的<code>可移植性</code>，逐渐形成了一些接口标准。POSIX 接口是其中应用最广泛的一个，POSIX 标准通常通过 C 语言库实现。</li><li><strong>领域应用接口</strong>：在 POSIX 或系统调用接口的基础上，还可以封装面向不同领域的应用，可以更方便应用的开发。例如汽车行业的 AUTOSAR 接口，安卓的应用框架等。</li></ul><p><img src="/img/src/2026-03-03-2.png" alt=""></p>]]></content>
    
    
    <summary type="html">操作系统笔记：第 1 章</summary>
    
    
    
    <category term="学习笔记" scheme="https://night-da.github.io/categories/%E5%AD%A6%E4%B9%A0%E7%AC%94%E8%AE%B0/"/>
    
    
    <category term="操作系统" scheme="https://night-da.github.io/tags/%E6%93%8D%E4%BD%9C%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
</feed>
