git
把 Git 想成项目的“拍照机”就够了:你先挑好这张照片要包含哪些改动,再按下快门;以后随时可以回到任意一张照片,或者从某张照片开始开一条新分支。 真正需要分清的只有三处:工作目录是你正在修改的文件,暂存区是下一张照片的候选内容,版本库是已经拍好的历史照片。git add 是挑选内容,git commit 才是按下快门。 数据模型 不必先记 blob、tree 这些名字。先跟着一次最普通的...
Oh My Pi 高阶玩家手册
Oh My Pi(omp)不只是一个终端里的 AI 编码助手。用顺手之后,它更像一个可配置、可约束、可编排的本地开发代理:多模型角色路由、子代理编排、Skills/Hooks 扩展体系、MCP 集成、多种 compaction 策略、headless JSON 输出,以及一套跨 Claude Code / Codex / Gemini 配置的兼容发现层。 这篇不是入门教程。安装、登录、第一次...
容斥原理
容斥原理不是一套需要背的数学公式。把它当成一个工程问题就够了:多个规则都会产出同一批对象时,如何只统计一次。 例如,三个上游服务都上报了用户 ID。把三个服务的数量直接相加,会把同时出现于多个服务的用户重复计算。容斥做的事就是: 先把每个来源的数量相加; 把两个来源共同产出的对象减掉; 如果一个对象同时属于三个来源,它被减多了,再加回来。 本文用 LeetCode 3116 说明这个过程...
Rust 工程实践:测试、性能与调试的优先级
课程概览 · 第 21 章 上一篇:Cargo 与依赖:建立可重复的 Rust 开发闭环 类型系统能提前发现一类内存与所有权错误,但业务转移、输入边界、关闭顺序和性能仍需要可复查的证据。本章先给可观察行为矩阵,再用独立任务库展示测试边界,最后建立复现、剖析、对照基准与复测的工作流,不宣称测试通过就代表全部逻辑正确。 图:测试守住可观察行为,调试收窄失败条件,性能结论来自相同...
堆、优先队列与 TopK
堆(heap)解决的不是「把所有元素排好」,而是一个更克制、也更常见的承诺:在持续插入、删除中,始终用很低的代价拿到当前最优元素。最短路每次扩展距离最小的点、事件系统每次取最早到期的任务、流式数据保留最大的 kkk 个数、多路归并选择各路的最小头部,都是同一件事:只维护堆顶,而不维护全局次序。 这使堆成为 BFS 的队列模型、图论 的 Dijkstra/Prim 模型与 排序 的选择模型之间...
单调栈与单调队列
单调栈与单调队列解决的不是「如何排序」,而是「如何让一个元素在恰当的时刻结算」。在线性扫描中,许多元素的答案依赖右侧第一个更大(或更小)元素;许多区间的最值又只关心仍可能胜出的候选。若逐个向右试探,问题很容易退化为 O(n2)O(n^2)O(n2)。单调结构把仍未结算、仍有资格成为答案的下标压缩在一条有序边界上:新元素到来时,它一次性淘汰一批候选;被淘汰者恰好获得答案,或被证明不再可能胜出。...
前缀和与差分
区间问题表面上都在问“这一段的和是多少”或“这一段都加上多少”,但两类操作的重心恰好相反。前缀和把许多次查询共同依赖的历史累积起来,让一次区间查询变成两个边界值的相减;差分把一次覆盖一整段的更新压缩成两个边界事件,最后再统一还原。它们都不是某个题目的技巧,而是把“区间”改写成“边界”的一套坐标语言。 这一章用半开区间 [l, r) 统一一维、二维和可修改结构的叙述:左端属于区间,右端只是边界...
排序算法
引言:排序不是把数字排好看 排序把一个序列重排为满足某个全序或严格弱序的序列。它表面上是“从小到大”,本质上却是在建立一个可利用的顺序结构:有序数组可用二分查找把查找缩到对数级;扫描相邻元素可识别重复、区间和相对次序;按键排序则是数据库、日志、索引与调度系统的公共底座。 选择排序算法时,不能只背一张 O(nlogn)O(n\log n)O(nlogn) 表。数据是否近乎有序、键是否是有限范...
图论
本系列此前多次把「图」当作工具使用:DFS 专篇用遍历求连通分量与拓扑序,BFS 专篇求无权最短路,并查集维护动态连通性。但这些只是图论版图的入口。一旦边带上权重、方向、容量,问题就升级为:加权最短路径怎么求?用什么边把所有点最便宜地连起来?任务间的依赖与冲突如何形式化?这些才是图论的主体。 图论的价值分两层。第一层是建模:把实际问题翻译成「点 + 边 + 边上属性」的语言–城市是点、道路是...
Cargo 与依赖:建立可重复的 Rust 开发闭环
课程概览 · 第 20 章 上一篇:Unsafe:把不安全性封装在最小边界 下一篇:Rust 工程实践:测试、性能与调试的优先级 Cargo 是项目的依赖、构建、测试、文档与发布入口。本章先提供可提前查阅的项目创建与命令速查,再解释工具链、清单、锁文件和构建配置的职责。单包、workspace 和 feature 示例是三个独立项目,不要求读者把课程所有业务模型拼在一起。 ...
GraalVM 使用详解:JIT、Native Image 与多语言运行时
GraalVM 是 Oracle 主导的高性能 JDK 发行版,核心由三部分组成:Graal 编译器(用 Java 编写的 JIT 编译器,可替代 HotSpot 的 C2)、Native Image(AOT 提前编译,将 Java 程序编译为本地可执行文件)、Truffle 多语言框架(支持在同一进程中运行 JavaScript、Python 等语言)。与普通 OpenJDK 相比,Gra...
Maven 使用详解:构建、依赖与多模块管理
Maven 是 Java 生态中最主流的构建与依赖管理工具。它以 POM(Project Object Model)为核心,通过约定优于配置的理念,将编译、测试、打包、部署等流程标准化,同时依托中央仓库解决了依赖分发的难题。本文系统梳理 Maven 的核心概念与日常使用要点。 Maven 解决什么问题 早期 Java 项目依赖管理依赖手工拷贝 jar 包,存在三大痛点: 依赖混乱:第三方库...
Unsafe:把不安全性封装在最小边界
课程概览 · 第 19 章 上一篇:并发与异步:先划清所有权和取消边界 下一篇:Cargo 与依赖:建立可重复的 Rust 开发闭环 unsafe 不会关闭类型、借用或生命周期检查。它允许执行需要额外安全证明的操作,保证的责任因此落到实现者或调用者身上。本章把证明写进最小代码边界,同时区分真实文件写出、FFI 协议演示与不能普通执行的 UB 示意。 图:安全封装要证明并维持...
Spring Boot 配置体系
配置的消费端(@Value、@ConfigurationProperties 怎么用)见常用注解,Environment 在启动流程中的位置见启动原理。本文讲来源端:配置从哪来、谁覆盖谁、绑定规则是什么。代码基于 Spring Boot 4.x——配置体系自 2.4 定型后未再变动,3.x/4.x 通用。 Environment 抽象:一条有序链表 Spring 把所有配置来源统一抽象为 P...
Spring Boot Startup
Spring Boot 的"约定优于配置"由三条主线支撑:SpringApplication 对启动过程的编排、IoC 容器的 Bean 加载、基于条件注解的自动配置。本文以 Spring Boot 4.x(底层为 Spring Framework 7)源码为基准,沿启动顺序把这三条主线讲清楚。4.x 最大的工程变化是模块化拆分,启动主线本身保持不变。Bean 的实际使用...
并发与异步:先划清所有权和取消边界
课程概览 · 第 18 章 上一篇:智能指针:让资源归属可组合 下一篇:Unsafe:把不安全性封装在最小边界 线程可以并行执行计算,异步让任务在等待时交还执行权。两者都应先明确数据归谁、谁能修改、任务如何结束,再决定如何启动。本章先用标准库演示线程边界,再用独立 Tokio 项目区分完成、超时、协作关闭与 abort 取消;不要求与其他章节拼成同一个应用。 图:普通 sp...
asdf-simple-manual
asdf 是多语言版本管理器:一个工具统一管理 Node.js、Python、Ruby、Java 等几十种运行时的版本,替代 nvm、pyenv、rbenv 各装一套的局面。核心机制是垫片(shim):安装版本时 asdf 在 ~/.asdf/shims/ 下为每个可执行文件生成包装脚本,该目录置于 PATH 最前。执行 node 时先进入垫片,垫片解析出当前应使用的版本,再 exec 真正...
智能指针:让资源归属可组合
课程概览 · 第 17 章 上一篇:宏:从声明宏到过程宏的边界 下一篇:并发与异步:先划清所有权和取消边界 当任务链需要递归包含自身、任务列表需要被多个视图持有时,关键不是找一个“更方便的引用”,而是决定数据归谁、谁能修改、检查发生在何时。本章的示例彼此独立,只声明当前操作需要的字段,不复刻完整任务领域模型。 图:所有权共享与内部可变性是独立能力;跨线程还必须满足内部类型的...
cmake-simple-manual
CMake 不是编译器,也不直接构建代码–它是构建系统的生成器:你用声明式语法描述项目结构(有哪些目标、依赖什么、怎么编译),CMake 据此生成对应构建系统(Makefile、Ninja、VS 工程等)的文件。这层间接性让同一份 CMakeLists.txt 能跨平台、跨编译器工作。 本文从零开始搭建一个 C++ 项目,逐步引入 CMake 的核心概念,最终覆盖目标导向构建、依赖管理、安装...
宏:从声明宏到过程宏的边界
课程概览 · 第 16 章 上一篇:属性:让编译配置、诊断与文档可审查 下一篇:智能指针:让资源归属可组合 宏接收 token 并生成 Rust 代码,适合函数签名不能表达的语法重复。展开之后仍是普通 Rust,仍须通过类型、借用与可见性检查。本章把求值次数、匹配范围与依赖合同放到调用点旁边,让宏保持薄而透明。 前置知识与学习目标 需要理解函数、trait、块表达式与第 15 章的属性...




















