普通视图

Received yesterday — 2026年2月3日

老同学被优化了

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

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

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

Received before yesterday

没有被看见的斩杀线,其实就在身边

作者崔话记
2026年2月2日 19:47

  美国的斩杀线,最近被讨论的足够多,但状况却是多年前持续到现在的,只是以前大家都被别人的滤镜或自己有意无意的滤镜给骗了而已。如今没什么人讨论我国的斩杀线,也并不意味着我国没有斩杀线,如果到全民讨论的那一天,那可能就是已经严重到万劫不复了。也可能这种负能量天生和国内的网络媒体环境不符,发出来没什么好处,或者发不出来。

  我不去分析那些大数据,就凭自己的亲身经历以及道听途说,说说我所感受的斩杀线。

  斩杀线不是说非得把一个人弄死才叫斩杀,而是一种重大的生活水平坠落,而且可见的时间内没有恢复的可能。

斩杀线1: 医疗

  国内的斩杀线,首当其冲是医疗。大家都说美国的天价医疗费,但是中国的情况虽然不同但也有特定情况下的天价医疗费,而且中国人传统上的重情重义,导致一个人的病情拖垮全家三代人的生活的例子也不鲜见。

  解放前的中国人,得了重病的情况下大部分和在家等死差不多,叫个郎中过来开几副药,能不能吃好就看命了。比如我母亲有时候也会说,她要是得了要花几十万去看的病,那她就自己跳到河里死了算了。最近几十年,中国人的经济和生活水平坐了火箭一样的提升,人渐渐都开始惜命了。

  我们每个人一定都见过朋友圈里的水滴筹、轻松筹等等,那可能就是一个个的斩杀线的案例,如果他们筹到了除掉筹款中介和平台的抽成之后还足够用的医疗费,那他们还算好的了。还有那些没有去公众筹款的人呢,大家看不见。在知乎上,我见过好几个网友现身说法,家里的一个老人病重,还没到八九十那种离上帝很近的老,可能在退休线附近的,年轻不算年轻,老又不算太老,家人肯定是不舍得放弃的。如果放弃,不仅有情感上的不舍,也有道德负罪感,而且就算某个人的心里有放弃的想法,也必然不敢先说出来,谁也不愿意也不敢先当这个坏人,结局基本上只有一个,那就是花光所有的积蓄,可能再卖房卖车或借钱,到最后再也拿不出钱来了为止。

  以前有一个同事,是家里的独生子,好大学毕业,进了外企,光鲜亮丽。一场癌症袭来,就掏空了一切。住院两年期间,公司仍然足额发工资,还给了几十万补助金,同事捐款也有几十万,他自己家里也从小康之家变得一无所有,卖了房,借了债。最终的结果,天不遂人愿,他还是没能撑过去。他算是解脱了,他父母没了半分养老钱,还要赚钱还债。可能我们作为外人,会觉得不应该这么不计代价,但没有谁能够算明白代价到底应该到哪一步是刚刚好。

  重病对普通人就是不留情面的。当一个家庭从富余突然变得穷困,引发的副作用远比贫困本身更大,可能是抗风险能力的归零,锐意进取的心态崩溃,夫妻感情与亲子关系的破裂等等。站在事后诸葛或上帝视角,我们或许能够对他人的境遇留有一丝客观,发生到自己头上的时候,就不是那么回事了。

  我个人可能是更偏向残酷的理想主义者,我偏向于国家免费治疗,并且禁止家庭超出收入能力的医疗支出,比如说国家兜底100万的治疗额度,家庭可以动用50%资产用于自费医疗,就算家庭想投入更多钱治疗也被法律禁止。法律一方面是要尽可能照顾更多人,另一方面也通过明确规则解除家庭成员放弃治疗的道德负担。这个数字我是随口一说,不用较真,意思是那么个意思。

