<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-CN"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://blog.565455.xyz/feed.xml" rel="self" type="application/atom+xml" /><link href="https://blog.565455.xyz/" rel="alternate" type="text/html" hreflang="zh-CN" /><updated>2026-06-03T22:07:37+08:00</updated><id>https://blog.565455.xyz/feed.xml</id><title type="html">FANCC的博客</title><subtitle>存放FANCC的无尽创意</subtitle><entry><title type="html">业余无线电(1)</title><link href="https://blog.565455.xyz/posts/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5(1)/" rel="alternate" type="text/html" title="业余无线电(1)" /><published>2026-06-03T21:38:00+08:00</published><updated>2026-06-03T21:38:00+08:00</updated><id>https://blog.565455.xyz/posts/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5(1)</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E4%B8%9A%E4%BD%99%E6%97%A0%E7%BA%BF%E7%94%B5(1)/"><![CDATA[<h2 id="业余无线电通信">业余无线电通信</h2>

<blockquote>
  <p>业余爱好是人类社会进步的产物，是社会文明进步的标志。</p>

  <p>——《业余无线电通信》第六版 卷首语</p>
</blockquote>

<p>兴趣使然，我将会在博客里持续更新读这本书的笔记和心得，我们开始吧！</p>

<h2 id="波段划分">波段划分</h2>

<p>3000GHz以下，不通过导线、电缆或人工波导等传输媒介，在空间中辐射传播的电磁波是<strong>无线电波</strong>。</p>

<p>其在空间中传波的速度是$3 \times 10^8m/s$，频率单位是赫兹，波长单位是米，满足公式</p>

\[c=\lambda \times f\]

<table>
  <thead>
    <tr>
      <th>段号</th>
      <th>频率名称</th>
      <th>频率范围</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>1</td>
      <td>极低频</td>
      <td>3~30Hz</td>
    </tr>
    <tr>
      <td>2</td>
      <td>超低频</td>
      <td>30~300Hz</td>
    </tr>
    <tr>
      <td>3</td>
      <td>特低频</td>
      <td>300~3000Hz</td>
    </tr>
    <tr>
      <td>4</td>
      <td>甚低频</td>
      <td>3~30kHz</td>
    </tr>
    <tr>
      <td>5</td>
      <td>低频</td>
      <td>30~300kHz</td>
    </tr>
    <tr>
      <td>6</td>
      <td>中频</td>
      <td>300~3000kHz</td>
    </tr>
    <tr>
      <td>7</td>
      <td>高频</td>
      <td>3~30MHz</td>
    </tr>
    <tr>
      <td>8</td>
      <td>甚高频</td>
      <td>30~300MHz</td>
    </tr>
    <tr>
      <td>9</td>
      <td>特高频</td>
      <td>300~3000MHz</td>
    </tr>
    <tr>
      <td>10</td>
      <td>超高频</td>
      <td>3~30GHz</td>
    </tr>
    <tr>
      <td>11</td>
      <td>极高频</td>
      <td>30~300GHz</td>
    </tr>
    <tr>
      <td>12</td>
      <td>至高频</td>
      <td>300~3000GHz</td>
    </tr>
  </tbody>
</table>

<p>可以看到命名规则按照：甚特超级(至)的顺序。段号增加，对应的频率段指数级增长。</p>

<p>中国属于ITU第3区，可用的业余频段请查表。</p>

<h2 id="业余电台分区">业余电台分区</h2>

<h2 id="业余电台呼号">业余电台呼号</h2>

<p>未完待续。</p>]]></content><author><name></name></author><category term="文档" /><category term="无线电" /><summary type="html"><![CDATA[业余无线电通信]]></summary></entry><entry><title type="html">摩斯电码Puzzle</title><link href="https://blog.565455.xyz/posts/%E6%91%A9%E6%96%AF%E7%94%B5%E7%A0%81Puzzle/" rel="alternate" type="text/html" title="摩斯电码Puzzle" /><published>2026-05-30T18:35:00+08:00</published><updated>2026-05-30T18:35:00+08:00</updated><id>https://blog.565455.xyz/posts/%E6%91%A9%E6%96%AF%E7%94%B5%E7%A0%81Puzzle</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E6%91%A9%E6%96%AF%E7%94%B5%E7%A0%81Puzzle/"><![CDATA[<h2 id="题目">题目</h2>

<p>现在有一个<code class="language-plaintext highlighter-rouge">puzzle.mp3</code>音频，请尝试从中破解出有效信息。</p>

<p>下载音频地址：<a href="https://cdn.happyfan.cc.cd/ctf/puzzle.mp3" target="_blank">puzzle download</a></p>

<p>题目不难但是需要一些技巧解决。</p>

<p>如果您想先自己尝试，请不要翻开下方题解。</p>

<p>如果您想先自己尝试，请不要翻开下方题解。</p>

<p>如果您想先自己尝试，请不要翻开下方题解。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/83a8b1cafaa05dd02e0bc9c775752f87.png" alt="Img" /></p>

<h2 id="题解">题解</h2>

<p>下载音频后我们使用<code class="language-plaintext highlighter-rouge">ffprobe</code>分析音频采样率，声道数量，和量化位深。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>fcc@MacBook-Pro pywave % ffprobe puzzle.mp3
ffprobe version 8.0.1-tessus  https://evermeet.cx/ffmpeg/  Copyright <span class="o">(</span>c<span class="o">)</span> 2007-2025 the FFmpeg developers
  built with Apple clang version 17.0.0 <span class="o">(</span>clang-1700.4.4.1<span class="o">)</span>...
Input <span class="c">#0, mp3, from 'puzzle.mp3':</span>
  Metadata:
    encoder         : Lavf62.3.100
  Duration: 00:00:17.22, start: 0.025057, bitrate: 192 kb/s
  Stream <span class="c">#0:0: Audio: mp3 (mp3float), 44100 Hz, mono, fltp, 192 kb/s, start 0.025057</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>我们得到一些基本信息，音频是mp3格式，采样率44100Hz，单声道，32-bit浮点。打开听就是普通的摩斯电码滴答声，速度很快，边听边记有些困难，我们尝试使用python程序处理。</p>

<p>由于这里时域数据比频域数据更加重要，我们用<code class="language-plaintext highlighter-rouge">ffmpeg</code>把音频转换成<code class="language-plaintext highlighter-rouge">wav</code>波形格式进行处理。</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>ffmpeg <span class="nt">-i</span> puzzle.mp3 z2.wav
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>fcc@MacBook-Pro pywave % ffprobe z2.wav    
ffprobe version 8.0.1-tessus  https://evermeet.cx/ffmpeg/  Copyright <span class="o">(</span>c<span class="o">)</span> 2007-2025 the FFmpeg developers
  built with Apple clang version 17.0.0 <span class="o">(</span>clang-1700.4.4.1<span class="o">)</span>...
Input <span class="c">#0, wav, from 'z2.wav':</span>
  Metadata:
    encoder         : Lavf62.3.100
  Duration: 00:00:17.22, bitrate: 705 kb/s
  Stream <span class="c">#0:0: Audio: pcm_s16le ([1][0][0][0] / 0x0001), 44100 Hz, 1 channels, s16, 705 kb/s</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>现在我们得到了采样率44100Hz，单声道，<strong>16-bit</strong>的音频。</p>

<p>我们用<code class="language-plaintext highlighter-rouge">matplotlib</code>把波形画出来。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">wave</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">matplotlib</span> <span class="kn">import</span> <span class="n">pyplot</span> <span class="k">as</span> <span class="n">plt</span>

<span class="k">def</span> <span class="nf">read_wav_8bit</span><span class="p">(</span><span class="n">filepath</span><span class="p">):</span>
    <span class="k">with</span> <span class="n">wave</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">wf</span><span class="p">:</span>
        <span class="n">n_channels</span> <span class="o">=</span> <span class="n">wf</span><span class="p">.</span><span class="nf">getnchannels</span><span class="p">()</span>       <span class="c1"># 声道数
</span>        <span class="n">sample_width</span> <span class="o">=</span> <span class="n">wf</span><span class="p">.</span><span class="nf">getsampwidth</span><span class="p">()</span>      <span class="c1"># 每个样本的字节数
</span>        <span class="n">framerate</span> <span class="o">=</span> <span class="n">wf</span><span class="p">.</span><span class="nf">getframerate</span><span class="p">()</span>         <span class="c1"># 采样率
</span>        <span class="n">n_frames</span> <span class="o">=</span> <span class="n">wf</span><span class="p">.</span><span class="nf">getnframes</span><span class="p">()</span>            <span class="c1"># 总帧数
</span>        <span class="n">raw_data</span> <span class="o">=</span> <span class="n">wf</span><span class="p">.</span><span class="nf">readframes</span><span class="p">(</span><span class="n">n_frames</span><span class="p">)</span>    <span class="c1"># 原始字节数据
</span>    <span class="c1"># 将字节数据转换为 numpy 数组
</span>    <span class="k">if</span> <span class="n">sample_width</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
        <span class="c1"># 8-bit: 无符号整数 [0, 255]
</span>        <span class="n">audio_data</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">frombuffer</span><span class="p">(</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">sample_width</span> <span class="o">==</span> <span class="mi">2</span><span class="p">:</span>
        <span class="c1"># 16-bit: 无符号整数 [0, 65535]
