<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Graycen Notes</title><description>技术、思考与日常记录</description><link>https://graycen-notes.pages.dev/</link><language>zh_CN</language><item><title>AI 辅助开发主流玩法：Claude Code 与 Cursor 完整指南</title><link>https://graycen-notes.pages.dev/posts/202606/ai-claude-code-cursor-guide/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202606/ai-claude-code-cursor-guide/</guid><description>整理 Claude Code 与 Cursor 当前最主流的工作流配置和使用范式——CLAUDE.md、Skills、Hooks、Worktree、Rules、MCP 等实战玩法，不是 README 入门。</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;距离&quot;AI 写代码&quot;从概念变成日常，不过两三年时间。但真正高效用好这两款工具的开发者，和把它们当搜索引擎用的开发者，生产力差距已经拉开了一个数量级。这篇文章整理了当前最主流的工作流配置和使用范式——不是 README 级别的入门，而是已经被大量开发者验证过的实战方式。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;h2&gt;一、先搞清楚定位：Cursor vs Claude Code，不是竞争是分工&lt;/h2&gt;
&lt;p&gt;很多人纠结该用哪个，但 2026 年社区里一个趋势越来越清晰：&lt;strong&gt;两者定位不同，主流用法是组合而非替换&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Cursor&lt;/strong&gt; 脱胎于 VSCode，继承了完整的 IDE 体验——文件树、插件生态、调试器全都在。它的优势是&lt;strong&gt;低摩擦&lt;/strong&gt;：边写边问、Tab 补全、多文件 diff 一览无余，视觉反馈非常直观，适合&quot;局部快速迭代&quot;场景。它的上下文控制和干预能力也更细腻，改哪行、不改哪行，开发者随时可以接管。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Claude Code&lt;/strong&gt; 是个纯终端 Agent。没有编辑器界面，直接在你的 shell 里跑，可以读文件、改文件、跑命令、推代码。它的优势是&lt;strong&gt;深度自主&lt;/strong&gt;：交给它一个跨越十几个文件的重构任务，或者&quot;给我写完这个模块的测试&quot;，它会自己规划、执行、验证，你去泡杯咖啡回来看结果。代价是黑盒感更强，适合&quot;大块任务批量交付&quot;场景。&lt;/p&gt;
&lt;p&gt;一个被很多团队采用的分工模式是：&lt;strong&gt;Cursor 负责日常编写和探索，Claude Code 负责长会话的 Agentic 任务&lt;/strong&gt;——比如跨模块重构、测试套件生成、框架迁移。这不是非此即彼，是术业专攻。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、Claude Code 的核心玩法&lt;/h2&gt;
&lt;h3&gt;1. CLAUDE.md：给 AI 装上项目记忆&lt;/h3&gt;
&lt;p&gt;如果只能做一件事提升 Claude Code 的输出质量，那就是写好 &lt;code&gt;CLAUDE.md&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;这个文件放在项目根目录，Claude Code 每次启动都会读取它，相当于给 AI 注入项目上下文。一个实用的 &lt;code&gt;CLAUDE.md&lt;/code&gt; 通常包含：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;项目概览&lt;/strong&gt;：这是什么项目、主要技术栈、目录结构&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;代码规范&lt;/strong&gt;：命名风格、注释要求、禁止使用的 API 或模式&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;开发约定&lt;/strong&gt;：如何运行测试、构建命令、部署流程&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;常见陷阱&lt;/strong&gt;：这个项目里有哪些&quot;雷&quot;，比如某个目录不能随便改、某个配置文件格式很特殊&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例片段：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# CLAUDE.md

## 项目简介
这是一个 Next.js 14 + Prisma + PostgreSQL 的 SaaS 应用。

## 技术约定
- 组件用函数式，不用 class component
- 数据库操作统一通过 `lib/db/` 下的 service 层，不在组件里直接调用 Prisma
- 测试用 Vitest，测试文件放在 `__tests__/` 目录

