<?xml version="1.0" encoding="UTF-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
    <title>orhan.cn</title>
    <link rel="self" type="application/atom+xml" href="https://orhan.cn/atom.xml"/>
    <link rel="alternate" type="text/html" href="https://orhan.cn"/>
    <generator uri="https://www.getzola.org/">Zola</generator>
    <updated>2026-06-10T00:00:00+00:00</updated>
    <id>https://orhan.cn/atom.xml</id>
    <entry xml:lang="en">
        <title>Rust derive_builder crate：用宏生成 Builder 模式</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/rust-derive-builder-crate/"/>
        <id>https://orhan.cn/posts/rust-derive-builder-crate/</id>
        
        <summary type="html">&lt;p&gt;如果你在找 &lt;code&gt;drive_builder&lt;&#x2F;code&gt;，crates.io 上目前没有这个 Rust crate。更常见、也更符合这个名字含义的 crate 是 &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;derive_builder&quot;&gt;&lt;code&gt;derive_builder&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;：它通过 &lt;code&gt;#[derive(Builder)]&lt;&#x2F;code&gt; 为结构体自动生成 Builder 模式代码，减少大量重复 setter、默认值和校验逻辑。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>GNU Screen 使用指南</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/screen-usage-guide/"/>
        <id>https://orhan.cn/posts/screen-usage-guide/</id>
        
        <summary type="html">&lt;p&gt;GNU Screen 是一个老牌终端复用器，作用和 tmux、zellij 类似：可以在一个终端里管理多个窗口，也可以让程序在后台继续运行。最常见的场景是 SSH 到服务器后启动一个长期任务，断开连接以后任务不受影响，之后再重新连回去查看状态。&lt;&#x2F;p&gt;
&lt;p&gt;Screen 没有 tmux 和 zellij 那么现代，但优点是很多服务器默认就装了，命令也很稳定。临时在服务器上跑脚本、编译项目、下载文件、看日志，用它非常方便。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Zola 开发服务器如何用于端口转发</title>
        <published>2026-06-10T00:00:00+00:00</published>
        <updated>2026-06-10T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/zola-port-forwarding/"/>
        <id>https://orhan.cn/posts/zola-port-forwarding/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/zola-port-forwarding/">&lt;p&gt;Zola 默认使用 &lt;code&gt;127.0.0.1:1111&lt;&#x2F;code&gt; 启动开发服务器：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个默认配置只监听当前机器的本机回环地址。如果要通过端口转发、远程开发环境、局域网设备、容器或云服务器访问，就需要让 Zola 监听所有网络接口。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;tui-jian-qi-dong-ming-ling&quot;&gt;推荐启动命令&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#tui-jian-qi-dong-ming-ling&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果端口转发工具使用的是其他端口，例如 &lt;code&gt;3000&lt;&#x2F;code&gt;：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 3000
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;核心参数是：&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;&#x2F;th&gt;&lt;th&gt;作用&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--interface 0.0.0.0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;监听所有网络接口，允许外部转发访问&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;&lt;code&gt;--port 3000&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;指定 Zola 开发服务器端口&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h2 id=&quot;pei-he-gong-kai-zhuan-fa-di-zhi&quot;&gt;配合公开转发地址&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#pei-he-gong-kai-zhuan-fa-di-zhi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;如果端口转发工具给了一个公开 URL，例如：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;https:&#x2F;&#x2F;example-tunnel.example.com
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以把它传给 Zola：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;  --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0 \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;  --port&lt;&#x2F;span&gt;&lt;span&gt; 3000 \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;  --base-url&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;example-tunnel.example.com
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这样页面里的链接、静态资源路径和刷新地址会更接近实际访问环境。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;chang-jian-chang-jing&quot;&gt;常见场景&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chang-jian-chang-jing&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;vs-code-port-forwarding-dev-containers&quot;&gt;VS Code Port Forwarding &#x2F; Dev Containers&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#vs-code-port-forwarding-dev-containers&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;然后在端口面板里转发 &lt;code&gt;1111&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ngrok-cloudflare-tunnel&quot;&gt;ngrok &#x2F; Cloudflare Tunnel&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ngrok-cloudflare-tunnel&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;先启动 Zola：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;再把 &lt;code&gt;1111&lt;&#x2F;code&gt; 转发出去。拿到公开 URL 后，如果页面资源路径不对，再加上 &lt;code&gt;--base-url&lt;&#x2F;code&gt;：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --base-url&lt;&#x2F;span&gt;&lt;span&gt; https:&#x2F;&#x2F;your-public-url
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;ju-yu-wang-shou-ji-yu-lan&quot;&gt;局域网手机预览&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ju-yu-wang-shou-ji-yu-lan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;电脑和手机在同一个网络时，可以这样启动：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;然后在手机浏览器打开：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;http:&#x2F;&#x2F;电脑的局域网 IP:1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;pai-cha-wen-ti&quot;&gt;排查问题&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#pai-cha-wen-ti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;如果端口转发后仍然访问不了，按这个顺序检查：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;Zola 是否使用了 &lt;code&gt;--interface 0.0.0.0&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;端口号是否和转发工具里的端口一致&lt;&#x2F;li&gt;
&lt;li&gt;防火墙或云服务器安全组是否放行了该端口&lt;&#x2F;li&gt;
&lt;li&gt;页面资源路径是否需要设置 &lt;code&gt;--base-url&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;端口是否被其他程序占用&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;可以用下面的命令确认 Zola 参数：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --help
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重点看这两个选项：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;-i, --interface &amp;lt;INTERFACE&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;-p, --port &amp;lt;PORT&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;zui-duan-ke-yong-ban-ben&quot;&gt;最短可用版本&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#zui-duan-ke-yong-ban-ben&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;平时只需要记住这一条：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;zola&lt;&#x2F;span&gt;&lt;span&gt; serve&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --interface&lt;&#x2F;span&gt;&lt;span&gt; 0.0.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --port&lt;&#x2F;span&gt;&lt;span&gt; 1111
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;只要不是单纯在本机浏览器里访问 Zola，端口转发场景基本都应该显式加上 &lt;code&gt;--interface 0.0.0.0&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>AIRE：面向交互式应用的实时音频引擎</title>
        <published>2026-05-26T00:00:00+00:00</published>
        <updated>2026-05-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/aire-realtime-audio-engine/"/>
        <id>https://orhan.cn/posts/aire-realtime-audio-engine/</id>
        
        <summary type="html">&lt;p&gt;最近看到一个很适合游戏开发者关注的小项目：&lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Breijen&#x2F;aire&quot;&gt;AIRE&lt;&#x2F;a&gt;。它不是通用播放器，也不是 DAW 级音频工作站，而是一个更贴近游戏和交互式应用需求的实时音频引擎。&lt;&#x2F;p&gt;
&lt;p&gt;项目作者是在业余时间开发 2D 游戏时遇到问题：现有音频库要么太底层，要么只解决“把声音播出来”，但游戏里真正麻烦的是运行时控制、声音状态切换、低延迟混音、合成音效，以及后续的空间音频和环境声学。于是作者干脆自己做了 AIRE。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Scena 1.5.1：Rust 原生 3D 渲染器的新进展</title>
        <published>2026-05-26T00:00:00+00:00</published>
        <updated>2026-05-26T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/scena-1-5-1/"/>
        <id>https://orhan.cn/posts/scena-1-5-1/</id>
        
        <summary type="html">&lt;p&gt;最近 &lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;scena&quot;&gt;Scena&lt;&#x2F;a&gt; 发布了 1.5.1。它是一个 Rust 原生的 3D 渲染器，目标不是做一个完整游戏引擎，而是提供一层更聚焦的 3D 可视化能力：场景图、glTF&#x2F;GLB 加载、PBR 材质、相机、灯光、交互、浏览器渲染、本地渲染，以及无头图像生成。&lt;&#x2F;p&gt;
&lt;p&gt;如果你做的是 3D 模型查看器、产品展示、工业可视化、数字孪生前端或自动生成渲染图，Scena 这种定位会比较有意思。它把常见 3D 查看器流程封装成 Rust API：加载模型，实例化到场景，添加灯光和相机，准备渲染资源，然后输出画面。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>PM2 常用命令：Node、Rust、Go 后台服务进程管理</title>
        <published>2026-05-20T00:00:00+00:00</published>
        <updated>2026-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/pm2-common-commands/"/>
        <id>https://orhan.cn/posts/pm2-common-commands/</id>
        
        <summary type="html">&lt;p&gt;PM2 很多人以为只能管 Node.js，其实它本质上是一个进程管理器。只要是能在命令行启动的长期运行程序，PM2 都可以托管，比如 Node.js、Rust 编译出来的二进制、Go 服务、Python 脚本、Shell 脚本等。&lt;&#x2F;p&gt;
&lt;p&gt;例如一个 Rust 后端服务，可以这样启动：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;pm2&lt;&#x2F;span&gt;&lt;span&gt; start .&#x2F;target&#x2F;release&#x2F;gateway \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;    --name&lt;&#x2F;span&gt;&lt;span&gt; bazar-api \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;    --cwd&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;var&#x2F;www&#x2F;bazar_api \
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;    --update-env
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这篇整理一下 PM2 的常用命令、参数含义和部署时经常会用到的操作。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Smplrspace 与 Archilogic 对比：从数字平面图到空间数据系统</title>
        <published>2026-05-20T00:00:00+00:00</published>
        <updated>2026-05-20T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/smplrspace-vs-archilogic/"/>
        <id>https://orhan.cn/posts/smplrspace-vs-archilogic/</id>
        
        <summary type="html">&lt;p&gt;最近在看空间数据、楼宇数字孪生和室内地图相关产品时，两个名字经常会出现：&lt;a href=&quot;https:&#x2F;&#x2F;www.smplrspace.com&#x2F;&quot;&gt;Smplrspace&lt;&#x2F;a&gt; 和 &lt;a href=&quot;https:&#x2F;&#x2F;www.archilogic.com&#x2F;&quot;&gt;Archilogic&lt;&#x2F;a&gt;。它们都能把静态平面图变成可交互的数字空间，也都提供 SDK&#x2F;API 给软件系统集成使用，但两者的重心并不一样。&lt;&#x2F;p&gt;
&lt;p&gt;一句话概括：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Smplrspace&lt;&#x2F;strong&gt; 更像一个面向产品集成的数字平面图与 2D&#x2F;3D 可视化平台。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Archilogic&lt;&#x2F;strong&gt; 更像一个面向企业资产组合的空间数据系统，也就是把建筑空间变成可查询、可版本化、可集成的系统记录。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;如果你的目标只是“把楼层图放进应用里，并在上面展示传感器、工单、房间、设备等数据”，Smplrspace 会更轻、更直接。如果你的目标是“把整个办公室、楼宇、园区、资产组合变成一套长期维护的空间数据底座”，Archilogic 的体系会更完整。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>iOS App 备案需要的 Bundle ID、公钥、SHA-1 和证书制作</title>
        <published>2026-05-18T00:00:00+00:00</published>
        <updated>2026-05-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/ios-app-icp-filing-certificate/"/>
        <id>https://orhan.cn/posts/ios-app-icp-filing-certificate/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/ios-app-icp-filing-certificate/">&lt;p&gt;iOS App 做国内 App 备案时，平台一般会要求填写 App 的特征信息，常见包括：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Bundle ID
