普通视图

Received yesterday — 2026年4月11日

你们搞大模型的就是?

作者Echo
2026年4月11日 14:11

博客迁移 & codex

随着 ai 的不断进化,claudecode、codex 等爆火,vibecodig 这个概念传播的越来越广了。现在一个不懂代码的人,通过 agent 工具也能实现自己想要的功能。

上个月codex 推出了双倍额度,正好无聊,于是便借此搬迁了博客,并且魔改了下主题。总体体验来说,codex 用起来还是不错的,至于和 claudecode 比起来,这就不知道了,因为 cc 的封号机制,好长时间没有用过了。

不过 codex 的前端 ui 审美是真不行,只会一味的卡片封装再封装,实在是太丑了。后面使用了 google 的 mcp 工具(chrome-devtools),对一些比较好看的博客进行了学习,后面进总算看的过去了。另外,codex 隔几次就会重置额度,体验确实不错。

openclaw & token

随着 openclaw 的爆火,全民开始养龙虾,并且以此推动了 token 的发展,各厂家陆续推出专属 coding plan 等产品。

装龙虾已经成为了一种潮流,一种赚钱方式,当时全女团队上门帮忙装龙虾的图片还爆火过,说没有人进行炒作我是不信的。

周围不是计算机专业的人都曾询问过,让我帮忙装龙虾,不过我还是拒绝了。当时的氛围已然有一种没有装上龙虾就是跟不上时代的感觉。然而装完龙虾后的 token 费用等,却几乎没有被强调过。

大部分人在装完龙虾后不知道做什么,还有为养龙虾而费心费力。此外,龙虾背后的安全问题更是被忽略了。当龙虾完全掌控了电脑权限后,鬼知道会发生什么。不过后面又爆出来了安全问题,结果又一堆人花钱卸载龙虾。这一场风波还是挺离谱的。

不过龙虾的爆火却推动了另一种东西:token,即词元。

claudecode 源码泄露

个人使用最多的就是 codex 了,由于 Antigravity 的歧视,claudecode 的使用额度对我来说还是太麻烦了,中转站更是很难依靠。

不过前几天 claudecode 又火了一次。由于打包时候的误操作,导致源码泄露,听说全是 ai 自己进行操作。所以进行 vibecoding 时候,代码等权限安全问题还是需要重视的。

skill & agent.md

我还是三月初接触到 codex 这类 agent 工具,由于之前使用的 copilot 基本能够解决代码问题,所以再也没有探索使用过其他工具了,比如 cursor 以及 claudecode。

三月 codex 的 app 出现了,于是便第一次体验了下。刚上手还是一脸懵逼的,毕竟之前从未了解过,只知道一点 agent 概念。后来才了解到 skill 还有 mcp 工具。

从我的理解来说,skill 就是包装过的提示词,可以让 ai 每次使用前先阅读 skill,知道应该如何操作。mcp 就是第三方应用的对外协议,可以让 ai 通过这个操作第三方应用。当然,这个纯属于我的小白理解。

最近各种 skill 爆火,将前女友、著名人物等进行蒸馏,变成 skill 使用,挺难绷住的。不过貌似有一些查找和精读文献 skill 貌似挺好用的。

此外,还有 openai 等推出的AGENT.md,相当于一个统一标准吧。在一个项目目录里,此文件用于告诉 ai 这个项目是什么,以及应该怎么操作等。等你换一个模型或者 agent 时候,依然可以通过阅读这个文件来了解项目,从而节省 token。

AI 的发展速度对我个人来讲还是太快了,大多数人已经告别了古法编程,许多公司面试还会询问是否使用过 agent 工具进行 ai 编程。

不过就业环境貌似变得更加艰巨,现在不仅要懂编程,还要会 ai。本是提升编码效率的工具,却变成了裁员。

还记得下面这句话:

你们搞大模型的就是码奸,你们已经害死前端兄弟了,还要害死后端兄弟,测试兄弟,运维兄弟,害死网安兄弟,害死ic兄弟,最后害死自己害死全人类

谁看到能够绷住。还有蒸馏同事的 skill。

忍不住问一句敢问路在何方~

闲谈 & 方向

linux 驱动结束后,又重新学了会 C++,跟着侯捷老师视频过了一遍,后面又学了下 STL 以及 现代C++。

学完后本想做个项目,可惜和嵌入式相关的实在太少了。于是又转头学起了 xv6。

此外,一直不知道研究哪方面,主要方向是图像识别。组里全是搞 yolo 的,还得自己找数据集,大一买的游戏本显存还不够,跑不动,实在太难了。

此外还有遥感方向识别,然后相比 yolo,遥感对我来说更是天书,233。

后面再多看点文献找找灵感吧,争取研二暑假前写完小论文,出去实习。

Received before yesterday

苟延残喘

作者obaby
2026年4月10日 15:23

经历一轮一轮的裁员,这两年差不多每最长半年裁一次。研发人员的规模也终于裁到了原来的1/3,整天嚷嚷着使用ai提效,其实我觉得,按照现在的趋势和他们的逻辑,研发完全裁掉,就剩下几个领导,一个人养上20只龙虾,这就足够了,让龙虾24小时工作。

没到这个时候,走了不见得不好,留下来也不见得好。做得乱七八糟的项目,日常维护和新系统的开发都是问题,人少了,活多了。我总觉得过了长江就没个正常的所谓互联网公司,尤其是山东这个地界,的确是垃圾。在一轮轮的淘汰中,苟延残喘到了现在。一种用的那台破电脑也苟延残喘到了现在,每天都在提示磁盘空间不足,想办法清理一点之后,第二天继续提示,如噩梦一般挥之不去。

终于昨天实在受不了,重装了系统。

这256的硬盘,的确是小了点。

