<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet type="text/xsl" href="https://www.mangmang.fun/rss.xsl"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <atom:link href="https://www.mangmang.fun/rss.xml" rel="self" type="application/rss+xml"/>
    <title>氓氓小栈</title>
    <link>https://www.mangmang.fun/</link>
    <description>氓氓小栈</description>
    <language>zh-CN</language>
    <pubDate>Tue, 03 Nov 2026 13:07:59 GMT</pubDate>
    <lastBuildDate>Tue, 03 Nov 2026 13:07:59 GMT</lastBuildDate>
    <generator>@vuepress/plugin-feed</generator>
    <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
    <category>应用</category>
    <category>Go</category>
    <category>Java</category>
    <category>工作</category>
    <category>项目总结</category>
    <category>AI</category>
    <category>编程</category>
    <category>前端</category>
    <category>Linux</category>
    <category>工具</category>
    <category>C++</category>
    <item>
      <title>自建服务公网链路复盘：DSH 断连、带宽优化与 RustDesk 端口收敛</title>
      <link>https://www.mangmang.fun/apps/dsh-frp-caddy-network-troubleshooting.html</link>
      <guid>https://www.mangmang.fun/apps/dsh-frp-caddy-network-troubleshooting.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">自建服务公网链路复盘：DSH 断连、带宽优化与 RustDesk 端口收敛</source>
      <description>本次排查从 DSH 公网页面反复显示“连接成功 / 立即重连”开始，逐步检查了腾讯云 Caddy、frps、本机 frpc 和软路由上的其他隧道，并完成心跳容忍度调整、HTTP 压缩优化、RustDesk API 端口收敛及失效站点清理。本文记录实际改动、验证结果和仍未证实的部分，避免把临时缓解误写成已经定位底层根因。</description>
      <category>应用</category>
      <pubDate>Sat, 19 Sep 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本次排查从 DSH 公网页面反复显示“连接成功 / 立即重连”开始，逐步检查了腾讯云 Caddy、frps、本机 frpc 和软路由上的其他隧道，并完成心跳容忍度调整、HTTP 压缩优化、RustDesk API 端口收敛及失效站点清理。本文记录实际改动、验证结果和仍未证实的部分，避免把临时缓解误写成已经定位底层根因。</p>
<!-- more -->
<h2>1. 环境与链路</h2>
<p>诊断时间为 2026 年 9 月 19 日。以下配置只代表当时部署，不代表后续版本的默认行为。示例以 <code>example.com</code> 替代真实域名，不包含认证口令、令牌、私钥或用户会话数据。</p>
<p>DSH 的隧道已从软路由移到 DSH 主机，frpc 使用 host 网络连接本机回环地址。DSH 保持监听 <code>127.0.0.1:3080</code>，通过 <code>trustedHosts</code> 接受公网域名。旧的 <code>13080 → 3080</code> Node 转发方案不再承载访问。</p>
<p>RustDesk 原生客户端使用独立的 ID、打洞和中继端口，不经过上图中的 frp HTTP 隧道；Web Client 另有 Caddy 代理的 WebSocket 入口。</p>
<h2>2. DSH 反复断连：证据与边界</h2>
<h3>2.1 现象</h3>
<ul>
<li>本地地址访问稳定，多台电脑通过公网域名访问都会反复重连。</li>
<li>问题出现时 DSH 主进程并非持续崩溃重启。</li>
<li>公网链路能够建立 WebSocket，并非完全不支持 Upgrade。</li>
<li>Caddy 和 frps 日志出现过 <code>unexpected EOF</code>、<code>context canceled</code> 和 <code>EOF</code>。</li>
</ul>
<p>日志里的 SSE <code>/plugins/events</code> 与 WebSocket <code>/api/remote.mux</code> 是不同连接。不能把所有 EOF 都算作 WebSocket 故障，刷新页面和服务重启也会关闭请求。</p>
<h3>2.2 当时实现的心跳机制</h3>
<p>检查已安装的 <code>@deepseek-ai/dsh-api-gateway</code> 运行代码，发现：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>默认 websocketHeartbeatIntervalMs = 2000</span></span>
<span class="line"><span>MAX_MISSED_HEARTBEATS = 2</span></span>
<span class="line"><span>收到 Pong 后将未应答计数清零</span></span>
<span class="line"><span>达到阈值后执行 socket.terminate()</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>在定时器正常运行的情况下，短暂的几秒停顿就可能触发关闭。不能只用连接寿命是否接近 2 秒的整数倍来判定原因。</p>
<h3>2.3 已观察到什么</h3>
<p>| 证据 | 可以得出的结论 | 不能得出的结论 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Go 三服务在线优先、离线回退编译与发布流程</title>
      <link>https://www.mangmang.fun/programming/backend/go/Go%E5%B7%A5%E7%A8%8B%E5%8C%96/go-online-offline-build.html</link>
      <guid>https://www.mangmang.fun/programming/backend/go/Go%E5%B7%A5%E7%A8%8B%E5%8C%96/go-online-offline-build.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">Go 三服务在线优先、离线回退编译与发布流程</source>
      <description>本文记录一套面向定制 Linux 环境的 Go 构建方案：仓库内固定 Go 工具链，有网时优先从模块代理解析依赖，无网或在线编译失败时自动切换到仓库内的共享 vendor，最终生成三个可直接部署的 Linux x86_64 静态可执行文件。</description>
      <category>Go</category>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本文记录一套面向定制 Linux 环境的 Go 构建方案：仓库内固定 Go 工具链，有网时优先从模块代理解析依赖，无网或在线编译失败时自动切换到仓库内的共享 <code>vendor</code>，最终生成三个可直接部署的 Linux x86_64 静态可执行文件。</p>
<!-- more -->
<h2>一、背景与目标</h2>
<p>定制系统上的软件版本、动态库和运行环境通常经过整体验证。为了编译一个 Go 项目去更换 <code>yum</code>/<code>apt</code> 软件源，或者升级系统已有组件，风险往往大于收益。另一方面，构建服务器的网络条件也不一定稳定，完全依赖公网会让发布流程失去可预期性。</p>
<p>这套方案遵循以下原则：</p>
<ol>
<li>不安装或升级系统软件，不修改系统软件源。</li>
<li>Go 版本和工具链校验值由仓库固定。</li>
<li>有网时使用模块代理，但不自动修改 <code>go.mod</code> 和 <code>go.sum</code>。</li>
<li>无网或在线编译失败时，整体回退到共享 <code>vendor</code>。</li>
<li>只构建指定的三个服务，不扫描和发布其他模块。</li>
<li>在临时目录完成全部编译，成功后再替换正式产物。</li>
</ol>
<h2>二、整体流程</h2>
<p>这里的“在线”仅指 Go 模块依赖解析。脚本不会执行 <code>git pull</code>、<code>go get</code> 或 <code>go mod tidy</code>，也不会动态更新业务代码。</p>
<h2>三、构建目录设计</h2>
<p>项目的 Go 构建入口位于：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>src_go/build/</span></span>
<span class="line"><span>├── build.sh</span></span>
<span class="line"><span>├── README.md</span></span>
<span class="line"><span>├── go.work</span></span>
<span class="line"><span>├── go.work.sum</span></span>
<span class="line"><span>├── go_list.txt</span></span>
<span class="line"><span>├── toolchain.env</span></span>
<span class="line"><span>├── runtime/</span></span>
<span class="line"><span>│   ├── gocontrol.sh</span></span>
<span class="line"><span>│   ├── cygfileweb.sh</span></span>
<span class="line"><span>│   ├── cygauditweb.sh</span></span>
<span class="line"><span>│   └── cygimagealgoweb.sh</span></span>
<span class="line"><span>├── toolchains/</span></span>
<span class="line"><span>│   └── go1.25.12.linux-amd64.tar.gz</span></span>
<span class="line"><span>└── vendor/</span></span>
<span class="line"><span>    ├── modules.txt</span></span>
<span class="line"><span>    └── ...</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>首次执行后会在本地生成缓存：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>src_go/build/.cache/</span></span>
<span class="line"><span>├── toolchains/</span></span>
<span class="line"><span>│   └── go-1.25.12/</span></span>
<span class="line"><span>├── go-build/</span></span>
<span class="line"><span>├── gopath/</span></span>
<span class="line"><span>└── work/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>.cache/</code> 只是当前工作区的解压和编译缓存，不应提交到版本管理。删除它不会丢失源码，下次构建只会重新解压工具链并生成缓存。</p>
<h2>四、固定 Go 工具链</h2>
<p><code>toolchain.env</code> 锁定构建工具版本、归档文件名和 SHA256：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GO_VERSION</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"1.25.12"</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GO_ARCHIVE</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"go1.25.12.linux-amd64.tar.gz"</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GO_ARCHIVE_SHA256</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"234828b7a89e0e303d2556310ee549fbcf253d28de937bac3da13d6294262ac1"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>构建前可以先做轻量检查：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> src_go/build</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./build.sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> --check</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>检查项包括：</p>
<ul>
<li>当前主机必须是 Linux x86_64。</li>
<li>内置 Go 归档必须存在，SHA256 必须一致。</li>
<li>共享 <code>vendor/modules.txt</code> 必须存在。</li>
<li>三个目标模块都必须包含 <code>go.mod</code> 和 <code>main.go</code>。</li>
<li>四个运行脚本必须完整。</li>
</ul>
<p>通过校验后，工具链被解压到项目缓存目录，而不是 <code>/usr/local/go</code> 或其他系统目录。脚本还会设置：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GOTOOLCHAIN</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">local</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GOENV</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">off</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">CGO_ENABLED</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">0</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GOOS</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">linux</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">GOARCH</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">amd64</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>GOTOOLCHAIN=local</code> 防止 Go 根据模块声明自动下载另一套工具链，<code>GOENV=off</code> 避免用户全局 Go 配置干扰本次构建。</p>
<h2>五、管理三个目标服务</h2>
<p><code>go_list.txt</code> 是唯一的目标清单：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>sunri-cygfileweb</span></span>
<span class="line"><span>sunri-cygauditweb</span></span>
<span class="line"><span>sunri-cygimagealgoweb</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>脚本会将模块名前缀 <code>sunri-</code> 去掉，生成下列产物：</p>
<p>| 源码模块 | 可执行文件 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>Java 双服务离线编译、依赖加密与发布流程</title>
      <link>https://www.mangmang.fun/programming/backend/java/%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/Java-%E5%8F%8C%E6%9C%8D%E5%8A%A1%E7%A6%BB%E7%BA%BF%E7%BC%96%E8%AF%91-%E4%BE%9D%E8%B5%96%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B.html</link>
      <guid>https://www.mangmang.fun/programming/backend/java/%E5%8A%9F%E8%83%BD%E6%95%B4%E7%90%86/Java-%E5%8F%8C%E6%9C%8D%E5%8A%A1%E7%A6%BB%E7%BA%BF%E7%BC%96%E8%AF%91-%E4%BE%9D%E8%B5%96%E5%8A%A0%E5%AF%86%E4%B8%8E%E5%8F%91%E5%B8%83%E6%B5%81%E7%A8%8B.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">Java 双服务离线编译、依赖加密与发布流程</source>
      <description>本文记录一套适用于定制 Linux 环境的 Java 构建与发布方案：不安装系统软件、不修改系统软件源、不污染用户 Maven 仓库，在仓库内固定 JDK、Maven 和加密工具版本，只构建指定的两个 Spring Boot 服务，并将共享依赖加密后原子发布。</description>
      <category>Java</category>
      <pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本文记录一套适用于定制 Linux 环境的 Java 构建与发布方案：不安装系统软件、不修改系统软件源、不污染用户 Maven 仓库，在仓库内固定 JDK、Maven 和加密工具版本，只构建指定的两个 Spring Boot 服务，并将共享依赖加密后原子发布。</p>
