<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Delta1037</title>
  
  <subtitle>技术是纯净的</subtitle>
  <link href="https://www.delta1037.cn/atom.xml" rel="self"/>
  
  <link href="https://www.delta1037.cn/"/>
  <updated>2025-09-09T14:17:56.149Z</updated>
  <id>https://www.delta1037.cn/</id>
  
  <author>
    <name>delta1037</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Shell 基础语法</title>
    <link href="https://www.delta1037.cn/2025/Linux/Shell%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95/"/>
    <id>https://www.delta1037.cn/2025/Linux/Shell%E5%9F%BA%E7%A1%80%E8%AF%AD%E6%B3%95/</id>
    <published>2025-09-07T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.149Z</updated>
    
    <content type="html"><![CDATA[<p>Shell 语言的基础语法，包括基础知识（变量、打印、运算符）、流程控制（分支、循环）和模块化（函数封装、文件封装、参数传递）三个部分。</p><p>本篇文章是 <a href="http://www.delta1037.cn/2020/Linux/Shell%E8%84%9A%E6%9C%AC%E5%9F%BA%E7%A1%80/">Shell脚本基础</a> 的增强版。</p><span id="more"></span><h1 id="一、基础知识"><a href="#一、基础知识" class="headerlink" title="一、基础知识"></a>一、基础知识</h1><h2 id="1-1-变量"><a href="#1-1-变量" class="headerlink" title="1.1 变量"></a>1.1 变量</h2><h3 id="变量定义"><a href="#变量定义" class="headerlink" title="变量定义"></a>变量定义</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 使用变量，建议方式</span></span><br><span class="line"><span class="variable">$&#123;var&#125;</span></span><br><span class="line"><span class="comment"># 在变量名var后是空格时才可用如下方式</span></span><br><span class="line"><span class="variable">$var</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 字符串的定义</span></span><br><span class="line">var_string=<span class="string">&quot;hello world&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 只读变量</span></span><br><span class="line"><span class="built_in">declare</span> -r var_name</span><br><span class="line"><span class="built_in">readonly</span> var_name</span><br><span class="line"></span><br><span class="line"><span class="comment"># 删除变量</span></span><br><span class="line">uset var_name</span><br></pre></td></tr></table></figure><h3 id="变量赋值"><a href="#变量赋值" class="headerlink" title="变量赋值"></a>变量赋值</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"># 除了显式赋值，也可以将命令的结果存入到变量，如下就是将`ls /etc`的结果存到到了file_array</span></span><br><span class="line">file_array=$( <span class="built_in">ls</span> /etc )</span><br><span class="line"><span class="comment"># 也可以使用` 命令 `方式</span></span><br><span class="line">file_array=` <span class="built_in">ls</span> /etc `</span><br><span class="line"></span><br><span class="line"><span class="comment"># 应用:循环访问文件</span></span><br><span class="line"><span class="keyword">for</span> file <span class="keyword">in</span> $( <span class="built_in">ls</span> /etc )</span><br><span class="line"><span class="keyword">do</span></span><br><span class="line">      <span class="comment"># do something</span></span><br><span class="line"><span class="keyword">done</span></span><br></pre></td></tr></table></figure><h3 id="数组变量"><a href="#数组变量" class="headerlink" title="数组变量"></a>数组变量</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 数组的定义</span></span><br><span class="line">array_var=(val0 val1 val2)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 单独定义每个元素</span></span><br><span class="line">array_var[0]=val0</span><br><span class="line">array_var[1]=val1</span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取所有元素</span></span><br><span class="line"><span class="variable">$&#123;array_var[@]&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取数组的长度/元素个数</span></span><br><span class="line"><span class="variable">$&#123;#array_var[@]&#125;</span></span><br><span class="line"><span class="variable">$&#123;#array_var[*]&#125;</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># 获取单个元素长度</span></span><br><span class="line"><span class="variable">$&#123;#array_var[n]&#125;</span></span><br></pre></td></tr></table></figure><h2 id="1-2-打印"><a href="#1-2-打印" class="headerlink" title="1.2 打印"></a>1.2 打印</h2><h3 id="echo"><a href="#echo" class="headerlink" title="echo"></a>echo</h3><p>Shell 的 echo 指令与 PHP 的 echo 指令类似，都是用于字符串的输出。命令格式：</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">echo string</span><br></pre></td></tr></table></figure><ul><li><p>显示普通字符串:<br>  <code>echo &quot;It is a test&quot;</code></p><p>  这里的双引号完全可以省略（echo It is a test）</p></li><li><p>显示转义字符<br>  <code>echo &quot;\&quot;It is a test\&quot;&quot;</code></p><p>  结果将是：”It is a test”，同样双引号也可以省略</p></li><li><p>显示变量<br>  read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量</p>  <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><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="meta prompt_">#</span><span class="language-bash">!/bin/sh</span></span><br><span class="line">read name</span><br><span class="line">echo &quot;$name It is a test&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">以上代码保存为 test.sh, name 接收标准输入的变量，结果将是:</span></span><br><span class="line">[root@www ~]# sh test.sh</span><br><span class="line">OK                     #标准输入</span><br><span class="line">OK It is a test        #输出</span><br></pre></td></tr></table></figure></li><li><p>显示换行<br>  <code>echo -e &quot;OK! \n&quot; # -e 开启转义echo &quot;It is a test&quot;</code></p><p>  输出结果：</p><p>  OK! It is a test</p></li><li><p>显示不换行<br>  <code>#!/bin/sh echo -e &quot;OK! \c&quot; # -e 开启转义 \c 不换行 echo &quot;It is a test&quot;</code></p><p>  输出结果：</p><p>  OK! It is a test</p></li><li><p>显示结果定向至文件<br>  <code>echo &quot;It is a test&quot; &gt; myfile</code></p></li><li><p>原样输出字符串，不进行转义或取变量(用单引号)<br>  <code>echo &#39;$name\&quot;&#39;</code></p><p>  输出结果：$name&quot;</p></li><li><p>显示命令执行结果（这里因为无法打印出原字符所以加了转义符，实际不需要转义）<br>  <code>echo </code>date&#96;&#96;，注意： 这里使用的是反引号&#96;，而不是单引号’。结束时显示日期：Thu Jul 24 10:08:46 CST 2014</p></li></ul><h3 id="printf"><a href="#printf" class="headerlink" title="printf"></a>printf</h3><p>printf 命令模仿 C 程序库（library）里的 printf() 程序。printf 由 POSIX 标准所定义，因此使用 printf 的脚本比使用 echo 移植性好。</p><p>printf 使用引用文本或空格分隔的参数，外面可以在 printf 中使用格式化字符串，还可以制定字符串的宽度、左右对齐方式等。默认的 printf 不会像 echo 自动添加换行符，我们可以手动添加 \n。</p><p>语法：</p><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><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></pre></td><td class="code"><pre><span class="line">printf  format-string  [arguments...]</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">参数说明</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">format-string: 为格式控制字符串</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">arguments: 为参数列表。</span></span><br><span class="line"><span class="meta prompt_">$ </span><span class="language-bash"><span class="built_in">printf</span> <span class="string">&quot;Hello, Shell\n&quot;</span></span></span><br><span class="line">Hello, Shell</span><br><span class="line"></span><br><span class="line">printf &quot;%-10s %-8s %-4s\n&quot; 姓名 性别 体重kg</span><br><span class="line">printf &quot;%-10s %-8s %-4.2f\n&quot; 郭靖 男 66.1234</span><br><span class="line">printf &quot;%-10s %-8s %-4.2f\n&quot; 杨过 男 48.6543</span><br><span class="line">printf &quot;%-10s %-8s %-4.2f\n&quot; 郭芙 女 47.9876</span><br><span class="line"><span class="meta prompt_">&gt;</span><span class="language-bash">&gt;&gt;</span></span><br><span class="line">姓名     性别   体重kg</span><br><span class="line">郭靖     男      66.12</span><br><span class="line">杨过     男      48.65</span><br><span class="line">郭芙     女      47.99</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">format-string为双引号</span></span><br><span class="line">printf &quot;%d %s\n&quot; 1 &quot;abc&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">单引号与双引号效果一样</span></span><br><span class="line">printf &#x27;%d %s\n&#x27; 1 &quot;abc&quot;</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">没有引号也可以输出</span></span><br><span class="line">printf %s abcdef</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">格式只指定了一个参数，但多出的参数仍然会按照该格式输出，format-string 被重用</span></span><br><span class="line">printf %s abc def</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">如果没有 arguments，那么 %s 用NULL代替，%d 用 0 代替</span></span><br><span class="line">printf &quot;%s and %d \n&quot;</span><br></pre></td></tr></table></figure><p>printf 转义序列：</p><table><thead><tr><th>序列</th><th>说明</th></tr></thead><tbody><tr><td>\a</td><td>警告字符，通常为 ASCII 的 BEL 字符</td></tr><tr><td>\b</td><td>后退</td></tr><tr><td>\c</td><td>抑制（不显示）输出结果中任何结尾的换行字符（只在 %b 格式指示符控制下的参数字符串中有效），而且，任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符，都被忽略</td></tr><tr><td>\f</td><td>换页（formfeed）</td></tr><tr><td>\n</td><td>换行</td></tr><tr><td>\r</td><td>回车（Carriage return）</td></tr><tr><td>\t</td><td>水平制表符</td></tr><tr><td>\v</td><td>垂直制表符</td></tr><tr><td>\</td><td>一个字面上的反斜杠字符</td></tr><tr><td>\ddd</td><td>表示 1 到 3 位数八进制值的字符。仅在格式字符串中有效</td></tr><tr><td>\0ddd</td><td>表示 1 到 3 位的八进制值字符</td></tr></tbody></table><h2 id="1-3-运算符"><a href="#1-3-运算符" class="headerlink" title="1.3 运算符"></a>1.3 运算符</h2><h3 id="算数运算符"><a href="#算数运算符" class="headerlink" title="算数运算符"></a>算数运算符</h3><table><thead><tr><th>运算符</th><th>说明</th><th>举例</th></tr></thead><tbody><tr><td>+</td><td>加法</td><td>expr $a + $b 结果为 30。</td></tr><tr><td>-</td><td>减法</td><td>expr $a - $b 结果为 -10。</td></tr><tr><td>*</td><td>乘法</td><td>expr $a * $b 结果为  200。</td></tr><tr><td>&#x2F;</td><td>除法</td><td>expr $b &#x2F; $a 结果为 2。</td></tr><tr><td>%</td><td>取余</td><td>expr $b % $a 结果为 0。</td></tr><tr><td>&#x3D;</td><td>赋值</td><td>a&#x3D;$b 把变量 b 的值赋给 a。</td></tr><tr><td>&#x3D;&#x3D;</td><td>相等。用于比较两个数字，相同则返回 true。</td><td>[  b ] 返回 false。</td></tr><tr><td>!&#x3D;</td><td>不相等。用于比较两个数字，不相同则返回 true。</td><td>[  b ] 返回 true。</td></tr></tbody></table><h3 id="关系运算符"><a href="#关系运算符" class="headerlink" title="关系运算符"></a>关系运算符</h3><blockquote><p>关系运算符只用于比较数字之间的关系，不支持字符串，除非字符串的值是数字</p></blockquote><p>假定 a &#x3D;10, b &#x3D; 20</p><table><thead><tr><th>运算符</th><th>说明</th><th>举例</th></tr></thead><tbody><tr><td>-eq</td><td>检测两个数是否相等，相等返回 true。</td><td>[ $a -eq $b ] 返回 false。</td></tr><tr><td>-ne</td><td>检测两个数是否不相等，不相等返回 true。</td><td>[ $a -ne $b ] 返回 true。</td></tr><tr><td>-gt</td><td>检测左边的数是否大于右边的，如果是，则返回 true。</td><td>[ $a -gt $b ] 返回 false。</td></tr><tr><td>-lt</td><td>检测左边的数是否小于右边的，如果是，则返回 true。</td><td>[ $a -lt $b ] 返回 true。</td></tr><tr><td>-ge</td><td>检测左边的数是否大于等于右边的，如果是，则返回 true。</td><td>[ $a -ge $b ] 返回 false。</td></tr><tr><td>-le</td><td>检测左边的数是否小于等于右边的，如果是，则返回 true。</td><td>[ $a -le $b ] 返回 true。</td></tr></tbody></table><h3 id="布尔运算符"><a href="#布尔运算符" class="headerlink" title="布尔运算符"></a>布尔运算符</h3><p>假定 a &#x3D;10, b &#x3D; 20</p><table><thead><tr><th>运算符</th><th>说明</th><th>举例</th></tr></thead><tbody><tr><td>!</td><td>非运算，表达式为 true 则返回 false，否则返回 true。</td><td>[ ! false ] 返回 true。</td></tr><tr><td>-o</td><td>或运算，有一个表达式为 true 则返回 true。</td><td>[ $a -lt 20 -o $b -gt 100 ] 返回 true。</td></tr><tr><td>-a</td><td>与运算，两个表达式都为 true 才返回 true。</td><td>[ $a -lt 20 -a $b -gt 100 ] 返回 false。</td></tr></tbody></table><h3 id="逻辑运算符"><a href="#逻辑运算符" class="headerlink" title="逻辑运算符"></a>逻辑运算符</h3><p>假定 a &#x3D;10, b &#x3D; 20</p><table><thead><tr><th>运算符</th><th>说明</th><th>举例</th></tr></thead><tbody><tr><td>&amp;&amp;</td><td>逻辑的 AND</td><td>[[ $a -lt 100 &amp;&amp; $b -gt 100 ]] 返回 false</td></tr><tr><td></td><td></td><td></td></tr></tbody></table><blockquote><p>注意需要两个嵌套的中括号</p></blockquote><h3 id="字符串运算符"><a href="#字符串运算符" class="headerlink" title="字符串运算符"></a>字符串运算符</h3><p>假定 var1&#x3D;”abc”，var2&#x3D;”efg”</p><table><thead><tr><th>运算符</th><th>说明</th><th>举例</th></tr></thead><tbody><tr><td>&#x3D;</td><td>检测字符串相等返回 true</td><td>[ $var1 &#x3D; $var2 ] 返回 false</td></tr><tr><td>!&#x3D;</td><td>检测字符串不相等返回 true</td><td>[ $var1 !&#x3D; $var2 ] 返回 true</td></tr><tr><td>-z</td><td>检测字符串长度为 0 返回 true</td><td>[ -z $var1 ] 返回 false</td></tr><tr><td>-n</td><td>检测字符串长度不为 0 返回 true</td><td>[ -n $var1 ] 返回 true</td></tr><tr><td>${}</td><td>检测字符串不为空返回 true</td><td>[ $var1 ] 返回 true</td></tr></tbody></table><h3 id="文件测试运算符"><a href="#文件测试运算符" class="headerlink" title="文件测试运算符"></a>文件测试运算符</h3><p>使用方法：-<operator> file_name</p><table><thead><tr><th>操作符</th><th>说明</th></tr></thead><tbody><tr><td>-e</td><td>检测文件是否存在</td></tr><tr><td>-d</td><td>检测目录是否存在</td></tr><tr><td>-f</td><td>普通文件检测（既不是目录，也不是设备文件）</td></tr><tr><td>-r</td><td>文件可读检测</td></tr><tr><td>-w</td><td>文件可写检测</td></tr><tr><td>-x</td><td>文件可执行检测</td></tr><tr><td>-b</td><td>块设备检测</td></tr><tr><td>-c</td><td>字符设备检测</td></tr><tr><td>-p</td><td>有名管道检测</td></tr><tr><td>-s</td><td>文件大小是否为 0</td></tr><tr><td>-S</td><td>文件是否是 socket 连接</td></tr><tr><td>-L</td><td>文件是否存在并且是一个符号链接</td></tr><tr><td>-g</td><td>文件 SGID 位检测</td></tr><tr><td>-u</td><td>文件 SUID 位检测</td></tr><tr><td>-k</td><td>文件粘滞位（Sticky Bit）检测</td></tr></tbody></table><h1 id="二、流程控制"><a href="#二、流程控制" class="headerlink" title="二、流程控制"></a>二、流程控制</h1><h2 id="2-1-分支"><a href="#2-1-分支" class="headerlink" title="2.1 分支"></a>2.1 分支</h2><h3 id="if-else"><a href="#if-else" class="headerlink" title="if-else"></a>if-else</h3><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">if</span></span></span><br><span class="line">if condition; then</span><br><span class="line">    command</span><br><span class="line">fi</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">写一行</span></span><br><span class="line">if [ $(ps -ef | grep -c &quot;ssh&quot;) -gt 1 ]; then echo &quot;true&quot;; fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">if</span> <span class="keyword">else</span></span></span><br><span class="line">if condition; then</span><br><span class="line">    command1</span><br><span class="line">else</span><br><span class="line">    command2</span><br><span class="line">fi</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash"><span class="keyword">if</span> else-if <span class="keyword">else</span></span></span><br><span class="line">if condition1; then</span><br><span class="line">    command1</span><br><span class="line">elif condition2; then</span><br><span class="line">    command2</span><br><span class="line">else</span><br><span class="line">    commandN</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><p>分支注意事项：</p><ul><li>condition 的表示<ul><li>if else 的 […] 判断语句中大于使用 -gt，小于使用 -lt（数值）</li><li>如果使用 ((…)) 作为判断语句，大于和小于可以直接使用 &gt; 和 &lt;。</li></ul></li></ul><h3 id="case-…-esac"><a href="#case-…-esac" class="headerlink" title="case … esac"></a>case … esac</h3><p>case … esac 为多选择语句，与其他语言中的 switch … case 语句类似，是一种多分支选择结构，每个 case 分支用右圆括号开始，用 <font color="#9065B0"> 两个分号 ;; 表示 break</font>，即执行结束，跳出整个 case … esac 语句，esac（就是 case 反过来）作为结束标记。</p><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><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></pre></td><td class="code"><pre><span class="line">case 值 in</span><br><span class="line">模式1)</span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">    ;;</span><br><span class="line">模式2)</span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">    ;;</span><br><span class="line">esac</span><br></pre></td></tr></table></figure><p>如果无一匹配模式，使用星号 * 捕获该值，再执行后面的命令</p><p>示例：</p><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><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">echo &#x27;输入 1 到 4 之间的数字:&#x27;</span><br><span class="line">echo &#x27;你输入的数字为:&#x27;</span><br><span class="line">read aNum</span><br><span class="line">case $aNum in</span><br><span class="line">    1)  echo &#x27;你选择了 1&#x27;</span><br><span class="line">    ;;</span><br><span class="line">    2)  echo &#x27;你选择了 2&#x27;</span><br><span class="line">    ;;</span><br><span class="line">    3)  echo &#x27;你选择了 3&#x27;</span><br><span class="line">    ;;</span><br><span class="line">    4)  echo &#x27;你选择了 4&#x27;</span><br><span class="line">    ;;</span><br><span class="line">    *)  echo &#x27;你没有输入 1 到 4 之间的数字&#x27;</span><br><span class="line">    ;;</span><br><span class="line">esac</span><br></pre></td></tr></table></figure><h2 id="2-2-循环"><a href="#2-2-循环" class="headerlink" title="2.2 循环"></a>2.2 循环</h2><p>循环包括 for 循环、while 循环、无限循环和 util 循环。</p><h3 id="for-循环"><a href="#for-循环" class="headerlink" title="for 循环"></a>for 循环</h3><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><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></pre></td><td class="code"><pre><span class="line">for var in item1 item2 ... itemN</span><br><span class="line">do</span><br><span class="line">    command1</span><br><span class="line">    command2</span><br><span class="line">    ...</span><br><span class="line">    commandN</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">一行</span></span><br><span class="line">for var in item1 item2 ... itemN; do command1; command2… done;</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line">for loop in 1 2 3 4 5</span><br><span class="line">do</span><br><span class="line">    echo &quot;The value is: $loop&quot;</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_">&gt;</span><span class="language-bash">&gt;&gt;</span></span><br><span class="line">The value is: 1</span><br><span class="line">The value is: 2</span><br><span class="line">The value is: 3</span><br><span class="line">The value is: 4</span><br><span class="line">The value is: 5</span><br></pre></td></tr></table></figure><h3 id="while-循环"><a href="#while-循环" class="headerlink" title="while 循环"></a>while 循环</h3><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><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">while condition</span><br><span class="line">do</span><br><span class="line">    command</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">int=1</span><br><span class="line">while(( $int&lt;=5 ))</span><br><span class="line">do</span><br><span class="line">    echo $int</span><br><span class="line">    let &quot;int++&quot;</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_">&gt;</span><span class="language-bash">&gt;&gt;</span></span><br><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></tr></table></figure><h3 id="无限循环"><a href="#无限循环" class="headerlink" title="无限循环"></a>无限循环</h3><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">1</span></span><br><span class="line">while :</span><br><span class="line">do</span><br><span class="line">    command</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">2</span></span><br><span class="line">while true</span><br><span class="line">do</span><br><span class="line">    command</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">3</span></span><br><span class="line">for (( ; ; ))</span><br></pre></td></tr></table></figure><h3 id="until-循环"><a href="#until-循环" class="headerlink" title="until 循环"></a>until 循环</h3><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><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">until condition</span><br><span class="line">do</span><br><span class="line">    command</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_"></span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">示例</span></span><br><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line">a=0</span><br><span class="line">until [ ! $a -lt 5 ]</span><br><span class="line">do</span><br><span class="line">   echo $a</span><br><span class="line">   a=`expr $a + 1`</span><br><span class="line">done</span><br><span class="line"><span class="meta prompt_">&gt;</span><span class="language-bash">&gt;&gt;</span></span><br><span class="line">0</span><br><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br></pre></td></tr></table></figure><h1 id="三、模块化"><a href="#三、模块化" class="headerlink" title="三、模块化"></a>三、模块化</h1><h2 id="3-1-函数封装"><a href="#3-1-函数封装" class="headerlink" title="3.1 函数封装"></a>3.1 函数封装</h2><p>函数格式：</p><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><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">[ function ] funname [()]</span><br><span class="line">&#123;</span><br><span class="line"></span><br><span class="line">    action;</span><br><span class="line"></span><br><span class="line">    [return int;]</span><br><span class="line"></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>说明：</p><ul><li>可以带 function fun() 定义，也可以直接 fun() 定义，不带任何参数</li><li>参数返回，可以显示加：return 返回，如果不加，将以最后一条命令运行结果，作为返回值。 return 后跟数值 n（范围：0-255）</li></ul><h2 id="3-2-文件封装"><a href="#3-2-文件封装" class="headerlink" title="3.2 文件封装"></a>3.2 文件封装</h2><p>可以将某一部分内容放到一个文件里，作为一个更大的模块的封装。注意在调用该文件执行的时候，是启动了一个子 shell 来对文件进行解释操作的。</p><h2 id="3-3-内容传递"><a href="#3-3-内容传递" class="headerlink" title="3.3 内容传递"></a>3.3 内容传递</h2><p>模块之间的交互主要可以通过管道，参数，文件传递等方式</p><h3 id="管道"><a href="#管道" class="headerlink" title="管道"></a>管道</h3><p>管道方式是在调用多个函数的时候，将前一个命令的输出作为下一个命令的输入。管道传递的内容需要后一个命令具有解析输入的功能，一般后一个命令是 Linux 自带的命令。</p><h3 id="参数"><a href="#参数" class="headerlink" title="参数"></a>参数</h3><p>参数是在函数调用时可能用到的，用于不同模块内容的交互（参入主要是传入模块内容）</p><p>参数访问：</p><p>在函数体内部，通过 $n 的形式来获取参数的值，例如， $1 表示第一个参数，$2 表示第二个参数…</p><p>示例：</p><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_">#</span><span class="language-bash">!/bin/bash</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">author:菜鸟教程</span></span><br><span class="line"><span class="meta prompt_"># </span><span class="language-bash">url:www.runoob.com</span></span><br><span class="line"></span><br><span class="line">funWithParam()&#123;</span><br><span class="line">    echo &quot;第一个参数为 $1 !&quot;</span><br><span class="line">    echo &quot;第二个参数为 $2 !&quot;</span><br><span class="line">    echo &quot;第十个参数为 $10 !&quot;</span><br><span class="line">    echo &quot;第十个参数为 $&#123;10&#125; !&quot;</span><br><span class="line">    echo &quot;第十一个参数为 $&#123;11&#125; !&quot;</span><br><span class="line">    echo &quot;参数总数有 $# 个!&quot;</span><br><span class="line">    echo &quot;作为一个字符串输出所有参数 $* !&quot;</span><br><span class="line">&#125;</span><br><span class="line">funWithParam 1 2 3 4 5 6 7 8 9 34 73</span><br></pre></td></tr></table></figure><p>参数处理：</p><p>使用 for 循环，遍历所有的参数，设置相应的标志位</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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"># 对所有的参数预处理，得到参数标志</span><br><span class="line">arg1_flag=0</span><br><span class="line">for arg in $&#123;*&#125;</span><br><span class="line">do</span><br><span class="line">      if [ $&#123;arg&#125; = &quot;arg1&quot; ]; then</span><br><span class="line">            arg1_flag=1</span><br><span class="line">      fi</span><br><span class="line">done</span><br><span class="line"></span><br><span class="line"># 根据参数标志判断是否执行某项操作</span><br><span class="line">if [ $&#123;arg1_flag&#125; == 1 ]; then</span><br><span class="line">      # do something</span><br><span class="line">fi</span><br></pre></td></tr></table></figure><p>参数表示：（对外）</p><p>在对外展示 shell 脚本可以处理的参数的时候，需要对可选项等作出表示，shell 命令使用不同的括号来表示不同类型的参数</p><ul><li>[]：内容可写可不写</li><li>{}：必须要从{}中选择一个参数</li><li>&lt;&gt;：必选</li></ul><p>特殊参数字符：</p><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>脚本运行的当前进程 ID 号</td></tr><tr><td>$!</td><td>后台运行的最后一个进程的 ID 号</td></tr><tr><td>$@</td><td>与 $* 相同，但是使用时加引号，并在引号中返回每个参数。</td></tr><tr><td>$-</td><td>显示 Shell 使用的当前选项，与 set 命令功能相同。</td></tr><tr><td>$?</td><td>显示最后命令的退出状态。0 表示没有错误，其他任何值表明有错误。</td></tr></tbody></table><h3 id="文件传递"><a href="#文件传递" class="headerlink" title="文件传递"></a>文件传递</h3><p>文件传递方式是将某些文本内容写入到文件，然后另一个命令或者模块利用该文件进行进一步的操作。</p><p>文件的用法：</p><ul><li>传递内容——写入到文件内容并由另一个模块或者命令读取</li><li>设标志位——作为一个同步标志，控制运行流程</li></ul><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p>【1】<a href="https://www.runoob.com/linux/linux-shell.html">Shell 教程</a></p><p>【2】<a href="https://blog.csdn.net/raoqin/article/details/8875089">括号中的可选、必选表示</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Shell 语言的基础语法，包括基础知识（变量、打印、运算符）、流程控制（分支、循环）和模块化（函数封装、文件封装、参数传递）三个部分。&lt;/p&gt;
&lt;p&gt;本篇文章是 &lt;a href=&quot;http://www.delta1037.cn/2020/Linux/Shell%E8%84%9A%E6%9C%AC%E5%9F%BA%E7%A1%80/&quot;&gt;Shell脚本基础&lt;/a&gt; 的增强版。&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="https://www.delta1037.cn/categories/Linux/"/>
    
    
    <category term="Linux" scheme="https://www.delta1037.cn/tags/Linux/"/>
    
    <category term="Shell" scheme="https://www.delta1037.cn/tags/Shell/"/>
    
  </entry>
  
  <entry>
    <title>系统论八大原理和思考</title>
    <link href="https://www.delta1037.cn/2025/System/%E7%B3%BB%E7%BB%9F%E8%AE%BA%E5%85%AB%E5%A4%A7%E5%8E%9F%E7%90%86%E5%92%8C%E6%80%9D%E8%80%83/"/>
    <id>https://www.delta1037.cn/2025/System/%E7%B3%BB%E7%BB%9F%E8%AE%BA%E5%85%AB%E5%A4%A7%E5%8E%9F%E7%90%86%E5%92%8C%E6%80%9D%E8%80%83/</id>
    <published>2025-09-06T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.148Z</updated>
    
    <content type="html"><![CDATA[<p>利用结构特征<strong>分解系统</strong>；利用行为特征<strong>分析系统边界</strong>；利用演化特征<strong>分析系统内部演化</strong>；利用整体特征做<strong>系统类比分析，利用模式快速分析新系统</strong></p><span id="more"></span><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/System_%E7%B3%BB%E7%BB%9F%E8%AE%BA%E5%85%AB%E5%A4%A7%E5%8E%9F%E7%90%86%E5%92%8C%E6%80%9D%E8%80%83_26788240a7bb802da097d0a855dc8dcb.png" alt="26788240a7bb802da097d0a855dc8dcb"></p><h1 id="一、八大原理"><a href="#一、八大原理" class="headerlink" title="一、八大原理"></a>一、八大原理</h1><h2 id="1-1-整体性（1-1-gt-2）"><a href="#1-1-整体性（1-1-gt-2）" class="headerlink" title="1.1 整体性（1+1&gt;2）"></a>1.1 整体性（1+1&gt;2）</h2><p>系统的整体功能不等于各部分的简单相加，而是通过相互作用产生新的特性（涌现性）。</p><h3 id="解释"><a href="#解释" class="headerlink" title="解释"></a>解释</h3><p>涌现性：系统在整体层面出现新的性质，无法从单个部分预测</p><ul><li>大脑：单个神经元只能传递电信号，但数十亿神经元组合就能产生意识、思维。</li><li>蚁群：单只蚂蚁行为简单，但整个蚁群能建造复杂巢穴、分工协作。</li><li>市场经济：单个消费者和企业的决策相互作用，形成价格波动和经济周期。</li></ul><h3 id="示例"><a href="#示例" class="headerlink" title="示例"></a>示例</h3><ul><li>企业管理：<ul><li>各部门（研发、生产、销售）单独运作效率有限，但协同合作能推出爆款产品。</li><li>失败案例：诺基亚各部门各自优化，但缺乏整体协调，最终被智能手机淘汰。</li></ul></li><li>城市规划：<ul><li>交通、住房、商业区单独规划可能导致拥堵，整体优化才能提高城市运行效率。</li></ul></li></ul><h2 id="1-2-层次性（系统嵌套系统）"><a href="#1-2-层次性（系统嵌套系统）" class="headerlink" title="1.2 层次性（系统嵌套系统）"></a>1.2 层次性（系统嵌套系统）</h2><p>系统由多个层次组成，高层次支配低层次，低层次支撑高层次。</p><h3 id="解释-1"><a href="#解释-1" class="headerlink" title="解释"></a>解释</h3><ul><li>自然界：<ul><li>原子 → 分子 → 细胞 → 组织 → 器官 → 生物体 → 生态系统</li><li>例如：DNA（分子层）控制蛋白质合成（细胞层），进而影响器官功能。</li></ul></li><li>社会系统：<ul><li>个人 → 家庭 → 社区 → 城市 → 国家 → 全球社会</li></ul></li></ul><h3 id="示例-1"><a href="#示例-1" class="headerlink" title="示例"></a>示例</h3><ul><li>组织管理：<ul><li>公司架构：CEO（战略层）→ 部门经理（管理层）→ 员工（执行层）。</li><li>失败案例：如果高层过度干预底层执行（如微软早期“层级过多”导致创新停滞）。</li></ul></li><li>软件工程：<ul><li>操作系统（底层）→ 应用程序（中层）→ 用户界面（高层）。</li><li>优化案例：Linux 采用模块化设计，各层独立优化，提高稳定性。</li></ul></li></ul><h2 id="1-3-开放性（系统必须与外界交换）"><a href="#1-3-开放性（系统必须与外界交换）" class="headerlink" title="1.3 开放性（系统必须与外界交换）"></a>1.3 开放性（系统必须与外界交换）</h2><p>封闭系统会走向混乱（熵增），开放系统通过输入输出维持稳定。</p><h3 id="解释-2"><a href="#解释-2" class="headerlink" title="解释"></a>解释</h3><ul><li>物理系统：<ul><li>热水瓶是封闭系统，热量逐渐散失（熵增）。</li><li>人体是开放系统，通过进食、呼吸维持生命（负熵流）。</li></ul></li><li>经济系统：<ul><li>闭关锁国的国家经济衰退（如清朝）。</li><li>改革开放的国家经济增长（如中国 1978 年后）。</li></ul></li></ul><h3 id="示例-2"><a href="#示例-2" class="headerlink" title="示例"></a>示例</h3><ul><li>企业管理：<ul><li>封闭企业（如柯达）拒绝数码技术，最终破产。</li><li>开放企业（如苹果）整合外部技术（触屏、ARM 芯片）成功。</li></ul></li><li>个人成长：<ul><li>封闭学习（只读课本） vs. 开放学习（实践、交流、跨学科）。</li></ul></li></ul><h2 id="1-4-目的性（系统有目标导向）"><a href="#1-4-目的性（系统有目标导向）" class="headerlink" title="1.4 目的性（系统有目标导向）"></a>1.4 目的性（系统有目标导向）</h2><p>系统行为趋向某个目标，可能是自组织（自然系统）或他组织（人工系统）</p><h3 id="解释-3"><a href="#解释-3" class="headerlink" title="解释"></a>解释</h3><ul><li>自组织目的：<ul><li>生物进化（适者生存）、市场经济（利润最大化）。</li></ul></li><li>他组织目的：<ul><li>机器（按程序运行）、公司（按战略目标执行）。</li></ul></li></ul><h3 id="示例-3"><a href="#示例-3" class="headerlink" title="示例"></a>示例</h3><ul><li>AI 训练：<ul><li>强化学习（AlphaGo）通过目标（赢棋）自我优化策略。</li></ul></li><li>政策制定：<ul><li>政府设定“碳中和”目标，引导企业调整能源结构。</li></ul></li></ul><h2 id="1-5-突变性（量变-→-质变）"><a href="#1-5-突变性（量变-→-质变）" class="headerlink" title="1.5 突变性（量变 → 质变）"></a>1.5 突变性（量变 → 质变）</h2><p>微小变化积累到临界点，系统突然进入新状态。</p><h3 id="解释-4"><a href="#解释-4" class="headerlink" title="解释"></a>解释</h3><ul><li>自然界：<ul><li>水加热到 100℃ 突然沸腾（相变）。</li><li>地震（板块应力积累到临界点突然释放）。</li></ul></li><li>社会系统：<ul><li>股市崩盘（投资者恐慌情绪积累到临界点）。</li></ul></li></ul><h3 id="示例-4"><a href="#示例-4" class="headerlink" title="示例"></a>示例</h3><ul><li>商业创新：<ul><li>数码相机技术积累多年，最终突然淘汰胶卷（柯达破产）。</li></ul></li><li>社会运动：<ul><li>阿拉伯之春（长期压迫导致突发动荡）。</li></ul></li></ul><h2 id="1-6-稳定性（负反馈维持平衡）"><a href="#1-6-稳定性（负反馈维持平衡）" class="headerlink" title="1.6 稳定性（负反馈维持平衡）"></a>1.6 稳定性（负反馈维持平衡）</h2><p>系统通过自我调节抵抗干扰，保持动态平衡。</p><h3 id="解释-5"><a href="#解释-5" class="headerlink" title="解释"></a>解释</h3><ul><li>生物系统：<ul><li>人体体温恒定（出汗&#x2F;发抖调节）。</li></ul></li><li>经济系统：<ul><li>通货膨胀时央行加息抑制过热。</li></ul></li></ul><h3 id="示例-5"><a href="#示例-5" class="headerlink" title="示例"></a>示例</h3><ul><li>供应链管理：<ul><li>丰田“Just-in-Time”生产 + 安全库存，平衡效率与稳定性。</li></ul></li><li>生态保护：<ul><li>引入天敌（如澳洲用狐狸控制兔子泛滥）。</li></ul></li></ul><h2 id="1-7-自组织（无序-→-有序）"><a href="#1-7-自组织（无序-→-有序）" class="headerlink" title="1.7 自组织（无序 → 有序）"></a>1.7 自组织（无序 → 有序）</h2><h3 id="解释-6"><a href="#解释-6" class="headerlink" title="解释"></a>解释</h3><ul><li>自然界：<ul><li>雪花结晶、蜂巢结构。</li></ul></li><li>社会系统：<ul><li>语言演化、比特币（去中心化货币）。</li></ul></li></ul><h3 id="示例-6"><a href="#示例-6" class="headerlink" title="示例"></a>示例</h3><ul><li>企业管理：<ul><li>谷歌“20% 时间”政策，让员工自发创新（Gmail、AdSense 由此诞生）。</li></ul></li><li>城市规划：<ul><li>传统规划（政府主导） vs. 自组织城市（如东京小巷自然形成商业区）。</li></ul></li></ul><h2 id="1-8-相似性（跨系统共性）"><a href="#1-8-相似性（跨系统共性）" class="headerlink" title="1.8 相似性（跨系统共性）"></a>1.8 相似性（跨系统共性）</h2><p>不同系统可能遵循相同规律。</p><h3 id="解释-7"><a href="#解释-7" class="headerlink" title="解释"></a>解释</h3><ul><li>分形：<ul><li>树枝、血管、河流分支模式相似。</li></ul></li><li>网络科学：<ul><li>互联网、社交网络、神经网络都有“小世界”特性。</li></ul></li></ul><h3 id="示例-7"><a href="#示例-7" class="headerlink" title="示例"></a>示例</h3><ul><li>商业策略：<ul><li>借鉴生态系统“共生”概念，建立企业联盟（如英特尔 + 微软 Wintel 联盟）。</li></ul></li><li>AI 设计：<ul><li>神经网络模仿人脑神经元连接方式。（或许是人类根据现有的物理规律导致的结果推导出相似的可行的系统，如果只是凭空想象，不深入理解底层逻辑，很难构造出类似的系统。毕竟现有的系统是经过超长时间演化来的。人类对底层还是了解太少了）</li></ul></li></ul><h1 id="二、思考"><a href="#二、思考" class="headerlink" title="二、思考"></a>二、思考</h1><h2 id="2-1-原理分类"><a href="#2-1-原理分类" class="headerlink" title="2.1 原理分类"></a>2.1 原理分类</h2><ul><li>结构特征：描述系统的构成方式<ul><li>整体性：系统与部分的关系。系统由部分组成，但是大于部分</li><li>层次性：系统的嵌套结构。大系统中可以划分小系统</li></ul></li><li>行为特征：描述系统行为（对外，边界）<ul><li>开放性：与环境的交互</li><li>目的性：行为的方向性</li></ul></li><li>演化特征：描述系统演化（内部变化）<ul><li>突变性和稳定性：演化的矛盾统一</li><li>自组织：无序到有序的机制</li></ul></li><li>整体特征：全局上<ul><li>相似性：系统和系统之间是相似的（或许是因为底层物理规律是一样的）</li></ul></li></ul><blockquote><p>利用结构特征<strong>分解系统</strong>；利用行为特征<strong>分析系统边界</strong>；利用演化特征<strong>分析系统内部演化</strong>；利用整体特征做<strong>系统类比分析，利用模式快速分析新系统</strong></p></blockquote>]]></content>
    
    
    <summary type="html">&lt;p&gt;利用结构特征&lt;strong&gt;分解系统&lt;/strong&gt;；利用行为特征&lt;strong&gt;分析系统边界&lt;/strong&gt;；利用演化特征&lt;strong&gt;分析系统内部演化&lt;/strong&gt;；利用整体特征做&lt;strong&gt;系统类比分析，利用模式快速分析新系统&lt;/strong&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="系统论" scheme="https://www.delta1037.cn/categories/%E7%B3%BB%E7%BB%9F%E8%AE%BA/"/>
    
    
    <category term="系统论" scheme="https://www.delta1037.cn/tags/%E7%B3%BB%E7%BB%9F%E8%AE%BA/"/>
    
  </entry>
  
  <entry>
    <title>面试-算法 Hot 100</title>
    <link href="https://www.delta1037.cn/2025/Algorithm/%E9%9D%A2%E8%AF%95-%E7%AE%97%E6%B3%95Hot100/"/>
    <id>https://www.delta1037.cn/2025/Algorithm/%E9%9D%A2%E8%AF%95-%E7%AE%97%E6%B3%95Hot100/</id>
    <published>2025-09-04T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.122Z</updated>
    
    <content type="html"><![CDATA[<p>LeetCode Hot 100 题目记录</p><span id="more"></span><p><a href="https://leetcode.cn/studyplan/top-100-liked/">LeetCode 热题 100</a></p><h3 id="哈希"><a href="#哈希" class="headerlink" title="哈希"></a>哈希</h3><ul><li><a href="https://leetcode.cn/problems/two-sum/description/">1. 两数之和</a>：使用字典保存出现过的数字及其坐标，判断 target - new_val 是否在集合里即可</li><li><a href="https://leetcode.cn/problems/group-anagrams/description/">49. 字母异位词分组</a>：将字符串排序，作为 key，将相同 key 的字符串存储成列表（主要就是排序后的字符串 ss 作为 key）</li><li><a href="https://leetcode.cn/problems/longest-consecutive-sequence/description/">128. 最长连续序列</a>：将数组放到集合里，判别起始数字开始的最大长度（判断是否是起始数字可以看上一个数字在不在集合里）</li></ul><h3 id="双指针"><a href="#双指针" class="headerlink" title="双指针"></a>双指针</h3><ul><li><a href="https://leetcode.cn/problems/move-zeroes/description/">283. 移动零</a>：使用 gap 统计 0 的个数，也就是向前覆盖的差值，最后将末尾赋值成 0 就可以了</li><li><a href="https://leetcode.cn/problems/container-with-most-water/description/">11. 盛最多水的容器</a>：设置左右两个指针，向内收缩两边高度较小的一个，维护这个过程中的盛水容量最大值（原理：较小的指针不会再作为容器边界）</li><li><a href="https://leetcode.cn/problems/3sum/description/">15. 三数之和</a>：坐标 i 维护最左侧数字位置，l 和 r 在右侧区间找和为 target 的两个数字，并跳过相同的数字</li><li><a href="https://leetcode.cn/problems/trapping-rain-water/description/">42. 接雨水</a>：维护单调减栈，如果出现单调增，计算形成的空区间（栈顶为底，弹出后的栈顶作为左位置，待 push 元素作为右位置）能够装的雨水量</li></ul><h3 id="滑动窗口"><a href="#滑动窗口" class="headerlink" title="滑动窗口"></a>滑动窗口</h3><ul><li><a href="https://leetcode.cn/problems/longest-substring-without-repeating-characters/description/?envType=study-plan-v2&amp;envId=top-100-liked">3. 无重复字符的最长子串</a>：维护字母统计窗口，使用双指针维护滑动窗口内不会出现重复的字符，记录双指针之间的最大距离</li><li><a href="https://leetcode.cn/problems/find-all-anagrams-in-a-string/description/?envType=study-plan-v2&amp;envId=top-100-liked">438. 找到字符串中所有字母异位词</a>：统计待匹配字符串的 p_counter，统计被匹配字符串 s 的 n 个值（滑动窗口初始化），依次移动 s 上的滑动窗口（维护滑动窗口），判断 s_counter 是否等于 p_counter 即可</li></ul><h3 id="字串"><a href="#字串" class="headerlink" title="字串"></a>字串</h3><ul><li><a href="https://leetcode.cn/problems/subarray-sum-equals-k/description/?envType=study-plan-v2&amp;envId=top-100-liked">560. 和为 K 的子数组</a>：记录前缀和，两个前缀和相减等于 target，将前缀和保存成字典即可（需要记录指定前缀和的数量）</li><li><a href="https://leetcode.cn/problems/sliding-window-maximum/description/?envType=study-plan-v2&amp;envId=top-100-liked">239. 滑动窗口最大值</a>：</li><li><a href="https://leetcode.cn/problems/minimum-window-substring/description/?envType=study-plan-v2&amp;envId=top-100-liked">76. 最小覆盖子串</a>：对目标串建立字典，使用双指针，移动 r 的过程看是否满足字典匹配（check），如果匹配开始移动 l，记录 l 的最右位置，记录此时 l 与 r 之间的距离，并保存最小距离时的字串</li></ul><h3 id="普通数组"><a href="#普通数组" class="headerlink" title="普通数组"></a>普通数组</h3><ul><li><a href="https://leetcode.cn/problems/maximum-subarray/description/?envType=study-plan-v2&amp;envId=top-100-liked">53. 最大子数组和</a>：动态规划，dp[i] &#x3D; max(nums[i], dp[i-1]+nums[i])，也就是前一个是负数就不加入到后续的最大和子数组了</li><li><a href="https://leetcode.cn/problems/merge-intervals/description/?envType=study-plan-v2&amp;envId=top-100-liked">56. 合并区间</a>：逐个判断是否能与上一个 merged 区间合并，如果合并不了将上一个 merged 区间归档</li><li><a href="https://leetcode.cn/problems/rotate-array/description/?envType=study-plan-v2&amp;envId=top-100-liked">189. 轮转数组</a>：旋转三次，注意 k 对 n 取模即可</li><li><a href="https://leetcode.cn/problems/product-of-array-except-self/description/?envType=study-plan-v2&amp;envId=top-100-liked">238. 除自身以外数组的乘积</a>：从左向右递乘LR，从右向左递乘RL，然后记录 LR[i-1]* RL[i+1]（注意边界即可）</li><li><a href="https://leetcode.cn/problems/first-missing-positive/description/?envType=study-plan-v2&amp;envId=top-100-liked">41. 缺失的第一个正数</a>：</li></ul><h3 id="矩阵"><a href="#矩阵" class="headerlink" title="矩阵"></a>矩阵</h3><ul><li><a href="https://leetcode.cn/problems/set-matrix-zeroes/?envType=study-plan-v2&amp;envId=top-100-liked">73. 矩阵置零</a>：统计横向为 0 的 set 和 纵向为 0 的 set，遍历两个 set 分别设置对应行或者列为 0</li><li><a href="https://leetcode.cn/problems/spiral-matrix/description/?envType=study-plan-v2&amp;envId=top-100-liked">54. 螺旋矩阵</a>：一共 n * n 个元素，设置四个轮转方向，遇到 flag 就转向（flag 可以设置为一个最小值 - 1）</li><li><a href="https://leetcode.cn/problems/rotate-image/description/?envType=study-plan-v2&amp;envId=top-100-liked">48. 旋转图像</a>：四个值轮转（找四个特殊点计算关系）</li><li><a href="https://leetcode.cn/problems/search-a-2d-matrix-ii/description/?envType=study-plan-v2&amp;envId=top-100-liked">240. 搜索二维矩阵 II</a>：类似于二分查找树，右上角作为根节点</li></ul><h3 id="链表"><a href="#链表" class="headerlink" title="链表"></a>链表</h3><ul><li><a href="https://leetcode.cn/problems/intersection-of-two-linked-lists/description/?envType=study-plan-v2&amp;envId=top-100-liked">160. 相交链表</a>：统计长度，让长的链表先移动，等长之后一起移动（移动前判别节点是否相等）</li><li><a href="https://leetcode.cn/problems/reverse-linked-list/description/?envType=study-plan-v2&amp;envId=top-100-liked">206. 反转链表</a>：使用 pre 节点记录上一个，使用 p 记录本节点（初始化为 head ），逐个处理即可</li><li><a href="https://leetcode.cn/problems/palindrome-linked-list/description/?envType=study-plan-v2&amp;envId=top-100-liked">234. 回文链表</a>：链表计数，反转后半部分，使用快慢指针逐个判别</li><li><a href="https://leetcode.cn/problems/linked-list-cycle/description/?envType=study-plan-v2&amp;envId=top-100-liked">141. 环形链表</a>：使用快慢指针判断（先转移指针，在判断是否是相同的指针）</li><li><a href="https://leetcode.cn/problems/linked-list-cycle-ii/description/?envType=study-plan-v2&amp;envId=top-100-liked">142. 环形链表 II</a>：使用快慢指针判别，重置 f 指针，一步一步移动直到相等（需要排除节点个数小于1且没有环的情况）</li><li><a href="https://leetcode.cn/problems/merge-two-sorted-lists/description/?envType=study-plan-v2&amp;envId=top-100-liked">21. 合并两个有序链表</a>：选择较小的逐个合并即可</li><li><a href="https://leetcode.cn/problems/add-two-numbers/description/?envType=study-plan-v2&amp;envId=top-100-liked">2. 两数相加</a>：reverse 两个数字，节点逐个相加（节点合并，短链表合到长链表上），然后再 reverse 回来</li><li><a href="https://leetcode.cn/problems/remove-nth-node-from-end-of-list/description/?envType=study-plan-v2&amp;envId=top-100-liked">19. 删除链表的倒数第 N 个结点</a>：统计链表长度 L，设置 p 移动 L - N - 1 长度，然后跳过下一个节点即可</li><li><a href="https://leetcode.cn/problems/swap-nodes-in-pairs/description/?envType=study-plan-v2&amp;envId=top-100-liked">24. 两两交换链表中的节点</a>：</li><li><a href="https://leetcode.cn/problems/reverse-nodes-in-k-group/description/?envType=study-plan-v2&amp;envId=top-100-liked">25. K 个一组翻转链表</a></li><li><a href="https://leetcode.cn/problems/copy-list-with-random-pointer/description/?envType=study-plan-v2&amp;envId=top-100-liked">138. 随机链表的复制</a>：</li><li><a href="https://leetcode.cn/problems/sort-list/description/?envType=study-plan-v2&amp;envId=top-100-liked">148. 排序链表</a>：归并排序思想（对子链表统计长度，分成两部分，分别排序）</li><li><a href="https://leetcode.cn/problems/merge-k-sorted-lists/description/?envType=study-plan-v2&amp;envId=top-100-liked">23. 合并 K 个升序链表</a>：ListNode.<strong>lt</strong> &#x3D; lambda a, b : a.val &lt; b.val，定义节点的比较函数，使用堆对链表头节点排序</li><li><a href="https://leetcode.cn/problems/lru-cache/description/?envType=study-plan-v2&amp;envId=top-100-liked">146. LRU 缓存</a>：</li></ul><h3 id="二叉树"><a href="#二叉树" class="headerlink" title="二叉树"></a>二叉树</h3><ul><li><a href="https://leetcode.cn/problems/binary-tree-inorder-traversal/description/?envType=study-plan-v2&amp;envId=top-100-liked">94. 二叉树的中序遍历</a>：递归进行中序遍历即可；非递归，使用栈保存节点（cur指针一直往左，否则弹出节点往右移动一个，记录弹出节点的值）</li><li><a href="https://leetcode.cn/problems/maximum-depth-of-binary-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">104. 二叉树的最大深度</a>：层次遍历，记录最大层数；递归方法，向上返回左右节点深度</li><li><a href="https://leetcode.cn/problems/invert-binary-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">226. 翻转二叉树</a>：空时返回，否则递归反转左右并赋给右左</li><li><a href="https://leetcode.cn/problems/symmetric-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">101. 对称二叉树</a>：当前节点值判别 + 四个节点两两对应的判别</li><li><a href="https://leetcode.cn/problems/diameter-of-binary-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">543. 二叉树的直径</a>：当左右节点都是 None 时，返回直径为 0，否则计算非空左右的直径，相加即为总直径（保存最大值），向上返回最大直径</li><li><a href="https://leetcode.cn/problems/binary-tree-level-order-traversal/description/?envType=study-plan-v2&amp;envId=top-100-liked">102. 二叉树的层序遍历</a>：使用队列逐层遍历即可</li><li><a href="https://leetcode.cn/problems/convert-sorted-array-to-binary-search-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">108. 将有序数组转换为二叉搜索树</a>：构建build函数，传入中序左右位置，每次选中间节点作为根节点，逐级构建</li><li><a href="https://leetcode.cn/problems/validate-binary-search-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">98. 验证二叉搜索树</a>：中序遍历，判断元素是否是严格递增的</li><li><a href="https://leetcode.cn/problems/kth-smallest-element-in-a-bst/description/?envType=study-plan-v2&amp;envId=top-100-liked">230. 二叉搜索树中第 K 小的元素</a>：中序遍历，取 k - 1</li><li><a href="https://leetcode.cn/problems/binary-tree-right-side-view/description/?envType=study-plan-v2&amp;envId=top-100-liked">199. 二叉树的右视图</a>：层序遍历，每次取最后一个</li><li><a href="https://leetcode.cn/problems/flatten-binary-tree-to-linked-list/description/?envType=study-plan-v2&amp;envId=top-100-liked">114. 二叉树展开为链表</a>：</li><li><a href="https://leetcode.cn/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/?envType=study-plan-v2&amp;envId=top-100-liked">105. 从前序与中序遍历序列构造二叉树</a>：前序第一个节点是中间节点，找到该节点在中序中的位置 &amp; 计算左子树大小 &amp; 前序遍历拆分 &amp; 中序遍历拆分，分别构建左右子树即可</li><li><a href="https://leetcode.cn/problems/path-sum-iii/description/?envType=study-plan-v2&amp;envId=top-100-liked">437. 路径总和 III</a>：记录路径的前缀和字典（前缀和个数），判断target - 当前前缀是否在前缀和字典里，并统计数量即可（注意退出当前节点需要删除当前的前缀和）</li><li><a href="https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/?envType=study-plan-v2&amp;envId=top-100-liked">236. 二叉树的最近公共祖先</a>：自底向上收缩树，遇到 None 和 p q 向上收缩，判断当前节点的左右情况，如果一边为 None，祖先（或者p q）在另一边，如果两边都不是 None，说明当前节点就是祖先，向上返回即可</li><li><a href="https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/?envType=study-plan-v2&amp;envId=top-100-liked">124. 二叉树中的最大路径和</a>：返回左右路径与 0 相比的最大值，计算左右路径与根节点相加的路径和（记录这个过程中的最大值）</li></ul><h3 id="栈"><a href="#栈" class="headerlink" title="栈"></a>栈</h3><ul><li><a href="https://leetcode.cn/problems/largest-rectangle-in-histogram/description/?envType=study-plan-v2&amp;envId=top-100-liked">84. 柱状图中最大的矩形</a>：单调增栈，确定每一个元素的左右边界（遇到减的元素，当前元素就是栈顶的右边界；加入元素前，栈顶元素就是当前元素的左边界）</li></ul><h3 id="多维动态规划"><a href="#多维动态规划" class="headerlink" title="多维动态规划"></a>多维动态规划</h3><ul><li><a href="https://leetcode.cn/problems/word-break/description/">139. 单词拆分</a>：i 是字符串目标位置，j 是字符串切分起始位置，判断 j 处是否能切分，如果能切分，更新 i 位置能否切分</li><li><a href="https://leetcode.cn/problems/word-break-ii/description/">140. 单词拆分 II</a>：i 是字符串目标位置，j 是字符串切分起始位置，判断 j 处是否能切分，如果能切分，更新 i 位置的切分字符串，并更新 i 位置是否能切分（带记录的动态规划）</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;LeetCode Hot 100 题目记录&lt;/p&gt;</summary>
    
    
    
    <category term="Algorithm" scheme="https://www.delta1037.cn/categories/Algorithm/"/>
    
    
    <category term="算法" scheme="https://www.delta1037.cn/tags/%E7%AE%97%E6%B3%95/"/>
    
  </entry>
  
  <entry>
    <title>面试-算法基础</title>
    <link href="https://www.delta1037.cn/2024/Project/%E9%9D%A2%E8%AF%95-%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/"/>
    <id>https://www.delta1037.cn/2024/Project/%E9%9D%A2%E8%AF%95-%E7%AE%97%E6%B3%95%E5%9F%BA%E7%A1%80/</id>
    <published>2024-12-03T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.118Z</updated>
    
    <content type="html"><![CDATA[<p>记录算法基础内容：数据结构基础、一些比较重要的题目、问的较多的原理和 Python  刷算法的基础操作。</p><span id="more"></span><h2 id="基础参考"><a href="#基础参考" class="headerlink" title="基础参考"></a>基础参考</h2><p><a href="https://algo.itcharge.cn/">算法通关手册（LeetCode）</a></p><h2 id="算法题目"><a href="#算法题目" class="headerlink" title="算法题目"></a>算法题目</h2><blockquote><p>记录一些比较重要的题目</p></blockquote><p><strong>数组</strong>：</p><ul><li><a href="https://leetcode.cn/problems/two-sum/description/">1. 两数之和</a>：使用 hash 表来存储其中一个数字，然后找另一个数字即可</li><li><a href="https://leetcode.cn/problems/3sum/description/">15. 三数之和</a>：第一层循环作为第一个数字（跳过相同的数字），后边使用双指针，查找三数相加等于 0 的元组（在等于 0 的条件内部，双指针跳过相同的数字）</li><li><a href="https://leetcode.cn/problems/add-strings/description/">415. 字符串相加</a>：逆序，逐个字符处理即可</li><li><a href="https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/">28. 找出字符串中第一个匹配项的下标</a>：KMP 算法，先生成 next 数组，然后再根据 next 数组来判别匹配的大小</li><li><a href="https://leetcode.cn/problems/longest-palindromic-substring/description/">5. 最长回文子串</a>：最长回文（马拉车或者动态规划），动态规划方法单独考虑两个字符相邻的情况（i 从小到大，j从大到小）</li><li><a href="https://leetcode.cn/problems/sort-an-array/description/">912. 排序数组</a>：快速排序实现（设置 flag，从右侧找小于 flag 填到 flag_idx_l，从左侧找大于 flag 填到 flag_idx_h，最后将 flag 回填）</li><li><a href="https://leetcode.cn/problems/kth-largest-element-in-an-array/description/">215. 数组中的第 K 个最大元素</a>：快速排序的应用，只排需要的部分（这个题可能要用三路快排，要不然有一个变态样例过不了）</li><li><a href="https://leetcode.cn/problems/top-k-frequent-elements/description/">347. 前 K 个高频元素</a>：Top-K，先统计频率，再使用优先队列排序</li><li><a href="https://leetcode.cn/problems/longest-consecutive-sequence/description/">128. 最长连续序列</a>：构建 hash 表，遍历元素找到以该元素为起点的最长连续序列（起点判断方法是看上一个元素在不在，如果有上一个元素则该元素就不是起点）</li></ul><p><strong>链表</strong>：</p><ul><li><a href="https://leetcode.cn/problems/merge-two-sorted-lists/description/">21. 合并两个有序链表</a>：创建新的头 h 和移动 p，依次续上两个链表中值比较大的节点（选择节点后并向后移动游标）</li><li><a href="https://leetcode.cn/problems/odd-even-linked-list/description/">328. 奇偶链表</a>：创建两个链表，分成奇节点和偶节点续上，最后将其中一个链表续到另一个末尾</li><li><a href="https://leetcode.cn/problems/reverse-linked-list-ii/">92. 反转链表 II</a>：设置游标 + 上一个节点指针，逐个逆转即可</li><li><a href="https://leetcode.cn/problems/reverse-nodes-in-k-group/description/">25. K 个一组翻转链表</a>：循环，判断位置并截断，子函数反转，再对接到新链表上</li><li><a href="https://leetcode.cn/problems/linked-list-cycle-ii/description/">142. 环形链表 II</a>：快慢指针判断是否有环；将 slow 重置到 head，再一步一步走，与 fast 相遇的时候就是环的入口</li></ul><p><strong>二叉树</strong>：</p><ul><li><a href="https://leetcode.cn/problems/lowest-common-ancestor-of-a-binary-tree/description/">236. 二叉树的最近公共祖先</a>：向上传递 NULL 或者目标节点或者祖先（三种情况），递归操作，如果一边为 NULL 则肯定在另一边（另一边可能也没有），如果两边都不是 NULL（p 和 q 就是从两边传上来的） 则说明本节点就是祖先</li><li><a href="https://leetcode.cn/problems/invert-binary-tree/description/">226. 翻转二叉树</a>：每个节点交换左右子树即可（递归操作）</li><li><a href="https://leetcode.cn/problems/longest-univalue-path/description/">687. 最长同值路径</a>：分别判断左右最长，然后合并求跨当前节点最长；向上返回左右最长之一（注意最长路径是边数，不是节点数）</li><li><a href="https://leetcode.cn/problems/find-mode-in-binary-search-tree/description/">501. 二叉搜索树中的众数</a>：二叉搜素树中序遍历是是有序的数组</li><li><a href="https://leetcode.cn/problems/binary-tree-maximum-path-sum/description/">124. 二叉树中的最大路径和</a>：DFS 遍历，记录左右节点的值与 0（忽略子节点） 相比的较大值，计算左右与当前节点相加的值并记录最大值，向上返回根节点+左右节点中的较大值</li><li><a href="https://leetcode.cn/problems/dui-cheng-de-er-cha-shu-lcof/description/">LCR 145. 判断对称二叉树</a>：check 当前节点是否相等，递归遍历左与右对比，右与左对比</li><li>二叉树遍历：前序、中序、后续（递归 or 非递归——使用栈）；层序——队列</li><li>二叉树还原：中序 + 前序或者后续；如果是前序 + 后续则存在多种情况</li><li>平衡二叉树：树的高度平衡（旋转方法，也就是代码中的操作流程）</li><li>红黑树：相对平衡二叉树（AVL）旋转次数变少，效率更高（增加、删除操作比查找操作多的情况下）</li><li>手写子典树：树节点分叉（分叉类型，可以是字母类型，边上代表字母） + 终止标记（标记单词结束）子典树</li></ul><p><strong>图</strong>：</p><ul><li><a href="https://leetcode.cn/problems/course-schedule/description/">207. 课程表</a>：map 记录 next，数组记录入度；首次将入度为 0 的节点加入到队列，依次处理队列，处理 map 中该值并修改入度数组，将新入度 0 加入到队列；判断入度数组是否全为 0 即可</li><li><a href="https://leetcode.cn/problems/number-of-provinces/description/">547. 省份数量</a>：并查集（并查集，记住基本函数即可）。初始省份数量是节点个数，每次进行合并操作减 1。</li><li><a href="https://leetcode.cn/problems/find-if-path-exists-in-graph/description/">1971. 寻找图中是否存在路径</a>：并查集（并查集，记住基本函数即可）。如果存在路径，则起始和结束节点属于同一个根节点</li><li><a href="https://leetcode.cn/problems/max-area-of-island/description/">695. 岛屿的最大面积</a>：深度优先搜索，搜索过的点设置为 0（标记）。转向序列（{0，1}，{1，0}，{0，-1}，{-1，0}）</li></ul><p><strong>动态规划 &amp; 贪心</strong>：</p><ul><li><a href="https://leetcode.cn/problems/paths-in-matrix-whose-sum-is-divisible-by-k/description/">2435. 矩阵中和能被 K 整除的路径</a>：二维动态规划，将 mod 值作为第三个状态</li><li><a href="https://leetcode.cn/problems/longest-increasing-subsequence/description/">300. 最长递增子序列</a>：简单动态规划</li><li><a href="https://leetcode.cn/problems/best-time-to-buy-and-sell-stock/description/">121. 买卖股票的最佳时机</a>：记录最小值，计算与最小值之间的差值</li><li><a href="https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/description/">122. 买卖股票的最佳时机 II</a>：记录每一段上升区间</li><li><a href="https://leetcode.cn/problems/maximum-subarray/description/">53. 最大子数组和</a>：动态规划，记录某个位置结尾数组和，找到最大值</li></ul><p><strong>回溯</strong>：</p><ul><li><a href="https://leetcode.cn/problems/restore-ip-addresses/description/">93. 复原 IP 地址</a>：回溯方法，查找起点开始的 1-3 个字符，判断是否是有效字符，追加到总 path 里</li></ul><p><strong>栈 &amp; 队列</strong>：</p><ul><li><a href="https://leetcode.cn/problems/valid-parentheses/description/">20. 有效的括号</a>：栈操作（如果不用栈怎么解决？）</li><li><a href="https://leetcode.cn/problems/trapping-rain-water/description/">接雨水</a>：维护单调递减栈，遇到增量值时拿出来计算与左挡板距离，和底部元素高度差</li><li>两个栈实现队列：两个栈倒来倒去就可以了</li><li>两个队列实现栈：用辅助队列实现弹出操作（出队直到剩余一个，即弹出的数据）</li></ul><p><strong>设计</strong>：</p><ul><li><a href="https://leetcode.cn/problems/lru-cache/description/">146. LRU 缓存</a>：map 存储 key 和 Node* 的映射关系，方便快速找到 Node*；双向链表维护节点访问顺序（如果节点超了就从末尾删一个）。 get（没有返回-1；访问到挪到双向链表头部）；put（没有，添加进去，并判断容量，删除超的；有，更新，挪到头部）<ul><li>带过期时间的 LRU 算法：将过期时间使用另一个 map 来维护（put 和 get 分别判断过期和重置过期时间）；可以使用一个额外的线程来惰性删除</li></ul></li><li><a href="https://leetcode.cn/problems/lfu-cache/description/">460.LFU 缓存</a>：最近最少次数使用（将双向链表改成优先队列？）</li><li><a href="https://leetcode.cn/problems/basic-calculator/description/?envType=company&amp;envId=huawei&amp;favoriteSlug=huawei-three-months">224. 基本计算器</a>：使用栈来表示当前括号层次的符号，遇到左括号则保存符号到栈，遇到右括号则弹出符号，本质上是表示各层次括号外部的符号</li></ul><p><strong>其它</strong>：</p><ul><li>题目：有一个长度 100 的 01 数组，可以反转 K 个1成为0，求解反转后的最大连续0的长度<ul><li>解法：滑动窗口算法，统计窗口内1 的数量并记录窗口的最大长度</li></ul></li></ul><h2 id="算法原理"><a href="#算法原理" class="headerlink" title="算法原理"></a>算法原理</h2><p><strong>哈希表</strong>：</p><ul><li>哈希算法：加法哈希、乘法哈希、异或哈希、旋转哈希</li><li>哈希冲突：链表法（相同的节点后面加链表）；开放寻址法（向后找一个空位置）</li></ul><p><strong>红黑树与 AVL 树对比</strong>：</p><ul><li>红黑树是没那么平衡的平衡树，是查找效率与插入效率的折中</li></ul><h2 id="算法操作"><a href="#算法操作" class="headerlink" title="算法操作"></a>算法操作</h2><p>Python 算法基础操作：</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></pre></td><td class="code"><pre><span class="line"><span class="comment"># 列表</span></span><br><span class="line">copy_list = a[:]</span><br><span class="line">reverse_list = a[::-<span class="number">1</span>]</span><br><span class="line"></span><br><span class="line"><span class="comment"># 字典</span></span><br><span class="line">d = collections.defaultdict(<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">s_c = Counter(s)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 栈</span></span><br><span class="line">sta = []</span><br><span class="line">sta.append(val)</span><br><span class="line">val = sta.pop()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 队列</span></span><br><span class="line">q = deque()</span><br><span class="line">q.pop()</span><br><span class="line">q.popleft()</span><br><span class="line">q.append(val)</span><br><span class="line">q.appendleft(val)</span><br><span class="line"></span><br><span class="line"><span class="comment"># 集合</span></span><br><span class="line">s = <span class="built_in">set</span>()</span><br><span class="line">s.add(val)</span><br><span class="line">s.discard(val)</span><br><span class="line">s.remove(val)</span><br><span class="line">v = s.pop()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 有序集合</span></span><br><span class="line"><span class="keyword">from</span> sortedcontainers <span class="keyword">import</span> SortedList</span><br><span class="line">s.add()</span><br><span class="line"></span><br><span class="line"><span class="comment"># 堆</span></span><br><span class="line"><span class="keyword">import</span> heapq</span><br><span class="line"><span class="comment"># 默认小顶堆，加负号成大顶堆</span></span><br><span class="line">heap = []</span><br><span class="line">heapq.heappush(heap, val)</span><br><span class="line">val = heapq.heappop(heap)</span><br><span class="line"></span><br><span class="line"><span class="comment"># node 自定义小于比较器</span></span><br><span class="line">ListNode.__lt__ = <span class="keyword">lambda</span> a, b : a.val &lt; b.val</span><br><span class="line"></span><br><span class="line"><span class="comment"># 输入处理</span></span><br><span class="line">num = <span class="built_in">int</span>(<span class="built_in">input</span>())</span><br><span class="line">num_list = [<span class="built_in">list</span>(<span class="built_in">map</span>(<span class="built_in">int</span>, <span class="built_in">input</span>().split())) <span class="keyword">for</span> _ <span class="keyword">in</span> <span class="built_in">range</span>(lines)]</span><br><span class="line"></span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;记录算法基础内容：数据结构基础、一些比较重要的题目、问的较多的原理和 Python  刷算法的基础操作。&lt;/p&gt;</summary>
    
    
    
    <category term="面试" scheme="https://www.delta1037.cn/categories/%E9%9D%A2%E8%AF%95/"/>
    
    
    <category term="算法" scheme="https://www.delta1037.cn/tags/%E7%AE%97%E6%B3%95/"/>
    
    <category term="Python" scheme="https://www.delta1037.cn/tags/Python/"/>
    
  </entry>
  
  <entry>
    <title>面试-基础知识</title>
    <link href="https://www.delta1037.cn/2024/Project/%E9%9D%A2%E8%AF%95-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/"/>
    <id>https://www.delta1037.cn/2024/Project/%E9%9D%A2%E8%AF%95-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86/</id>
    <published>2024-12-03T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.114Z</updated>
    
    <content type="html"><![CDATA[<p>记录面试的基础知识（要点速记），用于面试前的速览（临阵磨枪）</p><span id="more"></span><h1 id="一、操作系统"><a href="#一、操作系统" class="headerlink" title="一、操作系统"></a>一、操作系统</h1><h2 id="Linux-进程"><a href="#Linux-进程" class="headerlink" title="Linux 进程"></a>Linux 进程</h2><p><strong>进程和线程</strong>：进程（资源分配单位）、线程（最小调度单位）</p><ul><li>线程：创建开销小、上下文切换快</li></ul><p><strong>线程和协程</strong>：协程是用户级轻量级线程，没有内核态切换开销</p><ul><li>C++ 20 协程：一种特殊的可重入函数（挂起或者恢复运行）</li></ul><p><strong>进程和程序</strong>：进程（程序的一次执行过程、动态）、程序（静态，代表算法实体）</p><p><strong>进程状态</strong>：创建、就绪、运行、阻塞、停止</p><ul><li>运行-&gt;就绪：时间片用完 or 被高优先级进程抢占</li><li>运行-&gt;阻塞：IO 请求 or 等待资源 or 等待事件</li></ul><p><strong>孤儿进程、僵尸进程</strong>：</p><ul><li>孤儿进程：父进程挂，子进程被 init 收养</li><li>僵尸进程：子进程挂，父进程没回收子进程<ul><li>解决：杀死父进程；建立子进程时就脱离父子关系（fork 两次，运行孙子，关闭父亲：手动制作孤儿）</li></ul></li></ul><p><strong>进程间协作关系</strong>：通信（交换数据）、互斥（处理资源竞争）、同步（协调点）</p><ul><li>通信：共享内存、消息队列、Socket、管道、信号<ul><li>共享内存同步：信号量</li></ul></li><li>互斥：互斥锁（自旋锁、读写锁）、信号量<ul><li>互斥锁：用于保护共享资源，确保同一时刻只有一个线程可以访问资源</li><li>信号量：控制对有限数量资源的访问，允许同时访问资源</li></ul></li><li>同步：信号量、条件变量、事件、屏障</li></ul><p><strong>线程安全</strong>：</p><ul><li>本质：存在资源共享 &amp; 数据竞争，原子性问题（操作不能原子性的完成）</li><li>解决：同步机制，原子操作</li></ul><p><strong>进程切换过程</strong>：保存上下文、更新 PCB、新进程 + 更新 PCB、更新内存数据结构</p><p><strong>进程管理</strong>：</p><ul><li>进程描述：PCB &#x3D;&#x3D; task_struct</li><li>进程管理：进程描述节点构建成进程队列，根据队列在 CPU 上调度</li><li>进程调度：调度的对象就是 task_struct，使用调度器（Deadline 调度器 &gt; RT 调度器 &gt; CFS 调度器）调度</li></ul><p><strong>进程绑定</strong>：将进程绑定到指定的 CPU 核心上运行</p><ul><li>作用：减少调度开销</li><li>亲和性：软亲和性、硬亲和性</li><li>操作：命令（taskset）；API 接口（sched_setaffinity、sched_getaffinity）</li></ul><p><strong>锁类型</strong>：互斥锁、自旋锁、读写锁、自适应锁（尝试获取一定次数，获取不到就休眠；互斥和自旋的折中选择）</p><p><strong>锁的实现原理</strong>：</p><ul><li>互斥锁：使用 CAS，如果 swap 不成功，则线程进入队列同等优先级队列末尾（休眠）</li><li>自旋锁：通过 TAS，设置 flag</li></ul><p><strong>原子操作实现</strong>：</p><ul><li>硬件指令：TAS（Test-and-Set）、CAS（Compare-and-Swap）、Fetch-and-Add、Exchange</li><li>自旋锁：底层是 TAS</li><li>互斥锁：底层是 CAS</li><li>信号量：底层是 Fetch-and-Add 和 Fetch-and-Sub</li></ul><p><strong>CAS</strong>：原子的更新值，等于预期值才更新</p><ul><li>问题：ABA 问题（无法识别这种情况）</li></ul><p><strong>死锁四个必要条件</strong>：</p><ul><li>互斥条件：资源一次只能被一个进程使用</li><li>不可抢占：资源不能被强制剥夺</li><li>占有等待条件：占有资源的同时等待其它资源</li><li>循环等待条件：等待进程形成循环链</li></ul><p><strong>死锁问题</strong>：</p><ul><li>死锁避免：按照顺序加锁（避免死锁）；银行家算法</li><li>死锁处理：设置锁的获取时间上限（主动放弃策略）；监测并中断线程——看门狗（被动放弃策略，丢失上下文，处理结构做反馈处理）</li></ul><p><strong>场景-三个线程轮流打印</strong>：使用锁 + 条件变量，条件变量控制轮到那个线程打印数据（打印后更新要打印的线程 id），notify 其它线程</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;mutex&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="keyword">include</span> <span class="string">&lt;condition_variable&gt;</span></span></span><br><span class="line"></span><br><span class="line">std::mutex mtx;</span><br><span class="line">std::condition_variable cv;</span><br><span class="line"><span class="type">int</span> current = <span class="number">0</span>;  <span class="comment">// 当前应该打印的线程编号</span></span><br><span class="line"></span><br><span class="line"><span class="function"><span class="type">void</span> <span class="title">printNumber</span><span class="params">(<span class="type">int</span> id, <span class="type">int</span> total)</span> </span>&#123;</span><br><span class="line">    <span class="keyword">for</span> (<span class="type">int</span> i = <span class="number">0</span>; i &lt; total; ++i) &#123;</span><br><span class="line">        <span class="function">std::unique_lock&lt;std::mutex&gt; <span class="title">lock</span><span class="params">(mtx)</span></span>;</span><br><span class="line">        cv.<span class="built_in">wait</span>(lock, [id] &#123; <span class="keyword">return</span> current == id; &#125;);</span><br><span class="line"></span><br><span class="line">        std::cout &lt;&lt; <span class="string">&quot;Thread &quot;</span> &lt;&lt; id + <span class="number">1</span> &lt;&lt; <span class="string">&quot;: &quot;</span> &lt;&lt; (id + <span class="number">1</span>) &lt;&lt; std::endl;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 更新当前应该打印的线程编号</span></span><br><span class="line">        current = (current + <span class="number">1</span>) % <span class="number">3</span>;</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 通知下一个线程</span></span><br><span class="line">        cv.<span class="built_in">notify_all</span>();</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">std::thread <span class="title">t1</span><span class="params">(printNumber, <span class="number">0</span>, total)</span></span>;</span><br><span class="line">t1.<span class="built_in">join</span>();</span><br><span class="line"></span><br></pre></td></tr></table></figure><p><strong>多核一致性</strong>：</p><ul><li>缓存与内存一致性：写直达（同时写内存和缓存）、写回（写缓存）</li><li>缓存一致性：总线嗅探 + MESI 协议（降低总线压力）</li></ul><h2 id="Linux-内存"><a href="#Linux-内存" class="headerlink" title="Linux 内存"></a>Linux 内存</h2><p><strong>局部性原理</strong>：（缓存、内存、文件系统、数据库）</p><ul><li>时间局部性：较短的时间间隔，程序会访问同一个位置</li><li>空间局部性：较短的时间间隔，程序会访问相邻的位置</li></ul><p><strong>虚拟内存结构</strong>：内核空间、栈、文件映射与匿名映射（内存映射区、动态链接库）、堆、BSS（未初始化的）、数据段（初始化的）、代码段。Linux 物理内存管理</p><ul><li>变量存储区：BSS 段存储了未初始化的全局变量（或者初始化为0的）；数据段存储了初始化的全局变量（初始化不为0）</li><li>分段：权限管理</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Project_%E9%9D%A2%E8%AF%95-%E5%9F%BA%E7%A1%80%E7%9F%A5%E8%AF%86_26788240a7bb80a9a38bd5b4286ae238.png" alt="26788240a7bb80a9a38bd5b4286ae238"></p><p><strong>虚拟内存</strong>：</p><ul><li>段页式：（段选择再分页：逻辑地址、线性地址、物理地址）</li><li>TLB 缓存，与 MMU 模块交互</li></ul><p><strong>虚拟地址转物理地址</strong>：</p><ul><li>步骤：虚拟地址分解（页号+页内偏移）、查找页表（根据页号获取物理页帧号，可能是多级的页表）、生成物理地址（物理页帧号 X 页大小 + 页内偏移）</li><li>多级页表：减少页表占用内存空间（按需加载部分的页表）</li><li>TLB：（Translation Lookaside Buffer）加速地址转换的缓存（MMU中的），缓存了最近使用的映射关系</li><li>物理页不存在：进行页面置换，将页从磁盘加载到物理内存</li></ul><p><strong>虚拟内存比物理内存大</strong>：</p><ul><li>机制：分页机制（不是所有的页都在物理内存）；内存交换（换出不适用的页）</li></ul><p><strong>页面置换</strong>：</p><ul><li>算法：FIFO（先进先出）、LRU（最近最少使用：实现略复杂）、LFU（最不经常使用：可能导致新页面会置换）</li></ul><p><strong>虚拟内存作用</strong>：隔离保护、共享内存、简化程序设计（无需关心实际分布）、支持大内存、提高内存利用率</p><p><strong>线程内存</strong>：</p><ul><li>共享：文件等公用资源、堆、数据段（全局变量和静态变量）、代码段</li><li>独享：栈</li></ul><p><strong>进程 fork</strong>：拷贝 PCB（父进程的一个副本），子进程独占代码段、数据段和堆栈内存（一开始共享，写操作才为子进程分配内存空间（COW））</p><ul><li>fork 后父进程返回子进程 ID（用于追踪子进程）；子进程返回 0（区分父子进程）</li><li>fork 配合 exec：exec 将替换现有的程序，相互配合用来创建新进程</li><li>COW：推迟或者避免数据拷贝（redis 用来创建内容映像）</li><li>clone：可以指定在创建新进程时指定哪些资源共享或者哪些资源复制（适用于创建线程，或者细粒度控制资源共享的场景）</li></ul><p><strong>栈帧</strong>：</p><ul><li>作用：支持函数调用和返回</li><li>内容：局部变量、参、返回地址</li></ul><h2 id="Linux-IO"><a href="#Linux-IO" class="headerlink" title="Linux IO"></a>Linux IO</h2><p><strong>IO 模型</strong>：阻塞、非阻塞、IO 多路复用、信号驱动、异步 IO（aio、io_uring）</p><p><strong>异步 IO</strong>：发起 IO 操作之后可以去干别的事</p><ul><li>作用：允许应用同时处理多个请求；不需要多余的操作（不断观察状态之类的，即非阻塞的情形）</li></ul><p><strong>多路复用</strong>：提高 I&#x2F;O 操作效率的机制（目标端：一个进程能同时监听多个文件描述符；源端：非阻塞 IO 大量发起系统调用）</p><ul><li>select：数量有限（1024-32、2028-64）、轮询查找就绪 fd，效率低、fds 集合拷贝，高并发不适用</li><li>poll：解决了数量有限问题、无需每次重建 fds 集合</li><li>epoll：红黑树跟踪 fds、事件驱动机制，返回就绪 fd，无需再轮询</li></ul><p><strong>零拷贝技术</strong>：</p><ul><li>通用场景<ul><li>DMA：负责将数据从磁盘搬到内存（减轻 CPU 负担），CPU 告诉 DMA 搬运细节</li></ul></li><li>文件传输：零拷贝技术<ul><li>流程：磁盘 -&gt; 内核 -&gt; 用户 -&gt; socket -&gt; 网卡</li><li>mmap + write：mmap 后用户空间和内核空间共享文件缓冲区，write 时从文件缓冲区搬运到 socket 缓冲区（CPU）；mmap 映射和 socket 搬到网卡都是 DMA</li><li>sendfile：磁盘到内核缓冲区（DMA），缓冲区描述传递给 socket 缓冲区，SG-DMA 将内核缓冲区拷贝到网卡缓冲区</li></ul></li></ul><h2 id="Linux-内核"><a href="#Linux-内核" class="headerlink" title="Linux 内核"></a>Linux 内核</h2><p><strong>Linux 启动</strong>：BIOS&#x2F;UEFI，BIOS 读取 MBR，读取主引导记录找到激活的主分区，MBR 将控制权交给 PBR （Grub），Grub 一阶段（准备硬件）、Grub 二阶段（准备内核）、内核引导（使用 initramfs（或者 initrd.img） 中的驱动程序和工具来挂载真正的根文件系统），系统初始化</p><p><strong>内核态、用户态</strong>：内核态运行系统与硬件交互；用户态运行用户程序</p><ul><li>目的：防止用户进程误操作或者恶意破坏操作系统</li><li>切换：系统调用、异常、外部设备中断</li><li>减少系统调用（减少切换过程，提高性能）：无锁编程、协程（单线程内部调度）</li></ul><p><strong>内核态、用户态切换过程</strong>：保护用户态上下文，切换到内核态，执行系统调用，恢复用户态上下文，返回用户态</p><p><strong>存储系统</strong>：虚拟文件系统、设备映射器、通用块层、IO 调度程序、块设备驱动</p><h2 id="Linux-编程"><a href="#Linux-编程" class="headerlink" title="Linux 编程"></a>Linux 编程</h2><p><strong>链接库</strong>：</p><ul><li>动态链接库：运行时加载<ul><li>作用：减少可执行文件大小；提高可重用性，减少内存空间占用，即多个进程共享动态链接库；动态更新依赖库文件</li><li>链接：指向库文件的符号引用和重定位信息</li><li>运行：.dynamic 查找和加载依赖的库文件，解析可执行文件中的符号引用</li></ul></li><li>静态链接库：编译器加入到可执行文件中</li></ul><p><strong>调优</strong>：追踪系统调用、性能优化命令</p><h2 id="嵌入式"><a href="#嵌入式" class="headerlink" title="嵌入式"></a>嵌入式</h2><p><strong>中断</strong>：事件触发，暂停当前程序，转而处理事件</p><ul><li>中断类型：软件中断、硬件中断、定时器中断、异常中断</li><li>中断流程：中断请求、中断响应、中断服务、中断返回</li><li>中断优先级：用于决定多个中断请求同时发生的情况，高优先级优先处理</li><li>避免中断嵌套：禁用中断、设置中断优先级</li><li>中断向量表：中断服务地址，发生中断时，根据中断号查找向量表，跳转到对应的程序入口执行</li></ul><p><strong>嵌入式存储介质</strong>：</p><ul><li>Flash Memory：例如 eMMC（系统存储）</li><li>SD 卡：系统存储区</li><li>RAM：DRAM 和 SRAM</li></ul><p><strong>voatitle 关键字</strong>：应用场景（防止编译器对变量的优化，即编译器假设该值不会发生改变）</p><ul><li>硬件寄存器访问：值可能被外部修改，随时读取最新的值</li><li>中断服务程序：中断中修改值，循环中需要及时获取到改值的改动</li><li>多线程环境：与中断差不多</li></ul><h1 id="二、计算机网络"><a href="#二、计算机网络" class="headerlink" title="二、计算机网络"></a>二、计算机网络</h1><h2 id="基础"><a href="#基础" class="headerlink" title="基础"></a>基础</h2><p><strong>七层模型</strong>：物理层、数据链路层、网络层、传输层、会话层、表示层、应用层</p><p><strong>四层模型</strong>：网络接口层、网际层、运输层、应用层</p><p><strong>常见协议</strong>：</p><ul><li>网络层：IP、ICMP、ARP、RARP</li><li>传输层：TCP、UDP</li><li>应用层：HTTP、DNS、FTP、SMTP</li></ul><p><strong>大小端</strong>：多字节数据的字节顺序。右侧为小，左侧为大（用指针法判别；或者预定义的宏）</p><p><strong>网络协议分层</strong>：简化网络通信复杂性，提高系统可维护性和可扩展性。网络设计和实现更加模块化、标准化和易于管理</p><ul><li>物理层：物理介质传输</li><li>链路层：比特流封装成帧</li><li>网络层：包的路由和转发</li><li>传输层：端到端的数据传输</li><li>会话层：管理不同设备之间的会话（建立、维护和终止）</li><li>表示层：数据格式转换、加密和压缩</li><li>应用层：提供网络服务和应用程序之间的接口，处理用户请求和响应</li></ul><p><strong>中间人攻击</strong>：</p><ul><li>防止：加密通信、VPN、多因素认证</li></ul><h2 id="TCP-x2F-UDP"><a href="#TCP-x2F-UDP" class="headerlink" title="TCP&#x2F;UDP"></a>TCP&#x2F;UDP</h2><p><strong>区别</strong>：</p><ul><li>TCP：可靠、面向连接、字节流传输、全双工、流量控制、拥塞控制<ul><li>可靠性：序列号+确认号；超时重传+快速重传；校验和</li></ul></li><li>UDP：不可靠、无连接、报文传输、多对多（包含点到点）<ul><li>最大长度：2^32&#x3D;65535-20；超过最大长度 sendto 会报错（IP层会分片，由 IP 层负责分片和聚合）</li></ul></li></ul><p><strong>三次握手</strong>：</p><ul><li>握手流程：客户端发送初始序列号，服务端确认序列号 &amp; 发送自己的序列号，客户端确认服务端序列号</li><li>为什么三次（不是两次）：防止重复历史连接（主要，旧SYN连接），同步双方序列号</li><li>第三次丢失：服务端重传 SYN-ACK（ACK 是不会重传的）</li><li>SYN 攻击：把半连接队列打满<ul><li>解决：增大半连接队列；减少 SYN-ACK 重传次数；记录 IP，丢弃重复请求</li></ul></li><li>每次序号不一样：防止重放攻击和序列号预测；多个连接时避免混淆</li></ul><p><strong>四次挥手</strong>：</p><ul><li>挥手流程：一端主动关闭，发送请求（FIN_WAIT_1）；对端收到发送确认（对端切换到 CLOSE_WAIT，另一端收到确认切换到 FIN_WAIT_2）；对端发送关闭请求（自己切换到 LAST_ACK）；一端回复确认，切换到 TIME_WAIT（等待 2*MSL 关闭连接）</li><li>为什么等待 2*MSL：连接可靠性，防止对端没收到重发关闭请求</li><li>为什么需要四次：优雅关闭连接</li><li>为什么需要 TIME_WAIT：可靠的实现全双工连接终止；允许旧连接数据在网络中消逝</li><li>合并成三次（② 和 ③ 合并）：服务端没有数据要发送 + 开启了 TCP 延迟确认机制</li></ul><p><strong>流量控制</strong>：（作用于接收者）通过滑动窗口控制发送方的流量；接收方反馈自己的状态让发送方调整滑动窗口大小</p><p><strong>拥塞控制</strong>： （作用于网络）通过拥塞窗口控制发送速率，窗口通过网络拥塞程度调整</p><ul><li>慢启动、拥塞避免；快速重传，快速恢复</li></ul><p><strong>监听同一个端口</strong>：</p><ul><li>主进程 + work 子进程（惊群问题，Nginx 使用 accept_mutex 锁解决）：主进程执行 bind()、listen() 初始化套接字，然后 fork 新的子进程。在这些子进程中，通过 accept&#x2F;epoll_wait 同一个套接字来进行请求处理</li><li>多进程 + SO_REUSEPORT：<ul><li>目的：内核级的负载均衡；用于滚动升级（发送信号给旧进程不再处理请求）</li></ul></li></ul><h2 id="HTTP-x2F-HTTPS"><a href="#HTTP-x2F-HTTPS" class="headerlink" title="HTTP&#x2F;HTTPS"></a>HTTP&#x2F;HTTPS</h2><p><strong>HTTP 连接过程</strong>：URL 处理、DNS 查询（浏览器缓存、本地、DNS 请求）、建立连接发送请求、接收响应、呈现页面</p><p><strong>请求报文</strong>：请求行、请求头、空行、请求体</p><p><strong>响应报文</strong>：状态行、响应头、空行、响应体</p><p><strong>HTTP 请求方法</strong>：GET、POST、OPTION、HEAD、PUT、DELETE</p><ul><li>GET：用于请求数据，URL传递参数（安全性低，长度限制），幂等的</li><li>POST：用于提交数据，请求体传递参数，非幂等（可能）</li></ul><p><strong>HTTPS 加密过程</strong>：获取公钥证书、验证证书、发送会话密钥（公钥加密）、使用会话密钥建立加密连接</p><p><strong>HTTPS 连接过程</strong>：先三次握手建立连接，再走 TLS 握手（加密连接过程），使用会话密钥建立加密连接</p><p><strong>Session、Cookie、Token</strong>：</p><ul><li>Session：服务器保存的结构，跟踪用户状态</li><li>Cookie：客户端保存用户信息机制，是 Session 的一种实现</li><li>Token：令牌，服务端用来判断是哪个用户</li></ul><p><strong>HTTP 版本</strong>：</p><ul><li>HTTP 1.0：短连接（每次请求建立一次TCP连接），不支持流水线（一次只能发送一个请求）</li><li>HTTP 1.1：持久连接（一个TCP连接上可以发送多个请求和响应），支持流水线（一次发多个请求）</li><li>HTTP 2：二进制传输，多路复用、头部压缩</li><li>HTTP 3：基于 QUIC（基于UDP的可靠传输）<ul><li>QUIC：可靠 UDP 方案（数据包确认+重传机制），确认方法是乱序确认（通过offset 拼接数据）</li></ul></li></ul><h2 id="DNS"><a href="#DNS" class="headerlink" title="DNS"></a>DNS</h2><p><strong>DNS 查询过程</strong>：（递归 + 迭代），与本地域名服务器是递归查询的过程；本地域名服务器到根域名服务器或者顶级域名服务器是迭代查询的过程（减轻顶级域名服务器或者根服务器的压力）</p><h1 id="三、数据库"><a href="#三、数据库" class="headerlink" title="三、数据库"></a>三、数据库</h1><h2 id="缓存"><a href="#缓存" class="headerlink" title="缓存"></a>缓存</h2><p><strong>Redis 持久化策略</strong>：AOF、RDB</p><ul><li>AOF：文件大；恢复慢；实时性高</li><li>RDB：文件小；恢复快；实时性低</li></ul><h2 id="数据库概念"><a href="#数据库概念" class="headerlink" title="数据库概念"></a>数据库概念</h2><p><strong>BTree 索引和  B+Tree 索引</strong>：</p><ul><li>B+Tree 非叶子节点不存储数据</li></ul><p><strong>聚簇索引和非聚簇索引</strong>：</p><ul><li>聚簇索引：索引和数据放到一起存储，叶子节点保留了数据行<ul><li>优缺点：减少磁盘 IO；插入速度依赖插入顺序</li></ul></li><li>非聚簇索引：索引和数据分开存储，叶子节点存储了指向数据的指针</li></ul><p><strong>索引覆盖</strong>：从非主键索引树上就能查到数据，无需进行二次主键索引树查找</p><p><strong>联合索引</strong>：遵循最左原则</p><p><strong>四大范式</strong>：</p><ul><li>1NF：无重复的列</li><li>2NF：属性完全依赖主键</li><li>3NF：属性不依赖于其它非主属性</li><li>4NF：禁止主键列和非主键列一对多关系不受约束</li></ul><h2 id="数据库优化"><a href="#数据库优化" class="headerlink" title="数据库优化"></a>数据库优化</h2><p><strong>数据库结构优化</strong>：</p><ul><li>范式优化：表设计合理化（3NF），消除冗余（节省空间）</li><li>反范式优化：适当增加冗余（减少 JOIN）</li><li>拆分表：减少全表扫描，缩短查询时间（按月分表）</li></ul><p><strong>SQL 语句优化</strong>：</p><ul><li>where 语句：<ul><li>避免 !&#x3D; 和 &lt;&gt; 操作（将全表扫描）</li><li>避免堆字段 null 判断（将全表扫描）</li></ul></li><li>创建索引（经常判别的字段）</li><li>慢日志记录：mysqldumpslow</li></ul><p><strong>分表、分区</strong>：</p><ul><li>场景：超大表，SQL 语句已经无法继续优化</li><li>操作：<ul><li>分表：手动将数据分割，创建子表</li><li>分区：自动将数据散列，没有子表</li></ul></li></ul><p><strong>读写分离</strong>：</p><ul><li>场景：小幅提升写性能，大幅提高读性能</li><li>操作：依赖于数据库的主从复制，主数据库处理写，从数据库处理读（将SQL通过逻辑判断或者中间件选择读写数据库执行语句）</li></ul><p><strong>存储过程</strong>：</p><ul><li>定义：SQL 语句和控制语句的预编译集合，保存在数据库中，可以调用执行</li><li>场景：模块化设计；执行速度快</li></ul><p><strong>pg_repack</strong>：</p><ul><li>目标：在线清理表空间，解决大量更新引起表膨胀问题</li></ul><h1 id="四、软件设计"><a href="#四、软件设计" class="headerlink" title="四、软件设计"></a>四、软件设计</h1><h2 id="面向对象设计"><a href="#面向对象设计" class="headerlink" title="面向对象设计"></a>面向对象设计</h2><p><strong>面向对象六大原则</strong>：</p><ul><li>单一职责原则：一个类只干一件事</li><li>开闭原则：类对扩展开放、对修改封闭</li><li>里氏替换原则：父类可以替换成子类（就是子类不能覆盖父类方法）</li><li>依赖倒置原则：依赖抽象编程（具体类之间不发生依赖关系）</li><li>接口隔离原则：类的依赖应该建立在最小范围接口上</li><li>迪米特原则：一个对象应该对其它对象有最少的了解（低耦合、高内聚）</li></ul><h2 id="设计模式"><a href="#设计模式" class="headerlink" title="设计模式"></a>设计模式</h2><p><strong>23 种设计模式</strong>：</p><ul><li>工厂方法：深信服组项目，日志分析系统有不同的数据来源，使用工厂方法来设计这个模块，方便管理和新增新的数据源</li><li>单例：深信服组项目，日志控制组件的设计（只有一个实例，减少资源消耗；不适用于变化的对象）<ul><li>懒汉：静态局部变量</li><li>懒汉：双层互斥锁（返回智能指针）</li><li>懒汉：call_once</li><li>饿汉：代码一运行就创建实例（全局静态变量）</li></ul></li><li>状态：文件系统项目，不同的磁盘设备状态执行同一操作时会有不同的效果（磁盘已挂载状态和磁盘未挂载状态执行磁盘挂载操作，已挂载状态就直接返回已挂载了）</li></ul><p><strong>应用设计模式</strong>：</p><ul><li>插件化编程：通过动态加载功能模块（插件）来增强主程序功能的软件设计策略。通过制定标准化接口，确保插件和主程序之间的兼容性与独立性。提高软件灵活性和可扩展性。</li><li>动态观测：在应用中植入数据观测接口和数据观测控制（通过宏来选择是否植入数据观测代码，保证正式发布的应用的安全性），使用 Socket 套接字与其通信获取应用实时数据。</li></ul><h2 id="模块设计"><a href="#模块设计" class="headerlink" title="模块设计"></a>模块设计</h2><ul><li>看门狗：<ul><li>目的：监控持有锁的线程是否活跃</li><li>设计：注册接口（线程注册信息和看门狗处理接口），喂狗接口（线程通过该接口喂自己的狗），看门狗监控线程运行状态（如果线程很久没动就可以通过注册的处理接口来做线程销毁），反注册接口；看门狗处理接口（安全释放资源）+ 终止线程</li></ul></li><li>内存池：<ul><li>目的：提前申请内存，减少内存的频繁申请和释放</li><li>设计：内存对齐、线程安全性</li></ul></li><li>线程池：<ul><li>目的：提前创建线程，减少线程的创建和销毁</li><li>考虑：线程个数（IO密集型&#x2F;CPU密集型、系统负载、队列任务个数）。IO 密集型设置线程个数为 2N；CPU 密集型设置为 N+1</li><li>设计：任务队列（存储任务）、工作线程（从任务队列拿任务并执行）；接口设计（初始化，提交任务——任务需要的资源，任务完成后的回调接口）</li></ul></li><li>LRU 缓存：<ul><li>目的：优先资源下的缓存淘汰策略（缓存达到上限时，淘汰最近最少使用的数据）</li><li>设计：put 接口 和 get 接口</li></ul></li><li>负载均衡：<ul><li>文件系统：<ul><li>大文件分割成小文件，分布在多个磁盘上（通过文件分片实现负载均衡）；或者使用 RAID 0 来实现多个磁盘条带化存储，提高读写性能</li><li>算法：加权轮询算法</li></ul></li></ul></li><li>限流器：<ul><li>作用：限流</li><li>设计：令牌桶、漏桶、滑动窗口计数</li></ul></li><li>幂等性：<ul><li>作用：无论调用多少次接口，都得到相同的结果</li><li>设计：标识</li></ul></li><li>一致性哈希</li><li>Reactor、Proactor</li><li>ID 生成器</li><li>无锁队列</li><li>秒杀系统</li></ul><h2 id="方案设计"><a href="#方案设计" class="headerlink" title="方案设计"></a>方案设计</h2><blockquote><p>多线程、分治</p></blockquote><p><strong>断点续传</strong>：</p><ul><li>客户端请求携带需要的数据范围，服务端根据需要的数据范围发送部分数据</li></ul><p><strong>提高吞吐量</strong>：</p><ul><li>并行化：并行传输（多个连接）、异步传输（无需返回确认）</li><li>优化协议：使用 HTTP&#x2F;2 多路复用、使用 UDP 传输</li><li>优化 TCP ：增大 TCP 流量窗口</li><li>服务端负载均衡：多个服务端处理，分散负载</li></ul><h2 id="设计知识"><a href="#设计知识" class="headerlink" title="设计知识"></a>设计知识</h2><p><strong>模块：复杂的系统进行分解：</strong></p><ul><li>划分标准：功能独立性（相似的功能）、信息隐藏（无需对外部暴露内部信息）、性能考虑（两个部分合成一个）、依赖分析</li></ul><p><strong>耦合</strong>：模块之间的依赖程度（内容直接调用、共享全局数据区域、通过调用通信）</p><ul><li>降低耦合性：模块化设计，信息隐藏</li></ul><p><strong>设计流程</strong>：需求分析（明确需求和产出）、系统设计（整体架构和结构）、详细设计（模块细节）、编码实现（分模块开发、主流程拓展开发）、测试（单元、集成、系统）、验收、部署和维护</p><p><strong>系统设计</strong>：</p><ul><li>外部边界：提出正确的问题，做出合理的假设（场景，系统需要与外部交换的地方），收集建立系统的必要信息</li><li>内部设计：基本场景（系统架构设计），发展场景（系统可扩展性）</li></ul><h2 id="软件测试"><a href="#软件测试" class="headerlink" title="软件测试"></a>软件测试</h2><p><strong>黑盒 &amp; 白盒</strong>：</p><ul><li>白盒：测试人员可以了解和分析被测软件的内部结构，代码和逻辑<ul><li>场景：单元测试（分支覆盖率）、集成测试</li></ul></li><li>黑盒：测试人员不了解软件内部结构，只关注软件功能<ul><li>场景：功能测试、系统测试、验收测试</li></ul></li></ul><h1 id="五、语言知识"><a href="#五、语言知识" class="headerlink" title="五、语言知识"></a>五、语言知识</h1><h2 id="语言版本"><a href="#语言版本" class="headerlink" title="语言版本"></a>语言版本</h2><p><strong>C++ 11 新特性</strong>：智能指针、Lambda、Function、左值和右值、关键字（final &amp; override、default &amp; delete、explicit、constexpr、enum class）</p><h2 id="语言基础"><a href="#语言基础" class="headerlink" title="语言基础"></a>语言基础</h2><p><strong>编译过程</strong>：预处理（#开头的内容、删除注释、添加调试信息）、编译（词法分析、语法分析、语义分析、中间代码生成、目标代码生成）、汇编（将汇编代码转换成机器码）、链接（将目标文件链接到一起形成可执行文件，包括地址和空间分配、符号决议和重定位）</p><p><strong>static 关键字</strong>：限制变量或者函数的作用域</p><p><strong>extern 关键字</strong>：引用别处定义的变量</p><ul><li>static 变量不能被 extern 引用（限制作用域了）</li></ul><p><strong>引用和指针</strong>：</p><ul><li>初始：引用需要绑定变量（指针可以设置为 NULL）</li><li>修改：引用初始化不能修改（指针可以修改）</li><li>使用：引用可以直接使用，无需解引用（指针需要解引用）</li></ul><p><strong>malloc 和 new</strong>：</p><ul><li>语法：C++ 语法、C 语法</li><li>方式：malloc 仅分配内存，new 还包括了构造函数初始化过程；malloc 需要传入大小，new 自动计算大小</li><li>返回：malloc 返回 void；new 返回对象指针</li><li>失败：malloc 返回 null；new 抛出异常 std::bad_alloc</li></ul><p><strong>智能指针</strong>：自动管理内存的指针，无需手动释放内存，确保对象正确的销毁</p><ul><li>std::unique_ptr：独占，内存只能由一个 unique_ptr 拥有，超出作用域自动释放</li><li>std::shared_ptr：共享，允许多个 shared_ptr 指向同一个对象，最后一个引用超出作用域自动释放</li><li>std::weak_ptr：监视 shared_ptr 的资源是否存在。用来返回 this 指针和循环引用问题</li></ul><p><strong>自动释放逻辑</strong>：shared_ptr 维护一个引用计数，当创建一个新的实例时引用计数增加，当销毁一个实例时引用计数减小，当引用计数减小到 0 时，此时会自动释放内存（RAII 思想）</p><p><strong>auto</strong>：自动推导变量类型，编译时根据变量的初始化表达式来推导变量的类型</p><ul><li>编译时类型推导、推导时忽略引用和 const</li></ul><p><strong>c++ volatile 关键字</strong>：防止编译器优化，每次访问变量都从内存中读取最新的值</p><p><strong>内联函数</strong>：</p><ul><li>优点：减少函数调用开销，类似于宏（都是编译期替换的），但是比宏更安全</li><li>缺点：代码膨胀（可执行文件变大），编译时间增加</li></ul><p><strong>RAII 思想</strong>：Resource Acquisition Is Initialization，资源获取即初始化</p><ul><li>思想：利用栈上局部变量的自动析构抱枕资源一定会被释放（例如锁的自动释放、打开的文件自动释放）</li><li>异常：如果抛出了异常，局部对象会被析构</li></ul><p><strong>错误处理</strong>：errno（全局错误代码变量）、perror()（打印当前错误码的文本形式，可以提供前缀）、strerror()（返回当前错误码文本指针）</p><p><strong>Python GIL 锁</strong>：全局解释器锁，属于互斥锁，只允许一个线程保持解释器的控制权</p><ul><li>WHY：确保内存对象引用计数的</li><li>其它语言：Ruby</li></ul><p><strong>垃圾回收</strong>：</p><ul><li>Python 垃圾回收：依赖引用计数</li><li>Java 垃圾回收：依赖具体的回收策略</li></ul><p><strong>JVM</strong>：</p><ul><li>优缺点：平台无关性、自动垃圾回收；启动时间长、内存占用高</li></ul><p><strong>语言类型</strong>：</p><ul><li>编译型：通过编译器将源代码转换成机器码（C、C++、Go、Rust）</li><li>解释型：代码在运行时由解释器逐行解释并运行（Python、Ruby）</li><li>混合型：转换成中间语言，再由 JVM 解释执行（Java）</li></ul><h2 id="面向对象"><a href="#面向对象" class="headerlink" title="面向对象"></a>面向对象</h2><p><strong>面向过程 &amp; 面向对象</strong>：</p><ul><li>过程：拆分解决问题步骤，实现函数步骤</li><li>对象：将问题事物拆分成对象，对象描述事物在解决问题中的行为</li></ul><p><strong>C 实现面向对象 &amp; 为什么</strong>：</p><ul><li>为什么：C 效率高，在资源不是很多的 MCU 场景中使用面向对象的方法来设计程序</li></ul><p><strong>面向对象三大特性</strong>：封装、继承、多态（实现模块化，可重用）</p><ul><li>封装：数据（属性）和数据操作（方法）组合在一个类中</li><li>继承：一个类从另一个类获得属性和方法的过程。提高代码复用性和可维护性</li><li>多态：不同类的对象使用相同的接口名字，但具有不同的实现特性</li></ul><p><strong>C++ 多态</strong>：基类的指针在运行时指向派生类对象，并调用派生类的成员函数</p><ul><li>实现机制：虚函数（派生类重写基类方法），抽象基类（纯虚函数，实现接口）<ul><li>条件：通过基类调用虚函数 &amp; 被调用的函数是虚函数且完成对基类虚函数的重写</li></ul></li><li>实现方法：动态多态（虚函数、纯虚函数），静态多态（模板函数、函数重载）</li></ul><p><strong>虚函数和纯虚函数</strong>：纯虚函数是只定义了一个接口</p><ul><li>包含纯虚函数的类叫抽象类，不能被初始化</li></ul><p><strong>构造函数 &amp; 析构函数（虚函数）</strong>：</p><ul><li>构造函数不能是虚函数：对象虚函数表未初始化</li><li>析构函数是虚函数：确保通过基类销毁对象时能够正确地调用派生类地析构函数，否则只会调用基类析构函数导致资源泄露</li></ul><p><strong>重载、重写和隐藏</strong>：</p><ul><li>重载：相同作用域有相同的方法名，但是参数变量不同</li><li>重写：派生类中重定义基类的方法（扩展基类的功能）</li><li>隐藏：派生类隐藏基类中的同名函数（不管参数是不是相同）</li></ul><p><strong>菱形继承</strong>：</p><ul><li>问题：内存重复、命名冲突</li><li>解决：虚继承（共同的类在虚函数表中是共享的）</li></ul><p><strong>左值和右值</strong>：</p><ul><li>左值：占据内存的一个可识别的位置</li><li>右值：不是左值的就是右值</li></ul><p><strong>构造、复制、移动：构造、复制、移动：</strong></p><ul><li>构造：构造函数，生成本类</li><li>复制：内容的拷贝</li><li>移动：内容的转移</li><li>复制构造：MyClass(const MyClass&amp; other)</li><li>移动构造：MyClass(MyClass&amp;&amp; other) noexcept</li><li>复制赋值：MyClass&amp; operator&#x3D;(const MyClass&amp; other)</li><li>移动赋值：MyClass&amp; operator&#x3D;(MyClass&amp;&amp; other) noexcept</li></ul><p><strong>类型擦除</strong>：一种隐藏具体信息的编程技术</p><ul><li>方法：基类+虚函数、模板+包装类、std::any（C++ 17）</li></ul><h2 id="内存管理"><a href="#内存管理" class="headerlink" title="内存管理"></a>内存管理</h2><p><strong>内存分配</strong>：</p><ul><li>堆上分配：brk &amp; sbrk（改变堆大小），malloc &amp; free、calloc 和 realloc、posix_memalign（分配对齐）内存分配-堆<ul><li>跟踪调试：mtrace 和 muntrace、Valgrind、使用智能指针</li></ul></li><li>栈上分配：alloca 内存分配-栈</li></ul><p><strong>内存对齐</strong>：</p><ul><li>作用：提高 CPU 访问速度</li><li>方法：posix_memalign</li></ul><p><strong>内存泄漏</strong>：申请的内存没有释放</p><ul><li>valgrind–memcheck：监听分配和释放内存的函数调用（感知内存泄漏、访问越界、使用未初始化内存、使用已释放内存）</li><li>重载 new&#x2F;delete：跟踪调用（在全局父类中进行选择性的重载，要注意多线程的问题）</li><li>perf：添加 malloc 探针，跟踪分配器事件</li><li>自定义设计：上面的都无法跟踪内存块的使用过程。如果参考智能指针，对指针做一层封装，就可以跟踪所有的申请和释放过程了（通过封装宏来增加文件、行号等信息）。不足之处是侵入式编程，重新定义了指针，通过宏来控制是否进行跟踪</li></ul><p><strong>Python 内存回收机制</strong>：</p><ul><li>主动回收：</li></ul><h2 id="STL"><a href="#STL" class="headerlink" title="STL"></a>STL</h2><p><strong>STL 类型</strong>：</p><ul><li>序列容器：array、vector、deque、list、forward_list</li><li>关联容器：set &amp; multiset、map &amp; multimap（红黑树）</li><li>无序容器：unordered_*（哈希表）</li><li>其它容器：string、pair、tuple</li><li>容器适配器：stack、queue、priority_queue</li></ul><p><strong>迭代器失效</strong>：</p><ul><li>序列式容器：删除元素会使后面的迭代器失效，但是 erase 会返回下一个有效的 iterator</li><li>链表式容器：删除元素不会导致其它迭代器失效，erase 也会返回下一个有效的 iterator</li><li>关联式容器：删除元素不会导致其它迭代器失效（erase 返回值为 NULL）</li></ul><p><strong>模板</strong>：</p><ul><li>目的：同样的代码适用于不同类型下的使用，实现代码复用（泛型编程）</li><li>原理：编译阶段根据模板类型确定应该产生什么类</li><li>推导：根据模板参数的实际类型推导出模板参数类型</li></ul><p><strong>push_back &amp; emplace_back</strong>：</p><ul><li>push_back：接收对象，创建临时对象，移动或者复制</li><li>emplace_back：接收构建参数，原地构造对象</li></ul><p><strong>vector 扩容机制</strong>：</p><ul><li>size（实际已经使用的）；capacity（已使用+未使用）</li><li>扩容方案：两倍扩容（插入空间比原空间小）；插入空间扩容（插入空间比原空间大）</li><li>最佳方案：两倍？最佳应该是斐波那契数列，能够复用原来的内存空间<ul><li>因子越大，分配越多，内存利用率低；因子越小，分配越少，再分配可能性越大</li></ul></li></ul><p><strong>cast 方法</strong>：</p><ul><li>static_cast：编译时类型转换，基本类型、指针类型</li><li>dynamic_cast：运行时类型转换，基类转派生类（确实是派生类，否则失败）</li><li>const_cast：添加或移除变量的const或volatile限定符</li><li>reinterpret_cast：低级别类型转换，不考虑指针之间的关系</li></ul><p><strong>move &amp; forward</strong>：（C++ 11）</p><ul><li>move：将对象转换成右值引用</li><li>forward：完美转发，用于模板编程，保证参数的类型在转发过程中保持不变</li></ul><p><strong>std::variant</strong>：类型安全的联合体，存储多种已知类型的情况（C++ 17）</p><ul><li>std::get<T>：通过类型 T 访问 std::variant 中的值。如果当前存储的类型不是 T，会抛出 std::bad_variant_access 异常</li><li>std::get_if<T>：返回一个指向 std::variant 中类型为 T 的值的指针。如果当前存储的类型不是 T，返回 nullptr</li><li>std::visit：使用访问者模式（Visitor Pattern）来处理 std::variant 中的值（std::visit）</li></ul><p><strong>std::any</strong>：存储任意类型的值（C++ 17）</p><ul><li>通过 std::any_cast<T> 可以访问当前存储的值，如果当前存储的类型不是 T，会抛出 std::bad_any_cast 异常</li></ul><h2 id="工程"><a href="#工程" class="headerlink" title="工程"></a>工程</h2><p><strong>Make &amp; Makefile</strong>：</p><ul><li>配置文件：.config 文件，写入配置选项</li></ul><p><strong>make &amp; cmake</strong>：</p><ul><li>gcc：编译指令（make 的调用对象）</li><li>make：执行者，负责按照给定的规则执行构建操作</li><li>cmake：协调者，负责生成构建规则，使得 make 和其它构建工具可以完成工作</li></ul><h2 id="调试问题"><a href="#调试问题" class="headerlink" title="调试问题"></a>调试问题</h2><p><strong>GDB 调试原理</strong>：通过系统调用 ptrace 实现的</p><ul><li>设置断点：断点处指令重写为 INT 3（中断 SIGTRAP），到达之后指令被修改回来</li><li>主进程跟踪子进程的所有信息（ptrace实现）</li></ul><p><strong>调试方法</strong>：</p><ul><li>定位问题 &amp; 复现问题</li><li>解决问题（查找原因：Google + 官方文档）</li><li>记录归档</li></ul><h2 id="细节问题"><a href="#细节问题" class="headerlink" title="细节问题"></a>细节问题</h2><p><strong>最大值的宏</strong>：#define MAX(a, b) ((a) &gt; (b) ? (a) : (b))</p><ul><li>问题：展开副作用（自增运算）</li><li>解决：使用 inline 内联函数</li></ul><h1 id="六、框架"><a href="#六、框架" class="headerlink" title="六、框架"></a>六、框架</h1><h2 id="Docker"><a href="#Docker" class="headerlink" title="Docker"></a>Docker</h2><p><a href="https://blog.csdn.net/FateZRK/article/details/125750830">blog.csdn.net&#x2F;FateZRK&#x2F;article&#x2F;details&#x2F;125750830</a></p><p><strong>虚拟化</strong>：</p><ul><li>定义：一台计算机虚拟为多态逻辑计算机</li><li>作用：应用程序和系统内核资源解耦，以操作系统级别隔离，提高资源利用率</li><li>瓶颈：每个任务的处理效率会打折扣</li></ul><p><strong>Docker 原理</strong>：</p><ul><li>容器：独立的软件包，包含运行引用程序所需的一切。容器共享操作系统内核</li><li>镜像：包含创建容器所有文件和配置（只读的模板）</li><li>引擎：负责管理容器的生命周期，包括创建、启动、停止和删除。包括：<ul><li>Docker Daemon：运行主机上的后台服务，管理镜像、容器、网络和存储卷</li><li>Docker CLI：命令行工具，与 Docker Daemon 交互</li><li>REST API：外部工具与 Docker Daemon 交互接口</li></ul></li><li>运行时：负责运行容器的底层组件。docker 使用 runc 作为容器运行时（标准容器运行时），负责创建和运行容器，并与主机操作系统内核交互</li><li>命名空间：Linux 内核提供的一种隔离机制，用于隔离进程的资源。docker 使用命名空间来隔离容器的进程、网络、文件系统、用户和主机名资源，实现容器之间的隔离</li><li>控制组：控制组（cgroups）是 Linux 内核提供的一种资源管理机制，用于限制和隔离进程的资源使用（CPU、内存、磁盘 IO）</li></ul><h2 id="RPC"><a href="#RPC" class="headerlink" title="RPC"></a>RPC</h2><p><a href="https://www.xiaolincoding.com/network/2_http/http_rpc.html#%E4%BD%BF%E7%94%A8%E7%BA%AF%E8%A3%B8-tcp-%E4%BC%9A%E6%9C%89%E4%BB%80%E4%B9%88%E9%97%AE%E9%A2%98">www.xiaolincoding.com/network/2_http&#x2F;http_rpc.html#%E4%BD%BF%E7%…</a></p><p>**RPC **：计算机通信协议，就像调用本地函数一样。隐藏网络通信复杂性，使得分布式系统开发更加简单和直观</p><p><strong>RPC 原理</strong>：客户端调用、参数序列化、网络传输、服务器接收和执行、结果序列化、网络传输、客户端接收</p><ul><li>传输前序列化</li></ul><p><strong>RPC 框架</strong>：（注册中心、客户端、服务端）</p><ul><li>gRPC：Google 做的</li><li>dubbo：阿里做的，国内最早的 rpc 框架</li></ul><p><strong>RPC 与 HTTP</strong>：</p><ul><li>性能：RPC 更高效（二进制协议），低延迟（通信开销小）；但是 RPC 设计复杂</li></ul><h2 id="Kafka"><a href="#Kafka" class="headerlink" title="Kafka"></a>Kafka</h2><p><strong>kafka 为什么不丢数据</strong>：</p><ul><li>数据持久化存储 + 副本机制</li><li>生产则会确认机制（保证数据写入）</li><li>消费者偏移量（确保可以从上次消费位置继续消费）</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;记录面试的基础知识（要点速记），用于面试前的速览（临阵磨枪）&lt;/p&gt;</summary>
    
    
    
    <category term="面试" scheme="https://www.delta1037.cn/categories/%E9%9D%A2%E8%AF%95/"/>
    
    
    <category term="Linux" scheme="https://www.delta1037.cn/tags/Linux/"/>
    
    <category term="C/C++" scheme="https://www.delta1037.cn/tags/C-C/"/>
    
  </entry>
  
  <entry>
    <title>无线网卡找不到问题调试</title>
    <link href="https://www.delta1037.cn/2023/Bugsfix/%E6%97%A0%E7%BA%BF%E7%BD%91%E5%8D%A1%E6%89%BE%E4%B8%8D%E5%88%B0%E9%97%AE%E9%A2%98%E8%B0%83%E8%AF%95/"/>
    <id>https://www.delta1037.cn/2023/Bugsfix/%E6%97%A0%E7%BA%BF%E7%BD%91%E5%8D%A1%E6%89%BE%E4%B8%8D%E5%88%B0%E9%97%AE%E9%A2%98%E8%B0%83%E8%AF%95/</id>
    <published>2023-09-10T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.086Z</updated>
    
    <content type="html"><![CDATA[<p>在 rock 3a 系列板子上配置无线网，需要单独购买网卡。一开始在淘宝买了一块 Intel 7265 无线网卡（rock 3a 官方限定的，应该其它型号也可以，但是需要注意内核版本），使用体验还可以。后来又采购了一批 rock 3a 的板子，于是又按照原来的单子买了一块 Intel 7265 无线网卡，但是接上去之后找不到无线网卡，以下记录一下排查过程和思考。</p><span id="more"></span><h1 id="一、问题描述"><a href="#一、问题描述" class="headerlink" title="一、问题描述"></a>一、问题描述</h1><p>硬件环境：</p><ul><li>Rock 3A 开发板</li><li>Intel 7265 无线网卡（M.2 接口）</li></ul><p>问题现象：</p><ul><li><code>ifconfig</code> 看不到无线网</li></ul><p>问题猜测：</p><ul><li>最糟糕的情形是硬件是个坏的，买了也很久了没做过测试可能不给换了</li><li>其次可能是网卡适配问题，但是为什么另一块网卡可以用呢？</li></ul><h1 id="二、问题排查"><a href="#二、问题排查" class="headerlink" title="二、问题排查"></a>二、问题排查</h1><h2 id="2-1-硬件排查"><a href="#2-1-硬件排查" class="headerlink" title="2.1 硬件排查"></a>2.1 硬件排查</h2><p>从网上了解到 <code>lspci</code> 命令可以查看主板（开发板）上接入的 PCI 设备（根据实际应用发现也可以查看 M.2 设备）</p><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">lspci 输出</span></span><br><span class="line">00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)</span><br><span class="line">01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)</span><br></pre></td></tr></table></figure><p>从上面 <code>lspci</code> 的输出可以看出来，应该不是硬件坏了，因为硬件的版本还是可以看到的。</p><p>查找到 <code>-k</code> 参数可以看对应的驱动程序，内核模块</p><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><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="meta prompt_"># </span><span class="language-bash">lspci -k 输出</span></span><br><span class="line">00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01)</span><br><span class="line">        Kernel driver in use: pcieport</span><br><span class="line">lspci: Unable to load libkmod resources: error -12</span><br><span class="line">01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)</span><br><span class="line">        Subsystem: Intel Corporation Dual Band Wireless-AC 7265</span><br></pre></td></tr></table></figure><p>从上面我以为找到了重点：<code>lspci: Unable to load libkmod resources: error -12</code>，但是我在另一块开发板上也发现了同样的问题。</p><p>再次使用 <code>-v</code> 参数查看详细的信息：</p><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><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></pre></td><td class="code"><pre><span class="line"><span class="meta prompt_"># </span><span class="language-bash">lspci -v 输出</span></span><br><span class="line">00:00.0 PCI bridge: Fuzhou Rockchip Electronics Co., Ltd Device 3566 (rev 01) (prog-if 00 [Normal decode])</span><br><span class="line">        Flags: bus master, fast devsel, latency 0, IRQ 108</span><br><span class="line">        Bus: primary=00, secondary=01, subordinate=ff, sec-latency=0</span><br><span class="line">        I/O behind bridge: [disabled]</span><br><span class="line">        Memory behind bridge: 00900000-009fffff [size=1M]</span><br><span class="line">        Prefetchable memory behind bridge: [disabled]</span><br><span class="line">        Expansion ROM at 300a00000 [virtual] [disabled] [size=64K]</span><br><span class="line">        Capabilities: [40] Power Management version 3</span><br><span class="line">        Capabilities: [50] MSI: Enable+ Count=16/32 Maskable- 64bit+</span><br><span class="line">        Capabilities: [70] Express Root Port (Slot-), MSI 00</span><br><span class="line">        Capabilities: [b0] MSI-X: Enable- Count=1 Masked-</span><br><span class="line">        Capabilities: [100] Advanced Error Reporting</span><br><span class="line">        Capabilities: [148] Secondary PCI Express</span><br><span class="line">        Capabilities: [160] L1 PM Substates</span><br><span class="line">        Capabilities: [170] Vendor Specific Information: ID=0002 Rev=4 Len=100 &lt;?&gt;</span><br><span class="line">        Kernel driver in use: pcieport</span><br><span class="line">lspci: Unable to load libkmod resources: error -12</span><br><span class="line"></span><br><span class="line">01:00.0 Network controller: Intel Corporation Wireless 7265 (rev 48)</span><br><span class="line">        Subsystem: Intel Corporation Dual Band Wireless-AC 7265</span><br><span class="line">        Flags: fast devsel, IRQ 107</span><br><span class="line">        Memory at 300900000 (64-bit, non-prefetchable) [size=8K]</span><br><span class="line">        Capabilities: [c8] Power Management version 3</span><br><span class="line">        Capabilities: [d0] MSI: Enable- Count=1/1 Maskable- 64bit+</span><br><span class="line">        Capabilities: [40] Express Endpoint, MSI 00</span><br><span class="line">        Capabilities: [100] Advanced Error Reporting</span><br><span class="line">        Capabilities: [140] Device Serial Number 64-80-99-ff-ff-a8-34-a5</span><br><span class="line">        Capabilities: [14c] Latency Tolerance Reporting</span><br><span class="line">        Capabilities: [154] L1 PM Substates</span><br></pre></td></tr></table></figure><p>同样的，这些信息也和另外一块板子上一模一样，没有参考价值。</p><p>在使用 <code>-k</code> 参数查看内核信息时，并没有看到有内核信息输出，所以问题是不是出在内核驱动上？于是想到了 <code>dmesg</code> 命令。</p><h2 id="2-2-驱动排查"><a href="#2-2-驱动排查" class="headerlink" title="2.2 驱动排查"></a>2.2 驱动排查</h2><p><code>dmesg</code> 命令可以查看开机信息，可以看各个模块是否加载成功。查看 <code>dmesg</code> 输出：</p><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><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 class="meta prompt_"># </span><span class="language-bash">dmesg 输出（部分）</span></span><br><span class="line">[    5.735812] iwlwifi 0000:01:00.0: Direct firmware load for iwlwifi-7265-17.ucode failed with error -2</span><br><span class="line">[    5.735933] iwlwifi 0000:01:00.0: no suitable firmware found!</span><br><span class="line">[    5.736069] iwlwifi 0000:01:00.0: iwlwifi-7265-17 is required</span><br><span class="line">[    5.736093] iwlwifi 0000:01:00.0: check git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git</span><br><span class="line">[    5.969330] usbcore: registered new interface driver btusb</span><br><span class="line">[    5.988375] Bluetooth: hci0: read Intel version: 370810011002270d00</span><br><span class="line">[    5.990701] bluetooth hci0: Direct firmware load for intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq failed with error -2</span><br><span class="line">[    5.990737] Bluetooth: hci0: failed to open Intel firmware file: intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq (-2)</span><br><span class="line">[    5.993308] Bluetooth: hci0: Intel Bluetooth firmware file: intel/ibt-hw-37.8.bseq</span><br><span class="line">[    5.995534] Bluetooth: hci0: unexpected event for opcode 0xfc2f</span><br><span class="line">[    5.998546] Bluetooth: hci0: Intel firmware patch completed</span><br></pre></td></tr></table></figure><p>于是就看到了启动时加载 wifi 固件 <code>iwlwifi-7265-17.ucode</code> 和蓝牙固件 <code>intel/ibt-hw-37.8.10-fw-1.10.2.27.d.bseq</code> 都失败了，这两个模块在 <code>/usr/lib/firmware</code> 中，查看固件目录：</p><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><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">(blockchain_board) root@rock-3a:/usr/lib/firmware# pwd</span><br><span class="line">/usr/lib/firmware</span><br><span class="line">(blockchain_board) root@rock-3a:/usr/lib/firmware# ls</span><br><span class="line">ath10k  intel                   iwlwifi-cc-a0-46.ucode        rtl8723du_config  rtl8821cu_config  rtl8852bu_config  rtl_bt</span><br><span class="line">brcm    iwlwifi-7265D-29.ucode  iwlwifi-ty-a0-gf-a0-59.ucode  rtl8723du_fw      rtl8821cu_fw      rtl8852bu_fw      rtlwifi</span><br><span class="line">(blockchain_board) root@rock-3a:/usr/lib/firmware# ls intel/</span><br><span class="line">ibt-0041-0041.ddc  ibt-0041-0041.sfi  ibt-hw-37.8.10-fw-1.10.3.11.e.bseq  ibt-hw-37.8.10-fw-22.50.19.14.f.bseq  ibt-hw-37.8.bseq</span><br><span class="line">(blockchain_board) root@rock-3a:/usr/lib/firmware#</span><br></pre></td></tr></table></figure><p>可以看到应该是缺了这两个固件，所以 WIFI 才没有启动成功！从列出来的固件可以看出，无线网卡 7265 只有一个 <code>iwlwifi-7265D-29.ucode</code> 固件，应该是 7265 也有不同的固件版本才导致无线网卡会加载失败吧。蓝牙固件也是，只是版本不一样。</p><h2 id="2-3-解决"><a href="#2-3-解决" class="headerlink" title="2.3 解决"></a>2.3 解决</h2><p>从网上找到这两个固件，放到固件的目录，重启即可解决无线找不到的问题了。</p><h1 id="三、思考"><a href="#三、思考" class="headerlink" title="三、思考"></a>三、思考</h1><p>我们无法一开始就知道是固件版本的问题，只能从整体的结构上去分析问题到底出在哪里。从整体上分析问题要对整体的结构都有所了解，即使不知道细节，也可以将问题定位到一个很小的范围，这样才能更快更好的解决问题。</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;在 rock 3a 系列板子上配置无线网，需要单独购买网卡。一开始在淘宝买了一块 Intel 7265 无线网卡（rock 3a 官方限定的，应该其它型号也可以，但是需要注意内核版本），使用体验还可以。后来又采购了一批 rock 3a 的板子，于是又按照原来的单子买了一块 Intel 7265 无线网卡，但是接上去之后找不到无线网卡，以下记录一下排查过程和思考。&lt;/p&gt;</summary>
    
    
    
    <category term="Linux" scheme="https://www.delta1037.cn/categories/Linux/"/>
    
    
    <category term="Linux" scheme="https://www.delta1037.cn/tags/Linux/"/>
    
    <category term="Kernel" scheme="https://www.delta1037.cn/tags/Kernel/"/>
    
  </entry>
  
  <entry>
    <title>Matplotlib图像结构</title>
    <link href="https://www.delta1037.cn/2023/Skill/Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84/"/>
    <id>https://www.delta1037.cn/2023/Skill/Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84/</id>
    <published>2023-07-28T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:56.085Z</updated>
    
    <content type="html"><![CDATA[<p>本文简要梳理Matplotlib中的元素；如何使用Subplot和Axes控制子图，以及调整子图之间的间距；最后简要说明了Matplotlib的数据输入和图像输出的控制</p><span id="more"></span><h1 id="一、元素"><a href="#一、元素" class="headerlink" title="一、元素"></a><strong>一、元素</strong></h1><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_54ea9d5031394848b86c7a76dfa890f7.png" alt="54ea9d5031394848b86c7a76dfa890f7"></p><p><strong>标题 - Title</strong>：图像的名字</p><p><strong>图例 - Legend</strong>：展示每个数据图像对应的名称</p><p><strong>边界 - spines</strong>：图四周的框的边界（注意 tick 刻度和所在的线是分离的）</p><p><strong>标记 - Marker</strong>：图线的标记类型</p><p><strong>标签 - Label</strong>：一些细节的标识</p><ul><li>X 轴标签</li><li>Y 轴标签</li><li>主刻度标签</li><li>副刻度标签</li></ul><p><strong>刻度 - tick</strong>：标识对应位置的数值</p><ul><li>主刻度</li><li>副刻度</li></ul><p><strong>字体 - font</strong>：文字的类型</p><p><strong>颜色 - color</strong>：线条、文字</p><h1 id="二、结构"><a href="#二、结构" class="headerlink" title="二、结构"></a><strong>二、结构</strong></h1><p>Matplotlib 创建的主体称为 Figure，再 Figure 中可以创建子图，子图中就是一些标签元素和数值元素了。</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></pre></td><td class="code"><pre><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"> <span class="comment"># 新建画板</span></span><br><span class="line"> fig = plt.figure()</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 新建画布</span></span><br><span class="line"> ax = fig.add_subplot()</span><br><span class="line"> <span class="comment"># or</span></span><br><span class="line"> ax = fig.add_axes()</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 接下来就可以在ax上绘制图像，或者设置标签等</span></span><br><span class="line"> <span class="comment"># 画板与画布：画板是固定的，画布则可以有多个并且位置可以调整</span></span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 可以对fig做画板的控制（设置画板标题、保存画板图像等）</span></span><br></pre></td></tr></table></figure><blockquote><p>在子图控制中可以通过 plt 添加子图，也可以通过 fig 来添加子图，这两者的区别是 plt 底层还是用的 fig 对象，在源码中有一个 gcf() 函数，会获取当前活跃的 figure（Get the current figure.）</p></blockquote><h2 id="2-1-子图控制"><a href="#2-1-子图控制" class="headerlink" title="2.1 子图控制"></a><strong>2.1 子图控制</strong></h2><p>对于子图的控制，Matplotlib 中有 Axes 和 Subplot 两种控制方式。</p><h3 id="Subplot"><a href="#Subplot" class="headerlink" title="Subplot"></a><strong>Subplot</strong></h3><h3 id="标准网格布局"><a href="#标准网格布局" class="headerlink" title="标准网格布局"></a><strong>标准网格布局</strong></h3><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></pre></td><td class="code"><pre><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"> fig = plt.figure(figsize=(<span class="number">20</span>, <span class="number">10</span>), dpi=<span class="number">1000</span>) <span class="comment"># 新建画板</span></span><br><span class="line"> ax = fig.add_subplot(<span class="number">2</span>, <span class="number">3</span>, idx)              <span class="comment"># 新建画布</span></span><br></pre></td></tr></table></figure><p><code>add_subplot</code> 方法里面传入三个数字，前两个数字代表要生成几行几列的子图矩阵，第三个数字代表选中的子图位置。因此 <code>add_subplot</code> 适合排布规范的多子图形式。</p><p>另外也可以通过 <code>plt</code> 直接设置网格，并获取到网格轴域 <code>ax</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></pre></td><td class="code"><pre><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"> <span class="comment"># 两行一列的图</span></span><br><span class="line"> <span class="comment">#（但是这种方式已经准备弃用了</span></span><br><span class="line"> <span class="comment">#  Support for FigureCanvases without a required_interactive_framework attribute was deprecated</span></span><br><span class="line"> <span class="comment">#  in Matplotlib 3.6 and will be removed two minor releases later.）</span></span><br><span class="line"> fig, (ax1, ax2) = plt.subplots(<span class="number">2</span>,<span class="number">1</span>)</span><br><span class="line"> ax1.plot(X, Y1, color=<span class="string">&quot;C1&quot;</span>)</span><br><span class="line"> ax2.plot(X, Y2, color=<span class="string">&quot;C0&quot;</span>)</span><br></pre></td></tr></table></figure><h3 id="自定义网格布局"><a href="#自定义网格布局" class="headerlink" title="自定义网格布局"></a><strong>自定义网格布局</strong></h3><p>使用 <code>add_gridspec</code> 做更复杂的网格布局（占用多个网格作为一个图）</p><p><strong>设置网格的方式：</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></pre></td><td class="code"><pre><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"> fig3 = plt.figure(constrained_layout=<span class="literal">True</span>)</span><br><span class="line"> gs = fig3.add_gridspec(<span class="number">3</span>, <span class="number">3</span>)</span><br><span class="line"> f3_ax1 = fig3.add_subplot(gs[<span class="number">0</span>, :])</span><br><span class="line"> f3_ax1.set_title(<span class="string">&#x27;gs[0, :]&#x27;</span>)</span><br><span class="line"> f3_ax2 = fig3.add_subplot(gs[<span class="number">1</span>, :-<span class="number">1</span>])</span><br><span class="line"> f3_ax2.set_title(<span class="string">&#x27;gs[1, :-1]&#x27;</span>)</span><br><span class="line"> f3_ax3 = fig3.add_subplot(gs[<span class="number">1</span>:, -<span class="number">1</span>])</span><br><span class="line"> f3_ax3.set_title(<span class="string">&#x27;gs[1:, -1]&#x27;</span>)</span><br><span class="line"> f3_ax4 = fig3.add_subplot(gs[-<span class="number">1</span>, <span class="number">0</span>])</span><br><span class="line"> f3_ax4.set_title(<span class="string">&#x27;gs[-1, 0]&#x27;</span>)</span><br><span class="line"> f3_ax5 = fig3.add_subplot(gs[-<span class="number">1</span>, -<span class="number">2</span>])</span><br><span class="line"> f3_ax5.set_title(<span class="string">&#x27;gs[-1, -2]&#x27;</span>)</span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_b4956923db74477abbfa76eaa07043ed.png" alt="b4956923db74477abbfa76eaa07043ed"></p><p><strong>设置比例的方式：</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></pre></td><td class="code"><pre><span class="line"> fig5 = plt.figure(constrained_layout=<span class="literal">True</span>)</span><br><span class="line"> widths = [<span class="number">2</span>, <span class="number">3</span>, <span class="number">1.5</span>]</span><br><span class="line"> heights = [<span class="number">1</span>, <span class="number">3</span>, <span class="number">2</span>]</span><br><span class="line"> spec5 = fig5.add_gridspec(</span><br><span class="line">     ncols=<span class="number">3</span>,</span><br><span class="line">     nrows=<span class="number">3</span>,</span><br><span class="line">     width_ratios=widths,</span><br><span class="line">     height_ratios=heights)</span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">     <span class="keyword">for</span> col <span class="keyword">in</span> <span class="built_in">range</span>(<span class="number">3</span>):</span><br><span class="line">         ax = fig5.add_subplot(spec5[row, col])</span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_edc553a4b3114cd096cad33d5422383d.png" alt="edc553a4b3114cd096cad33d5422383d"></p><h3 id="Axes"><a href="#Axes" class="headerlink" title="Axes"></a><strong>Axes</strong></h3><h3 id="画板上新增轴子图"><a href="#画板上新增轴子图" class="headerlink" title="画板上新增轴子图"></a><strong>画板上新增轴子图</strong></h3><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></pre></td><td class="code"><pre><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"> fig = plt.figure()                     <span class="comment"># 新建画板</span></span><br><span class="line"> ax1 = fig.add_axes([<span class="number">0.1</span>,<span class="number">0.1</span>,<span class="number">0.8</span>,<span class="number">0.8</span>])  <span class="comment"># 新建画布</span></span><br><span class="line"> ax2 = fig.add_axes([<span class="number">0.2</span>,<span class="number">0.5</span>,<span class="number">0.4</span>,<span class="number">0.3</span>])</span><br></pre></td></tr></table></figure><p><code>add_axes</code> 方法传入一个位置列表，列表中有四个值，格式如 <code>[left, bottom, width, height]</code>。其中 left 和 bottom 分别表示距离左侧和下边占整张图的比例（0-1 的取值范围），width 和 height 分别表示宽度和高度占整张图的比例（0-1 的取值范围），也就是起始位置是从左下角开始计算的（坐标系原点）。因此 <code>add_axes</code> 方法可以在图上的任意一个位置建立坐标轴并绘制曲线。</p><h3 id="子图中新增轴子图"><a href="#子图中新增轴子图" class="headerlink" title="子图中新增轴子图"></a><strong>子图中新增轴子图</strong></h3><blockquote><p>可以用来放大某一个指定区域</p></blockquote><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></pre></td><td class="code"><pre><span class="line"> <span class="comment"># Implementation of matplotlib function</span></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"> fig, ax = plt.subplots()</span><br><span class="line"> ax.plot(<span class="built_in">range</span>(<span class="number">10</span>))</span><br><span class="line"> axin1 = ax.inset_axes(</span><br><span class="line">         <span class="comment"># 相对坐标，由 transform 决定</span></span><br><span class="line">         [<span class="number">0.8</span>, <span class="number">0.1</span>, <span class="number">0.15</span>, <span class="number">0.15</span>])</span><br><span class="line">         <span class="comment"># transform 默认是 transAxes</span></span><br><span class="line"> axin2 = ax.inset_axes(</span><br><span class="line">         <span class="comment"># 数据坐标，由 transform 决定</span></span><br><span class="line">         [<span class="number">5</span>, <span class="number">7</span>, <span class="number">2.3</span>, <span class="number">2.3</span>],</span><br><span class="line">         transform = ax.transData)</span><br><span class="line"> </span><br><span class="line"> ax.set_title(</span><br><span class="line">     <span class="string">&#x27;matplotlib.axes.Axes.inset_axes() Example&#x27;</span>,</span><br><span class="line">     fontsize = <span class="number">14</span>,</span><br><span class="line">     fontweight =<span class="string">&#x27;bold&#x27;</span>)</span><br><span class="line"> fig.show() <span class="comment"># 会闪退，但是可以savefig</span></span><br><span class="line"> <span class="comment"># or</span></span><br><span class="line"> plt.show()</span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_4778e0ef4913417a90039d5d0d4bd08d.png" alt="4778e0ef4913417a90039d5d0d4bd08d"></p><h3 id="双轴图"><a href="#双轴图" class="headerlink" title="双轴图"></a><strong>双轴图</strong></h3><blockquote><p>可以在同一块区域使用不同的坐标，场景为多种曲线或者图形需要配置对应的坐标</p></blockquote><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></pre></td><td class="code"><pre><span class="line"> <span class="comment"># 共用x轴，双纵轴图</span></span><br><span class="line"> new_ax = ax.twinx()</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 公用y轴，双横轴图</span></span><br><span class="line"> new_ax = ax.twiny()</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 新建两个轴(新画布是右边和上边的轴)</span></span><br><span class="line"> new_ax = ax..twinx().twiny()</span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_141b56d20e024b23b9f0f900a9a15cf6.png" alt="141b56d20e024b23b9f0f900a9a15cf6"></p><h3 id="附加轴子图（colorbar）"><a href="#附加轴子图（colorbar）" class="headerlink" title="附加轴子图（colorbar）"></a><strong>附加轴子图（colorbar）</strong></h3><p><code>make_axes_locatable</code> 是 Matplotlib 库中的一个函数，它用于创建一个新的 Axes 对象，并将其放置在主图 Axes 对象旁边的位置，以容纳 colorbar。这个函数通常用于在 Matplotlib 绘图中创建 colorbar。</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"> <span class="keyword">from</span> mpl_toolkits.axes_grid1 <span class="keyword">import</span> make_axes_locatable</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"> fig, ax = plt.subplots()</span><br><span class="line"> </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"> divider = make_axes_locatable(ax)</span><br><span class="line"> cax = divider.append_axes(<span class="string">&#x27;right&#x27;</span>, size=<span class="string">&#x27;5%&#x27;</span>, pad=<span class="number">0.05</span>)</span><br><span class="line"> </span><br><span class="line"> <span class="comment"># 在新的 Axes 对象上创建 colorbar</span></span><br><span class="line"> plt.colorbar(cax=cax)</span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_44be687a323747fda9e9c6fab2139f7b.png" alt="44be687a323747fda9e9c6fab2139f7b"></p><h3 id="Axes-和-Subplot-总结"><a href="#Axes-和-Subplot-总结" class="headerlink" title="Axes 和 Subplot 总结"></a><strong>Axes 和 Subplot 总结</strong></h3><ul><li>两种对象确实是“你中有我，我中有你”的关系，生成子图（subplot）的时候，必然带着所谓的一套轴域（Axes）。而用轴域（Axes）方法，客观上就是生成了一个可以画图的子图。</li><li><code>add_subplot</code> 方法在生成子图过程，简单明了；而用 <code>add_axes</code> 方法，则生成子图的灵活性更强，完全可以实现 <code>add_subplot</code> 方法的功能，可以控制子图显示位置，甚至实现相互重叠的效果。</li></ul><p>通过新增子图获取到轴域就可以对其新增数据，增加图像的细节了。</p><h2 id="2-2-间距调整"><a href="#2-2-间距调整" class="headerlink" title="2.2 间距调整"></a><strong>2.2 间距调整</strong></h2><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></pre></td><td class="code"><pre><span class="line"> <span class="comment"># 调整图位置和间距</span></span><br><span class="line"> plt.subplots_adjust(</span><br><span class="line">         left=<span class="literal">None</span>,</span><br><span class="line">         bottom=<span class="literal">None</span>,</span><br><span class="line">         right=<span class="literal">None</span>,</span><br><span class="line">         top=<span class="literal">None</span>,</span><br><span class="line">         wspace=<span class="literal">None</span>,</span><br><span class="line">         hspace=<span class="literal">None</span>)</span><br><span class="line"> <span class="comment"># 整张图位置</span></span><br><span class="line"> <span class="comment"># left ： 子图在画板上的左位置（position），默认0.125</span></span><br><span class="line"> <span class="comment"># right ： 子图在画板上的右位置（position），默认0.9</span></span><br><span class="line"> <span class="comment"># bottom ： 子图在画板上的下位置（position），默认0.1</span></span><br><span class="line"> <span class="comment"># top： 子图在画板上的上位置（position），默认0.9</span></span><br><span class="line"> <span class="comment"># 间距</span></span><br><span class="line"> <span class="comment"># wspace：子图之间的横向间距（padding），默认0.2</span></span><br><span class="line"> <span class="comment"># hspace：子图之间的纵向间距（padding），默认0.2</span></span><br></pre></td></tr></table></figure><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Skill_Matplotlib%E5%9B%BE%E5%83%8F%E7%BB%93%E6%9E%84_ffeb5c5223af477e9e463e2d78692005.png" alt="ffeb5c5223af477e9e463e2d78692005"></p><h1 id="三、数据"><a href="#三、数据" class="headerlink" title="三、数据"></a><strong>三、数据</strong></h1><h2 id="3-1-输入"><a href="#3-1-输入" class="headerlink" title="3.1 输入"></a><strong>3.1 输入</strong></h2><p>Matplotlib 只能接收 <code>np.array</code> 格式或者 <code>np.ma.masked_array</code> 格式的数据。不接受类似数组的数据例如 <code>pandas</code> 和 <code>np.matrix</code> 类型的，最好将其转换成 <code>np.array</code> 类型。</p><p>pandas 类型转换：</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"> a = pandas.DataFrame(np.random.rand(<span class="number">4</span>,<span class="number">5</span>), columns = <span class="built_in">list</span>(<span class="string">&#x27;abcde&#x27;</span>))</span><br><span class="line"> a_asarray = a.values</span><br></pre></td></tr></table></figure><p><code>np.matrix</code> 类型转换：</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"> b = np.matrix([[<span class="number">1</span>,<span class="number">2</span>],[<span class="number">3</span>,<span class="number">4</span>]])</span><br><span class="line"> b_asarray = np.asarray(b)</span><br></pre></td></tr></table></figure><h2 id="3-2-输出"><a href="#3-2-输出" class="headerlink" title="3.2 输出"></a><strong>3.2 输出</strong></h2><p>保存图像到本地文件：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line"> plt.savefig(<span class="string">&#x27;pic_name.png&#x27;</span>)</span><br></pre></td></tr></table></figure><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a><strong>参考</strong></h1><p><a href="https://www.zhihu.com/question/51745620">python matplotlib 中 axes 与 axis 的区别是什么?</a></p><p>‍</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;本文简要梳理Matplotlib中的元素；如何使用Subplot和Axes控制子图，以及调整子图之间的间距；最后简要说明了Matplotlib的数据输入和图像输出的控制&lt;/p&gt;</summary>
    
    
    
    <category term="绘图" scheme="https://www.delta1037.cn/categories/%E7%BB%98%E5%9B%BE/"/>
    
    
    <category term="Python" scheme="https://www.delta1037.cn/tags/Python/"/>
    
    <category term="绘图工具" scheme="https://www.delta1037.cn/tags/%E7%BB%98%E5%9B%BE%E5%B7%A5%E5%85%B7/"/>
    
  </entry>
  
  <entry>
    <title>符号未定义实例一则</title>
    <link href="https://www.delta1037.cn/2023/Deploy/%E7%AC%A6%E5%8F%B7%E6%9C%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E4%BE%8B%E4%B8%80%E5%88%99/"/>
    <id>https://www.delta1037.cn/2023/Deploy/%E7%AC%A6%E5%8F%B7%E6%9C%AA%E5%AE%9A%E4%B9%89%E5%AE%9E%E4%BE%8B%E4%B8%80%E5%88%99/</id>
    <published>2023-05-01T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.951Z</updated>
    
    <content type="html"><![CDATA[<p>该示例来源于<a href="https://github.com/osu-crypto/MiniPSI">Github项目</a>**<a href="https://github.com/osu-crypto/MiniPSI">MiniPSI</a><strong>的复现，该项目的编译用到了另一个<a href="https://github.com/miracl/MIRACL">Github项目</a></strong><a href="https://github.com/miracl/MIRACL">MIRACL</a>**编译的静态库文件，但是在连接的过程中总是无法链接，提示符号未定义错误。因为我对CMake文件也不是相当了解，一开始的思路就陷入到了静态库文件的位置是不是设置的有问题，后续依靠着之前看到过的C&#x2F;C++编译的知识，才排查到是C++调用C的库时符号的问题。</p><span id="more"></span><h1 id="一、问题场景"><a href="#一、问题场景" class="headerlink" title="一、问题场景"></a>一、问题场景</h1><p>**<a href="https://github.com/osu-crypto/MiniPSI">MiniPSI</a>**项目中，作者提供了一个一键安装脚本，但是在项目中确实了脚本中所用到的<code>libOTe/cryptoTools/thirdparty/linux/</code>路径部分，导致<font color="#D44C47">一键安装脚本失效</font>。从项目作者的README中了解到，缺失的编译依赖内容是boost和miracl，所以就手动创建该目录，在该目录下进行依赖的编译即可。</p><p>Boost库的编译很顺利，毕竟这是一个很知名的库。MIRACL在编译的过程中则遇到了一点问题：</p><ul><li>MIRACL需要扁平式解压，但是MiniPSI项目中对该项目的依赖具有项目结构：对MiniPSI项目中依赖MIRACL项目的地方修改，去除项目结构部分（头文件目录和静态库目录等等，改为使用根目录即可）。</li><li>本次实验环境是CentOS，MIRACL项目的lib文件夹中包含编译Linux库文件的有三个脚本：linux、linux64和linux64_cpp，linux脚本对应着i386 32位系统环境，linux64对应着64位系统环境，linux64_cpp是C++库特供版。在项目编译中，首选的是linux64_cpp，因为MiniPSI是C++的：<ul><li>MiniPSI中需要MIRACL的多线程版本，在MIRACL的<a href="https://github.com/miracl/MIRACL/blob/master/docs/miracl-user-manual/installation.md">文档</a>中有记录，在头文件<em>mirdef.h</em>中添加宏定义MR_GENERIC_MT即可</li><li>MIRACL多线程版本只有linux、linux64两个脚本可以实现，但是<font color="#D44C47">无法编译一些测试文件</font>，如果不想出现过多的报错可以在脚本文件中把测试文件的编译删除掉。C++版本的linux64_cpp不支持多线程。</li></ul></li></ul><h1 id="二、问题描述"><a href="#二、问题描述" class="headerlink" title="二、问题描述"></a>二、问题描述</h1><p>使用C版本的编译脚本来编译MIRACL多线程版本，形成一个静态库<code>libmiracl.a</code>（从<code>miracl.a</code>拷贝而来），给libOTE编译的时候用。</p><p>在libOTE形成可执行文件的时候（例如<code>frontend_libOTe</code>），这个时候就是要处理一些未定义的符号的时候了（之前的编译都是形成的静态库文件，所以未定义的符号是没有问题的），但是这个时候出现了大量的符号未定义错误：</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">**../lib/libcryptoTools.a**(Curve.cpp.o): In function `osuCrypto::EccNumber::<span class="built_in">randomize</span>(osuCrypto::PRNG&amp;)<span class="string">&#x27;:</span></span><br><span class="line"><span class="string">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+0x3a): undefined reference to `zero(bigtype*)&#x27;</span></span><br><span class="line">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+<span class="number">0x10a</span>): undefined reference to `<span class="built_in">mr_compare</span>(bigtype*, bigtype*)&#x27;</span><br><span class="line">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+<span class="number">0x124</span>): undefined reference to `<span class="built_in">mr_lzero</span>(bigtype*)&#x27;</span><br><span class="line">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+<span class="number">0x139</span>): undefined reference to `<span class="built_in">divide</span>(miracl*, bigtype*, bigtype*, bigtype*)&#x27;</span><br><span class="line">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+<span class="number">0x14d</span>): undefined reference to `<span class="built_in">mr_compare</span>(bigtype*, bigtype*)&#x27;</span><br><span class="line">Curve.cpp:(.text._ZN9osuCrypto9EccNumber9randomizeERNS_4PRNGE+<span class="number">0x176</span>): undefined reference to `<span class="built_in">mr_compare</span>(bigtype*, bigtype*)&#x27;</span><br></pre></td></tr></table></figure><p>经过nm命令对库文件符号的观察，缺失的符号<u>应该是在的</u>：</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></pre></td><td class="code"><pre><span class="line">➜  miracl git:(master) ✗ nm libmiracl.a | grep compare</span><br><span class="line">0000000000002570 T mr_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">00000000000006f0 T zzn2_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">00000000000000a0 T zzn3_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">0000000000001180 T ecn2_compare</span><br><span class="line">                 U mr_compare</span><br><span class="line">                 U zzn2_compare</span><br><span class="line">                 U zzn2_compare</span><br><span class="line">00000000000002c0 T zzn4_compare</span><br></pre></td></tr></table></figure><p>根据编译<code>frontend_libOTe</code>的输出内容，报错的应该是库文件<code>libcryptoTools.a</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></pre></td><td class="code"><pre><span class="line">➜  libOTe git:(master) ✗ nm ./lib/libcryptoTools.a | grep compare</span><br><span class="line">                 **U _Z10mr_compareP7bigtypeS0_**</span><br><span class="line">                 U _ZNKSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEE7compareEPKc</span><br></pre></td></tr></table></figure><p>可以看出来库文件<code>libcryptoTools.a</code>里对应的符号是<code>_Z10mr_compareP7bigtypeS0_</code>，但是<code>libmiracl.a</code>库里对应的符号是<code>mr_compare</code>，说明是C++符号修饰的问题。</p><p>上面报未定义的错误<code>undefined reference to </code>zero(bigtype*)’&#96;，我只关注到了函数名称，却没有考虑到要去对应报错的库里看具体的符号名是什么（显示出来的信息和具体库里实际符号名是不一样的），<u>导致我一致在找编译时链接库的问题</u>。</p><h1 id="三、问题解决"><a href="#三、问题解决" class="headerlink" title="三、问题解决"></a>三、问题解决</h1><p>排查到C++调用C的库，那么问题就很明显了，给C库的结构上套一层宏就可以了，表明这些是C的接口，不需要符号修饰。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="keyword">ifdef</span> __cplusplus</span></span><br><span class="line"><span class="keyword">extern</span> <span class="string">&quot;C&quot;</span>&#123;</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br><span class="line"><span class="comment">// some api define</span></span><br><span class="line"><span class="meta">#<span class="keyword">ifdef</span> __cplusplus</span></span><br><span class="line">&#125;</span><br><span class="line"><span class="meta">#<span class="keyword">endif</span></span></span><br></pre></td></tr></table></figure><h1 id="四、总结"><a href="#四、总结" class="headerlink" title="四、总结"></a>四、总结</h1><p>其实如果一开始就能关注到C++调用C的库会有问题，那么整体的过程会顺利很多，但是我先入为主（从输出的信息中看到函数名找不到，一直在找链接问题），认为问题大概率出现在CMake的文件上，一直在排查链接的过程。这个问题的解决过程花费了我几乎一天的时间，书上的知识想要在实际中灵活运用还是有点距离。</p><p>排查链接问题还是要自顶向下的排查：</p><ul><li>先被链接的库里的缺失的符号是什么样的（库有没有问题，符号有没有导出）</li><li>查找可执行文件中对应缺失的符号是什么样的，是否与被链接库的符号一致（符号问题）</li><li>查看编译的链接过程，是否没有找到对应的链接库（链接问题）</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;该示例来源于&lt;a href=&quot;https://github.com/osu-crypto/MiniPSI&quot;&gt;Github项目&lt;/a&gt;**&lt;a href=&quot;https://github.com/osu-crypto/MiniPSI&quot;&gt;MiniPSI&lt;/a&gt;&lt;strong&gt;的复现，该项目的编译用到了另一个&lt;a href=&quot;https://github.com/miracl/MIRACL&quot;&gt;Github项目&lt;/a&gt;&lt;/strong&gt;&lt;a href=&quot;https://github.com/miracl/MIRACL&quot;&gt;MIRACL&lt;/a&gt;**编译的静态库文件，但是在连接的过程中总是无法链接，提示符号未定义错误。因为我对CMake文件也不是相当了解，一开始的思路就陷入到了静态库文件的位置是不是设置的有问题，后续依靠着之前看到过的C&amp;#x2F;C++编译的知识，才排查到是C++调用C的库时符号的问题。&lt;/p&gt;</summary>
    
    
    
    <category term="C/C++" scheme="https://www.delta1037.cn/categories/C-C/"/>
    
    
    <category term="C/C++" scheme="https://www.delta1037.cn/tags/C-C/"/>
    
  </entry>
  
  <entry>
    <title>pyinstaller打包的exe解包</title>
    <link href="https://www.delta1037.cn/2023/Others/pyinstaller%E6%89%93%E5%8C%85%E7%9A%84exe%E8%A7%A3%E5%8C%85/"/>
    <id>https://www.delta1037.cn/2023/Others/pyinstaller%E6%89%93%E5%8C%85%E7%9A%84exe%E8%A7%A3%E5%8C%85/</id>
    <published>2023-02-15T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.945Z</updated>
    
    <content type="html"><![CDATA[<p>将pyinstaller打包的exe解包：</p><ul><li>解非加密的exe</li><li>解加密后的exe（打包的python版本要≤3.8）</li></ul><span id="more"></span><h2 id="一、解包依赖"><a href="#一、解包依赖" class="headerlink" title="一、解包依赖"></a>一、解包依赖</h2><ul><li>pyinstxtractor（不需要安装）：@(<a href="https://github.com/extremecoders-re/pyinstxtractor">https://github.com/extremecoders-re/pyinstxtractor</a>)</li><li>uncompyle6（pip安装：<code>pip install uncompyle6</code>）：@(<a href="https://github.com/rocky/python-uncompyle6">https://github.com/rocky/python-uncompyle6</a>)</li><li>解密文件：代码来源未知，只有代码了</li></ul><p><font color="#D44C47"><strong>uncompyle6不支持3.9</strong></font><font color="#D44C47">，所以解包的对应的exe工程需要在3.8以下</font></p><h2 id="二、解包"><a href="#二、解包" class="headerlink" title="二、解包"></a>二、解包</h2><h3 id="2-1-从exe文件提取二进制pyc文件"><a href="#2-1-从exe文件提取二进制pyc文件" class="headerlink" title="2.1 从exe文件提取二进制pyc文件"></a>2.1 从exe文件提取二进制pyc文件</h3><p>2.1.1、下载pyinstxtractor获取到py文件，win11终端中执行</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">py .\pyinstxtractor.py .\exe_file.exe</span><br></pre></td></tr></table></figure><p>LOG：</p><figure class="highlight powershell"><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">(py_pack_env) <span class="built_in">PS</span> <span class="built_in">H</span>:\TestRepo\py_pack\unpack_test&gt; py .\pyinstxtractor.py .\notion_dump_client_no_key.exe</span><br><span class="line">[+] Processing .\notion_dump_client_no_key.exe</span><br><span class="line">[+] Pyinstaller version: <span class="number">2.1</span>+</span><br><span class="line">[+] Python version: <span class="number">309</span></span><br><span class="line">[+] Length of package: <span class="number">11041731</span> bytes</span><br><span class="line">[+] Found <span class="number">994</span> files <span class="keyword">in</span> CArchive</span><br><span class="line">[+] Beginning extraction...please standby</span><br><span class="line">[+] Possible entry point: pyiboot01_bootstrap.pyc</span><br><span class="line">[+] Possible entry point: pyi_rth_subprocess.pyc</span><br><span class="line">[+] Possible entry point: pyi_rth_pkgutil.pyc</span><br><span class="line">[+] Possible entry point: pyi_rth_multiprocessing.pyc</span><br><span class="line">[+] Possible entry point: pyi_rth_inspect.pyc</span><br><span class="line">[+] Possible entry point: pyi_rth__tkinter.pyc</span><br><span class="line">[+] Possible entry point: notion_dump_client.pyc</span><br><span class="line">[+] Found <span class="number">395</span> files <span class="keyword">in</span> PYZ archive</span><br><span class="line">[+] Successfully extracted pyinstaller archive: .\notion_dump_client_no_key.exe</span><br><span class="line"></span><br><span class="line">You can now use a python decompiler on the pyc files within the extracted directory</span><br><span class="line">(py_pack_env) <span class="built_in">PS</span> <span class="built_in">H</span>:\TestRepo\py_pack\unpack_test&gt;</span><br></pre></td></tr></table></figure><p>2.1.2、<strong>如果是加密</strong>后的exe文件，输出会显示（类似的Extracting as is.）</p><figure class="highlight powershell"><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">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xml\sax\expatreader.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xml\sax\handler.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xml\sax\saxutils.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xml\sax\xmlreader.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xmlrpc\__init__.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\xmlrpc\client.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\zipfile.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[!] Error: Failed to decompress PYZ<span class="literal">-00</span>.pyz_extracted\zipimport.pyc, probably encrypted. Extracting as is.</span><br><span class="line">[+] Successfully extracted pyinstaller archive: .\notion_dump_client_key.exe</span><br></pre></td></tr></table></figure><ul><li>先获取密码（密码文件时解密加密文件后其中的一个<code>pyimod00_crypto_key.pyc</code>文件（在主目录下））先对<code>pyimod00_crypto_key.pyc</code>进行反编译</li></ul><figure class="highlight powershell"><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">(py_pack_env) <span class="built_in">PS</span> <span class="built_in">H</span>:\TestRepo\py_pack\unpack_test\notion_dump_client_key.exe_extracted&gt; uncompyle6 pyimod00_crypto_key.pyc</span><br><span class="line"><span class="comment"># uncompyle6 version 3.8.0</span></span><br><span class="line"><span class="comment"># Python bytecode 3.7.0 (3394)</span></span><br><span class="line"><span class="comment"># Decompiled from: Python 3.7.8 (tags/v3.7.8:4b47a5b6ba, Jun 28 2020, 08:53:46) [MSC v.1916 64 bit (AMD64)]</span></span><br><span class="line"><span class="comment"># Embedded file name: build\notion_dump_client\pyimod00_crypto_key.py</span></span><br><span class="line"><span class="comment"># Compiled at: 1995-09-28 00:18:56</span></span><br><span class="line"><span class="comment"># Size of source mod 2**32: 51 bytes</span></span><br><span class="line">key = <span class="string">&#x27;0000000000123456&#x27;</span></span><br><span class="line"><span class="comment"># okay decompiling pyimod00_crypto_key.pyc</span></span><br></pre></td></tr></table></figure><p>可以看出密码是<code>0000000000123456</code></p><ul><li>用（三、解密文件）中的代码对pyinstxtractor解析出来的内容进行解密<ul><li>确认：代码中的pyc header（magic Number）部分</li><li>确认：代码中的passwd（解密密码）</li><li>确认：代码中的PYZ-00.pyz_extracted路径位置</li></ul></li></ul><p>假设解密代码文件，存为文件名为<code>decode.py</code> ，并且与exe同级目录，在改目录下执行</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">py .\decode.py</span><br></pre></td></tr></table></figure><p>即可获取到所有的pyc文件</p><h3 id="2-2-将pyc文件反编译成py文件"><a href="#2-2-将pyc文件反编译成py文件" class="headerlink" title="2.2 将pyc文件反编译成py文件"></a>2.2 将pyc文件反编译成py文件</h3><p>使用uncompyle6 将pyc文件反编译成py文件即可</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">uncompyle6 notion_dump_client.pyc &gt; notion_dump_client.py</span><br></pre></td></tr></table></figure><h2 id="三、解密文件"><a href="#三、解密文件" class="headerlink" title="三、解密文件"></a>三、解密文件</h2><p>解密文件所用代码：</p><ul><li>密码部分需要替换</li><li>pyc header的magic Number需要替换</li></ul><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> glob</span><br><span class="line"><span class="keyword">import</span> zlib</span><br><span class="line"><span class="keyword">import</span> tinyaes</span><br><span class="line"><span class="keyword">from</span> pathlib <span class="keyword">import</span> Path</span><br><span class="line"></span><br><span class="line">CRYPT_BLOCK_SIZE = <span class="number">16</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># key obtained from pyimod00_crypto_key</span></span><br><span class="line">key = <span class="built_in">bytes</span>(<span class="string">&#x27;passwd&#x27;</span>, <span class="string">&#x27;utf-8&#x27;</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> p <span class="keyword">in</span> Path(<span class="string">&quot;PYZ-00.pyz_extracted&quot;</span>).glob(<span class="string">&quot;**/*.pyc.encrypted&quot;</span>):</span><br><span class="line">    <span class="built_in">print</span>(p.with_name(p.stem))</span><br><span class="line">    inf = <span class="built_in">open</span>(p, <span class="string">&#x27;rb&#x27;</span>)  <span class="comment"># encrypted file input</span></span><br><span class="line">    outf = <span class="built_in">open</span>(p.with_name(p.stem), <span class="string">&#x27;wb&#x27;</span>)  <span class="comment"># output file</span></span><br><span class="line"></span><br><span class="line">    <span class="comment"># Initialization vector</span></span><br><span class="line">    iv = inf.read(CRYPT_BLOCK_SIZE)</span><br><span class="line"></span><br><span class="line">    cipher = tinyaes.AES(key, iv)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Decrypt and decompress</span></span><br><span class="line">    plaintext = zlib.decompress(cipher.CTR_xcrypt_buffer(inf.read()))</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Write pyc header</span></span><br><span class="line">    <span class="comment"># The header below is for Python 3.7</span></span><br><span class="line">    outf.write(<span class="string">b&#x27;\x42\x0d\x0d\x0a\0\0\0\0\0\0\0\0\0\0\0\0&#x27;</span>)</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Write decrypted data</span></span><br><span class="line">    outf.write(plaintext)</span><br><span class="line"></span><br><span class="line">    inf.close()</span><br><span class="line">    outf.close()</span><br><span class="line"></span><br><span class="line">    <span class="comment"># Delete .pyc.encrypted file</span></span><br><span class="line">    p.unlink()</span><br></pre></td></tr></table></figure><p>魔数与python版本<strong>对照表</strong></p><p>获取魔数：</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> importlib</span><br><span class="line"><span class="built_in">print</span>(importlib.util.MAGIC_NUMBER.<span class="built_in">hex</span>())</span><br></pre></td></tr></table></figure><p>uncompyle6</p><table><thead><tr><th>版本</th><th>魔数</th></tr></thead><tbody><tr><td>python 3.7</td><td>\x42\x0d\x0d\x0a</td></tr></tbody></table>]]></content>
    
    
    <summary type="html">&lt;p&gt;将pyinstaller打包的exe解包：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;解非加密的exe&lt;/li&gt;
&lt;li&gt;解加密后的exe（打包的python版本要≤3.8）&lt;/li&gt;
&lt;/ul&gt;</summary>
    
    
    
    <category term="其它" scheme="https://www.delta1037.cn/categories/%E5%85%B6%E5%AE%83/"/>
    
    
    <category term="Python" scheme="https://www.delta1037.cn/tags/Python/"/>
    
    <category term="解码" scheme="https://www.delta1037.cn/tags/%E8%A7%A3%E7%A0%81/"/>
    
  </entry>
  
  <entry>
    <title>Git commit信息规范</title>
    <link href="https://www.delta1037.cn/2023/Project/Gitcommit%E4%BF%A1%E6%81%AF%E8%A7%84%E8%8C%83/"/>
    <id>https://www.delta1037.cn/2023/Project/Gitcommit%E4%BF%A1%E6%81%AF%E8%A7%84%E8%8C%83/</id>
    <published>2023-02-15T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.943Z</updated>
    
    <content type="html"><![CDATA[<p>Git commit信息格式规范</p><span id="more"></span><p><strong>commit信息格式：</strong></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">&lt;<span class="built_in">type</span>&gt;(&lt;scope&gt;): &lt;subject&gt;</span><br><span class="line"></span><br><span class="line"><span class="comment"># type ：commit类型</span></span><br><span class="line"><span class="comment"># scope ： 影响范围</span></span><br><span class="line"><span class="comment"># subject ： 具体描述</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># eg. : fix(DAO): fixed invalid user table indexes.</span></span><br></pre></td></tr></table></figure><p><strong>type：</strong>type指明git commit的类别，应该使用以下类型，也可根据团队自行增减</p><ul><li>『feat』: 新增功能</li><li>『fix』: 修复 bug</li><li>『docs』: 仅仅修改了文档，比如 README, CHANGELOG等等</li><li>『test』: 增加&#x2F;修改测试用例，包括单元测试、集成测试等</li><li>『style』: 修改了空行、缩进格式、引用包排序等等（不改变代码逻辑）</li><li>『perf』: 优化相关内容，比如提升性能、体验、算法等</li><li>『refactor』: 代码重构，「没有新功能或者bug修复」</li><li>『chore』: 改变构建流程、或者增加依赖库、工具等</li><li>『revert』: 回滚到上一个版本</li><li>『merge』: 代码合并</li></ul><p><strong>scope（可选）：</strong>scope用于说明 commit 影响的范围，根据不同项目有不同层次描述。若没有特殊规定，也可以描述影响的哪些功能等。</p><p><strong>subject：</strong>subject是commit目的的简短描述，不超过50&#x2F;80个字符，一般git提交的时候会有颜色提示。</p><ul><li>若英文用不惯，那么推荐使用中文</li><li>若是开源代码，一律推荐统一英文，英文不行可以翻译软件用起来</li><li>若是开源代码，可以再附加对应的issue地址</li><li>结尾不加标点符号</li></ul><p><strong>参考：</strong></p><p><a href="https://zhuanlan.zhihu.com/p/400870942">BOOKMARK</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Git commit信息格式规范&lt;/p&gt;</summary>
    
    
    
    <category term="工程管理" scheme="https://www.delta1037.cn/categories/%E5%B7%A5%E7%A8%8B%E7%AE%A1%E7%90%86/"/>
    
    
    <category term="Git" scheme="https://www.delta1037.cn/tags/Git/"/>
    
  </entry>
  
  <entry>
    <title>Row size too large (&gt; 8126)</title>
    <link href="https://www.delta1037.cn/2023/Bugsfix/Rowsizetoolarge(-8126)/"/>
    <id>https://www.delta1037.cn/2023/Bugsfix/Rowsizetoolarge(-8126)/</id>
    <published>2023-02-11T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.941Z</updated>
    
    <content type="html"><![CDATA[<p>MySQL表新增字段时，出现报错：<code>Row size too large (&gt; 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help</code></p><span id="more"></span><h1 id="一、信息"><a href="#一、信息" class="headerlink" title="一、信息"></a>一、信息</h1><h2 id="1-1-环境"><a href="#1-1-环境" class="headerlink" title="1.1 环境"></a>1.1 环境</h2><p>给数据表添加一个新的字段。该数据表已经有很多字段了，并且一行的字节长度远大于8126。</p><blockquote><p>在本地搭建的MySQL5.7环境上新增字段并没有出错，所以是远程MySQL版本出现的问题。猜测是innodb_file_format并没有设置成正确格式。</p></blockquote><h2 id="1-2-报错"><a href="#1-2-报错" class="headerlink" title="1.2 报错"></a>1.2 报错</h2><blockquote><p>Row size too large (&gt; 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT&#x3D;DYNAMIC or ROW_FORMAT&#x3D;COMPRESSED may help</p></blockquote><h1 id="二、解决"><a href="#二、解决" class="headerlink" title="二、解决"></a>二、解决</h1><p><strong>免重启服务式解决：</strong></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">mysql&gt; <span class="built_in">set</span> GLOBAL innodb_file_per_table = ON;</span><br><span class="line">mysql&gt; <span class="built_in">set</span> GLOBAL innodb_file_format = barracuda;</span><br></pre></td></tr></table></figure><h1 id="三、分析"><a href="#三、分析" class="headerlink" title="三、分析"></a>三、分析</h1><p><strong>InnoDB格式问题：</strong></p><ul><li>InnoDB目前支持两种命名文件格式，Antelope 和Barracuda。<ul><li>Antelope是原始 InnoDB文件格式，以前没有名称。它支持表的COMPACT和REDUNDANT行格式InnoDB</li><li>Barracuda是最新的文件格式。它支持所有InnoDB行格式，包括较新的COMPRESSED和 DYNAMIC行格式。与 COMPRESSED和 DYNAMIC行格式相关的特性包括压缩表、页外列的高效存储以及高达 3072 字节的索引键前缀 ( innodb_large_prefix)</li></ul></li></ul><figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 检查表的文件格式和行格式 命令</span></span><br><span class="line">SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES;</span><br></pre></td></tr></table></figure><p><strong>MySQL硬性条件：</strong></p><p>65535 bytes is the max row size for mysql.</p><p><strong>问题分析：</strong></p><p>根据问题的提示，原因肯定是表中的字段长度和超了，所以按照修改提示，将ROW_FORMAT修改为COMPRESSED或者DYNAMIC，但又只有Barracuda文件格式支持，所以先通过<code>set GLOBAL innodb_file_format = barracuda;</code>将InnoDB格式修改，再修改表的ROW_FORMAT格式即可。</p><p><strong>总结：</strong></p><p>本地使用的版本是MySQL5.7，部署服务器版本是MySQL5.6，通过上面的<code>检查表的文件格式和行格式</code>命令，可以看到本地的InnoDB默认格式就是Barracuda，而远程除一个被修改的表之外，其它的全是Antelope格式，所以出现报错就是<font color="#D44C47"><strong>InnoDB格式和ROW_FORMAT格式导致的</strong></font>。</p><h1 id="参考"><a href="#参考" class="headerlink" title="参考"></a>参考</h1><p><a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-file-format.html">BOOKMARK</a></p><p><a href="https://dev.mysql.com/doc/refman/5.7/en/innodb-row-format.html">BOOKMARK</a></p><p><a href="https://blog.51cto.com/u_4708705/2050345">BOOKMARK</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;MySQL表新增字段时，出现报错：&lt;code&gt;Row size too large (&amp;gt; 8126). Changing some columns to TEXT or BLOB or using ROW_FORMAT=DYNAMIC or ROW_FORMAT=COMPRESSED may help&lt;/code&gt;&lt;/p&gt;</summary>
    
    
    
    <category term="Bugsfix" scheme="https://www.delta1037.cn/categories/Bugsfix/"/>
    
    
    <category term="Bug" scheme="https://www.delta1037.cn/tags/Bug/"/>
    
    <category term="MySQL" scheme="https://www.delta1037.cn/tags/MySQL/"/>
    
  </entry>
  
  <entry>
    <title>hexo 新增mermaid支持</title>
    <link href="https://www.delta1037.cn/2023/Deploy/hexo%E6%96%B0%E5%A2%9Emermaid%E6%94%AF%E6%8C%81/"/>
    <id>https://www.delta1037.cn/2023/Deploy/hexo%E6%96%B0%E5%A2%9Emermaid%E6%94%AF%E6%8C%81/</id>
    <published>2023-02-06T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:54.781Z</updated>
    
    <content type="html"><![CDATA[<p>趁着博客整合，修理一下mermaid不支持的问题。</p><p>从网上找到了一些教程，但是配置过程中也发现了一些问题，所以在这里记录一下。</p><span id="more"></span><h1 id="一、安装"><a href="#一、安装" class="headerlink" title="一、安装"></a>一、安装</h1><p>安装插件：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm install hexo<span class="literal">-filter-mermaid-diagrams</span></span><br></pre></td></tr></table></figure><p>添加配置。在<strong>主题目录</strong>下的<code>_config.yml</code>文件中新增配置：</p><figure class="highlight powershell"><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"># mermaid chart</span></span><br><span class="line">mermaid: <span class="comment">## mermaid url https://github.com/knsv/mermaid</span></span><br><span class="line">  enable: true  <span class="comment"># default true</span></span><br><span class="line">  version: <span class="string">&quot;7.1.2&quot;</span> <span class="comment"># default v7.1.2</span></span><br><span class="line">  options:  <span class="comment"># find more api options from https://github.com/knsv/mermaid/blob/master/src/mermaidAPI.js</span></span><br><span class="line">    <span class="comment">#startOnload: true  // default true</span></span><br></pre></td></tr></table></figure><p>添加支持。我使用的BuleLake主题<code>js</code>后缀是<code>.ejs</code>（其它类型（<code>.pug</code>、<code>.swig</code>）参考<a href="https://github.com/webappdevelp/hexo-filter-mermaid-diagrams">Github说明</a>），在<code>themes\bluelake\layout\_partial\</code>**<code>after-footer.ejs</code>**中添加如下内容</p><figure class="highlight powershell"><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">&lt;% <span class="keyword">if</span> (theme.mermaid.enable) &#123; %&gt;</span><br><span class="line">  &lt;script src=<span class="string">&#x27;https://unpkg.com/mermaid@&lt;%= theme.mermaid.version %&gt;/dist/mermaid.min.js&#x27;</span>&gt;&lt;/script&gt;</span><br><span class="line">  &lt;script&gt;</span><br><span class="line">    <span class="keyword">if</span> (window.mermaid) &#123;</span><br><span class="line">      mermaid.initialize(&#123;theme: <span class="string">&#x27;forest&#x27;</span>&#125;);</span><br><span class="line">    &#125;</span><br><span class="line">  &lt;/script&gt;</span><br><span class="line">&lt;% &#125; %&gt;</span><br></pre></td></tr></table></figure><h1 id="二、使用"><a href="#二、使用" class="headerlink" title="二、使用"></a>二、使用</h1><p><a href="https://mermaid.js.org/config/theming.html">主题类型</a>：（在上面修改文件时配置）：</p><ul><li><strong>default</strong> - This is the default theme for all diagrams.</li><li><strong>neutral</strong> - This theme is great for black and white documents that will be printed.</li><li><strong>dark</strong> - This theme goes well with dark-colored elements or dark-mode.</li><li><strong>forest</strong> - This theme contains shades of green.</li><li><strong>base</strong> - This is the only theme that can be modified. Use this theme as the base for customizations.</li></ul><h1 id="三、注意"><a href="#三、注意" class="headerlink" title="三、注意"></a>三、注意</h1><ul><li>mermaid新增配置是修改的主题目录下的文件</li><li>需要将根目录配置<code>_config.yml</code>中<code>highlight</code>下的<code>auto_detect</code>设置为<code>true</code></li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;趁着博客整合，修理一下mermaid不支持的问题。&lt;/p&gt;
&lt;p&gt;从网上找到了一些教程，但是配置过程中也发现了一些问题，所以在这里记录一下。&lt;/p&gt;</summary>
    
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    <category term="部署" scheme="https://www.delta1037.cn/tags/%E9%83%A8%E7%BD%B2/"/>
    
  </entry>
  
  <entry>
    <title>博客更新说明</title>
    <link href="https://www.delta1037.cn/2023/Deploy/%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0%E8%AF%B4%E6%98%8E/"/>
    <id>https://www.delta1037.cn/2023/Deploy/%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0%E8%AF%B4%E6%98%8E/</id>
    <published>2023-02-06T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:54.775Z</updated>
    
    <content type="html"><![CDATA[<p>博客最近整合到了notion统一管理，并更新了hexo和主题版本，正在逐个完善并重新上传之前的博客内容</p><span id="more"></span><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Deploy_%E5%8D%9A%E5%AE%A2%E6%9B%B4%E6%96%B0%E8%AF%B4%E6%98%8E_notion%E7%BB%9F%E4%B8%80%E7%AE%A1%E7%90%86%E6%96%87%E7%AB%A0.png" alt="notion统一管理文章"></p><ul><li>文章搬运基本完成，删除了一些未完成的文章，之后再挨着整理一下格式即可</li><li>notion上的文章之后会拣比较好的搬运到这边来</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;博客最近整合到了notion统一管理，并更新了hexo和主题版本，正在逐个完善并重新上传之前的博客内容&lt;/p&gt;</summary>
    
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    <category term="部署" scheme="https://www.delta1037.cn/tags/%E9%83%A8%E7%BD%B2/"/>
    
  </entry>
  
  <entry>
    <title>Latex fontspec Error</title>
    <link href="https://www.delta1037.cn/2023/Bugsfix/LatexfontspecError/"/>
    <id>https://www.delta1037.cn/2023/Bugsfix/LatexfontspecError/</id>
    <published>2023-02-05T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:54.756Z</updated>
    
    <content type="html"><![CDATA[<p>latex编译时，出现报错<code>! Package fontspec Error: The font &quot;Microsoft YaHei&quot; cannot be found.</code></p><p>排查问题记录与问题的思考。</p><span id="more"></span><h1 id="一、环境"><a href="#一、环境" class="headerlink" title="一、环境"></a>一、环境</h1><ul><li>window11</li><li>texlive 2022</li><li>一份带有中文的tex文件  <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># 中文环境配置</span></span><br><span class="line">\usepackage[UTF8]&#123;ctex&#125;</span><br></pre></td></tr></table></figure></li></ul><h1 id="二、问题"><a href="#二、问题" class="headerlink" title="二、问题"></a>二、问题</h1><p>在执行<code>xelatex *.tex</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></pre></td><td class="code"><pre><span class="line">Package biblatex Warning: <span class="string">&#x27;babel/polyglossia&#x27;</span> detected but <span class="string">&#x27;csquotes&#x27;</span> missing.</span><br><span class="line">(biblatex)                Loading <span class="string">&#x27;csquotes&#x27;</span> recommended.</span><br><span class="line"></span><br><span class="line">(e:/texlive/2022/texmf-dist/tex/latex/newpx/TeXGyrePagellaX.fontspec)</span><br><span class="line">(./main.aux)</span><br><span class="line">*geometry* driver: auto-detecting</span><br><span class="line">*geometry* detected driver: xetex</span><br><span class="line">(e:/texlive/2022/texmf-dist/tex/latex/biblatex/lbx/english.lbx)</span><br><span class="line">No file main.bbl.</span><br><span class="line"></span><br><span class="line">Package hyperref Warning: Rerun to get /PageLabels entry.</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">! Package fontspec Error: The font <span class="string">&quot;Microsoft YaHei&quot;</span> cannot be found.</span><br><span class="line"></span><br><span class="line">For immediate <span class="built_in">help</span> <span class="built_in">type</span> H &lt;<span class="built_in">return</span>&gt;.</span><br><span class="line"> ...</span><br><span class="line"></span><br><span class="line">l.79 ...sep=1cm]&#123;\Huge\centering\bfseries\sffamily</span><br><span class="line">                                                  \parbox[c][][t]&#123;\paperwidt...</span><br><span class="line"></span><br><span class="line">?</span><br></pre></td></tr></table></figure><p>已知该字体已安装（解决过程中也重装该字体很多次）</p><h1 id="三、解决"><a href="#三、解决" class="headerlink" title="三、解决"></a>三、解决</h1><p>看到<code>! Package fontspec Error: The font &quot;Microsoft YaHei&quot; cannot be found</code>时，判断为字体没有识别，于是尝试重装该字体，重新加载字体缓存等操作，均无效（搞了一下午的字体问题，还把window10上的字体拷贝过来重新安装了）。</p><p>恰好手边有另一份带有中文的tex源文件（并不知道其中是如何配置的中文环境，只是有试一试的想法），于是尝试编译，结果成功了。</p><p><strong>那么报字体问题的错误，问题根源是否出在字体问题上呢？</strong>再回顾模板的下载和修改过程，发现有一段数学符号包是后来添加的：</p><figure class="highlight latex"><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="keyword">\usepackage</span>&#123;esint&#125;</span><br><span class="line"><span class="keyword">\newcommand</span>&#123;<span class="keyword">\gt</span>&#125;&#123;<span class="keyword">\textgreater</span>&#125;</span><br><span class="line"><span class="keyword">\newcommand</span>&#123;<span class="keyword">\lt</span>&#125;&#123;<span class="keyword">\textless</span>&#125;</span><br><span class="line"><span class="keyword">\usepackage</span>&#123;euler&#125;</span><br><span class="line"><span class="keyword">\usepackage</span>&#123;newpxtext&#125;</span><br><span class="line"><span class="keyword">\usepackage</span>&#123;amsmath&#125;</span><br></pre></td></tr></table></figure><p>使用排除法（将上面所有的包全注释掉，一个一个添加），发现是<code>newpxtext</code>的问题，去掉该包之后，执行<code>xelatex *.tex</code>时，没有再出现报错。</p><h1 id="四、思考"><a href="#四、思考" class="headerlink" title="四、思考"></a>四、思考</h1><p>虽然终端显示的是字体问题，但是当字体确实没有问题的时候，就要<strong>考虑别的方向，做一些并行测试来对比分析</strong>（例如上面在另外一份类似的tex工程中尝试编译）。</p><p>另外要<strong>仔细分析日志</strong>，再看日志最后一部分时，可以看到有以下疑点：</p><figure class="highlight powershell"><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">(e:/texlive/<span class="number">2022</span>/texmf<span class="literal">-dist</span>/tex/latex/realscripts/realscripts.sty))</span><br><span class="line"></span><br><span class="line">Package biblatex Warning: <span class="string">&#x27;babel/polyglossia&#x27;</span> detected but <span class="string">&#x27;csquotes&#x27;</span> missing.</span><br><span class="line">(biblatex)                Loading <span class="string">&#x27;csquotes&#x27;</span> recommended.</span><br><span class="line"></span><br><span class="line"><span class="comment"># 1、这里出现的最后的包是newpx，就是newpxtext</span></span><br><span class="line">(e:/texlive/<span class="number">2022</span>/texmf<span class="literal">-dist</span>/tex/latex/&lt;font color=<span class="string">&quot;#D44C47&quot;</span>&gt;**newpx**&lt;/font&gt;/TeXGyrePagellaX.fontspec)</span><br><span class="line"><span class="comment"># 2、这里来看，有几个包含中文的文件都已经通过了，所以有可能不是字体问题</span></span><br><span class="line">&lt;font color=<span class="string">&quot;#D44C47&quot;</span>&gt;(./main.aux (./sub_chapter/<span class="number">01</span><span class="literal">-basic_block</span>.aux)</span><br><span class="line">(./sub_chapter/<span class="number">02</span><span class="literal">-advance_block</span>.aux) (./sub_chapter/<span class="number">03</span><span class="literal">-database</span>.aux)</span><br><span class="line">(./sub_chapter/<span class="number">04</span><span class="literal">-multi_media</span>.aux) (./sub_chapter/<span class="number">05</span><span class="literal">-insert_block</span>.aux)</span><br><span class="line">(./sub_chapter/<span class="number">06</span><span class="literal">-rich_text</span>.aux) (./sub_chapter/<span class="number">07</span><span class="literal">-database_op</span>.aux)</span><br><span class="line">(./sub_chapter/<span class="number">08</span><span class="literal">-database_formula</span>.aux))&lt;/font&gt;</span><br><span class="line">*geometry* driver: auto<span class="literal">-detecting</span></span><br><span class="line">*geometry* detected driver: xetex</span><br><span class="line">(e:/texlive/<span class="number">2022</span>/texmf<span class="literal">-dist</span>/tex/latex/biblatex/lbx/english.lbx)</span><br><span class="line">No file main.bbl.</span><br><span class="line"></span><br><span class="line">! Package fontspec Error: The font <span class="string">&quot;Microsoft YaHei&quot;</span> cannot be found.</span><br><span class="line"></span><br><span class="line"><span class="keyword">For</span> immediate help <span class="built_in">type</span> <span class="built_in">H</span> &lt;<span class="keyword">return</span>&gt;.</span><br><span class="line"> ...</span><br><span class="line"></span><br><span class="line">l.<span class="number">79</span> ...sep=<span class="number">1</span>cm]&#123;\Huge\centering\bfseries\sffamily</span><br><span class="line">                                                  \parbox[<span class="type">c</span>][][<span class="type">t</span>]&#123;\paperwidt...</span><br><span class="line"></span><br><span class="line">?</span><br></pre></td></tr></table></figure><p>完整的输出日志：</p><figure class="highlight powershell"><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></pre></td><td class="code"><pre><span class="line"><span class="built_in">PS</span> F:\GitHubRepo\LatexBook\Notion_handout_latex&gt; xelatex main</span><br><span class="line">This is XeTeX, Version <span class="number">3.141592653</span><span class="literal">-2</span>.<span class="number">6</span><span class="literal">-0</span>.<span class="number">999994</span> (TeX Live <span class="number">2022</span>) (preloaded format=xelatex)</span><br><span class="line"> restricted \write18 enabled.</span><br><span class="line">entering extended mode</span><br><span class="line">(./main.tex</span><br><span class="line">LaTeX2e &lt;<span class="number">2022</span><span class="literal">-11-01</span>&gt; patch level <span class="number">1</span></span><br><span class="line">L3 programming layer &lt;<span class="number">2023</span><span class="literal">-02-02</span>&gt;</span><br><span class="line">(e:/texlive/<span class="number">2022</span>/texmf<span class="literal">-dist</span>/tex/latex/base/book.cls</span><br><span class="line">Document <span class="class"><span class="keyword">Class</span>: <span class="title">book</span> 2022/07/02 <span class="title">v1</span>.4<span class="title">n</span> <span class="title">Standard</span> <span class="title">LaTeX</span> <span class="title">document</span> <span class="title">class</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">fleqn</span>.<span class="title">clo</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">bk11</span>.<span class="title">clo</span>)) (./<span class="title">structure</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>/<span class="title">graphicx</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>/<span class="title">keyval</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>/<span class="title">graphics</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>/<span class="title">trig</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>-<span class="title">cfg</span>/<span class="title">graphics</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>-<span class="title">def</span>/<span class="title">xetex</span>.<span class="title">def</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">lipsum</span>/<span class="title">lipsum</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">l3packages</span>/<span class="title">l3keys2e</span>/<span class="title">l3keys2e</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">l3kernel</span>/<span class="title">expl3</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">l3backend</span>/<span class="title">l3backend</span>-<span class="title">xetex</span>.<span class="title">def</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">lipsum</span>/<span class="title">lipsum</span>.<span class="title">ltd</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">frontendlayer</span>/<span class="title">tikz</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgf</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfrcs</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfutil</span>-<span class="title">common</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfutil</span>-<span class="title">latex</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfrcs</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">pgf</span>.<span class="title">revision</span>.<span class="title">tex</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcore</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsys</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsys</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfkeys</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfkeyslibraryfiltered</span>.<span class="title">co</span></span></span><br><span class="line"><span class="class"><span class="title">de</span>.<span class="title">tex</span>)) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgf</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsys</span>-<span class="title">xetex</span>.<span class="title">def</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsys</span>-<span class="title">dvipdfmx</span>.<span class="title">def</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsys</span>-<span class="title">common</span>-<span class="title">pdf</span>.<span class="title">def</span>))</span></span><br><span class="line"><span class="class">))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsyssoftpath</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">systemlayer</span>/<span class="title">pgfsysprotocol</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">)) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">xcolor</span>/<span class="title">xcolor</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>-<span class="title">cfg</span>/<span class="title">color</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">graphics</span>/<span class="title">mathcolor</span>.<span class="title">ltx</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcore</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmath</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathutil</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathparser</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">basic</span>.<span class="title">code</span>.<span class="title">te</span></span></span><br><span class="line"><span class="class"><span class="title">x</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">trigonometric</span></span></span><br><span class="line"><span class="class">.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">random</span>.<span class="title">code</span>.<span class="title">t</span></span></span><br><span class="line"><span class="class"><span class="title">ex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">comparison</span>.<span class="title">co</span></span></span><br><span class="line"><span class="class"><span class="title">de</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">base</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">round</span>.<span class="title">code</span>.<span class="title">te</span></span></span><br><span class="line"><span class="class"><span class="title">x</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">misc</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfunctions</span>.<span class="title">integerarithm</span></span></span><br><span class="line"><span class="class"><span class="title">etics</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathcalc</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmathfloat</span>.<span class="title">code</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfint</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorepoints</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorepathconstruct</span>.<span class="title">cod</span></span></span><br><span class="line"><span class="class"><span class="title">e</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorepathusage</span>.<span class="title">code</span>.<span class="title">te</span></span></span><br><span class="line"><span class="class"><span class="title">x</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorescopes</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoregraphicstate</span>.<span class="title">code</span></span></span><br><span class="line"><span class="class">.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoretransformations</span>.<span class="title">c</span></span></span><br><span class="line"><span class="class"><span class="title">ode</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorequick</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoreobjects</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorepathprocessing</span>.<span class="title">co</span></span></span><br><span class="line"><span class="class"><span class="title">de</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorearrows</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoreshade</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoreimage</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoreexternal</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorelayers</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcoretransparency</span>.<span class="title">code</span></span></span><br><span class="line"><span class="class">.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorepatterns</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">basiclayer</span>/<span class="title">pgfcorerdf</span>.<span class="title">code</span>.<span class="title">tex</span>)))</span></span><br><span class="line"><span class="class"> (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">modules</span>/<span class="title">pgfmoduleshapes</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">modules</span>/<span class="title">pgfmoduleplot</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">compatibility</span>/<span class="title">pgfcomp</span>-<span class="title">version</span>-0-65.<span class="title">st</span></span></span><br><span class="line"><span class="class"><span class="title">y</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">compatibility</span>/<span class="title">pgfcomp</span>-<span class="title">version</span>-1-18.<span class="title">st</span></span></span><br><span class="line"><span class="class"><span class="title">y</span>)) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgffor</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfkeys</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgfkeys</span>.<span class="title">code</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmath</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">math</span>/<span class="title">pgfmath</span>.<span class="title">code</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">utilities</span>/<span class="title">pgffor</span>.<span class="title">code</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">frontendlayer</span>/<span class="title">tikz</span>/<span class="title">tikz</span>.<span class="title">code</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">libraries</span>/<span class="title">pgflibraryplothandlers</span>.<span class="title">co</span></span></span><br><span class="line"><span class="class"><span class="title">de</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">modules</span>/<span class="title">pgfmodulematrix</span>.<span class="title">code</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pgf</span>/<span class="title">frontendlayer</span>/<span class="title">tikz</span>/<span class="title">libraries</span>/<span class="title">tikzli</span></span></span><br><span class="line"><span class="class"><span class="title">brarytopaths</span>.<span class="title">code</span>.<span class="title">tex</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">babel</span>/<span class="title">babel</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">babel</span>/<span class="title">xebabel</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">babel</span>-<span class="title">english</span>/<span class="title">english</span>.<span class="title">ldf</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">babel</span>/<span class="title">locale</span>/<span class="title">en</span>/<span class="title">babel</span>-<span class="title">english</span>.<span class="title">tex</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">enumitem</span>/<span class="title">enumitem</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">booktabs</span>/<span class="title">booktabs</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">geometry</span>/<span class="title">geometry</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">iftex</span>/<span class="title">ifvtex</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">iftex</span>/<span class="title">iftex</span>.<span class="title">sty</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">psnfss</span>/<span class="title">avant</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">psnfss</span>/<span class="title">mathptmx</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">microtype</span>/<span class="title">microtype</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">etoolbox</span>/<span class="title">etoolbox</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">microtype</span>/<span class="title">microtype</span>-<span class="title">xetex</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">microtype</span>/<span class="title">microtype</span>.<span class="title">cfg</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">inputenc</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">inputenc</span> <span class="title">Warning</span>: <span class="title">inputenc</span> <span class="title">package</span> <span class="title">ignored</span> <span class="title">with</span> <span class="title">utf8</span> <span class="title">based</span> <span class="title">engines</span>.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">fontenc</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">psnfss</span>/<span class="title">t1ptm</span>.<span class="title">fd</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">biblatex</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pdftexcmds</span>/<span class="title">pdftexcmds</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">infwarerr</span>/<span class="title">infwarerr</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">ltxcmds</span>/<span class="title">ltxcmds</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">kvoptions</span>/<span class="title">kvoptions</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">kvsetkeys</span>/<span class="title">kvsetkeys</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">logreq</span>/<span class="title">logreq</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">logreq</span>/<span class="title">logreq</span>.<span class="title">def</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">ifthen</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">url</span>/<span class="title">url</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">blx</span>-<span class="title">dm</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">blx</span>-<span class="title">unicode</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">blx</span>-<span class="title">compat</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">biblatex</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">bbx</span>/<span class="title">numeric</span>.<span class="title">bbx</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">bbx</span>/<span class="title">standard</span>.<span class="title">bbx</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">cbx</span>/<span class="title">numeric</span>.<span class="title">cbx</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">biblatex</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">biblatex</span> <span class="title">Warning</span>: &#x27;<span class="title">babel</span>&#x27; <span class="title">option</span> <span class="title">is</span> <span class="title">deprecated</span>.</span></span><br><span class="line"><span class="class">(<span class="title">biblatex</span>)                <span class="title">Please</span> <span class="title">use</span> &#x27;<span class="title">autolang</span>&#x27; <span class="title">instead</span>.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">blx</span>-<span class="title">case</span>-<span class="title">expl3</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">l3packages</span>/<span class="title">xparse</span>/<span class="title">xparse</span>.<span class="title">sty</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">tools</span>/<span class="title">calc</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">makeidx</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class"><span class="title">Writing</span> <span class="title">index</span> <span class="title">file</span> <span class="title">main</span>.<span class="title">idx</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">titlesec</span>/<span class="title">titletoc</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">fancyhdr</span>/<span class="title">fancyhdr</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsmath</span>/<span class="title">amsmath</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class"><span class="title">For</span> <span class="title">additional</span> <span class="title">information</span> <span class="title">on</span> <span class="title">amsmath</span>, <span class="title">use</span> <span class="title">the</span> `?&#x27; <span class="title">option</span>.</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsmath</span>/<span class="title">amstext</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsmath</span>/<span class="title">amsgen</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsmath</span>/<span class="title">amsbsy</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsmath</span>/<span class="title">amsopn</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsfonts</span>/<span class="title">amsfonts</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amsfonts</span>/<span class="title">amssymb</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">amscls</span>/<span class="title">amsthm</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">mdframed</span>/<span class="title">mdframed</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">zref</span>/<span class="title">zref</span>-<span class="title">abspage</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">zref</span>/<span class="title">zref</span>-<span class="title">base</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">kvdefinekeys</span>/<span class="title">kvdefinekeys</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">etexcmds</span>/<span class="title">etexcmds</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">auxhook</span>/<span class="title">auxhook</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">atbegshi</span>-<span class="title">ltx</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">needspace</span>/<span class="title">needspace</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">mdframed</span>/<span class="title">md</span>-<span class="title">frame</span>-0.<span class="title">mdf</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hyperref</span>/<span class="title">hyperref</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">pdfescape</span>/<span class="title">pdfescape</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hycolor</span>/<span class="title">hycolor</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">letltxmacro</span>/<span class="title">letltxmacro</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hyperref</span>/<span class="title">nameref</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">refcount</span>/<span class="title">refcount</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">gettitlestring</span>/<span class="title">gettitlestring</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hyperref</span>/<span class="title">pd1enc</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">intcalc</span>/<span class="title">intcalc</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hyperref</span>/<span class="title">puenc</span>.<span class="title">def</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">bitset</span>/<span class="title">bitset</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">bigintcalc</span>/<span class="title">bigintcalc</span>.<span class="title">sty</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">hyperref</span>/<span class="title">hxetex</span>.<span class="title">def</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">stringenc</span>/<span class="title">stringenc</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">rerunfilecheck</span>/<span class="title">rerunfilecheck</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">atveryend</span>-<span class="title">ltx</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">uniquecounter</span>/<span class="title">uniquecounter</span>.<span class="title">sty</span>)))</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">hyperref</span> <span class="title">Warning</span>: <span class="title">Option</span> `<span class="title">backref</span>&#x27; <span class="title">has</span> <span class="title">already</span> <span class="title">been</span> <span class="title">used</span>,</span></span><br><span class="line"><span class="class">(<span class="title">hyperref</span>)                <span class="title">setting</span> <span class="title">the</span> <span class="title">option</span> <span class="title">has</span> <span class="title">no</span> <span class="title">effect</span> <span class="title">on</span> <span class="title">input</span> <span class="title">line</span> 504.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">hyperref</span> <span class="title">Warning</span>: <span class="title">Option</span> `<span class="title">pagebackref</span>&#x27; <span class="title">has</span> <span class="title">already</span> <span class="title">been</span> <span class="title">used</span>,</span></span><br><span class="line"><span class="class">(<span class="title">hyperref</span>)                <span class="title">setting</span> <span class="title">the</span> <span class="title">option</span> <span class="title">has</span> <span class="title">no</span> <span class="title">effect</span> <span class="title">on</span> <span class="title">input</span> <span class="title">line</span> 504.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">hyperref</span> <span class="title">Warning</span>: <span class="title">Option</span> `<span class="title">hyperindex</span>&#x27; <span class="title">has</span> <span class="title">already</span> <span class="title">been</span> <span class="title">used</span>,</span></span><br><span class="line"><span class="class">(<span class="title">hyperref</span>)                <span class="title">setting</span> <span class="title">the</span> <span class="title">option</span> <span class="title">has</span> <span class="title">no</span> <span class="title">effect</span> <span class="title">on</span> <span class="title">input</span> <span class="title">line</span> 504.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">hyperref</span> <span class="title">Warning</span>: <span class="title">Option</span> `<span class="title">bookmarks</span>&#x27; <span class="title">has</span> <span class="title">already</span> <span class="title">been</span> <span class="title">used</span>,</span></span><br><span class="line"><span class="class">(<span class="title">hyperref</span>)                <span class="title">setting</span> <span class="title">the</span> <span class="title">option</span> <span class="title">has</span> <span class="title">no</span> <span class="title">effect</span> <span class="title">on</span> <span class="title">input</span> <span class="title">line</span> 504.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">bookmark</span>/<span class="title">bookmark</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">bookmark</span>/<span class="title">bkm</span>-<span class="title">dvipdfm</span>.<span class="title">def</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">ctex</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">ctexhook</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">ctexpatch</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">fix</span>-<span class="title">cm</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">ts1enc</span>.<span class="title">def</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">config</span>/<span class="title">ctexopts</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">engine</span>/<span class="title">ctex</span>-<span class="title">engine</span>-<span class="title">xetex</span>.<span class="title">def</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">xelatex</span>/<span class="title">xecjk</span>/<span class="title">xeCJK</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">l3packages</span>/<span class="title">xtemplate</span>/<span class="title">xtemplate</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">fontspec</span>/<span class="title">fontspec</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">fontspec</span>/<span class="title">fontspec</span>-<span class="title">xetex</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">fontenc</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">fontspec</span>/<span class="title">fontspec</span>.<span class="title">cfg</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">xelatex</span>/<span class="title">xecjk</span>/<span class="title">xeCJK</span>.<span class="title">cfg</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">zhnumber</span>/<span class="title">zhnumber</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">zhnumber</span>/<span class="title">zhnumber</span>-<span class="title">utf8</span>.<span class="title">cfg</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">scheme</span>/<span class="title">ctex</span>-<span class="title">scheme</span>-<span class="title">chinese</span>.<span class="title">def</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">config</span>/<span class="title">ctex</span>-<span class="title">name</span>-<span class="title">utf8</span>.<span class="title">cfg</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">tools</span>/<span class="title">indentfirst</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">fontset</span>/<span class="title">ctex</span>-<span class="title">fontset</span>-<span class="title">windows</span>.<span class="title">def</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">ctex</span>/<span class="title">config</span>/<span class="title">ctex</span>.<span class="title">cfg</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">esint</span>/<span class="title">esint</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">euler</span>/<span class="title">euler</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class"><span class="title">Package</span>: `<span class="title">euler</span>&#x27; <span class="title">v2</span>.5 &lt;1995/03/05&gt; (<span class="title">FJ</span> <span class="title">and</span> <span class="title">FMi</span>)</span></span><br><span class="line"><span class="class">) (<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">newpx</span>/<span class="title">newpxtext</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">`<span class="title">newpxtext</span>&#x27; <span class="title">v1</span>.504, 2022/01/30 <span class="title">Text</span> <span class="title">macros</span> <span class="title">taking</span> <span class="title">advantage</span> <span class="title">of</span> <span class="title">TeXGyre</span> <span class="title">Pagella</span></span></span><br><span class="line"><span class="class"><span class="title">and</span> <span class="title">its</span> <span class="title">extensions</span> (<span class="title">msharpe</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">fontenc</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">lm</span>/<span class="title">t1lmr</span>.<span class="title">fd</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">iftex</span>/<span class="title">ifxetex</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">iftex</span>/<span class="title">ifluatex</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">xkeyval</span>/<span class="title">xkeyval</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">xkeyval</span>/<span class="title">xkeyval</span>.<span class="title">tex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">xkeyval</span>/<span class="title">xkvutils</span>.<span class="title">tex</span>)))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">base</span>/<span class="title">textcomp</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">xstring</span>/<span class="title">xstring</span>.<span class="title">sty</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">generic</span>/<span class="title">xstring</span>/<span class="title">xstring</span>.<span class="title">tex</span>))</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">carlisle</span>/<span class="title">scalefnt</span>.<span class="title">sty</span>)</span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">realscripts</span>/<span class="title">realscripts</span>.<span class="title">sty</span>))</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">Package</span> <span class="title">biblatex</span> <span class="title">Warning</span>: &#x27;<span class="title">babel</span>/<span class="title">polyglossia</span>&#x27; <span class="title">detected</span> <span class="title">but</span> &#x27;<span class="title">csquotes</span>&#x27; <span class="title">missing</span>.</span></span><br><span class="line"><span class="class">(<span class="title">biblatex</span>)                <span class="title">Loading</span> &#x27;<span class="title">csquotes</span>&#x27; <span class="title">recommended</span>.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">newpx</span>/<span class="title">TeXGyrePagellaX</span>.<span class="title">fontspec</span>)</span></span><br><span class="line"><span class="class">(./<span class="title">main</span>.<span class="title">aux</span> (./<span class="title">sub_chapter</span>/01-<span class="title">basic_block</span>.<span class="title">aux</span>)</span></span><br><span class="line"><span class="class">(./<span class="title">sub_chapter</span>/02-<span class="title">advance_block</span>.<span class="title">aux</span>) (./<span class="title">sub_chapter</span>/03-<span class="title">database</span>.<span class="title">aux</span>)</span></span><br><span class="line"><span class="class">(./<span class="title">sub_chapter</span>/04-<span class="title">multi_media</span>.<span class="title">aux</span>) (./<span class="title">sub_chapter</span>/05-<span class="title">insert_block</span>.<span class="title">aux</span>)</span></span><br><span class="line"><span class="class">(./<span class="title">sub_chapter</span>/06-<span class="title">rich_text</span>.<span class="title">aux</span>) (./<span class="title">sub_chapter</span>/07-<span class="title">database_op</span>.<span class="title">aux</span>)</span></span><br><span class="line"><span class="class">(./<span class="title">sub_chapter</span>/08-<span class="title">database_formula</span>.<span class="title">aux</span>))</span></span><br><span class="line"><span class="class">*<span class="title">geometry</span>* <span class="title">driver</span>: <span class="title">auto</span>-<span class="title">detecting</span></span></span><br><span class="line"><span class="class">*<span class="title">geometry</span>* <span class="title">detected</span> <span class="title">driver</span>: <span class="title">xetex</span></span></span><br><span class="line"><span class="class">(<span class="title">e</span>:/<span class="title">texlive</span>/2022/<span class="title">texmf</span>-<span class="title">dist</span>/<span class="title">tex</span>/<span class="title">latex</span>/<span class="title">biblatex</span>/<span class="title">lbx</span>/<span class="title">english</span>.<span class="title">lbx</span>)</span></span><br><span class="line"><span class="class"><span class="title">No</span> <span class="title">file</span> <span class="title">main</span>.<span class="title">bbl</span>.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class">! <span class="title">Package</span> <span class="title">fontspec</span> <span class="title">Error</span>: <span class="title">The</span> <span class="title">font</span> &quot;<span class="title">Microsoft</span> <span class="title">YaHei</span>&quot; <span class="title">cannot</span> <span class="title">be</span> <span class="title">found</span>.</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">For</span> <span class="title">immediate</span> <span class="title">help</span> <span class="title">type</span> <span class="title">H</span> &lt;<span class="title">return</span>&gt;.</span></span><br><span class="line"><span class="class"> ...</span></span><br><span class="line"><span class="class"></span></span><br><span class="line"><span class="class"><span class="title">l</span>.79 ...<span class="title">sep</span>=1<span class="title">cm</span>]</span>&#123;\Huge\centering\bfseries\sffamily</span><br><span class="line">                                                  \parbox[<span class="type">c</span>][][<span class="type">t</span>]&#123;\paperwidt...</span><br><span class="line"></span><br><span class="line">?</span><br></pre></td></tr></table></figure>]]></content>
    
    
    <summary type="html">&lt;p&gt;latex编译时，出现报错&lt;code&gt;! Package fontspec Error: The font &amp;quot;Microsoft YaHei&amp;quot; cannot be found.&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;排查问题记录与问题的思考。&lt;/p&gt;</summary>
    
    
    
    <category term="Bugsfix" scheme="https://www.delta1037.cn/categories/Bugsfix/"/>
    
    
    <category term="Bug" scheme="https://www.delta1037.cn/tags/Bug/"/>
    
    <category term="Latex" scheme="https://www.delta1037.cn/tags/Latex/"/>
    
  </entry>
  
  <entry>
    <title>应用程序设计</title>
    <link href="https://www.delta1037.cn/2022/Project/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    <id>https://www.delta1037.cn/2022/Project/%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/</id>
    <published>2022-03-04T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:54.778Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><font color="#D44C47">三年工作经验之成果，简要概述了应用程序的设计过程~<br>以下没有参考任何文档，纯属瞎编！</font></p></blockquote><span id="more"></span><h2 id="一、模块"><a href="#一、模块" class="headerlink" title="一、模块"></a>一、模块</h2><p>划分模块是为了让大型应用程序的结构更加清晰，在对程序进行重构或者修改模块的功能时更加方便。模块一般需要根据功能类型区分，一般功能包括以下几种：</p><ul><li>日志记录：用于程序运行过程的打点记录，在程序运行出错时能够定位到出错位置和相关必要数据<ul><li>DEBUG日志：调试时使用，包括详细的调试信息，程序出错时辅助调试</li><li>INFO日志：记录程序运行记录，打卡记录</li><li>ERROR日志：记录程序出错记录</li></ul></li><li>数据记录：程序相关的大量数据条目记录，一般与数据库接壤</li><li>配置记录：程序配置相关，配置参数则使用文本文件记录（JSON格式、YAML格式等）</li><li>会话控制：网络连接模块，用于控制两个程序之间的通信<ul><li>会话协议：两个程序的会话需要制定明确的会话协议</li></ul></li><li>任务控制：多线程程序<ul><li>任务启动、停止、回收控制</li><li>卡死线程处理</li></ul></li><li>缓存控制：缓存文件数据或者网络数据（辅助快速加载）</li></ul><h3 id="1-1-日志记录"><a href="#1-1-日志记录" class="headerlink" title="1.1 日志记录"></a>1.1 日志记录</h3><p>对于一个日志记录模块，最主要的功能就是提供日志记录功能。其它功能如下：</p><ul><li>日志的输出等级：可以选择日志输出的最低等级（低于此等级的日志不输出）</li><li>日志输出位置：可以输出到终端、保存到文件。<ul><li>日志保存到文件时，对于不同模块的日志可以选择保存到到不同的文件；当文件过大时，将日志内容归档管理。</li></ul></li></ul><h3 id="1-2-数据记录"><a href="#1-2-数据记录" class="headerlink" title="1.2 数据记录"></a>1.2 数据记录</h3><p>在对接到应用程序的上层部分，一般需要根据程序的具体需求定制（比如存储什么数据，许需要哪些数据操作接口（增删查改之类的））。在数据记录的底层部分，可以支持多种数据库类型，方便数据库的切换，或者使用不同的数据库完成不同的需求（瞎猜的，实际没有遇到过）。</p><p>该模块可以设计为细腰型结构，包括上层对接具体需求，中层管理，底层聚合多种数据库类型。这种结构一方面是便于新增新的功能或者支持新的数据库；另一方面是方便移植到另一个应用程序上（只需要替换上层部分即可）。细腰型结构示例：</p><pre class="mermaid">graph TD    A(数据需求1) --> B(管理)    C(数据需求2) --> B(管理)    B(管理) --> D[Mysql]    B(管理) --> E[SQLITE]</pre><h3 id="1-3-配置记录"><a href="#1-3-配置记录" class="headerlink" title="1.3 配置记录"></a>1.3 配置记录</h3><p>配置模块和日志模块一样，都是应用程序的基础。配置用来初始化一些应用程序的参数，如果把这些参数写入到程序内部，那么在需要调整参数的时候就会很麻烦（重新编译程序），所以需要与应用程序隔离的文件来存储一些在程序启动时可能会发生改变的内容。</p><p>配置模块需要对应用程序提供的基本功能是根据key来获取对应的值，即获取某个参数的值；配置模块也可以添加一些高级功能，例如向配置文件写入一个参数的值；当程序运行时，如果监测到配置发生改变时，对程序中对应的参数重新初始化。</p><p>配置的存储需要与应用程序的语言相适应。C&#x2F;C++一般使用一行即为一个参数配置（使用“：”或者“&#x3D;”隔离参数的key和value）；Python可以很方便的使用json库，所以可以使用JSON文件作为配置文件。</p><h3 id="1-4-会话控制"><a href="#1-4-会话控制" class="headerlink" title="1.4 会话控制"></a>1.4 会话控制</h3><p>会话控制模块一般用于本地或者网络上的两个进程间的通信。通信则一般分为同步和异步方式，同步通信方式就是进程A向进程B索要数据，A等着B完成，然后拿到数据；异步方式是进程A向进程B索要数据，确定B收到索要数据之后A立即返回，B开始准备数据，当B数据准备好之后将数据发送给A，A拿到数据。</p><p>会话控制模块一般分为两层，上层是会话协议层，下层是网络传输层，会话协议层主要定义两个程序之间的通信协议（A：你今天吃什么？B：我吃番茄炒鸡蛋），网络传输部分主要是定义信息传输的方式（怎么把”你今天吃什么？“这句话发出去），一般有Socket（TCP&#x2F;UDP）、HTTP等。</p><pre class="mermaid">graph TD    subgraph 从    E(从:会话协议) <--> C(从:网络传输)    end    subgraph 主    A(主:会话协议) <--> B(主:网络传输)    end</pre><h3 id="1-5-任务控制"><a href="#1-5-任务控制" class="headerlink" title="1.5 任务控制"></a>1.5 任务控制</h3><p>一般的多任务程序中都需要任务管理，多任务即为多线程任务，多线程任务包括临时任务、持久化任务等等。任务控制模块可以提供任务控制功能，基本的包括启动任务和终止任务，更复杂点的包括任务的活性监测（监测线程是否卡住）。</p><p>多任务模块需要考虑的点有：</p><ul><li>基本功能：<ul><li>启动任务：开启一个新的线程，此时需要数据传入和函数传入（不同的类型其处理函数也不一样，处理函数也需要不同的数据，需要考虑的是怎么把开启新线程的接口统一：封装统一的数据结构相对来说是一种扩展性很强的方案）</li><li>终止任务：当任务没有分离时，使用的计算机语言一般会提供回收的方式</li></ul></li><li>活性监测：任务开启时注册一个定时器，当定时器结束时说明任务还没有退出（如果进程提前退出则说明该任务实例已经被销毁（注意销毁任务实例的定时器处理））</li></ul><h3 id="1-6-缓存控制"><a href="#1-6-缓存控制" class="headerlink" title="1.6 缓存控制"></a>1.6 缓存控制</h3><p>缓存控制的目的是存储一些临时性的数据，用来保存数据或者加速访问某些内容。一般应用是可以缓存其它模块的数据内容（比如会话控制的会话数据和任务控制的任务数据）或者需要加速访问的内容（从文件中读取的一些内容、从网络上获取到的内容，这些内容如果重新获取对于一个对运行时间有要求的程序来说时间成本过大。但是要注意，这些内容短期内不会发生变化，如果这些内容每次获取都不一样，那么或许重新获取是无法避免的）</p><p>缓存控制的设计比较灵活，一般需要根据实际的应用程序设计（具体问题具体分析）。对于一些常规性的存储内容（其它模块需要存储的数据）则可以统一实现，减少重复造轮子的可能性。</p><h2 id="二、逻辑"><a href="#二、逻辑" class="headerlink" title="二、逻辑"></a>二、逻辑</h2><h3 id="2-1-必要逻辑"><a href="#2-1-必要逻辑" class="headerlink" title="2.1 必要逻辑"></a>2.1 必要逻辑</h3><p>计算机语言都会（所有的）包含一些<strong>必要的逻辑</strong>，包括：</p><ul><li>数据操作：保存数据、打印数据</li><li>顺序执行：逐条执行代码</li><li>循环处理：循环执行某段代码</li><li>条件处理：根据条件判断是否执行某段代码</li><li>函数封装：将某一个小功能封装成函数</li></ul><h3 id="2-2-类的概念"><a href="#2-2-类的概念" class="headerlink" title="2.2 类的概念"></a>2.2 类的概念</h3><p><font color="#D44C47">继承和多态（待补充）</font></p><p>对于含有<strong>类概念</strong>的计算机语言（C++、Python）：</p><p>类的概念比函数封装更进一步。函数封装只会封装单个的功能；类则封装了数据和多个功能，即包含了数据和处理数据的方法。类的一个实例通常称为对象（类可以描述为实例的蓝图，设计图），对象的出现使得类区别于数据和方法的集合。每一个类的对象都有自己的数据空间，使得不同的对象互相隔离。</p><p>模块的出现使得同类型的操作得以聚合。例如一个SQLITE数据库操作类，其中数据区域可以包括数据库的位置信息；操作方法包括增删查改等常用方法的集合。</p><p>将操作方法聚合成类和聚合成文件（无类）的区别。将操作方法封装成类时，数据定义保存在类中，方法定义保存在类中，当我们操作不同位置的数据库时，可以实例化多个对象，这些对象的区别仅有其中的数据区域（数据库的位置）；将操作方法汇聚成文件时，当我们操作不同位置的数据库时，可以定义空间来存储不同的数据库位置，当调用某一个数据库方法时，需要传入一些必要的内容（例如数据库的位置或者数据库操作句柄）等。</p><p>使用类的优势：类将数据定义和方法定义封装到一起，第一是类的进一步封装使得代码边界更加清晰，数据定义易于管理；第二是减少了不必要的外部数据的传入（类初始化时传入并在数据区域统一管理）。</p><h3 id="2-3-模块的概念"><a href="#2-3-模块的概念" class="headerlink" title="2.3 模块的概念"></a>2.3 模块的概念</h3><p>对于含有<strong>模块概念</strong>的计算机语言：</p><p>模块的概念比类的概念更宽泛，类是一种类型（奔驰）的方法的封装，模块可以认为是一类对象（奔驰、奥迪）的封装，实际上模块的分类包括日志记录模块，数据记录模块（里面可能包含了Mysql数据库操作对象和SQLITE数据库操作对象等多种类封装）。</p><p>模块的优势：模块将同一属性的内容封装（放）到一起，第一是方便不同模块的管理，方便模块替换（只要对外的API是不改变的，那么模块很容易被替换或者修改内部功能），便于代码的维护（在修改某一部分的功能时，直接到对应的模块修改）；</p><h2 id="三、细节"><a href="#三、细节" class="headerlink" title="三、细节"></a>三、细节</h2><p>计算机语言只是实现目的的一种工具，不同的语言在对模块的实现上有不同的优势，在选用语言来完成某一功能时，需要考虑如下内容：</p><ul><li>功能复杂性：<ul><li>是否需要拆分成不同模块，模块之间的耦合</li></ul></li><li>运行的平台：<ul><li>运行环境的配置</li></ul></li><li>运行速度要求：编译语言和脚本语言</li><li>时间控制精度要求：我之前用Shell写一个程序时，程序的时间很难控制（定时运行）</li><li>底层模块依赖：是否有精力进行从砖头开始垒房子，或者快速从墙片开始垒房子（一样结实的）</li></ul><table><thead><tr><th>语言</th><th>优势</th><th>弱势</th><th>平台</th><th>分类</th></tr></thead><tbody><tr><td>C</td><td>1、快</td><td>1、数据管理<br>2、打地基</td><td>1、编译运行</td><td>高级</td></tr><tr><td>C++</td><td>1、快</td><td>1、打地基</td><td>1、编译运行</td><td>高级</td></tr><tr><td>Python</td><td>1、库多</td><td>1、较慢（边解释边运行）</td><td>1、打包运行<br>2、解释器运行</td><td>脚本</td></tr><tr><td>Shell</td><td>1、无需编译</td><td>1、数据管理<br>2、复杂处理</td><td>1、解释器运行（Linux）</td><td>脚本</td></tr></tbody></table><h2 id="四、语言组合"><a href="#四、语言组合" class="headerlink" title="四、语言组合"></a>四、语言组合</h2><p>不同的语言是可以互通的，这样可以解决某一个语言的缺陷。例如Python调用C实现的动态库（以解决Python运行慢的问题）（实例：Numpy底层使用C语言编写，内部解除了GIL（全局解释器锁），其对数组的操作速度不受Python解释器的限制，效率远高于纯Python代码）。</p><p>其它代码互相调用的例子不再赘述。</p><h2 id="五、程序设计"><a href="#五、程序设计" class="headerlink" title="五、程序设计"></a>五、程序设计</h2><p>在需求定义完成之后，就可以开始着手程序的架构设计，架构是语言无关的，最终无论用什么语言去实现这个程序都可以，只是存在难易度和细节的调整问题。难易度和细节指的是一个语言是否具有良好的生态（有没有现成的稳健的依赖包，或者自己有没有积攒一些常用的代码段等），另外就是程序在与外部对接的过程，有没有封装良好的接口。</p><p>程序架构的设计是基于需求的目标的，是一个有目的的设计。为了完成最终的目标，我们需要让各个模块按照我们目标运作起来。动起来是最基本的，我们还需要考虑之后的维护过程，怎么让代码更好的去维护，另外还有考虑代码的复用性，这些代码能不能封装起来在之后的项目中使用。</p><p>软件工程中有一个名为“高内聚、低耦合”的概念，我们在写代码之前就需要考试考虑好这个问题，低耦合是为了让基本不相关的内容分离设计，高内聚是让一个模块恰好做一件事。在低耦合方面，如果日志模块和缓存模块纠缠在一起，再加一个数据库模块的话难道要再重写一个日志模块？再高内聚方面，一个日志模块不需要分散开写成多个部分，日志模块就是提供一个稳定的标准的日志接口，里面怎么实现是不需要调用者关注的。本人觉得做好“高内聚、低耦合”就能得到一份好维护，复用性强的代码。</p><p>做好程序架构的设计之后，就可以开始做语言的选型，从划分的各个模块入手开始做代码的编写。在做语言的选型问题的时候，要考虑与外部对接的难易度，例如与数据库的对接，与外部接口的对接等等，有的语言例如python对这些有很好的支持，但是C++就需要仔细考虑怎么对接的问题。</p>]]></content>
    
    
    <summary type="html">&lt;blockquote&gt;
&lt;p&gt;&lt;font color=&quot;#D44C47&quot;&gt;三年工作经验之成果，简要概述了应用程序的设计过程~&lt;br&gt;以下没有参考任何文档，纯属瞎编！&lt;/font&gt;&lt;/p&gt;
&lt;/blockquote&gt;</summary>
    
    
    
    <category term="工程" scheme="https://www.delta1037.cn/categories/%E5%B7%A5%E7%A8%8B/"/>
    
    
    <category term="程序设计" scheme="https://www.delta1037.cn/tags/%E7%A8%8B%E5%BA%8F%E8%AE%BE%E8%AE%A1/"/>
    
    <category term="系统" scheme="https://www.delta1037.cn/tags/%E7%B3%BB%E7%BB%9F/"/>
    
  </entry>
  
  <entry>
    <title>考研感想</title>
    <link href="https://www.delta1037.cn/2021/Times/%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3/"/>
    <id>https://www.delta1037.cn/2021/Times/%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3/</id>
    <published>2021-12-27T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:54.908Z</updated>
    
    <content type="html"><![CDATA[<p>22刚考完，趁着脑子清醒做一下总结</p><span id="more"></span><h2 id="一、考试与估分"><a href="#一、考试与估分" class="headerlink" title="一、考试与估分"></a><strong>一、考试与估分</strong></h2><p>本来准备等佛系出分的，早上看到有人发了专业课的答案，没忍住对了一下，然后就全对了一下答案。下边分享一下做题心理路程：</p><ul><li>专业课：130。写上的差不多都对了，大题有两个小问没有写出来，还有一个小问忘记把参数代入计算了，只写了表达式。专业课是华科的824，一共有28个题吧，20个选择填空，写完发现只用了一个小时，五个只有一两问的题，大概用了一个小时（写完选择才用了一个小时啊啊啊，再抬头感觉时间就不够了，有的太难算的直接放弃了），开始最后三道大题剩一个小时，一道二十分钟，奈何慌的一批，疯狂赶进度，最后剩十分钟，没写的就不管了，检查了一遍，封口完事！</li><li>数学：120。选择填空错了两个，有个选择记不清了，大题有个题没写出来，列了个公式，还有个大题的最后计算错了，但是步骤都是对的，其它的好像还行。选择填空一共用了一个小时左右，剩下的全在搞大题了（真是太难算了，刚拿到卷子心里乐开了花，心想这么简单，写着写着就哭了），写完选择填空把答题卡就画了轻轻的一下，想着大题写完再回来检查的（选择太多不确定的了），结果大题写的入迷了，最后十五分钟发现答题卡还没涂，人差点被吓傻了赶紧涂一下（所以最后十分钟就不要继续看题了，把卷子看一下，看看有没有什么需要补充的！）</li><li>英语：50。我英语不好，没什么好说的，完型错了一半，阅读+七选五应该错了一个还是两个，翻译能给一分就行，作文加起来给十分就行（写的邀请信狗都不来，大作文套的模板）</li><li>政治：50。政治也没啥好说的，我没有背诵的天赋，单选是错了两个左右，多选应该有四五个，所以选择大概能拿四十分，大题都写满了，希望赏给我十分。</li></ul><p>综述：保350冲380。</p><h2 id="二、考研感想"><a href="#二、考研感想" class="headerlink" title="二、考研感想"></a><strong>二、考研感想</strong></h2><ul><li>预谋：三四月份的时候就忽然觉得工作没啥意思，趁着年轻应该多学习。咨询了很多老师，和已经上了研究生的同学，以及一些工作的同学，相互交流了很多意见，工作有工作的好处，读研有读研的好处，各有各的难处，各方权衡下我觉得我想去试一试，因为我没考过研，总觉得差点什么。（之前有一个保研的机会我没有珍惜，这也没什么好后悔的，当时觉得工作很香，工作了一年才了解了工作这件事，工作中也收获了挺多，不算亏！）</li><li>辞职：主管来劝我，大概说我是应届生里比较强的（Dian团队出来的哪一个不强，就属我菜了），工作三年也可以拿到一个不亚于研究生的薪资水平，大概是我已经拿了一年的工资有点飘了，好说歹说最后还是辞职了（现在想想确实有点冲动，但是考完研后无论最后有没有考上我都有了更大的收获）。</li><li>开始：刚辞职的几天，那个浪啊！租的房子还没到期，每天睡到自然醒，偶尔女朋友过来一起做做饭啥的（做饭是我，刷碗也是我，女朋友参与了吃的部分），买了数学的复习资料，每天看个一两眼，过的挺快活！</li><li>中期：高中的学习方式就是使劲刷题，但是大学和一群优秀的人待久了，又有了别的思路。首先是规划方面，每周我都会做周报，每个周日会安排这周的任务，然后每天完成一项就勾一项（一开始用的有道云笔记软件，后来发现了notion，哎呀妈呀真香），到了周日就对这周的东西做一下总结，看看完成情况（大部分都是完不成的，因为各种各样的原因，总而言之就是我有拖延症（此处应该@钟sir），没完成就完后拖呗，最后拖的实在太多了就削减任务，反正最后很多的题都没写，但是写过的都吃的很透，数学复习全书综合提高我认真刷了两边，最后马马虎虎又看了两遍）。然后就是笔记方面，数一的内容真的是多啊，我记笔记是因为从我二刷复习全书的时候发现前边的都忘了，这第二遍刷完再忘了咋办，果断开始记数学笔记（一刷没有记是因为我对数学还是很有信心的，后来发现忘得一干二净），后来因为发现了notion这个软件，记笔记挺方便的（其实主要是我写字太丑了，我一开始写了纸质的数学笔记，不忍直视。。。），然后开始记数学和专业课的笔记，刚开始记的时候真是太痛苦了，严重拖慢复习进度，一直咬牙坚持着，每周花费大量时间在记笔记上（最后看了一下统计一共得有十几万字了），后来复习完一轮回头看的时候，笔记还是很有用的，能够立马想起来这个地方的知识点都会出什么题（后期就不行了）。最后吧就是适当放松，不要一直紧绷着，该放松得放松。</li><li>后期：最后的一段时间我也是慌的一批，感觉啥都不会了（到考场上发现会了也没啥用）。做了最后一段时间的规划，填充的满满当当的（当然，最后大部分没搞完）。每隔一天做一套数学卷子保持手感；我这个专业课也是计算题也得保持手感；每天佛系背政治，刷刷选择题；最后几天发现英语单词忘了一些赶紧去补，每隔一天做一下阅读保持手感（最后几天了，做了20年的题，阅读+七选五错了13个，心态都崩了，还好最后英一阅读没有特别难的点，阅读做的很顺畅）。</li></ul><p>总结：无论考没考过都不会再考了，这段考研的日子确实能让人收获很多，爷青结~</p><h2 id="三、资料"><a href="#三、资料" class="headerlink" title="三、资料"></a><strong>三、资料</strong></h2><p>以下只放我写过的，没写过的不好做出评价。</p><p>数学：</p><ol><li>复习全书：看了四遍，知识比较系统，每一个知识后都有例题（我第一遍用来看基础知识点和看例题，第二遍不看答案刷了一遍例题并且标注一些难点的题，第三遍就是认真看一下重点标注的题，第四遍是快考试了，看了知识点和重点标注的题）</li><li>880：是个习题集就行，刷一遍作为巩固（微积分部分我只写了选择题，线代和概率论差不多都写了）</li><li>李艳芳的真题：这个老师出的真题讲解真是太棒了！讲解特别的详细（我是用来写完真题对答案的，我写完真题无论这道题有没有写对都会把答案看一遍，看看答案有没有什么好的思路）</li><li>历年真题全精解析：我用来巩固真题用的，看看哪一章都会出什么题（高数认真看了一遍，线代和概率论没来得及看）</li><li>一些视频：我的全部都是自学的，没看哪个老师的视频。最后的冲刺阶段在B站上看了李艳芳的高数知识梳理。</li></ol><p>专业课：</p><ol><li>刺猬哥的复习资料（真题、分类题、知识点）：整体来说挺好的，还有答疑服务（虽然我也没问几次，但是有了一个沟通题目的地方）；真题是熟悉题型用的，最重要；分类题是熟悉知识点用的；知识点那本我没咋看</li><li>信号与系统（奥本海姆）：专业课的课本，没啥好说的，我是先看了一遍课本，然后才开始写题的</li><li>黄皮书和绿皮书：专业课课本辅导资料，对课后的例题做讲解（今年好像有一个特别难的题是从绿皮书上出的，绿皮书很重要），这两本有重复的题目，对照着勾画一下，重复的题做一遍就行了</li></ol><p>英语：</p><ol><li>黄皮书：真题和讲解，没啥好说的，挺好用的</li><li>唐迟阅读的逻辑：看了一遍确实挺好用，看完之后记得做总结</li><li>语法新思维+长难句高分通关：我英语太差了，需要补语法（自知之明）</li><li>其它：买了一堆，没怎么写（新东方的资料几乎所有的都买了，除了那两本语法其它的没怎么写）</li></ol><p>政治：</p><ol><li>肖老的一套：必买，四套卷+八套卷+时政刷个心安，1000题也是必刷的（我有一门没刷完，后期转到小程序刷题了）</li><li>刷题软件：都一样的，能刷题就行了，这里因为这个刷题软件侵犯了原著的著作权就不提名字了</li></ol><h2 id="四、收尾"><a href="#四、收尾" class="headerlink" title="四、收尾"></a><strong>四、收尾</strong></h2><p>前边放了大段的文字，下边放几张图</p><ul><li>有道云笔记做的周报</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_%E6%9C%89%E9%81%93%E4%BA%91%E7%AC%94%E8%AE%B0%E5%81%9A%E7%9A%84%E5%91%A8%E6%8A%A5.png" alt="有道云笔记做的周报"></p><ul><li>notion做的周报</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_notion%E5%81%9A%E7%9A%84%E5%91%A8%E6%8A%A5.png" alt="notion做的周报"></p><ul><li>notion做的周报汇总</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_notion%E5%81%9A%E7%9A%84%E5%91%A8%E6%8A%A5%E6%B1%87%E6%80%BB.png" alt="notion做的周报汇总"></p><ul><li>有道云做的数学计划</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_%E6%9C%89%E9%81%93%E4%BA%91%E5%81%9A%E7%9A%84%E6%95%B0%E5%AD%A6%E8%AE%A1%E5%88%92.png" alt="有道云做的数学计划"></p><ul><li>notion做的数学计划</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_notion%E5%81%9A%E7%9A%84%E6%95%B0%E5%AD%A6%E8%AE%A1%E5%88%92.png" alt="notion做的数学计划"></p><ul><li>notion做的英语阅读笔记</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_notion%E5%81%9A%E7%9A%84%E8%8B%B1%E8%AF%AD%E9%98%85%E8%AF%BB%E7%AC%94%E8%AE%B0.png" alt="notion做的英语阅读笔记"></p><ul><li>notion做的数学笔记</li></ul><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Times_%E8%80%83%E7%A0%94%E6%84%9F%E6%83%B3_notion%E5%81%9A%E7%9A%84%E6%95%B0%E5%AD%A6%E7%AC%94%E8%AE%B0.png" alt="notion做的数学笔记"></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;22刚考完，趁着脑子清醒做一下总结&lt;/p&gt;</summary>
    
    
    
    <category term="时光" scheme="https://www.delta1037.cn/categories/%E6%97%B6%E5%85%89/"/>
    
    
    <category term="考研" scheme="https://www.delta1037.cn/tags/%E8%80%83%E7%A0%94/"/>
    
  </entry>
  
  <entry>
    <title>Typora图床配置</title>
    <link href="https://www.delta1037.cn/2021/Deploy/Typora%E5%9B%BE%E5%BA%8A%E9%85%8D%E7%BD%AE/"/>
    <id>https://www.delta1037.cn/2021/Deploy/Typora%E5%9B%BE%E5%BA%8A%E9%85%8D%E7%BD%AE/</id>
    <published>2021-06-20T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.419Z</updated>
    
    <content type="html"><![CDATA[<p>Typora图床配置</p><span id="more"></span><h2 id="一、开通阿里云对象存储"><a href="#一、开通阿里云对象存储" class="headerlink" title="一、开通阿里云对象存储"></a><strong>一、开通阿里云对象存储</strong></h2><p>阿里云对象存储<a href="https://www.aliyun.com/product/oss">页面</a></p><p>之后购买资源包和新建bucket即可，我所使用的是本地冗余的低频访问存储，因为这个便宜一些，主要是因为我的博客图片量比较少，访问频率不大。</p><p>具体阿里云方面的配置参考<a href="https://blog.csdn.net/weixin_44497705/article/details/108996963">Typora+PicGo+阿里云OSS实现图片上传功能</a></p><h2 id="二、Typora配置"><a href="#二、Typora配置" class="headerlink" title="二、Typora配置"></a><strong>二、Typora配置</strong></h2><p>如下图所示</p><p>1、在<code>图像-&gt;插入图片时</code>可以选择在插入图片时先将图片拷贝到某一个位置，然后可以根据需要对其进行重命名(有关于此见暂未解决的问题1)，然后右键上传图片即可</p><p>2、在<code>图像-&gt;上传服务设定</code>可以设置上传服务，下图中选用PicGo-Core（因为上传图片使用命令行而不是后台常驻进程，减少系统资源消耗），选择完毕之后点击<code>下载或更新</code>可以自动安装；安装完毕之后选择<code>打开配置文件</code></p><p><img src="https://delta1037.oss-cn-beijing.aliyuncs.com/notion2hexo/Deploy_Typora%E5%9B%BE%E5%BA%8A%E9%85%8D%E7%BD%AE_Typora%E5%9B%BE%E5%BA%8A%E9%85%8D%E7%BD%AE.png" alt="Typora图床配置"></p><p>3、配置文件配置如下所示</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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></pre></td><td class="code"><pre><span class="line">&#123;</span><br><span class="line">  &quot;picBed&quot;: &#123; // 图床的配置</span><br><span class="line">    &quot;uploader&quot;: &quot;aliyun&quot;, // 图床类型的选择，这里选择阿里云</span><br><span class="line">    &quot;aliyun&quot;: &#123;</span><br><span class="line">      &quot;accessKeyId&quot;: &quot;xxxxxxxxxx&quot;,  // 图床的访问ID</span><br><span class="line">      &quot;accessKeySecret&quot;: &quot;xxxxxxxxxx&quot;, // 图床的访问密钥，具体设置参考 一、开通阿里云对象存储</span><br><span class="line">      &quot;bucket&quot;: &quot;bucket_name&quot;,  // bucket名字</span><br><span class="line">      &quot;area&quot;: &quot;oss-cn-beijing&quot;, // bucket地区</span><br><span class="line">      &quot;path&quot;: &quot;hexo-blog/&quot;, // bucket内部文件夹</span><br><span class="line">      &quot;customUrl&quot;: &quot;delta1037.oss-cn-beijing.aliyuncs.com&quot;, // 外网访问bucket域名</span><br><span class="line">      &quot;options&quot;: &quot;&quot;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;,</span><br><span class="line">  // PicGo插件相关配置，后续介绍</span><br><span class="line">  &quot;picgoPlugins&quot;: &#123;</span><br><span class="line">    &quot;picgo-plugin-rename-file&quot;: true</span><br><span class="line">  &#125;,</span><br><span class="line">  &quot;picgo-plugin-rename-file&quot;: &#123;</span><br><span class="line">    &quot;format&quot;: &quot;&#123;localFolder:1&#125;-&#123;origin&#125;&quot;</span><br><span class="line">  &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="三、PicGo相关插件"><a href="#三、PicGo相关插件" class="headerlink" title="三、PicGo相关插件"></a><strong>三、PicGo相关插件</strong></h2><p>插件的安装需要系统中安装<a href="https://nodejs.org/en/">nodejs</a>；以下安装插件命令的执行在PicGo的配置文件夹中(例如C:\Users\delta1037.picgo，在此文件中打开Powershell窗口即可)</p><h3 id="3-1-picgo-plugin-rename-file"><a href="#3-1-picgo-plugin-rename-file" class="headerlink" title="3.1 picgo-plugin-rename-file"></a><strong>3.1 picgo-plugin-rename-file</strong></h3><p>shell或者Powershell中执行安装命令</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">npm i picgo-plugin-rename-file</span><br></pre></td></tr></table></figure><p>相应的配置解释如下</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">// PicGo插件相关配置</span><br><span class="line">&quot;picgoPlugins&quot;: &#123;</span><br><span class="line">    &quot;picgo-plugin-rename-file&quot;: true // 控制插件的打开与关闭</span><br><span class="line">&#125;,</span><br><span class="line">&quot;picgo-plugin-rename-file&quot;: &#123;</span><br><span class="line">    &quot;format&quot;: &quot;&#123;localFolder:1&#125;-&#123;origin&#125;&quot; // 上传图片时图片的重命名格式</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>具体的重命名格式参照<a href="https://github.com/liuwave/picgo-plugin-rename-file">github项目主页</a></p><h2 id="暂未解决的问题"><a href="#暂未解决的问题" class="headerlink" title="暂未解决的问题"></a><strong>暂未解决的问题</strong></h2><ul><li>1、拷贝到Typora的图片不可以右键重命名（需要先粘贴图片，打开图片位置，重命名，修改Typora中对应的名字步骤，及其繁琐，等待后续Typora更新），相应的<a href="https://github.com/typora/typora-issues/issues/2242">issue</a></li><li>2、阿里云设置防盗链之后，Typora上传图片之后无法正常显示</li></ul>]]></content>
    
    
    <summary type="html">&lt;p&gt;Typora图床配置&lt;/p&gt;</summary>
    
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/categories/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    
    <category term="博客搭建" scheme="https://www.delta1037.cn/tags/%E5%8D%9A%E5%AE%A2%E6%90%AD%E5%BB%BA/"/>
    
    <category term="Typora" scheme="https://www.delta1037.cn/tags/Typora/"/>
    
  </entry>
  
  <entry>
    <title>租房指南</title>
    <link href="https://www.delta1037.cn/2021/Life/%E7%A7%9F%E6%88%BF%E6%8C%87%E5%8D%97/"/>
    <id>https://www.delta1037.cn/2021/Life/%E7%A7%9F%E6%88%BF%E6%8C%87%E5%8D%97/</id>
    <published>2021-05-24T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.438Z</updated>
    
    <content type="html"><![CDATA[<p>租房指南。关于费用、房东&amp;中介、怎么找房东~</p><span id="more"></span><h2 id="一、费用问题"><a href="#一、费用问题" class="headerlink" title="一、费用问题"></a><strong>一、费用问题</strong></h2><ul><li>付款方式：押一付一、押一付三；交租方式，保留交租凭证</li><li>需要另付的费用由哪些：电费（商业用电和民用电：商业用电贵一些，可能由民用电的两倍）、水费、物业费、网费，家电维修费（对维修费用的出具人做出约定）</li><li>克扣押金：合同可以注明租期满后指定工作日内，在房屋或者其设施不存在人为损毁的情况下，应退还全部押金</li></ul><h2 id="二、房东-amp-中介"><a href="#二、房东-amp-中介" class="headerlink" title="二、房东&amp;中介"></a><strong>二、房东&amp;中介</strong></h2><ul><li>合同可以注明租赁房屋所在的位置、间数、面积、质量、设施清单、租赁期限、租金及支付期限与方式等</li><li>审查合同主体是否合格，即出租人与承租人是否具备相应的条件。审查租赁的客体是否合格，即出租人的房屋是否为法律、法规允许出租的房屋。审查房屋租赁手续是否完备。房屋产权证明并非是合法出租的充分条件，还应按有关规定办理房屋租赁许可证，租赁合同也要进行租赁登记方可生效。</li><li>房东直租&#x2F;中介：房东直租不需要中介费；如果找中介，中介费一般是房租的一半，在签订合同时一次性缴清</li><li>公寓公司：蛋壳自如之类的、一般租金较贵，注意除了每个月的租金之外是否还需要其它费用，一般会有打扫卫生的费用（服务费）；注意是否与银行签订贷款（蛋壳）</li></ul><h2 id="三、如何找房东直租"><a href="#三、如何找房东直租" class="headerlink" title="三、如何找房东直租"></a><strong>三、如何找房东直租</strong></h2><p>现在找租房信息平台有很多，但是内容混杂很难分清是否是真实信息，例如：</p><ul><li>在某网站上找的中介，一开始说自己不是蛋壳的，后来又承认是蛋壳的，然后一开始说不需要服务费，提出录音之后又改口</li><li>看到明显很“高大上”的房子，但是租金很便宜，一般是压价来吸引客户的，但是也可以问一问</li><li>在线看照片是看不准的，一定要线下看房</li></ul><h3 id="3-1-找房东直租的方法"><a href="#3-1-找房东直租的方法" class="headerlink" title="3.1 找房东直租的方法"></a><strong>3.1 找房东直租的方法</strong></h3><ul><li><a href="https://www.douban.com/group/explore">豆瓣租房小组</a>上有很多发布的房源信息</li><li><a href="https://www.bazhuayu.com/">八爪鱼采集器</a>来爬取数据相当好用</li><li>众所周知，一个人是不可能有七八套房的（特别厉害的当我没说），根据每个用户的发布房源数量来手动做数据清洗</li><li>单个用户一直发同一套房那就大概率是房东了</li></ul><h2 id="Oh"><a href="#Oh" class="headerlink" title="Oh"></a><strong>Oh</strong></h2><p>以上整理于毕业租房的真实经历，最后找到了一个比较满意的房子，网上的照片拍的效果太差，最后才看的，线下看还行，所以一定要线下看一下</p>]]></content>
    
    
    <summary type="html">&lt;p&gt;租房指南。关于费用、房东&amp;amp;中介、怎么找房东~&lt;/p&gt;</summary>
    
    
    
    <category term="生活" scheme="https://www.delta1037.cn/categories/%E7%94%9F%E6%B4%BB/"/>
    
    
    <category term="租房" scheme="https://www.delta1037.cn/tags/%E7%A7%9F%E6%88%BF/"/>
    
    <category term="生活" scheme="https://www.delta1037.cn/tags/%E7%94%9F%E6%B4%BB/"/>
    
  </entry>
  
  <entry>
    <title>Terraria服务端搭建</title>
    <link href="https://www.delta1037.cn/2021/Game/Terraria%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.delta1037.cn/2021/Game/Terraria%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA/</id>
    <published>2021-05-19T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.433Z</updated>
    
    <content type="html"><![CDATA[<p>Terraria服务端搭建</p><span id="more"></span><h2 id="一、环境准备"><a href="#一、环境准备" class="headerlink" title="一、环境准备"></a><strong>一、环境准备</strong></h2><ul><li>Linux x86_64（CentOS 8）</li></ul><h2 id="二、搭建"><a href="#二、搭建" class="headerlink" title="二、搭建"></a><strong>二、搭建</strong></h2><h3 id="2-1-下载"><a href="#2-1-下载" class="headerlink" title="2.1 下载"></a><strong>2.1 下载</strong></h3><p><a href="https://terraria.org/">官网地址</a>最下方点击<a href="https://terraria.org/system/dedicated_servers/archives/000/000/046/original/terraria-server-1423.zip?1621172068=">PC Dedicated Server</a>（此链接版本为1423版本，当steam启动时更新时，服务端也要做相应的更新）即可下载最新版本的服务端，其中包括Linux&#x2F;Window&#x2F;Mac版本。</p><h3 id="2-2-安装"><a href="#2-2-安装" class="headerlink" title="2.2 安装"></a><strong>2.2 安装</strong></h3><p>将下载到的包上传到服务端</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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><br><span class="line">mkdir -p /opt/terraria_server</span><br><span class="line"></span><br><span class="line"># 解压文件到目录</span><br><span class="line">unzip terrraria-server-1423.zip -d /opt/terraria_server</span><br><span class="line"></span><br><span class="line"># 进入到解压后的Linux对应的目录，并给文件执行权限</span><br><span class="line">cd /opt/terraria_server/1423/Linux</span><br><span class="line">chmod +x -R ./  # 注意这里是图方便给改文件夹下所有的文件赋予了可执行权限，也可以单独给需要的文件赋予可执行权限</span><br></pre></td></tr></table></figure><h3 id="2-3-配置"><a href="#2-3-配置" class="headerlink" title="2.3 配置"></a><strong>2.3 配置</strong></h3><p>配置文件</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">## 创建在外层目录不影响更新服务端版本</span><br><span class="line">vim /opt/terraria_server/terraria_config</span><br></pre></td></tr></table></figure><p>配置内容可填写如下：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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><br><span class="line">world=/opt/terraria_server/Worlds/delta1037.wld</span><br><span class="line"># 最大连接玩家个数</span><br><span class="line">maxplayers=3</span><br><span class="line"># 连接密码</span><br><span class="line">password=******</span><br><span class="line"># 指定端口，默认是7777</span><br><span class="line">port=6666</span><br><span class="line"># 语言配置</span><br><span class="line">language=zh</span><br><span class="line"></span><br><span class="line"># 当地图不存在时创建新地图的配置</span><br><span class="line">## 地图难度</span><br><span class="line">difficulty=0</span><br><span class="line">## 地图大小 1(小), 2(中), and 3(大).</span><br><span class="line">autocreate=3</span><br><span class="line">## 地图路径和名字</span><br><span class="line">worldpath=/opt/terraria_server/Worlds</span><br><span class="line">worldname=delta1037.wld</span><br></pre></td></tr></table></figure><p>完整的配置见<a href="https://terraria.fandom.com/wiki/Server#Server_config_file">Terraria官方配置说明</a></p><h2 id="三、启动服务端"><a href="#三、启动服务端" class="headerlink" title="三、启动服务端"></a><strong>三、启动服务端</strong></h2><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">cd /opt/terraria_server/1423/Linux</span><br><span class="line"></span><br><span class="line"># 使用配置文件启动</span><br><span class="line">./TerrariaServer.bin.x86_64 -config /opt/terraria_server/terraria_config</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a><strong>参考</strong></h2><p>【0】<a href="https://www.bilibili.com/read/cv3605865/">Linux搭建泰拉瑞亚服务器</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;Terraria服务端搭建&lt;/p&gt;</summary>
    
    
    
    <category term="游戏" scheme="https://www.delta1037.cn/categories/%E6%B8%B8%E6%88%8F/"/>
    
    
    <category term="Terraria" scheme="https://www.delta1037.cn/tags/Terraria/"/>
    
    <category term="游戏" scheme="https://www.delta1037.cn/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
  <entry>
    <title>tModLoader服务端搭建</title>
    <link href="https://www.delta1037.cn/2021/Game/tModLoader%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA/"/>
    <id>https://www.delta1037.cn/2021/Game/tModLoader%E6%9C%8D%E5%8A%A1%E7%AB%AF%E6%90%AD%E5%BB%BA/</id>
    <published>2021-05-19T16:00:00.000Z</published>
    <updated>2025-09-09T14:17:55.436Z</updated>
    
    <content type="html"><![CDATA[<p>tModLoader服务端搭建。</p><p>tModLoader是Terraria的Mod版本，服务端发布在github，tModLoader服务端的运行需要Terraria的服务端的支持。</p><span id="more"></span><h2 id="一、环境准备"><a href="#一、环境准备" class="headerlink" title="一、环境准备"></a><strong>一、环境准备</strong></h2><ul><li>Linux x86_64（CentOS 8）</li></ul><h2 id="二、搭建"><a href="#二、搭建" class="headerlink" title="二、搭建"></a><strong>二、搭建</strong></h2><h3 id="2-1-下载"><a href="#2-1-下载" class="headerlink" title="2.1 下载"></a><strong>2.1 下载</strong></h3><p>在<a href="https://github.com/tModLoader/tModLoader/releases">tModLoader发布页</a>下载最新版本的发布版本，并在Terraria<a href="https://terraria.org/">官网地址</a>最下方点击<a href="https://terraria.org/system/dedicated_servers/archives/000/000/046/original/terraria-server-1423.zip?1621172068=">PC Dedicated Server</a>（此链接版本为1423版本）即可下载最新版本的Terraria服务端。获取到包：</p><ul><li>terraria-server-1423.zip ： Terraria最新安装包</li><li>tModLoader.Linux.v0.11.8.4.zip ： tModLoader最新发布的包</li></ul><h3 id="2-2-安装"><a href="#2-2-安装" class="headerlink" title="2.2 安装"></a><strong>2.2 安装</strong></h3><p>安装服务端：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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></pre></td><td class="code"><pre><span class="line"># 创建服务端安装位置，并切换到安装位置</span><br><span class="line">mkdir -p /opt/t_mod_server/server</span><br><span class="line">cd /opt/t_mod_server/server</span><br><span class="line"></span><br><span class="line"># 将Terraria的服务端的安装包拷贝到安装位置并使用unzip解压</span><br><span class="line">unzip terraria-server-1423.zip</span><br><span class="line"># 将解压的文件拷贝到当前目录中</span><br><span class="line">cp -r 1423/Linux/* ./</span><br><span class="line"></span><br><span class="line"># 将tModLoader的安装包拷贝到安装位置并使用unzip解压，这个时候tModLoader解压的文件会替换Terraria服务端文件中的部分文件</span><br><span class="line">unzip tModLoader.Linux.v0.11.8.4.zip</span><br><span class="line"></span><br><span class="line"># 给文件赋予可执行权限</span><br><span class="line">chmod +x -R ./  # 注意这里是图方便给改文件夹下所有的文件赋予了可执行权限，也可以单独给需要的文件赋予可执行权限</span><br></pre></td></tr></table></figure><h3 id="2-3-配置"><a href="#2-3-配置" class="headerlink" title="2.3 配置"></a><strong>2.3 配置</strong></h3><p>创建配置文件路径、Mod路径和地图路径</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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><br><span class="line">mkdir -p /opt/t_mod_server/config</span><br><span class="line"></span><br><span class="line"># 使用自定义Mod位置和地图位置配置</span><br><span class="line">## 创建Mod路径，Mod路径中存放mod和一个表示是否开启Mod的json文件，如果不清楚等下可以由系统创建</span><br><span class="line">mkdir -p /opt/t_mod_server/Mods</span><br><span class="line">## 创建地图路径</span><br><span class="line">mkdir -p /opt/t_mod_server/Worlds</span><br></pre></td></tr></table></figure><p>新建并编辑配置文件</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">vim /opt/t_mod_server/config/t_mod_loader_config</span><br></pre></td></tr></table></figure><p>配置文件内容如下：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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></pre></td><td class="code"><pre><span class="line"># 最大连接个数</span><br><span class="line">maxplayers=3</span><br><span class="line"># 指定端口，默认是7777</span><br><span class="line">port=6666</span><br><span class="line"># 连接密码</span><br><span class="line">password=1037forest</span><br><span class="line"></span><br><span class="line"># Mod路径和地图路径</span><br><span class="line">modpath=/opt/t_mod_server/Mods</span><br><span class="line">world=/opt/t_mod_server/Worlds/delta1037.wld</span><br><span class="line"></span><br><span class="line"># 语言</span><br><span class="line">language=zh</span><br><span class="line"></span><br><span class="line"># 创建新地图参数</span><br><span class="line">## 地图难度</span><br><span class="line">difficulty=0</span><br><span class="line">## 地图大小 1(小), 2(中), and 3(大).</span><br><span class="line">autocreate=3</span><br><span class="line">## 地图路径和名字</span><br><span class="line">worldpath=/opt/terraria_server/Worlds</span><br><span class="line">worldname=delta1037.wld</span><br></pre></td></tr></table></figure><p>完整的参数见<a href="https://github.com/tModLoader/tModLoader/wiki/Starting-a-modded-server">Starting a modded server</a>和<a href="https://terraria.fandom.com/wiki/Server#Server_config_file">Terraria官方配置说明</a></p><p>Mod路径下的内容：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">➜  Mods pwd</span><br><span class="line">/opt/t_mod_server/Mods</span><br><span class="line">➜  Mods ls</span><br><span class="line">enabled.json              MagicStorage_v0.4.3.5.tmod   Split_v0.4.0.13.tmod</span><br><span class="line">Localizer_v1.5.0.19.tmod  RecipeBrowser_v0.8.8.2.tmod  ThoriumMod_v1.6.4.1.tmod</span><br><span class="line"></span><br><span class="line"># 注：Mod路径下除了一个enabled.json文件其余全是Mod文件</span><br></pre></td></tr></table></figure><p><code>enabled.json</code>文件内容（该json文件是一个字符串列表，每一个字符串是Mod的名字，如果需要去掉某个Mod需要将对应的字符串删除，即不加载该Mod）：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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><br><span class="line">  &quot;Split&quot;,</span><br><span class="line">  &quot;RecipeBrowser&quot;,</span><br><span class="line">  &quot;MagicStorage&quot;,</span><br><span class="line">  &quot;ThoriumMod&quot;</span><br><span class="line">]</span><br></pre></td></tr></table></figure><p><strong>注意!!!：</strong></p><p>1、Mod路径和地图路径默认位置在<code>/username/.local/share/Terraria/ModLoader</code>，<code>username</code>是当前登录用户的用户名</p><p>2、<strong>当不知道</strong>**<code>enabled.json</code>**<strong>的格式是什么样的时候</strong>，将需要加载的mod放入到<code>/root/.local/share/Terraria/ModLoader/Mods</code>中，切换到tModLoader主程序文件夹<code>/opt/t_mod_server/server</code>中，不加参数直接启动主程序（启动：<code>./tModLoaderServer.bin.x86_64</code>）,显示输出类似如下：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">Terraria Server v1.3.5.3 - tModLoader v0.11.8.4</span><br><span class="line"></span><br><span class="line">1               1037forest</span><br><span class="line">2               test</span><br><span class="line">n       New World</span><br><span class="line">d &lt;number&gt;Delete World</span><br><span class="line">m               Mods Menu</span><br><span class="line">b               Mod Browser</span><br><span class="line"></span><br><span class="line">Choose World:</span><br></pre></td></tr></table></figure><p>输入<code>m</code>可以选择是否加载（enable）mod或者取消（disable）mod</p><p>界面如下：</p><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">Terraria Server v1.3.5.3 - tModLoader v0.11.8.4</span><br><span class="line"></span><br><span class="line">1               Localizer (enabled)</span><br><span class="line">2               Magic Storage (enabled)</span><br><span class="line">3               Recipe Browser (enabled)</span><br><span class="line">4               Split (enabled)</span><br><span class="line">5               Thorium Mod (enabled)</span><br><span class="line">e               Enable All</span><br><span class="line">d               Disable All</span><br><span class="line">r               Reload and return to world menu</span><br><span class="line">Type a number to switch between enabled/disabled</span><br><span class="line"></span><br><span class="line">Type a command:</span><br></pre></td></tr></table></figure><p>选择完成之后使用<code>r</code>重载并返回到上一级，这时使用<code>Ctrl + C</code>退出，即可获取到<code>/root/.local/share/Terraria/ModLoader/Mods/enable.json</code>文件，将该文件拷贝到指定的Mod路径下即可使用。</p><h2 id="2-4-启动"><a href="#2-4-启动" class="headerlink" title="2.4 启动"></a><strong>2.4 启动</strong></h2><figure class="highlight plaintext"><figcaption><span>text</span></figcaption><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">cd /opt/t_mod_server/server</span><br><span class="line"></span><br><span class="line"># 使用配置文件启动</span><br><span class="line">./tModLoaderServer.bin.x86_64 -config /opt/t_mod_server/config/t_mod_loader_config</span><br></pre></td></tr></table></figure><h2 id="参考"><a href="#参考" class="headerlink" title="参考"></a><strong>参考</strong></h2><p>【0】<a href="https://github.com/tModLoader/tModLoader/wiki/Starting-a-modded-server">Starting a modded server</a></p><p>【1】<a href="https://www.reddit.com/r/Terraria/comments/7dbkfe/how_to_create_a_tmodloadermodded_server_on_linux/">How to create a tModLoader&#x2F;Modded server on Linux</a></p>]]></content>
    
    
    <summary type="html">&lt;p&gt;tModLoader服务端搭建。&lt;/p&gt;
&lt;p&gt;tModLoader是Terraria的Mod版本，服务端发布在github，tModLoader服务端的运行需要Terraria的服务端的支持。&lt;/p&gt;</summary>
    
    
    
    <category term="游戏" scheme="https://www.delta1037.cn/categories/%E6%B8%B8%E6%88%8F/"/>
    
    
    <category term="Terraria" scheme="https://www.delta1037.cn/tags/Terraria/"/>
    
    <category term="游戏" scheme="https://www.delta1037.cn/tags/%E6%B8%B8%E6%88%8F/"/>
    
  </entry>
  
</feed>
