比密码更糟的登录方式:短信验证码登录的风险

2025-08-07

许多服务使用了一种糟糕的登录方式:通过邮箱或手机号发送6位验证码进行登录。这种方式存在巨大安全风险,攻击者可以轻易伪造登录页面,诱骗用户输入验证码,从而窃取账号。即使是密码管理器也无法防御这种攻击。Minecraft的登录方式就曾遭受此类攻击,导致大量账号被盗。请停止使用这种不安全的登录方式!

阅读更多

Linux 的 PATH 环境变量:真相大揭秘

2025-04-29

你是否好奇 Linux 系统是如何找到你执行的命令的?答案是:它依赖于 shell,而不是内核!本文深入探讨了 PATH 环境变量的工作机制,揭示了 shell(例如 dash)如何通过 `padvance` 函数在 PATH 中搜索可执行文件,而内核的 `execve` 系统调用实际上已经获得了文件的完整路径。Python、Go 和 Rust 等编程语言的子进程库也各自实现了 PATH 搜索功能,最终都依赖于底层 `execvp` 等函数。文章还解释了为什么 shebang 需要绝对路径,以及 `/usr/bin/env` 的巧妙作用。

阅读更多
开发

用复利解释e?这方法太糟糕了!

2025-04-11

传统的数学课上,常以复利为例介绍自然常数e:一个年利率100%的账户,如果按年计息,本金翻倍;半年计息,则变为2.25倍;日计息,约为2.714倍;连续计息,则恰好为e倍。但这解释有误导性:复利增长是指数级的,而例子中却用线性方式划分计息周期,不符合实际。银行必须分别公布利率、计息周期和年化收益率。其实,e的引入有很多更优雅的方式,例如它是自身导数的唯一函数,或者在欧拉公式中扮演关键角色。这些方法不需要预先了解e,也更符合数学的严谨性。

阅读更多

从数小时到 360 毫秒:过度工程的数独难题求解

2025-02-08

作者尝试解决一个数独难题,目标是找到使得所有行组成的九个九位数的最大公约数最大的解。最初使用 Z3 求解器,但运行数小时仍未找到结果。作者随后尝试了多种优化方法:首先通过数学分析缩小搜索空间,然后使用 BFS 算法,并逐步优化 `is_good` 函数,从使用 HashSet 到使用 bitset,最后利用 SIMD 技术进行向量化计算。通过多线程和改进线程同步机制,最终将求解时间从数小时缩短到 360 毫秒,实现了超过 1600 倍的加速。虽然最终发现直接硬编码答案是最快的,但这篇文章展示了即使是看似简单的算术问题,也能通过精细的算法优化获得巨大的性能提升。

阅读更多
开发

Minecraft服务器选址引发的投票系统思考

2024-12-21

一个Minecraft服务器的选址问题,引发了对不同投票系统的深入探讨。最初使用的简单多数投票制(Plurality voting)由于“破坏者效应”导致最不受欢迎的选择获胜。随后尝试了即时决选投票制(Instant runoff),虽然解决了部分问题,但在候选人变化时,却出现了违反单调性(Monotonicity)的情况。作者进一步介绍了博达计分法(Borda method)和阿罗不可能定理(Arrow's theorem),并最终推荐了评分投票制(Score voting)和认可投票制(Approval voting)作为更优方案,因为它们满足阿罗不可能定理的三个条件:一致性、非独裁性和无关选项独立性。

阅读更多

意外编写了一个快速的SAT求解器

2024-12-06

作者最初为了解决大学课程注册的难题,编写了一个程序来寻找最佳的课程组合,避免时间冲突。该程序使用了回溯算法,类似于解决八皇后问题的思路。作者发现这个程序实际上解决了一个更普遍的问题——布尔可满足性问题(SAT)。通过将布尔公式转换为课程目录和时间安排,程序可以高效地找到满足条件的解,甚至复杂的需求也能在100毫秒内解决。

阅读更多