Julia Evans

RSS: https://jvns.ca/atom.xml
Julia Evans 的编程博客,用清晰易懂的方式讲解系统、网络、调试与开发工具。

给可充电自行车灯换掉旧电池

<p>你好!最近我给自行车配了车灯。突然想起十年前买过几套可充电的自行车灯,已经很久没用了。我试着给它们充电,但充满电后,只能亮大约5分钟就又熄灭了。</p><p>我对电子设备不太懂,但一直很好奇旧电子产品能不能修好。这次看起来是个很适合的修理项目,因为很可能只需要换个电池就行了。</p><p>于是我就去了当地的酷儿创客空间——我是那里的会员——用焊台试试看!我对电子一窍不通,这篇分享也不提供任何安全建议,因为我对安全也知之甚少。<br><br>我觉得在有社区支持的地方做这类项目挺好的,随时能求助。</p><h3>第一步:拆开外壳</h3><p>这盏车灯外壳像是硅胶材质,我就沿着一条隐约像接缝的地方,随便剪开了硅胶外壳。</p><p>过程中确实把硅胶撕得有点乱,弄得挺脏,不过总算打开了,露出了电路板。</p><p>我不太清楚这些车灯的具体型号,文末附了照片。</p><h3>第二步:拧下螺丝</h3><p>有些部件是用螺丝固定的,我把它们都卸下来,好把电路板取出来。</p><p>我尽量只拆最少的螺丝,怕弄丢或者装不回去。大概把螺丝都放进了一个小袋子里。</p><h3>第三步:取出电路板</h3><p>我把电路板拿了出来,长这样:</p><p>可以看到电池的位置,在RI3的左边、Q2的上方吧。</p><p>电池的样子是这样的:</p><h3>第四步:拆下旧电池</h3><p>我以前从没做过拆焊,就找了看了看,还问了朋友Lee和Lauria的意见。</p><p>最后按照指南和大家的建议,我大致按以下步骤操作:</p><ol> <li>先用吸锡器把大部分焊锡吸掉。</li> <li>等焊锡基本清理干净后,再试着轻轻掰开,让电池脱离焊点。</li> <li>过程中也要注意别让电池过热…</li></ol>
评论点赞收藏3 天前

构建"不可能"的程序(2018)

Julia Evans 介绍她在 Deconstruct 2018 的演讲《Build impossible programs》,主题是她构建 Ruby profiler 的经历。这次演讲偏"软",重点是她过去对做大目标项目的错误假设,以及这些假设为何站不住脚;她之前还有一场更技术向的 profiler 深度讲解。 文章附带视频、手写幻灯片和逐字稿,并提到大会现场分发了 2300 本手工 zine,全部被领走。适合对 Ruby、profiler 实现或技术心态话题感兴趣的读者。
评论点赞收藏12 天前

关于 Django 我最近喜欢的一些特性

Julia Evans 分享使用 Django 构建后端渲染网站的实战体验。她重点介绍了自定义 QuerySet 链式调用的可读性优势,以及 urlize、json_script 等模板过滤器带来的开发便利。 文章对比了前端-heavy 与后端-heavy 架构的选择逻辑,并提及遇到的 Django 过滤语法痛点,适合寻找工程实践参考的开发者。
评论点赞收藏70 天前

运行 SQLite 的一些实战心得与踩坑记录

<p>你好!我最近一直在做一个Django网站,决定用SQLite 作为数据库。 当我刚开始用SQLite作为网站数据库时,我读到一个 博客文章中提到在生产环境中使用SQLite完全没问题 网站很小,我觉得完全没问题,但我没完全欣赏 SQLite仍然是数据库,数据库很复杂,我不清楚 很多关于数据库操作的内容。</p><p>以下是我最近学到的一些关于运行SQLite的小知识。就是这样 这是我用SQLite做的第四个网站,我觉得这个更难,因为 借助Django ORM的强大功能,我让数据库做的工作量比 我之前没有Django。</p><p>我一开始像所有博客文章说的那样打开了WAL模式,抱着侥幸心理。</p><p>ANALYZE显然很重要</p><p>今天我在运行一个查询(使用对于 全文搜索)在一个有4000行的表格上,整个过程仅用了5秒。那似乎 我觉得错了:电脑很快!</p><p>结果我得做的是逃跑! 问题查询立刻从5秒变成了大约0.05秒 (或者是其他小到我不想多查的数字)。 我仍然不清楚查询计划到底哪里出了问题, 但我最好的猜测是,那可能是某种东西。</p><p>ANALYZE生成“统计数据”(我猜是关于每个表格的行数?还有其他信息?) 这样查询规划师才能做出更好的选择。</p><p>也许有一天我会学会读查询计划。</p><p>清理数据库很棘手</p><p>偶尔我会遇到不小心放一堆排的情况 在我的数据库里,我不想在那里(比如完成的任务来自),…</p>
评论点赞收藏74 天前