</span>        <span class="n">audio_data</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">frombuffer</span><span class="p">(</span><span class="n">raw_data</span><span class="p">,</span> <span class="n">dtype</span><span class="o">=</span><span class="n">np</span><span class="p">.</span><span class="n">uint16</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">raise</span> <span class="nc">ValueError</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">不支持的样本宽度: </span><span class="si">{</span><span class="n">sample_width</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">framerate</span><span class="p">,</span> <span class="n">n_channels</span><span class="p">,</span> <span class="n">sample_width</span><span class="p">,</span> <span class="n">audio_data</span>

<span class="n">framerate</span><span class="p">,</span> <span class="n">n_channels</span><span class="p">,</span> <span class="n">sample_width</span><span class="p">,</span> <span class="n">audio_data</span> <span class="o">=</span> <span class="nf">read_wav_8bit</span><span class="p">(</span><span class="sh">"</span><span class="s">z2.wav</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">audio_data</span><span class="p">))</span>
<span class="n">look</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">audio_data</span><span class="p">))</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">look</span><span class="p">)</span> <span class="o">/</span> <span class="n">framerate</span><span class="p">,</span> <span class="n">audio_data</span><span class="p">[:</span><span class="n">look</span><span class="p">])</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">plot</span><span class="p">([</span><span class="mi">0</span><span class="p">,</span> <span class="n">look</span> <span class="o">/</span> <span class="n">framerate</span><span class="p">],</span> <span class="p">[</span><span class="mi">65535</span><span class="p">,</span> <span class="mi">65535</span><span class="p">],</span> <span class="n">color</span><span class="o">=</span><span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="p">)</span>
<span class="n">plt</span><span class="p">.</span><span class="nf">show</span><span class="p">()</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>我们同时在65535的高度画了一条红线，得到下图</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/d15a3883f3e89e1c26325dde51a9a6b3.png" alt="Img" /></p>

<p>那接下来就需要了解一些摩斯电码基础知识，摩斯电码由点(.)和杠(-)组成，点是摩斯电码时间标记的基本单位，记为一单位，以下是不同元素占用时长的单位数</p>

<ul>
  <li>点 1单位</li>
  <li>杠 3单位</li>
  <li>点杠间隔 1单位</li>
  <li>字母间隔 3单位</li>
  <li>词间隔 7单位</li>
</ul>

<p>显然，图中并没有7单位的间隔，说明根本没有词。我们可以把波形按照字母间隔，也就是3单位空白拆分，得到每个字母对应的摩斯电码，如下图。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/fb2dec0fdfde2069aa049d8da998c0a9.png" alt="Img" /></p>

<p>附上一张摩斯电码表。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/ab99696f089b11fc70a01776ce619159.png" alt="Img" /></p>

<p>这段音频有24个字母，一个个读写还是有点累，如果做的更多一些，我们可以用numpy再次对音频分析。</p>

<p>注意到这个音频的1单位对应的时长是60ms，也就是20wpm。</p>

<p>我们每次读取音频60ms的数据点，计算方差，然后将这组方差数据做归一化，方差大的组认定为有声音，方差小的组认定为无声音，我们这里使用0.9当做分界。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">wave</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="c1"># MorseTool是笔者自己写的
</span><span class="kn">from</span> <span class="n">MorseTool</span> <span class="kn">import</span> <span class="n">Morse</span>

<span class="n">framerate</span><span class="p">,</span> <span class="n">n_channels</span><span class="p">,</span> <span class="n">sample_width</span><span class="p">,</span> <span class="n">audio_data</span> <span class="o">=</span> <span class="nf">read_wav_8bit</span><span class="p">(</span><span class="sh">"</span><span class="s">z2.wav</span><span class="sh">"</span><span class="p">)</span>
<span class="n">ALEN</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">audio_data</span><span class="p">)</span>
<span class="n">FRAME_RATE</span> <span class="o">=</span> <span class="mi">44100</span> <span class="c1"># 44.1kHz
</span><span class="n">DURATION</span> <span class="o">=</span> <span class="mf">0.06</span> <span class="c1"># 60ms
</span>
<span class="c1"># 解码成0101
</span><span class="n">SEGMENT_LEN</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">DURATION</span> <span class="o">*</span> <span class="n">FRAME_RATE</span><span class="p">)</span>
<span class="n">SEGMENT_COUNT</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">ALEN</span> <span class="o">/</span> <span class="n">SEGMENT_LEN</span><span class="p">)</span>
<span class="nb">vars</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros</span><span class="p">(</span><span class="n">SEGMENT_COUNT</span><span class="p">)</span>
<span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">SEGMENT_COUNT</span><span class="p">):</span>
    <span class="n">segmentData</span> <span class="o">=</span> <span class="n">audio_data</span><span class="p">[</span><span class="n">i</span><span class="o">*</span><span class="n">SEGMENT_LEN</span><span class="p">:</span><span class="n">i</span><span class="o">*</span><span class="n">SEGMENT_LEN</span><span class="o">+</span><span class="n">SEGMENT_LEN</span><span class="p">]</span>
    <span class="nb">vars</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">var</span><span class="p">(</span><span class="n">segmentData</span><span class="p">)</span>
