普通视图

Received today — 2026年4月4日日常分享

两岁半小棉袄的快乐时光

作者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月份才结的婚,这刚结婚半年结果工作没了,也是比较难顶。
 如今各行业都是比较难过,也别想太大了,现在能有个相对稳定的工作已经很难得了,老家一些在外面打工的也是老早就回家过年了,外面一些厂子里面也是活不多,早早就放假了。

宽带改公网投诉小记

作者Hary
2026年1月29日 18:20

 老家的两条联通宽带安装的时候就是装的PPPOE公网的,本来家里有网络摄像头做的有DDNS映射,非标端口外面可以直接访问,前几天发现不行了,从联通APP里面查光猫看了下,竟然私自给我改成NAT私网了,小联通竟然在用户毫不知情的情况下私自变更用户业务类型。
 前天晚上越想越气,搞的晚上都没睡好觉,脑海里一直在想第二天怎么怎么投诉,说什么硬气的话。上周三还有个营业厅的固话给我打电话问我最近宽带用的怎么样,我也没多想,纯粹支持他们工作,就给了好评,现在回过来想想,搞不好就是他们私自改了,然后做下回访,看用户有没有感知呢。
 昨天上午一直在忙,中午得空直接打了10010客服进行投诉,倒也算处理的积极,一会省投诉中心,一会市投诉中心,一下午接了几个电话,又挨个给他们解释一边投诉原因,我就说我安装的是公网,为什么在用户不知情的情况下给我改成私网,现在搞的在外地看老家摄像头都延迟很大,挂机游戏老掉线(编的,不打游戏),一路转派投诉单,最后给派到了乡镇营业厅。
 早上营业厅人员给我打电话,还给我说了一顿,她问我,你知道什么是公网吗,只有企业,医院这种才是公网,家里面的都是私网,。。。我寻思我天天搞这些,我不知道我还能投诉到这??还说她干了15年了,也没听说过宽带搞公网的,我让她不知道就给我往上报,找技术支撑去问,也就不到一个小时,就有市公司的技术人员给我打电话,说私网改公网改好了,让我重启光猫试一下,我远程重启了一把,终于又恢复了公网。


 我在想肯定是后台做什么改造,或者批量回收公网的操作,如果用户不投诉,改了就改了,有投诉再改回来,真是让人恼火,以后还想着有公网IP可以搞点家里云自己用呢,这指定是不能再给我改了。

身份证到期更换

作者Hary
2026年1月25日 21:00

 25年应该有很多人的身份证到期吧,我应该算是赶到了末尾,目前在用的是截止到2026年2月23日到期,还剩下不到一个月的时间了,说是提前两三个月就可以申请办理了,我这本来也没着急,一个月前应该就有各种APP和短信给我推送发消息说身份证即将到期让及时更新,否则影响相关服务的,这周五公司也找过来了,让传新的证件信息,哈哈,我还没办啊。
 其实在两周前就在皖事通上申请了,预约的今天去办理,预约的时候按照提示说是可以自己拍照上传,审核通过后可以直接用自己拍的照片,上周得空让同事帮忙拍个大头照,准备去上传呢,结果提示我非安徽户籍,我申请的时候怎么不提示啊,还引导我可以提前拍照,白期待了,还是等到今天乖乖去线下办理。
 预约的我们这最近的蜀山区政务中心,上午九点过去的,骑车十几分钟,到那问了下工作人员,也挺简单的,基本上去办事的大部分都是办理身份证业务的,人倒也不多,就先排队拍照,也没让看一眼,拍完照接着取号等着窗口喊号办理,等了有两分钟吧,就喊号了,看来人是真的不多,到了办理窗口也就确认一下信息,然后录取指纹,说是做信息比对,确认一下是本人,然后让我看了一眼拍的照片,让我确认一下是不是,就看了一下侧着的电脑屏幕,不说了,真的不是很好看,自己拍出来也不是这样啊,看到时候拿到证是什么效果吧,确认好信息之后让付了20块钱的办理费用,整个过程不到五分钟。
 业务人员说是20天后过来取,我媳妇之前是六七月份吧,来办理的说是可以邮寄,好像是一周多就寄过来了,我也去问了一下办理了邮寄业务,是邮政承办的,扫码把办理的业务号进去,填好收件地址,又付了12块钱的邮寄费用。
 整个过程还是比较顺利,本来以为周末人会多的,结果不到半个小时就搞定了,我这是第三个身份证了,第一次是5年,第二次是10年,这次办理的应该是该20年有效期了,记得10年前办理第二张的时候还要回老家户籍地派出所办理,现在整的是挺方便,跨省也可以直接办理,期待新证,希望不要太丑。。
1月31日更新:
 25号上午去办理,31号上午收到证件,快递送货上门,不得不说还挺快,这次是20年有效期,照片还行,看得过去,除了双下巴有点明显,不过也是真实情况,哈哈。

姥姥和奶奶

作者Hary
2026年1月23日 20:09

 前几天老家下了大雪,从家里监控看到在下雪的第二天妈妈把姥姥接过来了,说是接过来住几天,难得妈妈在家这么长时间,临近春节了,也是想和她的妈妈待一起照顾几天吧。
 今天看到姥姥和奶奶在院子里面晒太阳,挺温暖的一幕,他们俩的日常生活轨迹完全不同的,也难得待在一起晒太阳。

 姥姥是胖胖的,好几年前还因为胆的问题做过两次手术,也就导致平常也不能干重活,走路干啥的都慢慢的,平常也就待在我的三舅家的小卖部帮忙照看一下,记得我小的时候就喜欢去姥姥家,那时候还是姥爷开的有间小卖铺,就喜欢去里面拿些小玩具啥的,每到春节还都能得到姥姥姥爷给的一把“枪”,那时候有一把玩具枪别提有多开心了,但是我的姥爷好像就停留在了那时候的某一年,就剩下我姥姥一个人了,应该都有快二十年了,我记得姥姥一直是这个样子,一直都是不紧不慢的,也可能是身体原因吧,反正每次有机会回老家都会回去看看姥姥。
 奶奶就不一样了,同样都是七十几岁的人,奶奶还是干劲十足,现在家里都是各种各样的农活,给人家扒红薯、种蒜、种辣椒、摘辣椒、电商打包、打玉米等等,真是啥活都干,一天有时候挣个三四十,有时候整个一百多,比人家年轻人都能干,尽管家里人都各种劝说,不要出去干活了,不要出去干活了,但是没一个人说的动,只要有活,别人打电话给她,肯定去。我的爷爷也是在我订婚的那一年走了,每次回家都盼望着能看到孙媳妇,如果再坚持半个月也就能看见了,最后还是没等到,爷爷的时间也就停留在了22年的春节,好像就是自从那之后,正好也是家里流行起来了日结干农活,专门找家里的老头老太太干些农活,管饭还给钱,也就很多人可以去,奶奶就经常出去干活,我想着,也可能是她自己一个人待在家无聊吧,出去干活好歹能多几个人唠唠嗑,反正各有利弊吧,有啥轻活重活都去干,最后再给身体累出病来还是不划算。
 树欲静而风不止,子欲养而亲不待,如果能有空还是抽出时间陪陪家里人,不要说真等百年之后再去后悔,那其实没有任何意义的,就算陪家里人在太阳底下晒暖,那也无疑不是一种尽孝。

