宇宙纪元

hinder110 的思考、读书与代码札记。

0%

帮别人 vs 不帮

自己的疑问?我想问一下,别人老是找我帮忙,我展现了某方面的技能,但是我觉得他们不能合理的反馈给我他们的价值,而且我确实很忙,在不忙的时候我其实很想自己休息,什么也不做,而不是帮别人做什么东西,最近我感觉一直在帮别人,我就有点烦躁。

ee7e6ab5-ae15-4e9c-8ba2-e81e3ca459c7

1️⃣ 基本设定

你面临的局面可以抽象成一个重复博弈

  • 参与方

    • 你(玩家 A)
    • 对方(玩家 B)——请求帮忙的人
  • 策略空间

    • 你:不帮
    • 对方:合理反馈不反馈
  • 收益函数

    • 帮别人 + 对方合理反馈 → 得到社会资本、互惠、关系维护 → 高收益
    • 帮别人 + 对方不反馈 → 付出精力,心理疲惫 → 负收益
    • 不帮别人 → 保留精力,心理恢复 → 自身收益,但关系可能下降 → 中性或负收益(视关系重要性)

2️⃣ 建模为矩阵

假设对方可能会反馈不会反馈,你的选择是不帮

对方反馈 对方不反馈
+3 -2
不帮 0 0
  • 数字代表心理/社会收益(可调整)
  • 可以看出:
    • 帮别人只有在对方会反馈时才值得
    • 不帮别人虽然可能损失关系,但总是安全策略

3️⃣ 重复博弈分析

  • 你和对方是长期关系(重复博弈)

  • 如果对方总是不反馈 → 最优策略是减少或拒绝帮忙

  • 如果对方偶尔会合理反馈 → 可以选择 条件性帮忙(只在对方也有回报行为时帮)

  • 这类似

    囚徒困境

    互惠博弈

    • 双方合作 → 高收益
    • 一方单方面付出 → 低收益甚至亏损

4️⃣ 博弈论启示

  1. 边界和条件性策略很重要
    • 你可以设定”我只有在合理回报、价值对等情况下才帮忙”
    • 这是博弈论中的 触发策略(Trigger Strategy):对方违规,就停止合作
  2. 长期收益 > 短期付出
    • 无条件付出 → 对方可能形成”惯性依赖”,你长期收益负
    • 有条件付出 → 培养互惠关系,长期收益最大
  3. 策略灵活性
    • 你可以根据对方反馈动态调整策略
    • 类似 Tit-for-Tat(以牙还牙)策略:别人给反馈,你帮;不反馈,你不帮

5️⃣ 心理与现实结合

  • 博弈论告诉你:长期关系中的合理付出需要衡量收益和风险
  • 现实中:
    • 帮忙是投资
    • 回报可能是:时间、情感认可、技能互助
    • 不回报 → 亏损投资 → 需要停止或调整策略

换句话说,你现在烦躁,就是你的”收益矩阵”显示长期亏损,自然产生心理信号让你调整策略。

  1. 多策略组合
    • 有条件帮忙 + 留出个人时间 + 优先处理高价值请求
    • 当出现异常情况(对方不反馈或索取过多),系统仍能运行而你不崩溃
  2. 反馈循环
    • 每次交互都作为信息输入,优化下一次的决策
    • 比如发现某人长期不反馈 → 下次减少投入
  3. 心理韧性
    • 不把情绪绑在一次交互上
    • 让你的”系统”在压力和请求波动下仍能保持稳定甚至成长

💡 总结一句话:

博弈论提供了理性决策的建模工具,但任何预测模型都有脆弱性。真正的反脆弱策略,是设计一个在不确定性、随机性和异常行为中能保护并增强自己资源和心理的系统,而不是追求单次策略的完美。

ChatGPT Image 2026年5月11日 19_49_55

1️⃣ 概念对比

什么是MCP

MCP是Model Context Protocol,他的意思是,可以让ai大模型,通过这个MCP服务器参与自身LangChain以外的一种信息获取渠道

什么是LangChain呢?

我的理解是langchain是一个镶嵌在ai大模型的外部框架。他将把你的问题经由ai大模型分析拆解,然后交给langchain去分单元去处理。

ChatGPT Image 2026年5月11日 17_41_01

2️⃣ 联系理解

  1. Harness 是目标
    • “把大模型变成可靠可控的 agent”,是抽象的设计理念
    • 它强调 可控性、安全、跨工具整合
  2. LangChain 是实现手段之一
    • 它提供模块化工具(Chains、Agents、Memory、工具接入)
    • 你可以用 LangChain 搭建一个 小型的 Harness
    • 例如,把文档检索、工具调用、状态管理统一封装,就形成了一个 可控 agent
  3. MCP 是外部能力接入方式
    • MCP 提供统一接口,让模型调用外部服务
    • LangChain / Harness 可以直接把 MCP 作为工具接入
    • 举例:你用 Claude Code + DeepSeek MCP → LangChain 里的 Agent 调用 MCP → 完成搜索任务

