2026-01-17 13:45:00
For a decade, we have lived in the Age of the Vapor. We post into the void, chasing a heartbeat of attention that vanishes by morning. Our thoughts are rented to servers we don't own, managed by algorithms that don't care, and deleted as easily as they were typed.
We have traded Legacy for Latency.
Seal is the end of the "Post." We do not "post"; we Inscribe.
When you write here, you are not just making noise; you are adding a verse to your own personal canon. Every word is written to your local disk first. Every thought is signed with your own key.
Once it is Sealed, it is yours. It is a piece of history that no corporation can "un-write."
If a thought isn't worth keeping for a century, is it worth saying today?
By treating microblogging like Scripture, we return gravity to the conversation. We replace the "Infinite Scroll" with the Permanent Record. We don't build feeds; we build Codexes.
Your data lives with you. Our service is merely the Courier—the mailer that carries your sealed verses into the atmosphere of the world. We cannot change what you have said. We cannot hide your history. We are the pipe; you are the source.
We believe in a social web where:
Stop scrolling. Start Inscribing.
Seal your legacy.
2012年,在懵逼之中写下了《我的信息危机》,当年激发了些许讨论。
也正是那一年,Hinton 带着大弟子 Alex,Ilya,去 ILSVRC 踢馆拔得头筹,这场年度比赛背后是ImageNet,李飞飞趴了几千万张Flickr照片+tag,找三哥在 Mechanical Turk 挨个标成题库去考验各种古法编程手搓的分类器。
AlexNet靠两张NVIDIA GTX 580 3GB显卡,用224×224分辨率打败有史以来所有选手,在比赛中大幅度领先,一举成名。这场对全世界,全人类,全历史造成的震荡一直持续到今天。
当年我写到,输入越来越多,输出越来越少;过多信息时效化;碎片化;信噪比极低,这些问题似乎在AI时代……居然引刃而解了?
我渴望一个SNS,隔绝与hivemind的各种hype,又能自洽,这一点可能还需努力,于是就有了这篇 manifesto。
2026-01-16 00:10:00
首先,我讨厌编译,我喜欢二进制,直到昨天我惊讶的发现macOS上一个 yes 命令都是接近100KB的大小。homebrew 一大坨东西还不一定每次都成功。
说起编译,这几天读到一些关于软件法律方面的风险。zhihu说如果你的工具的不针对“特定用途”,那么就可以用一定免责的说辞,但是如果你提供下载只能拿来恰好做某一件特别具体的事,那么工具的提供者就有连带责任。我想这也是为啥大部分开源软件都是提供源码吧。我这代码又不能直接用,开源是为了研究技术。你自己编译之后拿来敲不对劲的命令那是用户自己的选择了。
那么回到主题, mtr 作为居家旅行必备网络工具,它只提供源码分发。9年前研究过,用python写了demo,但是终究不是太成熟,现在有 AI ,几句话就完成了
使用方法是 sudo python3 cli.py jd.com 这样。 -6 可以强制使用 IPv6,-c1 可以每一跳只probe一次并退出。
过程中反复折腾的,居然是最后一个 hop 重复显示,和丢失的问题。没想到AI也犯糊涂。
不过需要sudo还是很蛋痛。有一些折衷的办法比如去读 traceroute -d, mtr 或者 iproute2 的debug输出,有空再折腾。
期间遇到n次无法编辑文件的情况,估计AI输出乱了。还有不知道为什么,Google Antigravity每次写完代码就打 Aurora 几个字到末尾。
现在基本框架有了,下一步支持点什么插件好呢。
2026-01-14 22:48:00
一个奇怪的需求:如何在浏览器判断一个字体是否支持某个字符?
(原始需求是:遇到一些字符渲染错位问题,看起来是字体不支持,fallback 到别的去了。)
想到的方法是:用canvas渲染看宽度。但因为这个 fallback机制,所以更好的办法是拿一个已知的特殊字体去比对,如果fallback了说明不支持。
那么问题来了,这个 fallback font 你不可能下载一个包含所有字符的,那样体积会很大,所以最好是按需生成一个,只包含一个字符,用来比对。那么这个问题就转换成了:如何在浏览器js里动态生成一个 .ttf 格式的字体文件,只包含一个字符?
这里不考虑 woff woff2,因为前者已经过时了后者比 ttf 更复杂。
一开始以为很easy,让 ChatGPT搓,打开浏览器就懵逼
OTS parsing error: bad table directory searchRange
bad table directory entrySelector
bad table directory rangeShift
Invalid table tag: 0x66000000
f\x00\x00\x00: invalid table offset
感觉事情没那么简单。让Antigravity搓,它把我免费额度烧光了也没搓出个所以然
其中一个小插曲是,css里允许对单独一个字符设置 font-family,但是因为这个 .ttf 是动态生成的,所以需要动态生成这个CSS的声明,所以在生成 .ttf 之后需要类似这样的代码:
document.head.insertAdjacentHTML("beforeend", `
<style>
@font-face {
font-family: GhostRaw;
src: url(${url});
unicode-range: U+2603;
}
body { font-family: GhostRaw, system-ui; }
</style>
`);
注意这个是在 html 里的 js 里的 template string 里的 css。antigravity改这一块出现了好多次 error,我猜是AI输出格式嵌套格式本来就容易出错,这里引用和转义太复杂以至于 agent 直接看不懂output了。哈哈
因为没额度了,所以换国产免费的 Trae。Trae 比antigravity更笨,但是也努力。js搓不动,就开始换写 .py 去验证。搞到最后搞出来一堆测试文件
check_maxp.py
check_validation.py
generate_minimal_ttf.py
generate_proper_ttf.py
generate_simple_zero_width_font.py
generate_ttf.js
generate_zero_width_font.py
generated_font.ttf
generated_font.ttx
get_base64.js
minimal_font_generator.py
modify_existing_font.py
simple_font_generator.py
validate_ttf.py
validate.js
working_font_generator.py
zero_width_font.ttf
zero-width.ttf
这样几回合下来,直接搓超出上下文了,最后直接罢工,出现
Output is too long, please enter 'Continue' to get more.
而且你点了 continue 它思索半天还是出现这句话。上下文是彻底爆了。
正向构造一个 .ttf 很难,AI还很聪明的想到了:
我将使用一个更简单的方法,直接使用一个现有的基础字体文件,然后修改它的字符映射。让我检查一下是否有任何基础 TTF 文件可用。我将使用 Google Fonts 中的一个非常简单的字体作为基础。
最后还是失败了。于是我就去搜索引擎找到了这个:
https://pomax.github.io/Minimal-font-generator/
dynamically generated bespoke font that encodes that character as a zero-width glyph
in the PDF.js project, where a PDF file may have fonts embedded for rendering text with, but no way to tell whether an extracted font has actually finished loading.
和我想到一块去了。还是人类老哥牛逼,2012-01-14号就把这个方案搓出来了,距今刚好整整14年。
AI就像一个培训班出身的,对背题能过的任务能很快完成,对于这种考验细节的冷门任务,还是难。
2026-01-13 22:30:00
2022年买的VPS一直没怎么管,今天想跑点东西发现大户 warp-cli 真是吃资源啊。果断删掉
公司的服务器都是SA管理,自己的一般很少去折腾,这次也是闲的,好奇系统里杂七杂八都是啥玩意儿,挨个找AI审问一遍
systemctl list-units --type=service --state=running
blk-availability udisks2 插拔优盘的fwupd 固件更新ModemManager multipathd open-iscsi iscsid 存储用的packagekit GUI包管理器polkit GUI 策略kitsnapd snapd.apparmor snapd.autoimport GUI里的 App storelvm2-monitorupower thermald 电源和温度传感器cloud-init* cloud-config* 云配置器apport* Crash reporting这些都没用!直接 sudo systemctl disable --now XXX 禁用
其中 snapd 直接 sudo apt purge snapd 斩草除根!
最后看一下 free -h used=110Mi 感觉好多了。
顺便把文件也清理下 sudo journalctl --vacuum-size=500M,发现比较大,编辑 vi /etc/systemd/journald.conf
[Journal]
SystemMaxUse=500M
然后 sudo systemctl restart systemd-journald
为什么要整理VPS?因为大善人Cloudflare 和 Vercel 都有 request buffering 导致一个 hobby project 做不下去了
2026-01-10 12:36:00
I've been busy vibe coding a paste service. Sharing content has been painful these days and I always have some snippets or images to share with my friends.
The service is up and running in publick hosted $URL = https://p.est.im
It's running on a free tier Cloudflare Worker with everything stored in D1.
To upload a paste is easy, just curl -T /path/myfile.txt $URL. A random paste ID would be generated and returned.
Or you can pipe some logs like cmd | curl -T - $URL. If you take a close look at the headers you can even find a delete token
Hopefully no major spam nor abuse happen to this service. I did try hardwork to prevent them best to my knowledge, like
The source code is available at https://github.com/est/p.est.im
If you have any better ideas please let me know 😎
2026-01-07 00:08:00
评论一大堆质疑的。但是这么多质疑本身也是证明大部分回复都是……负面。这算是老问题了,我一直觉得NLP似乎很喜欢做 sentiment analysis。也写过一篇为什么网上喷子那么多,戾气那么大?
回到最根本的点上,正面负面,这玩意不是很主观的吗?怎么能个 classifier 就能区分得那么清楚呢?
刚要睡觉,结合之前 LSTM 的发明人通过数学公式定义什么是「美」,突然有个想法。
更好的分类是—— ugly or not。这里的 ugly 就是「出丑」表示不对劲 的意思。
有个底层逻辑是,如果遇到符合预期,正常的东西,人们是不会费时间写字儿赞美,认同,表扬的。但是遇到 ugly 的需要额外费劲解释的,多半会投入精力去辨析。
容易接受的东西不一定是对的,但是接受度高的东西就是smooth的。大脑皮层褶皱被熨平那种丝滑感,即便陈述是错的,也可以欣然接受。毕竟「押韵的就是有道理的」
如果需要大费周章去辨析的东西,那么它就是有问题的,something wrong,那就是「负面」——所谓 negativity bias,即人类在感知、记忆、判断和决策中,对负面信息(危险、错误、丑陋、不一致)比正面信息更敏感、更容易记住、更倾向于反应。
新生婴儿生下来学会的第一句话——啼哭,就是大脑对环境剧烈改变这个强烈信号刺激做出的本能反应。今年Q2我琢磨的。但是我没想明白人又是怎么学会 笑 的。哭 和 笑 可以说是在掌握0语言基础上,对世界的表征最大可能做出的二元化近似了。人类以后一切的情感和语言可以看成从这对立的两面发展而来。但是又很矛盾的一点是,人脑又极其擅长去做 pattern matching。或许 哭 是模式变得 ugly 之后的无力感?
又或,人脑是被迫陷入经典的“五等悲痛”? Denial - Anger - Bargaining - Depression - Acceptance?
带着深深的困意,这些lovely, dark and deep的东西就有时间再「入木」了。睡觉先。
第二天补充:有办法解决haters gonna hate 问题。下面的主意来自ChatGPT,有问题找山姆奥特曼
先定性:为什么会有 haters(叙事层面的现实)
从前面聊的 ugly / negativity bias 这条线看,其实可以一句话概括:Hate 本身就是“异常被注意到”的副产品,而不是失败的证据。所以解决hater的核心目标不是:让负面消失,而是:让负面失去叙事杀伤力。
所以最低成本解法:去人格化(de-personalization),这是 “haters gonna hate” 的底层逻辑。技术上说就是 不反驳具体内容,不承认“你说的是我”,把 hate 归类为自然现象。从修辞上把攻击降级为背景噪音。
进一步的解,归因转移(Attribution Shift)。不否认 hate,而是改变 hate 的来源解释。把 有人骂你 → 因为你有问题。改为 有人骂你 → 因为你在挑战旧秩序,你在改变既得利益,你做了“不可忽视的事”。把 hate 从 负面反馈 变成 变革信号。
高级一点,把 hate 纳入主叙事。不是回避 hate,而是提前在故事里给它一个位置。比如:我们知道会有人反对;反对本身是可预测的;反对并不改变核心方向。这一点在科技公司 创业者里常见。比如 Some people will say this can’t be done。让 hate 不再是意外,而是剧情的一部分。
终极手段,把 hate 变成 身份确认器。核心是如果所有人都满意,那你一定什么都没做。于是被谁骂反而定义了你是谁。hate 成为 “我们是谁 / 他们不是谁” 的分界线。比如典型话术 “If everyone likes it, it’s probably not for us.”,“We’re not trying to be universally loved.”,“This isn’t for everyone — and that’s intentional.”。这一步,hate 反而增强了品牌/立场的清晰度。
in a perfect world,做正确的事,是产生价值。不管是写代码、写文章、做产品,还是推进一件现实中的事,本质上都是把有限的注意力、时间和精力,投入到一个能持续产出正价值的方向上。价值可能很小,但只要是正的,就会慢慢累积。
而 hater 的问题不在于“不认同”,而在于产生负价值。他们并不只是表达意见,而是制造干扰:打断节奏、劫持注意力、迫使你进入解释模式。你不得不停下正在做的事,花额外的精力去澄清、辩解、填补认知空洞。哪怕最后你“说清楚了”,系统层面仍然是亏损的——原本可以继续前进的那段时间,已经被消耗掉了。
这也是为什么很多负面并不值得回应。不是因为它们“错误”,而是因为回应本身的期望值为负。真正昂贵的从来不是被骂,而是被迫暂停创造,去处理本不该进入主流程的噪声。
从这个角度看,hater 不是一种观点,而是一中断;不是反馈机制,而是外部性。而一个正常运转的系统,首要任务永远是——把注意力留给能产生价值的事情。