装完系统,安装价格必须的工具,就差不多占用了一半的磁盘空间。之前还给硬盘分了两个分区,现在看来,分不分的也没啥大用,就这点片空间,也不够干啥的。能往移动硬盘放的,就放移动硬盘把。现在常用的工具比之前也少了很多,只需要一个cursor、hbuilder 、xcode 之类的东西就够了,剩下的东西暂时也不需要安装,等哪天用到了再说吧。

从年前开始折腾,到现在又好几个月了,想着做点自己的事情,却一直没能抽出什么时间,google play就这么拖着,拖着。华为应用商店,商户号卡住了,也没什么进展,找技术支持也没解决,后续更是不知道如何处理,准备上个阉割版。不过最近折腾几个月,把三星应用商店给上了,也算是有那么一丢丢的进步。

https://apps.galaxyappstore.com/detail/ma.dayi.app?ads=ddb0e6f9&directOpen=true&nonOrgType=fce692ba&source=GBadge_01_8594313_tag

这几天连续折腾下来,也有点上火,对象牙疼了一个星期,现在感觉自己也开始牙疼了,昨天看了以下牙龈肿了。听他们说,这一轮流感病毒是专门让人牙疼的,这就让人有些抑郁了。牙疼一周,总是有些让人伤心。

至于这一波能再苟多久,谁也不知道。以后的事以后再说吧。

深漂十二年,入司九周年

作者崔话记
2026年4月8日 22:31

  若不是EHR工作台弹出提示,我竟没意识到,已经在这家公司待满九年了,来深圳也十二年了。

  时间的杀猪刀,是真的快!恍如隔世这个词,用在这里反倒显得有些苍白。

来时路

  来深圳之前,我没少折腾。

  签过的租房合同,如果一张张摞起来,厚度应该能赶上一本《红楼梦》。那时候,生活像是在不同城市之间、城市的不同区域之间不断跳转的页面。

  来深圳之前,女儿幼儿园进度条才走到一半,但已经在三省四城上过幼儿园了,深圳是她上幼儿园的第四个省。

  几乎每次搬家、换城市时,都在心里想着这次可以多稳定一段时间了吧,然而计划总是赶不上变化。

  初到深圳时,两鬓还不见白发,女儿还能坐在我脖子上。

  来深半年之后,找幼儿园,把女儿接来深圳上学,全家深漂的进度条启动,在南山、福田、罗湖这些熟悉又陌生的地方之间来回辗转。学校的变动、工作的变动、买房的变动、家庭的变动、升学的变动等等,就像抽动陀螺的鞭子,而我颇像那个有时想停下来、却又停不下来的陀螺。

  这些年的长度,是从而立到不惑、从青丝到白发的距离,是从幼儿园小不点到亭亭玉立中学生的距离。

再前进

  深圳这个城市,也确实是我由衷喜欢的类型。高度现代化、山水秀美、常年温暖、对外地人非常友好,国内同时兼备以上顶级特点的城市极少,以我有限的见识,只能数出来一个深圳。

  都说深圳是个快节奏的城市,什么都讲深圳速度,偏偏我是个慢悠悠的性子,似乎与深圳很反差,但我越来越喜欢深圳了。

  公司的几位大老板,发家史都非常励志,从摆小摊,到身价几百亿,既有时代红利,也有眼光和头脑,更有拼搏奋进,太让我佩服了。这是迄今为止我待的最久的公司了,大概也会是我这辈子待的最久的公司了。祝公司发展顺利、早日上市成功吧!

  也祝我的下一个十年,是一个继续安稳的十年,继续乐观的十年,也是一个能继续写博的十年。

四月天

作者obaby
2026年4月7日 13:55

清明节假期还是如约而至了,跟着一起来的还有临近下班的时候收到的一条竞岗通知,让假期最后一天十二点之前提交竞岗申请表。

下班收到这条通知,我并不想现在去填那个申请表,还要领导签字之后上交。由他去吧,到家之后看到手机又有一些消息,打开大概浏览了一下,意思是,如果无法提交纸质版,或者领导无法签字,可以先提交电子版。跟对象提及此事,她说,『该交就交吧。该走的流程还是要走的,如果视在不行,那就拿补偿走人,也挺好的。现在我觉得,你能不能继续干下去都挺好的,能干就干,不能干就走。』稍微顿了以下,继续说:『找时间咱们去看看把公积金提出来吧,我同事都提了好多次了。不过咱们的契税单子没了,不知道能不能提。』

『嗐,担心那个干嘛,直接用手机申请下不就知道了』我一边说,一边去拿手机。支付宝打开公积金小程序,一堆查询走下去,并且有什么异常提示。尝试直接提取,理由选择偿还商业贷款。一步步操作,到最后验证贷款的时候,选择贷款银行,最后竟然只需要一个贷款时间和贷款金额就能查询到贷款信息了,这一点做得的确不错。选择金额之后,点击提交申请,没有提示需要提交任何资料。提交完了才发现,忘了选择银行卡了。竟然填写的是多年以前的交通银行的银行卡。

对象担心银行卡还能不能用,索性直接登录手机银行,发现申请提现的金额已经到账了。现在该想一下怎么处理这笔钱了,第一步想着再去存个定期。然而,前段时间存的一张定期的单子,五年年利率只有1.75。打开兴业银行的贷款明细,看了下贷款利率石3.2。 这还存什么定期,干脆还款得了。

从兴业银行的手机银行再申请提前还款,于是这一笔钱就在手里打个转,过几天就又成了别人的了。看了下贷款信息,70万,还了十年,一共出去了30万,实际剩余的贷款还剩50万。相当于交了10万利息。不过反过来想,这十年租房子十万也不够,两室一厅的房子,十年房租下来也得二十多万了。这么一想,还是得感谢对象的眼光,房子买的早,想尽办法借钱买了这套房子,也得感谢自己不是犟种,觉得租房子也可,没坚持租房子。

