跳到主要内容

博客

代码人生:编织技术与生活的博客之旅

  • 旁边增加一个目录
    • 需要下载一些网上有的 template 但是巨丑
  • 夜间模式
  • 手机适配

1. 创建 D:\tmp\demo.md

# 我的博客

- 参考
- [Pandoc](https://pandoc.org/)
- [Classless CSS](https://github.com/dbohdan/classless-css)

## 关于

这是一个用 Pandoc 批量生成多主题 HTML 的博客示例。

## 代码

```powershell
pandoc demo.md -s -c $css -o blog.html

主题

主题说明
simple极简优雅
githubGitHub 风格
water干净清爽
sakura樱花粉
latex学术排版

## 2. 创建 `D:\tmp\md-to-html.ps1`

```powershell
$inputFile = 'D:\tmp\demo.md'
$outputDir = 'D:\tmp\blog'
$openInBrowser = $true # 改成 $false 则不自动打开

if (!(Get-Command pandoc -ErrorAction SilentlyContinue)) {
Write-Host "错误:未找到 pandoc" -ForegroundColor Red
return
}

if (!(Test-Path $inputFile)) {
Write-Host "错误:未找到输入文件 $inputFile" -ForegroundColor Red
return
}

if (!(Test-Path $outputDir)) { New-Item -ItemType Directory -Path $outputDir | Out-Null }

$themes = @(
# ===== 基础款 =====
@{ Name = "simple"; Css = "https://cdn.jsdelivr.net/npm/simple.css@1.6.1/dist/simple.min.css"; Highlight = "pygments"; Desc = "Simple.css - 极简优雅,默认蓝色链接" },
@{ Name = "shadcn"; Css = "https://cdn.jsdelivr.net/gh/fordus/shadcn-classless@main/dist/shadcn-classless.css"; Highlight = "pygments"; Desc = "shadcn-classless - 现代设计感,蓝色主色" },
@{ Name = "devcss"; Css = "https://cdn.jsdelivr.net/npm/@intergrav/dev.css@5"; Highlight = "pygments"; Desc = "dev.css - 轻量清新,蓝色调" },
@{ Name = "github"; Css = "https://cdn.jsdelivr.net/npm/github-markdown-css/github-markdown.css"; Highlight = "pygments"; Desc = "GitHub Markdown - 复刻 GitHub 风格" },
@{ Name = "pico"; Css = "https://cdn.jsdelivr.net/npm/@picocss/pico@2/css/pico.classless.min.css"; Highlight = "pygments"; Desc = "Pico.css - 功能丰富,20 种配色" },
@{ Name = "water"; Css = "https://cdn.jsdelivr.net/npm/water.css@2/out/water.css"; Highlight = "pygments"; Desc = "Water.css - 干净极简,蓝色主色" },
@{ Name = "sucss"; Css = "https://speyll.github.io/suCSS/suCSS-min.css"; Highlight = "pygments"; Desc = "suCSS - 简约优雅,本地字体" },
@{ Name = "edible"; Css = "https://cdn.jsdelivr.net/npm/@svmukhin/edible-css@latest/dist/edible.min.css"; Highlight = "pygments"; Desc = "EdibleCSS - 即插即用,干净现代" },
@{ Name = "marx"; Css = "https://cdn.jsdelivr.net/npm/marx-css@5/css/marx.min.css"; Highlight = "pygments"; Desc = "Marx - 极简主义,零优先级" },
@{ Name = "aveccss"; Css = "https://cdn.jsdelivr.net/gh/bk/aveccss@main/dist/aveccss.min.css"; Highlight = "pygments"; Desc = "AvecCSS - 轻量模块化" },
@{ Name = "nocss"; Css = "https://unpkg.com/nocss-framework@latest/dist/nocss.min.css"; Highlight = "pygments"; Desc = "NoCSS - 智能检测 HTML 结构" },

# ===== 新增经典款 =====
@{ Name = "awsm"; Css = "https://cdn.jsdelivr.net/npm/awsm.css@3.0.7/awsm.min.css"; Highlight = "pygments"; Desc = "awsm.css - 语义化样式,阅读友好" },
@{ Name = "sakura"; Css = "https://cdn.jsdelivr.net/npm/sakura.css@1.4.1/sakura.min.css"; Highlight = "pygments"; Desc = "Sakura - 樱花粉柔色调,极简" },
@{ Name = "new"; Css = "https://cdn.jsdelivr.net/npm/new.css@1.1.3/new.min.css"; Highlight = "pygments"; Desc = "new.css - 零类,轻量" },
@{ Name = "mvp"; Css = "https://cdn.jsdelivr.net/npm/mvp.css@1.12.0/mvp.min.css"; Highlight = "pygments"; Desc = "MVP.css - 专为原型设计,语义化" },
@{ Name = "vanilla"; Css = "https://cdn.jsdelivr.net/npm/vanilla-framework@3.0.1/build/css/vanilla.min.css"; Highlight = "pygments"; Desc = "Vanilla Framework - Ubuntu 风格,classless 也支持" },
@{ Name = "tufte"; Css = "https://cdn.jsdelivr.net/npm/tufte-css@1.8.0/tufte.min.css"; Highlight = "pygments"; Desc = "Tufte CSS - 爱德华·塔夫特排版风格" },
@{ Name = "latex"; Css = "https://cdn.jsdelivr.net/npm/latex.css@1.12.0/latex.min.css"; Highlight = "pygments"; Desc = "LaTeX.css - 模拟 LaTeX 排版" },
@{ Name = "bamboo"; Css = "https://cdn.jsdelivr.net/npm/bamboo.css@2.0.0/bamboo.min.css"; Highlight = "pygments"; Desc = "Bamboo.css - 清新绿色调" },
@{ Name = "paper"; Css = "https://cdn.jsdelivr.net/npm/papercss@1.9.2/dist/paper.min.css"; Highlight = "pygments"; Desc = "PaperCSS - 手写纸质感" },
@{ Name = "mini"; Css = "https://cdn.jsdelivr.net/npm/mini.css@4.0.0/dist/mini.min.css"; Highlight = "pygments"; Desc = "mini.css - 小巧,响应式" },

# ===== 更多类·无类 =====
@{ Name = "kacss"; Css = "https://cdn.jsdelivr.net/npm/kacss@2.0.0/kacss.min.css"; Highlight = "pygments"; Desc = "kaCSS - 极简,纯语义" },
@{ Name = "splendor"; Css = "https://cdn.jsdelivr.net/gh/splendor-css/splendor@main/dist/splendor.min.css"; Highlight = "pygments"; Desc = "Splendor - 优雅,深色主题自适应" },
@{ Name = "fruum"; Css = "https://cdn.jsdelivr.net/gh/fruumio/fruum-css@master/fruum.min.css"; Highlight = "pygments"; Desc = "Fruum - 专注可读性" },
@{ Name = "emerick"; Css = "https://cdn.jsdelivr.net/gh/emerick-css/emerick@latest/emerick.min.css"; Highlight = "pygments"; Desc = "Emerick - 极简,现代" },
@{ Name = "primitive"; Css = "https://cdn.jsdelivr.net/npm/primitive@1.0.0/primitive.min.css"; Highlight = "pygments"; Desc = "Primitive - 移动优先,简约" },
@{ Name = "sus"; Css = "https://cdn.jsdelivr.net/gh/sus-css/sus@main/sus.min.css"; Highlight = "pygments"; Desc = "Sus - 轻量,强调内容" },
@{ Name = "stylize"; Css = "https://cdn.jsdelivr.net/gh/stylize-css/stylize@main/stylize.min.css"; Highlight = "pygments"; Desc = "Stylize - 风格化,多种颜色变量" },
@{ Name = "pattern"; Css = "https://cdn.jsdelivr.net/gh/pattern-css/pattern@latest/pattern.min.css"; Highlight = "pygments"; Desc = "Pattern - 模块化,可定制" },
@{ Name = "system"; Css = "https://cdn.jsdelivr.net/npm/system.css@1.0.1/system.min.css"; Highlight = "pygments"; Desc = "System.css - 模仿操作系统原生样式" },
@{ Name = "splendid"; Css = "https://cdn.jsdelivr.net/gh/splendid-css/splendid@main/splendid.min.css"; Highlight = "pygments"; Desc = "Splendid - 干净,可选强调色" },

# ===== 偏重 UI 但也可以 classless 使用 =====
@{ Name = "bulma"; Css = "https://cdn.jsdelivr.net/npm/bulma@0.9.4/css/bulma.min.css"; Highlight = "pygments"; Desc = "Bulma - 虽然需要类,但基础标签仍有样式" },
@{ Name = "milligram"; Css = "https://cdn.jsdelivr.net/npm/milligram@1.4.1/dist/milligram.min.css"; Highlight = "pygments"; Desc = "Milligram - 极简,但需少量类" },
@{ Name = "spectre"; Css = "https://cdn.jsdelivr.net/npm/spectre.css@0.5.9/dist/spectre.min.css"; Highlight = "pygments"; Desc = "Spectre - 轻量,可作基础样式" },
@{ Name = "blaze"; Css = "https://cdn.jsdelivr.net/npm/blaze@4.0.2/dist/blaze.min.css"; Highlight = "pygments"; Desc = "Blaze - 原子化,但默认标签有样式" },
@{ Name = "kutty"; Css = "https://cdn.jsdelivr.net/npm/kutty@0.6.0/dist/kutty.min.css"; Highlight = "pygments"; Desc = "Kutty - 面向内容,类似水" },
@{ Name = "cirrus"; Css = "https://cdn.jsdelivr.net/npm/cirrus-ui@0.6.0/dist/cirrus.min.css"; Highlight = "pygments"; Desc = "Cirrus - 现代组件,基础样式仍可用" }
)

# 过滤掉 CSS 链接无法访问的主题
$themes = $themes | Where-Object {
$name = $_.Name
$css = $_.Css
try {
$response = Invoke-WebRequest -Uri $css -Method Head -TimeoutSec 5 -ErrorAction Stop
if ($response.StatusCode -eq 200) {
Write-Host "✓ $name - CSS 可访问" -ForegroundColor Green
$true
} else {
Write-Host "✗ $name - CSS 返回状态码 $($response.StatusCode)" -ForegroundColor Yellow
$false
}
} catch {
Write-Host "✗ $name - CSS 无法访问" -ForegroundColor Red
$false
}
}

if ($themes.Count -eq 0) {
Write-Host "没有可用的主题,请检查网络或稍后重试。" -ForegroundColor Red
return
}

$indexItems = @()
foreach ($t in $themes) {
$outputFile = Join-Path $outputDir "blog-$($t.Name).html"
Write-Host "生成 $($t.Name)" -ForegroundColor Cyan
pandoc $inputFile -s -c $t.Css --highlight-style $t.Highlight --metadata title="博客 - $($t.Desc)" -o $outputFile
$indexItems += "<li><a href='blog-$($t.Name).html'>$($t.Name)</a> - $($t.Desc)</li>"
}

$indexHtml = "<!DOCTYPE html><html><head><meta charset='utf-8'><title>博客主题</title></head><body><h1>博客主题预览</h1><ul>$($indexItems -join '')</ul></body></html>"
Set-Content -Path (Join-Path $outputDir "index.html") -Value $indexHtml -Encoding UTF8

Write-Host "完成,共 $($themes.Count) 个页面" -ForegroundColor Green

if ($openInBrowser) {
foreach ($t in $themes) {
$htmlFile = Join-Path $outputDir "blog-$($t.Name).html"
Start-Process $htmlFile
}
Start-Process (Join-Path $outputDir "index.html")
}

3. 运行

pwsh "D:\tmp\md-to-html.ps1"
  • 或者直接在 PowerShell 里:
D:\tmp\md-to-html.ps1
  • 生成后在 D:\tmp\blog\ 下会有 index.html 和 多个不同主题的博客页面。
编程阅读需 5 分钟

本文档列出 ZooCrush 项目中 Claude Code 可用的所有技能(Skills)及其用途。


项目核心技能

/project-assistant

用途:Godot 项目通用助手,处理功能实现、bug 修复、文档同步和任务管理。 特点

  • 总是先澄清模糊需求
  • 为新功能和修复编写测试
  • 保持项目结构文档更新 触发:处理项目任务时的默认行为(CLAUDE.md 中已配置)

开发流程技能

/prototype

用途:快速原型开发,验证想法和概念。 适合:探索新功能、测试游戏机制、验证技术方案。

/tdd

用途:测试驱动开发。 流程:先写测试 → 实现功能 → 验证测试通过。 适合:确保代码质量、防止回归 bug。

/qa

用途:质量保证检查。 检查项:代码规范、性能、安全性、边界情况。

/review

用途:代码审查。 审查维度:正确性、可读性、性能、架构一致性。

/code-review

用途:审查当前 diff,查找 bug 和优化点。 参数--comment(发布 PR 评论)、--fix(直接修复)。 等级:low/medium/high/max(覆盖范围)。

/simplify

用途:简化代码,消除重复,提升效率。 关注:代码质量和可维护性,不查找 bug。

/verify

用途:验证代码修改是否真正实现了预期功能。 方式:运行应用并观察实际行为。


架构与设计技能

/codebase-design

用途:分析和设计代码库架构。 输出:架构图、模块关系、改进建议。

/domain-modeling

用途:建立和扩展领域模型。 关联:读取并更新 CONTEXT.md

/design-an-interface

用途:设计接口和 API。 适合:定义模块边界、设计公共接口。

/diagnosing-bugs

用途:诊断和修复 bug。 流程:分析症状 → 定位原因 → 提出修复方案。 关联:读取 CONTEXT.md 和 ADR 理解系统结构。

/improve-codebase-architecture

用途:改进代码库架构。 输出:重构建议、架构优化方案。 关联:遵循 CONTEXT.md 和 ADR 的决策。

/request-refactor-plan

用途:请求重构计划。 流程:分析代码 → 提出重构方案 → 等待批准。


任务管理技能

/to-prd

用途:将想法转换为产品需求文档 (PRD)。 输出.scratch/<feature>/PRD.md内容:功能描述、用户故事、验收标准。

/to-issues

用途:将 PRD 拆分为具体实现任务。 输出.scratch/<feature>/issues/<NN>-<slug>.md关联:读取 docs/agents/issue-tracker.md

/triage

用途:处理和分类问题。 流程:评估 → 分类 → 应用标签。 标签:needs-triage、needs-info、ready-for-agent、ready-for-human、wontfix。 关联:读取 docs/agents/triage-labels.md

/grill-me

用途:深入追问,澄清需求。 适合:开始实现前的需求确认。

/grill-with-docs

用途:基于文档深入追问。 关联:读取 CONTEXT.md 和相关文档。

/grilling

用途:通用追问技能,支持多种追问模式。


Git 工作流技能

/git-guardrails-claude-code

用途:Git 安全检查,防止危险操作。 检查:分支保护、提交验证、推送安全。

/resolving-merge-conflicts

用途:解决合并冲突。 流程:分析冲突 → 提出解决方案 → 执行合并。


辅助技能

/obsidian-vault

用途:Obsidian 笔记库操作。 适合:文档管理、知识库更新。

/migrate-to-shoehorn

用途:迁移到 Shoehorn 模式。 适合:架构重构、代码迁移。

/scaffold-exercises

用途:生成练习和示例代码。 适合:学习、教学、演示。

/setup-pre-commit

用途:配置 pre-commit hooks。 检查:代码风格、测试、静态分析。

/teach

用途:教学和知识传递。 适合:解释代码、教授概念、团队培训。

/wizard

用途:交互式向导,逐步引导完成任务。 适合:复杂流程、新手引导。

/handoff

用途:任务交接文档。 适合:切换上下文、交接工作、异步协作。


工具技能

/init

用途:初始化新的 CLAUDE.md 文件。 适合:新项目、项目迁移。

/update-config

用途:更新 Claude Code 配置 (settings.json)。 配置项:权限、环境变量、hooks。

/keybindings-help

用途:自定义键盘快捷键。 配置~/.claude/keybindings.json

/fewer-permission-prompts

用途:减少权限提示。 方式:扫描常用工具调用,添加允许列表。

/trigger-cost-savings

用途:触发成本优化模式。

/token-efficiency

用途:Token 优化最佳实践。 内容:高效文件读取、命令执行、输出处理策略。

/run

用途:启动和运行项目应用。 适合:验证修改、测试功能。

/loop

用途:循环执行任务。 参数:间隔时间、任务内容。 适合:定期检查、持续监控。


研究与搜索技能

/deep-research

用途:深度研究,多源搜索,验证结论。 流程:搜索 → 获取源 → 验证 → 综合报告。 适合:需要事实依据的技术决策。

/find-skills

用途:发现和安装新技能。 适合:查找特定功能的技能。


安全与验证技能

/security-review

用途:安全审查。 检查:漏洞、风险、安全最佳实践。


写作技能

/edit-article

用途:编辑文章和文档。

/writing-beats

用途:写作节奏和结构。

/writing-fragments

用途:写作片段管理。

/writing-great-skills

用途:编写高质量技能文档。

/writing-shape

用途:写作形式和风格。


决策与规划技能

/decision-mapping

用途:决策映射,可视化决策路径。

/ubiquitous-language

用途:建立通用语言,统一术语。


API 参考

/claude-api

用途:Claude API 参考。 内容:模型 ID、定价、参数、流式、工具调用、MCP、缓存。


技能使用示例

开发新功能

1. /to-prd → 创建产品需求文档
2. /to-issues → 拆分为具体任务
3. /triage → 分类和优先级排序
4. /tdd → 测试驱动开发
5. /verify → 验证功能正确性
6. /qa → 质量检查

修复 Bug

1. /diagnosing-bugs → 诊断问题
2. /grill-me → 澄清细节
3. /tdd → 编写测试重现 bug
4. 修复代码
5. /verify → 验证修复有效
6. /code-review → 审查修复代码

改进架构

1. /improve-codebase-architecture → 分析和提出改进
2. /request-refactor-plan → 制定重构计划
3. /domain-modeling → 更新领域模型
4. 创建新 ADR 记录决策

项目配置文件

技能会读取以下配置文件:

文件被读取的技能
CLAUDE.md所有技能(默认行为)
CONTEXT.md/domain-modeling/diagnosing-bugs/tdd/improve-codebase-architecture
docs/adr/*.md/improve-codebase-architecture/diagnosing-bugs
docs/agents/issue-tracker.md/to-issues/triage/to-prd/qa
docs/agents/triage-labels.md/triage
docs/agents/domain.md所有读取领域文档的技能
docs/project-structure.md/project-assistant(开发前必读)

注意事项

  1. 默认行为:所有任务会先触发 /project-assistant(CLAUDE.md 配置)
  2. 文档优先:修改代码前应先读取 docs/project-structure.md
  3. 领域一致性:使用领域术语时应参考 CONTEXT.md
  4. 架构决策:修改架构时应检查相关 ADR,避免违反已有决策
  5. 本地追踪:问题和任务存储在 .scratch/<feature>/ 目录

文档生成时间:2026-06-30

编程阅读需 6 分钟

windows powershell

winget install junegunn.fzf
Install-Module -Name PSFzf -Scope CurrentUser -Force

notepad $PROFILE
# 贴贴内容 也可以先测试一下
Import-Module PSFzf
Set-PsFzfOption -PSReadlineChordProvider 'Ctrl+t' -PSReadlineChordReverseHistory 'Ctrl+r'

编程阅读需 1 分钟

AI 辅助开发的核心流程与价值

  • 核心理念:明确需求,快速实现。在 AI 辅助游戏开发中,明确需求是确保高效产出的基石
    • 减少返工:清晰的需求描述让 AI 更准确地理解开发目标,避免生成不符合预期的代码,节省修改时间
    • 提高效率:明确的需求让 AI 能够一次性提供更贴合实际的解决方案,大幅减少反复沟通的时间成本
    • 保证质量:详细的需求说明帮助 AI 生成更符合项目架构和规范的代码,提升整体代码的健壮性
    • 便于维护:清晰的需求文档便于追溯开发历史,方便后期维护和功能迭代,确保项目的可持续性
  • 需求明确的方法论:迭代循环
    • 核心价值:循环迭代模式将思考与执行分离,利用 AI 的效率优势在开发前解决 90%的潜在逻辑冲突,从而实现真正的“快速实现”
    • 初步计划:输出基础开发方案与功能需求
    • AI 辅助完善:AI 补充细节、完善逻辑
    • 审核与修改:人工校验方案,对齐项目目标
    • 持续优化:根据审核反馈迭代方案至可用
    • 提交执行:定稿需求,进入代码开发阶段
  • 方法论支撑:SMART 原则
    • 总述:SMART 原则用于设定清晰、可执行的开发目标,保障项目各阶段拥有明确方向与可验证交付成果
    • 五大维度详解
      • Specific(具体的):目标描述明确具象,清晰定义任务内容与实现方式,拒绝模糊笼统的需求
      • Measurable(可衡量的):配套可量化校验指标,依靠数据、功能点位等客观标准,直观验证开发进度
      • Achievable(可实现的):贴合团队技术、人力现状,目标难度合理,在现有资源范围内能够落地完成
      • Relevant(相关的):目标与整体项目愿景对齐,完成后能为产品带来实际价值增值,不做无关冗余开发
      • Time-bound(有时限的):设置明确截止节点(Deadline),依靠时间约束推动项目进度,避免无限延期
    • 游戏 AI 开发场景示例
      • 模糊需求:做一个玩家背包系统
      • SMART 规范需求:3 天内(T)完成可容纳 50 件道具(M)的玩家背包 UI(S),支持道具拖拽、分类筛选功能(A),用于支撑装备养成核心玩法(R)

方法论支撑:双钻模型

  • 核心概述:双钻模型是经典设计思维框架,适配 AI 辅助开发流程,完整实现「发散探索 → 收敛决策」的闭环工作流;协作模式为 AI 负责思路发散,人工审核完成收敛决策
  • 完整四阶段拆解
    • 第一钻:问题定义阶段(先发散,后收敛)
      • 发现阶段(发散):用发散思维拓宽问题边界,借助 AI 的海量信息检索能力,穷尽梳理项目潜在需求、风险与待解决挑战
      • 定义阶段(收敛):收敛筛选核心问题,人工审核 AI 输出的全部内容,剔除无关项,锁定真正关键的开发目标
    • 第二钻:方案交付阶段(先发散,后收敛)
      • 解决阶段(发散):针对已锁定的核心问题,发散生成多条技术路线,由 AI 输出多套实现方案、代码架构思路
      • 交付阶段(收敛):人工完成架构决策,筛选最优可行方案落地执行,统一把控代码规范与项目整体一致性,保障交付质量
  • 适配 AI 游戏开发的优势
    • 分工清晰:AI 承担海量发散检索、多方案生成的重复工作,解放人力
    • 人工把控关键决策:需求筛选、架构选型、质量校验均由人最终把关,规避 AI 逻辑偏差
    • 完整闭环:从挖掘问题到落地交付全链路覆盖,可搭配迭代循环、SMART 原则配套使用

游戏框架分层设计

  • 设计思路:采用模块化开发策略,将高复用性的通用功能与灵活可变的核心玩法分离
  • 通用游戏模块(底层复用层)
    • 事件系统 (Event System)
    • 反馈系统 (Feedback System)
    • 音效系统 (Audio System)
    • 成就系统 (Achievement System)
    • 资源工具 (Resource Tools)
  • 核心玩法模块(业务可变层)
    • 地块系统 (Tile System)
    • 单位系统 (Unit System)
    • 单位能力 (Unit Abilities)
    • 单位 AI (Unit AI)

文档设计与开发启动流程

  • 文档设计工具:Claude Code(深度支持 Markdown 格式)
  • 三步启动流程
    • 第一步:在游戏根目录新建 DOCs 文件夹,作为项目的知识库中心
    • 第二步:导入之前的游戏思路和想法,为 AI 提供充足的上下文背景
    • 第三步:使用 Claude Code 进行思路发散,深化玩法细节与技术实现方案
  • 文档三大核心优势
    • 结构化:利用 Markdown 建立清晰的文档层级,方便 AI 读取与理解
    • 可追溯:所有的设计变更都记录在案,确保开发过程有据可查
    • 自动化:文档即代码,为后续 AI 自动生成功能模块打下坚实基础
  • 核心总结语录:"良好的文档设计是 AI 辅助开发的灵魂。它不仅是创意的载体,更是连接'想法'与'代码'的桥梁。" ——实战流程总结
分享阅读需 6 分钟

  • [[ai 付费]]

  • Vibe Coding

    • claude code
    • codex 和
      • 他可以生成图片,直接画漫画和游戏资源,结合 godot 游戏引擎,一下午自动做个游戏
    • Vibe Coding 流程
      • plan 模式:先梳理明确细化 /docs/todo.md 里的 Inbox 完成后,放到 todo 下面,有什么不确定的都可以问我,或者优化的方案等等。
      • do: 根据 /docs/todo.md 的 todo 项目,一条一条的完成,每做一条,当前窗口开启一个子任务去完成,做完后回报总结给母窗口,然后母窗口回报给我。准备验收。
  • Vibe Coding 纯小白教程

  • 充值 deepseek

  • 安装 cc-switch

  • 配置 deepseek

  • vscode 安装 claude 插件

  • 开启新项目 选择聊天窗口开始工作

聊天参考

- 我是一个不懂代码的小白,想做一个运行在 mac 电脑上的历史粘贴板软件。
- 它可以记录我最近的所有复制的内容,包括文字和图片,都存放在这里。而且我可以设定一个存储日期,比如 1 天,3 天,5 天。当我需要查找近期历史的时候,就可以点开这个软件查看和再次粘贴。
- 点开之后它以时间降序的方式排列我的所有复制内容的卡片,我可以将它置顶,或者删除。也要一个搜索功能。
- 软件的 UI 设计上我希望它以简洁、直观为主,主要颜色可以用淡蓝色。
- 我暂时就这些想法,你帮我整理一下我的需求,如果你有不确定的地方可以问我,我们先沟通项目需求,等我确认之后,再做下一步执行。

---

- 现在请你规划开发步骤,不要一口气做太多,让项目稳定安全有效的推进。
- 在项目文件夹内创建开发日志文件夹,每天自动记录完成开发事项和待办事项。
- 再创建一个 docs 文件夹,放入项目开发相关的开发需求、技术、设计规范,执行步骤等等具体标准文件。
- 在你的 CLAUDE.md 文件中添加指引各项标准文件路径以及工作说明。

---

- OK,开始推进项目吧!如果软件可以在 xcode 中运行体验的时候,告诉我

分享阅读需 2 分钟

  • 原文
  • 简短而清晰,很多技巧都非常有用,强烈推荐看看:

并行工作是头号生产力秘诀

同时开 3-5 个 git worktree,每个跑一个独立的 Claude 会话。这是团队公认的最大生产力提升点。

Boris 自己用多个 git checkout,但团队大多数人更喜欢 worktree。这也是为什么 Claude 桌面应用专门加了原生支持。

有人给 worktree 起名字,设置 shell 别名(za、zb、zc),一个按键就能切换。还有人专门准备一个"分析"worktree,只用来读日志和跑 BigQuery。


复杂任务先做计划

每个复杂任务都从计划模式开始。把精力投入到计划里,Claude 就能一次性完成实现。

有人让一个 Claude 写计划,然后启动第二个 Claude 以幕僚工程师的身份审查。另一个人说,一旦事情跑偏,立刻切回计划模式重新规划,不要硬推。

他们还会明确要求 Claude 在验证步骤进入计划模式,不只是构建步骤。


维护 CLAUDE.md 是长期投资

每次纠正错误后,都以这句话结尾:更新你的 CLAUDE.md,确保不再犯同样的错误。

Claude 非常擅长为自己写规则。随着时间推移,毫不留情地编辑你的 CLAUDE.md,不断迭代直到 Claude 的错误率明显下降。

有个工程师让 Claude 为每个任务/项目维护笔记目录,每次 PR 后更新,然后把 CLAUDE.md 指向那个目录。


把重复操作做成技能

创建自己的技能并提交到 git,在每个项目中复用。

团队的建议:

▸ 如果你每天做某件事超过一次,就把它变成技能或命令 ▸ 做个 /techdebt 命令,每次会话结束时运行,找出并消除重复代码 ▸ 设置一个命令,把 7 天的 Slack、Google Drive、Asana 和 GitHub 同步到一个上下文转储 ▸ 构建分析工程师风格的智能体,写 dbt 模型、审查代码、在开发环境测试变更


让 Claude 自动修复 bug

大部分 bug Claude 都能自己修。

启用 Slack MCP,把 Slack 里的 bug 讨论帖粘贴给 Claude,只说一句"修复它"。不需要切换上下文。

或者直接说"去修复失败的 CI 测试",不要微观管理怎么做。

让 Claude 看 Docker 日志来排查分布式系统故障,它在这方面能力出奇地强。


提升提示词水平

挑战 Claude。说"针对这些改动严厉审查我,在我通过测试之前不要创建 PR"。让 Claude 当你的审查员。

或者说"向我证明这行得通",让 Claude 对比 main 分支和功能分支的行为差异。


在平庸的修复后,说:"基于你现在掌握的所有信息,废弃这个方案,实现那个更优雅的解决方案。"


交付任务前,写详细的规格说明,减少歧义。你描述得越具体,输出越好。


终端和环境设置

团队很喜欢 Ghostty。很多人看中它的同步渲染、24 位色彩和完善的 Unicode 支持。

用 /statusline 自定义状态栏,让它始终显示上下文使用情况和当前 git 分支。

很多人给终端标签页做颜色编码和命名,有时配合 tmux,每个任务或 worktree 一个标签页。


用语音听写。你说话比打字快 3 倍,提示词会变得详细得多。macOS 上连按两次 fn 键就能开启。


使用子代理

在任何希望 Claude 投入更多算力的请求中,加上"use subagents"。

把单个任务分给子代理,保持主代理的上下文窗口整洁专注。

通过钩子把权限请求路由到 Opus 4.5,让它扫描潜在攻击并自动批准安全请求。


用 Claude 做数据分析

让 Claude Code 用 "bq" CLI 即时提取和分析指标。

团队在代码库里集成了 BigQuery 技能,每个人都直接在 Claude Code 里用它做分析查询。Boris 说他已经 6 个多月没写过一行 SQL 了。

这适用于任何有 CLI、MCP 或 API 的数据库。


用 Claude 学习

在 /config 里启用"解释型"或"学习型"输出风格,让 Claude 解释它改动背后的"原因"。

让 Claude 生成可视化的 HTML 演示文稿来解释不熟悉的代码。它做幻灯片的水平出奇地好。

让 Claude 画新协议和代码库的 ASCII 图表,帮你理解它们。

分享阅读需 4 分钟

3.6 👴 丑陋、麻烦、必须导入

from typing import List, Dict, Tuple

def get_users() -> List[Dict[str, Tuple[int, str]]]:
...

痛点

  • 写个类型要疯狂 import
  • 嵌套类型写得又臭又长
  • 动态语言的清爽感全没了

3.7 ~ 3.9 🧑‍💻 慢慢变好,但还是麻烦

  • 3.7:from __future__ import annotations 延迟求值
  • 3.9:终于支持原生 list/dict/tset 代替 List/Dict/Set
# 3.9 可以这样
def get_users() -> list[dict[str, tuple[int, str]]]:
...

不用导入 List/Dict 了! 但还是不够优雅


3.10 ✨✨✨ 史诗级解放!语法直接起飞

你说的这句: 3.10 - 才变成 语法变得极其优雅,不再需要引入一堆 typing 里的东西

完全正确!

3.10 两大神功能

1. 联合类型 | 代替 Union

以前:

from typing import Union
def f(x: Union[int, str]) -> Union[bool, None]:

现在:

def f(x: int | str) -> bool | None:

干净到爆炸!

2. TypeAlias 简化

类型别名写法更清爽。


3.11 / 3.12 🚀 现在爽到飞起

  • 自带泛型优化
  • 类型注解完全原生、简洁、零导入
  • 动态语言的灵魂 + 静态类型的安全

最终写法:

def get_users() -> list[dict[str, tuple[int, str]]] | None:
return ...

零导入、极简、干净、优雅。


你说的最精髓的一句我必须顶你

Python 的灵魂是动态和鸭子类型(Duck Typing)

大型项目本来就难维护,以前的类型注解简直是反人类

  • 破坏动态美感
  • 一堆 import
  • 代码臃肿
  • 阅读困难

直到 3.10 终于把灵魂找回来了:

动态简洁 + 类型安全 = 两全其美


总结(你说的完全对)

  • 3.6:丑、麻烦、必须导入
  • 3.9:变好看,但还不够
  • 3.10:封神!语法优雅到爆炸
  • 3.12:现在用着最舒服
Python阅读需 2 分钟

1. 设备识别:分清“真网卡”与“虚网卡”

在监控列表中,你会看到多种设备,统计外网流量时必须过滤:

设备前缀类型说明统计建议
enp... / eth...物理网卡服务器接路由器的网线接口。包含 上网流量 + 局域网互传主统计对象
br-...Docker 网桥每个 Docker 网络(Project)的汇总口。选看(查具体业务)
veth...容器虚线单个容器的流量。数量极多。建议过滤排除

💡 技巧:查找 br-xxxx 对应哪个 Docker 项目: docker network ls --no-trunc | grep <ID 前 12 位>


2. 核心 PromQL 表达式

计算**总流量(GB)**的通用公式:

(
sum(increase(node_network_receive_bytes_total{instance="192.168.31.2:9100", device=~"enp2s0|wlp1s0"}[$__range]))
+
sum(increase(node_network_transmit_bytes_total{instance="192.168.31.2:9100", device=~"enp2s0|wlp1s0"}[$__range]))
) / 1024 / 1024 / 1024
  • increase(...[$__range]):计算选定时间段内的增量。它会自动处理服务器重启导致的计数器归零(Counter Reset)。
  • device=~"enp2s0|wlp1s0":使用正则只选物理网卡,排除 br-veth,避免重复计算。
  • / 1024 / 1024 / 1024:将单位从 Bytes 转换为 GB。

3. 如何实现“自然月”统计表格?

Prometheus 擅长看“过去 30 天”,如果要看“1 月、2 月”这种账单报表,需在 Grafana 做以下配置:

  1. 面板选择:使用 Table 视图。
  2. Query Options:将 Min interval 设置为 1M(强制按月聚合)。
  3. Transform (转换)
    • 添加 "Group by"
      • Time 列:选 Group by,间隔选 1M
      • Value 列:选 Calculate -> Total
  4. 时间范围:右上角选择 Last 6 months,即可看到逐月对比。

4. 常见问题 (FAQ)

  • Q: 为什么查不到月初的数据?
    • A: 检查 Prometheus 启动参数 --storage.tsdb.retention.time。默认仅 15 天,建议改为 90d 或更久。
  • Q: first_over_time 报错怎么办?
    • A: 原生 Prometheus 不支持此函数。可用 min_over_time(...[30d]) 替代,因为流量计数器是递增的,区间最小值就是该区间的起点值。
  • Q: 流量准吗?
    • A: enp2s0 包含局域网内(如手机访问服务器)的流量。若要绝对准确的“光猫账单”,建议在路由器的 WAN 口部署监控。

5. 进阶:网络链路质量参考

如果流量正常但访问慢,需配合以下工具排查运营商(移动/联通)线路:

  • mtr -rw <IP>:看每一跳的丢包率(Loss%)。
  • nexttrace <IP>:看流量经过了哪些城市的运营商网关。

编程阅读需 2 分钟

工具处理

sudo apt update && sudo apt install img2pdf
cd /path/to/your/image/folder # 替换为你的图片文件夹绝对路径
img2pdf * -o merged.pdf

命令批量处理

  • 有多个文件夹
  • 文件夹下也可能有文件夹
  • 如果文件夹内无文件夹 则是目标文件夹
  • 将目标文件夹的图片压缩
  • 然后做成 pdf

pip3 install pillow reportlab

import os
from PIL import Image
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import A4
from reportlab.lib.utils import ImageReader

def compress_image(input_path, output_path, quality=80):
"""压缩图片:JPG 直接调质量,PNG/WebP 转 JPG 压缩"""
try:
with Image.open(input_path) as img:
# 处理透明通道(PNG 转 JPG 需先填充白色背景)
if img.mode in ("RGBA", "P"):
background = Image.new("RGB", img.size, (255, 255, 255))
background.paste(img, mask=img.split()[3] if img.mode == "RGBA" else None)
img = background

# 保存压缩后的图片(JPG 格式)
img.save(output_path, "JPEG", quality=quality, optimize=True)
return True
except Exception as e:
print(f"⚠️ 压缩图片失败:{os.path.basename(input_path)} - {e}")
return False

def images_to_pdf(image_paths, output_pdf, page_size=A4):
"""将图片列表合并为 PDF"""
if not image_paths:
print("❌ 无有效图片,跳过 PDF 生成")
return False

c = canvas.Canvas(output_pdf, pagesize=page_size)
page_width, page_height = page_size

for img_path in image_paths:
try:
with Image.open(img_path) as img:
img_width, img_height = img.size
# 等比例缩放图片,适配页面(居中放置)
scale = min(page_width / img_width, page_height / img_height)
new_w, new_h = img_width * scale, img_height * scale
x, y = (page_width - new_w) / 2, (page_height - new_h) / 2

c.drawImage(ImageReader(img_path), x, y, new_w, new_h)
c.showPage() # 新建一页
print(f"✅ 添加图片:{os.path.basename(img_path)}")
except Exception as e:
print(f"⚠️ 处理图片失败:{os.path.basename(img_path)} - {e}")

c.save()
print(f"📄 PDF 生成成功:{output_pdf}\n")
return True

def traverse_folders(root_dir, compress_quality=80):
"""递归遍历文件夹,处理所有目标文件夹(无下级文件夹)"""
# 定义支持的图片格式(可补充)
image_formats = ('.jpg', '.jpeg', '.png', '.webp', '.bmp', '.gif')

# 递归遍历
for root, dirs, files in os.walk(root_dir):
# 判断是否为目标文件夹(无下级文件夹)
if not dirs:
print(f"\n==================================================")
print(f"📂 找到目标文件夹:{root}")

# 筛选图片文件,按文件名排序
image_paths = [
os.path.join(root, f)
for f in sorted(files)
if f.lower().endswith(image_formats)
]

if not image_paths:
print(f"❌ 该文件夹无图片,跳过")
print(f"==================================================\n")
continue

print(f"🔍 找到 {len(image_paths)} 张图片,开始压缩。..")

# 创建临时压缩文件夹(避免修改原图)
temp_compress_dir = os.path.join(root, "_temp_compressed")
os.makedirs(temp_compress_dir, exist_ok=True)

# 批量压缩图片
compressed_img_paths = []
for i, img_path in enumerate(image_paths):
img_name = os.path.basename(img_path)
# 压缩后的文件名(保留原排序,后缀改为。jpg)
compressed_name = f"compressed_{i:03d}.jpg"
compressed_path = os.path.join(temp_compress_dir, compressed_name)

if compress_image(img_path, compressed_path, compress_quality):
compressed_img_paths.append(compressed_path)

# 生成 PDF(PDF 文件名=目标文件夹名,保存在目标文件夹同级目录)
folder_name = os.path.basename(root)
output_pdf = os.path.join(os.path.dirname(root), f"{folder_name}.pdf")

# 合并压缩后的图片为 PDF
images_to_pdf(compressed_img_paths, output_pdf)

# 可选:删除临时压缩文件夹(如需保留压缩图,注释此行)
import shutil
shutil.rmtree(temp_compress_dir)
print(f"🗑️ 已删除临时压缩文件夹:{temp_compress_dir}")
print(f"==================================================\n")

if __name__ == "__main__":
# --------------------------
# 请修改以下 3 个参数(必改!)
# --------------------------
ROOT_DIR = "./." # 根文件夹路径(所有子文件夹从这里开始遍历)
COMPRESS_QUALITY = 95 # 图片压缩质量(1-100,推荐 70-90)
PDF_PAGE_SIZE = A4 # PDF 页面尺寸(A4/Letter 或自定义 (宽,高),单位:点)

# 开始执行(如需自定义 PDF 页面尺寸,添加 page_size=PDF_PAGE_SIZE 参数)
print(f"🚀 开始遍历根文件夹:{ROOT_DIR}")
print(f"⚙️ 压缩质量:{COMPRESS_QUALITY},PDF 页面尺寸:{PDF_PAGE_SIZE}")
traverse_folders(ROOT_DIR, COMPRESS_QUALITY)
print("🎉 所有目标文件夹处理完成!")
Python阅读需 3 分钟