&lt;&#x2F;span&gt;&lt;span&gt;公钥
&lt;&#x2F;span&gt;&lt;span&gt;SHA-1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这几个信息都和苹果开发者账号里的证书、标识符有关。这里记录一下从创建 Bundle ID、制作证书，到获取公钥和 SHA-1 的完整流程。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-xian-fen-qing-ji-ge-gai-nian&quot;&gt;一、先分清几个概念&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#yi-xian-fen-qing-ji-ge-gai-nian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-bundle-id&quot;&gt;1. Bundle ID&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-bundle-id&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;Bundle ID 是 iOS App 的唯一标识，类似 Android 的包名。&lt;&#x2F;p&gt;
&lt;p&gt;常见格式：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;com.company.appname
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;例如：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;com.example.mall
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;备案时填写的 Bundle ID，要和 App Store Connect、Xcode 项目、打包使用的描述文件保持一致。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-gong-yao&quot;&gt;2. 公钥&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#2-gong-yao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;备案里说的公钥，一般是签名证书里的 Public Key。它用于识别 App 签名证书。&lt;&#x2F;p&gt;
&lt;p&gt;注意：这里不是 Apple Push Notification 的推送 Key，也不是 Sign in with Apple 的私钥 &lt;code&gt;.p8&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-sha-1&quot;&gt;3. SHA-1&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#3-sha-1&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;iOS 备案里的 SHA-1，一般指苹果签名证书的 SHA-1 指纹，通常是 16 进制格式。&lt;&#x2F;p&gt;
&lt;p&gt;常见格式长这样：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;有些备案平台填写时可以带冒号，有些平台要求去掉冒号。如果提交失败，就把冒号去掉再试：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;AABBCCDDEEFF11223344556677889900AABBCCDD
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;er-xu-yao-zhun-bei-shen-me&quot;&gt;二、需要准备什么&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#er-xu-yao-zhun-bei-shen-me&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;1. Apple Developer Program 账号
&lt;&#x2F;span&gt;&lt;span&gt;2. Mac 电脑
&lt;&#x2F;span&gt;&lt;span&gt;3. 钥匙串访问 Keychain Access
&lt;&#x2F;span&gt;&lt;span&gt;4. App 的 Bundle ID
&lt;&#x2F;span&gt;&lt;span&gt;5. Apple Distribution 证书
&lt;&#x2F;span&gt;&lt;span&gt;6. App Store 描述文件 .mobileprovision
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果只是备案，核心是拿到 &lt;code&gt;Bundle ID&lt;&#x2F;code&gt;、证书 &lt;code&gt;公钥&lt;&#x2F;code&gt;、证书 &lt;code&gt;SHA-1&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;如果还要打包上架，还需要 &lt;code&gt;.p12&lt;&#x2F;code&gt; 证书和 &lt;code&gt;.mobileprovision&lt;&#x2F;code&gt; 描述文件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;san-chuang-jian-bundle-id&quot;&gt;三、创建 Bundle ID&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#san-chuang-jian-bundle-id&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;登录苹果开发者后台：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;https:&#x2F;&#x2F;developer.apple.com&#x2F;account
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;进入：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Certificates, Identifiers &amp;amp; Profiles
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;创建步骤：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;左侧选择 &lt;code&gt;Identifiers&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;点击 &lt;code&gt;+&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;选择 &lt;code&gt;App IDs&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;类型选择 &lt;code&gt;App&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;填写描述，例如 &lt;code&gt;Mall App&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;填写 Bundle ID，例如 &lt;code&gt;com.example.mall&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;勾选 App 需要的能力，例如 Push Notifications、Associated Domains、Sign in with Apple&lt;&#x2F;li&gt;
&lt;li&gt;保存&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;创建完成后，在 &lt;code&gt;Identifiers&lt;&#x2F;code&gt; 列表里看到的 &lt;code&gt;IDENTIFIER&lt;&#x2F;code&gt; 就是备案要填的 Bundle ID。&lt;&#x2F;p&gt;
&lt;p&gt;如果项目已经存在，也可以在 Xcode 里查看：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Target -&amp;gt; Signing &amp;amp; Capabilities -&amp;gt; Bundle Identifier
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;或者看 &lt;code&gt;Info.plist&lt;&#x2F;code&gt; &#x2F; 构建配置里的：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;PRODUCT_BUNDLE_IDENTIFIER
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;si-chuang-jian-zheng-shu-qing-qiu-csr&quot;&gt;四、创建证书请求 CSR&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#si-chuang-jian-zheng-shu-qing-qiu-csr&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;在 Mac 上打开：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;钥匙串访问
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;菜单栏选择：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;钥匙串访问 -&amp;gt; 证书助理 -&amp;gt; 从证书颁发机构请求证书
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;填写：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;用户电子邮件地址：你的 Apple ID 邮箱
&lt;&#x2F;span&gt;&lt;span&gt;常用名称：公司名或开发者名
&lt;&#x2F;span&gt;&lt;span&gt;CA 电子邮件地址：留空
&lt;&#x2F;span&gt;&lt;span&gt;请求是：存储到磁盘
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;保存后会得到一个文件：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;CertificateSigningRequest.certSigningRequest
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个 CSR 文件用来在苹果开发者后台创建证书。&lt;&#x2F;p&gt;
&lt;p&gt;注意：生成 CSR 的同时，Mac 钥匙串里会生成一把对应的私钥。后面导出 &lt;code&gt;.p12&lt;&#x2F;code&gt; 时必须在同一台 Mac 上操作，或者确保私钥已经同步到了当前 Mac。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wu-chuang-jian-apple-distribution-zheng-shu&quot;&gt;五、创建 Apple Distribution 证书&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#wu-chuang-jian-apple-distribution-zheng-shu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;登录：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;https:&#x2F;&#x2F;developer.apple.com&#x2F;account
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;进入：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Certificates, Identifiers &amp;amp; Profiles -&amp;gt; Certificates
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;创建步骤：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;点击 &lt;code&gt;+&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;选择 &lt;code&gt;Apple Distribution&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;上传刚才生成的 &lt;code&gt;.certSigningRequest&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;点击生成&lt;&#x2F;li&gt;
&lt;li&gt;下载证书文件&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;下载后通常是：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;distribution.cer
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;双击这个 &lt;code&gt;.cer&lt;&#x2F;code&gt; 文件，系统会导入到钥匙串。&lt;&#x2F;p&gt;
&lt;p&gt;在钥匙串里应该能看到类似这样的证书：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Apple Distribution: 公司名称 (TEAMID)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果证书左侧有一个小三角，展开后能看到私钥，说明这台 Mac 上有对应私钥，可以正常导出 &lt;code&gt;.p12&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;如果没有私钥，后面打包会有问题，需要回到生成 CSR 的那台 Mac 上导出，或者重新生成 CSR 和证书。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;liu-dao-chu-p12-zheng-shu&quot;&gt;六、导出 p12 证书&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#liu-dao-chu-p12-zheng-shu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;打开：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;钥匙串访问 -&amp;gt; 登录 -&amp;gt; 我的证书
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;找到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Apple Distribution: 公司名称 (TEAMID)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;右键选择：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;导出
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;文件格式选择：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;个人信息交换 .p12
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;设置一个密码，导出后得到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;ios_distribution.p12
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;这个 &lt;code&gt;.p12&lt;&#x2F;code&gt; 一般用于 HBuilderX、uni-app、Flutter CI、Fastlane、云打包等场景。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;qi-chuang-jian-miao-shu-wen-jian-mobileprovision&quot;&gt;七、创建描述文件 mobileprovision&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#qi-chuang-jian-miao-shu-wen-jian-mobileprovision&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;进入苹果开发者后台：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Certificates, Identifiers &amp;amp; Profiles -&amp;gt; Profiles
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;创建步骤：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;点击 &lt;code&gt;+&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;选择 &lt;code&gt;App Store Connect&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;选择刚才创建的 App ID &#x2F; Bundle ID&lt;&#x2F;li&gt;
&lt;li&gt;选择对应的 &lt;code&gt;Apple Distribution&lt;&#x2F;code&gt; 证书&lt;&#x2F;li&gt;
&lt;li&gt;填写 Profile 名称&lt;&#x2F;li&gt;
&lt;li&gt;生成并下载&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;下载后得到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;appstore.mobileprovision
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;打包时，&lt;code&gt;.p12&lt;&#x2F;code&gt; 和 &lt;code&gt;.mobileprovision&lt;&#x2F;code&gt; 要对应同一个 Bundle ID 和同一个团队。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ba-huo-qu-bundle-id&quot;&gt;八、获取 Bundle ID&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ba-huo-qu-bundle-id&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;最直接的方式是在苹果开发者后台看：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Certificates, Identifiers &amp;amp; Profiles -&amp;gt; Identifiers
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;列表里的 &lt;code&gt;IDENTIFIER&lt;&#x2F;code&gt; 就是 Bundle ID。&lt;&#x2F;p&gt;
&lt;p&gt;也可以从 Xcode 看：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Target -&amp;gt; Signing &amp;amp; Capabilities -&amp;gt; Bundle Identifier
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果手里已经有 &lt;code&gt;.ipa&lt;&#x2F;code&gt; 文件，可以先解压：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;unzip&lt;&#x2F;span&gt;&lt;span&gt; app.ipa&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -d&lt;&#x2F;span&gt;&lt;span&gt; ipa_tmp
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;然后读取：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;&#x2F;usr&#x2F;libexec&#x2F;PlistBuddy -c &lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Print :CFBundleIdentifier&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; ipa_tmp&#x2F;Payload&#x2F;*.app&#x2F;Info.plist
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;jiu-huo-qu-sha-1&quot;&gt;九、获取 SHA-1&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#jiu-huo-qu-sha-1&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;fang-fa-yi-zai-yao-chi-chuan-li-cha-kan&quot;&gt;方法一：在钥匙串里查看&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fang-fa-yi-zai-yao-chi-chuan-li-cha-kan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;打开：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;钥匙串访问 -&amp;gt; 登录 -&amp;gt; 证书
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;找到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Apple Distribution: 公司名称 (TEAMID)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;双击证书，展开详细信息，找到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;SHA-1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;复制这个值填到备案平台。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fang-fa-er-yong-openssl-cha-kan&quot;&gt;方法二：用 openssl 查看&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fang-fa-er-yong-openssl-cha-kan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果你手里有苹果下载的 &lt;code&gt;.cer&lt;&#x2F;code&gt; 文件，可以执行：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span&gt; x509&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -inform&lt;&#x2F;span&gt;&lt;span&gt; DER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -in&lt;&#x2F;span&gt;&lt;span&gt; distribution.cer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -noout -fingerprint -sha1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;输出类似：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;sha1 Fingerprint=AA:BB:CC:DD:EE:FF:11:22:33:44:55:66:77:88:99:00:AA:BB:CC:DD
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;等号后面的就是 SHA-1。&lt;&#x2F;p&gt;
&lt;p&gt;如果备案平台不接受冒号，去掉冒号即可。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shi-huo-qu-gong-yao&quot;&gt;十、获取公钥&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-huo-qu-gong-yao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;fang-fa-yi-zai-ping-guo-kai-fa-zhe-hou-tai-cha-kan&quot;&gt;方法一：在苹果开发者后台查看&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fang-fa-yi-zai-ping-guo-kai-fa-zhe-hou-tai-cha-kan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;登录苹果开发者后台：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Certificates, Identifiers &amp;amp; Profiles -&amp;gt; Certificates
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;点进对应的证书详情页，部分备案教程会让你在这里查看证书详情里的 Public Key &#x2F; 公共密钥。&lt;&#x2F;p&gt;
&lt;p&gt;如果页面显示不完整，可以先点击省略号展开；如果还是不完整，就按备案平台提示复制能显示出来的公钥内容。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fang-fa-er-cong-zheng-shu-wen-jian-dao-chu-gong-yao&quot;&gt;方法二：从证书文件导出公钥&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fang-fa-er-cong-zheng-shu-wen-jian-dao-chu-gong-yao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果你手里有 &lt;code&gt;.cer&lt;&#x2F;code&gt; 文件：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;openssl&lt;&#x2F;span&gt;&lt;span&gt; x509&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -inform&lt;&#x2F;span&gt;&lt;span&gt; DER&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -in&lt;&#x2F;span&gt;&lt;span&gt; distribution.cer&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -pubkey -noout
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;输出类似：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;-----BEGIN PUBLIC KEY-----
&lt;&#x2F;span&gt;&lt;span&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;-----END PUBLIC KEY-----
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;有些备案系统要填的是完整 PEM 公钥，有些只要中间那段内容，有些平台页面会提示“10 进制或 16 进制”。实际以你提交备案的平台输入框说明为准。&lt;&#x2F;p&gt;
&lt;p&gt;如果平台要求一行，可以去掉头尾和换行，只保留中间内容。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shi-yi-bei-an-ping-tai-tian-xie-shi-zen-me-dui-ying&quot;&gt;十一、备案平台填写时怎么对应&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-yi-bei-an-ping-tai-tian-xie-shi-zen-me-dui-ying&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;常见填写关系：&lt;&#x2F;p&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;备案字段&lt;&#x2F;th&gt;&lt;th&gt;iOS 对应信息&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;App 包名 &#x2F; iOS 应用标识符&lt;&#x2F;td&gt;&lt;td&gt;Bundle ID&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;公钥 &#x2F; 平台公钥&lt;&#x2F;td&gt;&lt;td&gt;Apple Distribution 证书公钥&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;签名 MD5 &#x2F; SHA-1&lt;&#x2F;td&gt;&lt;td&gt;iOS 填证书 SHA-1&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;注意：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Android 通常填 MD5。&lt;&#x2F;li&gt;
&lt;li&gt;iOS 通常填 SHA-1。&lt;&#x2F;li&gt;
&lt;li&gt;不要把 Android 的 MD5 填到 iOS。&lt;&#x2F;li&gt;
&lt;li&gt;不要把推送证书、公钥 &lt;code&gt;.p8&lt;&#x2F;code&gt;、登录私钥当成备案公钥。&lt;&#x2F;li&gt;
&lt;li&gt;Bundle ID、公钥、SHA-1 要来自同一个要上架的 App 和签名证书。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;shi-er-app-store-connect-li-tian-xie-icp-bian-hao&quot;&gt;十二、App Store Connect 里填写 ICP 编号&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-er-app-store-connect-li-tian-xie-icp-bian-hao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;备案通过后，会拿到 ICP 备案号。&lt;&#x2F;p&gt;
&lt;p&gt;进入：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;https:&#x2F;&#x2F;appstoreconnect.apple.com
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;找到对应 App：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;App 信息 -&amp;gt; 在中国大陆的供应情况
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;按页面要求填写 ICP 备案信息。&lt;&#x2F;p&gt;
&lt;p&gt;这里要注意：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;App Store Connect 里的 App 名称、开发者主体、备案主体信息要尽量保持一致。&lt;&#x2F;li&gt;
&lt;li&gt;简体中文 App 信息要和备案信息一致。&lt;&#x2F;li&gt;
&lt;li&gt;如果没有配置简体中文，本地化信息要和主要语言里的备案信息一致。&lt;&#x2F;li&gt;
&lt;li&gt;游戏、新闻、出版、宗教等类型可能还要额外许可证。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;shi-san-chang-jian-wen-ti&quot;&gt;十三、常见问题&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-san-chang-jian-wen-ti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-zheng-shu-li-kan-bu-dao-si-yao-zen-me-ban&quot;&gt;1. 证书里看不到私钥怎么办？&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-zheng-shu-li-kan-bu-dao-si-yao-zen-me-ban&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;说明当前 Mac 没有这个证书对应的私钥。&lt;&#x2F;p&gt;
&lt;p&gt;解决办法：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;去生成 CSR 的那台 Mac 导出 &lt;code&gt;.p12&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;li&gt;或者重新生成 CSR&lt;&#x2F;li&gt;
&lt;li&gt;重新创建 Apple Distribution 证书&lt;&#x2F;li&gt;
&lt;li&gt;重新生成描述文件&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;2-sha-1-he-gong-yao-yong-kai-fa-zheng-shu-huan-shi-fa-bu-zheng-shu&quot;&gt;2. SHA-1 和公钥用开发证书还是发布证书？&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#2-sha-1-he-gong-yao-yong-kai-fa-zheng-shu-huan-shi-fa-bu-zheng-shu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;备案和上架一般用发布证书，也就是 &lt;code&gt;Apple Distribution&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;不要用 &lt;code&gt;Apple Development&lt;&#x2F;code&gt; 证书去填生产 App 的备案信息。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;3-bundle-id-ke-yi-gai-ma&quot;&gt;3. Bundle ID 可以改吗？&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#3-bundle-id-ke-yi-gai-ma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果 App 已经在 App Store Connect 创建并上传过构建版本，Bundle ID 基本就不能改了。&lt;&#x2F;p&gt;
&lt;p&gt;如果还没上传，可以重新建 App ID，但要同步修改 Xcode、描述文件、云打包配置。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-p12-mi-ma-wang-liao-zen-me-ban&quot;&gt;4. p12 密码忘了怎么办？&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-p12-mi-ma-wang-liao-zen-me-ban&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;code&gt;.p12&lt;&#x2F;code&gt; 密码忘了无法找回。&lt;&#x2F;p&gt;
&lt;p&gt;如果钥匙串里还有证书和私钥，可以重新导出一份 &lt;code&gt;.p12&lt;&#x2F;code&gt; 并设置新密码。&lt;&#x2F;p&gt;
&lt;p&gt;如果私钥也没了，就重新创建证书。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;5-bei-an-ping-tai-ti-shi-sha-1-ge-shi-cuo-wu-zen-me-ban&quot;&gt;5. 备案平台提示 SHA-1 格式错误怎么办？&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#5-bei-an-ping-tai-ti-shi-sha-1-ge-shi-cuo-wu-zen-me-ban&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;先确认是不是填了证书 SHA-1，而不是 App 文件的哈希。&lt;&#x2F;p&gt;
&lt;p&gt;再尝试两种格式：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;AA:BB:CC:DD...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;或：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;AABBCCDD...
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;不同备案服务商的输入校验不完全一样。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shi-si-gei-kai-fa-he-ke-hu-de-zi-liao-qing-dan&quot;&gt;十四、给开发和客户的资料清单&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-si-gei-kai-fa-he-ke-hu-de-zi-liao-qing-dan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;可以按下面这个清单交付：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;App 名称：
&lt;&#x2F;span&gt;&lt;span&gt;开发者主体：
&lt;&#x2F;span&gt;&lt;span&gt;Bundle ID：
&lt;&#x2F;span&gt;&lt;span&gt;证书名称：
&lt;&#x2F;span&gt;&lt;span&gt;Team ID：
&lt;&#x2F;span&gt;&lt;span&gt;SHA-1：
&lt;&#x2F;span&gt;&lt;span&gt;公钥：
&lt;&#x2F;span&gt;&lt;span&gt;p12 文件：
&lt;&#x2F;span&gt;&lt;span&gt;p12 密码：
&lt;&#x2F;span&gt;&lt;span&gt;mobileprovision 文件：
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;建议把 &lt;code&gt;.p12&lt;&#x2F;code&gt;、密码分开传，不要放在同一个聊天窗口里。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;shi-wu-can-kao-ru-kou&quot;&gt;十五、参考入口&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-wu-can-kao-ru-kou&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ul&gt;
&lt;li&gt;Apple Developer：https:&#x2F;&#x2F;developer.apple.com&#x2F;account&lt;&#x2F;li&gt;
&lt;li&gt;App Store Connect：https:&#x2F;&#x2F;appstoreconnect.apple.com&lt;&#x2F;li&gt;
&lt;li&gt;阿里云 App 备案特征信息说明：https:&#x2F;&#x2F;help.aliyun.com&#x2F;zh&#x2F;icp-filing&#x2F;basic-icp-service&#x2F;user-guide&#x2F;fill-in-app-feature-information&lt;&#x2F;li&gt;
&lt;li&gt;腾讯云 App 备案特征信息说明：https:&#x2F;&#x2F;cloud.tencent.com&#x2F;document&#x2F;product&#x2F;243&#x2F;97789&lt;&#x2F;li&gt;
&lt;li&gt;Apple App 信息说明：https:&#x2F;&#x2F;developer.apple.com&#x2F;cn&#x2F;help&#x2F;app-store-connect&#x2F;reference&#x2F;app-information&#x2F;app-information&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;xiao-jie&quot;&gt;小结&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#xiao-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;iOS App 备案最容易混淆的是证书相关信息。记住这几个对应关系就行：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Bundle ID = iOS App 唯一标识
&lt;&#x2F;span&gt;&lt;span&gt;公钥 = Apple Distribution 证书里的公钥
&lt;&#x2F;span&gt;&lt;span&gt;SHA-1 = Apple Distribution 证书的 SHA-1 指纹
&lt;&#x2F;span&gt;&lt;span&gt;p12 = 证书 + 私钥，用来打包
&lt;&#x2F;span&gt;&lt;span&gt;mobileprovision = Bundle ID + 证书 + 权限配置，用来描述签名范围
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;备案前先把 Bundle ID、证书、描述文件统一好，后面打包、备案、上架都会省很多事。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>SQLite 终端常用命令</title>
        <published>2026-05-18T00:00:00+00:00</published>
        <updated>2026-05-18T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/sqlite-cli-common-commands/"/>
        <id>https://orhan.cn/posts/sqlite-cli-common-commands/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/sqlite-cli-common-commands/">&lt;p&gt;SQLite 自带的 &lt;code&gt;sqlite3&lt;&#x2F;code&gt; 命令行工具很适合临时查数据、排查问题、导入导出小文件。下面整理一份常用命令，日常够用了。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;qi-dong-he-da-kai-shu-ju-ku&quot;&gt;启动和打开数据库&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#qi-dong-he-da-kai-shu-ju-ku&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 打开已有数据库；文件不存在时会自动创建
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; app.db
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 只读方式打开，适合线上排查
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3 -readonly&lt;&#x2F;span&gt;&lt;span&gt; app.db
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 直接执行一条 SQL 后退出
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; app.db &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;select count(*) from users;&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 打开内存数据库
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; :memory:
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;进入交互终端后，提示符一般是：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;sqlite&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;SQLite 终端里有两类命令：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;SQL 语句：例如 &lt;code&gt;select * from users;&lt;&#x2F;code&gt;，末尾需要分号。&lt;&#x2F;li&gt;
&lt;li&gt;点命令：例如 &lt;code&gt;.tables&lt;&#x2F;code&gt;、&lt;code&gt;.schema&lt;&#x2F;code&gt;，以 &lt;code&gt;.&lt;&#x2F;code&gt; 开头，不需要分号。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h2 id=&quot;cha-kan-bang-zhu-he-tui-chu&quot;&gt;查看帮助和退出&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#cha-kan-bang-zhu-he-tui-chu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.help       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看所有点命令
&lt;&#x2F;span&gt;&lt;span&gt;.quit       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 退出
&lt;&#x2F;span&gt;&lt;span&gt;.exit       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 退出
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果 SQL 写了一半进入了多行模式，可以用 &lt;code&gt;Ctrl+C&lt;&#x2F;code&gt; 取消当前输入。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cha-kan-shu-ju-ku-jie-gou&quot;&gt;查看数据库结构&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#cha-kan-shu-ju-ku-jie-gou&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.databases              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看当前连接的数据库文件
&lt;&#x2F;span&gt;&lt;span&gt;.tables                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看所有表
&lt;&#x2F;span&gt;&lt;span&gt;.tables user%           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 按模式过滤表名
&lt;&#x2F;span&gt;&lt;span&gt;.schema                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看完整建表语句
&lt;&#x2F;span&gt;&lt;span&gt;.schema users           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看某张表的建表语句
&lt;&#x2F;span&gt;&lt;span&gt;.indexes                &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看所有索引
&lt;&#x2F;span&gt;&lt;span&gt;.indexes users          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 查看某张表的索引
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;也可以直接查系统表：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; name, type
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; sqlite_master
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; type in (&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;table&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;, &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;index&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;, &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;view&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;order by&lt;&#x2F;span&gt;&lt;span&gt; type, name;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看表字段：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma table_info(users);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看外键：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma foreign_key_list(users);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;shu-chu-ge-shi-she-zhi&quot;&gt;输出格式设置&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shu-chu-ge-shi-she-zhi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;默认输出不太适合阅读，建议先打开表头和列模式：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.headers on
&lt;&#x2F;span&gt;&lt;span&gt;.mode column
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; id, name, created_at &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;limit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;常用输出模式：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.mode column       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 表格列对齐，适合人看
&lt;&#x2F;span&gt;&lt;span&gt;.mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;box          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 边框表格，新版本 sqlite3 更好看
&lt;&#x2F;span&gt;&lt;span&gt;.mode list         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 默认模式
&lt;&#x2F;span&gt;&lt;span&gt;.mode csv          &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- CSV
&lt;&#x2F;span&gt;&lt;span&gt;.mode json         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- JSON
&lt;&#x2F;span&gt;&lt;span&gt;.mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;line         &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 每列一行，适合字段很多的记录
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;设置空值显示：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.nullvalue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;NULL
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;打开 SQL 执行时间：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.timer on
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;chang-yong-cha-xun&quot;&gt;常用查询&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chang-yong-cha-xun&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;查看前几行：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;limit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;按时间倒序：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;order by&lt;&#x2F;span&gt;&lt;span&gt; created_at &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;desc
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;limit &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;20&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;统计行数：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;模糊搜索：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; name like &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;%tom%&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看重复数据：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; email, &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;) as n
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;group by&lt;&#x2F;span&gt;&lt;span&gt; email
&lt;&#x2F;span&gt;&lt;span&gt;having n &amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;shan-chu-shu-ju&quot;&gt;删除数据&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shan-chu-shu-ju&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;删除前先查一遍，确认条件命中了正确的数据：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; id = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;删除一条记录：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; id = &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;10&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;按条件删除多条记录：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; status = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;disabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;删除前统计影响行数：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; status = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;disabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;更稳妥的做法是放进事务里：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; status = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;disabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;-- 确认删除后的结果
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;count&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*&lt;&#x2F;span&gt;&lt;span&gt;) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果发现删错了，在 &lt;code&gt;commit;&lt;&#x2F;code&gt; 之前可以回滚：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;rollback&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;清空整张表：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果表有自增主键，并且想同时重置自增序列：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;delete from&lt;&#x2F;span&gt;&lt;span&gt; sqlite_sequence &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; name = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;SQLite 没有 MySQL 那种 &lt;code&gt;truncate table users;&lt;&#x2F;code&gt;，清空表一般就是用 &lt;code&gt;delete from users;&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;删除表结构和数据：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;drop table&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;drop table&lt;&#x2F;code&gt; 会把整张表删掉，表结构也没了，执行前最好先 &lt;code&gt;.schema users&lt;&#x2F;code&gt; 或 &lt;code&gt;.dump users&lt;&#x2F;code&gt; 留一份。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;dao-ru-he-dao-chu&quot;&gt;导入和导出&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#dao-ru-he-dao-chu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;dao-chu-cha-xun-jie-guo-dao-csv&quot;&gt;导出查询结果到 CSV&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#dao-chu-cha-xun-jie-guo-dao-csv&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.headers on
&lt;&#x2F;span&gt;&lt;span&gt;.mode csv
&lt;&#x2F;span&gt;&lt;span&gt;.once &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;csv
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; id, name, email &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;code&gt;.once&lt;&#x2F;code&gt; 只影响下一条 SQL。也可以用 &lt;code&gt;.output&lt;&#x2F;code&gt; 持续输出到文件：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.output &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;csv
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;* &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users;
&lt;&#x2F;span&gt;&lt;span&gt;.output stdout
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;dao-ru-csv-dao-biao&quot;&gt;导入 CSV 到表&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#dao-ru-csv-dao-biao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;先确认表已经存在：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;create table &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;users_import&lt;&#x2F;span&gt;&lt;span&gt; (
&lt;&#x2F;span&gt;&lt;span&gt;    id &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;integer&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    name &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;text&lt;&#x2F;span&gt;&lt;span&gt;,
&lt;&#x2F;span&gt;&lt;span&gt;    email &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;text
&lt;&#x2F;span&gt;&lt;span&gt;);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;再导入：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.mode csv
&lt;&#x2F;span&gt;&lt;span&gt;.import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;csv&lt;&#x2F;span&gt;&lt;span&gt; users_import
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果 CSV 第一行是表头，新版 sqlite3 可以这样跳过：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;--skip 1 users.csv users_import
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;dao-chu-zheng-ge-shu-ju-ku&quot;&gt;导出整个数据库&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#dao-chu-zheng-ge-shu-ju-ku&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; app.db &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.dump&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;gt; app.sql
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;只导出某张表：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; app.db &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;.dump users&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; &amp;gt; users.sql
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;从 SQL 文件恢复：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; new.db &amp;lt; app.sql
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;bei-fen-he-fu-zhi-shu-ju-ku&quot;&gt;备份和复制数据库&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#bei-fen-he-fu-zhi-shu-ju-ku&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;在 sqlite3 交互终端中备份：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.backup &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;backup&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;db
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;把当前数据库保存为新文件：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.save &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;copy&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;db
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果数据库正在被应用使用，优先用 &lt;code&gt;.backup&lt;&#x2F;code&gt;，不要直接复制 &lt;code&gt;app.db&lt;&#x2F;code&gt; 文件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zhi-xing-sql-wen-jian&quot;&gt;执行 SQL 文件&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#zhi-xing-sql-wen-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3&lt;&#x2F;span&gt;&lt;span&gt; app.db &amp;lt; migration.sql
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;或在交互终端里执行：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.read &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;migration&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;sql
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;shi-wu-cao-zuo&quot;&gt;事务操作&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shi-wu-cao-zuo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;手动开启事务：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;begin&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;update&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; status = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;disabled&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; last_login_at &amp;lt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;2025-01-01&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;commit&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;发现不对就回滚：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;rollback&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;线上手动改数据时，建议先 &lt;code&gt;begin;&lt;&#x2F;code&gt;，查清影响范围后再 &lt;code&gt;commit;&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;cha-kan-zhi-xing-ji-hua&quot;&gt;查看执行计划&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#cha-kan-zhi-xing-ji-hua&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;explain query plan
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;*
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from&lt;&#x2F;span&gt;&lt;span&gt; users
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;where&lt;&#x2F;span&gt;&lt;span&gt; email = &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;a@example.com&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果结果里看到全表扫描，并且这条查询很频繁，可以考虑加索引：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;create index &lt;&#x2F;span&gt;&lt;span&gt;idx_users_email on &lt;&#x2F;span&gt;&lt;span style=&quot;color:#8fa1b3;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;(email);
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;chang-yong-pragma&quot;&gt;常用 PRAGMA&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chang-yong-pragma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;查看 SQLite 版本：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; sqlite_version();
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看数据库页大小和大小信息：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma page_size;
&lt;&#x2F;span&gt;&lt;span&gt;pragma page_count;
&lt;&#x2F;span&gt;&lt;span&gt;pragma freelist_count;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;开启外键约束：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma foreign_keys = on;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看外键是否开启：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma foreign_keys;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;检查数据库完整性：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma integrity_check;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;清理空间：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;vacuum;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;更新统计信息，帮助查询优化器：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;analyze;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;attach-duo-ge-shu-ju-ku&quot;&gt;Attach 多个数据库&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#attach-duo-ge-shu-ju-ku&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;有时需要在两个 SQLite 数据库之间复制数据：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;attach database &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;old.db&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39; as old;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;insert into&lt;&#x2F;span&gt;&lt;span&gt; users (id, name, email)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;select&lt;&#x2F;span&gt;&lt;span&gt; id, name, email
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;from &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;old&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;users&lt;&#x2F;span&gt;&lt;span&gt;;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;detach database old;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;查看当前连接：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.databases
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;pai-cha-suo-wen-ti&quot;&gt;排查锁问题&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#pai-cha-suo-wen-ti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;如果遇到：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;database is locked
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;可以先设置等待时间：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;5000
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;表示最多等待 5000 毫秒。&lt;&#x2F;p&gt;
&lt;p&gt;也可以检查当前 journal 模式：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma journal_mode;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;开发环境可以考虑启用 WAL：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;pragma journal_mode = wal;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;WAL 通常能改善读写并发，但是否适合线上环境要结合部署方式判断，尤其是网络文件系统上要谨慎。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-ge-chang-yong-qi-dong-mo-ban&quot;&gt;一个常用启动模板&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#yi-ge-chang-yong-qi-dong-mo-ban&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;平时查库可以这样开：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;sqlite3 -readonly&lt;&#x2F;span&gt;&lt;span&gt; app.db
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;进入后先执行：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.headers on
&lt;&#x2F;span&gt;&lt;span&gt;.mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;box
&lt;&#x2F;span&gt;&lt;span&gt;.timer on
&lt;&#x2F;span&gt;&lt;span&gt;.nullvalue &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;NULL
&lt;&#x2F;span&gt;&lt;span&gt;.tables
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果 sqlite3 版本不支持 &lt;code&gt;.mode box&lt;&#x2F;code&gt;，就换成：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.mode column
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;xiao-jie&quot;&gt;小结&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#xiao-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;最常用的一组命令：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sql&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sql &quot;&gt;&lt;code class=&quot;language-sql&quot; data-lang=&quot;sql&quot;&gt;&lt;span&gt;.help
&lt;&#x2F;span&gt;&lt;span&gt;.databases
&lt;&#x2F;span&gt;&lt;span&gt;.tables
&lt;&#x2F;span&gt;&lt;span&gt;.schema users
&lt;&#x2F;span&gt;&lt;span&gt;.headers on
&lt;&#x2F;span&gt;&lt;span&gt;.mode &lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;box
&lt;&#x2F;span&gt;&lt;span&gt;.timer on
&lt;&#x2F;span&gt;&lt;span&gt;.once &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;result&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;csv
&lt;&#x2F;span&gt;&lt;span&gt;.import &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;data&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;csv&lt;&#x2F;span&gt;&lt;span&gt; table_name
&lt;&#x2F;span&gt;&lt;span&gt;.backup &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;backup&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;db
&lt;&#x2F;span&gt;&lt;span&gt;.read &lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;file&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color:#d08770;&quot;&gt;sql
&lt;&#x2F;span&gt;&lt;span&gt;.quit
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;记住点命令不加分号、SQL 语句要加分号，基本就能顺畅使用 sqlite3 终端了。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Bolt FFI：让 Rust 成为跨平台业务逻辑的核心</title>
        <published>2026-05-12T00:00:00+00:00</published>
        <updated>2026-05-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/boltffi-intro/"/>
        <id>https://orhan.cn/posts/boltffi-intro/</id>
        
        <summary type="html">&lt;p&gt;最近关注到 &lt;a href=&quot;https:&#x2F;&#x2F;www.boltffi.dev&#x2F;&quot;&gt;Bolt FFI&lt;&#x2F;a&gt;，这是一个能把 Rust 库自动导出为多语言绑定的工具。它的定位很清晰：把业务逻辑集中在 Rust 中，一次编写，多端复用。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Rust 跨平台 UI 框架新动向：WaterUI、Blinc 与 Ply</title>
        <published>2026-05-12T00:00:00+00:00</published>
        <updated>2026-05-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/rust-ui-frameworks-2025/"/>
        <id>https://orhan.cn/posts/rust-ui-frameworks-2025/</id>
        
        <summary type="html">&lt;p&gt;Rust 的 GUI 生态一直是个热闹的话题。从早期的 egui、iced，到 Dioxus、Slint，各家在自绘、原生渲染、Web 技术栈之间走不同的路线。最近注意到三个较新的框架——&lt;a href=&quot;https:&#x2F;&#x2F;waterui.dev&#x2F;&quot;&gt;WaterUI&lt;&#x2F;a&gt;、&lt;a href=&quot;https:&#x2F;&#x2F;project-blinc.github.io&#x2F;Blinc&#x2F;introduction.html&quot;&gt;Blinc&lt;&#x2F;a&gt; 和 &lt;a href=&quot;https:&#x2F;&#x2F;plyx.iz.rs&#x2F;&quot;&gt;Ply&lt;&#x2F;a&gt;——它们都在尝试用 Rust 写一套代码，跑在移动端、桌面端甚至 Web 上。本文简单梳理它们的特点和差异。&lt;&#x2F;p&gt;</summary>
        
    </entry>
    <entry xml:lang="en">
        <title>Flutter 设备未识别：USB 调试这个坑</title>
        <published>2026-04-07T00:00:00+00:00</published>
        <updated>2026-04-07T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/flutter-usb-debugging/"/>
        <id>https://orhan.cn/posts/flutter-usb-debugging/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/flutter-usb-debugging/">&lt;h2 id=&quot;wen-ti&quot;&gt;问题&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#wen-ti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;今天跑 &lt;code&gt;flutter devices&lt;&#x2F;code&gt; 想在真机上调试，结果只看到 macOS、Chrome 和 iPhone，Android 手机完全不见踪影。&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; flutter devices
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Found&lt;&#x2F;span&gt;&lt;span&gt; 3 connected devices:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;macOS&lt;&#x2F;span&gt;&lt;span&gt; (desktop)                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;•&lt;&#x2F;span&gt;&lt;span&gt; macos                 • darwin-arm64
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Mac&lt;&#x2F;span&gt;&lt;span&gt; Designed for iPad (desktop) &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;•&lt;&#x2F;span&gt;&lt;span&gt; mac-designed-for-ipad • darwin
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Chrome&lt;&#x2F;span&gt;&lt;span&gt; (web)                    &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;•&lt;&#x2F;span&gt;&lt;span&gt; chrome                • web-javascript
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;手机明明插着，开发者模式也开了，就是认不出来。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;pai-cha-guo-cheng&quot;&gt;排查过程&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#pai-cha-guo-cheng&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;以为是 Android SDK 或者驱动的问题，跑了 &lt;code&gt;flutter doctor&lt;&#x2F;code&gt;，结果：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;[✓] Android toolchain - develop for Android devices (Android SDK version 36.1.0)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Android SDK 没问题。&lt;code&gt;adb devices&lt;&#x2F;code&gt; 也是空的。说明问题不在 Flutter 层面，而是 macOS 根本没识别到手机。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yuan-yin&quot;&gt;原因&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#yuan-yin&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;最后想起来——&lt;strong&gt;USB 调试没开&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;光开&quot;开发者模式&quot;不够，USB 调试是独立的选项，必须单独打开。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;zheng-que-bu-zou&quot;&gt;正确步骤&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#zheng-que-bu-zou&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;正确顺序是这样的：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开 USB 调试&lt;&#x2F;strong&gt;
设置 → 开发者选项 → &lt;strong&gt;USB 调试&lt;&#x2F;strong&gt; → 打开&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;插入数据线&lt;&#x2F;strong&gt;
用支持数据传输的线（有些线只能充电）&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;在手机上授权&lt;&#x2F;strong&gt;
连接电脑后，手机会弹出对话框，勾选&quot;始终允许来自此计算机&quot;，点允许&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;（可选）切换 USB 模式&lt;&#x2F;strong&gt;
从通知栏下拉 → USB 选项 → 选择&quot;传输文件（MTP）&quot;&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;搞定之后再跑 &lt;code&gt;flutter devices&lt;&#x2F;code&gt;，Android 设备就出现了：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;$&lt;&#x2F;span&gt;&lt;span&gt; flutter devices
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Found&lt;&#x2F;span&gt;&lt;span&gt; 4 connected devices:
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;macOS&lt;&#x2F;span&gt;&lt;span&gt; (desktop)                 &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;•&lt;&#x2F;span&gt;&lt;span&gt; macos                 • darwin-arm64
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;...
&lt;&#x2F;span&gt;&lt;span&gt;  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Pixel&lt;&#x2F;span&gt;&lt;span&gt; 6a (mobile)              &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;•&lt;&#x2F;span&gt;&lt;span&gt; android-arm64         • Android 14
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;xiao-jie&quot;&gt;小结&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#xiao-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;这是一个低级错误，但确实值得记录。开发者模式和 USB 调试是两回事，平时用得少真的会忘。下次遇到类似问题，先检查这三点：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;USB 调试开了没&lt;&#x2F;li&gt;
&lt;li&gt;数据线支不支持数据传输&lt;&#x2F;li&gt;
&lt;li&gt;授权弹窗点了没&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;题图：Flutter 调试界面&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>公司注册苹果开发者账号流程及资料清单</title>
        <published>2026-04-03T00:00:00+00:00</published>
        <updated>2026-04-03T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/apple-developer-company-account/"/>
        <id>https://orhan.cn/posts/apple-developer-company-account/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/apple-developer-company-account/">&lt;p&gt;公司注册苹果开发者账号（Apple Developer Program）与个人账号在功能和费用上完全一致，均为 &lt;strong&gt;$99&#x2F;年&lt;&#x2F;strong&gt;，但需要额外验证公司真实性和 D-U-N-S 号码。记录一下完整流程供有需要的人参考。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;yi-qian-zhi-zhun-bei&quot;&gt;一、前置准备&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#yi-qian-zhi-zhun-bei&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-1-que-ren-zhang-hao-lei-xing&quot;&gt;1.1 确认账号类型&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-1-que-ren-zhang-hao-lei-xing&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;类型&lt;&#x2F;th&gt;&lt;th&gt;适用对象&lt;&#x2F;th&gt;&lt;th&gt;年费&lt;&#x2F;th&gt;&lt;th&gt;是否需要 D-U-N-S&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;个人（Individual）&lt;&#x2F;td&gt;&lt;td&gt;个人开发者&lt;&#x2F;td&gt;&lt;td&gt;$99&lt;&#x2F;td&gt;&lt;td&gt;否&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;公司（Organization）&lt;&#x2F;td&gt;&lt;td&gt;企业&#x2F;组织&lt;&#x2F;td&gt;&lt;td&gt;$99&lt;&#x2F;td&gt;&lt;td&gt;&lt;strong&gt;是&lt;&#x2F;strong&gt;&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;企业（Enterprise）&lt;&#x2F;td&gt;&lt;td&gt;内部大规模部署，不上架 App Store&lt;&#x2F;td&gt;&lt;td&gt;$299&lt;&#x2F;td&gt;&lt;td&gt;是&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;p&gt;上架 App Store 走公司类型即可，无需企业账号。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;1-2-zhun-bei-d-u-n-s-hao-ma&quot;&gt;1.2 准备 D-U-N-S 号码&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-2-zhun-bei-d-u-n-s-hao-ma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;D-U-N-S 是邓白氏公司（Dun &amp;amp; Bradstreet）发行的唯一企业标识符，苹果用它来验证公司真实存在。&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;先查，再申请。&lt;&#x2F;strong&gt; 邓白氏数据库覆盖了全球大量企业，很多公司其实&lt;strong&gt;早已有 D-U-N-S 号码&lt;&#x2F;strong&gt;，只是没有主动申请过。以下情况可能已有号码：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;曾在银行申请过企业贷款或信用卡&lt;&#x2F;li&gt;
