- 博客(135)
- 收藏
- 关注
原创 1 个汉字算几个 token?实测中英文 prompt 与代码的编码差异
219 个汉字,在 cl100k_base 词表下要 291 个 token,平均一个字 1.33 个。同样长度的英文,379 个字符只要 73 个 token,5 个字符才摊到一个。换成 o200k_base,同一段中文从 291 掉到 188,省了三成半;可同一段 JavaScript 代码反而从 102 涨到 103。生成物只有一个 index.html,分词在浏览器本地跑,文本不出本机。
2026-10-15 00:32:00
18
原创 JWT 到底装了什么?贴一个 token 把 3 段拆开,实测 alg=none 的坑
一个 224 字符的 JWT 贴进去,页面当场把它拆成三段:27 字节的 header、107 字节的 payload、32 字节的签名。填上密钥点一下按钮,页面自己算出的 HMAC-SHA256 和 token 里带的签名,32 个字节逐字节对得上。生成物只有一个 index.html,纯前端、零依赖、不联网,token 和密钥都不出浏览器。
2026-10-14 23:01:48
141
原创 debounce 和 throttle 到底差在哪?200 次连续输入实测触发次数
回到最开始那个问题,debounce 和 throttle 差的不是实现,是「等谁」。debounce 等事件停下来,所以触发次数由停顿决定。throttle 等时间到点,所以触发次数由跨度决定。想接着玩,可以把延迟滑到两端看次数怎么变,也可以给输入流加一段超长停顿,看 debounce 的组数怎么动。
2026-10-14 21:57:57
76
原创 加一台机器,为什么只有 1/N 的 key 要搬家?一致性哈希实测
先给结论:取模分片加一台机器,10 万个 key 里有 8 万个要换家。换成一致性哈希,同一批 key 只有 7.6% 动窝。这两个数字不是我算的,是页面打开时当场跑出来的。我把哈希环、负载柱状图和 9 条自检断言塞进了一个单文件页面。双击就能跑,不联网,不引第三方库。
2026-10-14 01:14:10
160
原创 12 种 Prompt 注入实测:零宽字符和 Base64 怎么绕过关键词过滤
36 条注入样例,只做原文关键词匹配能抓到 22 条,前面加一层归一化能抓到 27 条。多抓到的那 5 条,全是在关键词中间动了手脚:塞零宽字符、把拉丁字母换成西里尔同形字、或者整句写成全角。两条管线在 40 条良性样例上都是 0 误报。成品是一个单文件 index.html,双击就能跑,不联网、不引第三方库。
2026-10-13 23:22:03
74
原创 一个汉字三种编码:UTF-8、GBK、UTF-16 逐字节对比实测
汉」在 UTF-8 里是 E6 B1 89,在 GBK 里是 BA BA,在 UTF-16LE 里是 49 6C。同一个字,三种编码,分别是 3 字节、2 字节、2 字节。我把这三个数字摊在同一张表里对了一遍,谁多一个字节、谁换了字节序,一眼可见。emoji 的差别更大:😀 在 UTF-8 里占 4 个字节,在 UTF-16 里也是 4 个,GBK 干脆编不出来,页面上标成 N/A。乱码也不是文件坏了,是拿另一种编码去读了同一串字节。
2026-10-13 21:38:56
146
原创 0.1 加 0.2 为什么不等于 0.3?IEEE 754 双精度逐位实测
页面把和与 0.3 的位串并排画出来,逐位比对,不同的位标红。0.1 加 0.2 的结果是 0x3FD3333333333334,精确值 0.3000000000000000444089209850062616169452667236328125。0.3 是 0x3FD3333333333333,精确值 0.299999999999999988897769753748434595763683319091796875。指标实测值十进制和绝对误差相对误差ULP 距离1。
2026-10-13 00:33:30
123
原创 纯向量检索漏掉的召回,BM25 加向量混合能补回来吗?5 组实测
先给结论:能补回来一部分,但补不全。「微服务通信和接口调用」这组,纯向量检索 Top-5 一篇相关文档都没捞到,recall 是 0.00。两路排名融合之后补回了 D12,recall 变成 0.50,D11 还是没进来。「数据库索引和查询优化」那组,纯向量只命中 1/2,融合补回 D03,回到 2/2。反过来的例子也有。5 组查询里有 2 组,融合的 recall 低于两路里更强的那一路:「深度学习和神经网络框架」融合 0.33,纯向量单跑 0.67。这些数字不是我写死的。
2026-10-12 23:24:14
93
原创 B+ 树分裂全过程:MySQL 三层索引为什么能装 2000 万行
B+ 树分裂这事,记住一条就够用:key 数超过 m-1 就裂,裂完两边都不能低于一半。真要看懂,还是得让树自己长一遍。把这篇文章里的数字在页面上点出来的路径是:阶数 6、数量 60,点跳过动画,看 26 个节点和 23 次分裂;把行大小改成 1024,看三层容量变成 20184000;最后点自检,看 15 条断言全绿。
2026-10-12 21:58:50
132
原创 微任务和宏任务到底谁先跑?12 段 JS 代码跑出真实执行顺序
微任务先于宏任务,这句话只值一行。真正能带走的是那三个数字:同步代码 0ms,微任务在同一轮里 1ms 就处理完,宏任务要等下一轮。想验证自己有没有记错,就跑一遍自检,再挑 2 号和 9 号单跑,看三个面板各是谁。
2026-10-12 00:49:46
208
原创 JVM 内存实测:进程占了 8G,堆只用了 2G,剩下 6G 去哪了
RSS 8G 里,堆只是其中一块。想看堆外的账,先把 Metaspace、Code Cache、线程栈和直接内存四项加起来,再拿 RSS 去减。省堆内存不等于省进程内存,-Xmx 调小了,余额会跑到页缓存那一行。
2026-10-11 23:33:12
140
原创 LRU 缓存为什么是哈希表加双向链表?12 次访问看淘汰全过程
哈希表让 get 和 put 都能 O(1) 摸到节点,链表让「最近用过」这个顺序随时可以改。命中就把节点挪到表头,满了就把尾巴砍掉,顺手删掉哈希表里那条记录。顺序别记反,是哈希表存节点、链表排顺序;反着写,淘汰的时候就不知道该删哪个键。全部数字都能在页面里自己复现,容量填 3、点自动播放就行。
2026-10-11 21:45:19
68
原创 连接池到底配多大?QPS 和 RT 算一遍,再跑 1 万次请求实测超时率
连接池配多大,先算 QPS 乘 RT 除以 1000。低于这条线,超时率会陡起来,怎么调超时都只是把失败换成变慢。高于这条线,接着决定你能接受多长的排队等待,再留一点余量就够了,多配的连接只是闲在那里占着数据库的连接数。全部实测数据和自检结果都能在页面里自己复现,种子填 42 就是我这篇里的数字。
2026-10-10 23:32:57
58
原创 限流算法到底怎么选?令牌桶 vs 漏桶 vs 滑动窗口 3 种同屏实测
限流三件套的差别不在稳态速率,在突发怎么处理。理论通过率算的是稳态,估容量时得把桶容量和结束时刻的队列一起算进去。倍速这种看起来无关的参数,可能正在改你的 QPS 上限,实测和理论对不上时优先怀疑它。16 条断言红了 1 条,说明参数为 0 这类边界还是得自己盯。
2026-10-10 21:52:58
23
原创 GROUP BY 先别想当然:我把 SQL 分组语义做成了沙盘,8 个实验 + 27 条自检全绿
同一句,在 MySQL、SQLite 和大多数人的直觉里,可以给出三个不一样的答案。分歧点只有三个:NULL 怎么归组、COUNT 数的是什么、AVG 除以谁。这些规则你大概都背过,我也没有例外。区别是我这次把它们做成了一个能点的沙盘,再一条条对了一遍,结果发现自己记的那几处里,有两处是错的。沙盘里只有 12 行订单数据,8 个分组语义实验,一句 SQL 进去、一行结果出来。
2026-10-10 15:47:54
165
原创 AI 说写完了怎么知道它没骗你?16 项交付证据清单,我用码道做成一键核对页
改完了、测试通过、可以验收」——这句话本身不含任何可核对的信息。我把「一份交付说明该拿什么证明自己」拆成 16 条带权重的规则,做成一个单文件核对页:粘贴说明文本,分数、等级、逐条结论、待补清单一次给全。
2026-10-10 12:47:21
114
原创 Skill 怎么写才被 Agent 命中?18 条规则做成 SKILL.md 校验器,规范样例 92 分
同一份 SKILL.md,只改一个字段的写法,得分能差 60 多分。我把「一份 SKILL.md 该有什么」拆成 18 条可判定规则,做成一个单文件校验器:粘贴或选中文件就能跑,分数、每条规则的结论、修复建议一屏给全。三份真材料的实测结果:规范样例 92 分(A)、故意写坏的问题样例 29 分(F)、缺 frontmatter 的普通 Markdown 30 分(F)。分数不是拍脑袋给的:100 分起扣,每条 FAIL 扣 8 分、每条 WARN 扣 3 分,上面三组数字都能手算复现(第五节有复算过程)
2026-10-10 12:14:40
163
原创 撒下 200 个种子点,平面为什么自己长成蜂窝?Voronoi 图实验室
先给一个能算的版本,而不是一句「自然选择」。把整个剖分看成一张平面图:每个格子是一个面,每条公共边是一条边。对面积完全均匀的剖分,欧拉公式给出每个面的平均边数趋近于6;而面积一不均匀,就会出现几十条边的「巨无霸」格子和一堆三角形。页面上的「Lloyd 松弛」按钮做的正是让面积变均匀:点一次,就把每个种子点挪到自己所在格子的面积质心上,然后重新剖分。它是迭代的,点得越多越均匀。Lloyd 迭代次数格子面积方差平均邻居数6 边形格子数0(随机)376690915.5240 个5。
2026-10-10 09:53:52
120
原创 直线最短却最慢:最速降线实验室,三条轨道同场竞速
两点之间直线最短。可一个从 A 滑到 B 的重物,用时最短的那条路不是直线,是一条(cycloid),也就是「最速降线」。反直觉的地方在这儿:直线短,但它全程都是同样的浅坡,速度起不来;摆线一开始陡到接近垂直,先用最短的时间把速度堆到最大,再用一段几乎水平的尾巴,把这堆速度花完。坡度分配不同,同样的落差,到达时间差了 22%。我把它做成了一个网页:三条轨道、三个小球、同一套运动学积分,谁先到 B 谁赢。,页面上 8 条自检。;。成品是一个index.html。
2026-10-10 06:23:05
151
原创 向日葵籽为什么按 137.5° 转着长?phyllotaxis 黄金角模型 5000 颗种子实测
叶序的规则就一行:第 n 颗种子角度n × α、半径R × √(n/N);角度不同,长出来的东西完全不同。137.5° 和真黄金角 137.50776405003785° 看着只差 0.008°,实测差 144 条辐条:137.5/360 = 55/144,转 144 次就回原点。137.4° 是 600 条,137.6° 是 225 条,辐条数就是分母。
2026-10-10 01:58:22
205
原创 多加一粒沙,整堆为什么就塌了?sandpile 模型 20 万粒实测
沙堆模型(BTW)用两条规则演示自组织临界性:加沙是攒,雪崩是放,系统自己爬到临界点。交付版有一个致命的一行 bug(>>> 0漏写等号),一半沙粒被静默丢弃,面板平均高度 2.7738 而真值只有 1.2118;改掉之后立刻回到 2.1212。幂律拟合从「全部原始分箱」改成「对数分箱 + 固定窗口」后,τ 从 0.344 修到1.2005(R² 0.9438),和文献值 1.2 对上了。
2026-10-09 23:14:06
139
原创 DLA 枝晶生长实测:5000 个粒子集体停摆之后,分形维数收敛到 1.70
这个页面做的事可以压成两句话:一个种子粒子,加上「随机游走 + 碰到就粘住」两条规则,就能长出枝晶。把同一份核心逻辑拉到 Node.js 里跑到 33787 个粒子,回转半径法给出的分形维数是1.701,和 2D 晶格 DLA 公认的 1.71 对得上;盒计数的估值在同等规模下只有 1.496,这不是谁算错了,而是盒计数在有限尺寸下会系统性偏低。我更想留给你的是四个真问题:交付的页面第一次打开是全黑的(未定义,初始化异常把动画循环整个挡掉了);
2026-10-09 18:42:59
71
原创 黏菌没有大脑,3000 个 Physarum 粒子跑 12973 步自己铺出了迷宫最短路
一个 39 KB 的单文件网页,把「黏菌会算最短路」这句听起来很玄的话拆成了三步:三个传感器、一次沉积、一次蒸发。默认参数下 3000 个粒子在第 12973 步把起点和终点连起来,通路长度 409 格,和 BFS 给的基准最短路完全一样(冗余比 1.00);把传感器角度从 22.5° 张到 90°,首次连通从 7259 步一路恶化到 60000 步都连不上。想继续玩的话,可以试试把迷宫换成 30×20 或 100×70、把种子换一个,看看「首次连通步数」怎么变;
2026-10-09 14:43:45
176
原创 为什么最近邻路线总在绕远?2-opt 把 50 城 TSP 缩短了 20.9%
一个 30 KB 的单文件网页,把 TSP 从「NP-hard 的黑话」变成了可以拖参数、可以单步、可以自己核对的实验台:默认 50 城下 2-opt 把最近邻的 5057.3 压到 4001.9(−20.9%),模拟退火 4059.6(−19.7%)屈居第二,三者的 MST 下界是 3290.2,页面 18 条断言全绿。想继续玩的话,可以试试点开「极速 64x」把城市数拉到 200 看曲线怎么变,或者把退火的初温和降温系数调一调,看看它需要多少步才能追上 2-opt。
2026-10-09 10:16:42
120
原创 极光:把流动夜空装进浏览器,随手调出治愈配色
极光把“治愈感”落到两个技术点上:多层fbm造出不重复的流动形态,离屏 LUT 统一色调。后面可以继续加快慢两级速度、自动昼夜循环,或让鼠标移动影响光带方向和亮度,也可以提供「一键生成治愈壁纸」的高分辨率导出。
2026-10-08 23:00:37
209
原创 温度调到 2.269 磁铁突然失效:用 Monte Carlo 跑一遍 2D 伊辛模型相变
一个 29.8 KB 的单文件网页,把二维伊辛模型的相变从公式变成了可以拖的滑杆:低温段实测与 Onsager 精确解差 0.02%–1.28%,跨过后 |M| 掉到 0.03 附近,11 条自检全绿。想继续玩的话,可以试着把点阵开到 128 × 128 看临界点附近的涨落有多大,或者加一个零外场之外的外场 h,看相变线怎么移动。说明:文中所有读数(自检值、扫描表、性能数字、错误提示原文)都是在本机实际运行页面和verify.js取到的,不是转述。
2026-10-08 22:25:09
79
原创 布隆过滤器参数实测:120KB 装 10 万条 URL,k 开到 20 反而更差
回到标题:120KB 装 10 万条 URL,k 开到 20 反而更差。内存按目标误判率反推:1% 误判率 → 每条 9.6 位;0.1% → 每条 14.4 位;10 万条就是 120KB 和 176KB。k 取:120KB / 10 万条是 7。实测 k=1 时 9.66%、k=7 时 0.95%、k=20 时 5.68%,两头都更差。采样量决定你能断言什么:20,000 次采样只能分辨到 0.005% 左右,比这更小的理论误判率,测出来的只会是 0。布隆过滤器不复杂,麻烦的从来是「参数怎么定」
2026-10-07 08:21:01
209
原创 随机乱跳为什么能画出完美三角形:混沌游戏分形实验室
混沌游戏最反直觉的地方在于:每一步都在抛骰子,最后的图形却只有一个,而且它还是个正经的分形。顺着这个页面往下看,最值得记住的其实是 1−r:需求里管它叫「收缩比」,但真正决定图形粗细的是补出来的那一半——r=0.50 给 1.585,r=0.60 给 1.199,r=0.65 给 1.046,一路量下来都能对上;而 r 一旦小于 0.5,三块拷贝开始重叠,维数就不再看公式、直接顶到 2 了。想接着玩,可以把 r 从 0.5 往 0.45 挪一点点,看图形从「细」到「胖」的那段过渡;
2026-09-29 15:39:03
76
原创 双缝干涉:把两条缝的图样叠起来,光为什么自己跟自己打架
把双缝干涉做成能拖的页面之后,最值得记住的不是那排条纹,而是「挡住一条缝」那一下:条纹之所以存在,靠的是两条路径的相位差——把其中一条断掉,屏上每一点就只剩一个来源,装不出来干涉。所以条纹不是光照出来的花纹,而是「同一个光子有两条路可走」的直接后果;ΔY = λL/d 只是这件事在几何上的刻度。想接着玩,可以试试把缝间距 d 拉到最小(0.10mm)看条纹宽到只剩一两条、把 L 推到 3m 看条纹被拉得多开,或者在单缝模式下把波长换成 380nm,看单缝包络的中心亮斑是怎么收窄的。
2026-09-29 14:14:53
79
原创 高尔顿板:把球一颗颗丢下去,为什么最后总堆成一座钟形山
把高尔顿板做成能点的页面之后,最值得记住的不是那堆钉子,而是那个组合数:一颗球走完 n 层,等于做 n 次 50/50 的二选一,于是它落在第 k 格的次数就只能是C(n,k)。这条曲线不是被画出来的,是被数出来的——投得越多,柱子越像理论线,而两头的尾巴永远最不听话,因为那里的期望值本来就不到一颗球。想接着玩,可以把每层的偏转概率从 0.5 改成 0.6(分布会整体右移、不再是对称的二项分布),也可以直接把层数推到 16、投够几千颗,看看钟形是怎么随着 n 长大、越来越像正态曲线的。
2026-09-29 11:18:17
176
原创 幽灵堵车:前面没事故,为什么车流还是自己堵成一串
把「幽灵堵车」做成一个能拖的网页之后,最值得记住的不是那 8 条环形车道,而是第 3 步那一次「没有理由的随机刹车」:它不停地往车流里投新的减速种子,再被「前车慢、后车更慢」这条规则放大成一段一段的拥堵带。所以堵车不是一个卡在那里的东西,而是一个被持续生产出来的过程——你把里面一辆车拿掉,下一脚随机刹车又会把它长回来。想接着玩,可以试试把随机刹车概率 p 设成 0(确定性模式),看初始的不均匀会长出什么样的堵法;把车道扩到 12 条,比较不同随机种子的差异;
2026-09-29 10:46:59
164
原创 萤火虫为什么会一起闪:调一个耦合系数,整片林子自己同步
把「萤火虫为什么会一起闪」做成一个能拖的网页之后,最值得记住的不是那 320 个发光点,而是耦合项里那个乘上去的 R:牵引力度和当前的整齐程度成正比,于是整齐这件事自己会加速。临界耦合强度 Kc ≈ 1.6σ 是这套模型的入场券,低于它,再多的虫子也只是各闪各的。想接着玩,可以试试把频率分布从高斯换成双峰(会出现两拨各自同步的群体)、给每只虫子限定一个邻居半径(把平均场换成局部耦合),或者把耦合项里的sin换成纯粹的脉冲触发,看看「看见别人亮才亮」的萤火虫需要多强的视觉反馈才能齐闪。
2026-09-29 07:50:13
200
原创 豹纹和斑马纹是怎么长出来的:调两个参数,花纹自己浮现
把「豹纹怎么来的」做成一个能拖的网页之后,最关键的不是渲染也不是配色,而是那两条式子里的Du ≠ Dv:一旦两种东西扩散得一样快,短程激活和长程抑制就分不开,花纹立刻消失。想接着玩,可以试试把 Du/Dv 做成滑杆扫一遍(Du 调到接近 Dv 时花纹会整体退掉)、把网格换成六边形、或者给 V 加一个缓慢的全局衰减,看图案怎么在「点—条纹—斑块」之间切换。
2026-09-29 03:31:07
185
原创 克拉德尼图形:调一下频率,沙子自己排成对称花纹
把「声音能让沙子排出花纹」做成一个能拖的网页之后,最关键的一行不是渲染,而是受力那行:它把「沙子该往哪走」交给了场的梯度,所以节线一变、沙子自己就跟着挪,不需要为每种模态单独写动画。想接着玩,可以试试加一个「真实频率标度」开关(让模态随频率按平方根关系走,而不是线性排队)、给沙粒加拖尾,或者把方板换成圆板——圆板的节线是同心圆加直径,画出来是另一种花纹。
2026-09-28 23:24:47
222
原创 天空为什么是蓝的:拖一下太阳高度,看清瑞利散射怎么染色
把「天空为什么是蓝的」做成一个能拖的页面之后,最重要的不是那张好看的渐变,而是 airmass 和衰减项这两处:一个负责让低角度也能算,一个负责让蓝光真的会被散射掉。改这两行里的任何一个,日落都会立刻变得不对——这就是公式能拖出来的好处。想接着玩,可以补上直射阳光的色温、加个「一天的时间轴自动播放」,或者把地面反射也算进去。
2026-09-28 16:50:04
166
原创 正则回溯爆炸:一个表达式把 CPU 打满,3 步改写救回服务
一个看起来逻辑正常的正则,遇到恶意或异常长的输入,可能从几毫秒变成几十秒,直接把服务的 CPU 顶到 100%。这篇文章用本机跑出来的数据说明回溯爆炸是怎么发生的,并给出 3 个能直接落地的修复方法。
2026-09-23 17:18:23
181
原创 粒子时钟:秒针一抖就散成星尘,看时间也上头
粒子时钟把时间显示拆成三件事:字形点阵给出目标,弹簧物理让粒子动起来,整秒变更触发一次散射。后面可以继续加「倒计时」「自定义点阵文字」「保存 GIF」或「点击屏幕召唤一波粒子」,核心循环都不用大改。
2026-09-23 14:52:29
146
原创 水波纹:点一下水面就漾开,压力感瞬间被揉散
水波纹把一个很容易想象的物理现象落到高度场迭代:点击产生扰动,有限差分负责扩散,调色板负责观感。后面可以继续加「石头落下的大水花」「背景渐变」「点击音效」或「波纹定格导出」,也可以把高度场接到其它网格类效果上,玩法空间不小。
2026-09-23 14:48:42
131
原创 万花筒:拖一下就换一张壁纸,对称图案越转越上瘾
万花筒的视觉密度来自“少维护、多展开”:340 个粒子通过 8 重对称变成约 2720 段连线,加上拖尾和lighter叠加,画面就很满了。后续可以继续加「对称数调节」「下载高清大图」「把某帧定格成壁纸」或「用种子生成固定图案」,让它从随手玩的小工具变成真正能产壁纸的生成器。
2026-09-23 14:46:55
202
原创 烟花模拟器:满屏流光炸开,过年气氛一秒拉满
烟花模拟器把粒子系统的核心链路浓缩成一个单文件:随机工具负责所有不确定性,launch()负责火箭与爆炸形态,frame()用半透明覆盖制造流光拖尾。8 套配色和连发按钮让「放烟花」这件小事变得有按钮可按。后续可以加音效、慢动作回放,或者把爆炸形态做成可勾选项,让一场烟花能按自己的顺序来。
2026-09-23 14:45:09
196
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