让工作被看见:写一份“夸耀文档”

绩效评估常因记忆偏差导致贡献被低估。作者建议维护一份“夸耀文档”(Brag Document),实时记录项目成果、技术债务清理及导师工作等“隐形贡献”,并附详细模板。 这不仅是向上管理的工具,更是理清职业主线、辅助晋升谈判及帮助新经理快速了解你的有效手段。
评论点赞收藏80 天前

用 NFS 将 Git 提交记录挂载为文件夹

Julia Evans 将她对 Git 工作原理的好奇做成了一款实验性工具:每个 Git 提交都可以像普通文件夹一样被浏览和搜索。受 FUSE 在 Mac 上安装越来越困难的推动,她用 Go 实现了同时支持 NFS 和 FUSE 的 git-commit-folders。 文章记录了 9 个真实工程问题:为什么放弃 WebDav(不支持符号链接)、如何用适配器模式避免三种文件系统接口的代码重复、如何用哈希前缀组织百万级 commit 避免启动卡顿、inode 编号为 0 导致 find 误报循环、NFS stale file handle 的缓存溢出困境等。 每个问题都有调试过程和决策思路。工具本身可能还不够成熟,但文章通过亲身实践生动阐释了「每个 commit 就是一个目录快照」这一 Git 核心概念,兼具教育意义和工程参考价值。
评论点赞收藏134 天前

告别 Tailwind,重新学习组织我的 CSS

Julia Evans 以亲身经历讲述从 Tailwind 迁移回语义化 HTML + 原生 CSS 的过程与收获。作为知名开发者教育者,她坦诚 8 年前因不会组织 CSS 而拥抱 Tailwind,如今通过实际项目摸索出更清晰的 CSS 结构思路。 这不是技术布道,而是一篇有真实困惑、具体迁移步骤和个人审美的踩坑记录。对前端开发者来说,既提供了另一种 CSS 组织方式的实践经验,也引发了"工具 vs 原理"的有趣讨论——在 Tailwind 已成为主流选择的当下,反向迁移的理由和方法本身就是很好的话题入口。
评论点赞收藏138 天前

CSS 配色方案链接合集

<p>前段时间,我决定不再为新项目使用 Tailwind,而是改用纯 CSS 来编写。不过,我特别想念 Tailwind 的配色方案(这里以 CSS 形式呈现)。<br><br>如果我想用浅蓝色,只需使用 blue-100;如果不喜欢,也可以试试 blue-200 或 blue-50。我对色彩不太在行,所以能拥有一个由比我更擅长色彩设计的人精心构思的、合理的配色方案,对我来说意义重大。<br><br>不过,我也对那些 Tailwind 的配色有点腻了,所以…</p>
评论点赞收藏149 天前

在浏览器中测试 Vue 组件

<p>你好!我在这里的一个长期项目,就是想办法在不使用 Node 或任何其他服务器端 JavaScript 运行时的情况下编写前端 JavaScript。在我的前端 JavaScript 项目中,我经常遇到的一个问题就是不知道该如何为它们编写测试。<br><br>我过去曾尝试过使用 Playwright,但每次都要启动新的浏览器进程,感觉既慢又笨拙,而且还需要一些 Node 代码来协调测试流程。结果就是我几乎不会去测试我的前端代码,这让我觉得很不好。</p>
评论点赞收藏151 天前

为 tcpdump 和 dig 手册页添加实用示例

知名技术博主 Julia Evans 亲自动手,为 tcpdump 和 dig 两个常用命令行工具的手册页(man pages)添加了入门示例。她的核心理念是:手册页里的示例比长篇大论的说明文档有用得多。 这次她为 dig 手册新增了示例页,并改进了 tcpdump 手册已有的示例。目标是覆盖最基础的用法,让不常使用这些工具的人也能快速上手。 这是一篇简短但来自真实作者、有实际产出的技术笔记,有人味、有动手记录,没有空话套话。
评论点赞收藏204 天前

关于优化 man 手册的一些思考

作者 Julia Evans 从去年参与 Git man 页面维护的真实经验出发,反思 man 手册的可用性问题。她为 tcpdump、git、dig 等工具写过大量速查表,原因是这些工具的主要文档——man 手册——常常难以快速定位所需信息。 由此提出一个具体又有趣的问题:能不能在 man 手册里直接内置一份高质量的速查表,让手册本身更好用?文章篇幅虽短,但来自真实的一手使用和贡献经历,视角独特,有明确的讨论入口,适合开发者社区延伸交流。
评论点赞收藏224 天前