<!-- more -->
<h2>一、背景与目标</h2>
<p>目标服务器通常不能稳定访问公网，也不适合通过 <code>yum</code>、<code>apt</code> 或替换软件源来升级 Java、Maven、Git 等基础工具。对于已经交付的定制系统，修改系统环境还可能影响同机运行的其他程序。</p>
<p>因此，这套方案遵循以下原则：</p>
<ol>
<li>构建工具随项目固定，不依赖服务器预装版本。</li>
<li>工具链解压到项目缓存，不写 <code>/usr</code>、<code>/opt</code> 等系统目录。</li>
<li>Maven 使用项目独立的本地仓库，不修改或污染 <code>~/.m2</code>。</li>
<li>加密工具优先使用仓库内置源码归档，不要求构建机安装 Git，也不在脚本中保存凭据。</li>
<li>只构建 <code>cygcenterweb</code> 和 <code>cygsignsrvweb</code>，避免产生无关服务。</li>
<li>先在临时目录完成编译、收集、加密和校验，全部成功后再替换正式产物。</li>
</ol>
<p>这里的“离线”需要分成两层理解：</p>
<ul>
<li><strong>工具链离线</strong>：JDK、Maven 和加密工具源码都由仓库提供，不访问公网。</li>
<li><strong>业务依赖解析</strong>：如果项目独立 Maven 仓库还是空的，第一次构建仍需要访问可用的内网 Maven 制品库。缓存完整后才可以在断网环境重复构建。</li>
</ul>
<h2>二、整体流程</h2>
<p>构建脚本位于：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>src_java/package/build.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>最终产物位于：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>binary/java/</span></span>
<span class="line"><span>├── bin/</span></span>
<span class="line"><span>│   ├── javacontrol.sh</span></span>
<span class="line"><span>│   ├── cygcenterweb.sh</span></span>
<span class="line"><span>│   └── cygsignsrvweb.sh</span></span>
<span class="line"><span>└── jar/x64/</span></span>
<span class="line"><span>    ├── cygcenterweb.jar</span></span>
<span class="line"><span>    ├── cygsignsrvweb.jar</span></span>
<span class="line"><span>    └── libs/</span></span>
<span class="line"><span>        ├── cygcenterweb-requirements.txt</span></span>
<span class="line"><span>        ├── cygsignsrvweb-requirements.txt</span></span>
<span class="line"><span>        └── *.jar</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>三、构建目录设计</h2>
<p>构建相关目录如下：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>src_java/package/</span></span>
<span class="line"><span>├── build.sh</span></span>
<span class="line"><span>├── README.md</span></span>
<span class="line"><span>├── settings.xml</span></span>
<span class="line"><span>├── toolchain.env</span></span>
<span class="line"><span>├── runtime/</span></span>
<span class="line"><span>│   ├── javacontrol.sh</span></span>
<span class="line"><span>│   ├── cygcenterweb.sh</span></span>
<span class="line"><span>│   └── cygsignsrvweb.sh</span></span>
<span class="line"><span>└── toolchains/</span></span>
<span class="line"><span>    ├── openjdk-8u171-linux-x64.tar.gz</span></span>
<span class="line"><span>    ├── apache-maven-3.6.3-bin.tar.gz</span></span>
<span class="line"><span>    └── sunri-jar-encrypt-fe837986.tar.gz</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>执行后还会出现本地缓存：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>src_java/package/.cache/</span></span>
<span class="line"><span>├── downloads/</span></span>
<span class="line"><span>├── toolchains/</span></span>
<span class="line"><span>├── m2-repository/</span></span>
<span class="line"><span>└── work/</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p><code>.cache/</code> 只服务于当前工作区，不应提交版本管理。它包含解压后的工具链、独立 Maven 仓库和单次构建临时目录。</p>
<p>把 JDK 和 Maven 归档提交到项目会增大仓库体积，但对于无法访问公网、又不能调整系统环境的构建服务器，这是更可控的选择。后续如果有稳定的内网制品库，也可以把归档迁移到制品库，但必须继续保留版本锁定和 SHA256 校验。</p>
<h2>四、固定构建输入</h2>
<p>所有关键版本集中在 <code>toolchain.env</code> 中，不由构建机当前环境决定：</p>
<p>| 组件 | 固定版本 | SHA256 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>平台认证与鉴权流程</title>
      <link>https://www.mangmang.fun/work/project-summary/%E7%AE%97%E6%B3%95%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E8%AE%A4%E8%AF%81%E4%B8%8E%E9%89%B4%E6%9D%83%E6%B5%81%E7%A8%8B.html</link>
      <guid>https://www.mangmang.fun/work/project-summary/%E7%AE%97%E6%B3%95%E7%AE%A1%E7%90%86%E5%B9%B3%E5%8F%B0/%E5%B9%B3%E5%8F%B0%E8%AE%A4%E8%AF%81%E4%B8%8E%E9%89%B4%E6%9D%83%E6%B5%81%E7%A8%8B.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">平台认证与鉴权流程</source>
      <description>本文依据当前工程中的实际实现整理，重点覆盖： sunri-service-auth-spi：认证、Token、权限和资源的 Service Bus 接口定义。 sunri-service-auth：账号校验、JWT 签发、实时库会话、角色权限位和资源关系实现。 sunri-web-center：HTTP 登录入口、请求拦截器、@ApiRight 接口鉴...</description>
      <category>工作</category>
      <category>项目总结</category>
      <pubDate>Tue, 14 Jul 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本文依据当前工程中的实际实现整理，重点覆盖：</p>