<span class="nb">vars</span> <span class="o">=</span> <span class="nb">vars</span> <span class="o">/</span> <span class="n">np</span><span class="p">.</span><span class="nf">max</span><span class="p">(</span><span class="nb">vars</span><span class="p">)</span>
<span class="n">condition</span> <span class="o">=</span> <span class="nb">vars</span> <span class="o">&gt;</span> <span class="p">.</span><span class="mi">9</span>
<span class="nb">vars</span><span class="p">[</span><span class="n">condition</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span>
<span class="nb">vars</span><span class="p">[</span><span class="o">~</span><span class="n">condition</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">zocode</span> <span class="o">=</span> <span class="nb">vars</span><span class="p">.</span><span class="nf">astype</span><span class="p">(</span><span class="nb">int</span><span class="p">).</span><span class="nf">tolist</span><span class="p">()</span>
<span class="n">zocode</span> <span class="o">=</span> <span class="nf">map</span><span class="p">(</span><span class="nb">str</span><span class="p">,</span> <span class="n">zocode</span><span class="p">)</span>
<span class="n">zostr</span> <span class="o">=</span> <span class="sh">""</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">zocode</span><span class="p">)</span>
<span class="c1"># zostr: 11101000101010111000101011100010111011100010...
</span>
<span class="k">def</span> <span class="nf">parse_all</span><span class="p">(</span><span class="n">zos</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="n">words</span> <span class="o">=</span> <span class="n">zos</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">0</span><span class="sh">"</span><span class="o">*</span><span class="mi">7</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="nf">parse_word</span><span class="p">(</span><span class="n">w</span><span class="p">)</span> <span class="k">for</span> <span class="n">w</span> <span class="ow">in</span> <span class="n">words</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">parse_word</span><span class="p">(</span><span class="n">zow</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="n">word</span> <span class="o">=</span> <span class="n">zow</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">0</span><span class="sh">"</span><span class="o">*</span><span class="mi">3</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="sh">""</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="nf">parse_char</span><span class="p">(</span><span class="n">c</span><span class="p">)</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">word</span><span class="p">])</span>
    <span class="k">return</span> <span class="n">result</span>
<span class="k">def</span> <span class="nf">parse_char</span><span class="p">(</span><span class="n">zoc</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
    <span class="n">bits</span> <span class="o">=</span> <span class="n">zoc</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">"</span><span class="s">0</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">result</span> <span class="o">=</span> <span class="sh">""</span>
    <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">bits</span><span class="p">:</span>
        <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">==</span> <span class="mi">1</span><span class="p">:</span>
            <span class="n">result</span> <span class="o">+=</span> <span class="sh">"</span><span class="s">.</span><span class="sh">"</span>
        <span class="k">elif</span> <span class="nf">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">==</span> <span class="mi">3</span><span class="p">:</span>
            <span class="n">result</span> <span class="o">+=</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="k">pass</span> <span class="c1"># never
</span>    <span class="n">char</span> <span class="o">=</span> <span class="p">[</span><span class="n">k</span> <span class="k">for</span> <span class="n">k</span><span class="p">,</span> <span class="n">v</span> <span class="ow">in</span> <span class="n">Morse</span><span class="p">.</span><span class="n">codes</span><span class="p">.</span><span class="nf">items</span><span class="p">()</span> <span class="k">if</span> <span class="n">v</span> <span class="o">==</span> <span class="n">result</span><span class="p">]</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">char</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="sh">""</span>
    <span class="k">return</span> <span class="n">char</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

<span class="n">secret</span> <span class="o">=</span> <span class="nf">parse_all</span><span class="p">(</span><span class="n">zostr</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="n">secret</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>像这样，按照7空位分词，3空位分字母，1空位分点杠，我们将摩斯电码音频解析完成。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>NVUWW5PFR6X6PCFR4WLLKIJB
</pre></td></tr></tbody></table></code></pre></div></div>

<p>这看上去仍然不是人话，说明还要二次加工，经验告诉我们这可能是<code class="language-plaintext highlighter-rouge">base64</code>或者<code class="language-plaintext highlighter-rouge">base32</code>编码，但是鉴于这段摩斯电码只有A-Z0-9这36个字符，<code class="language-plaintext highlighter-rouge">base32</code>的可能性更大。</p>

<p>接下来编写python脚本，将这串字符用<code class="language-plaintext highlighter-rouge">base32</code>转成字节，再用<code class="language-plaintext highlighter-rouge">utf-8</code>编码decode。这里<code class="language-plaintext highlighter-rouge">utf-8</code>也是猜的，因为这是最常用的编码，在别的谜题中也许得多试几个。</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">base64</span>

<span class="n">encoded_str</span> <span class="o">=</span> <span class="sh">"</span><span class="s">NVUWW5PFR6X6PCFR4WLLKIJB</span><span class="sh">"</span>
<span class="n">decoded_bytes</span> <span class="o">=</span> <span class="n">base64</span><span class="p">.</span><span class="nf">b32decode</span><span class="p">(</span><span class="n">encoded_str</span><span class="p">)</span>
<span class="n">decoded_str</span> <span class="o">=</span> <span class="n">decoded_bytes</span><span class="p">.</span><span class="nf">decode</span><span class="p">(</span><span class="sh">"</span><span class="s">utf-8</span><span class="sh">"</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">解码:</span><span class="sh">"</span><span class="p">,</span> <span class="n">decoded_str</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>我们得到答案</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>miku可爱喵!!
</pre></td></tr></tbody></table></code></pre></div></div>

<p>感谢我的好朋友，愿意破解我亲手设计的谜题！真的很开心！谢谢你！</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/da56e2afee74a1e513ddedfb2c29715f.png" alt="Img" /></p>

<h2 id="附录">附录</h2>

<p>谜题生成用到的部分脚本。</p>

<p><code class="language-plaintext highlighter-rouge">main.py</code></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="rouge-code"><pre><span class="kn">from</span> <span class="n">WaveTool</span> <span class="kn">import</span> <span class="n">WaveUtil</span>
<span class="kn">from</span> <span class="n">MorseTool</span> <span class="kn">import</span> <span class="n">Morse</span>
<span class="kn">from</span> <span class="n">pprint</span> <span class="kn">import</span> <span class="n">pp</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>

<span class="n">FRAME_RATE</span> <span class="o">=</span> <span class="mi">44100</span>
<span class="n">SAMPLE_WIDTH</span> <span class="o">=</span> <span class="mi">1</span> <span class="c1"># Bytes
</span><span class="n">FREQ</span> <span class="o">=</span> <span class="mi">600</span>
<span class="n">DURATION</span> <span class="o">=</span> <span class="mf">0.06</span> <span class="c1"># 60ms
</span><span class="n">TEXT</span> <span class="o">=</span> <span class="sh">"</span><span class="s">NVUWW5PFR6X6PCFR4WLLKIJB</span><span class="sh">"</span>
<span class="n">myWave</span> <span class="o">=</span> <span class="nc">WaveUtil</span><span class="p">(</span><span class="sh">"</span><span class="s">puzzle.wav</span><span class="sh">"</span><span class="p">,</span> <span class="n">FRAME_RATE</span><span class="p">,</span> <span class="n">SAMPLE_WIDTH</span><span class="p">)</span>
<span class="k">def</span> <span class="nf">get_dots</span><span class="p">(</span><span class="n">duration</span><span class="p">):</span>
    <span class="k">return</span> <span class="n">duration</span> <span class="o">*</span> <span class="n">FRAME_RATE</span>
<span class="n">txt</span> <span class="o">=</span> <span class="n">Morse</span><span class="p">.</span><span class="nf">get_codes</span><span class="p">(</span><span class="n">TEXT</span><span class="p">)</span>
<span class="n">data</span> <span class="o">=</span> <span class="n">Morse</span><span class="p">.</span><span class="nf">parse_to_data</span><span class="p">(</span><span class="n">txt</span><span class="p">)</span>
<span class="n">voiceData</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">array</span><span class="p">([])</span>
<span class="k">for</span> <span class="n">item</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
    <span class="n">dots</span> <span class="o">=</span> <span class="nf">get_dots</span><span class="p">(</span><span class="n">DURATION</span> <span class="o">*</span> <span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">])</span>
    <span class="n">xpoints</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">arange</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">dots</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">item</span><span class="p">[</span><span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">]</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="n">ypoints</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">zeros_like</span><span class="p">(</span><span class="n">xpoints</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">ypoints_float</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">pow</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="nf">sin</span><span class="p">(</span><span class="mi">2</span> <span class="o">*</span> <span class="n">np</span><span class="p">.</span><span class="n">pi</span> <span class="o">*</span> <span class="n">FREQ</span> <span class="o">*</span> <span class="n">xpoints</span> <span class="o">/</span> <span class="n">FRAME_RATE</span><span class="p">),</span> <span class="mi">1</span><span class="p">)</span>
        <span class="n">ypoints</span> <span class="o">=</span> <span class="p">(</span><span class="n">ypoints_float</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">/</span> <span class="mi">2</span> <span class="o">*</span> <span class="p">(</span><span class="n">SAMPLE_WIDTH</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span><span class="p">)</span>
    <span class="n">voiceData</span> <span class="o">=</span> <span class="n">np</span><span class="p">.</span><span class="nf">concatenate</span><span class="p">((</span><span class="n">voiceData</span><span class="p">,</span> <span class="n">ypoints</span><span class="p">))</span>
<span class="nf">print</span><span class="p">(</span><span class="n">txt</span><span class="p">)</span>
<span class="c1"># print(data)
</span><span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">FULL LENGTH</span><span class="sh">"</span><span class="p">,</span> <span class="nf">sum</span><span class="p">([</span><span class="n">i</span><span class="p">[</span><span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="n">data</span><span class="p">]))</span>
<span class="n">myWave</span><span class="p">.</span><span class="nf">write_wav_8bit</span><span class="p">(</span><span class="n">voiceData</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">WaveTool.py</code></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">wave</span>
<span class="kn">import</span> <span class="n">numpy</span> <span class="k">as</span> <span class="n">np</span>
<span class="kn">from</span> <span class="n">pathlib</span> <span class="kn">import</span> <span class="n">Path</span>

<span class="k">class</span> <span class="nc">WaveUtil</span><span class="p">:</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="nb">file</span><span class="p">,</span> <span class="n">framerate</span><span class="p">,</span> <span class="n">sample</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="n">self</span><span class="p">.</span><span class="nb">file</span> <span class="o">=</span> <span class="nf">str</span><span class="p">(</span><span class="nc">Path</span><span class="p">(</span><span class="n">__file__</span><span class="p">).</span><span class="n">parent</span> <span class="o">/</span> <span class="nb">file</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">framerate</span> <span class="o">=</span> <span class="n">framerate</span>
        <span class="n">self</span><span class="p">.</span><span class="n">sample</span> <span class="o">=</span> <span class="n">sample</span>
    <span class="k">def</span> <span class="nf">write_wav_8bit</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">data</span><span class="p">):</span>
        <span class="n">raw</span> <span class="o">=</span> <span class="n">data</span><span class="p">.</span><span class="nf">astype</span><span class="p">(</span><span class="n">np</span><span class="p">.</span><span class="n">uint8</span><span class="p">).</span><span class="nf">tobytes</span><span class="p">()</span>
        <span class="k">with</span> <span class="n">wave</span><span class="p">.</span><span class="nf">open</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="nb">file</span><span class="p">,</span> <span class="sh">'</span><span class="s">wb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">wf</span><span class="p">:</span>
            <span class="n">wf</span><span class="p">.</span><span class="nf">setnchannels</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
            <span class="n">wf</span><span class="p">.</span><span class="nf">setsampwidth</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">sample</span><span class="p">)</span>
            <span class="n">wf</span><span class="p">.</span><span class="nf">setframerate</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">framerate</span><span class="p">)</span>
            <span class="n">wf</span><span class="p">.</span><span class="nf">writeframes</span><span class="p">(</span><span class="n">raw</span><span class="p">)</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Successfully wrote</span><span class="sh">"</span><span class="p">,</span> <span class="n">self</span><span class="p">.</span><span class="nb">file</span><span class="p">)</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">MorseTool.py</code></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
</pre></td><td class="rouge-code"><pre><span class="kn">import</span> <span class="n">re</span>
<span class="k">class</span> <span class="nc">Morse</span><span class="p">:</span>
    <span class="n">codes</span> <span class="o">=</span> <span class="p">{</span>
        <span class="sh">"</span><span class="s">A</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-...</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">C</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-.-.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">D</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-..</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">E</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">F</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">..-.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">G</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">--.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">H</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">....</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">I</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">..</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">J</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.---</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">K</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-.-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">L</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.-..</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">M</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">--</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">N</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">O</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">---</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">P</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.--.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">Q</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">--.-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">R</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.-.</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">S</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">...</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">T</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">U</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">..-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">V</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">...-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">W</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.--</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">X</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-..-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">Y</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-.--</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">Z</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">--..</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">0</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-----</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">1</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.----</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">2</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">..---</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">3</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">...--</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">4</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">....-</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">5</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">.....</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">6</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">-....</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">7</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">--...</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">8</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">---..</span><span class="sh">"</span><span class="p">,</span>
        <span class="sh">"</span><span class="s">9</span><span class="sh">"</span><span class="p">:</span> <span class="sh">"</span><span class="s">----.</span><span class="sh">"</span>
    <span class="p">}</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="bp">None</span><span class="p">:</span>
        <span class="k">pass</span>
    <span class="nd">@classmethod</span>
    <span class="k">def</span> <span class="nf">get_code</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="k">return</span> <span class="n">cls</span><span class="p">.</span><span class="n">codes</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">s</span><span class="p">,</span> <span class="sh">""</span><span class="p">)</span>
    <span class="nd">@classmethod</span>
    <span class="k">def</span> <span class="nf">get_codes</span><span class="p">(</span><span class="n">cls</span><span class="p">,</span> <span class="n">s</span><span class="p">:</span> <span class="nb">str</span><span class="p">):</span>
        <span class="n">s</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">sub</span><span class="p">(</span><span class="sa">r</span><span class="sh">"</span><span class="s">\s+</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">,</span> <span class="n">s</span><span class="p">)</span>
        <span class="n">morseList</span> <span class="o">=</span> <span class="p">[</span><span class="n">cls</span><span class="p">.</span><span class="nf">get_code</span><span class="p">(</span><span class="n">c</span><span class="p">.</span><span class="nf">upper</span><span class="p">())</span> <span class="k">if</span> <span class="n">c</span> <span class="o">!=</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span> <span class="k">else</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span> <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">s</span><span class="p">]</span>
        <span class="n">result</span> <span class="o">=</span> <span class="sh">"</span><span class="s">/</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">morseList</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">sub</span><span class="p">(</span><span class="sa">r</span><span class="sh">"</span><span class="s">/\|/</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">sub</span><span class="p">(</span><span class="sa">r</span><span class="sh">"</span><span class="s">^\|/</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
        <span class="n">result</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">sub</span><span class="p">(</span><span class="sa">r</span><span class="sh">"</span><span class="s">/\|^</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span><span class="p">,</span> <span class="n">result</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">result</span>
    <span class="nd">@staticmethod</span>
    <span class="k">def</span> <span class="nf">parse_to_data</span><span class="p">(</span><span class="n">codes</span><span class="p">):</span>
        <span class="n">data</span> <span class="o">=</span> <span class="p">[]</span>
        <span class="n">last</span> <span class="o">=</span> <span class="sh">"</span><span class="s">x</span><span class="sh">"</span>
        <span class="k">for</span> <span class="n">c</span> <span class="ow">in</span> <span class="n">codes</span><span class="p">:</span>
            <span class="c1"># 处理小间隔
</span>            <span class="nf">if </span><span class="p">(</span><span class="n">c</span> <span class="ow">in</span> <span class="sh">"</span><span class="s">.-</span><span class="sh">"</span><span class="p">)</span> <span class="ow">and</span> <span class="p">(</span><span class="n">last</span> <span class="ow">in</span> <span class="sh">"</span><span class="s">.-</span><span class="sh">"</span><span class="p">):</span>
                <span class="n">data</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">})</span>
            <span class="c1"># 正常处理
</span>            <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="sh">"</span><span class="s">.</span><span class="sh">"</span><span class="p">:</span>
                <span class="n">data</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span>
                <span class="p">})</span>
            <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">:</span>
                <span class="n">data</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="mi">1</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span>
                <span class="p">})</span>
            <span class="c1"># 字间隔 词间隔
</span>            <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="sh">"</span><span class="s">/</span><span class="sh">"</span><span class="p">:</span>
                <span class="n">data</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">:</span> <span class="mi">3</span>
                <span class="p">})</span>
            <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="sh">"</span><span class="s">|</span><span class="sh">"</span><span class="p">:</span>
                <span class="n">data</span><span class="p">.</span><span class="nf">append</span><span class="p">({</span>
                    <span class="sh">"</span><span class="s">type</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span>
                    <span class="sh">"</span><span class="s">duration</span><span class="sh">"</span><span class="p">:</span> <span class="mi">7</span>
                <span class="p">})</span>
            <span class="k">else</span><span class="p">:</span>
                <span class="k">raise</span> <span class="nc">Exception</span><span class="p">(</span><span class="sh">"</span><span class="s">解析错误</span><span class="sh">"</span><span class="p">)</span>
            <span class="n">last</span> <span class="o">=</span> <span class="n">c</span>
        <span class="k">return</span> <span class="n">data</span>
</pre></td></tr></tbody></table></code></pre></div></div>]]></content><author><name></name></author><category term="研究" /><category term="破解" /><category term="密码" /><category term="python" /><summary type="html"><![CDATA[题目]]></summary></entry><entry><title type="html">天津大学好用的校园服务</title><link href="https://blog.565455.xyz/posts/%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6%E5%A5%BD%E7%94%A8%E7%9A%84%E6%A0%A1%E5%9B%AD%E6%9C%8D%E5%8A%A1/" rel="alternate" type="text/html" title="天津大学好用的校园服务" /><published>2026-05-17T21:51:00+08:00</published><updated>2026-05-17T21:51:00+08:00</updated><id>https://blog.565455.xyz/posts/%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6%E5%A5%BD%E7%94%A8%E7%9A%84%E6%A0%A1%E5%9B%AD%E6%9C%8D%E5%8A%A1</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E5%A4%A9%E6%B4%A5%E5%A4%A7%E5%AD%A6%E5%A5%BD%E7%94%A8%E7%9A%84%E6%A0%A1%E5%9B%AD%E6%9C%8D%E5%8A%A1/"><![CDATA[<h2 id="前言">前言</h2>