&lt;li&gt;办理过企业信用报告或评级业务&lt;&#x2F;li&gt;
&lt;li&gt;与有业务往来的大型企业做过供应商登记&lt;&#x2F;li&gt;
&lt;li&gt;公司成立时间较长（如10年以上）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;因此第一步先去邓白氏官网查询：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;苹果官方查询入口：https:&#x2F;&#x2F;developer.apple.com&#x2F;enroll&#x2F;duns-lookup&lt;&#x2F;li&gt;
&lt;li&gt;邓白氏官网查询入口：https:&#x2F;&#x2F;developer.dnb.com&#x2F;get-your-duns-number&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;输入公司名称或 D-U-N-S 号码直接搜索&lt;&#x2F;li&gt;
&lt;li&gt;搜到了直接用，搜不到再申请&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;申请方式（搜不到时）：&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;官网申请入口：https:&#x2F;&#x2F;developer.dnb.com&#x2F;get-your-duns-number&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;正常情况下免费，审核周期 &lt;strong&gt;1-2 个工作日&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;li&gt;加急可联系邓白氏客服（国内可打 400-921-0385）&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;strong&gt;填写注意事项：&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;公司名称必须与营业执照上的&lt;strong&gt;完全一致&lt;&#x2F;strong&gt;（中英文、大小写、空格都要对齐）&lt;&#x2F;li&gt;
&lt;li&gt;总部地址、员工人数等需如实填写&lt;&#x2F;li&gt;
&lt;li&gt;申请后记录下 D-U-N-S 号码，一般格式为 &lt;code&gt;XX-XXX-XXXX&lt;&#x2F;code&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;blockquote&gt;
&lt;p&gt;如果是新申请 D-U-N-S 号码，邓白氏数据同步到苹果需要 &lt;strong&gt;1-2 天&lt;&#x2F;strong&gt;，建议等 2-3 天再进行苹果注册，否则可能遇到&quot;D-U-N-S 号码找不到&quot;的报错。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h3 id=&quot;1-3-zhun-bei-gong-si-zi-liao&quot;&gt;1.3 准备公司资料&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-3-zhun-bei-gong-si-zi-liao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;&lt;strong&gt;中国境内公司需要准备：&lt;&#x2F;strong&gt;&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;营业执照&lt;&#x2F;strong&gt;（加盖公章的扫描件或照片）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;法人身份证&lt;&#x2F;strong&gt;正反面&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;在职证明&lt;&#x2F;strong&gt;（苹果注册时需证明申请人是公司员工。可用这个工具 &lt;a href=&quot;&#x2F;apple-employment-cert.html&quot; style=&quot;color:#2563eb;text-decoration:none;&quot;&gt;在职证明生成器&lt;&#x2F;a&gt; 快速生成 A4 格式的中英文在职证明）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;D-U-N-S 号码确认函&lt;&#x2F;strong&gt;（邓白氏发放，可截图或 PDF）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;公司英文名称&lt;&#x2F;strong&gt;（用于 App Store 显示，没有的话需要自己音译或意译）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;公司网站&lt;&#x2F;strong&gt;（需可访问，至少有简单的关于我们页面）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Apple ID&lt;&#x2F;strong&gt;（用于登录开发者账号，建议使用公司域名的邮箱，如 &lt;code&gt;developer@yourcompany.com&lt;&#x2F;code&gt;）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;信用卡&lt;&#x2F;strong&gt;（用于支付 $99 年费，支持 VISA &#x2F; Mastercard）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h2 id=&quot;er-zhu-ce-liu-cheng&quot;&gt;二、注册流程&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#er-zhu-ce-liu-cheng&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;step-1-fang-wen-zhu-ce-ye-mian&quot;&gt;Step 1：访问注册页面&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-1-fang-wen-zhu-ce-ye-mian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;打开 https:&#x2F;&#x2F;developer.apple.com&#x2F;enroll&#x2F; ，选择 &quot;Organization&quot;。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;step-2-shu-ru-d-u-n-s-hao-ma&quot;&gt;Step 2：输入 D-U-N-S 号码&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-2-shu-ru-d-u-n-s-hao-ma&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;苹果会验证 D-U-N-S 号码。如果提示找不到：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;等待 1-2 天后再试&lt;&#x2F;li&gt;
&lt;li&gt;或联系邓白氏更新数据&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;step-3-tian-xie-gong-si-xin-xi&quot;&gt;Step 3：填写公司信息&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-3-tian-xie-gong-si-xin-xi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Legal Entity Name&lt;&#x2F;strong&gt;：公司全称（英文），必须与 D-U-N-S 登记一致&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;D-U-N-S Number&lt;&#x2F;strong&gt;：填入已申请的号码&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Website&lt;&#x2F;strong&gt;：公司官网&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Headquarters Address&lt;&#x2F;strong&gt;：公司总部地址（英文）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Work Email&lt;&#x2F;strong&gt;：公司域名邮箱（避免使用 gmail、qq 等公共邮箱）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Phone&lt;&#x2F;strong&gt;：公司电话&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;step-4-ti-jiao-zi-liao-gong-shen-he&quot;&gt;Step 4：提交资料供审核&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-4-ti-jiao-zi-liao-gong-shen-he&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;苹果会验证：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;公司是否真实存在（通过 D-U-N-S）&lt;&#x2F;li&gt;
&lt;li&gt;申请人是否有权代表公司（需提供营业执照、法人身份证）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;step-5-qian-shu-xie-yi-bing-fu-kuan&quot;&gt;Step 5：签署协议并付款&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-5-qian-shu-xie-yi-bing-fu-kuan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;审核通过后：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;阅读并签署《Apple Developer Program License Agreement》&lt;&#x2F;li&gt;
&lt;li&gt;使用信用卡支付 &lt;strong&gt;$99 美元&#x2F;年&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;step-6-deng-dai-ji-huo&quot;&gt;Step 6：等待激活&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#step-6-deng-dai-ji-huo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;付款成功后，账号会在 &lt;strong&gt;1-2 个工作日&lt;&#x2F;strong&gt;内激活。届时你会收到确认邮件。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;san-wan-zheng-zi-liao-qing-dan&quot;&gt;三、完整资料清单&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#san-wan-zheng-zi-liao-qing-dan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;□ D-U-N-S 号码
&lt;&#x2F;span&gt;&lt;span&gt;□ 营业执照（加盖公章）
&lt;&#x2F;span&gt;&lt;span&gt;□ 法人身份证（正反面）
&lt;&#x2F;span&gt;&lt;span&gt;□ 在职证明（公司员工证明，可借助 &amp;lt;a href=&amp;quot;&#x2F;apple-employment-cert.html&amp;quot; style=&amp;quot;color:#2563eb;text-decoration:none;&amp;quot;&amp;gt;在职证明生成器&amp;lt;&#x2F;a&amp;gt;）
&lt;&#x2F;span&gt;&lt;span&gt;□ 公司域名邮箱（推荐）
&lt;&#x2F;span&gt;&lt;span&gt;□ 公司英文名称（提前想好）
&lt;&#x2F;span&gt;&lt;span&gt;□ 公司官网（可访问）
&lt;&#x2F;span&gt;&lt;span&gt;□ 信用卡（支持外币支付）
&lt;&#x2F;span&gt;&lt;span&gt;□ Apple ID（建议新建或使用公司邮箱）
&lt;&#x2F;span&gt;&lt;span&gt;□ 公章（如果需要纸质盖章流程）
&lt;&#x2F;span&gt;&lt;span&gt;□ 邓白氏确认函（截图即可）
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;si-zhu-yi-shi-xiang&quot;&gt;四、注意事项&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#si-zhu-yi-shi-xiang&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;4-1-zhang-hao-gui-shu-quan&quot;&gt;4.1 账号归属权&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-1-zhang-hao-gui-shu-quan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;公司账号的归属权在&lt;strong&gt;公司主体&lt;&#x2F;strong&gt;而非个人。即使添加了多个成员，离职后移除即可，不影响账号。这是公司注册最重要的意义之一。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-2-yi-ge-ren-ye-ke-yi-zhu-ce-gong-si-zhang-hao&quot;&gt;4.2 一个人也可以注册公司账号&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-2-yi-ge-ren-ye-ke-yi-zhu-ce-gong-si-zhang-hao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;不要求公司有多名员工，个体工商户也可以申请。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-3-xin-yong-qia-wen-ti&quot;&gt;4.3 信用卡问题&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-3-xin-yong-qia-wen-ti&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;苹果从境外扣款，建议使用&lt;strong&gt;单币种外币卡&lt;&#x2F;strong&gt;（如中行 VISA 美金卡）。双币种卡有时会遇到支付失败。如果失败，可尝试：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;换一张卡&lt;&#x2F;li&gt;
&lt;li&gt;联系银行开放境外网上支付&lt;&#x2F;li&gt;
&lt;li&gt;通过电话支付&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;4-4-shen-he-shi-jian&quot;&gt;4.4 审核时间&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-4-shen-he-shi-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;正常情况下 1-2 个工作日。如果资料有问题，苹果会发邮件要求补充。注意查收垃圾邮件箱。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-5-nian-fei-xu-fei&quot;&gt;4.5 年费续费&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-5-nian-fei-xu-fei&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;到期前一个月苹果会发邮件提醒。&lt;strong&gt;建议开启自动续费&lt;&#x2F;strong&gt;，开发者证书和描述文件与账号绑定，断签后会影响线上 App 的更新和安装。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;wu-zhu-ce-wan-cheng-hou-yao-zuo-de-shi&quot;&gt;五、注册完成后要做的事&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#wu-zhu-ce-wan-cheng-hou-yao-zuo-de-shi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;ol&gt;
&lt;li&gt;在 &lt;a href=&quot;https:&#x2F;&#x2F;developer.apple.com&#x2F;&quot;&gt;Apple Developer Console&lt;&#x2F;a&gt; 中添加团队成员，设置角色权限&lt;&#x2F;li&gt;
&lt;li&gt;在 &lt;a href=&quot;https:&#x2F;&#x2F;appstoreconnect.apple.com&#x2F;&quot;&gt;App Store Connect&lt;&#x2F;a&gt; 中创建 App 记录&lt;&#x2F;li&gt;
&lt;li&gt;创建 App Store Connect 团队的 Apple ID（如果多人需要协同）&lt;&#x2F;li&gt;
&lt;li&gt;配置 App Store 开发者账号的税务和银行信息（用于接收 App 收入）&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;hr &#x2F;&gt;
&lt;p&gt;总体来说，公司注册苹果开发者账号比个人账号多出 D-U-N-S 验证这一步，其他流程都很直接。核心要点就是：&lt;strong&gt;提前申请 D-U-N-S、公司名称保持一致、准备好外币信用卡&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Git 分支重置到之前的提交</title>
        <published>2026-03-06T00:00:00+00:00</published>
        <updated>2026-03-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/git-reset-branch-to-previous-commit/"/>
        <id>https://orhan.cn/posts/git-reset-branch-to-previous-commit/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/git-reset-branch-to-previous-commit/">&lt;h2 id=&quot;wen-ti-miao-shu&quot;&gt;问题描述&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#wen-ti-miao-shu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;在运行 &lt;code&gt;cargo watch -x &#x27;run -p gateway&#x27;&lt;&#x2F;code&gt; 时遇到错误：&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;error: failed to load manifest for workspace member