至于假期,其实也没什么好的打算,还是带宝子回老家。四月天,正好是在户外放飞的时候。

晚上教练还问,第一天要不要上网球课。刚开始想着可以下课之后再走,晚上八点多开始下雨,十一点多的时候雨逐渐变大,路上也慢慢有了积水,既然如此,那室外的网球场第二天可能也没法打了,不如干脆请假。对象最近牙疼,假期也就不跟着回了,找时间去查一下看看怎么处理。

回老家的路上,前一段还算是比较顺利,绕行机场高速,绕过了最堵的市区高速。然而,等往青银转的时候,提示拥堵距离五公里,磨蹭到匝道入口才发现,车流量实在是太大了,只有一个车道,所有的车不得不慢慢悠悠的往里蹭。高速路况除了这一段,剩下的基本倒是顺畅,下了高速之后,开始另一段拥堵。高速工作人员指挥右转车辆走应急车道。左转的两个车道就只能等交警指挥放行了。

远远的就能看到省道上密密麻麻的车,下高速之后虽然之后十几公里的路程,却开了接近五十分钟,这还是最后到镇上之后抄小道绕过了一部分拥堵路段。

到家之后,宝子的姐姐躲在屋里的帐篷里。就是在室内又搭了一个帐篷,藏在里面。早上走的匆忙,也没买什么东西,让宝子给老太太一个红包,这件事算是过去了。在回来之前还给宝子的姐姐定了一份外卖,拉丝芝士棒,说想吃这个。六个芝士棒拿出来之后,实际他就吃了一个。剩下的几个到了中午才被其他人吃掉。

虽然晚上还在下雨,但是假期第一天的天气还算不错,虽然气温低了点。中午收拾好东西,去上坟。山路边的地里,已经又开始种满了杨树苗,几年前禁止耕地种树的决定,现在看来应该是又被废弃了。现在杨树的价格,却一言难尽,很多租地种树的甚至连租地的钱都挣不出来。尽管如此,还是有大面积的耕地被种满了树苗,好处是不用怎么管理,稍微去外面干点活,总是比种那点粮食收入能好很多。偶尔在破败的院落边上能看到一树桃花,娇艳欲滴。

下午孩子们在玩的时候,突然记起来去年买的那条绳子和滑轮。年前的时候在院子里玩过几次,受限于场地只能拴在门框上,另外一头拴在了墙上。现在孩子们比去年肿了,尼龙绳子又有一定的弹力,稍微一拉伸可能就拖到地上了。想着去户外的树林子重新搭一套滑道,试了几棵树都不大行。这时候姐姐提议用邻居宅基地里面的那几棵树,刚好一头比较高,另外一头比较低。

搬梯子拴上去,试了以下,刚好。

几个孩子就这么在这个简易滑索上玩了大半个下午,剩下的时间爬门楼的平台,通过那个手工捆绑的梯子,爬上来,爬下去。有时候还要带着猫咪一起爬。

坐在月台上,猫咪和小狗就在身边嬉闹。

不过并不是总是那么和谐,有时候狗子也会直接张大嘴咬猫咪的脑袋,这时候猫咪就只剩下望风而逃了。

在家的日子过的也快,转眼一下午的时间就没了。晚上宝子跟她姐姐挤在那个帐篷里睡了一晚上,虽然地方小,但是睡得挺好,第二天早上九点多过去看的时候,还没起。等起床洗刷完依然过了十点,连早饭都省了。

中午包水饺,宝子跟她姐姐一起上阵,包的饺子挺好的,有模有样,这时候二姐说到:『你想想办法,把抽屉的锁给弄开吧,钥匙丢了,已经半年多没开了。』

这个锁其实已经换过一次了,上次也是钥匙丢了。用钢锯条锯开之后,换了一把新的,这次,自然也是同样的方法。出门骑电动车到镇上五金店,买了五根锯条,一把锁,一共花了七块五。老板对于我怎么锯开写字台的锁表示很好奇,我解答说:『就那么直接把锯条伸进去锯就行了。』我说完,他依然一脸不可置信。

到家,带上一副厚手套,大约五分钟,在崩了三根锯条之后终于成功了。

拆掉旧的,装上新的。

不过,这次买的锁头稍微小了一点,周边留出很多缝隙。也无所谓了,能用就行。给老太太留下一把钥匙,另外一把钥匙找地方放了起来。以防哪天钥匙又丢了。

下午吃完饭,宝子们又嚷嚷着要爬梯子。但是鉴于之前扣车上苹果模型的熊孩子还没走,自己就把梯子给撤了。然而,过了不一会儿,宝子跑进来说,滑索坏掉了,拖到地上了。用屁股想也知道,肯定是那个熊孩子上去了,目测近一百斤的体重,那一根尼龙绳子怎么能提供那么大的张力。绳子已经被全部拉了下来,关键是还怕熊孩子玩的时候万一受伤,说都说不清楚,只好把滑索给拆掉了。

下午跟姐姐带着宝子们去外面溜达,小狗也一直跟着,一会儿跑的无影无踪了,不知道什么时候又跑了回来,乐此不疲。路边开满了野花,孩子们也去折了一些。

田里也有些许忙碌的身影,在整理田地。有的在浇麦子,一个熊孩子在低头跑来跑去,看着我们过去,前面有个小狗。熊孩子拾起一块石头开始去追狗子,朝着狗子扔了过去。好在没打中狗子,狗子跑回来了。

刚开始狗子并没发怒,看熊子过来,开始围着自己转圈跑,熊孩子就在后面追,追了一会儿熊孩子看追不上,捡起石头来继续扔狗子。这时候狗子明显怒了,停下来朝着熊孩子龇牙咧嘴,眼看如果熊孩子敢再扔的话,狗子就扑上去了。我只好喝退狗子,把熊孩子也训了一顿,让他赶紧走远点。

