This blog is rated 🔞, viewer discretion is advised

今日被AI拷打

群里朋友发了一个AI拷打的prompt。做完了一轮觉得没啥,要睡觉了后劲来了。必须得记录些什么。这狗日的语言模型蹦几个金句是真的让人印象深刻

我一直有个毛病是 fear of loss,损失厌恶。

AI提醒我,我能不能用一个必不后悔的方式,先占位?

其实它这句说得有点绕,我觉得更进一步应该说,不能以我当下的情况去评估可能的风险,而是假设将来回头看,会不会为没能冒险感到后悔?

然后又聊到人际关系,我觉得最难处的就当官的和小人。AI提醒我,处处留痕才能克小人。我恍然大悟,原来官僚流程才是小人克星。啊这。😂

反而理解当官的为啥不喜欢“讲真话”,而是要讲权责,讲先例,讲文件,讲上级态度。能打败官僚的只能抬出更多的规定、流程和制度 🤣

我又问,遇到满嘴仁义道德胡搅蛮缠,不讲事实不讲道理的人怎么办,AI这么说的:

如果对方赢得不干净,靠身份、道德话术、权威叙事,则要让对方在完全合法、体面、无人可指责的情况下,被自己的叙事反噬。

呃,好吧。的确你去当面冲撞,taunt都是自寻死路。

拉扯一段时间后,问了AI哪些方向比较好,答:

方向 原因 你的匹配点
数字化/轻资产工具类产品 可快速测试,低成本迭代,信息差可利用 MVP闭环 + 最小代价策略
社区/兴趣/垂直社交 不依赖巨额营销,靠小众高粘性用户增长 策略闭环 + 并行模拟用户行为
教育/技能增值/内容变现 经济下行,个人投资教育热度不减,长期价值 干扰可控,闭环迭代,信息差变现
AI+效率工具/生产力优化 高不确定环境下企业/个人仍需效率工具 你的效率和策略优势可直接落地
供应链/本地化创新产品 避免全球不确定性风险 可最小投入实验,本地化可控

不太适合:高社交不可控、高成本非刚需娱乐项目(比如大规模社交APP赌爆款),尤其在下行周期和政策不确定背景下。

最后,我看到了HN的一篇文章《I'm addicted to being useful》,突然意识到,工程师容易陷入一种喜欢充当"useful"而不是 "valuable"的角色。

你有用,别人就把你用到死。你有价值,别人就尊你三分。

好吧。上价值了是吧。关于价值,最近几年最让我醍醐灌顶的,一是从pg那本《Hackers and Painters》里读到,价值都是劳动创造的。

第二,价值是什么?实际是个段子。上海广州为啥赚钱,人家有好东西卖你;北京为啥有钱?它能让你赚不了钱。

AI一针见血的指出:

价值 ≠ 有意义的想法
价值 ≠ 正确
价值 ≠ 高认知
价值 ≠ 别人听了觉得“牛逼”

价值只取决于一件事:

有没有人愿意、持续地,为它付出代价。

惊呆了。AI甚至抛出一句:负向价值是不可避免的文明防腐层。

我不服,几轮交战后,我承认AI是对的。创造当然是价值第一动力,人类创造的第一个负向价值机制,便是产权。

也就是私有制。

私有制是好是坏,这个话题实属键政101了。简单的说,多劳多得是人类底色,如果干多干少一个样,干好干坏没差别,那么谈何劳动和创造?

产权本身不创造任何东西。

当然,所有的腐败,也是不创造任何价值的。

带着这一轮的恍惚,我不得不呼呼大睡。

Posted

stderr

Linux服务器各类“面板”

一直习惯手动敲,想尝试下各种面板

Redhat 的 Cockpit

The following NEW packages will be installed: cockpit cockpit-bridge cockpit-networkmanager cockpit-packagekit cockpit-storaged cockpit-system cockpit-ws cracklib-runtime dconf-gsettings-backend dconf-service dns-root-data dnsmasq-base glib-networking glib-networking-common glib-networking-services gsettings-desktop-schemas libblockdev-mdraid2 libbluetooth3 libbytesize-common libbytesize1 libcrack2 libdconf1 libndp0 libnl-route-3-200 libnm0 libpcsclite1 libproxy1v5 libpwquality-common libpwquality-tools libpwquality1 libteamdctl0 network-manager network-manager-pptp ppp pptp-linux session-migration wamerican wpasupplicant 0 upgraded, 38 newly installed, 0 to remove and 81 not upgraded. Need to get 13.0 MB of archives. After this operation, 28.4 MB of additional disk space will be used.

Webmin 这货居然是 perl 的。这是请了一屋子人

The following NEW packages will be installed: html2text libalgorithm-c3-perl libauthen-pam-perl libb-hooks-endofscope-perl libb-hooks-op-check-perl libclass-c3-perl libclass-c3-xs-perl libclass-data-inheritable-perl libclass-inspector-perl libclass-method-modifiers-perl libclass-singleton-perl libclass-xsaccessor-perl libcommon-sense-perl libdata-optlist-perl libdatetime-locale-perl libdatetime-perl libdatetime-timezone-perl libdbd-mysql-perl libdbi-perl libdevel-callchecker-perl libdevel-caller-perl libdevel-lexalias-perl libdevel-stacktrace-perl libdynaloader-functions-perl libencode-detect-perl libeval-closure-perl libexception-class-perl libfile-sharedir-perl libio-pty-perl libjson-xs-perl libmodule-implementation-perl libmodule-runtime-perl libmro-compat-perl libmysqlclient21 libnamespace-autoclean-perl libnamespace-clean-perl libnet-ssleay-perl libpackage-stash-perl libpackage-stash-xs-perl libpadwalker-perl libparams-classify-perl libparams-util-perl libparams-validationcompiler-perl libqrencode4 libreadonly-perl libref-util-perl libref-util-xs-perl librole-tiny-perl libsocket6-perl libspecio-perl libsub-exporter-perl libsub-exporter-progressive-perl libsub-identify-perl libsub-install-perl libsub-name-perl libsub-quote-perl libtry-tiny-perl libtypes-serialiser-perl libvariable-magic-perl libxstring-perl mysql-common perl-openssl-defaults qrencode unzip usermin webmin 0 upgraded, 66 newly installed, 0 to remove and 79 not upgraded. Need to get 44.6 MB of archives. After this operation, 272 MB of additional disk space will be used.

Ajenti 给我装了一堆 pip 然后编译 ldap 的时候挂了

国产的没怎么试,怕装了有漏洞。

但是这几个我粗略看了下感觉不太符合我的需要。基本的东西敲命令就行。复杂的比如网络调优它也帮不上什么大忙。

我本来设想的是找一个 panel 的工具全面评估一下VPS的安全性、吞吐性能、网络触达性,顺便支持调整。现在看来要失望了。

跟朋友聊了一下,感觉这种需求很niche了。现在自己跑服务器属于非常小众的人群了。大厂买PaaS的现成,或者 k8s 容器内部调优,只有国内这帮从 OpenWRT 一路成长过来的人才会孜孜不倦的折腾VPS吧。

Posted

stdout

Hard Things in Computer Science, And AI Aren’t Fixing Them

Computer Science jokes are old, but they’re still true

“There are only two hard things in computer science: cache invalidation and naming things.” — Phil Karlton (and eventually, off-by-one errors).

We’ve laughed at this trope for decades, but we’ve spent far too little time dissecting the second one: Naming. On the surface, naming is about semantics—choosing user_id over id_1. But at its core, naming is an act of exorcism. In ancient Tibetan folklore, as well as in Western occultism (think the Goetia or Ursula K. Le Guin’s Earthsea), to know the "True Name" of a demon or a dragon is to have absolute power over it. To name a bug is to strip it of its mystery. To name a design pattern is to make it reproducible.

In the era of AI coding assistants, this is more important than ever. Low-hanging fruit—the repetitive boilerplate, the tasks with clear patterns—will soon be “harvested” by AI. Everything it can solve, it will. But the problems that haven’t been documented, defined, or named remain out of reach. AI simply doesn’t know what it doesn’t know.

The Value of the Waste: When Byproducts Become the Point