斩杀线2: 超前消费

  除了医疗,还有一个斩杀线,就是超前消费。现在已经挺严重,但正在变得更严重。

  第一波,是上杠杆买房的人,碰上经济放缓的大环境。极度的乐观,到极度的悲观,只隔了短短数年。这些人之中,绝大多数并不是炒房客,只是憧憬美好生活的普通人,当收入降低,还贷压力很可能会让一个家庭喘不过气来,甚至再也没有翻身的机会,因为你后续赚的每一分钱都第一时间要去还贷而不能用于继续投资,不论是投资创业还是个人成长。

  第二波,是超前消费贷的人。现在即使不买房,也有很多人习惯了超前消费,各种消费贷让人应接不暇唾手可得,越来越常听见刚从学校毕业没多久的年轻人就欠了大几万甚至几十万网贷的事情了。一部分年轻人,正在从上一辈的极尽节俭,走向另一个极端,掉进资本编织的消费陷阱。解决方案是什么,不知道,低消费躺平肯定不是。

自省

  就我自己而言,也是属于上杠杆买房的人,多方面的原因买了学区房,现在也是负担比较重的,虽说有些资产但是没什么活钱,如果有个什么意外,那这一切都是镜花水月,一夜归零。为了对抗这些意外,就买了较高的保险,而保险费反过来又增加了负担。现在,银行的贷款,就是我的斩杀线吧。

  所以,能怎么办呢?调整心态,生死面前都是小事。

  开心享受美好生活,好好对待身边的人,现在的日子可能是最好的。

Python的数据结构

2026年1月1日 00:00

未完待续

【新年开篇】让我们拿出跃马扬鞭的勇气,激发万马奔腾的活力,保持马不停蹄的干劲,一起为梦想奋斗、为幸福打拼,把宏伟愿景变成美好现实。

1.概述

在Python中,有四种常见的数据结构

数据结构是否可变是否允许重复是否有序定义符号
列表(List)可变允许有序[]
元组(Tuple)不可变允许有序()
字典(Dict)可变键不允许,值允许有序{}
集合(Set)可变不允许无序{}

2.列表(List)

列表是一种有序的数据结构,元素写在[]中间,用,隔开通过下标访问。

列表创建有三种,直接创建,通过list()方法,以及推导式。

列表的特点:

  • 可以被索引(从左到右和从右到左)和切片(substring)
  • 可以使用+操作符进行拼接
  • 列表中的元素是可变的
  • 元素可以是任意类型
  • 元素允许重复

2.1 创建,索引和切片

#直接创建list1 = [1,2,3,4,5]list2 = ['abc', 2, 1.55]# 索引 => 1print(list1[0])# 第2到第4的元素,不含第4个 => [2, 3]print(list1[1:3])# 从第3个元素开始到末尾 => [3, 4, 5]print(list1[2:])# list1复制成两份拼接一起 => [1, 2, 3, 4, 5, 1, 2, 3, 4, 5]print(list1 * 2)# 拼接 => [1, 2, 3, 4, 5, 'abc', 2, 1.55]print(list1 + list2)

Python列表可以倒序索引,且元素可变

list1[-1] = 100print(list1[-1]) #100

python可以用list()方法创建一个空的集合

empty_list = list()print(empty_list)

list()方法从字符串创建数组

s = 'hello'l = list(s)print(l) #['h', 'e', 'l', 'l', 'o']

3.元组(Tuple)

4.字典(Dict)

5.集合(Set)

推荐一位朋友编写的益智小游戏:横冲直撞

作者崔话记
2026年1月29日 18:47

  “横冲直撞”,是朋友皮卡丘编写的益智小游戏,挺久之前的作品了,最近跟他又聊到这个游戏,把链接收录到了我的站点上,这里做个小小的推荐。