<p>在微北洋看到同学分享学校好用的校园服务，才发现自己少薅了这么多羊毛，必须得整理记录总结一下。</p>

<h2 id="大模型api">大模型API</h2>

<h3 id="申请">申请</h3>

<p>学校信网中心于2026年5月15日发布<a href="https://mp.weixin.qq.com/s/iNoT0yAlxM0iv9NjJ15s6Q">微信公众号文章</a>，介绍了学校智能体广场上新“词元Token”API服务。</p>

<p>首先，前往网上办事大厅申请一个api key，地址在</p>

<p><a href="https://ehall.tju.edu.cn/tp_fp/view?m=fp#from=hall&amp;serveID=57523761667846144&amp;act=fp/serveapply">https://ehall.tju.edu.cn/tp_fp/view?m=fp#from=hall&amp;serveID=57523761667846144&amp;act=fp/serveapply</a></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/e647dcf7aa99b8bc43508f519ef285d2.png" alt="Img" /></p>

<p>一定先仔细阅读使用条款，一个api key只有31天有效期，过期之后需要再次申请，可以在智能体广场查看api key的额度和用量，这个量基本是用不完的，非常大。</p>

<p>申请完的通知里面就有api key。</p>

<p>或者在智能体广场也能查看，点击左下角头像=&gt;查看api key。</p>

<p><a href="https://ai.tju.edu.cn/agents">https://ai.tju.edu.cn/agents</a></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/65a5e4c1a6291b99c84dcb5b01098e8e.png" alt="Img" /></p>

<p>输入的token额度是10亿，输出的token额度是1000万。</p>

<h3 id="使用">使用</h3>

<p>平常轻度使用可以下载一个app来对接提供的api，我这里以chatbox为例。</p>

<p><a href="https://chatboxai.app/zh#download">https://chatboxai.app/zh#download</a></p>

<p>下载完后配置api，服务配置请参考下图。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/86b3cb494954247c43683326f34e03d8.png" alt="Img" /></p>

<p>如果你是<strong>手机版</strong>chatbox用户，记得勾选<code class="language-plaintext highlighter-rouge">改善网络兼容性</code>选项，这样能规避预检Options请求发生跨域错误的问题。但是在微北洋论坛有用户也实测这样设置依旧无法使用，那就可以考虑换个app了。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/91b9e794fe9d353bc8d98512c1ed73bb.png" alt="Img" /></p>

<p>请注意，部署的模型是<code class="language-plaintext highlighter-rouge">千问Qwen3.6-35B-A3B</code>模型，具有多模态，我们可以开启视觉和工具使用功能，这样就可以利用必应在网上搜到信息，也可以给他发图片解题，实测速度非常快，效果很好。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/7bf169abc8b183ac021774381d245a09.png" alt="Img" /></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/eb3fe278a23f56006dcff655539f9125.png" alt="Img" /></p>

<p>这么好用的api服务我觉得可以写一个程序来让ai帮我回复微北洋的评论，之后可以试试。</p>

<p>如果接入你的其他服务，请参看这个curl请求。</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
</pre></td><td class="rouge-code"><pre>curl <span class="s1">'https://ai.tju.edu.cn/api/v3/chat/completions'</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'Content-Type: application/json'</span> <span class="se">\</span>
  <span class="nt">-H</span> <span class="s1">'Authorization: Bearer &lt;YOUR_API_KEY&gt;'</span> <span class="se">\</span>
  <span class="nt">-d</span> <span class="s1">'{"model":"tju-llm","messages":[{"role":"user","content":"你好"}]}'</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="wps企业版服务">WPS企业版服务</h2>

<p>详情请参见微北洋帖子#MP418337，写的非常好。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/ee521699fef3490a206ff797e4a2c425.png" alt="" /></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/9052a2c8ce73941692c12d5693d3b086.jpg" alt="" /></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/9918deb6e057a2e399eae9186f030f5d.png" alt="" /></p>]]></content><author><name></name></author><category term="研究" /><category term="学校" /><category term="ai" /><category term="wps" /><summary type="html"><![CDATA[前言]]></summary></entry><entry><title type="html">Fabric MC Bingo游戏</title><link href="https://blog.565455.xyz/posts/Fabric-MC-Bingo%E6%B8%B8%E6%88%8F/" rel="alternate" type="text/html" title="Fabric MC Bingo游戏" /><published>2026-05-16T21:38:00+08:00</published><updated>2026-05-16T21:38:00+08:00</updated><id>https://blog.565455.xyz/posts/Fabric%20MC%20Bingo%E6%B8%B8%E6%88%8F</id><content type="html" xml:base="https://blog.565455.xyz/posts/Fabric-MC-Bingo%E6%B8%B8%E6%88%8F/"><![CDATA[<h2 id="前言">前言</h2>

