## Enlightenment E16 与一个20年的Bug
作者是一位长期使用轻量级Enlightenment E16窗口管理器(最初于1997年发布)的用户,详细描述了他修复一个罕见、存在十多年的bug的经历。在使用Atril处理PDF时,桌面冻结,最终追溯到imlib2字体渲染中的一个缺陷——具体来说,是牛顿算法在截断长窗口标题时的错误实现。
这个bug在将标题拟合到有限空间时导致无限循环,牛顿方法中缺少关键的迭代限制。作者通过限制迭代次数、向下取整以防止除以零以及确保终止来解决了这个问题。
这次经历突出了现代软件与稳定但老化的系统之间的权衡。虽然较新的软件会引入新的bug和供应链漏洞(例如XZ Utils后门),但维护较旧的代码库可以实现直接控制和降低bug率——前提是有专门的维护者。作者提倡自给自足的好处以及像E16这样维护良好、"老旧"软件的稳定性。
## PCBWay 评测 & BurgerDisk 项目更新
最近,PCBWay 提供了赞助来评测他们的服务,用于 BurgerDisk 项目。作者最初犹豫不决,因为重视独立性。 之前曾使用 PCBWay 制作 BurgerDisk 的早期版本,他们接受了赞助,认为该服务对原型制作来说价格实惠——5 片双层 PCB 大约 12 美元。 他们之前切换到 JLCPCB 是因为支付选项,但 PCBWay 现在提供了更方便的替代方案。
虽然 JLCPCB 的自动化 BOM 功能很有用,但作者强调可能会出现错误(例如缺少接地层)。 PCBWay 更手动的方式,在制造前进行审核,感觉更安全,即使速度较慢。
作者通过订购一个全尺寸 SD 卡模块进行了测试,该模块在 AliExpress 上无法找到带有必要电平转换器的版本。 PCBWay 对开源的支持是一个主要吸引力,为 Kicad 设计提供 10% 的项目贡献,并提供“分享 & 销售”平台,方便开源制造。
20 个 SD 模块的成本为 75 美元(每个 3.75 美元),略高于 JLCPCB,但额外的质量控制和社区支持是合理的——PCBWay 大力捐赠给 Kicad 等项目。 总体而言,体验是积极的,尤其欣赏人工审核流程。
## 最佳锻炼时间以优化健康
最新研究表明,最佳锻炼时间并非一成不变,而是应与您的自然生物钟相协调。一项针对40多岁和50多岁成年人的研究发现,“早起者”从早晨锻炼中获益最多,而“夜猫子”则在晚上锻炼时效果更佳。
将锻炼与您的生理类型(您自然的清醒偏好)相匹配,可以改善血压、健身水平、睡眠质量和代谢指标。研究人员认为,这是由于内部时钟对全天激素水平和能量的影响。
专家强调一致性是关键,提倡设定小而可实现的目标。虽然健身房正在适应以提供灵活的时间,但优先进行规律的运动比严格的时间安排更重要。建议结合有氧运动和力量训练,例如靠墙深蹲或平板支撑,以促进整体健康。 进一步的研究仍在进行中,但研究结果支持根据个体的生物节律来调整锻炼计划。
## 依赖冷却时间的问题及上传队列的必要性
最近提出的“依赖冷却时间”——延迟采用新包版本——作为防御供应链攻击的手段正在获得关注,但其根本上存在缺陷。虽然看似有效(大多数攻击在几天内就能被检测到),但冷却时间依赖于首先被他人入侵才能识别恶意发布,本质上是建立在别人的不幸之上。
这种方法成本高昂,需要在多个包管理器和项目中进行广泛配置,而且并非万无一失——很容易通过单独安装来规避。更好的解决方案是集中式的“上传队列”,在新包发布后(但在分发之前)将其保留一段时间,用于自动安全扫描、公开差异审查,甚至可选的beta测试。
这借鉴了Debian成功的系统,将发布与分发分离,消除了搭便车问题。上传队列还能降低泄露发布凭证的影响,并提前通知更新。资金可以来自现有的包索引赞助者,或通过为商业发布提供付费加速审查。最终,像上传队列这样的集体、集中式方法比依赖于个体、被动的冷却时间更安全、更高效、更合乎道德。尤其是在LLM兴起的情况下,markdown文件实际上是可执行代码,这增加了供应链攻击的脆弱性,这一点至关重要。
## Clojure 的持久化向量:总结
Clojure 的持久化向量在诸如追加、更新和查找等操作上提供实际上为 O(1) 的性能,同时保持不可变性——每次修改都会创建一个*新的*向量,而不是改变原始向量。这是通过平衡的有序树实现的,不同于传统的可变数组,后者需要代价高昂的复制。
持久化向量不复制整个数组,而是利用**路径复制**:只有到修改元素的路径上的节点会被复制,从而最大限度地共享不同版本之间的结构。更新涉及复制节点到目标位置并替换值。追加处理三种情况:右侧叶子节点有空间,需要时生成新节点,或根节点溢出(需要新的根节点)。
弹出(删除最后一个元素)以相反的方式反映这些概念,可能删除空节点,甚至在根节点变得冗余时删除根节点。虽然理论上由于树结构为 O(log n),但 Clojure 的向量使用高分支因子(每个节点 32 个子节点),从而形成非常浅的树——使操作“实际上”为常数时间。
这系列博客文章详细介绍了实现细节,未来的文章将涵盖诸如瞬态和尾部优化,以及对分支和查找机制的更深入研究。