Recently, I’ve been experimenting with AI coding assistants almost every day. The results are impressive—sometimes even exhilarating. Years of hobby projects suddenly feel “done.” But there’s also a hollow feeling: the AI takes over the thinking, the tinkering, the trial-and-error process that once taught me more than the final product ever did.

Here’s a key insight: sometimes the byproducts are often more valuable than the intended product.

The real danger of AI isn't that it's "wrong"—it's that it's too helpful. AI is a "direct-to-result" machine. But in the history of human progress, the Product is often the least interesting part. The Byproduct is where the revolution happens.

  • Penicillin was a byproduct of a messy lab and a failed experiment on staphylococcus.
  • The Internet (ARPANET) was a byproduct of trying to build a nuclear-resilient command chain.
  • EUV Lithography (the tech in your 3nm chip) exists because the National Ignition Facility (NIF) was trying to achieve nuclear fusion via lasers.

When you struggle to build a library, you might fail to ship the app on time, but you end up naming a new state-management pattern or a faster JSON parser. That "byproduct" becomes your tool for the next ten years. AI doesn't do "side quests." It follows the shortest path of least resistance to satisfy your prompt.

In the history of software, our most vital concepts weren’t created by committee; they were "named" after the lessons we learned while failing to do something else.

  • The "Bug": Grace Hopper didn’t set out to invent a new term for failure; she found an actual moth in a Harvard Mark II relay. The "Bug" was a byproduct of hardware failure, but it became the name for the entire discipline of quality.
  • The "Circuit Breaker" pattern wasn't a goal; it was the name we gave to the solution after watching cascading failures burn down production.
  • "Technical Debt" wasn't a design choice; it was a metaphor Ward Cunningham coined to explain to non-technical stakeholders why a "working" product was actually a liability.
  • "Garbage Collection" and "Promises" were names for byproducts of trying to solve human memory management and the "Callback Hell" of asynchronous logic.

These names don't describe the goal; they describe the scar tissue of the process. By focusing only on the "clean result" provided by AI, we risk losing the ability to recognize these scars—and without the scars, we have nothing to name.

If we move to a world where we only write "Specs" and let Agents handle the "Implementation," we are becoming high-level managers of a Soviet tank factory of "fitting".

The Engineering of "Fitting"

I happened to read a fascinating engineering story on zhihu from Soviet-era manufacturing—what they called “Fitting” (пригонка).

In Western manufacturing, the gold standard is "Interchangeable Parts." You build a part to a 0.01mm tolerance so it fits any machine on the line. But in Soviet tank factories, tolerances were loose. Instead of perfecting the part, they perfected the "fit."

  • If a hole was drilled too wide, they’d just make a wider pin.
  • If a bolt was too short, they’d file down the washer.
  • Function over perfection. Pragmatism beats standardization when time is a luxury you don’t have.

AI coding today is turning us all into "fitters." We are no longer architects designing perfect, interchangeable modules; we are engineers in a tank factory, taking AI-generated blocks that almost work and "fitting" them together with shims and workarounds. The AI can accelerate production, but it lacks the "eyes" to see why a part doesn't fit—it just produces more parts.

The Final Exorcism

If we outsource the struggle, we outsource the learning. The "fitting" process is where the real knowledge hides. When you manually debug a race condition for three days, you aren't just fixing a line of code; you are learning the "True Name" of concurrency.

AI can give you the solution, but it cannot give you the "Aha!" moment. It can provide the syntax, but it cannot provide the Naming. As we move deeper into this automated era, the role of the developer is shifting from "Writer" to "Editor," and from "Builder" to "Exorcist." Our value will no longer lie in the volume of code we produce—AI has made the marginal cost of code zero. Our value will lie in our ability to look at a chaotic "fitting" of AI logic and give it a name.

Because in the end, the AI is just a mirror of what has already been said. It can rearrange the words, but it cannot speak a new True Name into existence. If you let the AI do all the "shaving," don't be surprised when you find yourself standing in the cold, having forgotten why you wanted to wash the car in the first place.

Master the tools, use them to "fit" your dreams into reality, but never stop looking for the "detour" in the relay. That's where the next great idea is hiding, waiting for someone to finally give it a name.


Author's note:

This original article was organically, hand-written by me https://blog.est.im/2026/stderr-03

I also drafted this English version, and ultimately "fitted" together by Gemini 3.

Posted

stderr

计算机科学里哪些极难的事

计科里有两件极难的事儿,cache invalidation,给东西起名字,和 off-by-1 errors.

今天想说说这个,给东西起名儿。HN今日讨论,软能力会成为程序员最实用的技能,这里的 软技能 就是指交流——特别是和 coding agent 交流。

我觉得吧,coding agent 这波福利迟早会被吃干抹净。低垂的果实,虽然很多,很大,也会被摘完。

AI能把它能解决的一切,全部拉到同一个水平,然后进入贤者模式。哪些从来没有文档说明,也就是没有语料拿来训练的东西,哪些尚没被定义,没被分析,没被起名字的问题,那些就算讨论都要先叠甲 lemma 的问题,AI就无能为力了。

近几天几乎每天都能vibe出来一些成果,我很喜欢,但是突然又很空洞。欣喜的是多年以来的hobby得到了完成,解脱了;空洞一方面是没有下一步目标,索然无味了,还有更深层次的原因是:我失去了一个自己思考和实操的过程

我这几天琢磨出一个味儿了。很多事情,product 不是全部。对没错,产品算个鸟。产品啥都不是。 byproduct 说不定才是真正无价之宝。我回顾了下很多idea都是在撸一个需求走了弯路,走了错路,无意中发明的额外的轮子,结果反而更值钱。就像人们常说的那样,淘金热里可能卖铲子更赚。还有那句怎么说的来着,结果不重要,过程才是经历。

Vibe 爽是爽过了,但是总感觉隔了一层,AI在碰钉子复盘的时候,你在摸鱼,你就错过了一次 level up 的提升机会。AI 在调用别的工具和别的语言做交叉比对验证的时候,如果是人,会学习到新的知识,但是人现在只是个监工了。

只看结果,只看绩效,是对事物的本质和变化缺乏观察的。比如写一篇漂亮的 spec 让AI完美执行,但是可能你就错过了AI 用clever trick 掩盖你一些内在的,本质的设计矛盾。

恰好最近又看到这个 为什么苏联武器在很长的一段时间里被黑成粗制滥造的劣等货?

国产装备制造业机械厂里有个工艺技能,叫“照配”。意思就是配件加工时加工错了不要紧,一切都可以配。
举例说。这个部件上按照图纸应该加工十对直径20的销孔,上下半分开加工。上半十个加工没有问题,下半因为马虎大意上了直径25的绞刀,干错了一个销孔。问题不大,把上半对应的那个销孔扩大到直径25,另外照配一个直径25的销子。装配时这个25的销子和另外9个20的销子一起装,装上就行。
这就叫照配。又比如一根双头螺栓,两头螺纹长度要求是200长,结果发现手头这跟金属材料有点短,一头干了200,另一头长度只剩下160了。但是这根料弃之不用又可惜。那咋办?按照设计两头各有一个40厚的垫片,然后加上螺母。那么把其中一个垫片的厚度削减到5吧。然后误差还剩下5。嗯,算一下螺纹有效长度,剩下的5的误差不耽误和螺母把紧,就这么用吧。
这也叫照配。又比如,这个零部件的金属材质设计要求是15cr2mo1,但是你现在没有现成材质,仓库里倒是有15cr1mo1v的材料,虽然和图纸要求不一样,但是无所谓,一样能代替,就这么用了吧。
这也是一种照配。照配这个技能你在机械专业任何一本教科书上都找不到,是一个非常牛逼的技能,简直百分之八十(甚至可能更多)尺寸错误应该报废的零部件你都可以用这招把问题解决。尽管机械专业课堂上公差配合课程第一课就在强调“标准化”“互换性”,但,那又有什么关系?老板喜欢就行呗,省时省力又省钱啊。
《那年那兔那些事》漫画里面有个段子说美国工程师帮中国改造两架型号一样的战斗机,发现明明同一型号的部件上的零件拆下来后居然往另一台飞机的部件上装不上,因此困惑不已。这事历史上真有假有不知道,但是这种故事发生并不奇怪。
那么照配这个技能是和谁学的呢?答:苏联老师。
据说苏联老师这技能就来自于战争期间的军工生产。二战时期前线非常吃紧,后方的拖拉机厂拼命生产坦克和汽车供应前线。但是生产谁还没有失误的时候?这零部件造错了?配就完事了,一切以及时供应上前线为核心,武器能装配上就行,赶紧开到前线去,反正也不指望这玩意能回来了……然后发现,这虽然违背了机械制造的标准化原则,但是省时省力又省钱啊。能用就行呗,管啥设计要求和质量?
至于“粗制滥造”的指控?乐,军工产品在战场不就是消耗品吗,谁还指望这玩意能活多久似的,那还要那么长的设计寿命干啥?
所以苏联老师就能设计出诸如米格29这种前线战斗机之类的产品,设计思想就是这类东西定位就是前线消耗品,只要空中格斗机动性能好就行,别的啥的人机工程和使用寿命之类的……在乎那些干啥?主打一个能装上,能用,能动,能省钱省时省精力就行了(乐)
于是伴随着着156计划,苏联老师的这种思想以及照配之类的技术也就传授给了中国徒弟,然后丫的一直传承到了现在。
如果你把这种制造思想指导下生产出的产品评价为粗制滥造,我觉得问题不算大。