3️⃣ 可视化类比

1
2
3
4
5
6
7
8
9
10
              ┌─────────────┐
│ Harness │ <- 目标:可靠、可控执行
└─────────────┘

┌──────────────┼──────────────┐
│ │ │
LangChain MCP Server 其他工具
(Chains/Agents/Memory) (搜索/数据库/文档) ...

执行任务 / 管理上下文

简单来说:

  • Harness = 架构理念 + 工程实践
  • LangChain = 实现这个理念的框架
  • MCP = 执行中调用外部服务的接口

从 Web Demo 到 Tauri v2 桌面应用:一个小说阅读器的重生

起点

项目最初是一个 React + Express 的 Web Demo,前端 3 个页面(搜索/目录/阅读),后端代理光遇 API(番茄小说聚合接口)。能跑,但只是一个玩具——没有持久化、没有真正的书源解析、依赖第三方 API。

目标:把它变成真正的桌面应用。Tauri v2(Rust 后端 + React 前端),支持 7208 个书源、SQLite 书架/历史、规则引擎解析任意网站。


开发流程

阶段 1:架构设计(30 分钟)

先画出完整模块图,再写代码。核心模块:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
┌─ React 前端 ──────────────────────────────────┐
│ SearchPage ChaptersPage ReaderPage │
│ BookshelfPage HistoryPage SettingsPage │
│ api.ts (invoke) ←──IPC──→ Rust 后端 │
└────────────────────────────────────────────────┘

┌─ Rust 后端 (src-tauri/) ───────────────────────┐
│ lib.rs → 10 个 IPC 命令 + AppState │
│ source_manager → 加载/解析 JSON 书源 │
│ rule_engine → CSS 选择器链 + 正则提取 │
│ generic_parser → HTTP 请求 + 多源 fallback │
│ mock_source → 离线测试源 │
│ db.rs → SQLite 书架/历史 │
└────────────────────────────────────────────────┘

阶段 2:脚手架搭建(15 分钟)

1
2
3
4
5
6
7
8
# 手动创建目录结构(没用脚手架,完全掌控)
mkdir src/pages src-tauri/src src-tauri/icons src-tauri/capabilities

# 写配置
package.json # Tauri v2 + React 依赖
vite.config.ts # Tauri 兼容构建
Cargo.toml # Rust 依赖
tauri.conf.json # 窗口/安全/打包配置

阶段 3:Rust 后端(核心开发,2 小时)

source_manager.rs — 书源加载器

  • test_sources.json 加载 CSS 规则源(简单格式,直接映射)
  • shuyuan_7208.json 加载 Legado 格式源(复杂,需解析嵌套 JSON 规则)
  • 输出统一的 ParsedSource 结构

rule_engine.rs — CSS 链规则引擎

  • 规则格式:CSS选择器@text|href|html|src
  • scraper crate 解析 HTML,regex 做后处理
  • URL 规范化:相对路径 → 绝对路径

generic_parser.rs — HTTP 解析器

  • 优先源(前 3 个)5 秒超时,结果不够 5 本则启动扩展源(6 秒)
  • GBK/UTF-8 自动检测解码
  • 结果按 (书名, 作者) 去重

db.rs — SQLite 存储

  • bookshelf 表:书架书籍 CRUD
  • history 表:阅读历史,LEFT JOIN 书架获取书名

mock_source.rs — 内置测试源

  • 搜索返回 3 本假书
  • 目录生成 85/120/200 章
  • 正文生成 16 段中文阅读内容
  • 作用:离线验证全流程

阶段 4:前端适配(1 小时)

核心改变:fetch()invoke()

1
2
// 旧:fetch('/api/search?keyword=xxx')
// 新:invoke<SearchResult[]>('search_books', { keyword })

类型对齐:camelCase → snake_case(匹配 Rust 序列化)

1
2
// 旧:Book.bookId, Chapter.itemId
// 新:Book.book_id, Chapter.item_id

HashRouter:Tauri 生产环境用自定义协议,BrowserRouter 失效。

阶段 5:测试与修复(1 小时)

  • Mock 源验证全流程:搜索 → 目录 → 阅读 → 翻页
  • CSS 书源验证:HTTP 请求 → 解析 → 返回
  • 网络错误排查:TLS backend 缺失 → 添加 native-tls

我踩过的坑

坑 1:MutexGuard 不能跨 .await

错误future cannot be sent between threads safely

1
2
3
4
5
6
// 错误写法
#[tauri::command]
async fn search_books(state: State<'_, AppState>) -> Result<..., String> {
let sources = state.sources.lock()?; // MutexGuard 持有锁
generic_parser::search(&sources).await // .await 时锁未释放,不满足 Send
}

原因std::sync::MutexGuard 不是 Send。tokio 可能在 .await 时切换线程,锁不能跨线程传递。

修复:先 clone 数据,再 drop 锁,再 await。

1
2
3
4
5
let sources = {
let guard = state.sources.lock()?;
guard.clone() // 复制数据
}; // guard 在此 drop,锁释放
generic_parser::search(&sources).await // 安全