横冲直撞

  玩法比较经典了,应该有人玩过类似的,只需要让小精灵在棋盘格内上下左右的滑动(键盘方向键、鼠标或触摸滑动),借助各种道具(石头、弹板、井盖、木桶等),最终滑动到目标格(梯子标记的格子)。

  游戏功能做的挺完善的,支持各种设备,有玩法介绍,历史记录,自带300个关卡,还能够根据自选难度生成随机谜题,解不出来的难题还可以使用自动提示功能。

  点击上面的图片或者这里就可以开始玩了。

  这里搭个便车推荐一下自己的小游戏。最近把本站的Games页面更新了一下,带上了缩略图和一句话简介,页面上列出了13个自编小游戏,有兴趣的朋友可以移步Games页面瞅瞅。

宽带改公网投诉小记

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

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


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

关于程序员高广辉猝死所想到的

作者崔话记
2026年1月28日 20:52

  程序员高广辉猝死的新闻,是上周听说的。当时听说这事,在我内心并没有很大的波澜,这样的事情也听说过多次了。

  程序员可能未必是比其他职业更容易猝死,应该所有高强度工作都有这样的危险。但程序员群体之间产生的交集会更多,会在网上探讨技术问题,共享技术成果,所以同行之间的距离感比较近,同行猝死的冲击就比较大。程序员的工作非常讲究时效性,在线服务出问题了往往要第一时间解决,不论大厂小厂,加班往往是常态。

  以前看过的一个剧《凡人歌》,里面的男主的弟弟那隽就是程序员,也是非常真实的复现了程序员加班的场景,公司里有人被救护车拉走,他自己也一度出现短暂失聪。可笑的是,剧中公司厕所安装计时器的桥段,在现实中也是存在的,新闻能搜到一大把。

  就我自己而言,熬夜也是经常,写代码或者解决技术问题有时候是工作需要,有时候是兴趣使然,反正不会感到烦躁厌倦,但是累是真的会累,有时候熬的太晚了第二天睡到中午。在家的时候,夜深人静的环境,脑子更加能够专注,时间就会不知不觉的流逝几个小时。

  看网上晒出的高广辉和妻子的微信聊天记录,我感觉也挺离谱,每隔几天一次对话,每次的对话几乎都仅有妻子催他回家而无其他内容,他多数也并不回复,或者只是短短回复“要晚点”之类。

高广辉和妻子的微信聊天记录

  这样的人是不正常的,不仅仅是没有生活,甚至是几乎没有人类情感了,实在无法理解。有没有可能他在和妻子面对面的时候是正常人类情感呢?我认为可能性不大。一个人的性格,往往是贯穿其行为的。

  我不理解那些通宵达旦打麻将的人,觉得他们比加班还累,为什么他们自己乐此不疲呢,即使从生理方面来说他们真的很累,但他们的大脑就像是磕了兴奋剂。这样的适当娱乐我是喜欢的,但是那么累的娱乐我是干不下去的。

  看高广辉的github issues里面好多人发“R.I.P”,不明所以,网上查了一下,才知道是英文“Rest in Peace”的缩写,意为逝者安息的意思,学到了。但我想说,咱能别那么省事吗?

  最后希望所有努力养家糊口的牛马们,合理安排工作,多一点自己的生活,祝身体健康!

身份证到期更换

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

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

服务器廉价续费迁移教程

作者鸦鸦
2026年1月24日 21:24

优惠价格结束的这一天终究还是到来了,打开一看续费价格飙到一千多了,这哪受得了!

但是兜兜转转发现阿里云又有别的廉价套餐了,99一年,不知道能续费多久,先上车再说~

传送门:云小站_专享特惠_云产品推荐-阿里云

新购的服务器是ECS,地域选了华东1杭州,旧的服务器是轻量应用服务器,地域在华东2上海,这就涉及到跨域跨产品类型迁移,就得老老实实转移文件了。

服务器迁移至少应该有三种方式:

第一种是系统盘层级的快照,相当于直接把系统盘搬家。

第二种是宝塔面板内部的一键迁移方式,大概是宝塔面板重新下载安装到新服务器再帮你自动复制文件。

第三种是网站级别的备份还原,手动把wordpress数据库和文件夹搬过去。