反正能交差就行。我觉得AI编程,可能就需要长时间去「照配」一切了。而工业化,组织化,体系化,标准化的威力,我想不必多说。

有了AI,人们做啥事都可以一键直达了,不需要去思考,不需要去为了中间步骤搭桥,可能以后人们慢慢的不会再发明 library和一些 design pattern 了。毕竟AI 啥都懂,能识别很多人类察觉不到的 pattern。

AI is one framework to rule all frameworks. 王者之戒,统御9戒

我赶紧向AI问,人类历史有哪些著名的 byproduct 比原来的 product 更重要?它给我胡吹了一堆,最著名的,本来是研究葡萄球菌的,然后搞出来盘尼西林。我觉得这是西医摆脱巫医的质变;当然还有 ARPANET,本来是拿来扛核打击的,结果变成互联网;塑料,本来是拿来代替一种虫胶清漆,结果引发材料学革命;

我大概知道一个冷门的,EUV光刻机。本来是NIF玩激光点火测试核聚变申请着玩没用的专利,交给 Intel 套现的。Intel 拿着也没用就卖给了 ASML台积电。而 NIF 其实就是个幌子项目,说是研究核聚变,实际上是拿来测试激光武器的。所谓我能对准原子核,也能对准你在外太空的导弹。

试想一下,如果交给 AI 来做这些事,可能就完成了平庸的任务了事。压根不会多想。

而且现在AI训练本身就有问题,它不太会拒绝你,它的神经网络是靠「迎合」来打分的。它不会说不知道,它只会问你 would you like to know more 来诱导消费更多的token,而不是回头看这个过程有什么有价值的东西。

有价值?有价值的前提是你有个baseline,你知道什么东西你不知道。但是AI又是全能全知的,它不知道自己不知道,它也不知道你不知道。

人类把折腾规律这一使命交给AI,人类也就失去了重大能力——命名权。

命名权有多重要呢?“苍颉作书,而天雨粟,鬼夜哭”。这一点在藏区作为传统被保留了下来。藏区的鬼神都拥有所谓的命根子。命根子有几种呢?一般分为:名字,种子字等。

也就是说,正确喊出鬼神的名字,你就抓住了鬼神的命根子。翻译一下这句话,你把试题的出题类型正确识别了,题目也就解决了一大半。

人类在蛮荒时代,面对社会、大自然的无知,天生对不确定性和后果有恐惧。起名字是一件神圣,专业和高深的艺术,在汉地其实一直由祭祀阶层以「诗书传家」的方式保留到宋代,也就是造纸术发明打破了这一切。西方也一样。对人性和行为规范的定义权,被教会牢牢控制,一直到 古腾堡 Gutenberg 才打破。说起来也搞笑,东方是拿来印佛经,打破了文化阶级桎梏,西方是拿来印赎罪券,造成进天堂通货膨胀 🤣 这似乎也算重大 by-product了。

说远了。现在是 00:00,我想我应该总结下,AI 承包过程,必将架空人类最宝贵的过程经验。对下面发生了什么事,不仅不能察觉,连命名、定义的能力都会失去。人们以前很喜欢说 paradigm shift,我想这次,恐怕是 no paradigm left to shift。硅基的 token embeddings 人们看不懂啊。

所以啊,趁着还可以,多看 reasoning model 的 thought process,多思考。

Posted

stderr

The Seal Manifesto: Against the Ephemeral

The Seal Manifesto: Against the Ephemeral

I. The End of the Scroll

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.

II. The Inscription

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."

III. The Weight of Words

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.

IV. The Courier, Not the Master

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.

V. Witness the Truth

We believe in a social web where:

  • Ownership is local.
  • History is immutable.
  • Truth is signed.

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。

Posted

stderr

python版的mtr(traceroute for macOS)

首先,我讨厌编译,我喜欢二进制,直到昨天我惊讶的发现macOS上一个 yes 命令都是接近100KB的大小。homebrew 一大坨东西还不一定每次都成功。

说起编译,这几天读到一些关于软件法律方面的风险。zhihu说如果你的工具的不针对“特定用途”,那么就可以用一定免责的说辞,但是如果你提供下载只能拿来恰好做某一件特别具体的事,那么工具的提供者就有连带责任。我想这也是为啥大部分开源软件都是提供源码吧。我这代码又不能直接用,开源是为了研究技术。你自己编译之后拿来敲不对劲的命令那是用户自己的选择了。

那么回到主题, mtr 作为居家旅行必备网络工具,它只提供源码分发。9年前研究过,用python写了demo,但是终究不是太成熟,现在有 AI ,几句话就完成了

https://github.com/est/trpy

使用方法是 sudo python3 cli.py jd.com 这样。 -6 可以强制使用 IPv6,-c1 可以每一跳只probe一次并退出。

过程中反复折腾的,居然是最后一个 hop 重复显示,和丢失的问题。没想到AI也犯糊涂。

不过需要sudo还是很蛋痛。有一些折衷的办法比如去读 traceroute -dmtr 或者 iproute2 的debug输出,有空再折腾。

期间遇到n次无法编辑文件的情况,估计AI输出乱了。还有不知道为什么,Google Antigravity每次写完代码就打 Aurora 几个字到末尾。

现在基本框架有了,下一步支持点什么插件好呢。

Posted

stdout

尝试让AI手搓个TTF格式生成器

一个奇怪的需求:如何在浏览器判断一个字体是否支持某个字符?