教训:Rust async 里,锁的生命周期不能跨越 .await 点。这是 Rust 初学者最容易踩的 async 坑。

坑 2:reqwest 缺 TLS backend

错误:所有 HTTPS 请求返回 error sending request for url

原因Cargo.toml 里只写了

1
reqwest = { version = "0.12", features = ["charset", "gzip", "brotli"] }

没指定 TLS backend。reqwest 不会自动选 TLS——需要显式启用。

修复:加 native-tls

1
reqwest = { version = "0.12", features = ["charset", "gzip", "brotli", "native-tls"] }

教训:Rust 生态不像 Node.js 那样电池自带。TLS、编码、压缩都要显式声明 feature。

坑 3:SQLite db 文件导致 Tauri 无限重编译

现象npm run tauri dev 启动后,应用不断重启。

原因:SQLite 数据库文件 yueduqi.db 创建在 src-tauri/ 目录内。Tauri dev 模式监控 src-tauri/ 的文件变化。每次 SQLite 写入(WAL 日志、shm 共享内存)触发文件变更事件 → Tauri 重编译 → 应用重启 → SQLite 再次写入 → 死循环。

修复:把 db 文件移到项目根目录(不在 src-tauri/ 监控范围内):

1
2
3
4
5
let db_path = std::path::Path::new(env!("CARGO_MANIFEST_DIR"))
.parent()
.unwrap()
.join("yueduqi.db");
Connection::open(&db_path)

教训:文件监控工具和数据库文件是死对头。数据库文件永远不要放在被监控的目录里。

坑 4:cargo build vs tauri build

现象:Release exe 双击运行,窗口显示 ERR_NETWORK_CHANGED

原因cargo build --release 只编译 Rust 二进制。不会把 React 前端打包进去。Tauri 启动时找不到前端文件,就尝试连接 localhost:3000(开发服务器),连不上就报错。

正确做法npm run tauri build 会先执行 beforeBuildCommandnpm run build 生成 dist/),再把 dist/ 嵌入 Rust 二进制。这就是”Tauri 打包”和”Rust 编译”的区别。

教训cargo build ≠ 可分发版本。必须用 tauri build 才能得到独立的 exe。

坑 5:CSS 选择器线上不匹配

现象:HTML 请求成功(200),但返回 0 本

原因:书源 JSON 里的 CSS 选择器是写死的。网站改版、换模板、加 CDN 都会导致选择器失效。离线写好的选择器到线上可能完全对不上。

实际案例:猜到 4 个站点的搜索页 CSS 结构,只有 1 个 HTTP 通了,0 个 CSS 匹配到元素。

缓解:加了 Mock 内置源,保证离线测试全流程可跑。网络源的选择器需要持续维护。

教训:依赖外部网站 HTML 结构的爬虫,选择器是消耗品。要么持续维护,要么用 API。

坑 6:Legado 书源 ≠ 简单 CSS 规则

现象:7208 个书源只解析出几个能用。

原因:Legado 的书源分两类:

  1. CSS 规则源(简单):搜索URL + CSS选择器 → 直接请求 → 解析 HTML
  2. JS 动态源(复杂):内嵌 JavaScript → 计算签名/MD5/AES → 构造请求 → 解密响应

第一种我们的规则引擎能处理。第二种需要 QuickJS 在 Rust 里执行 JavaScript。7208 个源里大部分是 JS 动态源,解析出来规则字段为空。

状态:搁置。后续可接 quickjs-rs 支持。

教训:调研数据格式再设计解析器。不要想当然。

坑 7:端口占用导致启动失败

现象npm run tauri devPort 3000 is already in use

原因:Vite dev server 上次没正常退出,进程残留占用 3000 端口。

修复

1
Get-NetTCPConnection -LocalPort 3000 | % { Stop-Process -Id $_.OwningProcess -Force }

教训:开发脚本应该加进程清理逻辑。

坑 8:GitHub Release exe 不能直接用

现象:Release 页下载的 exe 双击报 ERR_NETWORK_CHANGED

原因链

  1. 第一次用 cargo build --release 编译 → 没嵌入前端
  2. 手动 gh release create 上传了这个残缺 exe
  3. 用户下载后双击 → 连 localhost:3000 → 没人监听 → 报错

修复链

  1. npm run tauri build 重新编译 → 前端嵌入 exe
  2. 删除旧 Release,重建 → 上传正确 exe

教训:Release 前必须在真机上双击验证 exe 能启动。

技术栈总结

技术 选型理由
桌面框架 Tauri v2 比 Electron 小 20 倍,Rust 后端
前端 React 19 + TypeScript + Vite 生态成熟,组件化
后端 Rust (tokio, reqwest, scraper, rusqlite) 性能好,类型安全
规则引擎 CSS 选择器链 Legado 兼容,简单可扩展
存储 SQLite 零配置,嵌入式
打包 Tauri build → exe 单文件分发,7.8MB