给博客所有图片加个水印

作者Hary
2026年1月18日 16:37

 此方法为又拍云存储+腾讯云EdgeOne的组合,实现免费10G存储+无限流量的图片外链,理论上适用于所有对象存储和所有CDN的组合。
 正常一些技术博客发的技术文章还是比较有价值的,文章附图最好还是加个水印,也减少一点被盗的风险,我这生活水文博客那就看心情了,也没啥值得盗的,纯属折腾哈,简单记录一下。
 首先是要用云存储作为图床,无论是直接上传或者通过图床程序,在对应的云存储内找到图片处理功能

 接着设置一个间隔标识符,后面会用到,又拍云是有三个可选(! _ –),然后设置一个图片处理规则,这里面就按需配置,如果上传之前已经对图片进行过处理了,这里就推荐不要进行压缩或者更改格式的其他处理了,只开启添加水印一个功能,可以设置文字水印或者图片水印,选好水印放置的位置,设置好对应的参数之后,点击右侧的小喵咪可以进行刷新预览看一下最终呈现的样式,达到想要的效果之后进行保存此规则,注意样式命名,后面会用到。


 到此就可以进行实际图片测试了,比如原来的图片外链是https://img.hxy.cc/2026-ceshitupian.webp,加上前面设置的图片处理参数之后的格式就是https://img.hxy.cc/2026-ceshitupian.webp-shuiyin,这样其实还是没有达到目的,因为访问不带图片处理规则的原链接,还是没有水印效果的,想要最终实现不加参数又能加上水印,这就要去CDN加速那边设置了。
 又拍云的处理规则设置好之后,到腾讯EO的对应图床域名的规则引擎中设置回源URL重写,可以按照如下函数进行配置

正则表达式: ^/(.*\.(jpg|jpeg|png|gif|webp|bmp))$   (这里加上实际使用的图片格式的后缀)
替换为: /$1-shuiyin  (这里的-就是上面设置的间隔标识符,shuiyin就是上面设置的图片处理规则的名称)


 这样配置好之后,把EO这边的图床域名的缓存清除一下,然后再刷新文章内的外链图片,此时看到不用每张图片进行添加后缀,已经成功添加水印,这样设置的好处就是不用每张图片都单独进行添加,而且万一以后有换域名,直接把水印规则里面的水印换一下就行了,原图片不受影响。
 看了下七牛云的云存储,基本上一样的方式,也可以达到上面的效果。

 经常看到用对象存储的博友被刷多少多少流量,以至于产生巨额账单而劝退使用对象存储,我觉得还是没有做好防护措施吧,使用不限量的EO或者ESA,还有可以设置达量拉闸的多吉云,然后用http回源到对象存储,因为https可能会收费,这样基本上不会产生费用啊,我用了好几年的又拍云联盟,一年有61块的券,我25年按照这种方式设置之后才产生不到1块钱的费用。

Received before yesterday日常分享

下载微信公众号的视频

作者obaby
2026年4月2日 16:46

作为一个专业的程序媛,前端时间折腾龙虾转发公众号的文章到闺蜜圈wiki,之前已经处理了图片和文章的问题,今天转发的时候发现另外一个问题:文章里面的视频无法正常播放。

刚开始的时候想着直接去chrome的缓存里面找,但是试了下chrome://cache发现无效,又不想去找插件来干这件事情。直接去调试工具找对应的视频地址:

然而直接贴到地址栏,直接报403了。

唉,好尴尬,既然有本地缓存文件了。那么直接尝试将接收到的数据流写入到文件呗。找了半天没发现怎么直接把请求到的数据写入到文件,点击开始播放等待缓冲结束。

加载完了右下角的数据也就有了,直接切换成base64,复制粘贴:

然而,尝试decode 之后,播放不了,缺少mp4的头文件,这就挺奇怪的。文件头哪里去了?my_video为通过代码下载的mp4,video为通过base64 处理的图片。

文章测试地址:https://mp.weixin.qq.com/s/heoer_zm4SFwFKsk4tRecQ

看了下是video标签实现的:

<div data-v-c66e8e28="" class="js_inner inner not_fullscreen"><div data-v-c66e8e28="" class="js_video_poster video_poster"><div data-v-c66e8e28="" class="video_mask"></div><video data-v-c66e8e28="" src="https://mpvideo.qpic.cn/0bc3pidsgaahauamxiglsruvo6wden5aoiya.f10002.mp4?dis_k=247900efb8791f0718998ea0813793c9&amp;dis_t=1775118363&amp;play_scene=10120&amp;auth_info=d9/5u/dlYUBWn6qY0Sp2SXM9PUdEOj5CZmQ3H2k2TzNOXXtjTwYQen0+WTMXEzdWIDNuS0hkIHgTMSlENWAcfUpBcQ==&amp;auth_key=ed4a91866522f27b4b89c5e71e04d115&amp;vid=wxv_4453415887525888005&amp;format_id=10002&amp;support_redirect=0&amp;mmversion=false" poster="http://mmbiz.qpic.cn/sz_mmbiz_jpg/GAVxEAgJstytcf0uF3dpdZKia9G96C3loxCNaBrbFLHCiak3GvJDfASC7uYqNjjAZ5e2OHSmHoBQrONRJ8UIq6icJjjFXMfUBtdhy7VWlfb3MM/0?wx_fmt=jpeg&amp;wxfrom=16" webkit-playsinline="isiPhoneShowPlaysinline" playsinline="isiPhoneShowPlaysinline" preload="metadata" crossorigin="anonymous" controlslist="nodownload" class="" style="display: block; width: 655px; height: 492px;"> 您的浏览器不支持 video 标签 </video></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__play" style="display: none;"><i data-v-f4ee5450="" data-v-c66e8e28="" class=""></i></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info" style="display: none;"><p data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__title" style="font-size: 17px;">继续观看</p><p data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__desc" style="font-size: 12px;"> 孤独症,就是不爱说话吗? </p></div><div data-v-f4ee5450="" data-v-c66e8e28="" class="video_poster__info__mask" style="width: 100%; display: none;"></div></div>

还是说着这个东西还有另外的处理逻辑?哪位大神知道原因还望不吝赐教。

既然decode不行,那就直接上代码吧:

#!/usr/bin/env python3
"""
下载 mpvideo.qpic.cn 等需 Referer 的 MP4(微信视频 CDN)。

Author: obaby
  https://zhongxiaojie.cn
  https://oba.by
"""

import argparse
import sys
import urllib.error
import urllib.request

# 与常见微信内嵌页一致,避免 403
DEFAULT_REFERER = "https://mp.weixin.qq.com/"
DEFAULT_UA = (
    "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) "
    "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 "
    "MicroMessenger/7.0.20"
)