如果运行了不止一个网站,那肯定是快照最彻底了。我用的就是阿里云的磁盘快照功能,然后创建镜像,再共享到ECS,再从华东2上海复制到华东1杭州,这样就得到了一个在华东1杭州的镜像了。

接下来购买服务器的时候直接选自定义镜像,列表里就有我们刚创建的镜像了。实例启动后数据盘就完全搬过来了。如果你先买了服务器,后创建的快照,不要慌,问题不大,也有办法重装系统。在ECS实例里面,点击“资源变配-镜像操作-更换操作系统”就可以选到你的自定义镜像重装,好像会给你直接换个数据盘来安装。

这个时候输入新的公网IP,应该是能直接进入wordpress。但是还有两个操作别忘了:防火墙的端口设置也要照搬过来,否则宝塔面板是进不去的;还有域名解析也要更改到新的公网IP。

最后PING域名,成功解析到新IP,并且打开网站一切正常,搬家结束。

至于为什么偏爱杭州,我最近是真的被杭州的地理条件迷住了,我宣布它是我的梦中情乡,至少在自然环境上,是优于上海的,毕竟钱塘江和西湖群山真的太美了。

已经把杭州地图挂墙上了。每天看几眼就又想努力了。

这是从一个博主那要来的杭州高清地图,可惜水的颜色太寡淡了,试了颜色替换,准确度不是很好。也许以后会重新折腾ArcGIS吧。这个色号是我精挑细选了上千年的结果:#81c5d2

本文发表于鸦鸦的巢穴,感谢您的订阅!如需评论请前往服务器廉价续费迁移教程

姥姥和奶奶

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

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

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

溜冰场内年龄最大、技术最差、但最勇敢的人

作者崔话记
2026年1月21日 22:01

  周末跟女儿去滑冰了,离上次去滑冰,有近一个月了。滑冰场在商城里面,地铁直达,很是方便。来滑冰的多数是小朋友,看起来四五岁的都不少,还有少部分年轻人和滑冰教练。环视全场,我这个年龄的,恐怕就没有第二人了,跟我年龄接近的都在场边的家长休息区。我是抱着借机运动一下、来都来了、重在参与的思想下的场。

滑冰场

  这次刚进场的时候,我感到明显生疏了,只能挨着边上慢速的滑,滑一段就要扶着旁边的栏杆停下来,转弯和减速都不会了。滑了半个小时后,才找到一点平衡感了,不过也轻微摔了两次。我是全场技术最差的人之一了,看别人各种花式动作那么溜,真是佩服。休息了十分钟之后,又滑了半个小时,出了一身汗。运动完就在旁边的食通天吃午饭,等餐的时候女儿拿餐巾纸折了个千纸鹤。

午餐

千纸鹤

  女儿并不热衷于运动,虽然也愿意在家长的带动下出来运动,但如果给她自由选,她肯定选宅在家里做作业或者打游戏。爬山、打球、滑冰等等,我就只能以身入局了哈哈。珍惜现在的机会吧,随着她的长大,我的老去,这将越来越难得。

  当天没啥感觉,到周一的时候开始觉得大腿酸,周二也还腿酸,到周三才消失。平时我这胳膊腿的运动量确实太少了,希望今年加强一下。

年会没中奖,是不是等于没参加年会?