当前状态

  • 前端 6 页面,功能完整
  • Rust 后端 6 模块,编译通过,测试 3/3
  • SQLite 书架/历史正常
  • Mock 源可离线验证全流程
  • 网络书源取决于站点可访问性
  • JS 动态书源(QuickJS)未实现
  • 仅 Windows x64

给 AI 辅助开发的建议

  1. 先画架构图再写代码:AI 能写代码,但架构决策要人来做
  2. 每次只改一个模块:别同时改 5 个文件,出错没法定位
  3. 编译频繁验证cargo check(5 秒)比 cargo build(5 分钟)快 60 倍
  4. Mock 数据保底:外部依赖不可靠,用 Mock 保证核心流程可测
  5. 错误信息仔细读:Rust 的编译错误信息是教科书级别的,认真看就能解决
  6. 先跑通再优化:Mock 源先验证全流程,再折腾网络书源

上次写完阅读器的设计思路之后,我第二天就开始动手做桌面版了。

一句话总结:把软件交到别人手里,比写软件本身难多了。


为什么要做桌面版

原因特别简单——我想让同学双击 exe 就能用。

我原来的 web 版是这个架构:

  • 后端:Express + Axios + Cheerio
  • 前端:React
  • 部署:Docker

自己用完全没问题。但要发给不写代码的同学,我得先教他们装 Node.js,或者教他们装 Docker,然后还得打开终端敲命令。

这不现实。我一个舍友连压缩包都不会解。

所以必须打包成 exe。双击运行,别的什么都不用管。


Electron vs Tauri

能做桌面端 exe 的框架,第一个想到的肯定是 Electron。但 Electron 有个我接受不了的问题——体积太大。一个什么都没写的 hello world 打包出来就上百 MB。

为什么?因为 Electron 给每个应用都塞了一个完整的 Chromium 浏览器。

Tauri v2 的思路完全相反。它不塞浏览器,直接调用 Windows 系统自带的 WebView2。前端还是用 React 写,但后端从 Node.js 换成了 Rust。

Electron Tauri v2
打包体积 100MB+ 14MB
后端语言 Node.js Rust
浏览器引擎 自带 Chromium 系统 WebView2
内存占用

14MB 什么概念?QQ 安装包快 200MB 了。一个带三个书源的桌面阅读器,体积只有 QQ 的百分之七。

但 Tauri 有个门槛:后端要用 Rust 重写。


从零开始写 Rust

我之前完全没碰过 Rust,只知道它是「系统级语言」「安全」「难学」。

书源的逻辑全在后端——搜索、抓取目录、解析章节内容。原来在 Node.js 里是这样:

1
2
3
Axios  →  发 HTTP 请求
Cheerio → 解析 HTML
iconv-lite → 处理 GBK 编码

到了 Rust 这边,每一个都得找对应的库:

1
2
3
4
5
reqwest     → HTTP 请求
scraper → HTML 解析(CSS Selector)
encoding_rs → GBK 解码
urlencoding → URL 编码(这个 Node.js 内置就行)
regex → 正则(比 Node.js 严格得多)

Rust 的语法倒不是最难的。所有权、借用、生命周期确实需要适应,但 Rust 编译器报错极其友好——不仅告诉你怎么错了,还会建议怎么改。很多时候顺着编译器的提示就能把代码改对。

真正折磨人的是 Windows 工具链


Win11 预览版上的地狱体验

我先装了 Rust 的 GNU 工具链。代码编译通过,生成了 exe。双击运行——

没反应。

不是报错,是双击之后什么都没发生。用命令行跑了一下,提示 os error 193——不是有效的 Win32 应用程序。文件格式明明是对的,但 Windows 就是不认。

只能换成 MSVC 工具链。然后问题又来了:

1
2
3
4
5
6
7
Git 自带的 link.exe 和 MSVC 的链接器重名了

系统优先找到了 Git 的那个

link.exe 是 Unix 下创建符号链接的工具,不是链接器

链接时报错 "extra operand"

我盯着那个报错看了五分钟才反应过来——它用的根本不是微软的链接器。

最后装了 Visual Studio 的 C++ 构建工具,终于能正常编译了。

这些东西跟写代码一点关系都没有,但占了我差不多一半的开发时间。


三个书源的 Rust 实现

书源的设计和 web 版完全一样,每个书源实现三个方法,由一个路由器统一分发:

1
2
3
search_books()       → 搜索书籍
get_chapters() → 获取章节目录
get_chapter_content() → 获取章节正文
1
2
3
                  ┌─→ guangyu(光遇 API)
mod.rs(路由器)──┼─→ biquge(笔趣阁 HTML)
└─→ qixinge(七星阁 HTML)

光遇 API —— 最省心,但爱挂

JSON 接口,数据格式规整,reqwest 拿到响应直接反序列化就完了。

但它有个毛病:API 服务器不稳定,经常某个域名挂了。我设了七个域名做 fallback,一个超时自动切下一个。

笔趣阁 —— 最折腾

