<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Carm&apos;s Home</title>
    <link>https://www.carm.cc</link>
    <description>Carm&apos;s Home。卡姆的个人主页，展示我的技术栈、项目经验和设计作品。</description>
    <language>zh</language>
    <lastBuildDate>Mon, 25 May 2026 07:58:59 GMT</lastBuildDate>
    <atom:link href="https://www.carm.cc/feed/index.xml" rel="self" type="application/rss+xml"/>
    <generator>homesite RSS generator</generator>
    <webMaster>carm@carm.cc</webMaster>
    <copyright>2014-2026 © CarmJos, All rights reserved.</copyright>

    <item>
      <title>把子目录拆成独立项目的同时保留GIT历史提交信息</title>
      <link>https://pages.carm.cc/dev/extract-subdir-to-project</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/extract-subdir-to-project</guid>
      <pubDate>Tue, 12 May 2026 11:30:00 GMT</pubDate>
      <description><![CDATA[介绍如何使用 git format-patch 和 git am 将子目录拆分成独立项目，同时保留完整的 Git 历史提交记录。]]></description>
      <content:encoded><![CDATA[<h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>在我的日常开发或课程项目中，我常常会把相关联的多个模块放在一个总仓库里来方便开发和推进。<br>例如在我的 Java 课程作业仓库 (<a href="https://github.com/CarmJos/java-courseworks">java-courseworks</a>) 里，除了有一些单独的课程作业目录外，<br>还有一个 <code>practicum</code> 目录，里面是一个完整的学生管理系统实训项目。<br>在完成后续的维护和展示过程中，我发现把实训项目和课程作业放在一起，虽然方便了初期的开发，但随着时间推移，出现了一些问题：</p><ol><li><strong>记录复杂</strong>：查看 <code>practicum</code> 相关改动时会被其它目录提交干扰。</li><li><strong>边界模糊</strong>：实训项目与课程作业是两类资产，其实并不适合放在一起。</li><li><strong>发布困难</strong>：在其他大型项目中，一个模块想独立维护、打包、发布时，会受父仓库结构影响。</li><li><strong>演示麻烦</strong>：给他人演示时，单独仓库更易理解与上手。</li></ol><p>因此，本次我们将要一步步实现：</p><ul><li>将 <code>practicum</code> 拆到新目录并初始化独立 Git 仓库；</li><li>复原指定区间的历史提交（包含提交信息与时间）；</li><li>解除对父 POM 的依赖，使其可独立构建；</li><li>配置独立远程仓库地址并推送到 GitHub 。</li></ul><h2 id="开始操作"><a href="#开始操作" class="headerlink" title="开始操作"></a>开始操作</h2><p>迁移前务必做好以下准备：</p><ol><li><strong>确认源仓库工作区干净</strong>（避免混入无关改动）。</li><li><strong>确认目标目录不存在或可安全覆盖</strong>。</li><li><strong>确认提交区间正确</strong>（尤其是起止 commit）。</li><li><strong>准备本地工具</strong>：Git。</li></ol><h3 id="Step-1：从源仓库导出指定区间的补丁"><a href="#Step-1：从源仓库导出指定区间的补丁" class="headerlink" title="Step 1：从源仓库导出指定区间的补丁"></a>Step 1：从源仓库导出指定区间的补丁</h3><p>我们需要先从源仓库导出仅 <code>practicum</code> 路径的补丁文件（保留提交顺序和元信息）。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$patchDir</span> = <span class="string">&quot;D:\@DEV\java-courseworks\.tmp_patches&quot;</span></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">Test-Path</span> <span class="variable">$patchDir</span>) &#123; <span class="built_in">Remove-Item</span> <span class="variable">$patchDir</span> <span class="literal">-Recurse</span> <span class="literal">-Force</span> &#125;</span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Path</span> <span class="variable">$patchDir</span> | <span class="built_in">Out-Null</span></span><br><span class="line"></span><br><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\java-courseworks&quot;</span> <span class="literal">--no-pager</span> <span class="built_in">format-patch</span> <span class="literal">--binary</span> <span class="literal">--output-directory</span> <span class="variable">$patchDir</span> <span class="number">7</span>b47ec1755525f05cd76683215dad5ed3585fe6d^..<span class="number">1</span>effd2672b9a396db04668c0b1d9d89043f1aacd <span class="literal">--</span> practicum</span><br></pre></td></tr></table></figure><blockquote><p>注意：这里的文件目录路径 <code>D:\@DEV\java-courseworks</code>、子目录名称 <code>practicum</code> 与 commit 区间均为示例，请根据实际情况替换为所需要数值。</p></blockquote><p>其中，</p><ul><li><code>format-patch</code> 会按提交生成补丁，保留作者、时间、提交说明；</li><li><code>--binary</code> 确保图片等二进制文件也可迁移；</li><li><code>-- &lt;子目录名称&gt;</code> 只提取目标子目录相关改动。</li></ul><h3 id="Step-2：创建独立仓库目录并初始化-Git"><a href="#Step-2：创建独立仓库目录并初始化-Git" class="headerlink" title="Step 2：创建独立仓库目录并初始化 Git"></a>Step 2：创建独立仓库目录并初始化 Git</h3><p>这里我选择在原仓库同级目录下创建 <code>StudentUI</code> 目录作为新仓库，并初始化 Git：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$target</span> = <span class="string">&quot;D:\@DEV\StudentUI&quot;</span></span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Path</span> <span class="variable">$target</span> <span class="literal">-Force</span> | <span class="built_in">Out-Null</span></span><br><span class="line">git <span class="literal">-C</span> <span class="variable">$target</span> init</span><br></pre></td></tr></table></figure><h3 id="Step-3：回放补丁并去掉子目录前缀"><a href="#Step-3：回放补丁并去掉子目录前缀" class="headerlink" title="Step 3：回放补丁并去掉子目录前缀"></a>Step 3：回放补丁并去掉子目录前缀</h3><p>由于目标仓库希望将 <code>practicum</code> 内容作为根目录，需要把路径前缀剥离。这里使用 <code>git am -p2</code>：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$patches</span> = <span class="built_in">Get-ChildItem</span> <span class="string">&quot;D:\@DEV\java-courseworks\.tmp_patches\*.patch&quot;</span> | <span class="built_in">Sort-Object</span> Name | <span class="built_in">Select-Object</span> <span class="literal">-ExpandProperty</span> FullName</span><br><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> am <span class="literal">-p2</span> <span class="literal">--committer-date-is-author-date</span> <span class="variable">$patches</span></span><br></pre></td></tr></table></figure><p>其中，</p><ul><li><code>-p2</code>：将 <code>a/practicum/...</code> 或 <code>b/practicum/...</code> 裁剪成 <code>...</code>；</li><li><code>--committer-date-is-author-date</code>：使提交时间与作者时间保持一致，最大化还原历史。</li></ul><h3 id="Step-4：迁移后处理"><a href="#Step-4：迁移后处理" class="headerlink" title="Step 4：迁移后处理"></a>Step 4：迁移后处理</h3><p>此时已经成功迁移了历史提交，剩下的就是针对实际情况的一些后续处理了。</p><p>在本项目中，<code>StudentUI</code> 的 <code>pom.xml</code> 需要从“子模块”改为“独立项目”，简单修改一下 <code>pom.xml</code> 即可。</p><h3 id="Step-5：配置新仓库远程地址"><a href="#Step-5：配置新仓库远程地址" class="headerlink" title="Step 5：配置新仓库远程地址"></a>Step 5：配置新仓库远程地址</h3><figure class="highlight powershell"><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">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> remote add origin <span class="string">&quot;https://github.com/CarmJos/StudentUI&quot;</span></span><br><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> <span class="literal">--no-pager</span> remote <span class="literal">-v</span></span><br></pre></td></tr></table></figure><p>若已存在 <code>origin</code>，使用 <code>remote set-url</code> 即可。</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> remote <span class="built_in">set-url</span> origin <span class="string">&quot;https://github.com/CarmJos/StudentUI&quot;</span></span><br></pre></td></tr></table></figure><h3 id="Step-6：验证结果"><a href="#Step-6：验证结果" class="headerlink" title="Step 6：验证结果"></a>Step 6：验证结果</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> <span class="literal">--no-pager</span> log <span class="literal">--oneline</span> <span class="literal">--decorate</span> <span class="literal">--max-count</span>=<span class="number">20</span></span><br><span class="line"></span><br><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> <span class="literal">--no-pager</span> status <span class="literal">--short</span> <span class="literal">--branch</span></span><br></pre></td></tr></table></figure><p>建议比对点：</p><ul><li>提交顺序是否与源区间一致；</li><li>提交时间是否保留；</li><li>图片等资源是否完整；</li></ul><h3 id="Step-7：推送到远程仓库"><a href="#Step-7：推送到远程仓库" class="headerlink" title="Step 7：推送到远程仓库"></a>Step 7：推送到远程仓库</h3><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> push origin HEAD:main</span><br></pre></td></tr></table></figure><p><strong>Done!</strong> 现在 <code>StudentUI</code> 仓库已经成功迁移了 <code>practicum</code> 相关的历史提交，并且可以独立维护了。</p><p>欢迎参观 <a href="https://github.com/CarmJos/StudentUI">StudentUI</a> 仓库，查看我本次迁移后的结果。</p><h2 id="归纳总结"><a href="#归纳总结" class="headerlink" title="归纳总结"></a>归纳总结</h2><p>为了方便后续复用，这里总结一下核心步骤：</p><ol><li><strong>导出补丁</strong>：<code>git format-patch --binary --output-directory &lt;补丁目录&gt; &lt;起始提交&gt;^..&lt;结束提交&gt; -- &lt;子目录&gt;</code></li><li><strong>初始化新仓库</strong>：<code>git init</code></li><li><strong>回放补丁</strong>：<code>git am -p2 --committer-date-is-author-date &lt;补丁目录&gt;/*.patch</code></li><li><strong>配置远程</strong>：<code>git remote add origin &lt;远程地址&gt;</code></li><li><strong>验证</strong>：查看日志、状态，确认历史与资源完整。</li></ol><h3 id="快速脚本"><a href="#快速脚本" class="headerlink" title="快速脚本"></a>快速脚本</h3><p>如果你只要一个可快速复刻的版本，只需替换以下命令中的路径、提交区间和远程地址即可：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br></pre></td><td class="code"><pre><span class="line"><span class="variable">$srcParent</span> = <span class="string">&quot;D:\@DEV\java-courseworks&quot;</span></span><br><span class="line"><span class="variable">$srcDir</span> = <span class="string">&quot;practicum&quot;</span></span><br><span class="line"><span class="variable">$target</span> = <span class="string">&quot;D:\@DEV\StudentUI&quot;</span></span><br><span class="line"><span class="variable">$patchDir</span> = <span class="string">&quot;D:\@DEV\java-courseworks\.tmp_patches&quot;</span></span><br><span class="line"><span class="variable">$remoteUrl</span> = <span class="string">&quot;https://github.com/CarmJos/StudentUI&quot;</span></span><br><span class="line"><span class="variable">$startCommit</span> = <span class="string">&quot;7b47ec1755525f05cd76683215dad5ed3585fe6d&quot;</span></span><br><span class="line"><span class="variable">$endCommit</span> = <span class="string">&quot;1effd2672b9a396db04668c0b1d9d89043f1aacd&quot;</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">if</span> (<span class="built_in">Test-Path</span> <span class="variable">$patchDir</span>) &#123; <span class="built_in">Remove-Item</span> <span class="variable">$patchDir</span> <span class="literal">-Recurse</span> <span class="literal">-Force</span> &#125;</span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Path</span> <span class="variable">$patchDir</span> | <span class="built_in">Out-Null</span></span><br><span class="line"></span><br><span class="line">git <span class="literal">-C</span> <span class="variable">$srcParent</span> <span class="literal">--no-pager</span> <span class="built_in">format-patch</span> <span class="literal">--binary</span> <span class="literal">--output-directory</span> <span class="variable">$patchDir</span> <span class="variable">$startCommit</span>^..<span class="variable">$endComit</span> <span class="literal">--</span> <span class="variable">$srcDir</span></span><br><span class="line"></span><br><span class="line"><span class="built_in">New-Item</span> <span class="literal">-ItemType</span> Directory <span class="literal">-Path</span> <span class="variable">$target</span> <span class="literal">-Force</span> | <span class="built_in">Out-Null</span></span><br><span class="line">git <span class="literal">-C</span> <span class="variable">$target</span> init</span><br><span class="line"></span><br><span class="line"><span class="variable">$patches</span> = <span class="built_in">Get-ChildItem</span> <span class="string">&quot;<span class="variable">$patchDir</span>\*.patch&quot;</span> | <span class="built_in">Sort-Object</span> Name | <span class="built_in">Select-Object</span> <span class="literal">-ExpandProperty</span> FullName</span><br><span class="line">git <span class="literal">-C</span> <span class="variable">$target</span> am <span class="literal">-p2</span> <span class="literal">--committer-date-is-author-date</span> <span class="variable">$patches</span></span><br><span class="line"></span><br><span class="line">git <span class="literal">-C</span> <span class="variable">$target</span> remote add origin <span class="string">&quot;<span class="variable">$remoteUrl</span>&quot;</span></span><br></pre></td></tr></table></figure><blockquote><p>完成后别忘了手动进行后处理，并做一次日志与构建验证。</p></blockquote><p>同时，我还将相关操作整合成了一个可复用的 Python 脚本，方便在类似场景下快速执行，<br>详见 <a href="https://github.com/CarmJos/git-dir-exporter">git-dir-exporter</a> 项目 <em>(欢迎Star~)</em> 。</p><h3 id="FAQ（常见问题）"><a href="#FAQ（常见问题）" class="headerlink" title="FAQ（常见问题）"></a>FAQ（常见问题）</h3><blockquote><p>如果有其他问题，欢迎在评论区留言，我会持续更新这个 FAQ。</p></blockquote><h4 id="Q1：为什么这里选择-git-format-patch-git-am，而不是直接复制目录？"><a href="#Q1：为什么这里选择-git-format-patch-git-am，而不是直接复制目录？" class="headerlink" title="Q1：为什么这里选择 git format-patch + git am，而不是直接复制目录？"></a>Q1：为什么这里选择 <code>git format-patch + git am</code>，而不是直接复制目录？</h4><p><strong>A：</strong> 直接复制目录只能拿到“当前快照”，拿不到历史；<code>format-patch + am</code> 可以逐条回放提交，保留提交说明、作者与时间，更适合教学、审计和后续追踪。</p><h4 id="Q2：为什么不是用-git-subtree-split？"><a href="#Q2：为什么不是用-git-subtree-split？" class="headerlink" title="Q2：为什么不是用 git subtree split？"></a>Q2：为什么不是用 <code>git subtree split</code>？</h4><p><strong>A：</strong> <code>subtree split</code> 也能完成子目录拆分，且会生成仅包含该子目录的新历史分支。本文选择 <code>format-patch + am</code> 的原因是：</p><ul><li>更直观展示“迁移区间”和“提交回放”的过程；</li><li>方便在迁移中插入额外处理（例如路径裁剪、单独补一条 POM 解耦提交）；</li><li>对教学场景更友好，读者容易理解每一步在做什么。</li></ul><p>如果你更偏向“一条命令出结果”，<code>subtree split</code> 也是可选方案。</p><h4 id="Q3：git-am-p2-里的-p2-是怎么确定的？"><a href="#Q3：git-am-p2-里的-p2-是怎么确定的？" class="headerlink" title="Q3：git am -p2 里的 -p2 是怎么确定的？"></a>Q3：<code>git am -p2</code> 里的 <code>-p2</code> 是怎么确定的？</h4><p><strong>A：</strong> 补丁路径通常是 <code>a/practicum/...</code> 与 <code>b/practicum/...</code>。需要去掉两层前缀（<code>a</code>&#x2F;<code>b</code> + <code>practicum</code>），所以用 <code>-p2</code><br>，最终让文件落在新仓库根目录。</p><h4 id="Q4：回放补丁时提示冲突怎么办？"><a href="#Q4：回放补丁时提示冲突怎么办？" class="headerlink" title="Q4：回放补丁时提示冲突怎么办？"></a>Q4：回放补丁时提示冲突怎么办？</h4><p><strong>A：</strong> 常规处理流程：</p><ol><li>查看冲突文件并手工解决；</li><li><code>git add &lt;冲突文件&gt;</code>；</li><li><code>git am --continue</code> 继续回放。</li></ol><p>如果发现本次迁移策略不对，可中止后重来：</p><figure class="highlight powershell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> am <span class="literal">--abort</span></span><br></pre></td></tr></table></figure><h4 id="Q5：如何确认提交时间是否真的保留了？"><a href="#Q5：如何确认提交时间是否真的保留了？" class="headerlink" title="Q5：如何确认提交时间是否真的保留了？"></a>Q5：如何确认提交时间是否真的保留了？</h4><p><strong>A：</strong> 可以分别查看源仓库与新仓库日志并对比时间戳：</p><figure class="highlight powershell"><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">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\java-courseworks&quot;</span> <span class="literal">--no-pager</span> log <span class="literal">--reverse</span> <span class="literal">--date</span>=iso<span class="literal">-strict</span> <span class="literal">--pretty</span>=format:<span class="string">&quot;%H|%ad|%cd|%s&quot;</span> <span class="number">7</span>b47ec1755525f05cd76683215dad5ed3585fe6d^..<span class="number">1</span>effd2672b9a396db04668c0b1d9d89043f1aacd <span class="literal">--</span> practicum</span><br><span class="line">git <span class="literal">-C</span> <span class="string">&quot;D:\@DEV\StudentUI&quot;</span> <span class="literal">--no-pager</span> log <span class="literal">--reverse</span> <span class="literal">--date</span>=iso<span class="literal">-strict</span> <span class="literal">--pretty</span>=format:<span class="string">&quot;%H|%ad|%cd|%s&quot;</span></span><br></pre></td></tr></table></figure>]]></content:encoded>
      <category>开发</category>
      <category>GitHub</category>
      <category>经验总结</category>
      <category>Java开发</category>
    </item>

    <item>
      <title>记一次外卖被偷的经历</title>
      <link>https://pages.carm.cc/story/2026/takeout-stolen</link>
      <guid isPermaLink="true">https://pages.carm.cc/story/2026/takeout-stolen</guid>
      <pubDate>Thu, 02 Apr 2026 11:32:51 GMT</pubDate>
      <description><![CDATA[记录一次外卖被偷后通过监控追查、报警找回的完整经历，以及对偷窃者的观察与思考。]]></description>
      <content:encoded><![CDATA[<h2 id="开端"><a href="#开端" class="headerlink" title="开端"></a>开端</h2><p>那是个寻常的礼拜四，我偏就馋那一锅子裹着厚面糊、炸得金黄焦脆的死鸡肉，激情下单一份疯狂的肯德基。</p><p>外卖快到时，我恰好内急。便让骑手挂在门把手上。想着左右不过一会儿功夫，索性再洗个澡。水汽氤氲里，我还盘算着待会儿怎么大快朵颐。这一泡屎一个澡，前前后后不过二十分钟。</p><p>且等我擦干头发，趿拉着拖鞋，满心欢喜地拉开那扇沉甸甸的防盗门时——迎面只有楼道里的一阵穿堂冷风。</p><p><strong>门把手光秃秃的，什么也没有。</strong></p><p>没有炸鸡，没有纸袋，连一丝油星子味都没留下。我愣在原地，脚底板那股子凉意顺着瓷砖直往天灵盖上窜。莫不是被保洁阿姨当废纸篓给收了？可谁家好人把热腾腾的饭菜当垃圾？又或是被野猫叼了去？可那么大还封了口的袋子，岂是一只野猫能拖得动的？</p><p>急吼吼拨通了送餐小哥的电话，听筒那头全是呼呼的风声和电瓶车的喇叭响，人家早忙得脚不沾地了，哪管得了这等闲事。再联系肯德基餐厅，回话也是冷冰冰的客套，只说东西送到了，丢了，只能报警。</p><h2 id="调查"><a href="#调查" class="headerlink" title="调查"></a>调查</h2><p>好在门顶上安了个黑乎乎的摄像头。点开手机里的录像，短短的报警片段里，一个身着格子衫、戴着橘黄色头盔的影子，从电梯口滑过来，手腕一勾，提溜起我的“疯狂星期四”，转身便没入楼道的阴影里。</p><p><img src="images/thief.jpg" alt="小偷截图" loading="lazy"></p><p>那一刻，心里头真是一股子无明业火腾地烧了起来。这身行头，分明也是个骑手！做着一样风里来雨里去的营生，却干这等偷鸡摸狗的勾当？我甚至趿拉着鞋，跑到上下两层楼去转了一遭，楼道里死寂死寂的，半个袋子的影儿也没见着。本打算联系物业调监控看看能不能找到这个人的身份信息，但细想要调取监控肯定是需要报警的，而报警又需要监控里能清晰地看到这个人的脸才能立案，所以就算报警了也不太可能有结果。</p><p><strong>本想就这么算了，当是舍给饿鬼了罢。可那口气堵在胸口，上不去下不来的。</strong></p><p>“不对，摄像头是有全天录像的！”我猛地反应过来，耐着性子，又再一点点往回倒腾监控的进度条。</p><ul><li>17:19 分，穿黄衣的美团小哥把袋子妥妥当当地挂上了门把手。</li><li>17:26 分，监控里出现了一个身穿黑色衣服、批橙色马甲，戴头盔的人从电梯方向走过来，直接把外卖拿走了，然后迅速离开了。</li></ul><p>服饰来看应该是淘宝闪购的骑手。此时其他可能性与排除，也可以确定并非是住户冒充外卖小哥来偷外卖的了。</p><p>我眯着眼，再往前倒了倒。17:25分，隔壁的门被敲得哐哐响，“外卖！”，又敲了三声，“外卖到了！” 且就在那光洁的瓷砖地反光里，隐隐约约晃过一抹橙色。</p><p><img src="images/knock.jpg" alt="敲门截图" loading="lazy"></p><p><strong>这事儿便全串起来了！</strong></p><p>这贪嘴的贼，先是给隔壁送了一份外卖，回头等电梯的当口，一转眼瞅见了我门上挂着的肯德基，腹中的馋虫一作祟，便顺手牵羊了。</p><p>我去敲了隔壁的门。开门的大哥倒是个热心肠，一听这等奇事，眼睛都亮了。两人一合计，查了单子。大概下午五点，大哥点了附近的一家“瑞幸咖啡”，详情显示“商家自配送”，17:26分送达。</p><p><img src="images/order.png" alt="订单截图" loading="lazy"></p><p><strong>对上了！</strong> 瑞幸的“自配送”一般都是由淘宝闪购负责配送的，而这个时间点又正好是那个身穿橙色马甲的骑手出现在监控里的时间点，所以基本上可以确定这个人就是偷我外卖的嫌疑人了。但是由于淘宝闪购的骑手信息在美团上无法显示，而平台上骑手的电话又是两次虚拟后的号码（淘宝闪购虚拟号提交到了美团上，美团又虚拟了一次），所以我无法直接联系到这个骑手。而商家呼叫骑手时肯定有骑手的身份信息，可以轻松找到对方。</p><p><strong>那么，就是现在了！</strong> 到了这份上，我反倒出奇的平静。我肯定是没有权利要求商家提供骑手的身份信息的，所以让我们有请伟大的人民警察吧！</p><h2 id="断案"><a href="#断案" class="headerlink" title="断案"></a>断案</h2><p>拨通110报了警，接线员简单了解过后，很快便有一位警官一位辅警上门了解情况。我向他们详细地说明了事情的经过，提供了监控录像和相关订单信息，随机做了笔录。<em>此时距离外卖被偷差不多过去了一个小时。</em></p><p><img src="images/police.jpg" alt="警察笔录" loading="lazy"></p><p>警察前脚刚走，后脚便来了电话：“诶，诶你好。我们到商家这里拿到骑手信息了，看到骑手现在就在旁边的沙县，人已经逮到了。他自己也知道问题的严重性，意思是要和你沟通一下，方不方便加个微信你们沟通下呢？…”</p><p>加上微信的那一瞬，手机震了一下。跳出来个顶着非主流头像的男生，微信名为 “牛马大帝” 。</p><p><img src="images/moments.png" alt="朋友圈截图" loading="lazy"></p><p><strong>十九岁。</strong></p><p>那人打过语音来，声音还带着点没褪干净的公鸭嗓，怯生生的，又透着点死猪不怕开水烫的滑头：“哥，不好意思拿了你门口的外卖，我错了。对不起哥。”</p><p>我没做声。听筒里只有他略显粗重的呼吸。</p><p>“我也不想这样啊，实在是饿了，咱们私了吧…”</p><p>我也不想把事情闹大，毕竟他还年轻，犯了错误也想要改正。他急忙补上一句：“那哥你给我个支付宝二维码吧，我微信没钱，我支付宝转账…”。</p><p>最后，那点可怜的饭钱，他竟是用花呗付过来的。我苦笑着多说了几句，劝他好自为之。</p><p>可警察大哥后来在电话里冷笑。</p><p>“这小子，是第三回了。”</p><hr><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>点开他那朋友圈，花花绿绿的，像是个万花筒。入眼便是张皱巴巴的“退学申请书”照片，往底下翻，全是些让人嘴巴发干的句子：</p><ul><li>“终于成为了小时候羡慕的大人，父母眼中的顶梁柱。”</li><li>“成熟的男孩烟酒入喉，优质的男儿爱字当头。”</li><li>…</li></ul><p>在这座由钢筋水泥构筑的城市丛林里，从不乏如浮萍般漂泊的年轻人，我亦如此。<br>而仓促地合上书本，一头闯进光怪陆离的现实社会，为何口中只念叨着从短视频里拾来的 “江湖道义”，脑海里也只记得编织着兄弟结盟、快意恩仇的虚幻图景？渴望活得体面，渴望成为旁人眼中的 “顶梁柱”，却在生存的重压下，渐渐模糊了基本的价值底线。那句 “优质的男儿” 的自诩，倘若配上用花呗透支、甚至游走在规则边缘换来的一餐温饱，便成了一出令人心酸的荒诞剧 —— <strong>没有嘲讽的余地，只剩无奈的喟叹</strong> 。</p><p>我看着手机上那笔退回来的款，只觉得手心里那一阵油腻腻的冷汗，怎么也擦不干净了。</p><p><img src="images/last-words.png" alt="最后一语" loading="lazy"></p>]]></content:encoded>
      <category>往事</category>
      <category>生活</category>
      <category>解谜</category>
    </item>

    <item>
      <title>【开发教程】高效快捷的Java配置文件库—configured入门</title>
      <link>https://www.bilibili.com/video/BV1XQQCYmE7F</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1XQQCYmE7F</guid>
      <pubDate>Sat, 15 Mar 2025 00:00:00 GMT</pubDate>
      <description><![CDATA[一次配置，轻松读取！ 一款简单便捷的通用配置文件加载、读取与更新工具，可自定义配置的格式。 项目地址: https://github.com/CarmJos/configured 我的Github账号地址: https://github.com/CarmJos]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1XQQCYmE7F">点击此处查看本视频 &gt;&gt;</a></p><p>一次配置，轻松读取！<br>一款简单便捷的通用配置文件加载、读取与更新工具，可自定义配置的格式。</p><p>项目地址: https://github.com/CarmJos/configured<br>我的Github账号地址: https://github.com/CarmJos</p>]]></content:encoded>
      <category>视频</category>
      <category>万物研究所</category>
      <category>程序员</category>
      <category>初学者</category>
      <category>编程</category>
      <category>教程</category>
      <category>Java</category>
      <category>万物研究所·春日探索企划</category>
    </item>

    <item>
      <title>【开发教程】送给C语言初学者—CLion常见问题答疑</title>
      <link>https://www.bilibili.com/video/BV1PU411S7Zw</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1PU411S7Zw</guid>
      <pubDate>Wed, 24 Jul 2024 00:00:00 GMT</pubDate>
      <description><![CDATA[本视频解答了 BV1kM411X7uA 视频下一些常见的问题，并额外提供了部分建议。 CMakeList文件地址: https://github.com/CarmJos/CWorks 我的Github账号地址: https://github.com/CarmJos 国内访问文件可以尝试使用：cdn.jsdelivr.net/gh/CarmJos/CWorks@master/CMakeLists.txt —[额外链接]—————————————————— JetBrains官网(中文): https://www.jetbrains.com/zh-cn/ CLion下载地址: https://www.jetbrains.com/zh-cn/clion/download/]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1PU411S7Zw">点击此处查看本视频 &gt;&gt;</a></p><p>本视频解答了 BV1kM411X7uA 视频下一些常见的问题，并额外提供了部分建议。</p><p>CMakeList文件地址: https://github.com/CarmJos/CWorks<br>我的Github账号地址: https://github.com/CarmJos</p><p>国内访问文件可以尝试使用：cdn.jsdelivr.net/gh/CarmJos/CWorks@master/CMakeLists.txt</p><p>—[额外链接]——————————————————<br>JetBrains官网(中文): https://www.jetbrains.com/zh-cn/<br>CLion下载地址: https://www.jetbrains.com/zh-cn/clion/download/</p>]]></content:encoded>
      <category>视频</category>
      <category>软件使用大百科</category>
      <category>C语言</category>
      <category>初学者</category>
      <category>教程</category>
      <category>编程</category>
      <category>科技猎手2024第2季</category>
    </item>

    <item>
      <title>C语言命名规范——以UNIX风格为例</title>
      <link>https://pages.carm.cc/dev/c-name-rules</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/c-name-rules</guid>
      <pubDate>Thu, 28 Dec 2023 11:30:00 GMT</pubDate>
      <description><![CDATA[以 UNIX 风格为例介绍 C 语言的命名规范，涵盖变量、函数、文件等命名约定。]]></description>
      <content:encoded><![CDATA[<h1 id="C语言命名规范——以UNIX风格为例"><a href="#C语言命名规范——以UNIX风格为例" class="headerlink" title="C语言命名规范——以UNIX风格为例"></a>C语言命名规范——以UNIX风格为例</h1><p>优秀的C语言代码通常遵循通用的代码规范原则，以确保代码的可读性和一致性。</p><p>虽然这些规则不是强制性的，但遵循它们可以大大帮助保持代码的逻辑可读性和一致性，特别是在团队协作或大型项目中。<br>不同的项目或团队可能有自己的命名约定，所以最重要的是在一个项目或团队内保持一致性。</p><h2 id="基本规范"><a href="#基本规范" class="headerlink" title="基本规范"></a>基本规范</h2><ol><li><p><strong>避免使用保留字和标准库命名</strong>:</p><ul><li>避免使用C语言的关键字（如 <code>int</code>, <code>return</code>, <code>struct</code> 等）作为变量名。</li><li>同样，避免使用可能与标准库函数冲突的名称。</li></ul></li><li><p><strong>使用简洁且具有描述性的名称</strong>:</p><ul><li>选择简洁且具有描述性的名称，使其能够清晰地表达变量或函数的用途。例如，使用 <code>calculate_speed()</code> 而不是 <code>cs()</code>。</li><li>避免使用无意义的名称，如 <code>a</code>、<code>qwq</code> 或 <code>foo</code>。</li><li>选择单词时，首先要保障“<strong>贴切</strong>”，即词能达意，其次再去考虑长短。</li><li>尽量避免使用缩写，除非它们是通用的或广泛使用的。例如，<code>str</code> 代表字符串，<code>len</code> 代表长度。见 <a href="#%E9%80%9A%E7%94%A8%E7%BC%A9%E5%86%99">通用缩写</a>。</li></ul></li><li><p><strong>保持一致性</strong>：在同一项目或团队中保持文件命名的一致性非常重要。个人或团队内部应该商定并遵守统一的命名规范。</p></li></ol><blockquote><p><em>注1:</em> 也有一种命名函数名的风格是 首字母小写,后面单词首字母大写,中间不用连接符, 比如 <code>getMaxValue()</code>。<br>而类名单词首字母大写不用分隔符,如 <code>class MyDateClass</code>；<br>类的成员数据和方法的首单词首字母小写后面的单词首字母大写 如 <code>int superValue</code>。</p><p>JAVA的代码风格就是大致如此。</p></blockquote><h2 id="特定情况"><a href="#特定情况" class="headerlink" title="特定情况"></a>特定情况</h2><h3 id="1-文件命名"><a href="#1-文件命名" class="headerlink" title="1. 文件命名"></a>1. 文件命名</h3><p>在C语言项目中，文件命名的规范有助于帮助构建项目的整体结构。以下是一些常见的文件命名规范：</p><ol><li><strong>使用小写字母</strong>：文件名通常全部使用小写字母，以避免操作系统之间的兼容性问题（特别是在区分大小写的系统中）。</li><li><strong>使用下划线分隔</strong>：单词之间使用下划线（_）分隔，以提高可读性。例如：<code>char_calc.c</code> 或 <code>data_processing.h</code>。</li><li><strong>简洁且具描述性</strong>：文件名应简洁且能够清楚地描述文件内容。例如，如果文件包含一个实现链表功能的模块，则可以命名为 <code>linked_list.c</code>。</li><li><strong>区分头文件和源文件</strong>：<ul><li>源文件（.c 文件）：包含C语言的实现代码。例如：<code>main.c</code>, <code>score_calc.c</code>。</li><li>头文件（.h 文件）：包含函数声明、宏定义和类型定义等。与源文件相关联，通常名称相似。例如：<code>utils.h</code> 用于存放工具方法。</li></ul></li><li><strong>避免使用空格和特殊字符</strong>：避免在文件名中使用空格和特殊字符，如<code>%</code>, <code>&amp;</code>, <code>*</code>等，因为它们可能导致在某些环境或命令行操作中出现问题。</li><li><strong>使用有意义的前缀或后缀</strong>：对于大型项目，可以使用前缀或后缀来指示文件属于哪个模块或子系统。例如，使用<code>gui_button.c</code> 来表示该文件为图形用户界面模块中的按钮相关代码。</li><li><strong>避免过长的文件名</strong>：虽然现代操作系统支持较长的文件名，但过长的文件名可能不便于管理、识别和调用。所以，尽量保持文件名长度合理。</li></ol><h3 id="2-变量与常量"><a href="#2-变量与常量" class="headerlink" title="2. 变量与常量"></a>2. 变量与常量</h3><p>局部变量命名应当 <strong>全部使用小写字母，单词之间用下划线分隔</strong> 。<br>局部变量可以简短，因为它们的作用域有限。例如：</p><ul><li><code>int my_variable;</code></li><li><code>void calculate_total();</code></li></ul><p>全局变量应该更加谨慎命名，可以使用前缀以避免命名冲突，例如：</p><ul><li><code>int g_some_value = 10;</code> 其中 <code>g_</code> 为前缀，代表 <em>GLOBAL</em>，即全局。</li></ul><p>对于常量，可以使用 <code>const</code> 关键字来定义，并采用 <strong>全大写下划线</strong> 风格例如：</p><ul><li><code>static const int DENOMINATIONS[] = { 2000, 1000 };</code> <a href="https://github.com/carm-outsource/CWorks/blob/master/src/calculator/change_calc.c#L7">[实例]</a></li></ul><p>而 <code>i, j, k, m, n, x, y, z</code> 等单字母变量普遍被用在索引、循环语句控制、数学函数等处。<br>这是一种约定俗成的习惯，但是在其他地方使用单字母变量是不被推荐的，且不应当滥用。</p><h3 id="3-方法与函数"><a href="#3-方法与函数" class="headerlink" title="3. 方法与函数"></a>3. 方法与函数</h3><p>针对于方法，我们一般采取 “<code>动词_名词</code>” 的命名方式，且应当 <strong>全部使用小写字母，单词之间用下划线分隔</strong> ，例如：</p><ul><li><code>int get_file();</code></li><li><code>int calculate_total();</code></li><li><code>int get_max_value();</code></li><li><code>int is_valid();</code></li></ul><p>其中“动词” 通常用于表示方法的操作，例如 <code>calculate_total()</code> 计算总数，<br>“名词” 通常用于表示方法的返回值类型，例如 <code>get_max_value()</code> 返回一个最大值。<br>该部分是可选的，比如 有些方法不需要返回值，或者返回的内容已经隐藏在动词方法名或模块名中。</p><h3 id="4-类型与结构体"><a href="#4-类型与结构体" class="headerlink" title="4. 类型与结构体"></a>4. 类型与结构体</h3><p>自定义类型（如结构体和联合体）通常使用<strong>大驼峰式</strong>或<strong>全大写下划线</strong>风格。例如：</p><ul><li><code>typedef struct { ... } MyStruct;</code></li><li><code>typedef struct { ... } MY_STRUCT;</code></li></ul><h3 id="5-宏变量与枚举"><a href="#5-宏变量与枚举" class="headerlink" title="5. 宏变量与枚举"></a>5. 宏变量与枚举</h3><p>宏常量和枚举通常全部使用大写字母，单词之间用下划线分隔。这样做是为了与普通变量和函数区分开。例如：</p><ul><li><code>#define MAX_LENGTH 100</code></li><li><code>enum { RED, GREEN, BLUE };</code></li></ul><h2 id="常见操作单词"><a href="#常见操作单词" class="headerlink" title="常见操作单词"></a>常见操作单词</h2><ul><li>add&#x2F;remove</li><li>begin&#x2F;end</li><li>create&#x2F;destroy</li><li>insert&#x2F;delete</li><li>first&#x2F;last</li><li>get&#x2F;release</li><li>increment&#x2F;decrement</li><li>put&#x2F;get</li><li>add&#x2F;delete</li><li>lock&#x2F;unlock</li><li>open&#x2F;close</li><li>min&#x2F;max</li><li>old&#x2F;new</li><li>start&#x2F;stop</li><li>next&#x2F;previous</li><li>source&#x2F;target</li><li>show&#x2F;hide</li><li>send&#x2F;receiver</li><li>source&#x2F;destination</li><li>copy&#x2F;paste</li><li>up&#x2F;down</li></ul><h2 id="通用缩写"><a href="#通用缩写" class="headerlink" title="通用缩写"></a>通用缩写</h2><p>这里是一些通用的缩写，选择性使用。</p><figure class="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><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></pre></td><td class="code"><pre><span class="line">addition —&gt; add</span><br><span class="line">answer —&gt; ans</span><br><span class="line">array —&gt; arr</span><br><span class="line">average—&gt;avg </span><br><span class="line">argument —&gt; arg</span><br><span class="line">buffer —&gt; buff/buf</span><br><span class="line">clock —&gt; clk</span><br><span class="line">calculate —&gt; calc</span><br><span class="line">column —&gt; col</span><br><span class="line">control —&gt; ctrl</span><br><span class="line">command —&gt; cmd</span><br><span class="line">compare —&gt; cmp</span><br><span class="line">configuration —&gt; config/cfg</span><br><span class="line">count —&gt; cnt</span><br><span class="line">define —&gt; def</span><br><span class="line">delete —&gt; del</span><br><span class="line">destination—&gt;dst/dest</span><br><span class="line">display—&gt; disp</span><br><span class="line">device —&gt; dev</span><br><span class="line">decode —&gt; dec</span><br><span class="line">division —&gt; div</span><br><span class="line">frequency—&gt;freq</span><br><span class="line">error —&gt; err</span><br><span class="line">environment —&gt; env</span><br><span class="line">encode —&gt; enc</span><br><span class="line">hexadecimal —&gt; hex</span><br><span class="line">header —&gt; hdr</span><br><span class="line">index —&gt; idx</span><br><span class="line">image —&gt; img</span><br><span class="line">initialize —&gt; init</span><br><span class="line">increment —&gt; inc</span><br><span class="line">length—&gt;len</span><br><span class="line">make —&gt; mk</span><br><span class="line">maximum —&gt; max</span><br><span class="line">message —&gt; msg</span><br><span class="line">minimum —&gt; min</span><br><span class="line">multiplication—&gt;multi</span><br><span class="line">memory—&gt;mem</span><br><span class="line">middle—&gt;mid</span><br><span class="line">number —&gt; num</span><br><span class="line">option—&gt;opt</span><br><span class="line">parameter —&gt; para</span><br><span class="line">previous —&gt; prev</span><br><span class="line">pointer —&gt; ptr</span><br><span class="line">register —&gt; reg</span><br><span class="line">receiver—&gt;recv</span><br><span class="line">return —&gt; ret</span><br><span class="line">result—&gt;res</span><br><span class="line">source —&gt; src</span><br><span class="line">stack—&gt;stk</span><br><span class="line">string—&gt;str</span><br><span class="line">subtraction—&gt;sub</span><br><span class="line">semaphore —&gt; sem</span><br><span class="line">statistic —&gt; stat</span><br><span class="line">synchronize —&gt; sync</span><br><span class="line">table —&gt;tab</span><br><span class="line">temp —&gt; tmp</span><br><span class="line">temporary—&gt;tmp/temp</span><br><span class="line">timestamp—&gt;ts</span><br><span class="line">value—&gt;val</span><br><span class="line">width—&gt;wid</span><br></pre></td></tr></table></figure>]]></content:encoded>
      <category>开发</category>
      <category>C语言</category>
      <category>初学者</category>
    </item>

    <item>
      <title>【学生必薅】用证明申请Jetbrains的免费教育授权</title>
      <link>https://www.bilibili.com/video/BV1ja4y1f7iK</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1ja4y1f7iK</guid>
      <pubDate>Sun, 26 Nov 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[本视频适用于使用Jetbrains系开发软件的学生，指导如何申请独属于自己的Jetbrains教育授权，安心使用正版最新开发软件。 —[相关链接]—————————————————— JetBrains官网(中文): https://www.jetbrains.com/zh-cn/ 教育授权申请表: https://www.jetbrains.com/shop/eform/students]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1ja4y1f7iK">点击此处查看本视频 &gt;&gt;</a></p><p>本视频适用于使用Jetbrains系开发软件的学生，指导如何申请独属于自己的Jetbrains教育授权，安心使用正版最新开发软件。</p><p>—[相关链接]——————————————————<br>JetBrains官网(中文): https://www.jetbrains.com/zh-cn/<br>教育授权申请表: https://www.jetbrains.com/shop/eform/students</p>]]></content:encoded>
      <category>视频</category>
      <category>1024程序员节来了</category>
      <category>软件</category>
      <category>教育</category>
      <category>教程</category>
      <category>正版</category>
      <category>软件分享</category>
      <category>授权</category>
      <category>1024·2023活动征稿</category>
    </item>

    <item>
      <title>【开发教程】送给C语言初学者—CLion安装流程与注意事项</title>
      <link>https://www.bilibili.com/video/BV1kM411X7uA</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1kM411X7uA</guid>
      <pubDate>Sat, 28 Oct 2023 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1kM411X7uA">点击此处查看本视频 &gt;&gt;</a></p>]]></content:encoded>
      <category>视频</category>
      <category>1024打卡挑战</category>
      <category>C语言</category>
      <category>初学者</category>
      <category>教程</category>
      <category>编程</category>
      <category>1024·2023活动征稿</category>
    </item>

    <item>
      <title>【上手实测】Sony MRW-G2 | CF-A/SD 二合一读卡器，削铁入尼！</title>
      <link>https://www.bilibili.com/video/BV11o4y1g74g</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV11o4y1g74g</guid>
      <pubDate>Thu, 25 May 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[关于我换掉希铁CFA读卡器入手Sony MRW-G2的这件事。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV11o4y1g74g">点击此处查看本视频 &gt;&gt;</a></p><p>关于我换掉希铁CFA读卡器入手Sony MRW-G2的这件事。</p>]]></content:encoded>
      <category>视频</category>
      <category>科技猎手2023</category>
      <category>索尼</category>
      <category>评测</category>
      <category>数码</category>
      <category>外设</category>
      <category>必剪创作</category>
    </item>

    <item>
      <title>【上手实测】红米Note12 Turbo 首轮入手短评: 巨香，可冲</title>
      <link>https://www.bilibili.com/video/BV19M4y1U7b2</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV19M4y1U7b2</guid>
      <pubDate>Fri, 31 Mar 2023 00:00:00 GMT</pubDate>
      <description><![CDATA[这一部应该是我这个地区第一个激活的手机。 红米干爆小米！]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV19M4y1U7b2">点击此处查看本视频 &gt;&gt;</a></p><p>这一部应该是我这个地区第一个激活的手机。</p><p>红米干爆小米！</p>]]></content:encoded>
      <category>视频</category>
      <category>科技猎手2023</category>
      <category>小米</category>
      <category>手机</category>
      <category>红米</category>
      <category>上手测评</category>
    </item>

    <item>
      <title>【开发教程】还在用破解器临时账号？快免费申请JetBrains开源开发者授权！</title>
      <link>https://www.bilibili.com/video/BV1sa411X7Y3</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1sa411X7Y3</guid>
      <pubDate>Sat, 02 Jul 2022 00:00:00 GMT</pubDate>
      <description><![CDATA[JetBrains 官网：https://www.jetbrains.com/ 开源授权申请：https://www.jetbrains.com/opensource/ 我的Github主页: https://github.com/CarmJos]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1sa411X7Y3">点击此处查看本视频 &gt;&gt;</a></p><p>JetBrains 官网：https://www.jetbrains.com/<br>开源授权申请：https://www.jetbrains.com/opensource/</p><p>我的Github主页: https://github.com/CarmJos</p>]]></content:encoded>
      <category>视频</category>
      <category>发现《Menti (Original Mix)》</category>
      <category>技术宅的夏天</category>
      <category>免费授权</category>
      <category>开源软件</category>
      <category>IDEA</category>
      <category>软件分享</category>
      <category>软件开发</category>
      <category>JetBrains</category>
      <category>打卡挑战</category>
      <category>科技猎手计划2022第二季</category>
    </item>

    <item>
      <title>南京的烤鸭</title>
      <link>https://pages.carm.cc/article/2022/roasted-duck</link>
      <guid isPermaLink="true">https://pages.carm.cc/article/2022/roasted-duck</guid>
      <pubDate>Mon, 07 Mar 2022 11:30:00 GMT</pubDate>
      <description><![CDATA[一篇关于南京烤鸭的随笔，通过爷爷留鸭腿的温暖记忆，讲述亲情与乡愁的简单故事。]]></description>
      <content:encoded><![CDATA[<p>日子总是在不知不觉中就淌过去了。</p><p>那是哪一年的事？早记不大清了。 只晓得那天电视里正放着什么动画片，叽叽喳喳的声响里，一个小人儿正抱着根同自己半个身子差不多大的鸡腿，啃得满嘴冒油。</p><p>我那时人小，肚子里的馋虫却被这光景勾得乱窜，连呼吸里都像凭空生出了一股子肉香。我咽了口唾沫，转头便冲着屋外正忙着劈竹的爷爷嚷嚷：“爷爷，我也要吃大鸡腿！”<br>爷爷抬头瞥了我一眼，手也没停，也没言语，由着我这没头没脑的叫唤散在风里飘。</p><p>到了傍晚，天刚擦黑，饭桌上却突兀地多出个东西，温温的，裹在塑料袋里。</p><p>塑料袋摊在碗里，果木炭的焦香混着股浑厚的咸甜味，轰的一下便撞进了鼻腔。是一副红艳艳的烤鸭。那年月，孩孩童哪里懂得什么讲究，管它鸡腿鸭腿，能解馋就是顶好的。爷爷竟不知用了什么法子，那鸭腿被留得格外多。我迫不及待地，一把攥住那只肥大的鸭腿，指尖滑腻腻的，全是烤得焦脆的鸭皮渗出的亮油。我就这么一手举着鸭腿，一手猛扒着碗里的白米饭，腮帮子鼓得不像话。一家人挤在灯泡底下，看着我这狼狈的馋样，都“咯咯”地笑着…</p><p>这一晃，十年的水便流去了。</p><p>我早像个羽翼渐丰的野鸟，扑腾着飞出了那个青石板铺就的小镇。爷爷奶奶年岁大了，早搬到了楼房里住。长大的日子总是忙碌且生硬，钢筋水泥把人困得像个打转的陀螺，我竟鲜能挤出回家的空档。 可是呀，说来也怪，无论我哪日踏进那扇防盗门，无论外头是个什么季节光景，只要一落座，我的白瓷碗里，总安安稳稳地卧着一只酱红色、泛着肥软光泽的烤鸭腿。</p><p>奶奶端着碗从厨房走出来，笑眯眯的，眼角的褶子叠在一起，操着那口老南京话冲我念叨：</p><p><strong>“乖乖，留的大鸭腿给你哎！南头斩的，你最欢喜吃个！”</strong></p><p>我不做多想，左手夹起腿，大口吞咽，任由那股浓烈的酱香味在舌尖慢慢化开。恍惚间，竟又回到了十年前那个咋咋呼呼的傍晚。</p><p><strong>南头，说的是驷马河的南面。从新房走，约莫十五里路。</strong></p><p><img src="images/picture.jpg" alt="烤鸭" loading="lazy"></p>]]></content:encoded>
      <category>随笔</category>
      <category>生活</category>
      <category>亲情</category>
      <category>乡土情结</category>
    </item>

    <item>
      <title>为何我的部分轻量插件的体积十分&quot;庞大&quot;？</title>
      <link>https://pages.carm.cc/dev/why-plugins-huge</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/why-plugins-huge</guid>
      <pubDate>Wed, 02 Mar 2022 18:32:02 GMT</pubDate>
      <description><![CDATA[解释 Minecraft 插件为何打包依赖类库导致体积较大，探讨用户体验与轻量化之间的权衡。]]></description>
      <content:encoded><![CDATA[<p>有朋友和我说 “一个<a href="https://github.com/CarmJos/TimeReward">自动领奖插件</a>就快400kb，是不是太臃肿了？”。 我觉得针对这种问题应当统一作出解释。</p><h2 id="关于用户体验"><a href="#关于用户体验" class="headerlink" title="关于用户体验"></a>关于用户体验</h2><p>这其实是一种个人代码风格的选择，不同开发者的风格也大多不相同。在很早的时候，我和这位朋友一样，对于一个明明功能很简单的插件打包了许多类库这种事情感到十分可笑。但随着我接的各种小单子越来越多，接触的用户越来越多，我发现程序员思维在这里似乎并不适用。</p><p>其实这种问题只要做一个核心类库插件就全部解决了。但作为用户来说，相比于要额外安装一个依赖插件，我更喜欢开箱即用的感觉，而非安装一个插件需要额外安装许许多多杂七杂八的类库。举个例子，如果我想使用一个插件，需要额外安装作者的一个类库；如果要使用的插件来自于多个作者，岂不是需要额外安装许许多多的类库？</p><p>因此，作为一个插件覆盖面并不广泛的开发者，我选择每个插件都单独打包类库，而让用户无需对此焦虑。</p><h2 id="关于高版本接口"><a href="#关于高版本接口" class="headerlink" title="关于高版本接口"></a>关于高版本接口</h2><p>这时候又有人想问“为何不使用高版本提供的依赖接口，直接让服务端下载依赖使用，从而减小插件的大小呢？”</p><p>其实理由已经出现在问题里了。没错，这个功能需要“<strong>高版本</strong>”。</p><p>相比于为了减小插件体积而使用这个功能，以导致只有高版本才可以使用，我更倾向于让一个插件能够覆盖到更多的版本，从而减少用户的选择成本。</p><p>让我们回到用户的视角，面对一个功能需求上很适合自己的插件，却因为版本过低而无法使用，而这的原因仅仅是开发者为了让插件看上去更“轻量化”去使用高版本的依赖接口从而失去了低版本用户的支持，我相信，这个时候用户更希望的是在自己的服务器也能用上这款插件，而不是我们需要的“轻量化”。</p><h2 id="总结"><a href="#总结" class="headerlink" title="总结"></a>总结</h2><p>总而言之，是否打包类库到插件纯属开发者的个人习惯。有的人喜欢“轻量”而自行挑选重要内容放到自己的插件中，有的人更爱“便捷”而一股脑全塞上，也有的人会为了“用户体验”而做出一点大小上的牺牲。</p><p>如果是三年前的我，我会强烈推荐你做一个“依赖库插件”，它能够很好的解决插件实际功能和大小不等的问题同时还能让这个插件在不同的服务器版本中得到支持；<br>但如果是现在的我，我会推荐你好好考虑，对于单个功能插件，在必要的情况下直接打包依赖库也完全没问题的：虽然需要在“轻量化”上做出一些牺牲，但可以让使用的用户得到更好的体验，在我看来这是一个更好的决定。</p><hr><p>文章作者为 @CarmJos ，同时感谢 @nelson 帮助校对文章。</p>]]></content:encoded>
      <category>开发</category>
      <category>MineCraft</category>
    </item>

    <item>
      <title>自动部署Javadoc到Github Pages</title>
      <link>https://pages.carm.cc/dev/javadoc-in-github</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/javadoc-in-github</guid>
      <pubDate>Tue, 23 Nov 2021 17:24:00 GMT</pubDate>
      <description><![CDATA[教程：使用 GitHub Actions 自动构建 Maven Javadoc 并部署到 GitHub Pages。]]></description>
      <content:encoded><![CDATA[<h2 id="需求"><a href="#需求" class="headerlink" title="需求"></a>需求</h2><p>由于想开一个新坑，打算把项目通过Maven生成的的Javadoc使用 <a href="https://docs.github.com/en/actions/learn-github-actions">Github Actions</a> 自动部署到同项目下 <code>gh-pages</code> 分支，作为该项目 <a href="https://pages.github.com/">Github Pages</a> 的主页供其他人参考。</p><h2 id="操作"><a href="#操作" class="headerlink" title="操作"></a>操作</h2><h3 id="1-配置-Maven-生成JavaDoc"><a href="#1-配置-Maven-生成JavaDoc" class="headerlink" title="1. 配置 Maven 生成JavaDoc"></a>1. 配置 Maven 生成JavaDoc</h3><p>首先在项目的 <code>pom.xml</code> 中添加 <a href="https://maven.apache.org/plugins/maven-javadoc-plugin/">Maven Javadoc Plugin</a> ,依赖这个插件，我们可以自动生成JavaDoc。</p><figure class="highlight xml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;<span class="name">plugin</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">groupId</span>&gt;</span>org.apache.maven.plugins<span class="tag">&lt;/<span class="name">groupId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">artifactId</span>&gt;</span>maven-javadoc-plugin<span class="tag">&lt;/<span class="name">artifactId</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">version</span>&gt;</span>3.2.0<span class="tag">&lt;/<span class="name">version</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">configuration</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">classifier</span>&gt;</span>javadoc<span class="tag">&lt;/<span class="name">classifier</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">detectJavaApiLink</span>&gt;</span>true<span class="tag">&lt;/<span class="name">detectJavaApiLink</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">encoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">encoding</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">charset</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">charset</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">docencoding</span>&gt;</span>UTF-8<span class="tag">&lt;/<span class="name">docencoding</span>&gt;</span></span><br><span class="line">            <span class="comment">&lt;!-- &lt;locale&gt;zh_CN&lt;/locale&gt; 可选，使用中文的界面--&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">configuration</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;<span class="name">executions</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;<span class="name">execution</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">id</span>&gt;</span>attach-javadocs<span class="tag">&lt;/<span class="name">id</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;<span class="name">goals</span>&gt;</span></span><br><span class="line">                    <span class="tag">&lt;<span class="name">goal</span>&gt;</span>jar<span class="tag">&lt;/<span class="name">goal</span>&gt;</span></span><br><span class="line">                <span class="tag">&lt;/<span class="name">goals</span>&gt;</span></span><br><span class="line">            <span class="tag">&lt;/<span class="name">execution</span>&gt;</span></span><br><span class="line">        <span class="tag">&lt;/<span class="name">executions</span>&gt;</span></span><br><span class="line">    <span class="tag">&lt;/<span class="name">plugin</span>&gt;</span></span><br><span class="line"><span class="tag">&lt;<span class="name">plugins</span>&gt;</span></span><br></pre></td></tr></table></figure><p>设置过后，我们就可以输入 <code>mvn javadoc:javadoc</code> 命令生成该项目的Javadoc了，生成的路径一般在 <code>target/site/apidoc/</code> 下。</p><div class="admonition note"><p>如果是使用的 <code>mvn package</code> 命令，则会生成在 <code>target/apidoc/</code> 下。</p></div><h3 id="2-配置Github项目的Deploy-Keys与Secrets"><a href="#2-配置Github项目的Deploy-Keys与Secrets" class="headerlink" title="2. 配置Github项目的Deploy Keys与Secrets"></a>2. 配置Github项目的<code>Deploy Keys</code>与<code>Secrets</code></h3><p>因为我们需要把Javadoc放到同项目下的<code>gh-pages</code>分支，因此在Actions中需要进行认证操作，才可以正常推送。</p><p>这里我们打算采用SSH进行推送，并通过 Deploy Keys 进行认证。</p><h4 id="a-生成-OpenSSH-密钥"><a href="#a-生成-OpenSSH-密钥" class="headerlink" title="a. 生成 OpenSSH 密钥"></a>a. 生成 OpenSSH 密钥</h4><p>我们可以访问 <a href="https://8gwifi.org/sshfunctions.jsp">Generate SSH Keys Online</a> 在线生成一个密钥。</p><p><img src="images/generate-key.png" alt="generate key" loading="lazy"></p><p>点击后，在下方会生成对应的私钥(Private Key)与公钥(Public Key)，我们先记下。</p><h4 id="b-添加私钥到-Secrets"><a href="#b-添加私钥到-Secrets" class="headerlink" title="b. 添加私钥到 Secrets"></a>b. 添加私钥到 <code>Secrets</code></h4><p>复制上一步得到的私钥，添加到项目的<code>Secrets</code>中。</p><p><img src="images/add-secret.png" alt="add secret" loading="lazy"></p><p>名字(Name)填<code>DEPLOY_PRI</code>,数值(Value)填私钥内容</p><p><img src="images/confirm-add-secret.png" alt="confirm secret" loading="lazy"></p><h4 id="c-添加公钥到-Deploy-Keys"><a href="#c-添加公钥到-Deploy-Keys" class="headerlink" title="c. 添加公钥到 Deploy Keys"></a>c. 添加公钥到 <code>Deploy Keys</code></h4><p>复制之前得到的公钥，添加到项目的<code>Deploy Keys</code>中。</p><p><img src="images/add-deploy-keys.png" alt="add deploy key" loading="lazy"></p><p>名字(Title)可以随便填，我这里选择的是<code>JAVADOC_DEPLOY</code>，密钥(Key)填公钥内容。注意一定要勾选 “<strong>Allow write access</strong>“, 这样才可以被用于推送。</p><p><img src="images/confirm-add-deploy-key.png" alt="confirm deploy key" loading="lazy"></p><h3 id="3-配置-Github-Actions"><a href="#3-配置-Github-Actions" class="headerlink" title="3. 配置 Github Actions"></a>3. 配置 Github Actions</h3><p>在项目下新建 <code>.github/workflows/javadoc.yml</code> 文件。这个文件会被自动识别为<a href="https://docs.github.com/en/actions/learn-github-actions">Github Actions</a>配置文件。</p><div class="admonition note"><p>记得也要在Settings中启用 Github Actions ，否则无法使用哦。</p></div><p>内容如下</p><figure class="highlight yml"><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></pre></td><td class="code"><pre><span class="line"><span class="attr">name:</span> <span class="string">Javadoc</span></span><br><span class="line"></span><br><span class="line"><span class="attr">on:</span></span><br><span class="line">  <span class="comment"># 支持手动触发构建</span></span><br><span class="line">  <span class="attr">workflow_dispatch:</span></span><br><span class="line">  <span class="attr">release:</span></span><br><span class="line">    <span class="comment"># 创建release的时候触发</span></span><br><span class="line">    <span class="attr">types:</span> [ <span class="string">published</span> ]</span><br><span class="line"><span class="comment">#  push: # 可选，在推送主分支时触发</span></span><br><span class="line"><span class="comment">#    branches:</span></span><br><span class="line"><span class="comment">#    - main</span></span><br><span class="line"><span class="comment">#    - master</span></span><br><span class="line"></span><br><span class="line"><span class="attr">jobs:</span></span><br><span class="line">  <span class="attr">apidoc-deploy:</span></span><br><span class="line">    <span class="attr">runs-on:</span> <span class="string">ubuntu-latest</span></span><br><span class="line">    <span class="attr">steps:</span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Checkout</span> <span class="string">the</span> <span class="string">repo</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/checkout@v2</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Set</span> <span class="string">up</span> <span class="string">the</span> <span class="string">Java</span> <span class="string">JDK</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">actions/setup-java@v2</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">java-version:</span> <span class="string">&#x27;11&#x27;</span></span><br><span class="line">          <span class="attr">distribution:</span> <span class="string">&#x27;adopt&#x27;</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Generate</span> <span class="string">docs</span> <span class="comment">#生成Javadoc</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">mvn</span> <span class="string">javadoc:javadoc</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Copy</span> <span class="string">to</span> <span class="string">Location</span> <span class="comment"># 复制Javadoc到一个新文件夹，便于进行git操作</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          rm -rf docs</span></span><br><span class="line"><span class="string">          mkdir -vp docs</span></span><br><span class="line"><span class="string">          cp -vrf target/site/apidocs/* docs/</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Generate</span> <span class="string">the</span> <span class="string">sitemap</span> <span class="comment"># 可选，生成sitemap</span></span><br><span class="line">        <span class="attr">id:</span> <span class="string">sitemap</span></span><br><span class="line">        <span class="attr">uses:</span> <span class="string">cicirello/generate-sitemap@v1</span></span><br><span class="line">        <span class="attr">with:</span></span><br><span class="line">          <span class="attr">base-url-path:</span> <span class="string">https://carmjos.github.io/userprefix</span></span><br><span class="line">          <span class="attr">path-to-root:</span> <span class="string">docs</span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Configure</span> <span class="string">Git</span> <span class="comment"># 配置Git</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">DEPLOY_PRI:</span> <span class="string">$&#123;&#123;secrets.DEPLOY_PRI&#125;&#125;</span> <span class="comment"># 这里就是刚刚配置的私钥了</span></span><br><span class="line">          <span class="attr">GIT_USERNAME:</span> <span class="string">$&#123;&#123;</span> <span class="string">github.repository_owner</span> <span class="string">&#125;&#125;</span> <span class="comment">#Github用户名，这里用了Actions自带的变量，也可以写死。</span></span><br><span class="line">          <span class="attr">GIT_EMAIL:</span> <span class="string">$&#123;&#123;</span> <span class="string">github.repository_owner</span> <span class="string">&#125;&#125;@user.github.com</span> <span class="comment"># 邮箱,可以写自己的邮箱。</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          sudo timedatectl set-timezone &quot;Asia/Shanghai&quot;</span></span><br><span class="line"><span class="string">          mkdir -p ~/.ssh/</span></span><br><span class="line"><span class="string">          echo &quot;$DEPLOY_PRI&quot; &gt; ~/.ssh/id_rsa</span></span><br><span class="line"><span class="string">          chmod 600 ~/.ssh/id_rsa</span></span><br><span class="line"><span class="string">          ssh-keyscan github.com &gt;&gt; ~/.ssh/known_hosts</span></span><br><span class="line"><span class="string">          git config --global user.name &#x27;$DEPLOY_PRI&#x27;</span></span><br><span class="line"><span class="string">          git config --global user.email &#x27;$DEPLOY_PRI&#x27;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line"></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Commit</span> <span class="string">documentation</span> <span class="comment"># 提交文档到Git仓库</span></span><br><span class="line">        <span class="attr">env:</span></span><br><span class="line">          <span class="attr">GIT_URL:</span> <span class="string">&quot;git@github.com:&lt;USERNAME&gt;/&lt;PROJECT&gt;.git&quot;</span> <span class="comment"># 项目的地址，注意要用SSH格式的。</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd docs</span></span><br><span class="line"><span class="string">          git init</span></span><br><span class="line"><span class="string">          git remote add origin $GIT_URL</span></span><br><span class="line"><span class="string">          git checkout -b gh-pages</span></span><br><span class="line"><span class="string">          git add -A</span></span><br><span class="line"><span class="string">          git commit -m &quot;API Document generated.&quot;</span></span><br><span class="line"><span class="string"></span></span><br><span class="line">      <span class="bullet">-</span> <span class="attr">name:</span> <span class="string">Push</span> <span class="string">javadocs</span> <span class="comment"># 推送</span></span><br><span class="line">        <span class="attr">run:</span> <span class="string">|</span></span><br><span class="line"><span class="string">          cd docs</span></span><br><span class="line"><span class="string">          git push origin HEAD:gh-pages --force</span></span><br></pre></td></tr></table></figure><p>随后，推送项目，在Actions界面找到该配置，手动触发一次。</p><p><img src="images/run-action.png" alt="run-action" loading="lazy"></p><p>等待其正常跑完，即可发现多了一个 <code>gh-pages</code> 分支。</p><h3 id="4-设置-Github-Pages"><a href="#4-设置-Github-Pages" class="headerlink" title="4. 设置 Github Pages"></a>4. 设置 Github Pages</h3><p>在项目的Settings界面找到 Pages 一栏，选择 <code>gh-pages</code> 分支，点击 Save ，等待片刻即可访问 <code>&lt;用户名&gt;.github.io/&lt;项目名&gt;</code> 看到项目的Javadoc了。</p><p><img src="images/setting-pages.png" alt="Setting Pages.png" loading="lazy"></p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><ul><li>&lt; <a href="https://docs.github.com/en/actions">Github Actions Documentation</a> &gt;</li><li>&lt; <a href="https://maven.apache.org/plugins/maven-javadoc-plugin/index.html">Apache Maven Javadoc Plugin</a> &gt;</li><li>&lt; <a href="https://ucsb-cs56-pconrad.github.io/topics/javadoc_publishing_to_github_pages_from_public_repo/">javadoc: publishing to github pages from a public repo</a> &gt;</li></ul>]]></content:encoded>
      <category>开发</category>
      <category>GitHub</category>
      <category>经验总结</category>
      <category>Java开发</category>
    </item>

    <item>
      <title>为什么Git分支开始从&quot;master&quot;变为&quot;main&quot;了？</title>
      <link>https://pages.carm.cc/dev/branch-main</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/branch-main</guid>
      <pubDate>Tue, 02 Nov 2021 05:32:02 GMT</pubDate>
      <description><![CDATA[探讨 Git 默认分支从 master 改为 main 的社会背景与技术变革，以及如何迁移现有项目。]]></description>
      <content:encoded><![CDATA[<h2 id="发现"><a href="#发现" class="headerlink" title="发现"></a>发现</h2><p>一开始接触 Git 的时候，默认的分支名都为 <code>master</code> ，包括后续使用的时候也习惯于输入<code>master</code>进行各类操作。</p><p>而我最近发现，<a href="https://github.com/">Github</a> 与 <a href="https://about.gitlab.com/">Gitlab</a> 都开始使用 <code>main</code> 取代原先的 <code>master</code><br>作为项目的默认主分支了，这是为什么呢？</p><h2 id="起源-“Black-Lives-Matter”"><a href="#起源-“Black-Lives-Matter”" class="headerlink" title="起源 - “Black Lives Matter”"></a>起源 - “Black Lives Matter”</h2><p>自2020年六月起，由于“Black Lives Matter”抗议活动持续发酵，而计算机行业中对<code>master</code>与<code>slave</code>这两个词的使用引起了部分人的反感。</p><p>在抗议声起、社会动荡加剧之时，更多的人认为这些包含历史文化因素的词汇已经过时，且应当被替换，于是多个开源项目开始采取行动替换冒犯性的术语，其中包括<br>PHPUnit 和 Curl、OpenZFS 等。</p><p>不仅仅是<code>master</code>与<code>slave</code>,还有许多相关的词汇如<code>whitelist</code>与<code>blacklist</code>都被计划更改为<code>allowList</code>与<code>denyList</code>。</p><p>正如 <a href="https://www.zdnet.com/article/github-to-replace-master-with-main-starting-next-month/">ZDNet</a><br>所说，继续使用这些带有种族色彩的词汇可能会延长种族歧视。一些学者在 2018 年的期刊上写道，“这些术语不仅反映了种族主义文化，而且还强化、合法化和延续了它。”</p><p>而 LinkedIn 的软件工程师 Gabriel Csapo 也在 Twitter 上表示，他也正在提出更新 Microsoft 内部库的请求，并删除任何带有种族歧视色彩的短语。</p><h2 id="行动"><a href="#行动" class="headerlink" title="行动"></a>行动</h2><p>在此背景下，一位Twitter网友的提议，而这一提议得到了GitHub CEO的支持。<br><img src="images/una_kravets.png" alt="Twitter" loading="lazy"></p><blockquote><p><strong>@Una Kravets</strong><br>我很高兴将 GitHub 的默认分支结构从『master』改成『main』，我希望我们能和 @GitHub 一起以社区为单位来做这件事……<br><strong>@Nat Friedman</strong><br>这是个好主意！ 我们正在朝这方面进行改进了！</p></blockquote><p>于是自 2020年10月1日 开始，Github上所有的新库便都开始以 <code>main</code> 命名，并开始逐渐的将原先<code>master</code>为主分支的库修改为以<code>main</code><br>为主分支。</p><p>鉴于GitHub有4000多万用户、1亿多个存储库以及至少2800万个公共存储库，这是项艰巨的任务。<br>任何一个规划的失误都会导致Linux内核之类的项目代码无法访问。全球大批企业依赖Linux内核，一旦发生这类事件都可能引发灾难性的后果。</p><p>于是，GitHub又做了以下更改以确保万无一失：</p><ul><li><a href="https://github.blog/changelog/2020-07-17-links-to-deleted-branches-now-redirect-to-the-default-branch/">更新了 GitHub.com</a><br>以直接重定向<code>master</code>分支到新的默认分支！</li><li><a href="https://github.blog/changelog/2020-07-31-build-and-deploy-github-pages-from-any-branch-beta/">更新了 Github Pages</a><br>以支持从任一分支进行部署</li><li><a href="https://github.blog/changelog/2020-08-26-set-the-default-branch-for-newly-created-repositories/">添加了用户、组织与企业设定</a><br>以设定默认的分支名与新项目的默认分支名。<ul><li>需要注意的是，这些设定同时在 <a href="https://github.com/new">GitHub.com</a><br>与 <a href="https://developer.github.com/v3/guides/getting-started/#create-a-repository">GitHub API</a> 生效。</li><li><a href="https://github.blog/2020-07-27-highlights-from-git-2-28/#introducing-init-defaultbranch">Git 2.28</a> 也添加了一个类似的设定<br><code>init.defaultBranch</code>。</li></ul></li><li><a href="https://github.com/github/renaming#rename-existing">我们让重命名已有分支更加方便快捷了</a></li></ul><h2 id="参与"><a href="#参与" class="headerlink" title="参与"></a>参与</h2><p>如果还是习惯于使用 <code>master</code> 分支，那么大可不用更改继续使用下去。</p><p>若想要支持相关的行动，则可以跟随以下的操作将<code>master</code>分支无损迁移到<code>main</code>分支。</p><h3 id="本地修改分支"><a href="#本地修改分支" class="headerlink" title="本地修改分支"></a>本地修改分支</h3><ol><li><p>首先将<code>master</code>分支移到<code>main</code>分支下</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git branch -m master main</span><br></pre></td></tr></table></figure></li><li><p>随后将新命名的分支<code>main</code>推送到远程库中</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push -u origin main</span><br></pre></td></tr></table></figure></li><li><p>再将HEAD指向<code>main</code>分支</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git symbolic-ref refs/remotes/origin/HEAD refs/remotes/origin/main</span><br></pre></td></tr></table></figure></li><li><p>最后删除远程库中旧的<code>master</code>分支即可</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">git push origin --delete master</span><br></pre></td></tr></table></figure></li></ol><h3 id="在-GitHub-上修改默认分支"><a href="#在-GitHub-上修改默认分支" class="headerlink" title="在 GitHub 上修改默认分支"></a>在 GitHub 上修改默认分支</h3><p>用户、组织和企业可以在以下地址修改默认分支名。</p><ul><li>用户 <code>https://github.com/settings/repositories</code></li><li>组织所有者 <code>https://github.com/organizations/&lt;组织名&gt;/settings/repository-defaults</code></li><li>企业管理员 <code>https://github.com/enterprises/&lt;企业名&gt;/settings/member_privileges</code></li></ul><p><img src="images/settings.png" alt="Settings" loading="lazy"></p><h2 id="参考文献"><a href="#参考文献" class="headerlink" title="参考文献"></a>参考文献</h2><ul><li>&lt; <a href="https://github.com/github/renaming">Github Renaming</a> &gt;</li><li>&lt; <a href="https://www.zdnet.com/article/github-to-replace-master-with-main-starting-next-month/">GitHub to replace ‘master’ with ‘main’ starting next month</a> &gt;</li><li>&lt; <a href="https://www.theserverside.com/feature/Why-GitHub-renamed-its-master-branch-to-main">Why GitHub renamed its master branch to main</a> &gt;</li></ul>]]></content:encoded>
      <category>开发</category>
      <category>GitHub</category>
    </item>

    <item>
      <title>记首次实现3D设计与打印的经历</title>
      <link>https://pages.carm.cc/story/2021/first-3d-design</link>
      <guid isPermaLink="true">https://pages.carm.cc/story/2021/first-3d-design</guid>
      <pubDate>Tue, 29 Jun 2021 07:30:00 GMT</pubDate>
      <description><![CDATA[记录首次为 PiKVM 设计并打印 3D 外壳的完整过程，包括设计、失败、改进的实战经验。]]></description>
      <content:encoded><![CDATA[<h2 id="起因"><a href="#起因" class="headerlink" title="起因"></a>起因</h2><p>自己在家里组了一个机柜，有多个服务器设备需要管理。看到 <a href="https://pikvm.org/">PiKVM</a> 这个项目后觉得非常有趣，很快就搓了一个。</p><p>刚搓完的成品就直接固定在一块木板上，随后给木板打了几个孔，直接用螺丝固定在机柜上。<br>说真的，每次看到那个 PiKVM “板子”，我心里都发虚。虽然功能上完全满足了需求，但那几根红红绿绿的杜邦线在外头晃荡，怎么看也不太安全。<br><img src="images/before.png" alt="before" loading="lazy"></p><p><strong>不行，这得改。</strong></p><p>我手头刚好有一台创想三维的 CR-6 SE，但现在的我对 3D 设计的认知基本还停留在“画个方块”的水平。<br><img src="images/3d-printer.jpg" alt="3D打印机" loading="lazy"></p><p>既然有了这个需求，不如趁此机会，就自己设计一个外壳吧。</p><h2 id="开始设计"><a href="#开始设计" class="headerlink" title="开始设计"></a>开始设计</h2><p>最开始的设计是一个凹下去的盒子和一个盖板，直接把 PiKVM 的主板放在盒子里，然后直接盖上盖板。</p><p>然而这个设计的缺点是没有考虑到3D打印的局限性。</p><p>切片软件跳出“17小时”那个数字的时候，我就开始挠头了。我所持的是一台开放式的 FDM<br>打印机，所以在打印过程中很难保证能完全成功的打印一整个盒子，而且如果打印失败了，就只能重新打印整个盒子，浪费时间和材料。</p><p>于是我便将盒子的各个面设计成了单独的部件，这样即使某个部件打印失败了，也只需要重新打印那个部件就好了。<br>各个部件之间用方形点链接，这样就可以保证它们能够正确的对齐并牢固的连接在一起。</p><p><img src="images/design.jpg" alt="design" loading="lazy"></p><p><strong>出稿，拆件，打印！</strong></p><p>那天下午特别闷，房间里全是那种 PLA<br>耗材熔化后的甜腻味儿。设计的底板件的面积比较大，所以在打印过程中出现了翘边的问题。更绝的是，挤出机那边居然开始打滑，“哒、哒、哒”地干磨。我摸了一下挤出机的电机，烫得手指生疼。</p><p><strong>原来是打印时间过长，电机过热，耗材全在里头软成烂泥了。</strong></p><p>没办法，我翻出个不知道哪儿拆下来的旧散热片，用硅脂粘在在电机上。<br>又掏出个小风扇，直接对着电机吹，试图让它降温。虽然这个方法有点土，但至少确实有效了。</p><p>拿着失败件先对一下尺寸，才发现尺寸设计的也有误，空位无法完全对齐，而最终导致其他部件也都无法正确的安装在底板上。<br><img src="images/wrong-holes-2.jpg" alt="错误的孔位" loading="lazy"></p><p>修改，再试打印底板。空位确实是对上了，可惜仍然出现了翘边的问题。考虑到材料的浪费和时间的消耗… 将就着用吧。</p><p>随后就是剩余部件的打印了。一样的，打印，翘边，再打印，失败，再打印，炒面，打印……总之就是反复的失败和打印，直到最后所有部件都成功的打印出来了。</p><p><img src="images/failed-prints.jpg" alt="失败的部件" loading="lazy"></p><p>中途X轴的电机轴居然还断了，得亏还有备用的42步进电机，不然就只能等快递了。<br><em><del>要不然说 3D打印 的本质是修3D打印机呢(</del></em></p><p><img src="images/broken-motor.jpg" alt="断轴" loading="lazy"></p><p>剩下的就是喜闻乐见的最终组装了。由于之前设计的连接点比较牢固，所以组装起来还是比较顺利的。</p><p><img src="images/case-open.png" alt="组装" loading="lazy"><br><img src="images/case-gears.jpg" alt="组装" loading="lazy"></p><p>成品还是不错的。虽然表面还有点拉丝，虽然有点寄出缺陷，虽然有点翘边，虽然一捏就容易变形…<br>但还是非常满意的。毕竟这是我第一次设计和打印3D模型，能成功的完成已经不错了。</p><p><img src="images/case-front.jpg" alt="正面" loading="lazy"><br><img src="images/case-back.jpg" alt="背面" loading="lazy"></p><h2 id="思考与总结"><a href="#思考与总结" class="headerlink" title="思考与总结"></a>思考与总结</h2><p>回望这次从 0 到 1 的首次设计，收获远在成品之外：</p><ol><li><p><strong>设计必须服务于工艺。</strong><br>在电脑里画出的精美模型，如果无视物理世界的重力、热缩和机械精度，那只能称之为“数字雕塑”。优秀的工程师应当提前在脑海中模拟打印机的每一个动作，根据设备特性去倒推零件的结构，这远比画图本身更重要。</p></li><li><p><strong>模块化是风险管理的必修课。</strong><br>整体式设计虽然美观，但在抗风险能力上极其脆弱。将复杂系统拆解为可替换、可重构的小模块，不仅适用于软件开发中的解耦，在物理制造中同样是节省成本、提高迭代效率的黄金法则。</p></li><li><p><strong>拥抱“不完美”的勇气。</strong><br>工程实践中没有绝对的完美。为了进度而妥协的微小翘边底板、为了强度而增加的粗糙加固筋，都是解决现实问题的勋章。完成优于完美，在不断的反馈循环中迭代，才是技术进化的唯一路径。</p></li></ol><p>如今这机器仍然在我家机柜里默默地工作着，虽然外表看起来只是一个普通的塑料盒子，但它背后却凝聚了我无数次的尝试、失败和改进。<strong>这不仅仅是一个作品，更是我第一次3D设计与打印经历的见证。</strong></p>]]></content:encoded>
      <category>往事</category>
      <category>设计</category>
      <category>3D打印</category>
      <category>嵌入式开发</category>
    </item>

    <item>
      <title>【上手实测】小米降噪耳机Pro FlipBuds Pro 一周使用体验与购买建议</title>
      <link>https://www.bilibili.com/video/BV1C54y1V7hz</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1C54y1V7hz</guid>
      <pubDate>Thu, 27 May 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[个人一周使用心得。 视频为主观言论，仅对本人手上的这对耳机负责哦。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1C54y1V7hz">点击此处查看本视频 &gt;&gt;</a></p><p>个人一周使用心得。<br>视频为主观言论，仅对本人手上的这对耳机负责哦。</p>]]></content:encoded>
      <category>视频</category>
      <category>小米</category>
      <category>体验</category>
      <category>蓝牙耳机</category>
      <category>降噪耳机</category>
      <category>FlipBudsPro</category>
    </item>

    <item>
      <title>FilpBuds Pro降噪耳机在小米10/10 Pro上的设置入口</title>
      <link>https://www.bilibili.com/video/BV1d64y1C7CY</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1d64y1C7CY</guid>
      <pubDate>Fri, 21 May 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[希望MIUI尽快更新放出入口叭，太难找了。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1d64y1C7CY">点击此处查看本视频 &gt;&gt;</a></p><p>希望MIUI尽快更新放出入口叭，太难找了。</p>]]></content:encoded>
      <category>视频</category>
      <category>智能生活大作战</category>
      <category>小米</category>
      <category>耳机</category>
      <category>降噪</category>
      <category>降噪耳机</category>
      <category>小米10</category>
    </item>

    <item>
      <title>【开发日记】YourCraft决斗游戏又更新了~</title>
      <link>https://www.bilibili.com/video/BV1TK4y1Q7Nw</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1TK4y1Q7Nw</guid>
      <pubDate>Sat, 13 Feb 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[YourCraft Team 2021 YC小游戏① 966485310 YC小游戏② 973478638 ———————————— 该视频在决斗游戏内部测试中录制，该视频录制过程中没有任何动物收到伤害。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1TK4y1Q7Nw">点击此处查看本视频 &gt;&gt;</a></p><p>YourCraft Team 2021<br>YC小游戏① 966485310<br>YC小游戏② 973478638<br>————————————<br>该视频在决斗游戏内部测试中录制，该视频录制过程中没有任何动物收到伤害。</p>]]></content:encoded>
      <category>视频</category>
      <category>我的世界</category>
      <category>MINECRAFT</category>
      <category>游戏开发</category>
      <category>你的世界</category>
      <category>YC</category>
      <category>YourCraft</category>
      <category>游戏头号玩家</category>
    </item>

    <item>
      <title>【开发日记】 YourCraft开发者间的决斗！(决斗游戏测试)</title>
      <link>https://www.bilibili.com/video/BV13o4y197Am</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV13o4y197Am</guid>
      <pubDate>Thu, 04 Feb 2021 00:00:00 GMT</pubDate>
      <description><![CDATA[YourCraft Team 2021 YC小游戏① 966485310 YC小游戏② 973478638 ———————————— 该视频在决斗游戏内部测试中录制，该视频录制过程中没有任何动物收到伤害。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV13o4y197Am">点击此处查看本视频 &gt;&gt;</a></p><p>YourCraft Team 2021<br>YC小游戏① 966485310<br>YC小游戏② 973478638<br>————————————<br>该视频在决斗游戏内部测试中录制，该视频录制过程中没有任何动物收到伤害。</p>]]></content:encoded>
      <category>视频</category>
      <category>PVP</category>
      <category>你的世界</category>
      <category>单挑</category>
      <category>MineCraft</category>
      <category>YourCraft</category>
    </item>

    <item>
      <title>Java写的阿里域名DDNS程序 配置简单运行稳定 还可以多域名更新</title>
      <link>https://www.bilibili.com/video/BV1t54y147aQ</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1t54y147aQ</guid>
      <pubDate>Wed, 09 Dec 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[如果你想要这个软件的话，可以私信给我你的邮箱，我看到后会尽快发给你哦~ 使用aliyun DDNS 支持A记录和AAAA记录，公网IPv6均可正常使用。 --- 2021年11月1日更新 项目最近重构了一次，并公开于github，喜欢的小伙伴可以star一下哦~ 项目地址 https://github.com/CarmJos/AliDDNS-Updater 软件下载 https://github.com/CarmJos/AliDDNS-Updater/releases]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1t54y147aQ">点击此处查看本视频 &gt;&gt;</a></p><p>如果你想要这个软件的话，可以私信给我你的邮箱，我看到后会尽快发给你哦~</p><p>使用aliyun DDNS 支持A记录和AAAA记录，公网IPv6均可正常使用。</p><p>--- 2021年11月1日更新<br>项目最近重构了一次，并公开于github，喜欢的小伙伴可以star一下哦~</p><p>项目地址 https://github.com/CarmJos/AliDDNS-Updater<br>软件下载 https://github.com/CarmJos/AliDDNS-Updater/releases</p>]]></content:encoded>
      <category>视频</category>
      <category>B站有潮玩</category>
      <category>服务器</category>
      <category>JAVA</category>
      <category>程序员</category>
      <category>教程</category>
      <category>阿里云</category>
      <category>互联网</category>
      <category>DDNS</category>
    </item>

    <item>
      <title>写给一位cn2b2t玩家的信</title>
      <link>https://pages.carm.cc/story/2020/cn2b2t</link>
      <guid isPermaLink="true">https://pages.carm.cc/story/2020/cn2b2t</guid>
      <pubDate>Mon, 02 Nov 2020 05:32:02 GMT</pubDate>
      <description><![CDATA[一封写给 cn2b2t 玩家的告别信，回顾项目历程并表达对未来的期许。]]></description>
      <content:encoded><![CDATA[<p>尊敬的cn2b2t玩家：</p><p>您好！</p><p>一九年的七月二十日，我心血来潮，花了短短的一会时间制作了cn2b2t。令我意向不到的是，这小小的举动竟然引起了许多玩家的响应，让我们这群充满梦想与激情的开发者更有了一丝前进的动力。但有意经营管理经验不足，2020年7月17日，我们无奈的选择关服休整，让所有开发者回归学业，并尽力去打拼自己的未来。</p><p>我们不得不向您致歉，我们使大量的玩家失去了过往的汗水与记忆，也失去了部分游戏中的战友，这也令我们难以释怀。好在，还有您愿意从我们手中接走回忆的接力棒，我也相信您也会很好的保留这些美好的记忆，谢谢您。</p><p>同时我也须向您致歉，由于服务器数据保存不当，自2020年6月换新服后的数据难以读取，故我拷贝给予您的副本是较老的地图文件，还请您谅解。</p><p>Kar Network承载了我们数十位开发者、管理者的游戏梦，如今距关服已有三个月，回首过去，有喜悦，也有遗憾。喜悦在于拥有你们这些支持我们的玩家，遗憾则是我们没有为你们交出完美的答卷。我们会吸取过往的教训，总结成功的经验，并在不久的将来进行新的尝试。我们坚信，唯有用心与坚持，才能抓住新的机会。</p><p>我们一直在努力，我们希望您也实现自己梦想的道路上继续坚持。我相信，我们将会在不久的将来，以全新的姿态，与您再会。这条梦想之路，我们与您手牵手，共同前行。</p><p>望共勉！</p><div align=right>    <div>CarmJos</div>    <div>        2020年11月2日    </div></div><h2 id="后记"><a href="#后记" class="headerlink" title="后记"></a>后记</h2><p>本项目代码已开源，见 <a href="https://github.com/CarmJos/cn2b2t-project">cn2b2t-project(Github.com)</a> 。如有需要可自取，希望能对社区有所帮助。</p>]]></content:encoded>
      <category>往事</category>
      <category>MineCraft</category>
    </item>

    <item>
      <title>Kar Network 关服通知</title>
      <link>https://pages.carm.cc/story/2020/kar-closed</link>
      <guid isPermaLink="true">https://pages.carm.cc/story/2020/kar-closed</guid>
      <pubDate>Fri, 17 Jul 2020 07:30:00 GMT</pubDate>
      <description><![CDATA[Kar Network Minecraft 服务器的关服告别信，回顾五年的运营历程并向玩家致歉。]]></description>
      <content:encoded><![CDATA[<h2 id="来自全体管理组成员的致歉书"><a href="#来自全体管理组成员的致歉书" class="headerlink" title="来自全体管理组成员的致歉书"></a>来自全体管理组成员的致歉书</h2><p>亲爱的玩家，大家好：</p><p>自 2015 年首次开服以来，Kar Network 已经陪伴大家五个春秋，得到了广大玩家的支持与厚爱。回顾开服以来我们和各位一起度过了无数个欢乐的日子，由衷的感激大家给予的支持与帮助！</p><p>由于运营不当，自2015年起遍入不敷出，至此已无法继续承担高额的维护费用。且由于现有所有服务环境(包括但不限于 服务管理器、开发站、服务器官网、服务器运行环境、构建开发环境)均基于本台主机，，这些环境所花费的金钱、时间和精力无法复制，无法还原，也就直接告示着未来的维护不再可能，我们在MineCraft的路上就此终结。</p><p>综上所述，Kar Network、MineCarl 及其附属、相关服务器将在2020年7月20日凌晨00:00停止服务。</p><p>借此机会，通知所有使用本团队运行环境的个体、团队，在关服前迁移所有相关数据，如关服后存在数据遗失问题，本团队概不负责，恳请谅解。</p><p>最后感谢您的陪伴，希望在往后的日子里能与您共同回忆这段美好时光。也希望能在我们未来开发的其他游戏中再次见到您的身影。</p><p>希望国内MineCraft的未来更加美好。若您还在寻找一个适合您的服务器，可以尝试访问 <code>McLists.cn</code>。</p><p>祝大家生活愉快。</p><div align=right>    <div>Kar Network运营团队</div>    <div>        2020年7月17日    </div></div>]]></content:encoded>
      <category>往事</category>
      <category>MineCraft</category>
    </item>

    <item>
      <title>建 议 改 成：砖 业 抬 棺 人 写 殆 码</title>
      <link>https://www.bilibili.com/video/BV1gT4y137ow</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1gT4y137ow</guid>
      <pubDate>Sun, 26 Apr 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[服务器IP: Kar.RED 直播写的代码！]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1gT4y137ow">点击此处查看本视频 &gt;&gt;</a></p><p>服务器IP: Kar.RED<br>直播写的代码！</p>]]></content:encoded>
      <category>视频</category>
      <category>发现《Roundabout》</category>
      <category>MINECRAFT</category>
      <category>游戏开发</category>
      <category>我的世界</category>
      <category>标准结局</category>
      <category>黑人抬棺</category>
      <category>单机联机</category>
    </item>

    <item>
      <title>Kar.RED 宣传片 | 五年老服务器Kar，青春回归！</title>
      <link>https://www.bilibili.com/video/BV1e5411t7xb</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1e5411t7xb</guid>
      <pubDate>Tue, 21 Apr 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[Kar Network ，中国专业原创MC游戏社区。 青春五年，永不落幕。 服务器地址 Kar.RED (移动 yd.kar.red，联通lt.kar.red) 服务器QQ群 106660674 服务器官网 https://www.kar.red/ ------------------------------------------------------------- 制作者： Pinckus 素材来自服务器内玩家，均获得授权。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1e5411t7xb">点击此处查看本视频 &gt;&gt;</a></p><p>Kar Network ，中国专业原创MC游戏社区。<br>青春五年，永不落幕。  <br>服务器地址  Kar.RED (移动 yd.kar.red，联通lt.kar.red)<br>服务器QQ群  106660674<br>服务器官网 https://www.kar.red/ <br>-------------------------------------------------------------<br>制作者： Pinckus<br>素材来自服务器内玩家，均获得授权。</p>]]></content:encoded>
      <category>视频</category>
      <category>我的世界</category>
      <category>单机</category>
      <category>MC</category>
      <category>MINECRAFT</category>
      <category>游戏练级挑战</category>
    </item>

    <item>
      <title>Kar | 究极舒适 kb 3.0</title>
      <link>https://www.bilibili.com/video/BV1Mg4y1z7PZ</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1Mg4y1z7PZ</guid>
      <pubDate>Tue, 14 Apr 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[经过二次计算、润色与优化，kb 3.0正式推出！ 这..这也太舒服了吧？？？ 果然，多年开发，专业直击PVP领域，不愧是国内元老服务器。 服务器IP: Kar.red]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1Mg4y1z7PZ">点击此处查看本视频 &gt;&gt;</a></p><p>经过二次计算、润色与优化，kb 3.0正式推出！<br>这..这也太舒服了吧？？？<br>果然，多年开发，专业直击PVP领域，不愧是国内元老服务器。</p><p>服务器IP: Kar.red</p>]]></content:encoded>
      <category>视频</category>
      <category>PVP</category>
      <category>MINECRAFT</category>
      <category>我的世界</category>
      <category>单机联机</category>
      <category>kar</category>
    </item>

    <item>
      <title>对我的世界中PVP击退的研究报告</title>
      <link>https://pages.carm.cc/dev/knockback-study</link>
      <guid isPermaLink="true">https://pages.carm.cc/dev/knockback-study</guid>
      <pubDate>Fri, 03 Apr 2020 11:30:00 GMT</pubDate>
      <description><![CDATA[对 Minecraft PVP 击退机制的深入研究，通过代码分析和实验验证原版击退算法的工作原理与各参数的作用。]]></description>
      <content:encoded><![CDATA[<h1 id="“脚本小子”对MC击退的研究成果"><a href="#“脚本小子”对MC击退的研究成果" class="headerlink" title="“脚本小子”对MC击退的研究成果"></a>“脚本小子”对MC击退的研究成果</h1><p>该页面研究的是原版击退算法以及原版击退算法中的各值的作用。</p><p>通常我们在调整击退参数的时候，都是靠感觉去调的。Kar团队另辟蹊径，通过数据和代码的方式去理解和调整最合适的击退。为了贯彻我们<strong>决心</strong>做中国PVP服领头羊的理念，我们决定将我们的研究成果分享出去。</p><h2 id="对于代码的分析"><a href="#对于代码的分析" class="headerlink" title="对于代码的分析"></a>对于代码的分析</h2><h3 id="EntityLiving类"><a href="#EntityLiving类" class="headerlink" title="EntityLiving类"></a>EntityLiving类</h3><p>由于在nms中部分变量经过了混淆，所以只能通过猜测得出这些变量的意义。</p><p>在EntityLiving类中，玩家受到伤害时会触发<code>damageEntity</code>函数。</p><p><img src="images/EntityLiving1.png" alt="EntityLiving1.png" loading="lazy"></p><ul><li>d0为<strong>攻击者</strong>位置的X值减去<strong>受害者</strong>位置的X值，即为从<strong>受害者</strong>到<strong>攻击者</strong>的向量的X值。</li><li>d1初始值为<strong>攻击者</strong>位置的Z值减去<strong>受害者</strong>位置的X值，即为从<strong>受害者</strong>到<strong>攻击者</strong>的向量的Z值。</li></ul><p>我们把d0称为x，d1称为z，则</p><ul><li>若x²+z²&lt;0.0001，则将d1设为一个-1至1之间的随机值*(见下方)，再乘以0.01，同时将d0也进行一次这样的操作。</li><li>若x²+z²还是&lt;0.0001，则再进行一次，直到不满足这个条件为止。</li></ul><p>推测，这可能是两个玩家坐标一样或极度相近的时候，为防止产生0变量，生成一个随机的击退。为验证这个猜测，您可以tp一名玩家，此时您的坐标和这名玩家是一模一样的(其实会产生一点点差别)。接着打他一下，发现击退有时候不在您面前的方向，甚至有时候击退到身后去了。</p><p>*编个程统计一下这个随机数，进行100000000次(一亿次)模拟，发现其分布曲线是金字塔形。</p><p><img src="images/AlgorithmTest.png" alt="分布是折线.png" loading="lazy"></p><p>它看起来大概是这样：</p><p><img src="images/AlgorithmGraph.png" alt="折线.png" loading="lazy"></p><p>设该折线的方程为 y &#x3D; f(x), x∈(-1, 1)<br>很明显，该随机变量X落在(-x, x),x∈(0, 1)的几率为</p><p><img src="http://latex.codecogs.com/png.latex?%5Cfrac%7B%5Cint_%7B-n%7D%5E%7Bn%7Df(x)dx%7D%7B%5Cint_%7B-1%7D%5E%7B1%7Df(x)dx%7D=2x-x%5E2" alt="几率Latex" loading="lazy"></p><p>函数a中</p><p><img src="images/EntityLiving2.png" alt="EntityLiving2.png" loading="lazy"></p><p>其中的d0和d1即为上方所提的x和z<br>设一个变量f1为</p><p><img src="http://latex.codecogs.com/png.latex?f1%20=%20%5Csqrt%7Bd0%5E2%20&plus;%20d1%5E2%7D" alt="f1" loading="lazy"></p><p>即为该向量在水平面上投影的距离</p><ol><li>变量f2为0.4，我们把该值称为水平倍数，或者<code>Horizontal</code></li><li>将<code>motX</code>、<code>motY</code>、<code>motZ</code>分别除以2，我们把该值称为<code>Friction</code></li><li>接着将<code>motX</code> 减去 <code>x / f1 \* f2</code></li><li>将<code>motY</code> 加上 <code>f2</code></li><li>将<code>motZ</code> 减去 <code>z / f1 \* f2</code></li><li>如果<code>motY</code>大于0.4，则设为0.4(这就是原版击退100附魔也无法飞天只能击远的原因)。我们把该值称为<code>VerticalLimit</code>。</li></ol><p>以上即为当受害者受到伤害时的原始击退算法。详细讲解请看下方<strong>对原版击退算法的理解</strong>。</p><h3 id="EntityHuman类"><a href="#EntityHuman类" class="headerlink" title="EntityHuman类"></a>EntityHuman类</h3><p>接着在<strong>攻击者</strong>的算法中，再次对产生的击退做出修正。</p><p>在EntityHuman类中,<strong>攻击者</strong>攻击别人时，<strong>受害者</strong>会受到以下击退</p><p><img src="images/EntityHuman1.png" alt="EntityHuman1.png" loading="lazy"></p><p>其中，<code>i</code>为<strong>攻击者</strong>手上武器击退附魔的等级，若没有，则为0。<br>如果<strong>攻击者</strong>正在疾跑，则<code>i</code>再加1。<br>但是，在著名服务端mSpigot上，无论<strong>攻击者</strong>是否在疾跑，i的默认值都为1。</p><p>yaw是<strong>攻击者</strong>的朝向的yaw值<s>(欧拉角警告)</s>，是角度制，所以后面的乘以π除以180是转为弧度制。<br><code>entity.g(double motX, double motY, double motZ)</code>函数为</p><p><img src="images/Entity1.png" alt="Entity1.png" loading="lazy"></p><p>意思为，该实体目前的速度向量加上这三个值，再把成员<code>ai</code>改为<code>true</code>。<br>回到上面的击退计算，其中MathHelper是一个优化的数学<s>工具人</s>工具类<br>于是，该操作可写为</p><p><img src="http://latex.codecogs.com/png.latex?%5Cbegin%7Bcases%7D%0AmotX=motX+%5Csin%7B%5Cfrac%7Byaw*%5Cpi%7D%7B180%C2%B0%7D*0.5i%7D%5C%5C%0AmotY=motY+0.1%5C%5C%0AmotZ=motZ+%5Csin%7B%5Cfrac%7Byaw*%5Cpi%7D%7B180%C2%B0%7D*0.5i%7D%0A%5Cend%7Bcases%7D" alt="Algorithm-1(Latex)" loading="lazy"></p><p>完成这些操作后，<strong>攻击者</strong>的<code>motX</code>和<code>motZ</code>各自会乘以0.6。</p><div class="admonition warning"><p>是<strong>攻击者</strong>的<code>motX</code>和<code>motZ</code>会乘以0.6！<strong>受害者</strong>的击退已经算完了，不会乘以0.6缩短！</p></div><p>由于我们平时在竞技场模式中并不会使用带击退附魔的东西当主武器，所以我们不考虑击退附魔。因此，我们只考虑<code>i</code>为0或1的情况。详细讲解请看下方<strong>对原版击退算法的理解</strong><br>我们把上面的0.5i的0.5称为疾跑水平加成(<code>SprintHorizontalBoost[SHB]</code>)，motY加的0.1称为疾跑竖直加成(<code>SprintVerticalBoost[SVB]</code>)</p><h2 id="猜测与实验"><a href="#猜测与实验" class="headerlink" title="猜测与实验"></a>猜测与实验</h2><p>玩家的击退对于<strong>攻击者</strong>的朝向只跟<strong>攻击者</strong>的yaw值有关，也就是环顾四周时的方向、水平方向有关，和pitch，也就是上下朝向无关。无论<strong>攻击者</strong>从上往下还是从下往上攻击，击退的原始数值只跟<strong>攻击者</strong>的yaw值和<strong>攻击者</strong>与<strong>受害者</strong>在水平面上的投影的向量有关，接着才根据玩家是否疾跑、武器有无击退、是否对该数值进行进一步计算。<br><strong>但是</strong>，如果<strong>攻击者</strong>既不在疾跑手上又没有击退附魔，则击退和yaw也无关。</p><p>为了证明这一点，在采用原版击退的情况下，我做了个实验。</p><p>先将敌人的坐标和自己的坐标精确控制在整数，以便计算。在所有条件都不变的情况下，攻击<strong>受害者</strong>，计算击退的大小。</p><p><img src="images/In-Game-Test.png" alt="实验1.png" loading="lazy"></p><table><thead><tr><th align="center"></th><th align="center">第一次</th><th align="center">第二次</th><th align="center">第三次</th></tr></thead><tbody><tr><td align="center">击退前x值坐标</td><td align="center">-34</td><td align="center">-34</td><td align="center">-34</td></tr><tr><td align="center">击退后x值坐标</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td></tr></tbody></table><p>重复3次实验发现，只要条件不变，每次击退都是一样的。</p><p>接下来，只改变<strong>攻击者</strong>的<strong>pitch值</strong>，其他条件不变。</p><table><thead><tr><th align="center">pitch-&gt;</th><th align="center">-10</th><th align="center">0</th><th align="center">10</th><th align="center">20</th><th align="center">30</th><th align="center">40</th></tr></thead><tbody><tr><td align="center">击退前x值坐标</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td></tr><tr><td align="center">击退后x值坐标</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td></tr></tbody></table><p>使用不同的值重复多次实验，发现击退还是一样的。</p><p>那么我们只改变<strong>攻击者</strong>的<strong>yaw值</strong>，其他条件不变。</p><table><thead><tr><th align="center">yaw-&gt;</th><th align="center">-100</th><th align="center">-95</th><th align="center">-90</th><th align="center">-85</th><th align="center">-80</th></tr></thead><tbody><tr><td align="center">击退前x值坐标</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td></tr><tr><td align="center">击退后x值坐标</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td><td align="center">-33.198</td></tr></tbody></table><p>神奇的是，yaw值改变后，击退依然不变。</p><p>接着，我们给<strong>攻击者</strong>手上的剑加上击退属性，再进行测试。<br>同样只改变<strong>攻击者</strong>的<strong>pitch值</strong>，发现确实跟<strong>攻击者</strong>的<strong>pitch值无关</strong>。</p><p>只改变<strong>攻击者</strong>的<strong>yaw值</strong>，得出以下结果：</p><table><thead><tr><th align="center">yaw-&gt;</th><th align="center">-100</th><th align="center">-95</th><th align="center">-90</th><th align="center">-85</th><th align="center">-80</th></tr></thead><tbody><tr><td align="center">击退前x值坐标</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td><td align="center">-35</td></tr><tr><td align="center">击退后x值坐标</td><td align="center">-31.034</td><td align="center">-31.009</td><td align="center">-31.001</td><td align="center">-31.009</td><td align="center">-31.034</td></tr><tr><td align="center">击退前z值坐标</td><td align="center">-49</td><td align="center">-49</td><td align="center">-49</td><td align="center">-49</td><td align="center">-49</td></tr><tr><td align="center">击退后z值坐标</td><td align="center">-49.371</td><td align="center">-49.182</td><td align="center">-49</td><td align="center">-48.818</td><td align="center">-48.629</td></tr></tbody></table><p>多次实验，发现每次结果都与上表相同。在<strong>攻击者</strong>手上附魔有击退效果时，击退与<strong>攻击者</strong>的<strong>yaw值有关</strong>。</p><p>我们多测试了如果是<strong>受害者yaw、pitch</strong>改变是否会影响击退，结果是<strong>受害者</strong>的朝向完全不影响击退，实验方式和上面差不多，篇幅原因，在此不列出实验详细过程。</p><p>测试<strong>攻击者</strong>疾跑对击退的影响，为了不改变坐标的值，写个插件欺骗服务器，<strong>攻击者</strong>在攻击时强制变成疾跑状态。测试结果是，疾跑状态攻击相当于手上拿着击退1的武器的效果。</p><p>因此我们可以推测，用击退1的武器疾跑着攻击对方，相当于行走状态或静止状态用击退2攻击对方一样。通过实验，证实了该推测。</p><p>我们再次推测，在击退与两个玩家的位置和<strong>攻击者</strong>的<strong>yaw值有关</strong>，且如果<strong>攻击者</strong>不在疾跑且手上武器没有击退附魔时，击退就只跟两名玩家的位置有关(除非去掉<code>if(i&gt;0)</code>代码块使<code>motY+0.1</code>强制生效，许多服务端都有这样做)。</p><p>用同样的方式，进行以下测试：</p><ul><li>测试<strong>攻击者</strong>与<strong>受害者</strong>所在位置存在高度差时，击退依然与上面一样，证明击退和高度差无关。</li><li>测试<strong>攻击者</strong>与<strong>受害者</strong>所在位置的距离不同时，击退依然和上面一样。</li><li>测试<strong>攻击者</strong>向<strong>受害者</strong>方向走动时攻击，击退依然和上面一样。</li><li>测试<strong>攻击者</strong>跳劈，发现无论是上升状态还是下降状态，击退依然和上面一样。</li></ul><p>当<strong>受害者</strong>在空中时受到攻击，一般击退距离会更远。我们通过编写插件，使玩家站在地上(坐标和上面一样)时欺骗服务器玩家在空中，结果发现击退依然和上面一样。推测因为在空中，在掉落到地面之前有更长的时间在空中滑行，造成的更远击退的感觉。由于方块有Friction属性，也就是当玩家落到地面时速度会迅速降低，而空气的<code>Friction</code>比方块的要低，所以玩家在空中能被击退得更远。</p><div class="admonition note"><p>这里所提到的方块<code>Friction</code>跟击退数值中的<code>Friction</code>不一样。</p></div><h2 id="各参数的作用"><a href="#各参数的作用" class="headerlink" title="各参数的作用"></a>各参数的作用</h2><p>回到参数上，如果不对原版击退的算法做出改变的话，仅修改算法中的几个参数，我们通常用感觉去判断击退的变化。通过了解上方原版击退的算法后，我们就可以知道那些参数的作用了。</p><p>原始击退是指在原始计算中得到的<code>motX</code>、<code>Y</code>、<code>Z</code>的值。目前市面上很多击退插件是在最终击退值上乘以某倍数。</p><h3 id="Friction"><a href="#Friction" class="headerlink" title="Friction"></a>Friction</h3><p>指在<strong>受害者</strong>受到攻击时，受到攻击前<strong>受害者</strong>的速度除以的值，一般大于1，这也是为什么它叫Friction(摩擦)的原因。如果该值等于1，那么此时玩家的速度将会加上击退赋予玩家的速度。如果小于1，则玩家的速度会变大再加上击退赋予玩家的速度。如果大于1，则玩家的速度会先缩短，再加上击退赋予玩家的速度。原版该值为2.0</p><h3 id="Horizontal"><a href="#Horizontal" class="headerlink" title="Horizontal"></a>Horizontal</h3><p>指<strong>原始</strong>击退参数的<code>motX</code>、<code>motZ</code>减去值的倍数，原版为0.4</p><h3 id="Vertical"><a href="#Vertical" class="headerlink" title="Vertical"></a>Vertical</h3><p>指<strong>原始</strong>击退参数的<code>motY</code>加上的值，原版为0.4</p><h3 id="SprintHorizontalBoost-SHB"><a href="#SprintHorizontalBoost-SHB" class="headerlink" title="SprintHorizontalBoost, SHB"></a>SprintHorizontalBoost, SHB</h3><p>指最终计算完毕的击退中的<code>motX</code>和<code>motZ</code>在<strong>攻击者</strong>水平面上所指位置(yaw值所对应位置)加上的，<strong>攻击者</strong>朝向的向量与x和z轴的投影距离，乘以击退附魔等级+若疾跑加一得到的倍数，再乘以的SHB，即原始数据再加上的击退距离的倍数，原版为0.5</p><h3 id="SprintVerticalBoost-SVB"><a href="#SprintVerticalBoost-SVB" class="headerlink" title="SprintVerticalBoost, SVB"></a>SprintVerticalBoost, SVB</h3><p>指最终计算完毕的击退中的<code>motY</code>再加上的值，原版为0.1</p><h3 id="VerticalLimit"><a href="#VerticalLimit" class="headerlink" title="VerticalLimit"></a>VerticalLimit</h3><p>原始击退计算中，最高达到的<code>motY</code>，若超过这个值，则设为这个值。原版为<code>0.4000000059604645</code></p><h2 id="对原版击退算法的理解-硬核慎入"><a href="#对原版击退算法的理解-硬核慎入" class="headerlink" title="对原版击退算法的理解(硬核慎入)"></a>对原版击退算法的理解(硬核慎入)</h2><p>注意，当玩家静止不动或者站在地面时，他的<code>motY</code>为<code>-0.0784</code>，虽然如此，玩家并没有往下掉，这可能是因为脚下有方块的时候就不往下掉，该值可能是为了制造重力。<br>这也可以说明，为什么<code>Friction</code>调到很小(如0.01)的时候攻击玩家几乎无击退，因为这时<code>motY</code>除以<code>0.01</code>会变成<code>-7.84</code>，强力压在地上，导致地面对玩家的摩擦力较大，使玩家难以移动。<br>如果玩家在水中踩到地面，该值为<code>-0.02</code>(也许是重力减去浮力？)</p><p>回到一开始，再次看到这个函数</p><p><img src="images/EntityLiving2.png" alt="EntityLiving2.png" loading="lazy"></p><p>首先<strong>受害者</strong>受到了<strong>攻击者</strong>的一次攻击。在计算击退之前，<strong>受害者</strong>目前的速度除以Friction以缩短目前的速度(见上方<code>Friction</code>)。通常该值只作用于玩家正在移动的过程中，比如疾跑或者正在被击退。如果玩家是静止的，那么<code>motX</code>和<code>motZ</code>都是0。<br>如果玩家是在下落状态，则<code>motY</code>是负值，如果这个时候玩家受到攻击，<code>motY</code>会缩小，下落速度会变慢，这也是玩家在空中掉落的过程中受到攻击时会顿一下的原因。</p><p>我们知道：</p><ul><li>d0为<strong>攻击者</strong>位置的X值减去<strong>受害者</strong>位置的X值，即为从<strong>受害者</strong>到<strong>攻击者</strong>的向量的X值。</li><li>d1为<strong>攻击者</strong>位置的Z值减去<strong>受害者</strong>位置的X值，即为从<strong>受害者</strong>到<strong>攻击者</strong>的向量的Z值。</li><li>f1为从<strong>受害者</strong>到<strong>攻击者</strong>的向量在水平面投影的长度。</li></ul><p>因此将d0和d1都除以f1后，向量<code>(d0/f1, d1/f1)</code>的模为1。<br>我们可以把一个长度为1的向量称为单位向量，它通常只为了表示方向。我们将把向量除以它的模的过程称为标准化向量，通常我们在只需要表示向量的方向，长度不重要，且要求该向量模为1的时候这样做。<br>接着两个值再乘以<code>f2</code>，即乘以0.4，表示把向量乘以0.4，也就是说把向量的模改为 根号0.32 。此时，水平面上的击退原始数据就计算完毕了。</p><p>至于为什么<code>motX</code>和<code>motZ</code>是减去运算得出的数值，是因为上面算出来的向量是从<strong>受害者</strong>指向<strong>攻击者</strong>的向量，我们需要让<strong>受害者</strong>往后击退，而不是往<strong>攻击者</strong>飞过去，所以才是减去。</p><p>再看到竖直上的击退，直接是目前的<code>motY</code>加上f2。最后，如果<code>motY</code>超过一个限制值(每错，就是那个小数点后老长的)，就设为那个限制值。您可能会问，才加0.4可能会超过吗？确实会，因为上面说过，在<strong>受害者</strong>再一次受到伤害前，玩家是飞在空中的。如果是combo模式(即玩家受到攻击后的无敌时间很短)，<strong>受害者</strong>再一次受到攻击时<code>motY</code>还很大，除以Friction后可能依然很大，所以为防止玩家飞起来就设置了一个限制值。</p><p>再来看击退修正，</p><p><img src="images/EntityHuman1.png" alt="EntityHuman1.png" loading="lazy"></p><p><code>entity.g</code> 这个函数可以理解为原速度加上目标速度，如<br><code>entity.g(1, 2, 3)</code>就是<code>entity.motX += 1; entity.motY += 2; entity.motZ += 3; </code><br><code>yaw * π / 180</code>就是将玩家朝向的欧拉角yaw值(角度)转为弧度。<br>在MC中，yaw的范围是<code>-180~179.9</code>。<br>也就是说，这里的<code>-sin(yaw * π / 180)</code>和<code>cos(yaw * π / 180)</code>依然是生成一个模为1的矢量。为什么模为1？我们把<code>yaw * π / 180</code>设为θ，由sin²θ + cos²θ &#x3D; 1可知，该向量模为1。<br>将该向量乘以<code>i</code> 再乘以<code>0.5</code>，即可得到水平上修正的向量。<br>其中，<code>i</code>默认为<code>0</code>，如果玩家在疾跑状态则<code>+1</code>，如果玩家手上的物品有击退附魔，则再+击退附魔等级。<br>最后，<code>motY</code>再加<code>0.1</code>。<br>在原版中，如果<code>i&gt;0</code>，才会执行这段代码，如果<code>i=0</code>，则该代码不被执行，也就是说，<code>motY</code>也不会<code>+0.1</code>。<br>在著名服务端mSpigot上，由于i默认为1，且疾跑不影响i的值，所以该代码永远会被执行。<br>最后，把算到的击退交给事件触发器，由事件再次对向量进行更改(如果有的话)，最终将击退速度发送给客户端。</p><p>我们可以看到，在算击退原始数据时，击退的方向是以玩家间的位置关系决定的。而在修正的过程中，却由<strong>攻击者</strong>的yaw值决定。这是印证了上面的实验。所以，如果有个玩家开挂，拿着击退棒背对着打你(请使用不会转过头去打的祖宗级秒被ban外挂实验并关闭反作弊)，你并不会往后退反而往黑客的方向飞去，也是这个道理。</p><h2 id="如何抄袭猜测某服务器的击退"><a href="#如何抄袭猜测某服务器的击退" class="headerlink" title="如何抄袭猜测某服务器的击退"></a>如何<del>抄袭</del>猜测某服务器的击退</h2><p>如果该服务器的击退数值不是离散的(在相同情况下，击退总是相同，没有产生随机偏移)，且算法为MC原版算法，那么该服的击退数值将非常好猜。</p><p>如果击退数值是离散的，那么可以通过统计算出击退数值的分布，然后根据分布的情况模拟随机的数值。比如上方的<code>Math.random() - Math.random()</code>就是-1<del>1中呈金字塔形的分布，如果是<code>Math.random()-0.5</code>就是在&#96;-0.5</del>0.5<code>比较均匀的分布。除此之外，还有正态分布(</code>new Random().nextGaussian();&#96;)等常见分布方式。</p><p>我们需要的随机偏移一般不能太大，所以再乘以一个数如0.1缩小随机偏移量的范围。最后根据统计得出的分布规律猜测偏移的算法即可。</p><p>由于每次击退服务器只会给你发送一个速度矢量，不可能在击退的过程中持续修正你的速度(不然延迟高的话就会乱飘。速度给你造成的位移一般由客户端计算)。所以，我们只要得出在各种情况下每次服务器发来的击退赋予的速度即可反推击退数值。</p><blockquote><p>为了方便获取击退数值，我特意写了一个mod来辅助您获取某服务器的击退。<br>版本: 1.8.9<br>请使用最新版本forge运行以保证兼容性(我们使用的forge版本是forge1.8.9-11.15.1.2318)<br><s>当然，别对该mod抱有太大期望，比如按f3会挡住啥的</s><br>链接: <a href="https://pan.baidu.com/s/11BJ3Rtw-4YTDXECzIXWzAg">https://pan.baidu.com/s/11BJ3Rtw-4YTDXECzIXWzAg</a> 提取码: 77f3 </p></blockquote><p>这个mod看起来是这样的：</p><p><img src="images/mod-preview.png" alt="mod.png" loading="lazy"></p><p><s>什么？你被查端的时候因为这个太像挂端被封了？怪我咯</s></p><ul><li>Sprint: 你是否为疾跑状态</li><li>Sneak: 你是否为潜行状态</li><li>OnGround: 您是否站在地面<ul><li>站在地面，指是否落地并站在地面。</li><li>如果玩家被击飞、或者跳跃，该值为false。</li><li>不过，如果玩家是在飞行状态，即使他的坐标是贴合地面的，OnGround也一定为false。</li></ul></li><li>MotionX: 您的速度矢量的X值</li><li>MotionY: 您的速度矢量的Y值</li><li>MotionZ: 您的速度矢量的Z值</li><li>Target: 您正在攻击的玩家的名字</li><li>Distance: 您与您正在攻击的玩家的距离</li><li>ShadowDistance: 您与您正在攻击的玩家的连线在水平面上的投影的距离<ul><li>为什么需要水平面上的投影的距离？如果您有看上方原版击退的算法的话，您就会明白，击退的y值是另算的，玩家之间的位置关系只会决定x和z，y几乎不受玩家间位置影响。</li></ul></li><li>TargetSprint: 您正在攻击的玩家是否为疾跑状态</li><li>TargetSneak: 您正在攻击的玩家是否为潜行状态</li><li>TargetOnGround: 您正在攻击的玩家是否站在地面</li></ul><div class="admonition note"><p class="admonition-title">为什么不顺便列出对方的速度矢量？</p><p>这是因为对方速度是服务器决定的，服务器只要告诉您对方的位置就可以了。服务端没必要把跟您无关的数据一并发送给您，浪费服务器资源，所以对方的速度矢量无意义。</p><p>准备好后，您可以找一个小伙伴，一起装这个mod，然后进入您想测试击退的服务器。接着双方各开启录制~~(建议120帧)~~，模拟出各种情况，然后在视频剪辑软件中看每次攻击时赋予的速度即可。</p><p>一定要记住有Friction这个值，也就是每次击退的时候会先削减<strong>受害者</strong>的速度，再加上计算出来的击退，不然在combo的时候每次值都不一样别以为是random再作祟。</p></div><h3 id="算法区别"><a href="#算法区别" class="headerlink" title="算法区别"></a>算法区别</h3><p>你猜测kb的服务器的算法不一定是原版算法，所以当您暴力计算后没得出任何结果的话，您可以再分析总体数据的变化和产生数据对应的情况去猜测算法。即便算法不一定相同，但只要最终算出来的结果是一样的，您的击退和你在<del>抄</del>的服务器的击退就是一样的。</p><div class="admonition note"><p>syuu和kar都是使用了不同于原版的击退算法。</p></div><p>然后您可以写一个算法暴力算出误差小于0.0001的击退。</p><h3 id="如何防止自己服的kb被盗"><a href="#如何防止自己服的kb被盗" class="headerlink" title="如何防止自己服的kb被盗"></a>如何防止自己服的kb被盗</h3><p>使最终计算出来的kb离散化，加上一些微小的随机的偏移，且使用的随机算法也是随机的(不然容易被使用统计方法算出随机算法)。总之，尽量在不影响kb总体感觉的情况下提高猜测kb的难度。</p><hr><h2 id="关于本文档"><a href="#关于本文档" class="headerlink" title="关于本文档"></a>关于本文档</h2><p>文档的主要研究者与作者: LSeng</p><p>文档编写参与者: CarmJos</p>]]></content:encoded>
      <category>开发</category>
      <category>MineCraft</category>
      <category>经验总结</category>
    </item>

    <item>
      <title>国内原创新玩法生存服海暮礁！教程来啦~</title>
      <link>https://www.bilibili.com/video/BV1JE411N77z</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1JE411N77z</guid>
      <pubDate>Sat, 21 Mar 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[作为 真 · 自主开发 服务器，咱的东西有点小问题正常，视频中出现的所有问题都已经被修复。 服务器ip:sea.privatemc.cn 版本1.7-1.14 (最好使用1.8进入) 开发用了大概200个小时吧23333，熬了几夜写的。 感谢内测元老们的支持~ 服务器缺一位腐竹，我没时间管理呀233，如果这里有哪位dalao粉丝量大于5000，可以联系哦~]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1JE411N77z">点击此处查看本视频 &gt;&gt;</a></p><p>作为 真 · 自主开发 服务器，咱的东西有点小问题正常，视频中出现的所有问题都已经被修复。</p><p>服务器ip:sea.privatemc.cn 版本1.7-1.14 (最好使用1.8进入)<br>开发用了大概200个小时吧23333，熬了几夜写的。</p><p>感谢内测元老们的支持~<br>服务器缺一位腐竹，我没时间管理呀233，如果这里有哪位dalao粉丝量大于5000，可以联系哦~</p>]]></content:encoded>
      <category>视频</category>
      <category>我的世界</category>
      <category>MINECRAFT</category>
      <category>单机联机</category>
      <category>自主开发</category>
    </item>

    <item>
      <title>建议改成：给 你 脸 了 ？</title>
      <link>https://www.bilibili.com/video/BV1i7411f7F5</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1i7411f7F5</guid>
      <pubDate>Mon, 16 Mar 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[视频中所有使用外挂的都被VAC了。 我是Carm，和朋友三黑。 遇到对面暴力锁头，美其名曰“Skill！” 。 于是...我们这位大哥看不下去了。 “给你脸了？”]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1i7411f7F5">点击此处查看本视频 &gt;&gt;</a></p><p>视频中所有使用外挂的都被VAC了。</p><p>我是Carm，和朋友三黑。</p><p>遇到对面暴力锁头，美其名曰“Skill！” 。</p><p>于是...我们这位大哥看不下去了。</p><p>“给你脸了？”</p>]]></content:encoded>
      <category>视频</category>
      <category>电子竞技</category>
      <category>CS</category>
      <category>AK</category>
      <category>CSGO精彩集锦</category>
    </item>

    <item>
      <title>【英文书写】意外的发现了练习斜体的好工具!</title>
      <link>https://www.bilibili.com/video/BV1UJ411V7FU</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1UJ411V7FU</guid>
      <pubDate>Tue, 07 Jan 2020 00:00:00 GMT</pubDate>
      <description><![CDATA[自行百度搜索俄语练习本应该就有了叭。 我知道我写字不好看，请弹幕大神和评论大神手下留情，谢谢。 只是为了表达发现新物品的喜悦，见识短浅，手下留情，谢谢。 如果有帮助到你也欢迎给个三连丫。 傻傻的写了一大堆字，嘿嘿↑。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1UJ411V7FU">点击此处查看本视频 &gt;&gt;</a></p><p>自行百度搜索俄语练习本应该就有了叭。<br>我知道我写字不好看，请弹幕大神和评论大神手下留情，谢谢。</p><p>只是为了表达发现新物品的喜悦，见识短浅，手下留情，谢谢。</p><p>如果有帮助到你也欢迎给个三连丫。</p><p>傻傻的写了一大堆字，嘿嘿↑。</p>]]></content:encoded>
      <category>视频</category>
      <category>书法</category>
      <category>学习</category>
      <category>日常</category>
      <category>圆体</category>
      <category>练字</category>
    </item>

    <item>
      <title>【大合唱】 向往西藏 (纪念一二九运动合唱比赛) 江浦高级中学2019届合唱团</title>
      <link>https://www.bilibili.com/video/BV1iJ411F7U8</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1iJ411F7U8</guid>
      <pubDate>Sun, 06 Oct 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[江浦高级中学2019届合唱团纪念一二九合唱比赛录制。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1iJ411F7U8">点击此处查看本视频 &gt;&gt;</a></p><p>江浦高级中学2019届合唱团纪念一二九合唱比赛录制。</p>]]></content:encoded>
      <category>视频</category>
      <category>音乐</category>
      <category>校园</category>
      <category>现场</category>
      <category>合唱比赛</category>
      <category>合唱团</category>
      <category>bilibili新星计划</category>
    </item>

    <item>
      <title>【墨瓷宣传片】六年磨一剑，自主开发的MC国内服！</title>
      <link>https://www.bilibili.com/video/BV1tJ41137Ci</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1tJ41137Ci</guid>
      <pubDate>Fri, 20 Sep 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[感谢观看。 墨瓷目前由一群初中生、高中生与大学生维护，从使用他人插件到如今完全自主开发，已过六年。 服务器地址为 Mocimc.cn (MineCraft.net正版) 。 如果您是一位盗版玩家，也可以尝试使用“offline.mocimc.cn”进入。 请注意，我们有权拒绝为盗版玩家提供帮助，如果您有能力，请支持正版。 一切详情，尽在Wiki。 https://wiki.mocimc.cn/#!index.md --------------------------------------------------------------------------- 本宣传片由 小伊(IPlayForLover)、六神(668ms)制作，在此致谢。 --------------------------------------------------------------------------- 更多墨瓷相关视频： 《【墨瓷】 决心做中国MC服务器领头羊。请君莫辞。【60FPS】》 https://www.bilibili.com/video/av26958593 《玩自己写的UHCMEETUP是一种什么样的感觉？ 》 https://www.bilibili.com/video/av59986485 ---------------------------------------------------------------------------- 由Glorstal与EX涛制作的墨瓷首曲电音已发布至网易云音乐。 《墨路》 (Progressive House（Edit）/Future House（Edit）)]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1tJ41137Ci">点击此处查看本视频 &gt;&gt;</a></p><p>感谢观看。<br>墨瓷目前由一群初中生、高中生与大学生维护，从使用他人插件到如今完全自主开发，已过六年。<br>服务器地址为 Mocimc.cn (MineCraft.net正版) 。<br>如果您是一位盗版玩家，也可以尝试使用“offline.mocimc.cn”进入。<br>请注意，我们有权拒绝为盗版玩家提供帮助，如果您有能力，请支持正版。<br>一切详情，尽在Wiki。<br>https://wiki.mocimc.cn/#!index.md<br>---------------------------------------------------------------------------<br>本宣传片由 小伊(IPlayForLover)、六神(668ms)制作，在此致谢。<br>---------------------------------------------------------------------------<br>更多墨瓷相关视频：<br>《【墨瓷】 决心做中国MC服务器领头羊。请君莫辞。【60FPS】》<br>https://www.bilibili.com/video/av26958593<br>《玩自己写的UHCMEETUP是一种什么样的感觉？ 》<br>https://www.bilibili.com/video/av59986485<br>----------------------------------------------------------------------------<br>由Glorstal与EX涛制作的墨瓷首曲电音已发布至网易云音乐。<br>《墨路》 (Progressive House（Edit）/Future House（Edit）)</p>]]></content:encoded>
      <category>视频</category>
      <category>发现《Skyland》</category>
      <category>我的世界</category>
      <category>原创</category>
      <category>单机联机</category>
      <category>MineCraft</category>
      <category>自主开发</category>
      <category>墨瓷</category>
    </item>

    <item>
      <title>《1819(自由之路Remix)》JY 原创歌曲录制首发</title>
      <link>https://www.bilibili.com/video/BV1bt41147Pd</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1bt41147Pd</guid>
      <pubDate>Sat, 26 Jan 2019 00:00:00 GMT</pubDate>
      <description><![CDATA[作词： 杨子睿 Rap：杨子睿 混音后期： 卡姆姬]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1bt41147Pd">点击此处查看本视频 &gt;&gt;</a></p><p>作词： 杨子睿<br>Rap：杨子睿<br>混音后期： 卡姆姬</p>]]></content:encoded>
      <category>视频</category>
      <category>帅哥</category>
      <category>原创</category>
      <category>说唱</category>
      <category>高中</category>
    </item>

    <item>
      <title>如何轻松卸下小米手环3/4的米粒？</title>
      <link>https://www.bilibili.com/video/BV1jt411o7ue</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1jt411o7ue</guid>
      <pubDate>Sat, 20 Oct 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[看到身边的人都是死扣才抠出来米粒，好难受哦。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1jt411o7ue">点击此处查看本视频 &gt;&gt;</a></p><p>看到身边的人都是死扣才抠出来米粒，好难受哦。</p>]]></content:encoded>
      <category>视频</category>
      <category>生活</category>
      <category>自制</category>
      <category>原创</category>
      <category>小技巧</category>
      <category>日常</category>
      <category>小米手环</category>
    </item>

    <item>
      <title>【墨瓷】 决心做中国MC服务器领头羊。请君莫辞。【60FPS】</title>
      <link>https://www.bilibili.com/video/BV1Ps411n7xF</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1Ps411n7xF</guid>
      <pubDate>Mon, 16 Jul 2018 00:00:00 GMT</pubDate>
      <description><![CDATA[感谢观看。墨瓷由私人组织制作，因此视频不含商业类型的推广。 服务器地址为 Mocimc.cn (MineCraft.net正版) 。 如果您是一位盗版玩家，也可以尝试使用“offline.mocimc.cn”进入。 请注意，我们有权拒绝为盗版玩家提供帮助，如果您有能力，请支持正版。 更多的消息，您可以访问我们的Wiki查看。 https://wiki.mocimc.cn/#!minecraft-network.md ---------------------------------------------------------------------------- 视频制作总时长(包含拍摄与预处理) 约40小时。 仿照Ultra服务器风格，当然，很明显就可以看出这个视频残了。 由 科莫、冬花、Gkz 、KUMR 录制，晨暮进行AE预处理和后期，KUMR善后。 本视频授权多位UP主发布。 ---------------------------------------------------------------------------- 更多墨瓷相关视频： 《不好意思，我们开服务器的真的可以为所欲为的。》 https://www.bilibili.com/video/av23029607 《拉坯。墨瓷正努力着。 (墨瓷片头) 》 https://www.bilibili.com/video/av22705492 ---------------------------------------------------------------------------- 由Glorstal与EX涛制作的墨瓷首曲电音已发布至网易云音乐。 《墨路》 (Progressive House（Edit）/Future House（Edit）)]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1Ps411n7xF">点击此处查看本视频 &gt;&gt;</a></p><p>感谢观看。墨瓷由私人组织制作，因此视频不含商业类型的推广。<br>服务器地址为  Mocimc.cn (MineCraft.net正版) 。<br>如果您是一位盗版玩家，也可以尝试使用“offline.mocimc.cn”进入。<br>请注意，我们有权拒绝为盗版玩家提供帮助，如果您有能力，请支持正版。<br>更多的消息，您可以访问我们的Wiki查看。<br>https://wiki.mocimc.cn/#!minecraft-network.md<br>----------------------------------------------------------------------------<br>视频制作总时长(包含拍摄与预处理) 约40小时。<br>仿照Ultra服务器风格，当然，很明显就可以看出这个视频残了。<br>由 科莫、冬花、Gkz 、KUMR 录制，晨暮进行AE预处理和后期，KUMR善后。<br>本视频授权多位UP主发布。<br>----------------------------------------------------------------------------<br>更多墨瓷相关视频：<br>《不好意思，我们开服务器的真的可以为所欲为的。》<br>https://www.bilibili.com/video/av23029607<br>《拉坯。墨瓷正努力着。 (墨瓷片头) 》<br>https://www.bilibili.com/video/av22705492<br>----------------------------------------------------------------------------<br>由Glorstal与EX涛制作的墨瓷首曲电音已发布至网易云音乐。<br>《墨路》 (Progressive House（Edit）/Future House（Edit）)</p>]]></content:encoded>
      <category>视频</category>
      <category>中国</category>
      <category>我的世界</category>
      <category>服务器</category>
      <category>网易</category>
      <category>Minecraft</category>
      <category>单机联机</category>
      <category>Kar</category>
      <category>墨瓷</category>
      <category>Soki</category>
      <category>Aries</category>
    </item>

    <item>
      <title>极度不适!!慎入!!!F网10刀翻6倍?! 我是托吧?!!</title>
      <link>https://www.bilibili.com/video/BV1Px411t7Br</link>
      <guid isPermaLink="true">https://www.bilibili.com/video/BV1Px411t7Br</guid>
      <pubDate>Tue, 29 Aug 2017 00:00:00 GMT</pubDate>
      <description><![CDATA[我开始怀疑我自己是托了。]]></description>
      <content:encoded><![CDATA[<p>此为视频内容，<a href="https://www.bilibili.com/video/BV1Px411t7Br">点击此处查看本视频 &gt;&gt;</a></p><p>我开始怀疑我自己是托了。</p>]]></content:encoded>
      <category>视频</category>
      <category>发现《Sex Apeal(Feat. Mike W.) (Max Farenthide Remix)》</category>
      <category>开箱</category>
      <category>CSGO</category>
      <category>F网</category>
      <category>极度不适</category>
      <category>FarmSkins</category>
    </item>
  </channel>
</rss>