作者崔话记
2026年1月20日 20:12

  公司年会已经过去十来天了,现在来回忆一下。

  这两年的年会,公司都是租的会展中心的场馆,弄的恢弘大气。对我个人来说,最大的区别是,去年身体不好心情不好,今年身体好心情也好。最大的共同点是,我都没有中奖!每年上千个抽奖名额,我连续两年没中,那只能理解为幸运点数都用在别的地方去了吧。

  随着年龄的增长,对待年会的心态也产生了很大的变化。今年的年会当天直到中午,我都没意识到当天是年会时间,脑子里以为是下周,后来偶然的看了一眼企业微信才知道。

  刚工作的头几年在小公司的时候,并没有年会,遇到抠门的老板连个聚餐都没有。后来去了稍微大一点的公司,虽然没有年会,但是会有尾牙宴,也是其乐融融。去杭州工作的时候,是大一点的外企,也有了比较正式的年会,会有歌舞节目,会在酒店聚餐,会抽奖,会为同事的节目表演嗨起来喊,会被年会上讲话的人感动。

  现在公司规模不小,每年的年会也规模不小,两千多人的大厅,热闹非凡。大领导们意气风发豪言壮语,美女帅哥们歌舞升平。前几年我还觉得要去吃饱喝足的,这几年对年会上大同小异的餐食也没多大兴趣了,最期待的恐怕就是那个抽奖环节了,可能是因为凭运气取得的收获更能让普通人兴奋吧。哪怕一年里发生了再多不愉快的事情,只要年会幸运中奖,就会觉得这一年是以大幸运完美结束的。而没有中奖,就多少感到遗憾的,这就是我的小格局哈哈,格局大的都在台上给大家抽奖。

  几年前的我,在年会抽奖节目的时候,脑袋里想的是这个抽奖程序应该如何实现更好,需要考虑哪些关键点,如何更好的互动抽奖等等。现在的我,已经不会再去多思考这些了。我看其他同事也很直接,当一等奖的名单完全揭晓之后,大家就开始起身离席了,哪怕服务员的菜还没上完,哪怕舞台上还有人讲话或表演。今年年会的菜品味道真是退步了,炒面还有没炒熟的,但那么大的量,恐怕也确实是没办法做好。

  顺路吐槽一下年会的“小品”表演,每年都是可劲的霍霍四大名著或者白娘子法海,穿越搞笑,其实我对这种节目是一丁点儿兴趣都没有,感觉过于低俗搞笑了而且还并不太好笑。歌舞节目是我最喜爱的,每年都能见到几个虽不认识但已脸熟的面孔,她们的舞蹈也许比专业的差的远,但已经足够展示出热情与美丽了。现在的孩子们,在多才多艺这方面,真是比我这辈强太多了。

年会

  2025 已归档,2026 已新建文件夹。

给博客所有图片加个水印

作者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块钱的费用。

天翼云电脑不休眠不关机教程

作者Hary
2026年1月18日 13:56

 有使用天翼云电脑的小伙伴知道,天翼云电脑默认有一个休眠机制,超过60分钟不使用,未使用客户端进行远程连接,则进入休眠状态,相当于自动关机,如果自己挂的一些程序或者软件啥的就会出现掉线。
 自从九月份入手了一台长期的天翼云电脑,现在我的所有的网上冲浪的一些东西全部在云电脑上面,用来挂一些软件和一些定时任务,还是非常方便的,前前后后也试了各种方法,目前在用的这种保活方法还算是比较满意的,分享一下,有需要的朋友可以试一下,不主动重启的话不会休眠。

 我的这台前几天我新装了一个软件,重启了一下,之前已经稳定运行20多天了,还是非常稳的。

小米音箱申请售后

