<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <id>https://shimmerfly.github.io/</id>
  <title type="text">𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫 の Blog</title>
  <subtitle type="text">爱你 妲妲</subtitle>
  <updated>2026-09-13T00:00:00.000Z</updated>
  <author><name>𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
  <link rel="alternate" href="https://shimmerfly.github.io/"/>
  <link rel="self" href="https://shimmerfly.github.io/atom.xml"/>
  <generator uri="https://github.com/CuteLeaf/Firefly">Firefly v6.16.8</generator>
    <entry>
      <id>https://shimmerfly.github.io/posts/Lineage-on-UTM/</id>
      <title type="text">【全网首发】在 macOS 上用 UTM 跑原生 arm64/x86_64 Android</title>
      <published>2026-09-05T00:00:00.000Z</published>
      <updated>2026-09-13T00:00:00.000Z</updated>
      <author><name>𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫 &amp; Tedangi</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/Lineage-on-UTM/"/>
      <summary type="text">在 macOS 上用 UTM 跑原生 arm64/x86_64 Android</summary>
      <content type="html"><![CDATA[<section><h1>准备工作<a href="#准备工作"><span>#</span></a></h1><blockquote><p>本教程用于在 macOS 上通过 UTM 运行原生 arm64/x86_64 Android。</p></blockquote><section><h2>下载所需文件<a href="#下载所需文件"><span>#</span></a></h2>

<table><thead><tr><th>#</th><th>所需文件 / 项目</th><th>说明</th><th>下载</th></tr></thead><tbody><tr><td>1</td><td><strong>Mac 电脑</strong></td><td>一台 Mac</td><td>—</td></tr><tr><td>2</td><td><strong>终端</strong></td><td>macOS 自带即可</td><td>—</td></tr><tr><td>3</td><td><strong><code>android-platform-tools</code></strong></td><td>建议使用 <code>brew install android-platform-tools --cask</code> 安装</td><td>—</td></tr><tr><td>4</td><td><strong><code>UTM.dmg</code></strong></td><td>所有 Mac · UTM 虚拟机</td><td><a href="https://github.com/utmapp/UTM" target="_blank">utmapp/UTM</a></td></tr><tr><td>5</td><td><strong><code>UTM-VM-lineage-**.*-yyyymmdd-jqssun-virtio_arm64only.zip</code></strong></td><td>主虚拟机文件 · arm64 · Apple Silicon</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr><tr><td>5</td><td><strong><code>UTM-VM-lineage-**.*-yyyymmdd-jqssun-virtio_*86_64.zip</code></strong></td><td>主虚拟机文件 · x86_64 · Intel Chip</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr><tr><td>6</td><td><strong><code>MindTheGapps-**.*.*-arm64-yyyymmdd_******.zip</code></strong></td><td><em>可选</em> · GApps Add-on · arm64 · Apple Silicon</td><td><a href="https://github.com/MindTheGapps/16.0.0-arm64" target="_blank">MindTheGapps/16.0.0-arm64</a></td></tr><tr><td>7</td><td><strong><code>recovery_arm64only-userdebug.img</code></strong></td><td><em>可选</em> · 用于刷入未经验证的刷机包（用于刷入 GApps）的 Recovery · arm64 · Apple Silicon</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr><tr><td>7</td><td><strong><code>recovery_x86_64-userdebug.img</code></strong></td><td><em>可选</em> · 用于刷入未经验证的刷机包（用于刷入 GApps）的 Recovery · x86_64 · Intel Chip</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr><tr><td>8</td><td><strong><code>boot_arm64only.img</code></strong></td><td><em>可选</em> · Root 用 · arm64 · Apple Silicon</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr><tr><td>8</td><td><strong><code>boot_x86_64.img</code></strong></td><td><em>可选</em> · Root 用 · x86_64 · Intel Chip</td><td><a href="https://github.com/jqssun/android-lineage-qemu" target="_blank">jqssun/android-lineage-qemu</a></td></tr></tbody></table><div><div><div></div><div>Caution</div></div><div><p>GApps 仅有 <code>arm64</code> 架构 <strong>如果你是 Intel Chip 用户 不要想了 没有你们对应架构的 GApps</strong> 如果安装了不对应架构的 GApps 系统将会 <code>bootloop</code></p><p><code>Recovery</code> 和 <code>boot.img(Kernel)</code> <strong>有架构区分 刷之前务必仔细核对</strong> 否则会出事</p></div></div><hr /></section></section>
<section><h1>设置虚拟机<a href="#设置虚拟机"><span>#</span></a></h1><ol>
<li>打开下载的 <code>.utm</code> 包</li>
<li>LineageOS 虚拟机设置 - Network - Network Mode - 选择 Shared Nework</li>
</ol><p></p><figure><img alt="网络配置" loading="lazy" width="932" height="685" src="/_astro/%E7%BD%91%E7%BB%9C%E9%85%8D%E7%BD%AE.li8gB-uR_1tVsNN.webp" /><figcaption>网络配置</figcaption></figure><p></p><section><h3>调整虚拟机存储<a href="#调整虚拟机存储"><span>#</span></a></h3><ol>
<li>虚拟机默认的 <code>16GiB</code> 内部存储肯定不够用 所以在第一次开机前建议更改虚拟机内部存储大小 不然后期想要调整需要恢复出厂设置</li>
</ol><div><div><div></div><div>Caution</div></div><div><p>分配前注意看磁盘名称 <strong>一定一定要 Resize <code>vdb-2.qcow2</code> 这个虚拟磁盘文件</strong> 这是 <code>userdata</code> 分区的盘</p><p>另一个 <code>vda-2.qcow2</code> 是 <code>system</code> 分区 <strong>随意调整此分区大小可能会导致不可预知的问题</strong></p><div><div><div></div><div>Note</div></div><div><p>Android 16 最大支持 <code>16TiB</code> 的磁盘 再高会 bootloop 但是不建议分配 <code>16TiB</code> 会导致 QEMU 模拟不正确 有概率导致虚拟机卡死</p></div></div></div></div><p></p><figure><img alt="磁盘扩容" loading="lazy" width="933" height="684" src="/_astro/%E7%A3%81%E7%9B%98%E6%89%A9%E5%AE%B9.aR_1f2sw_1zp9AH.webp" /><figcaption>磁盘扩容</figcaption></figure><p></p></section><section><h3>调整 CPU 与内存<a href="#调整-cpu-与内存"><span>#</span></a></h3><ol>
<li>接着来调整虚拟机内存大小和 CPU 核心数量</li>
</ol><div><div><div></div><div>Note</div></div><div><p>CPU 核心数量建议根据自己电脑的配置拉满 RAM 大小则建议 ≥ <code>6GiB</code> QEMU 不会直接吃掉你分配的所有的 CPU 核心和内存 它会根据虚拟机占用动态调整</p><p><strong><code>Force Multicore</code> 功能可选择性开启（就我感觉 开不开其实差不多）</strong></p></div></div><p></p><figure><img /><figcaption>CPU&amp;Mem</figcaption></figure><p></p></section><section><h3>配置 Bootloader<a href="#配置-bootloader"><span>#</span></a></h3><ol>
<li>先别急着进系统 进入 <code>Bootloader</code> 以后先进入设置 进行一些设置 以方便联网调试和 root</li>
</ol><div><div><div></div><div>Note</div></div><div><p><code>Bootloader</code> 里面的每项设置功能简介</p><blockquote><p><strong><code>A/B boot control</code></strong></p><p>A/B 分区功能开关 此设置完全<strong>无法使用</strong> 因为此虚拟机完全不支持 A/B 分区😅</p></blockquote><blockquote><p><strong><code>Boot animation</code></strong></p><p>开机动画 默认开启 <strong>自选是否打开</strong></p></blockquote><blockquote><p><strong><code>Dispiay resolution</code></strong></p><p>调整显示分辨率 <strong>系统内无法调这个 建议先默认 后面折腾好了再改 不然不方便切换窗口</strong></p></blockquote><blockquote><p><strong><code>HWUI renderer</code></strong></p><p><code>SystemUI</code> 渲染器 <strong>不建议调</strong> 可能会导致 <code>SystemUI</code> 黑屏</p></blockquote><blockquote><p><strong><code>Insecure ADB</code></strong></p><p>是否允许不安全的 <code>ADB</code> 调试 也就是是否允许开放在 <code>5555</code> 端口的 <code>adb</code> 无线调试 <strong>必开</strong> 不然无法连接到 <code>adb</code> 调试</p></blockquote><blockquote><p><code>Low performance optimizations</code></p><p>低性能优化 默认关闭 如果你的 Mac 是 Apple Sillicon 则保持默认 不用开 如果是 Intel 芯片用户则视情况开 <strong>大部分情况下你不需要开这个 保持默认即可</strong></p></blockquote><blockquote><p><strong><code>Mitigations</code></strong></p><p><strong>保持默认即可</strong></p></blockquote><blockquote><p><strong><code>Quiet boot</code></strong></p><p>安静启动 即在启动时不显示内核日志 默认关闭 <strong>自选是否开启</strong> 开启后系统开机将不显示内核日志</p></blockquote><blockquote><p><strong><code>Screen density</code></strong></p><p>调整系统 <code>DPI</code> 也是系统内无法调的选项 <strong>这个也需要根据你 Mac 的屏幕分辨率 问 AI 选什么 <code>DPI</code> 合适 如果是 <code>1080P</code> 屏幕 那么默认即可</strong></p></blockquote><blockquote><p><strong><code>Serial console function</code></strong></p><p>开启或关闭虚拟机的串口控制台功能 <strong>如果没有特殊的安卓开发需求 保持默认即可</strong></p></blockquote><blockquote><p><strong><code>SELinux</code></strong></p><p>设置 SELinux 状态 默认 <code>Enforcing（强制模式）</code> <strong>如果你要 root 的话（特别是用 <code>KernelSU</code> root 的话） 必须改成 <code>Permissive（宽容模式）</code> 否则打开开发者模式设置会闪退</strong></p></blockquote><blockquote><p><strong><code>Wi-Fi implementation</code></strong></p><p>是否打开虚拟 Wi-Fi 功能 默认关闭 <strong>必须选择 <code>VirtWifi using eth0 interface</code> 否则无法打开无线调试 无法 <code>adb</code></strong></p><p></p><figure><img alt="虚拟 WiFi" loading="lazy" width="1060" height="844" src="/_astro/%E8%99%9A%E6%8B%9F%20WiFi.BQq2MJew_3imRo.webp" /><figcaption>虚拟 WiFi</figcaption></figure><p></p></blockquote><blockquote><p><strong><code>ZRAM</code></strong></p><p>虚拟内存功能 默认关闭 <strong>建议打开</strong></p></blockquote><blockquote><p><strong><code>GRUB: timeout</code></strong></p><p><code>GRUB</code> 超时时间 <code>GRUB</code> 是引导器（<code>bootloader</code>） 也就是现在在的这个界面 这里调整 GRUB 超时时间 默认 3s 超时后自动进入系统 按上下键可中断倒计时 <strong>根据需要自己调</strong></p></blockquote><blockquote><p><strong><code>Show current setting</code></strong></p><p>显示当前选择的选项</p></blockquote></div></div><p></p><figure><img alt="Bootloader 设置" loading="lazy" width="1060" height="844" src="/_astro/Bootloader%20%E8%AE%BE%E7%BD%AE.RQG3n2oN_Z1D5qKH.webp" /><figcaption>Bootloader 设置</figcaption></figure><p></p><p></p><figure><img alt="设置" loading="lazy" width="1060" height="844" src="/_astro/%E8%AE%BE%E7%BD%AE.1rO586AF_1lYBqw.webp" /><figcaption>设置</figcaption></figure><p></p></section><section><h3>初始化 userdata 分区<a href="#初始化-userdata-分区"><span>#</span></a></h3><ol>
<li>
<p>如果你调过 <code>userdata</code> 分区大小的话 退出到主界面 选择 <code>Recovery</code> 并且进入</p>
<p>接下来选择 <code>Factory reset</code> - <code>Format data/factory reset</code></p>
<p>选择 <code>Format data</code> 并且等待 等待时长由你磁盘大小决定</p>
<div><div><div></div><div>Caution</div></div><div><p><em>虽然虚拟机里大概率没有重要数据</em> 但是还是提醒一下 <strong>这一步会清空你虚拟机里面的所有数据 有重要数据千万千万记得备份</strong></p></div></div>
<div><div><div></div><div>Tip</div></div><div><p><code>ERROR: recovery: Failed to save locale to /cache/recovery/last_locale: No such file or directory</code> 若 Rocovery 里报错这些是正常的 是因为没有初始化系统导致的</p></div></div>
<p>当 UI 再次出现 下方显示 <code>Data wipe complete.</code> 就可以了</p>
<p>正常完成后应该输出：</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>-- Wiping data...</span></div></div><div><div><div>2</div></div><div><span>Formatting /data...</span></div></div><div><div><div>3</div></div><div><span>Formatting /cache...</span></div></div><div><div><div>4</div></div><div><span>Formatting /metadata....</span></div></div><div><div><div>5</div></div><div><span>Resetting memtag message...</span></div></div><div><div><div>6</div></div><div><span>Data wipe complete.</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
</ol><p></p><figure><img alt="进入 Recovery" loading="lazy" width="1060" height="844" src="/_astro/%E8%BF%9B%E5%85%A5%20Recovery.YbELA7ny_Z18jB82.webp" /><figcaption>进入 Recovery</figcaption></figure><p></p><p></p><figure><img alt="恢复出厂设置" loading="lazy" width="1668" height="994" src="/_astro/%E6%81%A2%E5%A4%8D%E5%87%BA%E5%8E%82%E8%AE%BE%E7%BD%AE.CLHPj4io_Z29Nvwg.webp" /><figcaption>恢复出厂设置</figcaption></figure><p></p><p></p><figure><img alt="选择恢复出厂设置" loading="lazy" width="1668" height="994" src="/_astro/%E9%80%89%E6%8B%A9%E6%81%A2%E5%A4%8D%E5%87%BA%E5%8E%82%E8%AE%BE%E7%BD%AE.CCvkVOdr_sXaFk.webp" /><figcaption>选择恢复出厂设置</figcaption></figure><p></p><p></p><figure><img alt="确认执行双清" loading="lazy" width="1668" height="994" src="/_astro/%E7%A1%AE%E8%AE%A4%E6%89%A7%E8%A1%8C%E5%8F%8C%E6%B8%85.Dv6CAHtc_ZoA2wQ.webp" /><figcaption>确认执行双清</figcaption></figure><p></p><p></p><figure><img alt="正在格式化" loading="lazy" width="1316" height="876" src="/_astro/%E6%AD%A3%E5%9C%A8%E6%A0%BC%E5%BC%8F%E5%8C%96.By-IKEUi_ZXxqnh.webp" /><figcaption>正在格式化</figcaption></figure><p></p><p></p><figure><img alt="双清完成.png" loading="lazy" width="1664" height="992" src="/_astro/%E5%8F%8C%E6%B8%85%E5%AE%8C%E6%88%90.CwCsAjY-_208m12.webp" /><figcaption>双清完成.png</figcaption></figure><p></p></section><section><h3><em>[可选]</em> 安装 Google Apps<a href="#可选-安装-google-apps"><span>#</span></a></h3><ol>
<li>
<p><em>[可选]</em> 安装 Google Apps</p>
<div><div><div></div><div>Caution</div></div><div><p>GApps 必须在第一次启动系统之前安装 否则会 <code>bootloop</code> 所以第一次启动系统前千万要斟酌一下 确保不会用到 GApps 再启动 不然后期再想装只能恢复出厂设置再安装</p><div><div><div></div><div>Note</div></div><div><p>因为虚拟机自带的 <code>Recovery</code> 有强制包签名校验 导致刷入开源没有签名的 GApps Add-on 会报错</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ERROR: Recovery: Faiied to verffy whole-file signature.</span></div></div><div><div><div>2</div></div><div><span>Update package verification took 10.6 s （result 1）.</span></div></div><div><div><div>3</div></div><div><span>ERROR: recovery: Signature verification failed.</span></div></div><div><div><div>4</div></div><div><span>ERROR: recovery: Err： 21</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>所以要刷入带 <code>userdebug</code> 标签的允许刷入未经签名的包的 <code>Recovery</code></p></div></div></div></div>
</li>
</ol><section><h4>刷入 userdebug Recovery<a href="#刷入-userdebug-recovery"><span>#</span></a></h4><ul>
<li>
<p>进入 <code>Recovery</code> 首页 - <code>Advanced</code> - <code>Enter fastboot</code> 进入 <code>fastbootd</code> 并记下上面的 <code>IPv4 address - 192.168.**.*</code></p>
</li>
<li>
<p>进入到 <code>Fastbootd</code> 首页 记下上面的 <code>IPv4 address - 192.168.**.*</code></p>
</li>
<li>
<p>接着打开终端</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>fastboot</span><span> </span><span>-s</span><span> </span><span>tcp:</span><span>$HOST_IP</span><span> </span><span>flash</span><span> </span><span>recovery</span><span> </span><span>/path/to/recovery_arm64only-userdebug.img</span><span>    </span><span># 把 $HOST_IP 替换成 Fastboot 里面给你的 IP /path/to/recovery_arm64only-userdebug.img 替换成你下载的 Recovery 镜像的位置</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>输出应该类似这样：</li>
</ul>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Sending</span><span> </span><span>'vendor_boot'</span><span> (59492 </span><span>KB</span><span>)                   OKAY [  0.132s]</span></div></div><div><div><div>2</div></div><div><span>Writing</span><span> </span><span>'vendor_boot'</span><span>                              </span><span>OKAY</span><span> [  </span><span>0.068s]</span></div></div><div><div><div>3</div></div><div><span>Finished.</span><span> </span><span>Total</span><span> </span><span>time:</span><span> </span><span>0.251s</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p><code>Fastbootd</code> 里选择 <code>Power off</code> 关机 重启再启动到 <code>Recovery</code> - <code>Apply update</code> - <code>Apply from ADB</code> - 再次记下上面的 `IPv4 address - 192.168.**.*</p>
<div><div><div></div><div>Tip</div></div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ERROR: recovery： [libfs_mgr］ Failed to mount /mnt/vendor/shared: Invalid argument</span></div></div><div><div><div>2</div></div><div><span>ERROR: recovery： [libfs_mgr］ Failed to mount /mnt/vendor/shared: No such file or directory</span></div></div><div><div><div>3</div></div><div><span>ERROR: recovery： [libfs_mgr］ Failed to mount for path ［/mnt/vendor/shared］</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>若 Rocovery 里报错这些也是正常的 还是因为没有初始化系统导致的</p></div></div>
</li>
</ul></section><section><h4>通过 ADB 侧载 GApps<a href="#通过-adb-侧载-gapps"><span>#</span></a></h4><ul>
<li>
<p>底下显示 <code>Now send the package you want to apply to the device with "adb sideload &lt;filename&gt;"...</code> 时打开终端</p>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>connect</span><span> </span><span>$HOST_IP</span><span>    </span><span># 把 $HOST_IP 替换成 Recovery 里面给你的 IP</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>输出应该类似这样：</li>
</ul>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>* daemon not running; </span><span>starting</span><span> </span><span>now</span><span> </span><span>at</span><span> </span><span>tcp:5037</span></div></div><div><div><div>2</div></div><div><span>* daemon started successfully</span></div></div><div><div><div>3</div></div><div><span>connected</span><span> </span><span>to</span><span> </span><span>192.168.</span><span>**</span><span>.</span><span>*</span><span>:5555</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>接下来用 <code>adb devices</code> 检查是否连接上：</li>
</ul>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>devices</span></div></div><div><div><div>2</div></div><div><span>List</span><span> </span><span>of</span><span> </span><span>devices</span><span> </span><span>attached</span></div></div><div><div><div>3</div></div><div><span>192.168.**.*:5555</span><span>       </span><span>recovery</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>
<p>显示如上则已连接上</p>
</li>
<li>
<p>接下来开始侧载：</p>
</li>
</ul>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>adb</span><span> </span><span>sideload</span><span> </span><span>-h</span><span> </span><span>/path/to/MindTheGapps-</span><span>**</span><span>.</span><span>*</span><span>.</span><span>*</span><span>-arm64-yyyymmdd_</span><span>******</span><span>.zip</span><span>    </span><span># 把 /path/to/MindTheGapps-**.*.*-arm64-yyyymmdd_******.zip 替换成你下载的 GApps 包的位置</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li><code>Recovery</code> 里会提示</li>
</ul>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Signature verification failed</span></div></div><div><div><div>2</div></div><div><span>Install anyway?</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<ul>
<li>选 <code>Yes</code></li>
</ul>
<div><div><div></div><div>Tip</div></div><div><p>应当会输出</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ERROR: recovery: Failed to find CPU thermal info in /sys/class/thermal/</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>报错这个这是正常的 因为虚拟机的缘故</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Supported API:3</span></div></div><div><div><div>2</div></div><div><span>Finding update package.</span></div></div><div><div><div>3</div></div><div><span>Verifying update package.</span></div></div></code></pre><div><div></div><div></div></div></figure></div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>ERROR: recovery: failed to verify whole-file signature</span></div></div><div><div><div>2</div></div><div><span>Update package verification took 10.6 s （result 1）・</span></div></div><div><div><div>3</div></div><div><span>ERROR: recovery: Signature verification failed</span></div></div><div><div><div>4</div></div><div><span>ERROR: recovery: error: 21</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>报错这个也是正常的 因为开源 GApps 没有包签名 只要在 <code>Recovery</code> 里提示</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Signature verification failed</span></div></div><div><div><div>2</div></div><div><span>Install anyway?</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>的时候选 <code>Yes</code> 即可继续</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Installing update.</span></div></div><div><div><div>2</div></div><div><span>**********************</span></div></div><div><div><div>3</div></div><div><span>MindTheGapps installer</span></div></div><div><div><div>4</div></div><div><span>**********************</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>正式开始安装</p></div></div>
</li>
<li>
<p>当 UI 再次出现 <code>Recovery</code> 日志提示</p>
<div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Cleaning up files</span></div></div><div><div><div>2</div></div><div><span>Unmounting partitions</span></div></div><div><div><div>3</div></div><div><span>Done!</span></div></div><div><div><div>4</div></div><div>
</div></div><div><div><div>5</div></div><div><span>Install completed with status 0.</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
<p>即已完成</p>
<p>选择 <code>Reboot system now</code> 进入系统</p>
</li>
</ul><p></p><figure><img alt="Fastbootd 刷入 Recovery" loading="lazy" width="1316" height="876" src="/_astro/Fastbootd%20%E5%88%B7%E5%85%A5%20Recovery.CaZu-wyE_Z1cLvlp.webp" /><figcaption>Fastbootd 刷入 Recovery</figcaption></figure><p></p><p></p><figure><img alt="回到 Recovery" loading="lazy" width="1316" height="876" src="/_astro/%E5%9B%9E%E5%88%B0%20Recovery.8m-1vCzJ_18i6YV.webp" /><figcaption>回到 Recovery</figcaption></figure><p></p><p></p><figure><img alt="应用更新" loading="lazy" width="1316" height="876" src="/_astro/%E5%BA%94%E7%94%A8%E6%9B%B4%E6%96%B0.BL03HaMa_Z1LIJOK.webp" /><figcaption>应用更新</figcaption></figure><figure><img alt="从 adb 更新" loading="lazy" width="1316" height="876" src="/_astro/%E4%BB%8E%20adb%20%E6%9B%B4%E6%96%B0.BmJ2FIjC_H5Wg7.webp" /><figcaption>从 adb 更新</figcaption></figure><figure><img alt="等待侧载" loading="lazy" width="1316" height="876" src="/_astro/%E7%AD%89%E5%BE%85%E4%BE%A7%E8%BD%BD.SzMdw06U_1Jyf9h.webp" /><figcaption>等待侧载</figcaption></figure><figure><img alt="IP 地址" loading="lazy" width="1316" height="876" src="/_astro/IP%20%E5%9C%B0%E5%9D%80.DaS-Hr8U_Z1UGRtX.webp" /><figcaption>IP 地址</figcaption></figure><figure><img alt="adb 连接到 Recovery." loading="lazy" width="1459" height="796" src="/_astro/adb%20%E8%BF%9E%E6%8E%A5%E5%88%B0%20Recovery.BD7cVwc6_ZQgytD.webp" /><figcaption>adb 连接到 Recovery.</figcaption></figure><p></p><p></p><figure><img alt="允许刷入不安全的包" loading="lazy" width="1316" height="876" src="/_astro/%E5%85%81%E8%AE%B8%E5%88%B7%E5%85%A5%E4%B8%8D%E5%AE%89%E5%85%A8%E7%9A%84%E5%8C%85.BuGuyDaP_24JrGS.webp" /><figcaption>允许刷入不安全的包</figcaption></figure><p></p><p></p><figure><img alt="重启系统" loading="lazy" width="1316" height="876" src="/_astro/%E9%87%8D%E5%90%AF%E7%B3%BB%E7%BB%9F.DQdAQf-n_1TctQ2.webp" /><figcaption>重启系统</figcaption></figure><p></p><hr /></section></section></section>
<section><h1><em>[可选]</em> Root<a href="#可选-root"><span>#</span></a></h1><blockquote><p>Root 部分使用 KernelSU，对应准备工作中的 <code>boot.img</code> 与 KernelSU Manager。</p></blockquote><section><h3>进入系统并开启 ADB<a href="#进入系统并开启-adb"><span>#</span></a></h3><ol>
<li><code>bootloader</code> 里选择第一项 <code>LineageOS **.*</code> 进系统</li>
<li>第一次启动系统可能会比较慢 特别是你选择了装 GApps 的时候 具体时长与电脑性能有关</li>
</ol><p></p><figure><img alt="第一次启动.png" loading="lazy" width="1316" height="876" src="/_astro/%E7%AC%AC%E4%B8%80%E6%AC%A1%E5%90%AF%E5%8A%A8.CVuBo3YO_Z2oKRnD.webp" /><figcaption>第一次启动.png</figcaption></figure><p></p><ol>
<li>
<p>简单过下 <code>OOBE</code></p>
<div><div><div></div><div>Tip</div></div><div><p>带 GApps 的版本和不带的 OOBE 略有区别</p><p>这是无 GApps 的版本：</p><p></p><figure><img alt="无 GApps OOBE" loading="lazy" width="1677" height="999" src="/_astro/%E6%97%A0%20GApps%20OOBE.DM-XW65r_2uOrQa.webp" /><figcaption>无 GApps OOBE</figcaption></figure><p></p></div></div>
</li>
</ol><p></p><figure><img alt="OOBE." loading="lazy" width="1316" height="876" src="/_astro/OOBE.C7JbJJcM_LCxJ3.webp" /><figcaption>OOBE.</figcaption></figure><p></p><ol>
<li>
<p>先连下 WiFi 再进<code>设置</code> - <code>关于本机</code> - 狂点最下面的 <code>Build 号</code> 进入开发者模式</p>
</li>
<li>
<p><code>设置</code> - <code>系统</code> - <code>开发者选项</code> - <code>无线调试</code> - <code>允许</code></p>
</li>
</ol><p></p><figure><img alt="允许 ADB 调试" loading="lazy" width="1316" height="876" src="/_astro/%E5%85%81%E8%AE%B8%20ADB%20%E8%B0%83%E8%AF%95.pzSZH7K2_1N3G21.webp" /><figcaption>允许 ADB 调试</figcaption></figure><p></p><ol>
<li>进入 <code>无线调试</code> 记下里面的 IP</li>
</ol><p></p><figure><img alt="adb IP" loading="lazy" width="1316" height="876" src="/_astro/adb%20IP.CagGDQ_7_b7I4Y.webp" /><figcaption>adb IP</figcaption></figure><p></p><ol>
<li>打开终端</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>connect</span><span> </span><span>$HOST_IP</span><span>    </span><span># 把 $HOST_IP 替换成 Recovery 里面给你的 IP</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>输出应该类似这样：</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>* daemon not running; </span><span>starting</span><span> </span><span>now</span><span> </span><span>at</span><span> </span><span>tcp:5037</span></div></div><div><div><div>2</div></div><div><span>* daemon started successfully</span></div></div><div><div><div>3</div></div><div><span>connected</span><span> </span><span>to</span><span> </span><span>192.168.</span><span>**</span><span>.</span><span>*</span><span>:5555</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>接下来用 <code>adb devices</code> 检查是否连接上：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>devices</span></div></div><div><div><div>2</div></div><div><span>List</span><span> </span><span>of</span><span> </span><span>devices</span><span> </span><span>attached</span></div></div><div><div><div>3</div></div><div><span>192.168.**.*:5555</span><span>       </span><span>recovery</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>显示如上则已连接上</li>
</ul></section><section><h3>安装并配置 KernelSU<a href="#安装并配置-kernelsu"><span>#</span></a></h3><ol>
<li>安装 <code>KernelSU</code> Manager</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>-e</span><span> </span><span>install</span><span> </span><span>/path/to/KernelSU_v</span><span>*</span><span>.</span><span>*</span><span>.</span><span>*</span><span>-</span><span>**</span><span>-g</span><span>******</span><span>ab_</span><span>*****</span><span>-release.apk</span><span>    </span><span># 把 /path/to/KernelSU_v*.*.*-**-g******ab_*****-release.apk 换成你下载的管理器路径</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>输出应该类似这样：</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Performing</span><span> </span><span>Streamed</span><span> </span><span>Install</span></div></div><div><div><div>2</div></div><div><span>Success</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>推送 <code>boot.img</code> 到虚拟机并修补</li>
</ol><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span></span><span> </span><span>adb</span><span> </span><span>-e</span><span> </span><span>push</span><span> </span><span>/path/to/boot_</span><span>*</span><span>.img</span><span> </span><span>/sdcard</span><span>    </span><span># 把 /path/to/boot_*.img 换成你下载的 boot.img 路径</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ul>
<li>输出应该类似这样：</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>/path/to/boot_*.img:</span><span> </span><span>1</span><span> </span><span>file</span><span> </span><span>pushed,</span><span> </span><span>0</span><span> </span><span>skipped.</span><span> </span><span>**</span><span> </span><span>MB/s</span><span> (46219264 </span><span>bytes</span><span> </span><span>in</span><span> </span><span>0.100s</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><ol>
<li>打开 <code>KernelSU</code> 管理器 - <code>选择文件并修补</code> - 选择 <code>boot.img</code> - <em>[可选]</em><code>备份为原厂镜像</code>&amp;<code>总是给 Shell 授予 Root 权限</code>&amp;<code>启动时强制启用 ADB 调试</code> - <code>下一步</code> - <code>KMI</code> 选择见下</li>
</ol><div><div><div></div><div>Tip</div></div><div><p>如何查看 <code>KMI</code></p><p>见 <a href="https://kernelsu.org/zh_CN/guide/installation.html#kmi" target="_blank">KernelSU 官方文章</a></p></div></div><p>记住圈出来的路径</p><p></p><figure><img alt="修补设置" loading="lazy" width="1316" height="876" src="/_astro/%E4%BF%AE%E8%A1%A5%E8%AE%BE%E7%BD%AE.BY5xyMmU_dG5gq.webp" /><figcaption>修补设置</figcaption></figure><p></p><p></p><figure><img alt="修补完成" loading="lazy" width="1316" height="876" src="/_astro/%E4%BF%AE%E8%A1%A5%E5%AE%8C%E6%88%90.MwieO1cT_Z1cVsEL.webp" /><figcaption>修补完成</figcaption></figure><p></p><ul>
<li>输出应该类似这样：</li>
</ul><div><div><div><figure><figcaption><span></span><span>Terminal window</span><span>展开</span><span>收起</span></figcaption><pre><code><div><div><div>1</div></div><div><span>  </span><span>_</span><span>  </span><span>__</span><span>                    </span><span>_</span><span> </span><span>____</span><span>  </span><span>_</span><span>   </span><span>_</span></div></div><div><div><div>2</div></div><div><span><span> </span></span><span>| |</span><span>/</span><span> </span><span>/___</span><span> </span><span>_</span><span> </span><span>__</span><span> </span><span>_</span><span> </span><span>__</span><span>   </span><span>___</span><span>| </span><span>/</span><span> </span><span>___</span><span>|| | | |</span></div></div><div><div><div>3</div></div><div><span><span> </span></span><span>| </span><span>' // _ \ '</span><span>__</span><span>| </span><span>'_ \ / _ \ \___ \| | | |</span></div></div><div><div><div>4</div></div><div><span><span> </span></span><span>| . \  __/ |  | | | |  __/ |___) | |_| |</span></div></div><div><div><div>5</div></div><div><span><span> </span></span><span>|_|\_\___|_|  |_| |_|\___|_|____/ \___/</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>- Bootdevice: /data/data/me.weishu.kernelsu/cache/boot.img</span></div></div><div><div><div>8</div></div><div><span>- Preparing assets</span></div></div><div><div><div>9</div></div><div><span>- Unpacking boot image</span></div></div><div><div><div>10</div></div><div><span>- KMI: android16-6.12</span></div></div><div><div><div>11</div></div><div><span>- Adding KernelSU LKM</span></div></div><div><div><div>12</div></div><div><span>- Backup stock boot image</span></div></div><div><div><div>13</div></div><div><span>- Stock image has been backup to</span></div></div><div><div><div>14</div></div><div><span>- /data/user_de/0/me.weishu.kernelsu/boot_backup/ksu_backup_*</span></div></div><div><div><div>15</div></div><div><span>- Adding allow shell config</span></div></div><div><div><div>16</div></div><div><span>- Adding adb_debug props</span></div></div><div><div><div>17</div></div><div><span>- Adding props to enable adbd</span></div></div><div><div><div>18</div></div><div><span>- Repacking boot image</span></div></div><div><div><div>19</div></div><div><span>- Output file is written to</span></div></div><div><div><div>20</div></div><div><span>- /storage/emulated/0/Download/kernelsu_patched_yyyymmdd_*.img     # ⬅️ 记住这行</span></div></div><div><div><div>21</div></div><div><span>- Done!</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div></section><section><h3>刷入修补后的 boot.img<a href="#刷入修补后的-bootimg"><span>#</span></a></h3><ol>
<li>从虚拟机拉取修补好的 <code>boot.img</code> 并刷入</li>
</ol><ul>
<li>
<p>终端输入 <code>adb -d pull /storage/emulated/0/Download/kernelsu_patched_yyyymmdd_*.img ./     # 把 /storage/emulated/0/Download/kernelsu_patched_yyyymmdd_*.img</code> 换成你刚刚记的目录</p>
</li>
<li>
<p>重启虚拟机 - <code>LineageOS **.* Recovery</code> - <code>Advamced</code> - <code>Enter fastboot</code> 进入 <code>Fastbootd</code></p>
</li>
<li>
<p><code>fastboot -s $HOST_IP flash boot kernelsu_patched_yyyymmdd_*.img</code> 直接刷入</p>
<ul>
<li>输出应该类似这样：</li>
</ul>
<div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>Sending</span><span> </span><span>'boot'</span><span> (45616 </span><span>KB</span><span>)                          OKAY [  0.127s]</span></div></div><div><div><div>2</div></div><div><span>Writing</span><span> </span><span>'boot'</span><span>                                     </span><span>OKAY</span><span> [  </span><span>0.270s]</span></div></div><div><div><div>3</div></div><div><span>Finished.</span><span> </span><span>Total</span><span> </span><span>time:</span><span> </span><span>0.546s</span></div></div></code></pre><div><div></div><div></div></div></figure></div>
</li>
<li>
<p>选择 <code>Reboot system now</code> 重启系统</p>
</li>
</ul><p></p><figure><img alt="开机日志" loading="lazy" width="1316" height="876" src="/_astro/%E5%90%AF%E5%8A%A8%E6%97%A5%E5%BF%97.BrqlttKD_Z7rAH3.webp" /><figcaption>开机日志</figcaption></figure><p></p><p>如果你在开机日志里看到了 <code>KernelSU: *</code> 证明成功了</p><p></p><figure><img alt="大功告成！.png" loading="lazy" width="1316" height="876" src="/_astro/%E5%A4%A7%E5%8A%9F%E5%91%8A%E6%88%90%EF%BC%81.CWM54EUV_Z1WVLmB.webp" /><figcaption>大功告成！.png</figcaption></figure><p></p><hr /></section></section>
<section><h1>Enjoy!<a href="#enjoy"><span>#</span></a></h1><p>把搞好的 <code>.utm</code> 虚拟机包传到 iPad 上 用 UTM 导入即可在 iPad 上享受 Android Tablet 了（）</p></section>]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/WeKit-Doc/</id>
      <title type="text">୧⍤⃝ WeKit Document ☃</title>
      <published>2026-07-09T00:00:00.000Z</published>
      <updated>2026-07-14T00:00:00.000Z</updated>
      <author><name>𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/WeKit-Doc/"/>
      <summary type="text">୧⍤⃝ WeKit Document ☃</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Tip</div></div><div><p>本页面内某些内容可能需要代理才能正常访问</p></div></div>
<div><div><div></div><div>Note</div></div><div><p>提问请按照 <a href="#%E6%8F%90%E9%97%AE%E7%9A%84%E8%89%BA%E6%9C%AF--%EF%B8%8F-fbi-warning-%EF%B8%8F%E4%B8%8D%E7%9C%8B%E9%B8%A1%E6%8A%8A%E7%9F%AD-10cm-%EF%B8%8F-fbi-warning-%EF%B8%8F"><strong>提问的艺术</strong></a> 准备好一些必要的材料 免得开发者追着你问日志
有问题🉑先查看 <a href="#%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-qa">一些常见问题 <strong><code>(Q&amp;A)</code></strong></a> 也许能回答你一些疑惑</p></div></div>
<section><h1>🪨 <strong>A Stone Badge &amp; 不死图腾</strong><a href="#a-stone-badge--不死图腾"><span>#</span></a></h1><p></p><figure><img src="https://stone.professorlee.work/api/stone/Ujhhgtg/Wekit" alt="没错这个石墩子除了浪费你 5 MiB 流量外毫无作用 石墩子指向 Wekit 的 Github 仓库" /><figcaption>没错这个石墩子除了浪费你 5 MiB 流量外毫无作用 石墩子指向 Wekit 的 Github 仓库</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>        </span></span><span>🟫🟫🟫🟫🟫🟫</span></div></div><div><div><div>2</div></div><div><span><span>      </span></span><span>🟫🟨🟨🟨🟨🟨🟨🟫</span></div></div><div><div><div>3</div></div><div><span><span>      </span></span><span>🟫🟨🟨🟨🟨🟨🟨🟫</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>🟫🟧🟧🟨🟨🟧🟧🟫</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>🟫⬜🟩🟧🟧⬜️🟩🟫</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>🟫🟩🟩🟨🟨🟩🟩🟫</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>🟫🟧🟧🟨🟨🟧🟧🟫</span></div></div><div><div><div>8</div></div><div><span>🟫🟫🟫🟫🟫🟧🟨🟨🟧🟫🟫🟫🟫🟫</span></div></div><div><div><div>9</div></div><div><span>🟫🟨🟧🟫🟨🟨🟧🟧🟨🟧🟫🟧🟨🟫</span></div></div><div><div><div>10</div></div><div><span>🟫🟫🟫🟨🟨🟨🟨🟨🟧🟧🟫🟫🟫🟫</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>🟫🟨🟧🟧🟧🟧🟨🟫</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>🟫🟫🟫🟫🟫🟫🟫🟫</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>🟫🟨🟧🟧🟧🟫</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>🟫🟨🟧🟧🟨🟫</span></div></div><div><div><div>15</div></div><div><span><span>          </span></span><span>🟫🟫🟫🟫</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section>
<section><h1>提问的艺术<a href="#提问的艺术"><span>#</span></a></h1><section><h2>❎ 错误的提问方式 ❎<a href="#错误的提问方式-"><span>#</span></a></h2><div><div><div></div><div>Note</div></div><div><p>请不要这样提问 错误的提问方式将使开发者无法解答你的问题</p><blockquote><p>xxx 怎么搞/激活啊</p><p>xxx 为什么不能用啊</p></blockquote><p></p><figure><img alt="😅" loading="lazy" width="1000" height="990" src="/_astro/cnm.DsEUruU6_A17g2.webp" /><figcaption>😅</figcaption></figure><p></p><div><div><div></div><div>Important</div></div><div><p>进群前请确保你有一定的玩机基础 不然将会使沟通成为一场灾难</p><p></p><figure><img alt="灾难" loading="lazy" width="512" height="316" src="/_astro/%E7%81%BE%E9%9A%BE.DmdBpcxw_ZSnrU6.webp" /><figcaption>灾难</figcaption></figure><p></p></div></div></div></div></section><section><h2>✅ 正确的提问方式 ✅<a href="#正确的提问方式-"><span>#</span></a></h2><ul>
<li>
<p>问题：<code>xxx？</code></p>
</li>
<li>
<p>环境：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Root 方式</span></div></div><div><div><div>2</div></div><div><span>Magisk /KernelSU /Apatch</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>微信版本</span></div></div><div><div><div>5</div></div><div><span>8.0.xx</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>API 版本</span></div></div><div><div><div>8</div></div><div><span>100 及更低/101/102</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>Xposed API 调用保护</span></div></div><div><div><div>11</div></div><div><span>未启用/已启用</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>Dex 优化器包装</span></div></div><div><div><div>14</div></div><div><span>支持/不支持</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>框架版本</span></div></div><div><div><div>17</div></div><div><span>xxx-it/irena/别的分支 (xxxx)</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>管理器包名</span></div></div><div><div><div>20</div></div><div><span>com.android.shell/org.lsposed.manager</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>系统版本</span></div></div><div><div><div>23</div></div><div><span>xx (API xx)</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>设备</span></div></div><div><div><div>26</div></div><div><span>xxx</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>系统架构</span></div></div><div><div><div>29</div></div><div><span>x86-64/arm64-v7a/v8a/v8a (4K)/risc-v</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示</p><p>在 LSPosed 主界面长按即可复制设备信息</p><p></p><figure><img alt="LSPosed" loading="lazy" width="1075" height="2393" src="/_astro/LSPosed.5qduhAew_R4VCt.webp" /><figcaption>LSPosed</figcaption></figure><p></p><p>微信版本在 <strong><code>微信设置</code> ➡️ <code>关于</code></strong> 里看</p></div></div><blockquote><p><strong>记得补充你的 Root 方式和微信版本号</strong></p></blockquote><ul>
<li>日志：<code>xxx.zip</code></li>
</ul></section></section>
<section><h1>一些常见问题 <strong><code>(Q&amp;A)</code></strong><a href="#一些常见问题-qa"><span>#</span></a></h1><section><h4>1. 免 Root 能不能用？<a href="#1-免-root-能不能用"><span>#</span></a></h4><div><div><div></div><div>Important</div></div><div><p><strong>A:</strong> 请<strong>不要使用 LSPatch、NPatch 等工具嵌入模块到微信</strong> <em><strong>除非你想被张小龙秒封！</strong></em></p></div></div><div><div><div></div><div>Note</div></div><div><p>由于太多<em>煞笔</em>拿着开源的项目重新套层皮就上架售卖了 加之群内大部分人有 Root 遂开发者已停止对嵌入模块的支持</p></div></div><blockquote><p><strong>还有的话我想到再补吧 妈妈的 累死劳资了</strong></p></blockquote><hr /></section></section>
<section><h1>安装、激活教程<a href="#安装激活教程"><span>#</span></a></h1><section><h2>PART 1️⃣ LSPosed 的安装<a href="#part-1️⃣lsposed-的安装"><span>#</span></a></h2><div><div><div></div><div>Important</div></div><div><p><strong>此教程只针对 KernelSU 及其分支撰写 不保证 Magisk 以及 Apatch 用户跟随本教程一定能用上此模块</strong></p></div></div><section><h3>Step 1️⃣ 确保你的📱已经获取了 Root 权限<a href="#step-1️⃣确保你的已经获取了-root-权限"><span>#</span></a></h3><div><div><div></div><div>Tip</div></div><div><p>如果你通过小米机型<a href="https://share.google/aimode/Lfi89lWdLXxOh0zVE" target="_blank">越狱</a>的半残废 Root 或者魅族的官方半残废 Root 使用 LSPosed 则可以忽略上一条</p></div></div><div><figure><img alt="KernelSU Next" loading="lazy" width="1075" height="2393" src="/_astro/KernelSU%20Next.CDML0rDa_HlpEp.webp" /><figcaption>KernelSU Next</figcaption></figure></div></section><section><h3>Step 2️⃣ 下载 Zygisk 实现模块 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">ReZygisk</a> 或者 <a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank">ZygiskNext</a>并刷入<a href="#step-2️⃣下载-zygisk-实现模块-rezygisk-或者-zygisknext并刷入"><span>#</span></a></h3><a href="https://github.com/PerformanC/ReZygisk" target="_blank"><div><div><div><div></div><div>PerformanC</div></div><div>/</div><div>ReZygisk</div></div><div></div></div><div>Transparent implementation of Zygisk.</div><div><div>—</div><div>—</div><div>GPL-3.0</div><span>C</span></div></a><a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank"><div><div><div><div></div><div>Dr-TSNG</div></div><div>/</div><div>ZygiskNext</div></div><div></div></div><div>Standalone implementation of Zygisk</div><div><div>—</div><div>—</div><div>no-license</div><span>C</span></div></a><div><div><div></div><div>Note</div></div><div><p><em>至于为什么有两个模块这件事么……是这样的： <a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank">https://github.com/Dr-TSNG/ZygiskNext</a> 一段时间前停止了开源 然后就有人搞了个开源的 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 出来
从安全性的角度 本人更建议 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 毕竟闭源的模块的安全性么……这就全看模块作者良心了
但是吧 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 这模块也是刚刚出来的 稳定性这块还是差一点的（虽然本人目前用着也没发现大问题）所以你自己取舍吧</em></p></div></div></section><section><h3>Step 3️⃣ 下载  并且刷入<a href="#step-3️⃣下载--并且刷入"><span>#</span></a></h3><p>有两种方法下载 LSPosed:</p><ol>
<li>访问 <a href="https://lsposed.zip" target="_blank">lsposed.zip</a> 直接下载</li>
<li>如果无法访问 可加入 <a href="https://t.me/LSPosed" target="_blank">tg@lsposed</a> 到群组内下载</li>
</ol><div><div><div></div><div>Important</div></div><div><p>自 2024年4月26日 LSPosed 恢复更新起 LSPosed 不再开源并且进行内部测试制 并且不再分发于 Github 上 用户必须进入 <strong><a href="https://t.me/LSPosed" target="_blank">https://t.me/LSPosed</a> 群组</strong> 获取稳定版更新 而想要内测版用户则需要申请进入 <code>LSPosed Internal Test</code> 内测群组 详情见 ⬇️</p><p></p><figure><img alt="内测开始" loading="lazy" width="338" height="512" src="/_astro/%E5%86%85%E6%B5%8B%E5%BC%80%E5%A7%8B.UFLGfgAA_46LtX.webp" /><figcaption>内测开始</figcaption></figure><p></p><p>在此加入 LSPosed 频道 ⬇️</p><p><a href="https://t.me/LSPosed" target="_blank">LSPosed</a></p><p></p><figure><img alt="@lsposed" loading="lazy" width="1024" height="1966" src="/_astro/@lsposed.BrxAhEbU_1zfSWN.webp" /><figcaption>@lsposed</figcaption></figure><p></p><p>内测群进群方式</p><ul>
<li>🔗 在此 自己想办法解决吧</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>                                                </span><span>echo</span><span> aHR0cHM6Ly90Lm1lLytOZkh6dGZ5TkJaczJaRGxs | </span><span>base64</span><span> -d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div><div><div><div></div><div>Important</div></div><div><p>WeKit 每次发版会发 <code>legacy</code> 版本和 <code>standard</code> 版本（也就是 <code>api101</code> 版本） 强烈建议你根据上面的教程更新 LSPosed 至 API102 以防止出一些奇奇怪怪的问题</p></div></div><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示
你可以在 LSPosed 主界面查看 LSPosed API 及 LSPosed 版本
</p><figure><img alt="LSPosed" loading="lazy" width="1075" height="2393" src="/_astro/LSPosed.5qduhAew_R4VCt.webp" /><figcaption>LSPosed</figcaption></figure><p></p></div></div><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示：
你可以从 LSPosed 的压缩包里提取出 <strong><code>manager.apk</code></strong> 并安装 这样你的 LSPosed 就不再寄生在 <code>Shell</code> 里了 可以常驻在后台
</p><figure><img alt="manager.apk" loading="lazy" width="464" height="913" src="/_astro/manager.apk.Bh75_Frd_iUjwu.webp" /><figcaption>manager.apk</figcaption></figure><p></p></div></div></section></section><section><h2>PART 2️⃣ WeKit 的安装与激活<a href="#part-2️⃣wekit-的安装与激活"><span>#</span></a></h2><section><h3>Step 1️⃣ 获取最新版  Wekit<a href="#step-1️⃣获取最新版--wekit"><span>#</span></a></h3><section><h4>方法 1️⃣ 加入 <a href="https://t.me/+4XsfR-SWAtk1NGRl" target="_blank">Wekit Telegram 超级群组</a> 获取最新版  Wekit<a href="#方法-1️⃣-加入-wekit-telegram-超级群组-获取最新版--wekit"><span>#</span></a></h4><p><a href="https://t.me/+4XsfR-SWAtk1NGRl" target="_blank">点击加入 Telegram 超级群组</a></p></section><section><h4>方法 2️⃣ 到 <a href="https://github.com/Ujhhgtg/WeKit/actions/workflows/ci.yml" target="_blank">Github Action</a> 下载最新版  Wekit<a href="#方法-2️⃣-到-github-action-下载最新版--wekit"><span>#</span></a></h4><ol>
<li>
<p><a href="https://github.com/Ujhhgtg/WeKit/actions/workflows/ci.yml" target="_blank">点此进入 Github Action</a></p>
</li>
<li>
<p>把浏览器 UA 调整成 PC</p>
</li>
</ol><div><div><div></div><div>Note</div></div><div><p>也就是什么 <code>电脑模式</code> <code>桌面模式</code> 之类的模式</p></div></div><ol>
<li>找到最新 <code>master</code> 分支的 Action Runner 戳进去</li>
</ol><ul>
<li><figure><img alt="Github Action" loading="lazy" width="1692" height="912" src="/_astro/Action.I-PEEUfS_L2EHH.webp" /><figcaption>Github Action</figcaption></figure></li>
</ul><ol>
<li>页面滑到底 戳 <code>wekit-apk</code> 旁边的下载按钮</li>
<li><figure><img alt="Download" loading="lazy" width="1686" height="907" src="/_astro/Download.D6DhSB0R_1ODUCw.webp" /><figcaption>Download</figcaption></figure></li>
</ol></section></section><section><h3>Step 2️⃣ 安装  WeKit 并在 LSPosed 里激活  WeKit<a href="#step-2️⃣安装--wekit-并在-lsposed-里激活--wekit"><span>#</span></a></h3><ol>
<li>安装</li>
<li></li>
</ol><p></p><figure><img alt="Install" loading="lazy" width="1344" height="2798" src="/_astro/Install.DFpcBx-i_1gpFRp.webp" /><figcaption>Install</figcaption></figure><p></p><ol>
<li>
<p>LSPosed 主页 ➡️ 模块 ➡️ WeKit（可能在下面）</p>
</li>
<li>
<p>WeKit ➡️ 启用模块 ➡️ 勾选微信 ➡️ 长按微信 ➡️ 强行停止 ➡️ 确认 ➡️ 启动</p>
</li>
<li>
<p>打开微信 ➡️ 我的 ➡️ 设置 ➡️ WeKit ➡️ Enjoy!</p>
</li>
</ol><div><p></p><figure><img alt="Enable" loading="lazy" width="1344" height="2759" src="/_astro/Enable.ahN4wnTH_Z1ha8aG.webp" /><figcaption>Enable</figcaption></figure><p></p></div><hr /></section></section></section>
<section><h1>About us<a href="#about-us"><span>#</span></a></h1><p>** WeKit 是一个功能丰富的微信 Xposed 模块，提供大量微信增强功能，涵盖聊天体验、界面美化、隐私保护、自动化等多个方面。 **</p><section><h2>特色功能<a href="#特色功能"><span>#</span></a></h2><ul>
<li>基于 JavaScript 和 <em><a href="https://github.com/HdShare/WAuxiliary_Public" target="_blank">WAuxiliary</a></em> Jvav 的脚本引擎</li>
<li>贴纸包同步 (Telegram Stickers Sync)</li>
<li>通知进化 (<code>MessagingStyle</code>)</li>
<li>Markdown 消息渲染</li>
<li>指纹支付 (基于 TEE 的安全加密)</li>
<li>自动抢红包</li>
<li>单向删除好友检测</li>
<li>发送 SILK/MP3 语音</li>
<li>聊天工具栏</li>
<li>发送卡片消息</li>
<li>原生 Hook</li>
<li>支持免 Root 框架</li>
</ul><p><a href="https://github.com/Ujhhgtg/WeKit/actions/workflows/ci.yml" target="_blank"></a></p><figure><a href="https://github.com/Ujhhgtg/WeKit/actions/workflows/ci.yml" target="_blank"><img src="https://github.com/Ujhhgtg/WeKit/actions/workflows/ci.yml/badge.svg" alt="CI 状态" /><figcaption>CI 状态</figcaption></a></figure><p></p><section><h3>致谢<a href="#致谢"><span>#</span></a></h3><p><a href="https://github.com/cwuom/WeKit" target="_blank">WeKit 上游</a></p><p><a href="https://github.com/HdShare/WAuxiliary_Public" target="_blank">WAuxiliary</a></p><p><a href="https://github.com/dartcv/NewMiko/blob/archives/" target="_blank">NewMiko</a></p><p><a href="https://github.com/cinit/QAuxiliary" target="_blank">QAuxiliary</a></p><p><a href="https://github.com/eritpchy/FingerprintPay" target="_blank">FingerprintPay</a></p><p><a href="https://github.com/Ujhhgtg/wauxv_deobf_new" target="_blank">WADN</a> <a href="https://github.com/Ujhhgtg/wauxv_deobf" target="_blank">WAD</a></p></section></section></section>]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/Stop-Developing-on-Windows/</id>
      <title type="text">停止用 Windows 开发!</title>
      <published>2026-04-06T00:00:00.000Z</published>
      <updated>2026-07-18T00:00:00.000Z</updated>
      <author><name>kokic &amp; 𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/Stop-Developing-on-Windows/"/>
      <summary type="text">Stop Developing on s**tly Windows</summary>
      <content type="html"><![CDATA[<p></p><figure><img alt="F**k Microsoft!" loading="lazy" width="640" height="640" src="/_astro/fuck-microsoft.D_mMHb8i_ZEYqBQ.webp" /><figcaption>F**k Microsoft!</figcaption></figure><p></p>
<div><div><div></div><div>Note</div></div><div><p>原文作者 <a href="https://www.zhihu.com/people/200d53283ff9f8fdb7759e37c94cbb50" target="_blank">@kokic</a>，于 April 6, 2026 以 <strong>CC0</strong> (<code>Creative Commons Zero</code>) 协议发布。</p><div><div><div></div><div>Caution</div></div><div><p><em>转载未获授权，因为作者不必授权自己</em></p></div></div><div><div><div></div><div>Tip</div></div><div><p>二次转载无需联系原作者</p></div></div></div></div>
<section><h1>零、前言<a href="#零前言"><span>#</span></a></h1><div><div><div></div><div>Note</div></div><div><p>前两天因为一些零碎的原因不得不用暂时挪开 Arch Linux 转向 Windows 做一点开发 代码是没写两行 人是先红温了 有感而发 因而怒写此文章</p></div></div><p>每次我写这种文章，总会有人跳出来说：“bro 你又偏激了！”、“Windows 现在已经很好了！”、“WSL 启动！”。</p><p>现在是 2026 年，不是 2006 年，也非 2016 年。二十多年过去了，Windows 在严肃的程序开发这件事上，依然是一个彻头彻尾的笑话。不是因为微软不努力，而是因为它的根是烂的。把一棵树的树根泡在福尔马林里，树冠上挂再多 LED 灯也没用。</p><p>2026 年，曾经被认为是 <strong>精神病人</strong> 的 macOS 游戏玩家已经可以玩不少 3A 大作。那个 “Linux 不能玩游戏” 的 Linux —— 已经成为最适合玩游戏的操作系统。Steam Deck 卖了几百万台，Wine / Proton 让 Windows 游戏在 Linux 上跑得比在 Windows 上还快。</p><p>游戏，这个 Windows 曾经唯一的护城河，几乎被攻破了。</p><p>而 Windows 呢？它连 <strong>“用来开发”</strong> 这件事都做不好。</p><p>一个用来在星巴克剪视频的操作系统现在更适合开发，一个用来开发的操作系统现在更适合玩游戏。世界颠倒了，但 Windows 还是那个 Windows，<strong>至死不渝</strong>。</p><p>你的合作者用 Linux 和 macOS，你用 Windows —— <strong>恭喜你，自动成为了团队里的 “那个麻烦”</strong>。</p></section>
<section><h1>一、路径分隔符<a href="#一路径分隔符"><span>#</span></a></h1><p>在 Linux 和 macOS 上，路径是 <code>/home/JH/project/src/main.c</code>。在 Windows 上，路径是 <code>C:\Users\JH\project\src\main.c</code>。</p><p>就是这个字符，让你的人生比其他人多出 33% 的烦恼。你在代码里写 <code>path.join("build", "output")</code>，在 Python 里用 <code>os.path.join</code>，在 C++ 里用 <code>std::filesystem::path::preferred_separator</code> —— 你觉得你处理好了。不，你没有。</p><p>总会有某个库、某个脚本、某个第三方工具 <strong>硬编码</strong> 了 <code>"/"</code> 或者 <code>"\\"</code>。写 <code>path/to/file</code> 在 Windows 上可能侥幸能跑，但把路径传给 <code>cmd.exe</code> 的时候，不认。传给 <code>cl.exe</code> 的 <code>/I</code> 参数的时候，偶尔不认。传给某个用 <code>CreateFileA</code> 的古老工具时，绝对不认。</p><p>更糟糕的是，你的 Linux 队友写了个 CMake 脚本：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>set</span><span>(OUTPUT_DIR </span><span>"build/${CONFIG}/obj"</span><span>)</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你高高兴兴拉到 Windows 上一跑，CMake 把它变成了 <code>build\Debug\obj</code>。看起来没问题？等你把这个路径传给一个用 Python 的 <code>pathlib</code> 生成的东西，再传给一个用纯字符串拼接的东西，再经过三层脚本 —— 恭喜，你得到了 <code>build\\Debug\\obj</code> 和 <code>build/Debug/obj</code> 混在一起的奇观。构建系统开始报“找不到文件”，你花两个小时发现是某个 shell 脚本里有一行 <code>sed 's/\//\\/g'</code> 写错了。</p><p>你的 Linux 队友不用想这些。你的 macOS 队友也不用想这些。只有你。</p><p>你用 Nushell 或者 PowerShell Core？Nushell 是结构化 Shell，它懂表格，懂数据流，但它不懂为什么 Windows 的世界里到处都是反斜杠。启动是快了，试试在里面执行一个 Windows 原生命令，返回一个路径 —— 给的是 <code>C:\Users\JH\project</code>。你要把这个路径传给下一个命令，下一个命令期望的是 <code>C:/Users/JH/project</code>。或者反过来。你可以在脚本里用 <code>str replace</code> 把 <code>\</code> 换成 <code>/</code>，但你每写一个 pipeline 都要做一次。你的脚本变得又臭又长。</p><p>你的 Linux 队友，打开终端，瞬间。输入命令，路径永远是 <code>/</code> 分隔，永远不会错。他们不知道你在经历什么。</p></section>
<section><h1>二、cl.exe 和 MSVC 构建工具：活在 1995 年的编译器<a href="#二clexe-和-msvc-构建工具活在-1995-年的编译器"><span>#</span></a></h1><p>有人说 “Windows 上可以用 clang 啊”。可以，当然可以。但用 clang for Windows，你链接的是什么库？还是 MSVC 的运行时库。避无可避。</p><p>MSVC 的问题不在于它不符合标准（虽然它曾经很烂，现在依然有一些角落烂着），而在于它的 <strong>工作流</strong>。</p><p>在 Linux 上写 <code>gcc main.c -o main</code>，完事。在 macOS 上写 <code>clang main.c -o main</code>，完事。在 Windows 上？</p><p>首先，你得找到 <code>cl.exe</code>。它不在 PATH 里。你得打开 “Developer Command Prompt”，或者运行 <code>vcvarsall.bat</code>。这个脚本干了什么？设置了二十几个环境变量，修改了 LIB 和 INCLUDE 路径，还把一堆莫名其妙的东西塞进 PATH。</p><p>想自己配？那你告诉我，<code>cl.exe</code> 需要的 <code>mspdbcore.dll</code> 在哪？<code>vcruntime.h</code> 在哪？<code>kernel32.lib</code> 在哪？你不知道。我也不完全知道。微软自己把它藏在一个每六个月变一次路径的目录里：<code>C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64</code>。你感受一下。</p><p>然后你说 “我用 CMake”。好，CMake 能帮你找到这些东西。但 CMake 自己也要先知道用哪个 generator。你用 <code>-G "Visual Studio 17 2022"</code>，CMake 生成了一大堆 <code>.sln</code> 和 <code>.vcxproj</code> 文件。这些文件是 XML。巨大无比。你打开看一眼就想吐。你不想用 Visual Studio IDE，你只想用命令行。但 MSVC 的命令行生态是 <strong>二等公民</strong>。</p><p>最可笑的是预编译头。在 Linux 上没人用预编译头，因为编译速度没那么慢。在 Windows 上不用预编译头？<code>#include &lt;windows.h&gt;</code> 一个头文件展开后几十万行，再 <code>#include &lt;iostream&gt;</code> 又是几万行。你的编译速度慢得像是在用软盘装系统。而 MSVC 的预编译头机制 —— <code>/Yc</code> 和 <code>/Yu</code>——复杂到专门有一本书的章节讲它。而且它在命令行下用起来别扭得要死。</p><p>你花在工具链上的时间，你的 Linux 队友用来写 feature。</p></section>
<section><h1>三、Rust 工具链<a href="#三rust-工具链"><span>#</span></a></h1><p>有人说 “我在 Windows 上用 Rust 开发体验很好”。是的，体验很好。但你知道这个 “很好” 是怎么来的吗？</p><p>Rust 为了在 Windows 上找到 <code>cl.exe</code> 和相关环境，<strong>专门写了约 2000 行代码，一整个专门的 package</strong>。你以为 <code>cargo build</code> 能直接工作是理所当然的？不是。那是 Rust 工具链的维护者替你受了你本该受的苦。</p><p>在 Linux 上写 <code>cargo build</code>，它调用 <code>cc</code>，<code>cc</code> 调用 <code>gcc</code> 或者 <code>clang</code>，完事。三行逻辑。</p><p>在 Windows 上写 <code>cargo build</code>，背后是一台用胶带和铁丝绑在一起的 Frankenstein 怪物。而 Rust 团队花了无数个日夜，让这个怪物看起来像个正常人。</p><p><strong>你觉得体验好，是因为有人替你挡了子弹。和 Windows 毫无关系。</strong></p></section>
<section><h1>四、LF vs CRLF：一场持续五十年的愚蠢战争<a href="#四lf-vs-crlf一场持续五十年的愚蠢战争"><span>#</span></a></h1><p>这是最让我无语的一个问题。它本来不应该存在。</p><p>Unix 用 LF（<code>\n</code>，<code>0x0A</code>）表示换行。古老的 Mac OS 9 用 CR（<code>\r</code>，<code>0x0D</code>）。Windows 用 CRLF（<code>\r\n</code>，<code>0x0D 0x0A</code>）。</p><p>为什么 Windows 用 CRLF？因为 MS-DOS 抄袭 CP/M，CP/M 用 CRLF 因为它的文件系统用 CRLF 来 <strong>“兼容 TTY（电传打字机）”</strong>。TTY，你听听，<strong>电传打字机</strong>！！</p><p>现在是 2026 年。谁还用电传打字机做终端输出？没有。但 Windows 记事本 —— 直到 2018 年 —— 都不支持 LF 作为换行符。你打开一个 LF 结尾的文件，它会显示成一行。整个文件粘在一起。后来微软改了，但那是 2018 年！距离 Unix 发明已经过了 49 年。</p><p>你以为现在没问题了？Naive!</p><p>Git 有 <code>core.autocrlf</code>。你设成 <code>true</code>，它会在 checkout 时把 LF 转成 CRLF，commit 时转回 LF。看起来很美。但你会遇到：</p><ul>
<li>一个 shell 脚本里有 <code>#!/bin/bash</code>，它要求文件以 LF 结尾。Git 把它转成了 CRLF，bash 不干了。</li>
<li>一个 JSON 文件里嵌了换行符，你的解析器逐字节读，发现多了一个 <code>\r</code>，JSON 解析失败。</li>
<li>你的 Python 脚本用 <code>open("file", "r")</code> 打开一个 CRLF 文件，在 Linux 上读出来每行末尾有 <code>\r</code>，你 strip 了吗？没有，于是你比较字符串的时候永远相等不了。</li>
<li>你的队友不小心提交了一个 CRLF 文件，你用 <code>git diff</code> 看到整个文件每一行都被修改了。因为 diff 工具认为每一行末尾多了一个看不见的字符。</li>
</ul><p>你在 Windows 上配 <code>.gitattributes</code> 配到怀疑人生。你设 <code>* text=auto</code>，又设 <code>*.sh text eol=lf</code>，又设 <code>*.bat text eol=crlf</code>。然后你发现 <code>.gitattributes</code> 自己也被转成了 CRLF，导致 Git 不认这个文件。</p><p>你的 Linux 队友从不思考这个问题。他写代码，commit，push。你 pull 下来，所有文件都在报错。你花半天时间 <code>dos2unix</code> 整个目录，commit，push。你的 macOS 队友 pull 下去，他的编辑器显示 “文件格式混合”。他开始骂你，你开始骂 Windows。</p><p>而 Windows 说：“我们有 WSL 啊，你在 WSL 里开发不就好了？”</p></section>
<section><h1>五、WSL 不是答案<a href="#五wsl-不是答案"><span>#</span></a></h1><p>每次说到这，总有 Windows 粉丝说 “你用 WSL 啊”。我建议你把 WSL 的全名念一遍，<strong>WSL 是 Windows Subsystem for Linux</strong>。</p><p>WSL 1 是翻译层，把 Linux 系统调用翻译成 Windows 系统调用。慢得一塌糊涂，I/O 性能像在爬。</p><p>WSL 2 跑了一个真正的 Linux 内核在 Hyper-V 虚拟机里。性能好了，但你的文件在哪？你在 <code>/home/JH/project</code> 下，这个目录实际在虚拟硬盘文件里。你想访问 Windows 的 <code>C:\Users\JH\project</code>？可以，它在 <code>/mnt/c/</code> 下面。但访问 <code>/mnt/c/</code> 的性能 <strong>又回到了 WSL 1 的水平</strong>，因为要经过 9p 协议来回转换。</p><p>所以你在 WSL 里工作的最佳实践是什么？<strong>把代码放在 WSL 自己的文件系统里</strong>。也就是说，你不用 Windows 的文件系统了。你的编辑器呢？你可以在 Windows 上用 VS Code 连接 WSL，通过 Remote - WSL 插件。VS Code 在 Windows 上跑界面，后端在 WSL 里跑。</p><p>等等，那你的开发环境到底算 Windows 还是 Linux？你调试一个程序，它在 WSL 里跑，但你用的工具链是 Linux 的 gcc，链接的是 Linux 的 .so 文件，生成的是 Linux 的 ELF 二进制。这个二进制在 Windows 上跑不了。你想生成 Windows 的 exe？那你得退出 WSL，回到 Windows，用 MSVC。</p><p>所以 WSL 不是让你在 Windows 上开发 Windows 程序。它是让你在 Windows 上开发 Linux 程序。换句话说，你用 Windows 作为宿主机，跑一个 Linux 虚拟机，然后在虚拟机里开发。<strong>那你为什么不直接装 Linux</strong>？</p><p>WSL 的存在说明：<strong>微软承认 Windows 的开发体验不如 Linux，所以他们给你一个 Linux 虚拟机</strong>。但你每多一层抽象，就多一层麻烦。网络配置、设备映射、环境变量传递、进程间通信 —— 每一个都有一堆奇怪的边界情况。</p><p>这就好比你说 “我想学游泳”，然后有人给你买了一个游泳池，但游泳池里没有水，水在隔壁的另一个池子里，你得用一个桶把水拎过来。你问 “为什么不直接在那个池子里游泳”？他说 “因为那个池子太丑了”。</p></section>
<section><h1>六、摩登的 PowerShell<a href="#六摩登的-powershell"><span>#</span></a></h1><p>你说你用 PowerShell。好，我问你：你打开一个终端，输入 <code>powershell</code>，回车，然后呢？</p><p>等…</p><p>等……</p><p>等………</p><p>等五秒钟。等六秒钟。有些配置稍差的设备，甚至能等十秒。</p><p>你告诉我，你在一台 CPU 是 5GHz，内存 64GB，NVMe SSD 的机器上，启动一个 Shell 要五秒钟。这不是开玩笑吗？五秒钟够 Linux 启动整个系统了。</p><p>为什么？因为 PowerShell 启动时要加载 .NET 运行时。.NET 运行时要 JIT 编译一大堆代码。它要加载几百个 DLL。它要读取你的 profile 脚本。它要做一百件你根本不关心的事情。</p><p>你说 “那我用 Nushell”。Nushell 启动只要 9 毫秒。你算算：5000 毫秒除以 9 毫秒，<strong>555 倍</strong>。这是什么概念？PowerShell 用户眼里的 Nushell 就像普通人眼里的 <strong>Faiz 加速形态</strong>。</p></section>
<section><h1>七、MSVC Build Tools：许可证问题让你无法自动化<a href="#七msvc-build-tools许可证问题让你无法自动化"><span>#</span></a></h1><p>这可能是最荒谬的一点。</p><p>你想在 CI/CD 里自动构建 Windows 程序。你在 Linux runner 上交叉编译？不行，你缺 MSVC 的 headers 和 libraries。</p><p>那你怎么办？你需要安装 MSVC Build Tools。你怎么安装？你去微软官网下载 <code>vs_BuildTools.exe</code>，然后<strong>手动点击下一步、下一步、同意许可协议、勾选组件、等待安装</strong>。</p><p>你不能用 <code>winget</code> 自动安装。你不能用 Chocolatey 自动安装（虽然社区有包，但不是微软官方支持的）。你不能在 Docker 镜像里预装（除非你用 Windows 容器，那又是另一个地狱）。</p><p>MSVC Build Tools 的许可证不允许你以编程方式绕过安装程序的 “技术限制”。你可以自己写脚本调用静默安装参数，但那不叫 “自动化”，那叫 “我帮你点下一步” —— 你依然需要一个交互式会话或者预先配置好的镜像。</p><p>在 Linux 上装 <code>gcc</code>：<code>apt install gcc</code>。一条命令，不需要点击任何东西，不需要同意任何许可协议，不需要等待一个蜗牛般的下载。</p><p>微软为什么不能把 MSVC 工具链放到一个简单的 <code>.tar.gz</code> 里？因为许可证不允许。因为微软希望你用 Visual Studio IDE。因为命令行用户是二等公民。从 1990 年代到现在，一直是。</p></section>
<section><h1>八、GBK 编码：一个本该在 2006 年死去的东西<a href="#八gbk-编码一个本该在-2006-年死去的东西"><span>#</span></a></h1><p>写中文注释。处理中文文件路径。你的队友在 macOS 上提交了一个包含中文字符的 JSON 文件。</p><p>恭喜你，触发了 Windows 最恶心的 “特性” 之一：GBK 编码。</p><p>在 Linux 和 macOS 上，文本文件默认是 UTF-8。从 2000 年代初就是这样。今天是 2026 年，UTF-8 已经是绝对的主流，全世界 98% 的网页用 UTF-8。</p><p>Windows 呢？Windows 的 “ANSI 代码页” 默认是 GBK（如果你在中文系统上）。你用记事本保存一个文件，默认编码是 ANSI（也就是 GBK）。你用 PowerShell 输出重定向，默认编码是 UTF-16LE（不是 UTF-8）。你用 <code>cl.exe</code> 编译一个源文件，如果源文件是 UTF-8 with BOM 它能认，没有 BOM？它当成 ANSI 处理，然后你的中文字符串变成了乱码。</p><p>你的 Linux 队友提交了一个 UTF-8 文件，你拉下来用 VS Code 打开，VS Code 猜编码猜错了，你看到一堆 <code>ä½ å¥½</code>。你手动改编码，保存。然后你的队友拉下去，发现文件变成了 CRLF（我们后面说这个）加 UTF-8 with BOM。他开始骂你。</p><p>你在 Python 脚本里写 <code>open("file.txt", "r")</code>，在 Linux 上读 UTF-8，在 Windows 上读 GBK。你的脚本 “在我电脑上能跑”，在你队友电脑上崩了。</p><p>你说 “那我用 Python 的 <code>encoding='utf-8'</code> 参数”。你知道你要写这个参数，你写了。但你调用的第三方库呢？它没写。你的构建脚本里的某个工具呢？它没写。总有某个地方，某个人，某段代码，默认用了系统 ANSI 代码页。</p><p>这个问题从 Windows 95 时代就存在。30 年了。<strong>没有解决，且永远不会解决</strong>。</p></section>
<section><h1>九、LLM Agent 时代的致命伤<a href="#九llm-agent-时代的致命伤"><span>#</span></a></h1><p><strong>这是 2026 年才变得特别明显的问题。</strong></p><p>你让一个 LLM Agent 比如 Claude Code、OpenAI Codex 帮你执行一条命令。在 Linux 上，Agent 写 <code>grep "hello world" file.txt</code>，直接执行，成功。</p><p>在 Windows 上，Agent 写 <code>findstr "hello world" file.txt</code>，执行，成功。看起来不错。</p><p>然后你让 Agent 执行一条稍微复杂一点的命令：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span><span>powershell </span><span>-</span><span>Command </span></span><span>"&amp; { Get-ChildItem -Recurse | Where-Object { $_.Name -match 'test' } }"</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>问题来了。引号嵌套。Agent 不知道什么时候用双引号，什么时候用单引号，什么时候转义。PowerShell 的语法是出了名的 <strong>“写起来像英语，转义起来像咒语”</strong>。</p><p>你让 Agent 生成一行 C++ 代码并通过 <code>cl.exe /D</code> 传入：</p><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>cl /D"MY_STRING=\"hello\\nworld\"" main.c</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>你需要两层转义：一层给 shell，一层给 C 预处理器。在 cmd.exe 里，转义规则和 PowerShell 不一样。在 PowerShell 里，转义规则又不一样。在 Git Bash 里，又不一样。</p><p>Agent 试了三次，都失败了。它开始 “深度思考”，写了一个 Python 脚本来生成命令，然后执行 Python 脚本——绕了一个大圈子。你的 token 消耗从 100 变成了 5000。没关系，Windows 用户的 token 是大风刮来的。</p><p>你的 Linux 队友的 Agent 从未失败过。因为 Linux shell 的转义规则是清晰的、一致的、可预测的。Windows 有四种不同的 shell（cmd，PowerShell，Git Bash，WSL bash），四种不同的转义规则，每一种都有自己的 “惊喜”。</p></section>
<section><h1>十、关不掉的 Windows Defender<a href="#十关不掉的-windows-defender"><span>#</span></a></h1><p>你说你的编译慢。你说你的 <code>npm install</code> 慢。你说你的 <code>git clone</code> 慢。</p><p>我告诉你原因：<strong>Windows Defender 在扫描每一个文件</strong>。</p><p>你编译一个 C++ 项目，生成 1000 个 <code>.obj</code> 文件。Defender 在每个文件创建时扫描一遍。在每个文件写入时扫描一遍。在链接器读取每个文件时再扫描一遍。</p><p>你在 Linux 上编译同一个项目，没有这些扫描。编译时间差多少？首席水煮牛肉师实测，<strong>同一台设备，物理安装 Linux + XeLaTeX 编译一份 .tex 文档，比 Windows 快 80%</strong>。</p><p>80%！这意味着你在 Windows 上等 10 分钟，在 Linux 上等 2 分钟。一天编译 20 次，你浪费了 160 分钟。将近三个小时。</p><p>那我关掉 Defender？<strong>你试过吗？你知道怎么关吗？</strong></p><p>你可以去 “Windows 安全中心” 关掉 “实时保护”。五分钟后它会自动重新打开。你可以在组策略里禁用。但 Windows 10/11 的家庭版没有组策略。你可以修改注册表。但下一次 Windows Update 会把它改回来。你可以装一个第三方杀毒软件，Defender 会自动关闭 —— 但你现在不仅要对付 Defender，还要对付另一个杀毒软件。</p><p>能不能完全永久关掉？不能。Windows 不允许你关掉它最核心的安全功能。这是“<strong>为了你好</strong>”。微软替你做了决定。</p><p>你说 “那我把编译目录加到排除列表里”。可以。但你做 CI/CD 的时候呢？你的构建机每次都是新的，排除列表每次都要重新配置。你的 Docker 容器里跑 Windows？排除列表在容器里不生效。</p><p>而在 Linux 上，安全是你的责任。你想关 SELinux？<code>setenforce 0</code>。你想关 AppArmor？<code>systemctl stop apparmor</code>。系统听你的。Windows 不听你的。Windows 是你的 Master，你不是它的用户。</p></section>
<section><h1>十一、NTFS 和 ReFS 的悲剧<a href="#十一ntfs-和-refs-的悲剧"><span>#</span></a></h1><p>在 Windows 上编译一个项目，生成几千个小文件。慢到怀疑人生。</p><p>你把项目放到 Dev Drive 上（微软 2023 年推出的“开发者专用”分区格式，基于 ReFS）。快了一点。但为什么还是比 Linux 慢？</p><p>因为问题的根源不是文件系统格式，是 <strong>安全软件插在文件系统上的那些钩子 （filters/hooks)</strong>。Dev Drive 之所以快，是因为 Windows 默认不对 Dev Drive 上的文件进行某些安全检查。但即使这样，<strong>Linux 在处理大量小文件的场景下依然比 Windows 快得多</strong>。</p><p>Linux 的文件系统设计从一开始就考虑了 “很多小文件” 的场景。ext4、XFS、btrfs，它们的目录结构、inode 管理、缓存策略，都是为真实世界的工作负载优化的。</p><p>NTFS 的设计目标是 <strong>“与 DOS 和 Windows 95 兼容”</strong>。它的根目录下还有 <code>C:\</code>、<code>D:\</code> 这种盘符的概念——<strong>这是 1970 年代的 CP/M 遗留的设计</strong>。你什么时候在 Linux 上见过盘符？没有。<code>/mnt</code> 和 <code>/media</code> 是挂载点，不是盘符。</p><p>你说 “那我用 WSL 2，把代码放在 WSL 的文件系统里”。是的，这样快。但你本质上是在用 Linux 的文件系统。那你<strong>为什么不直接装 Linux？</strong></p><p>Windows 的文件系统性能问题不是 “差一点”，是 “差一个数量级”。你编译一次可能只差几十秒，但你一天编译几十次，一周五天，一年五十二周——算算你浪费了多少生命？</p></section>
<section><h1>十二、Windows 11 的内存黑洞<a href="#十二windows-11-的内存黑洞"><span>#</span></a></h1><p>你说你的电脑是 8GB 内存。你说你只是想写写前端代码。</p><p>8GB 内存在 Windows 11 上连 “开机后什么都不做” 都勉强。</p><p>Windows 11 开机后，系统自身吃掉 3-4GB。Windows Defender 吃掉 500MB。Windows Update 服务吃掉 200MB。各种 “现代” 应用的后台进程——天气、新闻、Xbox、Your Phone、Cortana*（对，它还在）*加起来又是 1GB。</p><p>你已经用了 5-6GB。你打开 Chrome 或 Edge？一个 tab 100MB 起，开十个 tab 就是 1GB。你打开 VS Code？又一个 500MB。你打开 Docker Desktop？2GB 没了。你的内存开始 swap。swap 到 SSD，SSD 寿命下降。你的电脑开始卡。</p><p>你说 “那我加内存”。好，你加到 16GB。Windows 11 会咸因吗？不会。它会用更多内存来 “缓存” 东西，因为它的内存管理策略现在是 “有多少用多少”。你打开任务管理器，看到 “已提交” 内存是物理内存的两倍。你问系统管理员这是怎么回事，他说 “<strong>You’re Absolutely Right!</strong>”。</p><p>正常？你在 Linux 上跑 <code>free -h</code>，看到 used 是 2GB，cached 是 4GB，available 还是 4GB。你清楚知道内存去哪了。Windows 的 “资源监视器” 给你看一堆数字，你看了三遍也不知道到底谁吃了你的内存。</p><p>更可笑的是，Windows 11 的<strong>推荐配置是 4GB 内存</strong>。4GB！安装都装不进去 —— <strong>安装程序自己就要 2GB</strong>，还要留空间解压文件。<strong>微软的硬件兼容性团队是不是在用</strong> <strong><code>8 + 128</code> (<code>8TB SSD + 128GB RAM</code>)</strong> <strong>的机器测试，然后写文档的人觉得是</strong> <strong><code>8 + 128 GB</code></strong>，才能如此心安理得地写下 <strong>推荐配置 4GB</strong>？</p></section>
<section><h1>十三、WebView UI 把操作系统变成浏览器<a href="#十三webview-ui-把操作系统变成浏览器"><span>#</span></a></h1><p>Windows 11 最 “现代” 的特性是什么？<strong>WebView UI</strong>。</p><p>设置界面是 WebView。开始菜单是 WebView。文件资源管理器的部分界面是 WebView。通知中心是 WebView。任务栏的 “小组件” 是 WebView。</p><p><strong>没错！你的操作系统，现在是用 HTML、CSS 和 JavaScript 渲染的。</strong></p><p>你打开 <code>设置 → 个性化 → 颜色</code>。你点了 “深色模式”。UI 卡了 0.5 秒。为什么？因为它要<strong>重新渲染整个 WebView 页面</strong>。你在 Linux 上改个 GTK 主题，瞬间生效。因为 GTK 是原生渲染。</p><p>WebView 有什么问题？</p><ul>
<li><strong>内存占用翻倍</strong>。每个 WebView 实例是一个迷你浏览器，有自己独立的渲染进程。设置界面是一个实例，开始菜单是一个实例，小组件是一个实例。每个实例吃掉 100-200MB 内存。你的 8GB 机器就这样被一点点蚕食。</li>
<li><strong>渲染延迟</strong>。你点击“开始”，等 0.3 秒菜单才弹出来。不是动画时间，是 WebView 响应时间。你在 Linux 上用 KDE 或 GNOME，点击开始菜单，瞬间弹出。因为那是原生代码，不是 JavaScript。</li>
<li><strong>动画掉帧</strong>。你打开通知中心，动画掉到 30fps。你问微软为什么不优化，微软说 “我们用 Fluent Design 的流畅动画”。流畅？30fps 叫流畅？你在 macOS 上打开通知中心，ProMotion 120fps 丝般顺滑。Windows 11 的 UI 性能甚至不如 2015 年的 Windows 10，而 Windows 10 的性能不如 2012 年的 Windows 8/8.1。开倒车，而且是<strong>坐着火箭开倒车</strong>。</li>
</ul><p>一个操作系统，连自己最基础的 UI 都做不好，你指望它能做好开发体验？</p></section>
<section><h1>十四、微软官方承认的 boot loop 特性<a href="#十四微软官方承认的-boot-loop-特性"><span>#</span></a></h1><p>2025 年，微软官方发布了一篇支持文档，标题是 <strong>“Windows 更新后可能出现 boot loop”</strong>。</p><p>你再读一遍这句话。</p><p><strong>微软官方承认，他们的操作系统在更新后可能会 boot loop。</strong></p><p>你的电脑开机，启动 Windows，加载更新，重启，开机，启动 Windows，加载更新，重启 …… 循环往复，直到你手动进入恢复模式，卸载更新，或者重装系统。</p><p><strong>2025 年，微软说 “我们正在修复这个问题”。</strong></p><p><strong>2026 年，这个问题依然存在。</strong></p><p>你在写代码，Windows 提示 “需要重启以完成更新”。你说 “稍后”。Windows 不听你的，因为 <strong>Windows 作为大总统的权力是无限的</strong>。Windows 在凌晨 3 点自动重启了。你的工作没有保存。你的 IDE 没有恢复会话。你的本地 git 仓库可能有未提交的变更。全是你的责任，你用 Windows 这个权力无限大系统应该承受的责任。</p><p>第二天早上你打开电脑，看到 “正在配置更新 0%”。你等。等到 30%。它重启。又开始 “正在配置更新 0%”。</p><p>你这一天废了。你要花两个小时进入恢复模式，卸载更新，然后关闭 Windows Update 服务。<strong>你的 Linux 队友已经提交了三个 PR 然后超额完成任务给自己放假了</strong>。</p><p>你说 “那我用 Windows LTSC 版本，没有这些花里胡哨的更新”。好，但你用的是企业版，你的公司不一定买。而且 LTSC 版本三年才更新一次，你的开发工具需要的新 API 没有。你装个 Node.js 18，它说 “需要 Windows 10 1903 或更高版本”。你的 LTSC 是 1809。你又被卡住了。</p><p>Windows 是一个<strong>强制性的、不可预测的、可能摧毁你工作进度的操作系统， 其中 “操” 念第四声</strong>。你永远不知道它什么时候会来，来了之后会不会把你的系统搞崩。</p></section>
<section><h1>十五、最大的讽刺，最好的游戏系统<a href="#十五最大的讽刺最好的游戏系统"><span>#</span></a></h1><p>这是起点，亦是终点。</p><p>2000 年代，Windows 的护城河是什么？<strong>游戏</strong>。你想玩游戏？你必须装 Windows。Linux 上连《魔兽世界》都跑不了，macOS 上更别想。那时候的 Windows 用户嘲笑 Linux 用户：“你的系统能玩 3A 大作吗？或者 Galgame？”</p><p>2026 年，情况完全反过来了。</p><ul>
<li><strong>Steam Deck</strong> 卖了几百万台，跑的是基于 Arch Linux 的 SteamOS。</li>
<li><strong>Wine / Proton</strong> 让成千上万的 Windows 游戏在 Linux 上无缝运行。很多游戏在 Proton 下的性能甚至 <strong>超过原生 Windows</strong>，因为 Vulkan 翻译层比 DirectX 在某些场景下更高效，也没有无数次生生不息的 Defender 扫描，也没有残废的文件系统。</li>
<li><strong>NVIDIA 和 AMD</strong> 的 Linux 驱动已经成熟到可以跑光线追踪。</li>
<li><strong>macOS 游戏玩家</strong> —— 就是那群被嘲笑了二十年的 “用 Mac 玩游戏的精神病人”，现在已经可以通过 Game Porting Toolkit 玩不少 3A 大作。苹果甚至官方支持这件事。</li>
</ul><p>游戏。Windows 最后的堡垒，几乎已经沦陷了。</p><p>而 Windows 呢？它在开发领域依然是一团糟。你在 2026 年用 Windows 开发，你要面对：</p><ul>
<li>路径分隔符的混乱（来自 1980 年代的 DOS）</li>
<li>CRLF 换行符（来自 1970 年代的 CP/M）</li>
<li>MSVC 工具的许可证地狱（来自微软的商业模式）</li>
<li>PowerShell 五六秒的启动时间（来自 .NET 的包袱）</li>
<li>GBK 编码（来自中国区 Windows 的特殊 “待遇”）</li>
<li>Defender 关不掉的 I/O 拖累</li>
<li>四种 shell 四种转义规则</li>
<li>8GB 内存不够开机（来自 Windows 11 的 “现代化”）</li>
<li>WebView UI 卡成 30fps（来自 “我们也是 Web 公司” 的幻觉）</li>
<li>boot loop（来自微软官方承认的 bug 特性）</li>
</ul><p>你的 Linux 队友在做什么？TA 在 Arch 或者 NixOS 上全成就通关《魔法少女的魔女审判》，在《鸣泣之时》中听着志方晶子志仓千代丸作的曲子看沙都子大战梨花，在《素晴日》里穿着轻飘飘的衣服于楼顶上抽烟，切到桌面，<code>gcc main.c -o main</code>，完事。</p><p>你的 macOS 队友在做什么？TA 在 MacBook Pro 上打开《赛博朋克 2077》《死亡搁浅 2》《生化危机》《博德之门 3》《艾尔登法环》《巫师 3》《无人深空》，关掉，<code>clang main.c -o main</code>，完事。甚至还有余力剪辑游戏录屏然后发到 B 站。</p><p>你呢？笔电男大？你在等待 PowerShell 启动，你在等待 Windows 启动，<strong>但有时它们永远也不会启动</strong>，<strong>像极了在一代杀戮尖塔玩鸡煲的你</strong>。你在跟 CRLF 搏斗。你在想 <code>cl.exe</code> 你到底在哪，<code>cl.exe</code> 你根本不在 <code>C:\Program Files (x86)\Microsoft Visual Studio\2022\BuildTools\VC\Tools\MSVC\14.44.35207\bin\Hostx64\x64</code>，你在想 <code>cl.exe</code> 为什么会和 <code>nvcc</code>、<code>cygwin</code> 撞车。你在想 Everything 为什么能在你本地搜出 11 个 <code>ghc</code> 安装目录下的 MSYS2。你在考虑要不要把编译目录加到 Defender 排除列表里，你在想要不要重装一个更稳定的第三方修改版 Windows。你在 Stack Overflow 上搜 “vswhere 找不到 Visual Studio”。你的电脑在 boot loop。你的 UI 在掉帧。你的内存被 WebView 吃光了。你打开 IM 尝试求助群友，但是每个人都在发 “喜报” 图片。</p><p>你想你的 Arch Linux 了。</p><p>帕特玛颠倒了，世界颠倒了。但 Windows 没变。</p></section>
<section><h1>后记<a href="#后记"><span>#</span></a></h1><p>有读者问我 “你是不是对微软有偏见”。我对微软没有任何偏见。<strong>我对任何浪费我时间的工具有偏见</strong>。Windows 是其中最突出的一个，MS Office 也是，不过这是另一个话题了。</p><p>还有读者问 “2026 年了，你还用 Windows 吗？”</p><p>用。为了写出这篇文章，我还得用。</p></section>]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/Linux-Ate-My-RAM!!!/</id>
      <title type="text">Linux Ate My RAM!!!</title>
      <published>2017-03-06T00:00:00.000Z</published>
      <updated>2026-08-02T00:00:00.000Z</updated>
      <author><name>Vidar Holen（原著） &amp; 𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫（翻译）</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/Linux-Ate-My-RAM!!!/"/>
      <summary type="text">如果某天你注意到你的 top/htop/btop 上显示内存的 Free 部分十分之少，不要着急，这是正常现象</summary>
      <content type="html"><![CDATA[<div><h1>Don't Panic!<br />Your RAM is FINE!<br /><br />不要恐慌！<br />你的内存没有任何问题！</h1></div>
<section><h1>本土化翻译<a href="#本土化翻译"><span>#</span></a></h1><section><h2>所以到底发生了什么？<a href="#所以到底发生了什么"><span>#</span></a></h2><p>与所有现代操作系统一样，Linux 会借用未使用的内存来做磁盘缓存。这让你的系统看上去好像陷入了“空闲”内存不足的窘境，但事实并非如此！一切都十分正常，<em><strong>请坐和放宽</strong></em>！</p></section><section><h2>Linux 为什么要这样做？<a href="#linux-为什么要这样做"><span>#</span></a></h2><p>总而言之，磁盘缓存除了让系统变得更快、响应更灵敏，没有任何其他缺点！除了让那些刚接触计算机、不熟悉文件系统缓存概念的用户<em><strong>（比如现在正在看这篇文章的你，想想你是怎么点进来看到这篇文章的）</strong></em>感到困惑意外没有任何缺点</p><p>最重要的是，它通常<strong>不会从前台应用程序那里抢走内存</strong>，<strong>相信我！你的内存真的够用！</strong></p></section><section><h2>如果我运行了更多应用程序会发生什么？<a href="#如果我运行了更多应用程序会发生什么"><span>#</span></a></h2><p>如果你的应用程序需要更多内存，内核会<strong>收回磁盘缓存先前借走的那部分内存</strong>，因此磁盘缓存<strong>随时可以立即归还给应用程序</strong>！Linux 其实没有吃掉你任何一部分内存，它只是在最大化利用空闲的内存，在你不需要用内存的时候用空闲的内存给你换更好的体验！</p></section><section><h2>所以我需要更多的交换空间（<code>SWAP</code> 也就是虚拟内存）吗？<a href="#所以我需要更多的交换空间swap-也就是虚拟内存吗"><span>#</span></a></h2><p>大概率<strong>不需要</strong>，因为磁盘缓存主要借用的是应用程序当前未占用的内存，当应用程序需要更多内存时，Linux 内核会从磁盘缓存中拿回来</p><p>当然，如果某些应用程序的内存访问频率还不如文件系统缓存高，Linux <em>确实</em>有可能会把它们挤进交换内存中，但这种操作通常是为了提升性能，而并不会损耗性能</p></section><section><h2>我能阻止 Linux 这样做吗？<a href="#我能阻止-linux-这样做吗"><span>#</span></a></h2><p>你<strong>无法完全禁用</strong>磁盘缓存，但你可以调整 Linux 的“<strong>交换倾向</strong>”（即调整 Linux 的 <code>swappiness</code> 参数），大家之所以想禁用磁盘缓存，唯一的理由就是误以为它抢占了应用程序的内存——<strong>然而它并没有</strong>！</p><p>磁盘缓存能让程序加载得更快、运行得更丝滑，但它<strong>绝对、并且永远不会</strong>克扣程序的内存！因此，你<strong>完全没有理由去禁用它！</strong></p><p>不过，如果你出于某种原因（比如测试未缓存应用冷启动的性能）需要快速清空一些 RAM，你可以用以下的命令强制 Linux 安全の<a href="https://linux-mm.org/Drop_Caches" target="_blank">丢弃缓存</a>：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> </span><span>3</span><span> | </span><span>sudo</span><span> </span><span>tee</span><span> </span><span>/proc/sys/vm/drop_caches</span></div></div></code></pre><div><div></div><div></div></div></figure></div></section><section><h2>既然内存完全够用，为什么 <code>top/htop/btop</code> 和 <code>free</code> 命令显示的“<code>Free</code>”内存那么少？<a href="#既然内存完全够用为什么-tophtopbtop-和-free-命令显示的free内存那么少"><span>#</span></a></h2><p>这只是术语上的差异：</p><p>你和 Linux 都认为<strong>应用程序占用的内存是“<code>Used</code>（<em>已用内存</em>）”</strong>，而<strong>完全没被使用的内存是“Free（<em>空闲内存</em>）”</strong></p><p>但是，对于当前正被用于某种用途（<em>比如被拿来当做磁盘缓存的内存</em>）、但依然可以提供给应用程序使用的内存，换作你，你会怎么描述呢？</p><p>你可能会把这类内存算作“Free”或“Available（<em>可用内存</em>）”，而 Linux 内核则把它描述为“Available”：</p>

<table><thead><tr><th>内存的状态</th><th>你称它为</th><th>Linux 内核称它为</th></tr></thead><tbody><tr><td>已被被应用程序使用</td><td>已用（Used）</td><td>已用（Used）</td></tr><tr><td>已被使用，但可以释放出来供应用程序使用</td><td><em><strong>空闲或可用（Free or Available）</strong></em></td><td><em><strong>可用（Available）</strong></em></td></tr><tr><td>完全未使用</td><td>空闲（Free）</td><td>空闲（Free）</td></tr></tbody></table><p>这部分“<em><strong>干着别的事</strong></em>”的内存（<em><strong>大致</strong></em>）就是 <code>top/htop/btop</code> 和 <code>free</code> 命令中称为“Bufferd（<em>缓冲区</em>）”和“Cached(<em>缓存</em>)”的部分</p><p>但是由于你和 Linux 的<strong>描述方式不同</strong>，你<strong>可能会在内存充裕的情况下误以为内存不足</strong></p></section><section><h2>那怎么才能看到我到底还有多少真正的空闲内存？<a href="#那怎么才能看到我到底还有多少真正的空闲内存"><span>#</span></a></h2><p>要查看你的应用程序<strong>在不使用交换空间的情况下</strong>能使用多少内存，请运行 <code>free -m</code> 并查看“<code>available</code>”列：</p><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span> </span><span></span><span> </span><span>JH</span><span> </span><span>on</span><span> </span><span>Monday</span><span> </span><span>at</span><span> </span><span>8:39</span><span> </span><span>PM</span><span>                                                            </span><span>0.764s</span><span> </span><span></span><span> </span><span>MEM:</span><span> </span><span>77.51%</span><span> (12/16GB)</span></div></div><div><div><div>2</div></div><div><span> </span><span></span><span> </span><span>{</span><span> </span><span></span><span> </span><span>home</span><span> </span><span>}</span><span> </span><span></span><span> </span><span>free</span><span> </span><span>-m</span></div></div><div><div><div>3</div></div><div><span>                </span><span>total</span><span>        </span><span>used</span><span>        </span><span>free</span><span>      </span><span>shared</span><span>  </span><span>buffered/cached</span><span>   </span><span>available</span></div></div><div><div><div>4</div></div><div><span>  </span><span>Mem:</span><span>          </span><span>16000</span><span>        </span><span>6560</span><span>         </span><span>212</span><span>           </span><span>0</span><span>             </span><span>9228</span><span>        </span><span>9440</span></div></div><div><div><div>5</div></div><div><span>  </span><span>Swap:</span><span>          </span><span>1000</span><span>        </span><span>35.3</span><span>         </span><span>988</span></div></div></code></pre><div><div></div><div></div></div></figure></div><p>（对于 <strong>2014 年及以前安装的发行版</strong>，请<strong>查看</strong>“<code>-/+ buffers/cache</code>”行中的“<code>free</code>”列）</p><p>这个值就是你的答案（<em>单位 MiB</em>）。如果你只是单纯地看“<code>free</code>”，你以为内存已经使用了 99%，但实际上它才用了 41% 罢了！</p><p><em>如果想从更详细、技术性的角度了解 Linux 到底把什么算作 “<code>available</code>”，可以参见<a href="https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=34e431b0ae398fc54ea69ff85ec700722c9da773" target="_blank">引入该字段的提交（Commit）记录</a></em></p></section><section><h2>所以我应该何时开始担心内存不够用了？<a href="#所以我应该何时开始担心内存不够用了"><span>#</span></a></h2><p>一个<strong>健康的 Linux 系统</strong>，在内存足够的情况下，运行一会后表现出以下预期且（<em><strong>人畜？</strong></em>）无害的行为：</p><ul>
<li><code>free</code> 内存接近 <code>0</code></li>
<li><code>available</code> 内存（或“<code>free</code> + <code>buffered</code>/<code>cached</code>”）有足够的余量</li>
<li><code>swap used</code> 几乎不发生变化</li>
</ul><p>但是如果出现<strong>以下信号</strong>，那么表示你<strong>确实</strong>已经处在低内存状况下了：</p><ul>
<li><code>available</code> 内存（或“<code>free</code> + <code>buffered</code>/<code>cached</code>”）接近 <code>0</code></li>
<li><code>swap used</code> 持续增加或波动</li>
<li><code>dmesg | grep oom-killer</code> 显示 <code>OutOfMemory-killer</code>（<em>内存溢出杀手</em>）已经开始<em><strong>大开杀戒</strong></em>了</li>
</ul></section><section><h2>我如何验证以上这些结论？<a href="#我如何验证以上这些结论"><span>#</span></a></h2><p><em>请移步<a href="https://www.linuxatemyram.com/play.html" target="_blank">此页面</a>查看更多技术细节，并亲自上手做个磁盘缓存小实验来见证本文所述功能的效果</em></p><p><strong>没有什么比在自己的硬件上测出指数级提升の速度，更能让你领略磁盘缓存的真香定理了！</strong></p><div><div><div></div><div>Note</div></div><div><p><strong><a href="LinuxAteMyRam.com">LinuxAteMyRam.com</a></strong> 由 <a href="http://www.vidarholen.net/" target="_blank">VidarHolen.net</a> 倾情奉献 本网站已<a href="https://github.com/koalaman/linuxatemyram.com" target="_blank">在 GitHub 上开源</a>，欢迎提出建议或提交 PR</p><div><div><div></div><div>Tip</div></div><div><p>此博客也已<a href="https://github.com/Shimmerfly/Shimmerfly.github.io" target="_blank">在 Github 开源</a>，欢迎提出建议或提交 PR</p></div></div><div><div><div></div><div>Caution</div></div><div><p>Tranlated by <a href="/about">𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</a></p><p><strong>转载请标注原译者和作者</strong></p></div></div></div></div></section></section>]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/How-To-Ask-Questions-The-Smart-Way/</id>
      <title type="text">如何用一种更聪明的方式问问题</title>
      <published>2004-02-02T00:00:00.000Z</published>
      <updated>2026-08-11T00:00:00.000Z</updated>
      <author><name>Eric S. Raymond, Rick Moen(英文版 ©️) &amp; D.H.Grand(nOBODY/Ginux), Gasolin, by Ryan Wu(中文版 ©️) &amp; 𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/How-To-Ask-Questions-The-Smart-Way/"/>
      <summary type="text">如何用一种更聪明的方式问问题</summary>
      <content type="html"><![CDATA[<section><h1>提问的智慧<a href="#提问的智慧"><span>#</span></a></h1><div><a href="#contributors-"><figure><img alt="所有贡献者" loading="lazy" width="116" height="20" src="/_astro/all_contributors-35-orange.DYm6ulbZ_zufSg.svg" /><figcaption>所有贡献者</figcaption></figure></a><a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/pulls" target="_blank"><figure><img alt="欢迎 Pull Request" loading="lazy" width="90" height="20" src="/_astro/PRs-welcome-brightgreen-20260811182545461.CsNooDob_1qCRmJ.svg" /><figcaption>欢迎 Pull Request</figcaption></figure></a></div><div><div><div></div><div>Caution</div></div><div><p><strong>How To Ask Questions The Smart Way</strong></p><p>Copyright © 2001,2006,2014 Eric S. Raymond, Rick Moen</p><p>本指南英文版版权为 Eric S. Raymond, Rick Moen 所有</p><p>原文网址：<a href="http://www.catb.org/~esr/faqs/smart-questions.html" target="_blank">http://www.catb.org/~esr/faqs/smart-questions.html</a></p><p>Copyleft 2001 by D.H.Grand(nOBODY/Ginux), 2010 by Gasolin, 2015 by Ryan Wu</p><p>本中文指南是基于原文 3.10 版以及 2010 年由 <a href="https://github.com/gasolin" target="_blank">Gasolin</a> 所翻译版本的最新翻译；</p><p>协助指出翻译问题，<strong>请<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/issues/new" target="_blank">发 issue</a>，或直接<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/compare" target="_blank">发 pull request</a> 给我</strong></p><p>本文另有<a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/README.md" target="_blank">繁體中文版</a></p></div></div><section><h2><a href="https://github.com/ryanhanwu/How-To-Ask-Questions-The-Smart-Way/blob/main/history.md" target="_blank">原文版本历史</a><a href="#原文版本历史"><span>#</span></a></h2></section><section><h2>目录<a href="#目录"><span>#</span></a></h2><ul>
<li><a href="#%E5%A3%B0%E6%98%8E">声明</a></li>
<li><a href="#%E7%AE%80%E4%BB%8B">简介</a></li>
<li><a href="#%E5%9C%A8%E6%8F%90%E9%97%AE%E4%B9%8B%E5%89%8D">在提问之前</a></li>
<li><a href="#%E5%BD%93%E4%BD%A0%E6%8F%90%E9%97%AE%E6%97%B6">当你提问时</a>
<ul>
<li><a href="#%E6%85%8E%E9%80%89%E6%8F%90%E9%97%AE%E7%9A%84%E8%AE%BA%E5%9D%9B">慎选提问的论坛</a></li>
<li><a href="#stack-overflow">Stack Overflow</a></li>
<li><a href="#%E7%BD%91%E7%AB%99%E5%92%8C-irc-%E8%AE%BA%E5%9D%9B">网站和 IRC 论坛</a></li>
<li><a href="#%E7%AC%AC%E4%BA%8C%E6%AD%A5%E4%BD%BF%E7%94%A8%E9%A1%B9%E7%9B%AE%E9%82%AE%E4%BB%B6%E5%88%97%E8%A1%A8">第二步，使用项目邮件列表</a></li>
<li><a href="#%E4%BD%BF%E7%94%A8%E6%9C%89%E6%84%8F%E4%B9%89%E4%B8%94%E6%8F%8F%E8%BF%B0%E6%98%8E%E7%A1%AE%E7%9A%84%E6%A0%87%E9%A2%98">使用有意义且描述明确的标题</a></li>
<li><a href="#%E4%BD%BF%E9%97%AE%E9%A2%98%E5%AE%B9%E6%98%93%E5%9B%9E%E5%A4%8D">使问题容易回复</a></li>
<li><a href="#%E4%BD%BF%E7%94%A8%E6%B8%85%E6%99%B0%E6%AD%A3%E7%A1%AE%E7%B2%BE%E5%87%86%E4%B8%94%E5%90%88%E4%B9%8E%E8%AF%AD%E6%B3%95%E7%9A%84%E8%AF%AD%E5%8F%A5">使用清晰、正确、精准且合乎语法的语句</a></li>
<li><a href="#%E4%BD%BF%E7%94%A8%E6%98%93%E4%BA%8E%E8%AF%BB%E5%8F%96%E4%B8%94%E6%A0%87%E5%87%86%E7%9A%84%E6%96%87%E4%BB%B6%E6%A0%BC%E5%BC%8F%E5%8F%91%E9%80%81%E9%97%AE%E9%A2%98">使用易于读取且标准的文件格式发送问题</a></li>
<li><a href="#%E7%B2%BE%E7%A1%AE%E5%9C%B0%E6%8F%8F%E8%BF%B0%E9%97%AE%E9%A2%98%E5%B9%B6%E8%A8%80%E4%B9%8B%E6%9C%89%E7%89%A9">精确地描述问题并言之有物</a></li>
<li><a href="#%E8%AF%9D%E4%B8%8D%E5%9C%A8%E5%A4%9A%E8%80%8C%E5%9C%A8%E7%B2%BE">话不在多而在精</a></li>
<li><a href="#%E5%88%AB%E5%8A%A8%E8%BE%84%E5%A3%B0%E7%A7%B0%E6%89%BE%E5%88%B0-bug">别动辄声称找到 Bug</a></li>
<li><a href="#%E4%BD%8E%E5%A3%B0%E4%B8%8B%E6%B0%94%E4%B8%8D%E8%83%BD%E4%BB%A3%E6%9B%BF%E4%BD%A0%E7%9A%84%E5%8A%9F%E8%AF%BE">低声下气不能代替你的功课</a></li>
<li><a href="#%E6%8F%8F%E8%BF%B0%E9%97%AE%E9%A2%98%E7%97%87%E7%8A%B6%E8%80%8C%E9%9D%9E%E4%BD%A0%E7%9A%84%E7%8C%9C%E6%B5%8B">描述问题症状而非你的猜测</a></li>
<li><a href="#%E6%8C%89%E5%8F%91%E7%94%9F%E6%97%B6%E9%97%B4%E5%85%88%E5%90%8E%E5%88%97%E5%87%BA%E9%97%AE%E9%A2%98%E7%97%87%E7%8A%B6">按发生时间先后列出问题症状</a></li>
<li><a href="#%E6%8F%8F%E8%BF%B0%E7%9B%AE%E6%A0%87%E8%80%8C%E4%B8%8D%E6%98%AF%E8%BF%87%E7%A8%8B">描述目标而不是过程</a></li>
<li><a href="#%E5%88%AB%E8%A6%81%E6%B1%82%E4%BD%BF%E7%94%A8%E7%A7%81%E4%BA%BA%E7%94%B5%E9%82%AE%E5%9B%9E%E5%A4%8D">别要求使用私人电邮回复</a></li>
<li><a href="#%E6%B8%85%E6%A5%9A%E6%98%8E%E7%A1%AE%E5%9C%B0%E8%A1%A8%E8%BE%BE%E4%BD%A0%E7%9A%84%E9%97%AE%E9%A2%98%E4%BB%A5%E5%8F%8A%E9%9C%80%E6%B1%82">清楚明确地表达你的问题以及需求</a></li>
<li><a href="#%E8%AF%A2%E9%97%AE%E6%9C%89%E5%85%B3%E4%BB%A3%E7%A0%81%E7%9A%84%E9%97%AE%E9%A2%98%E6%97%B6">询问有关代码的问题时</a></li>
<li><a href="#%E5%88%AB%E6%8A%8A%E8%87%AA%E5%B7%B1%E5%AE%B6%E5%BA%AD%E4%BD%9C%E4%B8%9A%E7%9A%84%E9%97%AE%E9%A2%98%E8%B4%B4%E4%B8%8A%E6%9D%A5">别把自己家庭作业的问题贴上来</a></li>
<li><a href="#%E5%8E%BB%E6%8E%89%E6%97%A0%E6%84%8F%E4%B9%89%E7%9A%84%E6%8F%90%E9%97%AE%E5%8F%A5">去掉无意义的提问句</a></li>
<li><a href="#%E5%8D%B3%E4%BD%BF%E4%BD%A0%E5%BE%88%E6%80%A5%E4%B9%9F%E4%B8%8D%E8%A6%81%E5%9C%A8%E6%A0%87%E9%A2%98%E5%86%99%E7%B4%A7%E6%80%A5">即使你很急也不要在标题写<code>紧急</code></a></li>
<li><a href="#%E7%A4%BC%E5%A4%9A%E4%BA%BA%E4%B8%8D%E6%80%AA%E8%80%8C%E4%B8%94%E6%9C%89%E6%97%B6%E8%BF%98%E5%BE%88%E6%9C%89%E5%B8%AE%E5%8A%A9">礼多人不怪，而且有时还很有帮助</a></li>
<li><a href="#%E9%97%AE%E9%A2%98%E8%A7%A3%E5%86%B3%E5%90%8E%E5%8A%A0%E4%B8%AA%E7%AE%80%E7%9F%AD%E7%9A%84%E8%A1%A5%E5%85%85%E8%AF%B4%E6%98%8E">问题解决后，加个简短的补充说明</a></li>
</ul>
</li>
<li><a href="#%E5%A6%82%E4%BD%95%E8%A7%A3%E8%AF%BB%E7%AD%94%E6%A1%88">如何解读答案</a>
<ul>
<li><a href="#rtfm-%E5%92%8C-stfw%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E4%BD%A0%E5%B7%B2%E5%AE%8C%E5%85%A8%E6%90%9E%E7%A0%B8%E4%BA%86">RTFM 和 STFW：如何知道你已完全搞砸了</a></li>
<li><a href="#%E5%A6%82%E6%9E%9C%E8%BF%98%E6%98%AF%E6%90%9E%E4%B8%8D%E6%87%82">如果还是搞不懂</a></li>
<li><a href="#%E5%A4%84%E7%90%86%E6%97%A0%E7%A4%BC%E7%9A%84%E5%9B%9E%E5%BA%94">处理无礼的回应</a></li>
</ul>
</li>
<li><a href="#%E5%A6%82%E4%BD%95%E9%81%BF%E5%85%8D%E6%89%AE%E6%BC%94%E5%A4%B1%E8%B4%A5%E8%80%85">如何避免扮演失败者</a></li>
<li><a href="#%E4%B8%8D%E8%AF%A5%E9%97%AE%E7%9A%84%E9%97%AE%E9%A2%98">不该问的问题</a></li>
<li><a href="#%E5%A5%BD%E9%97%AE%E9%A2%98%E4%B8%8E%E8%A0%A2%E9%97%AE%E9%A2%98">好问题与蠢问题</a></li>
<li><a href="#%E5%A6%82%E6%9E%9C%E5%BE%97%E4%B8%8D%E5%88%B0%E5%9B%9E%E7%AD%94">如果得不到回答</a></li>
<li><a href="#%E5%A6%82%E4%BD%95%E6%9B%B4%E5%A5%BD%E5%9C%B0%E5%9B%9E%E7%AD%94%E9%97%AE%E9%A2%98">如何更好地回答问题</a></li>
<li><a href="#%E7%9B%B8%E5%85%B3%E8%B5%84%E6%BA%90">相关资源</a></li>
<li><a href="#%E9%B8%A3%E8%B0%A2">鸣谢</a></li>
</ul></section><section><h2>声明<a href="#声明"><span>#</span></a></h2><p>许多项目在他们网站的帮助文档中链接了本指南 这很好，这正是我们想要的用途 但如果你是该项目管理员并试图创建指向本指南的超链接，请在超链接附近的显著位置注明：</p><p><strong>本指南不提供此项目的实际支持服务！</strong></p><p>我们已经深刻领教到缺少上述声明所带来的痛苦：我们将不停地被那些认为发布这本指南就意味着有责任解决世上所有技术问题的傻瓜苦苦纠缠</p><p>如果你因寻求某些帮助而阅读本指南，并在离开时还觉得可以从本文作者这里得到直接帮助，那你就是我们之前说的那些傻瓜之一 别问我们问题，我们只会忽略你 我们在这本指南中想教你如何从那些真正懂得你所遇到的软件或硬件问题的人处取得协助，而 99% 的情况下那不会是我们 除非你确定本指南的作者之一刚好是你所遇到的问题领域的专家，否则请不要打扰我们，这样大家都会开心一点</p></section><section><h2>简介<a href="#简介"><span>#</span></a></h2><p>在<a href="http://www.catb.org/~esr/faqs/hacker-howto.html" target="_blank">黑客</a>的世界里，你所提技术问题的解答的好坏, 很大程度上取决于你提问的方式与此问题的难度 本指南将教你如何正确地提问以获得你满意的答案</p><p>现在开源（Open Source）软件已经相当盛行，您通常可以从其他更有经验的用户那里获得与黑客一样好的答案，这是件<strong>好事</strong>；和黑客相比，用户们往往对那些新手常遇到的问题更宽容一些 尽管如此，以我们在此推荐的方式对待这些有经验的用户通常也是从他们那里获得有用答案的最有效方式</p><p>首先你应该明白，黑客们喜爱有挑战性的问题，或者能激发他们思维的好问题 如果我们并非如此，那我们也不会成为你想询问的对象 如果你给了我们一个值得反复咀嚼玩味的好问题，我们自会对你感激不尽 好问题是激励，是厚礼 好问题可以提高我们的理解力，而且通常会暴露我们以前从没意识到或者思考过的问题 对黑客而言，“好问题！”是诚挚的大力称赞</p><p>尽管如此，黑客们有着蔑视或傲慢面对简单问题的坏名声，这有时让我们看起来对新手、无知者似乎较有敌意，但其实不是那样的</p><p>我们不讳言我们对那些不愿思考、或者在发问前不做他们该做的事的人的蔑视 那些人是时间杀手 —— 他们只想索取，从不付出，消耗我们可用在更有趣的问题或更值得回答的人身上的时间 我们称这样的人为 <code>失败者（loser）</code> （由于历史原因，我们有时把它拼作 <code>lusers</code>）</p><p>我们意识到许多人只是想使用我们写的软件，他们对学习技术细节没有兴趣 对大多数人而言，电脑只是种工具，是种达到目的的手段而已 他们有自己的生活并且有更要紧的事要做 我们认可这点，也从不指望每个人都对这些让我们着迷的技术问题感兴趣 尽管如此，我们只为那些真正有兴趣并愿意积极参与问题解决的人调整回答问题的风格 这点不会变，也不该变：否则，我们就是在最擅长的事情上降低效率</p><p>我们（在很大程度上）是自愿的，从繁忙的生活中抽出时间来解答疑惑，而且时常被提问淹没 所以我们无情地滤掉一些话题，特别是拋弃那些看起来像失败者的家伙，以便更高效地利用时间来回答<code>赢家（winner）</code>的问题</p><p>如果你厌恶我们的态度，高高在上，或过于傲慢，不妨也设身处地想想 我们并没有要求你向我们屈服 —— 事实上，我们大多数人非常乐意与你平等地交流，只要你付出小小努力来满足基本要求，我们就会欢迎你加入我们的文化 但让我们帮助那些不愿意帮助自己的人是没有效率的 无知没有关系，但装白痴就是不行</p><p>所以，你不必在技术上很在行才能吸引我们的注意，但你必须表现出能引导你变得在行的特质 —— 机敏、有想法、善于观察、乐于主动参与解决问题 如果你做不到这些使你与众不同的事情，我们建议你花点钱找家商业公司签个技术支持服务合同，而不是要求黑客个人无偿地帮助你</p><p>如果你决定向我们求助，当然你也不希望被视为失败者，更不愿成为失败者中的一员 能立刻得到快速并有效答案的最好方法，就是像赢家那样提问 —— 聪明、自信、有解决问题的思路，只是偶尔在特定的问题上需要获得一点帮助</p><p>（欢迎对本指南提出改进意见 你可以把你的建议发送至 <a href="esr@thyrsus.com">esr@thyrsus.com</a> 或 <a href="respond-auto@linuxmafia.com">respond-auto@linuxmafia.com</a> 然而请注意，本文并非<a href="http://www.ietf.org/rfc/rfc1855.txt" target="_blank">网络礼节</a>的通用指南，而我们通常会拒绝无助于在技术论坛得到有用答案的建议）</p></section><section><h2>在提问之前<a href="#在提问之前"><span>#</span></a></h2><p>在你准备要通过电子邮件、新闻群组或者聊天室提出技术问题前，请先做到以下事情：</p><ol>
<li>尝试在你准备提问的论坛的旧文章中搜索答案</li>
<li>尝试上网搜索以找到答案</li>
<li>尝试阅读手册以找到答案</li>
<li>尝试阅读常见问题文件（FAQ）以找到答案</li>
<li>尝试自己检查或试验以找到答案</li>
<li>向你身边的强者朋友打听以找到答案</li>
<li>如果你是程序开发者，请尝试阅读源代码以找到答案</li>
</ol><p>当你提出问题的时候，请先表明你已经做了上述的努力；这将有助于树立你并不是一个不劳而获且浪费别人的时间的提问者 如果你能一并表达在做了上述努力的过程中所<strong>学到</strong>的东西会更好，因为我们更乐于回答那些表现出能从答案中学习的人的问题</p><p>运用某些策略，比如先用 Google 搜索你所遇到的各种错误信息（搜索 <a href="http://groups.google.com/" target="_blank">Google 论坛</a>和网页），这样很可能直接就找到了能解决问题的文件或邮件列表线索 即使没有结果，在邮件列表或新闻组寻求帮助时加上一句 <code>我在 Google 中搜过下列句子但没有找到什么有用的东西</code> 也是件好事，即使它只是表明了搜索引擎不能提供哪些帮助 这么做（加上搜索过的字串）也让遇到相似问题的其他人能被搜索引擎引导到你的提问来</p><p>别着急，不要指望几秒钟的 Google 搜索就能解决一个复杂的问题 在向专家求助之前，再阅读一下常见问题文件（FAQ）、放轻松、坐得舒服一些，再花点时间思考一下这个问题 相信我们，他们能从你的提问看出你做了多少阅读与思考，如果你是有备而来，将更有可能得到解答 不要将所有问题一股脑拋出，只因你的第一次搜索没有找到答案（或者找到太多答案）</p><p>准备好你的问题，再将问题仔细地思考过一遍，因为草率的发问只能得到草率的回答，或者根本得不到任何答案 越是能表现出在寻求帮助前你为解决问题所付出的努力，你越有可能得到实质性的帮助</p><p>小心别问错了问题 如果你的问题基于错误的假设，某个普通黑客（J. Random Hacker）多半会一边在心里想着<code>蠢问题…</code>，一边用无意义的字面解释来答复你，希望着你会从问题的回答（而非你想得到的答案）中汲取教训</p><p>绝不要自以为<strong>够格</strong>得到答案，你没有；你并没有 毕竟你没有为这种服务支付任何报酬 你将会是自己去<strong>挣到</strong>一个答案，靠提出有内涵的、有趣的、有思维激励作用的问题 —— 一个有潜力能贡献社区经验的问题，而不仅仅是被动地从他人处索取知识</p><p>另一方面，表明你愿意在找答案的过程中做点什么是一个非常好的开端 <code>谁能给点提示？</code>、<code>我的这个例子里缺了什么？</code>以及<code>我应该检查什么地方</code>比<code>请把我需要的确切的过程贴出来</code>更容易得到答复 因为你表现出只要有人能指个正确方向，你就有完成它的能力和决心</p></section><section><h2>当你提问时<a href="#当你提问时"><span>#</span></a></h2><section><h3>慎选提问的论坛<a href="#慎选提问的论坛"><span>#</span></a></h3><p>小心选择你要提问的场合 如果你做了下述的事情，你很可能被忽略掉或者被看作失败者：</p><ul>
<li>在与主题不合的论坛上贴出你的问题</li>
<li>在探讨进阶技术问题的论坛张贴非常初级的问题；反之亦然</li>
<li>在太多的不同新闻群组上重复转贴同样的问题（cross-post）</li>
<li>向既非熟人也没有义务解决你问题的人发送私人电邮</li>
</ul><p>黑客会剔除掉那些搞错场合的问题，以保护他们沟通的渠道不被无关的东西淹没 你不会想让这种事发生在自己身上的</p><p>因此，第一步是找到对的论坛 再说一次，Google 和其它搜索引擎还是你的朋友，用它们来找到与你遭遇到困难的软硬件问题最相关的网站 通常那儿都有常见问题（FAQ）、邮件列表及相关说明文件的链接 如果你的努力（包括<strong>阅读</strong> FAQ）都没有结果，网站上也许还有报告 Bug（Bug-reporting）的流程或链接，如果是这样，链过去看看</p><p>向陌生的人或论坛发送邮件最可能是风险最大的事情 举例来说，别假设一个提供丰富内容的网页的作者会想充当你的免费顾问 不要对你的问题是否会受到欢迎做太乐观的估计 —— 如果你不确定，那就向别处发送，或者压根别发</p><p>在选择论坛、新闻群组或邮件列表时，别太相信它的名字，先看看 FAQ 或者许可书以弄清楚你的问题是否切题 发文前先翻翻已有的话题，这样可以让你感受一下那里的文化 事实上，事先在新闻组或邮件列表的历史记录中搜索与你问题相关的关键词是个极好的主意，也许这样就找到答案了 即使没有，也能帮助你归纳出更好的问题</p><p>别像机关枪似的一次“扫射”所有的帮助渠道，这就像大喊大叫一样会使人不快 要一个一个地来</p><p>搞清楚你的主题！最典型的错误之一是在某种致力于跨平台可移植的语言、套件或工具的论坛中提关于 Unix 或 Windows 操作系统程序界面的问题 如果你不明白为什么这是大错，最好在搞清楚这之间差异之前什么也别问</p><p>一般来说，在仔细挑选的公共论坛中提问，会比在私有论坛中提同样的问题更容易得到有用的回答 有几个理由可以支持这点，一是看潜在的回复者有多少，二是看观众有多少 黑客较愿意回答那些能帮助到许多人的问题</p><p>可以理解的是，老练的黑客和一些热门软件的作者正在接受过多的错发信息 就像那根最后压垮骆驼背的稻草一样，你的加入也有可能使情况走向极端 —— 已经好几次了，一些热门软件的作者由于涌入其私人邮箱的大量不堪忍受的无用邮件而不再提供支持</p></section><section><h3>Stack Overflow<a href="#stack-overflow"><span>#</span></a></h3><p>搜索，<em>然后</em>在 Stack Exchange 问</p><p>近年来，Stack Exchange 社区已经成为回答技术及其他问题的主要渠道，尤其是那些开放源码的项目</p><p>因为 Google 索引是即时的，在看 Stack Exchange 之前先在 Google 搜索 有很高的几率某人已经问了一个类似的问题，而且 Stack Exchange 网站们往往会是搜索结果中最前面几个 如果你在 Google 上没有找到任何答案，你再到特定相关主题的网站去找 用标签（Tag）搜索能让你更缩小你的搜索结果</p><p>如果你还是找不到任何对你的问题有用的内容，请把你的问题发在与它最相关的网站上 提问的时候请善用格式化工具，尤其注意为代码添加格式，并且添加相关的标签（特别是编程语言、操作系统或库/包的名称） 当有人要求你提供更多相关信息时，请编辑你的贴子来补充它们[译注：而不是发一个回帖或回答！] 如果你觉得一个答案对你有帮助，点击向上的箭头来为它投票；如果一个答案提供了问题的正确解决方案，点击投票按钮下方的对勾来将它标记为正解</p><p>Stack Exchange 已经成长到<a href="https://stackexchange.com/sites" target="_blank">超过一百个网站</a>，以下是最常用的几个网站：</p><ul>
<li>Super User 是问一些通用的电脑问题，如果你的问题跟代码或是写程序无关，只是一些网络连线之类的，请到这里</li>
<li>Stack Overflow 是问写程序有关的问题</li>
<li>Server Fault 是问服务器和网管相关的问题</li>
</ul></section><section><h3>网站和 IRC 论坛<a href="#网站和-irc-论坛"><span>#</span></a></h3><p>本地的用户群组（user group），或者你所用的 Linux 发行版本也许正在宣传他们的网页论坛或 IRC 频道，并提供新手帮助（在一些非英语国家，新手论坛很可能还是邮件列表），这些都是开始提问的好地方，特别是当你觉得遇到的也许只是相对简单或者很普通的问题时 有广告赞助的 IRC 频道是公开欢迎提问的地方，通常可以即时得到回应</p><p>事实上，如果程序出的问题只发生在特定 Linux 发行版提供的版本（这很常见），最好先去该发行版的论坛或邮件列表中提问，再到程序本身的论坛或邮件列表提问 （否则）该项目的黑客可能仅仅回复“使用<strong>我们的</strong>版本”</p><p>在任何论坛发文以前，先确认一下有没有搜索功能 如果有，就试着搜索一下问题的几个关键词，也许这会有帮助 如果在此之前你已做过通用的网页搜索（你也该这样做），还是再搜索一下论坛，搜索引擎有可能没来得及索引此论坛的全部内容</p><p>通过论坛或 IRC 频道来提供用户支持服务有增长的趋势，电子邮件则大多为项目开发者间的交流而保留 所以最好先在论坛或 IRC 中寻求与该项目相关的协助</p><p>在使用 IRC 的时候，首先最好不要发布很长的问题描述，有些人称之为频道洪水 最好通过一句话的问题描述来开始聊天</p></section><section><h3>第二步，使用项目邮件列表<a href="#第二步使用项目邮件列表"><span>#</span></a></h3><p>当某个项目提供开发者邮件列表时，要向列表而不是其中的个别成员提问，即使你确信他能最好地回答你的问题 查一查项目的文件和首页，找到项目的邮件列表并使用它 有几个很好的理由支持我们采用这种办法：</p><ul>
<li>任何好到需要向个别开发者提出的问题，也将对整个项目群组有益 反之，如果你认为自己的问题对整个项目群组来说太愚蠢，那这也不能成为骚扰个别开发者的理由</li>
<li>向列表提问可以分散开发者的负担，个别开发者（尤其是项目领导人）也许太忙以至于没法回答你的问题</li>
<li>大多数邮件列表都会被存档，那些被存档的内容将被搜索引擎索引 如果你向列表提问并得到解答，将来其他人可以通过网页搜索找到你的问题和答案，也就不用再次发问了</li>
<li>如果某些问题经常被问到，开发者可以利用此信息来改进说明文件或软件本身，以使其更清楚 如果只是私下提问，就没有人能看到最常见问题的完整场景</li>
</ul><p>如果一个项目既有“用户”也有“开发者”（或“黑客”）邮件列表或论坛，而你又不会动到那些源代码，那么就向“用户”列表或论坛提问 不要假设自己会在开发者列表中受到欢迎，那些人多半会将你的提问视为干扰他们开发的噪音</p><p>然而，如果你<strong>确信</strong>你的问题很特别，而且在“用户”列表或论坛中几天都没有回复，可以试试前往“开发者”列表或论坛发问 建议你在张贴前最好先暗地里观察几天以了解那里的行事方式（事实上这是参与任何私有或半私有列表的好主意）</p><p>如果你找不到一个项目的邮件列表，而只能查到项目维护者的电子邮件地址，尽管向他发信 即使是在这种情况下，也别假设（项目）邮件列表不存在 在你的电子邮件中，请陈述你已经试过但没有找到合适的邮件列表，也提及你不反对将自己的邮件转发给他人（许多人认为，即使没什么秘密，私人电子邮件也不应该被公开 通过允许将你的电子邮件转发他人，你给了相应人员处置你邮件的选择）</p></section><section><h3>使用有意义且描述明确的标题<a href="#使用有意义且描述明确的标题"><span>#</span></a></h3><p>在邮件列表、新闻群组或论坛中，大约 50 字以内的标题是抓住资深专家注意力的好机会 别用喋喋不休的<code>帮帮忙</code>、<code>跪求</code>、<code>急</code>（更别说<code>救命啊！！！！</code>这样让人反感的话，用这种标题会被条件反射式地忽略）来浪费这个机会 不要妄想用你的痛苦程度来打动我们，而应该是在这点空间中使用极简单扼要的描述方式来提出问题</p><p>一个好标题范例是<code>目标 —— 差异</code>式的描述，许多技术支持组织就是这样做的 在<code>目标</code>部分指出是哪一个或哪一组东西有问题，在<code>差异</code>部分则描述与期望的行为不一致的地方</p><blockquote><p>蠢问题：救命啊！我的笔记本电脑不能正常显示了！</p></blockquote><blockquote><p>聪明问题：X.org 6.8.1 的鼠标指针会变形，某牌显卡 MV1005 芯片组</p></blockquote><blockquote><p>更聪明问题：X.org 6.8.1 的鼠标指针，在某牌显卡 MV1005 芯片组环境下 - 会变形</p></blockquote><p>编写<code>目标 —— 差异</code> 式描述的过程有助于你组织对问题的细致思考 是什么被影响了？ 仅仅是鼠标指针或者还有其它图形？只在 X.org 的 X 版中出现？或只是出现在 6.8.1 版中？ 是针对某牌显卡芯片组？或者只是其中的 MV1005 型号？ 一个黑客只需瞄一眼就能够立即明白你的环境<strong>和</strong>你遇到的问题</p><p>总而言之，请想像一下你正在一个只显示标题的存档讨论串（Thread）索引中查寻 让你的标题更好地反映问题，可使下一个搜索类似问题的人能够关注这个讨论串，而不用再次提问相同的问题</p><p>如果你想在回复中提出问题，记得要修改内容标题，以表明你是在问一个问题， 一个看起来像 <code>Re: 测试</code> 或者 <code>Re: 新 bug</code> 的标题很难引起足够重视 另外，在不影响连贯性之下，适当引用并删减前文的内容，能给新来的读者留下线索</p><p>对于讨论串，不要直接点击回复来开始一个全新的讨论串，这将限制你的观众 因为有些邮件阅读程序，比如 mutt ，允许用户按讨论串排序并通过折叠讨论串来隐藏消息，这样做的人永远看不到你发的消息</p><p>仅仅改变标题还不够 mutt 和其它一些邮件阅读程序还会检查邮件标题以外的其它信息，以便为其指定讨论串 所以宁可发一个全新的邮件</p><p>在网页论坛上，好的提问方式稍有不同，因为讨论串与特定的信息紧密结合，并且通常在讨论串外就看不到里面的内容，故通过回复提问，而非改变标题是可接受的 不是所有论坛都允许在回复中出现分离的标题，而且这样做了基本上没有人会去看 不过，通过回复提问，这本身就是暧昧的做法，因为它们只会被正在查看该标题的人读到 所以，除非你<strong>只想</strong>在该讨论串当前活跃的人群中提问，不然还是另起炉灶比较好</p></section><section><h3>使问题容易回复<a href="#使问题容易回复"><span>#</span></a></h3><p>以<code>请将你的回复发送到……</code>来结束你的问题多半会使你得不到回答 如果你觉得花几秒钟在邮件客户端设置一下回复地址都麻烦，我们也觉得花几秒钟思考你的问题更麻烦 如果你的邮件程序不支持这样做，<a href="http://linuxmafia.com/faq/Mail/muas.html" target="_blank">换个好点的</a>；如果是操作系统不支持这种邮件程序，也换个好点的</p><p>在论坛，要求通过电子邮件回复是非常无礼的，除非你认为回复的信息可能比较敏感（有人会为了某些未知的原因，只让你而不是整个论坛知道答案） 如果你只是想在有人回复讨论串时得到电子邮件提醒，可以要求网页论坛发送给你 几乎所有论坛都支持诸如<code>追踪此讨论串</code>、<code>有回复时发送邮件提醒</code>等功能</p></section><section><h3>使用清晰、正确、精准且合乎语法的语句<a href="#使用清晰正确精准且合乎语法的语句"><span>#</span></a></h3><p>我们从经验中发现，粗心的提问者通常也会粗心地写程序与思考（我敢打包票） 回答粗心大意者的问题很不值得，我们宁愿把时间耗在别处</p><p>正确的拼写、标点符号和大小写是很重要的 一般来说，如果你觉得这样做很麻烦，不想在乎这些，那我们也觉得麻烦，不想在乎你的提问 花点额外的精力斟酌一下字句，用不着太僵硬与正式 —— 事实上，黑客文化很看重能准确地使用非正式、俚语和幽默的语句 但它<strong>必须很</strong>准确，而且有迹象表明你是在思考和关注问题</p><p>正确地拼写、使用标点和大小写，不要将 <code>its</code> 混淆为 <code>it's</code>，<code>loose</code> 搞成 <code>lose</code> 或者将 <code>discrete</code> 弄成 <code>discreet</code> 不要<strong>全部用大写</strong>，这会被视为无礼的大声嚷嚷（全部小写也好不到哪去，因为不易阅读 <a href="http://en.wikipedia.org/wiki/Alan_Cox" target="_blank">Alan Cox</a> 也许可以这样做，但你不行）</p><p>更白话的说，如果你写得像是个半文盲[译注：<a href="http://zh.wikipedia.org/wiki/%E5%B0%8F%E7%99%BD" target="_blank">小白</a>]，那多半得不到理睬 也不要使用即时通信中的简写或<a href="http://zh.wikipedia.org/wiki/%E7%81%AB%E6%98%9F%E6%96%87" target="_blank">火星文</a>，如将<code>的</code>简化为 <code>d</code> 会使你看起来像一个为了少打几个键而省字的小白 更糟的是，如果像个小孩似地鬼画符那绝对是在找死，可以肯定没人会理你（或者最多是给你一大堆指责与挖苦）</p><p>如果在使用非母语的论坛提问，你可以犯点拼写和语法上的小错，但决不能在思考上马虎（没错，我们通常能弄清两者的分别） 同时，除非你知道回复者使用的语言，否则请使用英语书写 繁忙的黑客一般会直接删除用他们看不懂的语言写的消息 在网络上英语是通用语言，用英语书写可以将你的问题在尚未被阅读就被直接删除的可能性降到最低</p><p>如果英文是你的外语（Second language），提示潜在回复者你有潜在的语言困难是很好的：
[译注：以下附上原文以供使用]</p><blockquote><p>English is not my native language; please excuse typing errors.</p></blockquote><ul>
<li>英文不是我的母语，请原谅我的错字或语法</li>
</ul><blockquote><p>If you speak $LANGUAGE, please email/PM me;
I may need assistance translating my question.</p></blockquote><ul>
<li>如果你说<strong>某语言</strong>，请向我发电邮/私信；</li>
<li>我需要有人协助我翻译我的问题</li>
</ul><blockquote><p>I am familiar with the technical terms,
but some slang expressions and idioms are difficult for me.</p></blockquote><ul>
<li>我对技术名词很熟悉，但对于俗语或是特别用法不甚了解</li>
</ul><blockquote><p>I’ve posted my question in $LANGUAGE and English.
I’ll be glad to translate responses, if you only use one or the other.</p></blockquote><ul>
<li>我把我的问题用<strong>某语言</strong>和英文写出来</li>
<li>如果你只用其中的一种语言回答，我会乐意将回复翻译成为你使用的语言</li>
</ul></section><section><h3>使用易于读取且标准的文件格式发送问题<a href="#使用易于读取且标准的文件格式发送问题"><span>#</span></a></h3><p>如果你人为地将问题搞得难以阅读，它多半会被忽略，人们更愿读易懂的问题，所以：</p><ul>
<li>
<p>使用纯文字而不是 HTML (<a href="http://archive.birdhouse.org/etc/evilmail.html" target="_blank">关闭 HTML</a> 并不难）</p>
<p>更加建议使用 Markdown</p>
</li>
<li>
<p>使用 MIME 附件通常是可以的，前提是真正有内容（譬如附带的源代码或 patch），而不仅仅是邮件程序生成的模板（譬如只是信件内容的拷贝）</p>
</li>
<li>
<p>不要发送一段文字只是一行句子但自动换行后会变成多行的邮件（这使得回复部分内容非常困难） 设想你的读者是在 80 个字符宽的终端机上阅读邮件，最好设置你的换行分割点小于 80 字</p>
</li>
<li>
<p>但是，对一些特殊的文件<strong>不要</strong>设置固定宽度（譬如日志文件拷贝或会话记录） 数据应该原样包含，让回复者有信心他们看到的是和你看到的一样的东西</p>
</li>
<li>
<p>在英语论坛中，不要使用 <code>Quoted-Printable</code> MIME 编码发送消息 这种编码对于张贴非 ASCII 语言可能是必须的，但很多邮件程序并不支持这种编码 当它们处理换行时，那些文本中四处散布的<code>=20</code>符号既难看也分散注意力，甚至有可能破坏内容的语意</p>
</li>
<li>
<p>绝对，<strong>永远</strong>不要指望黑客们阅读使用封闭格式编写的文档，像微软公司的 Word 或 Excel 文件等 大多数黑客对此的反应就像有人将还在冒热气的猪粪倒在你家门口时你的反应一样 即便他们能够处理，他们也很厌恶这么做</p>
</li>
<li>
<p>如果你从使用 Windows 的电脑发送电子邮件，关闭微软愚蠢的<code>智能引号</code>功能 （从[选项] &gt; [校订] &gt; [自动校正选项]，勾选掉<code>智能引号</code>单选框），以免在你的邮件中到处散布垃圾字符</p>
</li>
<li>
<p>在论坛，勿滥用<code>表情符号</code>和 <code>HTML</code> 功能（当它们提供时） 一两个表情符号通常没有问题，但花哨的彩色文本倾向于使人认为你是个无能之辈 过滥地使用表情符号、色彩和字体会使你看来像个傻笑的小姑娘 这通常不是个好主意，除非你只是对性而不是对答案感兴趣</p>
</li>
</ul><p>如果你使用图形用户界面的邮件程序（如微软公司的 Outlook 或者其它类似的），注意它们的默认设置不一定满足这些要求 大多数这类程序有基于选单的<code>查看源代码</code>命令，用它来检查发送文件夹中的邮件，以确保发送的是纯文本文件同时没有一些奇怪的字符</p></section><section><h3>精确地描述问题并言之有物<a href="#精确地描述问题并言之有物"><span>#</span></a></h3><ul>
<li>仔细、清楚地描述你的问题或 Bug 的症状</li>
<li>描述问题发生的环境（机器配置、操作系统、应用程序、以及相关的信息），提供经销商的发行版和版本号（如：<code>Fedora Core 4</code>、<code>Slackware 9.1</code>等）</li>
<li>描述在提问前你是怎样去研究和理解这个问题的</li>
<li>描述在提问前为确定问题而采取的诊断步骤</li>
<li>描述最近做过什么可能相关的硬件或软件变更</li>
<li>尽可能地提供一个可以<code>重现这个问题的可控环境</code>的方法</li>
</ul><p>尽量去揣测一个黑客会怎样反问你，在你提问之前预先将黑客们可能提出的问题回答一遍</p><p>以上几点中，当你报告的是你认为可能在代码中的问题时，给黑客一个可以重现你的问题的环境尤其重要 当你这么做时，你得到有效的回答的机会和速度都会大大的提升</p><p><a href="http://www.chiark.greenend.org.uk/~sgtatham/" target="_blank">Simon Tatham</a> 写过一篇名为《<a href="http://www.chiark.greenend.org.uk/~sgtatham/bugs-cn.html" target="_blank">如何有效地报告 Bug</a>》的出色文章 强力推荐你也读一读</p></section><section><h3>话不在多而在精<a href="#话不在多而在精"><span>#</span></a></h3><p>你需要提供精确有内容的信息 这并不是要求你简单的把成堆的出错代码或者资料完全转录到你的提问中 如果你有庞大而复杂的测试样例能重现程序挂掉的情境，尽量将它剪裁得越小越好</p><p>这样做的用处至少有三点
第一，表现出你为简化问题付出了努力，这可以使你得到回答的机会增加；
第二，简化问题使你更有可能得到<strong>有用</strong>的答案；
第三，在精炼你的 bug 报告的过程中，你很可能就自己找到了解决方法或权宜之计</p></section><section><h3>别动辄声称找到 Bug<a href="#别动辄声称找到-bug"><span>#</span></a></h3><p>当你在使用软件中遇到问题，除非你非常、<strong>非常</strong>的有根据，不要动辄声称找到了 Bug 提示：除非你能提供解决问题的源代码补丁，或者提供回归测试来表明前一版本中行为不正确，否则你都多半不够完全确信 这同样适用在网页和文件，如果你（声称）发现了文件的 <code>Bug</code>，你应该能提供相应位置的修正或替代文件</p><p>请记得，还有其他许多用户没遇到你发现的问题，否则你在阅读文件或搜索网页时就应该发现了（你在抱怨前<a href="#%E5%9C%A8%E6%8F%90%E9%97%AE%E4%B9%8B%E5%89%8D">已经做了这些，是吧</a>？） 这也意味着很有可能是你弄错了而不是软件本身有问题</p><p>编写软件的人总是非常辛苦地使它尽可能完美 如果你声称找到了 Bug，也就是在质疑他们的能力，即使你是对的，也有可能会冒犯到其中某部分人 当你在标题中嚷嚷着有 <code>Bug</code> 时，这尤其严重</p><p>提问时，即使你私下非常确信已经发现一个真正的 Bug，最好写得像是<strong>你</strong>做错了什么 如果真的有 Bug，你会在回复中看到这点 这样做的话，如果真有 Bug，维护者就会向你道歉，这总比你惹恼别人然后欠别人一个道歉要好一点</p></section><section><h3>低声下气不能代替你的功课<a href="#低声下气不能代替你的功课"><span>#</span></a></h3><p>有些人明白他们不该粗鲁或傲慢的提问并要求得到答复，但他们选择另一个极端 —— 低声下气：<code>我知道我只是个可悲的新手，一个失败者，但...</code> 这既使人困扰，也没有用，尤其是伴随着与实际问题含糊不清的描述时更令人反感</p><p>别用原始灵长类动物的把戏来浪费你我的时间 取而代之的是，尽可能清楚地描述背景条件和你的问题情况 这比低声下气更好地定位了你的位置</p><p>有时网页论坛会设有专为新手提问的版面，如果你真的认为遇到了初学者的问题，到那去就是了，但一样别那么低声下气</p></section><section><h3>描述问题症状而非你的猜测<a href="#描述问题症状而非你的猜测"><span>#</span></a></h3><p>告诉黑客们你认为问题是怎样造成的并没什么帮助 （如果你的推断如此有效，还用向别人求助吗？），因此要确信你原原本本告诉了他们问题的症状，而不是你的解释和理论；让黑客们来推测和诊断 如果你认为陈述自己的猜测很重要，清楚地说明这只是你的猜测，并描述为什么它们不起作用</p><p><strong>蠢问题</strong></p><blockquote><p>我在编译内核时接连遇到 SIG11 错误，
我怀疑某条飞线搭在主板的走线上了，这种情况应该怎样检查最好？</p></blockquote><p><strong>聪明问题</strong></p><blockquote><p>我的组装电脑是 FIC-PA2007 主机板搭载 AMD K6/233 CPU（威盛 Apollo VP2 芯片组），
256MB Corsair PC133 SDRAM 内存，在编译内核时，从开机 20 分钟以后就频频产生 SIG11 错误，
但是在头 20 分钟内从没发生过相同的问题 重新启动也没有用，但是关机一晚上就又能工作 20 分钟
所有内存都换过了，没有效果 相关部分的标准编译记录如下…</p></blockquote><p>由于以上这点似乎让许多人觉得难以配合，这里有句话可以提醒你：<code>所有的诊断专家都来自密苏里州 </code> 美国国务院的官方座右铭则是：<code>让我看看</code>（出自国会议员 Willard D. Vandiver 在 1899 年时的讲话：<code>我来自一个出产玉米，棉花，牛蒡和民主党人的国家，滔滔雄辩既不能说服我，也不会让我满意 我来自密苏里州，你必须让我看看 </code>） 针对诊断者而言，这并不是一种怀疑，而只是一种真实而有用的需求，以便让他们看到的是与你看到的原始证据尽可能一致的东西，而不是你的猜测与归纳的结论 所以，大方地展示给我们看吧！</p></section><section><h3>按发生时间先后列出问题症状<a href="#按发生时间先后列出问题症状"><span>#</span></a></h3><p>问题发生前的一系列操作，往往就是对找出问题最有帮助的线索 因此，你的说明里应该包含你的操作步骤，以及机器和软件的反应，直到问题发生 在命令行处理的情况下，提供一段操作记录（例如运行脚本工具所生成的），并引用相关的若干行（如 20 行）记录会非常有帮助</p><p>如果挂掉的程序有诊断选项（如 -v 的详述开关），试着选择这些能在记录中增加调试信息的选项 记住，<code>多</code>不等于<code>好</code> 试着选取适当的调试级别以便提供有用的信息而不是让读者淹没在垃圾中</p><p>如果你的说明很长（如超过四个段落），在开头简述问题，接下来再按时间顺序详述会有所帮助 这样黑客们在读你的记录时就知道该注意哪些内容了</p></section><section><h3>描述目标而不是过程<a href="#描述目标而不是过程"><span>#</span></a></h3><p>如果你想弄清楚如何做某事（而不是报告一个 Bug），在开头就描述你的目标，然后才陈述重现你所卡住的特定步骤</p><p>经常寻求技术帮助的人在心中有个更高层次的目标，而他们在自以为能达到目标的特定道路上被卡住了，然后跑来问该怎么走，但没有意识到这条路本身就有问题 结果要费很大的劲才能搞定</p><p><strong>蠢问题</strong></p><blockquote><p>我怎样才能从某绘图程序的颜色选择器中取得十六进制的 RGB 值？</p></blockquote><p><strong>聪明问题</strong></p><blockquote><p>我正试着用替换一幅图片的色码（color table）成自己选定的色码，我现在知道的唯一方法是编辑每个色码区块（table slot），
但却无法从某绘图程序的颜色选择器取得十六进制的 RGB 值</p></blockquote><p>第二种提问法比较聪明，你可能得到像是<code>建议采用另一个更合适的工具</code>的回复</p></section><section><h3>别要求使用私人电邮回复<a href="#别要求使用私人电邮回复"><span>#</span></a></h3><p>黑客们认为问题的解决过程应该公开、透明，此过程中如果更有经验的人注意到不完整或者不当之处，最初的回复才能够、也应该被纠正 同时，作为提供帮助者可以得到一些奖励，奖励就是他的能力和学识被其他同行看到</p><p>当你要求私下回复时，这个过程和奖励都被中止 别这样做，让<strong>回复者</strong>来决定是否私下回答 —— 如果他真这么做了，通常是因为他认为问题编写太差或者太肤浅，以至于不可能使其他人产生兴趣</p><p>这条规则存在一条有限的例外，如果你确信提问可能会引来大量雷同的回复时，那么这个神奇的提问句会是<code>向我发电邮，我将为论坛归纳这些回复</code> 试着将邮件列表或新闻群组从洪水般的雷同回复中解救出来是非常有礼貌的 —— 但你必须信守诺言</p></section><section><h3>清楚明确地表达你的问题以及需求<a href="#清楚明确地表达你的问题以及需求"><span>#</span></a></h3><p>漫无边际的提问是近乎无休无止的时间黑洞 最有可能给你有用答案的人通常也正是最忙的人（他们忙是因为要亲自完成大部分工作） 这样的人对无节制的时间黑洞相当厌恶，所以他们也倾向于厌恶那些漫无边际的提问</p><p>如果你明确表述需要回答者做什么（如提供指点、发送一段代码、检查你的补丁、或是其他等等），就最有可能得到有用的答案 因为这会定出一个时间和精力的上限，便于回答者能集中精力来帮你 这么做很棒</p><p>要理解专家们所处的世界，请把专业技能想像为充裕的资源，而回复的时间则是稀缺的资源 你要求他们奉献的时间越少，你越有可能从真正专业而且很忙的专家那里得到解答</p><p>所以，界定一下你的问题，使专家花在辨识你的问题和回答所需要付出的时间减到最少，这技巧对你获得有用的答案相当有帮助 —— 但这技巧通常和简化问题有所区别 因此，问<code>我想更好地理解 X，可否指点一下哪有好一点说明？</code>通常比问<code>你能解释一下 X 吗？</code>更好 如果你的代码不能运作，通常请别人看看哪里有问题，比要求别人替你改正要明智得多</p></section><section><h3>询问有关代码的问题时<a href="#询问有关代码的问题时"><span>#</span></a></h3><p>如果没有提示别人应该从何入手，别要求他人帮你调试有问题的代码 张贴几百行的代码，然后说一声：<code>它不能工作</code>会让你完全被忽略 只贴几十行代码，然后说一句：<code>在第七行以后，我期待它显示 &lt;x&gt;，但实际出现的是 &lt;y&gt;</code>比较有可能让你得到回应</p><p>最有效描述程序问题的方法是提供最精简的 Bug 展示测试用例（bug-demonstrating test case） 什么是最精简的测试用例？那是问题的缩影；一小个程序片段能<strong>刚好</strong>展示出程序的异常行为，而不包含其他令人分散注意力的内容 怎么制作最精简的测试用例？如果你知道哪一行或哪一段代码会造成异常的行为，复制下来并加入足够重现这个状况的代码（例如，足以让这段代码能被编译/直译/被应用程序处理） 如果你无法将问题缩减到一个特定区块，就复制一份代码并移除不影响产生问题行为的部分 总之，测试用例越小越好（查看<a href="#%E8%AF%9D%E4%B8%8D%E5%9C%A8%E5%A4%9A%E8%80%8C%E5%9C%A8%E7%B2%BE">话不在多而在精</a>一节）</p><p>一般而言，要得到一段相当精简的测试用例并不太容易，但永远先尝试这样做是一个好习惯 这种方式可以帮助你了解如何自行解决这个问题 —— 而且即使你的尝试不成功，黑客们也会看到你在尝试取得答案的过程中付出了努力，这可以让他们更愿意与你合作</p><p>如果你只是想让别人帮忙审查（Review）一下代码，在信的开头就要说出来，并且一定要提到你认为哪一部分特别需要关注以及为什么</p></section><section><h3>别把自己家庭作业的问题贴上来<a href="#别把自己家庭作业的问题贴上来"><span>#</span></a></h3><p>黑客们很擅长分辨哪些问题是家庭作业式的问题；因为我们中的大多数都曾自己解决这类问题 同样，这些问题得由<strong>你</strong>来搞定，你会从中学到东西 你可以要求给点提示，但别要求得到完整的解决方案</p><p>如果你怀疑自己碰到了一个家庭作业式的问题，但仍然无法解决，试试在用户群组，论坛或（最后一招）在项目的<strong>用户</strong>邮件列表或论坛中提问 尽管黑客们<strong>会</strong>看出来，但一些有经验的用户也许仍会给你一些提示</p></section><section><h3>去掉无意义的提问句<a href="#去掉无意义的提问句"><span>#</span></a></h3><p>避免用无意义的话结束提问，例如<code>有人能帮我吗？</code>或者<code>这有答案吗？</code></p><p>首先：如果你对问题的描述不是很好，这样问更是画蛇添足</p><p>其次：由于这样问是画蛇添足，黑客们会很厌烦你 —— 而且通常会用逻辑上正确，但毫无意义的回答来表示他们的蔑视， 例如：<code>没错，有人能帮你</code>或者<code>不，没答案</code></p><p>一般来说，避免用<code>是或否</code>、<code>对或错</code>、<code>有或没有</code>类型的问句，除非你想得到<a href="https://strcat.de/questions-with-yes-or-no-answers.html" target="_blank">是或否类型的回答</a></p></section><section><h3>即使你很急也不要在标题写<code>紧急</code><a href="#即使你很急也不要在标题写紧急"><span>#</span></a></h3><p>这是你的问题，不是我们的 宣称<code>紧急</code>极有可能事与愿违：大多数黑客会直接删除无礼和自私地企图即时引起关注的问题 更严重的是，<code>紧急</code>这个字（或是其他企图引起关注的标题）通常会被垃圾信过滤器过滤掉 —— 你希望能看到你问题的人可能永远也看不到</p><p>有半个例外的情况是，如果你是在一些很高调，会使黑客们兴奋的地方，也许值得这样去做 在这种情况下，如果你有时间压力，也很有礼貌地提到这点，人们也许会有兴趣回答快一点</p><p>当然，这风险很大，因为黑客们兴奋的点多半与你的不同 譬如从 NASA 国际空间站（International Space Station）发这样的标题没有问题，但用自我感觉良好的慈善行为或政治原因发肯定不行 事实上，张贴诸如<code>紧急：帮我救救这个毛茸茸的小海豹！</code>肯定让你被黑客忽略或惹恼他们，即使他们认为毛茸茸的小海豹很重要</p><p>如果你觉得这点很不可思议，最好再把这份指南剩下的内容多读几遍，直到你弄懂了再发文</p></section><section><h3>礼多人不怪，而且有时还很有帮助<a href="#礼多人不怪而且有时还很有帮助"><span>#</span></a></h3><p>彬彬有礼，多用<code>请</code>和<code>谢谢您的关注</code>，或<code>谢谢你的关照</code>让大家都知道你对他们花时间免费提供帮助心存感激</p><p>坦白说，这一点并没有比使用清晰、正确、精准且合乎语法和避免使用专用格式重要（也不能取而代之） 黑客们一般宁可读有点唐突但技术上鲜明的 Bug 报告，而不是那种有礼但含糊的报告 （如果这点让你不解，记住我们是按问题能教给我们什么来评价问题的价值的）</p><p>然而，如果你有一串的问题待解决，客气一点肯定会增加你得到有用回应的机会</p><p>（我们注意到，自从本指南发布后，从资深黑客那里得到的唯一严重缺陷反馈，就是对预先道谢这一条 一些黑客觉得<code>先谢了</code>意味着事后就不用再感谢任何人的暗示 我们的建议是要么先说<code>先谢了</code>，<strong>然后</strong>事后再对回复者表示感谢，或者换种方式表达感激，譬如用<code>谢谢你的关注</code>或<code>谢谢你的关照</code>）</p></section><section><h3>问题解决后，加个简短的补充说明<a href="#问题解决后加个简短的补充说明"><span>#</span></a></h3><p>问题解决后，向所有帮助过你的人发个说明，让他们知道问题是怎样解决的，并再一次向他们表示感谢 如果问题在新闻组或者邮件列表中引起了广泛关注，应该在那里贴一个说明比较恰当</p><p>最理想的方式是向最初提问的话题回复此消息，并在标题中包含<code>已修正</code>，<code>已解决</code>或其它同等含义的明显标记 在人来人往的邮件列表里，一个看见讨论串<code>问题 X</code>和<code>问题 X - 已解决</code>的潜在回复者就明白不用再浪费时间了（除非他个人觉得<code>问题 X</code>有趣），因此可以利用此时间去解决其它问题</p><p>补充说明不必很长或是很深入；简单的一句<code>你好，原来是网线出了问题！谢谢大家 – Bill</code>比什么也不说要来的好 事实上，除非结论真的很有技术含量，否则简短可爱的小结比长篇大论更好 说明问题是怎样解决的，但大可不必将解决问题的过程复述一遍</p><p>对于有深度的问题，张贴调试记录的摘要是有帮助的 描述问题的最终状态，说明是什么解决了问题，在此<strong>之后</strong>才指明可以避免的盲点 避免盲点的部分应放在正确的解决方案和其它总结材料之后，而不要将此信息搞成侦探推理小说 列出那些帮助过你的名字，会让你交到更多朋友</p><p>除了有礼貌和有内涵以外，这种类型的补充也有助于他人在邮件列表/新闻群组/论坛中搜索到真正解决你问题的方案，让他们也从中受益</p><p>至少，这种补充有助于让每位参与协助的人因问题的解决而从中得到满足感 如果你自己不是技术专家或者黑客，那就相信我们，这种感觉对于那些你向他们求助的大师或者专家而言，是非常重要的 问题悬而未决会让人灰心；黑客们渴望看到问题被解决 好人有好报，满足他们的渴望，你会在下次提问时尝到甜头</p><p>思考一下怎样才能避免他人将来也遇到类似的问题，自问写一份文件或加个常见问题（FAQ）会不会有帮助 如果是的话就将它们发给维护者</p><p>在黑客中，这种良好的后继行动实际上比传统的礼节更为重要，也是你如何透过善待他人而赢得声誉的方式，这是非常有价值的资产</p></section></section><section><h2>如何解读答案<a href="#如何解读答案"><span>#</span></a></h2><p><a></a></p><section><h3>RTFM 和 STFW：如何知道你已完全搞砸了<a href="#rtfm-和-stfw如何知道你已完全搞砸了"><span>#</span></a></h3><p>有一个古老而神圣的传统：如果你收到 <code>RTFM（Read The Fucking Manual）</code> 的回应，回答者认为你<strong>应该去读他妈的手册</strong> 当然，基本上他是对的，你应该去读一读</p><p>RTFM 有一个年轻的亲戚 如果你收到 <code>STFW（Search The Fucking Web）</code> 的回应，回答者认为你<strong>应该他妈的到网上搜索</strong> 那人多半也是对的，去搜索一下吧 （更温和一点的说法是 <strong><a href="http://lmgtfy.com/" target="_blank">Google 是你的朋友</a></strong>！）</p><p>在论坛，你也可能被要求去爬爬论坛的旧文</p><p>事实上，有人甚至可能热心地为你提供以前解决此问题的讨论串 但不要依赖这种关照，提问前应该先搜索一下旧文</p><p>通常，用这两句之一回答你的人会给你一份包含你需要内容的手册或者一个网址，而且他们打这些字的时候也正在读着 这些答复意味着回答者认为：</p><ul>
<li><strong>你需要的信息非常容易获得</strong>；</li>
<li><strong>你自己去搜索这些信息比灌给你，能让你学到更多</strong></li>
</ul><p>你不应该因此不爽；<strong>依照黑客的标准，他已经表示了对你一定程度的关注，而没有对你的要求视而不见</strong> 你应该对他祖母般的慈祥表示感谢</p></section><section><h3>如果还是搞不懂<a href="#如果还是搞不懂"><span>#</span></a></h3><p>如果你看不懂回应，别立刻要求对方解释 像你以前试着自己解决问题时那样（利用手册，FAQ，网络，身边的高手），先试着去搞懂他的回应 如果你真的需要对方解释，记得表现出你已经从中学到了点什么</p><p>比方说，如果我回答你：<code>看来似乎是 zentry 卡住了；你应该先清除它 </code>，然后，这是一个<strong>很糟的</strong>后续问题回应：<code>zentry 是什么？</code> <strong>好</strong>的问法应该是这样：<code>哦~~~我看过说明了但是只有 -z 和 -p 两个参数中提到了 zentries，而且还都没有清楚的解释如何清除它 你是指这两个中的哪一个吗？还是我看漏了什么？</code></p></section><section><h3>处理无礼的回应<a href="#处理无礼的回应"><span>#</span></a></h3><p>很多黑客圈子中看似无礼的行为并不是存心冒犯 相反，它是直截了当，一针见血式的交流风格，这种风格更注重解决问题，而不是使人感觉舒服而却模模糊糊</p><p>如果你觉得被冒犯了，试着平静地反应 如果有人真的做了出格的事，邮件列表、新闻群组或论坛中的前辈多半会招呼他 如果这<strong>没有</strong>发生而你却发火了，那么你发火对象的言语可能在黑客社区中看起来是正常的，而<strong>你</strong>将被视为有错的一方，这将伤害到你获取信息或帮助的机会</p><p>另一方面，你偶尔真的会碰到无礼和无聊的言行 与上述相反，对真正的冒犯者狠狠地打击，用犀利的语言将其驳得体无完肤都是可以接受的 然而，在行事之前一定要非常非常的有根据 纠正无礼的言论与开始一场毫无意义的口水战仅一线之隔，黑客们自己莽撞地越线的情况并不鲜见 如果你是新手或外人，避开这种莽撞的机会并不高 如果你想得到的是信息而不是消磨时光，这时最好不要把手放在键盘上以免冒险</p><p>（有些人断言很多黑客都有轻度的自闭症或亚斯伯格综合症，缺少用于润滑人类社会<strong>正常</strong>交往所需的神经 这既可能是真也可能是假的 如果你自己不是黑客，兴许你认为我们脑袋有问题还能帮助你应付我们的古怪行为 只管这么干好了，我们不在乎 我们<strong>喜欢</strong>我们现在这个样子，并且通常对病患标记都有站得住脚的怀疑）</p><p>Jeff Bigler 的观察总结和这个相关也值得一读 (<strong><a href="http://www.mit.edu/~jcb/tact.html" target="_blank">tact filters</a></strong>)</p><p>在下一节，我们会谈到另一个问题，当<strong>你</strong>行为不当时所会受到的<code>冒犯</code></p></section></section><section><h2>如何避免扮演失败者<a href="#如何避免扮演失败者"><span>#</span></a></h2><p>在黑客社区的论坛中，你以本指南所描述的或类似的方式，可能会有那么几次搞砸了 而你会在公开场合中被告知你是如何搞砸的，也许攻击的言语中还会带点夹七夹八的颜色</p><p>这种事发生以后，你能做的最糟糕的事莫过于哀嚎你的遭遇、宣称被言语攻击、要求道歉、高声尖叫、憋闷气、威胁诉诸法律、向其雇主报怨、不去关马桶盖等等 相反地，你该这么做：</p><p>熬过去，这很正常 事实上，它是有益健康且合理的</p><p>社区的标准不会自行维持，它们是通过参与者积极而<strong>公开地</strong>执行来维持的 不要哭嚎所有的批评都应该通过私下的邮件传送，它不是这样运作的 当有人评论你的一个说法有误或者提出不同看法时，坚持声称受到个人攻击也毫无益处，这些都是失败者的态度</p><p>也有其它的黑客论坛，受过高礼节要求的误导，禁止参与者张贴任何对别人帖子挑毛病的消息，并声称<code>如果你不想帮助用户就闭嘴 </code> 结果造成有想法的参与者纷纷离开，这么做只会使它们沦为毫无意义的唠叨与无用的技术论坛</p><p>夸张的讲法是：你要的是“友善”（以上述方式）还是有用？两个里面挑一个</p><p>记着：当黑客说你搞砸了，并且（无论多么刺耳）告诉你别再这样做时，他正在为关心<strong>你</strong>和<strong>他的社区</strong>而行动 对他而言，不理你并将你从他的生活中滤掉更简单 如果你无法做到感谢，至少要表现得有点尊严，别大声哀嚎，也别因为自己是个有戏剧性超级敏感的灵魂和自以为有资格的新来者，就指望别人像对待脆弱的洋娃娃那样对你</p><p>有时候，即使你没有搞砸（或者只是在他的想像中你搞砸了），有些人也会无缘无故地攻击你本人 在这种情况下，抱怨倒是<strong>真的</strong>会把问题搞砸</p><p>这些来找麻烦的人要么是毫无办法但自以为是专家的不中用家伙，要么就是测试你是否真会搞砸的心理专家 其它读者要么不理睬，要么用自己的方式对付他们 这些来找麻烦的人在给他们自己找麻烦，这点你不用操心</p><p>也别让自己卷入口水战，最好不要理睬大多数的口水战 —— 当然，这是在你检验它们只是口水战，并且未指出你有搞砸的地方，同时也没有巧妙地将问题真正的答案藏于其后（这也是有可能的）</p></section><section><h2>不该问的问题<a href="#不该问的问题"><span>#</span></a></h2><p>以下是几个经典蠢问题，以及黑客没回答时心中所想的：</p><p>问题：<a href="#q1">我能在哪找到 X 程序或 X 资源？</a></p><p>问题：<a href="#q2">我怎样用 X 做 Y？</a></p><p>问题：<a href="#q3">如何设定我的 shell 提示？</a></p><p>问题：<a href="#q4">我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文件转换为 TeX 格式吗？</a></p><p>问题：<a href="#q5">我的程序/设定/SQL 语句没有用</a></p><p>问题：<a href="#q6">我的 Windows 电脑有问题，你能帮我吗？</a></p><p>问题：<a href="#q7">我的程序不会动了，我认为系统工具 X 有问题</a></p><p>问题：<a href="#q8">我在安装 Linux（或者 X）时有问题，你能帮我吗？</a></p><p>问题：<a href="#q9">我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢？</a></p><hr /><p><a></a></p><blockquote><p>问题：我能在哪找到 X 程序或 X 资源？</p></blockquote><p>回答：就在我找到它的地方啊，白痴 —— 搜索引擎的那一头 天哪！难道还有人不会用 <a href="https://www.google.com" target="_blank">Google</a> 吗？</p><p><a></a></p><blockquote><p>问题：我怎样用 X 做 Y？</p></blockquote><p>回答：如果你想解决的是 Y ，提问时别给出可能并不恰当的方法 这种问题说明提问者不但对 X 完全无知，也对 Y 要解决的问题糊涂，还被特定形势禁锢了思维 最好忽略这种人，等他们把问题搞清楚了再说</p><p><a></a></p><blockquote><p>问题：如何设定我的 shell 提示？？</p></blockquote><p>回答：如果你有足够的智慧提这个问题，你也该有足够的智慧去 <a href="#RTFM">RTFM</a>，然后自己去找出来</p><p><a></a></p><blockquote><p>问题：我可以用 Bass-o-matic 文件转换工具将 AcmeCorp 文件转换为 TeX 格式吗？</p></blockquote><p>回答：试试看就知道了 如果你试过，你就知道了答案，就不用浪费我的时间了</p><p><a></a></p><blockquote><p>问题：我的{程序/设定/SQL 语句}没有用</p></blockquote><p>回答：这不算是问题吧，我对要我问你二十个问题才找得出你真正问题的问题没兴趣 —— 我有更有意思的事要做呢 在看到这类问题的时候，我的反应通常不外如下三种</p><ul>
<li>你还有什么要补充的吗？</li>
<li>真糟糕，希望你能搞定</li>
<li>这关我屁事？</li>
</ul><p><a></a></p><blockquote><p>问题：我的 Windows 电脑有问题，你能帮我吗？</p></blockquote><p>回答：能啊，扔掉微软的垃圾，换个像 Linux 或 BSD 的开源操作系统吧</p><p>注意：如果程序有官方版 Windows 或者与 Windows 有互动（如 Samba），你<strong>可以</strong>问与 Windows 相关的问题，只是别对问题是由 Windows 操作系统而不是程序本身造成的回复感到惊讶， 因为 Windows 一般来说实在太烂，这种说法通常都是对的</p><p><a></a></p><blockquote><p>问题：我的程序不会动了，我认为系统工具 X 有问题</p></blockquote><p>回答：你完全有可能是第一个注意到被成千上万用户反复使用的系统调用与函数库文件有明显缺陷的人，更有可能的是你完全没有根据 不同凡响的说法需要不同凡响的证据，当你这样声称时，你必须有清楚而详尽的缺陷说明文件作后盾</p><p><a></a></p><blockquote><p>问题：我在安装 Linux（或者 X）时有问题，你能帮我吗？</p></blockquote><p>回答：不能，我只有亲自在你的电脑上动手才能找到毛病 还是去找你当地的 Linux 使用群组者寻求实际的指导吧（你能在<a href="http://www.linux.org/groups/index.html" target="_blank">这儿</a>找到用户群组的清单）</p><p>注意：如果安装问题与某 Linux 的发行版有关，在它的邮件列表、论坛或本地用户群组中提问也许是恰当的 此时，应描述问题的准确细节 在此之前，先用 <code>Linux</code> 和<strong>所有</strong>被怀疑的硬件作关键词仔细搜索</p><p><a></a></p><blockquote><p>问题：我怎么才能破解 root 帐号/窃取 OP 特权/读别人的邮件呢？</p></blockquote><p>回答：想要这样做，说明了你是个卑鄙小人；想找个黑客帮你，说明你是个白痴！</p></section><section><h2>好问题与蠢问题<a href="#好问题与蠢问题"><span>#</span></a></h2><p>最后，我将透过举一些例子，来说明怎样聪明的提问；同一个问题的两种问法被放在一起，一种是愚蠢的，另一种才是明智的</p><p><strong>蠢问题</strong>：</p><blockquote><p>我可以在哪儿找到关于 Foonly Flurbamatic 的资料？</p></blockquote><p>这种问法无非想得到 <a href="#RTFM">STFW</a> 这样的回答</p><p><strong>聪明问题</strong>：</p><blockquote><p>我用 Google 搜索过 “Foonly Flurbamatic 2600”，但是没找到有用的结果 谁知道上哪儿去找对这种设备编程的资料？</p></blockquote><p>这个问题已经 STFW 过了，看起来他真的遇到了麻烦</p><p><strong>蠢问题</strong>：</p><blockquote><p>我从 foo 项目找来的源码没法编译 它怎么这么烂？</p></blockquote><p>他觉得都是别人的错，这个傲慢自大的提问者</p><p><strong>聪明问题</strong>：</p><blockquote><p>foo 项目代码在 Nulix 6.2 版下无法编译通过 我读过了 FAQ，但里面没有提到跟 Nulix 有关的问题 这是我编译过程的记录，我有什么做的不对的地方吗？</p></blockquote><p>提问者已经指明了环境，也读过了 FAQ，还列出了错误，并且他没有把问题的责任推到别人头上，他的问题值得被关注</p><p><strong>蠢问题</strong>：</p><blockquote><p>我的主机板有问题了，谁来帮我？</p></blockquote><p>某黑客对这类问题的回答通常是：<code>好的，还要帮你拍拍背和换尿布吗？</code>，然后按下删除键</p><p><strong>聪明问题</strong>：</p><blockquote><p>我在 S2464 主机板上试过了 X 、 Y 和 Z ，但没什么作用，我又试了 A 、 B 和 C  请注意当我尝试 C 时的奇怪现象 显然 florbish 正在 grommicking，但结果出人意料 通常在 Athlon MP 主机板上引起 grommicking 的原因是什么？有谁知道接下来我该做些什么测试才能找出问题？</p></blockquote><p>这个家伙，从另一个角度来看，值得去回答他 他表现出了解决问题的能力，而不是坐等天上掉答案</p><p>在最后一个问题中，注意<code>告诉我答案</code>和<code>给我启示，指出我还应该做什么诊断工作</code>之间微妙而又重要的区别</p><p>事实上，后一个问题源自于 2001 年 8 月在 Linux 内核邮件列表（lkml）上的一个真实的提问 我（Eric）就是那个提出问题的人 我在 Tyan S2464 主板上观察到了这种无法解释的锁定现象，列表成员们提供了解决这一问题的重要信息</p><p>通过我的提问方法，我给了别人可以咀嚼玩味的东西；我设法让人们很容易参与并且被吸引进来 我显示了自己具备和他们同等的能力，并邀请他们与我共同探讨 通过告诉他们我所走过的弯路，以避免他们再浪费时间，我也表明了对他们宝贵时间的尊重</p><p>事后，当我向每个人表示感谢，并且赞赏这次良好的讨论经历的时候，一个 Linux 内核邮件列表的成员表示，他觉得我的问题得到解决并非由于我是这个列表中的<strong>名</strong>人，而是因为我用了正确的方式来提问</p><p>黑客从某种角度来说是拥有丰富知识但缺乏人情味的家伙；我相信他是对的，如果我<strong>像</strong>个乞讨者那样提问，不论我是谁，一定会惹恼某些人或者被他们忽视 他建议我记下这件事，这直接导致了本指南的出现</p></section><section><h2>如果得不到回答<a href="#如果得不到回答"><span>#</span></a></h2><p>如果仍得不到回答，请不要以为我们觉得无法帮助你 有时只是看到你问题的人不知道答案罢了 没有回应不代表你被忽视，虽然不可否认这种差别很难区分</p><p>总的来说，简单地重复张贴问题是个很糟的点子 这将被视为无意义的喧闹 有点耐心，知道你问题答案的人可能生活在不同的时区，可能正在睡觉，也有可能你的问题一开始就没有组织好</p><p>你可以通过其他渠道获得帮助，这些渠道通常更适合初学者的需要</p><p>有许多网上的以及本地的用户群组，由热情的软件爱好者（即使他们可能从没亲自写过任何软件）组成 通常人们组建这样的团体来互相帮助并帮助新手</p><p>另外，你可以向很多商业公司寻求帮助，不论公司大还是小 别为要付费才能获得帮助而感到沮丧！毕竟，假使你的汽车发动机汽缸密封圈爆掉了 —— 完全可能如此 —— 你还得把它送到修车铺，并且为维修付费 就算软件没花费你一分钱，你也不能强求技术支持总是免费的</p><p>对像是 Linux 这种大众化的软件，每个开发者至少会对应到上万名用户 根本不可能由一个人来处理来自上万名用户的求助电话 要知道，即使你要为这些协助付费，和你所购买的同类软件相比，你所付出的也是微不足道的（通常封闭源代码软件的技术支持费用比开源软件的要高得多，且内容也没那么丰富）</p></section><section><h2>如何更好地回答问题<a href="#如何更好地回答问题"><span>#</span></a></h2><p>**态度和善一点 ** 问题带来的压力常使人显得无礼或愚蠢，其实并不是这样</p><p>**对初犯者私下回复 ** 对那些坦诚犯错之人没有必要当众羞辱，一个真正的新手也许连怎么搜索或在哪找常见问题都不知道</p><p><strong>如果你不确定，一定要说出来！</strong> 一个听起来权威的错误回复比没有还要糟，别因为听起来像个专家很好玩，就给别人乱指路 要谦虚和诚实，给提问者与同行都树个好榜样</p><p>**如果帮不了忙，也别妨碍他 ** 不要在实际步骤上开玩笑，那样也许会毁了提问者的设置 —— 有些可怜的呆瓜会把它当成真的指令</p><p>**试探性的反问以引出更多的细节 ** 如果你做得好，提问者可以学到点东西 —— 你也可以 试试将蠢问题转变成好问题，别忘了我们都曾是新手</p><p>尽管对那些懒虫抱怨一声 RTFM 是正当的，但能给出文档的链接（即使只是建议个 Google 搜索关键词）会更好</p><p>**如果你决定回答，就请给出好的答案 ** 当别人正在用错误的工具或方法时别建议笨拙的权宜之计（workaround），应推荐更好的工具，重新界定问题</p><p><strong>正面地回答问题！</strong> 如果这个提问者已经很深入的研究而且也表明已经试过 X 、 Y 、 Z 、 A 、 B 、 C 但没得到结果，回答 <code>试试看 A 或是 B</code> 或者 <code>试试 X 、 Y 、 Z 、 A 、 B 、 C</code> 并附上一个链接一点用都没有</p><p>**帮助你的社区从问题中学习 ** 当回复一个好问题时，问问自己<code>如何修改相关文件或常见问题文件以免再次解答同样的问题？</code>，接着再向文件维护者发一份补丁</p><p>如果你在研究一番后才作出了回答，<strong>展现你的技巧而不是直接端出结果</strong> 毕竟<code>授人以鱼不如授人以渔</code></p></section><section><h2>相关资源<a href="#相关资源"><span>#</span></a></h2><p>如果你需要个人电脑、Unix 系统和网络如何运作的基础知识，参阅 <a href="http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/" target="_blank">Unix 系统和网络基本原理</a></p><p>当你发布软件或补丁时，试着按<a href="http://en.tldp.org/HOWTO/Software-Release-Practice-HOWTO/index.html" target="_blank">软件发布实践</a>操作</p></section><section><h2>鸣谢<a href="#鸣谢"><span>#</span></a></h2><p>Evelyn Mitchel 贡献了一些愚蠢问题例子并启发了编写<code>如何更好地回答问题</code>这一节， Mikhail Ramendik 贡献了一些特别有价值的建议和改进</p></section></section>]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/About-JH-XP/</id>
      <title type="text">关于我的 XP</title>
      <published>2026-07-23T00:00:00.000Z</published>
      <updated>2026-08-02T00:00:00.000Z</updated>
      <author><name>𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/About-JH-XP/"/>
      <summary type="text">老大！已经接国家电网、南方电网、三峡大坝、白鹤滩水电站、乌东德水电站、溪洛渡水电站、向家坝水电站、大亚湾核电站、秦山核电站、华能/大唐/国电投/华电、特高压直流电、高压电塔、220V 家用电、380V 工业电、高压开关柜、变压器、换流站、光伏电站、风电场，再接特斯拉线圈、范德格拉夫起电机、等离子球、静电发生器、高压电棍、杨永信电疗仪、手摇发电机、发电自行车、一万毫安充电宝、十万毫安充电宝、摩擦起电，再接御坂美琴（炮姐）、御坂网络、皮卡丘、十万伏特/百万伏特/亿伏特、艾尼路（响雷果实）、雷影·艾、佐助/卡卡西（雷切/千鸟）、雷之呼吸、雷姆，再接艾雷王、杰顿、雷德王、银河奥特曼、维克特利、泽塔奥特曼、赛罗奥特曼、雷布朗多星人、假面骑士 01、假面骑士 Blades，再接我的世界引雷三叉戟、闪电苦力怕、避雷针、工业模组发电机，原神雷电将军、北斗、菲谢尔、赛诺、雷元素/感电/超载，王者荣耀司空震、司马懿、闪电匕首（电刀），宝可梦闪电鸟、雷伊布、捷拉奥拉、雷吉艾勒奇、电击魔兽，再接雷电法王瑞兹、凯南、泰拉瑞亚雷云法杖、apex 电妹，再接雷公电母、雷震子、宙斯、雷神托尔、雷神之锤、九天应元雷声普化天尊、闪电侠，最后接总电闸、插排、空气开关、漏电保护器、火线零线地线、全屋通电，全线满电接通！</summary>
      <content type="html"><![CDATA[本文已加密保护，请访问网站查看。]]></content>
    </entry>
    <entry>
      <id>https://shimmerfly.github.io/posts/Miko-Doc/</id>
      <title type="text">୧⍤⃝ NewMiko Document ☃</title>
      <published>2026-05-04T00:00:00.000Z</published>
      <updated>2026-07-07T00:00:00.000Z</updated>
      <author><name>𝘚𝘩𝘪𝘮𝘮𝘦𝘳𝘧𝘭𝘺 · 星沫</name></author>
      <link rel="alternate" href="https://shimmerfly.github.io/posts/Miko-Doc/"/>
      <summary type="text">୧⍤⃝ NewMiko Document ☃</summary>
      <content type="html"><![CDATA[<div><div><div></div><div>Note</div></div><div><p><em><strong>因为太他妈多神人来问我一些神仙问题了 所以在此统一回答一下 顺手把安装教程也写了</strong></em>
有问题请先查看 <a href="#%E4%B8%80%E4%BA%9B%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98-qa">一些常见问题 <strong><code>(Q&amp;A)</code></strong></a> 不要什么傻逼问题都在群里问！</p></div></div>
<div><div><div></div><div>Important</div></div><div><p>提问请严格按照 <a href="#%E6%8F%90%E9%97%AE%E7%9A%84%E8%89%BA%E6%9C%AF--%EF%B8%8F-fbi-warning-%EF%B8%8F%E4%B8%8D%E7%9C%8B%E9%B8%A1%E6%8A%8A%E7%9F%AD-10cm-%EF%B8%8F-fbi-warning-%EF%B8%8F"><strong>‼️ FBI WARNING ‼️ 不看鸡把短 10CM~ ‼️ FBI WARNING ‼️</strong></a> 章节的格式 <strong>不然秒踢</strong></p></div></div>
<section><h1>🪨 <strong>A Stone Badge &amp; 不死图腾</strong><a href="#a-stone-badge--不死图腾"><span>#</span></a></h1><p></p><figure><img src="https://stone.professorlee.work/api/stone/theovilardo/PixelPlayer" alt="没错这个石墩子除了浪费你 5 MiB 流量外毫无作用 石墩子指向这个项目： https://github.com/theovilardo/PixelPlayer 项目🔗： https://github.com/professor-lee/StoneBadge" /><figcaption>没错这个石墩子除了浪费你 5 MiB 流量外毫无作用 石墩子指向这个项目： https://github.com/theovilardo/PixelPlayer 项目🔗： https://github.com/professor-lee/StoneBadge</figcaption></figure><p></p><div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span><span>        </span></span><span>🟫🟫🟫🟫🟫🟫</span></div></div><div><div><div>2</div></div><div><span><span>      </span></span><span>🟫🟨🟨🟨🟨🟨🟨🟫</span></div></div><div><div><div>3</div></div><div><span><span>      </span></span><span>🟫🟨🟨🟨🟨🟨🟨🟫</span></div></div><div><div><div>4</div></div><div><span><span>      </span></span><span>🟫🟧🟧🟨🟨🟧🟧🟫</span></div></div><div><div><div>5</div></div><div><span><span>      </span></span><span>🟫⬜🟩🟧🟧⬜️🟩🟫</span></div></div><div><div><div>6</div></div><div><span><span>      </span></span><span>🟫🟩🟩🟨🟨🟩🟩🟫</span></div></div><div><div><div>7</div></div><div><span><span>      </span></span><span>🟫🟧🟧🟨🟨🟧🟧🟫</span></div></div><div><div><div>8</div></div><div><span>🟫🟫🟫🟫🟫🟧🟨🟨🟧🟫🟫🟫🟫🟫</span></div></div><div><div><div>9</div></div><div><span>🟫🟨🟧🟫🟨🟨🟧🟧🟨🟧🟫🟧🟨🟫</span></div></div><div><div><div>10</div></div><div><span>🟫🟫🟫🟨🟨🟨🟨🟨🟧🟧🟫🟫🟫🟫</span></div></div><div><div><div>11</div></div><div><span><span>      </span></span><span>🟫🟨🟧🟧🟧🟧🟨🟫</span></div></div><div><div><div>12</div></div><div><span><span>      </span></span><span>🟫🟫🟫🟫🟫🟫🟫🟫</span></div></div><div><div><div>13</div></div><div><span><span>        </span></span><span>🟫🟨🟧🟧🟧🟫</span></div></div><div><div><div>14</div></div><div><span><span>        </span></span><span>🟫🟨🟧🟧🟨🟫</span></div></div><div><div><div>15</div></div><div><span><span>          </span></span><span>🟫🟫🟫🟫</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div><hr /></section>
<section><h1>提问的艺术  <strong>‼️ FBI WARNING ‼️ 不看鸡把短 10CM~ ‼️ FBI WARNING ‼️</strong><a href="#提问的艺术--️-fbi-warning-️不看鸡把短-10cm-️-fbi-warning-️"><span>#</span></a></h1><div><div><div></div><div>Important</div></div><div><p>首先的首先 最重要的是 不要随便什么问题都跑到群里去问 不要随便浪费人家群友的时间问这些文档里都有的<em><strong>智弱</strong></em>问题了 确保你问的问题文档里没有再去群里问</p></div></div><section><h2>❎ 错误的提问方式 ❎<a href="#错误的提问方式-"><span>#</span></a></h2><blockquote><p>xxx 怎么搞/激活啊</p><p>xxx 为什么不能用啊</p></blockquote><p></p><figure><img alt="cnm" loading="lazy" width="1000" height="990" src="/_astro/cnm.DsEUruU6_A17g2.webp" /><figcaption>cnm</figcaption></figure><p></p></section><section><h2>✅ 正确的提问方式 ✅<a href="#正确的提问方式-"><span>#</span></a></h2><ul>
<li>
<p>问题：<code>xxx？</code></p>
</li>
<li>
<p>环境 <strong>（这是最重要的 一眼就可以让人知道这个问题是否值得回答以及问题的根源）</strong>：</p>
<div><div><div><figure><figcaption></figcaption><pre><code><div><div><div>1</div></div><div><span>Root 方式</span></div></div><div><div><div>2</div></div><div><span>Magisk /KernelSU /Apatch</span></div></div><div><div><div>3</div></div><div>
</div></div><div><div><div>4</div></div><div><span>微信版本</span></div></div><div><div><div>5</div></div><div><span>8.0.xx</span></div></div><div><div><div>6</div></div><div>
</div></div><div><div><div>7</div></div><div><span>API 版本</span></div></div><div><div><div>8</div></div><div><span>100 及更低/101/102</span></div></div><div><div><div>9</div></div><div>
</div></div><div><div><div>10</div></div><div><span>Xposed API 调用保护</span></div></div><div><div><div>11</div></div><div><span>未启用/已启用</span></div></div><div><div><div>12</div></div><div>
</div></div><div><div><div>13</div></div><div><span>Dex 优化器包装</span></div></div><div><div><div>14</div></div><div><span>支持/不支持</span></div></div><div><div><div>15</div></div><div>
</div></div><div><div><div>16</div></div><div><span>框架版本</span></div></div><div><div><div>17</div></div><div><span>xxx-it/irena/别的分支 (xxxx)</span></div></div><div><div><div>18</div></div><div>
</div></div><div><div><div>19</div></div><div><span>管理器包名</span></div></div><div><div><div>20</div></div><div><span>com.android.shell/org.lsposed.manager</span></div></div><div><div><div>21</div></div><div>
</div></div><div><div><div>22</div></div><div><span>系统版本</span></div></div><div><div><div>23</div></div><div><span>xx (API xx)</span></div></div><div><div><div>24</div></div><div>
</div></div><div><div><div>25</div></div><div><span>设备</span></div></div><div><div><div>26</div></div><div><span>xxx</span></div></div><div><div><div>27</div></div><div>
</div></div><div><div><div>28</div></div><div><span>系统架构</span></div></div><div><div><div>29</div></div><div><span>x86-64/arm64-v7a/v8a/v8a (4K)/risc-v</span></div></div></code></pre><div><div></div><div></div></div></figure><div></div></div><span>展开</span><span>收起</span></div></div>
</li>
</ul><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示</p><p>在 LSPosed 主界面长按即可复制设备信息</p><p></p><figure><img alt="LSPosed" loading="lazy" width="1075" height="2393" src="/_astro/LSPosed.5qduhAew_R4VCt.webp" /><figcaption>LSPosed</figcaption></figure><p></p><p>微信版本在 <strong><code>微信设置</code> ➡️ <code>关于</code></strong> 里看</p></div></div><blockquote><p><strong>记得补充你的 Root 方式和微信版本号</strong></p></blockquote><ul>
<li>日志：<code>xxx.zip</code> <em><strong>（有最好 没有也罢）</strong></em></li>
</ul></section></section>
<section><h1>一些常见问题 <strong><code>(Q&amp;A)</code></strong><a href="#一些常见问题-qa"><span>#</span></a></h1><section><h4>1. Q: 打开微信卡第一屏然后闪退？<a href="#1-q-打开微信卡第一屏然后闪退"><span>#</span></a></h4><ul>
<li>像这样：</li>
</ul><div><p></p><figure><img alt="WeChat Crashed 1" loading="lazy" width="398" height="817" src="/_astro/WeChat%20Crashed%201.GFkkqkZT_sKVSI.webp" /><figcaption>WeChat Crashed 1</figcaption></figure><p></p><p></p><figure><img alt="WeChat Crashed 2.png" loading="lazy" width="582" height="1280" src="/_astro/WeChat%20Crashed%202.png.bWVldi66_2wUfU3.webp" /><figcaption>WeChat Crashed 2.png</figcaption></figure><p></p></div><p><strong>A: 你的 LSPosed 肯定还在 1.9.x 版本 请按照 <a href="%E0%AD%A7%E2%8D%A4%E2%83%9D%20NewMiko%20Document%20%E2%98%83%2034c73d337a7d80b28a14d3829cf07b7d.md">PART 1️⃣ LSPosed 的安装</a> 更新你的 LSPosed</strong></p></section><section><h4>2. Q: 打开微信设置闪退？<a href="#2-q-打开微信设置闪退"><span>#</span></a></h4><p><strong>A: 请按照 <a href="%E0%AD%A7%E2%8D%A4%E2%83%9D%20NewMiko%20Document%20%E2%98%83%2034c73d337a7d80b28a14d3829cf07b7d.md">Step 1️⃣ 加入 https://t.me/MikoCIBuilds 频道获取最新版 NewMiko</a> 章节 更新你的 NewMiko 由于之前的某个版本由于不适配微信 <code>8.0.70</code> 版本 导致微信在 <code>8.0.70</code> 版本打开设置闪退</strong></p></section><section><h4>3. Q: 免 Root 能不能用？<a href="#3-q-免-root-能不能用"><span>#</span></a></h4><div><div><div></div><div>Important</div></div><div><p><strong>A:</strong> 请<strong>不要使用</strong> <strong>LSPatch</strong>（俗称 <em><strong>免 Root</strong></em>、<em><strong>嵌入模块</strong></em>） <em><strong>除非你想被张小龙秒封！</strong></em></p></div></div></section><section><h4>4. Q: 已成功激活  NewMiko 并且功能正常 但是 app 里显示 未激活 ？<a href="#4-q-已成功激活--newmiko-并且功能正常-但是-app-里显示-未激活-"><span>#</span></a></h4><ul>
<li><strong>A: 小明留给我们的陈年老 Bug 无视即可 在</strong> <strong>LSPosed <code>2.0.0</code> 及以上版本会出现</strong></li>
</ul><p></p><figure><img alt="Bug" loading="lazy" width="464" height="1022" src="/_astro/Bug.C7QQcOkg_Z2kR3pM.webp" /><figcaption>Bug</figcaption></figure><p></p><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示：
在 LSPosed 设置里 <strong>关闭</strong> <code>**强制显示桌面图标**</code> 功能并 <strong>重启你的📱</strong>
打开 <code>NewMiko</code> app ➡️ <code>更多设置</code> ➡️ 打开 <strong><code>隐藏桌面图标</code></strong>
这样你就不会看见这烦人的 <strong><code>未激活</code> 了</strong></p></div></div><div><figure><img alt="Hidden Module Step 1" loading="lazy" width="464" height="1022" src="/_astro/Hidden%20Module%20Step%201.DhVtNJt-_Z1k1ofG.webp" /><figcaption>Hidden Module Step 1</figcaption></figure><figure><img alt="Hidden Module Step 2" loading="lazy" width="464" height="1022" src="/_astro/Hidden%20Module%20Step%202.B4YdDgxy_ZE1hLb.webp" /><figcaption>Hidden Module Step 2</figcaption></figure></div><div><div><div></div><div>Tip</div></div><div><p>此时若要打开 NewMiko app 的话 在 LSPosed 管理器里点 NewMiko ➡️ 右下角图标就可以了</p><p></p><figure><img alt="Open NewMiko" loading="lazy" width="464" height="1022" src="/_astro/Open%20NewMiko.JoiWRhgc_Z1Mrbqx.webp" /><figcaption>Open NewMiko</figcaption></figure><p></p></div></div><blockquote><p><strong>还有的话我想到再补吧 妈妈的 累死劳资了</strong></p></blockquote><hr /></section></section>
<section><h1>安装、激活教程<a href="#安装激活教程"><span>#</span></a></h1><section><h2>PART 1️⃣ LSPosed 的安装<a href="#part-1️⃣lsposed-的安装"><span>#</span></a></h2><div><div><div></div><div>Important</div></div><div><p><strong>此教程只针对 KernelSU 及其分支撰写 不保证 Magisk 以及 Apatch 用户跟随本教程一定能用上此模块</strong></p></div></div><section><h3>Step 1️⃣ 确保你的📱已经获取了 Root 权限<a href="#step-1️⃣确保你的已经获取了-root-权限"><span>#</span></a></h3><div><div><div></div><div>Tip</div></div><div><p>如果你通过小米机型<a href="https://share.google/aimode/Lfi89lWdLXxOh0zVE" target="_blank">越狱</a>的半残废 Root 或者魅族的官方半残废 Root 使用 LSPosed 则可以忽略上一条</p></div></div><div><figure><img alt="KernelSU" loading="lazy" width="1075" height="2393" src="/_astro/KernelSU.DYHuzCZM_ZdY0tI.webp" /><figcaption>KernelSU</figcaption></figure></div></section><section><h3>Step 2️⃣ 下载 Zygisk 实现模块 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">ReZygisk</a> 或者 <a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank">ZygiskNext</a> 并刷入<a href="#step-2️⃣下载-zygisk-实现模块-rezygisk-或者-zygisknext-并刷入"><span>#</span></a></h3><a href="https://github.com/PerformanC/ReZygisk" target="_blank"><div><div><div><div></div><div>PerformanC</div></div><div>/</div><div>ReZygisk</div></div><div></div></div><div>Transparent implementation of Zygisk.</div><div><div>—</div><div>—</div><div>GPL-3.0</div><span>C</span></div></a><a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank"><div><div><div><div></div><div>Dr-TSNG</div></div><div>/</div><div>ZygiskNext</div></div><div></div></div><div>Standalone implementation of Zygisk</div><div><div>—</div><div>—</div><div>no-license</div><span>C</span></div></a><div><div><div></div><div>Note</div></div><div><p><em>至于为什么有两个模块这件事么……是这样的： <a href="https://github.com/Dr-TSNG/ZygiskNext" target="_blank">https://github.com/Dr-TSNG/ZygiskNext</a> 一段时间前停止了开源 然后就有人搞了个开源的 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 出来
从安全性的角度 本人更建议 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 毕竟闭源的模块的安全性么……这就全看模块作者良心了
但是吧 <a href="https://github.com/PerformanC/ReZygisk" target="_blank">https://github.com/PerformanC/ReZygisk</a> 这模块也是刚刚出来的 稳定性这块还是差一点的（虽然本人目前用着也没发现大问题）所以你自己取舍吧</em></p></div></div></section><section><h3>Step 3️⃣ 下载  并且刷入<a href="#step-3️⃣下载--并且刷入"><span>#</span></a></h3><p>有两种方法下载 LSPosed:</p><ol>
<li>访问 <a href="https://lsposed.zip" target="_blank">lsposed.zip</a> 直接下载</li>
<li>如果无法访问 可加入 [tg@lsposed]（<a href="https://t.me/LSPosed%EF%BC%89" target="_blank">https://t.me/LSPosed）</a> 群组 到群组内下载</li>
</ol><div><div><div></div><div>Important</div></div><div><p>自 2024年4月26日 LSPosed 恢复更新起 LSPosed 不再开源并且进行内部测试制 并且不再分发于 Github 上 用户必须进入 <strong><a href="https://t.me/LSPosed" target="_blank">https://t.me/LSPosed</a> 群组</strong> 获取稳定版更新 而想要内测版用户则需要申请进入 <code>LSPosed Internal Test</code> 内测群组 详情见 ⬇️</p><p><a href="https://t.me/LSPosed/275" target="_blank">https://t.me/LSPosed/275</a></p><ul>
<li>在此加入 LSPosed 频道 ⬇️</li>
</ul><p><a href="https://t.me/LSPosed" target="_blank">LSPosed</a></p><p></p><figure><img alt="@lsposed" loading="lazy" width="1024" height="1966" src="/_astro/@lsposed.BrxAhEbU_1zfSWN.webp" /><figcaption>@lsposed</figcaption></figure><p></p><p>内测群进群方式</p><p><a href="https://t.me/LSPosed/287" target="_blank">https://t.me/LSPosed/287</a></p><ul>
<li>🔗 在此 自己想办法解决吧</li>
</ul><div><figure><figcaption><span></span><span>Terminal window</span></figcaption><pre><code><div><div><div>1</div></div><div><span>echo</span><span> aHR0cHM6Ly90Lm1lLytOZkh6dGZ5TkJaczJaRGxs | </span><span>base64</span><span> -d</span></div></div></code></pre><div><div></div><div></div></div></figure></div></div></div><div><div><div></div><div>Important</div></div><div><p>请使用 <strong>LSPosed API 版本 ≥ <code>101</code></strong> 的版本（ LSPosed 版本 ≥ <strong><code>2.0.0</code></strong>）以防止出一些奇奇怪怪的问题</p><div><div><div></div><div>Note</div></div><div><p>奇奇怪怪的问题.png</p><p></p><figure><img alt="Strange Problems.png" loading="lazy" width="348" height="416" src="/_astro/Strange%20Problems_ZIdOeV.webp" /><figcaption>Strange Problems.png</figcaption></figure><p></p><p>原因：未升级 LSPosed 2.0.0 及以上版本</p><p></p><figure><img alt="Strange Problems - Sulution.png" loading="lazy" width="259" height="407" src="/_astro/Strange%20Problems%20-%20Sulution_1wfrR0.webp" /><figcaption>Strange Problems - Sulution.png</figcaption></figure><p></p></div></div></div></div><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示
你可以在 LSPosed 主界面查看 LSPosed API 及 LSPosed 版本
</p><figure><img alt="LSPosed" loading="lazy" width="1075" height="2393" src="/_astro/LSPosed.5qduhAew_R4VCt.webp" /><figcaption>LSPosed</figcaption></figure><p></p></div></div><div><div><div></div><div>Tip</div></div><div><p>给新手的小提示：
你可以从 LSPosed 的压缩包里提取出 <strong><code>manager.apk</code></strong> 并安装 这样你的 LSPosed 就不再寄生在 <code>Shell</code> 里了 可以常驻在后台
</p><figure><img alt="manager.apk" loading="lazy" width="464" height="913" src="/_astro/manager.apk.Bh75_Frd_iUjwu.webp" /><figcaption>manager.apk</figcaption></figure><p></p></div></div></section></section><section><h2>PART 2️⃣ NewMiko 的安装与激活<a href="#part-2️⃣newmiko-的安装与激活"><span>#</span></a></h2><section><h3>Step 1️⃣ 加入 <a href="https://t.me/MikoCIBuilds" target="_blank">tg@MikoCIBuilds</a> 频道获取最新版  NewMiko、<a href="#step-1️⃣加入-tgmikocibuilds-频道获取最新版--newmiko"><span>#</span></a></h3><p><a href="https://t.me/MikoCIBuilds" target="_blank">Miko CI Builds</a></p></section><section><h3>Step 2️⃣ 安装  NewMiko 并在 LSPosed 里激活  NewMiko<a href="#step-2️⃣安装--newmiko-并在-lsposed-里激活--newmiko"><span>#</span></a></h3><ol>
<li>安装</li>
</ol><p></p><figure><img alt="Install NewMiko" loading="lazy" width="464" height="1022" src="/_astro/Install%20NewMiko.BUQUSw14_24m2HN.webp" /><figcaption>Install NewMiko</figcaption></figure><p></p><p>2.LSPosed 主页 ➡️ 模块 ➡️ :newmiko: NewMiko（可能在下面）</p><p>3.NewMiko <strong><code>im.mingxi.miko</code></strong> ➡️ 启用模块 ➡️ 勾选微信 ➡️ 长按微信 ➡️ 强行停止 ➡️ 确认 ➡️ 启动</p><p>4.打开微信 ➡️ 我的 ➡️ 设置 ➡️ NewMiko ➡️ Enjoy!</p><div><figure><img alt="Enable NewMiko Step 1" loading="lazy" width="464" height="1022" src="/_astro/Enable%20NewMiko%20Step%201.D6qcfQbK_jTsWL.webp" /><figcaption>Enable NewMiko Step 1</figcaption></figure><figure><img alt="Enable NewMiko Step 2" loading="lazy" width="464" height="920" src="/_astro/Enable%20NewMiko%20Step%202.C7mostSX_2bESYd.webp" /><figcaption>Enable NewMiko Step 2</figcaption></figure><figure><img alt="Enable NewMiko Step 3" loading="lazy" width="464" height="180" src="/_astro/Enable%20NewMiko%20Step%203.BIBvYhup_TnBG7.webp" /><figcaption>Enable NewMiko Step 3</figcaption></figure></div><hr /></section></section></section>]]></content>
    </entry>
</feed>
