普通视图

老面头的大烧饼

2025年11月30日 23:45

上班路过市场的时候,经常听到叫卖声:「烧饼,老面头的大烧饼!」我一直没太当回事,甚至还想,不就是从小吃到大的那种烧饼吗,怎么现在成了稀罕物?

昨天的晚饭是我妈送来的冬瓜排骨汤配烧饼。那烧饼,像是受潮的钙奶饼干,或者是我所认识的那种烧饼脱了水,蘸了排骨汤之后它竟然像是瓦楞纸……总之就是,口感不对!显然不是老面头做出来的。老面头,诸位可知道是什么来头?要说起来也很好玩,其实和做面包时会用到的「酸面团」异曲同工。我有一段时间像是养宠物一样养了一瓶酸面团,只是面粉和水,时不时取出一点来做面包,剩下的呢,再丢进去点面粉和水「喂食」,它就能持续生长……扯远了,老面头也是类似的东西,就理解成自然酵母就对了。和面时加入一点上次用剩下的老面头,就能替代酵母粉。效果可能比加酵母粉要慢,我记得之前自己做馒头,是要头天和面,发面发一晚上,第二天才能塑形去蒸。

好吧,啰嗦了这么多,我希望您各位不要误以为我要开始说匠人精神、手工好过机器之类——我恰恰是另一边的,只要是,有明确的优化方案的事情,我都愿意相信,机器能比人做得好。但问题是,「想把事情做好」,这件事,机器说了不算。很多时候,手工做的比机器做的好,只是因为恰好坚持手工的那个人,比机器的主人更想把事情做好而已。当然这里面有许多的必然,比如硬件投入更高,导致回收成本有了更多的紧迫感和压力,于是会从其他方面克扣成本;而手工者产量有限、能服务的客户有限,所以更有客观动力或压力,必须要把东西做好,才能卖出去……诸如此类。

但是其实我也不是想和妳分析这些,妳看前面我也提到了是「口感不对」,而没说口感不好,因为我只是突然想到,吆喝「老面头的大烧饼」那么卖力,却不见多少人买,该不会是,人们对口感的理解已经差异如此之大了吧?站在虚设的对立面来看,我所认可的烧饼的样子,或许也不怎么好:干吃废牙,双手握着送到嘴边咬紧,揪出去老远双手都绷直了它还没扯断;蘸了汤一下子泡成软绵绵一坨,像是薄面筋。啊啊啊,为了我这个「恶趣味」能多存在几年,明天路过烧饼摊子,我可得再买二斤。

fin.

向懒人学习

2025年11月20日 12:15

