Eli Bendersky

12 篇内容

技术文章Eli Bendersky

Rusty thoughts on "Parse, don't validate"

文章围绕 Alexis King 的“Parse, don't validate”模式,讨论它在 Rust 中的具体体现。作者先以读取 CONFIG_DIRS 环境变量为例,说明仅返回 Vec 并在函数内检查非空,会让调用方反复处理本不可能出现的 None,也在不变量变更时埋下风险。接着介绍用 NonEmpty 类型把非空约束编码进类型系统,并展示 uutils/coreutils 的 Pipeline 等真实用法。随后讨论渐进解析与类型精化:rust-analyzer 的 AbsPathBuf、camino::Utf8PathBuf、NonZero 整数,以及 serde/JSON 反序列化如何把字段约束编码到类型。结论是解析应把数据转换为携带不变量的新类型,让后续代码无需重复验证;不足是例子多集中在库与应用层,未深入讨论类型设计成本与性能权衡。

推荐收录,因为文章用 Rust 标准库、uutils、rust-analyzer、serde 等真实代码展示了如何把“非空、绝对路径、非零、枚举取值”等不变量从运行时检查转为类型约束。它适合 Rust 开发者、库设计者和后端工程师阅读,可迁移到 API 边界、配置解析和数据建模中,帮助减少重复验证与 unreachable! 式假设。

技术文章Eli Bendersky

Notes on discrete-time Fourier series and transform

文章系统整理离散时间傅里叶级数(DTFS)与离散时间傅里叶变换(DTFT)的数学基础,面向数字信号处理的理论铺垫。作者从周期离散信号和离散复指数出发,说明仅有 N 个不同复指数,并用正交性推导 DTFS 系数公式。随后以三角波的离散采样为例,计算正弦级数系数,并借助交互式图展示逐项逼近与精确重构。对于非周期有限长信号,文章通过周期延拓、令周期趋于无穷,从 DTFS 过渡到 DTFT 及其逆变换,并指出 DTFT 以 2π 为周期、DTFS 系数是 DTFT 的等间隔采样。附录补充复指数周期性、有限几何级数求和和奇偶分解,但未展开卷积定理等性质,需读者具备傅里叶与复数基础。

推荐收录:文章给出 DTFS 与 DTFT 的完整推导、正交性引理和三角波算例,并明确两者之间的采样关系,可直接作为数字信号处理课程或 DFT 前置知识的长期参考。适合学习信号处理、音频/图像算法或需要补齐傅里叶数学基础的计算机读者。主要风险是内容偏数学、未涉及 DFT 实现与工程取舍,读者需自行结合应用场景。

技术文章Eli Bendersky

How big are factorials?

文章讨论如何估算阶乘 n! 的位数,并给出近似公式:位数 ≈ n log10(n/e) + 2。作者从 Gamma 函数出发,说明它是阶乘在实数上的插值,再利用积分换元和 Laplace 方法推导出 Stirling 近似 n! ≈ √(2πn) (n/e)^n,进而取对数得到位数估计。文章以 52! 为例,估算为 69 位,实际为 68 位,说明近似精度。同时指出该公式在 n 增长时误差仅 2 到 3 位,并讨论了修正项的影响。内容偏重数学推导,适合对算法复杂度分析或组合数学感兴趣的读者,但需要一定微积分基础。

本文以严谨的数学推导解释了一个常用的估算技巧,从 Gamma 函数到 Stirling 近似再到位数公式,层次清晰。适合需要快速估算阶乘规模的研究者或工程师,也适合作为数学与计算交叉领域的教学参考。它展示了如何将连续数学工具(积分、Laplace方法)用于离散计算问题,具有较强的可迁移思维价值。

技术文章Eli Bendersky

Concurrent Servers: Part 8 - Go

本文是并发服务器系列第8篇,聚焦Go语言。作者先实现串行服务器,再展示goroutine每连接一协程的模型,说明其轻量级和M:N调度。为应对计算密集、下游限流和恶意客户端等场景,演示用有缓冲channel做信号量限制并发,以及worker pool模式。文章比较了Go与async/event-driven,指出Go底层已用事件循环,goroutine天然适合高并发。示例代码刻意简化,缺少协议帧和整数溢出等边界处理。提供从简单到受控并发的完整代码路径。