作者Hary
2026年1月15日 22:03

 25年初的时候入手的一款新发布的小米音箱《入手小米智能音箱PRO,米家智能家电+1,使用一周初体验》,一直放在卧室里给小孩放儿歌讲故事,一直用着也没啥问题,后来回老家就带回去了,元旦回家媳妇就跟我讲,现在的小爱同学好像有点傻了,而且有的时候还喊了没反应,之前离得好远都可以轻松唤醒,现在在客厅都唤不醒在卧室的小爱同学。
 当时也没当回事,前几天看京东订单,好多小家电媳妇买东西都喜欢买个保险都是延保三年五年的,这个小米音箱也买了个4年质保,后来就想着不行就换一下,经常叫不醒还是挺让人抓狂的,就找到当时的订单准备申请一下维修售后,刚好看还没一年呢,可以直接用京东自带的一年内免费保修,也没浪费那个4年的保险,额外买的这个保险是只能用一次,第二年或者第四年都可以用,但是只能用一次。


 直接用了一年免费维修这个申请了,理由是唤醒不灵敏,有时候让唱歌或者讲故事也是答应了之后,说开始唱XXX或者讲XXX,然后就没有然后了,估计多少还是有点问题,提交售后之后客服也是打了个电话确认了下情况,说不用维修,直接换新,随后就直接生成了一个新的订单,新的到了之后,现场把旧的给京东快递员就行。
 果然换的新的还是好使,老远就能轻松唤醒,反应也挺快,而且还发现了个这款音箱支持蓝牙Mesh的功能,可以把不能联网的智能设备连接音箱,然后就可以通过小爱同学控制了,下次回家可以把只支持蓝牙Mesh的客厅和卧室的灯加进去,就可以通过小爱同学控制了。
 看来买东西顺手买个几块钱的保险还是很有性价比的,上面那个给小孩买了两年的保温杯,刚好看到有个两年的保险快到期了,也一起申请了个售后,倒是直接旧的也不用寄了,直接重新发新的,果然京东贵还是有贵的道理的。

Spring AI集成多模态模型

2025年12月31日 00:00

未完待续

模态和多模态的概念等前置知识,已经在以下文章中提到

Spring AI对于多模态也做了支持,本文介绍Spring AI对接多模态模型的用法。

1.视觉理解

很多多模态大模型产品也都支持OpenAI的协议,因此还是使用spring-ai-starter-model-openai

pom.xml

<parent>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-parent</artifactId>    <version>3.5.7</version></parent><dependencyManagement>    <dependencies>        <dependency>            <groupId>org.springframework.ai</groupId>            <artifactId>spring-ai-bom</artifactId>            <version>1.1.2</version>            <type>pom</type>            <scope>import</scope>        </dependency>    </dependencies></dependencyManagement><dependencies>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-web</artifactId>    </dependency>    <dependency>        <groupId>org.springframework.boot</groupId>        <artifactId>spring-boot-starter-test</artifactId>        <scope>test</scope>    </dependency>    <dependency>        <groupId>org.springframework.ai</groupId>        <artifactId>spring-ai-starter-model-openai</artifactId>    </dependency>    <!-- Lombok -->    <dependency>        <groupId>org.projectlombok</groupId>        <artifactId>lombok</artifactId>    </dependency></dependencies><build>    <plugins>        <plugin>            <groupId>org.apache.maven.plugins</groupId>            <artifactId>maven-compiler-plugin</artifactId>            <configuration>                <source>21</source>                <target>21</target>                <encoding>UTF-8</encoding>            </configuration>        </plugin>    </plugins></build>

application.yml

spring:  ai:    openai:      base-url: https://dashscope.aliyuncs.com/compatible-mode      api-key: ${QWKEY}      chat:        options:          model: qwen3-vl-pluslogging:  level:    org.springframework.ai: debug

配置类不变,使用OpenAI协议的模型

package org.example;import org.springframework.ai.chat.client.ChatClient;import org.springframework.ai.chat.client.advisor.MessageChatMemoryAdvisor;import org.springframework.ai.chat.client.advisor.SimpleLoggerAdvisor;import org.springframework.ai.chat.memory.ChatMemory;import org.springframework.ai.openai.OpenAiChatModel;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;@Configurationpublic class SpringAiConfig {        @Bean    public ChatClient chatClient(OpenAiChatModel model, ChatMemory chatMemory) {        return ChatClient.builder(model)                .defaultAdvisors(                         SimpleLoggerAdvisor.builder().build(),                         MessageChatMemoryAdvisor.builder(chatMemory).build()                )                .build();    }}

新建测试类,测试多模态模型。user提示词中使用.user(e -> e.text("图片中的统计数据是谁发布的,大学学历网民占比是多少。").media(media))传递图片内容