<ul>
<li><code>sunri-service-auth-spi</code>：认证、Token、权限和资源的 Service Bus 接口定义。</li>
<li><code>sunri-service-auth</code>：账号校验、JWT 签发、实时库会话、角色权限位和资源关系实现。</li>
<li><code>sunri-web-center</code>：HTTP 登录入口、请求拦截器、<code>@ApiRight</code> 接口鉴权和菜单过滤。</li>
</ul>
<p>本文描述的是平台现状，不把它替换成 Spring Security/RBAC 的标准实现。</p>
<!-- more -->
<h2>1. 先看结论</h2>
<p>平台的核心授权链不是“用户 -&gt; 角色 -&gt; 权限记录 -&gt; 接口”这种普通关联表模型，而是：</p>
<div class="language-text line-numbers-mode" data-highlighter="shiki" data-ext="text" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-text"><span class="line"><span>用户 -> 单个角色 -> 角色的 64 位权限位图 -> 权限位集合</span></span>
<span class="line"><span>                                         |</span></span>
<span class="line"><span>                                         +-> 菜单所需权限位</span></span>
<span class="line"><span>                                         +-> API 所需权限位</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>登录成功后，角色的 <code>ROLEAUTHORITY</code> 位图会被拆成 <code>Set&lt;Integer&gt;</code>。这个权限集合会同时：</p>
<ol>
<li>返回给 Web Center；</li>
<li>写入实时库的登录会话；</li>
<li>首次校验受保护请求时缓存在 Web Center 本地；</li>
<li>用于过滤菜单；</li>
<li>用于 API 请求鉴权。</li>
</ol>
<h2>2. 核心关系图</h2>
<h3>2.1 主干关系</h3>
<p>| 起点 | 终点 | 实际字段/规则 | 说明 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>PR7050 全景监控（主辅监控）数据加载流程深度解析</title>
      <link>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-panoramic-monitoring-data-flow.html</link>
      <guid>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-panoramic-monitoring-data-flow.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">PR7050 全景监控（主辅监控）数据加载流程深度解析</source>
      <description>本文基于 PR7050 项目中全景监控模块（/panoramicMonitoring/main-auxiliaryMonitoring）的实际代码，深入分析组态画面数据加载的完整流程、核心接口、缓存机制及关键注意事项。</description>
      <category>工作</category>
      <category>项目总结</category>
      <pubDate>Wed, 17 Jun 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>本文基于 PR7050 项目中全景监控模块（<code>/panoramicMonitoring/main-auxiliaryMonitoring</code>）的实际代码，深入分析组态画面数据加载的完整流程、核心接口、缓存机制及关键注意事项。</p>
<!-- more -->
<h2>1. 项目概述</h2>
<p>全景监控模块是 PR7050 系统中用于实时展示变电站设备状态的核心功能模块。它通过组态画面的形式，将设备的遥测、遥信、遥控、遥设等实时数据以图形化方式呈现给用户，支持设备状态监控、遥控操作、告警展示等功能。</p>
<p><strong>核心特点</strong>：</p>
<ul>
<li><strong>图形化展示</strong>：通过组态画面直观展示设备状态</li>
<li><strong>实时数据刷新</strong>：支持定时轮询和 MQ 推送两种刷新机制</li>
<li><strong>多级导航</strong>：顶部Tab菜单 + 左侧树提供设备分类导航</li>
<li><strong>缓存优化</strong>：文件缓存和内存缓存双重优化加载性能</li>
</ul>
<h2>2. 整体数据加载流程</h2>
<p>组态画面的数据加载分为五个主要阶段，形成完整的数据闭环：</p>
<div class="language- line-numbers-mode" data-highlighter="shiki" data-ext style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-"><span class="line"><span>阶段1：获取顶部Tab菜单 → 阶段2：加载左侧导航树 → 阶段3：获取画面属性 → 阶段4：获取实时数据 → 阶段5：定时刷新/MQ推送</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h3>2.1 阶段一：获取顶部Tab菜单</h3>
<p><strong>目的</strong>：获取全站总览图列表，作为一级导航菜单</p>
<p><strong>涉及接口</strong>：</p>
<p>| 接口路径 | 请求方式 | 作用 |<br>
| :</p>
]]></content:encoded>
    </item>
    <item>
      <title>tmux + Codex 终端会话管理实战</title>
      <link>https://www.mangmang.fun/ai/tmux-codex-workflow.html</link>
      <guid>https://www.mangmang.fun/ai/tmux-codex-workflow.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">tmux + Codex 终端会话管理实战</source>
      <description>Codex 很适合在终端里处理长任务，但如果直接跑在普通 shell 里， 终端关闭、SSH 断开、临时切换任务都会影响体验。tmux 的价值就是把 终端会话托管起来：任务可以留在后台，回来以后继续接着看。</description>
      <category>AI</category>
      <pubDate>Wed, 13 May 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>Codex 很适合在终端里处理长任务，但如果直接跑在普通 shell 里，<br>
终端关闭、SSH 断开、临时切换任务都会影响体验。tmux 的价值就是把<br>
终端会话托管起来：任务可以留在后台，回来以后继续接着看。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>PR7050 打包启动流程说明</title>
      <link>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-package-startup-flow.html</link>
      <guid>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7050-package-startup-flow.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">PR7050 打包启动流程说明</source>
      <description>本文档基于当前仓库脚本重新整理。所有路径、密码、服务清单均以 PR7050 当前文件为准，不沿用 PR7950 目录。</description>
      <category>工作</category>
      <category>项目总结</category>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>本文档基于当前仓库脚本重新整理。所有路径、密码、服务清单均以 PR7050 当前文件为准，不沿用 PR7950 目录。</p>