<p>听舍友说一直在和初中同学玩一个mc整合包，叫<code class="language-plaintext highlighter-rouge">Yet Another Bingo</code>，玩法就是系统每局发放5*5的棋盘，玩家分了组，每个组的玩家都要尽可能多的收集到这些物品，最先完成任务的组获胜。</p>

<p>于是我想试试看能不能搭一个这样的服务器和舍友一起玩，有了此篇研究。</p>

<h2 id="下载服务端">下载服务端</h2>

<h3 id="安装java">安装Java</h3>

<p><a href="https://www.oracle.com/cn/java/technologies/downloads/#java21" target="_blank">https://www.oracle.com/cn/java/technologies/downloads/#java21</a></p>

<p>推荐下载jdk21，比较新也比较稳定。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/4a213861d114c7e1fde48fe27e7c7f32.png" alt="Img" /></p>

<p>由于我是在Windows10下面开服，所以选了Windows的x64 Installer下载。</p>

<p>下载完一路下一步即可，使用<code class="language-plaintext highlighter-rouge">java --version</code>检查安装状态。</p>

<h3 id="下载mc服务端">下载MC服务端</h3>

<p>由于bingo游戏只能跑在Fabric服务器下，我们要先下载Fabric MC的服务端。</p>

<p><a href="https://fabricmc.net/use/server/" target="_blank">https://fabricmc.net/use/server/</a></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/f978123bc27c069f361a35957edc1cd2.png" alt="Img" /></p>

<p>我这里以1.21.10版本为例，点击下载<code class="language-plaintext highlighter-rouge">.jar</code>文件。这里下载的时候可能会把源代码下载下来，是一个<code class="language-plaintext highlighter-rouge">.zip</code>文件，非常奇怪。如果遇到这个问题，我们得修正一下url地址，把问号后查询字符串都删掉，再进行下载，我在macOS下是没有这个问题的。</p>

<p><a href="https://meta.fabricmc.net/v2/versions/loader/1.21.10/0.19.2/1.1.1/server/jar" target="_blank">https://meta.fabricmc.net/v2/versions/loader/1.21.10/0.19.2/1.1.1/server/jar</a></p>

<h3 id="下载bingo插件">下载Bingo插件</h3>

<p>玩Bingo游戏那肯定得下载一个Bingo游戏的插件，这个插件还依赖一个Fabric API插件，两个都得下载，以下是下载地址。</p>

<p><strong>Fabric API</strong></p>

<p><a href="https://modrinth.com/mod/fabric-api" target="_blank">https://modrinth.com/mod/fabric-api</a></p>

<p>点击Download，一定记得选好版本。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/f13561db26a754383527f88b537fbf5b.png" alt="Img" /></p>

<p><strong>Yet Another Bingo</strong></p>

<p><a href="https://modrinth.com/mod/yet-another-minecraft-bingo" target="_blank">https://modrinth.com/mod/yet-another-minecraft-bingo</a></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/a5827fe73d733949377258a33fd7b716.png" alt="Img" /></p>

<h2 id="启动服务端">启动服务端</h2>

<p>我们需要先运行游戏jar构建下载整个目录，我们新建一个<code class="language-plaintext highlighter-rouge">start.bat</code>文件，里面填写</p>

<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>@echo <span class="na">off</span>
<span class="kd">java</span> <span class="na">-Xmx</span><span class="m">8</span><span class="kd">G</span> <span class="na">-Xms</span><span class="m">8</span><span class="kd">G</span> <span class="na">-jar </span><span class="kd">fabric</span><span class="na">-server-mc</span>.1.21.10<span class="na">-loader</span>.0.19.2<span class="na">-launcher</span>.1.1.1.jar
<span class="nb">pause</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>双击启动，然后等待一会，会弹出一个eula提示，然后打开目录下的<code class="language-plaintext highlighter-rouge">eula.txt</code>，把false改成true来同意eula协议。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
</pre></td><td class="rouge-code"><pre>#By changing the setting below to TRUE you are indicating your agreement to our EULA (https://aka.ms/MinecraftEULA).
#Sun May 10 17:07:29 CST 2026
eula=true
</pre></td></tr></tbody></table></code></pre></div></div>

<p>然后你的目录应该长这样。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/cd781227a0110cd9a5b17de21ce6b8b3.png" alt="Img" /></p>

<p>接下来把两个下载的插件放进<code class="language-plaintext highlighter-rouge">mods</code>目录。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/c962b61d798bbd45fe96fb276563b17d.png" alt="Img" /></p>

<p>这样应该就可以了，我们再次运行<code class="language-plaintext highlighter-rouge">start.bat</code>。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/9dac7d9eb37cbd8ea8cbc2f31787b01a.png" alt="Img" /></p>

<p>弹出这个界面就是启动成功了，我们可以顺便把自己设成服主，使用以下命令。</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>/op [username]
</pre></td></tr></tbody></table></code></pre></div></div>

<p>一些其他更复杂的网络设置，请参看<a href="#开始游戏">开始游戏</a>板块。</p>

<h2 id="客户端可选">客户端（可选）</h2>

<p>这个Yet Another Bingo即使不安装客户端整合包，用1.21.10原版mc也是可以游玩的，但是体验不如安装了整合包，那为了更好的游戏体验我还是建议安装一下客户端整合包。</p>

<p>这个整合包是在玩家客户端安装的，千万别搞混了，服务端上那个叫<em>插件Mods</em>，客户端这个叫<em>整合包ModPacks</em>，这里我们使用<code class="language-plaintext highlighter-rouge">Yet Another Bingo: Ultimate</code>。</p>

<p><a href="https://modrinth.com/modpack/yet-another-bingo-ultimate" target="_blank">https://modrinth.com/modpack/yet-another-bingo-ultimate</a></p>

<p>依旧要选择好版本</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/1680046dfe8b20851b58fff9444a01b3.png" alt="Img" /></p>

<p>然后下载完是一个<code class="language-plaintext highlighter-rouge">.mrpack</code>文件，里面记录了整合包的所有插件和他们的版本，我和同学使用<code class="language-plaintext highlighter-rouge">.zip</code>安装的，不过<code class="language-plaintext highlighter-rouge">.mrpack</code>好像也可以。直接把这个文件拖进你的启动器就好，PCL和HMCL都可以。</p>

<h2 id="开始游戏">开始游戏</h2>

<p>服务端可能需要修改一些配置获得更好的游戏体验，这里不赘述了。</p>

<p>都配置好，启动服务端就可以开始游戏了！在多人联机里输入服务器地址加端口号，或者你给ip绑定一个dns的a记录，在srv记录里面写好端口，具体配置如下。（这个域名配置是可选的，不是必须弄，但是你的公网ip是必须的）</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/d9550df0fd7b4b02c253943b42834ec4.png" alt="Img" /></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/b598bb9ded7199fb114b10de41cb6294.png" alt="Img" /></p>

<p>注意这个SRV记录，一定得是<code class="language-plaintext highlighter-rouge">_minecraft._tcp.你的域名</code>（是二级域名就得写二级域名）。还得注意我写的<code class="language-plaintext highlighter-rouge">55565</code>是端口，你需要根据自己实际情况修改。</p>

<p>进入游戏，开始愉快的玩耍吧！另外如果你想和我们一起玩mc bingo游戏，也随时欢迎联系我。玩家数量才是多人游戏好玩的关键。</p>

<p>附游戏截图，我使用的是HMCL启动器。</p>

<p>选择<code class="language-plaintext highlighter-rouge">Yet Anothor Bingo</code>实例</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/d83e17adc093ef2c0ae6bad3f2d582c7.png" alt="Img" /></p>

<p>游戏界面</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/4bc8fe550c68fb1f145e5306ef8f9d53.png" alt="Img" /></p>

<p>多人游戏</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/6860e8163e7d9ecd848ae6770ee1d6ef.png" alt="Img" /></p>

<p>Bingo Lobby</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/ee3f161ee1d1aa22254fef8aad38d4c5.png" alt="" /></p>

<p>游玩愉快！</p>]]></content><author><name></name></author><category term="研究" /><category term="mc" /><category term="java" /><category term="服务器" /><summary type="html"><![CDATA[前言]]></summary></entry><entry><title type="html">lets-recite重磅更新</title><link href="https://blog.565455.xyz/posts/lets-recite%E9%87%8D%E7%A3%85%E6%9B%B4%E6%96%B0/" rel="alternate" type="text/html" title="lets-recite重磅更新" /><published>2026-05-10T17:47:00+08:00</published><updated>2026-05-10T17:47:00+08:00</updated><id>https://blog.565455.xyz/posts/lets-recite%E9%87%8D%E7%A3%85%E6%9B%B4%E6%96%B0</id><content type="html" xml:base="https://blog.565455.xyz/posts/lets-recite%E9%87%8D%E7%A3%85%E6%9B%B4%E6%96%B0/"><![CDATA[<h2 id="关于项目">关于项目</h2>

<p>项目地址 <a href="https://www.565455.xyz/projects/lets-recite/">https://www.565455.xyz/projects/lets-recite/</a></p>

<p>开源于Github <a href="https://github.com/Fancc666/lets-recite">https://github.com/Fancc666/lets-recite</a></p>

<p>辅助记忆小工具，可以用来背政治历史这类的背诵型学科，支持随机题目，题目全览和语音朗读功能。</p>

<h2 id="更新内容">更新内容</h2>

<p>“一起背政治”项目正式更名“一起背吧”，通过重构现在我们有了更好的词书加载方式。</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/fbec42374c6a121dff913e937b84a926.png" alt="Img" /></p>