本文是Eli Bendersky并发服务器系列的高质量续篇,直接对比多种并发模型并给出可运行Go代码和量化比较。适合后端、网络编程及对并发设计感兴趣的读者,帮助理解goroutine的资源特征、限流模式和worker pool取舍。文中对何时限制并发及Go异步底层的辨析,可迁移到其他语言和系统设计中;但示例代码为演示简化,需注意边界条件。

技术文章Eli Bendersky

Concurrent Servers: Part 7 - Rust

文章是“Concurrent Servers”系列第7篇,聚焦Rust语言实现并发网络服务器。作者先回顾了顺序服务器基准,然后给出Rust中“一线程一客户端”和固定线程池的实现,说明如何用crossbeam_channel实现多消费者任务队列和背压。随后重点介绍基于tokio的异步事件驱动服务器,对比了同步与异步版本代码,指出Rust将异步核心语法内建、但事件循环交给外部库的设计,并讨论阻塞任务在异步上下文中的问题。文章还实现了带Redis缓存的异步素性测试服务器,展示共享异步连接的克隆式传递以及async/await对复杂回调的简化。最后总结Rust异步编程仍面临函数颜色问题和阻塞/非阻塞分离的挑战,所有代码可在GitHub获取。

推荐收录。该文是知名系列中针对Rust的深入补充,不仅展示代码,还解释了线程池、背压、tokio任务、函数颜色问题等关键概念及其边界,适合想理解Rust并发服务端实践的读者。文中的线程池与异步设计对比、阻塞任务处理方式等可迁移到其他语言或框架,具有长期参考价值。

技术文章Eli Bendersky

Relative velocity and closing speed

本文讲解物理模拟或游戏引擎中计算两个物体接近速度的方法。作者先定义相对速度向量,并分解为连线方向的法向分量和切向分量;再通过向量投影和单位向量,使用点积求得闭合速度这一标量,其符号表示物体是否相互靠近。文章用多个具体示例演示计算过程,包括不同相对位置和速度情况,强调符号规约和瞬时性。最后将闭合速度推广为时间函数,证明其等于相对距离对时间的导数,并指出该公式在二维和三维空间中均适用,但假设物体可视为质点。

推荐收录,因为文章用清晰的向量分析和逐步推导,将闭合速度这一物理概念转化为可直接实现的算法,附有详细示例避免符号错误。适合游戏开发、物理引擎或模拟系统的开发者作为参考,其分解思路和投影方法可迁移至其他涉及方向分量计算的场景。

技术文章Eli Bendersky

Notes on the Fourier Transform

本文从傅里叶级数出发,通过让周期趋于无穷大,逐步推导出傅里叶变换,重点演示了非周期函数如何从离散频率系数过渡到连续频率函数。作者以一个奇三角脉冲为例进行计算,展示变换的复数结果及其幅度和相位,并讨论频率域表示的意义。文章还阐述了傅里叶变换的存在条件(绝对可积)、以及线性、缩放、时移、导数和卷积等关键性质,最后给出卷积定理。内容偏向工程实用,对数学严谨性有所取舍,假设函数在无穷远处趋于零,适合信号处理等领域的入门学习。

推荐收录,因为本文以清晰、有层次的推导讲解了傅里叶变换的核心概念,并提供了可交互的直观演示(文字描述)和具体计算示例。适合计算机专业学生、信号处理或相关领域的工程师作为理解频域分析的基础参考,其从级数到变换的推导思路也具有可迁移的学习价值。

技术文章Eli Bendersky

Dot product: Component vs. Geometric definition

文章从文本解析和向量表示出发,详细阐述了向量点积的两种定义(分量定义和几何定义)为何等价。作者提供了两种证明:一是利用余弦定理的几何证明,从矢量差出发推导分量与几何形式的一致性;二是从几何定义出发,通过标准正交基和向量投影,推导出分量求和形式。附录中还补充了内积空间的基本性质、对称性、线性性和正定性,以及范数的概念。整篇文章结构清晰,证明步骤完整,适合作为理解点积数学本质的参考资料,但边界限于欧几里得空间中的标准点积。