<!-- more -->
<h2>1. 文档范围</h2>
<p>涉及的当前 PR7050 文件：</p>
<ul>
<li><code>src_java/package/build.sh</code>：Java 平台、应用、压缩加密工具的主打包入口。</li>
<li><code>src_java/package/jar_list.txt</code>：打包后需要收集并加密的 Spring Boot 服务 Jar 清单。</li>
<li><code>binary/java/bin/encrypt/*.xml</code>：每个服务压缩时需要保留在服务 Jar 内的依赖清单。</li>
<li><code>src_java/tool/sunri-package-compress-xjar/src/main/java/com/sunri/Main.java</code>：XJar 加密密码、加密 include 规则和配置读取逻辑。</li>
<li><code>src_java/tool/sunri-package-compress-xjar/src/main/java/com/sunri/JarUtil.java</code>：服务 Jar 压缩、公共依赖抽取和 <code>*-requirements.txt</code> 生成逻辑。</li>
<li><code>binary/java/bin/javacontrol.sh</code>：Java 服务 start、stop、restart 控制脚本。</li>
</ul>
<h2>2. Java 打包流程</h2>
<p>在 PR7050 根目录下，Java 打包入口位于 <code>src_java/package/build.sh</code>。脚本通过自身路径计算 <code>PROJECT_ROOT</code>，实际 Java 工程根为 <code>/home/liumangmang/IdeaProjects/PR7050/V1.00/src_java</code>。</p>
<h3>总体流程步骤</h3>
<ol>
<li><strong>清理旧产物</strong>：执行 <code>clean_stale_java_outputs</code>，先删除旧 Jar、XJar 中间文件和旧 requirements。</li>
<li><strong>架构检测</strong>：通过 <code>uname -m</code> 选择 <code>jdk-x64</code> 或 <code>jdk-arm</code>，并设置 Maven 路径。</li>
<li><strong>同步加密 XML</strong>：从 <code>binary/java/bin/encrypt</code> 同步到 <code>src_java/package/java/bin/encrypt</code>。</li>
<li><strong>编译 Platform</strong>：进入 <code>src_java/platform</code> 执行 <code>mvn clean install -DskipTests -T 1C</code>。</li>
<li><strong>编译 Platapp</strong>：进入 <code>src_java/platapp</code> 执行 <code>mvn clean package -DskipTests -T 1C</code>。</li>
<li><strong>收集服务 Jar</strong>：按 <code>jar_list.txt</code> 在 platform 和 platapp 的 <code>target</code> 目录查找并复制。</li>
<li><strong>压缩加密</strong>：构建并执行 <code>sunri-package-compress-xjar</code>，生成加密后的服务 Jar。</li>
<li><strong>同步到 binary</strong>：将加密 Jar 和 common 依赖复制到 <code>binary/java</code> 运行目录。</li>
</ol>
<h3>2.1 清理旧 Java 输出</h3>
<p><code>build.sh</code> 开头调用 <code>clean_stale_java_outputs</code>。它会先创建必要目录，再删除下列旧文件，避免上一次构建残留影响本次打包：</p>
<ul>
<li><code>src_java/package/java/jar/x64_raw/*.jar</code></li>
<li><code>src_java/package/java/jar/x64_compress/*.jar</code></li>
<li><code>src_java/package/java/jar/x64/*.jar</code>、<code>*.xjar</code>、<code>xjar.go</code>、<code>compress-xjar.config</code></li>
<li><code>binary/java/jar/x64/*.jar</code></li>
<li><code>src_java/package/java/lib/common/*.jar</code> 与 <code>*-requirements.txt</code></li>
<li><code>binary/java/lib/common/*.jar</code> 与 <code>*-requirements.txt</code></li>
</ul>
<h3>2.2 关键打包命令</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/package</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./build.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>脚本内部执行的 Maven 命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/platform</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clean</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> install</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -DskipTests</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -T</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 1C</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/liumangmang/IdeaProjects/PR7050/V1.00/src_java/platapp</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mvn</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clean</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> package</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -DskipTests</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -T</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 1C</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><blockquote>
<p><strong>⚠ 注意：</strong> <code>build.sh</code> 当前跳过测试，适合打包流程。若改动源码，应按受影响模块另行执行最小测试命令。</p>
</blockquote>
<h2>3. 压缩与 XJar 加密</h2>
<p>压缩加密工具位于 <code>src_java/tool/sunri-package-compress-xjar</code>。打包脚本会编译该工具，将 <code>sunri-package-compress-xjar-1.0-jar-with-dependencies.jar</code> 复制到 <code>src_java/package/java/tools</code>，再由模板生成 <code>compress-xjar.config</code>。</p>
<h3>3.1 配置文件生成</h3>
<p>模板 <code>src_java/package/java/tools/model_compress-xjar.config</code> 中的 <code>{项目全路径}</code> 会被替换为 <code>/home/liumangmang/IdeaProjects/PR7050/V1.00/src_java</code>。生成后的主要目录如下：</p>
<p>| 配置项 | 当前 PR7050 路径 | 作用 |<br>
| :</p>
]]></content:encoded>
    </item>
    <item>
      <title>PR7950 Java 打包启动流程说明</title>
      <link>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7950-java-package-startup-flow.html</link>
      <guid>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/pr7950-java-package-startup-flow.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">PR7950 Java 打包启动流程说明</source>
      <description>整个流程从 build.sh 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 binary/java 运行目录。启动时不是直接执行 java -jar，而是通过 xjar java ... -jar 服务.jar 解密运行。</description>
      <category>工作</category>
      <category>项目总结</category>
      <pubDate>Mon, 11 May 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>整个流程从 <code>build.sh</code> 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 <code>binary/java</code> 运行目录。启动时不是直接执行 <code>java -jar</code>，而是通过 <code>xjar java ... -jar 服务.jar</code> 解密运行。</p>
<!-- more -->
<h2>1. 总体流程</h2>
<p>整个流程从 <code>build.sh</code> 开始，先构建 Java 模块，再按清单提取业务 fat jar，随后用压缩工具拆分公共依赖，再使用 XJar 加密，最后把产物同步到 <code>binary/java</code> 运行目录。启动时不是直接执行 <code>java -jar</code>，而是通过 <code>xjar java ... -jar 服务.jar</code> 解密运行。</p>
<h3>流程步骤</h3>
<ol>
<li><strong><a href="http://build.sh" target="_blank" rel="noopener noreferrer">build.sh</a></strong>: 准备 JDK/Maven，同步 encrypt XML</li>
<li><strong>Maven Build</strong>: 构建 platform 与 platapp</li>
<li><strong>x64_raw</strong>: 按 jar_list.txt 提取原始 fat jar</li>
<li><strong>compress</strong>: 拆分 BOOT-INF/lib 依赖</li>
<li><strong>lib/common</strong>: 输出公共 jar 与 requirements.txt</li>
<li><strong>XJar</strong>: 加密压缩后的服务 jar</li>
<li><strong>binary</strong>: 同步 jar 与公共依赖到运行目录</li>
<li><strong>startup</strong>: xjar java 启动，动态加载公共依赖</li>
</ol>
<blockquote>
<p><strong>一句话概括：</strong><br>
打包阶段把业务 jar 变小并加密，启动阶段用 XJar 解密运行，再由 <code>sunri-spring-classload</code> 把拆出去的公共依赖加载回来。</p>
</blockquote>
<h2>2. 构建与提取 Jar</h2>
<p>入口脚本位于：<br>
<code>/home/liumangmang/IdeaProjects/PR7950/V1.00_2024/src_java/package/build.sh</code></p>
<h3>执行入口</h3>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/liumangmang/IdeaProjects/PR7950/V1.00_2024/src_java/package</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">bash</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> build.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><h3>环境准备</h3>
<p>脚本根据机器架构选择内置 JDK，并使用项目自带 Maven。</p>
<p>| 项目 | 路径/规则 |<br>
| :</p>
]]></content:encoded>
    </item>
    <item>
      <title>VSCode 进阶：命令面板工作流与配置治理</title>
      <link>https://www.mangmang.fun/programming/frontend/tools/vscode-advanced-command-palette-and-config-management.html</link>
      <guid>https://www.mangmang.fun/programming/frontend/tools/vscode-advanced-command-palette-and-config-management.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">VSCode 进阶：命令面板工作流与配置治理</source>
      <description>这篇是入门篇的下一步，目标是把 VSCode 从“会用”升级到“高效、可维护”。 重点只讲三块： 命令面板的进阶工作流 配置文件分层治理（User / Workspace / Profile） 可复用的进阶 JSON 模板</description>
      <category>编程</category>
      <category>前端</category>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这篇是入门篇的下一步，目标是把 VSCode 从“会用”升级到“高效、可维护”。</p>
<p>重点只讲三块：</p>
<ol>
<li>命令面板的进阶工作流</li>
<li>配置文件分层治理（User / Workspace / Profile）</li>
<li>可复用的进阶 JSON 模板</li>
</ol>
<!-- more -->
<h2>1. 命令面板进阶：把常用动作变成肌肉记忆</h2>
<p>命令面板入口不变：<code>Ctrl + Shift + P</code>（Windows / Linux）。</p>
<p>建议只记住下面这组高频命令：</p>
<ol>
<li><code>&gt;Preferences: Open User Settings (JSON)</code></li>
<li><code>&gt;Preferences: Open Workspace Settings (JSON)</code></li>
<li><code>&gt;Preferences: Open Keyboard Shortcuts (JSON)</code></li>
<li><code>&gt;Tasks: Configure Task</code></li>
<li><code>&gt;Developer: Reload Window</code></li>
<li><code>&gt;Profiles: Create Profile</code></li>
<li><code>&gt;Extensions: Show Installed Extensions</code></li>
</ol>
<p>实战思路：遇到任何需求，先用命令面板搜“动词 + 目标”，比如 <code>open settings json</code>、<code>create profile</code>。</p>
<h2>2. 配置治理模型：谁该放在哪里</h2>
<h3>2.1 User settings（全局）</h3>
<ul>
<li>Windows: <code>%APPDATA%\\Code\\User\\settings.json</code></li>
<li>Linux: <code>~/.config/Code/User/settings.json</code></li>
</ul>
<p>放“个人偏好”：字体、自动保存、终端默认 shell、编辑体验。</p>
<h3>2.2 Workspace settings（项目）</h3>
<ul>
<li>项目路径：<code>.vscode/settings.json</code></li>
</ul>
<p>放“项目约束”：缩进、格式化策略、特定语言规则、排除目录。</p>
<h3>2.3 Profile（场景）</h3>
<p>Profile 适合“多工作模式”用户，例如：</p>
<ul>
<li><code>Frontend</code>：前端开发扩展 + 偏好</li>
<li><code>Backend</code>：后端开发扩展 + 偏好</li>
<li><code>Minimal</code>：低干扰写作/阅读模式</li>
</ul>
<p>建议：</p>
<ul>
<li>固定偏好放 User</li>
<li>项目规范放 Workspace</li>
<li>场景差异放 Profile</li>
</ul>
<h2>3. keybindings.json：给命令面板加速</h2>
<p>打开方式：</p>
<ul>
<li><code>Ctrl + Shift + P</code></li>
<li>输入 <code>Open Keyboard Shortcuts (JSON)</code></li>
</ul>
<p>示例（Windows / Linux 通用）：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">[</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "key"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ctrl+alt+r"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "command"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"workbench.action.reloadWindow"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "key"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ctrl+alt+,"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "command"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"workbench.action.openSettingsJson"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "key"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"ctrl+alt+t"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "command"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"workbench.action.tasks.runTask"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">]</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>注意：如果快捷键冲突，VSCode 会以后定义或更具体 <code>when</code> 条件为准。</p>
<h2>4. 进阶 settings.json 模板（Windows + Linux）</h2>
<p>下面模板建议放在 User 级，并按你环境微调：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.fontSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">14</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.lineHeight"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">1.7</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.tabSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.wordWrap"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"on"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.minimap.enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.bracketPairColorization.enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.autoSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"onFocusChange"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.trimTrailingWhitespace"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.insertFinalNewline"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.watcherExclude"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/.git/objects/**"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/node_modules/**"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/dist/**"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.formatOnSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.defaultFormatter"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"esbenp.prettier-vscode"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.codeActionsOnSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "source.fixAll"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"explicit"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "source.organizeImports"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"explicit"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "terminal.integrated.defaultProfile.windows"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"PowerShell"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "terminal.integrated.defaultProfile.linux"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"bash"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "workbench.startupEditor"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"none"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "workbench.editor.enablePreview"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "workbench.tree.indent"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">16</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>如果你不用 Prettier，把 <code>editor.defaultFormatter</code> 改成你实际使用的扩展 ID。</p>
<h2>5. Workspace 模板：把项目规范写死</h2>
<p>建议每个项目都放一个最小 <code>.vscode/settings.json</code>：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.tabSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.insertSpaces"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.detectIndentation"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.eol"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">\n</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>这样团队成员打开项目时，基础编辑行为就能统一。</p>
<h2>6. 命令面板 + Task：一键执行项目动作</h2>
<p>进阶建议：把常用命令（如构建、测试）写进 Task，再通过命令面板触发。</p>
<p><code>.vscode/tasks.json</code> 示例：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "version"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"2.0.0"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "tasks"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: [</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "label"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"docs:build"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "type"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"shell"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "command"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"npm run docs:build"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "group"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"build"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">      "problemMatcher"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: []</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">    }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  ]</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>触发方式：</p>
<ol>
<li><code>Ctrl + Shift + P</code></li>
<li>输入 <code>Run Task</code></li>
<li>选择 <code>docs:build</code></li>
</ol>
<h2>7. 常见坑与排查</h2>
<h3>7.1 改了配置却没生效</h3>
<p>先执行 <code>Developer: Reload Window</code>，再验证。</p>
<h3>7.2 User 和 Workspace 打架</h3>
<p>按“项目优先”原则，检查 <code>.vscode/settings.json</code> 是否覆盖了 User。</p>
<h3>7.3 JSON 报错</h3>
<p>确保：</p>
<ul>
<li>不要尾逗号</li>
<li>全部键名和字符串使用双引号</li>
<li>文件是合法 JSON（不是 JSONC 风格时不要写注释）</li>
</ul>
<h2>8. 进阶完成标准</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 能通过命令面板完成设置、任务、重载</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 能区分 User / Workspace / Profile 三层职责</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 有自己的 <code>keybindings.json</code> 高频快捷键</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 有项目级 <code>.vscode/settings.json</code> 规范</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 能用 <code>tasks.json</code> 一键触发常用命令</label></li>
</ul>
<p>做到这 5 点，VSCode 就从“编辑器”变成你的“稳定开发操作台”。</p>
]]></content:encoded>
    </item>
    <item>
      <title>VSCode 使用入门：命令面板与 settings.json</title>
      <link>https://www.mangmang.fun/programming/frontend/tools/vscode-quick-start-command-palette-settings-json.html</link>
      <guid>https://www.mangmang.fun/programming/frontend/tools/vscode-quick-start-command-palette-settings-json.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">VSCode 使用入门：命令面板与 settings.json</source>
      <description>这是一篇极速 15 分钟上手指南，重点只讲三件事： VSCode 的基本概念 命令面板怎么高频使用 不进图形化设置，直接改 settings.json</description>
      <category>编程</category>
      <category>前端</category>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这是一篇极速 15 分钟上手指南，重点只讲三件事：</p>
<ol>
<li>VSCode 的基本概念</li>
<li>命令面板怎么高频使用</li>
<li>不进图形化设置，直接改 <code>settings.json</code></li>
</ol>
<!-- more -->
<h2>1. 先认识 4 个核心概念</h2>
<h3>1.1 编辑器 vs 工作区</h3>
<ul>
<li><strong>编辑器</strong>：你看到和编辑代码的窗口。</li>
<li><strong>工作区（Workspace）</strong>：当前打开的项目（一个或多个文件夹）。</li>
</ul>
<h3>1.2 配置分层（最重要）</h3>
<p>VSCode 的设置是分层生效的：</p>
<ol>
<li><strong>默认设置（Default）</strong>：VSCode 内置。</li>
<li><strong>用户设置（User）</strong>：你机器上的全局偏好。</li>
<li><strong>工作区设置（Workspace）</strong>：只对当前项目生效。</li>
</ol>
<p>如果同一个键同时存在，通常是 <code>Workspace</code> 覆盖 <code>User</code>。</p>
<h3>1.3 命令面板（Command Palette）</h3>
<p>命令面板是 VSCode 的“统一入口”。</p>
<ul>
<li>Windows/Linux：<code>Ctrl + Shift + P</code></li>
<li>也可按 <code>F1</code></li>
</ul>
<p>你可以在这里执行几乎所有操作，包括打开 JSON 配置。</p>
<h3>1.4 扩展不是“额外功能”，而是能力层</h3>
<p>VSCode 本体很轻，很多语言能力来自扩展。<br>
但本篇先不讲扩展安装，先把命令面板和配置体系打通。</p>
<h2>2. 命令面板：先会这 6 条命令</h2>
<p>按 <code>Ctrl + Shift + P</code> 后直接输入：</p>
<ol>
<li><code>&gt;</code> + <code>Reload Window</code>：重载窗口，配置变更后常用。</li>
<li><code>&gt;Developer: Reload Window</code>：同上，完整命令名。</li>
<li><code>&gt;Preferences: Open User Settings (JSON)</code>：打开全局配置。</li>
<li><code>&gt;Preferences: Open Workspace Settings (JSON)</code>：打开项目配置。</li>
<li><code>&gt;Preferences: Open Default Settings (JSON)</code>：查看默认值（只读参考）。</li>
<li><code>&gt;Files: Auto Save</code>：快速切自动保存策略。</li>
</ol>
<p>技巧：命令面板支持模糊搜索，你记不全命令名也能找到。</p>
<h2>3. settings.json 到底放哪</h2>
<h3>3.1 用户配置（全局）</h3>
<ul>
<li>Windows: <code>%APPDATA%\\Code\\User\\settings.json</code></li>
<li>Linux: <code>~/.config/Code/User/settings.json</code></li>
</ul>
<p>建议：全局偏好（字体、自动保存、格式化默认行为）放这里。</p>
<h3>3.2 工作区配置（项目级）</h3>
<ul>
<li>项目根目录：<code>.vscode/settings.json</code></li>
</ul>
<p>建议：和项目强相关的配置放这里（例如某项目缩进、格式化器、排除目录）。</p>
<h2>4. 用命令面板打开 JSON 配置（不进图形设置）</h2>
<h3>4.1 打开用户配置</h3>
<ol>
<li><code>Ctrl + Shift + P</code></li>
<li>输入 <code>Open User Settings (JSON)</code></li>
<li>回车</li>
</ol>
<h3>4.2 打开工作区配置</h3>
<ol>
<li><code>Ctrl + Shift + P</code></li>
<li>输入 <code>Open Workspace Settings (JSON)</code></li>
<li>回车</li>
</ol>
<p>如果项目里没有 <code>.vscode/settings.json</code>，VSCode 会帮你创建。</p>
<h2>5. 可直接粘贴的入门模板</h2>
<p>下面这份建议先放在 <strong>User settings.json</strong>，适用于 Windows + Linux。</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.fontSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">14</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.tabSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.wordWrap"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"on"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.minimap.enabled"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.autoSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"onFocusChange"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.trimTrailingWhitespace"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.insertFinalNewline"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.formatOnSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.codeActionsOnSave"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "source.fixAll"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"explicit"</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  },</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "terminal.integrated.defaultProfile.windows"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"PowerShell"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "terminal.integrated.defaultProfile.linux"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"bash"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "files.exclude"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: {</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/.DS_Store"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/node_modules"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">    "**/.git"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">false</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  }</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>说明：</p>
<ul>
<li><code>formatOnSave</code> 依赖你安装并启用对应语言的格式化扩展。</li>
<li><code>source.fixAll</code> 设为 <code>explicit</code> 更稳，避免每次保存都触发过多修复。</li>
<li><code>terminal.integrated.defaultProfile.*</code> 按你的本机实际 shell 调整。</li>
</ul>
<h2>6. User 与 Workspace 怎么分</h2>
<p>推荐这套规则：</p>
<ul>
<li>放 <code>User</code>：你个人习惯，跨项目都想保留。</li>
<li>放 <code>Workspace</code>：只在当前项目生效的规则。</li>
</ul>
<p>示例：某项目要求 4 空格缩进，就写到该项目 <code>.vscode/settings.json</code>：</p>
<div class="language-json line-numbers-mode" data-highlighter="shiki" data-ext="json" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-json"><span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">{</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.tabSize"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#986801;--shiki-dark:#D19A66">4</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">,</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">  "editor.insertSpaces"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">: </span><span style="--shiki-light:#0184BC;--shiki-dark:#D19A66">true</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">}</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>7. 常见问题（JSON 配置方式）</h2>
<h3>7.1 配置不生效</h3>
<p>按 <code>Ctrl + Shift + P</code> 执行 <code>Developer: Reload Window</code>，再验证。</p>
<h3>7.2 JSON 报错（逗号、引号）</h3>
<p><code>settings.json</code> 必须是合法 JSON。重点检查：</p>
<ul>
<li>最后一项后面不要多逗号</li>
<li>键名和字符串值要用双引号</li>
</ul>
<h3>7.3 不确定某个键该写什么</h3>
<p>用命令面板打开 <code>Default Settings (JSON)</code> 搜索对应键，按默认文档写。</p>
<h2>8. 15 分钟上手清单</h2>
<ul class="task-list-container">
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-0" disabled="disabled"><label class="task-list-item-label" for="task-item-0"> 会用 <code>Ctrl + Shift + P</code> 打开命令面板</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-1" disabled="disabled"><label class="task-list-item-label" for="task-item-1"> 会打开 <code>User Settings (JSON)</code></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-2" disabled="disabled"><label class="task-list-item-label" for="task-item-2"> 会打开 <code>Workspace Settings (JSON)</code></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-3" disabled="disabled"><label class="task-list-item-label" for="task-item-3"> 能区分 User 与 Workspace 的生效范围</label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-4" disabled="disabled"><label class="task-list-item-label" for="task-item-4"> 粘贴并调整一份可用的 <code>settings.json</code></label></li>
<li class="task-list-item"><input type="checkbox" class="task-list-item-checkbox" id="task-item-5" disabled="disabled"><label class="task-list-item-label" for="task-item-5"> 配置不生效时会执行 <code>Reload Window</code></label></li>
</ul>
<p>完成以上 6 项，你已经跨过 VSCode 入门阶段。</p>
]]></content:encoded>
    </item>
    <item>
      <title>Linux Mint XFCE 终端常用快捷指令完全指南</title>
      <link>https://www.mangmang.fun/programming/linux/Linux_Mint/xfce%E7%BB%88%E7%AB%AF%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4.html</link>
      <guid>https://www.mangmang.fun/programming/linux/Linux_Mint/xfce%E7%BB%88%E7%AB%AF%E5%B8%B8%E7%94%A8%E5%BF%AB%E6%8D%B7%E6%8C%87%E4%BB%A4.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">Linux Mint XFCE 终端常用快捷指令完全指南</source>
      <description>XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具，熟练掌握其快捷键可以极大提升工作效率。本文整理了最实用的 XFCE 终端快捷键，涵盖导航、编辑、显示调整等各个方面，帮助你更高效地使用终端。</description>
      <category>Linux</category>
      <pubDate>Mon, 30 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>XFCE 终端是 Linux Mint XFCE 桌面环境默认的命令行工具，熟练掌握其快捷键可以极大提升工作效率。本文整理了最实用的 XFCE 终端快捷键，涵盖导航、编辑、显示调整等各个方面，帮助你更高效地使用终端。</p>