&lt;&#x2F;span&gt;&lt;span&gt;referenced by workspace at `&#x2F;path&#x2F;to&#x2F;Cargo.toml`
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Caused by:
&lt;&#x2F;span&gt;&lt;span&gt;  failed to load manifest for dependency `module-store`
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Caused by:
&lt;&#x2F;span&gt;&lt;span&gt;  failed to read `&#x2F;path&#x2F;to&#x2F;modules&#x2F;store&#x2F;Cargo.toml`
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;Caused by:
&lt;&#x2F;span&gt;&lt;span&gt;  No such file or directory (os error 2)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;原因是 &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt; 中的 workspace members 列表包含了 &lt;code&gt;modules&#x2F;store&lt;&#x2F;code&gt; 和 &lt;code&gt;modules&#x2F;merchant&lt;&#x2F;code&gt;，但这些目录实际上不存在。这是由于之前的错误提交导致的。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;jie-jue-fang-an&quot;&gt;解决方案&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#jie-jue-fang-an&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-que-ren-zheng-que-de-ti-jiao&quot;&gt;1. 确认正确的提交&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-que-ren-zheng-que-de-ti-jiao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;首先查看提交历史，找到最后一个正常工作的提交：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --oneline
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;确认目标提交是 &lt;code&gt;14b6cf9&lt;&#x2F;code&gt; (use orm fixed n+1)。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;2-zhong-zhi-fen-zhi&quot;&gt;2. 重置分支&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#2-zhong-zhi-fen-zhi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果当前在 detached HEAD 状态，可以使用以下方法：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 方法一：强制将 main 分支指向当前 HEAD，然后切换到 main
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; branch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -f&lt;&#x2F;span&gt;&lt;span&gt; main HEAD &amp;amp;&amp;amp; &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; checkout main
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 方法二：切换回 main 分支，然后重置到目标提交
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; checkout main
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; reset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --hard&lt;&#x2F;span&gt;&lt;span&gt; 14b6cf9
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;如果已经在 main 分支上：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 直接重置
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; reset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --hard&lt;&#x2F;span&gt;&lt;span&gt; 14b6cf9
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;3-tui-song-dao-yuan-cheng-ke-xuan&quot;&gt;3. 推送到远程（可选）&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#3-tui-song-dao-yuan-cheng-ke-xuan&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果需要更新远程仓库，使用 force push：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; push origin main&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --force
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;&lt;strong&gt;⚠️ 注意&lt;&#x2F;strong&gt;：&lt;code&gt;--force&lt;&#x2F;code&gt; 会覆盖远程历史记录，如果团队中有其他人在使用该分支，请先沟通确认。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;4-yan-zheng&quot;&gt;4. 验证&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-yan-zheng&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 查看当前分支和状态
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; branch&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --show-current
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; status
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 查看最近的提交
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; log&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --oneline -5
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;xiang-guan-zhi-shi&quot;&gt;相关知识&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#xiang-guan-zhi-shi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;git-reset-hard-de-zuo-yong&quot;&gt;git reset --hard 的作用&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#git-reset-hard-de-zuo-yong&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;移动 HEAD 指针到指定提交&lt;&#x2F;li&gt;
&lt;li&gt;重置暂存区（staging area）&lt;&#x2F;li&gt;
&lt;li&gt;重置工作目录（working directory）&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;会丢失所有未提交的更改&lt;&#x2F;strong&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;h3 id=&quot;detached-head-zhuang-tai&quot;&gt;Detached HEAD 状态&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#detached-head-zhuang-tai&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;当你直接 checkout 到某个提交（而不是分支）时，会进入 detached HEAD 状态。此时的修改不属于任何分支，需要创建新分支或切换回已有分支。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;geng-an-quan-de-ti-dai-fang-an&quot;&gt;更安全的替代方案&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#geng-an-quan-de-ti-dai-fang-an&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;如果不想使用 &lt;code&gt;--hard&lt;&#x2F;code&gt;，可以考虑：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建备份分支
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; branch backup-branch
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 使用 revert 撤销提交（保留历史）
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; revert &amp;lt;commit-hash&amp;gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 或使用 reset --soft（保留更改在暂存区）
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; reset&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --soft &lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;commit-hash&amp;gt;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;zong-jie&quot;&gt;总结&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#zong-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;遇到 Cargo workspace 成员缺失的问题时，首先检查 &lt;code&gt;Cargo.toml&lt;&#x2F;code&gt; 中的 members 列表是否与实际目录结构匹配。如果是由错误提交导致的，可以使用 &lt;code&gt;git reset --hard&lt;&#x2F;code&gt; 快速回退到正确的状态。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Tmux 使用指南</title>
        <published>2026-03-06T00:00:00+00:00</published>
        <updated>2026-03-06T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/tmux-guide/"/>
        <id>https://orhan.cn/posts/tmux-guide/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/tmux-guide/">&lt;h2 id=&quot;shen-me-shi-tmux&quot;&gt;什么是 Tmux&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shen-me-shi-tmux&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Tmux (Terminal Multiplexer) 是一个终端复用器，允许你在一个终端窗口中运行多个会话，并且可以在后台保持运行。即使关闭 SSH 连接或终端窗口，tmux 会话也会继续运行。&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ji-ben-cao-zuo&quot;&gt;基本操作&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ji-ben-cao-zuo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;hui-hua-guan-li&quot;&gt;会话管理&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#hui-hua-guan-li&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建新会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建命名会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span&gt; myproject
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 列出所有会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; ls
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 连接到最近的会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; attach
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 连接到指定会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; attach&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -t&lt;&#x2F;span&gt;&lt;span&gt; myproject
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 杀死指定会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; kill-session&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -t&lt;&#x2F;span&gt;&lt;span&gt; myproject
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 杀死所有会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; kill-server
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;fen-chi-he-zhong-lian&quot;&gt;分离和重连&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fen-chi-he-zhong-lian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 在 tmux 会话中按快捷键分离
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; d
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 或使用命令
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; detach
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;chang-yong-kuai-jie-jian&quot;&gt;常用快捷键&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chang-yong-kuai-jie-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;所有 tmux 快捷键都以 &lt;code&gt;Ctrl+b&lt;&#x2F;code&gt; 作为前缀（按下后松开，再按功能键）。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;qian-zhui-jian&quot;&gt;前缀键&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#qian-zhui-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;主前缀键&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;次前缀键&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;GNU-Screen 兼容&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;hui-hua-guan-li-1&quot;&gt;会话管理&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#hui-hua-guan-li-1&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;分离会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix d&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix d&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;列出会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix s&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix s&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;重命名会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix $&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix $&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;新建会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix :new&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+c&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更快捷&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;查找会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix s&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+f&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;命令提示查找&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;切换上一会话&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix L&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Shift+Tab&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;chuang-kou-guan-li&quot;&gt;窗口管理&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chuang-kou-guan-li&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;创建窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix c&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix c&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;重命名窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ,&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ,&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;列出窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix w&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix w&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;关闭窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix &amp;amp;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix &amp;amp;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;切换窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix 0-9&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix 0-9&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;下一个窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix n&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;上一个窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix p&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+h&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;最后活动窗口&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Tab&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更快捷&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;mian-ban-cao-zuo&quot;&gt;面板操作&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#mian-ban-cao-zuo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;垂直分割&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix %&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix _&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;水平分割&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix &quot;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix -&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;关闭面板&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix x&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix x&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;切换面板&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix o&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix o&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;最大化面板&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix z&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix +&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;自定义脚本&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向左移动&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ←&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix h&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向下移动&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ↓&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix j&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向上移动&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ↑&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix k&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向右移动&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix →&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 风格&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向左调整&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+←&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix H&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 大写&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向下调整&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+↓&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix J&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 大写&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向上调整&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+↑&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix K&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 大写&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;向右调整&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Ctrl+→&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix L&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vim 大写&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;交换面板(下)&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix {&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix &amp;gt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;交换面板(上)&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix }&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix &amp;lt;&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;fu-zhi-mo-shi&quot;&gt;复制模式&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fu-zhi-mo-shi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;进入复制模式&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix [&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix Enter&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更快捷&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;开始选择&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Space&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;v&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;矩形选择&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+v&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;复制选择&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Enter&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;y&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;取消&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;q&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Escape&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;行首&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;0&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;H&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;行尾&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;$&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;L&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;Vi 模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;粘贴&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ]&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix p&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;huan-chong-qu-guan-li&quot;&gt;缓冲区管理&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#huan-chong-qu-guan-li&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;列出缓冲区&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix #&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix b&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;粘贴缓冲区&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ]&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix p&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;选择缓冲区&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix =&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix P&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;更直观&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;h3 id=&quot;qi-ta-cao-zuo&quot;&gt;其他操作&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#qi-ta-cao-zuo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;功能&lt;&#x2F;th&gt;&lt;th&gt;默认快捷键&lt;&#x2F;th&gt;&lt;th&gt;优化配置&lt;&#x2F;th&gt;&lt;th&gt;说明&lt;&#x2F;th&gt;&lt;&#x2F;tr&gt;&lt;&#x2F;thead&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td&gt;显示快捷键&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ?&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix ?&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;显示时钟&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix t&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix t&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;保持默认&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;重载配置&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix :source-file&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix r&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;快速重载&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;编辑配置&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix e&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;打开编辑器&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;清屏+历史&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;Ctrl+l&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;增强清屏&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;鼠标切换&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix m&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;切换鼠标模式&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;URL 查看&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix U&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;urlview 集成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;tr&gt;&lt;td&gt;文件选择器&lt;&#x2F;td&gt;&lt;td&gt;无&lt;&#x2F;td&gt;&lt;td&gt;&lt;code&gt;prefix F&lt;&#x2F;code&gt;&lt;&#x2F;td&gt;&lt;td&gt;fpp 集成&lt;&#x2F;td&gt;&lt;&#x2F;tr&gt;
&lt;&#x2F;tbody&gt;&lt;&#x2F;table&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;配置说明&lt;&#x2F;strong&gt;：优化配置基于 &lt;a href=&quot;https:&#x2F;&#x2F;github.com&#x2F;gpakosz&#x2F;.tmux&quot;&gt;gpakosz&#x2F;.tmux&lt;&#x2F;a&gt;，采用 Vim 风格导航，提供更直观的快捷键和增强功能。&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;h2 id=&quot;chang-yong-chang-jing&quot;&gt;常用场景&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chang-yong-chang-jing&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-yun-xing-chang-qi-fu-wu&quot;&gt;1. 运行长期服务&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-yun-xing-chang-qi-fu-wu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建会话并启动开发服务器
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span&gt; dev
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;npm&lt;&#x2F;span&gt;&lt;span&gt; run dev
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 按 Ctrl+b d 分离会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 关闭终端窗口，服务继续运行
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 稍后重连
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; attach&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -t&lt;&#x2F;span&gt;&lt;span&gt; dev
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;2-ssh-yuan-cheng-gong-zuo&quot;&gt;2. SSH 远程工作&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#2-ssh-yuan-cheng-gong-zuo&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# SSH 连接到服务器
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;ssh&lt;&#x2F;span&gt;&lt;span&gt; user@server
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建或连接到 tmux 会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; attach || &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span&gt; work
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 即使 SSH 断开，工作也不会丢失
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;3-duo-ren-wu-bing-xing&quot;&gt;3. 多任务并行&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#3-duo-ren-wu-bing-xing&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建会话
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; new&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; -s&lt;&#x2F;span&gt;&lt;span&gt; multi
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 创建多个窗口
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; c  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 窗口1: 编辑器
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; c  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 窗口2: 服务器
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; c  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 窗口3: 日志监控
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 在窗口间快速切换
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; 0  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 切换到窗口0
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; 1  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 切换到窗口1
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;pei-zhi-wen-jian&quot;&gt;配置文件&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#pei-zhi-wen-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;创建 &lt;code&gt;~&#x2F;.tmux.conf&lt;&#x2F;code&gt; 自定义配置：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 修改前缀键为 Ctrl+a（可选）
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# set -g prefix C-a
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# unbind C-b
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# bind C-a send-prefix
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 启用鼠标支持
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; -g mouse on
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 设置窗口和面板索引从 1 开始
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; -g base-index 1
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;setw -g&lt;&#x2F;span&gt;&lt;span&gt; pane-base-index 1
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 增加历史记录行数
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; -g history-limit 10000
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 快速重载配置
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span&gt; r source-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.tmux.conf &lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;\;&lt;&#x2F;span&gt;&lt;span&gt; display &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;Config reloaded!&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 更直观的分割快捷键
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;bind &lt;&#x2F;span&gt;&lt;span&gt;| &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;split-window -h
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;bind&lt;&#x2F;span&gt;&lt;span&gt; - split-window -v
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重载配置：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;tmux&lt;&#x2F;span&gt;&lt;span&gt; source-file &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.tmux.conf
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;jin-jie-ji-qiao&quot;&gt;进阶技巧&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#jin-jie-ji-qiao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;fu-zhi-mo-shi-1&quot;&gt;复制模式&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fu-zhi-mo-shi-1&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 进入复制模式
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; [
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 使用 vi 风格导航
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;h,&lt;&#x2F;span&gt;&lt;span&gt; j, k, l  &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 移动光标
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Space       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 开始选择
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Enter       &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 复制选中内容
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;q           &lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 退出复制模式
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 粘贴
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; ]
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;tong-bu-mian-ban-shu-ru&quot;&gt;同步面板输入&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#tong-bu-mian-ban-shu-ru&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 在命令模式中启用
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;Ctrl+b&lt;&#x2F;span&gt;&lt;span&gt; :
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;setw&lt;&#x2F;span&gt;&lt;span&gt; synchronize-panes on
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 关闭
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;setw&lt;&#x2F;span&gt;&lt;span&gt; synchronize-panes off
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;bao-cun-hui-hua-bu-ju&quot;&gt;保存会话布局&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#bao-cun-hui-hua-bu-ju&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;使用 tmux-resurrect 插件可以保存和恢复会话：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 安装 TPM (Tmux Plugin Manager)
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;git&lt;&#x2F;span&gt;&lt;span&gt; clone https:&#x2F;&#x2F;github.com&#x2F;tmux-plugins&#x2F;tpm &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;~&lt;&#x2F;span&gt;&lt;span&gt;&#x2F;.tmux&#x2F;plugins&#x2F;tpm
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 在 ~&#x2F;.tmux.conf 中添加
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; -g @plugin &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tmux-plugins&#x2F;tpm&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#96b5b4;&quot;&gt;set&lt;&#x2F;span&gt;&lt;span&gt; -g @plugin &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;tmux-plugins&#x2F;tmux-resurrect&lt;&#x2F;span&gt;&lt;span&gt;&amp;#39;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# 重载配置并安装插件
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# Ctrl+b I (大写 I)
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h2 id=&quot;zong-jie&quot;&gt;总结&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#zong-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;p&gt;Tmux 的核心优势：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;会话持久化：关闭终端不影响运行&lt;&#x2F;li&gt;
&lt;li&gt;多窗口管理：一个终端运行多个任务&lt;&#x2F;li&gt;
&lt;li&gt;面板分割：同时查看多个输出&lt;&#x2F;li&gt;
&lt;li&gt;远程工作：SSH 断开后可恢复&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;记住最重要的三个命令：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;tmux new -s name&lt;&#x2F;code&gt; - 创建会话&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;Ctrl+b d&lt;&#x2F;code&gt; - 分离会话&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;tmux attach -t name&lt;&#x2F;code&gt; - 重连会话&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>自由时间</title>
        <published>2025-11-12T00:00:00+00:00</published>
        <updated>2025-11-12T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/free-time/"/>
        <id>https://orhan.cn/posts/free-time/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/free-time/">&lt;p&gt;今天在B站看到了关于Rust的好多视频教程，包括算法和高级用法，架构等。因为上班时间，先收藏起来了。如果想实现财务自由，那就有必要掌握时间。因为最近玩游戏时间有点长了，影响我的自由探索。&lt;&#x2F;p&gt;
