普通视图

发现新文章,点击刷新页面。
昨天以前陶小桃Blog
  • ✇陶小桃Blog
  • Typecho插件FailDebug:禁止网站被调试,增加网站攻击的难度52txr
    FailDebug 是一款专为 Typecho 网站设计的安全防护插件,旨在防止用户通过开发者工具或其他调试手段对网站进行逆向工程或调试。通过禁用右键菜单、快捷键(如 F12、Ctrl+U、Ctrl+Shift+I 等)以及检测开发者工具的开启状态,FailDebug 能够有效保护网站的前端代码和逻辑,防止内容被盗用或篡改。插件支持灵活的配置选项,用户可以根据需求启用或禁用特定功能。评价没啥根本的卵用,但是可以恶心想攻击你博客的人。防止网站被攻击,是一个系统性功能,CDN端、服务器端、前端,可能缺一不可。本插件无法完全阻止调试:虽然插件可以增加调试难度,但无法完全阻止专业开发者通过其他手段调试网站。下载地址FailDebug 1.0.0 For Typecho By 陶小桃Blog.zip - 蓝奏云下载链接配置把下载的文件放在插件目录下即可:在后台启动插件默认已经全部勾选,可以根据的需要进行关闭。配置选项:禁用右键菜单禁用F12按键禁用Ctrl+U快捷键禁用Ctrl+Shift+I快捷键启用无限debugger检测开发者工具并替换内容效果本站已经启用。插件适合那种长期不折腾网站的人,
     

Typecho插件FailDebug:禁止网站被调试,增加网站攻击的难度

作者 52txr
2025年3月14日 21:26

FailDebug 是一款专为 Typecho 网站设计的安全防护插件,旨在防止用户通过开发者工具或其他调试手段对网站进行逆向工程或调试。通过禁用右键菜单、快捷键(如 F12、Ctrl+U、Ctrl+Shift+I 等)以及检测开发者工具的开启状态,FailDebug 能够有效保护网站的前端代码和逻辑,防止内容被盗用或篡改。插件支持灵活的配置选项,用户可以根据需求启用或禁用特定功能。

评价

没啥根本的卵用,但是可以恶心想攻击你博客的人。

防止网站被攻击,是一个系统性功能,CDN端、服务器端、前端,可能缺一不可。

本插件无法完全阻止调试:虽然插件可以增加调试难度,但无法完全阻止专业开发者通过其他手段调试网站。

下载地址

FailDebug 1.0.0 For Typecho By 陶小桃Blog.zip - 蓝奏云下载链接

配置

把下载的文件放在插件目录下即可:

插件目录

在后台启动插件默认已经全部勾选,可以根据的需要进行关闭。

配置选项

  • 禁用右键菜单
  • 禁用F12按键
  • 禁用Ctrl+U快捷键
  • 禁用Ctrl+Shift+I快捷键
  • 启用无限debugger
  • 检测开发者工具并替换内容

效果

本站已经启用。

插件适合那种长期不折腾网站的人,如果经常折腾,是在给自己添麻烦。

小陶可能启用一段时间就关掉了。

  • ✇陶小桃Blog
  • 读博随笔 | 突然想唠唠曾经卷生卷死的本科生活52txr
    本文通过作者对两位准研究生的观察,探讨了当下学术竞争与本科教育的现状。一位考研学生收到导师严苛的邮件回复,折射出学术圈高压、功利的环境,作者提醒不要过度神化学术热情;另一位保研学生则通过搭建个人学术主页(作者提供源码)积极争取机会,凸显竞争的白热化。作者结合自身经历,反思本科阶段的“内卷”本质:课程流于形式、科研参与功利化,自己曾为保研极度焦虑,将同伴视为竞争对手,陷入“草木皆兵”的心态,最终虽达成目标,却深感精神扭曲。文末,作者以烹饪日常收尾,隐喻人生价值的回归——相较于虚耗精力的恶性竞争,平凡生活的烟火气更显真实可贵。全文批判了教育体系的形式主义与过度竞争,倡导跳出功利陷阱,重新审视生活本真。遇到的准研究生这段时间,保研人和考研人也都开始蠢蠢欲动套磁联系导师了。小陶接连看到两位优秀的本科生,一个是考研的,一个是保研的。考研人,则是收到了老师的邮件回复:说实话,看着邮件的内容我就感到有些窒息,一看就是个奋斗逼,严于律己、严以待人的风格。对于本科生而言,我的忠告永远是:不要高估自己对学术的热情,科研这东西本身也只是混口饭吃的工作,并没有多么高尚。保研人则是联系我要了我的学术主页的源码,
     

读博随笔 | 突然想唠唠曾经卷生卷死的本科生活

作者 52txr
2025年3月14日 19:57

本文通过作者对两位准研究生的观察,探讨了当下学术竞争与本科教育的现状。一位考研学生收到导师严苛的邮件回复,折射出学术圈高压、功利的环境,作者提醒不要过度神化学术热情;另一位保研学生则通过搭建个人学术主页(作者提供源码)积极争取机会,凸显竞争的白热化。作者结合自身经历,反思本科阶段的“内卷”本质:课程流于形式、科研参与功利化,自己曾为保研极度焦虑,将同伴视为竞争对手,陷入“草木皆兵”的心态,最终虽达成目标,却深感精神扭曲。文末,作者以烹饪日常收尾,隐喻人生价值的回归——相较于虚耗精力的恶性竞争,平凡生活的烟火气更显真实可贵。全文批判了教育体系的形式主义与过度竞争,倡导跳出功利陷阱,重新审视生活本真。

遇到的准研究生

这段时间,保研人和考研人也都开始蠢蠢欲动套磁联系导师了。小陶接连看到两位优秀的本科生,一个是考研的,一个是保研的。

考研人,则是收到了老师的邮件回复:

老师的邮件回复

说实话,看着邮件的内容我就感到有些窒息,一看就是个奋斗逼,严于律己、严以待人的风格。对于本科生而言,我的忠告永远是:不要高估自己对学术的热情,科研这东西本身也只是混口饭吃的工作,并没有多么高尚。

保研人则是联系我要了我的学术主页的源码,然后做一个自己的学术主页准备去联系硕导:

(打个广告:https://www.52txr.cn/xueshu/

学术主页的源码

学术主页的源码

我的内卷本科生活

本科生活就是高中的一个延续,还是为了应付考试、应付作业。本科的教育在我看来,其实就是学生与老师的双败,相互浪费时间和精力。大部分老师都是在念着十几年前的PPT,学生则是上课玩着自己的手机。

虽然现在很多学校也在尝试让本科生进实验室,但是大多是情况都是不了了之,毕竟搞这些动静都是领导层好宣传自己的功绩,而大多数的本科生也只是在想着能不能蹭点成果来为自己的保研、考研加分。

我本科在内卷什么呢?我是带着直接简单的功利性,就是卷保研。我的口号就是奖学金可以不要、荣誉可以不要,但是我是真的不想考研,必须所有的精力梭哈获得保研。我是幸运的,最后也如愿以偿了。但是再想想,感觉多少有点心理扭曲,并没有静下心来去思考和学习,只是一直担心受怕。

在文章《读研随笔 | 有趣的读研生活足以治愈一生》中,曾提到我曾将每一个同平台的人都当做是竞争对手,就像一只随时准备被攻击和攻击别人的孤狼,对周围的环境充满了不安,更想要通过获胜来证明自己的力量,这是真的,因为我高中、本科这一共七年的时间,逐渐养成了我的“草木皆兵”的心态。

我担心别人知道了我不知道的考试重点;

我担心别人竞赛相互挂名加分把我挤没了;

我担心别人去了更好的去处......

我曾经觉得早上多睡一会就是罪恶,一定要把知识点滚瓜烂熟(即便现在我已经忘光了),别人做一遍的题目我要多做几遍,为了课程设计可能多得一两分宁愿通宵去优化调整,会把报告写的很详细很好看很厚......

走了很远很远的路

直到我走了很远很远的路,也一直在思考。

对于内卷的原因,内卷的结果,我已经不太在意,也不想去思考;既然身处其中,就接着卷;如果有自己觉得有意义的事情,那就去做。

人的一生,终究要回归到生活,事业再成功,也少有人能在历史上留下一笔,死后的五年或十年,也便不会再有什么人想起你。

做顿饭吧,感觉比科研有意思多了。

准备小料

黄焖鸡

排骨

辣子鸡

  • ✇陶小桃Blog
  • ZBlog用户有福了!用Auth76Times插件为七牛云CDN添加URL鉴权,使链接在短时间过期防盗刷52txr
    千呼万唤始出来,ZBlog版本的Auth76Times插件终于发布了!在当今互联网时代,内容盗刷和资源滥用问题日益严重,尤其是对于使用CDN加速的网站,如何保护静态资源(如图片、视频、CSS、JS等)不被恶意盗用成为了站长们的一大难题。今天,我们为大家带来一款专为ZBlog用户设计的插件——Auth76Times,它能够轻松为七牛云CDN资源添加时间戳防盗链功能,有效防止资源被盗刷!什么是时间戳防盗链?时间戳防盗链是一种基于URL签名的防盗链机制。通过为资源链接添加签名参数(如sign和t),使得链接在指定的时间内有效,过期后链接将无法访问。这种机制不仅能够有效防止资源被盗用,还能减少CDN流量浪费,提升资源的安全性。Auth76Times插件的核心功能本文所述的Auth76Times插件专为ZBlog用户设计,支持七牛云CDN的时间戳防盗链功能,具有以下核心特性:多域名密钥绑定支持为多个域名配置不同的密钥,灵活适配复杂的CDN资源管理需求。自定义链接有效期可设置链接的有效时长(单位为秒),例如120秒、600秒等,确保链接在短时间内过期。文件后缀鉴权支持自定义需要鉴权的文件后缀(如.
     

ZBlog用户有福了!用Auth76Times插件为七牛云CDN添加URL鉴权,使链接在短时间过期防盗刷

作者 52txr
2025年3月12日 10:43

千呼万唤始出来,ZBlog版本的Auth76Times插件终于发布了!在当今互联网时代,内容盗刷和资源滥用问题日益严重,尤其是对于使用CDN加速的网站,如何保护静态资源(如图片、视频、CSS、JS等)不被恶意盗用成为了站长们的一大难题。今天,我们为大家带来一款专为ZBlog用户设计的插件——Auth76Times,它能够轻松为七牛云CDN资源添加时间戳防盗链功能,有效防止资源被盗刷!

什么是时间戳防盗链?

时间戳防盗链是一种基于URL签名的防盗链机制。通过为资源链接添加签名参数(如signt),使得链接在指定的时间内有效,过期后链接将无法访问。这种机制不仅能够有效防止资源被盗用,还能减少CDN流量浪费,提升资源的安全性。

Auth76Times插件的核心功能

本文所述的Auth76Times插件专为ZBlog用户设计,支持七牛云CDN的时间戳防盗链功能,具有以下核心特性:

  1. 多域名密钥绑定

    支持为多个域名配置不同的密钥,灵活适配复杂的CDN资源管理需求。

  2. 自定义链接有效期

    可设置链接的有效时长(单位为秒),例如120秒、600秒等,确保链接在短时间内过期。

  3. 文件后缀鉴权

    支持自定义需要鉴权的文件后缀(如.jpg.png.mp4等),避免对非静态资源进行不必要的签名处理。

  4. 自动签名

    插件会自动为HTML中的静态资源URL添加签名参数,无需手动修改代码。

配置七牛云CDN

关于七牛云的CDN配置,我就不做过多介绍了。配置好应该是下面的CNAME"已配置"绿色的。如果七牛云的CDN不会配置,可以提交一下工单或者咨询一下博客的QQ群。

配置好cname解析

开启时间戳防盗链

七牛云的鉴权方式比较特殊,并不是常见的TypeA,因此之前写的《Typecho/WordPress的CDN鉴权插件URLAuth1.2.0版本发布!支持任意多个域名的自定义鉴权》虽然在腾讯云、七牛云、火山云、阿里云、多吉云等等都适用,但是唯独在七牛云CDN中无法使用。

在七牛云的CDN配置中找到域名管理:

进行域名管理

然后在域名的配置中找到时间戳防盗链,点击修改配置

时间戳防盗链

时间戳防盗链

此时点击确定会弹出这个让人讨厌的检验时间戳防盗链

检验时间戳防盗链

点击下面的时间戳计算器网站。随便整一个存在的域名下的静态资源链接。过期时间可以填f2fdd543(代表的是2099-03-09 14:37:55)。然后点击生成。把生成的连接复制到检验时间戳防盗链再点击确定即可。

时间戳防盗链计算器 - 七牛云 - 网页有点慢,推荐开着科学上网

时间戳防盗链计算器

复制结果

Auth76Times插件下载与配置

一些效果展示

如果你的CDN开了鉴权,但是没有鉴权参数:

没有鉴权参数

鉴权成功:

鉴权成功

鉴权参数失效:

鉴权参数失效

  • ✇陶小桃Blog
  • ZBlog版本URLAuth插件来了!支持主流CDN(Type-A类型鉴权),为链接添加有效期有效防盗刷52txr
    本文介绍了ZBlog平台新推出的URLAuth插件,该插件通过为静态资源URL添加时效性鉴权参数(Type-A类型),有效防止CDN资源被盗刷,支持多吉云、腾讯云、阿里云等主流CDN服务商。文章详细说明了CDN鉴权的必要性——通过验证用户身份、限制非法访问,保障服务器资源不被恶意占用;并以多吉云和腾讯EdgeOne为例,演示了插件配置流程,包括密钥生成、鉴权参数设置及域名授权绑定。插件通过动态生成带时间戳和加密签名的URL,实现静态资源访问控制,当鉴权参数缺失或过期时自动拦截请求,从而显著提升网站安全性与稳定性。CDN为什么要鉴权?通过鉴权机制,CDN可以确保只有经过授权的用户才能访问特定内容。鉴权有助于减少CDN中的攻击、刷流量等问题,保证服务器的稳定运行‌。没有鉴权的情况下,大量恶意请求可能会涌入CDN节点,占用宝贵的带宽和资源,导致正常用户的请求无法得到及时响应‌。通过鉴权,可以限制非法用户访问网站和内容,降低安全风险。例如,通过验证用户身份、检查请求头部的特定字段等方式,可以有效防止恶意请求和爬虫攻击‌。‌URL鉴权是一种常见的鉴权方式,在URL中添加特定的鉴权参数,CDN节点
     

ZBlog版本URLAuth插件来了!支持主流CDN(Type-A类型鉴权),为链接添加有效期有效防盗刷

作者 52txr
2025年3月11日 00:05

本文介绍了ZBlog平台新推出的URLAuth插件,该插件通过为静态资源URL添加时效性鉴权参数(Type-A类型),有效防止CDN资源被盗刷,支持多吉云、腾讯云、阿里云等主流CDN服务商。文章详细说明了CDN鉴权的必要性——通过验证用户身份、限制非法访问,保障服务器资源不被恶意占用;并以多吉云和腾讯EdgeOne为例,演示了插件配置流程,包括密钥生成、鉴权参数设置及域名授权绑定。插件通过动态生成带时间戳和加密签名的URL,实现静态资源访问控制,当鉴权参数缺失或过期时自动拦截请求,从而显著提升网站安全性与稳定性。

CDN为什么要鉴权?

通过鉴权机制,CDN可以确保只有经过授权的用户才能访问特定内容。

鉴权有助于减少CDN中的攻击、刷流量等问题,保证服务器的稳定运行‌。没有鉴权的情况下,大量恶意请求可能会涌入CDN节点,占用宝贵的带宽和资源,导致正常用户的请求无法得到及时响应‌。通过鉴权,可以限制非法用户访问网站和内容,降低安全风险。例如,通过验证用户身份、检查请求头部的特定字段等方式,可以有效防止恶意请求和爬虫攻击‌。

‌URL鉴权是一种常见的鉴权方式,在URL中添加特定的鉴权参数,CDN节点根据这些参数验证请求的合法性。例如,阿里云CDN提供了在标准URL基础上添加加密信息(如timestamp、md5hash和Filename)的方式进行鉴权‌。

URLAuth就是一种基于Type-A的鉴权方式,支持主流的CDN,例如多吉云、腾讯云、火山引擎、华为云等等。具体可以去咨询一下客服或者看看帮助文档。

CDN鉴权配置

本文就以多吉云CDN为例(腾讯云、阿里云都是差不多的)来介绍一下如何配置插件,因为我看Typecho圈子里大家用的多吉云还是蛮多的。多吉云融合CDN,免费境内融合CDN加速、图片储存等,月免费流量20GB,免费有效请求次数200w次,博客站个人站点加速必备。欢迎大家使用!

点击注册多吉云

关于如何配置多吉云CDN的教程网上有很多,多吉云的帮助文档也有细节说明。本文就不再赘述。

配置好之后到"访问控制"中,开启URL鉴权:

开启URL鉴权

然后填写配置参数:

(a)、打开URL鉴权;

(b)、随机生成密钥(密钥需要牢记,建议定期更换一个);

(c)、鉴权范围输入文件名后缀,一般是对静态资源进行鉴权防止盗刷。

提供参考:.webp;.png;.jpg;.jpeg;.css;.js

配置鉴权参数

然后启动URLAuth插件进行配置:

配置插件

腾讯EdgeOne鉴权配置

1、登录 边缘安全加速平台 EO 控制台,在左侧菜单栏中,单击站点列表,在站点列表内单击需配置的站点。

2、在站点详情页面,单击站点加速,进入站点全局配置页面,单击规则引擎 Tab 页。

3、在规则引擎页面,单击创建规则,选择新增空白规则

4、在规则编辑页面,设置触发该规则的匹配条件。

5、单击操作 > 选择框,在弹出的操作列表内,选择操作为Token 鉴权,参数配置说明如下:

EdgeOne 提供了 Token 鉴权 URL 的生成工具和校验工具,开发者可以使用该工具快速准确地生成和校验符合要求的防盗链 URL。

阿里云和多吉云都是auth_key,腾讯云的EgdeOne和CDN好像是sign来着,也可以自定义为auth_key。根据自己的需求配置即可。

EdgeOne配置鉴权参数

插件下载

开发耗费了很多的精力以及冒了很多的险,掉了很多头发。希望大佬可以请小陶喝一杯奶茶!一杯咖啡的价格,可以让自己的CDN很大程度上避免被刷还是很划算的!

鉴权效果

添加鉴权这时候加载静态资源文件:

鉴权效果

鉴权参数过期:

鉴权参数过期

不包含鉴权参数:

不包含鉴权参数

  • ✇陶小桃Blog
  • WordPress插件Auth76Times : 避免七牛云CDN被爆刷的利器,为链接添加时间戳鉴权52txr
    本文介绍了一款针对WordPress的插件Auth76Times,旨在解决七牛云CDN因缺乏时间戳鉴权导致流量被恶意刷取的问题。作者小陶因七牛云频繁出现流量封顶、无QPS限制等缺陷转投多吉云,但为帮助仍需使用七牛云的用户,开发了该插件。插件通过为静态资源链接添加时间戳签名,实现访问权限控制,防止资源被非法盗用。文章详细说明了七牛云CDN配置时间戳防盗链的步骤,包括通过域名管理开启鉴权、使用官方工具生成测试链接完成验证。插件需授权后使用,支持自定义密钥与过期时间配置,未授权或过期请求将返回403错误。此外,作者建议结合Referer防盗链、Cloudflare防护等进阶措施增强安全性,并推荐多吉云与Cloudflare作为更稳定的替代方案。插件通过简单配置即可提升七牛云资源访问安全性,适合需防范流量滥用的个人站长使用。为什么要时间戳鉴权小陶个人虽然曾经是七牛云的粉丝,现在已经粉转黑了,经常骂七牛云是傻逼(竟然每天流量封顶、没有QPS等),之前甚至注销了七牛云账号(见文《七牛云CDN真的不适合个人站长使用,小陶已注销账号》)。使用七牛云之后被爆刷流量的事件也是频繁发生。后来小陶转战到了多吉
     

WordPress插件Auth76Times : 避免七牛云CDN被爆刷的利器,为链接添加时间戳鉴权

作者 52txr
2025年3月10日 00:28

本文介绍了一款针对WordPress的插件Auth76Times,旨在解决七牛云CDN因缺乏时间戳鉴权导致流量被恶意刷取的问题。作者小陶因七牛云频繁出现流量封顶、无QPS限制等缺陷转投多吉云,但为帮助仍需使用七牛云的用户,开发了该插件。插件通过为静态资源链接添加时间戳签名,实现访问权限控制,防止资源被非法盗用。文章详细说明了七牛云CDN配置时间戳防盗链的步骤,包括通过域名管理开启鉴权、使用官方工具生成测试链接完成验证。插件需授权后使用,支持自定义密钥与过期时间配置,未授权或过期请求将返回403错误。此外,作者建议结合Referer防盗链、Cloudflare防护等进阶措施增强安全性,并推荐多吉云与Cloudflare作为更稳定的替代方案。插件通过简单配置即可提升七牛云资源访问安全性,适合需防范流量滥用的个人站长使用。

为什么要时间戳鉴权

小陶个人虽然曾经是七牛云的粉丝,现在已经粉转黑了,经常骂七牛云是傻逼(竟然每天流量封顶、没有QPS等),之前甚至注销了七牛云账号(见文《七牛云CDN真的不适合个人站长使用,小陶已注销账号》)。使用七牛云之后被爆刷流量的事件也是频繁发生。

七牛云被爆刷

后来小陶转战到了多吉云,并且开启了URL鉴权,感觉巴适了。每月赠送的20GB流量、QPS、URL鉴权、流量封顶,妈妈再也不用担心我的流量被刷爆了。

但是也有朋友非要用七牛云,并且对我的TypeA鉴权很感兴趣。URL鉴权是一种网络安全机制,用于验证用户对特定资源的访问权限,通过在URL中嵌入时间戳、随机数、用户ID等参数,并结合密钥生成签名来实现。 实现步骤包括确定鉴权参数、生成签名、构造带有签名的URL以及验证签名。于是小陶就针对七牛云的使用做了一款插件。

配置七牛云CDN

关于七牛云的CDN配置,我就不做过多介绍了。配置好应该是下面的CNAME"已配置"绿色的。如果七牛云的CDN不会配置,可以提交一下工单或者咨询一下博客的QQ群。

配置好cname解析

开启时间戳防盗链

七牛云的鉴权方式比较特殊,并不是常见的TypeA,因此之前写的《Typecho/WordPress的CDN鉴权插件URLAuth1.2.0版本发布!支持任意多个域名的自定义鉴权》虽然在腾讯云、七牛云、火山云、阿里云、多吉云等等都适用,但是唯独在七牛云CDN中无法使用。

在七牛云的CDN配置中找到域名管理:

进行域名管理

然后在域名的配置中找到时间戳防盗链,点击修改配置

时间戳防盗链

时间戳防盗链

此时点击确定会弹出这个让人讨厌的检验时间戳防盗链

检验时间戳防盗链

点击下面的时间戳计算器网站。随便整一个存在的域名下的静态资源链接。过期时间可以填f2fdd543(代表的是2099-03-09 14:37:55)。然后点击生成。把生成的连接复制到检验时间戳防盗链再点击确定即可。

时间戳防盗链计算器 - 七牛云 - 网页有点慢,推荐开着科学上网

时间戳防盗链计算器

复制结果

插件下载与配置

链接有效期默认时长为120秒,理论上可以设置1秒,但是前提是你的网页在1秒内打开。

设置有效期的时间应该略长于你网站打开的时间。

插件的效果

没有进行鉴权的话,会返回403:

禁止访问

启用并且配置了鉴权参数的话:

正确显示

如果过了指定的时间,也就是链接过期了,则也是403:

链接过期禁止访问

进阶防盗刷方法推荐

  • Referer 防盗链:静态资源只允许自己的网站可以访问,空 Referer 禁止访问。
  • 告警配置要开启(虽然说经常延迟也傻B):

七牛云告警配置

  • 用好cloudflare这个赛博菩萨。

推荐阅读:

  • ✇陶小桃Blog
  • Typecho插件Auth76Times:七牛云CDN开启URL时间戳鉴权强力防盗刷,使链接变得带有效期52txr
    本文介绍了一款针对Typecho平台的插件——Auth76Times,旨在通过七牛云CDN的URL时间戳鉴权功能实现静态资源防盗刷。插件通过为链接添加有效期参数,有效防止资源被恶意盗用。文章详细说明了配置步骤:首先是 七牛云CDN配置 ,需完成基础域名设置,并通过“时间戳防盗链”功能生成带有效期的测试链接(如使用时间戳计算器设置2099年的过期时间),然后是 插件部署与授权 ,配置时需绑定域名与密钥,支持多域名管理。链接有效期建议略长于网站加载时间(默认120秒)。最后作者给出了效果验证 ,启用后,未授权或过期链接将返回403错误,确保资源访问安全。此外,文章推荐结合Referer防盗链、Cloudflare防护等进阶措施,并附相关技术文章链接供读者参考,强调通过多层防护提升CDN资源安全性。[...]
     

Typecho插件Auth76Times:七牛云CDN开启URL时间戳鉴权强力防盗刷,使链接变得带有效期

作者 52txr
2025年3月9日 15:24

本文介绍了一款针对Typecho平台的插件——Auth76Times,旨在通过七牛云CDN的URL时间戳鉴权功能实现静态资源防盗刷。插件通过为链接添加有效期参数,有效防止资源被恶意盗用。文章详细说明了配置步骤:首先是 七牛云CDN配置 ,需完成基础域名设置,并通过“时间戳防盗链”功能生成带有效期的测试链接(如使用时间戳计算器设置2099年的过期时间),然后是 插件部署与授权 ,配置时需绑定域名与密钥,支持多域名管理。链接有效期建议略长于网站加载时间(默认120秒)。最后作者给出了效果验证 ,启用后,未授权或过期链接将返回403错误,确保资源访问安全。此外,文章推荐结合Referer防盗链、Cloudflare防护等进阶措施,并附相关技术文章链接供读者参考,强调通过多层防护提升CDN资源安全性。

[...]

  • ✇陶小桃Blog
  • 放弃Rsync或Syncthing,七牛对象存储(私有)+上海云盾CDN,更加通用且免费的多服务器数据库或者网站目录同步的方式52txr
    以两台服务器为例,一台为主服务器A,另一台为从服务器B。现在从服务器想要定时同步得到主服务器A中的数据库或者指定的网站全部目录。一开始我是想着部署Rsync或Syncthing,但是由于小陶现在所有的服务器都不走公网而是部署在内网(见文《小陶为了防止自己服务器公网IP暴露,直接不用公网,境内外路线全部内网穿透》),所以会出现各种奇奇怪怪的问题,比如22端口SSH不咋顶用,又或者配置出现各种问题。小陶突然想到自己的服务器有自动备份任务,备份是上传到七牛云、多吉云、腾讯云的对象存储桶。于是我就想着既然在桶里,不如直接下载下来恢复到数据库或者网站目录不就行了吗?于是说干就干,还真被我干出来了!由于小陶现在也不用七牛云作为正儿八经的静态资源存储,因此创建的存储桶为私有,并且限制了可以访问的IP(理论上只设置从服务器B的IP可以访问就可以了),可以避免被盗刷。 此外,私有空间的文件对象必须获得拥有者的授权才能访问,相对来说还是安全很多。公开空间和私有空间介绍现在的思路是:主服务器A备份包——>(上传)七牛云(下载)<——从服务器B数据库恢复的效果如下,当然也支持直接下载备份的网站目录
     

放弃Rsync或Syncthing,七牛对象存储(私有)+上海云盾CDN,更加通用且免费的多服务器数据库或者网站目录同步的方式

作者 52txr
2025年3月8日 16:04

以两台服务器为例,一台为主服务器A,另一台为从服务器B。现在从服务器想要定时同步得到主服务器A中的数据库或者指定的网站全部目录。一开始我是想着部署Rsync或Syncthing,但是由于小陶现在所有的服务器都不走公网而是部署在内网(见文《小陶为了防止自己服务器公网IP暴露,直接不用公网,境内外路线全部内网穿透》),所以会出现各种奇奇怪怪的问题,比如22端口SSH不咋顶用,又或者配置出现各种问题。小陶突然想到自己的服务器有自动备份任务,备份是上传到七牛云、多吉云、腾讯云的对象存储桶。于是我就想着既然在桶里,不如直接下载下来恢复到数据库或者网站目录不就行了吗?于是说干就干,还真被我干出来了!由于小陶现在也不用七牛云作为正儿八经的静态资源存储,因此创建的存储桶为私有,并且限制了可以访问的IP(理论上只设置从服务器B的IP可以访问就可以了),可以避免被盗刷。 此外,私有空间的文件对象必须获得拥有者的授权才能访问,相对来说还是安全很多。公开空间和私有空间介绍

现在的思路是:主服务器A备份包——>(上传)七牛云(下载)<——从服务器B

设置一个私有七牛云存储

数据库恢复的效果如下,当然也支持直接下载备份的网站目录然后解压覆盖到从服务器中。本文就来详细介绍一下该如何操作。

数据库恢复正常

准备工作

主服务器A创建自动备份到七牛云,可以是数据库或者网站。这里小陶是都进行了备份:

创建主服务器同步

然后就是在服务器B中创建一个虚拟环境,我的服务器是Debian12,可以看之前的文章《在服务器上使用python虚拟环境pip安装库并运行自己的py脚本》,本文就不做过多的介绍。

创建好虚拟环境(例如名称为back_rec)之后,在终端激活环境再安装以下必要的Python库:

pip install -i https://pypi.tuna.tsinghua.edu.cn/simple qiniu requests tqdm

七牛云对象存储绑定域名

七牛云如何绑定域名我就不做过多介绍了,因为官方有很详细的说明。最重要的是得到CNAME解析地址。如果得到了cname地址,不论你是使用七牛云自己的融合CDN还是别的CDN,都是可以的。小陶选择的是上海云盾CDN,因为流量是免费的。

给七牛云绑定域名

在上海云盾启用之后,应该是下面的样子。

在云盾上使用CDN

需要注意,上海云盾的话是由内置的WAF规则集,需要自动去关掉一些设置,以免被拦截。具体的设置我也不再赘述,可以联系云盾客服进行沟通。

WAF防火墙的拦截

服务器B的数据同步请求

现在我使用的功能是比较全面的,主要有两个,第一个是数据库的同步,第二个是图床站目录的同步。

为了让代码具有比较强的拓展性,把目录等设置成下面的样子:

# 同步备份文件任务配置
backup_tasks = [
    {   # 数据库备份任务
        'remote_dir': 'bt_backup/database/mysql/www_52txr_cn/', #七牛云的数据库备份路径
        'local_storage': '/www/backup/database/backfrom76',     #下载到服务器的路径
        'extract_to': None,  # 数据库不需要文件解压路径
        'type': 'database'
    },
    {   # 站点备份任务
        'remote_dir': 'bt_backup/site/imgbed.52txr.cn/',   # 七牛云的网站目录备份路径
        'local_storage': '/www/backup/site/backfrom76',    # 下载到服务器的路径
        'extract_to': '/www/wwwroot/imgbed.52txr.cn',      # 解压到的路径
        'type': 'site'
    }
]

完整的代码如下,可以保存到服务器/www/wwwroot/MyPythonScripts/synchronous76.py

处理任务:bt_backup/www_52txr_cn/

下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz:   0%|          | 0.00/5.81M [00:00<?, ?B/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz:   0%| | 8.19k/5.81M [00:00<02:05, 46.3kB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz:  10%|▏ | 598k/5.81M [00:00<00:01, 2.64MB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz:  74%|▋| 4.30M/5.81M [00:00<00:00, 15.8MB/s]
下载 www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz: 100%|█| 5.81M/5.81M [00:00<00:00, 13.9MB/s]
文件下载成功:/www/backup/www_52txr_cn_2025-03-08_xxxxxxxx_mysql_data.sql.gz
SQL文件已解压到:/www/backup/www_52txr_cn_2025-03-xxxxxxxx_mysql_data.sql
数据库恢复成功
临时文件已清理

处理任务:bt_backup/site/imgbed.52txr.cn/
文件下载成功:/www/web_imgbed.52txr.cn_xxxxxxxx_Yxxx.tar.gz
文件已解压到:/www/imgbed_52txr_cn
压缩文件已清理
----------------------------------------------------------------------------
★[2025-03-08 15:52:07] Successful
----------------------------------------------------------------------------
  • ✇陶小桃Blog
  • 缅怀之前攻击我博客的哥们,被警察抓起来了52txr
    网络攻击事件:作者提到一位网络攻击者被杭州警方逮捕,并对此表示感慨。作者认为网络并非法外之地,攻击者应为其行为负责。尽管作者曾遭受攻击,但他认为这些经历帮助他在心态和技术上有所成长。作者还提到自己经常对攻击者进行言语反击,并享受攻击者无法得逞的感觉。解决问题的过程与焦虑:作者分享了自己在解决问题过程中的收获,例如开发了一款软件。他还提到一位学弟因读研感到迷茫,作者鼓励他通过行动来缓解焦虑,强调行动与想法匹配的重要性。作者认为焦虑源于对未来的过度思考,建议通过小步骤开始行动,并放下完美主义和自我苛责。网络老鼠屎被抓起来了对这位哥们表示深切的缅怀!目前应该是被杭州警察抓起来了。记得好好反省一下自己,反省一下自己怎么这么菜和作死。虽然可能你只是运气不好,但是网络不是法外之地,自掘坟墓就没有办法了。其实对我个人而言,我还是很感激攻击对我的服务器和网站进行攻击的人,因为正是在攻击中我成长了很多,不论是心态上还是技术上。还是那句话,网络并非法外之地,要对自己的行为负责。虽然我承认我嘴臭,对于这种在我面前炫技搞攻击的人我经常骂骂咧咧,但是你也确实没把我怎么样,没做成啥巨大损失。难道是我嘴太欠所以经常
     

缅怀之前攻击我博客的哥们,被警察抓起来了

作者 52txr
2025年3月7日 10:03

网络攻击事件:作者提到一位网络攻击者被杭州警方逮捕,并对此表示感慨。作者认为网络并非法外之地,攻击者应为其行为负责。尽管作者曾遭受攻击,但他认为这些经历帮助他在心态和技术上有所成长。作者还提到自己经常对攻击者进行言语反击,并享受攻击者无法得逞的感觉。

解决问题的过程与焦虑:作者分享了自己在解决问题过程中的收获,例如开发了一款软件。他还提到一位学弟因读研感到迷茫,作者鼓励他通过行动来缓解焦虑,强调行动与想法匹配的重要性。作者认为焦虑源于对未来的过度思考,建议通过小步骤开始行动,并放下完美主义和自我苛责。

网络老鼠屎被抓起来了

对这位哥们表示深切的缅怀!目前应该是被杭州警察抓起来了。记得好好反省一下自己,反省一下自己怎么这么菜和作死。虽然可能你只是运气不好,但是网络不是法外之地,自掘坟墓就没有办法了。

网络老鼠屎被抓起来了

网络老鼠屎被抓起来了

其实对我个人而言,我还是很感激攻击对我的服务器和网站进行攻击的人,因为正是在攻击中我成长了很多,不论是心态上还是技术上。

还是那句话,网络并非法外之地,要对自己的行为负责。

虽然我承认我嘴臭,对于这种在我面前炫技搞攻击的人我经常骂骂咧咧,但是你也确实没把我怎么样,没做成啥巨大损失。难道是我嘴太欠所以经常被攻击?

(下文为之前写的一些骂骂咧咧)

见文《对于藏在阴暗处对个人博客进行攻击的人,我有一些想说的话》。

骂骂咧咧

骂骂咧咧

好吧,我确实喜欢让这些攻击者气急败坏又不能怎么样的感觉。

解决问题的过程自然有产出

昨天又花了一天的时间做了一款软件。无聊的东西又增加了。具体见文《SolidWorks/UG/Catia等三维软件通用,3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点》。

写的软件

前几天有个学弟对我进行咨询,可能是读研有些迷茫了。谁的青春不迷茫呢?但是请记住,跑起来就会有风。一定要去做,做的时候还要动脑子想。当用自己的方法去解决一些问题,论文、专利啥的不都有了吗?

一个人焦虑了,一定是因为行动和想法不匹配!但是实际情况是,越焦虑越不想去做任何事。

学弟的咨询

因为焦虑的时候,大脑想的是未来,想着宏大的目标与自己现状之间的鸿沟,觉得无法完成这个目标。

我们的大脑是个思维机器,如果只有大脑的想法没有行动时,我们的潜意识就通过焦虑提醒我们,此路不通,你必须行动。

这就是我们很焦虑,通过刷手机,玩游戏,喝酒逃避现实,结果结束后感觉更痛苦的原因。

以我的体会,完美主义的人容易有焦虑的倾向。越不行动,就越焦虑。好的方法是,尝试着开始这个大目标的一小步。

同时允许自己的一切,放下对自己的苛责,放下一些执念

表情包

  • ✇陶小桃Blog
  • 打包PySide或者PyQt软件时,同目录下的文件添加h后但封装成exe找不到的解决方案52txr
    前面写了一个软件《SolidWorks/UG/Catia等三维软件通用,3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点》,里面用到了一个东西就是main.py调用同目录下的scripts.py。我在使用PyInstaller打包之后,以main.py作为主程序,把scripts.py添加到--add-data,在实际运行的时候发现找不到这个脚本。这个问题是由于打包后的程序运行时的工作目录和文件路径与开发环境不同导致的。下面说说科学的解决方案(当然这个方法只限于打包成exe文件,也就是Windows平台下)。(1)确认文件被打包到正确位置首先,确保scripts.py与main.py是在同一个目录下(也就是同一个文件夹下面)。然后使用--add-data或者在一些图形化界面中添加文件:(2)在代码中动态定位文件路径在测试的代码中,可能直接使用相对路径就完事了,(如 "your_script.py")。但是如果想要封装成exe还能路径正确,需要加一个函数来获取文件路径:def resource_path(relative_path): """ 动态获取资源的绝对路
     

打包PySide或者PyQt软件时,同目录下的文件添加h后但封装成exe找不到的解决方案

作者 52txr
2025年3月6日 15:22

前面写了一个软件《SolidWorks/UG/Catia等三维软件通用,3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点》,里面用到了一个东西就是main.py调用同目录下的scripts.py。我在使用PyInstaller打包之后,以main.py作为主程序,把scripts.py添加到--add-data,在实际运行的时候发现找不到这个脚本。

这个问题是由于打包后的程序运行时的工作目录和文件路径与开发环境不同导致的。下面说说科学的解决方案(当然这个方法只限于打包成exe文件,也就是Windows平台下)。

(1)确认文件被打包到正确位置

首先,确保scripts.py与main.py是在同一个目录下(也就是同一个文件夹下面)。

然后使用--add-data或者在一些图形化界面中添加文件:

添加文件

(2)在代码中动态定位文件路径

在测试的代码中,可能直接使用相对路径就完事了,(如 "your_script.py"。但是如果想要封装成exe还能路径正确,需要加一个函数来获取文件路径:

def resource_path(relative_path):
    """ 动态获取资源的绝对路径(兼容开发环境和打包环境) """
    if getattr(sys, 'frozen', False):  # 判断是否在打包后的环境中
        base_path = sys._MEIPASS  # 打包后的资源目录
    else:
        base_path = os.path.dirname(__file__)  # 开发环境的当前目录
    return os.path.join(base_path, relative_path)

使用示例:

script_path = resource_path("your_script.py")
with open(script_path, "r", encoding="utf-8") as f:
    content = f.read()

(3)实际案例

下面是我软件打包的实际案例:

实际案例

  • ✇陶小桃Blog
  • SolidWorks/UG/Catia等三维软件通用,3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点52txr
    在三维设计领域,工程师常需将复杂空间曲线转化为离散坐标点以用于逆向工程、有限元分析、数控加工或数据交互等场景。然而,主流CAD软件(如SolidWorks、UG、Catia)在此需求上长期存在功能短板。针对这一痛点,我们正式推出“3D空间曲线批量散点化软件V1.0”,以高效、精准、通用的特性重新定义三维曲线数据处理流程!行业痛点:传统方案的局限性尽管大部分三维软件都能支持创建点的操作,例如先绘制一个空间曲线,然后在空间曲线上在绘制若干个点的方法。但是存在各种各样的问题。例如Catia以及Solidworks都有上限,SolidWorks最多支持绘制100个参考点,然后再通过设计表的方式导出excel表格提取点的坐标,难以满足高精度需求,效率也是特别低。之前小陶则是制订过一个Catia插件程序,但是仅支持单一平台,无法适配SolidWorks、UG等主流软件。单条曲线处理耗时过长,复杂模型需逐一手动操作。此外,导出后的散点数据无法直观验证,易导致后续流程返工。本软件的优势本软件突破传统限制,为多平台用户提供一站式高精度散点化工具,核心优势如下:全平台兼容,告别“软件壁垒”支持SolidW
     

SolidWorks/UG/Catia等三维软件通用,3D空间曲线批量散点化软件V1.0正式发布,将空间线条导出坐标点

作者 52txr
2025年3月6日 01:41

在三维设计领域,工程师常需将复杂空间曲线转化为离散坐标点以用于逆向工程、有限元分析、数控加工或数据交互等场景。然而,主流CAD软件(如SolidWorks、UG、Catia)在此需求上长期存在功能短板。针对这一痛点,我们正式推出“3D空间曲线批量散点化软件V1.0”,以高效、精准、通用的特性重新定义三维曲线数据处理流程!

行业痛点:传统方案的局限性

尽管大部分三维软件都能支持创建点的操作,例如先绘制一个空间曲线,然后在空间曲线上在绘制若干个点的方法。但是存在各种各样的问题。例如Catia以及Solidworks都有上限,SolidWorks最多支持绘制100个参考点,然后再通过设计表的方式导出excel表格提取点的坐标,难以满足高精度需求,效率也是特别低。之前小陶则是制订过一个Catia插件程序,但是仅支持单一平台,无法适配SolidWorks、UG等主流软件。单条曲线处理耗时过长,复杂模型需逐一手动操作。此外,导出后的散点数据无法直观验证,易导致后续流程返工。

Solidworks局限性

本软件的优势

本软件突破传统限制,为多平台用户提供一站式高精度散点化工具,核心优势如下:

全平台兼容,告别“软件壁垒”

支持SolidWorks、UG(NX)、Catia等主流三维软件,无需切换平台或依赖定制插件,真正实现“一次操作,多场景通用”。

极速批量处理,效率提升100倍+

  • 批量处理:支持一个文件有多条空间曲线(直线、圆弧、样条曲线等),一键批量生成散点数据。
  • 超高性能:采用高效算法优化,,采用多线程方式进行数据处理,万级点云生成仅需秒级响应,告别卡顿等待。

理论精度0.001mm,点数自定义控制

  • 用户可自由设定离散点间距或数量,满足从粗加工到微米级精密分析的全场景需求。
  • 数据导出格式兼容性强(导出TXT格式的XYZ坐标点),无缝对接MATLAB、Python、ANSYS等工具。

可视化验证,效果立马看

  • 内置3D可视化模块,及时显示散点化结果,支持旋转、缩放;
功能传统方案本软件
多软件支持仅限单一平台基于STP格式,SolidWorks/UG/Catia等全兼容
处理速度手动操作,单条曲线≥10分钟批量处理,秒级完成
点数限制通常≤200点无限制,按需生成
可视化交互3D结果显示

一些应用场景如下:

  • CAE仿真:为有限元网格划分提供高精度边界条件。
  • 数控加工:生成刀具路径规划所需的离散坐标。
  • 逆向工程:将扫描曲线转化为可编辑点云数据。
  • 科研教学:快速提取曲线参数,助力算法开发与验证。

软件安装及使用

可以先看看B站视频:Solidworks/UG/Catia等通用3D空间曲线批量散点化软件V1.0演示操作 - B站视频

(1)下载FreeCAD

FreeCAD:你自己的三维参数化建模软件 - 下载1.0.0版本软件

安装软件的时候注意一下软件的安装路径,后续会用到!

Python.exe位于安装目录子文件夹bin下。

FreeCAD安装

(2)下载3D空间曲线批量散点化软件V1.0

包含的内容

里面的STP和TXT两个文件夹均是作为一个示例的存在,用于测试软件是否可用。

(3)软件操作流程

软件的界面以及操作流程如下:

软件操作流程

运行的结果示例:

软件操作结果

我觉得操作起来是非常简单!!

  • ✇陶小桃Blog
  • 放假在家总有种寄人篱下的感觉,多希望我的年假只有三天而不是三个月52txr
    给我太长的假期,实在是太折磨了。折磨的主要来源是我并不喜欢在家里住着。看了看这个狗大学的春季入学竟然是四月份(根据2024年以及2023年的入学月份推测的)。目测导师也懒得push我提前去学校干活,因为好像也没有那么多十万火急的工作需要做。在家的氛围实在是太影响我的学习进度。在《过年只想找个安静的地方睡几天,不想看见热闹,不想听见嘈杂,哪也不想去》中就已经讲过为什么了,我有时候真的觉得自己的成长似乎是老天爷在照顾着,原生家庭只是在不断内耗我的精气神。也许是老天爷的一种补偿吧。现在我已经是一名硕士而不是硕士生了。其实说到底,攒一笔属于自己的钱是一个人“摆脱控制”的底气,也是做出自己选择的底气,男生女生都是一样的道理。打算去外地租两个月房子,然后好好学习,闲暇之余看看风景。这才是我向往的生活。看了看一个月的房租也不错一两千而已,其实还好。其实我家确实挺穷的,我爸的工作近几年也是极不稳定(见文《2024年,我听到最多的话就是辞职和失业了》)。但是我觉得贫穷只是导火索,而不是根本原因。虽然下面的视频有点营销号,但是又有那么点道理,让我狠狠共情住了,真的是感觉“确实如此”。狗血的生活,早已耗尽每
     

放假在家总有种寄人篱下的感觉,多希望我的年假只有三天而不是三个月

作者 52txr
2025年2月4日 20:55

给我太长的假期,实在是太折磨了。折磨的主要来源是我并不喜欢在家里住着。看了看这个狗大学的春季入学竟然是四月份(根据2024年以及2023年的入学月份推测的)。

2024年春季博士入学

2023年春季博士入学

目测导师也懒得push我提前去学校干活,因为好像也没有那么多十万火急的工作需要做。

在家的氛围实在是太影响我的学习进度。在《过年只想找个安静的地方睡几天,不想看见热闹,不想听见嘈杂,哪也不想去》中就已经讲过为什么了,我有时候真的觉得自己的成长似乎是老天爷在照顾着,原生家庭只是在不断内耗我的精气神。

也许是老天爷的一种补偿吧。现在我已经是一名硕士而不是硕士生了。其实说到底,攒一笔属于自己的钱是一个人“摆脱控制”的底气,也是做出自己选择的底气,男生女生都是一样的道理。

打算去外地租两个月房子,然后好好学习,闲暇之余看看风景。这才是我向往的生活。看了看一个月的房租也不错一两千而已,其实还好。其实我家确实挺穷的,我爸的工作近几年也是极不稳定(见文《2024年,我听到最多的话就是辞职和失业了》)。但是我觉得贫穷只是导火索,而不是根本原因。虽然下面的视频有点营销号,但是又有那么点道理,让我狠狠共情住了,真的是感觉“确实如此”。

狗血的生活,早已耗尽每个家庭成员的精力和心血。满心憋屈、烦躁,不宣泄一下憋的慌,面对伴侣、兄弟姐妹、孩子时不会好好说话,一张嘴就是尖酸刻薄,一开口就是挖苦嘲讽,把不如意迁怒于家人。

普通家庭的孩子,只有真正走上社会,脱离原生家庭之后,反而能渐渐意识到自己的不足,待人接物也没有以前那么极端刻薄了。因为没有情绪黑洞在不断索取情绪价值,但是内心的伤痛需要慢慢医治。

好在我已经足够养活自己,我想勇敢一次。

外面的世界还很大,要学的知识还很多。

  • ✇陶小桃Blog
  • 重学ROS2:(8)在ROS中能用到的C++新特性(自动推导类型auto、智能指针、Lambda表达式、函数包装器)52txr
    这篇博客文章介绍了在ROS2开发中可以利用的C++新特性,具体包括自动推导类型、智能指针、Lambda表达式和函数包装器。首先,文章讨论了C++11引入的auto关键字,它可以自动推导变量类型,简化代码。接着,智能指针被介绍为一种避免内存泄漏的工具,特别是在ROS2中创建节点时使用的std::make_shared。Lambda表达式作为一种便捷的匿名函数方式,在处理简单逻辑时能够提升代码的可读性和效率。最后,文章介绍了std::function,一个函数包装器,可以统一存储和调用不同类型的函数,如自由函数、成员函数和Lambda表达式,简化函数调用的管理。这些C++新特性大大提高了开发效率,特别是在ROS2环境中,可以帮助开发者编写更加简洁、高效的代码。[...]
     

重学ROS2:(8)在ROS中能用到的C++新特性(自动推导类型auto、智能指针、Lambda表达式、函数包装器)

作者 52txr
2025年2月3日 21:44

这篇博客文章介绍了在ROS2开发中可以利用的C++新特性,具体包括自动推导类型、智能指针、Lambda表达式和函数包装器。首先,文章讨论了C++11引入的auto关键字,它可以自动推导变量类型,简化代码。接着,智能指针被介绍为一种避免内存泄漏的工具,特别是在ROS2中创建节点时使用的std::make_shared。Lambda表达式作为一种便捷的匿名函数方式,在处理简单逻辑时能够提升代码的可读性和效率。最后,文章介绍了std::function,一个函数包装器,可以统一存储和调用不同类型的函数,如自由函数、成员函数和Lambda表达式,简化函数调用的管理。这些C++新特性大大提高了开发效率,特别是在ROS2环境中,可以帮助开发者编写更加简洁、高效的代码。

[...]

  • ✇陶小桃Blog
  • 一想到"情侣博主"头上长了摄像头,就有点出戏52txr
    抖音上有很多“情侣博主”,他们通过分享日常生活、恋爱故事和互动瞬间,吸引了大量粉丝(虽然可能靠这个吃饭)。情侣博主在拍摄日常生活时,很多都是使用头戴式摄像头的方式,主要是为了获得第一人称视角的画面效果。这种拍摄方式能够让观众更直观地感受到情侣之间的互动和情感交流,增强视频的代入感和真实感。当你发现每个吵架现场都自带广角运镜,每个分手场景都恰巧对着落地窗逆光拍摄,这些精心设计的"真实"比偶像剧还离谱。镜头语言早就出卖了表演痕迹:刻意虚化的前景暗示着隐藏的摄像团队,突然切换的机位暴露了NG重拍,就连"素颜出镜"的女主角,睫毛根部都藏着心机的接睫技术。这些视频与其说是生活记录,不如说是当代情感情景剧。打开情侣博主的选题库,"十亿直男看了都沉默"、"女生必看警惕PUA"、“情人节到了这些礼物感动到哭”这类标题永远占据C位。他们深谙平台算法钟爱极端对立的秘密,把两性关系简化成永不停歇的攻防战:男生必定是忘记节日的榆木疙瘩,女生必须是敏感多疑的福尔摩斯。这些被精心计算的情绪炸弹,炸碎了屏幕前观众对亲密关系的正常认知。当我们为"该不该查伴侣手机"吵得不可开交时,始作俑者正在数着流量分成偷笑。真正可怕
     

一想到"情侣博主"头上长了摄像头,就有点出戏

作者 52txr
2025年2月3日 18:20

抖音上有很多“情侣博主”,他们通过分享日常生活、恋爱故事和互动瞬间,吸引了大量粉丝(虽然可能靠这个吃饭)。情侣博主在拍摄日常生活时,很多都是使用头戴式摄像头的方式,主要是为了获得第一人称视角的画面效果。这种拍摄方式能够让观众更直观地感受到情侣之间的互动和情感交流,增强视频的代入感和真实感。

头戴摄像头

当你发现每个吵架现场都自带广角运镜,每个分手场景都恰巧对着落地窗逆光拍摄,这些精心设计的"真实"比偶像剧还离谱。

镜头语言早就出卖了表演痕迹:刻意虚化的前景暗示着隐藏的摄像团队,突然切换的机位暴露了NG重拍,就连"素颜出镜"的女主角,睫毛根部都藏着心机的接睫技术。这些视频与其说是生活记录,不如说是当代情感情景剧。

打开情侣博主的选题库,"十亿直男看了都沉默"、"女生必看警惕PUA"、“情人节到了这些礼物感动到哭”这类标题永远占据C位。他们深谙平台算法钟爱极端对立的秘密,把两性关系简化成永不停歇的攻防战:男生必定是忘记节日的榆木疙瘩,女生必须是敏感多疑的福尔摩斯。

这些被精心计算的情绪炸弹,炸碎了屏幕前观众对亲密关系的正常认知。当我们为"该不该查伴侣手机"吵得不可开交时,始作俑者正在数着流量分成偷笑。

头戴摄像头

真正可怕的是,这种人造焦虑正在改写我们年轻人的情感认知,越来越多的人要求伴侣"像视频里那样道歉"、“像视频里那样送礼物”,把亲密关系异化成打卡集章的表演。当00后开始用"求生欲测试"衡量爱情纯度,我们正在批量生产情感PUA大师。

我想到了一句话:是我们玷污了爱情,所以渴望却又不配拥有爱情。

今天我给对象分享了抖音上的一条视频,觉得还是蛮有意思的:

"从前车马很慢,一生只够爱一个人。"撕开镜头下的表演,真实的情感本就该有狼狈的素颜、笨拙的拥抱和忘了镜头的亲吻。下次再看到类似的视频时,不妨笑着划走——毕竟真正的生活,从来不需要场记板。

头戴摄像头

在这个人人都是楚门的世界里,保持清醒或许就是最大的叛逆。当我们停止用点赞数丈量爱情,放下对完美关系的偏执想象,或许就能在某个没有摄像头的清晨,遇见那个愿意陪你一起笑场的人。

  • ✇陶小桃Blog
  • 同样的宽带、同样的电脑,Linux和Windows的网速测试竟然相差两三倍52txr
    本文通过同一台电脑在Windows 10与Ubuntu 22.04系统下的网络测速对比(使用中国科学技术大学测速网站),发现Windows环境下网速可达Linux的2-3倍。针对这一差异,文章从四个维度分析可能原因:驱动优化不足:Linux开源驱动对部分高端网卡支持较弱,需手动安装厂商驱动或升级内核;网络协议栈配置差异:Linux默认可能关闭硬件加速功能(如TSO/GRO),需通过ethtool和sysctl优化;电源管理干扰:Linux的网卡节能模式可能影响性能,建议强制全速运行;防火墙限制:需排查流量控制规则或临时关闭防火墙测试。作者指出,尽管已知问题存在,但因Ubuntu仅用于ROS学习场景,暂未深入调试。该测试为跨系统网络性能优化提供了参考方向,尤其对需要高效网络负载的开发者具有实用价值。[...]
     

同样的宽带、同样的电脑,Linux和Windows的网速测试竟然相差两三倍

作者 52txr
2025年2月3日 14:16

本文通过同一台电脑在Windows 10与Ubuntu 22.04系统下的网络测速对比(使用中国科学技术大学测速网站),发现Windows环境下网速可达Linux的2-3倍。针对这一差异,文章从四个维度分析可能原因:

  1. 驱动优化不足:Linux开源驱动对部分高端网卡支持较弱,需手动安装厂商驱动或升级内核;
  2. 网络协议栈配置差异:Linux默认可能关闭硬件加速功能(如TSO/GRO),需通过ethtoolsysctl优化;
  3. 电源管理干扰:Linux的网卡节能模式可能影响性能,建议强制全速运行;
  4. 防火墙限制:需排查流量控制规则或临时关闭防火墙测试。
    作者指出,尽管已知问题存在,但因Ubuntu仅用于ROS学习场景,暂未深入调试。该测试为跨系统网络性能优化提供了参考方向,尤其对需要高效网络负载的开发者具有实用价值。

[...]

  • ✇陶小桃Blog
  • 我一直搞错了,原来在头文件中尽量避免使用"using namespace std”52txr
    在C++编程中,using namespace std; 语句用于引入标准命名空间 std,使得在代码中可以直接使用标准库中的类和函数,而无需每次都加上 std:: 前缀。 例如,使用 cout 代替 std::cout,使用 string 代替 std::string。 虽然这种做法在编写小型程序时可能方便,但在头文件中使用 using namespace std; 却存在一些潜在问题。我也是最近看很多代码大佬们写std::cout感到好奇才一探究竟的。本文将详细讲解为什么在头文件中避免使用 using namespace std;,并给出一些更好的替代方案。1. 命名冲突的风险在大型项目中,我们可能会引入多个库或模块,而这些库或模块的命名空间中可能会有与标准库中相同名称的类或函数。假如你在头文件中使用了 using namespace std;,那么标准库中的所有类、函数和对象都会被引入到当前作用域中。这样,如果其他库也有相同的名字,就会发生命名冲突。举个例子,假设你引入了一个名为 math 的第三方库,它里面也定义了一个 sort 函数。由于 std 命名空间中也有一个 sort
     

我一直搞错了,原来在头文件中尽量避免使用"using namespace std”

作者 52txr
2025年2月1日 23:14

在C++编程中,using namespace std; 语句用于引入标准命名空间 std,使得在代码中可以直接使用标准库中的类和函数,而无需每次都加上 std:: 前缀。 例如,使用 cout 代替 std::cout,使用 string 代替 std::string。 虽然这种做法在编写小型程序时可能方便,但在头文件中使用 using namespace std; 却存在一些潜在问题。我也是最近看很多代码大佬们写std::cout感到好奇才一探究竟的。本文将详细讲解为什么在头文件中避免使用 using namespace std;,并给出一些更好的替代方案。

1. 命名冲突的风险

在大型项目中,我们可能会引入多个库或模块,而这些库或模块的命名空间中可能会有与标准库中相同名称的类或函数。假如你在头文件中使用了 using namespace std;,那么标准库中的所有类、函数和对象都会被引入到当前作用域中。这样,如果其他库也有相同的名字,就会发生命名冲突。

举个例子,假设你引入了一个名为 math 的第三方库,它里面也定义了一个 sort 函数。由于 std 命名空间中也有一个 sort 函数,当这两个命名空间的功能混合时,编译器将无法判断你想调用的是哪个 sort,从而导致编译错误或逻辑错误。

2. 影响代码的可维护性

头文件通常会被多个源文件(.cpp 文件)所包含。如果在头文件中使用了 using namespace std;,那么每个包含该头文件的源文件都会自动引入标准命名空间。这意味着,即使某些源文件根本不需要标准库的功能,std 命名空间中的标识符也会被引入。这样会增加代码的复杂度和维护难度,因为你不再清楚哪些标识符来自标准库,哪些来自其他库或模块。

3. 增加编译时间

当你在头文件中使用 using namespace std; 时,编译器需要在每次编译时都处理这个语句。这对于小型项目影响不大,但在大型项目中,头文件通常会被多个源文件引用,这会导致编译器在每个源文件中都处理一次 using namespace std;,从而增加编译时间,影响开发效率。

4. 降低代码的可读性

明确地使用 std:: 前缀可以让代码的来源一目了然。你能够立刻知道某个标识符是来自标准库,而不是其他库或模块。这有助于提升代码的可读性和可理解性。如果在头文件中使用了 using namespace std;,那么标识符的来源就变得模糊不清,可能会让其他开发者感到困惑,特别是在大型项目中,代码的清晰度至关重要。

推荐的做法

为了避免上述问题,最好在头文件中避免使用 using namespace std;。相反,应该采取以下两种方法之一:

  1. 在源文件中局部使用 using 声明
    你可以在 .cpp 文件的函数或代码块中使用 using namespace std;,这样只有在需要使用标准库的地方才会引入 std 命名空间,避免全局引入。

    #include <iostream>
    #include <string>
    
    // 在源文件中局部使用 using 声明
    void func() {
        using namespace std;
        cout << "Hello, World!" << endl;
    }
  2. 明确使用 std:: 前缀
    在每个需要使用标准库功能的地方,显式地加上 std:: 前缀。这种方法虽然稍显繁琐,但它最大程度地避免了命名冲突,并且使得代码更加清晰和易于维护。

    #include <iostream>
    #include <string>
    
    void func() {
        std::cout << "Hello, World!" << std::endl;
    }

总结

尽管 using namespace std; 在小型程序中可以提高编写效率,但在头文件中使用它会带来命名冲突、维护难度增加、编译时间延长以及代码可读性差等问题。因此,为了保持代码的清晰、简洁和高效,建议在头文件中避免使用 using namespace std;。通过在源文件中局部使用 using 声明或明确使用 std:: 前缀,我们可以有效地避免这些问题。

C++标准命名

  • ✇陶小桃Blog
  • 重学ROS2:(7)编程基础之面向对象编程(Python/C++双版本)52txr
    本文介绍了面向对象编程(OOP)的基本概念及其在Python和C++中的实现。面向对象编程通过类、对象、封装、继承和多态等机制,帮助开发者更好地组织和管理代码。文章通过Python和C++的示例代码,展示了如何定义类、创建对象、使用方法和继承。在Python中,使用class关键字定义类,并通过__init__方法初始化对象属性;在C++中,同样使用class关键字定义类,并通过构造函数初始化对象属性。此外,文章还介绍了继承的概念,展示了如何在Python和C++中通过继承实现代码重用和多态性。通过这些示例,读者可以更好地理解面向对象编程的核心思想及其在不同编程语言中的应用。什么是面向对象面向对象编程通过类、对象、封装、继承和多态等机制,帮助开发者更好地组织和管理代码。Python 和 C++ 都支持这些特性,但语法和实现方式有所不同。面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它将程序设计中的数据和对数据的操作封装到一个个“对象”中。这种方式使得程序更加模块化、易于维护和扩展。下面我们通过 Python 和 C++ 两个简单的例
     

重学ROS2:(7)编程基础之面向对象编程(Python/C++双版本)

作者 52txr
2025年2月1日 21:11

本文介绍了面向对象编程(OOP)的基本概念及其在Python和C++中的实现。面向对象编程通过类、对象、封装、继承和多态等机制,帮助开发者更好地组织和管理代码。文章通过Python和C++的示例代码,展示了如何定义类、创建对象、使用方法和继承。在Python中,使用class关键字定义类,并通过__init__方法初始化对象属性;在C++中,同样使用class关键字定义类,并通过构造函数初始化对象属性。此外,文章还介绍了继承的概念,展示了如何在Python和C++中通过继承实现代码重用和多态性。通过这些示例,读者可以更好地理解面向对象编程的核心思想及其在不同编程语言中的应用。

什么是面向对象

面向对象编程通过类、对象、封装、继承和多态等机制,帮助开发者更好地组织和管理代码。Python 和 C++ 都支持这些特性,但语法和实现方式有所不同。

面向对象编程(Object-Oriented Programming,简称 OOP)是一种编程范式,它将程序设计中的数据和对数据的操作封装到一个个“对象”中。这种方式使得程序更加模块化、易于维护和扩展。下面我们通过 Python 和 C++ 两个简单的例子来说明这一概念。

面向对象的编程示例

Python中的面向对象

在 Python 中,我们可以使用 class 关键字来定义一个类,然后通过类来创建对象(实例)。每个对象都有自己的属性(数据)和方法(操作)。下面是一个简单的例子,定义了一个 Person 类:

# 定义一个 Person 类
class Person:
    # 构造方法,创建对象时自动调用,用于初始化属性
    def __init__(self, name, age):
        self.name = name  # 对象属性:名字
        self.age = age    # 对象属性:年龄

    # 一个方法,用来打印打招呼信息
    def greet(self):
        print(f"Hello, my name is {self.name} and I am {self.age} years old.")

# 创建一个 Person 类的实例(对象)
p = Person("Alice", 25)
# 调用对象的方法
p.greet()  # 输出: Hello, my name is Alice and I am 25 years old.

在这个示例中,

  • 类(Class)Person 是一个类,类似于一个模板,它描述了一类对象应有的属性和行为。
  • 对象(Object)pPerson 类的一个实例(对象),它有自己的 nameage
  • 方法(Method)greet 是定义在 Person 类中的一个方法,用于对象执行特定的操作。

C++中的面向对象

在 C++ 中,面向对象编程也是非常常见的。我们同样使用 class 关键字来定义类,并通过构造函数初始化对象的属性。下面是一个类似的 Person 类的例子:

#include <iostream>
#include <string>
using namespace std;

// 定义一个 Person 类
class Person {
public:
    // 对象的属性
    string name;
    int age;
    
    // 构造函数,用于初始化属性
    Person(string n, int a) : name(n), age(a) {}

    // 成员函数,用来打印打招呼信息
    void greet() {
        cout << "Hello, my name is " << name << " and I am " << age << " years old." << endl;
    }
};

int main() {
    // 创建 Person 类的对象
    Person p("Bob", 30);
    // 调用对象的方法
    p.greet();  // 输出: Hello, my name is Bob and I am 30 years old.
    return 0;
}

说明:

  • 类(Class):同样,Person 是一个类,它定义了所有 Person 对象共有的属性和行为。
  • 对象(Object)pPerson 类的一个实例,通过构造函数 Person(string n, int a) 初始化。
  • 成员函数(Member Function)greetPerson 类中的一个函数,用于实现对象的行为。

继承

通过继承,一个类可以基于另一个类构建,并且可以继承父类的属性和方法。 这种机制促进了代码的重用,减少了冗余,提高了代码的可维护性。 继承还有助于建立类之间的层次结构,使得代码更具层次感和结构化。

Python中的继承

在下面的例子中,我们先定义一个基类 Animal,它有一个方法 speak。然后,我们定义一个子类 Dog,继承自 Animal 并重写(Override)了 speak 方法,使得 Dog 对象可以发出“汪汪”的声音。

# 定义基类 Animal
class Animal:
    def __init__(self, name):
        self.name = name

    def speak(self):
        print("Some generic animal sound.")

# 定义子类 Dog,继承自 Animal
class Dog(Animal):
    def __init__(self, name, breed):
        # 调用基类的构造方法初始化 name
        super().__init__(name)
        self.breed = breed

    # 重写父类的 speak 方法
    def speak(self):
        print("Woof! Woof!")

# 使用基类创建一个 Animal 对象
animal = Animal("Generic Animal")
animal.speak()  # 输出: Some generic animal sound.

# 使用子类创建一个 Dog 对象
dog = Dog("Buddy", "Golden Retriever")
dog.speak()     # 输出: Woof! Woof!
  • 继承Dog 类通过 class Dog(Animal): 表示继承自 Animal 类,这样 Dog 类自动拥有了 Animal 类中的属性和方法。
  • 方法重写:在 Dog 类中,我们定义了一个新的 speak 方法,这个方法覆盖了 Animal 类中的 speak 方法,使得调用 dog.speak() 时会执行 Dog 中的实现。
  • 使用 super():在子类构造方法中使用 super().__init__(name) 来调用父类的构造函数,以初始化父类中的属性。

C++中的继承

我们定义了基类 Animal 和子类 Dog。在 C++ 中,为了支持运行时多态,我们通常将基类的方法声明为 virtual,然后在子类中重写这些方法。

#include <iostream>
#include <string>
using namespace std;

// 定义基类 Animal
class Animal {
public:
    string name;
    
    // 构造函数
    Animal(const string& n) : name(n) {}

    // 虚函数,用于支持多态
    virtual void speak() {
        cout << "Some generic animal sound." << endl;
    }

    // 虚析构函数,确保子类正确释放资源
    virtual ~Animal() {}
};

// 定义子类 Dog,继承自 Animal
class Dog : public Animal {
public:
    string breed;
    
    // 构造函数,调用基类构造函数初始化 name
    Dog(const string& n, const string& b) : Animal(n), breed(b) {}

    // 重写基类的 speak 方法
    void speak() override {
        cout << "Woof! Woof!" << endl;
    }
};

int main() {
    // 使用基类创建一个 Animal 对象
    Animal animal("Generic Animal");
    animal.speak();  // 输出: Some generic animal sound.

    // 使用子类创建一个 Dog 对象
    Dog dog("Buddy", "Golden Retriever");
    dog.speak();     // 输出: Woof! Woof!

    // 也可以通过基类指针来操作子类对象,体现多态性
    Animal* pAnimal = new Dog("Max", "Bulldog");
    pAnimal->speak();  // 输出: Woof! Woof!
    delete pAnimal;

    return 0;
}
  • 继承class Dog : public Animal 表示 Dog 类继承自 Animal 类。
  • 虚函数(Virtual Function):在基类中将 speak 声明为 virtual,允许在子类中重写该方法,从而实现多态。
  • 方法重写:在 Dog 类中使用 override 关键字重写了 speak 方法,这样调用 speak() 时就会执行 Dog 类中的实现。
  • 基类指针多态:示例中使用了一个 Animal* 指针指向 Dog 对象,并调用 speak(),这时由于虚函数机制,会调用 Dog 类中的 speak 方法。
  • ✇陶小桃Blog
  • 重学ROS2:(6)多功能包的最佳实践——Workspace工作空间52txr
    这篇博客文章介绍了ROS2中工作空间(Workspace)的概念及其最佳实践。工作空间是机器人开发的专属“工作室”,用于存放、管理和编译代码。文章详细解释了工作空间的主要目录:src(代码空间)、build(编译空间)、和install(安装空间),并说明了它们的作用。接着,文章演示了如何创建和编译工作空间,使用colcon build命令可以一键编译所有代码,也可以通过--packages-select选项选择性地编译特定功能包。此外,文章还介绍了如何通过设置依赖关系来控制编译顺序,确保代码按需编译。通过这些步骤,开发者可以在一个独立且高效的环境中管理和测试机器人代码。工作空间的概念ROS2中的工作空间(Workspace)就像你专属的机器人开发“工作室”,专门用来存放、管理和编译你的机器人代码。简单来说:你的代码仓库你把所有ROS2代码(比如传感器处理、导航算法等)放在这里,就像把工具和材料整理在一个工具箱里。一键编译车间用一条命令(比如colcon build)就能自动编译所有代码,生成可执行文件,省去手动处理依赖的麻烦。独立实验环境工作空间和系统其他部分隔离,你修改代码不会影响
     

重学ROS2:(6)多功能包的最佳实践——Workspace工作空间

作者 52txr
2025年2月1日 20:46

这篇博客文章介绍了ROS2中工作空间(Workspace)的概念及其最佳实践。工作空间是机器人开发的专属“工作室”,用于存放、管理和编译代码。文章详细解释了工作空间的主要目录:src(代码空间)、build(编译空间)、和install(安装空间),并说明了它们的作用。接着,文章演示了如何创建和编译工作空间,使用colcon build命令可以一键编译所有代码,也可以通过--packages-select选项选择性地编译特定功能包。此外,文章还介绍了如何通过设置依赖关系来控制编译顺序,确保代码按需编译。通过这些步骤,开发者可以在一个独立且高效的环境中管理和测试机器人代码。

工作空间的概念

ROS2中的工作空间(Workspace)就像你专属的机器人开发“工作室”,专门用来存放、管理和编译你的机器人代码。简单来说:

  1. 你的代码仓库
    你把所有ROS2代码(比如传感器处理、导航算法等)放在这里,就像把工具和材料整理在一个工具箱里。
  2. 一键编译车间
    用一条命令(比如colcon build)就能自动编译所有代码,生成可执行文件,省去手动处理依赖的麻烦。
  3. 独立实验环境
    工作空间和系统其他部分隔离,你修改代码不会影响其他项目,就像在“沙盒”里安全测试。
  4. 功能包的家
    每个机器人功能模块(比如摄像头驱动、地图构建)都是一个“功能包”(Package),工作空间就是这些包的集合地。

想象你在做一个拼装机器人,工作空间就是你放零件(代码)、工具(编译器)、说明书(配置文件)的工作台,所有操作都在这里完成。

ROS默认使用的是Catkin编译系统(在CMake的基础上拓展得到的,将 cmake 与 make 指令做了一个封装从而完成整个编译过程)。在Catkin编译系统下,一个典型的工作空间一般包含几个目录空间srcbuildinstall

  1. src: 代码空间(Source Space),最常用、最重要的文件夹,用来存储所有ROS功能包(package)的源文件。
  2. build: 编译空间(Build Space),catkin_make命令自动生成,用来存储工作空间编译过程中产生的缓存信息和中间文件。
  3. install: 安装空间(Install Space),不是必需的,很多工作空间没有该文件夹。编译成功后,可以使用make install命令将可执行文件安装到该空间中,运行该空间中的环境变量脚本,即可在终端中运行这些可执行文件。

创建工作空间

mkdir -p chapt2_ws/src        #使用系统命令创建工作空间目录
  • -p是指多层文件夹

创建工作空间之后,把《重学ROS2:(5)使用功能包组织ROS中的节点【Python/C++】》中的功能包都放在工作空间的src目录下,如下图所示:

功能包demo文件

编译工作空间

终端进入chapt2_ws/src中,输入编译命令:

colcon build

可以看到同时把python以及cpp的代码给编译好了:

编译完成

如果只想构建一个,也是可以的:

colcon build --packages-select <name-of-pkg>

选择性构建

如果想要控制编译的顺序,那么可以通过依赖的方式开控制顺序。例如我们想要先构建cpp的,再构建python的,那么可以设置python的包是依赖cpp的,这样就得先cpp再python:

通过依赖关系来依次构建

再编译结果如下,可以看到cpp结束了再python:

构建的顺序结果

  • ✇陶小桃Blog
  • 七牛云CDN真的不适合个人站长使用,小陶已注销账号52txr
    虽然很久之前,小陶是七牛云的忠诚粉丝,那时候小陶还很纯洁,不知道网站圈子的各种乱。其实也不算乱,只是一些会点三脚猫的老鼠屎老搞攻击,也就是所谓的刷流量或者DDOS。一开始在选择CDN的时候,网上很多都是推荐七牛云,现在作为一个博客老站长,感觉自己真的太傻了。现在小陶已经不再使用七牛云了,所有的资源已经迁移了。关于如何迁移,之前已经写过内容,这里就不再赘述了(见文《使用TntDrive挂载七牛云对象存储来管理文件》、《批量将七牛云里的文件下载到本地的工具》等)。其实对于大多数博客网站来说,图片放在自己的服务器就足够了,如果怕内存不够,可以进行适当的压缩(见文《说说小陶的每篇博客是怎么写出来的》)。目前小陶写了三年多的时间,图片一共也就一两GB。觉得内存不够属实是杞人忧天。七牛云最大的缺点和硬伤就是不能设置流量封顶,也不能设置QPS,总感觉用了会第二天是一笔巨额账单。之前我是和客服沟通了,说是后台可以设置宽带限制或者QPS,前段时间再去问问,发现已经不可以了,只能说服务真烂、吃香真难看。但是神奇的是,后来又不行了:他的解释是“单纯的从cdn的层面上来处理,是不能完全规避掉的”这个解释真的很
     

七牛云CDN真的不适合个人站长使用,小陶已注销账号

作者 52txr
2025年2月1日 18:48

虽然很久之前,小陶是七牛云的忠诚粉丝,那时候小陶还很纯洁,不知道网站圈子的各种乱。其实也不算乱,只是一些会点三脚猫的老鼠屎老搞攻击,也就是所谓的刷流量或者DDOS。一开始在选择CDN的时候,网上很多都是推荐七牛云,现在作为一个博客老站长,感觉自己真的太傻了。

现在小陶已经不再使用七牛云了,所有的资源已经迁移了。关于如何迁移,之前已经写过内容,这里就不再赘述了(见文《使用TntDrive挂载七牛云对象存储来管理文件》、《批量将七牛云里的文件下载到本地的工具》等)。

其实对于大多数博客网站来说,图片放在自己的服务器就足够了,如果怕内存不够,可以进行适当的压缩(见文《说说小陶的每篇博客是怎么写出来的》)。目前小陶写了三年多的时间,图片一共也就一两GB。觉得内存不够属实是杞人忧天。

七牛云最大的缺点和硬伤就是不能设置流量封顶,也不能设置QPS,总感觉用了会第二天是一笔巨额账单。

之前我是和客服沟通了,说是后台可以设置宽带限制或者QPS,前段时间再去问问,发现已经不可以了,只能说服务真烂、吃香真难看。

以前可以设置QPS

但是神奇的是,后来又不行了:

现在又不能设置了

他的解释是“单纯的从cdn的层面上来处理,是不能完全规避掉的”这个解释真的很让我怀疑七牛云的技术团队水平,也对七牛云的服务失去了信心。遂进行了搬迁,也劝告各位新人博客站长不要使用七牛云,防止被刷爆了。下面的截图是多吉云CDN的避免产生太高流量的设置:

多吉云的流量封顶

目前小陶是进行了账号的注销,从此相忘于江湖吧,终究是我一开始错付了!

七牛云的账号注销在“个人中心——>注销申请”,然后提交一个工单。

注销账号

提交工单

  • ✇陶小桃Blog
  • 小陶的个人博客并不喜欢被任何Ai公司爬取(附已知的ai公司爬虫UA)52txr
    虽然现在大模型是如火如荼进行,最近国产的大模型DeepSeek甚至让国际巨头感到不适,但是作为个人博客站长,并不希望自己博客的任何内容被ai公司爬取。这倒不是自私,一方面是因为小陶的博客内容比较狗屎,大部分都是学习的笔记以及生活的记录,一篇文章甚至有很多错别字,因此根本不想去污染先进模型的语料。另一方面,想到自己的一些私人事情被拿去训练模型,大模型中有自己的一部分,就有些心理性反感。前几天小陶其实是发现了有不少Ai公司的爬虫在这个博客爬来爬去。下图是ChatGPT的,此外还有Claude、字节的等等,就不一一列举了。大部分Ai公司其实都没有公布自己的爬虫ip,甚至很多都没有公布爬虫的UA。好在找到了一个和我一样不想被Ai公司爬取的大佬,它收集了几乎目前发现的全部Ai公司爬虫:ai.robots.txt - github个人不是很建议用robots.txt来屏蔽爬虫,众所周知,这只是一个君子协议,大部分爬虫未必会遵守。如果有使用宝塔的Nginx防火墙,可以在UA黑名单设置如下:AI2Bot Ai2Bot-Dolma Amazonbot anthropic-ai Applebot Appl
     

小陶的个人博客并不喜欢被任何Ai公司爬取(附已知的ai公司爬虫UA)

作者 52txr
2025年2月1日 15:25

虽然现在大模型是如火如荼进行,最近国产的大模型DeepSeek甚至让国际巨头感到不适,但是作为个人博客站长,并不希望自己博客的任何内容被ai公司爬取。这倒不是自私,一方面是因为小陶的博客内容比较狗屎,大部分都是学习的笔记以及生活的记录,一篇文章甚至有很多错别字,因此根本不想去污染先进模型的语料。另一方面,想到自己的一些私人事情被拿去训练模型,大模型中有自己的一部分,就有些心理性反感。

前几天小陶其实是发现了有不少Ai公司的爬虫在这个博客爬来爬去。下图是ChatGPT的,此外还有Claude、字节的等等,就不一一列举了。

大部分Ai公司其实都没有公布自己的爬虫ip,甚至很多都没有公布爬虫的UA。

GPTBot爬取小陶网站

好在找到了一个和我一样不想被Ai公司爬取的大佬,它收集了几乎目前发现的全部Ai公司爬虫:

ai.robots.txt - github

个人不是很建议用robots.txt来屏蔽爬虫,众所周知,这只是一个君子协议,大部分爬虫未必会遵守。

如果有使用宝塔的Nginx防火墙,可以在UA黑名单设置如下:

AI2Bot
Ai2Bot-Dolma
Amazonbot
anthropic-ai
Applebot
Applebot-Extended
Bytespider
CCBot
ChatGPT-User
Claude-Web
ClaudeBot
cohere-ai
cohere-training-data-crawler
Crawlspace
Diffbot
DuckAssistBot
FacebookBot
FriendlyCrawler
Google-Extended
GoogleOther
GoogleOther-Image
GoogleOther-Video
GPTBot
iaskspider/2.0
ICC-Crawler
ImagesiftBot
img2dataset
ISSCyberRiskCrawler
Kangaroo
Meta-ExternalAgent
Meta-ExternalFetcher
OAI-SearchBot
omgili
omgilibot
PanguBot
PerplexityBot
PetalBot
Scrapy
SemrushBot
Sidetrade
Timpibot
VelenPublicWebCrawler
Webzio-Extended
YouBot

如果需要|格式的可以用下面的:

AI2Bot|Ai2Bot-Dolma|Amazonbot|anthropic-ai|Applebot|Applebot-Extended|Bytespider|CCBot|ChatGPT-User|Claude-Web|ClaudeBot|cohere-ai|cohere-training-data-crawler|Crawlspace|Diffbot|DuckAssistBot|FacebookBot|FriendlyCrawler|Google-Extended|GoogleOther|GoogleOther-Image|GoogleOther-Video|GPTBot|iaskspider/2.0|ICC-Crawler|ImagesiftBot|img2dataset|ISSCyberRiskCrawler|Kangaroo Bot|Meta-ExternalAgent|Meta-ExternalFetcher|OAI-SearchBot|omgili|omgilibot|PanguBot|PerplexityBot|PetalBot|Scrapy|SemrushBot|Sidetrade|Timpibot|VelenPublicWebCrawler|Webzio-Extended|YouBot

如果在robots.txt添加,可以写入:

User-agent: AI2Bot
User-agent: Ai2Bot-Dolma
User-agent: Amazonbot
User-agent: anthropic-ai
User-agent: Applebot
User-agent: Applebot-Extended
User-agent: Bytespider
User-agent: CCBot
User-agent: ChatGPT-User
User-agent: Claude-Web
User-agent: ClaudeBot
User-agent: cohere-ai
User-agent: cohere-training-data-crawler
User-agent: Crawlspace
User-agent: Diffbot
User-agent: DuckAssistBot
User-agent: FacebookBot
User-agent: FriendlyCrawler
User-agent: Google-Extended
User-agent: GoogleOther
User-agent: GoogleOther-Image
User-agent: GoogleOther-Video
User-agent: GPTBot
User-agent: iaskspider/2.0
User-agent: ICC-Crawler
User-agent: ImagesiftBot
User-agent: img2dataset
User-agent: ISSCyberRiskCrawler
User-agent: Kangaroo Bot
User-agent: Meta-ExternalAgent
User-agent: Meta-ExternalFetcher
User-agent: OAI-SearchBot
User-agent: omgili
User-agent: omgilibot
User-agent: PanguBot
User-agent: PerplexityBot
User-agent: PetalBot
User-agent: Scrapy
User-agent: SemrushBot
User-agent: Sidetrade indexer bot
User-agent: Timpibot
User-agent: VelenPublicWebCrawler
User-agent: Webzio-Extended
User-agent: YouBot
Disallow: /

其他的一些无聊垃圾爬虫可以参考文章:《如何在宝塔中配置Nginx阻止垃圾蜘蛛_反爬虫_防采集

一行一列的话就是:

CheckMarkNetwork
Synapse
Nimbostratus-Bot
Dark
scraper
LMAO
Hakai
Gemini
Wappalyzer
masscan
crawler4j
Mappy
Center
eright
aiohttp
MauiBot
Crawler
researchscan
Dispatch
AlphaBot
Census
ips-agent
NetcraftSurveyAgent
ToutiaoSpider
EasyHttp
Iframely
sysscan
fasthttp
muhstik
DeuSu
mstshash
HTTP_Request
ExtLinksBot
package
SafeDNSBot
CPython
SiteExplorer
SSH
MegaIndex
BUbiNG
CCBot
NetTrack
Digincore
aiHitBot
SurdotlyBot
null
SemrushBot
Test
Copied
ltx71
Nmap
DotBot
AdsBot
InetURL
Pcore-HTTP
PocketParser
Wotbox
newspaper
DnyzBot
redback
PiplBot
SMTBot
WinHTTP
Auto Spider 1.0
GrabNet
TurnitinBot
Go-Ahead-Got-It
Download Demon
Go!Zilla
GetWeb!
GetRight
libwww-perl
Cliqzbot
MailChimp
SMTBot
Dataprovider
XoviBot
linkdexbot
SeznamBot
Qwantify
spbot
evc-batch
zgrab
Go-http-client
FeedDemon
JikeSpider
Indy Library
Alexa Toolbar
AskTbFXTV
AhrefsBot
CrawlDaddy
CoolpadWebkit
Java
UniversalFeedParser
ApacheBench
Microsoft URL Control
Swiftbot
ZmEu
jaunty
Python-urllib
lightDeckReports Bot
YYSpider
DigExt
YisouSpider
HttpClient
MJ12bot
EasouSpider
LinkpadBot
Ezooms

当然最好可以在CDN端进行拦截,在多吉云CDN中UA黑名单一行最多十个,因此需要进行分行:

cdnunion_monitor|GPTBot|ChatGPT-User|Google-Extended|CCBot|anthropic-ai|cohere-ai|ImagesiftBot|PerplexityBot|Omgilibot

FacebookBot|Diffbot|Applebot-Extended|Spawning-AI|SemrushBot|Amazonbot|ClaudeBot|PetalBot|gptbot|Ahrefs

Semrush|Imagesift|Teoma|ia_archiver|twiceler|MSNBot|Scrubby|Robozilla|Gigabot|yahoo-mmcrawler

yahoo-blogs/v3.9|psbot|AI2Bot|Ai2Bot-Dolma|Applebot|Bytespider|Claude-Web|cohere-ai|cohere-training-data-crawler|Crawlspace

DuckAssistBot|FriendlyCrawler|GoogleOther|GoogleOther-Image|GoogleOther-Video|iaskspider/2.0|ICC-Crawler|ImagesiftBot|img2dataset|ISSCyberRiskCrawler

Kangaroo|Meta-ExternalAgent|Meta-ExternalFetcher|OAI-SearchBot|omgili|omgilibot|PanguBot|Scrapy|Sidetrade|Timpibot

VelenPublicWebCrawler|Webzio-Extended|YouBot|CheckMarkNetwork|Synapse|Nimbostratus-Bot|Dark|scraper|LMAO|Hakai

Gemini|Wappalyzer|masscan|crawler4j|Mappy|Center|eright|aiohttp|MauiBot|Crawler

researchscan|Dispatch|AlphaBot|Census|ips-agent|NetcraftSurveyAgent|ToutiaoSpider|EasyHttp|Iframely|sysscan

fasthttp|muhstik|DeuSu|mstshash|HTTP_Request|ExtLinksBot|package|SafeDNSBot|CPython|SiteExplorer

SSH|MegaIndex|BUbiNG|NetTrack|Digincore|aiHitBot|SurdotlyBot|null|Test|Copied

ltx71|Nmap|DotBot|AdsBot|InetURL|Pcore-HTTP|PocketParser|Wotbox|newspaper|DnyzBot

redback|PiplBot|SMTBot|WinHTTP|Auto Spider 1.0|GrabNet|TurnitinBot|Go-Ahead-Got-It|Download Demon|Go!Zilla

GetWeb!|GetRight|libwww-perl|Cliqzbot|MailChimp|Dataprovider|XoviBot|linkdexbot|SeznamBot|Qwantify

spbot|evc-batch|zgrab|Go-http-client|FeedDemon|JikeSpider|Indy Library|Alexa Toolbar|AskTbFXTV|AhrefsBot

CrawlDaddy|CoolpadWebkit|Java|UniversalFeedParser|ApacheBench|Microsoft URL Control|Swiftbot|ZmEu|jaunty|Python-urllib

lightDeckReports Bot|YYSpider|DigExt|YisouSpider|HttpClient|MJ12bot|EasouSpider|LinkpadBot|Ezooms|NULL
  • ✇陶小桃Blog
  • 重学ROS2:(5)使用功能包组织ROS中的节点【Python/C++】52txr
    这篇博客文章详细介绍了如何在ROS2中使用功能包来组织Python和C++节点。功能包是ROS2中的基本模块,用于封装相关代码、配置文件和工具,以便完成特定功能。文章首先解释了功能包的概念,并举例说明了如何通过功能包管理多个节点,节点之间通过话题或服务进行通信,并使用启动文件批量启动节点。接着,文章详细演示了如何创建和配置Python功能包,包括编写节点控制函数、添加依赖声明、编译功能包以及运行可执行文件。随后,文章还介绍了如何创建和配置C++功能包,包括编写C++节点、配置CMakeLists.txt文件、编译和运行节点。最后,文章提醒读者在代码路径中避免使用特殊字符,以免在编译时出现问题。通过这些步骤,读者可以更好地理解如何在ROS2中使用功能包来组织和管理节点。什么是功能包?简单来说,功能包就是一个“工具箱”,里面装了一堆相关的代码、配置文件、工具等,用来完成某个特定的功能。比如:一个包可能专门处理机器人移动(比如控制轮子)。另一个包可能专门处理摄像头图像识别。每个包都是独立的模块,方便重复使用和管理。节点是 ROS2 中的最小“工人”,每个节点只做一件具体的事(比如读取传感器数
     

重学ROS2:(5)使用功能包组织ROS中的节点【Python/C++】

作者 52txr
2025年2月1日 14:33

这篇博客文章详细介绍了如何在ROS2中使用功能包来组织Python和C++节点。功能包是ROS2中的基本模块,用于封装相关代码、配置文件和工具,以便完成特定功能。文章首先解释了功能包的概念,并举例说明了如何通过功能包管理多个节点,节点之间通过话题或服务进行通信,并使用启动文件批量启动节点。接着,文章详细演示了如何创建和配置Python功能包,包括编写节点控制函数、添加依赖声明、编译功能包以及运行可执行文件。随后,文章还介绍了如何创建和配置C++功能包,包括编写C++节点、配置CMakeLists.txt文件、编译和运行节点。最后,文章提醒读者在代码路径中避免使用特殊字符,以免在编译时出现问题。通过这些步骤,读者可以更好地理解如何在ROS2中使用功能包来组织和管理节点。

什么是功能包?

简单来说,功能包就是一个“工具箱”,里面装了一堆相关的代码、配置文件、工具等,用来完成某个特定的功能。比如:

  • 一个包可能专门处理机器人移动(比如控制轮子)。
  • 另一个包可能专门处理摄像头图像识别。

每个包都是独立的模块,方便重复使用和管理。

节点是 ROS2 中的最小“工人”,每个节点只做一件具体的事(比如读取传感器数据、控制电机)。组织方式如下:

  1. 一个功能包可以包含多个节点

    例如:一个“移动控制包”里可能有:

    • 节点1:接收遥控指令
    • 节点2:计算轮子转速
  2. 节点之间通过“话题(Topic)”或“服务(Service)”通信

    比如节点1通过“指令话题”把指令发给节点2,节点2再控制轮子。

  3. 用启动文件(Launch File)批量启动节点

    可以写一个“启动脚本”,一次性启动多个节点,还能设置参数。

一个功能包通常长这样:

my_package/  
├── src/                # 源代码(比如Python或C++)  
├── launch/             # 启动文件(.launch.py)  
├── package.xml         # 包的信息和依赖项  
└── CMakeLists.txt      # 编译配置(如果是C++代码)  

假设你要让机器人巡逻:

  1. 创建一个 patrol_package 功能包。
  2. 在包里写两个节点:

    • 节点A:探测障碍物(发布“障碍物位置”话题)。
    • 节点B:根据障碍物位置规划路径(订阅话题并计算路径)。
  3. 写一个启动文件,同时启动这两个节点。

创建Python功能包示例

功能包语法

ros2 pkg create --build-type ament_python --license Apache-2.0 <package_name>
  • pkg create 是创建包的意思
  • --build-type 用来指定该包的编译类型,一共有三个可选项ament_python、ament_cmake、cmake
  • --license 用于制定证书,一般设置为Apache-2.0,如果不指定的话会弹出一个警告但是没有别的影响
  • --dependencies 指的是这个功能包的依赖,这里使用的依赖是rclcpp

现在我用《重学ROS2:(4)编写ROS2中的第一个节点【C++/Python双语言版本】》中的python内容来创建一个功能包。例如创建一个python代码的功能包:

ros2 pkg create --build-type ament_python --license Apache-2.0 demo_python_pkg

创建python功能包

配置python功能包

setup.py文件中,写入节点的控制函数,告诉功能包运行哪个函数。

        'console_scripts': [
            'python_node = demo_python_pkg.ros_python_node:main'
        ],

配置python功能包

添加依赖声明

在py代码中,我们引入了rclpy的库,那么在xml文件中还需要添加依赖,以防止找不到库。

  <depend>rclpy</depend>

添加依赖声明

编译功能包

在终端输入编译命令:

colcon build

编译功能包

运行可执行文件

生成的可执行文件在./install/demo_python_pkg/lib/demo_python_pkg目录下:

可执行文件

直接运行这个可执行文件会报错,会报错raise PackageNotFoundError(name) importlib.metadata.PackageNotFoundError: No package metadata was found for demo-python-pkg

需要先通过setup.bash来激活环境变量:

source install/setup.bash 

然后再运行那个可执行文件python_node

环境变量

也可以用ros2 run来运行:

ros2 run demo_python_pkg python_node

ros2

创建C++功能包示例

功能包语法

现在我用《重学ROS2:(4)编写ROS2中的第一个节点【C++/Python双语言版本】》中的C++内容来创建一个功能包。

回顾一下基本语法:

ros2 pkg create <package_name> --build-type ament_cmake --license Apache-2.0 --dependencies rclcpp 

例如创建个demo功能包:

ros2 pkg create demo_cpp_pkg --build-type ament_cmake --license Apache-2.0 --dependencies rclcpp 

生成cpp功能包

创建了功能包之后,在src中书写cpp文件:

添加源码

配置CMakeLists.txt文件

在生成的CMakeLists.txt文件中,需要添加点内容:

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

# 根据实际文件名以及节点名进行修改
add_executable(cpp_node src/cpp_node.cpp)

# 查找依赖的ROS2包
message(STATUS "Found rclcpp: ${rclcpp_INCLUDE_DIRS}")
message(STATUS "Found rclcpp: ${rclcpp_LIBRARIES}")
message(STATUS "Found rclcpp: ${rclcpp_VERSION}")

target_include_directories(cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}) #头文件包含
target_link_libraries(cpp_node PUBLIC ${rclcpp_LIBRARIES}) #链接库

cmake文件配置

完整的cmakelist文件:

cmake_minimum_required(VERSION 3.8)
project(demo_cpp_pkg)

if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
  add_compile_options(-Wall -Wextra -Wpedantic)
endif()

# find dependencies
find_package(ament_cmake REQUIRED)
find_package(rclcpp REQUIRED)

# 根据实际文件名以及节点名进行修改
add_executable(cpp_node src/cpp_node.cpp)

# 查找依赖的ROS2包
message(STATUS "Found rclcpp: ${rclcpp_INCLUDE_DIRS}")
message(STATUS "Found rclcpp: ${rclcpp_LIBRARIES}")
message(STATUS "Found rclcpp: ${rclcpp_VERSION}")

target_include_directories(cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}) #头文件包含
target_link_libraries(cpp_node PUBLIC ${rclcpp_LIBRARIES}) #链接库

if(BUILD_TESTING)
  find_package(ament_lint_auto REQUIRED)
  # the following line skips the linter which checks for copyrights
  # comment the line when a copyright and license is added to all source files
  set(ament_cmake_copyright_FOUND TRUE)
  # the following line skips cpplint (only works in a git repo)
  # comment the line when this package is in a git repo and when
  # a copyright and license is added to all source files
  set(ament_cmake_cpplint_FOUND TRUE)
  ament_lint_auto_find_test_dependencies()
endif()

ament_package()

事实上可以把头文件、链接库用一句命令来代替。也就是:

target_include_directories(cpp_node PUBLIC ${rclcpp_INCLUDE_DIRS}) #头文件包含
target_link_libraries(cpp_node PUBLIC ${rclcpp_LIBRARIES}) #链接库

换成

ament_target_dependencies(cpp_node rclcpp)

为了让生成的过程文件更加有层次,可以新建一个build文件夹,并且进入build文件夹进行编译/终端进入build文件夹:

新建build文件

之后进行make,获得可执行文件。

运行可执行文件即可启动节点:

启动节点

此时已经成功启动了节点。

如果想要和python一样有install目录,需要手动在CMakeLists.txt里面添加install命令:

#安装 起到拷贝作用
install(TARGETS cpp_node
  DESTINATION lib/${PROJECT_NAME}
)

然后在功能包下面进行编译构建:

安装代码

一个坑

代码的路径不要使用特殊的字符,例如一开始我使用的是2.3,还有中文字符,在cmake的时候,就是报错。

当把路径改的简单一点就成功了!!

路径的坑

  • ✇陶小桃Blog
  • 修复handsome选择字节静态库mathjax的CDN链接严重拖慢加载速度52txr
    网站加载异常时发现tex-mml-chtml.min.js请求耗时长达6.13秒,经排查发现该请求源自主题文件CDN.php中强制指定的低效CDN(cdnjs.loli.net)。尽管用户选择字节跳动CDN,但该文件统一锁定了MathJax资源的CDN地址。通过替换为字节CDN链接(lf6-cdn-tos.bytecdntp.com对应路径)后,加载时间优化至27毫秒,问题解决。发现问题打开网站发现icon一直在转圈,使用F12看了看,https://cdnjs.loli.net/ajax/libs/mathjax/3.1.2/es5/tex-mml-chtml.min.js这个请求占了6.13秒。我特地查了查,感觉cdnjs.loli.net似乎也是蛮拉胯的(相对大厂而言)。于是我就在开始寻找这个请求从我的哪个链接发出的。分析问题在F12的启动器中,发现是core.min.js中发出的,但是我在js文件中,并没有找到这个链接。继续寻花问柳。最终我在usr/themes/handsome/libs/CDN.php找到了。虽然我选择的是字节跳动CDN(BY_CDN),但是作者似乎把所有的
     

修复handsome选择字节静态库mathjax的CDN链接严重拖慢加载速度

作者 52txr
2025年1月21日 11:47

网站加载异常时发现tex-mml-chtml.min.js请求耗时长达6.13秒,经排查发现该请求源自主题文件CDN.php中强制指定的低效CDN(cdnjs.loli.net)。尽管用户选择字节跳动CDN,但该文件统一锁定了MathJax资源的CDN地址。通过替换为字节CDN链接(lf6-cdn-tos.bytecdntp.com对应路径)后,加载时间优化至27毫秒,问题解决。

发现问题

打开网站发现icon一直在转圈,使用F12看了看,https://cdnjs.loli.net/ajax/libs/mathjax/3.1.2/es5/tex-mml-chtml.min.js这个请求占了6.13秒。

加载速度很慢

我特地查了查,感觉cdnjs.loli.net似乎也是蛮拉胯的(相对大厂而言)。于是我就在开始寻找这个请求从我的哪个链接发出的。

lion.net的底细

分析问题

在F12的启动器中,发现是core.min.js中发出的,但是我在js文件中,并没有找到这个链接。继续寻花问柳。

寻找启动器

最终我在usr/themes/handsome/libs/CDN.php找到了。虽然我选择的是字节跳动CDN(BY_CDN),但是作者似乎把所有的mathjax都用了cdnjs.loli.net

选择公共CDN

拖慢速度的链接

解决问题

为了使得字节的CDN保持统一,我在字节静态库一顿翻找。最终找到了:

字节跳动的mathjax链接

把文件里的链接换成字节的链接即可:

https://lf6-cdn-tos.bytecdntp.com/cdn/expire-1-M/mathjax/3.1.2/es5/tex-mml-chtml.min.js

替换链接

修改之后只要27毫秒就完成了加载。

快速加载

  • ✇陶小桃Blog
  • 使用Python脚本监控服务器内网IP/公网IP发生变化时邮件通知52txr
    由于不知道自己的家庭宽带里电脑上连的内网ip会不会发生变化,于是就想着写个脚本来监测,如果发生了变化,则发送一下邮件来通知我去调整。原本准备用PHP来实现的,但是实际上没有那么简单,PHPMailer由于我也不是很熟悉,就没用的很好。于是又使用了自己熟悉的python语言,很简洁、很易懂。只能说人生苦短、我用python。下面的代码使用的是SSL端口,一定要注意设置好正确的465。关于如何在Linux上运行python脚本,可以看文章《在服务器上使用python虚拟环境pip安装库并运行自己的py脚本》。内网IP监测在服务器新建一个文件夹,例如/www/wwwroot/monitor_local_ip,然后写一个python脚本main.py。里面内容如下:需要注意的是,脚本采用smtp发件方式。如果是163邮箱等,需要确保 EMAIL_PASSWORD 是 163 邮箱的授权码,而不是登录密码。脚本使用的都是python内置库,不需要安装额外的第三方库。import socket import smtplib from email.mime.text import MIMEText
     

使用Python脚本监控服务器内网IP/公网IP发生变化时邮件通知

作者 52txr
2025年1月20日 20:07

由于不知道自己的家庭宽带里电脑上连的内网ip会不会发生变化,于是就想着写个脚本来监测,如果发生了变化,则发送一下邮件来通知我去调整。原本准备用PHP来实现的,但是实际上没有那么简单,PHPMailer由于我也不是很熟悉,就没用的很好。于是又使用了自己熟悉的python语言,很简洁、很易懂。只能说人生苦短、我用python。下面的代码使用的是SSL端口,一定要注意设置好正确的465。

关于如何在Linux上运行python脚本,可以看文章《在服务器上使用python虚拟环境pip安装库并运行自己的py脚本》。

内网IP监测

在服务器新建一个文件夹,例如/www/wwwroot/monitor_local_ip,然后写一个python脚本main.py。里面内容如下:

脚本地址

需要注意的是,脚本采用smtp发件方式。如果是163邮箱等,需要确保 EMAIL_PASSWORD 是 163 邮箱的授权码,而不是登录密码。

脚本使用的都是python内置库,不需要安装额外的第三方库。

import socket
import smtplib
from email.mime.text import MIMEText
import time

# 配置邮件发送信息
SMTP_SERVER = 'smtp.aliyun.com'  # SMTP服务器地址
SMTP_PORT = 465  # SMTP服务器端口,务必是SSL
EMAIL_ADDRESS = 'XXXXXX@aliyun.com'  # 发件人邮箱
EMAIL_PASSWORD = 'XXXXXX'  # 密码
TO_EMAIL = 'to52txr@163.com'  # 收件人邮箱

def get_local_ip():
    """获取本机内网IP地址"""
    try:
        # 创建一个UDP套接字
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        s.connect(('8.8.8.8', 80))  # 连接到一个外部地址
        ip = s.getsockname()[0]  # 获取本机IP地址
        s.close()
        return ip
    except Exception as e:
        print(f"获取内网IP失败: {e}")
        return None

def send_email(subject, body):
    """发送邮件"""
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = EMAIL_ADDRESS
    msg['To'] = TO_EMAIL

    try:
        server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)  # 使用SSL
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.sendmail(EMAIL_ADDRESS, [TO_EMAIL], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败: {e}")


def monitor_ip(interval=60):
    """监测内网IP变化"""
    previous_ip = get_local_ip()
    if previous_ip is None:
        print("无法获取初始IP地址,退出程序")
        return

    print(f"初始内网IP: {previous_ip}")

    while True:
        time.sleep(interval)  # 等待指定的时间间隔
        current_ip = get_local_ip()
        if current_ip is None:
            continue

        if current_ip != previous_ip:
            print(f"内网IP发生变化: {previous_ip} -> {current_ip}")
            subject = "内网IP发生变化"
            body = f"新的内网IP地址: {current_ip}"
            send_email(subject, body)
            previous_ip = current_ip
        else:
            print(f"内网IP未发生变化: {current_ip}")
            # subject = "内网IP未发生变化"
            # body = f"内网IP地址: {current_ip}"
            # send_email(subject, body)


if __name__ == "__main__":
    monitor_ip(interval=60)  # 每分钟检查一次IP地址

然后运行自己的脚本就行了。

source monitor_local_ip/bin/activate
python /www/wwwroot/monitor_local_ip/main.py

脚本运行示例

当然如果不想在bash里运行,可以放在定时任务中启动,每个小时启动一次,防止脚本意外停止了。

反正我使用阿里云邮箱确实是没问题的,下面的图片是我在测试时候不管有没有发生变化都发送邮件的测试。

收到邮件

公网IP监测

由于一些场景需要监测公网ip的变化,那么可以用下面的代码。可以再写个monitor_public_ip.py脚本。

import smtplib
from email.mime.text import MIMEText
import time

import requests

# 配置邮件发送信息
SMTP_SERVER = 'smtp.aliyun.com'  # SMTP服务器地址
SMTP_PORT = 465  # SMTP服务器端口
EMAIL_ADDRESS = 'xxxxxxx@aliyun.com'  # 发件人邮箱
EMAIL_PASSWORD = 'xxxxxxxxxxx'  # 发件人邮箱密码
TO_EMAIL = 'xxxx@163.com'  # 收件人邮箱

def get_public_ip():
    """获取当前公网IP地址"""
    try:
        # 使用 ifconfig.me 获取公网IP
        response = requests.get('https://ifconfig.me/ip', timeout=10)
        response.raise_for_status()  # 检查请求是否成功
        ip = response.text.strip()  # 去除空白字符
        return ip
    except Exception as e:
        print(f"获取公网IP失败: {e}")
        return None

def send_email(subject, body):
    """发送邮件"""
    msg = MIMEText(body)
    msg['Subject'] = subject
    msg['From'] = EMAIL_ADDRESS
    msg['To'] = TO_EMAIL

    try:
        server = smtplib.SMTP_SSL(SMTP_SERVER, SMTP_PORT)  # 使用SSL
        server.login(EMAIL_ADDRESS, EMAIL_PASSWORD)
        server.sendmail(EMAIL_ADDRESS, [TO_EMAIL], msg.as_string())
        server.quit()
        print("邮件发送成功")
    except Exception as e:
        print(f"邮件发送失败: {e}")

def monitor_public_ip(interval=600):
    """监测公网IP变化"""
    previous_ip = get_public_ip()
    if previous_ip is None:
        print("无法获取初始公网IP地址,退出程序")
        return

    print(f"初始公网IP: {previous_ip}")

    while True:
        time.sleep(interval)  # 等待指定的时间间隔
        current_ip = get_public_ip()
        if current_ip is None:
            print("无法获取当前公网IP地址,跳过本次检查")
            continue

        if current_ip != previous_ip:
            print(f"公网IP发生变化: {previous_ip} -> {current_ip}")
            subject = "公网IP发生变化"
            body = f"新的公网IP地址: {current_ip}\n\n时间: {time.ctime()}"
            send_email(subject, body)
            previous_ip = current_ip
        else:
            print(f"公网IP未发生变化: {current_ip}")

if __name__ == "__main__":
    monitor_public_ip(interval=600)  # 每10分钟检查一次公网IP地址

下面是几个返回公网ip的脚本:

  1. ifconfig.me:

    • 访问 https://ifconfig.me/ip 可以直接返回纯文本格式的公网 IP 地址。优先返回ipv6。
  2. ipinfo.io:

    • 访问 https://ipinfo.io/ip 也可以直接返回纯文本格式的公网 IP 地址。优先返回ipv4。
  3. ident.me:

    • 访问 https://ident.me 返回纯文本格式的公网 IP 地址。优先返回ipv6。
  4. myip.dnsomatic.com:

    • 访问 https://myip.dnsomatic.com 返回纯文本格式的公网 IP 地址。优先返回ipv4。
  • ✇陶小桃Blog
  • Debian12中设置开机自动启动服务(以向日葵远程控制软件为例)52txr
    在Linux中,随机启动一些服务似乎没有像Windows直接设置开机启动。我是希望我的服务器一直开着向日葵,这样方便我进行一些设置,然而尴尬的向日葵就没有开机启动这个选项。经过一顿摸索,终于实现了想要的效果。现在就以向日葵远程控制软件为例子,其实我设置了不止一个开机启动的脚本。[...]
     

Debian12中设置开机自动启动服务(以向日葵远程控制软件为例)

作者 52txr
2025年1月19日 22:16

在Linux中,随机启动一些服务似乎没有像Windows直接设置开机启动。我是希望我的服务器一直开着向日葵,这样方便我进行一些设置,然而尴尬的向日葵就没有开机启动这个选项。经过一顿摸索,终于实现了想要的效果。现在就以向日葵远程控制软件为例子,其实我设置了不止一个开机启动的脚本。

[...]

  • ✇陶小桃Blog
  • 借Ai编曲创作了第一首民谣音乐,写给女朋友52txr
    众所周,知,我,喜欢捣鼓各种奇门遁甲,也具有一定的文艺属性。主要体现在喜欢诗词歌赋,虽然鄙人唱歌不好听,但是不影响我喜欢捣鼓music,毕竟抱着我那迷人的吉他,显得我更加迷人了。我其实累计写了可能写了几百首甚至上千首小诗,自称为“贱人就是矫情”。但是我从来不敢自诩为诗人,帽子太大,是戴不动。之前我准备把自己的小诗都处理成电子版(我更加喜欢手写一些东西),但是精力不够用,之前创办的《小陶的诗》网站也倒闭了。下面这首处女座音乐,是使用“海绵音乐”进行调配的,歌词的话其实很早之前就公布过了,在这篇文章里:《『原创』小诗《江南姑娘》:人生若只如初见》。好了,絮絮叨叨一堆,直接上干货:虽然第一次谈恋爱,开局就干个异地1000km,但是我依然相信自己,相信她,也相信纯爱无敌。后面就近很多了。后面有时间的话,俺可以也会尝试着去玩玩这种音乐大模型。
     

借Ai编曲创作了第一首民谣音乐,写给女朋友

作者 52txr
2025年1月19日 18:55

众所周,知,我,喜欢捣鼓各种奇门遁甲,也具有一定的文艺属性。主要体现在喜欢诗词歌赋,虽然鄙人唱歌不好听,但是不影响我喜欢捣鼓music,毕竟抱着我那迷人的吉他,显得我更加迷人了。

我其实累计写了可能写了几百首甚至上千首小诗,自称为“贱人就是矫情”。但是我从来不敢自诩为诗人,帽子太大,是戴不动。

之前我准备把自己的小诗都处理成电子版(我更加喜欢手写一些东西),但是精力不够用,之前创办的《小陶的诗》网站也倒闭了。

小陶的诗

下面这首处女座音乐,是使用“海绵音乐”进行调配的,歌词的话其实很早之前就公布过了,在这篇文章里:《『原创』小诗《江南姑娘》:人生若只如初见》。好了,絮絮叨叨一堆,直接上干货:

虽然第一次谈恋爱,开局就干个异地1000km,但是我依然相信自己,相信她,也相信纯爱无敌。后面就近很多了。

后面有时间的话,俺可以也会尝试着去玩玩这种音乐大模型。

  • ✇陶小桃Blog
  • Debian笔记本合盖后不休眠配置HandleLidSwitch的记录52txr
    在前面《三种方式实现在 Linux 中禁用挂起和休眠模式》中,介绍了几种防止系统休眠的方法,其中第二条就是修改配置文件。现在我的应用场景是希望笔记本电脑在合上盖子时不执行任何操作,可以这样配置(注意删掉前面的#符号):HandleLidSwitch=ignore设置完成后,需要应用配置:sudo systemctl restart systemd-logind配置项的含义这里简单介绍一下各项的含义。HandleSuspendKey=ignore这个配置项决定了当用户按下挂起键(通常是电源按钮或键盘上的挂起键)时系统的行为。设置为ignore时,系统将忽略挂起键的按下事件,不会执行挂起操作。HandleHibernateKey=ignore这个配置项决定了当用户按下休眠键时系统的行为。设置为ignore时,系统将忽略休眠键的按下事件,不会执行休眠操作。HandleLidSwitch=ignore这个配置项决定了当笔记本电脑的盖子合上时系统的行为。设置为ignore时,系统将忽略盖子合上的事件,不会执行任何操作(如挂起或休眠)。HandleLidSwitchDocked=ignore这个配
     

Debian笔记本合盖后不休眠配置HandleLidSwitch的记录

作者 52txr
2025年1月19日 13:46

在前面《三种方式实现在 Linux 中禁用挂起和休眠模式》中,介绍了几种防止系统休眠的方法,其中第二条就是修改配置文件。现在我的应用场景是希望笔记本电脑在合上盖子时不执行任何操作,可以这样配置(注意删掉前面的#符号):

HandleLidSwitch=ignore

设置完成后,需要应用配置:

sudo systemctl restart systemd-logind

配置

配置项的含义

这里简单介绍一下各项的含义。

  1. HandleSuspendKey=ignore

    • 这个配置项决定了当用户按下挂起键(通常是电源按钮或键盘上的挂起键)时系统的行为。
    • 设置为ignore时,系统将忽略挂起键的按下事件,不会执行挂起操作。
  2. HandleHibernateKey=ignore

    • 这个配置项决定了当用户按下休眠键时系统的行为。
    • 设置为ignore时,系统将忽略休眠键的按下事件,不会执行休眠操作。
  3. HandleLidSwitch=ignore

    • 这个配置项决定了当笔记本电脑的盖子合上时系统的行为。
    • 设置为ignore时,系统将忽略盖子合上的事件,不会执行任何操作(如挂起或休眠)。
  4. HandleLidSwitchDocked=ignore

    • 这个配置项决定了当笔记本电脑连接到一个扩展坞(docking station)并且盖子合上时系统的行为。
    • 设置为ignore时,系统将忽略盖子合上的事件,不会执行任何操作。

其他可能的取值

  • suspend: 执行挂起操作。
  • hibernate: 执行休眠操作。
  • lock: 锁定屏幕。
  • ignore: 忽略事件,不执行任何操作。
  • poweroff: 关机。
  • reboot: 重启。
  • ✇陶小桃Blog
  • 三种方式实现在 Linux 中禁用挂起和休眠模式52txr
    前段时间把本科的旧电脑刷成了Debian,现在在运行一些脚本,但是长时间没有动静,电脑就出现了“休眠”。虽然本意是挂起和休眠模式是 Linux 系统中常见的电源管理功能,它们可以帮助节省电量。但是,但是,但是,小陶现在用这台电脑做服务器,在运行着一些东西,如果休眠了我的服务直接就是中断了。这可不行,于是就得迫使这台电脑当牛马,24小时不带停地干活。[...]
     

三种方式实现在 Linux 中禁用挂起和休眠模式

作者 52txr
2025年1月18日 21:47

前段时间把本科的旧电脑刷成了Debian,现在在运行一些脚本,但是长时间没有动静,电脑就出现了“休眠”。虽然本意是挂起和休眠模式是 Linux 系统中常见的电源管理功能,它们可以帮助节省电量。但是,但是,但是,小陶现在用这台电脑做服务器,在运行着一些东西,如果休眠了我的服务直接就是中断了。这可不行,于是就得迫使这台电脑当牛马,24小时不带停地干活。

[...]

  • ✇陶小桃Blog
  • 使用debian或者ubuntu,有必要掌握这些ufw防火墙的命令和设置52txr
    众所周知,linux 防火墙常用的包括三种:ufw 、 firewalld 和 iptables,学习难度依次递增。因为原生的 iptable 配置麻烦,学习成本较高,ufw全称 Uncomplicated Firewall 是 ubuntu提供的一个 iptables 的接口,按照直译就是“简单的防火墙”,同时支持 ipv4 和 ipv6。Centos7以上的发行版都试自带了firewalld防火墙的,firewalld去除了iptables防火墙,但是Centos7在后面已经不再被维护了,小陶也将服务器的Centos换成了Debian(见文《记腾讯云轻量服务器系统重装成Debian 12及typecho博客恢复》)。检查是否启动了UFW首先是简单测试一下你的debian或者ubuntu有没有安装ufw,如果安装了,在终端输入ufw,就会是下面这样:没有安装的话可以用下面的命令安装一下ufwsudo apt-get install ufw如果出现ufw 包已经安装,但是实际“ufw: command not found”,有可能它的某些依赖没有正确安装。可以尝试重新安装 ufw:su
     

使用debian或者ubuntu,有必要掌握这些ufw防火墙的命令和设置

作者 52txr
2025年1月18日 17:54

众所周知,linux 防火墙常用的包括三种:ufwfirewalldiptables,学习难度依次递增。因为原生的 iptable 配置麻烦,学习成本较高,ufw全称 Uncomplicated Firewallubuntu提供的一个 iptables 的接口,按照直译就是“简单的防火墙”,同时支持 ipv4ipv6Centos7以上的发行版都试自带了firewalld防火墙的,firewalld去除了iptables防火墙,但是Centos7在后面已经不再被维护了,小陶也将服务器的Centos换成了Debian(见文《记腾讯云轻量服务器系统重装成Debian 12及typecho博客恢复》)。

检查是否启动了UFW

首先是简单测试一下你的debian或者ubuntu有没有安装ufw,如果安装了,在终端输入ufw,就会是下面这样:

ufw安装

没有安装的话可以用下面的命令安装一下ufw

sudo apt-get install ufw

如果出现ufw 包已经安装,但是实际“ufw: command not found”,有可能它的某些依赖没有正确安装。可以尝试重新安装 ufw

sudo apt install --reinstall ufw

UFW的文件目录

UFW安装后可以在/etc/ufw目录下找到它的配置文件:

ufw的配置文件

这里面有很多配置文件和规则,但是请不要乱改,这里告诉其中两个文件的含义:

  • user.rules:用户自定义的ipv4规则
  • user6.rules:用户自定义的ipv6规则

常用的一些指令

(1)确认UFW状态

ufw status

(2)禁用UFW

ufw disable

(3)启用UFW

ufw enable

(4)禁止IP

ufw deny from 192.168.3.2
ufw deny from 192.168.3.0/24

(5)允许IP

ufw allow from 192.168.3.2
ufw allow from 192.168.3.0/24

(6)拦截/允许特定 IP 访问特定端口

 ufw deny from 192.168.1.0/24 to any port 80
 ufw allow from 192.168.1.0/24 to any port 80

(7)列出可用的规则

ufw status numbered

通过提供规则编号来删除该规则:

ufw delete 9

(9)重启UFW

ufw relaod

通过修改配置文件来设置规则

在前面说过,user.rules是用户自定义的ipv4规则,user6.rules是用户自定义的ipv6规则。那么就可以修改文件来设置规则。

ipv4的规则设置如下:

### tuple ### allow tcp 3306 0.0.0.0/0 any 127.0.0.0/24 in
-A ufw-user-input -p tcp --dport 3306 -s 127.0.0.0/24 -j ACCEPT

### tuple ### deny udp 1:65535 0.0.0.0/0 any 0.0.0.0/0 in
-A ufw-user-input -p udp -m multiport --dports 1:65535 -j DROP

### tuple ### allow tcp 443 0.0.0.0/0 any 173.245.48.0/20 in
-A ufw-user-input -p tcp --dport 443 -s 173.245.48.0/20 -j ACCEPT

一定要按照规则,并且排在上面的优先级会比较高:

配置规则示例

ipv6的规则设置示例如下:

### tuple ### deny udp 1:65535 ::/0 any ::/0 in
-A ufw6-user-input -p udp -m multiport --dports 1:65535 -j DROP

### tuple ### allow tcp 443 ::/0 any 2400:cb00::/32 in
-A ufw6-user-input -p tcp --dport 443 -s 2400:cb00::/32 -j ACCEPT

### tuple ### allow tcp 443 ::/0 any 2606:4700::/32 in
-A ufw6-user-input -p tcp --dport 443 -s 2606:4700::/32 -j ACCEPT

### tuple ### allow tcp 443 ::/0 any 2803:f800::/32 in
-A ufw6-user-input -p tcp --dport 443 -s 2803:f800::/32 -j ACCEPT

文件里一些关键词说明:

  • deny/allow:拒绝/允许
  • udp/tcp:协议方式
  • DROP:丢弃(也就是拒绝)
  • ACCEPT:接受(也就是允许)

需要注意,通过修改文件设置规则之后,记得重启一下UFW。

  • ✇陶小桃Blog
  • 博士拟录取之后,导师拒绝了我的push52txr
    昨天就收到拟录取的通知了,原本摸鱼摸的好好的,突然邮件“叮”一声,让我心头一紧。毕竟邮件主题只写了“复试结果”,并没有写success还是fail。怀着忐忑不安的心点开了邮件,结果是好的。虽然已经做好了如此的心理准备,但是那几秒钟还是觉得有些恍惚。我是过了一个下午才和老师说的,虽然他可能比我早知道,我还是需要建设一下心理防线。老师挺逗的,聊天有时候太客气反而聊的不知道怎么回复了:客气了一下之后就开始push老师了,但是老师拒绝了我的push。他已经跟我说了两三次“先休息休息”,但是我多少有点闲不住的,只有在陪女朋友的时候才能放在手头的事情。没能把硕导培养成院士,终究是练习了两年半的个人研究生之遗憾。读博心不那么大了,目标小一点,争取把导师培养成长江或者杰青吧。其实大家真的可以对学历祛魅,一个正常的硕博只会因为自己是个废物感到自卑,为发不出Top期刊而郁郁寡欢。那种天天嘚瑟卖弄风骚的搞高学历人设的,我觉得都可以说是“学历媛”或者“学历鸭”。我之前有很多思考,例如《读研随笔 | 所以,读博是为了什么?》、《学到凌晨四五点的研究生就是容易胡思乱想》。现在回想一下,还是回到自己的出发点:人生是
     

博士拟录取之后,导师拒绝了我的push

作者 52txr
2025年1月8日 13:33

昨天就收到拟录取的通知了,原本摸鱼摸的好好的,突然邮件“叮”一声,让我心头一紧。毕竟邮件主题只写了“复试结果”,并没有写success还是fail。

image-20250108132718091

怀着忐忑不安的心点开了邮件,结果是好的。虽然已经做好了如此的心理准备,但是那几秒钟还是觉得有些恍惚。

image-20250108132738435

我是过了一个下午才和老师说的,虽然他可能比我早知道,我还是需要建设一下心理防线。老师挺逗的,聊天有时候太客气反而聊的不知道怎么回复了:

image-20250108132801644

客气了一下之后就开始push老师了,但是老师拒绝了我的push。他已经跟我说了两三次“先休息休息”,但是我多少有点闲不住的,只有在陪女朋友的时候才能放在手头的事情。

image-20250108132818180

没能把硕导培养成院士,终究是练习了两年半的个人研究生之遗憾。读博心不那么大了,目标小一点,争取把导师培养成长江或者杰青吧。

其实大家真的可以对学历祛魅,一个正常的硕博只会因为自己是个废物感到自卑,为发不出Top期刊而郁郁寡欢。那种天天嘚瑟卖弄风骚的搞高学历人设的,我觉得都可以说是“学历媛”或者“学历鸭”。

image-20250108132841109

我之前有很多思考,例如《读研随笔 | 所以,读博是为了什么?》、《学到凌晨四五点的研究生就是容易胡思乱想》。现在回想一下,还是回到自己的出发点:人生是一场修行,一切的一切都是经历而已。

什么是修行?真正的修行不是打坐、冥想、吃素、念咒、听音乐等这些功课,而是不断的提升自己的正知正念,让自己在道的范畴内历事炼心。它跟我们普通人息息相关的,你所经历的困惑,然后从中走出来,明白了一些道理,这就是修行,说的通俗就是通过行为,来修正自己错误观点和不足,实证实修达到完满的人格和思想,以至于让自己人生达到顺利如意。

image-20250108133015893

最近2025年第一幅名画诞生了,名字叫《燕冬萍的笑》。简单来说就是女方起诉离婚,要求男方净身出户,理由是男方长年在外工作,疏于关心家庭,逼逼赖赖了7分钟,最后男方说他在外工作五年每个月打回去八千块,一分钱没留。视频最后男方抱头痛哭,女方对着视频外莞尔一笑,视频外又不知道是谁。

其实我倒不是想用“用论据证据自己论点”的方式搞男女对立,只是突然想到了我的高中数学老师,他有着完全相似的经历,哎。

image-20250108133032075

其实怎么说呢,爱情的美好一直在世间,很多事只和“是谁”有关。选择大于努力,选择一个“德才兼备、知行合一”的配偶,大概率就不会玷污爱情。

关于我的爱情观:从来不是简单的因为“心动的人出现”、“遇到对的人”,这只是起点,不是终点。腻了仍然坚定选择、讨厌了仍然坚定选择、后悔了仍然坚定选择、不能接受的也选择接受了,我不会用任何利益去计算得失,一切一切,都是因为你。爱情从来不会从天而降,也不会自然生长,一定是用“心”去打理和经营。

image-20250108133108830

今天收到学校的毕业礼物了。收拾收拾就该卷铺盖走人了。

image-20250108133138333

  • ✇陶小桃Blog
  • 【杀青篇】年年岁岁花相似,岁岁年年不负己52txr
    依旧记得高三毕业的最后一堂课,班主任在黑板写下“年年岁岁花相似,岁岁年年人不同”的时候,我是一阵惊叹,毕竟觉得班主任老伯平时挺凶挺严的,突然搞了点文艺还挺新奇。人的感悟总是具有滞后性,在和一波波人道别、遇到一波波新的朋友之后,才逐渐感悟以前口头说说、不明所以的话。写完毕业论文的致谢不算结束,答辩之后也不算结束,现在拍完毕业照片是不是就是真正的结束了呢?也许不是,也许吃完散伙饭就真的告别了,甚至以后也可能很难再凑齐一桌了。明天就要把学位服还回去了,但是一直到今天中午我连包装拆都没拆。甚至想着直接原封不动还回去得了。青春值得纪念,但是我没有什么好纪念的,我过得很幸福。现在的状态就是既麻木又幸福。同一期毕业的师兄今天刚从外地回来,甚至连学位服都还放在学院没有拿,一听说明天下午就要换衣服了,就赶紧领了学位服,红袍加身、立马临时起意、马不停蹄赶往沙河去照相。拍了一大堆照片,拍照技巧就是:多拍总有几张能看的。还有一件事就是恭喜女朋友顺利上岸了,甚至是以第一名的好成绩。这一路的进步我也是看在眼里。毕竟日常每天晚上都打一两个小时的视频,大部分时候都是在检查白天的复习成果。心疼过,焦急过,在摆烂的时候也
     

【杀青篇】年年岁岁花相似,岁岁年年不负己

作者 52txr
2025年1月6日 21:33

依旧记得高三毕业的最后一堂课,班主任在黑板写下“年年岁岁花相似,岁岁年年人不同”的时候,我是一阵惊叹,毕竟觉得班主任老伯平时挺凶挺严的,突然搞了点文艺还挺新奇。

人的感悟总是具有滞后性,在和一波波人道别、遇到一波波新的朋友之后,才逐渐感悟以前口头说说、不明所以的话。

写完毕业论文的致谢不算结束,答辩之后也不算结束,现在拍完毕业照片是不是就是真正的结束了呢?也许不是,也许吃完散伙饭就真的告别了,甚至以后也可能很难再凑齐一桌了。

明天就要把学位服还回去了,但是一直到今天中午我连包装拆都没拆。甚至想着直接原封不动还回去得了。青春值得纪念,但是我没有什么好纪念的,我过得很幸福。现在的状态就是既麻木又幸福。同一期毕业的师兄今天刚从外地回来,甚至连学位服都还放在学院没有拿,一听说明天下午就要换衣服了,就赶紧领了学位服,红袍加身、立马临时起意、马不停蹄赶往沙河去照相。

拍了一大堆照片,拍照技巧就是:多拍总有几张能看的。

实验室的合影

我和直升机的合影

和毕业师兄的合影

和大飞机的合影

还有一件事就是恭喜女朋友顺利上岸了,甚至是以第一名的好成绩。这一路的进步我也是看在眼里。毕竟日常每天晚上都打一两个小时的视频,大部分时候都是在检查白天的复习成果。心疼过,焦急过,在摆烂的时候也真的想使劲push一下。现在终于可以好好地休息休息了。永远年轻,永远在路上。打视频在给我展现学习成果的时候,我虽然关闭了麦克风,认真听讲的时候,也会截截图,留作纪念,都是成长和进步的见证。

监督女朋友复习

前几天网友奔现了一把,老家的小学弟跑来北京进行了极速版地游览。今天还在爬长城,只感觉年轻真好啊,体力旺盛。一块吃饭时左下角社恐的我只敢在角落给大佬们端茶倒水。

和网友见面

最近对“具身智能”确实挺感兴趣的,也开始朝这个方向努力。先去复现一些示例入个门看看。具身智能是由“本体”(硬件系统,例如汽车、机械臂等)和“智能体”(软件系统,例如大模型、智能算法等)耦合而成且能够在复杂环境中执行任务的智能系统,通过在物理世界和数字世界的学习和进化,达到理解世界、互动交互并完成任务的目标。其实也不算什么多么高级的概念,虽然听着牛逼。简单来说,就是想让实物更只自动、更牛马。

上交的考试成绩一直都没公布,虽然理论上不会出什么问题,但是仍在焦急等待,只有出成绩了才放心。再等等吧,估计也就这么几天了。

等待通知

  • ✇陶小桃Blog
  • Typecho/WordPress的CDN鉴权插件URLAuth1.2.0版本发布!支持任意多个域名的自定义鉴权52txr
    前天发布了Typecho的URLAuth插件,昨天发布了WordPress版本。被网友使用体验之后,直呼不错!但是有个小问题就是,上一个版本只能支持一个域名,如果自己的网站有多个资源站需要进行鉴权就不够用了。于是小陶赶紧升级了一版,一开始我在构思如何设计出来多个域名方便配置,想到了Python里的字典于是我就有了主意,决定采用key:value的配置方式。使用本插件之前,对于一些小厂,建议咨询一下CDN厂商支持TypeA鉴权(不是回源鉴权,是访问鉴权),据我所知,腾讯云CDN、阿里云CDN、华为云CDN、火山引擎、多吉云等等都是支持的,一些小厂可能就没有这个功能。插件里也写了主流CDN帮助文档的链接。插件下载本文只是个升级的通知。下载链接还在原来的地方:Typecho插件URLAuth: 进行CDN URL鉴权防盗刷,支持多吉云、腾讯云、阿里云等WordPress插件URLAuth:进行CDN URL鉴权防盗刷,所有支持TypeA鉴权的CDN均可使用插件配置主要就是域名与密钥绑定设置。务必严格按照域名:密钥,一行一个,回车键换行就行。效果可以看到设置的两个域名都添加了鉴权参数。
     

Typecho/WordPress的CDN鉴权插件URLAuth1.2.0版本发布!支持任意多个域名的自定义鉴权

作者 52txr
2025年1月5日 09:18

前天发布了Typecho的URLAuth插件,昨天发布了WordPress版本。被网友使用体验之后,直呼不错!但是有个小问题就是,上一个版本只能支持一个域名,如果自己的网站有多个资源站需要进行鉴权就不够用了。于是小陶赶紧升级了一版,一开始我在构思如何设计出来多个域名方便配置,想到了Python里的字典于是我就有了主意,决定采用key:value的配置方式。

使用本插件之前,对于一些小厂,建议咨询一下CDN厂商支持TypeA鉴权(不是回源鉴权,是访问鉴权),据我所知,腾讯云CDN、阿里云CDN、华为云CDN、火山引擎、多吉云等等都是支持的,一些小厂可能就没有这个功能。插件里也写了主流CDN帮助文档的链接。

插件下载

本文只是个升级的通知。下载链接还在原来的地方:

Typecho插件URLAuth: 进行CDN URL鉴权防盗刷,支持多吉云、腾讯云、阿里云等

WordPress插件URLAuth:进行CDN URL鉴权防盗刷,所有支持TypeA鉴权的CDN均可使用

插件配置

主要就是域名与密钥绑定设置。务必严格按照域名:密钥,一行一个,回车键换行就行。

一行一个

wordpress插件配置

效果

可以看到设置的两个域名都添加了鉴权参数。

添加鉴权参数

测试添加鉴权参数

❌
❌