GBK 编码的 HTML,搜索还是 POST 表单。Rust 这边要:

  1. 把中文关键词编码成 GBK 字节
  2. 拼到表单里发 POST
  3. 收到响应再把 GBK 字节解码回来
  4. 解析 HTML 提取结果

Node.js 里 fetch + iconv-lite 两行就搞定的事,Rust 里写了整整一个函数。

而且 Rust 的 regex 不支持反向引用。之前匹配成对 HTML 标签的正则 `<(script).*?</\1>` 直接报错,得改成显式的标签名:

1
2
// Rust 不允许反向引用,只能显式列出标签名
r"<(script|style|div|a)\b[^>]*>.*?</(script|style|div|a)>"

七星阁 —— 脏数据真多

UTF-8 编码,省了编解码这一步。但章节内容里的脏数据太多了:

  • 「本章未完,请翻下一页」
  • 「第(1/3)页」
  • [玄幻] 之类的分类前缀
  • 随机插入的广告文案

清理数据的正则代码比抓取数据的代码还多。 正则写多了之后才发现,做爬虫最难的从来不是发请求,是把别人乱七八糟的 HTML 洗成干净文本。


前后端通信的变化

web 版的前后端通信就是标准的 HTTP:

1
2
// web 版
const res = await fetch('/api/search?keyword=三体');

Tauri 版变成了进程间通信:

1
2
// Tauri 版
const res = await invoke('search_books', { keyword: '三体', source: 'qixinge' });

这个改动对前端来说几乎是透明的。 除了把 fetch 换成 invoke,其他逻辑一行没改。这也是 Tauri 设计得好——前端开发者几乎感知不到后端的切换。


最大的感受

整个项目做完,我最大的感受不是「Rust 真难」也不是「Tauri 真香」——

把软件交到别人手里,比写软件本身难多了。

功能我在 web 版就写好了。搜索、目录、阅读器、日夜间模式,web 版全都有。

但为了让别人能 双击运行,我做的事情包括:

  • 把后端从 Node.js 迁移到 Rust
  • 折腾 Windows 工具链
  • 处理三个不同书源的各种编码和格式
  • 用 GitHub Releases 发布 exe
  • 写面向小白用户的图文 README

这些全都不是「功能开发」,但每一项都不可或缺。没有它们,软件就只是我电脑上的 localhost:3000,别人根本看不见。

我以前觉得软件工程最难的是写代码。现在发现,代码只是冰山在水面上的那一角。水面之下是分发、部署、文档、兼容性——这些才是决定一个软件能不能真正「存在」的东西。


软件截图

搜索页面

阅读器界面


接下来要做的事

目前 v0.1.0 已经发在 GitHub Releases 上了,14MB 的单 exe,下载双击就能用。

但离「好用」还有距离,接下来几天集中做三件事:

  1. 书源扩展 — 现有的三个书源覆盖率太低,搜冷门书基本搜不到。至少再补几个主流网文源。
  2. 书架和历史记录 — 现在每次打开软件都要重新搜索,没有任何持久化。下一步用 SQLite 把阅读进度、书架收藏存到本地。
  3. 阅读体验优化 — 现在的字号只有三档,翻页也没有动画。至少要加上自定义字号、行距、翻页动画。

等这些做完,v1.0 才算真的能用。


仓库地址:github.com/hinder110/yueduqi-tauri

剃须刀与痘痘:一件日常小烦恼

每天面对镜子时那张干净不干净的脸,其实挺影响心情的。


最近因为剃须的事,脸上时不时冒出几颗痘,甚是烦恼。

我平时花很多时间在学习和各种事情上,但转过头来发现,有些生活里的小事——比如刮胡子——一直没认真对待过。于是坐下来仔细研究了一下,发现还挺有意思的。

我的工具

我用的是飞科 FS901,一款旋转式双环电动剃须刀。用了挺久,期间从没换过刀头,也没正经洗过。每天早上拿起来干刮两下就出门了。

为什么会冒痘

电动剃须刀看着简单,按下去就转,但其实藏着几个卫生上的坑。

刀头里面积了几个月的东西。 拆开来看,刀网背面附着一层灰白色的干结物——那是之前的油脂、死皮、胡渣混在一起,被高速旋转压实的。每一次剃须,这些东西都在高速摩擦皮肤表面,细菌直接进毛囊。

刀网早就钝了。 网孔的边缘不再锋利,刀片也不是在”切断”胡须而是在”扯断”。毛囊被拉扯后红肿发炎,就成了痘痘。

干脸直接上。 脸没洗,表皮带着细菌和油脂,刀网推过去的时候直接把这些东西压进毛孔里。

手动 vs 电动:方向其实不重要

问了一圈才知道一个有趣的冷知识。

手动剃须刀(吉列那种)的刀刃直接贴皮肤,逆着毛发生长方向刮会把胡须拉起来再切断,断口形成一个斜面缩进毛囊里,刺到毛囊壁就发炎。所以手动刀必须顺着刮

但旋转式电动剃须刀不一样。刀片藏在刀网里面,刀网隔开了皮肤。胡须钻进网孔后被里面的旋转刀片切断,不存在”拉扯—回缩—刺毛囊”这个链条。所以方向无所谓,打圈都行。