&lt;p&gt;已经10天了，每天坚持多邻国，学习英文。发现自己跟朋友一起做事儿或者有人敦促，效率比较好，一旦没了目标或者自己，有些沉迷于游戏了。&lt;&#x2F;p&gt;
&lt;p&gt;所以好好想一下如果有足够的时间或者财富，我要干啥：&lt;&#x2F;p&gt;
&lt;h3 id=&quot;fu-mu&quot;&gt;父母&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#fu-mu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;最近听到一句话“人的成功速度要快于父母的老龄化速度”，父母把我养大，这都32岁了，还没给父母做点什么？买个衣服，带他们取旅游，又或者给他们洗牙，陪伴或者帮忙等。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;lao-po-hai-zi&quot;&gt;老婆孩子&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#lao-po-hai-zi&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;老婆孩子也是，总跟我吃苦。虽然生活还可以，但也没有一起旅游，或者吃大餐。结婚四年多，才看过一次电影。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;jie-jie&quot;&gt;姐姐&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#jie-jie&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;我应该帮忙孩子们的学习，他们成绩总是不如意事。只要啃下功夫，我有信心能教导他们。&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ji-shu&quot;&gt;技术&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ji-shu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;...&lt;&#x2F;p&gt;
&lt;h3 id=&quot;chuang-ye&quot;&gt;创业&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#chuang-ye&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;p&gt;...&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>IOS app发布更新</title>
        <published>2025-11-11T00:00:00+00:00</published>
        <updated>2025-11-11T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/ios-app-update/"/>
        <id>https://orhan.cn/posts/ios-app-update/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/ios-app-update/">&lt;h2 id=&quot;qian-ji-tian-xin-da-bao-ios-app-da-suan-ti-jiao-yi-xia-shen-he-jie-guo-deng-cuo-zhang-hao-liao-zhao-bu-zhao-ru-kou-hou-lai-cai-fa-xian-deng-cuo-zhang-hao-li-you-dian-ke-xiao&quot;&gt;前几天新打包iOS app，打算提交一下审核。结果登错账号了，找不着入口。后来才发现等错账号里，有点可笑。&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#qian-ji-tian-xin-da-bao-ios-app-da-suan-ti-jiao-yi-xia-shen-he-jie-guo-deng-cuo-zhang-hao-liao-zhao-bu-zhao-ru-kou-hou-lai-cai-fa-xian-deng-cuo-zhang-hao-li-you-dian-ke-xiao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;shou-xian-xu-yao-da-bao&quot;&gt;首先需要打包&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#shou-xian-xu-yao-da-bao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;打包时版本号必须更新，要不然又得重新打包一次，浪费时间&lt;&#x2F;li&gt;
