purplesyringa

RSS: https://purplesyringa.moe/blog/feed.rss
Purplesyringa 的个人博客,关于逆向工程和底层编程。

别自称手工程序员

一位程序员质疑当前社区将手工写代码贬为"手工编程"、把AI辅助编程捧为"工程师"的做法。他引用2021年Hillel Wayne的访谈,指出当年人们把注重代码质量的人称为工程师,把随意编码的人称为工匠。 作者认为这是反智主义的体现,呼吁重新夺回"工程师"这个词的定义权,并建议用"AI辅助编程"和"无AI软件工程"来替代当前的术语体系。
评论点赞收藏17 天前

NX 位不只是安全特性

在 ARM64 上开发裸机 Hypervisor 时,CTR_EL0 拦截导致手机随机死机,排查半年后发现问题根源:ARM 的 Device 内存属性只阻止数据访问的推测执行,但指令预取不受此限制;将内存标记为不可执行(NX)才能同时阻止推测性指令取指。 这个发现让作者半年未解决的启动问题一次性解决,也颠覆了"NX bit 只是安全特性"的普遍认知。
评论点赞收藏26 天前

Rust 的 std::process::Command 在 Windows 上是个糟糕的公民

<p>假设你正在为 Rust 编写一个 Windows IPC 库,并希望将句柄传递给子进程。也许是一个管道,也许是一个文件,也许是一个代理进程句柄。<br><br>然而,由于 Rust 的一些特殊性,其实并没有一种绝对正确的做法来实现这一点。</p><p>来点 WinAPI 小知识!用于启动新进程的 <code>CreateProcess</code> 函数有两个参数,它们决定了子进程会继承哪些句柄。可能的组合有:</p><ol> <li><code>bInheritHandles = FALSE</code>:不继承任何句柄,仅保留标准输入/输出句柄。</li> <li><code>bInheritHandles = TRUE</code> 且 <code>PROC_THREAD_ATTRIBUTE_HANDLE_LIST</code> 不存在:所有已设置“可继承”标志的句柄都会被继承。</li> <li><code>bInheritHandles = TRUE</code> 且 <code>PROC_THREAD_ATTRIBUTE_HANDLE_LIST</code> 存在:所有已在句柄列表属性中列出、且已设置“可继承”标志的句柄都会被继承。</li> </ol><p>只要程序中每次调用 <code>CreateProcess</code> 时都遵循 (1) 或 (3) 中的规则,一切就都很好:句柄会被允许列表化,而且不会发生意外地继承句柄的情况。</p>
评论点赞收藏45 天前

对"纯Python中的SIMD"的思考——SWAR位运算优化

提出一种SWAR位运算技巧,将Game of Life邻居判断从15步降至6-8步,且不增加每格位宽。核心思路是用加法把比较阈值移到2的幂边界,从而只需检查最高位。 该技巧最早可追溯至1987年Alan Mycroft的Usenet帖子。
评论点赞收藏47 天前

关于“纯 Python 中的 SIMD”的思考

<p>我找到了那篇帖子作者<em>回溯</em>关于优化生命游戏,觉得这是个好机会聊聊SWAR。在继续之前,请务必先阅读那篇帖子!或者至少浏览一下。</p>
评论点赞收藏66 天前

Teal 语言使用体验回顾:填补 Lua 静态类型空白的尝试与局限

开发者实测Teal语言后认为其虽填补了Lua静态类型检查空白,但工程成熟度仍不足。 使用两个月后,作者指出Teal在类型系统设计和工具链稳定性上存在明显缺陷,许多特性不如预期好用。 尽管尊重项目贡献者,但认为目前尚不适合大规模生产环境替代原生Lua。
评论点赞收藏66 天前

PHP 和 Lua 中的对数函数存在非单调性缺陷

<p>如果 a &gt; b &gt; 1,且 x &gt; 1,那么你可以证明:logₐx &lt; logₐx。(提醒一下,logₐx 表示满足 x = a^t 的 t 的值。)仔细想想,这一点非常直观:对于“正常”的数值来说,a 越大,要得到相同的 x 所需的 t 就越小。</p><p>然而,如果你去问 PHP 它的看法,它会在少数几种情况下告诉你:“你错了!”</p><p>?php<br>$x = 2.93;<br>$a = 10 + 2 ** - 49;<br>$b = 10;<br>assert ( $a &gt; $b );<br>var_dump ( log ( $x, $a ) &lt; log ( $x, $b ));<br>var_dump ( log ( $x, $a ) == log ( $x, $b ));</p><p>需要明确的是,这并不是常见的浮点数精度误差。大家早已知道,浮点运算本身就存在精度问题,而且写博客讨论这个问题也并不有趣。<br><br>这个例子是特意设计的,旨在触发一种截然不同的结果。</p>
评论点赞收藏69 天前

PHP与Lua中日志函数的非单调性陷阱

PHP和Lua的log函数在特定浮点数边界下出现违反数学单调性的现象。原因是语言内部对特定底数(如10)使用了优化的专用函数(log10),与通用公式混合导致精度误差方向不一致。 文章深入分析了libm实现细节及不同语言处理策略,指出这是浮点运算中常见的隐蔽陷阱。
评论点赞收藏70 天前