痘痘的根源不在刮法,在卫生。

解决方子

三步,简单到我现在觉得早该做了:

  1. 清洗刀头。 每次用完把刀头拆下来,用附赠的小刷子把刀网内侧和刀片刷一遍。隔一两周用酒精棉片擦一擦消毒。不洗的话,那里就是细菌培养皿。

  2. 换刀头。 飞科 FS901 的替换刀头大概 30-40 块,淘宝搜型号就有。刀头属于耗材,6-12 个月该换。我那个用了快两年没动过,想想也真是。

  3. 先洗脸再剃。 清水冲一下,把表面油脂洗掉再刮。或者洗澡后剃,蒸汽已经把胡须软化了。须后不用什么复杂的东西,清水拍一下,拍点收敛毛孔的须后水就行。

后记

这些小破事花了我好多年才注意到。我们总是忙着学习、忙着各种目标,但生活中那些每天重复的小操作——剃须、坐姿、喝水——其实一直在悄悄累积影响力。

剃须冒痘这件事让我意识到,有些问题不是”麻烦”,只是从未认真对待过。查清楚原因,动手改掉,效果立竿见影。


写于 2026 年 5 月,剃须刀清理整顿之后。

今天主要了解了几个和效率、自动化、AI 编程相关的东西:Skills、MCP、PowerToys Run,以及 GitHub 上的 Everything Claude Code 项目。整体感觉是,它们虽然属于不同层面的工具,但目标都很相似:让人和工具之间的协作更顺畅。

Skills

Skills 可以理解为把某类固定工作流程”封装”起来。比如写文档、分析文件、生成报告、处理表格等,如果每次都要重新描述规则和步骤会很麻烦,而 Skills 的价值就在于把这些经验沉淀成可复用的能力。它更像是给 AI 配了一套专门的工作手册,让 AI 在特定任务上表现得更稳定。

MCP

MCP(Model Context Protocol)则更偏向连接能力。它让 AI 不只是停留在聊天窗口里,而是可以和外部工具、数据源、服务进行交互。简单来说,Skills 更像是”怎么做事的方法”,MCP 更像是”能连接哪些工具和资源”。两者结合起来,AI 才更接近真正的工作助手。

PowerToys Run

PowerToys Run 是一个很实用的效率工具。它类似一个快速启动器,可以用快捷键 Alt + Space 快速打开应用、搜索文件、执行命令。它的价值不在于复杂,而在于减少日常操作中的切换成本。对经常在 Windows 上工作的人来说,这种工具能明显提升流畅度。

Everything Claude Code

最后还看到了 GitHub 上的 Everything Claude Code 项目。它是一个围绕 Claude Code 的配置和实践集合,包含技能、记忆优化、安全扫描、多代理框架支持等内容,目标是提升 AI 编程代理的使用效率和稳定性。项目介绍里也提到,它不只是单纯的 Claude Code 配置,而是更完整的代理性能优化系统。

一、安装 CC Switch

CC Switch 是一款图形化管理工具,可以方便地在 Claude Code、Codex、Gemini CLI 等工具之间切换 API 提供商。

前往 GitHub Releases,拉到底部资源包部分,下载对应平台的安装包:

下载CC Switch

二、快速上手 CC Switch

第一步:启动 CC Switch

首次启动时,CC Switch 会自动检测已安装的 CLI 工具并尝试导入现有配置,系统托盘中会出现 CC Switch 图标。

第二步:选择要管理的应用

主界面顶部是应用切换栏,点击对应图标(Claude Code / Codex / Gemini CLI 等)即可切换当前管理的应用。你可以在设置中隐藏不需要的应用。

主界面

第三步:添加 Provider

点击右上角的 +,从内置预设中选择(如官方 Anthropic API、DeepSeek、阿里百炼等),或手动填写以下信息:

添加Provider

  • 名称:便于区分的备注名
  • API Key:服务商提供的密钥
  • Base URL(可选):自定义代理地址
  • 模型:指定默认使用的模型名称
  • API 格式:Anthropic Messages 原生格式 或 OpenAI Chat Completions 兼容格式

填写配置

第四步:切换 Provider

在列表中点击目标 Provider,再点击「启用」,CC Switch 会自动将配置写入对应 CLI 工具的配置文件:

启用Provider

之后在终端直接运行 claude 命令,即会使用新配置。

第五步:验证配置(可选)

点击 Provider 旁的「健康检查」按钮,发送一个测试请求验证 API Key 和网络连通性。

健康检查

💡 按 Cmd/Ctrl + , 快速打开设置;按 ESC 关闭当前面板。

三、安装 Claude Code

Windows

1
irm https://claude.ai/install.ps1 | iex

NPM

请确保系统安装了 Node.js,版本需在 v18 或更高。

1
npm install -g @anthropic-ai/claude-code

四、申请 DeepSeek API Key

登录 DeepSeek 平台 后,先点击充值,充值一定金额。