<!-- more -->
<h2>一、基础导航类快捷键</h2>
<h3>1.1 标签页管理</h3>
<p>| 快捷键 | 功能描述 | 使用场景 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>内存优化完全指南</title>
      <link>https://www.mangmang.fun/programming/linux/Linux_Mint/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97.html</link>
      <guid>https://www.mangmang.fun/programming/linux/Linux_Mint/%E5%86%85%E5%AD%98%E4%BC%98%E5%8C%96%E5%AE%8C%E5%85%A8%E6%8C%87%E5%8D%97.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">内存优化完全指南</source>
      <description>这篇记录一次真实的 Linux Mint 内存优化过程：从内存告急、Swap 打满，到切换纯 zram、调整内核策略、加上 OOM 保护，最终把系统稳定性和响应速度拉回到优秀状态。</description>
      <category>Linux</category>
      <pubDate>Fri, 20 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这篇记录一次真实的 Linux Mint 内存优化过程：从内存告急、Swap 打满，到切换纯 zram、调整内核策略、加上 OOM 保护，最终把系统稳定性和响应速度拉回到优秀状态。</p>
<!-- more -->
<h2>一 问题背景</h2>
<h3>1.1 初始状态</h3>
<p>排查时的核心数据：</p>
<ul>
<li><strong>物理内存</strong>: 29GB</li>
<li><strong>已使用</strong>: 25GB (86%)</li>
<li><strong>可用内存</strong>: 3.5GB</li>
<li><strong>Swap</strong>: 15GB，几乎耗尽</li>
</ul>
<h3>1.2 主要问题</h3>
<p>| 问题 | 严重程度 | 影响 |<br>
|</p>
]]></content:encoded>
    </item>
    <item>
      <title>OpenCode Superpowers：编码 + 写博客 skills 使用方案（自用版）</title>
      <link>https://www.mangmang.fun/ai/superpowers/opencode-skills-playbook.html</link>
      <guid>https://www.mangmang.fun/ai/superpowers/opencode-skills-playbook.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">OpenCode Superpowers：编码 + 写博客 skills 使用方案（自用版）</source>
      <description>这篇不解释太多背景，目标是：我在写博客和写代码时，如何用 Superpowers 这套 skills 把工作流“固定下来”，减少跑偏与返工。</description>
      <category>AI</category>
      <category>工具</category>
      <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这篇不解释太多背景，目标是：我在写博客和写代码时，如何用 Superpowers<br>
