Follow feeds: blogs, news, RSS and more. An effortless way to read and digest content of your choice.
Get Feederliam.page
Get the latest updates from 始终 directly as they happen.
Follow now 81 followers
Last updated about 6 hours ago
about 7 hours ago
越狱检测是 iOS 移动端安全对抗中被讨论最多、也最容易被低估的环节。多数公开方案停留在「检查几条文件路径」的层面——这类检测在生产环境中几乎不堪一击。本文以一个国内大型金融 App(下文简称「App X」)的越狱检测实现为分析对象,从防御方的视角完整还原其三层纵深防御体系:检测层、冻结层、退出层。所有结论均来自对 rootless 越狱环境(Dopamine,iOS 16.x,arm64)的实际逆向验证,每一条检测手段背后都对应着真实的攻防博弈,而非理论推演。威胁模型讨论检测方案之前,必须明确攻击者的能力边界。在当前主流 rootless 越狱环境下:GOT rebinding(fishhook):通过修改 __DATA...
3 days ago
xeCJK 是 XeLaTeX 下中文排版的核心引擎——几乎所有使用 XeLaTeX 编译的中文文档,都直接或间接依赖它处理字体切换、字间距和标点压缩。但 xeCJK 的内部机制鲜有系统性的介绍:多数用户只知道 \setCJKmainfont 和 \xeCJKsetup,对「字符之间的间距是怎么插入的」「标点压缩的数据从哪里来」「为什么 \textcolor...
10 days ago
ctex 是中文 LaTeX 排版的核心基础设施——几乎所有中文 LaTeX 文档都直接或间接依赖它。这段时间我集中处理了 ctex 上积压的数个 Bug,涉及字间距(CJKglue)被覆盖、macOS 15 字体检测失效、LuaTeX 下...
10 days ago
CJKpunct 是 CTeX 套件中负责中文标点挤压和间距调整的宏包。它的代码年代久远——最早可追溯到 CJK 宏包时代——但至今仍是 pdfLaTeX + CJK 中文排版方案中不可替代的一环。这段时间我集中处理了 CJKpunct 上两个积压已久的...
17 days ago
本文是「Pineapple」系列的第二篇,上一篇完整拆解了引擎的核心原理——数据冒险驱动的 DAG 构建、channel-per-node 并行调度、Lua 嵌入和控制流编译。之后的两天里,项目经历了 10 个版本迭代、27 次功能提交,沿三条主线推进:可观测性与调试体验、运行时架构演进、新算子与数据并行框架。本文逐一记录每个改动的背景、技术决策和收效。DAG 可视化:让黑箱变成白盒Pineapple 的 DAG 是引擎自动从算子的输入输出字段推导出来的——用户不手动画图。这带来了便利,但也带来了黑箱:当...
18 days ago
搜索、推荐、广告——这类在线系统的后端往往需要一条多步骤数据处理流水线:召回候选集、特征计算、过滤、排序、截断……步骤之间存在复杂的数据依赖,手动编排执行顺序既繁琐又容易出错。Pineapple 的回答是:让算子只声明「我读什么、写什么」,引擎借鉴 CPU 流水线的数据冒险分析,自动推导依赖、构建 DAG、并行调度。Python 声明,Go 执行,JSON 解耦——三条线各司其职,业务迭代不需要重编译 Go 代码,Go 服务自动热加载配置变更。本文将从架构设计、DAG 构建算法、并行调度机制、Lua...
24 days ago
本文是「从 C++ 到 Go」系列的第七篇,也是整个系列的收官之作。上一篇讨论了 IO 接口与标准库,本篇把前面所有知识串联起来,用纯标准库(不依赖任何第三方包)实现一个完整的 TODO REST API 服务。项目不大,但覆盖了包组织、接口、泛型、JSON、HTTP、并发安全、错误处理和测试——每个部分都对应着前面某一课的内容。项目结构先看整体目录:12345678910111214_todo_api/├── main.go ←...
24 days ago
本文是「从 C++ 到 Go」系列的第六篇,承接上一篇对泛型的讨论,进入 Go 标准库中最核心的一块领域——IO 与数据序列化。C++ 程序员对 iostream 的复杂继承体系和 nlohmann/json 的手动映射不会陌生;Go...
24 days ago
本文是「从 C++ 到 Go」系列的第五篇,承接上一篇对包管理与测试的讨论,进入 Go 1.18 引入的泛型系统。对于 C++ 程序员来说,模板是最强大也最复杂的语言特性之一;Go 的泛型是一个有趣的对照——它花了十多年才加入语言,设计上刻意做了大量简化。理解这些取舍,比学会语法本身更有价值。泛型函数与类型参数没有泛型时,想写一个通用的 Max 函数,要么为每种类型写一遍,要么用...
25 days ago
本文是「从 C++ 到 Go」系列的第四篇,承接上一篇对并发模型与错误处理的讨论,进入 Go 项目的工程化领域——包管理与测试。对于 C++ 程序员来说,这两部分的体验差异可能是整个系列中最令人愉悦的:C++ 的构建系统和测试框架需要大量外部工具的配合,而 Go 把这一切内置了。包管理与项目组织目录即包Go 的核心规则很简单:一个目录对应一个包。同一目录下的所有...
25 days ago
本文是「从 C++ 到 Go」系列的第三篇,承接上一篇对集合、结构体与接口的讨论,进入 Go 最有特色的两个领域——并发模型与错误处理。对于 C++ 程序员来说,这两部分恰好是思维转换最大的地方:并发从「手动管理线程和锁」变成「goroutine + channel」,错误处理从「异常冒泡」变成「错误即返回值」。并发Goroutine:不是线程在 C++ 中启动一个线程需要...
25 days ago
本文是「从 C++ 到 Go」系列的第二篇,承接上一篇对基础语法、类型系统和函数的讨论,继续深入 Go 的核心数据结构(数组、切片、Map)、结构体与方法、以及接口机制。对于 C++ 程序员来说,这三部分恰好覆盖了 Go 与 C++ 差异最集中的区域——从...