推荐收录,因为文章提供了对点积两种定义的严格等价证明,内容深入且逻辑严密,具有长期参考价值。适合需要巩固线性代数基础的计算机科学学生、研究人员或工程师,可迁移到图形学、机器学习等领域中的向量运算理解。文章不是浅层介绍,而是对核心数学概念的透彻解析。

技术文章Eli Bendersky

Plugins case study: Pluggy

这篇文章以 Pluggy 为案例,系统拆解了 Python 插件系统的关键机制:hook 的定义与实现、基于 setuptools entry points 的自动发现与注册、hook 调用的结果聚合与顺序控制,以及插件与宿主之间的 API 边界。作者还将 Pluggy 映射到“插件基础设施”的通用概念框架中,讨论它适合解决什么问题、提供了哪些额外能力,以及在何种场景下未必值得引入依赖。

推荐收录,因为文章不仅介绍了一个具体库的用法,还把它放进更通用的插件系统设计问题里分析,具有跨项目迁移价值。对于需要设计可扩展架构、理解 Python 插件生态或评估是否自研插件框架的读者,都很有参考意义。

工具笔记Eli Bendersky

Thoughts on starting new projects with LLM agents

这篇文章总结了作者在一个全新 Go 项目中使用 LLM agent 协作开发的实际经验,重点不是“让 AI 代写代码”,而是如何把 agent 纳入可维护、可审查、可迭代的工程流程。作者强调需要先用文档共同设计 API,再按小而可审查的 CL 逐步推进;同时必须保留人工深度 review、持续 refactor 和可靠测试套件,避免把实现与测试都交给 agent 形成自我强化的错误闭环。文章还讨论了为何 Go 特别适合 agent 写作与人类审查,以及这种方式不适合学习全新领域,只适合已经具备判断力的资深工程师用于提效。

推荐收录,因为它提供的是一套可迁移的 LLM 协作开发方法,而不是泛泛的使用感想。文章把设计、代码审查、提交粒度、测试策略和语言可读性串成了完整工作流,对想在真实项目中安全使用 agent 的工程师很有参考价值。

技术文章Eli Bendersky

Notes on Fourier series

这篇笔记系统梳理了傅里叶级数的基本构造:如何通过正交性推导三角傅里叶系数,函数满足何种条件时可以讨论级数收敛,以及偶/奇函数、区间有限但非周期函数的周期延拓如何简化计算。文章还进一步给出了相位形式与复指数形式的等价表达,并用 Hilbert 空间中的内积与投影解释傅里叶展开为何本质上是一次“基底分解”。 正文以一个三角波为例完整演算系数,展示了从定义、推导到实例的闭环,并明确指出该理论与傅里叶变换之间的边界。整体更偏数学基础讲解,但对信号处理、图形学、数值分析以及理解频域表示的读者具有长期参考价值。

推荐收录,因为文章不仅介绍傅里叶级数的公式,还把“系数为什么是投影”这一核心机制讲清楚,并用 Hilbert 空间视角建立了更稳固的理解框架。它对需要理解频域、正交基和函数展开的技术读者具有可迁移价值,尤其适合作为基础理论参考。

技术文章Eli Bendersky

Thoughts on WebAssembly as a stack machine

文章围绕“WebAssembly 是否算堆栈机”展开,作者认为这更多是术语争论:WASM 虽然主要通过栈完成运算,但同时提供了 locals,使其不像纯粹只能靠栈交换操作(如 dup、swap)的语言那样受限。作者用 Forth 中依赖大量 tuck/swap 的写法作对比,说明在复杂数据流下,WASM 通过命名局部变量能显著提升可读性。接着给出一个 add_to_byte 示例,比较折叠写法与线性写法,强调栈只是中间执行模型,程序员无需手工管理所有压栈出栈顺序。文章进一步通过 wasmtime 生成的 x86-64 代码说明,编译器会把重复读取同一 local 优化掉,最终代码与手写 C/汇编几乎一致。作者最后指出,WASM 对 locals 的不可别名性质让重复加载消除更容易成立,但这些结论仍依赖于没有对同一 local 的中途写入这一前提。

推荐收录,因为文章直接给出了 WASM 栈语义、locals 设计和编译后机器码的对应关系,并用真实反汇编证明了“多次读取 local 不会带来性能损失”。适合关注编程语言实现、虚拟机设计和编译优化的读者,具有较强的可迁移分析价值。