Git 中 HEAD 的工作原理

Julia Evans 在 Mastodon 发起投票发现,仅 10% 的人对 Git HEAD 完全自信,39% 不太确定、15% 完全没概念。她原本以为 HEAD 很简单,但深入聊下来才意识到 HEAD 实际上包含了几个紧密相关但容易混淆的概念:.git/HEAD 文件(存分支名或 commit ID)、git show HEAD 等命令中的"修订参数"、以及各种 Git 输出中的 HEAD(detached HEAD 状态、git log 里的 (HEAD -> main)、合并冲突标记中的 <<<<<<< HEAD)。 文章逐一拆解了每种场景下 HEAD 的实际含义和解析方式,还点出 Git 术语不一致的问题——有"detached HEAD"却从不提"attached HEAD",用户很难自己把"on branch main"和"HEAD detached"关联起来。 基于真实用户数据和个人踩坑经验,既讲清了原理,也给出了可操作的避坑建议。
评论点赞收藏227 天前

开始使用 Django 的一些笔记

知名开发者 Julia Evans 在个人博客分享自己从零学习 Django 框架的真实一手体验。她以"老牌无聊技术"为切入点,讲述了用 Django 实际搭建网站过程中遇到的典型问题、解决思路以及对框架设计理念的切身感受。 文章延续作者一贯的个人化、接地气风格——没有营销包装、没有趋势空谈,全是具体的踩坑记录和实用经验。对于想了解 Django 真实开发体验、或对成熟技术框架感兴趣的读者,这是一篇能直接获得参考价值的实战笔记。
评论点赞收藏246 天前

Ninja:一个简单易用的构建工具(2020)

Julia Evans 分享用 Ninja 构建工具的真实体验:一个极简(只有 rule 和 build 两条核心语法)的增量构建系统,解决了她的小型项目(如 SVG 转 PDF)每次等 90 秒全量转换的痛点。 她比了复杂的 Bazel 和晦涩的 Make,展示如何用 Python 脚本自动生成.ninja 文件、用自己熟悉的语言管理构建逻辑。还提到 Meson 也以 Ninja 为后端。 全文是个人踩坑记录加可复用的实战代码,语气亲切,不装不吹,适合想要轻量构建方案的程序员。
评论点赞收藏252 天前

如何提出好问题

本文来自知名技术博主 Julia Evans,分享了她在软件工程领域多年积累的提问技巧。核心观点:提问不是示弱,而是一项值得刻意练习的技能。 作者提出了多种实用方法——先陈述自己已有的理解再确认是否正确、把模糊问题拆解为具体事实性问题、勇于承认听不懂的术语、根据不同对象和时间选择提问策略。 值得一提的是,作者对经典文章《How to Ask Questions the Smart Way》提出了温和但有力的批评,认为它给提问者施加了过多负担。 文章还有独特视角:好的提问本身就是对社区的贡献,而回答别人的问题也是巩固自己知识的好方法。全文有大量真实场景例子,人味十足,是一篇既有温度又有干货的技术沟通指南。
评论点赞收藏258 天前

Git 的数据模型(及其他文档更新)

Julia Evans 记录了她主动花时间改进 Git 官方文档的经历——不同于以往写博客或 zine 来吐槽文档问题,这次她直接向 Git 官方仓库提交了修改。 她与 Marie 合作,围绕 Git 的数据模型对官方文档做了实质改进。文章从亲历者视角展现了参与大型开源项目文档维护的真实过程:如何理解 Git 内部数据模型、发现文档缺失与表述问题、并推动改进落地。 不仅有关于 Git 数据模型的技术解析,还包含了开源贡献的幕后故事和协作经验,适合对 Git 原理或开源贡献感兴趣的读者。
评论点赞收藏265 天前

最受欢迎的 Git 配置选项

作者在 Mastodon 上发起调查,询问大家最爱的 Git 配置选项,收到大量回复后按人气整理了这份清单:最热门的是 pull.ff only 和 pull.rebase true(避免意外创建 merge commit),其次是 merge.conflictstyle zdiff3(让合并冲突更可读)、rebase.autosquash true(自动合并 fixup 提交)、rebase.autostash true(rebase 前自动 stash)、push.autoSetupRemote true(自动跟踪远程分支)等。 每个选项都有实际场景解释和代码对比示例,比如 diff3 冲突格式增加了原始版本信息、diff.algorithm histogram 让函数重排后的 diff 更清晰。 作者也坦诚分享了自己的体验:曾用 delta 但搞坏了配色方案、对 autostash 有点害怕、最后自己加上了 histogram、branch.sort 和 zdiff3 三条新配置。 最后附如何设置、以及所有建议的完整列表,对 Git 用户来说是一份极为实用的社区配置参考。
评论点赞收藏308 天前