回去的时候,也不想再见到那个熊孩子,就直接带着他们下到了沟里,顺便弄了几根杨树条给他们扭了一个哨子。

村里但凡能种树的地方,都种满了杨树。自从没人种地之后,原本经常走的一些小路也就没了踪迹,只能沿着沟底前进。

原本在路上看到几株野果的乔木,想扒出来带回家种下去的,因为没走回头路也未能如愿。现在都开花了,可能哪怕带回家了也不容易成活吧。

夜晚总是如期而至,从来都不会迟到。吃完晚饭也就该回县城了,天黑之后,路况反而没那么拥堵了。

刚开始以为是车贴的膜太黑了,右侧总是看不清楚。路上别到一辆大本,过了一会儿,从右侧超了上来,打开窗户,超我一通比划,可能还有问候吧。不过我没开窗户,一句都没听到。大哥笔画半天之后,超到了自己前面,既然是自己做得不对。那就认怂认骂,老老实实的跟在后面。等到了一个右侧的岔路口,大哥先打了个右转向,又开了双闪。还以为这无牌大哥要停车跟自己干架呢,不过自己超过去之后,对方也没什么反应,应该是对方到了目的地了。停车之后,才发现右侧车床应该是自己用湿巾擦玻璃上的鸟屎的时候,没擦干净,反而抹的那一块更加不清楚了。

把身上的衣服换下来,全部扔到洗衣机,让宝子去洗澡。衣服上占满了猫毛,狗毛,粘了半天也没粘干净,最后直接扔洗衣机给洗了。而至于鞋子,只能等回家之后再洗了。洗衣店的会员卡,基本都用来洗鞋了,价格也挺合适的9.9一双。

最后一天,八点多宝子还没醒。过去把她叫醒,洗刷吃饭,开始往回赶,毕竟作业没写完,下午还有网球课。两天疯玩,体力消耗也蛮厉害的。只是玩的时候从来都不会觉得累吧。

有时候真的羡慕这样的童年,有陪自己一起折腾的父母,也有长时间的陪伴。只是,现在,还是得为了工作绞尽脑汁,甚至有可能哪一天依然需要背井离乡。

人间四月天,总是生机勃勃,至于明天不确定的事情,明天再说吧。

RSS阅读器安利:Fluent Reader

作者Echo
2023年8月1日 19:34

前言

由于之前在网上搜寻到RSS订阅工具都差强人意,今天闲来无事,偶然发现了一款颜值非常高的开源免费RSS订阅器:Fluent Reader , 于是便想写一篇文章安利下

如果想要使用,微软商店直接搜索下载即可,也可以前往 GitHub 上下载,此仓库包含了APP端软件包

至于更多RSS订阅源可跳转相关链接处

RSS 介绍

RSS(Really Simple Syndication,真正简单的分发)是一种用于发布和订阅网站内容的数据格式和协议。它通过简单的 XML 格式来传递网站的文章、新闻、博客等信息,允许用户通过订阅器(RSSReader)获取网站内容的最新更新,而无需直接访问网站。
RSS 最早出现在 1999 年,由 Netscape 公司创立。随后,RSS 标准逐渐发展,演变为不同的版本和格式。常见的 RSS 版本包括 RSS 0.9x、RSS 1.0、RSS 2.0 和 Atom 等。

RSS 的工作原理如下:

  1. 网站创建并维护 RSS 文件:网站管理员会将网站的文章、新闻、博客等内容整理成 XML 格式的 RSS 文件,并将其发布在网站的特定位置,通常是一个预定义的 RSS Feed URL。
  2. 用户使用订阅器订阅 RSS Feed:用户可以使用 RSS 订阅器(也称为 RSS Reader 或 Feed Reader)来订阅感兴趣的网站的 RSS Feed。订阅器会定期检查订阅的 RSSFeed,以获取其中的更新。
  3. 订阅器获取更新:当订阅的网站有新的文章或内容发布时,RSS Feed 文件会被更新。订阅器会检测到这些更新,并将最新的内容显示在用户的订阅列表中。

RSS 的优点包括:

  • 方便获取信息:用户可以一站式地收集和查看多个网站的内容更新,无需频繁访问每个网站。
  • 自动化更新:订阅器会定期检查更新,用户不需要手动去查看是否有新的内容发布。
  • 隐私保护:RSS 订阅不需要提供个人信息,保护用户的隐私。

随着社交媒体和其他内容分发平台的兴起,RSS 的使用逐渐减少。然而,RSS 仍然被许多网站和博客用于提供内容更新,并且一些专门的订阅器应用程序仍然广泛使用,满足了一部分用户对于个性化内容订阅的需求。

软件截图




相关链接

GitHub地址:Fluent Reader
RSS入门指南:高效获取信息,你需要这份 RSS 入门指南 - 少数派 (sspai.com)
使用体验:Windows平台最美RSS阅读器-Fluent Reader上手体验 - 知乎 (zhihu.com)

友情提醒:卸载软件时,记得导出相关订阅源进行备份

Baby Anti-Spam 自建反垃圾评论系统

作者obaby
2026年4月6日 18:05

很久之前,就经常收到akismet的授权提醒,对应一个错误码10010。

刚开始还以为是多域名访问导致的授权校验出问题了。后来换了n个key,同时添加了插件hook掉所有的垃圾评论检测逻辑,让全部走统一的域名,结果前几天又收到这个提醒了。

插件代码:

<?php
/**
 * Plugin Name: Akismet 单一主域名(多域名站点)
 * Description: 当站点配置了多个域名时,强制发往 Akismet 的请求只使用一个主域名,避免被计为多站点触发 10010。
 * Version: 1.0
 * Author: obaby
 *
 * 使用:在下方设置 AKISMET_CANONICAL_HOME 为主域名(或留空则用 WordPress「设置」里的站点地址)。
 */

