{"/posts/markdown-test.html":"---\ntitle: Markdown 语法测试（已更新）\ndate: '2026-09-20'\ncategory:\n  - 技术\ntag:\n  - markdown\n  - 测试\n  - 编辑器\ncover: /uploads/legacy-85aba9f5dbf80501fbc5.svg\ndescription: 测试管理后台编辑器对常用 Markdown 语法、LaTeX、多媒体元素的支持情况。已更新验证后台同步功能。\ntags:\n  - markdown\n  - 测试\n  - 编辑器\nupdatedAt: '2026-09-22T09:45:11.511Z'\n---\n\n\n## 标题与段落\n\nMarkdown 是一种轻量级标记语言，由 **John Gruber** 于 2004 年创建。\n\n**[已更新]** 此行用于验证后台编辑后能否同步到 VPS。\n\n### 三级标题\n\n## 文本样式\n\n- **粗体文本** 用于强调重要内容\n- *斜体文本* 用于轻微强调\n- ~~删除线~~ 表示已过时内容\n- `行内代码` 用于标记变量或命令\n\n## 代码块\n\n```python\ndef fibonacci(n: int) -> list[int]:\n    if n <= 0: return []\n    fib = [0, 1]\n    for i in range(2, n):\n        fib.append(fib[-1] + fib[-2])\n    return fib[:n]\n```\n\n## 表格\n\n| 语言 | 用途 | 难度 |\n|------|------|------|\n| Python | 数据科学 | 中等 |\n| Rust | 系统编程 | 较高 |\n| JavaScript | 前端 | 中等 |\n\n## 引用\n\n> 学而不思则罔，思而不学则殆。 —— 孔子\n\n## 数学公式\n\n质能方程 $E = mc^2$。\n\n二次方程求根公式 $x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$。\n\n## 图片\n\n![城市风景](/uploads/legacy-2076ee49108bd5afa876.svg)\n\n## 视频\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1GJ411x7h7&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" style=\"width:100%;height:450px;border-radius:8px;max-width:800px\"></iframe>\n\n## 结语\n\n**[已更新]** 此文章已通过后台编辑验证同步功能。\n","posts/markdown-test.md":"---\ntitle: Markdown 语法测试（已更新）\ndate: '2026-09-20'\ncategory:\n  - 技术\ntag:\n  - markdown\n  - 测试\n  - 编辑器\ncover: /uploads/legacy-85aba9f5dbf80501fbc5.svg\ndescription: 测试管理后台编辑器对常用 Markdown 语法、LaTeX、多媒体元素的支持情况。已更新验证后台同步功能。\ntags:\n  - markdown\n  - 测试\n  - 编辑器\nupdatedAt: '2026-09-22T09:45:11.511Z'\n---\n\n\n## 标题与段落\n\nMarkdown 是一种轻量级标记语言，由 **John Gruber** 于 2004 年创建。\n\n**[已更新]** 此行用于验证后台编辑后能否同步到 VPS。\n\n### 三级标题\n\n## 文本样式\n\n- **粗体文本** 用于强调重要内容\n- *斜体文本* 用于轻微强调\n- ~~删除线~~ 表示已过时内容\n- `行内代码` 用于标记变量或命令\n\n## 代码块\n\n```python\ndef fibonacci(n: int) -> list[int]:\n    if n <= 0: return []\n    fib = [0, 1]\n    for i in range(2, n):\n        fib.append(fib[-1] + fib[-2])\n    return fib[:n]\n```\n\n## 表格\n\n| 语言 | 用途 | 难度 |\n|------|------|------|\n| Python | 数据科学 | 中等 |\n| Rust | 系统编程 | 较高 |\n| JavaScript | 前端 | 中等 |\n\n## 引用\n\n> 学而不思则罔，思而不学则殆。 —— 孔子\n\n## 数学公式\n\n质能方程 $E = mc^2$。\n\n二次方程求根公式 $x = \\frac{-b \\pm \\sqrt{b^2 - 4ac}}{2a}$。\n\n## 图片\n\n![城市风景](/uploads/legacy-2076ee49108bd5afa876.svg)\n\n## 视频\n\n<iframe src=\"//player.bilibili.com/player.html?bvid=BV1GJ411x7h7&page=1\" scrolling=\"no\" border=\"0\" frameborder=\"no\" framespacing=\"0\" allowfullscreen=\"true\" style=\"width:100%;height:450px;border-radius:8px;max-width:800px\"></iframe>\n\n## 结语\n\n**[已更新]** 此文章已通过后台编辑验证同步功能。\n","/posts/video-embed-demo.html":"---\ntitle: 视频嵌入测试：四种播放模式\nicon: 🎬\ndate: '2026-09-15'\ncategory:\n  - 开发\ntag:\n  - 视频\n  - 前端\n  - 测试\ncover: /uploads/YCBahN8Hao82.png\ndescription: 博客视频嵌入的四种播放模式演示——标准 facade、画轴展开、八角画框、沉浸式弹窗。\ntags:\n  - 视频\n  - 前端\n  - 测试\nupdatedAt: '2026-09-21T10:30:20.145Z'\n---\n\n\n这篇文章用来测试博客的视频嵌入功能。支持 B站 和 YouTube 两大平台，书写语法为 `![[bilibili(BVxx)]]` 或 `![[youtube(id)]]`。\n\n当前实现了四种播放模式，下面逐一演示。\n\n<!-- more -->\n\n## 一、标准模式（默认）\n\n最基本的用法：缩略图占位 → 点击内联播放。B站用渐变色兜底卡（构建期可注入封面），YouTube 自动取 hqdefault 缩略图。\n\n```\n![[bilibili(BV17x411w7KC)]]\n```\n\n![[bilibili(BV17x411w7KC)]]\n\nYouTube 同理：\n\n```\n![[youtube(dQw4w9WgXcQ)]]\n```\n\n![[youtube(dQw4w9WgXcQ)]]\n\n## 二、画轴展开动画\n\n点击播放时，播放器从画面中心向两侧展开（像展开一幅卷轴），0.9 秒缓动动画。所有视频默认带此效果，无需额外参数。\n\n展开后鼠标悬停可看到右上角的 **全屏按钮**，点击可进入沉浸式弹窗模式。\n\n## 三、八角画框 + 宣纸装饰（deco=octagon）\n\n给视频加一个八角形异形窗口，配合宣纸纤维纹理和朱印角标。静态时像一幅挂画，播放后自动恢复为正常矩形。\n\n```\n![[bilibili(BV17x411w7KC, deco=octagon)]]\n```\n\n![[bilibili(BV17x411w7KC, deco=octagon)]]\n\n带封面图的版本（构建期注入 B 站封面 URL）：\n\n```\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon)]]\n```\n\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon)]]\n\nYouTube 八角画框版：\n\n```\n![[youtube(dQw4w9WgXcQ, deco=octagon)]]\n```\n\n![[youtube(dQw4w9WgXcQ, deco=octagon)]]\n\n## 四、沉浸式弹窗（mode=immersive）\n\n点击视频后不原地播放，而是弹出居中大窗口，带毛玻璃背景遮罩。适合想要沉浸式观看体验的场景。关闭方式：点击遮罩、按 ESC 键、或点右上角 ×。\n\n```\n![[bilibili(BV17x411w7KC, mode=immersive)]]\n```\n\n![[bilibili(BV17x411w7KC, mode=immersive)]]\n\nYouTube 沉浸式版：\n\n```\n![[youtube(dQw4w9WgXcQ, mode=immersive)]]\n```\n\n![[youtube(dQw4w9WgXcQ, mode=immersive)]]\n\n## 五、组合效果\n\n所有参数可以自由组合。比如八角画框 + 沉浸式弹窗：\n\n```\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon, mode=immersive)]]\n```\n\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon, mode=immersive)]]\n\n## 语法速查\n\n| 参数 | 值 | 说明 |\n|---|---|---|\n| `cover` | URL | B站封面图地址（构建期注入，YouTube 自动取 hqdefault） |\n| `mode` | `immersive` | 沉浸式弹窗模式（默认内联播放） |\n| `deco` | `octagon` | 八角异形窗口 + 宣纸纹理 + 朱印角标 |\n\n**默认行为**：无额外参数 = 标准 facade + 画轴展开动画 + 内联播放 + 可展开全屏。","posts/video-embed-demo.md":"---\ntitle: 视频嵌入测试：四种播放模式\nicon: 🎬\ndate: '2026-09-15'\ncategory:\n  - 开发\ntag:\n  - 视频\n  - 前端\n  - 测试\ncover: /uploads/YCBahN8Hao82.png\ndescription: 博客视频嵌入的四种播放模式演示——标准 facade、画轴展开、八角画框、沉浸式弹窗。\ntags:\n  - 视频\n  - 前端\n  - 测试\nupdatedAt: '2026-09-21T10:30:20.145Z'\n---\n\n\n这篇文章用来测试博客的视频嵌入功能。支持 B站 和 YouTube 两大平台，书写语法为 `![[bilibili(BVxx)]]` 或 `![[youtube(id)]]`。\n\n当前实现了四种播放模式，下面逐一演示。\n\n<!-- more -->\n\n## 一、标准模式（默认）\n\n最基本的用法：缩略图占位 → 点击内联播放。B站用渐变色兜底卡（构建期可注入封面），YouTube 自动取 hqdefault 缩略图。\n\n```\n![[bilibili(BV17x411w7KC)]]\n```\n\n![[bilibili(BV17x411w7KC)]]\n\nYouTube 同理：\n\n```\n![[youtube(dQw4w9WgXcQ)]]\n```\n\n![[youtube(dQw4w9WgXcQ)]]\n\n## 二、画轴展开动画\n\n点击播放时，播放器从画面中心向两侧展开（像展开一幅卷轴），0.9 秒缓动动画。所有视频默认带此效果，无需额外参数。\n\n展开后鼠标悬停可看到右上角的 **全屏按钮**，点击可进入沉浸式弹窗模式。\n\n## 三、八角画框 + 宣纸装饰（deco=octagon）\n\n给视频加一个八角形异形窗口，配合宣纸纤维纹理和朱印角标。静态时像一幅挂画，播放后自动恢复为正常矩形。\n\n```\n![[bilibili(BV17x411w7KC, deco=octagon)]]\n```\n\n![[bilibili(BV17x411w7KC, deco=octagon)]]\n\n带封面图的版本（构建期注入 B 站封面 URL）：\n\n```\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon)]]\n```\n\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon)]]\n\nYouTube 八角画框版：\n\n```\n![[youtube(dQw4w9WgXcQ, deco=octagon)]]\n```\n\n![[youtube(dQw4w9WgXcQ, deco=octagon)]]\n\n## 四、沉浸式弹窗（mode=immersive）\n\n点击视频后不原地播放，而是弹出居中大窗口，带毛玻璃背景遮罩。适合想要沉浸式观看体验的场景。关闭方式：点击遮罩、按 ESC 键、或点右上角 ×。\n\n```\n![[bilibili(BV17x411w7KC, mode=immersive)]]\n```\n\n![[bilibili(BV17x411w7KC, mode=immersive)]]\n\nYouTube 沉浸式版：\n\n```\n![[youtube(dQw4w9WgXcQ, mode=immersive)]]\n```\n\n![[youtube(dQw4w9WgXcQ, mode=immersive)]]\n\n## 五、组合效果\n\n所有参数可以自由组合。比如八角画框 + 沉浸式弹窗：\n\n```\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon, mode=immersive)]]\n```\n\n![[bilibili(BV17x411w7KC, cover=http://i1.hdslb.com/bfs/archive/5242750857121e05146d5d5b13a47a2a6dd36e98.jpg, deco=octagon, mode=immersive)]]\n\n## 语法速查\n\n| 参数 | 值 | 说明 |\n|---|---|---|\n| `cover` | URL | B站封面图地址（构建期注入，YouTube 自动取 hqdefault） |\n| `mode` | `immersive` | 沉浸式弹窗模式（默认内联播放） |\n| `deco` | `octagon` | 八角异形窗口 + 宣纸纹理 + 朱印角标 |\n\n**默认行为**：无额外参数 = 标准 facade + 画轴展开动画 + 内联播放 + 可展开全屏。","/wiki/networking/":"---\ndate: '2025-01-15'\ntitle: 网络基础\ndescription: DNS、HTTP 与网络协议\nicon: network\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.164Z'\n---\n\n\n# 网络基础\n\nDNS、HTTP 与网络协议。理解网络通信的底层原理与常用配置。","wiki/networking/index.md":"---\ndate: '2025-01-15'\ntitle: 网络基础\ndescription: DNS、HTTP 与网络协议\nicon: network\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.164Z'\n---\n\n\n# 网络基础\n\nDNS、HTTP 与网络协议。理解网络通信的底层原理与常用配置。","/wiki/networking/dns-explained.html":"---\ntitle: DNS 工作原理\ndate: '2026-07-12'\nicon: network\ndescription: 从输入网址到页面打开，DNS 解析的完整链路：递归、迭代、缓存、记录类型。\ntags:\n  - 网络\n  - dns\n  - 基础\nmaturity: budding\ntag:\n  - 网络\n  - dns\n  - 基础\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.162Z'\n---\n\n\n## 一次解析发生了什么\n\n1. 浏览器缓存\n2. 操作系统缓存\n3. hosts 文件\n4. 本地 DNS 服务器（递归解析器）\n5. 根域名服务器\n6. TLD 服务器\n7. 权威域名服务器\n\n## 记录类型\n\n| 记录 | 含义 | 示例 |\n|------|------|------|\n| A | 域名 → IPv4 | example.com → 93.184.216.34 |\n| AAAA | 域名 → IPv6 | example.com → 2606:2800:220:1:248:1893:25c8:1946 |\n| CNAME | 别名 | www → example.com |\n| MX | 邮件服务器 | example.com → mail.example.com |\n| TXT | 任意文本 | SPF、DKIM 验证 |\n| NS | 权威服务器 | example.com → ns1.example.com |\n\n## dig 命令\n\n```bash\ndig example.com              # 基本查询\ndig example.com A            # 指定记录类型\ndig @8.8.8.8 example.com     # 指定 DNS 服务器\ndig +trace example.com       # 追踪完整解析链路\ndig example.com +short       # 简洁输出\n```\n\n`dig` 只是网络工具箱的一员，其余常用命令速查见 [[linux-commands]]。\n\n## 缓存与 TTL\n\n每条记录都有 TTL（Time To Live），单位秒。TTL 内再次查询直接读缓存：\n\n- TTL = 60：适合频繁切换（故障转移）\n- TTL = 86400：稳定记录，减少查询压力\n\n## 常见问题\n\n- **传播延迟**：修改 DNS 并非全球瞬间生效，旧 TTL 缓存过期后才看到新记录\n- **CNAME 不能和其他记录共存**：如果一个域名有 MX 记录，就不能再设 CNAME\n- **DNSSEC**：给 DNS 响应加数字签名，防篡改\n- **自托管踩坑**：子域名解析、反代与证书联动的实战记录在 [[home-server]]\n","wiki/networking/dns-explained.md":"---\ntitle: DNS 工作原理\ndate: '2026-07-12'\nicon: network\ndescription: 从输入网址到页面打开，DNS 解析的完整链路：递归、迭代、缓存、记录类型。\ntags:\n  - 网络\n  - dns\n  - 基础\nmaturity: budding\ntag:\n  - 网络\n  - dns\n  - 基础\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.162Z'\n---\n\n\n## 一次解析发生了什么\n\n1. 浏览器缓存\n2. 操作系统缓存\n3. hosts 文件\n4. 本地 DNS 服务器（递归解析器）\n5. 根域名服务器\n6. TLD 服务器\n7. 权威域名服务器\n\n## 记录类型\n\n| 记录 | 含义 | 示例 |\n|------|------|------|\n| A | 域名 → IPv4 | example.com → 93.184.216.34 |\n| AAAA | 域名 → IPv6 | example.com → 2606:2800:220:1:248:1893:25c8:1946 |\n| CNAME | 别名 | www → example.com |\n| MX | 邮件服务器 | example.com → mail.example.com |\n| TXT | 任意文本 | SPF、DKIM 验证 |\n| NS | 权威服务器 | example.com → ns1.example.com |\n\n## dig 命令\n\n```bash\ndig example.com              # 基本查询\ndig example.com A            # 指定记录类型\ndig @8.8.8.8 example.com     # 指定 DNS 服务器\ndig +trace example.com       # 追踪完整解析链路\ndig example.com +short       # 简洁输出\n```\n\n`dig` 只是网络工具箱的一员，其余常用命令速查见 [[linux-commands]]。\n\n## 缓存与 TTL\n\n每条记录都有 TTL（Time To Live），单位秒。TTL 内再次查询直接读缓存：\n\n- TTL = 60：适合频繁切换（故障转移）\n- TTL = 86400：稳定记录，减少查询压力\n\n## 常见问题\n\n- **传播延迟**：修改 DNS 并非全球瞬间生效，旧 TTL 缓存过期后才看到新记录\n- **CNAME 不能和其他记录共存**：如果一个域名有 MX 记录，就不能再设 CNAME\n- **DNSSEC**：给 DNS 响应加数字签名，防篡改\n- **自托管踩坑**：子域名解析、反代与证书联动的实战记录在 [[home-server]]\n","/wiki/linux/shell-scripting.html":"---\ntitle: Shell 脚本速查\ndate: '2026-07-08'\nicon: terminal\ndescription: Bash 脚本的常用模式：变量、条件、循环、函数，以及 set -euo pipefail 的最佳实践。\ntags:\n  - linux\n  - shell\n  - 脚本\nmaturity: seed\ntag:\n  - linux\n  - shell\n  - 脚本\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.161Z'\n---\n\n\n## 脚本模板\n\n```bash\n#!/usr/bin/env bash\nset -euo pipefail\nIFS=$'\\n\\t'\n\nmain() {\n  echo \"Hello, $*\"\n}\n\nmain \"$@\"\n```\n\n`set -euo pipefail` 的含义：\n\n| 选项 | 效果 |\n|------|------|\n| `-e` | 任一命令失败立即退出 |\n| `-u` | 使用未定义变量报错 |\n| `-o pipefail` | 管道中任一命令失败则整体失败 |\n\n## 变量与参数\n\n```bash\nNAME=${1:?需要一个名字}    # 未提供则报错\nGREETING=\"${2:-Hello}\"     # 默认值\necho \"$GREETING, $NAME\"\n\necho \"参数个数: $#\"\necho \"所有参数: $@\"\necho \"上一个命令退出码: $?\"\n```\n\n## 条件与循环\n\n```bash\nif [[ -f \"$file\" ]]; then\n  echo \"文件存在\"\nelif [[ -d \"$dir\" ]]; then\n  echo \"目录存在\"\nelse\n  echo \"都不存在\"\nfi\n\nfor f in *.txt; do\n  echo \"处理: $f\"\ndone\n\nwhile IFS= read -r line; do\n  echo \"$line\"\ndone < input.txt\n```\n\n## 函数\n\n```bash\nlog() {\n  local level=$1; shift\n  echo \"[$(date +%T)] [$level] $*\"\n}\n\nlog INFO \"开始处理\"\nlog WARN \"注意：文件较大\"\n```\n\n## 常用技巧\n\n```bash\n# 安全临时文件\ntmp=$(mktemp)\ntrap 'rm -f \"$tmp\"' EXIT\n\n# 字符串操作\nfilename=\"${path##*/}\"   # 去目录 -> 文件名\ndirname=\"${path%/*}\"     # 去文件名 -> 目录\next=\"${path##*.}\"        # 扩展名\nbase=\"${filename%.*}\"    # 去扩展名\n\n# 批量重命名\nfor f in *.jpeg; do mv \"$f\" \"${f%.jpeg}.jpg\"; done\n```\n\n脚本里用到的命令大多出自 [[linux-commands]]，基础不牢可以先回那里翻翻。\n","wiki/linux/shell-scripting.md":"---\ntitle: Shell 脚本速查\ndate: '2026-07-08'\nicon: terminal\ndescription: Bash 脚本的常用模式：变量、条件、循环、函数，以及 set -euo pipefail 的最佳实践。\ntags:\n  - linux\n  - shell\n  - 脚本\nmaturity: seed\ntag:\n  - linux\n  - shell\n  - 脚本\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.161Z'\n---\n\n\n## 脚本模板\n\n```bash\n#!/usr/bin/env bash\nset -euo pipefail\nIFS=$'\\n\\t'\n\nmain() {\n  echo \"Hello, $*\"\n}\n\nmain \"$@\"\n```\n\n`set -euo pipefail` 的含义：\n\n| 选项 | 效果 |\n|------|------|\n| `-e` | 任一命令失败立即退出 |\n| `-u` | 使用未定义变量报错 |\n| `-o pipefail` | 管道中任一命令失败则整体失败 |\n\n## 变量与参数\n\n```bash\nNAME=${1:?需要一个名字}    # 未提供则报错\nGREETING=\"${2:-Hello}\"     # 默认值\necho \"$GREETING, $NAME\"\n\necho \"参数个数: $#\"\necho \"所有参数: $@\"\necho \"上一个命令退出码: $?\"\n```\n\n## 条件与循环\n\n```bash\nif [[ -f \"$file\" ]]; then\n  echo \"文件存在\"\nelif [[ -d \"$dir\" ]]; then\n  echo \"目录存在\"\nelse\n  echo \"都不存在\"\nfi\n\nfor f in *.txt; do\n  echo \"处理: $f\"\ndone\n\nwhile IFS= read -r line; do\n  echo \"$line\"\ndone < input.txt\n```\n\n## 函数\n\n```bash\nlog() {\n  local level=$1; shift\n  echo \"[$(date +%T)] [$level] $*\"\n}\n\nlog INFO \"开始处理\"\nlog WARN \"注意：文件较大\"\n```\n\n## 常用技巧\n\n```bash\n# 安全临时文件\ntmp=$(mktemp)\ntrap 'rm -f \"$tmp\"' EXIT\n\n# 字符串操作\nfilename=\"${path##*/}\"   # 去目录 -> 文件名\ndirname=\"${path%/*}\"     # 去文件名 -> 目录\next=\"${path##*.}\"        # 扩展名\nbase=\"${filename%.*}\"    # 去扩展名\n\n# 批量重命名\nfor f in *.jpeg; do mv \"$f\" \"${f%.jpeg}.jpg\"; done\n```\n\n脚本里用到的命令大多出自 [[linux-commands]]，基础不牢可以先回那里翻翻。\n","/wiki/linux/linux-commands.html":"---\ntitle: Linux 常用命令速查\ndate: '2026-07-09'\nicon: terminal\ndescription: 文件、权限、进程、网络与管道——在终端里游刃有余的常用命令集合。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.160Z'\n---\n\n\n## 文件与目录\n\n```bash\nls -lah            # 详细列表，含隐藏文件\ncd -               # 回到上一个目录\npwd                # 当前路径\nmkdir -p a/b/c     # 递归创建目录\ncp -r src dst      # 递归复制\nmv old new         # 移动或重命名\nrm -r dir          # 递归删除（谨慎）\nln -s target link  # 创建软链接\n```\n\n查找文件用 `find`，查找内容用 `grep`，更快的是 `rg`：\n\n```bash\nfind . -name \"*.log\" -mtime -1\ngrep -rn \"TODO\" src/\nrg \"TODO\" src/\n```\n\n## 权限\n\n```bash\nchmod 755 script.sh   # rwxr-xr-x\nchmod +x script.sh    # 增加可执行位\nchown user:group f    # 修改属主\n```\n\n数字权限：`4` 读、`2` 写、`1` 执行，三组分别对应属主、属组、其他。\n\n## 进程\n\n| 命令 | 作用 |\n|------|------|\n| `ps aux` | 列出所有进程 |\n| `top` / `htop` | 实时监控 |\n| `kill -9 <pid>` | 强制结束进程 |\n| `pgrep -f name` | 按名字找 pid |\n| `nohup cmd &` | 后台运行，退出终端不中断 |\n\n## 网络\n\n```bash\ncurl -I https://example.com   # 只看响应头\ncurl -O url                   # 下载文件\nss -tlnp                      # 查看监听端口\nping -c 4 host                # 测试连通性\nscp file user@host:/path      # 远程拷贝\n```\n\n域名打不开时，问题可能不在命令而在解析：排查思路见 [[dns-explained]]。\n\n## 管道与重定向\n\n把命令像水管一样接起来，是 Unix 哲学的精髓：\n\n```bash\ncat access.log | grep 500 | awk '{print $7}' | sort | uniq -c | sort -rn | head\n```\n\n- `>` 覆盖写入，`>>` 追加写入。\n- `2>` 重定向标准错误，`&>` 同时重定向两者。\n- `|` 把前一个命令的输出作为后一个命令的输入。\n\n## 压缩\n\n```bash\ntar -czf archive.tar.gz dir/     # 打包压缩\ntar -xzf archive.tar.gz          # 解压\nunzip file.zip\n```\n\n> 记不住参数没关系，`man` 和 `--help` 永远在线。理解「一切皆文件」和「小工具组合」，比背命令更重要。\n>\n> 命令熟练之后，下一步是把它们串成脚本：[[shell-scripting]]。\n","wiki/linux/linux-commands.md":"---\ntitle: Linux 常用命令速查\ndate: '2026-07-09'\nicon: terminal\ndescription: 文件、权限、进程、网络与管道——在终端里游刃有余的常用命令集合。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.160Z'\n---\n\n\n## 文件与目录\n\n```bash\nls -lah            # 详细列表，含隐藏文件\ncd -               # 回到上一个目录\npwd                # 当前路径\nmkdir -p a/b/c     # 递归创建目录\ncp -r src dst      # 递归复制\nmv old new         # 移动或重命名\nrm -r dir          # 递归删除（谨慎）\nln -s target link  # 创建软链接\n```\n\n查找文件用 `find`，查找内容用 `grep`，更快的是 `rg`：\n\n```bash\nfind . -name \"*.log\" -mtime -1\ngrep -rn \"TODO\" src/\nrg \"TODO\" src/\n```\n\n## 权限\n\n```bash\nchmod 755 script.sh   # rwxr-xr-x\nchmod +x script.sh    # 增加可执行位\nchown user:group f    # 修改属主\n```\n\n数字权限：`4` 读、`2` 写、`1` 执行，三组分别对应属主、属组、其他。\n\n## 进程\n\n| 命令 | 作用 |\n|------|------|\n| `ps aux` | 列出所有进程 |\n| `top` / `htop` | 实时监控 |\n| `kill -9 <pid>` | 强制结束进程 |\n| `pgrep -f name` | 按名字找 pid |\n| `nohup cmd &` | 后台运行，退出终端不中断 |\n\n## 网络\n\n```bash\ncurl -I https://example.com   # 只看响应头\ncurl -O url                   # 下载文件\nss -tlnp                      # 查看监听端口\nping -c 4 host                # 测试连通性\nscp file user@host:/path      # 远程拷贝\n```\n\n域名打不开时，问题可能不在命令而在解析：排查思路见 [[dns-explained]]。\n\n## 管道与重定向\n\n把命令像水管一样接起来，是 Unix 哲学的精髓：\n\n```bash\ncat access.log | grep 500 | awk '{print $7}' | sort | uniq -c | sort -rn | head\n```\n\n- `>` 覆盖写入，`>>` 追加写入。\n- `2>` 重定向标准错误，`&>` 同时重定向两者。\n- `|` 把前一个命令的输出作为后一个命令的输入。\n\n## 压缩\n\n```bash\ntar -czf archive.tar.gz dir/     # 打包压缩\ntar -xzf archive.tar.gz          # 解压\nunzip file.zip\n```\n\n> 记不住参数没关系，`man` 和 `--help` 永远在线。理解「一切皆文件」和「小工具组合」，比背命令更重要。\n>\n> 命令熟练之后，下一步是把它们串成脚本：[[shell-scripting]]。\n","/wiki/linux/":"---\ndate: '2025-01-15'\ntitle: Linux 系统\ndescription: 命令行、脚本与系统管理\nicon: terminal\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.159Z'\n---\n\n\n# Linux 系统\n\n命令行、脚本与系统管理。从基础命令到 Shell 脚本，覆盖日常运维所需。","wiki/linux/index.md":"---\ndate: '2025-01-15'\ntitle: Linux 系统\ndescription: 命令行、脚本与系统管理\nicon: terminal\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.159Z'\n---\n\n\n# Linux 系统\n\n命令行、脚本与系统管理。从基础命令到 Shell 脚本，覆盖日常运维所需。","/wiki/dev-tools/vscode-shortcuts.html":"---\ntitle: VS Code 快捷键与配置\ndate: '2026-07-14'\nicon: tools\ndescription: 把双手留在键盘上的快捷键清单，外加一份让编辑器更顺手的配置。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.158Z'\n---\n\n\n## 编辑效率\n\n| 操作 | Windows / Linux | macOS |\n|------|-----------------|-------|\n| 命令面板 | `Ctrl+Shift+P` | `Cmd+Shift+P` |\n| 快速打开文件 | `Ctrl+P` | `Cmd+P` |\n| 复制当前行 | `Shift+Alt+Down` | `Shift+Opt+Down` |\n| 移动当前行 | `Alt+Up/Down` | `Opt+Up/Down` |\n| 多光标 | `Alt+Click` | `Opt+Click` |\n| 选中下一个相同词 | `Ctrl+D` | `Cmd+D` |\n| 选中所有相同词 | `Ctrl+Shift+L` | `Cmd+Shift+L` |\n| 注释当前行 | `Ctrl+/` | `Cmd+/` |\n\n## 导航与查找\n\n- `Ctrl+G` 跳转到指定行。\n- `Ctrl+Shift+O` 跳转到当前文件的符号。\n- `Ctrl+T` 跨文件搜索符号。\n- `F12` 跳转到定义，`Alt+F12` 速览定义。\n- `Ctrl+Shift+F` 全局搜索，支持正则。\n\n## 终端与窗口\n\n- `` Ctrl+` `` 切换集成终端。\n- `Ctrl+B` 切换侧边栏。\n- `Ctrl+\\` 拆分编辑器。\n- `Ctrl+1/2/3` 在编辑器组之间跳转。\n\n## 一份顺手的配置\n\n把下面这段放进 `settings.json`，按需取舍：\n\n```json\n{\n  \"editor.fontSize\": 14,\n  \"editor.fontFamily\": \"JetBrains Mono, Consolas, monospace\",\n  \"editor.fontLigatures\": true,\n  \"editor.cursorBlinking\": \"smooth\",\n  \"editor.smoothScrolling\": true,\n  \"editor.bracketPairColorization.enabled\": true,\n  \"editor.guides.bracketPairs\": \"active\",\n  \"files.autoSave\": \"afterDelay\",\n  \"files.trimTrailingWhitespace\": true,\n  \"editor.formatOnSave\": true,\n  \"editor.minimap.enabled\": false,\n  \"workbench.layoutControl.enabled\": false\n}\n```\n\n## 推荐插件思路\n\n不必堆插件，按需要装：\n\n- **语言服务**：对应语言的官方或社区扩展。\n- **格式化**：Prettier 或语言自带格式化器，统一风格。\n- **Git 可视化**：GitLens 或 Git Graph，让历史可读，搭配 [[git-notes]] 效果更佳。\n- **图标主题**：让文件树一眼可辨。\n\n> 工具的价值在于减少摩擦，而不是增加配置。能记住的快捷键，永远比菜单快。\n","wiki/dev-tools/vscode-shortcuts.md":"---\ntitle: VS Code 快捷键与配置\ndate: '2026-07-14'\nicon: tools\ndescription: 把双手留在键盘上的快捷键清单，外加一份让编辑器更顺手的配置。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.158Z'\n---\n\n\n## 编辑效率\n\n| 操作 | Windows / Linux | macOS |\n|------|-----------------|-------|\n| 命令面板 | `Ctrl+Shift+P` | `Cmd+Shift+P` |\n| 快速打开文件 | `Ctrl+P` | `Cmd+P` |\n| 复制当前行 | `Shift+Alt+Down` | `Shift+Opt+Down` |\n| 移动当前行 | `Alt+Up/Down` | `Opt+Up/Down` |\n| 多光标 | `Alt+Click` | `Opt+Click` |\n| 选中下一个相同词 | `Ctrl+D` | `Cmd+D` |\n| 选中所有相同词 | `Ctrl+Shift+L` | `Cmd+Shift+L` |\n| 注释当前行 | `Ctrl+/` | `Cmd+/` |\n\n## 导航与查找\n\n- `Ctrl+G` 跳转到指定行。\n- `Ctrl+Shift+O` 跳转到当前文件的符号。\n- `Ctrl+T` 跨文件搜索符号。\n- `F12` 跳转到定义，`Alt+F12` 速览定义。\n- `Ctrl+Shift+F` 全局搜索，支持正则。\n\n## 终端与窗口\n\n- `` Ctrl+` `` 切换集成终端。\n- `Ctrl+B` 切换侧边栏。\n- `Ctrl+\\` 拆分编辑器。\n- `Ctrl+1/2/3` 在编辑器组之间跳转。\n\n## 一份顺手的配置\n\n把下面这段放进 `settings.json`，按需取舍：\n\n```json\n{\n  \"editor.fontSize\": 14,\n  \"editor.fontFamily\": \"JetBrains Mono, Consolas, monospace\",\n  \"editor.fontLigatures\": true,\n  \"editor.cursorBlinking\": \"smooth\",\n  \"editor.smoothScrolling\": true,\n  \"editor.bracketPairColorization.enabled\": true,\n  \"editor.guides.bracketPairs\": \"active\",\n  \"files.autoSave\": \"afterDelay\",\n  \"files.trimTrailingWhitespace\": true,\n  \"editor.formatOnSave\": true,\n  \"editor.minimap.enabled\": false,\n  \"workbench.layoutControl.enabled\": false\n}\n```\n\n## 推荐插件思路\n\n不必堆插件，按需要装：\n\n- **语言服务**：对应语言的官方或社区扩展。\n- **格式化**：Prettier 或语言自带格式化器，统一风格。\n- **Git 可视化**：GitLens 或 Git Graph，让历史可读，搭配 [[git-notes]] 效果更佳。\n- **图标主题**：让文件树一眼可辨。\n\n> 工具的价值在于减少摩擦，而不是增加配置。能记住的快捷键，永远比菜单快。\n","/wiki/dev-tools/markdown-cheatsheet.html":"---\ntitle: Markdown 速查手册\ndate: '2026-07-19'\nicon: docText\ndescription: 写博客、写文档、写 README 都用得上，把 Markdown 的语法一次记全。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.155Z'\n---\n\n\n## 标题与正文\n\n```markdown\n# 一级标题\n## 二级标题\n### 三级标题\n\n正文里用 *斜体*、**粗体**、***粗斜体*** 和 ~~删除线~~。\n```\n\n段落之间空一行。行末两个空格或一个空行实现换行。\n\n## 列表\n\n无序列表用 `-`、`*` 或 `+`：\n\n- 第一项\n- 第二项\n  - 嵌套项\n\n有序列表：\n\n1. 先做重要的事\n2. 再做有趣的事\n3. 最后做剩下的事\n\n任务列表（很多渲染器支持）：\n\n- [x] 搭建站点\n- [ ] 写第一篇长文\n- [ ] 接入评论系统\n\n## 引用与代码\n\n> 写作是思考的最终形式。\n> —— 把模糊的想法写清楚，本身就是一种理解。\n\n行内代码用反引号：`npm run build`。\n\n代码块用三个反引号包裹，并标注语言以获得高亮：\n\n```js\nconst greet = (name) => `你好，${name}`;\nconsole.log(greet(\"世界\"));\n```\n\n## 表格\n\n| 语法 | 效果 | 说明 |\n|:-----|:----:|-----:|\n| `:--` | 左对齐 | 默认 |\n| `:-:` | 居中 | 标题常用 |\n| `--:` | 右对齐 | 数字列 |\n\n## 链接与图片\n\n```markdown\n[文字链接](https://example.com)\n<https://example.com>\n![替代文字](/hero.svg \"可选标题\")\n```\n\n## 分隔线与脚注\n\n三个连字符 `---` 生成分隔线。脚注写法：\n\n这是一句带脚注的话[^1]。\n\n[^1]: 这是脚注的内容。\n\n## 数学与扩展\n\n部分渲染器支持 LaTeX：行内 `$E = mc^2$`，块级用 `$$` 包裹。Mermaid 流程图、表格、任务列表等都属于常见扩展，写之前确认目标平台是否支持即可——本站的 [[vuepress-guide|VuePress 搭建笔记]] 里记录了这套渲染配置。\n\n行内公式：欧拉恒等式 $e^{i\\pi} + 1 = 0$，勾股定理 $a^2 + b^2 = c^2$。块级公式：\n\n$$\n\\int_{-\\infty}^{\\infty} e^{-x^2}\\,dx = \\sqrt{\\pi}\n$$\n\n这些写法在本站的实际渲染效果，可以到 [[latex-sample|LaTeX 公式渲染测试]] 里逐条对照。\n\nMermaid 示例（本站直接渲染）：\n\n```mermaid\nflowchart LR\n  A[\"写 Markdown\"] --> B{\"平台支持？\"}\n  B -- 支持 --> C[\"直接渲染\"]\n  B -- 不支持 --> D[\"换渲染器\"]\n  C --> E[\"发布 🎉\"]\n```\n\n","wiki/dev-tools/markdown-cheatsheet.md":"---\ntitle: Markdown 速查手册\ndate: '2026-07-19'\nicon: docText\ndescription: 写博客、写文档、写 README 都用得上，把 Markdown 的语法一次记全。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.155Z'\n---\n\n\n## 标题与正文\n\n```markdown\n# 一级标题\n## 二级标题\n### 三级标题\n\n正文里用 *斜体*、**粗体**、***粗斜体*** 和 ~~删除线~~。\n```\n\n段落之间空一行。行末两个空格或一个空行实现换行。\n\n## 列表\n\n无序列表用 `-`、`*` 或 `+`：\n\n- 第一项\n- 第二项\n  - 嵌套项\n\n有序列表：\n\n1. 先做重要的事\n2. 再做有趣的事\n3. 最后做剩下的事\n\n任务列表（很多渲染器支持）：\n\n- [x] 搭建站点\n- [ ] 写第一篇长文\n- [ ] 接入评论系统\n\n## 引用与代码\n\n> 写作是思考的最终形式。\n> —— 把模糊的想法写清楚，本身就是一种理解。\n\n行内代码用反引号：`npm run build`。\n\n代码块用三个反引号包裹，并标注语言以获得高亮：\n\n```js\nconst greet = (name) => `你好，${name}`;\nconsole.log(greet(\"世界\"));\n```\n\n## 表格\n\n| 语法 | 效果 | 说明 |\n|:-----|:----:|-----:|\n| `:--` | 左对齐 | 默认 |\n| `:-:` | 居中 | 标题常用 |\n| `--:` | 右对齐 | 数字列 |\n\n## 链接与图片\n\n```markdown\n[文字链接](https://example.com)\n<https://example.com>\n![替代文字](/hero.svg \"可选标题\")\n```\n\n## 分隔线与脚注\n\n三个连字符 `---` 生成分隔线。脚注写法：\n\n这是一句带脚注的话[^1]。\n\n[^1]: 这是脚注的内容。\n\n## 数学与扩展\n\n部分渲染器支持 LaTeX：行内 `$E = mc^2$`，块级用 `$$` 包裹。Mermaid 流程图、表格、任务列表等都属于常见扩展，写之前确认目标平台是否支持即可——本站的 [[vuepress-guide|VuePress 搭建笔记]] 里记录了这套渲染配置。\n\n行内公式：欧拉恒等式 $e^{i\\pi} + 1 = 0$，勾股定理 $a^2 + b^2 = c^2$。块级公式：\n\n$$\n\\int_{-\\infty}^{\\infty} e^{-x^2}\\,dx = \\sqrt{\\pi}\n$$\n\n这些写法在本站的实际渲染效果，可以到 [[latex-sample|LaTeX 公式渲染测试]] 里逐条对照。\n\nMermaid 示例（本站直接渲染）：\n\n```mermaid\nflowchart LR\n  A[\"写 Markdown\"] --> B{\"平台支持？\"}\n  B -- 支持 --> C[\"直接渲染\"]\n  B -- 不支持 --> D[\"换渲染器\"]\n  C --> E[\"发布 🎉\"]\n```\n\n","/wiki/dev-tools/latex-sample.html":"---\ntitle: LaTeX 公式渲染测试\ndate: '2026-08-19'\nicon: docText\ndescription: 测试知识库的 KaTeX 行内与块级数学公式渲染能力。\ntags:\n  - 测试\n  - latex\n  - 数学\nmaturity: seed\ntag:\n  - 测试\n  - latex\n  - 数学\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.154Z'\n---\n\n\n## 行内公式\n\n在正文中插入行内数学公式，例如欧拉公式 $e^{i\\pi} + 1 = 0$，或牛顿第二定律 $F = ma$。\n\n高斯分布：$\\mathcal{N}(\\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}} e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$\n\n## 块级公式\n\n$$ \\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi} $$\n\n$$ \\sum_{k=1}^{n} k = \\frac{n(n+1)}{2} $$\n\n## 矩阵\n\n$$\n\\begin{pmatrix}\na_{11} & a_{12} & \\cdots & a_{1n} \\\\\na_{21} & a_{22} & \\cdots & a_{2n} \\\\\n\\vdots & \\vdots & \\ddots & \\vdots \\\\\na_{m1} & a_{m2} & \\cdots & a_{mn}\n\\end{pmatrix}\n$$\n\n## 分段函数\n\n$$\nf(x) =\n\\begin{cases}\nx^2, & \\text{if } x \\ge 0 \\\\\n-x, & \\text{if } x < 0\n\\end{cases}\n$$\n\n## 带希腊字母与运算符\n\n$$ \\nabla \\cdot \\mathbf{E} = \\frac{\\rho}{\\varepsilon_0}, \\quad \\nabla \\times \\mathbf{B} = \\mu_0 \\left( \\mathbf{J} + \\varepsilon_0 \\frac{\\partial \\mathbf{E}}{\\partial t} \\right) $$\n\n> [!note] 测试说明\n> 本页用于验证 MarkdownRenderer 中的 KaTeX 扩展（`inlineMath` 与 `blockMath`）是否正常工作。若渲染为原始 `$...$` 文本或出现红色报错，说明 LaTeX 管道有问题。\n>\n> 这里只测渲染管道，公式的 Markdown 写法本身见 [[markdown-cheatsheet]] 的「数学与扩展」一节。\n","wiki/dev-tools/latex-sample.md":"---\ntitle: LaTeX 公式渲染测试\ndate: '2026-08-19'\nicon: docText\ndescription: 测试知识库的 KaTeX 行内与块级数学公式渲染能力。\ntags:\n  - 测试\n  - latex\n  - 数学\nmaturity: seed\ntag:\n  - 测试\n  - latex\n  - 数学\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.154Z'\n---\n\n\n## 行内公式\n\n在正文中插入行内数学公式，例如欧拉公式 $e^{i\\pi} + 1 = 0$，或牛顿第二定律 $F = ma$。\n\n高斯分布：$\\mathcal{N}(\\mu, \\sigma^2) = \\frac{1}{\\sqrt{2\\pi\\sigma^2}} e^{-\\frac{(x-\\mu)^2}{2\\sigma^2}}$\n\n## 块级公式\n\n$$ \\int_{-\\infty}^{\\infty} e^{-x^2} \\, dx = \\sqrt{\\pi} $$\n\n$$ \\sum_{k=1}^{n} k = \\frac{n(n+1)}{2} $$\n\n## 矩阵\n\n$$\n\\begin{pmatrix}\na_{11} & a_{12} & \\cdots & a_{1n} \\\\\na_{21} & a_{22} & \\cdots & a_{2n} \\\\\n\\vdots & \\vdots & \\ddots & \\vdots \\\\\na_{m1} & a_{m2} & \\cdots & a_{mn}\n\\end{pmatrix}\n$$\n\n## 分段函数\n\n$$\nf(x) =\n\\begin{cases}\nx^2, & \\text{if } x \\ge 0 \\\\\n-x, & \\text{if } x < 0\n\\end{cases}\n$$\n\n## 带希腊字母与运算符\n\n$$ \\nabla \\cdot \\mathbf{E} = \\frac{\\rho}{\\varepsilon_0}, \\quad \\nabla \\times \\mathbf{B} = \\mu_0 \\left( \\mathbf{J} + \\varepsilon_0 \\frac{\\partial \\mathbf{E}}{\\partial t} \\right) $$\n\n> [!note] 测试说明\n> 本页用于验证 MarkdownRenderer 中的 KaTeX 扩展（`inlineMath` 与 `blockMath`）是否正常工作。若渲染为原始 `$...$` 文本或出现红色报错，说明 LaTeX 管道有问题。\n>\n> 这里只测渲染管道，公式的 Markdown 写法本身见 [[markdown-cheatsheet]] 的「数学与扩展」一节。\n","/wiki/dev-tools/git-notes.html":"---\ntitle: Git 学习笔记\ndate: '2026-07-22'\nicon: tools\ndescription: 从日常提交到分支协作，一份可以反复翻阅的 Git 速查与理解。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.153Z'\n---\n\n\n## 核心理念\n\nGit 的本质是一张**有向无环图（DAG）**：每个提交指向它的父提交，分支只是指向某个提交的「可移动指针」。理解这一点，绝大多数命令都不再神秘。\n\n> 不要怕 `git reset`，它不会删除你的文件，只是移动指针。\n\n## 日常三连\n\n```bash\ngit add .\ngit commit -m \"feat: 新增双方案切换\"\ngit push\n```\n\n更优雅的一次性提交：\n\n```bash\ngit commit -am \"fix: 修复侧栏在移动端错位\"\n```\n\n## 分支策略\n\n| 分支 | 用途 | 生命周期 |\n|------|------|----------|\n| `main` | 稳定可发布版本 | 永久 |\n| `develop` | 集成开发 | 永久 |\n| `feature/*` | 单个功能 | 合并后删除 |\n| `hotfix/*` | 线上紧急修复 | 合并后删除 |\n\n切换与新建一步到位：\n\n```bash\ngit switch -c feature/scheme-b\n```\n\n## 撤销操作对照表\n\n| 想做的事 | 命令 |\n|----------|------|\n| 丢弃工作区改动 | `git restore <file>` |\n| 取消暂存 | `git restore --staged <file>` |\n| 回退到上一个提交（保留改动） | `git reset --soft HEAD~1` |\n| 彻底丢弃最近一次提交 | `git reset --hard HEAD~1` |\n| 安全地撤销已推送的提交 | `git revert <sha>` |\n\n## 协作时的 rebase 与 merge\n\n- **merge**：保留完整历史，产生合并节点，适合公共分支。\n- **rebase**：把本地提交「嫁接」到最新基线上，历史线性，适合整理个人分支。\n\n```bash\ngit fetch\ngit rebase origin/main\n```\n\n遇到冲突时，解决后用 `git rebase --continue`，想放弃就 `git rebase --abort`。\n\n## 实用小技巧\n\n- `git log --oneline --graph --all` 一眼看清分支拓扑。\n- `git stash` 临时存放未提交的改动，`git stash pop` 取回。\n- `git reflog` 是后悔药——几乎所有「丢失」的提交都能在这里找回。\n- 习惯在编辑器里干活？[[vscode-shortcuts]] 的 Git 面板能和这份笔记配合着用。\n","wiki/dev-tools/git-notes.md":"---\ntitle: Git 学习笔记\ndate: '2026-07-22'\nicon: tools\ndescription: 从日常提交到分支协作，一份可以反复翻阅的 Git 速查与理解。\nmaturity: evergreen\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.153Z'\n---\n\n\n## 核心理念\n\nGit 的本质是一张**有向无环图（DAG）**：每个提交指向它的父提交，分支只是指向某个提交的「可移动指针」。理解这一点，绝大多数命令都不再神秘。\n\n> 不要怕 `git reset`，它不会删除你的文件，只是移动指针。\n\n## 日常三连\n\n```bash\ngit add .\ngit commit -m \"feat: 新增双方案切换\"\ngit push\n```\n\n更优雅的一次性提交：\n\n```bash\ngit commit -am \"fix: 修复侧栏在移动端错位\"\n```\n\n## 分支策略\n\n| 分支 | 用途 | 生命周期 |\n|------|------|----------|\n| `main` | 稳定可发布版本 | 永久 |\n| `develop` | 集成开发 | 永久 |\n| `feature/*` | 单个功能 | 合并后删除 |\n| `hotfix/*` | 线上紧急修复 | 合并后删除 |\n\n切换与新建一步到位：\n\n```bash\ngit switch -c feature/scheme-b\n```\n\n## 撤销操作对照表\n\n| 想做的事 | 命令 |\n|----------|------|\n| 丢弃工作区改动 | `git restore <file>` |\n| 取消暂存 | `git restore --staged <file>` |\n| 回退到上一个提交（保留改动） | `git reset --soft HEAD~1` |\n| 彻底丢弃最近一次提交 | `git reset --hard HEAD~1` |\n| 安全地撤销已推送的提交 | `git revert <sha>` |\n\n## 协作时的 rebase 与 merge\n\n- **merge**：保留完整历史，产生合并节点，适合公共分支。\n- **rebase**：把本地提交「嫁接」到最新基线上，历史线性，适合整理个人分支。\n\n```bash\ngit fetch\ngit rebase origin/main\n```\n\n遇到冲突时，解决后用 `git rebase --continue`，想放弃就 `git rebase --abort`。\n\n## 实用小技巧\n\n- `git log --oneline --graph --all` 一眼看清分支拓扑。\n- `git stash` 临时存放未提交的改动，`git stash pop` 取回。\n- `git reflog` 是后悔药——几乎所有「丢失」的提交都能在这里找回。\n- 习惯在编辑器里干活？[[vscode-shortcuts]] 的 Git 面板能和这份笔记配合着用。\n","/wiki/dev-tools/":"---\ndate: '2025-01-15'\ntitle: 开发工具\ndescription: 编辑器、版本控制与工作流管理\nicon: tools\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.153Z'\n---\n\n\n# 开发工具\n\n编辑器、版本控制与工作流管理。这里收集日常开发中常用的工具笔记与速查。","wiki/dev-tools/index.md":"---\ndate: '2025-01-15'\ntitle: 开发工具\ndescription: 编辑器、版本控制与工作流管理\nicon: tools\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.153Z'\n---\n\n\n# 开发工具\n\n编辑器、版本控制与工作流管理。这里收集日常开发中常用的工具笔记与速查。","/wiki/containers/kubernetes-basics.html":"---\ntitle: Kubernetes 入门\ndate: '2026-07-05'\nicon: container\ndescription: 容器编排的核心概念：Pod、Service、Deployment，以及声明式 API 的工作方式。\ntags:\n  - 容器\n  - 编排\n  - devops\nmaturity: budding\ntag:\n  - 容器\n  - 编排\n  - devops\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.151Z'\n---\n\n\n## 为什么需要 K8s\n\n当容器数量超过个位数，手工管理变得不现实：\n\n- 哪个容器跑在哪台机器上？\n- 挂了怎么自动重启？\n- 流量怎么分配？\n\nK8s 把这些自动化了。\n\n## 核心概念\n\n### Pod\n\nK8s 调度的最小单位。一个 Pod 可以包含一个或多个共享网络和存储的容器。\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: nginx\nspec:\n  containers:\n    - name: nginx\n      image: nginx:alpine\n      ports:\n        - containerPort: 80\n```\n\n### Deployment\n\n管理 Pod 的副本数，支持滚动更新和回滚：\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: web\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: web\n  template:\n    metadata:\n      labels:\n        app: web\n    spec:\n      containers:\n        - name: web\n          image: nginx:1.25\n```\n\n### Service\n\n给一组 Pod 一个稳定的网络入口：\n\n```yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: web-svc\nspec:\n  selector:\n    app: web\n  ports:\n    - port: 80\n      targetPort: 80\n```\n\n## 常用命令\n\n```bash\nkubectl get pods -o wide          # 查看 Pod 及所在节点\nkubectl logs -f <pod>             # 跟踪日志\nkubectl exec -it <pod> -- sh      # 进入 Pod\nkubectl apply -f deploy.yaml      # 应用配置\nkubectl rollout status deploy/web # 查看滚动更新状态\nkubectl rollout undo deploy/web   # 回滚\n```\n\n## 心智模型\n\n> K8s 是「声明式」的：你不告诉它怎么做，而是告诉它你要什么状态。它不停地把集群往你描述的那个状态拉。\n\n与 [[docker-basics]] 对比：Docker 管单台机器上的容器，K8s 管整个集群。\n","wiki/containers/kubernetes-basics.md":"---\ntitle: Kubernetes 入门\ndate: '2026-07-05'\nicon: container\ndescription: 容器编排的核心概念：Pod、Service、Deployment，以及声明式 API 的工作方式。\ntags:\n  - 容器\n  - 编排\n  - devops\nmaturity: budding\ntag:\n  - 容器\n  - 编排\n  - devops\ncategory: []\nupdatedAt: '2026-09-21T10:30:20.151Z'\n---\n\n\n## 为什么需要 K8s\n\n当容器数量超过个位数，手工管理变得不现实：\n\n- 哪个容器跑在哪台机器上？\n- 挂了怎么自动重启？\n- 流量怎么分配？\n\nK8s 把这些自动化了。\n\n## 核心概念\n\n### Pod\n\nK8s 调度的最小单位。一个 Pod 可以包含一个或多个共享网络和存储的容器。\n\n```yaml\napiVersion: v1\nkind: Pod\nmetadata:\n  name: nginx\nspec:\n  containers:\n    - name: nginx\n      image: nginx:alpine\n      ports:\n        - containerPort: 80\n```\n\n### Deployment\n\n管理 Pod 的副本数，支持滚动更新和回滚：\n\n```yaml\napiVersion: apps/v1\nkind: Deployment\nmetadata:\n  name: web\nspec:\n  replicas: 3\n  selector:\n    matchLabels:\n      app: web\n  template:\n    metadata:\n      labels:\n        app: web\n    spec:\n      containers:\n        - name: web\n          image: nginx:1.25\n```\n\n### Service\n\n给一组 Pod 一个稳定的网络入口：\n\n```yaml\napiVersion: v1\nkind: Service\nmetadata:\n  name: web-svc\nspec:\n  selector:\n    app: web\n  ports:\n    - port: 80\n      targetPort: 80\n```\n\n## 常用命令\n\n```bash\nkubectl get pods -o wide          # 查看 Pod 及所在节点\nkubectl logs -f <pod>             # 跟踪日志\nkubectl exec -it <pod> -- sh      # 进入 Pod\nkubectl apply -f deploy.yaml      # 应用配置\nkubectl rollout status deploy/web # 查看滚动更新状态\nkubectl rollout undo deploy/web   # 回滚\n```\n\n## 心智模型\n\n> K8s 是「声明式」的：你不告诉它怎么做，而是告诉它你要什么状态。它不停地把集群往你描述的那个状态拉。\n\n与 [[docker-basics]] 对比：Docker 管单台机器上的容器，K8s 管整个集群。\n","/wiki/containers/":"---\ndate: '2025-01-15'\ntitle: 容器技术\ndescription: Docker 与 Kubernetes 编排\nicon: container\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.150Z'\n---\n\n\n# 容器技术\n\nDocker 与 Kubernetes 编排。从镜像构建到集群管理，容器化实践笔记。","wiki/containers/index.md":"---\ndate: '2025-01-15'\ntitle: 容器技术\ndescription: Docker 与 Kubernetes 编排\nicon: container\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.150Z'\n---\n\n\n# 容器技术\n\nDocker 与 Kubernetes 编排。从镜像构建到集群管理，容器化实践笔记。","/wiki/containers/docker-compose-cheatsheet.html":"---\ntitle: Docker Compose 速查\ndate: '2026-09-20'\nmaturity: seedling\ntag:\n  - docker\n  - compose\n  - 容器\ndescription: Docker Compose 常用命令与配置速查表，涵盖服务编排、网络、卷挂载等核心概念。\ncategory: []\ntags:\n  - docker\n  - compose\n  - 容器\nupdatedAt: '2026-09-21T10:30:20.148Z'\n---\n\n\n## 什么是 Docker Compose\n\nDocker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 `docker-compose.yml` 文件，你可以配置应用的服务、网络和卷，然后用一条命令创建并启动所有服务。\n\n## 基本命令\n\n```bash\n# 启动所有服务（后台运行）\ndocker compose up -d\n\n# 查看运行中的服务\ndocker compose ps\n\n# 查看日志\ndocker compose logs -f [service_name]\n\n# 停止所有服务\ndocker compose down\n\n# 重建镜像并启动\ndocker compose up -d --build\n```\n\n## 配置文件示例\n\n```yaml\nversion: \"3.8\"\n\nservices:\n  web:\n    build: .\n    ports:\n      - \"8080:80\"\n    environment:\n      - NODE_ENV=production\n      - DATABASE_URL=postgres://db:5432/app\n    depends_on:\n      - db\n      - redis\n    volumes:\n      - ./data:/app/data\n    restart: unless-stopped\n\n  db:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_DB: app\n      POSTGRES_PASSWORD: secret\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n\nvolumes:\n  pgdata:\n\nnetworks:\n  default:\n    driver: bridge\n```\n\n## 网络配置\n\n| 驱动 | 用途 | 示例 |\n|------|------|------|\n| bridge | 默认，容器间通信 | `driver: bridge` |\n| host | 共享宿主机网络 | `driver: host` |\n| overlay | 跨主机通信（Swarm） | `driver: overlay` |\n\n## 常用技巧\n\n### 环境变量管理\n\n```bash\n# 使用 .env 文件\nDB_PASSWORD=mysecret\nAPP_PORT=3000\n```\n\n```yaml\nservices:\n  app:\n    env_file:\n      - .env\n```\n\n### 健康检查\n\n```yaml\nservices:\n  web:\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8080/health\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 40s\n```\n\n### 资源限制\n\n```yaml\nservices:\n  web:\n    deploy:\n      resources:\n        limits:\n          cpus: \"0.50\"\n          memory: 512M\n        reservations:\n          cpus: \"0.25\"\n          memory: 256M\n```\n\n## 与 Dockerfile 的关系\n\n> **Dockerfile** 定义单个容器的构建过程，**Compose** 定义多个容器的编排关系。\n\n一个典型的项目结构：\n\n```\nmy-project/\n├── docker-compose.yml\n├── Dockerfile\n├── src/\n│   └── ...\n└── .env\n```\n\n## 常见问题\n\n**Q: `docker compose` 和 `docker-compose` 有什么区别？**\n\nA: V1 使用 `docker-compose`（Python 实现），V2 使用 `docker compose`（Go 实现，作为 Docker CLI 插件）。V2 性能更好，功能更全。\n\n**Q: 如何查看容器的环境变量？**\n\n```bash\ndocker compose exec web env\n```\n\n**Q: 如何只重启某个服务？**\n\n```bash\ndocker compose restart web\n```\n\n---\n\n> 这是一篇 seedling 级别的笔记，随着使用经验的积累会不断更新。","wiki/containers/docker-compose-cheatsheet.md":"---\ntitle: Docker Compose 速查\ndate: '2026-09-20'\nmaturity: seedling\ntag:\n  - docker\n  - compose\n  - 容器\ndescription: Docker Compose 常用命令与配置速查表，涵盖服务编排、网络、卷挂载等核心概念。\ncategory: []\ntags:\n  - docker\n  - compose\n  - 容器\nupdatedAt: '2026-09-21T10:30:20.148Z'\n---\n\n\n## 什么是 Docker Compose\n\nDocker Compose 是一个用于定义和运行多容器 Docker 应用的工具。通过一个 `docker-compose.yml` 文件，你可以配置应用的服务、网络和卷，然后用一条命令创建并启动所有服务。\n\n## 基本命令\n\n```bash\n# 启动所有服务（后台运行）\ndocker compose up -d\n\n# 查看运行中的服务\ndocker compose ps\n\n# 查看日志\ndocker compose logs -f [service_name]\n\n# 停止所有服务\ndocker compose down\n\n# 重建镜像并启动\ndocker compose up -d --build\n```\n\n## 配置文件示例\n\n```yaml\nversion: \"3.8\"\n\nservices:\n  web:\n    build: .\n    ports:\n      - \"8080:80\"\n    environment:\n      - NODE_ENV=production\n      - DATABASE_URL=postgres://db:5432/app\n    depends_on:\n      - db\n      - redis\n    volumes:\n      - ./data:/app/data\n    restart: unless-stopped\n\n  db:\n    image: postgres:16-alpine\n    environment:\n      POSTGRES_DB: app\n      POSTGRES_PASSWORD: secret\n    volumes:\n      - pgdata:/var/lib/postgresql/data\n    restart: unless-stopped\n\n  redis:\n    image: redis:7-alpine\n    restart: unless-stopped\n\nvolumes:\n  pgdata:\n\nnetworks:\n  default:\n    driver: bridge\n```\n\n## 网络配置\n\n| 驱动 | 用途 | 示例 |\n|------|------|------|\n| bridge | 默认，容器间通信 | `driver: bridge` |\n| host | 共享宿主机网络 | `driver: host` |\n| overlay | 跨主机通信（Swarm） | `driver: overlay` |\n\n## 常用技巧\n\n### 环境变量管理\n\n```bash\n# 使用 .env 文件\nDB_PASSWORD=mysecret\nAPP_PORT=3000\n```\n\n```yaml\nservices:\n  app:\n    env_file:\n      - .env\n```\n\n### 健康检查\n\n```yaml\nservices:\n  web:\n    healthcheck:\n      test: [\"CMD\", \"curl\", \"-f\", \"http://localhost:8080/health\"]\n      interval: 30s\n      timeout: 10s\n      retries: 3\n      start_period: 40s\n```\n\n### 资源限制\n\n```yaml\nservices:\n  web:\n    deploy:\n      resources:\n        limits:\n          cpus: \"0.50\"\n          memory: 512M\n        reservations:\n          cpus: \"0.25\"\n          memory: 256M\n```\n\n## 与 Dockerfile 的关系\n\n> **Dockerfile** 定义单个容器的构建过程，**Compose** 定义多个容器的编排关系。\n\n一个典型的项目结构：\n\n```\nmy-project/\n├── docker-compose.yml\n├── Dockerfile\n├── src/\n│   └── ...\n└── .env\n```\n\n## 常见问题\n\n**Q: `docker compose` 和 `docker-compose` 有什么区别？**\n\nA: V1 使用 `docker-compose`（Python 实现），V2 使用 `docker compose`（Go 实现，作为 Docker CLI 插件）。V2 性能更好，功能更全。\n\n**Q: 如何查看容器的环境变量？**\n\n```bash\ndocker compose exec web env\n```\n\n**Q: 如何只重启某个服务？**\n\n```bash\ndocker compose restart web\n```\n\n---\n\n> 这是一篇 seedling 级别的笔记，随着使用经验的积累会不断更新。","/wiki/containers/docker-basics.html":"---\ntitle: Docker 入门笔记\ndate: '2026-07-03'\nicon: container\ndescription: 镜像、容器、Dockerfile 与 Compose，把「在我机器上能跑」变成「在哪都能跑」。\nmaturity: budding\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.146Z'\n---\n\n\n## 三个核心概念\n\n- **镜像（Image）**：只读模板，像一张刻好的光盘。\n- **容器（Container）**：镜像的运行实例，像一个启动起来的程序。\n- **仓库（Registry）**：存放镜像的地方，默认是 Docker Hub。\n\n## 常用命令\n\n```bash\ndocker pull nginx              # 拉取镜像\ndocker run -d -p 8080:80 nginx # 后台运行并映射端口\ndocker ps                      # 查看运行中的容器\ndocker ps -a                   # 查看全部容器\ndocker logs -f <id>            # 跟踪日志\ndocker exec -it <id> sh        # 进入容器\ndocker stop <id>               # 停止\ndocker rm <id>                 # 删除容器\ndocker rmi <image>             # 删除镜像\n```\n\n端口映射 `-p 宿主机:容器`，把容器内的服务暴露给外面。\n\n## 写一个 Dockerfile\n\n```dockerfile\nFROM node:20-alpine AS build\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM nginx:alpine\nCOPY --from=build /app/dist /usr/share/nginx/html\nEXPOSE 80\n```\n\n多阶段构建（multi-stage）能显著缩小最终镜像：构建阶段的依赖不会进入运行镜像。\n\n构建与运行：\n\n```bash\ndocker build -t my-site .\ndocker run -d -p 8080:80 my-site\n```\n\n## 用 Compose 编排多容器\n\n`docker-compose.yml`：\n\n```yaml\nservices:\n  web:\n    build: .\n    ports:\n      - \"8080:80\"\n    depends_on:\n      - api\n  api:\n    image: node:20-alpine\n    working_dir: /app\n    volumes:\n      - ./api:/app\n    command: node server.js\n```\n\n```bash\ndocker compose up -d     # 启动\ndocker compose logs -f   # 看日志\ndocker compose down      # 停止并清理\n```\n\n## 体积与清理\n\n镜像会越积越多，定期清理：\n\n```bash\ndocker system prune -a     # 清理未使用的资源（谨慎）\ndocker image prune -f      # 清理悬空镜像\n```\n\n## 心智模型\n\n把容器想成「一次性的进程」：不要在里面存重要数据，需要持久化的目录用 **volume** 挂载出来。镜像应当是**不可变**的——配置走环境变量，数据走挂载，这样容器才能随时销毁、随时重建。\n\n> 容器解决的不是「怎么部署」，而是「让环境本身成为代码」。\n>\n> 单台机器管好了，下一步是集群：[[kubernetes-basics]]。想看真实部署案例，见 [[home-server]]。\n","wiki/containers/docker-basics.md":"---\ntitle: Docker 入门笔记\ndate: '2026-07-03'\nicon: container\ndescription: 镜像、容器、Dockerfile 与 Compose，把「在我机器上能跑」变成「在哪都能跑」。\nmaturity: budding\ntag: []\ncategory: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.146Z'\n---\n\n\n## 三个核心概念\n\n- **镜像（Image）**：只读模板，像一张刻好的光盘。\n- **容器（Container）**：镜像的运行实例，像一个启动起来的程序。\n- **仓库（Registry）**：存放镜像的地方，默认是 Docker Hub。\n\n## 常用命令\n\n```bash\ndocker pull nginx              # 拉取镜像\ndocker run -d -p 8080:80 nginx # 后台运行并映射端口\ndocker ps                      # 查看运行中的容器\ndocker ps -a                   # 查看全部容器\ndocker logs -f <id>            # 跟踪日志\ndocker exec -it <id> sh        # 进入容器\ndocker stop <id>               # 停止\ndocker rm <id>                 # 删除容器\ndocker rmi <image>             # 删除镜像\n```\n\n端口映射 `-p 宿主机:容器`，把容器内的服务暴露给外面。\n\n## 写一个 Dockerfile\n\n```dockerfile\nFROM node:20-alpine AS build\nWORKDIR /app\nCOPY package*.json ./\nRUN npm ci\nCOPY . .\nRUN npm run build\n\nFROM nginx:alpine\nCOPY --from=build /app/dist /usr/share/nginx/html\nEXPOSE 80\n```\n\n多阶段构建（multi-stage）能显著缩小最终镜像：构建阶段的依赖不会进入运行镜像。\n\n构建与运行：\n\n```bash\ndocker build -t my-site .\ndocker run -d -p 8080:80 my-site\n```\n\n## 用 Compose 编排多容器\n\n`docker-compose.yml`：\n\n```yaml\nservices:\n  web:\n    build: .\n    ports:\n      - \"8080:80\"\n    depends_on:\n      - api\n  api:\n    image: node:20-alpine\n    working_dir: /app\n    volumes:\n      - ./api:/app\n    command: node server.js\n```\n\n```bash\ndocker compose up -d     # 启动\ndocker compose logs -f   # 看日志\ndocker compose down      # 停止并清理\n```\n\n## 体积与清理\n\n镜像会越积越多，定期清理：\n\n```bash\ndocker system prune -a     # 清理未使用的资源（谨慎）\ndocker image prune -f      # 清理悬空镜像\n```\n\n## 心智模型\n\n把容器想成「一次性的进程」：不要在里面存重要数据，需要持久化的目录用 **volume** 挂载出来。镜像应当是**不可变**的——配置走环境变量，数据走挂载，这样容器才能随时销毁、随时重建。\n\n> 容器解决的不是「怎么部署」，而是「让环境本身成为代码」。\n>\n> 单台机器管好了，下一步是集群：[[kubernetes-basics]]。想看真实部署案例，见 [[home-server]]。\n","/posts/tools/vuepress-guide.html":"---\ntitle: VuePress + Hope 主题搭建指南\nseries: 博客技术栈\norder: 1\nicon: code\ncover: /uploads/AmLmXSRXAD33.png\ndate: '2026-07-25'\ncategory:\n  - 技术\ntag:\n  - VuePress\n  - 博客\n  - 教程\ntags:\n  - VuePress\n  - 博客\n  - 教程\nupdatedAt: '2026-09-21T10:30:20.142Z'\n---\n\n\n## 技术栈概览[^1]\n\n| 组件 | 说明 |\n|------|------|\n| VuePress 2 | 静态站点生成器，基于 Vue 3 |\n| Hope Theme | 功能丰富的主题，支持博客、文档 |\n| Vite | 构建工具，开发体验极佳 |\n| Vercel | 部署平台，自动 CI/CD |\n\n## 核心目录结构\n\n```\nsrc/\n├── .vuepress/\n│   ├── config.ts      # 主配置\n│   ├── theme.ts       # 主题配置\n│   ├── navbar.ts      # 导航栏\n│   ├── sidebar.ts     # 侧边栏\n│   └── styles/        # 自定义样式\n├── posts/             # 博客文章\n└── README.md          # 首页\n```\n\n## 高亮示例\n\nVuePress 支持在代码围栏上标注需要高亮的行：\n\n```ts {2,4-5} line-numbers\nconst app = createApp();\nconst theme = createTheme(); // 这行会被高亮\napp.use(theme);\nconst router = useRouter();   // 这两行也会被高亮\nrouter.push(\"/posts/\");\n```\n\n## 写作流程\n\n1. 在 `src/posts/` 下新建 `.md` 文件\n2. 编写 Front Matter（标题、日期、分类、标签）\n3. 用 Markdown 写正文（语法速查见 [[markdown-cheatsheet]]）\n4. 推送到 Git，Vercel 自动构建部署\n\n## 自定义样式\n\n在 `src/.vuepress/styles/palette.scss` 中修改主题色：\n\n```scss\n$theme-color: #0d9488;\n```\n\n在 `src/.vuepress/styles/index.scss` 中添加自定义 CSS 覆盖。\n\n[^1]: 本站后来迁移到了完全自定义的主题，Hope 只作为起步时的参考。","posts/tools/vuepress-guide.md":"---\ntitle: VuePress + Hope 主题搭建指南\nseries: 博客技术栈\norder: 1\nicon: code\ncover: /uploads/AmLmXSRXAD33.png\ndate: '2026-07-25'\ncategory:\n  - 技术\ntag:\n  - VuePress\n  - 博客\n  - 教程\ntags:\n  - VuePress\n  - 博客\n  - 教程\nupdatedAt: '2026-09-21T10:30:20.142Z'\n---\n\n\n## 技术栈概览[^1]\n\n| 组件 | 说明 |\n|------|------|\n| VuePress 2 | 静态站点生成器，基于 Vue 3 |\n| Hope Theme | 功能丰富的主题，支持博客、文档 |\n| Vite | 构建工具，开发体验极佳 |\n| Vercel | 部署平台，自动 CI/CD |\n\n## 核心目录结构\n\n```\nsrc/\n├── .vuepress/\n│   ├── config.ts      # 主配置\n│   ├── theme.ts       # 主题配置\n│   ├── navbar.ts      # 导航栏\n│   ├── sidebar.ts     # 侧边栏\n│   └── styles/        # 自定义样式\n├── posts/             # 博客文章\n└── README.md          # 首页\n```\n\n## 高亮示例\n\nVuePress 支持在代码围栏上标注需要高亮的行：\n\n```ts {2,4-5} line-numbers\nconst app = createApp();\nconst theme = createTheme(); // 这行会被高亮\napp.use(theme);\nconst router = useRouter();   // 这两行也会被高亮\nrouter.push(\"/posts/\");\n```\n\n## 写作流程\n\n1. 在 `src/posts/` 下新建 `.md` 文件\n2. 编写 Front Matter（标题、日期、分类、标签）\n3. 用 Markdown 写正文（语法速查见 [[markdown-cheatsheet]]）\n4. 推送到 Git，Vercel 自动构建部署\n\n## 自定义样式\n\n在 `src/.vuepress/styles/palette.scss` 中修改主题色：\n\n```scss\n$theme-color: #0d9488;\n```\n\n在 `src/.vuepress/styles/index.scss` 中添加自定义 CSS 覆盖。\n\n[^1]: 本站后来迁移到了完全自定义的主题，Hope 只作为起步时的参考。","/posts/new.html":"---\ntitle: 测试\ndate: '2026-09-21'\ncategory:\n  - 技术\ncover: /uploads/legacy-c2777e48d857011bb218.svg\ndescription: 测试\ntag: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.141Z'\n---\n\n\n# 测试\n\n测试文章\n\n112233\n\n```\npython\n```\n","posts/new.md":"---\ntitle: 测试\ndate: '2026-09-21'\ncategory:\n  - 技术\ncover: /uploads/legacy-c2777e48d857011bb218.svg\ndescription: 测试\ntag: []\ntags: []\nupdatedAt: '2026-09-21T10:30:20.141Z'\n---\n\n\n# 测试\n\n测试文章\n\n112233\n\n```\npython\n```\n","/posts/home-server.html":"---\ntitle: 旧笔记本的再就业：我的家庭服务器折腾记\nicon: 🖥️\ndate: '2026-07-23'\ncategory:\n  - 技术\ntag:\n  - 折腾\n  - 家庭服务器\n  - Docker\n  - Linux\ncover: /uploads/fu54JD98IIYp.png\nsticky: true\ndescription: 一台吃灰五年的旧笔记本，变成了 7×24 小时在线的家庭服务器。记录选型、安装与踩坑的完整过程。\ntags:\n  - 折腾\n  - 家庭服务器\n  - Docker\n  - Linux\nupdatedAt: '2026-09-21T10:30:20.139Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，展示技术类图文排版：封面图 + 正文插图 + 代码块 + 表格。\n  🖼️ 图片路径在 src/.vuepress/public/images/posts/ 下，替换成你自己的截图或照片即可。\n-->\n\n抽屉里躺着一台 2015 年的旧笔记本：屏幕有一道裂纹，电池鼓包，风扇像拖拉机。卖二手不值钱，扔了又可惜。\n\n直到有一天我意识到：它当不了主力机，但当一台 7×24 小时在线的家庭服务器，简直是降维打击。\n\n<!-- more -->\n\n## 为什么是旧笔记本\n\n折腾之前先想清楚，为什么不买台树莓派或者成品 NAS：\n\n| 方案 | 优势 | 劣势 |\n|------|------|------|\n| 树莓派 | 功耗低、社区活跃 | 要另配电源、外壳、存储，算下来不便宜 |\n| 成品 NAS | 省心、有现成系统 | 贵，而且我想折腾的不是「用」，是「搭」 |\n| **旧笔记本** | **自带屏幕、键盘、电池（天然 UPS）、网卡** | 功耗略高，占地方 |\n\n旧笔记本最妙的是那块电池——拆掉危险，留着就是一块免费的不间断电源，停电时足够服务优雅关机。\n\n## 装系统：Debian 最小化安装\n\n拔掉原机的 Windows，装上 Debian 12 最小化版本。老机器 4G 内存完全够用：\n\n```bash\n# 安装后先做三件事\nsudo apt update && sudo apt upgrade -y\nsudo systemctl disable --now bluetooth   # 用不到的服务全关掉\nsudo apt install -y docker.io docker-compose-plugin git\n```\n\n合盖不休眠是关键一步：\n\n```bash\nsudo sed -i 's/#HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf\nsudo systemctl restart systemd-logind\n```\n\n![安装完成后的第一个终端](/uploads/legacy-6babb71edbb5a04e9f28.svg)\n\n*看到光标在深色终端里闪烁的那一刻，折腾才刚刚开始。*\n\n## 跑起来：一个 Compose 文件管所有\n\n所有服务用一个 `docker-compose.yml` 管理（容器新手可以先读 [[docker-basics]]），目前稳定运行的有四个：\n\n```yaml\nservices:\n  nginx-proxy:          # 反向代理，统一入口\n    image: nginx:alpine\n    ports: [\"80:80\"]\n  vaultwarden:          # 密码管理\n    image: vaultwarden/server:latest\n  uptime-kuma:          # 服务监控\n    image: louislam/uptime-kuma:latest\n  syncthing:            # 多端文件同步\n    image: syncthing/syncthing:latest\n```\n\n```bash\ndocker compose up -d     # 一条命令，全部上线\n```\n\n![监控面板上的服务状态](/uploads/legacy-0cadb3bce6a9691431c9.svg)\n\n*看着监控面板上一排绿色的「运行中」，是折腾者独有的快乐。*\n\n## 踩坑两则\n\n**坑一：散热。** 笔记本塞在电视柜里，一周后热得烫手，Docker 直接卡死。后来垫高留出风道，加了个 USB 小风扇，温度直降 15℃。\n\n**坑二：IP 漂移。** 路由器重启后笔记本 IP 变了，所有收藏的书签全废。务必在路由器里绑定静态 IP。\n\n> 家庭服务器的第一课不是技术，是「别假设任何东西是稳定的」。\n\n## 最后\n\n这台旧笔记本现在的状态是：CPU 占用常年 3%，功耗 8W，安静地待在电视柜里，替我管着密码、盯着服务、同步着照片。\n\n它没能成为一台好电脑，但成为了一台好服务器。\n\n> 物尽其用，大概就是折腾的终极意义。\n","posts/home-server.md":"---\ntitle: 旧笔记本的再就业：我的家庭服务器折腾记\nicon: 🖥️\ndate: '2026-07-23'\ncategory:\n  - 技术\ntag:\n  - 折腾\n  - 家庭服务器\n  - Docker\n  - Linux\ncover: /uploads/fu54JD98IIYp.png\nsticky: true\ndescription: 一台吃灰五年的旧笔记本，变成了 7×24 小时在线的家庭服务器。记录选型、安装与踩坑的完整过程。\ntags:\n  - 折腾\n  - 家庭服务器\n  - Docker\n  - Linux\nupdatedAt: '2026-09-21T10:30:20.139Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，展示技术类图文排版：封面图 + 正文插图 + 代码块 + 表格。\n  🖼️ 图片路径在 src/.vuepress/public/images/posts/ 下，替换成你自己的截图或照片即可。\n-->\n\n抽屉里躺着一台 2015 年的旧笔记本：屏幕有一道裂纹，电池鼓包，风扇像拖拉机。卖二手不值钱，扔了又可惜。\n\n直到有一天我意识到：它当不了主力机，但当一台 7×24 小时在线的家庭服务器，简直是降维打击。\n\n<!-- more -->\n\n## 为什么是旧笔记本\n\n折腾之前先想清楚，为什么不买台树莓派或者成品 NAS：\n\n| 方案 | 优势 | 劣势 |\n|------|------|------|\n| 树莓派 | 功耗低、社区活跃 | 要另配电源、外壳、存储，算下来不便宜 |\n| 成品 NAS | 省心、有现成系统 | 贵，而且我想折腾的不是「用」，是「搭」 |\n| **旧笔记本** | **自带屏幕、键盘、电池（天然 UPS）、网卡** | 功耗略高，占地方 |\n\n旧笔记本最妙的是那块电池——拆掉危险，留着就是一块免费的不间断电源，停电时足够服务优雅关机。\n\n## 装系统：Debian 最小化安装\n\n拔掉原机的 Windows，装上 Debian 12 最小化版本。老机器 4G 内存完全够用：\n\n```bash\n# 安装后先做三件事\nsudo apt update && sudo apt upgrade -y\nsudo systemctl disable --now bluetooth   # 用不到的服务全关掉\nsudo apt install -y docker.io docker-compose-plugin git\n```\n\n合盖不休眠是关键一步：\n\n```bash\nsudo sed -i 's/#HandleLidSwitch=.*/HandleLidSwitch=ignore/' /etc/systemd/logind.conf\nsudo systemctl restart systemd-logind\n```\n\n![安装完成后的第一个终端](/uploads/legacy-6babb71edbb5a04e9f28.svg)\n\n*看到光标在深色终端里闪烁的那一刻，折腾才刚刚开始。*\n\n## 跑起来：一个 Compose 文件管所有\n\n所有服务用一个 `docker-compose.yml` 管理（容器新手可以先读 [[docker-basics]]），目前稳定运行的有四个：\n\n```yaml\nservices:\n  nginx-proxy:          # 反向代理，统一入口\n    image: nginx:alpine\n    ports: [\"80:80\"]\n  vaultwarden:          # 密码管理\n    image: vaultwarden/server:latest\n  uptime-kuma:          # 服务监控\n    image: louislam/uptime-kuma:latest\n  syncthing:            # 多端文件同步\n    image: syncthing/syncthing:latest\n```\n\n```bash\ndocker compose up -d     # 一条命令，全部上线\n```\n\n![监控面板上的服务状态](/uploads/legacy-0cadb3bce6a9691431c9.svg)\n\n*看着监控面板上一排绿色的「运行中」，是折腾者独有的快乐。*\n\n## 踩坑两则\n\n**坑一：散热。** 笔记本塞在电视柜里，一周后热得烫手，Docker 直接卡死。后来垫高留出风道，加了个 USB 小风扇，温度直降 15℃。\n\n**坑二：IP 漂移。** 路由器重启后笔记本 IP 变了，所有收藏的书签全废。务必在路由器里绑定静态 IP。\n\n> 家庭服务器的第一课不是技术，是「别假设任何东西是稳定的」。\n\n## 最后\n\n这台旧笔记本现在的状态是：CPU 占用常年 3%，功耗 8W，安静地待在电视柜里，替我管着密码、盯着服务、同步着照片。\n\n它没能成为一台好电脑，但成为了一台好服务器。\n\n> 物尽其用，大概就是折腾的终极意义。\n","/posts/hello-world.html":"---\ntitle: Hello World - 博客启程\nicon: pen-to-square\ndate: '2026-07-25'\ncategory:\n  - 随笔\ntag:\n  - 博客\n  - 开始\nseries: 博客技术栈\norder: 2\nsticky: false\nstale_after: 7\nstar: false\ncover: /uploads/M-sBRg_WsgwM.jpg\ntags:\n  - 博客\n  - 开始\nupdatedAt: '2026-09-21T10:30:20.138Z'\n---\n\n\n## 为什么要写博客\n\n写博客是一种很好的学习方式。当你试图把一件事情讲清楚的时候，你会发现自己对它的理解远比想象中模糊。\n\n> 写作是思考的最终形式。\n\n## 这个博客用了什么技术\n\n- **VuePress 2** - 基于 Vue 3 的静态站点生成器\n- **Hope Theme** - 功能丰富的 VuePress 主题\n- **Vite** - 极速构建工具\n- **Vercel** - 零配置部署平台\n\n## 接下来\n\n这里会记录我的技术探索、阅读笔记和生活随想。希望这个小小的角落能成为思考的栖息地。\n","posts/hello-world.md":"---\ntitle: Hello World - 博客启程\nicon: pen-to-square\ndate: '2026-07-25'\ncategory:\n  - 随笔\ntag:\n  - 博客\n  - 开始\nseries: 博客技术栈\norder: 2\nsticky: false\nstale_after: 7\nstar: false\ncover: /uploads/M-sBRg_WsgwM.jpg\ntags:\n  - 博客\n  - 开始\nupdatedAt: '2026-09-21T10:30:20.138Z'\n---\n\n\n## 为什么要写博客\n\n写博客是一种很好的学习方式。当你试图把一件事情讲清楚的时候，你会发现自己对它的理解远比想象中模糊。\n\n> 写作是思考的最终形式。\n\n## 这个博客用了什么技术\n\n- **VuePress 2** - 基于 Vue 3 的静态站点生成器\n- **Hope Theme** - 功能丰富的 VuePress 主题\n- **Vite** - 极速构建工具\n- **Vercel** - 零配置部署平台\n\n## 接下来\n\n这里会记录我的技术探索、阅读笔记和生活随想。希望这个小小的角落能成为思考的栖息地。\n","/posts/desk.html":"---\ntitle: 一平方米的书桌：一次「够用就好」的布置实验\nicon: 🪑\ndate: '2026-07-24'\ncategory:\n  - 生活\ntag:\n  - 生活\n  - 桌面\n  - 折腾\ncover: /uploads/aPSQQl_yoQGZ.jpg\ndescription: 桌面布置的尽头不是买更贵的东西，而是弄清楚自己到底需要什么。一平方米，刚刚好。\ntags:\n  - 生活\n  - 桌面\n  - 折腾\nupdatedAt: '2026-09-21T10:30:20.137Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，展示生活类图文排版。\n  🖼️ 把图片换成你自己拍的照片，路径格式保持不变即可。\n-->\n\n过去一年，我在购物软件里搜索「桌面好物」的次数，大概比搜索「晚饭吃什么」还多。\n\n直到上个月，我做了一个相反的实验：不是往书桌上加东西，而是往外拿。\n\n<!-- more -->\n\n## 桌面上只留四样东西\n\n清空、擦拭、然后一件一件放回——每放一件，都要回答一个问题：「过去一周，我真的用过它吗？」\n\n最后留在桌面上的，只有四样：\n\n1. **显示器**——唯一的屏幕，笔记本合盖当主机；\n2. **键盘**——一把用了五年的机械键盘，键帽打油，但手感熟悉；\n3. **台灯**——色温 2700K，晚上只开它；\n4. **一个本子**——所有待办和胡思乱想都写在纸上。\n\n![桌面细节：键盘与笔记本](/uploads/legacy-907b41cce7d74599cfbb.svg)\n\n*打油的键帽和写了一半的本子，比任何「好物」都诚实。*\n\n## 灯光是最便宜的氛围感\n\n这次实验最大的收获，不是扔掉了什么，而是发现了灯光的意义。\n\n白天拉开纱帘，自然光从左侧进来，是工作的光；晚上关掉顶灯，只留桌上那盏 2700K 的台灯，暖黄色的光罩住一平方米，是属于自己的光。\n\n![夜晚的台灯与书桌](/uploads/legacy-6dfdab270cfb5ce03c70.svg)\n\n*同一张书桌，白天属于效率，夜晚属于自己。*\n\n同一平方米，两种完全不同的气质。而切换它们，只需要一次开关。\n\n## 一件后悔的事\n\n如果非说有什么遗憾，就是那盆被我移走的多肉。它其实不占地方，只是需要每周浇一次水——而我高估了自己的勤快。\n\n「够用就好」不是苦行，是诚实地对待自己的习惯。\n\n## 写在最后\n\n实验进行了一个月。书桌还是那一平方米，但坐下来的时候，心比之前安静了很多。\n\n> 整理桌面的过程，其实是把「我以为我需要的」和「我真正需要的」分开的过程。\n\n东西变少了，空间变大了。这大概就是成年人版本的断舍离：不扔东西，只是把它们放回该在的位置——包括欲望。\n","posts/desk.md":"---\ntitle: 一平方米的书桌：一次「够用就好」的布置实验\nicon: 🪑\ndate: '2026-07-24'\ncategory:\n  - 生活\ntag:\n  - 生活\n  - 桌面\n  - 折腾\ncover: /uploads/aPSQQl_yoQGZ.jpg\ndescription: 桌面布置的尽头不是买更贵的东西，而是弄清楚自己到底需要什么。一平方米，刚刚好。\ntags:\n  - 生活\n  - 桌面\n  - 折腾\nupdatedAt: '2026-09-21T10:30:20.137Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，展示生活类图文排版。\n  🖼️ 把图片换成你自己拍的照片，路径格式保持不变即可。\n-->\n\n过去一年，我在购物软件里搜索「桌面好物」的次数，大概比搜索「晚饭吃什么」还多。\n\n直到上个月，我做了一个相反的实验：不是往书桌上加东西，而是往外拿。\n\n<!-- more -->\n\n## 桌面上只留四样东西\n\n清空、擦拭、然后一件一件放回——每放一件，都要回答一个问题：「过去一周，我真的用过它吗？」\n\n最后留在桌面上的，只有四样：\n\n1. **显示器**——唯一的屏幕，笔记本合盖当主机；\n2. **键盘**——一把用了五年的机械键盘，键帽打油，但手感熟悉；\n3. **台灯**——色温 2700K，晚上只开它；\n4. **一个本子**——所有待办和胡思乱想都写在纸上。\n\n![桌面细节：键盘与笔记本](/uploads/legacy-907b41cce7d74599cfbb.svg)\n\n*打油的键帽和写了一半的本子，比任何「好物」都诚实。*\n\n## 灯光是最便宜的氛围感\n\n这次实验最大的收获，不是扔掉了什么，而是发现了灯光的意义。\n\n白天拉开纱帘，自然光从左侧进来，是工作的光；晚上关掉顶灯，只留桌上那盏 2700K 的台灯，暖黄色的光罩住一平方米，是属于自己的光。\n\n![夜晚的台灯与书桌](/uploads/legacy-6dfdab270cfb5ce03c70.svg)\n\n*同一张书桌，白天属于效率，夜晚属于自己。*\n\n同一平方米，两种完全不同的气质。而切换它们，只需要一次开关。\n\n## 一件后悔的事\n\n如果非说有什么遗憾，就是那盆被我移走的多肉。它其实不占地方，只是需要每周浇一次水——而我高估了自己的勤快。\n\n「够用就好」不是苦行，是诚实地对待自己的习惯。\n\n## 写在最后\n\n实验进行了一个月。书桌还是那一平方米，但坐下来的时候，心比之前安静了很多。\n\n> 整理桌面的过程，其实是把「我以为我需要的」和「我真正需要的」分开的过程。\n\n东西变少了，空间变大了。这大概就是成年人版本的断舍离：不扔东西，只是把它们放回该在的位置——包括欲望。\n","/posts/citywalk.html":"---\ntitle: 城市漫步：一条走了十年的路\nicon: 🚶\ndate: '2026-07-21'\ncategory:\n  - 随笔\ntag:\n  - 随笔\n  - 城市\n  - 摄影\ncover: /uploads/qxSvp8baO9FB.jpg\ndescription: 有些路不是用来赶路的。十年里我反复走同一条街，看它旧了又新，也看自己慢慢长大。\ntags:\n  - 随笔\n  - 城市\n  - 摄影\nupdatedAt: '2026-09-21T10:30:20.127Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，用来展示「图文并茂」的排版效果。\n  🖼️ 把每张图的路径换成你自己的照片即可（例如 /images/posts/my-photo.jpg），\n     图片文件放进 src/.vuepress/public/images/posts/ 目录。\n  📝 文字直接替换成你自己的内容，排版结构（小标题、引用、插图）可以照搬。\n-->\n\n从公司到家，导航说十一分钟。但我总要走二十五分钟——因为中间那段梧桐路，值得慢慢走。<sup title=\"梧桐路其实没有正式的名字，这是我给它起的。十年里它在市政地图上一直被标着「待建路段」。\">1</sup>\n\n十年，两千多个来回。这条路比我更诚实，它记得我每一个阶段的样子。\n\n<!-- more -->\n\n## 第一个五年：赶时间\n\n刚来这座城市的时候，我走路是带风的。<sup title=\"每分钟一百二十步，是某个播客里的「高效通勤标准步频」。我当时深信不疑。\">2</sup>耳机里放着播客，步频精确地控制在每分钟一百二十步，眼睛只盯着前方五十米。\n\n那时候觉得，走路是一种通勤损耗，是要被压缩的成本。\n\n![午后的梧桐树影](/uploads/legacy-0381ee99c886c6d9fa6b.svg)\n\n*树影斑驳的午后，是这条路最慷慨的时刻。*\n\n直到某个加班到崩溃的深夜，我为了平复心情绕了远路。没有耳机，没有目的，第一次听见了自己的脚步声。那晚之后，我开始故意走慢。\n\n> 走路的速度，大概就是生活的速度。快有快的效率，慢有慢的分辨率。\n\n## 第二个五年：看风景\n\n慢下来之后，这条路开始向我展示它的细节：\n\n- 梧桐树春天发芽，是先从最高处的那根枝条开始的；\n- 拐角的面包店每天下午四点出炉法棍，香气能飘过半个路口；\n- 修车摊的老伯养了一只橘猫，永远趴在打气筒旁边打盹；\n- 第三盏路灯下有一块松动的地砖，雨天踩上去会溅水——十年了，没人修，也没人抱怨。\n\n![街角的店铺与自行车](/uploads/legacy-f733cd0e66ef3983279b.svg)\n\n*街角的面包店换过三次招牌，自行车换过两代主人。*\n\n这些细节没有任何「用处」。它们不产生价值，不解决问题，但它们让一条路变成了「我的路」。\n\n## 路还是那条路\n\n去年冬天，梧桐路翻新，老路灯换成了新的，松动的地砖终于被修好了。我有点怅然，像老朋友换了张脸。\n\n但春天来的时候，新栽的树也发芽了，先从最高处的那根枝条开始。\n\n我想，路不需要一直不变。变与不变之间，走路的人长大了——这才是这条路真正通向的地方。\n\n> 所谓故乡，大概就是一条你闭着眼睛也能走完、却永远看不腻的路。","posts/citywalk.md":"---\ntitle: 城市漫步：一条走了十年的路\nicon: 🚶\ndate: '2026-07-21'\ncategory:\n  - 随笔\ntag:\n  - 随笔\n  - 城市\n  - 摄影\ncover: /uploads/qxSvp8baO9FB.jpg\ndescription: 有些路不是用来赶路的。十年里我反复走同一条街，看它旧了又新，也看自己慢慢长大。\ntags:\n  - 随笔\n  - 城市\n  - 摄影\nupdatedAt: '2026-09-21T10:30:20.127Z'\n---\n\n\n<!--\n  ✏️ 这是一篇示例文章，用来展示「图文并茂」的排版效果。\n  🖼️ 把每张图的路径换成你自己的照片即可（例如 /images/posts/my-photo.jpg），\n     图片文件放进 src/.vuepress/public/images/posts/ 目录。\n  📝 文字直接替换成你自己的内容，排版结构（小标题、引用、插图）可以照搬。\n-->\n\n从公司到家，导航说十一分钟。但我总要走二十五分钟——因为中间那段梧桐路，值得慢慢走。<sup title=\"梧桐路其实没有正式的名字，这是我给它起的。十年里它在市政地图上一直被标着「待建路段」。\">1</sup>\n\n十年，两千多个来回。这条路比我更诚实，它记得我每一个阶段的样子。\n\n<!-- more -->\n\n## 第一个五年：赶时间\n\n刚来这座城市的时候，我走路是带风的。<sup title=\"每分钟一百二十步，是某个播客里的「高效通勤标准步频」。我当时深信不疑。\">2</sup>耳机里放着播客，步频精确地控制在每分钟一百二十步，眼睛只盯着前方五十米。\n\n那时候觉得，走路是一种通勤损耗，是要被压缩的成本。\n\n![午后的梧桐树影](/uploads/legacy-0381ee99c886c6d9fa6b.svg)\n\n*树影斑驳的午后，是这条路最慷慨的时刻。*\n\n直到某个加班到崩溃的深夜，我为了平复心情绕了远路。没有耳机，没有目的，第一次听见了自己的脚步声。那晚之后，我开始故意走慢。\n\n> 走路的速度，大概就是生活的速度。快有快的效率，慢有慢的分辨率。\n\n## 第二个五年：看风景\n\n慢下来之后，这条路开始向我展示它的细节：\n\n- 梧桐树春天发芽，是先从最高处的那根枝条开始的；\n- 拐角的面包店每天下午四点出炉法棍，香气能飘过半个路口；\n- 修车摊的老伯养了一只橘猫，永远趴在打气筒旁边打盹；\n- 第三盏路灯下有一块松动的地砖，雨天踩上去会溅水——十年了，没人修，也没人抱怨。\n\n![街角的店铺与自行车](/uploads/legacy-f733cd0e66ef3983279b.svg)\n\n*街角的面包店换过三次招牌，自行车换过两代主人。*\n\n这些细节没有任何「用处」。它们不产生价值，不解决问题，但它们让一条路变成了「我的路」。\n\n## 路还是那条路\n\n去年冬天，梧桐路翻新，老路灯换成了新的，松动的地砖终于被修好了。我有点怅然，像老朋友换了张脸。\n\n但春天来的时候，新栽的树也发芽了，先从最高处的那根枝条开始。\n\n我想，路不需要一直不变。变与不变之间，走路的人长大了——这才是这条路真正通向的地方。\n\n> 所谓故乡，大概就是一条你闭着眼睛也能走完、却永远看不腻的路。"}