<p>您只需要在<code class="language-plaintext highlighter-rouge">/books</code>按照<code class="language-plaintext highlighter-rouge">README.md</code>上传标准词书，并在<code class="language-plaintext highlighter-rouge">books.js</code>中填写词书信息即可发起pr，您的词书合理的情况下我会100%merge。</p>

<p>欢迎提交pr新增词书或一起改进项目。</p>

<h2 id="新词书">新词书</h2>

<p>这是建工学院党建积极分子考试大纲的题库，可以参考它来构建新词书。</p>

<div class="language-js highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
</pre></td><td class="rouge-code"><pre><span class="p">{</span>
    <span class="nl">file</span><span class="p">:</span> <span class="dl">"</span><span class="s2">jgdj.json</span><span class="dl">"</span><span class="p">,</span>
    <span class="nx">name</span><span class="p">:</span> <span class="dl">"</span><span class="s2">建工积极分子@2026</span><span class="dl">"</span><span class="p">,</span>
    <span class="nx">description</span><span class="p">:</span> <span class="dl">"</span><span class="s2">建工积极分子考试大纲</span><span class="dl">"</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<div class="language-json highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
</pre></td><td class="rouge-code"><pre><span class="p">{</span><span class="w">
  </span><span class="nl">"bookName"</span><span class="p">:</span><span class="w"> </span><span class="s2">"天津大学建工学院党建学习资料"</span><span class="p">,</span><span class="w">
  </span><span class="nl">"data"</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">1</span><span class="p">,</span><span class="w">
      </span><span class="nl">"question"</span><span class="p">:</span><span class="w"> </span><span class="s2">"入党誓词"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"answer"</span><span class="p">:</span><span class="w"> </span><span class="s2">"我志愿加入中国共产党，拥护党的纲领，遵守党的章程，履行党员义务，执行党的决定，严守党的纪律，保守党的秘密，对党忠诚，积极工作，为共产主义奋斗终身，随时准备为党和人民牺牲一切，永不叛党。"</span><span class="w">
    </span><span class="p">},</span><span class="w">
    </span><span class="p">{</span><span class="w">
      </span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
      </span><span class="nl">"question"</span><span class="p">:</span><span class="w"> </span><span class="s2">"党章的地位"</span><span class="p">,</span><span class="w">
      </span><span class="nl">"answer"</span><span class="p">:</span><span class="w"> </span><span class="s2">"党章是党的总章程，是党的根本大法。体现着党的十九大以来以习近平同志为核心的党中央在党的理论创新、实践创新、制度创新上的新成果，蕴含着对新时代新征程党和国家事业发展的新要求，党的二十大通过的党章为全党统一思想、凝聚力量迈向新征程提供了根本遵循。"</span><span class="w">
    </span><span class="p">}</span><span class="w">
  </span><span class="p">]</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></pre></td></tr></tbody></table></code></pre></div></div>

<p>效果展示</p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/b29dc26482ef448ee27d33df6b43de9e.png" alt="Img" /></p>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/837f38efa6ced90ed3b2554a0093476c.png" alt="Img" /></p>]]></content><author><name></name></author><category term="文档" /><category term="项目" /><category term="党团" /><summary type="html"><![CDATA[关于项目]]></summary></entry><entry><title type="html">积极分子结业考试</title><link href="https://blog.565455.xyz/posts/%E7%A7%AF%E6%9E%81%E5%88%86%E5%AD%90%E7%BB%93%E4%B8%9A%E8%80%83%E8%AF%95/" rel="alternate" type="text/html" title="积极分子结业考试" /><published>2026-05-03T22:01:00+08:00</published><updated>2026-05-03T22:01:00+08:00</updated><id>https://blog.565455.xyz/posts/%E7%A7%AF%E6%9E%81%E5%88%86%E5%AD%90%E7%BB%93%E4%B8%9A%E8%80%83%E8%AF%95</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E7%A7%AF%E6%9E%81%E5%88%86%E5%AD%90%E7%BB%93%E4%B8%9A%E8%80%83%E8%AF%95/"><![CDATA[<h2 id="入党誓词">入党誓词</h2>

<p><img src="https://qnhdpic.twt.edu.cn/download/origin/51236cb01ba78fca198f0cc82de64637.png" alt="Img" /></p>

<p>我志愿加入中国共产党，拥护党的纲领，遵守党的章程，履行党员义务，执行党的决定，严守党的纪律，保守党的秘密，对党忠诚，积极工作，为共产主义事业奋斗终身，随时准备为党和人民牺牲一切，永不叛党。</p>

<h2 id="党章">党章</h2>

<p>党章，是党的总章程，是党的根本大法。体现着十九大以来以习近平同志为核心的党中央在党的理论创新、实践创新、制度创新上的新成果，蕴含着对新时代新征程党和国家事业发展的新要求，党的二十大通过的党章为全党统一思想、凝聚力量迈向新征程提供了根本遵循。</p>

<p>《党章》规定，凡重大问题，党的各级委员会都要按照集体领导、民主集中、个别酝酿、会议决定的原则，由党的委员会集体讨论，作出决定。</p>

<h2 id="二十大理论知识">二十大理论知识</h2>

<p>党的二十大的主题是：高举中国特色社会主义伟大旗帜，全面贯彻新时代中国特色社会主义思想，弘扬伟大建党精神，自信自强、守正创新、踔（chuō）厉奋发、勇毅前行，为全面建设社会主义现代化国家、全面推进中华民族伟大复兴而团结奋斗。</p>

<h2 id="党政党史校史">党政、党史、校史</h2>

<ol>
  <li>习近平给天津大学全体师生的回信主要内容：<strong>新起点上，希望你们坚持以中国特色社会主义思想为指导，聚焦国家重大战略需求，深化教学科研改革，加强基础研究和科技攻关，提高人才培养质量，更好服务经济社会发展，为建设教育强国科技强国、推进中国式现代化作出新的贡献。</strong></li>
  <li><strong>毛泽东思想、中国特色社会主义理论体系、习近平新时代中国特色社会主义</strong>是马克思主义中国化的三大理论成果。贯穿三大理论成果始终，并体现在三大理论成果各个基本观点中的世界观和方法论是<strong>实事求是</strong>。</li>
  <li><em>中国特色社会主义道路</em>是：
    <ol>
      <li>在中国共产党的领导下，立足基本国情，以经济建设为中心，坚持四项基本原则，坚持改革开放，解放和发展社会生产力。</li>
      <li>巩固和完善社会主义制度，建设社会主义市场经济、社会主义民主政治、社会主义先进文化、社会主义和谐社会，建设富强民主文明和谐的社会主义现代化国家。</li>
    </ol>
  </li>
  <li>中国共产党三大作风：<strong>理论联系实际的作风、密切联系群众的作风、批评与自我批评的作风</strong>。</li>
  <li>天津大学 <em>“新三步走”</em> 第三步：到2045年（建校150周年），办学指标和声誉进入全球前一百，全面建成中国特色、世界一流、天大品格的社会主义大学。</li>
  <li>“三个务必”
    <ol>
      <li>务必<strong>不忘初心、牢记使命</strong></li>
      <li>务必<strong>谦虚谨慎、艰苦奋斗</strong></li>
      <li>务必<strong>敢于斗争、善于斗争</strong></li>
      <li>坚定历史自信，增强历史主动，谱写新时代中国特色社会主义更加绚丽的华章</li>
    </ol>
  </li>
  <li>为确保全党遵守党章，恪守党的性质和宗旨，要用习近平新时代中国特色社会主义思想武装全党、指导工作、教育人民，夯实党执政的思想基础。</li>
  <li>坚持和完善党的领导制度体系的六项制度
    <ol>
      <li>建立不忘初心、牢记使命的制度；</li>
      <li>完善坚定维护党中央权威和集中统一领导的各项制度；</li>
      <li>健全党的全面领导制度；</li>
      <li>健全为人民执政、靠人民执政各项制度；</li>
      <li>健全提高党的执政能力和领导水平制度；</li>
      <li>完善全面从严治党制度。</li>
    </ol>
  </li>
  <li>我国国体：<strong>人民民主专政</strong>；我国政体：<strong>人民代表大会制度</strong>；我国基本制度包括<strong>中国共产党领导的多党合作和政治协商制度、民族区域自治制度、基层群众自治制度</strong>。</li>
  <li>习近平总书记关于加强<strong>党作风建设</strong>的核心要义是<em>保持党同人民群众的血肉联系</em>。</li>
  <li>11~15见<a href="#问题答案一览表">一览表</a>。</li>
</ol>

<h2 id="问题答案一览表">问题答案一览表</h2>