if ( ! defined( 'ABSPATH' ) ) {
    exit;
}

/**
 * 主域名(规范 URL,不要末尾斜杠)。留空则使用 get_option( 'home' )。
 * 例如: https://www.example.com
 */
if ( ! defined( 'AKISMET_CANONICAL_HOME' ) ) {
    define( 'AKISMET_CANONICAL_HOME', 'https://zhongxiaojie.cn' );
}

/**
 * 获取发往 Akismet 时使用的唯一主域名 URL。
 */
function akismet_single_domain_get_canonical_home() {
    $home = AKISMET_CANONICAL_HOME;
    if ( $home === '' || $home === null ) {
        $home = get_option( 'home' );
    }
    return untrailingslashit( $home );
}

/**
 * 将任意 URL 替换为使用主域名的版本(只改 host,保留 path/query)。
 */
function akismet_single_domain_normalize_url( $url, $canonical_home ) {
    if ( empty( $url ) || ! is_string( $url ) ) {
        return $url;
    }
    $parsed = wp_parse_url( $url );
    $canon  = wp_parse_url( $canonical_home );
    if ( empty( $canon['scheme'] ) || empty( $canon['host'] ) ) {
        return $url;
    }
    $scheme = isset( $parsed['scheme'] ) ? $parsed['scheme'] : $canon['scheme'];
    $host   = $canon['host'];
    $path   = isset( $parsed['path'] ) ? $parsed['path'] : '/';
    $query  = isset( $parsed['query'] ) ? '?' . $parsed['query'] : '';
    $frag   = isset( $parsed['fragment'] ) ? '#' . $parsed['fragment'] : '';
    return $scheme . '://' . $host . $path . $query . $frag;
}

/**
 * 统一 verify-key / get-subscription / get-stats 的 blog 为主域名。
 */
add_filter( 'akismet_request_args', function ( $request_args, $path ) {
    $paths = array( 'verify-key', 'get-subscription', 'get-stats' );
    if ( ! in_array( $path, $paths, true ) ) {
        return $request_args;
    }
    $canon = akismet_single_domain_get_canonical_home();
    if ( ! empty( $request_args['blog'] ) ) {
        $request_args['blog'] = $canon;
    }
    return $request_args;
}, 10, 2 );

/**
 * 统一 comment-check(以及 recheck)的 blog、permalink,并把请求里的 HTTP_HOST 等改为主域名。
 */
add_filter( 'akismet_request_args', function ( $request_args, $path ) {
    if ( $path !== 'comment-check' ) {
        return $request_args;
    }
    $canon = akismet_single_domain_get_canonical_home();
    $parsed = wp_parse_url( $canon );
    if ( empty( $parsed['host'] ) ) {
        return $request_args;
    }
    $canon_host = $parsed['host'];

    $request_args['blog'] = $canon;
    if ( ! empty( $request_args['permalink'] ) ) {
        $request_args['permalink'] = akismet_single_domain_normalize_url( $request_args['permalink'], $canon );
    }

    // 让服务端看到的“当前请求”也统一为主域名,减少被计为多站点
    if ( isset( $request_args['HTTP_HOST'] ) ) {
        $request_args['HTTP_HOST'] = $canon_host;
    }
    if ( isset( $request_args['REQUEST_URI'] ) ) {
        $uri = $request_args['REQUEST_URI'];
        $request_args['REQUEST_URI'] = ( is_string( $uri ) && ( $p = wp_parse_url( $uri, PHP_URL_PATH ) ) !== null ) ? $p : '/';
    }
    if ( isset( $request_args['DOCUMENT_URI'] ) ) {
        $uri = $request_args['DOCUMENT_URI'];
        $request_args['DOCUMENT_URI'] = ( is_string( $uri ) && ( $p = wp_parse_url( $uri, PHP_URL_PATH ) ) !== null ) ? $p : '/';
    }
    return $request_args;
}, 10, 2 );

/**
 * 统一 submit-spam / submit-ham 的 blog、permalink。
 */
add_filter( 'akismet_request_args', function ( $request_args, $path ) {
    if ( ! in_array( $path, array( 'submit-spam', 'submit-ham' ), true ) ) {
        return $request_args;
    }
    $canon = akismet_single_domain_get_canonical_home();
    $request_args['blog'] = $canon;
    if ( ! empty( $request_args['permalink'] ) ) {
        $request_args['permalink'] = akismet_single_domain_normalize_url( $request_args['permalink'], $canon );
    }
    return $request_args;
}, 10, 2 );

这次授权的密钥撑得时间稍微长了点,但是最终还是收到了这个提醒,意思是需要订购商业版授权。我这个人站点为了发垃圾评论订购一个商业版授权,确实有些难以接受。

于是,我决定自建反垃圾评论系统,基于scikit-learn实现了现在的这套垃圾评论检测系统,训练数据一部分来源于github的开源数据,另外一个就是我自己博客的评论数据。为了保证样本正例和负例数量差别不至于过大,经过各种方式进行了多轮数据清洗。

如果想要评论识别更加准确,可以提供自己的博客评论数据,如果能提供垃圾评论更好。现在欠缺的主要是垃圾评论数据,正常的评论数据我已经提供几千条数据。

效果测试:

测试地址:https://anti-spam.zhongxiaojie.cn/test/spam

简介:

面向 中英混合 评论的 WordPress 垃圾识别方案:PHP 插件在评论入库前调用 本机 Python 服务,由小型多语种向量模型 + 分类器(或演示用规则)给出垃圾概率。

适合评论量不大、单机部署(例如 4 核 / 8GB RAM 的 Ubuntu),服务与 WordPress 同机时使用 127.0.0.1 即可。

目录结构:

baby_anti_spam/
├── README.md
├── screenshots/             # 文档:服务启动与 curl 自测示意
│   ├── service.png
│   └── test.png
├── service/                 # Python FastAPI 侧车服务
│   ├── .env.example
│   ├── requirements.txt
│   ├── requirements-ml.txt
│   ├── run.py
│   ├── app/
│   │   └── stats_backends/   # 统计存储:sqlite / mysql
│   └── scripts/
│       ├── init_stats_mysql.sql
│       └── init_stats_mysql.py
│       ├── train_sklearn.py
│       ├── download_embedding_model.py
│       └── download_embedding_model.sh
└── wordpress/baby-anti-spam/
    └── baby-anti-spam.php # WordPress 插件

关键配置:

| 变量 | 说明 |
|------|------|
| `SPAM_HOST` | 监听地址,同机建议 `127.0.0.1` |
| `SPAM_PORT` | 端口,默认 `8765` |
| `SPAM_API_SECRET` | **单密钥模式(兼容旧版)**:未配置 `SPAM_API_KEYS` 且未配置 `SPAM_API_KEYS_FILE` 时,仅此密钥有效,等价于 name=`default`、不限流(`max_rpm=0`)。与 WP 插件里填写的密钥一致 |
| `SPAM_API_KEYS` | **多密钥**:JSON 数组。每项为 `name`(唯一,用于统计与限流分组)、`key` 或 `secret`(与请求头一致)、`max_rpm` 或 `rpm`(每分钟最大请求数,`0` 表示不限制)。与 `SPAM_API_KEYS_FILE` 合并时:**先读文件条目,再追加本变量** |
| `SPAM_API_KEYS_FILE` | 可选,指向 JSON 文件,根节点为与上表相同结构的**数组**。文件必须存在,否则进程启动失败 |
| `SPAM_MODEL_PATH` | 训练得到的 `*.joblib` 路径;留空则取决于 `SPAM_FALLBACK_RULES` |
| `SPAM_FALLBACK_RULES` | 无模型文件时是否启用内置极简规则(演示用);生产训练后应设为 `false` 并配置 `SPAM_MODEL_PATH` |
| `SPAM_LABEL_THRESHOLD` | 可选,默认 `0.8`。`spam_score` ≥ 此值时 JSON 中 `label` 为 `spam`,否则为 `normal` |
| `SPAM_DFA_ENABLED` | 默认 `true`。为 `true` 时使用 `dfa-python-filter/keywords` 做敏感词检测;命中则直接 `spam_score=1`、`detail=dfa_sensitive`(早于 sklearn) |
| `SPAM_DFA_KEYWORDS_PATH` | 可选,自定义敏感词文件路径;留空则用 `service/dfa-python-filter/keywords` |
| `SPAM_NON_CHINESE_FLOOR_ENABLED` | 默认 `true`。为 `true` 时若合并后的 author/email/url/text 中**无任何 CJK 表意字符**(主要针对中文训练语料),则将 `spam_score` **至少**抬到 `SPAM_NON_CHINESE_SPAM_FLOOR` |
| `SPAM_NON_CHINESE_SPAM_FLOOR` | 默认 `0.9`。与上项配合,在「无中文」评论上与 sklearn / 规则分取 `max` |
| `SPAM_STATS_ENABLED` | 默认 `true`。为 `true` 时记录每次**成功**返回的 `/v1/classify` 请求与响应(失败 / 401 不落库),并允许 `/v1/mark-spam` 写入 `spam_marks` 表 |
| `SPAM_STATS_BACKEND` | `sqlite`(默认)或 `mysql`。选 `mysql` 时需安装 `pymysql`(已在 `requirements.txt`)并配置下方 MySQL 变量 |
| `SPAM_STATS_DB_PATH` | 仅 `sqlite`:数据库文件路径;留空则为 `service/data/stats.sqlite`(已加入 `.gitignore`) |
| `SPAM_STATS_MYSQL_HOST` / `SPAM_STATS_MYSQL_PORT` | 仅 `mysql`:默认 `127.0.0.1` / `3306` |
| `SPAM_STATS_MYSQL_USER` / `SPAM_STATS_MYSQL_PASSWORD` | 仅 `mysql`:连接账号(`user` 必填) |
| `SPAM_STATS_MYSQL_DATABASE` | 仅 `mysql`:库名(必填),默认示例 `baby_spam_stats` |
| `SPAM_STATS_MYSQL_CHARSET` | 仅 `mysql`:默认 `utf8mb4` |

 

系统服务启动截图:

wp插件配置:

项目地址:https://anti-spam.zhongxiaojie.cn

代码地址:https://cnb.cool/oba.by/baby-wp-anti-spam

说明:如果自己不想训练数据,下载发布版的spam_pipeline.joblib 放入指定目录下配置服务启动即可,baby-anti-spam.zip 为wp插件。

训练耗时大约11分钟:

清明假期收尾碎碎念

作者Hary
2026年4月6日 16:10

三天清明假期一晃就结束啦!
算算日子,上班还不到一个月,再过没几天又盼来五一假期,节奏还挺舒服。这三天懒得来回折腾回老家,就在合肥安安静静待着放松。

周五晚上窝着刷李世鑫的短剧,一看就停不下来,直接追到半夜,剧情看得我都跟着有种重生代入感,特别上头。结果假期第一天,生物钟根本不由人,早上八点准时醒,啥重生懒觉福利都没有,哈哈!

白天太阳特别好,气温一下子回升好几度,干脆把夏天的衣服都翻出来收拾,足足洗了四洗衣机,天气给力、阳光足,中午过后衣裳就全都晒干晾透了。
在宿舍待久了实在闷得慌,总不出去见见人,感觉人都要憋出毛病来。