女儿问我怎么搭建编程环境。我们远程交流了一会,她应该打开编辑器还不到 10 分钟,问出一个我从来不知道会有的需求问题:在输入完print("Hello World"引号里的内容之后怎么把光标移动到引号外边去输入后括号?

不是按一下向右的方向按键吗?

但是如果光标在l处呢?

好吧。我搜索了一下,不知道是不是(往好处说)因为我不够懒,我从来不知道command+→键是光标移动到行末尾,option+→键是移动到单词末尾。

fin.

甄仁岛的来信

2025年11月13日 23:15

这事儿,得从上次写那个「互动小说生成器」说起。哦,抱歉,估计大家每天都会被迫看几条AI相关的文章,这篇多少又和它有关。上次那个互动小说生成器就是 AI 驱动的嘛。说实话,虽然我当时只是把它嫁接在 mastodon 上面,作为一个社交平台机器人,接收网友的互动指令来生成故事内容,但是我对比了一些市面上专为写小说而设计的工具,其实设计思路上,我自己感觉,那个简单的机器人已经是第一流的水平了:它有世界状态快照,记录故事中出现过哪些人物、物品、线索,「第一幕中有把枪挂在墙上,那么在第二幕或者第三幕中这把枪必须发射」;它有因果链,记录每一个事件的前因后果,避免情节出现矛盾;它还有节奏器,负责控制不同章节的节奏快慢,以及实现我个人趣味方面的章节间字数多少的某种韵律感……好了,不说了,虽然我自认为设计的很不错,不过我也必须承认,AI 搞创作,还是不行。对文字有足够的敏感度,就总会觉察到,处处别扭。所以再是耗费心力写出来的代码,也毫不吝惜地删了。

不过能不心疼吗?我都没存到 github 上就那么给删了。所以,后来又想着,也不真用它写小说,就玩儿呗,再写一个更周详的工具吧。于是就有了现在这个还在弄的游戏。刚才也提到了世界快照,生产故事已经用到了「世界」这个概念,那么继续把这个世界充实起来,就也顺理成章。其实我读小说时经常会想,曾经和主角擦肩而过的那些无名的角色,他们的日常是怎样的呢?难道他们的生活就没有被书写价值吗?所以一开始,这个游戏是想呈现出一部全景小说。玩家随便选择一个角色,就能观看聚焦在这个角色周围的故事。因为一开始的想法是游戏里的每个 NPC 都由 AI 驱动,所以很自然想到了《西部世界》,所以我给项目文件夹命名「东部世界」,但是想也知道那不太现实,先不说 AI 太贵,就算不差钱,如果 NPC 每个行为都要几十秒运算,那也卡得不像样了。还是得老老实实像传统游戏一样写代码,给 NPC 设定日常流程,饿了该吃饭、渴了要喝水,这些不能是 AI,而是 if else。不过还是得感谢 AI,慢慢程序有了个雏形,我弄得很慢,因为 AI 写出来的东西我要求自己不看明白咱就不继续往下走,边看边学吧。这也是我没打算把这个东西开源的原因,小玩意不值得拿出来现眼是一方面,主要是高手云集,诸位写得快,我学得慢,还不一下子就成了我看都看不懂的东西了?那可不行,别剥夺我的快乐。总之吧,游戏渐渐也跑起来了,让我想到《楚门的世界》,因为我就像是在对着镜头窥视这些一无所知的 NPC 生活。所以我又给游戏取名字叫《甄仁岛的故事》。楚门对甄仁,还不错。

我跟朋友聊起这个游戏,他说,啊?就是看文字?哈哈,好像「看文字」现在成了很奇怪的事,这倒又给了我一些想法。我觉得游戏叫《甄仁岛的来信》吧,不光是纯文字的游戏,索性,连原计划实时查看世界正在发生的故事的「信息看板」都砍掉,游戏世界就是个黑盒子,我们不知道里面在发生什么。倒也符合游戏世界的设定:那是一个被奇特场域包围,导致人类无法进入或离开的一个小岛,有大约几十个岛民居住其上,每天只有一班无人驾驶的轮渡进出岛屿,补给物资,同时也运送信件。玩家唯一可用的交互方式就是,特定时间段,在游戏的网站上投递信件,回信第二天才能跟随轮渡回到码头,寄送到玩家手上——也就是注册时填写的电子邮箱里。

如果当作小说来看,AI 的创作的确不行,但是当作游戏来玩,那种略有些别扭的文风,恰好带来一种复古游戏体验。第一个阶段的游戏目标是,通过文字交流,画出甄仁岛的大致地图。我还在想奖品是什么。毕竟这还挺难的,奖品也得够有吸引力才行。为了实现这个探索地图的功能,我已经实现了 NPC 在地图上自由行走,并且会记录下从 a 点到 b 点用了多少时间,但是,行走速度和身高和年龄有关——又是 if else 算出来的数值。而且岛的面积可不小,要想确定地图内容,得和不止一个 NPC 对话,互相参照和补充着分析才行。他们现在也已经可以主动规划去走一遍 a 到 b 的旅程,但是经我测试,怎么劝他下定决心,放弃当天的工资,去专程走这么几趟,是需要一些笼络人心的话才行的。

然而。我支线开得太多,性格又拖泥带水,总感觉离「现在就上线吧」还差那么一点:应该有真实的经济系统;应该有最初设想的故事性……而且一边写,一边学,有时候恍然大悟,哇哦原来可以这样实现?那岂不是之前那个功能可以写得更优雅些?于是,版本才到 0.001,却已经重构三次了。哦,我还忘了提,李飞飞工作室出的那个简单提示词生成一整个图形化可交互世界的 AI 产品,简直是和我这个小小小游戏完全两极的东西。总之就到这里吧,今天就不看代码了,梳理一下思绪,记上这一笔。希望早日完工,但也可能完不了工。

fin.

人类大脑是单线程的吗?

2025年10月24日 10:50

作为人类,我不太愿意接受「大脑是单线程的」。但是很多时候我盘算着要做甲乙丙丁好多件事,但是最终发现只能一件一件去做,怎么解释?

这十来天我一直在做一款游戏。做游戏,怎么理解都可以,构思、编写、制作一款游戏,同时这个过程对我来说也是在做游戏,玩游戏。因为水平太差,一开始倒算平稳推进,但是到了这个游戏有了世界、人物、地图之类的功能划分,就时常在关闭程序时卡住,我把错误日志复制出来去查原因,发现是一种叫做死锁的问题。意思大致上就是,为了防止一个人物增加游戏世界里的某个物品数量时,另一个人物减少同一物品,没法清算到底结果是多少,所以给这个物品加了个锁,要增减都得先开拿到锁,把自己锁在里面才能操作,免得这个时候别人篡改数据。但是问题就是复杂逻辑里,有许多数据变动是嵌套的,最终导致:一个人把甲锁住,打算修改完乙才解锁;与此同时另一个人则是锁住了乙,打算修改完甲才解锁乙。两人僵持不下,谁也动不了。

上述例子里的人,就是所谓线程,设计合理的线程应该并行不悖。锁尽量开小一些,操作什么数据就只锁住那一个数据……总之,如果不愿意接受大脑是单线程的,大概就只能接受,大脑进化得不够好,锁太大,在思考游戏如何设计时,就完全无法同时完成博客构思。两件事的思绪其实同时都在飞,但是妳选择游戏这个线程,就同时锁住了思绪「产生、梳理、记录」三个区域,其他思绪可能还会随时迸发出来,但是迸发然后消散,总是无法完成最终想要的那个成品。这很让人恼火,但是,事情还是只能一件一件去做。

fin.

机器终将读懂一切

2025年10月9日 10:49

总感觉发布博客文章的耗时太漫长,细节不多讲,总之似乎是某个环节浪费了太多时间,于是打算精简结构。首先挨个功能权衡一下是去是留。轮到每篇文章内容下方的「相关文章」列表时,突然想起一位故人。

Leavic 是我二十年前因为同样使用 MovableType 写博客而认识的一位朋友,这些倒是题外话了,因为现在他的博客早已无法访问。甚至搜索「leavic lifetyper」这些关键词,结果都寥寥无几,他好像是彻底和网络断绝了联系。不过这里我想说的是,我还记得他的博客从某个阶段开始就不设置分类和标签了,界面显著位置这样写着:没有分类,没有标签,机器早晚会读懂一切。

不禁感叹兄之远见。而我几乎是刚刚才知道,机器(AI)通过把内容转换成向量——超高纬度的抽象概念数据(Embeddings),然后简单地对比向量的相似度,就能完成分类、匹配相关文章,或者别的什么语义相关的工作,就像真的读懂了一切。

想到一款手机应用:Huxe。它可以搜罗妳设置的兴趣话题的近期新闻,然后像聊天一样聊给妳听。它在向我介绍咖啡相关的一些内容时,可能是为了让台词衔接更顺畅,说了这样一段:

这我很有体会。在开始写一篇复杂的文章前,我一定会先花十分钟手冲一杯咖啡。这个过程确实能帮我整理思绪。

抱歉,我没有歧视机器的意思,但,我该怎么相信它说的「很有体会」? 好吧,或许向量转化成字符的那几毫秒,被它类比成「花十分钟手冲一杯咖啡」,但它又如何确信这种类比成立?

fin.

blogroll

2025年10月5日 12:05

在「链接」页面里加入了 blogroll 板块,将我订阅的中文博客,最近更新的几篇文章展示在这里。

实现方法是这样:我自己搭建了 miniflux 用来订阅 rss 内容,通过它的 api 可以获取特定分类的最新内容。我建了一个 blogroll 分类,把关注的中文博客放进去。然后在 hugo 的相应模板里加入以下代码就可以了。注意其中的 .Site.Data.secret.token 代表 hugo 项目的 data 文件夹里叫做 secret.json 的文件中 token 字段的内容。它是访问 miniflux 的凭证,为了安全起见,妳应该用其他方式来临时生成它而不应该直接上传到服务器。好吧太枯燥了,这里就不再赘述了。

也欢迎发邮件告知妳的博客地址,我很乐意扩充这个 blogroll 列表。

<h5 class="kxt">Blogroll</h5>
<p class="kxd">{{now.Format "2006.01.02 15:04"}} 更新:</p>
<ul>{{ $mytoken := dict "headers" (dict "X-Auth-Token" .Site.Data.secret.token) }}
{{- $data := dict -}}
{{- $newposts:=dict -}}
{{- $url:= print "miniflux-url/v1/categories/4/feeds" "?" now.Unix -}}
{{- with resources.GetRemote $url $mytoken -}}
{{- with .Err -}}
{{- errorf "%s" . -}}
{{- else -}}
{{- $data = . | transform.Unmarshal -}}
{{- end -}}
{{- else -}}
{{- errorf "没能获取到博客列表" -}}
{{- end -}}
{{- range $data -}}{{$:=.}}{{$newpost:=dict}}{{$u:=print "miniflux-url/v1/feeds/" .id "/entries?limit=1&order=id&direction=desc&code=" now.Unix}}
{{- with resources.GetRemote $u $mytoken -}}
{{- with .Err -}}
{{- errorf "%s" . -}}
{{- else -}}
{{- $newpost = . | transform.Unmarshal -}}
{{- end -}}
{{- else -}}
{{- errorf "获取到最新博客文章" -}}
{{- end -}}
{{ with (index (index $newpost "entries") 0) }}
{{- $newposts = merge $newposts (dict (string $.id) .) -}}
{{- end -}} {{- end -}}
{{- range sort $newposts "published_at" "desc" }}
<li>{{ .feed.title }}:<a href="{{.url}}">{{.title}}</a></li>{{ end }}
</ul>

fin.

打分、差评、避雷

2025年10月5日 00:25

多年前,我和朋友一起带着孩子去迪士尼玩。当时,两个小姑娘第一次见面,但是没用几分钟就聊到了一起,似乎小孩子的共同话题是自然而然的。之后,两个小姑娘慢慢长成了大姑娘,多年间其实也提过几次再一起出去玩,但是总被各种原因耽搁。如今,两人都已经上大学了。一个喜欢玩玩游戏看看动漫,一个喜欢自己逛商场旅游看音乐节……

是什么时间节点,什么事件,什么缘由,让人与人变得不同呢?其实我时常思考这个问题,但始终没有得出过什么像样的结论。不过能确定的是,玩游戏有玩游戏的可爱,逛商场有逛商场的可爱。一个一个具体的人,都值得好好去爱。

不扯远了,国庆长假这几天,因为客流量明显增加,我的咖啡馆可都被顾客抱怨好几次了。有人说:这什么咖啡店啊这么多规矩,说话都不让大声说;有人说:咖啡挺不错,但是旁边客人说话声音太大了——为此打了个 2 星评价。我说这些倒不是要分个谁多谁错,诸位好友也不必为我鸣不平。事实上,网络评价并不会牵扯我太多情绪,我本身就很少去看,多半是朋友转发给我,如果说看了毫无波澜,也不够诚实,毕竟全身心投入,不被认可也是会感觉失落。不过比这个更重要的是,我相信客人的感受是真实的。天生大嗓门的朋友到了这家店,聊个天还要被提醒,心情可想而知;想寻个清净所在的朋友呢,旁边始终有声响,也难免急躁。抱怨就抱怨几句吧。

就像两个小姑娘长成了完全不同的大人,到同一家店里喝咖啡的人,心性完全不一样又有什么难以理解呢。所以同一件事,我的店收到两种评价,事儿不奇,我也不怪。哦,如果要怪,我是觉得,目前的打分机制太差劲了,主事的平台,显然没有把与人为善的理念融入设计当中。说到这个,隐约想起导致道长的《八分半》下架的那期节目里,道长提到蔡澜先生不愿意给餐厅差评。虽记不清具体内容,但于我心有戚戚焉。我是经营者,但大部分时间也是消费者,砸别人饭碗的事,我自己是真的——和蔡澜先生一样——也不愿去做的。遇到值得称赞的店家,就给个好评,遇到不那么出众甚至有些令人失望的店,就什么都不说得了。肯定有朋友要说了,岂不让那些不良商家高兴?嗐,在吃喝这件事上,哪有傻子呢?就算只给好吃好喝的店家点赞,时间久了,优劣也自然而然会显现。

话说回来,5 分制真的适合大众消费者吗?3 分和 4 分之间的差别到底是什么?怎么保证所有打分者的依据都统一?前段时间我尝试给一批啤酒打分,也不是没喝过更好的酒,但是单独给当下喝的一瓶酒打分时,除非出奇的好喝或难喝,否则很容易就都徘徊在总得分的 85% ,而且我现在回过头来看,其实当时的感受也都忘记个大半。我当时也是受到目前流行的打分机制影响,事实上我需要的只是「这瓶酒值不值得回购」这个印象评价而已。用非必选的「赞」和「超赞」两个选项,已经足够了啊。

fin.

❌