这套 skills 把工作流“固定下来”，减少跑偏与返工。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>OpenCode Superpowers：框架总览与上手路线</title>
      <link>https://www.mangmang.fun/ai/superpowers/opencode-superpowers-overview.html</link>
      <guid>https://www.mangmang.fun/ai/superpowers/opencode-superpowers-overview.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">OpenCode Superpowers：框架总览与上手路线</source>
      <description>Superpowers 不是“又一套提示词”，而是一套给编码代理用的开发方法： 强制先澄清、先写计划、再执行、最后验证。 这篇以 OpenCode 为主视角，把上游仓库 obra/superpowers 的核心要点整理成一篇 可直接照着用的速查。</description>
      <category>AI</category>
      <category>工具</category>
      <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>Superpowers 不是“又一套提示词”，而是一套给编码代理用的开发方法：<br>
强制先澄清、先写计划、再执行、最后验证。</p>
<p>这篇以 OpenCode 为主视角，把上游仓库 <code>obra/superpowers</code> 的核心要点整理成一篇<br>
可直接照着用的速查。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>OpenCode + Superpowers：技能插件安装与用法</title>
      <link>https://www.mangmang.fun/ai/superpowers/opencode-superpowers.html</link>
      <guid>https://www.mangmang.fun/ai/superpowers/opencode-superpowers.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">OpenCode + Superpowers：技能插件安装与用法</source>
      <description>Superpowers 是一套给 OpenCode 增强“技能（skills）体系”的插件与技能包： 把常用的提示词/工作流封装成可复用技能，并在每次对话时自动注入必要的引导上下文。</description>
      <category>AI</category>
      <category>工具</category>
      <pubDate>Mon, 16 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>Superpowers 是一套给 OpenCode 增强“技能（skills）体系”的插件与技能包：<br>
把常用的提示词/工作流封装成可复用技能，并在每次对话时自动注入必要的引导上下文。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>Claude Code 多分支工作流实战总结（2026）</title>
      <link>https://www.mangmang.fun/ai/claude-code-branch-workflow-2026.html</link>
      <guid>https://www.mangmang.fun/ai/claude-code-branch-workflow-2026.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">Claude Code 多分支工作流实战总结（2026）</source>
      <description>这篇是对一篇 Claude Code 工作流文章的中文实战整理版。 核心结论很直接：不要在一个分支里让 AI 连续改代码，要用“任务隔离 + 并行执行 + 人工验收”的方式把效率和可控性同时拉起来。</description>
      <category>AI</category>
      <pubDate>Wed, 11 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>这篇是对一篇 Claude Code 工作流文章的中文实战整理版。<br>