&lt;li&gt;在appstore的https:&#x2F;&#x2F;appstoreconnect.apple.com&#x2F;apps 页面新建版本，然后通过Tranporter软件（苹果自家的）上传我们打包好的新版本。&lt;&#x2F;li&gt;
&lt;li&gt;创建新版本页面选择我们上传的版本，填写更新信息后就可以提交审核了。&lt;&#x2F;li&gt;
&lt;li&gt;审核信息在手机上通过Connnet app可以查看。我选择得是审核通过后自动发布。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>psql: error: connection to server on socket &#x2F;tmp&#x2F;.s.PGSQL.5432 原因及修复方法</title>
        <published>2025-10-27T00:00:00+00:00</published>
        <updated>2025-10-27T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/psql-error-connection-to-server-on-socket/"/>
        <id>https://orhan.cn/posts/psql-error-connection-to-server-on-socket/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/psql-error-connection-to-server-on-socket/">&lt;p&gt;MacOS 上brew安装的PostgreSQL有时候就报&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;psql:&lt;&#x2F;span&gt;&lt;span&gt; error: connection to server on socket &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;&#x2F;tmp&#x2F;.s.PGSQL.5432&lt;&#x2F;span&gt;&lt;span&gt;&amp;quot; failed: No such file or directory 	Is the server running locally and accepting connections on that socket?
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;重启也没能解决，后来找了以后，找到原因了。&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;postmaster.pid&lt;&#x2F;span&gt;&lt;span&gt; already exists
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;上一次异常退出，pid 文件没清。
清理办法：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;rm -f&lt;&#x2F;span&gt;&lt;span&gt; &#x2F;opt&#x2F;homebrew&#x2F;var&#x2F;postgresql@17&#x2F;postmaster.pid
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;后面启动就行&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;brew&lt;&#x2F;span&gt;&lt;span&gt; services restart postgresql@17
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;就是一次问题的记录，希望对你有帮助！&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Rust Best Crates</title>
        <published>2025-09-23T00:00:00+00:00</published>
        <updated>2025-09-23T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/best-crates/"/>
        <id>https://orhan.cn/posts/best-crates/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/best-crates/">&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;pgrx&quot;&gt;Build Postgres Extensions with Rust!&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;mry&quot;&gt;Mry A simple but powerful mocking library for structs, traits, and function.&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;rumqttc&quot;&gt;rumqttc&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a href=&quot;https:&#x2F;&#x2F;crates.io&#x2F;crates&#x2F;postgrest&quot;&gt;postgrest&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>一次nginx配置经历</title>
        <published>2025-09-17T00:00:00+00:00</published>
        <updated>2025-09-17T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/nginx/"/>
        <id>https://orhan.cn/posts/nginx/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/nginx/">&lt;p&gt;做题记录了新服务器postgres的安装及访问相关的问题及解决方案。