<table>
  <thead>
    <tr>
      <th>问题</th>
      <th>答案</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>入党誓词</td>
      <td>我志愿加入中国共产党，拥护党的纲领，遵守党的章程，履行党员义务，执行党的决定，严守党的纪律，保守党的秘密，对党忠诚，积极工作，为共产主义奋斗终身，随时准备为党和人民牺牲一切，永不叛党。</td>
    </tr>
    <tr>
      <td>党章的地位</td>
      <td>党章是党的总章程，是党的根本大法。体现着党的十九大以来以习近平同志为核心的党中央在党的理论创新、实践创新、制度创新上的新成果，蕴含着对新时代新征程党和国家事业发展的新要求，党的二十大通过的党章为全党统一思想、凝聚力量迈向新征程提供了根本遵循。</td>
    </tr>
    <tr>
      <td>党的各级委员会处理重大问题的原则</td>
      <td>集体领导、民主集中、个别酝酿、会议决定</td>
    </tr>
    <tr>
      <td>党的二十大主题</td>
      <td>高举中国特色社会主义伟大旗帜，全面贯彻新时代中国特色社会主义思想，弘扬伟大建党精神，自信自强、守正创新、踔厉奋发、勇毅前行，为全面建设社会主义现代化国家、全面推进中华民族伟大复兴而团结奋斗。</td>
    </tr>
    <tr>
      <td>习近平给天津大学全体师生回信主要内容</td>
      <td>新起点上，希望你们坚持以新时代中国特色社会主义思想为指导，聚焦国家重大战略需求，深化教学科研改革，加强基础研究和科技攻关，提高人才培养质量，更好服务经济社会发展，为建设教育强国科技强国、推进中国式现代化作出新的贡献。</td>
    </tr>
    <tr>
      <td>马克思主义中国化的三大理论成果</td>
      <td>毛泽东思想、中国特色社会主义理论体系、习近平新时代中国特色社会主义</td>
    </tr>
    <tr>
      <td>贯穿三大理论成果的世界观和方法论基础</td>
      <td>实事求是</td>
    </tr>
    <tr>
      <td>中国特色社会主义道路</td>
      <td>在中国共产党领导下，立足基本国情，以经济建设为中心，坚持四项基本原则，坚持改革开放，解放和发展社会生产力，巩固和完善社会主义制度，建设社会主义市场经济、社会主义民主政治、社会主义先进文化、社会主义和谐社会，建设富强民主文明和谐的社会主义现代化国家。</td>
    </tr>
    <tr>
      <td>中国共产党三大作风</td>
      <td>理论联系实际的作风，密切联系群众的作风，批评与自我批评的作风</td>
    </tr>
    <tr>
      <td>天津大学“新三步走”战略第三步</td>
      <td>到2045年（建校150周年），办学主要指标和声誉进入全球前一百，全面建成中国特色、世界一流、天大品格的社会主义大学。</td>
    </tr>
    <tr>
      <td>三个务必</td>
      <td>务必不忘初心、牢记使命，务必谦虚谨慎、艰苦奋斗，务必敢于斗争、善于斗争，坚定历史自信，增强历史主动，谱写新时代中国特色社会主义更加绚丽的华章。</td>
    </tr>
    <tr>
      <td>夯实党执政思想基础的指导思想</td>
      <td>习近平新时代中国特色社会主义思想</td>
    </tr>
    <tr>
      <td>坚持和完善党的领导制度体系的六项制度</td>
      <td>建立不忘初心、牢记使命的制度；完善坚定维护党中央权威和集中统一领导的各项制度；健全党的全面领导制度；健全为人民执政、靠人民执政各项制度；健全提高党的执政能力和领导水平制度；完善全面从严治党制度。</td>
    </tr>
    <tr>
      <td>我国国体</td>
      <td>人民民主专政</td>
    </tr>
    <tr>
      <td>我国政体</td>
      <td>人民代表大会制度</td>
    </tr>
    <tr>
      <td>我国基本政治制度</td>
      <td>中国共产党领导的多党合作和政治协商制度、民族区域自治制度、基层群众自治制度</td>
    </tr>
    <tr>
      <td>党的作风建设核心要义</td>
      <td>保持党同人民群众的血肉联系</td>
    </tr>
    <tr>
      <td>党的根本组织原则</td>
      <td>民主集中制</td>
    </tr>
    <tr>
      <td>党的作风建设的重大意义</td>
      <td>①党的作风就是党的形象，关系人心向背，决定党和国家事业成败；<br />②党的作风是观察党群干群关系、人心向背的晴雨表。我们党在长期实践中培育并坚持的光荣传统和优良作风，是党性质和宗旨的集中体现，是区别于其他政党的显著标志；<br />③党要得到人民支持拥护，就必须持之以恒发扬这些优良作风。若不注重作风建设，听任不正之风侵蚀党的肌体，就有失去民心、丧失政权的危险；<br />④党作为长期执政的马克思主义政党，对作风问题任何时候都不能掉以轻心，必须以最严格标准、最严厉举措治理。</td>
    </tr>
    <tr>
      <td>中国特色社会主义新时代新在四个方面</td>
      <td>①社会主义从来都是在奋勇开拓中前进的，必定随着形势和条件的变化不断向前发展。中国特色社会主义新时代，是承前启后、继往开来、在新的历史条件下继续夺取中国特色社会主义伟大胜利的时代。<br />②新时代新就新在我国社会主要矛盾发生新变化。社会主要矛盾由人民日益增长的物质文化需要同落后的社会生产之间的矛盾，转化为人民日益增长的美好生活需要和不平衡不充分的发展之间的矛盾。<br />③新时代新就新在党的理论创新实现新飞跃、新在党和国家事业确立新目标。党的十九大作出的新时代中国特色社会主义发展的战略安排，明确了实现两个一百年奋斗目标的时间表、路线图。<br />④新时代新就新在中国和世界关系开创新局面、新在中国共产党展现新面貌。当今世界正经历百年未有之大变局，我国日益走向世界舞台中央，当代中国不再是国际秩序的被动接受者。</td>
    </tr>
    <tr>
      <td>实事求是</td>
      <td>实事求是是党的思想路线核心内容，是党员和干部的基本条件。<br />其一，实事求是，是马克思主义的根本观点，是中国共产党人认识世界、改造世界的根本要求，是我们党的基本思想方法、工作方法、领导方法。<br />其二，实事求是是党性修养的基本要求。党员干部尤其需要下大力气切实解决好在坚持实事求是上的党性问题，把掌握思想方法和遵循党性要求高度统一起来，争当不忘初心、牢记使命的实事求是派。<br />其三，实事求是是做好各项工作的起码要求，是国民整体素质和个人素质高低的重要标尺。实事求是关乎党的兴衰成败，贯穿党的全部理论和实践，是兴党兴国的生命线。<br />其四，要把发挥主观能动性和尊重客观规律结合起来，把高度的革命热情同严谨踏实的科学态度结合起来。一切从实际出发，实事求是。</td>
    </tr>
    <tr>
      <td>新时期共产党员保持先进性的六个基本要求</td>
      <td>一是要坚持理想信念，坚定不移地为建设中国特色社会主义而奋斗；<br />二是要坚持勤奋学习，扎扎实实地提高实践“三个代表”重要思想的本领；<br />三是要坚持党的根本宗旨，始终不渝地做到立党为公、执政为民；<br />四是要坚持勤奋工作，兢兢业业地创造一流的工作业绩；<br />五是要坚持遵守党的纪律，身体力行地维护党的团结统一；<br />六是要坚持“两个务必”，永葆共产党人的政治本色。</td>
    </tr>
  </tbody>
</table>]]></content><author><name></name></author><category term="个人" /><category term="党团" /><summary type="html"><![CDATA[入党誓词]]></summary></entry><entry><title type="html">GPG签名</title><link href="https://blog.565455.xyz/posts/GPG%E7%AD%BE%E5%90%8D/" rel="alternate" type="text/html" title="GPG签名" /><published>2026-04-19T15:10:00+08:00</published><updated>2026-04-19T15:10:00+08:00</updated><id>https://blog.565455.xyz/posts/GPG%E7%AD%BE%E5%90%8D</id><content type="html" xml:base="https://blog.565455.xyz/posts/GPG%E7%AD%BE%E5%90%8D/"><![CDATA[<h2 id="前言">前言</h2>

<p>我突然发现最近github提交不显示我的贡献了，原来是我换绑了邮箱，于是我在Github账户里添加了现在的邮箱。</p>

<p>随后我又想了解一下GPG对commit签名，它能证明你是你。由于Git去中心化设计，理论上来说任何人都可以伪造你的身份。</p>

<p>下面我以macOS系统为例介绍一下GPG签名过程。</p>

<h2 id="生成gpg密钥">生成GPG密钥</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>brew <span class="nb">install </span>gnupg
gpg <span class="nt">--full-generate-key</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>随后开始生成密钥</p>

<ul>
  <li>Key type: 选择 (1) RSA and RSA。</li>
  <li>Key size: 选择 4096。</li>
  <li>Expiration: 输入 0（永不过期）或设置你想要的期限（例如 2y）。</li>
  <li>Real name: 填你的名字。</li>
  <li>Email address: 非常重要，必须填写你 GitHub 账号中绑定的邮箱。</li>
  <li>Passphrase: 设置一个密码（以后每次签名都需要输入它）。</li>
</ul>

<h2 id="导出公钥">导出公钥</h2>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>gpg <span class="nt">--list-secret-keys</span> <span class="nt">--keyid-format</span><span class="o">=</span>long
</pre></td></tr></tbody></table></code></pre></div></div>

<p>拿到keyID</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
</pre></td><td class="rouge-code"><pre>sec   rsa4096/ABC1234567890DEF 2026-04-19 [SC]
uid                 [ultimate] Your Name &lt;your-email@example.com&gt;
</pre></td></tr></tbody></table></code></pre></div></div>

<p>其中的 <code class="language-plaintext highlighter-rouge">ABC1234567890DEF</code> 就是你的 Key ID。</p>

<p>导出公钥</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>gpg <span class="nt">--armor</span> <span class="nt">--export</span> ABC1234567890DEF
</pre></td></tr></tbody></table></code></pre></div></div>

<h2 id="上传公钥">上传公钥</h2>

<p>最后上传这个公钥到Github，Gitlab，Gitea之类的即可。</p>