本来打算自己骑车去罍街逛一逛,顺便在那边吃点东西再回来。刚好室友睡醒出门找吃的,随口聊了几句,俩人一拍即合,临时改主意想去爬大蜀山,后来他又喊上同小区另一位同事,我们三个人结伴出发。

之前也来过两次大蜀山,那时候带着孩子、推着遛娃车,顶多走到半山腰盘山公路就折返了,上段台阶路不好走,也没法往上登。这次算是实打实第一次成功登顶!

我们大概四点半从小区附近坐地铁到大蜀山,爬山的人特别多,合肥平时能逛的室外地方也不多,节假日大家都扎堆过来散心。
三人一人备一瓶水,顺着山路往上走,不知不觉就到了半山腰盘山路段。再往上就是陡峭石阶,同事说早年这里还没有防护栏杆,石阶也是后来翻新修缮的,应该是近几年游人太多,景区设施都整修升级了不少。

后半段台阶爬着真心累,上山的人挤人、挨着走,也快不起来,我们咬咬牙一路不停总算冲到山顶。山顶有两个观景平台,一处专门看日落,一处俯瞰合肥城区街景。
当天傍晚有点雾气,远处灰蒙蒙一片看不真切,我们到山顶差不多六点,夕阳快要落山,雾蒙蒙的拍景也不出片,有点小可惜,上面这个信号塔应该是最高处。

在城景平台看了会儿周边,往东正对着黄山路,天气通透的话应该能远远看到我们住的楼栋,可惜有雾找了半天也没对上位置。后来找路人帮忙拍了三人合照,也算打卡留念,第一次登顶圆满啦!能看出来下面这个书法大厦是在哪个位置么。


下山就快很多,全程上山加下山,一共花了一个半小时,运动量感觉跟在小区来回爬好几趟30层高楼差不多。
下山后几个人就近找地方吃饭,还喝了不少小麦果汁,一个个吃得肚饱喝足,之后全程走路溜达回去,硬生生走了一个多小时,当天累得浑身发沉。

昨天起床还没什么感觉,今早一醒,小腿、屁股两侧酸得厉害,刚下地走路都费劲。平时不怎么运动,突然来一波高强度爬山暴走,身体根本扛不住,看样子得缓好几天才能歇过来。
今晚没事就骑车出去溜达溜达了,今天可不敢猛走猛造了!
(上面内容用豆包润色了一下,意思跟我编辑的都一样,不同的人嘴里说出来是不一样哈)

两岁半小棉袄的快乐时光

作者Hary
2026年3月29日 16:30

 闺女在家向来能睡到十点多才起床,今天一大早刚醒就打来了视频。洗漱完之后,便跟着妈妈在梳妆台前有模有样地学化妆,小模样认真得很。

 不由得感叹,现在的小孩子真是聪明,接触新鲜事物也早。这才不到三岁的小家伙,做起事来常常透着一股小大人的模样,不像我们小时候,六七岁还在玩泥巴。
 奶奶给她做好吃的,她会竖起大拇指,按在奶奶额头上,奶声奶气地夸:“奶奶真棒,给你点个赞。” 穿衣服也讲究搭配,尤其偏爱小裙子,买衣服时必须让她自己挑,不喜欢的连试都不肯试,看上的便攥在手里不肯撒手。晚上妈妈搂着她睡觉,她会软软地说:“妈妈抱,爱妈妈。” 嘴甜的时候,心都要被她融化了。
 当然,撒泼耍赖的时候也毫不含糊,满地打滚、鬼哭狼嚎,真是让人又气又笑。可转念一想,孩子嘛,不哭不闹反倒不正常了。
 原本打算过完年送她去幼儿园适应一下,去学校一问,年龄太小人家不收,加上之前还不会自己上厕所,便作罢了。最近天气暖和,她才慢慢学会自理,干脆再玩几个月,等下半年满三岁再正式入园。
 前些天刚学会用筷子,之前一直用辅助筷都不太会,换成正常筷子,反倒用得有模有样。说来惭愧,我到现在都握不好标准的拿筷姿势,跟她一比还不如个小朋友。
 就让她好好享受这最后几个月无忧无虑的春日时光吧,等秋天,再正式开启她的小小 “修炼之路”。
[vplayer url="https://img.hxy.cc/file/blog/260329-2suiban2.mp4" /]

注册两个免费域名玩玩

作者Hary
2026年3月27日 21:30

 前两天看见军爸发的可托管CF的免费域名注册,本来是没需求的,昨天晚上收到了西部数码发过来的邮件,唯一闲置的域名也被一口价出掉了,那就没有闲置域名了,主要想要一个域名用来做博客站的境内外分路解析,用作CF的SAAS的中转域名,通过军爸的链接注册了一下,可以免费注册两个前缀,其实就是一个二级域名,主要是可以作为一个独立域名托管在CF上,刚好可以满足这个需求,省的再去单独注册一个域名了,注册好之后托管在彩虹的NS域名管理程序,到时候1年到期会有提醒,挺好。

 原本手里的域名和服务器该卖的卖,该丢的丢,现在就剩两个域名和一个虚拟主机了,不再购入新的了,说不定有朝一日也转去静态博客,虚拟主机也不要了。

周六和室友小酌一杯