package org.example.test;import jakarta.annotation.Resource;import lombok.extern.slf4j.Slf4j;import org.example.Main;import org.junit.jupiter.api.Test;import org.springframework.ai.chat.client.ChatClient;import org.springframework.ai.chat.memory.ChatMemory;import org.springframework.ai.content.Media;import org.springframework.beans.factory.annotation.Value;import org.springframework.boot.test.context.SpringBootTest;import org.springframework.http.MediaType;@SpringBootTest(classes = Main.class)@Slf4jpublic class UnitTest {    @Resource    private ChatClient chatClient;    @Value("classpath:image.png")    private org.springframework.core.io.Resource resource;    @Test    public void test() {        Media media = new Media(MediaType.valueOf("image/png"), resource);        String content = chatClient.prompt()                .user(e -> e.text("图片中的统计数据是谁发布的,大学学历网民占比是多少。")                        .media(media))                .advisors(advisor -> advisor.param(ChatMemory.CONVERSATION_ID, 1))                .call()                .content();        log.info("************** {}", content);    }}

然后得到大模型分析结果

2026-01-13T09:11:37.737+08:00 DEBUG 8620 --- [           main] o.s.a.c.c.advisor.SimpleLoggerAdvisor    : request: ChatClientRequest[prompt=Prompt{messages=[UserMessage{content='图片中的统计数据是谁发布的,大学学历网民占比是多少。', metadata={messageType=USER}, messageType=USER}], modelOptions=OpenAiChatOptions: {"streamUsage":false,"model":"qwen3-vl-plus","temperature":0.7}}, context={chat_memory_conversation_id=1}]2026-01-13T09:11:44.273+08:00 DEBUG 8620 --- [           main] o.s.a.c.c.advisor.SimpleLoggerAdvisor    : response: {  "result" : {    "metadata" : {      "finishReason" : "STOP",      "contentFilters" : [ ],      "empty" : true    },    "output" : {      "messageType" : "ASSISTANT",      "metadata" : {        "role" : "ASSISTANT",        "messageType" : "ASSISTANT",        "refusal" : "",        "finishReason" : "STOP",        "annotations" : [ { } ],        "index" : 0,        "id" : "chatcmpl-47c0652b-2526-9dd5-8d56-b3067f837901"      },      "toolCalls" : [ ],      "media" : [ ],      "text" : "根据图片信息:\n\n1. **统计数据发布方**:  \n   该数据由 **CNNIC(中国互联网络信息中心)** 发布,来源于其《中国互联网络发展状况统计调查》。\n\n2. **大学本科及以上学历网民占比**:  \n   - 在 **2016年12月** 的数据中,占比为 **11.5%**。  \n   - 在 **2017年6月** 的数据中,占比为 **11.6%**。\n\n因此,截至2017年6月,**大学本科及以上学历的网民占比为 11.6%**。\n\n✅ 总结:\n- 发布机构:**CNNIC**\n- 大学本科及以上学历网民占比(2017.6):**11.6%**"    }  },  "metadata" : {    "id" : "chatcmpl-47c0652b-2526-9dd5-8d56-b3067f837901",    "model" : "qwen3-vl-plus",    "rateLimit" : {      "requestsLimit" : null,      "requestsRemaining" : null,      "requestsReset" : null,      "tokensLimit" : null,      "tokensRemaining" : null,      "tokensReset" : null    },    "usage" : {      "promptTokens" : 457,      "completionTokens" : 178,      "totalTokens" : 635,      "nativeUsage" : {        "completion_tokens" : 178,        "prompt_tokens" : 457,        "total_tokens" : 635,        "prompt_tokens_details" : { },        "completion_tokens_details" : { }      }    },    "promptMetadata" : [ ],    "empty" : false  },  "results" : [ {    "metadata" : {      "finishReason" : "STOP",      "contentFilters" : [ ],      "empty" : true    },    "output" : {      "messageType" : "ASSISTANT",      "metadata" : {        "role" : "ASSISTANT",        "messageType" : "ASSISTANT",        "refusal" : "",        "finishReason" : "STOP",        "annotations" : [ { } ],        "index" : 0,        "id" : "chatcmpl-47c0652b-2526-9dd5-8d56-b3067f837901"      },      "toolCalls" : [ ],      "media" : [ ],      "text" : "根据图片信息:\n\n1. **统计数据发布方**:  \n   该数据由 **CNNIC(中国互联网络信息中心)** 发布,来源于其《中国互联网络发展状况统计调查》。\n\n2. **大学本科及以上学历网民占比**:  \n   - 在 **2016年12月** 的数据中,占比为 **11.5%**。  \n   - 在 **2017年6月** 的数据中,占比为 **11.6%**。\n\n因此,截至2017年6月,**大学本科及以上学历的网民占比为 11.6%**。\n\n✅ 总结:\n- 发布机构:**CNNIC**\n- 大学本科及以上学历网民占比(2017.6):**11.6%**"    }  } ]}2026-01-13T09:11:44.273+08:00  INFO 8620 --- [           main] org.example.test.UnitTest                : ************** 根据图片信息:1. **统计数据发布方**:     该数据由 **CNNIC(中国互联网络信息中心)** 发布,来源于其《中国互联网络发展状况统计调查》。2. **大学本科及以上学历网民占比**:     - 在 **2016年12月** 的数据中,占比为 **11.5%**。     - 在 **2017年6月** 的数据中,占比为 **11.6%**。因此,截至2017年6月,**大学本科及以上学历的网民占比为 11.6%**。✅ 总结:- 发布机构:**CNNIC**- 大学本科及以上学历网民占比(2017.6):**11.6%**