def main() -> None:
    p = argparse.ArgumentParser(description="带 Referer 下载 mpvideo MP4")
    p.add_argument("url", help="完整 mp4 URL(含查询参数)")
    p.add_argument(
        "-o",
        "--output",
        default="downloaded.mp4",
        help="保存路径(默认 downloaded.mp4)",
    )
    p.add_argument("--referer", default=DEFAULT_REFERER, help="Referer 头")
    p.add_argument("--user-agent", default=DEFAULT_UA, help="User-Agent")
    args = p.parse_args()

    req = urllib.request.Request(
        args.url,
        headers={
            "User-Agent": args.user_agent,
            "Referer": args.referer,
        },
        method="GET",
    )
    try:
        with urllib.request.urlopen(req, timeout=120) as resp:
            data = resp.read()
    except urllib.error.HTTPError as e:
        print(f"HTTP {e.code}: {e.reason}", file=sys.stderr)
        sys.exit(1)

    out = open(args.output, "wb") if args.output != "-" else sys.stdout.buffer
    try:
        out.write(data)
    finally:
        if out is not sys.stdout.buffer:
            out.close()
            print(f"已写入 {args.output},{len(data)} 字节")
            if len(data) >= 8 and data[4:8] == b"ftyp":
                print("魔数检测:疑似标准 MP4(含 ftyp)")


if __name__ == "__main__":
    main()

现在就可以下载之后,上传了,发布的文章地址:

孤独症,就是不爱说话吗?

弱弱的问一下,我的网站怎么被镜像了嗫?

作者obaby
2026年4月1日 11:18

其实网站被镜像这件事情,本身没什么稀奇的,如果想搭建一个镜像网站,从零开始也不过个吧小时的时间。

之所以写这个东西,是因为最近有看到好几个人被镜像的,这一个(爱娃子),还有 这一个(我是军爸)。

不过,既然还有人有疑惑,那就简单的教一下大家怎么来镜像个网站吧。

为此,我创建了一个开源项目:

OpenResty + OpenCC 反向代理简繁转换


基于 OpenResty 反向代理上游站点,对 HTML 正文 做 OpenCC 简繁转换(默认:简体 → 繁体,配置文件为 s2t.json)。适合在不改源站的情况下,为访客提供另一种字体习惯版本。

功能概览

能力 说明
反向代理 HTTPS 回源(示例站点:zhongxiaojie.cn),客户端走本机证书与域名。
HTML 简繁转换 仅当 Content-Type 含 text/html 时对整页做 OpenCC UTF-8 转换。
gzip 解压 通过 Lua zlib 尝试解压响应体(与去掉 Content-Encoding 的配合视上游行为而定)。
链接与图片 URL 保护 转换前将 href / src / poster / data-src / srcset 及裸 http(s):// 链接替换为占位符,转换后还原,避免路径或查询串中的汉字被改写导致 404
IPv4 优先解析 resolver … ipv6=off + 变量 proxy_pass,减轻云主机无 IPv6 时对 AAAA 连接失败的问题。
静态资源直过 图片、CSS、JS、字体等扩展名单独 location不做 OpenCC,减轻负担、避免误伤二进制。
动态库加载 对 libopencc.so 按常见路径依次尝试 ffi.load,降低找不到共享库的概率。

限制与说明

  • JSON / JS / CSS 内嵌字符串若不在上述保护规则内,仍可能被转换;重要数据建议不要用全文 HTML OpenCC 硬转。
  • 内联样式 style="background:url(...)" 未单独做保护,若遇少数破图可再扩展规则。
  • 转换配置在 nginx/opencc/opencc-filter.lua 中的 OPENCC_CONFIG(默认 /usr/share/opencc/s2t.json);若需 繁体 → 简体 可改为 t2s.json 等(需系统已安装对应 OpenCC 数据文件)。