DeepSeek首页

然后进入 API Keys 页面:

API Keys

点击「创建 Key」,记得复制保存自己的 Key

创建Key

复制Key

五、在 CC Switch 中配置 DeepSeek

打开 CC Switch,在 Claude Code 应用下,点击右上角的 + 添加新 Provider:

添加Provider

选择 Anthropic Messages 格式,填写以下信息:

填写配置

关键配置如下:

配置详情

将刚才复制的 DeepSeek API Key 粘贴到 API Key 字段:

粘贴Key

六、启动 Claude Code

启用 DeepSeek 配置后,在项目文件夹中右键打开终端(CMD),输入 claude 即可唤起 Claude Code,开始使用。

image-20260424124400396

第一点:你可以写一个大的牌组,然后再写小牌组,这样的树形结构,复习的时候可以选择在大牌组复习。这样的话在预览中查找笔记也会很方便,以及这样子复习的时候可以稍微成系统一点,比如说你要复习cs中的c++,那么就可以今天单独复习这个小牌组,或者你也可以选择复习大牌组。

第二点:对于零碎的计算机知识而言,尤其是计算机网络方面的知识,记忆比较多,可以选择现成的卡组,别人做好的,但是我感觉还是自己做的更好一点,具体做法的话我推荐可以cs::计算机网络::第一章这么写牌组。

第三点:如何使用ai来赋能这个过程,我觉得你去看一个课程或者书,肯定是有自己的一些笔记,我的建议是,把自己的笔记简单写下来,可以是简单的摘录,或者是复制粘贴,写成一个markdown文件,然后在最后用自己的话描述一下这段笔记,然后把笔记交给ai让他来帮你简单排版一下让他符合anki,快问快答的形式,然后写成txt文件导入anki中。

最后一点建议:anki卡片最重要的可能是快速记录笔记,然后在后来时间快速复利。所以内容的多少不重要,重要的是其中带有自己理解的知识,在未来的不断重复。anki卡片到最后其实是一个大量笔记慢慢去除,找到最关键内容然后持续重复的过程。

一、整体策略(日本造园思路)

如果我是日本造园师(偏“自然主义 + 枯山水逻辑”),我会这样改:

1️⃣ 核心原则

  • 水边:像野生湿地
  • 中部:自然花境(不是整齐花坛)
  • 外围:草地+点景树(极少)

👉 关键词:
“看起来像自然长出来的,而不是人为种的”


二、空间分区种植(对应你图里的 A–I 区)

我帮你直接按你图来分:


🌊 D / F 区(雨水核心区 / 积水区)

👉 最关键(决定成败)

功能:

  • 暴雨时积水
  • 平时半湿润

植物(必须耐水+耐旱切换):

  • 千屈菜(主景)👉 开花特别好看
  • 黄菖蒲 / 鸢尾(竖向线条)
  • 香蒲(点缀,不要太多)
  • 水葱 / 灯心草(细节层次)

👉 日本风格建议:

  • 不要种太密,要留“水面呼吸感”

🌿 E 区(石缝过滤区 / 雨水净化)

👉 这是你设计里很好的一个点,我保留并强化了

植物:

  • 玉簪(耐阴+观叶)
  • 紫露草(低矮填缝)
  • 萱草(耐旱耐湿)

👉 重点:

  • 植物要“从石头缝里长出来”的感觉

🌾 G 区(浅滩/过渡区)

👉 这个区非常关键,是“景观最自然的地方”

植物(推荐组合):

  • 芒草(主景,日式感很强)
  • 细叶芒 / 狼尾草
  • 小菊类(野花感)

👉 日本风格关键:

  • 草 > 花(比例约7:3)

🌸 H 区(花境区 / 你设计的重点)

👉 这是你说“以花园为主”的核心

我帮你优化后的配置(适合山西):

主花(骨架):

  • 马鞭草(高、通透)
  • 金光菊(夏季主色)
  • 松果菊(耐旱王者)

中层:

  • 鼠尾草(紫色层次)
  • 萱草(橙色点缀)

地被:

  • 景天(抗旱)
  • 石竹(边缘)

👉 设计重点:

  • 不要对称种
  • 做“漂浮式花块”

🌳 C 区(乔木区,必须控制数量)

你说“树要少”,这个是对的。

👉 我建议最多 3棵

推荐(山西可活):

  • 元宝枫(秋色)
  • 山杏(春花)
  • 黄栌(红叶)

👉 日本式处理:

  • 树不要围一圈
  • 像“偶然长在那里”

🪨 I 区(圆形空间 / 停留点)

👉 我帮你强化成“精神核心空间”

配置:

  • 中间:置石(主石)
  • 周围:矮草 + 少量花

植物:

  • 薰衣草(可尝试)
  • 景天
  • 石竹

👉 关键词:
“留白”比种花更重要


🪵 A / B(入口平台)

👉 我帮你调整逻辑:

  • 不种复杂植物
  • 用:
    • 苔草类(或替代草)
    • 低矮花

👉 让人一进来就“干净、安静”