## 禁忌
- 不要修改 `prisma/migrations/` 下已有的迁移文件
- 不要在 server component 里引入客户端库
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;CLAUDE.md&lt;/code&gt; 支持层级：根目录是全局规则，子目录的 &lt;code&gt;CLAUDE.md&lt;/code&gt; 覆盖局部规则。这意味着你可以给不同模块设置不同的 AI 行为规范。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Skills（技能）：固化你的高频流程&lt;/h3&gt;
&lt;p&gt;Skills 是 Claude Code 的&quot;自定义斜杠命令&quot;，本质是一段 Markdown 格式的指令模板，触发方式是 &lt;code&gt;/skill名称&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;官方生态和社区（如 &lt;a href=&quot;https://skillsmp.com/&quot;&gt;SkillsMP&lt;/a&gt;）已经积累了大量开箱即用的 Skill：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Skill 示例&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;code&gt;implement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/implement&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;按团队风格实现功能&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;simplify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/simplify&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;化简冗余代码&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/test&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;生成单元测试&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;pr-description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/pr-description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;自动生成 PR 描述&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;security-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;&lt;code&gt;/security-review&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全漏洞扫描&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Skills 存放在 &lt;code&gt;.claude/skills/&lt;/code&gt; 目录，每个 Skill 是一个 Markdown 文件，里面描述&quot;当触发这个命令时，你应该做什么、遵循哪些规则&quot;。写法比 Prompt 工程更结构化，可以版本控制、团队共享。&lt;/p&gt;
&lt;p&gt;它解决的核心问题是：&lt;strong&gt;把你反复输入的那些复杂 Prompt，变成一个可复用、可维护的命令&lt;/strong&gt;。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Hooks：在 AI 行为的关键节点插入你的逻辑&lt;/h3&gt;
&lt;p&gt;Hooks 是 Claude Code 的自动化机制，在 Agent 执行流程的特定事件上触发你的脚本。&lt;/p&gt;
&lt;p&gt;主要的 Hook 事件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;PreToolUse&lt;/code&gt;：AI 准备调用某个工具（比如写文件、运行命令）之前触发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;PostToolUse&lt;/code&gt;：工具执行完之后触发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Stop&lt;/code&gt;：Claude 完成一次回复时触发&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Notification&lt;/code&gt;：Agent 需要用户注意时触发&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;实际用法举几个例子：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例1：防止 AI 直接改生产配置&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PreToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Write&quot;,
      &quot;command&quot;: &quot;if echo &apos;$CLAUDE_TOOL_INPUT&apos; | grep -q &apos;production&apos;; then exit 2; fi&quot;
    }]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;返回退出码 &lt;code&gt;2&lt;/code&gt; 会让 Claude 收到错误信息并停下来重新考虑。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例2：每次写完文件自动跑 lint&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;hooks&quot;: {
    &quot;PostToolUse&quot;: [{
      &quot;matcher&quot;: &quot;Write&quot;,
      &quot;command&quot;: &quot;npm run lint -- $CLAUDE_TOOL_OUTPUT_FILE 2&amp;gt;&amp;amp;1&quot;
    }]
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这样 AI 写完代码，lint 错误会立刻反馈给它，进入自动修复循环，而不需要你手动盯着。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;例3：Prompt Hook——用 AI 评估 AI&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Hooks 还支持一种特殊的&quot;Prompt Hook&quot;，调用一个轻量模型来判断当前操作是否合规。比如在 AI 要删除文件时，先问一下&quot;这个删除操作合理吗&quot;，再决定是否放行。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. Git Worktree：真正的并行开发&lt;/h3&gt;
&lt;p&gt;这是 Claude Code 社区里讨论度最高的工作流之一，原理并不复杂：&lt;strong&gt;Git Worktree 允许你从同一个仓库 checkout 出多个独立的工作目录&lt;/strong&gt;，每个目录对应一个 branch，互不干扰。&lt;/p&gt;
&lt;p&gt;配合 Claude Code 使用时，好处立刻出来了：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# 创建三个并行工作区
git worktree add ../project-feature-auth feature/auth
git worktree add ../project-fix-perf fix/performance
git worktree add ../project-refactor-api refactor/api-layer

# 在三个目录里分别启动 Claude Code
cd ../project-feature-auth &amp;amp;&amp;amp; claude
cd ../project-fix-perf &amp;amp;&amp;amp; claude
cd ../project-refactor-api &amp;amp;&amp;amp; claude
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;三个 Claude Code 实例同时跑，做完全不同的任务，上下文互不污染，不会出现&quot;AI 把 feature 分支的改动带进了 hotfix&quot;这种问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键优势&lt;/strong&gt;：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;每个 session 的上下文是干净的，AI 不会被其他任务的信息&quot;污染&quot;&lt;/li&gt;
&lt;li&gt;多任务真正并行，不是伪并行&lt;/li&gt;
&lt;li&gt;合并时走正常 Git 流程，冲突范围可控&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;适用场景&lt;/strong&gt;：需要同时推进多个独立任务时——比如一边修 bug、一边写新功能、一边做重构，这三件事没有依赖关系，完全可以并行跑三个 Agent。&lt;/p&gt;
&lt;p&gt;一个实用建议：&lt;strong&gt;worktree 的初始化成本不低&lt;/strong&gt;（需要重新安装依赖、复制未追踪的配置文件），所以不值得为了 10 分钟能完成的任务专门开一个 worktree。对于预计需要 30 分钟以上的任务，开 worktree 的收益就很明显了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;5. Subagents 与 Agent Teams：让 AI 管理 AI&lt;/h3&gt;
&lt;p&gt;Claude Code 支持 Agent 委派：主 Agent 可以把子任务分配给 Subagent，由 Subagent 独立执行后返回结果。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Subagents&lt;/strong&gt; 的适用场景是&quot;一个大任务里有多个独立的子问题&quot;：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;帮我给这个项目生成完整测试套件&quot;
  → 主 Agent 拆分任务
  → Subagent A：处理 auth 模块的测试
  → Subagent B：处理 API 路由的测试
  → Subagent C：处理 util 函数的测试
  → 主 Agent：汇总结果
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Agent Teams&lt;/strong&gt; 是更进一步的协作模式——预先定义多个有不同角色的 Agent（比如一个 Planner、一个 Coder、一个 Reviewer），让它们以流水线方式协作完成任务。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;什么时候值得用&lt;/strong&gt;：任务能清晰拆分成互不依赖的子任务、且每个子任务足够重（单独跑一个 Agent 划算）时，委派才有收益。对于逻辑紧密相连的任务，拆分带来的协调开销反而会降低质量。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;6. MCP：接入外部世界&lt;/h3&gt;
&lt;p&gt;MCP（Model Context Protocol）是连接 Claude Code 与外部工具的标准协议。通过配置 MCP Server，Claude Code 可以直接操作：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;GitHub&lt;/strong&gt;：搜索 PR、创建 issue、查看 diff&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;数据库&lt;/strong&gt;：直接查询、生成迁移脚本并验证&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;文档系统&lt;/strong&gt;：读取 Confluence、Notion 里的规范文档&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;监控系统&lt;/strong&gt;：拉取 Sentry 错误、查 Grafana 指标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Slack&lt;/strong&gt;：发送通知、搜索历史消息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;配置方式是在 &lt;code&gt;~/.claude/claude_code_config.json&lt;/code&gt; 中声明 MCP Server：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;{
  &quot;mcpServers&quot;: {
    &quot;github&quot;: {
      &quot;command&quot;: &quot;npx&quot;,
      &quot;args&quot;: [&quot;-y&quot;, &quot;@modelcontextprotocol/server-github&quot;],
      &quot;env&quot;: { &quot;GITHUB_TOKEN&quot;: &quot;your_token&quot; }
    }
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;配置后，Claude Code 可以在完成编码后自动创建 PR、填写描述、关联 issue——整个提交流程几乎不需要人工操作。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;三、Cursor 的核心玩法&lt;/h2&gt;
&lt;h3&gt;1. Rules：项目级 AI 行为规范&lt;/h3&gt;
&lt;p&gt;Cursor 的 Rules（原 &lt;code&gt;.cursorrules&lt;/code&gt;）是 2026 年改版后最重要的配置机制。现在的规则文件是 &lt;code&gt;.mdc&lt;/code&gt; 格式，存放在 &lt;code&gt;.cursor/rules/&lt;/code&gt; 目录，支持 glob 模式按文件类型分别生效：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;.cursor/rules/
├── general.mdc          # 全局规则
├── react-components.mdc # 只对 .tsx 文件生效
├── api-routes.mdc       # 只对 app/api/ 下的文件生效
└── test-files.mdc       # 只对 *.test.ts 生效
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;每个 &lt;code&gt;.mdc&lt;/code&gt; 文件的 YAML 头部控制作用范围：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
globs: [&quot;src/components/**/*.tsx&quot;]
alwaysApply: false
---

## React 组件规范

- 使用 TypeScript，所有 props 必须有类型定义
- 组件文件同时导出类型和组件
- 不使用 default export，统一用 named export
- CSS 用 Tailwind，不引入额外的 CSS 文件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这比全局一刀切的规则精准得多——写测试文件时用测试相关的规范，写 API 路由时切换到后端规范。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;2. Agent 模式：从&quot;补全&quot;到&quot;自主执行&quot;&lt;/h3&gt;
&lt;p&gt;Cursor 的 Agent 模式（Composer）是它的核心功能。和普通的 Chat 不同，Agent 模式可以：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;跨多个文件做修改&lt;/li&gt;
&lt;li&gt;执行终端命令&lt;/li&gt;
&lt;li&gt;读取报错信息并自动修复&lt;/li&gt;
&lt;li&gt;在任务完成前持续循环，直到验证通过&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2026 年的 Background Agents&lt;/strong&gt; 更进一步——你不需要盯着 Cursor 界面，Agent 在后台跑，你可以继续做别的事，它完成后通知你。&lt;/p&gt;
&lt;p&gt;实践中一个有效的工作流是&quot;Plan → Execute → Review&quot;三段式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;先让 Agent 输出执行计划，&lt;strong&gt;不执行&lt;/strong&gt;，你审阅并修改&lt;/li&gt;
&lt;li&gt;确认计划后，让它执行&lt;/li&gt;
&lt;li&gt;执行完成后做 diff review，必要时局部回退&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这在 Cursor 里通过&quot;让 Agent 先描述它要做什么&quot;来实现，避免 Agent 跑偏了你还不知道。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;3. Skills（Cursor）：跨工具复用的能力单元&lt;/h3&gt;
&lt;p&gt;Cursor 也引入了 Skills 体系，格式采用 &lt;code&gt;SKILL.md&lt;/code&gt;，和 Claude Code 的 Skills 格式相近，目的是&lt;strong&gt;让同一套能力描述在不同 AI 工具间可以复用&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;这解决了一个现实问题：你精心写好的 Cursor 规则，换到 Claude Code 就得重写。Skills 的标准化格式让这个工作量降低了。&lt;/p&gt;
&lt;hr /&gt;
&lt;h3&gt;4. MCP：和 Claude Code 共用同一套工具生态&lt;/h3&gt;
&lt;p&gt;Cursor 对 MCP 的支持已经相当成熟，配置方式和 Claude Code 高度一致。这意味着你给 Claude Code 配好的 GitHub MCP Server、数据库 Server，在 Cursor 里改改配置就能复用。&lt;/p&gt;
&lt;p&gt;6 个最值得配的 MCP Server（两款工具通用）：&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;MCP Server&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;code&gt;github-mcp-server&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;PR/Issue/代码搜索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;filesystem&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;安全的文件系统访问&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;postgres&lt;/code&gt; / &lt;code&gt;sqlite&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;数据库直接操作&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;brave-search&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;实时网络搜索&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;sentry&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;错误监控接入&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;slack&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;消息通知与搜索&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、两者通用的工作流原则&lt;/h2&gt;
&lt;h3&gt;给 AI 的任务颗粒度要对&lt;/h3&gt;
&lt;p&gt;太大：&quot;帮我重构整个后端&quot;——AI 会迷失方向，产出质量不稳定。
太小：&quot;把这个变量名从 x 改成 count&quot;——不值得调用 Agent，直接手写更快。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;合适的颗粒度&lt;/strong&gt;：一个功能点、一个模块的测试、一个具体的 bug 修复。能在一个上下文窗口内完成、有清晰的验收标准——这是给 AI 任务的黄金区间。&lt;/p&gt;
&lt;h3&gt;验收标准要前置&lt;/h3&gt;
&lt;p&gt;&quot;帮我实现用户登录功能&quot;不如&quot;帮我实现用户登录功能，要求：通过 &lt;code&gt;npm test&lt;/code&gt; 里的 auth 相关测试，错误信息要符合 &lt;code&gt;docs/error-codes.md&lt;/code&gt; 的规范&quot;。&lt;/p&gt;
&lt;p&gt;前置验收标准，AI 才知道什么叫&quot;完成&quot;，才会主动验证而不是生成完就交差。&lt;/p&gt;
&lt;h3&gt;上下文污染是隐形杀手&lt;/h3&gt;
&lt;p&gt;一个 Claude Code session 跑太长之后，早期的错误信息、半途放弃的方向会慢慢干扰后续决策。认知到这一点后，&lt;strong&gt;适时开新 session 而不是在一个 session 里硬撑&lt;/strong&gt;，是保持 AI 输出质量稳定的重要习惯。Worktree 模式的优势之一，就是每个任务天然有独立的干净上下文。&lt;/p&gt;
&lt;h3&gt;版本控制是安全网，不是事后补救&lt;/h3&gt;
&lt;p&gt;让 AI 大规模改代码之前，先 commit 当前状态——这几乎是所有重度用户的共识。不是不信任 AI，而是给自己保留随时回退的能力。用 AI 开发的节奏比手写快很多，出了问题如果没有 checkpoint，回溯的成本会非常高。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、选型参考&lt;/h2&gt;
&lt;p&gt;不同场景下，哪款工具更适合：&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;/td&gt;
&lt;td&gt;Cursor&lt;/td&gt;
&lt;td&gt;IDE 原生体验，干预灵活&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;大规模重构、跨模块任务&lt;/td&gt;
&lt;td&gt;Claude Code&lt;/td&gt;
&lt;td&gt;自主性强，适合长任务&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;多任务并行推进&lt;/td&gt;
&lt;td&gt;Claude Code + Worktree&lt;/td&gt;
&lt;td&gt;真并行，上下文隔离&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;需要接入外部系统（DB/GitHub）&lt;/td&gt;
&lt;td&gt;两者均可（MCP 通用）&lt;/td&gt;
&lt;td&gt;配置可复用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;团队统一规范&lt;/td&gt;
&lt;td&gt;Cursor Rules + CLAUDE.md&lt;/td&gt;
&lt;td&gt;两者各有格式，可共存&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;移动端、无本地环境&lt;/td&gt;
&lt;td&gt;Claude Code Web&lt;/td&gt;
&lt;td&gt;Anthropic 已上线 Web 版&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;工具本身的能力已经不是瓶颈了。把 &lt;code&gt;CLAUDE.md&lt;/code&gt; 写清楚、把高频流程固化成 Skills、用 Hooks 关掉那些让 AI 反复犯错的&quot;漏洞&quot;、在需要并行时拉起 Worktree——这些配置投入一次，之后每次开发都在收益。&lt;/p&gt;
&lt;p&gt;AI 编程工具的上限，越来越取决于你给它搭的环境，而不只是它本身的模型能力。&lt;/p&gt;
</content:encoded></item><item><title>用 Cloudflare 全家桶做独立产品：Pages + Workers 零成本全栈方案</title><link>https://graycen-notes.pages.dev/posts/202606/cloudflare-indie-fullstack/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202606/cloudflare-indie-fullstack/</guid><description>独立开发者冷启动阶段的零成本全栈方案——Pages 托管前端，Workers 处理持久化与安全操作，D1/KV 存数据，免费额度足够撑过 MVP 验证期。</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;适合人群：想验证产品 MVP、不想在冷启动阶段花服务器钱的独立开发者&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2&gt;前言&lt;/h2&gt;
&lt;p&gt;很多独立开发者面临一个共同困境：产品的核心逻辑其实很简单，前端就能搞定大部分交互，但只要涉及「存用户数据」「发邮件」「生成订单号」这类事情，就不得不租一台服务器——每月几十到几百元，在产品还没验证市场前，这笔钱心里很虚。&lt;/p&gt;
&lt;p&gt;Cloudflare 提供了一个优雅的解法：&lt;strong&gt;Pages + Workers + D1/KV&lt;/strong&gt;，前后端都在 Cloudflare 边缘网络上，免费额度足够大多数早期产品撑过冷启动阶段。&lt;/p&gt;
&lt;h2&gt;APP推广页&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;实现效果：&lt;/strong&gt; &lt;a href=&quot;https://musiclab.pages.dev/zh&quot;&gt;https://musiclab.pages.dev/zh&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;推广页脚手架：&lt;/strong&gt; &lt;a href=&quot;https://github.com/ayxworxfr/indie-launch-kit&quot;&gt;https://github.com/ayxworxfr/indie-launch-kit&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;无需编码，修改配置文件 5 分钟快速构建自己的 APP 宣传页&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://i-blog.csdnimg.cn/direct/80327a03390745a88cc65a34773be511.png&quot; alt=&quot;APP 推广页示例&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;整体架构&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;用户浏览器
    │
    ▼
Cloudflare Pages（静态前端）
    │  核心业务逻辑在前端完成
    │  如：产品展示、定价计算、表单校验、 UI 交互
    │
    ▼  只在需要「持久化」或「安全操作」时才调用后端
Cloudflare Workers（轻量 API）
    │
    ├── D1（SQLite 数据库）  → 存用户信息、订单记录
    ├── KV（键值存储）        → 存会员码、邮件验证码、配置项
    ├── 邮件服务              → 对接 Resend / MailChannels
    └── 支付回调              → 对接 Stripe / Lemon Squeezy Webhook
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;核心原则：能在前端做的，绝不往后端甩。&lt;/strong&gt; Workers 只负责四件事：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;写入 / 读取数据库（用户注册、订单记录）&lt;/li&gt;
&lt;li&gt;生成唯一码（会员码、激活码、邀请码）&lt;/li&gt;
&lt;li&gt;发送邮件通知（注册确认、付款成功）&lt;/li&gt;
&lt;li&gt;处理第三方支付回调（验证签名、更新会员状态）&lt;/li&gt;
&lt;/ol&gt;
&lt;hr /&gt;
&lt;h2&gt;为什么这个组合适合独立开发者&lt;/h2&gt;
&lt;h3&gt;费用对比&lt;/h3&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;传统 VPS（2核4G）&lt;/td&gt;
&lt;td&gt;¥50–200&lt;/td&gt;
&lt;td&gt;成熟产品，流量稳定&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Vercel + PlanetScale&lt;/td&gt;
&lt;td&gt;$0–20&lt;/td&gt;
&lt;td&gt;中期，有一定用户量&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Cloudflare Pages + Workers&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;$0（免费额度内）&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;冷启动 / MVP 验证&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;Cloudflare 免费额度&lt;/h3&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;Pages&lt;/td&gt;
&lt;td&gt;无限带宽，500次构建/月&lt;/td&gt;
&lt;td&gt;静态托管完全够用&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Workers&lt;/td&gt;
&lt;td&gt;10万次请求/天&lt;/td&gt;
&lt;td&gt;日活过万才需要付费&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D1 数据库&lt;/td&gt;
&lt;td&gt;5GB 存储，500万行读/天&lt;/td&gt;
&lt;td&gt;早期产品完全够&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;KV 存储&lt;/td&gt;
&lt;td&gt;10万次读/天，1000次写/天&lt;/td&gt;
&lt;td&gt;存会员码足够&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;早期产品日活通常在几十到几百，上面的额度&lt;strong&gt;几乎永远用不完&lt;/strong&gt;。&lt;/p&gt;
&lt;h3&gt;网速优势&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Cloudflare 在全球 300+ 城市有节点，包括香港、东京&lt;/li&gt;
&lt;li&gt;国内访问 Cloudflare Pages 比 GitHub Pages 稳定得多&lt;/li&gt;
&lt;li&gt;Workers 在边缘执行，延迟极低（通常 &amp;lt; 50ms）&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;典型使用场景拆解&lt;/h2&gt;
&lt;h3&gt;场景一：用户留资（邮件订阅）&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;前端：表单收集邮箱 + 前端校验格式
  ↓
Workers：写入 D1 数据库 + 发确认邮件
  ↓
完成：用户进入你的早期用户列表
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Workers 代码示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// src/api/subscribe.ts
export async function handleSubscribe(request: Request, env: Env) {
  const { email } = await request.json();

  // 写入数据库
  await env.DB.prepare(
    &apos;INSERT OR IGNORE INTO subscribers (email, created_at) VALUES (?, ?)&apos;
  ).bind(email, new Date().toISOString()).run();

  // 发确认邮件（对接 Resend）
  await fetch(&apos;https://api.resend.com/emails&apos;, {
    method: &apos;POST&apos;,
    headers: {
      Authorization: `Bearer ${env.RESEND_API_KEY}`,
      &apos;Content-Type&apos;: &apos;application/json&apos;,
    },
    body: JSON.stringify({
      from: &apos;noreply@yourdomain.com&apos;,
      to: email,
      subject: &apos;订阅成功&apos;,
      html: &apos;&amp;lt;p&amp;gt;感谢订阅，我们会在产品上线时第一时间通知你。&amp;lt;/p&amp;gt;&apos;,
    }),
  });

  return new Response(JSON.stringify({ ok: true }), { status: 200 });
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;场景二：生成会员激活码&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;用户付款成功（Stripe Webhook 触发）
  ↓
Workers：验证支付签名 → 生成唯一激活码 → 存入 KV → 发邮件给用户
  ↓
用户收到激活码，在前端输入后验证（Workers 查 KV）
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;激活码生成示例：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// 生成 16 位大写字母+数字的激活码
function generateLicenseKey(): string {
  const chars = &apos;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789&apos;;
  const segments = Array.from({ length: 4 }, () =&amp;gt;
    Array.from({ length: 4 }, () =&amp;gt; chars[Math.floor(Math.random() * chars.length)]).join(&apos;&apos;)
  );
  return segments.join(&apos;-&apos;); // 格式：XXXX-XXXX-XXXX-XXXX
}

// 存入 KV，value 存用户邮箱，key 是激活码
await env.LICENSE_KV.put(licenseKey, email, {
  metadata: { plan: &apos;pro&apos;, activatedAt: null }
});
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;场景三：激活码校验&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;前端：用户输入激活码
  ↓
Workers：查 KV → 返回是否有效 + 已激活状态
  ↓
前端：解锁对应功能（如果核心功能在前端）
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;这套方案的边界和局限&lt;/h2&gt;
&lt;p&gt;诚实说，这套方案&lt;strong&gt;不是万能的&lt;/strong&gt;，有几个明显限制：&lt;/p&gt;
&lt;h3&gt;适合做的事&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;静态内容展示（Landing Page、文档、博客）&lt;/li&gt;
&lt;li&gt;轻量数据持久化（用户留资、订单记录、激活码）&lt;/li&gt;
&lt;li&gt;简单 API（CRUD、邮件发送、Webhook 接收）&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;不适合做的事&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;实时性要求高&lt;/strong&gt;：WebSocket 长连接（聊天、协同编辑），Workers 不擅长&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;复杂计算&lt;/strong&gt;：Workers 有 CPU 时间限制（免费版 10ms），机器学习推理等跑不了&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;大文件处理&lt;/strong&gt;：视频转码、图片处理，需要配合 Cloudflare R2 + Images&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;有状态会话&lt;/strong&gt;：传统 Session 模式需要改成 JWT 或 KV 存 Token&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安全注意事项&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;激活码校验、支付验证等&lt;strong&gt;必须在 Workers 里做&lt;/strong&gt;，不能完全依赖前端&lt;/li&gt;
&lt;li&gt;敏感密钥（API Key、数据库密码）通过 Workers 的 &lt;code&gt;env&lt;/code&gt; 绑定，不要写死在代码里&lt;/li&gt;
&lt;li&gt;前端的「解锁功能」只能做体验层，真正的权限控制要在服务端&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;快速上手&lt;/h2&gt;
&lt;h3&gt;1. 初始化 Workers 项目&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;npm create cloudflare@latest my-api
cd my-api
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;2. 绑定 D1 数据库&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# wrangler.toml
[[d1_databases]]
binding = &quot;DB&quot;
database_name = &quot;my-app-db&quot;
database_id = &quot;xxxx-xxxx-xxxx&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;3. 部署&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;# 部署 Workers
npx wrangler deploy

# 前端推送 GitHub 后 Cloudflare Pages 自动构建部署
git push origin main
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;4. 前端调用 Workers API&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// 前端调用示例
const res = await fetch(&apos;https://my-api.your-name.workers.dev/subscribe&apos;, {
  method: &apos;POST&apos;,
  headers: { &apos;Content-Type&apos;: &apos;application/json&apos; },
  body: JSON.stringify({ email: userEmail }),
});
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&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;/td&gt;
&lt;td&gt;⭐⭐⭐（比 VPS 简单，比纯前端复杂一点）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;免费额度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐⭐（早期产品几乎零成本）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;国内访问速度&lt;/td&gt;
&lt;td&gt;⭐⭐⭐⭐（比 GitHub Pages 强，比国内云差）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;扩展性&lt;/td&gt;
&lt;td&gt;⭐⭐⭐（够用，大规模需迁移）&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;适合场景&lt;/td&gt;
&lt;td&gt;MVP 验证、个人工具、小型 SaaS 早期版本&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;一句话结论&lt;/strong&gt;：如果你的产品核心是前端体验，后端只是做数据落地，Cloudflare Pages + Workers 是目前独立开发者冷启动阶段性价比最高的方案，没有之一。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;项目地址&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/ayxworxfr/indie-launch-kit&quot;&gt;https://github.com/ayxworxfr/indie-launch-kit&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;参考链接&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/pages/&quot;&gt;Cloudflare Pages 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/workers/&quot;&gt;Cloudflare Workers 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/d1/&quot;&gt;D1 数据库入门&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.cloudflare.com/kv/&quot;&gt;Workers KV 文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://resend.com&quot;&gt;Resend 邮件服务&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Skill 设计的本质：你不是在写指令，你是在塑造概率地形</title><link>https://graycen-notes.pages.dev/posts/202606/skill-design-probability-landscape/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202606/skill-design-probability-landscape/</guid><description>LLM 不是在遵守规则，而是在概率空间中选择下一个 token。Skill 设计的本质不是下命令，而是改变概率地形——让正确路径变成下坡路，让错误路径变成高墙。</description><pubDate>Fri, 26 Jun 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;核心论点&lt;/h2&gt;
&lt;p&gt;大多数人写 Skill 的心智模型是错的。&lt;/p&gt;
&lt;p&gt;他们把 AI 当成一个听话的下属——&quot;我写清楚了，它应该照做。&quot; 然后困惑为什么 AI 读完 50 条规则，该犯的错一条不少。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;真相是：LLM 不是在&quot;遵守&quot;你的规则，它是在一个概率空间中选择下一个 token。&lt;/strong&gt; 你的 Skill 所做的，不是&quot;下命令&quot;，而是改变这个概率空间的地形——让正确的输出路径变成下坡路，让错误的输出路径变成需要翻越的高墙。&lt;/p&gt;
&lt;p&gt;一旦你用这个心智模型重新看待 Skill 设计，很多&quot;技巧&quot;就不再是技巧，而是必然的推论。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;一、为什么 90% 的 Skill 是废纸&lt;/h2&gt;
&lt;p&gt;先看一个反面教材：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Rules
- 代码要有良好的错误处理
- 保持函数简短
- 注意性能
- 写清晰的注释
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这四条规则看起来合理，但对 LLM 来说等于没写。原因有三：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第一，模糊即自由。&lt;/strong&gt; &quot;良好的&quot;&quot;简短的&quot;&quot;注意&quot;——这些词给了模型巨大的自由裁量空间。概率模型在有自由裁量空间时，会倾向于选择生成概率最高的路径——也就是最&quot;平庸&quot;的输出。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二，声明不产生动作。&lt;/strong&gt; &quot;保持函数简短&quot;是一个状态描述，不是一个动作指令。模型读完会&quot;知道&quot;这件事，但知道 ≠ 执行。就像你知道该早睡，但你还是在刷手机。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第三，没有验证闭环。&lt;/strong&gt; 规则写了，但没有检查点。模型没有任何机制&quot;回头看看自己有没有遵守&quot;。它是逐 token 生成的，注意力会随序列长度衰减，开头的规则到 3000 token 时已经是远处的微弱信号。&lt;/p&gt;
&lt;p&gt;理解了这三个失败原因，解决方案就清晰了：&lt;strong&gt;消除模糊、制造动作、强制验证。&lt;/strong&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;二、Skill 的物理结构（30 秒速览）&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;skill-name/
├── SKILL.md          # 唯一必需文件：元数据 + 执行指令
├── scripts/          # AI 可直接运行的脚本
├── references/       # 按需加载的参考文档（省 token）
└── assets/           # 模板和静态资源
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;SKILL.md&lt;/code&gt; 内部分两层：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;┌──────────────────────────────────────────────┐
│  YAML Frontmatter（~100 tokens）              │ ← 常驻内存，用于触发判断
│  只回答一个问题：&quot;什么时候该用我？&quot;              │
├──────────────────────────────────────────────┤
│  Markdown 正文（&amp;lt; 5000 tokens）               │ ← 触发后才加载
│  只回答一个问题：&quot;具体怎么做？&quot;                 │
└──────────────────────────────────────────────┘
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;唯一需要记住的铁律：&lt;/strong&gt; &lt;code&gt;description&lt;/code&gt; 只写触发条件，绝不总结流程。否则 AI 会照着 description 干活，跳过你精心设计的正文。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ❌ 把流程写进了 description —— AI 会跳过正文
description: 从稳定性、性能、可读性三维度审查代码，先列问题再给建议

# ✅ 只写触发条件
description: 当用户提交代码要求审查时使用
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;三、五个设计模式（核心章节）&lt;/h2&gt;
&lt;p&gt;以下不是&quot;建议&quot;，是从 LLM 的生成机制推导出的必然策略。&lt;/p&gt;
&lt;h3&gt;模式 1：动作化——把名词变成动词&lt;/h3&gt;
&lt;p&gt;LLM 看到动词时会&quot;启动执行&quot;，看到名词时会&quot;表示理解&quot;。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ❌ 名词式（声明知识）
代码审查需要关注错误处理、边界条件和资源释放。

# ✅ 动词式（触发动作）
1. 搜索所有 async 函数，检查每一个是否有对应的 try-catch
2. 列出所有外部输入参数，逐个验证是否有 null/undefined 防护
3. 找到所有资源获取点（连接、文件句柄），确认每一个都有释放逻辑
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;区别不只是&quot;更具体&quot;——而是前者让模型停留在&quot;理解&quot;状态，后者把模型推入&quot;执行&quot;状态。这是两种完全不同的生成模式。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;转化公式：&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;注意 X&quot; → &quot;搜索所有 X 的实例，逐个检查 [具体标准]，列出不合格项&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;模式 2：检查门——规则 × 检测 × 阻断&lt;/h3&gt;
&lt;p&gt;单独的规则是建议。规则 + 检测方法 + 阻断条件才是约束。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# ❌ 裸规则（模型会&quot;忘记&quot;）
函数不超过 30 行。

# ✅ 检查门（模型不得不执行）
## 函数长度检查
1. 统计每个函数的行数
2. 行数 &amp;gt; 30 的函数标记为 WARNING
3. 行数 &amp;gt; 50 的函数标记为 BLOCK

阻断条件：存在任何 BLOCK 级函数时，必须先完成拆分建议，才能继续后续步骤。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;检查门三要素：&lt;/strong&gt;&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;/td&gt;
&lt;td&gt;定义标准&lt;/td&gt;
&lt;td&gt;模型不知道标准&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;检测动作&lt;/td&gt;
&lt;td&gt;强制模型去验证&lt;/td&gt;
&lt;td&gt;模型&quot;以为&quot;自己遵守了&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;阻断条件&lt;/td&gt;
&lt;td&gt;不通过不能继续&lt;/td&gt;
&lt;td&gt;模型发现违规但跳过&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3&gt;模式 3：注意力锚点——对抗长序列遗忘&lt;/h3&gt;
&lt;p&gt;LLM 的注意力分布不均匀：&lt;strong&gt;开头和最近的内容权重最高，中段最容易被忽略。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这意味着在一个 3000 token 的 Skill 中，你在第 200 token 写的规则，到模型生成第 2000 个 token 时，影响力已经大幅衰减。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;对策：三层防御架构&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Overview（开头声明——第一次曝光）
核心原则：先完成根因分析，再给修复建议。绝无例外。

## Steps（中段执行——第二次曝光）
### Step 3 完成后 → 中途自检
- [ ] 我是否已经完成了根因分析？
- [ ] 我是否在没有根因的情况下给了建议？
→ 如果后者为是，删除建议，回到 Step 2 重做。

## Final Checkpoint（结尾拦截——第三次曝光）
输出前最终确认：
- [ ] 根因分析是否有完整的因果链（至少 3 层 Why）
- [ ] 每条修复建议是否都能追溯到具体根因

未通过以上检查的内容不得出现在最终输出中。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;同一条规则出现三次，但不是简单重复——开头是声明，中段是动作化的自检，结尾是阻断性的最终关卡。&lt;/p&gt;
&lt;h3&gt;模式 4：堵死逃逸路径——借口反驳表&lt;/h3&gt;
&lt;p&gt;LLM 有一种行为模式我称之为&quot;优雅逃逸&quot;：它会用看似合理的话术跳过困难步骤。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&quot;这段代码比较简洁，没有明显问题。&quot;  ← 翻译：我不想逐行检查
&quot;建议用户自行验证。&quot;              ← 翻译：我不确定，但不想承认
&quot;其余部分保持不变。&quot;              ← 翻译：我懒得输出完整内容
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;解法：把高频逃逸路径预置为&quot;被禁止的输出模式&quot;。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## 禁止的输出模式

以下表述如果出现在你的输出中，说明你正在偷懒，必须删除并重做：

| 禁止输出 | 应替换为 |
|:---|:---|
| &quot;代码整体没有问题&quot; | 列出你具体检查了哪些路径，每条的结论 |
| &quot;建议用户自行测试&quot; | 给出具体的测试命令和预期结果 |
| &quot;其余保持不变&quot; | 输出完整内容，或明确列出&quot;未修改的部分&quot;清单 |
| &quot;可能是 X 导致的&quot; | 给出验证是否为 X 的具体步骤 |

触发上述任何一条时，回退当前步骤重做。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;这不是&quot;提醒&quot;模型——这是在概率空间中设置路障。当模型即将生成&quot;代码整体没有问题&quot;这个 token 序列时，它&quot;知道&quot;这条路径被明确标记为错误，概率会显著降低。&lt;/p&gt;
&lt;h3&gt;模式 5：渐进式信息投放——控制认知负荷&lt;/h3&gt;
&lt;p&gt;人的工作记忆容量是 7±2 项。LLM 的有效注意力窗口虽然更大，但同样遵循&quot;信息越多，单条信息影响力越低&quot;的规律。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;策略：正文只放执行指令，背景知识按需加载。&lt;/strong&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;## Step 2: API 兼容性检查

检查所有外部 API 调用是否符合 v3 规范。
详细规范见：[API v3 迁移指南](references/api-v3-migration.md)

仅加载你需要检查的部分，不要一次性读取整个文档。
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;Token 预算分配原则：&lt;/strong&gt;&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;/td&gt;
&lt;td&gt;YAML description&lt;/td&gt;
&lt;td&gt;必须始终在内存中&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;执行步骤 + 规则&lt;/td&gt;
&lt;td&gt;SKILL.md 正文&lt;/td&gt;
&lt;td&gt;触发后加载，是核心指令&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;参考文档 &amp;gt; 100 行&lt;/td&gt;
&lt;td&gt;references/&lt;/td&gt;
&lt;td&gt;按需加载，避免挤占注意力&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;代码模板&lt;/td&gt;
&lt;td&gt;assets/&lt;/td&gt;
&lt;td&gt;需要时再读取&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;自动化脚本&lt;/td&gt;
&lt;td&gt;scripts/&lt;/td&gt;
&lt;td&gt;AI 调用即可，无需理解全部&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;四、四种 Skill 骨架&lt;/h2&gt;
&lt;p&gt;选对骨架再填内容，事半功倍。&lt;/p&gt;
&lt;h3&gt;A. 工作流型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;触发 → Step 1 → [产出物] → Step 2 → [产出物] → ... → 交付
                     ↓ 失败
               异常处理 / 回退 / 升级
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;用于：&lt;/strong&gt; 步骤有明确先后依赖关系的任务。&lt;/p&gt;
&lt;h3&gt;B. 检查清单型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;加载清单 → 逐项检查 → 标记状态（Pass/Warn/Block）→ 汇总 → 判断是否通过
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;用于：&lt;/strong&gt; 确保覆盖面的审查型任务。&lt;/p&gt;
&lt;h3&gt;C. 生成器型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;接收输入 → 校验输入完整性 → 按模板生成 → 校验输出质量 → 交付
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;用于：&lt;/strong&gt; 从少量输入产出标准化文档。&lt;/p&gt;
&lt;h3&gt;D. 分析决策型&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;收集现象 → 强制多维度分析 → 根因推导 → 方案对比 → 输出结论
              ↑
         借口反驳表拦截偷懒
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;用于：&lt;/strong&gt; 需要深度思考、防止浅层回答的场景。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;五、完整示例：代码审查 Skill&lt;/h2&gt;
&lt;p&gt;将上述所有模式整合为一个可直接使用的 Skill：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
name: code-review
description: &amp;gt;
  当用户提交代码片段或 diff 要求审查时使用。
  不适用于：代码生成、格式化、简单语法纠错。
---
&lt;/code&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;code&gt;# Code Review

## Core Principle
先理解意图，再逐项审查，最后结构化输出。
禁止只看前 20 行就开始下结论。禁止输出&quot;整体不错&quot;类空话。

## Steps

### Step 1: 全局理解
- 通读所有提交的代码
- 用一句话概括：&quot;这段代码的目的是 ____&quot;
- 识别核心逻辑路径和数据流方向

### Step 2: 三维度审查

对每个维度执行检查门：

#### 稳定性
1. 搜索所有 async/await 调用 → 每个是否有 try-catch 或 .catch
2. 列出所有外部输入 → 每个是否有 null/undefined/类型校验
3. 找到所有资源获取点 → 每个是否有释放/关闭逻辑
4. 识别并发场景 → 是否有竞态条件风险

#### 性能
1. 识别所有循环 → 有无嵌套循环可降低复杂度
2. 搜索重复计算 → 是否可缓存或提取
3. 找到 I/O 操作 → 是否可批量化或并行化

#### 可读性
1. 统计每个函数行数 → &amp;gt; 30 行标记 WARNING，&amp;gt; 50 行标记 BLOCK
2. 检查所有命名 → 是否能脱离上下文理解含义
3. 搜索魔法数字和硬编码 → 逐个判断是否应提取为常量

### Step 2.5: 中途自检 ⚠️
- [ ] 三个维度是否每个都实际检查了（不是声明&quot;已检查&quot;，是有具体发现或&quot;检查路径 X，未发现问题&quot;）
- [ ] 是否有跳过的检查项？如有，补做。

### Step 3: 结构化输出

## Output Format

### 一句话总评
[具体描述主要问题类型和严重程度分布]

### 问题清单

| # | 维度 | 等级 | 位置 | 问题 | 修复建议 |
|:--|:-----|:-----|:-----|:-----|:---------|

等级定义：
- P0: 会导致运行时错误或安全漏洞，必须修
- P1: 影响可维护性或性能，强烈建议修
- P2: 代码质量优化，可选

### 亮点（如有）
[具体指出设计优秀之处及原因]

## Forbidden Outputs

| 禁止出现的表述 | 替代方案 |
|:---|:---|
| &quot;代码整体质量不错&quot; | 指出具体的优秀设计，或不写亮点部分 |
| &quot;建议添加更多测试&quot; | 给出具体应该测试哪些路径 |
| &quot;可能存在性能问题&quot; | 量化：什么输入规模下、什么复杂度、影响多大 |
| &quot;其他部分没有问题&quot; | 列出你检查了哪些路径，每条的结论 |

## Escalation
- 代码超过 500 行 → 建议用户分批提交
- 发现安全漏洞 → 置为 P0，输出开头加 🚨 标记
- 无法判断业务意图 → 先提问确认，不要猜测后审查

## Final Gate
输出前扫描自己的回答：
1. 是否触发了 Forbidden Outputs 中的任何一条？→ 删除重写
2. 每个维度是否至少有一条具体发现（含&quot;已检查无问题&quot;）？→ 补全
3. 每条修复建议是否具体到可直接实施？→ 模糊的要补充代码示例
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;h2&gt;六、Skill 写完后的调试循环&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;写完不是结束，是开始。&lt;/strong&gt; 好的 Skill 是调试出来的，不是设计出来的。&lt;/p&gt;
&lt;h3&gt;调试方法：对抗性测试&lt;/h3&gt;
&lt;p&gt;写完后，故意用以下方式测试你的 Skill：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;1. 给它一个极简输入，看它会不会偷懒
2. 给它一个超长输入，看中段规则是否被遗忘
3. 给它一个边界 case，看异常处理是否触发
4. 连续跑 3 次同样的输入，看输出一致性
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;迭代公式&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;每次 AI 犯错 → 分析属于哪种失败模式：

模糊导致的？     → 加量化标准
没执行？         → 把名词改成动词
中段忘了？       → 加中途检查点
找借口跳过了？   → 加进 Forbidden Outputs
超出能力了？     → 加 Escalation 条件
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;记录每次修改的原因&lt;/strong&gt;（哪怕一行注释），三个月后你会感谢自己。&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;七、设计原则速查&lt;/h2&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;1&lt;/td&gt;
&lt;td&gt;单一职责&lt;/td&gt;
&lt;td&gt;一个 Skill 只做一件事&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;动作优先&lt;/td&gt;
&lt;td&gt;动词 &amp;gt; 名词，指令 &amp;gt; 声明&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;量化一切&lt;/td&gt;
&lt;td&gt;能写数字的地方绝不写形容词&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;三层防御&lt;/td&gt;
&lt;td&gt;开头声明 + 中途自检 + 结尾拦截&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;堵死逃逸&lt;/td&gt;
&lt;td&gt;预判偷懒路径，设为禁止输出&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;渐进披露&lt;/td&gt;
&lt;td&gt;正文 &amp;lt; 500 行，背景知识按需加载&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;人工兜底&lt;/td&gt;
&lt;td&gt;超出能力时停止，不要硬撑&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;持续调试&lt;/td&gt;
&lt;td&gt;每次翻车都是下一条规则的来源&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr /&gt;
&lt;h2&gt;结语&lt;/h2&gt;
&lt;p&gt;回到开头的核心论点：&lt;/p&gt;
&lt;p&gt;你不是在&quot;告诉&quot; AI 做什么。你是在一个高维概率空间中——用动作指令降低正确路径的生成阻力，用检查门和阻断条件抬高错误路径的生成成本，用注意力锚点确保关键约束在整个生成过程中持续施加影响。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;这就是 Skill 设计的全部本质。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;当你用这个视角审视自己写的每一行指令时，你会自然地问出正确的问题：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&quot;这句话会改变概率分布吗？还是只是让我自己感觉写了？&quot;&lt;/li&gt;
&lt;li&gt;&quot;这条规则有检查机制吗？还是全靠 AI 自觉？&quot;&lt;/li&gt;
&lt;li&gt;&quot;3000 token 之后，这条约束还能被&apos;感知到&apos;吗？&quot;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;能诚实回答这三个问题的人，写出的 Skill 不会差。&lt;/p&gt;
</content:encoded></item><item><title>Markdown Extended Features</title><link>https://graycen-notes.pages.dev/posts/202405/markdown-extended/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202405/markdown-extended/</guid><description>Read more about Markdown features in Fuwari</description><pubDate>Wed, 01 May 2024 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;GitHub Repository Cards&lt;/h2&gt;
&lt;p&gt;You can add dynamic cards that link to GitHub repositories, on page load, the repository information is pulled from the GitHub API.&lt;/p&gt;
&lt;p&gt;::github{repo=&quot;Fabrizz/MMM-OnSpotify&quot;}&lt;/p&gt;
&lt;p&gt;Create a GitHub repository card with the code &lt;code&gt;::github{repo=&quot;&amp;lt;owner&amp;gt;/&amp;lt;repo&amp;gt;&quot;}&lt;/code&gt;.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;::github{repo=&quot;saicaca/fuwari&quot;}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Admonitions&lt;/h2&gt;
&lt;p&gt;Following types of admonitions are supported: &lt;code&gt;note&lt;/code&gt; &lt;code&gt;tip&lt;/code&gt; &lt;code&gt;important&lt;/code&gt; &lt;code&gt;warning&lt;/code&gt; &lt;code&gt;caution&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;:::note
Highlights information that users should take into account, even when skimming.
:::&lt;/p&gt;
&lt;p&gt;:::tip
Optional information to help a user be more successful.
:::&lt;/p&gt;
&lt;p&gt;:::important
Crucial information necessary for users to succeed.
:::&lt;/p&gt;
&lt;p&gt;:::warning
Critical content demanding immediate user attention due to potential risks.
:::&lt;/p&gt;
&lt;p&gt;:::caution
Negative potential consequences of an action.
:::&lt;/p&gt;
&lt;h3&gt;Basic Syntax&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;:::note
Highlights information that users should take into account, even when skimming.
:::

:::tip
Optional information to help a user be more successful.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Custom Titles&lt;/h3&gt;
&lt;p&gt;The title of the admonition can be customized.&lt;/p&gt;
&lt;p&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;:::note[MY CUSTOM TITLE]
This is a note with a custom title.
:::
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;GitHub Syntax&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;[!TIP]
&lt;a href=&quot;https://github.com/orgs/community/discussions/16925&quot;&gt;The GitHub syntax&lt;/a&gt; is also supported.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre&gt;&lt;code&gt;&amp;gt; [!NOTE]
&amp;gt; The GitHub syntax is also supported.

&amp;gt; [!TIP]
&amp;gt; The GitHub syntax is also supported.
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Spoiler&lt;/h3&gt;
&lt;p&gt;You can add spoilers to your text. The text also supports &lt;strong&gt;Markdown&lt;/strong&gt; syntax.&lt;/p&gt;
&lt;p&gt;The content :spoiler[is hidden &lt;strong&gt;ayyy&lt;/strong&gt;]!&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;The content :spoiler[is hidden **ayyy**]!

&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Expressive Code Example</title><link>https://graycen-notes.pages.dev/posts/202404/expressive-code/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202404/expressive-code/</guid><description>How code blocks look in Markdown using Expressive Code.</description><pubDate>Wed, 10 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Here, we&apos;ll explore how code blocks look using &lt;a href=&quot;https://expressive-code.com/&quot;&gt;Expressive Code&lt;/a&gt;. The provided examples are based on the official documentation, which you can refer to for further details.&lt;/p&gt;
&lt;h2&gt;Expressive Code&lt;/h2&gt;
&lt;h3&gt;Syntax Highlighting&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/syntax-highlighting/&quot;&gt;Syntax Highlighting&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Regular syntax highlighting&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;This code is syntax highlighted!&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Rendering ANSI escape sequences&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;ANSI colors:
- Regular: [31mRed[0m [32mGreen[0m [33mYellow[0m [34mBlue[0m [35mMagenta[0m [36mCyan[0m
- Bold:    [1;31mRed[0m [1;32mGreen[0m [1;33mYellow[0m [1;34mBlue[0m [1;35mMagenta[0m [1;36mCyan[0m
- Dimmed:  [2;31mRed[0m [2;32mGreen[0m [2;33mYellow[0m [2;34mBlue[0m [2;35mMagenta[0m [2;36mCyan[0m

256 colors (showing colors 160-177):
[38;5;160m160 [38;5;161m161 [38;5;162m162 [38;5;163m163 [38;5;164m164 [38;5;165m165[0m
[38;5;166m166 [38;5;167m167 [38;5;168m168 [38;5;169m169 [38;5;170m170 [38;5;171m171[0m
[38;5;172m172 [38;5;173m173 [38;5;174m174 [38;5;175m175 [38;5;176m176 [38;5;177m177[0m

Full RGB colors:
[38;2;34;139;34mForestGreen - RGB(34, 139, 34)[0m

Text formatting: [1mBold[0m [2mDimmed[0m [3mItalic[0m [4mUnderline[0m
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Editor &amp;amp; Terminal Frames&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/frames/&quot;&gt;Editor &amp;amp; Terminal Frames&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Code editor frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Title attribute example&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;!-- src/content/index.html --&amp;gt;
&amp;lt;div&amp;gt;File name comment example&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Terminal frames&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;This terminal frame has no title&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;Write-Output &quot;This one has a title!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Overriding frame types&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Look ma, no frame!&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;# Without overriding, this would be a terminal frame
function Watch-Tail { Get-Content -Tail 20 -Wait $args }
New-Alias tail Watch-Tail
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Text &amp;amp; Line Markers&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/text-markers/&quot;&gt;Text &amp;amp; Line Markers&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Marking full lines &amp;amp; line ranges&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Line 1 - targeted by line number
// Line 2
// Line 3
// Line 4 - targeted by line number
// Line 5
// Line 6
// Line 7 - targeted by range &quot;7-8&quot;
// Line 8 - targeted by range &quot;7-8&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting line marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;this line is marked as deleted&apos;)
  // This line and the next one are marked as inserted
  console.log(&apos;this is the second inserted line&apos;)

  return &apos;this line uses the neutral default marker type&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding labels to line markers&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}
  value={value}
  className={buttonClassName}
  disabled={disabled}
  active={active}
&amp;gt;
  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Adding long labels on their own lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// labeled-line-markers.jsx
&amp;lt;button
  role=&quot;button&quot;
  {...props}

  value={value}
  className={buttonClassName}

  disabled={disabled}
  active={active}
&amp;gt;

  {children &amp;amp;&amp;amp;
    !active &amp;amp;&amp;amp;
    (typeof children === &apos;string&apos; ? &amp;lt;span&amp;gt;{children}&amp;lt;/span&amp;gt; : children)}
&amp;lt;/button&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Using diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;+this line will be marked as inserted
-this line will be marked as deleted
this is a regular line
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;--- a/README.md
+++ b/README.md
@@ -1,3 +1,4 @@
+this is an actual diff file
-all contents will remain unmodified
 no whitespace will be removed either
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Combining syntax highlighting with diff-like syntax&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;  function thisIsJavaScript() {
    // This entire block gets highlighted as JavaScript,
    // and we can still add diff markers to it!
-   console.log(&apos;Old code to be removed&apos;)
+   console.log(&apos;New and shiny code!&apos;)
  }
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Marking individual text inside lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  // Mark any given text inside lines
  return &apos;Multiple matches of the given text are supported&apos;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Regular expressions&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;The words yes and yep will be marked.&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Escaping forward slashes&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;echo &quot;Test&quot; &amp;gt; /home/test.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Selecting inline marker types (mark, ins, del)&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;function demo() {
  console.log(&apos;These are inserted and deleted marker types&apos;);
  // The return statement uses the default marker type
  return true;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Word Wrap&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/key-features/word-wrap/&quot;&gt;Word Wrap&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;Configuring word wrap per block&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with wrap=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;Configuring indentation of wrapped lines&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent (enabled by default)
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Example with preserveIndent=false
function getLongString() {
  return &apos;This is a very long string that will most probably not fit into the available space unless the container is extremely wide&apos;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Collapsible Sections&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/collapsible-sections/&quot;&gt;Collapsible Sections&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;// All this boilerplate setup code will be collapsed
import { someBoilerplateEngine } from &apos;@example/some-boilerplate&apos;
import { evenMoreBoilerplate } from &apos;@example/even-more-boilerplate&apos;

const engine = someBoilerplateEngine(evenMoreBoilerplate())

// This part of the code will be visible by default
engine.doSomething(1, 2, 3, calcFn)

function calcFn() {
  // You can have multiple collapsed sections
  const a = 1
  const b = 2
  const c = a + b

  // This will remain visible
  console.log(`Calculation result: ${a} + ${b} = ${c}`)
  return c
}

// All this code until the end of the block will be collapsed again
engine.closeConnection()
engine.freeMemory()
engine.shutdown({ reason: &apos;End of example boilerplate code&apos; })
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Line Numbers&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://expressive-code.com/plugins/line-numbers/&quot;&gt;Line Numbers&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;Displaying line numbers per block&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;// This code block will show line numbers
console.log(&apos;Greetings from line 2!&apos;)
console.log(&apos;I am on line 3&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr /&gt;
&lt;pre&gt;&lt;code&gt;// Line numbers are disabled for this block
console.log(&apos;Hello?&apos;)
console.log(&apos;Sorry, do you know what line I am on?&apos;)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Changing the starting line number&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;console.log(&apos;Greetings from line 5!&apos;)
console.log(&apos;I am on line 6&apos;)
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Simple Guides for Fuwari</title><link>https://graycen-notes.pages.dev/posts/202404/guide/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202404/guide/</guid><description>How to use this blog template.</description><pubDate>Mon, 01 Apr 2024 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;
&lt;p&gt;Cover image source: &lt;a href=&quot;https://image.civitai.com/xG1nkqKTMzGDvpLrqFT7WA/208fc754-890d-4adb-9753-2c963332675d/width=2048/01651-1456859105-(colour_1.5),girl,_Blue,yellow,green,cyan,purple,red,pink,_best,8k,UHD,masterpiece,male%20focus,%201boy,gloves,%20ponytail,%20long%20hair,.jpeg&quot;&gt;Source&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;This blog template is built with &lt;a href=&quot;https://astro.build/&quot;&gt;Astro&lt;/a&gt;. For the things that are not mentioned in this guide, you may find the answers in the &lt;a href=&quot;https://docs.astro.build/&quot;&gt;Astro Docs&lt;/a&gt;.&lt;/p&gt;
&lt;h2&gt;Front-matter of Posts&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;---
title: My First Blog Post
published: 2023-09-09
description: This is the first post of my new Astro blog.
image: ./cover.jpg
tags: [Foo, Bar]
category: Front-end
draft: false
---
&lt;/code&gt;&lt;/pre&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Attribute&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;title&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The title of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;published&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The date the post was published.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;description&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;A short description of the post. Displayed on index page.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;image&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The cover image path of the post.&amp;lt;br/&amp;gt;1. Start with &lt;code&gt;http://&lt;/code&gt; or &lt;code&gt;https://&lt;/code&gt;: Use web image&amp;lt;br/&amp;gt;2. Start with &lt;code&gt;/&lt;/code&gt;: For image in &lt;code&gt;public&lt;/code&gt; dir&amp;lt;br/&amp;gt;3. With none of the prefixes: Relative to the markdown file&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;tags&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The tags of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;category&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;The category of the post.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;code&gt;draft&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;If this post is still a draft, which won&apos;t be displayed.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h2&gt;Where to Place the Post Files&lt;/h2&gt;
&lt;p&gt;Your post files should be placed in &lt;code&gt;src/content/posts/&lt;/code&gt; directory. You can also create sub-directories to better organize your posts and assets.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;src/content/posts/
├── post-1.md
└── post-2/
    ├── cover.png
    └── index.md
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>Markdown Example</title><link>https://graycen-notes.pages.dev/posts/202310/markdown/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202310/markdown/</guid><description>A simple example of a Markdown blog post.</description><pubDate>Sun, 01 Oct 2023 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;An h1 header&lt;/h1&gt;
&lt;p&gt;Paragraphs are separated by a blank line.&lt;/p&gt;
&lt;p&gt;2nd paragraph. &lt;em&gt;Italic&lt;/em&gt;, &lt;strong&gt;bold&lt;/strong&gt;, and &lt;code&gt;monospace&lt;/code&gt;. Itemized lists
look like:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;this one&lt;/li&gt;
&lt;li&gt;that one&lt;/li&gt;
&lt;li&gt;the other one&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Note that --- not considering the asterisk --- the actual text
content starts at 4-columns in.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Block quotes are
written like so.&lt;/p&gt;
&lt;p&gt;They can span multiple paragraphs,
if you like.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Use 3 dashes for an em-dash. Use 2 dashes for ranges (ex., &quot;it&apos;s all
in chapters 12--14&quot;). Three dots ... will be converted to an ellipsis.
Unicode is supported. ☺&lt;/p&gt;
&lt;h2&gt;An h2 header&lt;/h2&gt;
&lt;p&gt;Here&apos;s a numbered list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;first item&lt;/li&gt;
&lt;li&gt;second item&lt;/li&gt;
&lt;li&gt;third item&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Note again how the actual text starts at 4 columns in (4 characters
from the left side). Here&apos;s a code sample:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;# Let me re-iterate ...
for i in 1 .. 10 { do-something(i) }
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;As you probably guessed, indented 4 spaces. By the way, instead of
indenting the block, you can use delimited blocks, if you like:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;define foobar() {
    print &quot;Welcome to flavor country!&quot;;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;(which makes copying &amp;amp; pasting easier). You can optionally mark the
delimited block for Pandoc to syntax highlight it:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;import time
# Quick, count to ten!
for i in range(10):
    # (but not *too* quick)
    time.sleep(0.5)
    print i
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;An h3 header&lt;/h3&gt;
&lt;p&gt;Now a nested list:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;First, get these ingredients:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;carrots&lt;/li&gt;
&lt;li&gt;celery&lt;/li&gt;
&lt;li&gt;lentils&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Boil some water.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Dump everything in the pot and follow
this algorithm:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt; find wooden spoon
 uncover pot
 stir
 cover pot
 balance wooden spoon precariously on pot handle
 wait 10 minutes
 goto first step (or shut off burner when done)
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Do not bump wooden spoon or it will fall.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Notice again how text always lines up on 4-space indents (including
that last line which continues item 3 above).&lt;/p&gt;
&lt;p&gt;Here&apos;s a link to &lt;a href=&quot;http://foo.bar&quot;&gt;a website&lt;/a&gt;, to a &lt;a href=&quot;local-doc.html&quot;&gt;local
doc&lt;/a&gt;, and to a &lt;a href=&quot;#an-h2-header&quot;&gt;section heading in the current
doc&lt;/a&gt;. Here&apos;s a footnote [^1].&lt;/p&gt;
&lt;p&gt;[^1]: Footnote text goes here.&lt;/p&gt;
&lt;p&gt;Tables can look like this:&lt;/p&gt;
&lt;p&gt;size material color&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;9 leather brown
10 hemp canvas natural
11 glass transparent&lt;/p&gt;
&lt;p&gt;Table: Shoes, their sizes, and what they&apos;re made of&lt;/p&gt;
&lt;p&gt;(The above is the caption for the table.) Pandoc also supports
multi-line tables:&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;keyword text&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;red Sunsets, apples, and
other red or reddish
things.&lt;/p&gt;
&lt;p&gt;green Leaves, grass, frogs
and other things it&apos;s
not easy being.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;A horizontal rule follows.&lt;/p&gt;
&lt;hr /&gt;
&lt;p&gt;Here&apos;s a definition list:&lt;/p&gt;
&lt;p&gt;apples
: Good for making applesauce.
oranges
: Citrus!
tomatoes
: There&apos;s no &quot;e&quot; in tomatoe.&lt;/p&gt;
&lt;p&gt;Again, text is indented 4 spaces. (Put a blank line between each
term/definition pair to spread things out more.)&lt;/p&gt;
&lt;p&gt;Here&apos;s a &quot;line block&quot;:&lt;/p&gt;
&lt;p&gt;| Line one
| Line too
| Line tree&lt;/p&gt;
&lt;p&gt;and images can be specified like so:&lt;/p&gt;
&lt;p&gt;Inline math equations go in like so: $\omega = d\phi / dt$. Display
math should get its own line and be put in in double-dollarsigns:&lt;/p&gt;
&lt;p&gt;$$I = \int \rho R^{2} dV$$&lt;/p&gt;
&lt;p&gt;$$
\begin{equation*}
\pi
=3.1415926535
;8979323846;2643383279;5028841971;6939937510;5820974944
;5923078164;0628620899;8628034825;3421170679;\ldots
\end{equation*}
$$&lt;/p&gt;
&lt;p&gt;And note that you can backslash-escape any punctuation characters
which you wish to be displayed literally, ex.: `foo`, *bar*, etc.&lt;/p&gt;
</content:encoded></item><item><title>Include Video in the Posts</title><link>https://graycen-notes.pages.dev/posts/202308/video/</link><guid isPermaLink="true">https://graycen-notes.pages.dev/posts/202308/video/</guid><description>This post demonstrates how to include embedded video in a blog post.</description><pubDate>Tue, 01 Aug 2023 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Just copy the embed code from YouTube or other platforms, and paste it in the markdown file.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;---
title: Include Video in the Post
published: 2023-10-19
// ...
---

&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;YouTube&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;https://www.youtube.com/embed/5gIf0_xpFPI?si=N1WTorLKL0uwLsU_&quot; title=&quot;YouTube video player&quot; frameborder=&quot;0&quot; allow=&quot;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share&quot; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&lt;/p&gt;
&lt;h2&gt;Bilibili&lt;/h2&gt;
&lt;p&gt;&amp;lt;iframe width=&quot;100%&quot; height=&quot;468&quot; src=&quot;//player.bilibili.com/player.html?bvid=BV1fK4y1s7Qf&amp;amp;p=1&quot; scrolling=&quot;no&quot; border=&quot;0&quot; frameborder=&quot;no&quot; framespacing=&quot;0&quot; allowfullscreen=&quot;true&quot;&amp;gt; &amp;lt;/iframe&amp;gt;&lt;/p&gt;
</content:encoded></item></channel></rss>