(原始需求是:遇到一些字符渲染错位问题,看起来是字体不支持,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就像一个培训班出身的,对背题能过的任务能很快完成,对于这种考验细节的冷门任务,还是难。

Posted

stdout

精打细算VPS扫除

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 策略kit
  • snapd snapd.apparmor snapd.autoimport GUI里的 App store
  • lvm2-monitor
  • upower 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 做不下去了

Posted

stdout

I made a paste service

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

  • Content-Security-Policy is very strict
  • Anti hot-linking using Sec-Fetch-Site

The source code is available at https://github.com/est/p.est.im

If you have any better ideas please let me know 😎

Posted

stdout

「负面」

Hacker News 超过65%的回复是负面

评论一大堆质疑的。但是这么多质疑本身也是证明大部分回复都是……负面。这算是老问题了,我一直觉得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 不是一种观点,而是一中断;不是反馈机制,而是外部性。而一个正常运转的系统,首要任务永远是——把注意力留给能产生价值的事情。

Posted

stdin

LLM的弱点——不能很好的讲笑话?

元旦节长途旅行,无聊,我问娃,AI的弱点是什么?答:没有嗅觉,这个的确是物理限制,我之前吹的。哈哈哈。AI has no taste 🤣

这一路为了打法无聊时光,下载安装了个豆包闲聊。娃很喜欢猜历史人物。我发现一个规律,豆包似乎在缩小3、4次范围之后,就会进入 “你想的是不是XXX” 这种点菜名儿模式,而不是想办法进一步缩小范围。

这种模式如果是猜常见人物,那么特别准。如果是猜冷门、模糊的的,就容易 miss。

AI这种 hit or miss,让我不禁联系到不知道哪里看到过一个大佬的说法,现阶段LLM有个弱点,训练的时候给 next token “回答正确” 的单一结果给的权重太高,比如让AI讲一个 joke,它便老是翻来覆去讲那一个最擅长最经典的,就像是背题背出幻觉了。

不能很好的讲笑话,难道是LLM的终极弱点?

让真人马上讲个笑话,如果一时半会儿想不到好的joke,会随便找个现成的凑数。AI我试了 gemini,chatgpt,deepseek都很烂。不好笑。或许是有的笑话是英语硬翻译过来丢了东西,也可能是我没接触到更好的AI,或者我 prompt 不会写,甚至SOTA已经解决了这个问题?

如果没解决,我们是不是可以说,LLM往往对于有明确答案的东西能一发入魂;对于有多个能接受答案的东西明显变化度不足,甚至给个很差的答案。

我也不知道这是为什么。但是反之 LLM 可以很到位的解释 joke 的笑点在哪里,它不能搜集这些经典笑话然后下一次需要用到的时候复述一遍。或许 transformer 就不是拿来干这个的,毕竟它是 decoder-only的。是不是应该交给RAG做这个事?

我感觉现在的 reasoning 模型把这个问题变得更严重了。推理的时候想得太多。 Reinforcement Learning from Verifiable Rewards (RLVR) 是不是导致轻松愉快随便讲个笑话变得更痛苦严肃?

或许 joke 这事本来就是逆智的东西。弱智吧的笑话是最让我想笑的。AI聪明过头了找不到好笑的,随便打发个回答。

有研究甚至说 AI 压根不懂 pun。比如

I used to be a comedian, but my life became a joke

把最后的 joke 换成 chaotic,AI依然觉得好笑。哈哈,这是词向量近似了吧 🤣

还有人说AI讲不好笑话是因为,AI会刻意避免意外、惊喜行为。作者说笑话的本质是一个不对劲的东西,然后回头看有搞怪的地方——a joke is surprising, but inevitable in hindsight。如果回头看没看明白,那么就是个烂梗。如果一个人看了太多梗,那么TA笑点就很高,作者以此推断出,没有“最牛笑话”。笑话总是在没见过的人眼里最好笑。AI的训练就陷入怪圈:训练得越多,什么笑话都见过了,越不好笑,笑点就越奇怪。这个问题不是加大训练力度能解决的。作者同时推断,这也是AI没法编一个好的故事情节的原因。

对于这个说法,HN有评论 说 Daniel Dennett 有本讲《Inside Jokes》书,幽默是心灵的逆向工程。

humor depends on errors in reasoning and the punchline causes you to reevaluate your reasoning and discover your error. Humor evolved to be enjoyable to encourage the discovery of errors.

这个说法感觉有点特别倾向老外式的 joke。比如 “程序员为什么老是搞混万圣节和圣诞节?因为 Oct 31 == Dec 25” 这类,我感觉更多的是 幽默。国内的笑话我感觉更无限逼近“地狱笑话”那种段子,要么是看别人倒霉,或者是屎尿系列的 butt joke 。


除了讲笑话的问题,还有最老生常谈的LLM幻觉问题。猜成语我想了个冷门的「投杼逾墙」,AI懵逼。btw 这个成语也是 也是卢格杜努姆的奥古斯丁 这个up主之前某一期爆的典。

然后又看到 Steve Yegge 的访谈。的确现在 agent 生产会导致人和人的差距越来越大。我在想LLM似乎就很适合编程这种有规律可循,答案又很确定,很多写法都是 there should be one– and preferably only one –obvious way to do it,太适合 LLM 了。

新年第一天,杂七杂八胡思乱想一篇。看了眼已经 01:37 了 😂

Posted

stderr

礼教的核心议题是——认爹

一直关注 卢格杜努姆的奥古斯丁 这个up主。今天刷到他最新的一期,讲到Pope最近去土耳其伊斯坦布尔访问的事。历史上基督教分裂成两大教派 天主教 vs 东正教,天主教在罗马梵蒂冈,东正教圣城便是君士坦丁堡。最新当选教皇的那个美国人在和大牧首会见,颂念《尼西亚信经》的时候,没有念出 Filioque。于是作者又花力气解释了这个 Filioque,也就是和子问题,两大「正统」教派之间最核心的分歧。

简单的说,基督教流派里,最大公约数有7次大公会议,第一次 尼西亚大工会,由罗马皇帝君士坦丁一世召开,大会主要成果是认定:儿子和老汉是一回事。不认同大会决定的分裂出来 阿利乌斯派、聂斯脱里派。《大秦景教流行中国碑》里那个 景教,就属于支持聂斯脱里的基督二性论的。

第二次大工会:君士坦丁堡公会议,主要解决第一次大会的遗留问题:他爷俩为啥这么屌?

  • 君堡☦️的人觉得:圣灵/圣神,是主及赋予生命者,因为老汉比较屌。qui ex Patre procedit
  • 罗马✝️的人觉得:圣灵/圣神,是主及赋予生命者,因为老汉及儿子比较屌。qui ex Patre, Filioque procedit

其实说来说去,为毛这么纠结,还不是因为叙利亚中东蛮子里出了个神人在君堡附近干了番大事业,肉体成圣了。他的地位怎么趋附到旧约耶和华身上才符合时代需要?

跟朋友说了下这个事,他说不要去掺和宗教的事。

我说:嘉靖跟文官闹了一辈子的别扭,原因就是如何称呼他爹。朋友被逗乐了,表示非常对 🤣 由此可以得到,无论东西方,如何认爹都是礼教的核心议题啊。

宋英宗也一样。被抱来抱去,名分模糊,最后整个朝廷都在替他补一份“我究竟是谁儿子”的说明书。

又想起,孔子搞这些也是一把好手,他的成名作就是去找他野爹的坟头。然后他这个殷商贵族后裔,居然跑去贴靠周礼,认爹认出路径依赖了。把“认爹”从血缘提升为伦理,从私人问题升级为公共秩序。

东方所谓君臣父子,皇帝既是“天子”(天之子),又是“君父”(民之父母),兼具神圣性与宗法性;教会与王权争夺地位,无非都最终诉诸“终极父亲”——上帝。

为什么东西方礼教对认爹这么执着?认爹其实就是对权威源头、统治合法性或意义根基的追溯与承认。

为啥不是认娘?娘和子女的关系是天生不可分裂的。我甚至极端的觉得:人类发明文字,就是当爹的用来跟踪自己的财产,以及标注继承人需要。这样财富才能通过指定的名字传承。

精神恍惚中,我甚至怀疑,屈折语里这么强调属格,会不会出于确定屁股位置的实际需求?古希腊和罗马语言学家认为,名词的“主格”是正直的,其他的格(如宾格、属格)都是从主格“倾斜”(Decline)出去的,所以叫“变格”。搞这么抽象的三位一体学说,无非是用什么位格的词藻来修饰耶大爷那些神迹更加有高级感的的工程问题。这爷俩是一人还是两人?动词(procedit)都用单数了,所以神必然都是单例。

Posted

stderr

“缸中之脑” 被我破解了

最近epic送了《Hogwards Legacy》我打通关了,作为原著党,十分着迷这部小时候的经典,在美轮美奂的想象世界骑扫帚,看冥想盆里剧情故事,都十分有趣。

昨天晚上加班到很晚,晚饭吃得玩,睡得更晚,肚子有点涨,早上做了非常奇怪的梦,一直吃东西,然后不小心把坐牙给弄掉出来了。感觉嘴里一阵穿堂风:

图片由ChatGPT生成,十分还原。梦里的这颗牙齿就是带着蓝色静脉和红色动脉线条。奇怪吧

出于本能,我赶紧咬合了一下,确认是不是真的掉牙齿了。结果一咬发现坐牙都还在。大脑瞬间崩溃,bia~ji 一下给我整醒了。

一看时间:06:40 tnnd。感觉没睡够,于是倒头又想重新入睡。大脑里突然闪现出 哈利波特 通过冥想盆看别人故事VR,又突然想到以前的经典电影《黑客帝国》,越想越睡不着。脑子里绷出来一件事:

缸中之脑 必然能被破解?

brains in a vat」是一个经典科幻设定。它说:

也许你现在并不是真正的身体在现实世界中感知,而只是 一颗漂浮在营养液体缸中的大脑,它通过超级计算机产生的电信号获得和正常人一样的感觉体验。如果这个假设成立,那么你所有关于外部世界的经验与信念都可能是假的。

这个说法被 Putnam 批判了:

如果你真的是一颗缸中之脑,那么你的词语(例如“树”)就 不可能指向现实中的树,因为你没有与真实树发生因果接触。那么你的语言和思想内容就不是我们通常理解的那些含义。所以“我是缸中之脑”这样的陈述在这种情况下并不成立其本来意义

我觉得 Putnam 这个说法也是有问题的。大脑不是一个“被创造物”,而是一大堆肢体感官进化之后的连接网的中枢。所以大脑必然和“人”这种结构是一体的。所以我们默认,缸中之脑 这个设定上就是错的的。既然要模拟,那么这个问题的升级版就得是「缸中之躯 body in a vat」

那么问题来了,如果你整个身躯如同 the Matrix 那样当电池养着,感官意识生活在虚拟世界里,仅凭自己,能识别出这一点吗?

问了很多AI,结论都是

被安置在另一物理层级中的完整人类系统,单靠 我思、内省、反思意识 永远无法推出“我在 vat 里”

然而我觉得是可以的破解的。正如我那个奇怪的梦一样,很简单,如果在 the Matrix 里,你直接去跳楼,或者发生交通事故,腿断了。这个常见吧?但是你肉体的腿没断啊。这个时候 the Matrix 为了精确模拟,是不是得把你神经信号精确在创口面截断?下肢没感觉了就是断了。

只切断信号不行啊。肌肉还连着呢?也得去掉关联?那么一大坨肉,体重质心也得跟着模拟纠偏呢?泡在水里的角动量怎么平衡呢?嘿嘿。

再比如,你一拍大腿,摸摸自己的膝盖,你的肉体其实有实体的东西存在,给物理碰撞挡着了。但是你在虚拟世界里理论上应该只能摸到空气,手臂挥舞的路径需要能穿过大腿所在位置。这穿模了等于是。这么麻烦,耗费电力计算资源,还不如系统直接禁止你摸腿。

而且系统得“发挥创造力”模拟你走路不便的样子,虽然实际上你肉体是完整的。

等等种种,我感觉,这种模拟肯定会出漏子,不真实。

可以得出一个结论:the Matrix 里是没有后天残疾人的。回想了一下电影里打斗场景虽然多,但是的确大马路上没一个缺胳膊断腿的。

把一个不存在的东西模拟出来欺骗大脑容易,但是要把一个存在的东西抹去隐藏,付出的努力就复杂麻烦得多得多。就好比,把橙汁倒进水容易,但是要把橙子里的水分离出来,那可就麻烦多了。

我称之为《the Matrix里无🧑‍🦽轮椅》定理

高级一点的说法,水里加橙汁增熵容易,但是你要模拟橙汁里没水,系统就得整体降熵。这个代价足以摧毁一切系统。

Posted

stderr

程序员和普通人有什么不同之处

很久之前看到个闲聊 程序员相对于大部分普通人,优势在于哪里?,让AI 总结一下,优势大概无非这么几点

  • 工具性能力
    • 信息检索与筛选能力更强(搜索、判断信息真假、避免诈骗)。
    • 更熟练使用计算机与互联网工具。
    • 能阅读英文技术资料(至少不抗拒)。
    • 更容易接触并使用新技术(如 LLM、AI 工具)。
  • 问题拆解与逻辑分析
    • 能将复杂问题拆分、定位关键变量(debug 思维、XY problem 意识)。
    • 对流程、因果、边界条件更敏感。
  • 自动化
    • 面对重复性、规模化任务,倾向于用程序或工具一次性解决。
    • 对“手工反复做事”容忍度低。
  • 持续学习
    • 技术更新快、面试压力大,迫使长期学习。
    • 相比不少毕业后停止系统学习的群体,程序员中位数更高

当然,ChatGPT 的回答更好,我有修改和评论如下:

一、把“模糊问题”拆成“可执行步骤”的能力

这是程序员最核心、也最被低估的优势。面对一个模糊目标,程序员天然会问:

  • 输入是什么?
  • 输出是什么?
  • 中间有哪些状态?
  • 失败路径是什么?

这种结构化拆解能力,在现实世界里更常见的是“我只设想了一种成功路径,就有概率能成”。参考最近《勇哥说餐饮》节目里各种案例。

二、对“系统”和“因果链”的直觉更强

程序员每天都在和系统打交道:。状态是如何流转的?一个小改动会引发哪些连锁反应?哪里是瓶颈、哪里是单点故障?所以他们往往更擅长:

  • 看穿流程里的 隐藏规则
  • 识别“这个设计迟早要出问题”的地方
  • 理解现实世界里的制度、组织、流程其实也是系统

很多人是“事件驱动思维”(今天发生了什么),程序员更偏向“系统驱动思维”(为什么会这样发生)。

三、对“抽象”和“符号世界”的适应力

程序员长期生活在一个高度抽象的世界里,变量 ≠ 现实对象,但能代表它;接口 ≠ 实现;规则写清楚,比情绪重要。这会带来几个现实优势:

  • 更容易理解复杂制度(合同、政策、金融规则)
  • 更不容易被表象或话术迷惑
  • 更擅长在规则允许的空间里做优化,而不是硬碰硬

四、可复制的“学习—验证—修正”闭环

程序员学习的典型模式是 查文档,看源码,动手试,报错 - 修 - 再试。这是一种 快速反馈学习机制,相比之下,很多普通人的学习是:听别人讲 - 记住结论 - 很久以后才知道对不对

所以程序员往往对新领域不那么害怕,更相信“我可以边做边学”,对失败的心理成本更低(反正先跑不起来)

五、对自动化与杠杆的敏感度

程序员很早就被训练成对这类问题敏感。这个事情要重复做吗?能不能写个脚本?能不能一次性解决?这会自然转化为更懂得利用工具,放大个人产出,更早意识到“时间 ≠ 产出”的非线性关系。很多普通人是“多干点=多产出”,程序员更容易意识到“一次设计,长期复利”。

六、相对理性的风险观

写代码会反复教你一件事:世界不是非黑即白,边界条件比主路径更重要,“大概率正确”比“情绪确信”靠谱。这使得程序员在很多现实决策中更看概率而不是故事,更能接受不完美方案,更少沉迷“赌一次大的”


我个人的见解,程序员唯一天生的优势就是逻辑流程的附加值。当你写一堆 if 之后,发现有个 else 需要补,然后往往之前考虑的东西里压根就没想到这一层会出问题。

换句话说,我感觉普通人看待事物都是「点」为主。提需求和验收都是各个「点」。拥有「线」或「面」思维的人少之又少。但是程序员从一开始就不得不考虑「空间」,如果你喜欢各种“设计模式”,甚至meta programming,需要考虑 configuration space,所以看待事物比普通人更广。对约束和边界的理解比普通人看得更透彻。多实践几次防御式编程(Defensive Programming),会对世界上那些事容易,哪些事复杂有更清晰的认知。

其他的优势感觉更多是个体差异,谈不上优势。没了。

Posted

stderr

gpt5.1 释义意大利、乌克兰国歌歌词

之前 ChatGPT释义意大利国歌歌词 还是 gpt-3.5,得到的答案有点模糊,主要是不会用,还你一句我一句聊天呢。

现在提词也用得多了,知道怎么敲打AI 才能获得想要的结果了。

prompt写:

用中英双语一句一句翻译下面的歌词,每一句都面向无背景的读者解释其含义,以及历史渊源
Fratelli d'Italia (Inno di Mameli) ... (贴上歌词全文

回答:

这首歌是意大利国歌《Fratelli d’Italia》,又称《Inno di Mameli》,写于 1847 年,处于意大利民族复兴运动 Risorgimento 的时代。

《Fratelli d’Italia》(马梅利之歌)逐句翻译与解释

第一节

  • Fratelli d'Italia
    Brothers of Italy 意大利的兄弟们
    开场呼喊,强调全国人民是同一民族、同一命运共同体。

  • L'Italia s'è desta
    Italy has awakened 意大利醒来了
    象征意大利民族意识觉醒,从分裂与被统治状态中站起来。

  • Dell'elmo di Scipio / S'è cinta la testa
    She has girded herself with Scipio’s helmet 她把西庇阿的头盔戴在头上
    “西庇阿”指罗马名将小西庇阿(Scipio Africanus),打败了汉尼拔。
    象征继承古罗马的荣耀与武勇,号召民族复兴。

  • Dov'è la vittoria? / Le porga la chioma
    Where is Victory? Let her bow her head to us 胜利在哪里?让她低头任我们加冕
    拟人化的“胜利女神(Vittoria)”。意思是:胜利应该向觉醒的意大利臣服。

  • Ché schiava di Roma / Iddio la creò
    For God created her as a slave of Rome 因为上帝创造她,原本就是罗马的女奴
    指古罗马的“命定胜利”,象征意大利天命所归,要重新统一路线。

(前面一段重复一次,略)

  • Stringiamci a coorte
    Let us form ranks together 让我们像古罗马军队那样 并肩结阵
    coorte = 罗马军队“步兵大队(cohort)”。号召团结如罗马军团。

  • Siam pronti alla morte / L'Italia chiamò!
    We are ready to die — Italy has called! 意大利召唤我们,我们已准备赴死!
    民族解放运动的誓词。

(副歌重复)

第二节

  • Noi fummo da secoli / Calpesti, derisi
    For centuries we were trampled and mocked 我们被践踏、被嘲弄了整整几个世纪
    指意大利长期被分裂、被奥地利等大国压制。

  • Perché non siam popolo / Perché siam divisi
    Because we were not one people, because we were divided 因为我们不是一个民族,因为我们四分五裂
    意大利被分为多个公国和外国占领区(萨丁尼亚、托斯卡纳、两西西里、奥地利控制的伦巴第等)。

  • Raccolgaci un'unica / Bandiera, una speme
    Let one flag, one hope gather us together 让我们在一面旗帜下、在一个希望下汇聚
    呼吁民族统一。

  • Di fonderci insieme / Già l'ora suonò
    The hour has already struck to merge us together 融合为一体的时刻已经到来
    暗指革命和独立运动的号角已响。

  • Uniamoci, amiamoci / L'unione e l'amore
    Let us unite, let us love — for union and love 团结、相爱吧——因为团结和爱
    浪漫化地表达“团结就是力量”。

  • Rivelano ai popoli / Le vie del Signore
    Reveal to peoples the ways of the Lord 会向万民显明上帝的道路
    宗教化语言,用来强调道义正当性。

  • Giuriamo far libero / Il suolo natio
    We swear to make our native soil free 我们发誓要让祖国获得自由
    标准民族主义誓言。

  • Uniti, per Dio / Chi vincer ci può?
    United, by God — who can defeat us? 在上帝面前,我们团结一心,谁还能战胜我 们?
    强调“团结 → 不可战胜”。

(副歌重复)

第三节:历史典故最多的一段

  • Dall'Alpi a Sicilia / Dovunque è Legnano
    From the Alps to Sicily, everywhere is Legnano 从阿尔卑斯到西西里,到处都是“莱尼亚诺”精神
    “莱尼亚诺之战”(1176)中,意大利城邦联盟击败神圣罗马帝国皇帝弗雷德里克一世。
    象征意大利人民长期反抗外来统治的传统。

  • Ogn'uom di Ferruccio / Ha il core, ha la mano
    Every man has the heart and hand of Ferruccio 每个意大利人都拥有费鲁乔那样的心与手
    弗朗切斯科·费鲁乔(Francesco Ferrucci),1530 年佛罗伦萨抵抗帝国军的民族英雄。
    象征勇气、牺牲与爱国。

  • I bimbi d'Italia / Si chiaman Balilla
    The children of Italy are called Balilla 意大利的孩子们都被叫作“巴里拉”
    “巴里拉(Balilla)”是 1746 年热那亚一个男孩扔石头带头起义反抗奥地利士兵的传说人物。
    象征“从小就有反抗精神”。

  • Il suon d'ogni squilla / I Vespri suonò
    The sound of every bell echoes the Sicilian Vespers 每一次钟声都回响着“西西里晚祷”的呼声
    “西西里晚祷起义”(1282)反对法国安茹王朝统治的著名民族反抗事件。

  • Son giunchi che piegano / Le spade vendute
    The hired swords bend like reeds 那些雇佣来的士兵像芦苇一样被折断
    暗指外来压迫者的军队(尤其奥地利的)终究不堪一击。

  • Già l'Aquila d'Austria / Le penne ha perdute
    The Eagle of Austria has already lost its feathers 奥地利的雄鹰已经掉落了羽毛
    “雄鹰”指奥地利帝国国徽。
    意大利在多次革命中逐步摆脱奥地利控制。

  • Il sangue d'Italia / Il sangue Polacco
    Italian blood, Polish blood 意大利人的血、波兰人的血
    波兰与意大利在 19 世纪都反抗奥地利、俄国等帝国,有共同命运。

  • Bevé, col cosacco / Ma il cor le bruciò
    Austria drank it with the Cossack, but it burned their heart 被奥地利人与哥萨克喝下了(比喻镇压),但终 究烧伤了他们的心
    指奥地利与俄国(哥萨克)曾联合镇压欧洲民族运动,但最终遭到了民族觉醒的反噬。

(副歌重复)


其实还有个国家的国歌也提到哥萨克——乌克兰国歌。gpt5.1 也能解释:

乌克兰国歌《Ще не вмерла України і слава, і воля》(《乌克兰的荣耀与自由尚未亡》,又称 Shche ne vmerla Ukrainy…),写于 1862–1863 年,处于乌克兰民族觉醒、长期受帝国统治(沙俄、奥地利帝国)时期。

  • Ще не вмерла України ні слава, ні воля.
    Ukraine’s glory and freedom have not yet perished. 乌克兰的荣耀与自由尚未死去。
    核心思想:乌克兰民族虽长期被强权统治,但民族精神未灭。

  • Ще нам, браття-українці, усміхнеться доля.
    Fate will still smile upon us, brothers Ukrainians. 命运仍会对我们微笑,乌克兰的兄弟们。

  • Згинуть наші вороженьки, як роса на сонці,
    Our enemies will vanish like dew in the sunlight. 我们的敌人会像阳光下的露水一样消失。

  • Запануєм і ми, браття, у своїй сторонці.
    And we, brothers, will rule in our own land. 兄弟们,我们也终将在自己的土地上主宰命运。
    表达“民族自决”的核心诉求:乌克兰人要在自己的领土上做主。

  • Душу й тіло ми положим за нашу свободу,
    We shall lay down our soul and body for our freedom. 我们愿为自由奉献灵魂与身体。
    象征为独立而奋斗、牺牲甚至殉难的决心。

  • І покажем, що ми, браття, козацького роду!
    And we shall prove that we are brothers of the Cossack nation! 我们要证明自己是哥萨克的后代!
    “哥萨克(Cossacks)”是乌克兰民族象征:自由、骑马武士、自治共同体、反抗帝国统治的精神。乌克兰民族精神常以哥萨克传统为核心象征。

  • Станем браття, в бій кривавий, від Сяну до Дону
    Let us, brothers, stand in bloody battle from the San to the Don. 兄弟们,让我们从桑河到顿河,投入血战。
    “桑河(San)”位于乌克兰西侧,“顿河(Don)”在东面。

  • В ріднім краю панувати не дамо нікому.
    We will not allow anyone to rule in our native land. 在祖先的土地上,我们不会让任何人做主。

  • Чорне море ще всміхнеться, дід Дніпро зрадіє,
    The Black Sea will smile again, and Grandfather Dnipro will rejoice. 黑海终将再次微笑,老祖父第聂伯河将欣喜。
    “黑海”与“第聂伯河(Dnipro)”象征乌克兰土地与生命源泉。

  • Ще на нашій Україні доленька наспіє.
    A good destiny will yet ripen for our Ukraine. 幸福的命运终会降临在我们的乌克兰上。
    “ripen”(成熟)是农业意象,象征民族复兴。

(副歌重复)

  • А завзяття, праця щира свого ще докаже,
    And perseverance and sincere work will yet prove their worth. 而坚定与真诚的劳动终会证明自身的价值。

  • Ще ся волі в Україні піснь гучна розляже.
    The loud song of freedom will yet resound in Ukraine. 自由的洪亮之歌必将在乌克兰回荡。

  • За Карпати відіб’ється, згомонить степами,
    It will echo beyond the Carpathians, resounding through the steppes. 它将越过喀尔巴阡山,在草原上回响。
    喀尔巴阡山=乌克兰西部,草原=东部以至黑海北岸

  • України слава стане поміж народами.
    Ukraine’s glory will stand among the nations. 乌克兰的荣耀将被万国所知。
    表达民族独立后获得国际承认的希望。

(副歌重复)


之前不理解是因为印欧语这个从句太长了,歌词分为好几段给人整懵了。

还有听得出来这些欧洲国家都好喜欢吹自己领土,从哪里到哪里。

Posted

stdin

三星堆的猜想

看完这个视频《三星堆新的诡异出现了:不同祭祀坑的文物竟能拼在一起!》,很有意思

尤其是那些青铜人背着的青铜尊,还有能插拔的接口——2 号坑的能和 8 号坑的吻合对接,而且不是焊接的

如果这是刻意设计,而不是巧合,那意味着一种可组合的礼器系统

从这个出发,随便乱写点。


“国之大事,在祀与戎。”

传奇与“天命”

历史上很多传奇武夫的胜利方式,往往可以浓缩成一个字:
上头之后一路猛打,突破极限,做出本来不该做到的事。

这种状态,随后常被本人或旁人解读成“天命”:
战场迷雾中的神意、杀红眼后的宿命、某种谶语被“应验”、某个巫师提前说过类似的话,于是凡人的冲动就披上了宿命论的外衣。

当这种机制成熟,它不仅渗透战争,也能塑造祭祀:
火热与激烈被神化,冲动与运气被制度化。

比如《兰陵王入阵曲》,又比如《秦王破阵乐》那种“二创式”传奇化。

那种“援军终于来了”的情绪爆发、守城者经历漫长绝望后看到鲜衣少年破阵而入的瞬间——完全可以被编进仪式里,反复上演。

青铜“尊” 与 战利品

三星堆出土的大量青铜“尊”,
造型、结构、纹饰与千里之外中原、河洛、甚至更远族群的器物“撞脸”。

考古界常见解释是:交流、贸易、工艺扩散。
但也可以有另一种想象:

如果这些尊不是交易来的,而是征服来的呢?

许多古文明都有“把敌国宗庙神器搬回本国”的传统。
把战利品纳入本族的祭祀体系,就是政治意义上的“重演胜利”。

战争被写进舞蹈与音乐,每一次重演,就是一次“再赢一次”。

三星堆或许也如此:
征服某片区域后,把对方的祭器搬回来,
在下一次大型祭典中作为“道具”,让族群重新体验那场胜利的高潮。

视频里提到,许多尊不仅造型相似,还有切割、局部改造的痕迹;
甚至能装在巨型青铜人像的头顶,或插进背后的支架里。
这更像是为表演准备的模块化礼器,不太像日常用于参观的静态神器。

三星堆大量青铜器造型夸张异类,却不是炊器、食器、酒器、水器或乐器。
中原文明那时还在追求锅碗瓢盆的精美,而古蜀王已经在精神层面玩超大号青铜手办了。
所谓“七国称王,杜宇称帝”——帝即神明。
后世能玩这种规模手办的,也就秦始皇一个,他也是第一个把人皇与昊天上帝合体为“始皇帝”的人。

不必真的赢,只要“仪式赢”

有人说古蜀国没那么强,不可能真打到长江下游。

但打仗不一定是单挑,可能是联军。

古蜀国征战中原的例子,如 《尚书》里 《牧誓》:

王曰:“嗟!我友邦冢君,御事:司徒、司马、司空,亚旅、师氏,千夫长、百夫长,及庸,蜀、羌、髳、微、卢、彭、濮人。称尔戈,比尔干,立尔矛,予其誓。”

姬发率八国联军,到了商都朝歌南郊七十里的牧野,举行誓师大会,一定要痛揍帝辛!(网上有人说,蜀、羌这里不是古蜀国,而是在山东,那么前面还有一句“王左杖黄钺,右秉白旄以麾,曰:“逖矣,西土之人!” 怎么解释?旄这里指牦牛尾巴。还有后面的“西土之人”)

再比如距离三星堆 1500km 远的外蒙古色楞格河发源地杭爱山上,由 东汉 班固作《封燕然山铭》记功刻石,记录了窦宪带领的联军:

鹰扬之校,螭虎之士,爰该六师,暨南单于,东胡乌桓,西戎氐羌,侯王君长之群,骁骑十万。

这么大的阵仗,分一点不锈钢盆儿战利品,搬回老家炫耀总是可能的吧?

更何况古代交通不便、消息不流通。
刘备硬要说汉献帝被曹丕害死,于是他要称帝——统治团体的叙事只要统一口径,真假并不重要。

胜败是事实,但“事实的意义”归统治阶层解释。

甚至可以这么说,一旦祭祀规模扩大,演出体系成熟——连失败都能“演成胜利”。

三星堆如果也掌握了这套叙事逻辑,
那就不难理解为什么他们的青铜礼器如此夸张、戏剧化——
他们不需要真实的记录,只需要可现场表演的叙事

在这种文明中:

  • 真实的胜利,是一次。
  • 仪式的胜利,可以是无数次。

这就是政治的永远赢,一直赢,中赢,大赢,特大赢的机制。

无文字时代的巨型剧院

有人说,三星堆唯一的遗憾就是没有文字,铭文。

在没有文字、却需要整合族群精神的时代,叙事就必须“能被看见”。
史诗从来不靠纸墨诞生,而是从战火与表演里长出来的:

奥德赛、伊利亚特、摩诃婆罗多、吉尔伽美什、格萨尔王——
几乎每一部早期文明的宏大叙事都以战争为底色,以英雄为舞台,靠吟唱或演出在人群中播散。

统治阶层和普通人都一样喜欢戏。
就像 MCU 里 Loki 在阿斯加德宫廷里看戏班子演雷神与奥丁,
就像 HBO《权力的游戏》中,国王、贵族、百姓在君堡都要看戏团演他们自己的“宫斗史”。
戏是权力的镜子,也是人民的教科书。

三星堆青铜器的夸张造型——大眼、巨耳、黄金面罩、戴冠、巨立人、神树——非常难说是日用品,倒更像是一个国家级戏团的服道化库。

在这种文明里,“演出”就是文字,“器物”就是字体。

大祭司

沙盘推演,在这样的文明中,绝非后世军事院校那些“兵棋推演”那么简单功利。

大祭司的职责是双重的:

  • 总结过去的战争——为失败找神意,为胜利找因果,给部族的恐惧做心理缝合。
  • 预言未来的战争——以故事构建期待,用仪式模拟结果,让众人相信“我们能赢”。

这种角色在古代十分普遍:
从苏美尔预言师、到中国卜筮、到北亚萨满、到希腊寓言神谕,
说到底都是同一职能:把政治合理化,把暴力神圣化,把人心稳住。

三星堆如此众多的青铜面具,会不会是操场棋盘的一部分呢?

灭亡=国家叙事消失

三星堆的突然消亡一直是谜题,但无论原因是什么,它的结局只有一种

当戏剧性的祭祀体系崩塌,
当大祭司无法再整合神意,
当国家无法再组织大型表演来重述“我们是谁”,
当共同体想象断线,
那国家也随之散掉。

这就像他们曾征服过的敌国的祭器一样——失去使用者,失去意义,最终被土掩埋。

文明不是武力被摧毁,而是叙事被抹去。
当一个国家被迫进入别人的故事、成为别人的祭祀道具时,它的国家也就不存在了。

三星堆的命运,或许正像祭祀坑里的青铜器:

被掩埋,被遗忘,被失去剧本。

后记

道教(注意区分道家)又张道陵在蜀中起家,里那么多神仙妖怪,有没有可能就是三星堆大剧院故事的远古投影?


以上内容由AI汇编,如果有明显错误说明是我手动增补的。

发现现在写blog很容易。我只需要把我零碎的东西,甚至都不是句子,全丢给AI,它就能自动帮我写一篇通顺的文章。我不需要去思考修辞和段落组织。

我只需要检验最后文章表达的是不是我的本意。我可以负责任的说,这篇文章就是100%我想表达的。

视频是昨晚睡前看的,凌晨5点左右醒来迷迷糊糊就有了这个零碎的想法,还有想到 颉利可汗 真人秀,ptsd 战后创伤,高祖剑、王莽头、孔子履这些。AI不写,我也就懒得费劲加进去了。

Posted

stderr

获得自己在Google眼里的IP

可能是最古老的问题,自己的IP是什么,网上这样的工具一大把,我自己甚至都搓了个

但是你访问 google 的ip,如果遇到网络配置很复杂,split tunnel 什么的,可能就麻烦了。

Google

搜了一圈,没想到 gemini 给的线索最有用。它提到可以

dig TXT +short @ns1.google.com o-o.myaddr.l.google.com

但是AI 毕竟笨了些,套个 DoH 不就可用了。

curl -s "https://dns.google/resolve?name=o-o.myaddr.l.google.com&type=TXT"
{"Status":0,"TC":false,"RD":true,"RA":true,"AD":false,"CD":false,"Question":[{"name":"o-o.myaddr.l.google.com.","type":16}],"Answer":[{"name":"o-o.myaddr.l.google.com.","type":16,"TTL":60,"data":"edns0-client-subnet x.x.x.x/24"},{"name":"o-o.myaddr.l.google.com.","type":16,"TTL":60,"data":"74.114.31.154"}],"Comment":"Response from 216.239.38.10."}

返回里的 edns0-client-subnet 就是C类网址。不够精确但是够用。

curl -6 可以获得 ipv6

如果 dns.google 不够好,可以换 dns.google.com

curl "https://dns.google.com/resolve?type=TXT&name=o-o.myaddr.l.google.com"

网上关于google这个 trick 没有正式文档支持。我在public-dns-discuss 能搜到 最早 2015年一位叫 Shen Wan 的疑似google员工的问题排查方法。他原话

our name is "Google Public DNS", not "Open DNS"

所以应该和当年 8.8.8.8 推出有关。

Gmail 登录历史

V站 还有一个偏方说 Gmail 把邮件滚动到底部有个 Last account activity ,点开也有IP。

但是需要登录,而且网址里有个 ik 的参数猜不出规律。

其它DNS

  • dig whoami.cloudflare ch txt @1.1.1.1 +short
  • dig +short myip.opendns.com @resolver1.opendns.com
  • dig whoami.akamai.net. @ns1-1.akamaitech.net. +short

aws

然后顺便发现 https://checkip.amazonaws.com/ 有官方文档说明

cloudflare

所有 cloudflare 都可以查 /cdn-cgi/trace 比如

  • https://www.cloudflare.com/cdn-cgi/trace
  • https://x.com/cdn-cgi/trace
  • https://chatgpt.com/cdn-cgi/trace

Posted

stdout

AI吊牌

AI厂家为了勾引你多消费token,每次回答都会在末尾问一句“客官,加钟不”。恰好联想到最近 “巨型吊牌防退货” 很火。光鲜亮丽的的背后,是扭曲丑陋的灵魂。 所以起了这么个标题。







不仅是学生,老师也有

今后人和人的交流都是token了。。。下属用AI把bulletpoint扩成长篇报告,上级把长篇报告用AI总计成 bulletpoint 🤣 正如康德所说,人真的不是 means to and end,以后就是 end 了。人权除了所有权,创造力和执行权都交给AI吧。

Posted

stdin

OpenWRT p910nd适配兄弟打印机

买了个兄弟牌(Brother)的打印机,热销基础款,听说他家的联网打印很烂,所以只有USB的。

又买了个打印盒子,OpenWRT的,本来以为是 CUPS,结果一看 p910nd 好家伙。看了下这玩意纯粹是 tcp 直连 /dev/usb/lp0

在 macOS 上配置陷入了迷茫,最后问ChatGPT给调通了居然。

首先还是得下载官方驱动,然后添加 IP打印机

  • Address 那里输入OpenWRT的 IP:9100
  • Protocol 这里注意,选 HP JetDirect。这里的意思为 AppSocket。
  • 最下面的 Use 选择驱动

也就是说IPP, AirPrint,LPD这些协议都不行。

然后试了下也失败,看了下默认USB双向通信,最好改成单向。OpenWRT上:

# cat /etc/config/p910nd 
config p910nd
  option device        /dev/usb/lp0
  option port          0
  option bidirectional 0
  option enabled       1

macOS上:

lpadmin -p <IP打印机名字> -o usb-no-bidi-default=true

应该就行了。

支持 Airprint 就下一步想办法了。安卓上的打印只能输入IP,不支持 9100端口,估计支持了也是白费力,还得 .ppd 之类的翻译一下。

Posted

stdout

《藏在罐子里的爱》未删减版

秋夜凄凉,月光暗淡。如墨般漆黑的夜空中却闪着几点星光。我抬起头,凝视着天上闪光的星,想起我妈曾经在星空下和我说过的:每个勤劳善良的人,在死后都会变成天上的星星,保佑着地上的人。幼小的我便在想,里面的哪一个会是奶奶呢?

今天乡下的月很圆,后山的土地和院里的人沐浴着同样的月亮,只是一层薄薄的土,人与人就再难相见了。只有月亮还和几年前的一样,看着它,思绪就跨过了时间,回到了过去橱柜子上的罐子里。

那时我还只有几岁大,和爷爷奶奶一起生活在乡下。当时我的话都说不太利索,天天只知道向外跑,对许多新奇东西有着极大的好奇心,总是喜欢跟着大声嘎嘎叫的肥鸭绕着院子转。在屋里的各东种小东西都喜欢看一看,摸一摸,有时甚至还会用嘴尝一尝。

那是一个炎热的下午,毒辣的阳光炙烤着大地,刺眼的阳光令人望而生畏,我像一只无头苍蝇一样在客厅里乱窜,一转头,又跑进了厨房看到了正在忙活着的奶奶,极度无聊的我看见旁边的柜子上有一个罐子,里面似乎装着些什么。我努力地伸手想去拿,可就是差那么一点。奶奶好似背后也长了一双眼睛,看见了我踮着脚目不转睛地盯着那个罐子。她水龙头都没关,放下了手上的东西,就毫不犹豫地冲了过来,赶忙用双手小心翼翼地给我抱到旁边。然后才注意到我是想要罐子,于是便帮我拿了下来,拿着小勺子喂了我一点。这时我才看见罐子里装的是什么,是许多的白色小颗粒,入口时这种甜蜜的味道不断地冲击着我的大脑。后来奶奶每天都会给我吃一点,每次我都笑的非常开心,奶奶明明没吃,却也和我一样。幸福从罐子里跑了出来,弥漫了整个屋子。

后来,我离开了老家,来到城里读书,也是在厨房里,我看见了一个差不多的罐子,里面也装满了白色小颗粒。我欣喜地拿了一点尝了尝,却是一股酸苦味,后来我才知道什么是糖,什么是盐。可是这时我已经无法向她撒娇要糖吃了。

“物是人非事事休,欲语泪先流”,只有记忆中藏在罐子里的爱,温暖依旧。如今看着月光,再回想这些事,脸上纯粹的笑容,眼角晶莹的泪花,都变成对亲人、对亲人的爱的怀念了。


原文作者:湖南省娄底市第一中学附属星星中学初三年级14岁学生龙睿熙

看到,douyin上 有人说 然后有图片。用qwen识别了一下

前两页图片

最后一页图片见这里

网上流传的是老师改编版。说实话老师把最后一段改得很成功,原作者不够最后一击的“豹尾”那么有情绪冲击力。

Posted

stdin