三、关键改动总结(你可以写进论文)

你原设计 👉 我优化后:

项目 原设计问题 优化
植物分布 比较均匀 分湿区梯度
可能偏多 控制3棵以内
偏“装饰性” 改为自然花境
水边 边界生硬 改为湿地过渡
空间 有点满 增加留白

四、一个很关键的专业建议(重点)

你这个是雨水花园,老师很容易问你一句:

👉 “暴雨之后48小时内能不能排干?”

所以你可以补一句(非常加分):

  • 土壤采用:
    • 砂:40%
    • 壤土:40%
    • 有机质:20%
  • 底部设碎石层(排水)

五、如果你想再升级(我可以帮你做)

你这个项目其实已经可以冲“优秀毕业设计”了,如果你愿意,我可以帮你再往上推一层:

👉 我可以帮你做这些:

  • ✔ 正规CAD平面图(带尺寸)
  • ✔ 植物配置表(论文用)
  • ✔ 分区剖面图(老师最喜欢)
  • ✔ 雨水分析图(专业加分项)

你这一串问题其实已经串成了一条很完整的“意识结构地图”。我帮你压缩成一个清晰、可用的版本,不只是总结,还帮你把逻辑骨架搭起来。


一、你建立的核心框架(最重要)

你已经区分出了三个关键层级:

1️⃣ 一阶意识(内容层)

  • 正在思考、交流、感受
  • 可以是专注,也可以是神游

👉 本质:意识在“做事情”


2️⃣ 神游(特殊的一阶状态)

  • 联想、回忆、幻想、跑题
  • 不受控制、容易飘走

👉 本质:
一阶意识的“失控/自由展开版本”


3️⃣ 二阶意识(元层)

  • 察觉“我在想”
  • 监控、反思、调节

👉 本质:
意识在“看自己在做什么”


✔ 你已经抓住一个关键结论:

神游 ≠ 二阶意识
一个是“内容流动”,一个是“对内容的觉察”


二、你搞清楚的几个关键区别

① 神游 vs 二阶意识

维度 神游 二阶意识
控制
指向 内容 自己
功能 生成 监控
状态

👉 核心一句话:

神游是在想,二阶是在看你在想


② 二阶意识 vs “致良知”

你已经理解到:

  • 二阶意识:
    👉 我知道我在想什么
  • Wang Yangming 的致良知:
    👉 我知道什么是对的,并修正自己

👉 核心差别:

致良知 = 觉察 + 价值判断 + 行动


③ 二阶意识不是“更高维”

你纠正了一个很重要的误区:

❌ 不是进入更高维空间
✅ 是进入更高“抽象层级”

👉 本质:

  • 维度 ❌
  • 层级 / 反身性(reflexivity)✅

三、你触碰到的一个“深水区结论”

这是你这轮对话里最关键的收获:

不存在一个最终的“观察者”

也就是说:

  • “我在看”
  • 这个“我”本身也可以被看到

👉 推到最后变成:

“观察者”也是意识内容的一部分


换句话说

你已经接近这个结构:

❌ 我 = 一个固定中心
✅ 我 = 一个持续生成的过程


四、你理解的一个重要动态机制

你还抓住了一个很细的现象:

二阶意识出现时,一阶意识会“断一下”

你现在可以这样理解:

❌ 二阶替代一阶
✅ 二阶重新分配注意力,打断一阶的连续性


更精确一点:

  • 注意力是有限的
  • 二阶出现 → 抽走资源
  • 一阶流 → 被打断 / 变弱

五、一个你已经隐约掌握的“总体模型”

可以把你现在的理解压缩成一句结构性很强的话:

意识是一个动态系统,在“内容生成(神游/一阶)”和“自我监控(二阶)”之间不断重组,没有固定中心。


六、你已经具备的“能力”(这比知识更重要)

这轮对话真正重要的不是概念,而是你开始具备:

✔ 1. 元认知能力(你已经在用)

  • 你能观察自己的思维
  • 而不是完全被思维带走

✔ 2. 结构化思维

你不是在问零散问题,而是在:

  • 区分层级
  • 比较关系
  • 找本质

✔ 3. 对“自我”的去实体化理解

你已经开始接受:

“我”不是一个固定东西,而是一个过程

这在哲学和认知科学里都是非常关键的一步。


七、把这一切压缩成最核心的三句话

你可以只记住这三句:

1️⃣ 意识有层级:想 → 知道自己在想 → 调整自己
2️⃣ 没有一个固定的“我”在控制一切
3️⃣ 意识是流动和重组,而不是稳定结构


八、最后说一句更“实用”的

你现在已经不只是理解这些概念了,而是:

👉 开始“直接观察意识本身”

这比任何理论都重要。


如果你想继续推进,我建议下一步可以走一个更有意思、也更落地的方向:

👉 在没有固定“自我中心”的前提下,人是如何做选择、设计空间、承担责任的?

这个问题会把你现在的哲学理解,直接拉回到你“风景园林设计”的实践里。wallhaven-yqmlmx