昨天晚上遇到api接口及前端没发访问的问题。
解决方案：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;首先需要开通443及80等端口（ubuntu默认是不开启状态）&lt;&#x2F;li&gt;
&lt;li&gt;因为项目前后端及API都在一个域名+二级目录部署，所以我再把nginx配置也加到下面。&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;nginx.conf&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-nginx.conf &quot;&gt;&lt;code class=&quot;language-nginx.conf&quot; data-lang=&quot;nginx.conf&quot;&gt;&lt;span&gt;server {
&lt;&#x2F;span&gt;&lt;span&gt;      listen       443 ssl;
&lt;&#x2F;span&gt;&lt;span&gt;      server_name  aa.com;
&lt;&#x2F;span&gt;&lt;span&gt;      ssl_certificate &amp;quot;&#x2F;root&#x2F;cert&#x2F;aa.com.pem&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;      ssl_certificate_key &amp;quot;&#x2F;root&#x2F;cert&#x2F;aa.com.key&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;      # 新增：健康检查接口代理
&lt;&#x2F;span&gt;&lt;span&gt;    location &#x2F;health {
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_pass http:&#x2F;&#x2F;localhost:3000&#x2F;health;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header Host $host;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Real-IP $remote_addr;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Forwarded-Proto $scheme;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;# 新增：健康检查接口代理
&lt;&#x2F;span&gt;&lt;span&gt;    location &#x2F;scalar {
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_pass http:&#x2F;&#x2F;localhost:3000&#x2F;scalar ;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header Host $host;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Real-IP $remote_addr;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;&#x2F;span&gt;&lt;span&gt;        proxy_set_header X-Forwarded-Proto $scheme;
&lt;&#x2F;span&gt;&lt;span&gt;    }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      # 全局API代理
&lt;&#x2F;span&gt;&lt;span&gt;      location ^~ &#x2F;api&#x2F; {
&lt;&#x2F;span&gt;&lt;span&gt;          client_max_body_size 20m;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_pass http:&#x2F;&#x2F;localhost:3000;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header Host $host;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Real-IP $remote_addr;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Forwarded-Proto $scheme;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      # admin页面的API代理
&lt;&#x2F;span&gt;&lt;span&gt;      location ^~ &#x2F;dev&#x2F;api&#x2F; {
&lt;&#x2F;span&gt;&lt;span&gt;          client_max_body_size 20m;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_pass http:&#x2F;&#x2F;localhost:3000&#x2F;api&#x2F;;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header Host $host;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Real-IP $remote_addr;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
&lt;&#x2F;span&gt;&lt;span&gt;          proxy_set_header X-Forwarded-Proto $scheme;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      # admin页面静态文件
&lt;&#x2F;span&gt;&lt;span&gt;      location &#x2F;dev {
&lt;&#x2F;span&gt;&lt;span&gt;          alias &#x2F;var&#x2F;www&#x2F;aa&#x2F;dev;
&lt;&#x2F;span&gt;&lt;span&gt;          index index.html;
&lt;&#x2F;span&gt;&lt;span&gt;          try_files $uri $uri&#x2F; &#x2F;dev&#x2F;index.html;
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;          # 静态资源缓存
&lt;&#x2F;span&gt;&lt;span&gt;          location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ {
&lt;&#x2F;span&gt;&lt;span&gt;              expires 1y;
&lt;&#x2F;span&gt;&lt;span&gt;              add_header Cache-Control &amp;quot;public, immutable&amp;quot;;
&lt;&#x2F;span&gt;&lt;span&gt;          }
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      # 主页面
&lt;&#x2F;span&gt;&lt;span&gt;      location &#x2F; {
&lt;&#x2F;span&gt;&lt;span&gt;          root &#x2F;var&#x2F;www&#x2F;aa&#x2F;;
&lt;&#x2F;span&gt;&lt;span&gt;          try_files $uri $uri&#x2F; &#x2F;index.html;
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      error_page 404 &#x2F;404.html;
&lt;&#x2F;span&gt;&lt;span&gt;      location = &#x2F;40x.html {
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;      error_page 500 502 503 504 &#x2F;50x.html;
&lt;&#x2F;span&gt;&lt;span&gt;      location = &#x2F;50x.html {
&lt;&#x2F;span&gt;&lt;span&gt;      }
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;  server {
&lt;&#x2F;span&gt;&lt;span&gt;      listen 80;
&lt;&#x2F;span&gt;&lt;span&gt;      server_name aa.com;
&lt;&#x2F;span&gt;&lt;span&gt;      root &#x2F;var&#x2F;www&#x2F;aa;
&lt;&#x2F;span&gt;&lt;span&gt;      rewrite ^(.*) https:&#x2F;&#x2F;$server_name$1 permanent;
&lt;&#x2F;span&gt;&lt;span&gt;  }
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>IOS正式打包证书创建</title>
        <published>2025-09-16T00:00:00+00:00</published>
        <updated>2025-09-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/ios-develop/"/>
        <id>https://orhan.cn/posts/ios-develop/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/ios-develop/">&lt;h2 id=&quot;ru-he-jiang-ios-sheng-chan-zheng-shu-cer-zhuan-huan-wei-p12-wen-jian-bing-chuang-jian-miao-shu-wen-jian&quot;&gt;如何将 iOS 生产证书（.cer）转换为 .p12 文件并创建描述文件&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ru-he-jiang-ios-sheng-chan-zheng-shu-cer-zhuan-huan-wei-p12-wen-jian-bing-chuang-jian-miao-shu-wen-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h2&gt;
&lt;h3 id=&quot;1-zhuan-huan-cer-wen-jian-wei-p12-wen-jian&quot;&gt;1. 转换 &lt;code&gt;.cer&lt;&#x2F;code&gt; 文件为 &lt;code&gt;.p12&lt;&#x2F;code&gt; 文件&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#1-zhuan-huan-cer-wen-jian-wei-p12-wen-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;打开钥匙串访问&lt;&#x2F;strong&gt;
在 Mac 电脑上，通过 “聚焦搜索”（通常是按下 &lt;code&gt;Command + 空格&lt;&#x2F;code&gt;）输入 “钥匙串访问”，然后打开该应用程序。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;导入 &lt;code&gt;.cer&lt;&#x2F;code&gt; 证书&lt;&#x2F;strong&gt;
双击下载好的 &lt;code&gt;ios_distribution.cer&lt;&#x2F;code&gt; 文件，系统会自动将其导入到钥匙串访问中。
你可以在钥匙串访问的 &lt;strong&gt;证书&lt;&#x2F;strong&gt; 类别中找到它，证书名称通常类似于 &lt;code&gt;iPhone Distribution&lt;&#x2F;code&gt;。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;导出为 &lt;code&gt;.p12&lt;&#x2F;code&gt; 文件&lt;&#x2F;strong&gt;
在钥匙串访问中，找到刚才导入的 &lt;code&gt;iPhone Distribution&lt;&#x2F;code&gt; 证书。
右键点击该证书，选择 &lt;strong&gt;“导出”&lt;&#x2F;strong&gt; 选项。
在弹出的保存对话框中，选择 &lt;strong&gt;个人信息交换（.p12）&lt;&#x2F;strong&gt; 作为文件格式。
选择一个合适的保存位置，并设置一个密码来保护这个 &lt;code&gt;.p12&lt;&#x2F;code&gt; 文件。
请务必记住这个密码，因为在后续打包过程中会用到。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;2-chuang-jian-miao-shu-wen-jian-provisioning-profile&quot;&gt;2. 创建描述文件（Provisioning Profile）&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#2-chuang-jian-miao-shu-wen-jian-provisioning-profile&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;登录苹果开发者官网&lt;&#x2F;strong&gt;
进入 &lt;a href=&quot;https:&#x2F;&#x2F;developer.apple.com&quot;&gt;Apple Developer&lt;&#x2F;a&gt; 官网。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;创建新的描述文件&lt;&#x2F;strong&gt;
进入 &lt;strong&gt;Certificates, Identifiers &amp;amp; Profiles&lt;&#x2F;strong&gt; 页面。
在左侧导航栏中选择 &lt;strong&gt;Profiles&lt;&#x2F;strong&gt;，然后点击右上角的 &lt;strong&gt;+&lt;&#x2F;strong&gt; 号创建一个新的描述文件。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择 Distribution 类型&lt;&#x2F;strong&gt;
在新建描述文件页面，选择 &lt;strong&gt;Distribution&lt;&#x2F;strong&gt; 类型，例如 &lt;strong&gt;App Store Connect&lt;&#x2F;strong&gt;，然后点击 &lt;strong&gt;继续&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;选择 App ID&lt;&#x2F;strong&gt;
选择之前创建好的 &lt;strong&gt;App ID&lt;&#x2F;strong&gt;，然后点击 &lt;strong&gt;下一步&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;完成描述文件创建&lt;&#x2F;strong&gt;
根据提示完成描述文件的创建，并下载该描述文件（文件扩展名为 &lt;code&gt;.mobileprovision&lt;&#x2F;code&gt;）。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;3-pei-zhi-hbuilder-jin-xing-da-bao&quot;&gt;3. 配置 HBuilder 进行打包&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#3-pei-zhi-hbuilder-jin-xing-da-bao&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;打开 &lt;strong&gt;HBuilderX&lt;&#x2F;strong&gt; 项目，进入 &lt;strong&gt;发行 → 原生 App - 云打包&lt;&#x2F;strong&gt;。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;在 &lt;strong&gt;iOS 打包设置&lt;&#x2F;strong&gt; 中：&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;证书类型选择 &lt;strong&gt;生产证书&lt;&#x2F;strong&gt;。&lt;&#x2F;li&gt;
&lt;li&gt;上传刚申请的 &lt;code&gt;.p12&lt;&#x2F;code&gt; 证书文件以及密码。&lt;&#x2F;li&gt;
&lt;li&gt;选择对应的 &lt;strong&gt;生产环境描述文件（.mobileprovision）&lt;&#x2F;strong&gt;。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;确认其他配置（如 App ID、版本号等）正确后，开始打包。&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;4-zhu-yi-shi-xiang&quot;&gt;4. 注意事项&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#4-zhu-yi-shi-xiang&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;开发证书&lt;&#x2F;strong&gt;（iPhone Developer）仅用于测试，只能安装到添加了 UDID 的测试设备。&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;生产证书&lt;&#x2F;strong&gt;（iPhone Distribution）用于 App Store 上架，打包后生成的 ipa 文件可通过 Transporter 提交审核。&lt;&#x2F;li&gt;
&lt;li&gt;确保证书和描述文件未过期，且与你的 App ID 匹配。&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;完成以上步骤后，你就可以生成并提交 ipa 文件到 App Store 进行审核。&lt;&#x2F;p&gt;
&lt;p&gt;https:&#x2F;&#x2F;www.bilibili.com&#x2F;video&#x2F;BV1jk4y1S7HZ&#x2F;?spm_id_from=333.1387.favlist.content.click&amp;amp;vd_source=0308c0d7b24cc0f488bdf0157f88f36a
苹果开发者证书如何导出的？后面还需要导出描述文件，证书和描述文件是对应的。选择可靠的证书签名可以实现很多功能。&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Postgres数据库的peer认证方式下API进行数据库操作</title>
        <published>2025-09-16T00:00:00+00:00</published>
        <updated>2025-09-16T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/postgres-feer-auth-and-api/"/>
        <id>https://orhan.cn/posts/postgres-feer-auth-and-api/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/postgres-feer-auth-and-api/">&lt;p&gt;AI建议&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;对于Web API系统，建议使用密码认证（md5或scram-sha-256）而不是peer认证，因为：
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;配置更简单 - 无需复杂的用户名映射
&lt;&#x2F;span&gt;&lt;span&gt;更灵活 - 支持远程连接和容器化部署
&lt;&#x2F;span&gt;&lt;span&gt;更适合API场景 - Web API通常不需要peer认证提供的操作系统级别的身份验证
&lt;&#x2F;span&gt;&lt;span&gt;peer认证更适合于系统管理员直接访问数据库的场景，而不是Web API应用程序。
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;但是我就想试一下peer认证方式的可行性。结果跟AI聊了半天才解决了这个问题，下面记录一下步骤：&lt;&#x2F;p&gt;
&lt;ol&gt;
&lt;li&gt;首先保证用table plus等数据库管理软件能够登录正常（这个是之前就配置好的，所有没有记录）&lt;&#x2F;li&gt;
&lt;li&gt;修个数据库的 pg_hba.conf 文件，在 pg_hba.conf 文件中，对于 local 连接类型（Unix domain socket），您需要在认证方法后面添加 map=your_map_name 选项。 client-auth.sgml:150&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;p&gt;正确的配置格式&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;local &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;database user peer map&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;your_map_name  
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;这里：
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#b48ead;&quot;&gt;local &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;表示使用 Unix domain socket 连接 client-auth.sgml:172-174
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt; 表示所有数据库
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;all&lt;&#x2F;span&gt;&lt;span&gt; 表示所有用户
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;peer&lt;&#x2F;span&gt;&lt;span&gt; 是认证方法
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;map&lt;&#x2F;span&gt;&lt;span&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color:#a3be8c;&quot;&gt;mypeermap &lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;指定使用名为&lt;&#x2F;span&gt;&lt;span&gt; mypeermap 的用户名映射
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;用户名映射配置
相应地，您需要在 pg_ident.conf 文件中定义这个映射：&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;pre data-lang=&quot;sh&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-sh &quot;&gt;&lt;code class=&quot;language-sh&quot; data-lang=&quot;sh&quot;&gt;&lt;span style=&quot;color:#65737e;&quot;&gt;# MAPNAME  SYSTEM-USERNAME  DATABASE-USERNAME  
&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;mypeermap&lt;&#x2F;span&gt;&lt;span&gt;  your_system_user  your_db_user
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;当我运行migrate时报错
您遇到的是PostgreSQL schema权限问题。当使用peer认证时，您的API用户缺少对public schema的必要权限来执行migration操作
这个错误表明您的数据库用户（通过peer认证映射的用户）没有在public schema中创建对象的权限。
在PostgreSQL 15及更高版本中，默认情况下已经撤销了public schema的CREATE权限，这是为了提高安全性。&lt;&#x2F;p&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;调试步骤
&lt;&#x2F;span&gt;&lt;span&gt;确认当前连接用户：
&lt;&#x2F;span&gt;&lt;span&gt;SELECT current_user, session_user, system_user;
&lt;&#x2F;span&gt;&lt;span&gt;检查该用户的schema权限：
&lt;&#x2F;span&gt;&lt;span&gt;SELECT has_schema_privilege(current_user, &amp;#39;public&amp;#39;, &amp;#39;CREATE&amp;#39;);  
&lt;&#x2F;span&gt;&lt;span&gt;SELECT has_schema_privilege(current_user, &amp;#39;public&amp;#39;, &amp;#39;USAGE&amp;#39;);
&lt;&#x2F;span&gt;&lt;span&gt;如果权限检查返回false，为实际用户授权：
&lt;&#x2F;span&gt;&lt;span&gt;GRANT CREATE ON SCHEMA public TO &amp;lt;actual_user&amp;gt;;  
&lt;&#x2F;span&gt;&lt;span&gt;GRANT USAGE ON SCHEMA public TO &amp;lt;actual_user&amp;gt;;
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>项目架构</title>
        <published>2025-08-25T00:00:00+00:00</published>
        <updated>2025-08-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/project-structure/"/>
        <id>https://orhan.cn/posts/project-structure/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/project-structure/">&lt;ol&gt;
&lt;li&gt;代码规范（命名规范, 代码风格，命名风格规定好。驼峰，snake等）&lt;&#x2F;li&gt;
&lt;li&gt;框架规范 （使用那些技术，那些框架，crate 或者node module）&lt;&#x2F;li&gt;
&lt;li&gt;先实现基础框架，然后叠加扩展&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
&lt;h3 id=&quot;ji-chu-kuang-jia-da-jian&quot;&gt;基础框架搭建：&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#ji-chu-kuang-jia-da-jian&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;我们首先把基础框架搭好，然后横向扩展，健壮稳步前进，再大的项目也先拆分好小的模块，然后一步步实现就行
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;公共模块实现：
&lt;&#x2F;span&gt;&lt;span&gt;    1. 分类
&lt;&#x2F;span&gt;&lt;span&gt;    2. 标签
&lt;&#x2F;span&gt;&lt;span&gt;    3. 文章
&lt;&#x2F;span&gt;&lt;span&gt;    4. 消息通知（短信，小程序，公众号，邮件，app内等）
&lt;&#x2F;span&gt;&lt;span&gt;    5. 付款：微信支付，公众号，app支付，支付宝支付。退款，分账，提现
&lt;&#x2F;span&gt;&lt;span&gt;    6. 物流查询
&lt;&#x2F;span&gt;&lt;span&gt;    7. 订单管理
&lt;&#x2F;span&gt;&lt;span&gt;    8. 海报生成
&lt;&#x2F;span&gt;&lt;span&gt;    9. 推广方案
&lt;&#x2F;span&gt;&lt;span&gt;    10. 客服
&lt;&#x2F;span&gt;&lt;span&gt;    11. 用户行为
&lt;&#x2F;span&gt;&lt;span&gt;    12. 统计
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;h3 id=&quot;api-xiang-mu&quot;&gt;api 项目：&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#api-xiang-mu&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ol&gt;
&lt;li&gt;资源访问类型：管理员，公开，自己，带token公开查看&lt;&#x2F;li&gt;
&lt;li&gt;返回类型，请求类型统一化&lt;&#x2F;li&gt;
&lt;li&gt;先计划，再实现&lt;&#x2F;li&gt;
&lt;li&gt;即使提交代码到git仓库，完整留痕&lt;&#x2F;li&gt;
&lt;li&gt;每加一个模块即使写API文档+代码测试&lt;&#x2F;li&gt;
&lt;li&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ol&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Velopack: 桌面应用打包分发框架</title>
        <published>2025-05-13T00:00:00+00:00</published>
        <updated>2025-05-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/velopack/"/>
        <id>https://orhan.cn/posts/velopack/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/velopack/">&lt;p&gt;做桌面应用的，还在和打包工具较劲？试试 &lt;a href=&quot;https:&#x2F;&#x2F;velopack.io&quot;&gt;Velopack&lt;&#x2F;a&gt;。&lt;&#x2F;p&gt;
&lt;p&gt;用 Rust 写的，性能比 Squirrel 快很多。支持 Windows&#x2F;macOS&#x2F;Linux，一条命令生成安装包+增量更新包+便携版：&lt;&#x2F;p&gt;
&lt;pre data-lang=&quot;bash&quot; style=&quot;background-color:#2b303b;color:#c0c5ce;&quot; class=&quot;language-bash &quot;&gt;&lt;code class=&quot;language-bash&quot; data-lang=&quot;bash&quot;&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt;vpk&lt;&#x2F;span&gt;&lt;span&gt; pack&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --packId&lt;&#x2F;span&gt;&lt;span&gt; MyApp&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --packVersion&lt;&#x2F;span&gt;&lt;span&gt; 1.0.0&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --packDir&lt;&#x2F;span&gt;&lt;span&gt; publish&lt;&#x2F;span&gt;&lt;span style=&quot;color:#bf616a;&quot;&gt; --mainExe&lt;&#x2F;span&gt;&lt;span&gt; MyApp.exe
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;增量更新是亮点——500MB 的应用改几行代码，更新包可能只有几百 KB。用户不需要每次下载完整包。&lt;&#x2F;p&gt;
&lt;p&gt;10 行代码接入自动更新 SDK（C#、C++、JS、Rust、Python 都支持），自动处理更新检查+下载+安装+重启。&lt;&#x2F;p&gt;
&lt;p&gt;从 Squirrel 迁移过来很顺滑，自动检测旧安装结构，已有用户无感知切换。&lt;&#x2F;p&gt;
&lt;p&gt;GitHub: https:&#x2F;&#x2F;github.com&#x2F;velopack&#x2F;velopack&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>巩固rust</title>
        <published>2024-11-25T00:00:00+00:00</published>
        <updated>2024-11-25T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/rust-01/"/>
        <id>https://orhan.cn/posts/rust-01/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/rust-01/">&lt;p&gt;rust&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>抓娃娃</title>
        <published>2024-10-09T00:00:00+00:00</published>
        <updated>2024-10-09T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/movie/"/>
        <id>https://orhan.cn/posts/movie/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/movie/">&lt;p&gt;一对夫妇培养大儿子失败了,原因很简单,就是因为他们太有钱了.
虽然说有钱,但是父亲童年也很艰苦,也是通过自身努力整来的钱. 所以他想到孩子懂事儿之前搬到自己长大的一个老院子住.装成穷家,陪孩子体验没钱的日子. 但是呢,这不仅仅是体验,他们还是使用了超能力,母亲不用做饭,打扫卫生,洗衣服等. 不仅仅是一家人,他们还带了一个差不多20人的团队. 孩子的一举一动他们都实时监控.甚至孩子上下学也有两个人专门盯着. 因为家离学校刚好5公里,孩子每天跑着去上学, 他们使用一切手段教育孩子.英语,数学,物理都是专业老师在日常生活中使用不同的方法叫他.甚至睡前也有专门的音乐老师给他弹琴.&lt;&#x2F;p&gt;
&lt;p&gt;孩子也很努力,但是无法拒绝环境的诱惑. 当父亲把家里的钱交给孩子管的时候,他第一个去买了个平板电脑,还藏着厕所玩.
他们不惜任何代价为孩子提供一个良好的环境和锤炼的机会.其中因为拆穿,孩子奶奶演一场假死.虽然表达附带幽默,但我也看哭了. 父亲希望孩子好好学校,考上清北,继承自己的事业.虽然开头为了综合教育孩子,手段独特,但是后来太专注清北,有点可以的样子.&lt;&#x2F;p&gt;
&lt;p&gt;结果孩子发现一些端倪,高考那天发现全部. 孩子大哭一场,无法接受现实.甚至怀疑起自己的父母. 最后他打算以后的路自己来走.&lt;&#x2F;p&gt;
&lt;p&gt;这个电影有些类似“楚门的世界”,但是从不同角度让人思考.
比如同样是父母,我们为孩子做了些什么?
在家里,我们是不是自己为孩子做榜样,从自身做起.
如何教育孩子?
电影中的父母做得对不对,是否属于骗人?如果是我,我会怎么做?
如果我是电影中的马继业,又回怎么做?
如果我是孩子的爷爷奶奶会如何选择? 等等一系列问题.&lt;&#x2F;p&gt;
&lt;p&gt;电影节奏不快,全场然人舒服的看完.看完后获得感也不错.&lt;&#x2F;p&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Helix Search All</title>
        <published>2024-10-05T00:00:00+00:00</published>
        <updated>2024-10-05T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/helix-search/"/>
        <id>https://orhan.cn/posts/helix-search/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/helix-search/">&lt;h3 id=&quot;action-steps&quot;&gt;action steps&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#action-steps&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;Shift+%&lt;&#x2F;code&gt; select all&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;&#x2F;&lt;&#x2F;code&gt; start search&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;input search words&lt;&#x2F;code&gt; press v and press n to select next word&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</content>
        
    </entry>
    <entry xml:lang="en">
        <title>Helix Jumplist</title>
        <published>2024-08-13T00:00:00+00:00</published>
        <updated>2024-08-13T00:00:00+00:00</updated>
        
        <author>
          <name>
            
              menzil
            
          </name>
        </author>
        
        <link rel="alternate" type="text/html" href="https://orhan.cn/posts/helix-jumlist/"/>
        <id>https://orhan.cn/posts/helix-jumlist/</id>
        
        <content type="html" xml:base="https://orhan.cn/posts/helix-jumlist/">&lt;h3 id=&quot;action-steps&quot;&gt;action steps&lt;a class=&quot;anchor&quot; aria-hidden=&quot;true&quot; href=&quot;#action-steps&quot; hidden=&quot;&quot;&gt;#&lt;&#x2F;a&gt;
&lt;&#x2F;h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;Ctrl+s&lt;&#x2F;code&gt; save to jump list&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;Space+j&lt;&#x2F;code&gt; open jump list &amp;gt; &lt;mark&gt;c&lt;&#x2F;mark&gt; clear jump list&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;Ctrl+o&lt;&#x2F;code&gt; next jump list&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;li&gt;
&lt;p&gt;&lt;input disabled=&quot;&quot; type=&quot;checkbox&quot;&#x2F;&gt;
&lt;code&gt;Ctrl+i&lt;&#x2F;code&gt; previous jump list&lt;&#x2F;p&gt;
&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;pre style=&quot;background-color:#2b303b;color:#c0c5ce;&quot;&gt;&lt;code&gt;&lt;span&gt;Are we wanting this to be a nested menu? This would change the default keybind from &amp;lt;space&amp;gt; j to &amp;lt;space&amp;gt; j j for opening the jumplist.
&lt;&#x2F;span&gt;&lt;span&gt;&amp;lt;space&amp;gt; j brings up menu
&lt;&#x2F;span&gt;&lt;span&gt;j opens jumplist
&lt;&#x2F;span&gt;&lt;span&gt;c clears jumplist
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;PickerAction is currently being implemented in this pr
&lt;&#x2F;span&gt;&lt;span&gt;
&lt;&#x2F;span&gt;&lt;span&gt;We should be able to use that to implement keybindings in the picker menu:
&lt;&#x2F;span&gt;&lt;span&gt;ctrl-x for delete
&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
</content>
        
    </entry>
</feed>