核心结论很直接：不要在一个分支里让 AI 连续改代码，要用“任务隔离 +<br>
并行执行 + 人工验收”的方式把效率和可控性同时拉起来。</p>
<!-- more -->
]]></content:encoded>
    </item>
    <item>
      <title>OpenClaw 个人 24 小时在线部署实战</title>
      <link>https://www.mangmang.fun/ai/openclaw.html</link>
      <guid>https://www.mangmang.fun/ai/openclaw.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">OpenClaw 个人 24 小时在线部署实战</source>
      <description>最近把 OpenClaw 在个人 Linux 机器上完整跑通了。 这篇不是理想教程，而是可复现的真实部署记录：初始化、守护进程常驻、 渠道接入、Web 搜索和安全收紧。</description>
      <category>AI</category>
      <pubDate>Tue, 10 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[
<p>最近把 OpenClaw 在个人 Linux 机器上完整跑通了。<br>
这篇不是理想教程，而是可复现的真实部署记录：初始化、守护进程常驻、<br>
渠道接入、Web 搜索和安全收紧。</p>
<!-- more -->
<p>适合人群：</p>
<ul>
<li>个人单用户场景</li>
<li>希望 24 小时在线</li>
<li>想接 Telegram 或飞书</li>
<li>想一次把常见坑踩完</li>
</ul>
]]></content:encoded>
    </item>
    <item>
      <title>VNC 单脚本管理与批量下发</title>
      <link>https://www.mangmang.fun/programming/linux/%E5%9F%BA%E7%A1%80/05-vnc-%E5%8D%95%E8%84%9A%E6%9C%AC%E7%AE%A1%E7%90%86%E4%B8%8E%E6%89%B9%E9%87%8F%E4%B8%8B%E5%8F%91.html</link>
      <guid>https://www.mangmang.fun/programming/linux/%E5%9F%BA%E7%A1%80/05-vnc-%E5%8D%95%E8%84%9A%E6%9C%AC%E7%AE%A1%E7%90%86%E4%B8%8E%E6%89%B9%E9%87%8F%E4%B8%8B%E5%8F%91.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">VNC 单脚本管理与批量下发</source>
      <description>本文记录一次 VNC 运维落地方案：在单机用 vnc_ctl.sh 统一管理服务生命周期，再通过 deploy_to_desktop.sh 按 IP 列表批量下发到多台 Linux 机器。</description>
      <category>Linux</category>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本文记录一次 VNC 运维落地方案：在单机用 <code>vnc_ctl.sh</code> 统一管理服务生命周期，再通过 <code>deploy_to_desktop.sh</code> 按 IP 列表批量下发到多台 Linux 机器。</p>
<!-- more -->
<h1>VNC 单脚本管理与批量下发</h1>
<h2>1. 目标场景</h2>
<p>示例目标机器：</p>
<ul>
<li><code>10.6.223.223</code></li>
<li><code>10.6.220.165</code></li>
<li><code>10.6.221.8</code></li>
<li><code>10.6.223.233</code></li>
</ul>
<p>统一目标：</p>
<ol>
<li>在远程桌面生成 <code>vnc_ctl.sh</code></li>
<li>后台运行 <code>x0vncserver</code></li>
<li>提供开机自启能力</li>
<li>支持状态检查与一键停止</li>
<li>支持批量下发，减少重复操作</li>
</ol>
<h2>2. 管理脚本设计</h2>
<p>主脚本：<code>vnc_ctl.sh</code></p>
<p>支持命令：</p>
<ul>
<li><code>start</code>：启动 VNC</li>
<li><code>stop</code>：停止 VNC</li>
<li><code>check</code>：检查进程、端口、密码文件与日志</li>
<li><code>restart</code>：重启服务</li>
<li><code>install-autostart</code>：安装 <code>@reboot</code> 自启</li>
<li><code>remove-autostart</code>：移除自启</li>
</ul>
<p>核心思路：</p>
<ul>
<li>通过 <code>pgrep</code> 精确匹配 <code>x0vncserver</code> 参数定位进程</li>
<li>使用 <code>nohup</code> 后台运行并记录日志</li>
<li>通过 <code>crontab</code> 注入 <code>@reboot</code> 行实现开机拉起</li>
</ul>
<p>示例（启动命令段）：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">nohup</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> x0vncserver</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">  -display</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ":0"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">  -passwordfile</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$HOME</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/.vnc/passwd"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">  -rfbport</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "5900"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">  -nevershared</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#986801;--shiki-dark:#D19A66">  -idletimeout</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 0</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">  >></span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$HOME</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/.vnc/x0vncserver-5900.log"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> 2>&#x26;1 &#x26;</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>3. 批量下发脚本</h2>
<p>下发脚本：<code>deploy_to_desktop.sh</code></p>
<p>用途：把本地脚本按 IP 列表分发到远程桌面目录，并自动加执行权限。</p>
<p>示例命令：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./deploy_to_desktop.sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ./vnc_ctl.sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 10.6.223.233,10.6.220.165</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> sunri</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>脚本默认行为：</p>
<ul>
<li>目标目录默认为 <code>/home/&lt;user&gt;/Desktop</code></li>
<li>使用 SSH/SCP 分发</li>
<li>分发后自动执行 <code>chmod +x</code></li>
</ul>
<h2>4. 推荐使用流程</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> +x</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ./vnc_ctl.sh</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ./deploy_to_desktop.sh</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./deploy_to_desktop.sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> ./vnc_ctl.sh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -i</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> 10.6.223.233,10.6.220.165</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> sunri</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>远程执行示例：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ssh</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> sunri@10.6.220.165</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "/home/sunri/Desktop/vnc_ctl.sh install-autostart &#x26;&#x26; /home/sunri/Desktop/vnc_ctl.sh start &#x26;&#x26; /home/sunri/Desktop/vnc_ctl.sh check"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>5. 测试结论</h2>
<ul>
<li><code>10.6.220.165</code>：下发成功，脚本存在且可执行</li>
<li><code>10.6.223.233</code>：下发失败，原因为 SSH 认证失败（<code>Permission denied</code>）</li>
</ul>
<h2>6. 常见问题排查</h2>
<ul>
<li>缺少密码文件：在目标机执行 <code>vncpasswd</code></li>
<li>端口未监听：检查 <code>~/.vnc/x0vncserver-5900.log</code></li>
<li>开机自启未生效：检查 <code>crontab -l</code> 中 <code>@reboot ... vnc_ctl.sh start ...</code></li>
<li>无法下发：先手动验证 <code>ssh &lt;user&gt;@&lt;ip&gt;</code></li>
</ul>
<h2>7. 小结</h2>
<p>该方案把 VNC 运维拆成两个可复用脚本：</p>
<ul>
<li>单机统一管理生命周期</li>
<li>多机统一批量下发</li>
</ul>
<p>适合内网多台 Linux 机器的日常维护与快速复制部署。</p>
]]></content:encoded>
    </item>
    <item>
      <title>远程 C++ 项目一键全量构建</title>
      <link>https://www.mangmang.fun/programming/backend/c__/01-%E8%BF%9C%E7%A8%8B-cpp-%E9%A1%B9%E7%9B%AE%E4%B8%80%E9%94%AE%E5%85%A8%E9%87%8F%E6%9E%84%E5%BB%BA.html</link>
      <guid>https://www.mangmang.fun/programming/backend/c__/01-%E8%BF%9C%E7%A8%8B-cpp-%E9%A1%B9%E7%9B%AE%E4%B8%80%E9%94%AE%E5%85%A8%E9%87%8F%E6%9E%84%E5%BB%BA.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">远程 C++ 项目一键全量构建</source>
      <description>这篇文章整理一次远程 C++ 项目编译流程：从 SSH 连接、路径核对，到将全量构建固化为 build.sh，把重复手工操作改成一条可复用命令。</description>
      <category>编程</category>
      <category>C++</category>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>这篇文章整理一次远程 C++ 项目编译流程：从 SSH 连接、路径核对，到将全量构建固化为 <code>build.sh</code>，把重复手工操作改成一条可复用命令。</p>