作者Hary
2026年3月22日 13:26

 之前说过我的一个同学被优化了,当时没过多久,我们这边也收到了通知,要有7个人被裁掉,其中有一个就是我的室友,二月初好像就通知了,说是让干到三月底,年后一过来也是各种饭局,经常喊他吃饭喝酒说送他呢,前几天有天晚上回来也是晕乎乎的,说要跟我喝点呢。
 我就从京东下单买了两瓶古5,也是昨天一大早就送过来了,本来想着晚上的时候出去吃点喝点,赖了一上午床,中午爬起来想做点东西吃,看着冰箱里的菜,这不也能整几个么,就跟室友讲了一下,中午别让他点外卖了,我简单炒几个菜一块吃点。
 他说最近喝酒喝的有点多了,最后我整的古5也没喝,他去楼下超市搞了一箱啤的上来。应该是一点多开始吃的,最后干到了晚上六七点,就一直喝着聊天啥的,一箱啤的被我俩造完才算结束。
 最近也在和公司谈赔偿的事,他在这边干了七年多了,想的是至少能赔个N,但是之前领导找他谈过一次,说能赔个小几万,赔不了N,现在还在僵持着,下周再找机会再和领导PK一波吧,实在谈不妥再想别的办法。
 附个随手拍的图片吧,最后闷了个从家带回来的鸡肉,吃了一半才想起来拍个照片,哈哈,在家养了几个月的鸡还挺好吃。

修理修理几个手机

作者Hary
2026年3月14日 15:36

 距离上次更新已经一个月了,好像还没有间隔这么长时间断更过。主要还是今年春节放假时间太长了,前后将近放假一个月了。在家的时候基本上就跟家人在一起很少看手机,也就没有动力来更新博客了。
 本来公司通知的是3月10号上班,我本来最开始抢的是3月4号的票,后来了解了一下,挺多同事都是10号才过来,我又改了个票,从4号改到了8号,上周末才过来,新的一年的第一周已经过去,5天一过,又是一周。一天一天上班过的感觉比在家过的还快,还有一个半月,五一假期又能回家了。
 我之前用的有一个小米11的手机,一直做备用机。过年回家拿回家了,给我奶奶用了,把她原来的vivo Z1换了下来,原来那个手机太卡了。她日常用来微信视频通话和刷抖音,换下来的vivo Z1我就拿回来了,不安装任何APP,专门用来开热点使用。
 回去之前又购入了一台iPhone17,回家给我媳妇儿的新年礼物。然后我媳妇儿这边又退休下来一个iPhone13 Pro,我也拿回来了,专门收破烂,哈哈,之前她就就一直吐槽,他的iPhone13 Pro不存电,这次我拿回来直接在网上买了个电池,好像是有一个活动吧,然后100多拿下,日常是210左右,这带的还有安装服务,只贵了10块钱,周二的时候快递一到就去附近店里让人家给换上了,直接满血复活,续航杠杠的,备用机+1。

 再一个就是我的主用机小米14,用了有两年半了,日常工作用手机还是挺多的,算是重度使用,现在基本上就是需要一天三充。干脆也换个电池得了,然后就单独买了一块电池,回来自己换,实际操作下来倒也不难,只不过可能是第一次没经验,没把握好尺度,有一个角还没有完全撬开,抬了一下后盖,直接给后盖玻璃干碎了。。。又紧急在闲鱼淘一个小米14的原装拆机后壳,晚一会应该快递就到了,再给它换上,这样密封性良好,防水好一点吧。


 这个电池说是小米15移植到小米14和小米13使用的,比原装电池容量大,用了两天确实续航提升不少,又能再战三年,等着换小米20。

没心思上班了,准备开溜

作者Hary
2026年2月11日 16:28

 春节前的最后一周了,大家都没心思上班了,各种花样摸鱼,这两天云闪付上有个活动,徽动消费 合肥GO,二月份新开的合肥区域公司的发票,上传上去可以抽奖,都是大额优惠券,大的100,小的也得有20,这两天周围的同事也是玩的不亦乐乎,都抽了几百几百的优惠券,应该是政府发优惠券推动消费,利用开发票可以增加企业纳税,真是一箭三雕。
 周日晚上公司例会,通知了放假安排事宜,准备从2月12号放到3月10号,反正中间各种事吧,不好明说,这整的放假时间太长了,这期间绩效是要扣除的,只有基本工资,如果按照这个时间休,差不多要被扣五六千,其实是想放假时间长一点的,但是这也太长了,前后冗余两天都差不多了,反正准备3月初提前一周过来吧,到时候按照每天工作报备,还能少扣一点,公司去年春节还有礼品,今年毛线都没。
 上周还想着奋战到最后一天呢,结果这通知的猝不及防的,也没有买高铁票,正好老丈人丈母娘他们准备这两天回,从金华回来经过合肥带上我,正好我可以开下半程,也省的我再单独找顺风车了,晚会回去准备收拾收拾东西,再去理个发,下次再理发就要等二月份了,虽然不可证实的正月不理发的习俗,但是也保持了29年了,还是继续保持下去吧。

老同学被优化了

作者Hary
2026年2月3日 20:33

 中午回来吃饭正吃的香呢,老同学发来了个微信,说他被优化了,赶紧扒拉扒拉吃完饭,给他去了个电话问了下啥情况。

 我们是大学同一个宿舍的室友,毕业之后我基本上无缝衔接,去了上海待了两年,然后就来了合肥,他是毕业之后先在他们本地那边待了两年,然后报培训班学习考了个行业内高级证书,应该是23年的时候他入职了郑州那边,我们算是干的一样的工作,一直干到现在,虽然是背靠大厂,但是也从去年11月12月份开始,新出了各种规则,取消加班工时调休和超额加班费,各种降本增效,其中有一项就是人员配置优化,我们这暂时还是一个萝卜一个坑,大刀可能还没砍到头上,今天他给我发消息,我才意识到,要开始了,不知道什么时候优化到我们这里。
 我这老同学那边据他描述,已知的就暂时通知了他自己,让干到三月底,还有一些老资历员工都没被优化,他说别人干的他不一定能搞下来,但是他做的事情别人能接住,所以被优化的只能是他,唉,想想他去年6月份才结的婚,这刚结婚半年结果工作没了,也是比较难顶。
 如今各行业都是比较难过,也别想太大了,现在能有个相对稳定的工作已经很难得了,老家一些在外面打工的也是老早就回家过年了,外面一些厂子里面也是活不多,早早就放假了。

❌