<p>以后提交要记得使用-S参数</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>git commit <span class="nt">-S</span> <span class="nt">-m</span> <span class="s2">"这是一个带签名的重要更新"</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>附图</p>

<p><img src="https://g.565455.xyz/statics/assets/gpg-0.png" alt="生成" /></p>

<p><img src="https://g.565455.xyz/statics/assets/gpg-1.png" alt="上传" /></p>

<h2 id="常见错误">常见错误</h2>

<p>报错如下</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
</pre></td><td class="rouge-code"><pre>fcc@MacBook-Pro statics % git commit -S -m "gpg.md file"
error: gpg failed to sign the data:
[GNUPG:] KEY_CONSIDERED 19D5CA35E84B5F68FA857CD314480E52463E752E 2
[GNUPG:] BEGIN_SIGNING H8
[GNUPG:] PINENTRY_LAUNCHED 28464 curses 1.3.2 - xterm-256color - - 501/20 0
gpg: 签名时失败： Inappropriate ioctl for device
[GNUPG:] FAILURE sign 83918950
gpg: signing failed: Inappropriate ioctl for device
</pre></td></tr></tbody></table></code></pre></div></div>

<p>需要配置输入密码方式 修改<code class="language-plaintext highlighter-rouge">~/.zshrc</code>（使用你的命令行配置文件）</p>

<p>添加如下内容</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre>export GPG_TTY=$(tty)
</pre></td></tr></tbody></table></code></pre></div></div>

<p>重新加载配置</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
</pre></td><td class="rouge-code"><pre><span class="nb">source</span> ~/.zshrc
</pre></td></tr></tbody></table></code></pre></div></div>

<p>应该就能解决问题。使用愉快~</p>

<p>FANCC，20260419</p>]]></content><author><name></name></author><category term="研究" /><category term="测试" /><category term="gpg" /><summary type="html"><![CDATA[前言]]></summary></entry><entry><title type="html">565455手册</title><link href="https://blog.565455.xyz/posts/565455%E6%89%8B%E5%86%8C/" rel="alternate" type="text/html" title="565455手册" /><published>2025-06-19T10:00:00+08:00</published><updated>2025-06-19T10:00:00+08:00</updated><id>https://blog.565455.xyz/posts/565455%E6%89%8B%E5%86%8C</id><content type="html" xml:base="https://blog.565455.xyz/posts/565455%E6%89%8B%E5%86%8C/"><![CDATA[<h2 id="关于手册">关于手册</h2>

<p><img src="https://s2.loli.net/2025/06/19/cWy3CJwUAa7B4kr.png" alt="" /></p>

<p><a href="https://www.565455.xyz/docs/">手册地址 https://www.565455.xyz/docs/</a></p>

<p>由于之前写的项目太分散了，我把所有的项目都整理到一起了，方便以后查看。</p>

<p>这就是565455手册，里面包含了所有项目的链接，它们的的介绍。</p>

<h2 id="一些技术细节">一些技术细节</h2>

<p>文档使用了Sphinx来构建，通过一些Markdown或者reStructuredText来编写内容，渲染成html文档，本来想托管在<code class="language-plaintext highlighter-rouge">ReadTheDocs</code>网站上，但最后选择独立构建并传到个人服务器。</p>

<p>侧边栏的平滑动画和引用框样式就是自己做的代码如下</p>

<div class="language-css highlighter-rouge"><div class="highlight"><pre class="highlight"><code><table class="rouge-table"><tbody><tr><td class="rouge-gutter gl"><pre class="lineno">1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
</pre></td><td class="rouge-code"><pre><span class="c">/* 移动端 侧边栏动画 */</span>
<span class="nc">.wy-grid-for-nav</span><span class="p">{</span>
    <span class="nl">overflow-x</span><span class="p">:</span> <span class="nb">hidden</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.wy-nav-side</span><span class="p">{</span>
    <span class="nl">transition</span><span class="p">:</span> <span class="nb">left</span> <span class="m">0.5s</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">@media</span> <span class="nb">screen</span> <span class="n">and</span> <span class="p">(</span><span class="n">max-width</span><span class="p">:</span> <span class="m">768px</span><span class="p">)</span> <span class="p">{</span>
    <span class="nc">.wy-nav-content-wrap</span> <span class="p">{</span>
        <span class="nl">margin-left</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
        <span class="nl">left</span><span class="p">:</span> <span class="m">0</span><span class="p">;</span>
        <span class="nl">position</span><span class="p">:</span> <span class="nb">relative</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
<span class="nc">.wy-nav-content-wrap</span><span class="p">{</span>
    <span class="nl">transition</span><span class="p">:</span> <span class="nb">left</span> <span class="m">0.5s</span><span class="p">;</span>
<span class="p">}</span>
<span class="c">/* 引用内容样式 */</span>
<span class="nc">.rst-content</span> <span class="nt">blockquote</span> <span class="p">{</span>
    <span class="nl">position</span><span class="p">:</span> <span class="nb">relative</span><span class="p">;</span>
    <span class="nl">color</span><span class="p">:</span> <span class="nx">gray</span><span class="p">;</span>
<span class="p">}</span>
<span class="nc">.rst-content</span> <span class="nt">blockquote</span><span class="nd">:before</span><span class="p">{</span>
    <span class="nl">content</span><span class="p">:</span> <span class="s1">""</span><span class="p">;</span>
    <span class="nl">position</span><span class="p">:</span> <span class="nb">absolute</span><span class="p">;</span>
    <span class="nl">width</span><span class="p">:</span> <span class="m">10px</span><span class="p">;</span>
    <span class="nl">height</span><span class="p">:</span> <span class="m">100%</span><span class="p">;</span>
    <span class="nl">background-color</span><span class="p">:</span> <span class="nx">gainsboro</span><span class="p">;</span>
    <span class="nl">left</span><span class="p">:</span> <span class="m">-24px</span><span class="p">;</span>
<span class="p">}</span>
</pre></td></tr></tbody></table></code></pre></div></div>

<p>本地构建Sphinx，Jekyll，提供给读者参考。</p>]]></content><author><name></name></author><category term="文档" /><category term="项目" /><summary type="html"><![CDATA[关于手册]]></summary></entry><entry><title type="html">实验中学校歌</title><link href="https://blog.565455.xyz/posts/%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E6%A0%A1%E6%AD%8C/" rel="alternate" type="text/html" title="实验中学校歌" /><published>2023-04-11T20:23:15+08:00</published><updated>2023-04-11T20:23:15+08:00</updated><id>https://blog.565455.xyz/posts/%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E6%A0%A1%E6%AD%8C</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E5%AE%9E%E9%AA%8C%E4%B8%AD%E5%AD%A6%E6%A0%A1%E6%AD%8C/"><![CDATA[<h2 id="实验中学校歌">实验中学校歌</h2>

<h3 id="音频">音频</h3>

<audio controls="" src="/assets/media/20230411-1-1.mp3"></audio>

<h3 id="歌词">歌词</h3>

<p>1990年校庆修改版</p>

<p>词：刘军、王会千曲：刘金树、康德妹</p>

<p>辉煌实验 喷薄之阳 背负京都 面对重阳</p>

<p>故物新知 传统弘扬 莘莘学子 荟萃一堂</p>

<p>实事求是 校训深长 懿行伟业 日就月将</p>

<p>任重道远 恢维宏纲 南菁北峻 为国争光</p>

<p>1930年版</p>

<p>词：朱星元作曲：王增勤</p>

<p>皇哉工商 析津之阳 背负京都 面对重洋</p>

<p>故物新知 文化播扬 南菁北骏 荟萃一堂</p>

<p>实事求是 校训深长 德智体美 日就月将</p>

<p>任重道远 恢维宏纲 咨尔多士 为国争光</p>]]></content><author><name></name></author><category term="个人" /><summary type="html"><![CDATA[实验中学校歌]]></summary></entry><entry><title type="html">一个小聊天室</title><link href="https://blog.565455.xyz/posts/%E4%B8%80%E4%B8%AA%E5%B0%8F%E8%81%8A%E5%A4%A9%E5%AE%A4/" rel="alternate" type="text/html" title="一个小聊天室" /><published>2023-03-14T21:02:15+08:00</published><updated>2023-03-14T21:02:15+08:00</updated><id>https://blog.565455.xyz/posts/%E4%B8%80%E4%B8%AA%E5%B0%8F%E8%81%8A%E5%A4%A9%E5%AE%A4</id><content type="html" xml:base="https://blog.565455.xyz/posts/%E4%B8%80%E4%B8%AA%E5%B0%8F%E8%81%8A%E5%A4%A9%E5%AE%A4/"><![CDATA[<h2 id="小聊天室">小聊天室</h2>

<p><strong>准备锻炼一下自己的部署技能，这是第二次尝试部署</strong></p>

<iframe src="https://chat.happyfan.cc.cd/room/@fancc/svg?width=600&amp;height=500&amp;theme=light&amp;limit=30&amp;title=fancc-chat-room&amp;fontSize=14" border="0" frameborder="no" framespacing="0"></iframe>

<h2 id="源代码">源代码</h2>

<p>使用了jad@github的代码<a href="https://github.com/journey-ad/chat-room">https://github.com/journey-ad/chat-room</a></p>

<h2 id="demo">Demo</h2>

<p><a href="https://chat.happyfan.cc.cd/room/@demo">https://chat.happyfan.cc.cd/room/@demo</a></p>]]></content><author><name></name></author><category term="文档" /><category term="项目" /><category term="部署" /><category term="js" /><summary type="html"><![CDATA[小聊天室]]></summary></entry></feed>