<!-- more -->
<h1>远程 C++ 项目一键全量构建</h1>
<h2>1. 场景信息</h2>
<ul>
<li>目标主机：<code>10.6.223.0</code></li>
<li>项目根目录：<code>/home/sunri/PRS-7950/V1.00_2024</code></li>
<li>C++ 源码目录：<code>/home/sunri/PRS-7950/V1.00_2024/src_cxx</code></li>
</ul>
<h2>2. 先确认连接与路径</h2>
<p>先验证 SSH 连通性：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ssh</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> 10.6.223.0</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>连接后可用 <code>hostname</code> 确认机器身份。</p>
<p>这次排查中，一个关键点是目录名确认：</p>
<ul>
<li>错误路径：<code>/home/sunri/PRS-7950/V1.00_2024/src_cx</code></li>
<li>正确路径：<code>/home/sunri/PRS-7950/V1.00_2024/src_cxx</code></li>
</ul>
<p>编译前先核对路径，通常比盲目调整编译参数更有效。</p>
<h2>3. 执行增量编译</h2>
<p>在源码目录执行：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -j</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"$(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">nproc</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">)"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><p>说明：</p>
<ul>
<li><code>-j&quot;$(nproc)&quot;</code> 表示按 CPU 核心数并行编译</li>
<li>若出现 <code>Nothing to be done for 'first'</code>，通常表示该目标已是最新状态（增量构建正常现象）</li>
</ul>
<h2>4. 固化为一键全量构建脚本</h2>
<p>在 <code>src_cxx</code> 下创建 <code>build.sh</code>：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#!/usr/bin/env bash</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">set</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -euo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> pipefail</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">SCRIPT_DIR</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"$(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "$(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">dirname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#98C379">${</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">BASH_SOURCE</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">[0]</span><span style="--shiki-light:#E45649;--shiki-dark:#98C379">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">")" &#x26;&#x26; </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">pwd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">)"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$SCRIPT_DIR</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "[build] Cleaning project..."</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clean</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "[build] Building project (full rebuild)..."</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -j</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"$(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">nproc</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">)"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">echo</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "[build] Done."</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>赋予执行权限：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">chmod</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> +x</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> build.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div></div></div><h2>5. 日常使用方式</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/sunri/PRS-7950/V1.00_2024/src_cxx</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">./build.sh</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><p>脚本固定执行两步：</p>
<ol>
<li><code>make clean</code></li>
<li><code>make -j&quot;$(nproc)&quot;</code></li>
</ol>
<h2>6. 小结</h2>
<p>这套流程的核心不是命令复杂度，而是标准化：</p>
<ul>
<li>先确认路径和环境</li>
<li>再把全量构建流程脚本化</li>
</ul>
<p>后续交付或排障时，只需要统一执行 <code>./build.sh</code> 即可降低沟通与操作成本。</p>
]]></content:encoded>
    </item>
    <item>
      <title>AlgoSimulation 打包与交付记录</title>
      <link>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/algosimulation-%E6%89%93%E5%8C%85%E4%B8%8E%E4%BA%A4%E4%BB%98%E8%AE%B0%E5%BD%95.html</link>
      <guid>https://www.mangmang.fun/work/project-summary/%E6%99%BA%E8%83%BD%E5%B7%A1%E8%A7%86/algosimulation-%E6%89%93%E5%8C%85%E4%B8%8E%E4%BA%A4%E4%BB%98%E8%AE%B0%E5%BD%95.html</guid>
      <source url="https://www.mangmang.fun/rss.xml">AlgoSimulation 打包与交付记录</source>
      <description>本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程，重点是 OpenSSL 符号版本冲突的定位与处理。</description>
      <category>工作</category>
      <category>项目总结</category>
      <pubDate>Mon, 09 Mar 2026 00:00:00 GMT</pubDate>
      <content:encoded><![CDATA[<p>本文记录 AlgoSimulation 在目标机器上的编译、依赖修正与独立目录打包过程，重点是 OpenSSL 符号版本冲突的定位与处理。</p>
<!-- more -->
<h1>AlgoSimulation 打包与交付记录</h1>
<h2>1. 目标与环境</h2>
<ul>
<li>编译目标：<code>/home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</code></li>
<li>编译机：<code>10.6.221.8</code></li>
<li>参考机：<code>10.6.220.186</code></li>
<li>约束：<code>08_Preview</code> 已同步完成，本次仅处理编译、链接与打包</li>
</ul>
<h2>2. 基础编译流程</h2>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> PRJHOME</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">home</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">sunri</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">IdeaProjects</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">V2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">00</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> CYGHOME</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">home</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">sunri</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">08_Preview</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">linx80</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">qmake</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> AlgoSimulation.pro</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -j4</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>3. 链接问题与修正</h2>
<p>链接阶段出现 OpenSSL 相关符号版本不匹配（<code>OPENSSL_1_1_0d</code>）。</p>
<p>原因是 <code>libmosquitto</code>、<code>libcurl</code>、<code>libssh2</code> 依赖的 OpenSSL 版本，与系统默认搜索到的 <code>libssl/libcrypto</code> 不一致。</p>
<p>修正方式：通过 <code>qmake</code> 注入链接参数，显式指定 <code>gmssl</code> 库并关闭 <code>as-needed</code> 提前裁剪。</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> PRJHOME</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">home</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">sunri</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">IdeaProjects</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">V2</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">.</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">00</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> CYGHOME</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">home</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">sunri</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">08_Preview</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">/</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">linx80</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /home/sunri/IdeaProjects/V2.00/src_cxx/99_TestTool/AlgoSimulation</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> clean</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">qmake</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "QMAKE_LFLAGS+=-Wl,--no-as-needed"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      "LIBS+=/usr/local/gmssl/lib/libssl.so.1.1 /usr/local/gmssl/lib/libcrypto.so.1.1"</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> \</span></span>
<span class="line"><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">      AlgoSimulation.pro</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">make</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -j4</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>编译产物：<code>/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation</code></p>
<h2>4. 独立目录打包</h2>
<p>目标目录：<code>/home/sunri/Desktop/AlgoSimulation_tool</code></p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">TOOL</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/home/sunri/Desktop/AlgoSimulation_tool</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">BIN</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/home/sunri/IdeaProjects/V2.00/binary/linx80/bin/AlgoSimulation</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">rm</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -rf</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">mkdir</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -p</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/bin"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/lib"</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cp</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$BIN</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/bin/"</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">ldd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$BIN</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">awk</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> '/=> \/home\/sunri\// {print $3} /=> \/usr\/local\/gmssl\// {print $3}'</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">sort</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -u</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">while</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2"> read</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -r</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> so</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">; </span><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">do</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">  cp</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$so</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/lib/"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">done</span></span>
<span class="line"></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cp</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /usr/local/gmssl/lib/libssl.so.1.1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/lib/"</span></span>
<span class="line"><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">cp</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -f</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> /usr/local/gmssl/lib/libcrypto.so.1.1</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$TOOL</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/lib/"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><p>启动脚本 <code>run_AlgoSimulation.sh</code>：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#A0A1A7;--shiki-light-font-style:italic;--shiki-dark:#7F848E;--shiki-dark-font-style:italic">#!/usr/bin/env bash</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">set</span><span style="--shiki-light:#986801;--shiki-dark:#D19A66"> -e</span></span>
<span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">SCRIPT_DIR</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"$(</span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">cd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "$(</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">dirname</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">$0</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">")" &#x26;&#x26; </span><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">pwd</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">)"</span></span>
<span class="line"><span style="--shiki-light:#A626A4;--shiki-dark:#C678DD">export</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75"> LD_LIBRARY_PATH</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$SCRIPT_DIR</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/lib:</span><span style="--shiki-light:#E45649;--shiki-dark:#98C379">${</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">LD_LIBRARY_PATH</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">:-</span><span style="--shiki-light:#E45649;--shiki-dark:#98C379">}</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span>
<span class="line"><span style="--shiki-light:#0184BC;--shiki-dark:#56B6C2">exec</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">$SCRIPT_DIR</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/bin/AlgoSimulation"</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "</span><span style="--shiki-light:#383A42;--shiki-light-font-style:inherit;--shiki-dark:#E06C75;--shiki-dark-font-style:italic">$@</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div><div class="line-number"></div></div></div><h2>5. 验证结果</h2>
<p>缺库检查：</p>
<div class="language-bash line-numbers-mode" data-highlighter="shiki" data-ext="bash" style="--shiki-light:#383A42;--shiki-dark:#abb2bf;--shiki-light-bg:#FAFAFA;--shiki-dark-bg:#282c34"><pre class="shiki shiki-themes one-light one-dark-pro vp-code"><code class="language-bash"><span class="line"><span style="--shiki-light:#E45649;--shiki-dark:#E06C75">LD_LIBRARY_PATH</span><span style="--shiki-light:#383A42;--shiki-dark:#56B6C2">=</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/home/sunri/Desktop/AlgoSimulation_tool/lib</span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF"> \</span></span>
<span class="line"><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF">ldd </span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379">/home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation</span><span style="--shiki-light:#383A42;--shiki-dark:#ABB2BF"> | </span><span style="--shiki-light:#4078F2;--shiki-dark:#61AFEF">grep</span><span style="--shiki-light:#50A14F;--shiki-dark:#98C379"> "not found"</span></span></code></pre>
<div class="line-numbers" aria-hidden="true" style="counter-reset:line-number 0"><div class="line-number"></div><div class="line-number"></div></div></div><ul>
<li>结果：无输出（未发现缺失依赖）</li>
</ul>
<p>启动冒烟：</p>
<ul>
<li>在无图形会话环境下提示 <code>cannot connect to X server</code></li>
<li>结论：当前阻塞点是图形环境，不是依赖缺失</li>
</ul>
<h2>6. 交付清单</h2>
<ul>
<li><code>/home/sunri/Desktop/AlgoSimulation_tool/bin/AlgoSimulation</code></li>
<li><code>/home/sunri/Desktop/AlgoSimulation_tool/lib/</code></li>
<li><code>/home/sunri/Desktop/AlgoSimulation_tool/run_AlgoSimulation.sh</code></li>
</ul>
<h2>7. 后续建议</h2>
<p>若后续仍出现符号版本或缺库问题，优先按缺失项从 <code>10.6.220.186</code> 精准补齐，避免全量同步带来的不可控差异。</p>
]]></content:encoded>
    </item>
  </channel>
</rss>