部署要求

  • OpenResty(带 lua-nginx-module)。
  • OpenCC 运行时:系统安装 libopencc.so 与词典数据(如 /usr/share/opencc/*.json),并保证 worker 进程能加载到 .so(见下文「共享库」)。
  • Lua 可 require('zlib') 的模块(用于 zlib.inflate,若无 gzip 体则 pcall 失败会跳过解压,不影响后续逻辑)。
  • 上游为 HTTPS 时,本机需能解析并访问该域名(已用 resolver 时 VARIABLE 形式 proxy_pass 才会走指定 resolver)。

部署步骤

1. 安装 OpenCC 与数据文件

以 Debian / Ubuntu 为例(包名因发行版略有差异):

sudo apt update 
sudo apt install -y libopencc1.1 opencc # 或 libopencc2 等,以仓库为准 
或者手工复制 lib64目录下的文件到 脚本对应的路径就是这个 /usr/lib64

 

确认存在词典,例如:

ls /usr/share/opencc/s2t.json

 

2. 确保能找到 libopencc.so

若日志出现 libopencc.so: cannot open shared object file

  • 将库放在系统默认搜索路径,例如 Ubuntu amd64:
  • ldconfig -p | grep opencc

     

  • 若库仅在 /usr/lib64 等非默认路径,可执行(与仓库 fix.md 一致):
  • echo '/usr/lib64' | sudo tee /etc/ld.so.conf.d/usr-lib64.conf sudo ldconfig

     

  • 或在 OpenResty 的 systemd 单元 中设置 Environment="LD_LIBRARY_PATH=/usr/lib64:/usr/local/lib"  后重启。

脚本内已对多路径做了 ffi.load 尝试;仍失败时请对照 ldd 与 opencc 包实际安装位置排查。

3. 部署 Lua 脚本

将 nginx/opencc/opencc-filter.lua 复制到服务端约定路径(与 nginx 配置一致),例如:

sudo mkdir -p /usr/local/openresty/lua 
sudo cp nginx/opencc/opencc-filter.lua /usr/local/openresty/lua/opencc-filter.lua

按需修改脚本顶部 OPENCC_CONFIG 指向本机实际的 JSON 配置。

4. 合并 Nginx / OpenResty 配置

  • 将 zero.zhongxiaojie.cn.conf 中的 server 块纳入主配置(include 或粘贴到 nginx.conf 的 http {} 下)。
  • 修改 证书路径日志路径上游域名 zhongxiaojie.cn、以及 body_filter_by_lua_file 的路径,使其与当前环境一致。
  • header_filter_by_lua 中去除 Content-Encoding,便于对明文 HTML 做处理;若上游与解压逻辑不匹配,需自行观察是否需要调整。

5. 校验并重载

sudo /usr/local/openresty/nginx/sbin/nginx -t 
sudo /usr/local/openresty/nginx/sbin/nginx -s reload 
# 或 systemctl reload openresty

 

6. 验证

  • 浏览器访问你的站点,查看页面简繁是否符合预期。
  • 检查 图片与站内链接是否正常(尤其含中文或 % 编码的路径)。
  • error.log 中不应再出现 OpenCC 库加载失败或大量 IPv6 unreachable(在无 IPv6 环境)。

配置项速查

项目 位置
OpenCC 配置 JSON opencc-filter.lua → OPENCC_CONFIG
Lua 脚本路径 zero.zhongxiaojie.cn.conf → body_filter_by_lua_file
上游站点 set $upstream_host … 与 proxy_pass https://$upstream_host$request_uri
DNS / 仅 IPv4 resolver 223.5.5.5 8.8.8.8 valid=300s ipv6=off
不参与转换的静态文件 `location ~* .(gif

故障排查

现象 可能原因
libopencc.so 找不到 未安装包、ldconfig 未包含库目录,或需 LD_LIBRARY_PATH
body_filter 报错、栈指向 ffi.load 同上;或架构不一致(如 32/64 位混用)
上游连接 IPv6 失败 已用 ipv6=off + 变量 proxy_pass;仍失败则检查防火墙与 DNS
图片 404 历史上多为 OpenCC 改了 URL 内汉字;当前脚本对常见属性已做保护,若仍有个别,检查是否来自 CSS url() 或 JS 动态拼接

如需改为其他域名、证书路径或 t2s 转换方向,只需改配置文件与 OPENCC_CONFIG,无需改 OpenResty 核心。

实际效果:

开源项目地址:https://gitee.com/obaby/baby-website-mirroring-tool

参考链接:https://blog.csdn.net/wzj_110/article/details/127758020

https://blog.rexskz.info/support-traditional-chinese-using-openresty-and-opencc.html

局部有雨

作者obaby
2026年3月30日 11:00

春天到了,又到了万物复苏的季节。小草也从土里钻出了头,露出了点点的绿色。树上的花也开始绽放,虽然没有绿叶的衬托,倒是也别有一番韵味。

每个周末,都大同小异。跟上班一样,也没有什么特别的,与渐渐生机勃勃的春天比起来,似乎有些过于平淡了。每周依然是带着宝子上课,上课,剩下偶尔有那么一点时间,也不能走的太远,只能周边小范围的溜达溜达。

宝子现在上课不太需要自己去帮忙了,至少能隔网之后,不用自己跟着去抛球了。这样就有点时间可以继续跑步了,围着网球场一圈一圈的跑。

不过相比操场的400米跑道,这一圈一百多米跑起来感觉更累,感觉跟拉磨的驴一样。

周日上午的网球课推迟到了十一点,早上早点起来,宝子嚷嚷着去公园,我嚷嚷着去轮渡。当然,公园是上午去,轮渡是下午去。对象再次征求宝子的意见,得到的答复是两个都去。

急忙吃完东西,开车去公园。上车之后发现前挡风玻璃上面有点雨点,想着是不是要下雨,跟宝子说,下雨了可能。她表示怀疑,没感觉到雨点啊。不过既然没感觉到,那就去公园吧,一路上虽然天依然阴沉,刚停好车,拉开车门的瞬间,一阵大雨落了下来,赶忙重新钻进车里。前后不到五秒中的时间,就让这场公园之旅化为了泡影。

回家之后,宝子在家换上轮滑鞋,来回溜达。想着,既然下雨了,应该网球课也停了吧,然而等到十点半依然没消息。既然如此,那可能市北没有下雨吧。一路上天变得越来越晴朗,到了学校之后依然是一篇艳阳天。

下课去学校餐厅吃点东西,下午就可以去轮渡了。

虽然是中午的饭店,想找个空位置还是蛮方便的,买了两碗麻辣烫,没有小碗。去隔壁的卤肉饭要了个小碗。餐厅门口从外面能感受到吹进来的真真的凉风。吃完饭,到了室外反而变得更加的温暖,与餐厅的温度完全不同。

一路小道辗转到环湾大道,路况还是比较畅通的,半个小时就到了轮渡停车场。怕找不到停车位,在入口找了个空塞了进入。往里走,大约100米发现内部竟然有一个大的停车场,并且还有大量的空位。

候船厅入口,写了一些方言的标语。

虽然购票的时候显示有场次,但是实际买的时候,就是看人数,人够了就发船。感觉到了县城做镇上的客车的感觉,流水车,流水船。检票的时候会给一个油条,这个油条并不是给游客吃的,是给海鸥吃的。

这个码头,在海底隧道和跨海大桥开通之后就已经停了好几年,这两年才又重新开放,用来做海上观光。成人票两个人90,宝子2块,价格还是蛮合适的,海上50分钟的观光,说可以看到跨海大桥。

检票上船,刚找地方坐下,就有工作人员开始喊,大家可以去喂海鸥了。喂海鸥只能在一楼,二楼是观光区域,油条投喂完之后可以上二楼。带着宝子来到船尾,大家都在那里观望,也不知道在等什么,我扔了一块油条出去之后,马山就有无数的海鸥飞过来开始争抢。大家也跟着开始往海里投喂。

发船之后,海鸥依然跟着游船,甚至能感受到海鸥翅膀煽动的时候,甩出来的水滴。

还有跟着游船一直来回盘旋,不断的争抢从游客手里抛出的油条。

当然啦,如果足够大胆,也可以直接用手拿着让海鸥去吃。

不过,这天气稍微微差点了,大约半小时不到,就开始掉头返航了。说好的看跨海大桥呢?海面的能见度并不算高。只能隐约看到一个轮廓,远处的货轮也一样,飘渺。

回港之后,依然能看到很多人在等着检票。如果五点多应该能看到海上的日落,很多人也在等那个最好的时间。

海上的冷风吹来,单穿一条牛仔裤还是冷了点。

好在没有因为家里的一场雨而不出门,毕竟其他的地方是一片艳阳天,不过局部有雨。

m3u8 downloader v26.03.28

作者obaby
2026年3月29日 21:58

基于 ffmpeg 的 m3u8 / 归档页解析下载工具,支持单链接、批量 CSV/文本、自定义输出目录与 ffmpeg 路径。

参数 说明
-i 输入:直链 m3u8、含 archives 的归档详情页、或带 cms_player 的播放页;也支持 .mp4 / .avi / .mov / .mpeg 直链(走 HTTP 分段下载,非 ffmpeg)
-o 输出文件名(自动补 .mp4);对部分模式用于覆盖默认标题名
-p 输出目录;可为本机路径或 UNC(如 \\服务器\共享\目录
-f 批量输入文件:.csv 或纯文本(每行一个链接)
-m 指定 ffmpeg 可执行文件路径

注意: 必须提供 -i 或 -f 之一。

单条示例

python m3u8_downloader.py -i "https://example.com/video.m3u8?token=xxx" -o myvideo -p D:\Videos

 

批量 CSV

 

  • 编码建议 UTF-8(含 BOM 亦可),表头需包含列 link;可选列 name(用于在部分逻辑里拼接输出名后缀,空单元格按空字符串处理,不会出现 nan 文件名)。
  • 会跳过空的 link 或内容为 link 的占位行。
  • 按行 顺序执行:上一任务结束(含 ffmpeg)后才会处理下一行。
python m3u8_downloader.py -f list.csv -p "\\192.168.1.12\media\Videos"

 

纯文本列表

 

每行一个 URL,行为与逐次 -i 类似;可通过 -o 传入统一输出名(视链接类型而定)。

功能说明

 

链接类型与行为

 

  1. .m3u8 直链
    使用 ffmpeg 拉流并 remux 为 .mp4-c copy)。
  2. URL 中含 archives(归档站 / bl05 类页面)
    请求页面,解析多个 div.dplayer 的 data-config,得到多路 m3u8;按路依次下载,文件名一般为 页面标题 + 序号,并经 safe_mp4_filename 净化。
  3. 其它播放页(非 archives)
    解析 var cms_player = {...} 的 JSON,取 url 作为 m3u8,再走 ffmpeg。
  4. .mp4 等直链
    使用 requests 分段下载(file_download.download_from_url),带 tqdm 进度条,不经过 ffmpeg

页面编码

 

抓取 HTML 时依次尝试 UTF-8 → UTF-8-sig → gb18030,减轻标题乱码。

输出文件名

 

  • 去除 Windows 非法字符,过长截断并可带 crc 后缀兜底。
  • 对「UTF-8 被误当成 latin-1」类乱码标题做启发式纠正(日志中可能出现 [F] 标题疑似 UTF-8/latin-1 乱码,已尝试纠正)。

覆盖策略

 

  • 若目标 .mp4 已存在os.path.isfile),跳过该次下载。
  • 调用 ffmpeg 时带 -n:不在终端交互询问覆盖;若因路径编码等导致检测不一致,ffmpeg 侧也会拒绝覆盖而非静默覆盖。

本地 m3u8 文件

 

-f 指向 .m3u8 / .m3u 时,当前代码分支为占位(pass),尚未实现。

目录说明

 

路径(相对程序目录) 用途
bin/ffmpeg.exe Windows 打包/放置 ffmpeg 的常见位置
download/m3u8_files 内部与 make_dir 相关的子目录逻辑
download/mp4 未指定 -p 时的默认输出目录

下载地址:

https://www.123912.com/s/ucY7Vv-njQAA?pwd=HwGK#

两岁半小棉袄的快乐时光

作者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年到期会有提醒,挺好。

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

简单的快乐

作者obaby
2026年3月27日 16:03

过年的时候买了两条牛仔裤,虽然是过年买的,但是有一条却并没怎么穿。主要是因为那是一条洞洞裤,穿洞洞裤里面穿的太厚了总是感觉有些奇怪。

洞洞裤最好的搭配可能就是薄裤袜或者光腿了,有时候总是看到什么各种短视频,见男朋友的最高礼仪-裤里丝。

不过可能更多男生喜欢的是黑丝吧。老妈看着自己的裤子,还以为是穿破了。用手指扣进去扣了一下,转头问我:『裤子坏了,你还不扔了?买不起裤子了吗?要不我给你缝一下?』

她总是说,你俩挣得也不少啊,买个东西扣扣搜搜的。多买几条裤子不行啊,别买那些几十块钱的鞋,太烂了。

有时候不得不承认,我的快乐就是来源于那些便宜的小玩意儿,哪怕穿几天坏了,扔了都不心疼。不过买东西的时候,宝子和她姥姥的眼光的确毒辣,给她们买衣服买鞋子,总是一眼就能相中那个最贵的。至于自己的日常穿搭,一百块钱的牛仔裤,500的鞋子,两百的衬衣,600的外套。内搭就不算了,这几本就是全部了,但是这些东西能穿好久,尤其是外套已经穿了好几年了。

有时候去逛街其实也不知道要买什么,就是纯粹瞎逛,基本也不会买什么衣服。等到换季的时候,偶尔买那么一两件。或者干脆从网上买,两百块钱买好几件,喜欢的留下,不喜欢的退回去。

周末带宝子去吃米线的时候看到的那家牛杂店,终于前天没忍住还是去了。看了一眼没地方停车,把车停到了对面充电停车场,于是在一片电车中间,混进了一辆纯油车。进入店里,虽然是午饭时间,店里只有两个大哥。

盯着菜单看了好久,才看到纯牛杂,小份35。

又要了一个肉夹馍,一瓶可乐,一共51块。等了半天,终于上了,不得不说,这小份真的不大的样子。刚开始害怕吃多了,影响自己减肥,后来才发现是自己想多了。

而至于味道,也没吃出小时候的味道。吃完出门给对象发消息说,『我去吃周末看到的那个店里的牛杂了,味道没有自己预想的那么好。』

发完消息,等红灯,过马路,这时候看到停车场的告示牌上写着:『中午11点-下午2点,充电高峰期禁止燃油车入内……』

这我往里进的时候自动放行了,也确实没注意,赶紧上车准备开走。这时候手机响了一声,拿起来看到一条微信消息:『那你以后还会再去吗?』

迟疑了一下,我回复:『不会去了,还不如我自己从二手东买处理好的,我自己煮。』

下午,从二手东买了之前看的牛杂,127三斤。

到了晚上依然是少吃,运动。白天走的少了,晚上就多跳几个,白天步数多的时候就可以少跳几个,目标就是凑够一万步。

跳习惯了之后,其实至于现在三千,五千,还是七千,感觉区别都不大,唯一的区别也就在于时长了。有时候跳完感觉还是有点紧绷的感觉。

偶尔也想能全身再按一下,上次按摩应该还是去年十月份左右吧。转眼快半年了,早上从高德上扒拉了半天,找到一个相对来说看着还算可以的。

最起码那个名字看起来还满顺眼的。

鉴于第一次去,没有选择太复杂的项目。不过也有不靠谱的地方,那个巨幕是个啥,确实没看到。刚开始趴在床上,技师按的挺舒服的,感觉都快睡着了。等开始按小腿的时候,一下就给按醒了,还是挺疼得。两个腿都是如此,聊了会儿,建议经常运动还是要多按一下。

为了按摩,中午吃饭的时间就没了。70分钟,甚至已经超了下午上班的点了。

喝点水,顺便看了下价目表,嗯,下次可以做个全身精油按摩,价格貌似跟之前经常去的那家店差不多。

按完还完衣服赶紧往公司赶,店外的停车场也挺让人崩溃的,一遍有台阶,整体过道也比较窄,好在车不多,来回倒腾十来次才从停车场开出来。

路上等红灯的时候,遇到一辆typeR,至于是不是真的,其实我也不大认识。后来着急从左侧超了过去,等上立交桥的时候发现那辆typeR紧贴在后面,不是,姐姐我不是想飙车啊,我是真的到上班点了。

直到自己从从主路转到辅路他还紧贴在后面,但是,姐姐我到啦。

停好车往电梯口走,发现小腿依然有点疼,可能是长时间不按,不习惯了吧。

哼,还是得多按几次。

绽放

作者obaby
2026年3月25日 17:19

我要变成野花开在你身边
将我摘走吧在枯萎之前  — 戴娆 《绽放》

周末带宝子去上课的时候,竟然又听到了这首歌。上次听的时候应该是十年前了,眨眼间十几年竟然就过去了。那种轻松欢快的旋律,总是能让人心情变得更加的雀跃。

对我来说,绽放的年龄似乎依然是过去了,剩下的只有残花败柳,跟着时间一起变老。在老去的过程中也看到有的人的凋零,一个接着一个。上周的时候,同事神秘兮兮的说,公司有个哥们没了。说着拿手机给我看,我接过来,在他的朋友圈看到一条消息:『***因为心脏问题,医治无效去世,将在**举行告别仪式……』

看到这条消息的时候,内心并没有太大的波动。这几年,已经看着好多的人凋零,同村的邻居,自己的亲人,自己的同事,还有网上的名人。

昨天晚上对象说,下午看说什么张雪峰的头像变灰了,后面好像又给换回来了。我上网搜了一下,最开始看到的是张的助理说不清楚,合伙人说无可奉告。后来去微博搜的时候,就看到了张的微博账号发的讣告,的确是心脏问题去世了。

张还说自己跑马拉松什么的,身体没问题,网友都不见得能跑过他。然而,这他也没跑赢心脏病。看完消息之后,我一度都想直接买个aed放在家里了。不过对象说不至于,没啥必要。

张雪峰比我大一些,另外一个去世的同事比我大的更多一些。如果身体不好,看来真的不适合当牛马。而至于运动,真的能提高寿命吗?可能也没什么必然的相关性,有的疾病可能没有什么症状,而等到发病的时候,身体素质好的人可能存活的机会更少。身体素质不好的,可能会被拖垮但是不至于要命。当然,也有人说,锻炼是为了更体面的离开。身体拖垮了,可能就只剩下苟延残喘,没有质量的生活。

总是觉得来生还长,似乎有的是时间。现在看来,很多的人时间并没有那么多。或许正在绽放的时候,就被意外给消灭了。相比生命来说,其他的也就没那么重要了。钱多钱少,只要能活的开心就好了。体验生活,享受生活,才是关键,总是让自己活的不后悔才是对的。

很久之前刷短视频,看到一款个别假的手链。前几天又刷到了,去淘宝下了单买了四条,原价12块钱,最后实际花了3块钱。快递到了之后,带回家,对象看到说:『你真无聊,这有什么好玩的啊』

『没什么好玩的啊,我就是喜欢那种很假的感觉。』我答到。

我喜欢的是ta的视觉效果 ,有个角度看过去特别假。感觉都不想这个世界的东西。有时候买这些乱七八糟的小玩意儿,也会上瘾。可能买来不会戴,但是买的时候还是挺开心的。有时候也会买特别廉价的衣服神马的,并且买的衣服也真的不会穿出去。

有时候也挺矛盾的,这一身加起来不到100块钱,然而,周一去加油,大半箱油就花掉了300。加几次一辆电动车出来了,这还是里程数不多的情况下。粉皮每年花的钱,比我花的钱多多了。这么一向,感觉也挺无语。拍写真都够好多套了,不过下次拍,争取把十斤体重先减下来。跳绳的时候想到这些天天运动还猝死的,有感觉有那么一丝丝凉意。运动并不会使人长寿,健康也不会使人长寿,但是,我还是喜欢健康苗条。

最近事情的确有点多,一点点的堆积着都没来得及处理。工行发短信,说新信用卡已经到了营业厅了,但是却一直没去取。偶然想起来小时候吃的牛杂汤,忽然就很想吃。然而,美团、高德搜了一圈都没找到能吃牛杂的地方。想从二手东买,买回来自己加工,对象表示这个东西可能就你自己吃,买那么多也不合适,还是找个地方出去吃罢。

只是,到现在还没找到一个能吃牛杂的地方。周日带宝子去吃罐罐米线的时候,看到万达边上有一个牛杂店,好几天了,却还是没有来的及去。每天中午回家去消灭宝子姥姥在周末包的水饺,荠菜的,韭菜的。每次怕不够吃都会包很多,虽然很好吃,但是为了控制体重,剩下的水饺到现在已经吃了三天了,还有一些在冷冻上,明天不能再吃了,想去吃牛杂了。有的时候,那种记忆真的是刻在了骨子里。熟悉的味道,总是能让人感慨良多。而闺蜜圈的新版本发布,总是一波三折。华为的商户资质,三星的各种材料提交,总是有无数的关卡卡在前面,有时候也在想,不如放弃吧,反正也不挣钱,自己用也够了。

原本,今天似乎能有点空闲时间。然而,早上到公司拉代码的时候,发现移动硬盘坏了,mac 能识别磁盘,但是挂载不了,尝试急救失败。

Checking if the parent's minkey can be updated...
error: btn: oid (854310), xid (36994), type (0x40000003), subtype (0xb), flags (0x4) level (1)
error: btn: unable to repair minkey
   Object map is invalid.
** The volume /dev/rdisk5s1 with UUID 381DE7AB-BD78-4F75-879C-0E618699D213 was found to be corrupt and cannot be repaired.
** Verifying allocated space.
warning: found spaceman free queue tree entry (0xcfef0+17, xid 36987) which overlaps with existing range (0xcfef1+1)
warning: found spaceman free queue tree entry (0xcfef0+17, xid 36987) which overlaps with existing range (0xcfefb+1)
warning: found spaceman free queue tree entry (0xcff16+9, xid 36987) which overlaps with existing range (0xcff16+1)
warning: found spaceman free queue tree entry (0xcff16+9, xid 36987) which overlaps with existing range (0xcff1a+1)
warning: found spaceman free queue tree entry (0xcff16+9, xid 36987) which overlaps with existing range (0xcff1c+1)
warning: found spaceman free queue tree entry (0xcff22+1, xid 36987) which overlaps with existing range (0xcff22+1)
warning: found spaceman free queue tree entry (0xcff2c+3, xid 36987) which overlaps with existing range (0xcff2d+1)
warning: found spaceman free queue tree entry (0xcff30+3, xid 36987) which overlaps with existing range (0xcff31+1)
warning: found spaceman free queue tree entry (0xcff45+2, xid 36987) which overlaps with existing range (0xcff45+1)
warning: found spaceman free queue tree entry (0xcff4c+1, xid 36987) which overlaps with existing range (0xcff4c+1)
warning: found spaceman free queue tree entry (0xcffcc+3, xid 36987) which overlaps with existing range (0xcffcd+1)
warning: found spaceman free queue tree entry (0xcffcc+3, xid 36987) which overlaps with existing range (0xcffce+1)
warning: found spaceman free queue tree entry (0xcfe0f+11, xid 36988) which overlaps with existing range (0xcfe13+1)
warning: found spaceman free queue tree entry (0xcfe22+12, xid 36988) which overlaps with existing range (0xcfe24+1)
warning: found spaceman free queue tree entry (0xcfe22+12, xid 36988) which overlaps with existing range (0xcfe25+1)
warning: found spaceman free queue tree entry (0xcfe60+1, xid 36988) which overlaps with existing range (0xcfe60+1)
warning: found spaceman free queue tree entry (0xcfe85+1, xid 36988) which overlaps with existing range (0xcfe85+1)
warning: found spaceman free queue tree entry (0xcfe96+3, xid 36988) which overlaps with existing range (0xcfe98+1)
warning: found spaceman free queue tree entry (0xcff12+2, xid 36988) which overlaps with existing range (0xcff13+1)
warning: found spaceman free queue tree entry (0xcfe1c+1, xid 36989) which overlaps with existing range (0xcfe1c+1)
warning: found spaceman free queue tree entry (0xcfe36+1, xid 36989) which overlaps with existing range (0xcfe36+1)
warning: found spaceman free queue tree entry (0xcfe3e+1, xid 36989) which overlaps with existing range (0xcfe3e+1)
warning: found spaceman free queue tree entry (0xcfe57+2, xid 36989) which overlaps with existing range (0xcfe57+1)
warning: found spaceman free queue tree entry (0xcfea9+3, xid 36989) which overlaps with existing range (0xcfeab+1)
warning: found spaceman free queue tree entry (0xcfebe+1, xid 36989) which overlaps with existing range (0xcfebe+1)
warning: found spaceman free queue tree entry (0xcfee3+1, xid 36989) which overlaps with existing range (0xcfee3+1)
warning: found spaceman free queue tree entry (0xcff2f+1, xid 36989) which overlaps with existing range (0xcff2f+1)
warning: found spaceman free queue tree entry (0xcffd8+3, xid 36989) which overlaps with existing range (0xcffd9+1)
warning: found spaceman free queue tree entry (0xcfd9e+3, xid 36990) which overlaps with existing range (0xcfd9f+1)
warning: found spaceman free queue tree entry (0xcfd9e+3, xid 36990) which overlaps with existing range (0xcfda0+2)
warning: found spaceman free queue tree entry (0xcfe6e+1, xid 36990) which overlaps with existing range (0xcfe6e+1)
warning: found spaceman free queue tree entry (0xcfee6+1, xid 36990) which overlaps with existing range (0xcfee6+1)
warning: found spaceman free queue tree entry (0xcff29+1, xid 36990) which overlaps with existing range (0xcff29+1)
warning: found spaceman free queue tree entry (0xcfdc9+1, xid 36991) which overlaps with existing range (0xcfdc9+1)
warning: found spaceman free queue tree entry (0xcfe11+1, xid 36991) which overlaps with existing range (0xcfe0f+11)
warning: found spaceman free queue tree entry (0xcfda1+1, xid 36992) which overlaps with existing range (0xcfd9e+4)
warning: found spaceman free queue tree entry (0xcfdb5+1, xid 36992) which overlaps with existing range (0xcfdb5+1)
warning: found spaceman free queue tree entry (0xcfe4e+1, xid 36992) which overlaps with existing range (0xcfe4e+1)
warning: found spaceman free queue tree entry (0xcfe66+1, xid 36992) which overlaps with existing range (0xcfe66+1)
warning: found spaceman free queue tree entry (0xcfe88+1, xid 36992) which overlaps with existing range (0xcfe88+1)
warning: found spaceman free queue tree entry (0xcff41+1, xid 36992) which overlaps with existing range (0xcff41+1)
warning: found spaceman free queue tree entry (0xcfe40+1, xid 36993) which overlaps with existing range (0xcfe40+1)
warning: found spaceman free queue tree entry (0xcfeda+1, xid 36993) which overlaps with existing range (0xcfeda+1)
warning: found spaceman free queue tree entry (0xcff6c+1, xid 36993) which overlaps with existing range (0xcff6c+1)
warning: found spaceman free queue tree entry (0xcff7b+1, xid 36993) which overlaps with existing range (0xcff7a+2)
** Performing deferred repairs.
error: Unable to perform deferred repairs without full space verification
** The container /dev/rdisk5 could not be verified completely.

尝试各种修复方式,最终都以失败告终,apfs看来也不咋靠谱。只能格式化硬盘,重新拉代码,重新配置运行环境,拉代码大半天时间竟然就没了。

只是,退堂鼓一向,内心又觉得不甘。应该让她绽放的,辛辛苦苦的折腾到现在,总是不想功亏一篑。好好的东西,夭折了,也的确不是我的风格。

如果按照所谓的平均寿命,现在看来,正是如花似玉的年龄。该绽放就绽放吧,哪怕花开的有些晚了,也是总要开的。

🦞龙虾养殖小技巧

作者obaby
2026年3月25日 15:21

在深入体验这个东西之前,其实我并未对龙虾抱有太高的期望。不过这几天实际使用下来,感觉还算可以,最起码没那么智障,一些简单的事情也能给处理好。

然而,龙虾虽好,但是养殖却还是稍显麻烦。尤其是系统配置不高的情况下,最开始的时候一切都配置好了,结果在某天晚上gateway就再也启动不了了,启动的的时候就报内存溢出。cpu和内存都直接跑满,等降下来之后,龙虾也跟着死了。刚开始以为是配置问题,改错东西导致启动失败了,结果在回滚镜像之后依然报错,这个镜像是刚安装好的时候创建的镜像。那么此时就有另外一个问题了,同样的镜像为什么系统重启之后就启动不了了?

当时没想这么多,解决办法是备份memory文件等进行重装,好在重装之后接本的功能和代码都在,让龙虾从新加载配置文件,也恢复到了之前的状态。不过,在重装的时候npm源也是个问题,可以考虑直接修改系统的npm源:

npm config set registry https://registry.npmmirror.com

检查修改是否生效:

npm config get registry

另外一个,那就是我给龙虾外层套了一层认证,当然这个做法有点傻,但是呢。这些乱七八糟的东西直接暴露出来总是多少感觉有点问题,于是还是套了一层nginx的认证。

毕竟,前几天周鸿祎还吆喝发现了龙虾的oday漏洞。

相关登录界面实现参考:https://cnb.cool/oba.by/baby-claw

然而,安装之后,昨天尝试更新龙虾,结果更新之后重启又开始报内存溢出,这就有点尴尬了,直接运行doctor:

ubuntu@VM-0-11-ubuntu:~$ openclaw doctor

🦞 OpenClaw 2026.3.23-2 (77e4) — I'm like tmux: confusing at first, then suddenly you can't live without me.

▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄▄
██░▄▄▄░██░▄▄░██░▄▄▄██░▀██░██░▄▄▀██░████░▄▄▀██░███░██
██░███░██░▀▀░██░▄▄▄██░█░█░██░█████░████░▀▀░██░█░█░██
██░▀▀▀░██░█████░▀▀▀██░██▄░██░▀▀▄██░▀▀░█░██░██▄▀▄▀▄██
▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀▀
                  🦞 OPENCLAW 🦞                    
 
┌  OpenClaw doctor
│
◇  Update ──────────────────────────────────────────────────────────────────────────────────╮
│                                                                                           │
│  This install is not a git checkout.                                                      │
│  Run `openclaw update` to update via your package manager (npm/pnpm), then rerun doctor.  │
│                                                                                           │
├───────────────────────────────────────────────────────────────────────────────────────────╯
│
◇  Startup optimization ─────────────────────────────────────────────────────────────────────╮
│                                                                                            │
│  - NODE_COMPILE_CACHE is not set; repeated CLI runs can be slower on small hosts (Pi/VM).  │
│  - OPENCLAW_NO_RESPAWN is not set to 1; set it to avoid extra startup overhead from        │
│    self-respawn.                                                                           │
│  - Suggested env for low-power hosts:                                                      │
│    export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache                               │
│    mkdir -p /var/tmp/openclaw-compile-cache                                                │
│    export OPENCLAW_NO_RESPAWN=1                                                            │
│                                                                                            │
├────────────────────────────────────────────────────────────────────────────────────────────╯
13:24:32 [plugins] plugins.allow is empty; discovered non-bundled plugins may auto-load: openclaw-qqbot (/home/ubuntu/.openclaw/extensions/openclaw-qqbot/index.ts). Set plugins.allow to explicit trusted ids.
[qqbot-channel-api] Registered QQ channel API proxy tool
[qqbot-remind] Registered QQBot remind tool
│
◇  Archive 1 orphan transcript file in ~/.openclaw/agents/main/sessions? This only renames them to *.deleted.<timestamp>.
│  No
│
◇  State integrity ─────────────────────────────────────────────────────────────────────────╮
│                                                                                           │
│  - OAuth dir not present (~/.openclaw/credentials). Skipping create because no            │
│    WhatsApp/pairing channel config is active.                                             │
│  - Found 1 orphan transcript file in ~/.openclaw/agents/main/sessions.                    │
│    These .jsonl files are no longer referenced by sessions.json, so they are not part of  │
│    any active session history.                                                            │
│    Doctor can archive them safely by renaming each file to *.deleted.<timestamp>.         │
│    Examples: 9ede0dd4-5344-4156-a156-a9035538b1cb0d.jsonl                                   │
│                                                                                           │
├───────────────────────────────────────────────────────────────────────────────────────────╯
│
◇  Security ─────────────────────────────────╮
│                                            │
│  - No channel security warnings detected.  │
│  - Run: openclaw security audit --deep     │
│                                            │
├────────────────────────────────────────────╯
│
◇  Systemd ───────────────────────────────────────────────────────────────────────────╮
│                                                                                     │
│  Gateway runs as a systemd user service. Without lingering, systemd stops the user  │
│  session on logout/idle and kills the Gateway.                                      │
│  We can enable lingering now (may require sudo; writes /var/lib/systemd/linger).    │
│                                                                                     │
├─────────────────────────────────────────────────────────────────────────────────────╯
│
◇  Enable systemd lingering for ubuntu?
│  Yes
│
◇  Systemd ───────────────────────────────╮
│                                         │
│  Enabled systemd lingering for ubuntu.  │
│                                         │
├─────────────────────────────────────────╯

这时候才发现关键性的几行:

◇  Startup optimization ─────────────────────────────────────────────────────────────────────╮
│                                                                                            │
│  - NODE_COMPILE_CACHE is not set; repeated CLI runs can be slower on small hosts (Pi/VM).  │
│  - OPENCLAW_NO_RESPAWN is not set to 1; set it to avoid extra startup overhead from        │
│    self-respawn.                                                                           │
│  - Suggested env for low-power hosts:                                                      │
│    export NODE_COMPILE_CACHE=/var/tmp/openclaw-compile-cache                               │
│    mkdir -p /var/tmp/openclaw-compile-cache                                                │
│    export OPENCLAW_NO_RESPAWN=1                                                            │
│                                                                                            │
├────────────────────────────────────────────────────────────────────────────────────────────╯

这个startup 优化,不知道是不是针对gateway的启动也有效。不过在升级到最新版之后,感觉启动稍微顺畅了一点。似乎没那么卡了。

新版本貌似也同时修复了用量显示问题,上个版本,不管怎么查询用量都只显示今天的,新版貌似是没问题了:

服务器作为一个比较干净的环境,如果要实现一些其他的功能,就得能够进行文件快速交互,所以文件上传下载也就是一个必备的技能,推荐filebrower:

至此对我来说,一个简单的勉强能用的龙虾就实现了。可以尝试各种工作了:

1. 手搓elf可执行文件

2.给我发布闺蜜圈wiki的文章:

3.批量创建停机申请表:

skill这个东西,可以有,但是也不是必须的。

 

张雪峰猝死于41岁,比我还年轻几岁

作者崔话记
2026年3月25日 12:42

  昨天晚上得知张雪峰猝死的消息,心里咯噔了一下,惊讶的同时也感到惋惜。他才41岁,比我还小几岁,事业也正当红。

张雪峰讣告

  上次张雪峰上全网热搜可能是新闻学专业被他干死的事情了。张雪峰是现今无数网红里面少数我印象深刻的之一,之前看过一些关于他对高考志愿指导及大学和就业指导的视频切片,对他的态度和观点都有深刻的印象。他把一些底层家庭关于大学和就业的信息差,语言生动态度鲜明的讲出来,对于向他咨询的学生家长,以及屏幕前的看客,都是一次再教育。

  新闻中说,他是个工作很拼的人,也很注重运动,有长期跑步的习惯,昨天下午还在跑步机上跑了7公里,然后就倒下了,4个小时后就被宣告死亡。而在此之前好几年,他就已经多次出现过严重的健康问题,还住过院。

  人有时候就像装在机器上的螺丝,随着整台机器的运转而不由自主的运转。张雪峰是所有人眼中寒门学子奋斗逆袭的成功典范,同时也是长期高压状态的创业者,他不停的在忙着直播、讲座、咨询培训、出书、综艺等,可能很多时候吃饭的时间都没有,我看到直播切片里他也经常在吃东西。我不及他十分之一的忙,却也时常累的不想动,对运动更是毫无积极性,不得不佩服他这样自律性极强的人。

  为什么说四十不惑,四十多岁就是大多数人的山顶,开始直面死亡冲击,开始考虑自己的老年。

  三年前的春节,惊悉大学班长岁河同学的讣闻。(《纪念岁河同学》

  去年春节,48岁的大S之死,在脑子里的印象还没有消去。

  昨天张雪峰去世,年仅41岁。

  不论是哪个年龄段,都要给大脑以及身体一些趴着不动的修整时间。打工人在业余时间,也要做做无为者无所求,饱食而遨游。

  别总以为来日方长、以后再说,意外真不知道和明天到底谁先来。珍惜生命,不意味着消极躺平,而是要积极生活,少留遗憾。中年人也要有安排后事的思维,要有立遗嘱的准备,对上有老下有小的状况清醒认知。

  我希望国家有一种福利,替有个人网站的人去世后长期的免费托管域名和网站,低者每年百来块钱,一百年也没多少钱,从退休金或者抚恤金里面抠出来也行,国家集中托管还能把成本再降低一个数量级,关键是要稳定可靠。我们大多没有富人那样庞大的物质遗产,唯有精神文化遗产,可能是我们最值得珍视的遗产了。

❌