基于时间的日志记录胜过基于计数的日志记录
软件工程中的日志记录策略至关重要。本文作者论证了在处理大量事件时,基于时间的日志记录(例如,每 X 秒记录一次)优于基于计数的日志记录(例如,每 X 条消息记录一次)。基于计数的日志记录在不同负载下日志频率波动大,可能导致日志过少或过多。而基于时间的日志记录能保持稳定的日志速率,避免因日志过多而降低系统性能或因日志过少而影响可观察性。作者通过伪代码示例和利弊分析,有力地支持了其观点,为高效的日志记录策略提供了新的思路。
软件工程中的日志记录策略至关重要。本文作者论证了在处理大量事件时,基于时间的日志记录(例如,每 X 秒记录一次)优于基于计数的日志记录(例如,每 X 条消息记录一次)。基于计数的日志记录在不同负载下日志频率波动大,可能导致日志过少或过多。而基于时间的日志记录能保持稳定的日志速率,避免因日志过多而降低系统性能或因日志过少而影响可观察性。作者通过伪代码示例和利弊分析,有力地支持了其观点,为高效的日志记录策略提供了新的思路。
connmap是一个X11桌面小工具,可以在地图上显示当前网络连接的地理位置。它支持Wayland,并且易于安装和使用。只需克隆仓库、安装依赖项并运行可执行文件即可。用户可以自定义地图大小、位置和更新间隔。目前仅支持IPv4,并在i3wm环境下测试通过。
“动态规划”一词在算法学习中常常令人困惑。“动态”并非指其变化性,而是指“编程”的计划性含义,源于上世纪50年代工程师规划建筑项目的“流程安排”。动态规划在计算机科学中指解决问题的子步骤顺序规划,例如计算斐波那契数列,其“程序”即为按依赖顺序计算fib(2)到fib(10)的步骤。这可以自顶向下或自底向上规划,最终计划一致,皆为动态规划。Richard Bellman创造此名词时,为了避开国防部长对“数学研究”的厌恶,巧妙地选择了“动态编程”,因“动态”一词无法用于贬义。
GitHub代码审查中,批量应用代码建议功能存在诸多限制,例如:建议需有代码修改、不能应用于已关闭的Pull Request、部分修改集、单行多建议、已应用或已解决的建议、待审核的建议、多行注释以及已排队合并的Pull Request等。此外,还可能出现一些暂时无法应用建议的情况。
GitHub代码审查中,批量应用代码建议功能存在诸多限制:无法应用于无代码更改的建议、已关闭的Pull Request、部分代码变更视图、单行多建议、已删除行、已应用或已解决的建议、待审阅建议、多行注释以及正在合并的Pull Request。此外,还存在一些未知原因导致的“此刻无法执行该操作”的错误。
一位在神经AI领域攻读博士学位的计算机工程师,用了9年Arch Linux后,转向了新款MacBook Pro。文中详细描述了他如何在一天内配置好新机器,尽可能复现原有的工作流程。他使用了Nix作为包管理器,AeroSpace窗口管理器和Raycast启动器,并保留了zsh shell和Zed编辑器等熟悉的工具。虽然macOS的包管理不如Arch Linux方便,但他为了获得更稳定的硬件和更好的用户体验,最终选择了妥协。
作者在构建一个复杂的数据库时,尝试使用io_uring和双WAL设计来提高性能。传统WAL写日志再应用的方式限制了性能,作者通过分离“写入意图”和“写入完成”到两个WAL,并使用io_uring异步I/O,实现了10倍的吞吐量提升。这种设计将意图异步写入,完成后再写入完成记录,恢复时只应用既有“意图”也有“完成”记录的操作,保证数据一致性。作者使用Zig语言和Poro项目(一个实验性的键值数据库)来验证了这一方法的可行性,并总结了硬件并行性、批量操作和灵活的一致性模型的重要性。
安全研究人员发布了Trigon内核漏洞利用的升级版,扩展了对A9(X)和A11设备的支持。文章详细介绍了克服KTRR限制和在不同设备上寻找内核基址的挑战性技术。新方法利用了IORVBAR寄存器和协处理器(特别是Always-On Processor),通过操纵协处理器固件,实现了对内核的任意读写,最终绕过了内核保护机制,成功实现了对A9和A11设备的内核利用。
Go 1.24发布后,一个数据处理服务出现了意料之外的内存占用增加。调查发现,Go运行时一个内存分配函数的重构意外删除了一个优化,导致大型对象分配时不必要地清零内存,从而增加了驻留集大小(RSS)。虽然Go运行时内部指标没有变化,但系统级指标显示内存占用显著增加。通过与Go社区合作,最终定位并修复了这个问题。更令人惊喜的是,Go 1.24的“瑞士表”新特性在高流量环境下显著降低了内存使用,抵消了之前的内存回归,甚至带来了额外的内存节省。
Rust 凭借其借用检查器在速度和安全性之间取得了平衡,然而,这篇文章认为,借用检查器给 Rust 带来了严重的可用性问题。作者通过多个例子论证了借用检查器过于保守,常常拒绝符合所有权规则的代码,导致开发者需要进行不必要的重构。文章还探讨了借用检查器在 Rust 安全性中的作用被夸大,并比较了 Rust 与其他具有垃圾收集机制的语言(如 Python 和 Julia)的优缺点。作者认为,虽然借用检查器在多线程编程中有一定的优势,但在单线程场景下,其带来的额外工作通常超过其收益,Rust 的其他优秀特性,例如强大的类型系统和丰富的标准库,才是其真正值得称道的方面。
作者在开发 Rust FAT 驱动程序时遇到了 specialization 难题,该特性目前在稳定版 Rust 中不可用。尝试了宏和泛型枚举等方法都失败后,作者最终巧妙地利用函数指针实现了类似 specialization 的效果。虽然这种方法存在一定的性能和内存开销,但对于特定场景下,它提供了一种可行的替代方案,避免了对不稳定特性的依赖。作者最后呼吁,稳定版 specialization 的推出至关重要,因为它将提供更高效、更简洁的解决方案。
作者在使用大型语言模型(LLM)代理自动化逆向工程任务时,发现现有命令行工具和API的设计不足以满足LLM的需求,特别是当受限于本地模型的小上下文窗口时。例如,API需要在提供足够信息减少工具调用和避免填充上下文窗口之间取得平衡。作者通过改进文档字符串、添加辅助函数和预提交钩子等方法来解决这个问题,并提出了一些改进建议,例如创建缓存输出、结构化输出并告知剩余行数的包装器,以及提供当前目录信息的shell钩子。最终,作者认为需要为LLM增强现有的CLI工具,甚至可能需要一整套LLM增强的CLI工具或自定义LLM shell,以改善LLM代理的用户体验。
BorgBackup(简称Borg)是一款开源的去重备份工具,它结合了压缩和经过身份验证的加密功能,提供高效的空间利用率和强大的安全性。支持lz4、zstd、zlib、lzma等多种压缩算法,并可在Linux、macOS、BSD等多种平台上轻松安装。Borg拥有庞大的活跃社区支持,并提供可挂载的备份功能,方便用户快速访问备份数据。记住,定期检查备份至关重要!
数据备份的重要性常常被低估。本文作者以自身经验出发,讲述了各种数据丢失场景,强调备份并非简单的复制,而是需要周全的计划和策略。文章探讨了全盘备份与单个文件备份的优缺点,以及快照技术在确保数据一致性中的关键作用。作者还分享了其偏向于集中式备份服务器的架构理念以及对高效备份系统的指导原则,并预告后续文章将详细介绍其基于FreeBSD的备份服务器搭建过程。
Zig 语言没有内置接口的概念,但这并不意味着它不支持多态性。本文介绍了一种在 Zig 中实现动态分发的多态性的方法,通过使用 vtable 接口,将接口和实现清晰地分离,无需修改实现类型,即可实现动态分发。这种方法利用函数指针构建 vtable,并通过 `implBy` 函数连接实现和接口,最终实现了像传统面向对象语言中接口一样的功能,支持将不同实现存储在数组或映射中。虽然存在一些样板代码,但这种方法的优点是简洁、灵活且可重用,且对实现类型的影响极小。
作者用四天时间,借助AI编程助手Claude,创造了一个名为Protocollie的软件。这并非依靠精湛的编程技巧,而是通过四个文档(架构概述、技术考量、工作流程、故事分解)来引导AI,将模糊的想法转化为可运行的代码。作者将此过程比作“往墙上扔意大利面”,强调实验性而非预先计划,展现了AI时代编程方式的变革,程序员角色的转变以及对未来不确定性的接纳。
Linux Secure Boot 系统依赖于一个即将在9月过期的微软密钥。此密钥用于签名引导Linux内核的第一阶段UEFI引导加载程序(shim)。虽然微软自2023年提供了新的密钥,但许多系统可能尚未安装,甚至可能需要硬件厂商更新固件。这将给Linux发行版和用户带来额外的工作。一些系统可能需要通过LVFS和fwupd更新固件,但这并非总是有效,一些老旧的BIOS可能存在空间不足的问题,甚至需要重置BIOS才能成功更新。厂商提供的更新也可能存在问题,例如某些厂商丢失了平台密钥。最终,禁用Secure Boot可能是某些情况下唯一的选择。
Piramidal公司招聘一名软件工程师,负责其神经数据旗舰平台的基础设施和后端系统建设及维护。该职位需要与机器学习工程师紧密合作,迭代应用最新的模型,并与产品团队及内部客户合作,解决问题,实施有效方案。理想候选人拥有5年以上产品驱动型公司工程经验,精通Python和其他后端语言,熟悉容器化和编排技术(例如Kubernetes),熟练掌握关系型数据库(例如Postgres/MySQL)和Web技术(例如JavaScript, React)。公司致力于利用科技最大限度地提升人类潜能,支持认知自由。
一位作者分享了他拒绝使用大型语言模型(LLM)进行写作的原因。他认为,过度依赖LLM会降低写作原创性,削弱独立思考能力,并使写作过程缺乏个性化的深度思考和联想。他引用了MIT和英国的研究,佐证了LLM可能导致认知惰性和降低学习动机。此外,作者认为LLM生成的文本缺乏个性和情感,无法捕捉阅读过程中产生的独特联想和顿悟,这与他所追求的深度阅读体验相悖。他最终选择坚持独立写作,认为只有这样才能保持写作的真实性和原创性。
这款开源的 Firefox 桌面扩展程序可以阻止 YouTube 的自动翻译功能。它可以保留视频标题、音频轨道和描述的原始语言,并只显示所选语言的真实字幕(忽略自动生成的字幕)。该扩展程序完全免费,但用户可以选择通过 Ko-fi 进行捐赠以支持开发。Chrome 浏览器用户也可以在 Chrome 网上应用店找到它。
Ilograph提供两种团队协作绘图订阅方案:Team和Team+。Team方案最多支持5位编辑,最多20位查看者,提供无限团队图表和图表历史记录以及自定义图标功能;Team+方案则支持6位及以上编辑,查看者数量不限,并额外提供单点登录、图表导出、API访问和可分享链接等高级功能。选择哪个方案取决于团队规模和对高级功能的需求。
传统观点认为多边形数量决定渲染性能,但现代渲染更受微小三角形的影响。文章指出,微小三角形(小于10x10像素)的渲染成本呈指数级增长,因为GPU会计算整个2x2像素块,即使三角形只覆盖其中一个像素。作者建议关注“线框视图密度”,当视图接近实心时,应切换到更低细节等级的模型,或直接使用单个LOD和远处遮挡物(imposter)。Epic的Nanite技术通过计算着色器和屏幕空间着色器来解决这个问题,将微小三角形的渲染成本降到最低。
你是否好奇为什么一个14KB的网页加载速度远快于15KB的网页?这并非偶然,而是TCP慢启动算法的结果。文章解释了TCP协议如何可靠地传输数据,以及慢启动算法如何通过逐步增加发送的数据包数量来优化网络带宽利用率。尤其在高延迟网络环境下,例如卫星互联网,减少网页大小至关重要,因为每个往返时间的延迟都可能导致显著的加载时间增加。文章建议开发者将网页大小控制在14KB以内,或者至少确保前14KB数据包含关键内容,以提升用户体验。
本文讲述了一个团队如何通过恢复被破坏的任天堂Wii U工厂测试SD卡数据,意外发现并利用Boot1漏洞的故事。团队成员WiiCurious收集了大量被损坏的SD卡,DeadlyFoez通过精湛的焊接技术修复并读取了其中的数据。逆向工程师Rairii在这些数据中发现了Boot1漏洞,并开发了名为“paid the beak”的exploit,可以修复大多数Wii U软件砖。同时,团队成员还开发了利用Raspberry Pi Pico和PICAXE 08M2模拟工厂专用工具的方案,以触发该漏洞。该exploit为修复Wii U砖提供了更便捷的方法,无需拆机焊接。
一位资深Nix用户尝试Guix系统,并分享了他的体验。Guix作为GNU系统,对软件自由非常重视,这导致需要使用nonguix来获得对现代硬件的支持。文章重点比较了Guix和Nix在架构上的差异:Nix采用模块化设计,允许灵活组合不同版本的软件包;而Guix则将所有软件包集成到一个固定的配置文件中,更新版本需要重新构建整个系统。作者还对比了两者的文档、性能和初始化系统等方面,发现Guix的文档更好,但性能较慢,并使用了Shepherd而不是systemd。总体而言,Guix是一个引人入胜的替代方案,但上手难度较大,需要一定的Scheme语言基础。
现代AI计算的核心是矩阵乘法,而其速度直接影响模型能力。现有硬件加速器(如NVIDIA的Tensor Core)虽然高效,但缺乏灵活性。本文介绍了一种名为CubeCL的新引擎,它通过分层抽象(Tile、Stage、Global、Batch Matmul)以及多种算法(Simple,Double Buffering,Ordered等),实现了跨平台优化的矩阵乘法内核生成。CubeCL巧妙地利用GPU架构特性,例如平面同步执行和内存合并访问,并通过双缓冲等技术来隐藏内存延迟,在各种GPU(包括NVIDIA、AMD和Apple Silicon)上都取得了显著的性能提升,甚至在某些情况下超越了cuBLAS和CUTLASS。
Bitnami 公共镜像库将于 2025 年 8 月 28 日进行重大调整。基于 Debian 的镜像将停止生成,并迁移至 Bitnami 遗留库。免费镜像将精简为更安全、更硬化的版本,仅提供最新标签,位于 https://hub.docker.com/u/bitnamisecure。生产环境镜像和 Helm chart 将迁移至 Bitnami Secure Images,提供强化操作系统、持续安全更新(SLSA 级别 3)、CVE 透明度、SBOM 和合规工件以及企业支持等优势。所有现有镜像将迁移至 Bitnami 遗留库 (docker.io/bitnamilegacy),不再提供更新和支持。用户需更新 CI/CD 流程,并考虑订阅 Bitnami Secure Images 以获得持续支持。
ccusage是一个命令行工具,可以快速分析你的Claude代码令牌使用情况和成本,支持从本地JSONL文件读取数据。它提供了多种报告模式,包括每日、每月、会话和5小时区块报告,并支持实时监控、日期过滤、自定义路径、JSON输出等功能。此外,ccusage还具有极小的包大小,无需安装即可运行,并支持多种模型和成本细分。
OrioleDB 是一个 PostgreSQL 存储扩展,它作为默认 Heap 存储引擎的替代品,显著提升了 PostgreSQL 的性能。通过重新设计 MVCC、页面缓存和检查点等核心组件,OrioleDB 改善了事务型工作负载的吞吐量和可预测性,同时保持了 PostgreSQL 的用户体验。最新的版本增加了对非 B 树索引类型、表空间和 fillfactor 的支持,并对查询和索引性能进行了优化。基准测试结果显示,与 PostgreSQL 默认的 Heap 存储引擎相比,OrioleDB 在 TPC-C 和 sysbench 工作负载下,吞吐量有了显著提升,例如在 go-tpc 测试中,tpmC 提升了数倍。
本文探讨了C++中静态变量初始化的开销问题。通常,块作用域静态变量的初始化会引入运行时开销,例如使用`__cxa_guard_acquire`进行同步。作者提出了一种利用UNIX链接器特性,通过预先在专用section中分配空间,并在全局初始化阶段完成初始化的优化方案,从而消除运行时开销,使块作用域静态变量的效率与文件作用域静态变量相当。文章详细介绍了实现细节,包括处理inline函数和模板成员带来的section属性冲突,最终实现了零成本优化。