LangChain Tools工具使用

2025年12月24日 00:00

未完待续

关于大模型工具使用有关前置知识和原理,已经在下面文章提到:

1.概述

本文介绍基于langchain开发具有工具使用(Function calling)功能的智能体Agent

2.实现

langchain开发Agent,需要安装包

pip install langchain==1.1.2pip install langchain-openaipip install langchain-classic

实现工具方法供大模型调用,并通过函数装饰器@tools修饰工具方法

@tools常用属性

属性类型描述
name_or_callablestr | Callable名称
descriptionstr描述工具的功能,会作为上下文发送给大模型
args_schemaArgsSchema可选择性地指定参数格式
return_directbool是否直接从工具返回

/my_tools.py

from langchain.tools import toolfrom pydantic import BaseModelfrom pydantic import Fieldclass FiledInfo(BaseModel):    """    定义参数信息    """    city: str = Field(description='城市')@tool(args_schema=FiledInfo, description='根据城市名称获取温度')def tp_tool(city: str) -> int:    print('=======tp_tool=======')    if city == '北京':        return 12    elif city == '武汉':        return 23    elif city == '沈阳':        return -10    elif city == '泉州':        return 27    else:        return Noneif __name__ == '__main__':    print( tp_tool.invoke({'city': '沈阳'}) )

使用create_agent创建智能体agent,绑定模型和工具,然后调用invoke()执行

/test_tool2.py

import osfrom langchain.agents import create_agentfrom langchain.chat_models import init_chat_modelfrom my_tool import tp_toolllm = init_chat_model(    model = 'deepseek-chat',    model_provider = 'openai',    api_key = os.getenv('DSKEY'),    base_url = 'https://api.deepseek.com')# 创建 Agent,绑定tp_tool工具agent = create_agent(    llm,    tools=[tp_tool],    system_prompt="""你是一个天气查询助手""")# 执行result = agent.invoke({    "messages": [{"role": "user", "content": "泉州温度多少"}]})for msg in result['messages']:    if hasattr(msg, 'content'):        print(f"{msg.__class__.__name__}: {msg.content}")

输出结果

=======tp_tool=======HumanMessage: 泉州温度多少AIMessage: 我来帮您查询泉州的温度。ToolMessage: 27AIMessage: 根据查询结果,泉州的当前温度是**27°C**。
❌