<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Austerity&#39;s Blog</title>
  
  <subtitle>A small site may could ignore.</subtitle>
  <link href="https://misaka10548.github.io/atom.xml" rel="self"/>
  
  <link href="https://misaka10548.github.io/"/>
  <updated>2026-05-03T11:08:20.000Z</updated>
  <id>https://misaka10548.github.io/</id>
  
  <author>
    <name>Austerity</name>
    
  </author>
  
  <generator uri="https://hexo.io/">Hexo</generator>
  
  <entry>
    <title>记一次解谜</title>
    <link href="https://misaka10548.github.io/post/2026/05/03/f6f390df/"/>
    <id>https://misaka10548.github.io/post/2026/05/03/f6f390df/</id>
    <published>2026-05-03T03:43:00.000Z</published>
    <updated>2026-05-03T11:08:20.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言">前言</h2><p>我先说一点：我本人呢，并不是1999的玩家</p><p>缘由呢就是朋友在群中发的这样的话： <blockquote><p>有没有兴趣做个深蓝整的大型解密（）涉及：ASCII码，布尔运算，LSB，befunge</p><footer><strong>翎尘玖宇</strong></footer></blockquote></p><p>在五一假期闲着也是闲着，索性就做做看看吧<br>反正我一个小白，没怎么做过解谜，应该也做不了多少….吧？<br>权当练练手了</p><div class="callout callout--simple default mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>需要明确的一点是：现在是AI（LLM）时代了，所以我这个小白，并没有什么“慢慢来”<br>直接坐上了AI这个轮椅，所以我到底在解谜做了多少，应该没有很多吧<br>倒是收获还是有的</p></div></div><p>至于解谜原题呢，这里就不再列出了，应该找得到。</p><h2 id="解谜">解谜</h2><h3 id="第一个循环异或">第一个（循环异或）</h3><p>玖宇转过来的第一个谜题的信息是：<br>060E020D0F1B09000404005C5C和<br>6861766566756E</p><p>一开始我是把它俩分开看的，即使当时考虑一个作为密钥的可能性（当时想的是aes密钥2333，不过问ds很快就被否了）</p><p>玖宇给到的提示是：</p><ol type="1"><li><strong>这部分就是ascii码和布尔运算了</strong></li><li>给个提示：循环异或（这个是稍后一点时间给的，放在一起了）</li></ol><p>ASCII<br>那么布尔运算：</p><p>ds大概给了这几种：</p><ol type="1"><li>异或 (XOR)</li><li>位掩码 (AND/OR)</li><li>逻辑方程与求解</li><li>代码混淆与逆向</li></ol><p>讲真我真有被第3、4点吓到，遇上这种题真是没办法去解<br>什么<code>Z3 求解器 (Z3 Solver)</code>，<code>恒真/恒假式插入</code>，<code>德摩根定律（De Morgan's laws）</code>，<code>等价变换混淆</code>听得我是一愣一愣的。</p><p>考虑到长度和提示，应该是：<strong>重复密钥异或（Repeating-keyXOR）</strong><br><del>一句话总结</del>简单来说就是：一个密钥从头到尾循环使用，到尾了就重新接着来</p><p>如果文字不好理解，看代码就好了：</p><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><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="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">byte</span>[] <span class="title">XorWithKey</span>(<span class="params"><span class="built_in">byte</span>[] data, <span class="built_in">byte</span>[] key</span>)</span></span><br><span class="line">{</span><br><span class="line">    <span class="built_in">byte</span>[] result = <span class="keyword">new</span> <span class="built_in">byte</span>[data.Length];</span><br><span class="line">    <span class="keyword">for</span> (<span class="built_in">int</span> i = <span class="number">0</span>; i &lt; data.Length; i++)</span><br><span class="line">        result[i] = (<span class="built_in">byte</span>)(data[i] ^ key[i % key.Length]);</span><br><span class="line">    <span class="keyword">return</span> result;</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div><p>喏，就是这样，循环使用</p><p>然后我们把密文和密钥传进去：</p><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">Encoding.ASCII.GetString(XorWithKey(<span class="keyword">new</span> Byte[] { <span class="number">0x06</span>, <span class="number">0x0E</span>, <span class="number">0x02</span>, <span class="number">0x0D</span>, <span class="number">0x0F</span>, <span class="number">0x1B</span>, <span class="number">0x09</span>, <span class="number">0x00</span>, <span class="number">0x04</span>, <span class="number">0x04</span>, <span class="number">0x00</span>, <span class="number">0x5C</span>, <span class="number">0x5C</span> }, <span class="keyword">new</span> Byte[]{<span class="number">0x68</span>, <span class="number">0x61</span>, <span class="number">0x76</span>, <span class="number">0x65</span>, <span class="number">0x66</span>, <span class="number">0x75</span>, <span class="number">0x6E</span>}));</span><br></pre></td></tr></table></figure></div><p>我们就得到了…..<code>nothing here:)</code><br>乐</p><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">BTW顺带一提</div><div class="callout__content markdown-body flex-1 min-w-0"><p>6861766566756E可以直接被ASCII解码，结果是：<code>havefun</code></p></div></div></div><h3 id="第二个lsb隐写">第二个（LSB隐写）</h3><p>第二个是一张图片，没什么字</p><p>玖宇的提示：</p><ul><li>LSB隐写</li></ul><p>随附文件<code>StegSolve.jar</code></p><h4 id="关于lsb隐写">关于LSB隐写</h4><p>LSB（最低有效位）核心原理是替换“不重要的信息”。</p><p>对与部分文件格式，有的地方的数据略有“不自然”，人眼是不太能看出来的，我们就可以往里面夹一些“私货”。</p><div class="callout callout--simple default mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>不过也有能看出来但是不是很好解读的<br>比如说那些<code>幻影坦克</code>和<code>光棱坦克</code></p></div></div><p>LSB隐写有两种形式：</p><ol type="1"><li>图像形式</li><li>字节数组形式</li></ol><p>（我自己起的名字）</p><p>图像形式比较好看见，利用软件浏览位平面，能看到隐藏的图像。<br>字节数组的话，就是利用LSB藏十六进制信息，位平面浏览不太能看出来，还要自己判断文件类型。</p><h4 id="回到解谜">回到解谜</h4><p>ds对与LSB隐写的解谜图片，推荐的是<code>StegSolve</code>和<code>zsteg</code><br>手头有StegSolve了，就用这个吧（zsteg也着实不太好安装）</p><p>最后发现<code>Red 0</code>位平面的图像不太对头，有些奇怪的连续和明显的分界上面的。<br>尝试提取文本得到这个：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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">89504e470d0a1a0a 0000000d49484452  .PNG.... ....IHDR</span><br><span class="line">000002b4000002b4 0806000000f23eae  ........ ......&gt;.</span><br><span class="line">da00000009704859 7300000b1300000b  .....pHY s.......</span><br><span class="line">1301009a9c180000 00017352474200ae  ........ ..sRGB..</span><br><span class="line">ce1ce90000000467 414d410000b18f0b  .......g AMA.....</span><br><span class="line">fc61050000000e74 455874536f667477  .a.....t EXtSoftw</span><br><span class="line">617265004669676d 619eb19663000065  are.Figm a...c..e</span><br><span class="line">8f494441547801ed dded55db4ed3c7f1  .IDATx.. ..U.N...</span><br><span class="line">cd7daef7900a800a e05f015001a40248  .}...... ._.P...H</span><br></pre></td></tr></table></figure></div><p>PNG、IHDR、sRGB是个图像的文件头<br>把这一位平面的数据保存下来，再以图像打开就能得到下一个谜题</p><h3 id="第三个befunge">第三个（Befunge）</h3><p>打开图像，我们能得到这个：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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">&gt;   &gt;"E"v"D"v</span><br><span class="line">v"F"v"T"?"E"v</span><br><span class="line">v"A"&gt;"E"v"N"v</span><br><span class="line">v"I"v"T"&lt;"I"v</span><br><span class="line">v"L"?"-"v"E"v</span><br><span class="line">v"E"v"A"?"D"v</span><br><span class="line">v"D"&gt;"-"v"A"v</span><br><span class="line">v"L"v"E"&lt;"C"v</span><br><span class="line">v"O"?"T"v"C"v</span><br><span class="line">v"G"v"E"&lt;"E"v</span><br><span class="line">v"I"?"T"v"S"v</span><br><span class="line">v"N"v" "?"S"v</span><br><span class="line">v"S"&gt;"A"v"!"v</span><br><span class="line">v&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><br><span class="line">&gt;:#,_@       </span><br></pre></td></tr></table></figure></div><p>这里很显然就是<code>Befunge</code>的领域了</p><h4 id="befunge">Befunge</h4><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">注意</div><div class="callout__content markdown-body flex-1 min-w-0"><p>这里的内容参考deepseek</p></div></div></div><p>一门由Chris Pressey在1993年创造的深奥编程语言（esoteric programminglanguage）<br>它的设计初衷不是为了实用，而是为了挑战“程序必须是线性文本流”这个固有观念。</p><p>Befunge程序运行在一个二维网格上，指令指针可以在网格中向上、下、左、右四个方向移动</p><p><a class="link" href="https://charlestaylor7.github.io/befunge-editor/">BefungeEditor<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>是我使用的一个可视化运行/编辑器</p><p>这里<em>（取Befunge-93为例）</em></p><ul><li>它的运行空间是一个 80×25 的字符网格，超出范围会回绕</li><li>它的控制流（指令指针）开始时位于左上角 (0,0)，默认向右移动</li><li>元素弹入栈中，运算在栈进行</li></ul><p>简单语法：</p><ol type="1"><li>指针控制<ul><li><code>&gt;</code> 向右移动</li><li><code>&lt;</code> 向左移动</li><li><code>^</code> 向上移动</li><li><code>v</code> 向下移动</li><li><code>?</code> 随机选择4个方向之一（遇到它就像走迷宫遇到岔路）</li><li><code>_</code> 水平条件转向：弹出栈顶值，如果值为 <strong>0</strong>则向右，否则向左</li><li><code>|</code> 垂直条件转向：弹出栈顶值，如果值为 <strong>0</strong>则向下，否则向上</li><li><code>#</code> 蹦床：跳过下一个指令格（指针会多走一格）</li></ul></li><li>数字与算术<ul><li><code>0</code> - <code>9</code> 直接将该数字压入栈顶</li><li><code>+</code> 加法：弹出 a, b，压入 b + a</li><li><code>-</code> 减法：弹出 a, b，压入 b - a</li><li><code>*</code> 乘法：弹出 a, b，压入 b * a</li><li><code>/</code> 整数除法：弹出 a, b，压入 b / a（向 0 取整）</li><li><code>%</code> 取模：弹出 a, b，压入 b % a（保持与除法一致的符号）</li></ul></li><li>比较与逻辑<ul><li><code>`</code> （反引号）大于判断：弹出 a, b，如果 <strong>b &gt;a</strong> 则压入 1，否则压入 0</li><li><code>!</code> 逻辑非：弹出 x，如果 x 为 0 则压入 1，否则压入 0</li></ul></li><li>栈操作<ul><li><code>:</code> 复制栈顶元素（常用）</li><li><code>\</code> 交换栈顶两个元素</li><li><code>$</code> 弹出并丢弃栈顶元素</li></ul></li><li>输入输出 (I/O)<ul><li><code>.</code> 弹出栈顶整数，以<strong>数字</strong>形式输出</li><li><code>,</code> 弹出栈顶整数，以<strong>ASCII 字符</strong>输出</li><li><code>&amp;</code>等待用户输入一个整数（读取直到非数字字符），压入栈</li><li><code>~</code> 等待用户输入一个字符，将其 ASCII 码压入栈</li></ul></li><li>字符串模式<ul><li><code>"</code>开启/关闭<strong>字符串模式</strong>。指针在字符串模式中时，遇到的每个字符（除<code>"</code> 外）的 ASCII值都会被直接压入栈，而不会被当作指令执行。再次遇到 <code>"</code>则退出。</li></ul></li><li>自修改与取代码<ul><li><code>g</code> （get）弹出 y, x，将程序网格中 <strong>(x,y)</strong> 位置字符的 ASCII 码压入栈</li><li><code>p</code> （put）弹出 y, x, v，将 ASCII 值为 v的字符写入程序网格的 <strong>(x, y)</strong> 位置</li></ul></li><li>流程控制<ul><li><code>@</code> 结束程序</li><li>空格 什么都不做（通常用于填充路径）</li></ul></li></ol><p>来一个简单的示例，HelloWorld：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">"!dlroW ,olleH"&gt;:#,_@</span><br></pre></td></tr></table></figure></div><p>能注意到这里的字符是倒序的，是因为栈是<code>后入先出（LIFO）</code>的原因</p><p>我们先逐字符的将<code>Hello, World!</code>压入栈，然后让控制流向右(<code>&gt;</code>)<br>我们先复制栈顶值(<code>:</code>)，因为后面的<code>,</code>和<code>_</code>都会弹出一次栈顶<br>然后来到<code>#</code>跳过输出(<code>,</code>)，进入控制语句(<code>_</code>)，弹栈<br>现在栈里面是有东西的，所以指针移动方向会被改成向左（这里是控制语句<code>_</code>的作用）<br>输出、弹栈(<code>,</code>)，<code>#</code>防止等下多次运行<code>:</code>跳过这条语句<br>遇到<code>&gt;</code>指针移动方向变成向右，重复以上步骤~<br>最后栈为空的时候<code>:</code>复制0，<code>_</code>向右到<code>@</code>，结束~</p><h4 id="回到解谜-1">回到解谜</h4><p>再这样看代码：</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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">&gt;   &gt;"E"v"D"v</span><br><span class="line">v"F"v"T"?"E"v</span><br><span class="line">v"A"&gt;"E"v"N"v</span><br><span class="line">v"I"v"T"&lt;"I"v</span><br><span class="line">v"L"?"-"v"E"v</span><br><span class="line">v"E"v"A"?"D"v</span><br><span class="line">v"D"&gt;"-"v"A"v</span><br><span class="line">v"L"v"E"&lt;"C"v</span><br><span class="line">v"O"?"T"v"C"v</span><br><span class="line">v"G"v"E"&lt;"E"v</span><br><span class="line">v"I"?"T"v"S"v</span><br><span class="line">v"N"v" "?"S"v</span><br><span class="line">v"S"&gt;"A"v"!"v</span><br><span class="line">v&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;</span><br><span class="line">&gt;:#,_@       </span><br></pre></td></tr></table></figure></div><p>就能清楚些了：<br>我们能注意到左右两侧的控制流会最后指向坐下进入输出模式<br>考虑到这是解谜，目的是提取信息<br>结合起点来看的话，应该是<code>?</code>处是要填空的控制流语句，这样使程序按照一定顺序运行，得到密文。</p><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">BTW顺带一提</div><div class="callout__content markdown-body flex-1 min-w-0"><p>其实能排除一部分选择情况，我感觉能穷举出来，复杂度也不是很高</p></div></div></div><p>然后是对应六个<code>?</code>的线索</p><p>我只解出来（正确）2、3、5、6</p><p>这里<em>按提示列举</em>，这些<em>使用的信息来自AI</em></p><ol type="1"><li>宝石结构<br>应该是和物理结构/性质有关，这个没推正确，倒是反根据输出推出来了</li><li>俄语<br><code>право</code>是“法律”与“权利”的核心词汇。<br>在法律、政治、哲学语境下，它通常对应英文的 Law（法律体系、法学）和Right（正当要求、权力）<br>很明显了吧，是<code>&gt;</code></li><li>八卦像<br>为震（☳），方向向东<br>因为图片方向向右的话，很明显会得不到信息<br>这里假设按控制流大体方向为北<br>得到<code>&lt;</code></li><li>世界历史<br>不会</li><li>计算机指令<br>借助AI（其实ds这里好像有点傻，有些地方错了）<br>可能是<code>带进位循环左移 / 右移</code>，应该是<code>带进位算术右移（RCR）</code><br>得到<code>&gt;</code></li><li>等压线<br>这个的出来挺迷的<br>我看的密集区，做切线，一个方向不行<br>所以<code>&lt;</code></li></ol><p>按上面的推断填入，运行大概可以得到：</p><div class="code-container" data-rel="Text"><figure class="iseeu highlight text"><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 TE-A-TE</span><br><span class="line">A TETE-A-TE</span><br></pre></td></tr></table></figure></div><p>基于此结合搜索，可以推断出1是<code>&lt;</code></p><p>实际上，是：<code>A tête-à-tête</code></p><h3 id="第四个a-tête-à-tête">第四个（A tête-à-tête）</h3><p>经过搜索，我们来到<a class="link" href="https://re.bluepoch.com/atete-a-tete">重返未来：1999|Atête-à-tête<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>网页的话，手痒直接打开Devtools，以递归形式展开</p><p>嚯</p><p>得到：</p><div class="code-container" data-rel="Html"><figure class="iseeu highlight html"><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="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"hide-text"</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 323 336 339 335 "BORN" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 337 326 322 324 326 "PEACE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 324 336 340 334 336 340 "COSMOS" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 329 336 337 326 "HOPE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 341 339 342 326 "TRUE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 340 337 330 339 330 341 "SPIRIT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 322 325 354 367 "FATE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 334 342 340 330 324 "MUSIC" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 333 330 328 329 341 "LIGHT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 333 326 328 326 335 325 "LEGEND" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 334 346 341 329 "MYTH" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 322 337 337 333 326 "APPLE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 339 326 333 330 324 "RELIC" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 333 336 335 325 336 335 "LONDON" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 340 330 333 326 335 341 "SILENT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 340 330 328 330 333 "SIGIL" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 344 336 339 333 325 "WORLD" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 328 322 333 322 345 346 "GALAXY" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 337 340 346 324 329 "PSYCH" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 336 322 340 330 340 "OASIS" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 328 336 333 325 "GOLD" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 341 330 334 326 "TIME" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 322 324 326 "ACE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 356 362 367 "SPY" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 328 329 336 340 341 "GHOST" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 340 341 339 326 322 334 "STREAM" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 324 322 340 341 333 326 "CASTLE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 339 336 324 332 "ROCK" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 323 326 322 341 "BEAT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 337 342 339 326 "PURE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 334 336 325 340 "MODS" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 332 335 330 328 329 341 "KNIGHT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 343 330 335 346 333 "VINYL" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 330 340 333 322 335 325 "ISLAND" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 339 322 330 335 "RAIN" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 327 333 322 334 326 "FLAME" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 360 340 373 354 "MOTH" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 339 342 335 326 "RUNE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 323 333 342 326 "BLUE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 371 323 368 371 367 "STAGE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 340 334 330 333 326 "SMILE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 323 339 330 325 328 326 "BRIDGE" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 335 330 328 329 341 "NIGHT" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span>[RX]255 250 257 343 336 330 325 "VOID" 255 240<span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">      <span class="tag">&lt;<span class="name">div</span> <span class="attr">class</span>=<span class="string">"text-112"</span>&gt;</span><span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">div</span>&gt;</span></span><br></pre></td></tr></table></figure></div><p>这是线索。</p><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">BTW顺带一提</div><div class="callout__content markdown-body flex-1 min-w-0"><p>这里实际上的正常的发现方法是鼠标移到网页右侧（Devtools也能发现在那里）</p></div></div></div><p>不过我还是手痒，点开源代码就扒到了js<br>不过考虑到js逆向应该不是设计解谜方法，所以没去使用（但是下一关没招了这样找的flag）</p><p>让我们看看，每个条目都是这样的形式：<br><code>[RX]255 250 257 &lt;数字序列&gt; "单词" 255 240</code><br>其中：</p><ul><li><code>255 250</code> → 起始标志</li><li><code>255 240</code> → 结束标志</li><li>中间的数字序列：对应单词每个字母的 ASCII 码 + 257</li></ul><p>但是第三条不是都满足的：异常单词的数字中包含 &gt;347 的值</p><ul><li>FATE 322 325 354 367 → ADan</li><li>SPY 356 362 367 → cin</li><li>MOTH 360 340 373 354 → gSta</li><li>STAGE 371 323 368 371 367 → rBorn</li></ul><p>连在一起就是：</p><div class="code-container" data-rel="Text"><figure class="iseeu highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ADancingStarBorn</span><br></pre></td></tr></table></figure></div><p>即为答案。</p><h3 id="第四个query败北">第四个（Query，败北）</h3><p>来到下一个页面：</p><p>个人认为有用的信息如下：</p><div class="code-container" data-rel="Text"><figure class="iseeu highlight text"><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">Query：Was that your goal to find her and end all this?</span><br><span class="line">PXQYVETBHRMARTWOAPBKL</span><br><span class="line">OWPZQVFGHETUHXEKSKMLYVCJEDLNW</span><br><span class="line">PQAETONDSFOF</span><br><span class="line">TXMBVHEIEPRZA</span><br><span class="line">Error Noise Detected</span><br><span class="line">Awaiting Filter Key</span><br></pre></td></tr></table></figure></div><p>找了半天没找到什么线索（应该是Noise提示的，有无效数据），我把落脚点放在Query上了<br>直接搜索不太行，我交给了deepseek</p><p>那唯一的收获是：Deepseek的网页多轮搜索是有调用上限的</p><div class="code-container" data-rel="Plaintext"><figure class="iseeu highlight plaintext"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><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"> - 也许我们搜索“your goal to find her” “1999” “timekeeper”。</span><br><span class="line"></span><br><span class="line"> - 联网搜索暂不可用</span><br><span class="line"></span><br><span class="line"> - 我已收到指令，达到了最大工具调用步骤，因此必须基于现有信息来回答用户的问题。用户的核心查询是找到英文句子 "Was that your goal to find her and end all this" 在游戏《重返未来：1999》中的来源和上下文。</span><br><span class="line"></span><br><span class="line">我查看了所有的搜索结果，但没有一个直接包含这句完整的英文台词。几个最相关的线索如下：一个结果提到了游戏角色“十四行诗”，但她的台词是“希望未来...”，并非用户所问的句子。另一个结果提到了“帕拉塞尔苏斯”和“科马拉全景监狱”，但这句台词也不是用户所问的。还有结果提到了一个名为“ASD-08d”的剧情，涉及“要找到罗蕾莱并不困难”，但这句台词也不匹配。</span><br><span class="line"></span><br><span class="line">虽然我没有找到原句的出处，但我从多个可信的游戏介绍和评测中找到了关键信息，这能够帮助解释这句问句的含义。多个来源一致指出，玩家扮演的主角“维尔汀”，代号“司辰”，其核心目标和故事动机正是“寻找自己的妈妈”以及“结束这一切”。更具体地说，多个来源都提到主角的目标是“要找到自己的妈妈”，而这场冒险的终极目标是“揭开真相，结束这个混乱的局面（暴雨）”。主角的使命与“寻找她”和“终结暴雨”紧密相连，一个来源甚至将“找到妈妈”直接称为“他的目标”和“这个游戏的核心所在”。而作为一款拯救世界、终结灾难的游戏，主角的旅程本就伴随着“结束这一切”的使命。</span><br><span class="line"></span><br><span class="line">因此，我可以确定，用户提供的这句英文台词虽然没有被直接搜到，但它所描述的情节，与游戏的官方设定、主角维尔汀的核心目标完全吻合。我接下来可以基于这些证据来构建一个完整的答案，向用户解释这句问话的背景和可能的对话双方。我将分析这句台词是某人询问主角维尔汀，而它精准地概括了主角的目标。</span><br></pre></td></tr></table></figure></div><p>最后是这样的</p><blockquote><p>根据现有搜索结果，我们无法定位到您提供的英文原句“Was that your goalto find her and end allthis”的具体出处。不过，这句台词所描述的内容与游戏的核心设定和主角目标完全吻合。</p><h3 id="台词背景解读主角的目标">🧐 台词背景解读：主角的目标</h3><p>您查询的这句话，很可能是一句对主角<strong>维尔汀</strong>（玩家扮演的角色，代号“司辰”）的提问。它精准地概括了维尔汀在游戏中的两大核心目标：</p><ul><li><p><strong>“find her” (找到她)</strong>游戏剧情中，主角维尔汀的目标是“寻找自己的妈妈”。这不仅是她踏上旅途的原动力，也被认为是整个游戏故事的核心所在。</p></li><li><p><strong>“end all this” (结束这一切)</strong>这句话指代的是终结“暴雨”。“暴雨”是降临在1999年最后一天的神秘灾难，会扰乱时间与世界。作为不受“暴雨”影响的“司辰”，维尔汀为了揭开真相、拯救同伴，必须找到办法终结这一切。</p></li></ul><p>在玩家社区中，也常将寻找母亲、终结“暴雨”概括为维尔汀的核心使命。</p><h3 id="总结">💎 总结</h3><p>总而言之，您查询的台词可以理解为：<strong>某个人物在质问主角维尔汀——她一路以来的最终目的是否就是为了找到母亲并终结这场灾难性的“暴雨”</strong>。这确实是贯穿《重返未来：1999》整个故事的关键所在。</p></blockquote><p>那还真是….意外的收获</p><p>不过这些信息也无济于事。</p><h4 id="场外方法">场外方法</h4><p>败北了之后，我还是想看看答案，那么<br>只能 看 看 j s 了</p><p>对于<code>index.js</code>我们有：</p><div class="code-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><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><br><span class="line"></span><br><span class="line">$(<span class="keyword">function</span>(<span class="params"></span>) {</span><br><span class="line">    <span class="variable language_">window</span>.<span class="property">initPuzzleConfirm</span> &amp;&amp; <span class="variable language_">window</span>.<span class="title function_">initPuzzleConfirm</span>({</span><br><span class="line">        <span class="attr">inputSelector</span>: <span class="string">"#answer"</span>,</span><br><span class="line">        <span class="attr">confirmBtnSelector</span>: <span class="string">"#btn-confirm"</span>,</span><br><span class="line">        <span class="attr">errorTipSelector</span>: <span class="string">"#error-tip"</span>,</span><br><span class="line">        <span class="attr">answerRules</span>: {</span><br><span class="line">            <span class="attr">requiredAsciiComma</span>: !<span class="number">0</span></span><br><span class="line">        },</span><br><span class="line">        <span class="attr">secretConfig</span>: {</span><br><span class="line">            <span class="string">"version"</span>: <span class="number">1</span>,</span><br><span class="line">            <span class="string">"mode"</span>: <span class="string">"single"</span>,</span><br><span class="line">            <span class="string">"pageId"</span>: <span class="string">"overview-2"</span>,</span><br><span class="line">            <span class="string">"answerKey"</span>: <span class="string">"OVERVIEW_2_A"</span>,</span><br><span class="line">            <span class="string">"template"</span>: <span class="string">"xor-bytes"</span>,</span><br><span class="line">            <span class="string">"normalize"</span>: <span class="string">"fullwidth-safe"</span>,</span><br><span class="line">            <span class="string">"salt"</span>: <span class="string">"da415519"</span>,</span><br><span class="line">            <span class="string">"params"</span>: {</span><br><span class="line">                <span class="string">"mask"</span>: [<span class="number">37</span>, <span class="number">13</span>, <span class="number">38</span>, <span class="number">32</span>],</span><br><span class="line">                <span class="string">"prefix"</span>: <span class="string">"C"</span></span><br><span class="line">            },</span><br><span class="line">            <span class="string">"target"</span>: [<span class="number">102</span>, <span class="number">94</span>, <span class="number">110</span>, <span class="number">101</span>, <span class="number">108</span>, <span class="number">94</span>, <span class="number">114</span>, <span class="number">104</span>, <span class="number">96</span>, <span class="number">72</span>, <span class="number">104</span>, <span class="number">100</span>, <span class="number">107</span>, <span class="number">66</span>, <span class="number">114</span>, <span class="number">116</span>, <span class="number">109</span>, <span class="number">72</span>, <span class="number">107</span>, <span class="number">101</span>, <span class="number">100</span>, <span class="number">67</span>, <span class="number">117</span>]</span><br><span class="line">        },</span><br><span class="line">        <span class="attr">onSuccess</span>: <span class="function">() =&gt;</span> {</span><br><span class="line">            <span class="variable language_">window</span>.<span class="property">PuzzleWindowFlow</span> &amp;&amp; <span class="variable language_">window</span>.<span class="property">PUZZLE_PAGE_META</span> &amp;&amp; <span class="variable language_">window</span>.<span class="property">PuzzleWindowFlow</span>.<span class="title function_">completeCurrentPage</span>(<span class="variable language_">window</span>.<span class="property">PUZZLE_PAGE_META</span>)</span><br><span class="line">        }</span><br><span class="line">    })</span><br><span class="line">});</span><br><span class="line">...</span><br></pre></td></tr></table></figure></div><p>显然，<code>secretConfig</code>极为重要。它告诉我们：</p><ul><li><code>"template": "xor-bytes",</code> →解谜方式应该是<strong>循环异或</strong></li><li><code>"mask": [37, 13, 38, 32],</code> → 密钥</li><li><code>"target"</code> → 密文</li></ul><p>丢给deepseek，解得：</p><div class="code-container" data-rel="Text"><figure class="iseeu highlight text"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">CSHEISTHEENDNOTTHEMEANS</span><br></pre></td></tr></table></figure></div><p>填入输入框…<br>欸不对，为什么？</p><p>注意到<code>input.js</code></p><div class="code-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"><span class="keyword">const</span> {<span class="attr">inputSelector</span>: n=<span class="string">"#answer"</span>, <span class="attr">confirmBtnSelector</span>: r=<span class="string">"#btn-confirm"</span>, <span class="attr">errorTipSelector</span>: t=<span class="string">"#error-tip"</span>, <span class="attr">correctAnswer</span>: i=<span class="string">""</span>, <span class="attr">secretConfig</span>: o=<span class="literal">null</span>, <span class="attr">getSecretConfig</span>: c=<span class="literal">null</span>, <span class="attr">getConfig</span>: s=<span class="literal">null</span>, <span class="attr">answerRules</span>: u=<span class="literal">null</span>, <span class="attr">onSuccess</span>: l= <span class="function">() =&gt;</span> {}</span><br><span class="line">...</span><br><span class="line"><span class="keyword">else</span> {</span><br><span class="line">    <span class="keyword">const</span> n = <span class="keyword">function</span>(<span class="params">e</span>) {</span><br><span class="line">        <span class="keyword">if</span> (<span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span> &amp;&amp; <span class="string">"function"</span> == <span class="keyword">typeof</span> <span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span>.<span class="property">passAnswerRules</span> &amp;&amp; !<span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span>.<span class="title function_">passAnswerRules</span>(e, u))</span><br><span class="line">            <span class="keyword">return</span> !<span class="number">1</span>;</span><br><span class="line">        <span class="keyword">const</span> n = <span class="title function_">y</span>();</span><br><span class="line">        <span class="keyword">if</span> (n)</span><br><span class="line">            <span class="keyword">return</span> !(!<span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span> || <span class="string">"function"</span> != <span class="keyword">typeof</span> <span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span>.<span class="property">verify</span>) &amp;&amp; <span class="variable language_">window</span>.<span class="property">PuzzleSecretVerifier</span>.<span class="title function_">verify</span>(n, e, {</span><br><span class="line">                <span class="attr">answerRules</span>: u</span><br><span class="line">            });</span><br><span class="line">        <span class="keyword">const</span> r = <span class="title function_">z</span>(e);</span><br><span class="line">        <span class="keyword">return</span> <span class="title class_">Array</span>.<span class="title function_">isArray</span>(i) ? i.<span class="title function_">some</span>(<span class="keyword">function</span>(<span class="params">e</span>) {</span><br><span class="line">            <span class="keyword">return</span> <span class="title function_">z</span>(e) === r</span><br><span class="line">        }) : <span class="title function_">z</span>(i) === r</span><br><span class="line">    }(e);</span><br><span class="line">    <span class="keyword">if</span> (n)</span><br><span class="line">        <span class="keyword">return</span> <span class="title function_">p</span>(),</span><br><span class="line">        <span class="keyword">void</span> <span class="title function_">l</span>();</span><br><span class="line">    <span class="title function_">d</span>()</span><br><span class="line">}</span><br><span class="line">...</span><br></pre></td></tr></table></figure></div><p>注意到<code>secret-verifier.js</code></p><div class="code-container" data-rel="Javascript"><figure class="iseeu highlight javascript"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line">...</span><br><span class="line"><span class="keyword">function</span> <span class="title function_">a</span>(<span class="params">e, r</span>) {</span><br><span class="line">    <span class="keyword">if</span> (!r || <span class="string">"object"</span> != <span class="keyword">typeof</span> r)</span><br><span class="line">        <span class="keyword">return</span> !<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">const</span> t = <span class="literal">null</span> == e ? <span class="string">""</span> : <span class="title class_">String</span>(e);</span><br><span class="line">    <span class="keyword">if</span> (r.<span class="property">requiredAsciiComma</span> &amp;&amp; -<span class="number">1</span> === t.<span class="title function_">indexOf</span>(<span class="string">","</span>))</span><br><span class="line">        <span class="keyword">return</span> !<span class="number">1</span>;</span><br><span class="line">    <span class="keyword">if</span> (<span class="title class_">Array</span>.<span class="title function_">isArray</span>(r.<span class="property">requiredChars</span>) &amp;&amp; r.<span class="property">requiredChars</span>.<span class="property">length</span> &gt; <span class="number">0</span>) {</span><br><span class="line">        <span class="keyword">const</span> e = r.<span class="property">requiredChars</span>.<span class="title function_">map</span>(<span class="keyword">function</span>(<span class="params">e</span>) {</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">null</span> == e ? <span class="string">""</span> : <span class="title class_">String</span>(e)</span><br><span class="line">        }).<span class="title function_">filter</span>(<span class="keyword">function</span>(<span class="params">e</span>) {</span><br><span class="line">            <span class="keyword">return</span> <span class="string">""</span> !== e</span><br><span class="line">        });</span><br><span class="line">        <span class="keyword">for</span> (<span class="keyword">let</span> r = <span class="number">0</span>; r &lt; e.<span class="property">length</span>; r += <span class="number">1</span>)</span><br><span class="line">            <span class="keyword">if</span> (-<span class="number">1</span> === t.<span class="title function_">indexOf</span>(e[r]))</span><br><span class="line">                <span class="keyword">return</span> !<span class="number">1</span></span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> !<span class="number">0</span></span><br><span class="line">}</span><br><span class="line">...</span><br></pre></td></tr></table></figure></div><p>所以，应该去除前缀<code>C</code>，并在下标10后添加<code>,</code></p><p>答案是：<code>SHEISTHEEND,NOTTHEMEANS</code></p><p>唉。</p><div class="callout callout--titled danger mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">提醒</div><div class="callout__content markdown-body flex-1 min-w-0"><p>对于这种非常规解谜方法，我是不建议大家这样做的，人家辛辛苦苦做的解谜被你这样跳过去了也不好。<br><del>不过我有点不甘心想看看答案</del><br>看起来这个网站的解谜不少（<code>progress-store.js</code>，条目挺多的，我没做逆向，我也不是干这个的）<br>实际上对于其他的谜题，我也不太清楚能不能行。但是，不要这样“解谜”为好，真的，算我求你。</p></div></div></div><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>一些无关紧要的东西</summary><div class="content p-4 "><p>其实还用了这些C#代码：</p><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">VigenereCipherDecrypt</span>(<span class="params"><span class="built_in">string</span> cipherText, <span class="built_in">string</span> key</span>)</span></span><br><span class="line">{</span><br><span class="line">    key = key.ToUpper();</span><br><span class="line">    StringBuilder plainText = <span class="keyword">new</span> StringBuilder();</span><br><span class="line">    <span class="built_in">int</span> keyIndex = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">foreach</span> (<span class="built_in">char</span> c <span class="keyword">in</span> cipherText)</span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">char</span>.IsUpper(c))</span><br><span class="line">        {</span><br><span class="line">            <span class="built_in">char</span> k = key[keyIndex % key.Length];</span><br><span class="line">            keyIndex++;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">int</span> p = (c - <span class="string">'A'</span> - (k - <span class="string">'A'</span>) + <span class="number">26</span>) % <span class="number">26</span>;</span><br><span class="line">            plainText.Append((<span class="built_in">char</span>)(p + <span class="string">'A'</span>));</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        {</span><br><span class="line">            plainText.Append(c);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> plainText.ToString();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="built_in">string</span> <span class="title">VigenereCipherEncrypt</span>(<span class="params"><span class="built_in">string</span> plainText, <span class="built_in">string</span> key</span>)</span></span><br><span class="line">{</span><br><span class="line">    key = key.ToUpper();</span><br><span class="line">    StringBuilder cipherText = <span class="keyword">new</span> StringBuilder();</span><br><span class="line">    <span class="built_in">int</span> keyIndex = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">foreach</span> (<span class="built_in">char</span> c <span class="keyword">in</span> plainText)</span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">if</span> (<span class="built_in">char</span>.IsUpper(c))</span><br><span class="line">        {</span><br><span class="line">            <span class="built_in">char</span> k = key[keyIndex % key.Length];</span><br><span class="line">            keyIndex++;</span><br><span class="line"></span><br><span class="line">            <span class="built_in">int</span> cip = (c - <span class="string">'A'</span> + (k - <span class="string">'A'</span>)) % <span class="number">26</span>;</span><br><span class="line">            cipherText.Append((<span class="built_in">char</span>)(cip + <span class="string">'A'</span>));</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        {</span><br><span class="line">            cipherText.Append(c);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line">    <span class="keyword">return</span> cipherText.ToString();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 试这两个东西是因为DS当时拿答案推过程猜这样得的，事实证明很扯。</span></span><br><span class="line">Console.WriteLine(VigenereCipherDecrypt(<span class="string">"PXQYVETBHRMARTWOAPBKLOWPZQVFGHETUHXEKSKMLYVCJEDLNWPQAETONDSFOFTXMBVHEIEPRZA"</span>, <span class="string">"WASTHATYOURGOALTOFINDHERANDENDALLTHIS"</span>));</span><br><span class="line">Console.WriteLine(VigenereCipherEncrypt(<span class="string">"SHEISTHEENDNOTTHEMEANS"</span>, <span class="string">"WASTHATYOURGOALTOFINDHERANDENDALLTHIS"</span>))</span><br></pre></td></tr></table></figure></div><p><del>感谢那个已经死掉的.NET Interactive/Polyglot NoteBook，我用着其实还挺顺手的</del></p></div></details><h2 id="结语">结语</h2><p>你别说，还真有点意思，也有点收获<br>好奇CTFer过来做这前面几道题是不是很快就解决了（）<br>虽然最后用了那么不常规的手段…<br>但前面部分还是玩得挺有意思的</p><p>接下来就交给各位玩1999的大佬啦！~</p>]]></content>
    
    
    <summary type="html">记录了一次朋友拉入的有关1999的解谜（部分）</summary>
    
    
    
    <category term="解谜" scheme="https://misaka10548.github.io/categories/%E8%A7%A3%E8%B0%9C/"/>
    
    
    <category term="解密" scheme="https://misaka10548.github.io/tags/%E8%A7%A3%E5%AF%86/"/>
    
    <category term="重返未来：1999" scheme="https://misaka10548.github.io/tags/%E9%87%8D%E8%BF%94%E6%9C%AA%E6%9D%A5%EF%BC%9A1999/"/>
    
    <category term="AI辅助" scheme="https://misaka10548.github.io/tags/AI%E8%BE%85%E5%8A%A9/"/>
    
  </entry>
  
  <entry>
    <title>[干巴]记自己初期写的一个C#完整代码</title>
    <link href="https://misaka10548.github.io/post/2026/04/26/f6f390df/"/>
    <id>https://misaka10548.github.io/post/2026/04/26/f6f390df/</id>
    <published>2026-04-26T15:52:00.000Z</published>
    <updated>2026-05-03T13:15:51.000Z</updated>
    
    <content type="html"><![CDATA[<p>这一篇主要是记录自己编程写的一个C#原始的代码的，<br>可惜的地方在于自己的一些想法忘了（实际上是现在有点难组织成语言）</p><h2 id="对比用"><strong>对比用</strong></h2><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>挺难看的</summary><div class="content p-4 "><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>Program.cs</summary><div class="content p-4"><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Text.Json;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Test</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">Program</span></span><br><span class="line">{</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> CliStatus status;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> Company? company;</span><br><span class="line">    <span class="keyword">private</span> <span class="keyword">static</span> JsonSerializerOptions jsonSerializerOptions = <span class="keyword">new</span> JsonSerializerOptions { IncludeFields = <span class="literal">true</span> };</span><br><span class="line">    <span class="keyword">private</span> <span class="built_in">enum</span> CliStatus</span><br><span class="line">    {</span><br><span class="line">        Init,</span><br><span class="line">        Loaded,</span><br><span class="line">        Exit</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">Main</span>(<span class="params"><span class="built_in">string</span>[] <span class="keyword">args</span></span>)</span></span><br><span class="line">    {</span><br><span class="line">        status = CliStatus.Init;</span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">switch</span> (status)</span><br><span class="line">            {</span><br><span class="line">                <span class="keyword">case</span> CliStatus.Init:</span><br><span class="line">                    <span class="keyword">init</span>();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> CliStatus.Loaded:</span><br><span class="line">                    menu();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line"></span><br><span class="line">            }</span><br><span class="line">        } <span class="keyword">while</span> (status != CliStatus.Exit);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">menu</span>()</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> success = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            Console.WriteLine(<span class="string">"""</span></span><br><span class="line"><span class="string">                          菜单：</span></span><br><span class="line"><span class="string">                          q):退出</span></span><br><span class="line"><span class="string">                          1):添加一个职工</span></span><br><span class="line"><span class="string">                          2):列举所有职工</span></span><br><span class="line"><span class="string">                          3):删除职工</span></span><br><span class="line"><span class="string">                          4):修改职工信息</span></span><br><span class="line"><span class="string">                          5):查找职工</span></span><br><span class="line"><span class="string">                          6):排序</span></span><br><span class="line"><span class="string">                          7):清空当前Company的内容</span></span><br><span class="line"><span class="string">                          8):将当前company保存到company.json</span></span><br><span class="line"><span class="string">                          """</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">var</span> option = Console.ReadKey().KeyChar;</span><br><span class="line"></span><br><span class="line">            Console.WriteLine(<span class="string">""</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">switch</span> (option)</span><br><span class="line">            {</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'q'</span>:</span><br><span class="line">                    status = CliStatus.Exit;</span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'1'</span>:</span><br><span class="line">                    success = company!.TryAddStaff();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'2'</span>:</span><br><span class="line">                    Console.WriteLine(company!.GetStaffs());</span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'3'</span>:</span><br><span class="line">                    success = company!.TryRemoveStaff();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'4'</span>:</span><br><span class="line">                    success = company!.TryModifyStaff();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'5'</span>:</span><br><span class="line">                    success = company!.TrySearchStaff();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'6'</span>:</span><br><span class="line">                    <span class="comment">// 很明显已经是屎山了</span></span><br><span class="line">                    Console.WriteLine(<span class="string">"是否要按id降序排序，是输入yes，否则视为不是"</span>);</span><br><span class="line">                    <span class="keyword">if</span> (Console.ReadLine() == <span class="string">"yes"</span>)</span><br><span class="line">                        company!.Order(<span class="literal">true</span>);</span><br><span class="line">                    <span class="keyword">else</span></span><br><span class="line">                        company!.Order(<span class="literal">false</span>);</span><br><span class="line"></span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'7'</span>:</span><br><span class="line">                    Console.WriteLine(<span class="string">"确定操作请输入yes"</span>);</span><br><span class="line">                    <span class="keyword">if</span> (Console.ReadLine() == <span class="string">"yes"</span>)</span><br><span class="line">                    {</span><br><span class="line">                        company = <span class="keyword">new</span> Company();</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">else</span></span><br><span class="line">                    {</span><br><span class="line">                        Console.WriteLine(<span class="string">"操作取消"</span>);</span><br><span class="line">                    }</span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'8'</span>:</span><br><span class="line">                    <span class="keyword">var</span> content = JsonSerializer.Serialize(company, jsonSerializerOptions);</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">using</span> (StreamWriter writer = <span class="keyword">new</span> StreamWriter(<span class="string">"company.json"</span>, <span class="literal">false</span>, Encoding.UTF8))</span><br><span class="line">                    {</span><br><span class="line">                        writer.Write(content);</span><br><span class="line">                    }</span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="literal">default</span>:</span><br><span class="line">                    Console.WriteLine(<span class="string">"选择无效，请重新选择"</span>);</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            }</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!success)</span><br><span class="line">                Console.WriteLine(<span class="string">"操作失败"</span>);</span><br><span class="line"></span><br><span class="line">        } <span class="keyword">while</span> (!success);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">init</span>()</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> success = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Console.WriteLine(<span class="string">"""</span></span><br><span class="line"><span class="string">                          选择一个初始化的方法：</span></span><br><span class="line"><span class="string">                          1):从company.json读取</span></span><br><span class="line"><span class="string">                          2):创建一个新Company对象</span></span><br><span class="line"><span class="string">                          """</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">var</span> option = Console.ReadKey().KeyChar;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">switch</span> (option)</span><br><span class="line">            {</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'1'</span>:</span><br><span class="line">                    success = loadFromFile();</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="keyword">case</span> <span class="string">'2'</span>:</span><br><span class="line">                    company = <span class="keyword">new</span> Company();</span><br><span class="line">                    success = <span class="literal">true</span>;</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">                <span class="literal">default</span>:</span><br><span class="line">                    Console.WriteLine(<span class="string">""</span>);</span><br><span class="line">                    Console.WriteLine(<span class="string">"选择无效，请重新选择"</span>);</span><br><span class="line">                    <span class="keyword">break</span>;</span><br><span class="line">            }</span><br><span class="line">        } <span class="keyword">while</span> (!success);</span><br><span class="line"></span><br><span class="line">        status = CliStatus.Loaded;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">loadFromFile</span>()</span></span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">if</span> (!File.Exists(<span class="string">"company.json"</span>))</span><br><span class="line">        {</span><br><span class="line">            Console.WriteLine(<span class="string">""</span>);</span><br><span class="line">            Console.WriteLine(<span class="string">"未找到company.json"</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="keyword">try</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">using</span> <span class="keyword">var</span> fs = <span class="keyword">new</span> FileStream(<span class="string">"company.json"</span>, FileMode.Open);</span><br><span class="line">            company = JsonSerializer.Deserialize&lt;Company&gt;(fs);</span><br><span class="line">        }</span><br><span class="line">        <span class="comment">// catch (FileNotFoundException)</span></span><br><span class="line">        <span class="comment">// {</span></span><br><span class="line">        <span class="comment">//     Console.WriteLine("未找到company.json");</span></span><br><span class="line">        <span class="comment">//     return false;</span></span><br><span class="line">        <span class="comment">// }</span></span><br><span class="line">        <span class="keyword">catch</span> (JsonException)</span><br><span class="line">        {</span><br><span class="line">            Console.WriteLine(<span class="string">"company.json的数据无效"</span>);</span><br><span class="line">            <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></div></details><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>Company.cs</summary><div class="content p-4"><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> System.Text.Json.Serialization;</span><br><span class="line"></span><br><span class="line"><span class="keyword">namespace</span> <span class="title">Test</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">internal</span> <span class="keyword">class</span> <span class="title">Company</span></span><br><span class="line">{</span><br><span class="line">    <span class="comment">// 暂时先用List&lt;T&gt;吧</span></span><br><span class="line">    <span class="comment">// private List&lt;Department&gt; departments = new();</span></span><br><span class="line">    [<span class="meta">JsonInclude</span>]</span><br><span class="line">    <span class="keyword">private</span> List&lt;Staff&gt; staffs = <span class="keyword">new</span>();</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="built_in">string</span> <span class="title">GetStaffs</span>()</span></span><br><span class="line">    {</span><br><span class="line">        StringBuilder sb = <span class="keyword">new</span> StringBuilder();</span><br><span class="line">        <span class="keyword">foreach</span> (<span class="keyword">var</span> staff <span class="keyword">in</span> staffs)</span><br><span class="line">        {</span><br><span class="line">            sb.Append(staff);</span><br><span class="line">            sb.Append(Environment.NewLine);</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> sb.ToString();</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">AddStaff</span>(<span class="params">Staff staff</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">if</span> (staffs.Contains(staff))</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$"The <span class="subst">{staff.Name}</span> had already been added."</span>);</span><br><span class="line">        <span class="comment">// if (!departments.Contains(staff.Department!))</span></span><br><span class="line">        <span class="comment">//     throw new ArgumentException(</span></span><br><span class="line">        <span class="comment">//         $"The {staff.Name} in {staff.Department}, whose department not in this company currently.");</span></span><br><span class="line">        <span class="comment">// if (staff.Department is not null)</span></span><br><span class="line">        <span class="comment">//     if (!departments.Contains(staff.Department))</span></span><br><span class="line">        <span class="comment">//         departments.Add(staff.Department);</span></span><br><span class="line">        <span class="keyword">if</span> (staffs.Find(s =&gt; s.Id == staff.Id) <span class="keyword">is</span> <span class="keyword">not</span> <span class="literal">null</span>)</span><br><span class="line">            <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$"The <span class="subst">{staff.Name}</span> have a duplicate ID."</span>);</span><br><span class="line"></span><br><span class="line">        staffs.Add(staff);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// public void RemoveStaff(Staff staff)</span></span><br><span class="line">    <span class="comment">// {</span></span><br><span class="line">    <span class="comment">//     if (!staffs.Contains(staff))</span></span><br><span class="line">    <span class="comment">//         throw new ArgumentException($"The {staff.Name} had already been added.");</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">//     staffs.Remove(staff);</span></span><br><span class="line">    <span class="comment">// }</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">RemoveStaff</span>(<span class="params"><span class="built_in">int</span> staffId</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">var</span> staff = staffs.Find(staff =&gt; staff.Id == staffId) ?? <span class="keyword">throw</span> <span class="keyword">new</span> ArgumentException(<span class="string">$"Couldn't find a staff has ID <span class="subst">{staffId}</span>"</span>);</span><br><span class="line"></span><br><span class="line">        staffs.Remove(staff);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="keyword">public</span> Staff? SearchStaff(<span class="built_in">int</span> staffId)</span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">return</span> staffs.Find(staff =&gt; staff.Id == staffId);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// public Staff? SearchStaff(string staffName)</span></span><br><span class="line">    <span class="comment">// {</span></span><br><span class="line">    <span class="comment">//     return staffs.Find(staff =&gt; staff.Name == staffName);</span></span><br><span class="line">    <span class="comment">// }</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">void</span> <span class="title">Order</span>(<span class="params"><span class="built_in">bool</span> <span class="keyword">descending</span></span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">if</span> (<span class="keyword">descending</span>)</span><br><span class="line">        {</span><br><span class="line">            staffs.Sort((x, y) =&gt; y.Id.CompareTo(x.Id));</span><br><span class="line">        }</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">        {</span><br><span class="line">            staffs.Sort((x, y) =&gt; x.Id.CompareTo(y.Id));</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></div></details><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>CompanyExtension.cs</summary><div class="content p-4"><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><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></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Test</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="keyword">class</span> <span class="title">CompanyExtension</span></span><br><span class="line">{</span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">TryAddStaff</span>(<span class="params"><span class="keyword">this</span> Company company</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> inputValid = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Console.WriteLine(<span class="string">"""</span></span><br><span class="line"><span class="string">                          输入职工信息，以空格分隔</span></span><br><span class="line"><span class="string">                          姓名 编号 职工类型 部门</span></span><br><span class="line"><span class="string">                          """</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">var</span> input = (Console.ReadLine() ?? <span class="built_in">string</span>.Empty).Split(<span class="string">' '</span>);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (input.Length == <span class="number">4</span>)</span><br><span class="line">            {</span><br><span class="line">                <span class="built_in">string</span> name = input[<span class="number">0</span>];</span><br><span class="line">                <span class="built_in">bool</span> idParse = <span class="built_in">int</span>.TryParse(input[<span class="number">1</span>], <span class="keyword">out</span> <span class="keyword">var</span> id);</span><br><span class="line">                <span class="built_in">bool</span> staffTypeParse = Enum.TryParse(<span class="keyword">typeof</span>(StaffType), input[<span class="number">2</span>], <span class="keyword">out</span> <span class="keyword">var</span> staffType);</span><br><span class="line">                <span class="built_in">string</span> department = input[<span class="number">3</span>];</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (idParse &amp;&amp; staffTypeParse)</span><br><span class="line">                {</span><br><span class="line">                    StaffType staffsType = (StaffType)staffType!;</span><br><span class="line">                    <span class="keyword">var</span> staff = <span class="keyword">new</span> Staff(name, id, staffsType, department);</span><br><span class="line">                    <span class="comment">// 梅开二度屎山</span></span><br><span class="line">                    <span class="keyword">try</span></span><br><span class="line">                    {</span><br><span class="line">                        company.AddStaff(staff);</span><br><span class="line">                    }</span><br><span class="line">                    <span class="keyword">catch</span> (ArgumentException)</span><br><span class="line">                    {</span><br><span class="line">                        <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                    }</span><br><span class="line">                    inputValid = <span class="literal">true</span>;</span><br><span class="line">                }</span><br><span class="line">            }</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!inputValid)</span><br><span class="line">                Console.WriteLine(<span class="string">"输入无效，请重新输入"</span>);</span><br><span class="line"></span><br><span class="line">        } <span class="keyword">while</span> (!inputValid);</span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">TryRemoveStaff</span>(<span class="params"><span class="keyword">this</span> Company company</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> inputValid = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Console.WriteLine(<span class="string">"输入要删除的职工id"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">var</span> input = Console.ReadLine() ?? <span class="built_in">string</span>.Empty;</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">int</span>.TryParse(input, <span class="keyword">out</span> <span class="keyword">var</span> id))</span><br><span class="line">            {</span><br><span class="line">                inputValid = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (company.SearchStaff(id) <span class="keyword">is</span> <span class="literal">null</span>)</span><br><span class="line">                {</span><br><span class="line">                    Console.WriteLine(<span class="string">"不存在指定的职工"</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                }</span><br><span class="line">                company.RemoveStaff(id);</span><br><span class="line">            }</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!inputValid)</span><br><span class="line">                Console.WriteLine(<span class="string">"输入无效，请重新输入"</span>);</span><br><span class="line"></span><br><span class="line">        } <span class="keyword">while</span> (!inputValid);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">TryModifyStaff</span>(<span class="params"><span class="keyword">this</span> Company company</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> inputValid = <span class="literal">false</span>;</span><br><span class="line">        <span class="built_in">bool</span> inputInfoVaild = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Console.WriteLine(<span class="string">"输入要修改的职工个人信息的id"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">var</span> input = (Console.ReadLine() ?? <span class="built_in">string</span>.Empty);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">int</span>.TryParse(input, <span class="keyword">out</span> <span class="keyword">var</span> id))</span><br><span class="line">            {</span><br><span class="line">                inputValid = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">var</span> staff = company.SearchStaff(id);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (staff <span class="keyword">is</span> <span class="literal">null</span>)</span><br><span class="line">                {</span><br><span class="line">                    Console.WriteLine(<span class="string">"不存在指定的职工"</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                }</span><br><span class="line"></span><br><span class="line">                Console.WriteLine(<span class="string">"""</span></span><br><span class="line"><span class="string">                                  输入职工信息，以空格分隔</span></span><br><span class="line"><span class="string">                                  姓名 职工类型 部门</span></span><br><span class="line"><span class="string">                                  """</span>);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">do</span></span><br><span class="line">                {</span><br><span class="line">                    <span class="keyword">var</span> info = (Console.ReadLine() ?? <span class="built_in">string</span>.Empty).Split(<span class="string">' '</span>);</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (info.Length == <span class="number">3</span>)</span><br><span class="line">                    {</span><br><span class="line">                        <span class="built_in">string</span> name = info[<span class="number">0</span>];</span><br><span class="line">                        <span class="built_in">bool</span> staffTypeParse = Enum.TryParse(<span class="keyword">typeof</span>(StaffType), info[<span class="number">1</span>], <span class="keyword">out</span> <span class="keyword">var</span> staffType);</span><br><span class="line">                        StaffType staffsType = (StaffType)staffType!;</span><br><span class="line">                        <span class="built_in">string</span> department = info[<span class="number">2</span>];</span><br><span class="line"></span><br><span class="line">                        <span class="keyword">if</span> (staffTypeParse)</span><br><span class="line">                        {</span><br><span class="line">                            staff.Name = name;</span><br><span class="line">                            staff.Type = staffsType;</span><br><span class="line">                            staff.Department = department;</span><br><span class="line">                            inputInfoVaild = <span class="literal">true</span>;</span><br><span class="line">                        }</span><br><span class="line">                    }</span><br><span class="line"></span><br><span class="line">                    <span class="keyword">if</span> (!inputInfoVaild)</span><br><span class="line">                        Console.WriteLine(<span class="string">"输入的信息无效，请重新输入"</span>);</span><br><span class="line">                } <span class="keyword">while</span> (!inputInfoVaild);</span><br><span class="line"></span><br><span class="line"></span><br><span class="line">            }</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!inputValid)</span><br><span class="line">                Console.WriteLine(<span class="string">"输入无效，请重新输入"</span>);</span><br><span class="line">        } <span class="keyword">while</span> (!inputValid);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">internal</span> <span class="keyword">static</span> <span class="built_in">bool</span> <span class="title">TrySearchStaff</span>(<span class="params"><span class="keyword">this</span> Company company</span>)</span></span><br><span class="line">    {</span><br><span class="line">        <span class="built_in">bool</span> inputValid = <span class="literal">false</span>;</span><br><span class="line"></span><br><span class="line">        Console.WriteLine(<span class="string">"输入要搜索的职工个人信息的id"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">do</span></span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">var</span> input = (Console.ReadLine() ?? <span class="built_in">string</span>.Empty);</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (<span class="built_in">int</span>.TryParse(input, <span class="keyword">out</span> <span class="keyword">var</span> id))</span><br><span class="line">            {</span><br><span class="line">                inputValid = <span class="literal">true</span>;</span><br><span class="line"></span><br><span class="line">                <span class="keyword">var</span> staff = company.SearchStaff(id);</span><br><span class="line"></span><br><span class="line">                <span class="keyword">if</span> (staff <span class="keyword">is</span> <span class="literal">null</span>)</span><br><span class="line">                {</span><br><span class="line">                    Console.WriteLine(<span class="string">"不存在指定的职工"</span>);</span><br><span class="line">                    <span class="keyword">return</span> <span class="literal">false</span>;</span><br><span class="line">                }</span><br><span class="line"></span><br><span class="line">                Console.WriteLine(staff);</span><br><span class="line">            }</span><br><span class="line"></span><br><span class="line">            <span class="keyword">if</span> (!inputValid)</span><br><span class="line">                Console.WriteLine(<span class="string">"输入无效，请重新输入"</span>);</span><br><span class="line">        } <span class="keyword">while</span> (!inputValid);</span><br><span class="line"></span><br><span class="line">        <span class="keyword">return</span> <span class="literal">true</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></div></details><details class="relative my-4 border border-border-color bg-second-background-color rounded-md  blue" data-header-exclude=""><summary class="px-4 py-2 rounded-md shadow-[0_0_2px_0_var(--shadow-color-1)] cursor-pointer not-markdown"><i class="fa-solid fa-chevron-right"></i>Staff.cs</summary><div class="content p-4"><div class="code-container" data-rel="Csharp"><figure class="iseeu highlight csharp"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">namespace</span> <span class="title">Test</span>;</span><br><span class="line"></span><br><span class="line"><span class="keyword">internal</span> <span class="built_in">enum</span> StaffType</span><br><span class="line">{</span><br><span class="line">    Empolyee,</span><br><span class="line">    Boss,</span><br><span class="line">    Manager</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="comment">// 这里的Staff存在一个问题是ID是有符号的，不过负ID显得您身份特殊吗！</span></span><br><span class="line"><span class="keyword">internal</span> <span class="keyword">class</span> <span class="title">Staff</span></span><br><span class="line">{</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Name { <span class="keyword">get</span>; <span class="keyword">set</span>; }</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">int</span> Id { <span class="keyword">get</span>; <span class="keyword">init</span>; }</span><br><span class="line">    <span class="keyword">public</span> StaffType Type { <span class="keyword">get</span>; <span class="keyword">set</span>; }</span><br><span class="line">    <span class="keyword">public</span> <span class="built_in">string</span> Department { <span class="keyword">get</span>; <span class="keyword">set</span>; }</span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="title">Staff</span>(<span class="params"><span class="built_in">string</span> name, <span class="built_in">int</span> id, StaffType type, <span class="built_in">string</span> department</span>)</span></span><br><span class="line">    {</span><br><span class="line">        (Name, Id, Type, Department) = (name, id, type, department);</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// public Staff(string name, int id, Department department) : this(name, id, StaffType.Empolyee, department) { }</span></span><br><span class="line"></span><br><span class="line">    <span class="comment">// public Staff(string name, int id) : this(name, id, StaffType.Empolyee, null) { }</span></span><br><span class="line"></span><br><span class="line">    <span class="function"><span class="keyword">public</span> <span class="keyword">override</span> <span class="built_in">string</span> <span class="title">ToString</span>()</span></span><br><span class="line">    {</span><br><span class="line">        <span class="keyword">return</span> <span class="string">$"Staff(ID: <span class="subst">{Id}</span>, Name: <span class="subst">{Name}</span>, Type: <span class="subst">{Type}</span>, Department: <span class="subst">{Department}</span>)"</span>;</span><br><span class="line">    }</span><br><span class="line">}</span><br></pre></td></tr></table></figure></div></div></details></div></details><p><del>算是给自己留的赛博黑历史吧，即使是第一次写这样的代码（以前最多写俩没啥效率的脚本）</del></p>]]></content>
    
    
    <summary type="html">浅浅记录下当时写的代码，可惜的是当时的思考和感受忘了一些。</summary>
    
    
    
    <category term="灌水" scheme="https://misaka10548.github.io/categories/%E7%81%8C%E6%B0%B4/"/>
    
    
    <category term="水" scheme="https://misaka10548.github.io/tags/%E6%B0%B4/"/>
    
    <category term="C#" scheme="https://misaka10548.github.io/tags/C/"/>
    
  </entry>
  
  <entry>
    <title>[水]好的，现在我是体验完DeepSeek-V4的那个用户了</title>
    <link href="https://misaka10548.github.io/post/2026/04/24/186f33f1/"/>
    <id>https://misaka10548.github.io/post/2026/04/24/186f33f1/</id>
    <published>2026-04-24T15:43:00.000Z</published>
    <updated>2026-05-03T12:15:37.000Z</updated>
    
    <content type="html"><![CDATA[<div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">注意</div><div class="callout__content markdown-body flex-1 min-w-0"><p>这个blog，应该是4.24/4.25发的，但是因为我懒/别的原因，才拖到Update的这个时间发。<br>里面的内容，不做标注（一般是嵌入原文的地方）的话，都是当天浅浅体验几个小时的感觉</p></div></div></div><p>4.24 dsv4发布了</p><p>一开始还不知道这个消息，只是回到家后用专家模式问了一个问题，发现思考和以前不太一样。</p><p>简单来说，好像就是思考的多一点，全一点，比稍往前的时候更会/更像思考了，有的还会有个问题组织，对不同客户端的排版考虑……总之哪里都有一点不一样的感觉，显然是新版本发布了吧</p><p>直接用ds取搜，证实了。</p><p>价格挺出人意料，flash版本（缓存命中输入）1Mtoken/0.02CNY，（缓存为命中输入）1Mtoken/1CNY，（输出）1Mtoken/2CNY，白菜价；而pro呢，（缓存命中输入）1Mtoken/0.1CNY，（缓存为命中输入）1Mtoken/12CNY，（输出）1Mtoken/24CNY，这样的价格第一次见。</p><div class="callout callout--simple info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>甚至现在<code>deepseek-v4-pro 模型 2.5 折，优惠期延长至北京时间 2026/05/31 23:59</code>，那很便宜了</p></div></div><p>网上传闻说华为新卡发布后会降价，这就不在（本篇）的考虑范围内了。</p><p>谈谈我注意到的：</p><div class="callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">注意</div><div class="callout__content markdown-body flex-1 min-w-0"><p>这个blog，应该是4.24/4.25发的，但是因为我懒/别的原因，才拖到Update的这个时间发。<br>里面的内容，不做标注（一般是嵌入原文的地方）的话，都是当天浅浅体验几个小时的感觉，所以可能会有点错/原始</p></div></div></div><h4 id="风格">风格</h4><p>语言风格似乎有些变化，在目前短暂使用中还没有发现在什么地方比较明显的话，但就是感觉和V3.2不太一样，从思考就可以看出来了<br>不过ds味还是在的（？）</p><h4 id="幻觉提示词遵从">幻觉/提示词遵从</h4><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">注意</div><div class="callout__content markdown-body flex-1 min-w-0"><p>做一下内容补充，ds对于长上下文似乎不是特别好，flash的幻觉问题还是有点（能意识到的）<br>幻觉补充见后续补充</p></div></div></div><p>v4的发散性（创造性？）似乎没有V3.2的好？<br>（据网上说）LLM的发散性和幻觉其实有一定关系，降低了幻觉多少会有些影响到发散性。</p><h4 id="回复风格">回复风格</h4><p>（因为是手机上用的，可能有所不同）</p><p>有部分情况，v4（pro）的回复风格比较简洁，没那么多Markdown语法，主要就是分割线，比较传统的1、2、3分段，有点少见。</p><p>更愿意画字符画？v4进行可视化图表的积极性显然比V3.2高，V3.2几乎不会画图。<br>不过正如所说，是字符画。<br>v4似乎认为，当前环境是无法预览mermaid图表的，因此会更容易画字符画？</p><p>口语化/拟人化表达有变化：似乎是更进一步。</p><h4 id="好的现在我是我了">好的，现在我是我了</h4><p>（以上标题<em>为ds思考原话</em>）</p><p>一般深度思考时候，ds起手式是<code>嗯</code>，<code>好的，现在用户...</code>，然后再是一段结构化程序化（v4更明显），ds风格的深度思考。<br>（网页搜索是个例外，但是v4的思考深度在这方面更好，也能简单思考了，不知道为什么触发思考的ds风格/能力表现全不一致，不清楚api环境怎样）</p><div class="callout callout--simple info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>补充见后<br>下面这个是当时总结的，可能片面/不准确</p></div></div><p>不过和v4对话，在用户提出的内容较有深度，多轮对话/对话较长，涉及有角色特性的理解/需要换位思考或切换角色的情况时，dsv4有概率以<code>好的，现在我是（那个）（+任务等描写内容）+身份+了</code>的起手式，思考内容也会随着这样的起手式而变得具有风格性/角色性。</p><p>目前（我）有两个不互斥的猜测。</p><p>一是，v4对于“续写”任务的意识，AI在长对话中需要锚定描写锚点，触发了这一种句式。</p><p>还有一种是AI有一种角色扮演的模式被模型运用到了其他地方，以提高表现。</p><p>总结就是：对话情景判断和角色扮演行为运用。</p><p>角色扮演行为在思考现在也能做到。记得这是以前R1才能做到的事，现在v4也有了。照这样看，v4还要比R1广泛些。</p><p>如果你让v4“是一只猫娘”/“扮演一只猫娘（像猫娘一样思考）”，马上就可以看到效果。</p><p>对于对话情景判断，我补充：本来想说的是，有可能ds误判了文本，认为对话中<code>user</code>和<code>assistant</code>都是自己生成的，需要在思考时切换角色。</p><div class="callout callout--simple info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2 items-center"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="callout__content markdown-body flex-1 min-w-0"><p>我现在看感觉有点扯</p></div></div><p>虽然可能有一定合理性，但是连间接证据（表现）还没有，更别说可能的直接体现了，所以在我倾向认为不存在。</p><p><del>这下可以更沉浸地角色扮演了（雾</del></p><h4 id="结">结</h4><p>好的，现在我是那个写deepseek最新款模型使用感受的用户了。</p><p>总之，这是我晚上小几个小时对话的体验感受，有的方面有提升，好像有点方面不明显，风格有点变化，价格是个惊喜。</p><p>这个新起手式，还挺有意思的，不知道有多少能力提升。</p><p>（内容<em>可能有差错</em>）</p><h4 id="后续补充">后续补充</h4><div class="callout callout--titled info mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight">注意</div><div class="callout__content markdown-body flex-1 min-w-0"><p>这里不是当时写的</p></div></div></div><h5 id="幻觉">幻觉</h5><p>对于dsv4-flash的幻觉问题，可以尝试那种了解确认提示词的方式，有的内容是你说什么就是什么，和系统提示词没关系，纯瞎编</p><p>就比如：你进行网页搜索后是如何标识来源的<br>这样的问题</p><p>你再问问他有关 <code>【4†L3-L5】</code>这样的指示，大概率会编，但是pro会说<code>我的标准标注格式只有 [citation:数字] 这一种</code></p><p>这是在某次使用时ds出现生成<code>【4†L3-L5】</code>，后续想了解搜索内容标注的系统提示词大概是怎么样发现的</p><h5 id="现在我是我了">现在我是我了</h5><p>对于这个，最近才有一点了解MoE专家模型和思考的不同pattern（也是模式？我那个评论原话）</p><p>dsv4的训练，似乎是先炼专家，后蒸馏整和<br>个人觉得，整合后（其实也应该包括传统MoE方法）可能会因为“领域不同”而有不同风格存在</p><p>而且这样似乎AI表现更“吃场景”了？</p><p>对于思考pattern</p><p>很容易联想到那个ds一旦触发联网搜索，就像换了人一样专注搜而更少关注推理了一样（其实ds触发联网时的风格也不一样，可能是有个“专家”）</p><p>可能可以用来解释那个<code>好的，现在我是我了。</code>这样的思考行为了——触发了某一个思考pattern</p><p>有的时候，v4还会出现在思考中说自己需要为回复生成思考，那这个就…有点意思</p><p>对于角色扮演思考模式，我不太清楚，可能也是这样？</p><p>不过，现在倒是见的少了，不知道是修了还是因为我现在一直的使用场景（内容）和当时不一致没触发而已</p><p><del><em>我要视觉模式灰度啊啊啊啊啊</em></del></p>]]></content>
    
    
      
      
    <summary type="html">&lt;div class=&quot;callout callout--titled warning mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row </summary>
      
    
    
    
    <category term="AI" scheme="https://misaka10548.github.io/categories/AI/"/>
    
    <category term="LLM" scheme="https://misaka10548.github.io/categories/AI/LLM/"/>
    
    <category term="DeepSeek" scheme="https://misaka10548.github.io/categories/AI/LLM/DeepSeek/"/>
    
    
    <category term="LLM" scheme="https://misaka10548.github.io/tags/LLM/"/>
    
  </entry>
  
  <entry>
    <title>关于自己博客的一些想法</title>
    <link href="https://misaka10548.github.io/post/2026/04/21/2af82fbe/"/>
    <id>https://misaka10548.github.io/post/2026/04/21/2af82fbe/</id>
    <published>2026-04-21T08:43:00.000Z</published>
    <updated>2026-05-03T12:56:41.000Z</updated>
    
    <content type="html"><![CDATA[<p>不知道是什么原因，更可能是一种“奇怪的”习惯吧。做一些事，说一些话，讨论些东西，部分情况下总是想先明确一个基础。</p><p>可能是博客这个定位/场景特殊吧——写出来就要给大家看（就算实际上没人看我也是这么认为，不自觉的一种强迫吧），所以总得对自己的内容“负点责”——其实是免责声明：<strong>作为一个小小的写博客的，写的内容也不一定对，也不一定全，不一定有可参考的，更不一定有价值</strong></p><h2 id="定位想写的内容">定位/想写的内容</h2><p>实质上写博客还是面向自己吧？为了一种“记录”。<br>倒是因为公开的特性使得自己“被迫”在一定程度上“负点责”。<br>写的东西不能太少（说不定其实会有），内容不能太杂乱无结构，最好尽可能少犯错。</p><h2 id="有关ai内容">有关AI内容</h2><p>现在AI也不是什么小众东西了（？），有的人拿AI灌水自己的博客。也能理解吧，“记录”自己遇到什么东西。</p><p>不过，上网一搜，大多数见到的/泛滥的（AI博客），没什么价值，就算有，也大概需要在一堆“很充实”的话中去寻找。</p><p>也是出于某种我不太清楚的想法，想对自己的内容打上有关使用AI的标签。</p><p>先分个类：</p><ol type="1"><li><p><strong>AI主要运用在内容“记录”过程的一个小环节</strong><br>例如对于一个相对于主题的小问题，方法选择/作参考。<br>参与程度比较浅，一般来说在广度上也比较窄。主体仍是人编写的。<br>大概率不会添加单独的标签，但是会提一嘴<br>大概就是像那种，有那样的隐含特征？与AI的对话能被“一句话总结”的，不涉及较多指令/复杂对话的</p></li><li><p><strong>AI较多参与了文本/内容；或是对内容有不可或缺的作用</strong><br>我觉得还是贴个标签好一点<br>比如让AI重写博客结构，多处/大幅重写表达以清晰化/准确化语言<br>或者即使文本（直接）不涉及AI，但内部观点是大量和AI讨论得到的<br>或者复述AI的观点</p><p>目前想的标签有：</p><ul><li>AI涉及的结构重整</li><li>AI辅助的结构组织</li><li>AI涉及的表述调整</li><li>AI驱动的信息收集</li><li>AI驱动的观点导出</li><li>AI观点</li><li>AI生成内容参考</li><li>AI辅助</li><li>AI翻译</li></ul></li></ol><p>对于<code>不可或缺的作用</code>的这个参考，其实不是很准：</p><p>我个人认为对于AI的使用体验，或者讨论什么的，内容和观点、结构和组织都是可以不使用AI的<br>我认为这样的不需要打个什么AI标签了，就是很正常的东西</p><h2 id="对自己博客的其他话">对自己博客的其他话</h2><p>实际上我也不太会写博客（），不知道写什么，也不知道怎么写好。</p><p>所以这一篇也是一篇灌水的blog</p><p>（虽然没什么时间写）只要写下去，就总会好起来的吧？</p><p>希望以后能产出一些有价值的内容吧，</p><p>即使是（如果仅）用作自己的“记录”。</p>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;不知道是什么原因，更可能是一种“奇怪的”习惯吧。做一些事，说一些话，讨论些东西，部分情况下总是想先明确一个基础。&lt;/p&gt;
&lt;p&gt;可能是博客这个定位/场景特殊吧——写出来就要给大家看（就算实际上没人看我也是这么认为，不自觉的一种强迫吧），所以总得对自己的内容“负点责”——其</summary>
      
    
    
    
    <category term="灌水" scheme="https://misaka10548.github.io/categories/%E7%81%8C%E6%B0%B4/"/>
    
    
    <category term="水" scheme="https://misaka10548.github.io/tags/%E6%B0%B4/"/>
    
    <category term="博客" scheme="https://misaka10548.github.io/tags/%E5%8D%9A%E5%AE%A2/"/>
    
  </entry>
  
  <entry>
    <title>[水]起于2026-01-31 23:03的一件事</title>
    <link href="https://misaka10548.github.io/post/2026/02/11/7875c8a8/"/>
    <id>https://misaka10548.github.io/post/2026/02/11/7875c8a8/</id>
    <published>2026-02-11T10:44:13.000Z</published>
    <updated>2026-02-12T03:01:42.000Z</updated>
    
    <content type="html"><![CDATA[<h2 id="起于">起于</h2><p>事情起于这样我们群中一句话： <blockquote><p>为了不借助DDNS就搞到电脑的IP，我打算搞个自动的Python脚本获取IP并邮件发送<br>这样子春节就可以远程操控</p><footer><strong>霂里梦呓</strong></footer></blockquote></p><p>（他）打算如下</p><ol type="1"><li>自启动</li><li>检测网络通断</li><li>ipconfig获取ip</li><li>发邮件给自己</li></ol><p>虽然还没有开始怎么学习编程，我打算拿来练练手，只不过是用C#写</p><h2 id="正文">正文</h2><h3 id="构思">构思</h3><h4 id="基本实现">基本实现</h4><ul><li><strong>自启动</strong>：计划任务即可</li><li><strong>检测网络通断</strong>：用API实现，不采用当时一开始的ping的想法</li><li><strong>获取IP</strong>：API</li><li><strong>发邮件</strong>：<del>SMTP</del> MS Graph API</li></ul><p>没有什么复杂的地方，也就是一个顺序过程<br></p><h4 id="升级">升级</h4><p>自启动后循环执行过程，不再通过计划任务多次调用</p><p>如果网络不可用则5分钟检查一次，直到成功（或者使用库中相关方法？如果存在）。</p><h3 id="查资料">查资料</h3><h4 id="有关基本实现">有关基本实现</h4><h5 id="网络部分">网络部分</h5><p>很容易搜索到这个文档： <a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/fundamentals/networking/network-info">网络可用性- .NET | Microsoft Learn<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>里面提到了 System.Net.NetworkInformation 命名空间，接着往下看<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation?view=net-10.0">文档<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>找到<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkinterface?view=net-10.0">NetworkInterface<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>中<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkinterface.getisnetworkavailable?view=net-10.0">NetworkInterface.GetIsNetworkAvailable方法<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>可以获取网络可用性</p><p>其中还有GetAllNetworkInterfaces()方法，返回NetworkInterface[]对象数组</p><p>根据查询途中遇到的文档示例：NetworkInterface[] -&gt; NetworkInterface-&gt; IPInterfaceProperties</p><p>要获取网络配置，应该是先获取网络接口对象，使用GetIPProperties()方法，返回IPInterfaceProperties对象</p><p>查看<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.ipinterfaceproperties?view=net-10.0">IPInterfaceProperties类<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>文档</p><p>“提供有关支持 Internet 协议版本 4 (IPv4) 或 Internet 协议版本 6(IPv6) 的网络接口的信息。” 很接近我们想要的获取IP了</p><p>示例基本上达成了我们的目的，只需要稍加改动，结合NetworkInterface.GetIPProperties方法下的示例</p><h5 id="邮件部分">邮件部分</h5><p><del>找到<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.mail.smtpclient?view=net-8.0">SmtpClient类<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>和<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.mail.mailmessage?view=net-8.0">MailMessage类<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></del></p><p><del>不过，在SmtpClient类中，文档明确提到“不建议使用SmtpClient类进行新的开发，因为 SmtpClient 不支持许多新式协议。 请改用 MailKit或其他库。”，我先不管他，仍然使用</del></p><p><del>参考示例修改即可</del></p><p>我打算使用Microsoft的邮箱发送，结果看了<a class="link" href="https://learn.microsoft.com/zh-cn/exchange/mail-flow-best-practices/how-to-set-up-a-multifunction-device-or-application-to-send-email-using-microsoft-365-or-office-365">如何设置多功能设备或应用程序以使用Microsoft 365 或 Office 365发送电子邮件<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>才发现，这样子发邮件需要账户密码才行，我不太想这样。</p><p>只能改用MS GraphAPI了，记得里面有Email.Send权限什么的，应该可以。</p><p>看文档<a class="link" href="https://learn.microsoft.com/zh-cn/graph/sdks/choose-authentication-providers?tabs=csharp">根据方案选择MicrosoftGraph 身份验证提供程序<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>看得一头雾水。还是问AI吧。</p><blockquote><p>💎 总结：如何选？</p><ol type="1"><li><strong>你的程序是无后台、由用户触发、代表个人发信吗？</strong> →<strong>授权码流</strong>（方案二）</li><li><strong>你的程序是无人值守服务、定时任务、或需要发信给大量用户吗？</strong>→ <strong>客户端凭据流 + 访问策略锁定邮箱</strong>（方案一）</li><li><strong>你是 SharePoint 扩展或特定微软低代码平台？</strong> →实质也是<strong>授权码流</strong>，但由平台托管登录。</li></ol><p>如果你的场景是<strong>典型的 ASP.NET Core后台服务</strong>，直接套用<strong>客户端凭据流 +访问策略</strong>是最干净、最合规的做法。需要我提供该模式下<strong>配合应用访问策略锁定特定发信邮箱</strong>的PowerShell 脚本示例吗？</p><footer><strong>Deepseek-V3.2</strong></footer></blockquote><p>我只截了一部分，看AI的话，我应该选择方案一，就这样。</p><p>在<a class="link" href="https://learn.microsoft.com/zh-cn/graph/sdks/choose-authentication-providers?tabs=csharp">根据方案选择MicrosoftGraph身份验证提供程序<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>中很容易找到<code>客户端凭据提供程序</code>节。</p><p>邮件发送有<a class="link" href="https://learn.microsoft.com/zh-cn/graph/api/user-sendmail?view=graph-rest-1.0&amp;tabs=csharp">user：sendMail<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>参考文档即可。</p><h4 id="后续更改">后续更改</h4><ul><li><a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkchange?view=net-10.0">NetworkChange类<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：允许应用程序在网络接口 Internet 协议 (IP)地址（也称为网卡或适配器）更改时接收通知</li><li><a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkchange.networkavailabilitychanged?view=net-10.0">NetworkChange.NetworkAvailabilityChanged事件<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>：在网络的可用性更改时发生。</li></ul><h3 id="构想">构想</h3><h4 id="基本实现构想">基本实现构想</h4><pre class="mermaid">graph TD    A[从计划任务启动] --&gt; B1{判断网络连通性}    subgraph 网络        B1 --&gt;|未连接到互联网| C1[等待计划任务再次调用（退出,1）]        B1 --&gt;|连接到互联网| D1[获取网络接口]        D1 --&gt;|遍历接口| E1[获取网络接口属性]        E1 --&gt; F1[获取地址]    end    F1 --&gt; C[组织邮件内容]    C --&gt; C2    subgraph 邮件        C2[填入内容]        B2[初始化graphClient] --&gt; C2["初始化信息邮件(收件人等)"]        C2 --&gt; D2["发送(随后退出,0)"]    end</pre><h3 id="写代码配置">写代码&amp;配置</h3><h4 id="程序">程序</h4><p>添加<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/azure.identity">Azure.Identity包<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>和<a class="link" href="https://github.com/microsoftgraph/msgraph-sdk-dotnet">Microsoft.Graph包<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p>这里采用了四个示例，分别复制自<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.networkinterface.getipproperties?view=net-10.0">GetIPProperties方法<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>、<a class="link" href="https://learn.microsoft.com/zh-cn/dotnet/api/system.net.networkinformation.ipinterfaceproperties?view=net-10.0">IPInterfaceProperties类<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>、<a class="link" href="https://learn.microsoft.com/zh-cn/graph/sdks/choose-authentication-providers?tabs=csharp#using-a-client-secret">客户端凭据提供程序<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>和<a class="link" href="https://learn.microsoft.com/zh-cn/graph/api/user-sendmail?view=graph-rest-1.0&amp;tabs=csharp#example-1-send-a-new-email-using-json-format">使用JSON 格式发送新电子邮件<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><p><em>Rider帮我在组织邮件内容时提示了<code>Environment.NewLine</code>挺好的，原来还有这个东西，学习了。</em></p><blockquote><p>不过据AI(DS)所说 SMTP 协议标准（以及 Microsoft Graph 邮件API）通常要求换行符为 \r\n</p></blockquote><p>根据AI询问，我选择这里使用StringBuilder来组织字符串内容，然后Append中手动使用\r\n</p><p>最后代码如下：</p><div class="code-container" data-rel="C#"><figure class="iseeu 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><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">using</span> System.Net.NetworkInformation;</span><br><span class="line"><span class="keyword">using</span> System.Text;</span><br><span class="line"><span class="keyword">using</span> Azure.Identity;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Graph;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Graph.Models;</span><br><span class="line"><span class="keyword">using</span> Microsoft.Graph.Users.Item.SendMail;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">static</span> <span class="built_in">string</span> <span class="title">GetEmailContent</span>()</span></span><br><span class="line">{</span><br><span class="line">    <span class="keyword">var</span> sb = <span class="keyword">new</span> StringBuilder();</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 获取全部的网络接口，进行遍历</span></span><br><span class="line">    NetworkInterface[] nics = NetworkInterface.GetAllNetworkInterfaces();</span><br><span class="line">    <span class="keyword">foreach</span> (NetworkInterface adapter <span class="keyword">in</span> nics)</span><br><span class="line">    {</span><br><span class="line">        <span class="comment">// 滤除既不支持v4也不支持v6的接口</span></span><br><span class="line">        <span class="keyword">if</span> (!(adapter.Supports(NetworkInterfaceComponent.IPv4) ||  adapter.Supports(NetworkInterfaceComponent.IPv6)))</span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">continue</span>;</span><br><span class="line">        }</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 添加接口信息</span></span><br><span class="line">        sb.Append(adapter.Description + <span class="string">"\r\n"</span>);</span><br><span class="line">        sb.Append(String.Empty.PadLeft(adapter.Description.Length,<span class="string">'='</span>) + <span class="string">"\r\n"</span>);</span><br><span class="line"></span><br><span class="line">        <span class="comment">// 获得接口属性信息，遍历添加多播和单播IP地址</span></span><br><span class="line">        IPInterfaceProperties adapterProperties = adapter.GetIPProperties();</span><br><span class="line">        MulticastIPAddressInformationCollection multiCast = adapterProperties.MulticastAddresses;</span><br><span class="line">        <span class="keyword">if</span> (multiCast != <span class="literal">null</span>)</span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">foreach</span> (MulticastIPAddressInformation multi <span class="keyword">in</span> multiCast)</span><br><span class="line">            { </span><br><span class="line">                sb.Append(<span class="string">$"  Multicast Address ....................... : <span class="subst">{multi.Address}</span> "</span> + <span class="string">"\r\n"</span>);</span><br><span class="line">            }</span><br><span class="line">            sb.Append(<span class="string">"\r\n"</span>);</span><br><span class="line">        }</span><br><span class="line">        UnicastIPAddressInformationCollection uniCast = adapterProperties.UnicastAddresses;</span><br><span class="line">        <span class="keyword">if</span> (uniCast != <span class="literal">null</span>)</span><br><span class="line">        {</span><br><span class="line">            <span class="keyword">foreach</span> (UnicastIPAddressInformation uni <span class="keyword">in</span> uniCast) </span><br><span class="line">            {</span><br><span class="line">                sb.Append(<span class="string">$"  Unicast Address ....................... : <span class="subst">{uni.Address}</span> "</span> + <span class="string">"\r\n"</span>);</span><br><span class="line">            }</span><br><span class="line">            sb.Append(<span class="string">"\r\n"</span>);</span><br><span class="line">        }</span><br><span class="line">    }</span><br><span class="line"></span><br><span class="line">    <span class="comment">// StringBuilder不是String</span></span><br><span class="line">    <span class="keyword">return</span> sb.ToString();</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">async</span> Task <span class="title">SendEmailByGraphApi</span>(<span class="params"><span class="built_in">string</span> content</span>)</span></span><br><span class="line">{</span><br><span class="line">    <span class="comment">// 一些Graph客户端的基本设置</span></span><br><span class="line">    <span class="keyword">var</span> scopes = <span class="keyword">new</span>[] { <span class="string">"https://graph.microsoft.com/.default"</span> };</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> clientId = <span class="string">"YOUR_CLIENT_ID"</span>;</span><br><span class="line">    <span class="keyword">var</span> tenantId = <span class="string">"YOUR_TENANT_ID"</span>;</span><br><span class="line">    <span class="keyword">var</span> clientSecret = <span class="string">"YOUR_CLIENT_SECRET"</span>;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> options = <span class="keyword">new</span> ClientSecretCredentialOptions</span><br><span class="line">    {</span><br><span class="line">        AuthorityHost = AzureAuthorityHosts.AzurePublicCloud,</span><br><span class="line">    };</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> clientSecretCredential = <span class="keyword">new</span> ClientSecretCredential(</span><br><span class="line">        tenantId, clientId, clientSecret, options);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">var</span> graphClient = <span class="keyword">new</span> GraphServiceClient(clientSecretCredential, scopes);</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 组织邮件</span></span><br><span class="line">    <span class="keyword">var</span> requestBody = <span class="keyword">new</span> SendMailPostRequestBody</span><br><span class="line">    {</span><br><span class="line">        Message = <span class="keyword">new</span> Message</span><br><span class="line">        {</span><br><span class="line">            Subject = <span class="string">"IP"</span>,</span><br><span class="line">            Body = <span class="keyword">new</span> ItemBody</span><br><span class="line">            {</span><br><span class="line">                ContentType = BodyType.Text,</span><br><span class="line">                Content = content,</span><br><span class="line">            },</span><br><span class="line">            ToRecipients = <span class="keyword">new</span> List&lt;Recipient&gt;</span><br><span class="line">            {</span><br><span class="line">                <span class="keyword">new</span> Recipient</span><br><span class="line">                {</span><br><span class="line">                    EmailAddress = <span class="keyword">new</span> EmailAddress</span><br><span class="line">                    {</span><br><span class="line">                        Address = <span class="string">"frannis@contoso.com"</span>,</span><br><span class="line">                    },</span><br><span class="line">                },</span><br><span class="line">            },</span><br><span class="line">        },</span><br><span class="line">        SaveToSentItems = <span class="literal">false</span>,</span><br><span class="line">    };</span><br><span class="line"></span><br><span class="line">    <span class="comment">// 非登录应用程序调用不能用Me方法，在示例踩坑了</span></span><br><span class="line">    <span class="keyword">await</span> graphClient.Users[<span class="string">"sender@contoso.com"</span>].SendMail.PostAsync(requestBody);</span><br><span class="line">}</span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (!NetworkInterface.GetIsNetworkAvailable())</span><br><span class="line">    <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">string</span> content = GetEmailContent();</span><br><span class="line"><span class="keyword">await</span> SendEmailByGraphApi(content);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br></pre></td></tr></table></figure></div><h4 id="graph应用程序">Graph应用程序</h4><p>登录<a class="link" href="https://portal.azure.com/">AzurePortal<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>，找到应用注册，注册<code>EmailSender</code>应用程序</p><p>配置中找到<code>API 权限</code>。 添加权限-&gt;MicrosoftGraph-&gt;应用程序权限-&gt;<code>Mail.Send</code>-&gt;添加权限</p><p>我自己用的，这里就直接<code>代表授予管理员同意</code></p><p>然后在应用程序概述中，复制<code>clientId</code>和<code>tenantId</code>(应用程序(客户端)ID 和 目录(租户)ID)，写到<code>YOUR_CLIENT_ID</code>和<code>YOUR_TENANT_ID</code></p><p>然后转到<code>证书和密码</code>，选择<code>新客户端密码</code>，添加一个，然后复制值，写到<code>YOUR_CLIENT_SECRET</code></p><div class="callout callout--titled default mb-4 rounded-small shadow-redefine-flat bg-(--callout-bg-color) p-3 pl-1 relative flex flex-row gap-2"><div role="none" class="rounded-full self-stretch w-0.5 bg-(--callout-primary-color) shrink-0 opacity-60"></div><div class="flex flex-col gap-2"><div class="callout__title flex items-center gap-2 font-semibold tracking-tight"><i class="callout__icon fa-solid fa-info leading-none text-(--callout-primary-color) text-sm shrink-0"></i> 信息</div><div class="callout__content markdown-body flex-1 min-w-0"><p>记得妥善保管，因为值内容仅在初次创建时显示。</p></div></div></div><h2 id="基本功能完成">基本功能完成</h2><p><del><em>有关后续的改进，等我想写了再写吧；感谢Rider的支持</em></del></p><h2 id="其他">其他</h2><p>主要参考了微软的文档（主要就是那些示例），并有的时候询问了AI(Deepseek)。</p><p>主要问了：</p><ul><li>网络连通性判断</li><li>Microsoft365 使用 Graph API 发送邮件可以使用哪些身份认证方式</li><li>一些错误的修复</li></ul>]]></content>
    
    
    <summary type="html">记述起于2026-01-31的一件事，作为练手和实际需求编写的小软件。</summary>
    
    
    
    <category term="灌水" scheme="https://misaka10548.github.io/categories/%E7%81%8C%E6%B0%B4/"/>
    
    
    <category term="水" scheme="https://misaka10548.github.io/tags/%E6%B0%B4/"/>
    
    <category term="C#" scheme="https://misaka10548.github.io/tags/C/"/>
    
    <category term="邮件" scheme="https://misaka10548.github.io/tags/%E9%82%AE%E4%BB%B6/"/>
    
    <category term="Microsoft Graph API" scheme="https://misaka10548.github.io/tags/Microsoft-Graph-API/"/>
    
    <category term="Microsoft 365" scheme="https://misaka10548.github.io/tags/Microsoft-365/"/>
    
  </entry>
  
  <entry>
    <title>Hello World</title>
    <link href="https://misaka10548.github.io/post/2025/12/06/4a17b156/"/>
    <id>https://misaka10548.github.io/post/2025/12/06/4a17b156/</id>
    <published>2025-12-06T07:46:45.000Z</published>
    <updated>2025-12-14T12:33:04.000Z</updated>
    
    <content type="html"><![CDATA[<p>Welcome to <a class="link" href="https://hexo.io/">Hexo<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>! This is your veryfirst post. Check <a class="link" href="https://hexo.io/docs/">documentation<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> formore info. If you get any problems when using Hexo, you can find theanswer in <a class="link" href="https://hexo.io/docs/troubleshooting.html">troubleshooting<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a> oryou can ask me on <a class="link" href="https://github.com/hexojs/hexo/issues">GitHub<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a>.</p><h2 id="quick-start">Quick Start</h2><h3 id="create-a-new-post">Create a new post</h3><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo new <span class="string">"My New Post"</span></span><br></pre></td></tr></table></figure></div><p>More info: <a class="link" href="https://hexo.io/docs/writing.html">Writing<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h3 id="run-server">Run server</h3><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo server</span><br></pre></td></tr></table></figure></div><p>More info: <a class="link" href="https://hexo.io/docs/server.html">Server<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h3 id="generate-static-files">Generate static files</h3><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo generate</span><br></pre></td></tr></table></figure></div><p>More info: <a class="link" href="https://hexo.io/docs/generating.html">Generating<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h3 id="deploy-to-remote-sites">Deploy to remote sites</h3><div class="code-container" data-rel="Bash"><figure class="iseeu highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">hexo deploy</span><br></pre></td></tr></table></figure></div><p>More info: <a class="link" href="https://hexo.io/docs/one-command-deployment.html">Deployment<i class="fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.7em] link-icon"></i></a></p><h2 id="test">Test</h2><p><span class="math display"><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -9.28ex;" xmlns="http://www.w3.org/2000/svg" width="25.564ex" height="19.691ex" role="img" focusable="false" viewBox="0 -4601.8 11299.2 8703.6"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mtable"><g data-mml-node="mtr" transform="translate(0,3483.8)"><g data-mml-node="mtd" transform="translate(500,0)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mo" transform="translate(1055.2,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1555.4,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z"></path></g><g data-mml-node="mo" transform="translate(471.8,269) translate(-250 0)"><path data-c="20D7" d="M377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(2819.4,0)"><g data-mml-node="mi"></g><g data-mml-node="mo" transform="translate(277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mfrac" transform="translate(1333.6,0)"><g data-mml-node="mi" transform="translate(382.8,676)"><path data-c="1D70C" d="M58 -216Q25 -216 23 -186Q23 -176 73 26T127 234Q143 289 182 341Q252 427 341 441Q343 441 349 441T359 442Q432 442 471 394T510 276Q510 219 486 165T425 74T345 13T266 -10H255H248Q197 -10 165 35L160 41L133 -71Q108 -168 104 -181T92 -202Q76 -216 58 -216ZM424 322Q424 359 407 382T357 405Q322 405 287 376T231 300Q217 269 193 170L176 102Q193 26 260 26Q298 26 334 62Q367 92 389 158T418 266T424 322Z"></path></g><g data-mml-node="msub" transform="translate(220,-686)"><g data-mml-node="mi"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z"></path></g><g data-mml-node="mn" transform="translate(439,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g><rect width="1042.6" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,1246.2)"><g data-mml-node="mtd" transform="translate(505,0)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mo" transform="translate(1055.2,0)"><path data-c="22C5" d="M78 250Q78 274 95 292T138 310Q162 310 180 294T199 251Q199 226 182 208T139 190T96 207T78 250Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(1555.4,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"></path></g><g data-mml-node="mo" transform="translate(462.8,272) translate(-250 0)"><path data-c="20D7" d="M377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(2819.4,0)"><g data-mml-node="mi"></g><g data-mml-node="mo" transform="translate(277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mn" transform="translate(1333.6,0)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g></g><g data-mml-node="mtr" transform="translate(0,-694.8)"><g data-mml-node="mtd"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mo" transform="translate(1055.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2055.4,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z"></path></g><g data-mml-node="mo" transform="translate(471.8,269) translate(-250 0)"><path data-c="20D7" d="M377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(2819.4,0)"><g data-mml-node="mi"></g><g data-mml-node="mo" transform="translate(277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(1333.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mfrac" transform="translate(2111.6,0)"><g data-mml-node="mrow" transform="translate(220,676)"><g data-mml-node="mi"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mi" transform="translate(566,0)"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"></path></g></g><g data-mml-node="mrow" transform="translate(419,-686)"><g data-mml-node="mi"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mi" transform="translate(566,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g><rect width="1525" height="60" x="120" y="220"></rect></g></g></g><g data-mml-node="mtr" transform="translate(0,-3152.3)"><g data-mml-node="mtd" transform="translate(5,0)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mo" transform="translate(1055.2,0)"><path data-c="D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(2055.4,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D435" d="M231 637Q204 637 199 638T194 649Q194 676 205 682Q206 683 335 683Q594 683 608 681Q671 671 713 636T756 544Q756 480 698 429T565 360L555 357Q619 348 660 311T702 219Q702 146 630 78T453 1Q446 0 242 0Q42 0 39 2Q35 5 35 10Q35 17 37 24Q42 43 47 45Q51 46 62 46H68Q95 46 128 49Q142 52 147 61Q150 65 219 339T288 628Q288 635 231 637ZM649 544Q649 574 634 600T585 634Q578 636 493 637Q473 637 451 637T416 636H403Q388 635 384 626Q382 622 352 506Q352 503 351 500L320 374H401Q482 374 494 376Q554 386 601 434T649 544ZM595 229Q595 273 572 302T512 336Q506 337 429 337Q311 337 310 336Q310 334 293 263T258 122L240 52Q240 48 252 48T333 46Q422 46 429 47Q491 54 543 105T595 229Z"></path></g><g data-mml-node="mo" transform="translate(462.8,272) translate(-250 0)"><path data-c="20D7" d="M377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694Z"></path></g></g></g></g><g data-mml-node="mtd" transform="translate(2819.4,0)"><g data-mml-node="mi"></g><g data-mml-node="mo" transform="translate(277.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="msub" transform="translate(1333.6,0)"><g data-mml-node="mi"><path data-c="1D707" d="M58 -216Q44 -216 34 -208T23 -186Q23 -176 96 116T173 414Q186 442 219 442Q231 441 239 435T249 423T251 413Q251 401 220 279T187 142Q185 131 185 107V99Q185 26 252 26Q261 26 270 27T287 31T302 38T315 45T327 55T338 65T348 77T356 88T365 100L372 110L408 253Q444 395 448 404Q461 431 491 431Q504 431 512 424T523 412T525 402L449 84Q448 79 448 68Q448 43 455 35T476 26Q485 27 496 35Q517 55 537 131Q543 151 547 152Q549 153 557 153H561Q580 153 580 144Q580 138 575 117T555 63T523 13Q510 0 491 -8Q483 -10 467 -10Q446 -10 429 -4T402 11T385 29T376 44T374 51L368 45Q362 39 350 30T324 12T288 -4T246 -11Q199 -11 153 12L129 -85Q108 -167 104 -180T92 -202Q76 -216 58 -216Z"></path></g><g data-mml-node="mn" transform="translate(636,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g><g data-mml-node="mrow" transform="translate(2539.8,0)"><g data-mml-node="mo" transform="translate(0 -0.5)"><path data-c="28" d="M701 -940Q701 -943 695 -949H664Q662 -947 636 -922T591 -879T537 -818T475 -737T412 -636T350 -511T295 -362T250 -186T221 17T209 251Q209 962 573 1361Q596 1386 616 1405T649 1437T664 1450H695Q701 1444 701 1441Q701 1436 681 1415T629 1356T557 1261T476 1118T400 927T340 675T308 359Q306 321 306 250Q306 -139 400 -430T690 -924Q701 -936 701 -940Z"></path></g><g data-mml-node="TeXAtom" data-mjx-texclass="ORD" transform="translate(736,0)"><g data-mml-node="mover"><g data-mml-node="mi"><path data-c="1D43D" d="M447 625Q447 637 354 637H329Q323 642 323 645T325 664Q329 677 335 683H352Q393 681 498 681Q541 681 568 681T605 682T619 682Q633 682 633 672Q633 670 630 658Q626 642 623 640T604 637Q552 637 545 623Q541 610 483 376Q420 128 419 127Q397 64 333 21T195 -22Q137 -22 97 8T57 88Q57 130 80 152T132 174Q177 174 182 130Q182 98 164 80T123 56Q115 54 115 53T122 44Q148 15 197 15Q235 15 271 47T324 130Q328 142 387 380T447 625Z"></path></g><g data-mml-node="mo" transform="translate(503,272) translate(-250 0)"><path data-c="20D7" d="M377 694Q377 702 382 708T397 714Q404 714 409 709Q414 705 419 690Q429 653 460 633Q471 626 471 615Q471 606 468 603T454 594Q411 572 379 531Q377 529 374 525T369 519T364 517T357 516Q350 516 344 521T337 536Q337 555 384 595H213L42 596Q29 605 29 615Q29 622 42 635H401Q377 673 377 694Z"></path></g></g></g><g data-mml-node="mo" transform="translate(1591.2,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="msub" transform="translate(2591.4,0)"><g data-mml-node="mi"><path data-c="1D716" d="M227 -11Q149 -11 95 41T40 174Q40 262 87 322Q121 367 173 396T287 430Q289 431 329 431H367Q382 426 382 411Q382 385 341 385H325H312Q191 385 154 277L150 265H327Q340 256 340 246Q340 228 320 219H138V217Q128 187 128 143Q128 77 160 52T231 26Q258 26 284 36T326 57T343 68Q350 68 354 58T358 39Q358 36 357 35Q354 31 337 21T289 0T227 -11Z"></path></g><g data-mml-node="mn" transform="translate(439,-150) scale(0.707)"><path data-c="30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"></path></g></g><g data-mml-node="mfrac" transform="translate(3434,0)"><g data-mml-node="mrow" transform="translate(220,676)"><g data-mml-node="mi"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mi" transform="translate(566,0)"><path data-c="1D438" d="M492 213Q472 213 472 226Q472 230 477 250T482 285Q482 316 461 323T364 330H312Q311 328 277 192T243 52Q243 48 254 48T334 46Q428 46 458 48T518 61Q567 77 599 117T670 248Q680 270 683 272Q690 274 698 274Q718 274 718 261Q613 7 608 2Q605 0 322 0H133Q31 0 31 11Q31 13 34 25Q38 41 42 43T65 46Q92 46 125 49Q139 52 144 61Q146 66 215 342T285 622Q285 629 281 629Q273 632 228 634H197Q191 640 191 642T193 659Q197 676 203 680H757Q764 676 764 669Q764 664 751 557T737 447Q735 440 717 440H705Q698 445 698 453L701 476Q704 500 704 528Q704 558 697 578T678 609T643 625T596 632T532 634H485Q397 633 392 631Q388 629 386 622Q385 619 355 499T324 377Q347 376 372 376H398Q464 376 489 391T534 472Q538 488 540 490T557 493Q562 493 565 493T570 492T572 491T574 487T577 483L544 351Q511 218 508 216Q505 213 492 213Z"></path></g></g><g data-mml-node="mrow" transform="translate(421.5,-686)"><g data-mml-node="mi"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mi" transform="translate(566,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g><rect width="1530" height="60" x="120" y="220"></rect></g><g data-mml-node="mo" transform="translate(5204,0) translate(0 -0.5)"><path data-c="29" d="M34 1438Q34 1446 37 1448T50 1450H56H71Q73 1448 99 1423T144 1380T198 1319T260 1238T323 1137T385 1013T440 864T485 688T514 485T526 251Q526 134 519 53Q472 -519 162 -860Q139 -885 119 -904T86 -936T71 -949H56Q43 -949 39 -947T34 -937Q88 -883 140 -813Q428 -430 428 251Q428 453 402 628T338 922T245 1146T145 1309T46 1425Q44 1427 42 1429T39 1433T36 1436L34 1438Z"></path></g></g></g></g></g></g></g></svg></mjx-container></span></p><p><span class="math display"><mjx-container class="MathJax" jax="SVG" display="true"><svg style="vertical-align: -1.602ex;" xmlns="http://www.w3.org/2000/svg" width="25.832ex" height="5.018ex" role="img" focusable="false" viewBox="0 -1509.9 11417.6 2217.9"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="scale(1,-1)"><g data-mml-node="math"><g data-mml-node="mi"><path data-c="1D456" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"></path></g><g data-mml-node="mi" transform="translate(345,0)"><path data-c="210F" d="M182 599Q182 611 174 615T133 619Q118 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 295 644T282 597Q282 592 360 592H399Q430 592 445 587T460 563Q460 552 451 541L442 535H266L251 468Q247 453 243 436T236 409T233 399Q233 395 244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26L166 530Q166 534 161 534T129 535Q127 535 122 535T112 534Q74 534 74 562Q74 570 77 576T84 585T96 589T109 591T124 592T138 592L182 595V599Z"></path></g><g data-mml-node="mfrac" transform="translate(907,0)"><g data-mml-node="mi" transform="translate(400.5,676)"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mrow" transform="translate(220,-686)"><g data-mml-node="mi"><path data-c="1D715" d="M202 508Q179 508 169 520T158 547Q158 557 164 577T185 624T230 675T301 710L333 715H345Q378 715 384 714Q447 703 489 661T549 568T566 457Q566 362 519 240T402 53Q321 -22 223 -22Q123 -22 73 56Q42 102 42 148V159Q42 276 129 370T322 465Q383 465 414 434T455 367L458 378Q478 461 478 515Q478 603 437 639T344 676Q266 676 223 612Q264 606 264 572Q264 547 246 528T202 508ZM430 306Q430 372 401 400T333 428Q270 428 222 382Q197 354 183 323T150 221Q132 149 132 116Q132 21 232 21Q244 21 250 22Q327 35 374 112Q389 137 409 196T430 306Z"></path></g><g data-mml-node="mi" transform="translate(566,0)"><path data-c="1D461" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"></path></g></g><rect width="1127" height="60" x="120" y="220"></rect></g><g data-mml-node="mi" transform="translate(2274,0)"><path data-c="1D713" d="M161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Z"></path></g><g data-mml-node="mo" transform="translate(3202.8,0)"><path data-c="3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"></path></g><g data-mml-node="mo" transform="translate(4258.6,0)"><path data-c="2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"></path></g><g data-mml-node="mfrac" transform="translate(5036.6,0)"><g data-mml-node="msup" transform="translate(384.2,676)"><g data-mml-node="mi"><path data-c="210F" d="M182 599Q182 611 174 615T133 619Q118 619 114 621T109 630Q109 636 114 656T122 681Q125 685 202 688Q272 695 286 695Q304 695 304 684Q304 682 295 644T282 597Q282 592 360 592H399Q430 592 445 587T460 563Q460 552 451 541L442 535H266L251 468Q247 453 243 436T236 409T233 399Q233 395 244 404Q295 441 357 441Q405 441 445 417T485 333Q485 284 449 178T412 58T426 44Q447 44 466 68Q485 87 500 130L509 152H531H543Q562 152 562 144Q562 128 546 93T494 23T415 -13Q385 -13 359 3T322 44Q318 52 318 77Q318 99 352 196T386 337Q386 386 346 386Q318 386 286 370Q267 361 245 338T211 292Q207 287 193 235T162 113T138 21Q128 7 122 4Q105 -12 83 -12Q66 -12 54 -2T42 26L166 530Q166 534 161 534T129 535Q127 535 122 535T112 534Q74 534 74 562Q74 570 77 576T84 585T96 589T109 591T124 592T138 592L182 595V599Z"></path></g><g data-mml-node="mn" transform="translate(646.1,363) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mrow" transform="translate(220,-686)"><g data-mml-node="mn"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g><g data-mml-node="mi" transform="translate(500,0)"><path data-c="1D45A" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"></path></g></g><rect width="1578" height="60" x="120" y="220"></rect></g><g data-mml-node="msup" transform="translate(6854.6,0)"><g data-mml-node="mi"><path data-c="2207" d="M46 676Q46 679 51 683H781Q786 679 786 676Q786 674 617 326T444 -26Q439 -33 416 -33T388 -26Q385 -22 216 326T46 676ZM697 596Q697 597 445 597T193 596Q195 591 319 336T445 80L697 596Z"></path></g><g data-mml-node="mn" transform="translate(866,413) scale(0.707)"><path data-c="32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"></path></g></g><g data-mml-node="mi" transform="translate(8124.1,0)"><path data-c="1D713" d="M161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Z"></path></g><g data-mml-node="mo" transform="translate(8997.3,0)"><path data-c="2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"></path></g><g data-mml-node="mi" transform="translate(9997.6,0)"><path data-c="1D449" d="M52 648Q52 670 65 683H76Q118 680 181 680Q299 680 320 683H330Q336 677 336 674T334 656Q329 641 325 637H304Q282 635 274 635Q245 630 242 620Q242 618 271 369T301 118L374 235Q447 352 520 471T595 594Q599 601 599 609Q599 633 555 637Q537 637 537 648Q537 649 539 661Q542 675 545 679T558 683Q560 683 570 683T604 682T668 681Q737 681 755 683H762Q769 676 769 672Q769 655 760 640Q757 637 743 637Q730 636 719 635T698 630T682 623T670 615T660 608T652 599T645 592L452 282Q272 -9 266 -16Q263 -18 259 -21L241 -22H234Q216 -22 216 -15Q213 -9 177 305Q139 623 138 626Q133 637 76 637H59Q52 642 52 648Z"></path></g><g data-mml-node="mi" transform="translate(10766.6,0)"><path data-c="1D713" d="M161 441Q202 441 226 417T250 358Q250 338 218 252T187 127Q190 85 214 61Q235 43 257 37Q275 29 288 29H289L371 360Q455 691 456 692Q459 694 472 694Q492 694 492 687Q492 678 411 356Q329 28 329 27T335 26Q421 26 498 114T576 278Q576 302 568 319T550 343T532 361T524 384Q524 405 541 424T583 443Q602 443 618 425T634 366Q634 337 623 288T605 220Q573 125 492 57T329 -11H319L296 -104Q272 -198 272 -199Q270 -205 252 -205H239Q233 -199 233 -197Q233 -192 256 -102T279 -9Q272 -8 265 -8Q106 14 106 139Q106 174 139 264T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Q21 299 34 333T82 404T161 441Z"></path></g></g></g></svg></mjx-container></span></p><p><span class="math inline"><em>f</em>(<em>x</em>) = ∫<sub>−∞</sub><sup>∞</sup><em>f̂</em>(<em>x</em>)<em>ξ</em> <em>e</em><sup>2<em>π</em><em>i</em><em>ξ</em><em>x</em></sup> d<em>ξ</em></span></p><pre class="mermaid">sequenceDiagram    participant Alice    participant John    Alice-&gt;&gt;John: Hello John, how are you?    John-&gt;&gt;Alice: Fine, thanks, and you?    Alice-&gt;&gt;John: I'm fine, too.</pre>]]></content>
    
    
      
      
    <summary type="html">&lt;p&gt;Welcome to &lt;a class=&quot;link&quot; href=&quot;https://hexo.io/&quot;&gt;Hexo&lt;i class=&quot;fa-solid fa-arrow-up-right ml-[0.2em] font-light align-text-top text-[0.</summary>
      
    
    
    
    
  </entry>
  
</feed>
