<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Tools on LingHui 的技术笔记</title><link>https://note.plhwiki.cn/tools/</link><description>Recent content in Tools on LingHui 的技术笔记</description><generator>Hugo</generator><language>zh-cn</language><lastBuildDate>Tue, 20 Oct 2026 22:09:51 -0400</lastBuildDate><atom:link href="https://note.plhwiki.cn/tools/index.xml" rel="self" type="application/rss+xml"/><item><title/><link>https://note.plhwiki.cn/tools/deploy/https/</link><pubDate>Tue, 20 Oct 2026 22:09:51 -0400</pubDate><guid>https://note.plhwiki.cn/tools/deploy/https/</guid><description>&lt;h1 id="https-配置"&gt;HTTPS 配置&lt;/h1&gt;
&lt;h2 id="配置https"&gt;配置HTTPS&lt;/h2&gt;
&lt;h3 id="安装-certbot"&gt;安装 Certbot：&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt update
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo apt install -y snapd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap refresh core
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo snap install --classic certbot
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo ln -s /snap/bin/certbot /usr/local/bin/certbot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="申请证书并自动配置-nginx"&gt;申请证书并自动配置 Nginx：&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;sudo certbot --nginx -d note.plhwiki.cn
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;旧域名 &lt;code&gt;plhwiki.cn&lt;/code&gt;、&lt;code&gt;www.plhwiki.cn&lt;/code&gt; 的证书仍然保留，用于把 HTTPS 访问 301 跳转到 &lt;code&gt;note.plhwiki.cn&lt;/code&gt;。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/cmake/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/build/cmake/</guid><description>&lt;h1 id="cmake-学习笔记"&gt;CMake 学习笔记&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;目录&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%bf%ab%e9%80%9f%e5%85%a5%e9%97%a8"&gt;快速入门&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-%e5%b7%a5%e4%bd%9c%e5%8e%9f%e7%90%86"&gt;CMake 工作原理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%ae%89%e8%a3%85%e6%8c%87%e5%ae%9a%e7%89%88%e6%9c%ac-cmake%e6%ba%90%e7%a0%81%e7%bc%96%e8%af%91"&gt;安装指定版本 CMake（源码编译）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#out-of-source-%e6%9e%84%e5%bb%ba%e8%a7%84%e8%8c%83"&gt;out-of-source 构建规范&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%ac%ac%e4%b8%80%e4%b8%aa-cmakeliststxt"&gt;第一个 CMakeLists.txt&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%8f%98%e9%87%8f%e4%b8%8e%e6%b5%81%e7%a8%8b%e6%8e%a7%e5%88%b6"&gt;变量与流程控制&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%8f%98%e9%87%8f%e4%bd%bf%e7%94%a8"&gt;变量使用&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%b7%af%e5%be%84%e7%9b%b8%e5%85%b3%e5%8f%98%e9%87%8f"&gt;路径相关变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-%e8%87%aa%e5%b8%a6%e5%8f%98%e9%87%8f"&gt;CMake 自带变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#if-%e6%b5%81%e7%a8%8b%e6%8e%a7%e5%88%b6"&gt;if 流程控制&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cache-%e7%bc%93%e5%ad%98%e5%8f%98%e9%87%8f"&gt;cache 缓存变量&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#include-%e7%94%a8%e6%b3%95"&gt;include 用法&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%8b%ac%e5%8f%b7%e6%b3%a8%e9%87%8a"&gt;括号注释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%b1%9e%e6%80%a7"&gt;属性&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%9e%84%e5%bb%ba%e9%85%8d%e7%bd%ae%e4%b8%8e%e6%97%a5%e5%bf%97"&gt;构建配置与日志&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%bc%96%e8%af%91%e7%b1%bb%e5%9e%8b%e4%b8%8e-c-%e6%a0%87%e5%87%86"&gt;编译类型与 C++ 标准&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%bf%bd%e5%8a%a0%e7%bc%96%e8%af%91%e9%80%89%e9%a1%b9"&gt;追加编译选项&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e6%94%b6%e9%9b%86%e6%ba%90%e6%96%87%e4%bb%b6"&gt;收集源文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%be%93%e5%87%ba%e8%b7%af%e5%be%84%e8%ae%be%e7%bd%ae"&gt;输出路径设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%94%9f%e6%88%90-compile_commandsjson"&gt;生成 compile_commands.json&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%88%86%e6%ad%a5%e7%bc%96%e8%af%91%e4%b8%8e%e6%b8%85%e7%90%86%e6%8c%87%e5%ae%9a-target"&gt;分步编译与清理指定 target&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e8%b0%83%e8%af%95%e6%89%93%e5%8d%b0%e7%94%9f%e6%88%90%e7%9a%84%e5%85%b7%e4%bd%93%e6%8c%87%e4%bb%a4"&gt;调试：打印生成的具体指令&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#message-%e7%94%a8%e6%b3%95"&gt;message 用法&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target-%e4%b8%8e%e4%be%9d%e8%b5%96%e7%ae%a1%e7%90%86"&gt;Target 与依赖管理&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#add_library%e5%88%9b%e5%bb%ba%e5%ba%93%e7%9b%ae%e6%a0%87"&gt;add_library（创建库目标）&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%af%bc%e5%85%a5%e5%a4%96%e9%83%a8%e5%ba%93imported"&gt;导入外部库：IMPORTED&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target_include_directories"&gt;target_include_directories&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#target_link_libraries%e4%be%9d%e8%b5%96%e4%bc%a0%e6%92%ad"&gt;target_link_libraries（依赖传播）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e9%93%be%e6%8e%a5%e9%a2%84%e7%bc%96%e8%af%91%e7%9a%84%e7%ac%ac%e4%b8%89%e6%96%b9%e5%ba%93a--so"&gt;链接预编译的第三方库（.a / .so）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#set_target_properties"&gt;set_target_properties&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#find_package-%e4%b8%8e%e5%af%bc%e5%85%a5%e7%9b%ae%e6%a0%87"&gt;find_package 与导入目标&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e7%94%9f%e6%88%90%e5%99%a8%e8%a1%a8%e8%be%be%e5%bc%8f%e5%9f%ba%e7%a1%80"&gt;生成器表达式基础&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#install"&gt;install&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e4%b8%8e-toolchain"&gt;交叉编译与 Toolchain&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#cmake-toolchain-%e6%96%87%e4%bb%b6"&gt;CMake toolchain 文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#makefile-%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91%e8%a6%81%e7%82%b9"&gt;Makefile 交叉编译要点&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#pkg-config-%e4%ba%a4%e5%8f%89%e7%bc%96%e8%af%91"&gt;pkg-config 交叉编译&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e4%ba%a7%e7%89%a9%e6%a0%a1%e9%aa%8c"&gt;产物校验&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://note.plhwiki.cn/tools/build/cmake/#%e5%b7%a5%e5%85%b7%e9%93%be%e7%9b%ae%e5%bd%95%e7%bb%93%e6%9e%84"&gt;工具链目录结构&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="快速入门"&gt;快速入门&lt;/h2&gt;
&lt;h3 id="cmake-工作原理"&gt;CMake 工作原理&lt;/h3&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/tools/build/assets/image-20241217185914285.png" alt="CMake 生成构建文件并调用构建工具的流程图" loading="lazy"&gt;
&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/makefile/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/build/makefile/</guid><description>&lt;h1 id="make"&gt;Make&lt;/h1&gt;
&lt;blockquote&gt;
&lt;p&gt;面向 Linux / C/C++ / 交叉编译（ARM、MIPS uClibc 工具链）的构建笔记。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="make-基础概念"&gt;Make 基础概念&lt;/h2&gt;
&lt;p&gt;Make 通过比较**目标（target）与其依赖（prerequisite）的修改时间（mtime）**决定是否重建：只要任一依赖比目标新，就执行该目标的命令，并沿依赖图递归向上。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/debug/asan/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/debug/asan/</guid><description>&lt;h1 id="内存错误检查"&gt;内存错误检查&lt;/h1&gt;
&lt;h2 id="addresssanitizerasan"&gt;AddressSanitizer（ASan）&lt;/h2&gt;
&lt;p&gt;下面日志中的 &lt;code&gt;heap-buffer-overflow&lt;/code&gt; 是堆缓冲区越界写，不是内存泄漏。ASan 主要检测越界、释放后使用等错误；泄漏检测由 LeakSanitizer 提供，在部分平台可与 ASan 集成。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;g++ -fsanitize&lt;span class="o"&gt;=&lt;/span&gt;address -o test_asan memory.cpp -g
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;pre tabindex="0"&gt;&lt;code&gt;plh@plh-virtual-machine:~/work/MyProject/c++/plh/DataStructrues/1.linear_List$ ./test_asan
=================================================================
==12293==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x602000000018 at pc 0x5578e1a712ff bp 0x7ffe0f40ead0 sp 0x7ffe0f40eac0
WRITE of size 4 at 0x602000000018 thread T0
#0 0x5578e1a712fe in func() /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:6
#1 0x5578e1a71314 in main /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:11
#2 0x7fdbb00f2082 in __libc_start_main ../csu/libc-start.c:308
#3 0x5578e1a711ad in _start (/home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/test_asan+0x11ad)
0x602000000018 is located 4 bytes to the right of 4-byte region [0x602000000010,0x602000000014)
allocated by thread T0 here:
#0 0x7fdbb071b587 in operator new(unsigned long) ../../../../src/libsanitizer/asan/asan_new_delete.cc:104
#1 0x5578e1a7127e in func() /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:5
#2 0x5578e1a71314 in main /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:11
#3 0x7fdbb00f2082 in __libc_start_main ../csu/libc-start.c:308
SUMMARY: AddressSanitizer: heap-buffer-overflow /home/plh/work/MyProject/c++/plh/DataStructrues/1.linear_List/memory.cpp:6 in func()
Shadow bytes around the buggy address:
0x0c047fff7fb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7fe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
0x0c047fff7ff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
=&amp;gt;0x0c047fff8000: fa fa 04[fa]fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8010: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8020: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8030: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8040: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
0x0c047fff8050: fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa fa
Shadow byte legend (one shadow byte represents 8 application bytes):
Addressable: 00
Partially addressable: 01 02 03 04 05 06 07
Heap left redzone: fa
Freed heap region: fd
Stack left redzone: f1
Stack mid redzone: f2
Stack right redzone: f3
Stack after return: f5
Stack use after scope: f8
Global redzone: f9
Global init order: f6
Poisoned by user: f7
Container overflow: fc
Array cookie: ac
Intra object redzone: bb
ASan internal: fe
Left alloca redzone: ca
Right alloca redzone: cb
Shadow gap: cc
==12293==ABORTING
&lt;/code&gt;&lt;/pre&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/debug/gdb/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/debug/gdb/</guid><description>&lt;h1 id="gdb调试"&gt;gdb调试&lt;/h1&gt;
&lt;p&gt;问题：&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;arm-mol-linux-uclibcgnueabihf-gdb: loadlocale.c:130: _nl_intern_locale_data: Assertion `cnt &amp;lt; (sizeof (_nl_value_type_LC_TIME) / sizeof (_nl_value_type_LC_TIME[0]))&amp;#39; failed.
Aborted (core dumped)
&lt;/code&gt;&lt;/pre&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-shell" data-lang="shell"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;在运行GDB前临时修改locale环境变量，可以有效避免此问题：
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;LANG&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;在启动 gdb 时传递参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;使用 &lt;code&gt;--args&lt;/code&gt; 选项启动 gdb&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gdb --args ./main 10001 /home/meian/work/MyProject/study/reator/reatorHttp/readme/
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;&lt;strong&gt;在 gdb 内部设置参数&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;启动 gdb 后，使用 &lt;code&gt;set args&lt;/code&gt; 命令设置参数，然后运行&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/docker/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/docker/</guid><description>&lt;h1 id="docker"&gt;Docker&lt;/h1&gt;
&lt;h2 id="配置"&gt;配置&lt;/h2&gt;
&lt;h3 id="国内镜像"&gt;国内镜像&lt;/h3&gt;
&lt;p&gt;在Docker daemon 的全局配置文件&lt;code&gt; /etc/docker/daemon.json&lt;/code&gt;写入：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;registry-mirrors&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;https://mirror.ccs.tencentyun.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;配置完重启docker &lt;code&gt;sudo systemctl restart docker&lt;/code&gt;&lt;/p&gt;
&lt;h2 id="docker的client"&gt;Docker的client&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;你输入命令
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker CLI
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/usr/bin/docker
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ /var/run/docker.sock
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Docker daemon
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dockerd
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │ 读取
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;/etc/docker/daemon.json
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;Registry Mirror
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; │
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; ↓
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;腾讯云镜像站
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h1 id="常用命令"&gt;常用命令&lt;/h1&gt;
&lt;h2 id="镜像类"&gt;镜像类&lt;/h2&gt;
&lt;h3 id="查看镜像"&gt;查看镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker images
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="拉取镜像"&gt;拉取镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker pull mysql &lt;span class="c1"&gt;# 未指定标签时使用 latest；latest 是普通标签，不保证代表最新发布版本&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="运行镜像"&gt;运行镜像&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker run tomcat
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="容器类"&gt;容器类&lt;/h2&gt;
&lt;h3 id="查看正在运行的容器"&gt;查看正在运行的容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -a &lt;span class="c1"&gt;# 查看所有容器&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#加格式化方式访问，格式会更加清爽&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps --format &lt;span class="s2"&gt;&amp;#34;table {{.ID}}\t{{.Image}}\t{{.Ports}}\t{{.Status}}\t{{.Names}}&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="停止容器"&gt;停止容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker stop nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="启动容器"&gt;启动容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker start nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart 容器名
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker restart nginx
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="删除容器"&gt;删除容器&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#删除一个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm 容器ID
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f 容器ID &lt;span class="c1"&gt;#强制删除&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f nginx
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;#删除多个&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker rm -f &lt;span class="k"&gt;$(&lt;/span&gt;docker ps -a -q&lt;span class="k"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;或
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;docker ps -a -q &lt;span class="p"&gt;|&lt;/span&gt; xargs docker rm
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;参考：&lt;a href="https://docs.docker.com/reference/cli/docker/image/pull/"&gt;docker image pull&lt;/a&gt;。&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/git/</link><pubDate>Wed, 14 Oct 2026 20:01:02 +0800</pubDate><guid>https://note.plhwiki.cn/tools/git/</guid><description>&lt;p&gt;相关笔记：&lt;a href="https://note.plhwiki.cn/tools/debug/gdb/"&gt;GDB 调试&lt;/a&gt;、&lt;a href="https://note.plhwiki.cn/tools/debug/asan/"&gt;ASan 内存检查&lt;/a&gt;、&lt;a href="https://note.plhwiki.cn/reference/%E5%AD%A6%E4%B9%A0%E8%B5%84%E6%BA%90/"&gt;学习资源&lt;/a&gt;。&lt;/p&gt;
&lt;h1 id="git"&gt;Git&lt;/h1&gt;
&lt;p&gt;&lt;a href="https://learngitbranching.js.org/?locale=zh_CN"&gt;https://learngitbranching.js.org/?locale=zh_CN&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://note.plhwiki.cn/tools/assets/image-20240111143435610.png" alt="image-20240111143435610" loading="lazy"&gt;
&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="git的三个区域"&gt;Git的三个区域&lt;/h2&gt;
&lt;p&gt;Git 的文件有三种状态区域：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;区域&lt;/th&gt;
&lt;th&gt;命令&lt;/th&gt;
&lt;th&gt;说明&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;工作区 (Working Directory)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;你编辑的实际文件&lt;/td&gt;
&lt;td&gt;改动还没 &lt;code&gt;add&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;暂存区 (Staging Area/index)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用 &lt;code&gt;git add&lt;/code&gt; 后进入这里&lt;/td&gt;
&lt;td&gt;等待被 &lt;code&gt;commit&lt;/code&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;本地仓库 (Repository)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;用 &lt;code&gt;git commit&lt;/code&gt; 后进入这里&lt;/td&gt;
&lt;td&gt;已经记录在历史中&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;对应命令区别：&lt;/p&gt;</description></item><item><title/><link>https://note.plhwiki.cn/tools/build/%E7%BC%96%E8%AF%91%E5%99%A8/</link><pubDate>Wed, 14 Oct 2026 08:00:23 -0400</pubDate><guid>https://note.plhwiki.cn/tools/build/%E7%BC%96%E8%AF%91%E5%99%A8/</guid><description>&lt;p&gt;现代编译器通常采用“三段式”架构，分为：&lt;strong&gt;前端（Frontend）、中端（Optimizer，优化器）和后端（Backend，代码生成器）&lt;/strong&gt;。前端的任务是把程序员编写的、具备特定语法的高级语言源代码（如 C++、Java、Python），翻译成一种与具体硬件平台无关的&lt;strong&gt;中间表示（IR，Intermediate Representation）&lt;/strong&gt;，同时检查代码中的语法和语义错误。&lt;/p&gt;</description></item></channel></rss>