在终端里按下一个键时,实际发生了什么?(2022)

终端里每按一个键,实际发送了什么字节?作者用 xterm.js 搭建实验环境,亲自抓包记录了一次按键到字节流的完整映射——从普通字母('l'→0x6c)到 Ctrl+C(0x03)、Ctrl+D(0x04),从方向键到 Home/End/Delete 的转义序列,再到 Alt+字母的编码规则。 文章还演示了 nano 编辑器的 ANSI 转义序列传输过程,解释了 ASCII 控制字符的规律(Ctrl+A=0x01,逐字母递增)、Alt 与 Escape 的关系、ioctl 调整终端窗口大小的系统调用,以及为何这套设计虽显"奇怪"却因兼容性沿用至今。 一篇有实验、有数据、有人味的底层终端原理探秘。
评论点赞收藏319 天前

关于 Nix Flakes 的一些笔记

Nix Flakes 真实踩坑记录。作者用了九个月 Nix 但一直回避 Flakes,最终决定一试,记录了大量具体问题:Git 未追踪文件导致 nix 完全忽略 flake.nix、相对路径依赖让 flake.lock 坏掉只能手动删除、构建钩子报错需杀掉 nix-daemon 进程、zulu 包本身损坏等。 用 Docker 类比帮助理解 Flakes(自包含、可共享开发环境),但指出差异巨大。最终用 buildEnv 做了个统一 PATH 目录的笨办法,并附上完整 nix-symlink 脚本。 全文亮点是全程坦诚自己"仍然不太懂 Flakes",分享的都是真实碰壁经历和实用对策,不是照本宣科的教程。适合真正在用 Nix、想尝试 Flakes 的开发者,讨论价值高。
评论点赞收藏341 天前

Lima:在 Mac 上运行 Linux 虚拟机的便捷选择

Julia Evans 以亲身经历推荐在 Mac 上通过 Lima 快速运行 Linux 虚拟机:只需三步(安装 → limactl start default → lima 进入 shell),默认挂载 home 目录为只读并自动下载 Ubuntu 镜像。 作者坦诚记录了实际使用中遇到的两个坑——子目录无法单独设为可读写、tun/tap 网络设备在 Lima 中表现异常且 ping 出现诡异的时间回退警告——并尝试了 OrbStack 作为替代发现网络正常。 作者也给出了选择 VM 而非容器的理由(生产环境是 VM、涉及 Linux namespace、Mac 上跑容器仍需要 VM)。本文不是通稿也不是教程,而是真实用户的选型参考和踩坑记录,适合在 Mac 上需要 Linux 环境的开发者阅读。
评论点赞收藏349 天前

从 Vim 切换到 Helix 的使用笔记

知名程序员 Julia Evans 分享了她从 Vim 切换到 Helix 编辑器 3 个月的真实体会。核心动机:Helix 内置了开箱即用的 LSP(语言服务器协议)支持,无需像 Vim 那样费劲配置就能实现「跳转到定义」等现代 IDE 功能。 她提到自己很喜欢 Fish shell 那种「不用折腾配置」的体验,而 Helix 给了她同样的感受。文章以个人日志形式记录了切换过程中的发现、习惯变化和真实感受,有具体的操作对比和踩坑细节,不是泛泛之谈。 Julia 一贯的风格是真诚、接地气、有个人立场,这让文章读起来像朋友之间的技术推荐,而非教程或软文。
评论点赞收藏355 天前

Firecracker:不到一秒启动一台虚拟机(2021)

Julia Evans因制作一款给每个玩家分配独立虚拟机的CLI教学游戏,发现QEMU启动需20秒、DigitalOcean实例需1分钟,用户体验不可接受。 她尝试了AWS开源的Firecracker——一个号称125ms内启动Linux用户空间的轻量虚拟机管理器,并记录了完整的DIY实操过程。文章包含可直接运行的hello world shell脚本、将VM挂到Docker网桥的配置方法、用Docker容器构建ext4文件系统镜像的步骤、用Go SDK编写HTTP管理服务启动/停止VM的代码思路,以及DigitalOcean支持嵌套虚拟化的实测结论。 作者保持了一贯的透明诚实风格:坦承自己花了一天理解Linux网桥、对Firecracker为何快于QEMU仍有疑问、代码目前还"非常混乱且满是bug"。 全文信息密度高、可复现性强,是有真实项目背景、有个人经验、有明确实用价值的技术好文。
评论点赞收藏415 天前

登录芦苇

登录后关注作者、收藏内容和参与讨论。