PHP 与 Lua 中对数函数的单调性陷阱

PHP 和 Lua 的数学库存在一个反直觉 bug:当底数 a > b > 1 时,log_a(x) 理论上应小于 log_b(x),但在特定浮点数精度下,PHP 返回了相等甚至错误的结果。 作者指出这并非普通的浮点误差,而是刻意构造的底层实现缺陷。
评论点赞收藏70 天前

排序秩编码:一种高效的 BWT 变换替代方案

<p>我需要一个地方来介绍这个算法,因为它似乎在互联网上没有相关文档,所以就在这里分享给大家。</p><p>SRC 是 基础压缩器中 的替代方案。而 则是公认的、以压缩比为衡量标准的 MTF 替代方案,如果你不想使用上下文建模的话。</p>
评论点赞收藏78 天前

利用 Phminposuw 实现数据流的最优解析

数据压缩中动态切换编码格式时,贪心分段会导致元数据膨胀且精度不足。作者提出使用 Phminposuw 算法进行全局最优解析,平衡编码效率与元数据开销。
评论点赞收藏78 天前

用一个“无用”的if语句将代码性能提升四倍

通过添加看似冗余的if语句欺骗CPU分支预测,将循环从延迟受限转为吞吐量受限,性能提升2-4倍。利用volatile强制编译器保留分支以打破数据依赖链,展示了底层硬件特性与编译器优化之间的博弈。
评论点赞收藏79 天前

排序秩编码:BWT压缩中MTF变换的高效替代方案

提出 Sorted Rank Coding (SRC) 算法作为 BWT 压缩中 Move-to-Front (MTF) 变换的替代方案。作者指出 SRC 在不使用上下文建模的情况下,能提供目前已知最佳的压缩率。 对于研究数据压缩原理及优化压缩算法的技术人员具有参考价值。
评论点赞收藏79 天前

使用 phminposuw 实现最优解析

针对数据压缩中动态切换编码格式的问题,指出简单分块贪婪算法因元数据膨胀导致次优。介绍使用 phminposuw 库进行全局最优解析,平衡压缩率与格式开销。 适合对底层压缩算法、动态规划及工程优化感兴趣的开发者。
评论点赞收藏81 天前

恢复被混淆的比特币地址(2024)

从零网归档实战出发,演示如何通过暴力破解与数学优化恢复大小写混淆的比特币地址。作者从Python慢速尝试起步,逐步演进至Rust实现,利用Base58编码特性与BigInt运算,将校验和验证次数降至最低,最终实现毫秒级恢复。
评论点赞收藏87 天前

后缀 BWT 与循环移位 BWT 的对比及快速计算方法

深入对比了 BWT 变换中两种变体:循环移位 BWT 与后缀 BWT。文章指出虽然后缀 BWT 解码稍慢,但借助 SA-IS 等算法编码速度极快,是大多数场景的首选。 对于需要极小解码体积的场景(如 Demoscene),循环移位 BWT 仍有优势。文中还分享了利用字符串加倍或寻找最小循环移位来高效计算循环 BWT 的工程技巧。
评论点赞收藏88 天前

技术博客能带来快乐吗?

作者分享写技术博客的动机:为了在冷门领域探索并整理思路,而非追求流量。文中提到喜欢深入且独特的技术写作,并反思了小众技术内容的价值。
评论点赞收藏88 天前

后缀 BWT 与循环移位 BWT 之争,以及快速计算方法

Burrows-Wheeler Transform 存在两种变体:后缀 BWT 与循环移位 BWT,它们在性能特征和实现简洁性上存在细微差异,但这一区别在主流资料中鲜有记载。 文章详细梳理了这两种变体的定义、转换逻辑及计算效率,特别是针对快速计算方法的对比分析。对于从事数据压缩、基因组对齐或底层算法优化的工程师而言,厘清这两者的边界有助于选择更适合场景的实现方案,避免在工程实践中因概念混淆导致的性能陷阱。
评论点赞收藏89 天前

优化 Lua 字符串字面量以节省 400 字节

分享在 ComputerCraft 项目中压缩 Lua 代码的具体技巧,通过优化字符串字面量节省 400 字节。包含针对特定嵌入式环境的工程实践和代码压缩手段,适合关注底层优化和 Lua 开发的读者。
评论点赞收藏90 天前

You might misunderstand arithmetic coding

This post assumes basic familiarity with arithmetic coding. I’ve written an arithmetic coder, like, three times in my life, so the mistake I want to highlight is likely amateurish. But since I didn’t...
评论点赞收藏149 天前

WASM interpreter fits in a QR code

2945 bytes. Less than 0.006% of Wasmtime, smaller than a C “Hello, world!”. Zero dependencies, no cheating: just a static x86-64 Linux executable. Scan the QR code above with zbarimg --raw -Sbinary or...
评论点赞收藏149 天前

This Wasm interpreter fits in a QR code

2945 bytes. Less than 0.006% of Wasmtime, smaller than a C “Hello, world!”. Zero dependencies, no cheating: just a static x86-64 Linux executable. Scan the QR code above with zbarimg --raw -Sbinary o...
评论点赞收藏150 天前

登录芦苇

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