阅读视图
WP 访客信息插件 v16.03.55
我把插件改了个名字,不再叫“WP-UserAgent”了,现在这个东西经过多次迭代,加了很多乱七八糟的东西,显示的重点也不再是评论的ua信息了。
前几天看到关于ip2region的介绍,于是又尝试集成了一次,集成之后发现效果也没有好更多,原来的v6归属地从青岛跑到北京了:
免费版的数据和商业版数据差距依然很大,其实包括纯真之类的也是一样套路,如果数据一样谁还会买商业版呢。尽管如此,我还是给加上了,同时更新了下纯真的数据库。
目前效果就是上面的样子,感兴趣的可以尝试下。
插件代码:
https://cnb.cool/oba.by/wp-useragent
最新版(插件包含多个ip数据库,尽量使用ftp或者scp上传,wp后台上传可能失败):
https://cnb.cool/oba.by/wp-useragent/-/releases/tag/16.03.55
The post WP 访客信息插件 v16.03.55 appeared first on obaby 𝐢𝐧⃝ void.
Redis开篇
栏目持续更新中
一、Redis概述
Redis即Remote Dictionary Server(远程字典服务)是完全开源的,使用ANSIC语言编写的,遵守BSD协议的高性能的Key-Value数据库。Redis提供了丰富的数据结构,例如String、Hash、List、Set、ZSet等等。数据是存在内存中的,同时Redis支持事务、持久化、LUA脚本、发布/订阅、缓存淘汰、流技术等多种功能特性,提供了主从模式、Redis Sentinel和Redis Cluster集群架构方案。

Redis的作者是意大利程序员Antirez,作者个人博客:https://antirez.com/latest/
Redis的官网是:https://redis.io,源码位于GitHub上:https://github.com/redis
二、Redis的主要用途
配合关系型数据库快速读取
主流应用基本都是80%的读取和20%写入,Redis拿来配合MyMQL等实现读写分离,MySQL数据存储在硬盘,关系型数据库需要执行复杂SQL,相比下Redis基于内存和按key读取明显效率更高,Redis在一些场景下的使用明显优于MySQL,例如计数器,排行榜,抢红包等。Redis通常用于一些特定场景,需要与MySQL一起配合使用,两者并不是相互替换和竞争关系,而是共用和配合使用
分布式锁
synchronized关键字和各种锁只能在一个JVM进程中有效,多服务器的集群环境下利用Redis的单线程特点,可以做分布式环境下的并发控制队列
Reids提供list和set操作,这使得Redis能作为一个很好的消息队列平台来使用。我们常通过Reids的队列功能做购买限制。比如到节假日或者推广期间,进行一些活动,对用户购买行为进行限制,限制今天只能购买几次商品或者一段时间内只能购买一次,也比较适合适用。
消息中间件
Reids具有发布订阅消息功能,因此可以作为一个简单的消息中间件来使用,例如修改了数据字典后通知应用程序执行刷新缓存的方法
分布式会话
将session或token对应的用户信息保存到Redis,实现集群环境下会话共享
三、Redis的优势
性能极高
Redis能读的速度是110000次/秒,写的速度是81000次/秒
数据类型丰富
不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储
支持数据的持久化
可以将内存中的数据保持在磁盘中重启的时候可以再次加载进行使用Redis支持数据的备份,即master-slave模式的数据备份
四、Redis版本历史
- 2009,诞生
- 2010,1.0,Redis Data Types
- 2012,2.6,Lua,PubSub,Redis Sentinel V1
- 2013,2.8,Redis Sentinel V2,IPv6
- 2015,3.0,Redis Cluster,GEO
- 2016,4.0,RDB,AOF
- 2017,5.0,Stream
- 2020,6.0,ACLs,SSL,Threaded I/O
- 2022,7.0,ACLv2,Redis Functions,listpack代替ziplist,Multi-part AOF
五、Redis版本规则
Redis版本号第二位是奇数的为非稳定版本,例如2.7、2.9、3.1。第二位是偶数的为稳定版本,例如2.6、2.8、3.0。当前奇数版本就是下一个稳定版本的开发版本,例如3.0就是2.9的稳定版,2.9就是3.0的开发版。
根据官网安全漏洞提示,升级redis6一定要选择6.0.8以上版本,或者直接升级到7。
六、Redis7新特性
多AOF文件支持
7.0版本中一个比较大的变化就是aof文件由一个变成了多个,主要分为两种类型:基本文件(base files)、增量文件(incr files),请注意这些文件名称是复数形式说明每一类文件不仅仅只有一个。在此之外还引入了一个清单文件(manifest)用于跟踪文件以及文件的创建和应用顺序(恢复)
Config命令增强
对于Config Set和Get命令,支持在一次调用过程中传递多个配置参数。例如我们可以在执行一次Config Set命令中更改多个参数: config set maxmemory 10000001 maxmemory-clients 50% port 6399
限制客户端内存使用 Client-eviction
一旦Redis连接较多,再加上每个连接的内存占用都比较大的时候,Redis总连接内存占用可能会达到maxmemory的上限,可以增加允许限制所有客户端的总内存使用量配置项。
redis.config中可以用两种配置形式:指定内存大小 maxmemory-clients 1g、基于maxmemory的百分比 maxmemory-clients 10%listpack紧凑列表调整
listpack是用来替代ziplist的新数据结构,在7.0版本已经没有ziplist的配置了(6.0版本仅部分数据类型作为过渡阶段在使用),listpack已经替换了ziplist类似hash-max-ziplist-entries的配置
访问安全性增强ACLV2
在redis.conf配置文件中,protected-mode默认为yes,只有当你希望你的客户端在没有授权的情况下可以连接到Redis Server的时候可以将protected-mode设置为no
Redis Functions
Redis函数,一种新的通过服务端脚本扩展Redis的方式,函数与数据本身一起存储。
RDB保存时间调整
持久化文件RDB的保存规则发生了改变,尤其是时间记录频度变化
命令新增和变动
1.ZSet(有序集合)增加ZMPOP、BZMPOP、ZINTERCARD 等命令。
2.Set(集合)增加SINTERCARD命令。
3.LIST(列表)增加LMPOP、BLMPOP,从提供的键名列表中的第一个非空列表键中弹出一个或多个元素。性能资源利用率、安全性等改进
自身底层部分优化改动:Redis核心在许多方面进行了重构和改进:
1.主动碎片整理V2:增强版主动碎片整理,配合Jemalloc版本更新,更快更智能,延时更低。
2.HyperLogLog改进:在Redis5.0中,HyperLogLog算法得到改进,优化了计数统计时的内存使用效率,7.x更好的内存统计报告。
3.如果不为了API向后兼容,我们将不再使用slave(奴隶)一词(政治正确)
七、Redis基础篇
使用Redis前需要编译安装以及进行基本的配置,Redis的编译安装、运行,基本配置和客户端命令使用具体见:
7.1 数据结构
Redis的数据结构指的是Value的数据结构类型,Key都是字符串。Redis官网的介绍:https://redis.io/technology/data-structures/
截止到目前的7.x版本,Redis共有10大数据结构,常用的经典数据结构类型有String、List、Hash、Set、ZSet
| 序号 | 文章名 | 概述 |
|---|---|---|
| 1 | Redis数据结构之String | 字符串 |
| 2 | Redis数据结构之List | 列表 |
| 3 | Redis数据结构之Hash | 哈希表 |
| 4 | Redis数据结构之Set | 集合 |
| 5 | Redis数据结构之ZSet | (SortedSet) 有序集合 |
Redis进化过程中又陆陆续续推出了GEO、HyperLogLog、Bitmap、Bitfleid、Stream这几种更加高级的数据结构
| 序号 | 文章名 | 概述 |
|---|---|---|
| 1 | Redis数据结构之HyperLogLog | 用来做基数统计的算法 |
| 2 | Redis数据结构之GEO | 地理空间 |
| 3 | Redis数据结构之Bitmap | 位图,二进制位的bit数组 |
| 4 | Redis数据结构之Bitfleid | 位域 |
| 5 | Redis数据结构之Stream | 流,主要用于消息队列 |
参考
- 尚硅谷Redis零基础到进阶,作者:尚硅谷,哔哩哔哩,2023.02.21
To Understand AI, I Studied the Human Brain
从“苦读教程”到“听 AI 播客”
路虽远,行则将至:写在蒋羿抵达山海关之际
语音输入法的爆发前夜
用了一周豆包,我还是换回了微信输入法
死磕两晚:一篇硬核教程背后的“体力活”
聊聊 Claude Code:它不是工具,它是实习生
国内也能用!Claude Code 完整上手指南
体检、投篮、搞 PC 版同步 - 周六琐记
开源免费:我的公众号封面图生成器
到账 24.87 元
devlog:让 Claude Code 帮你记录每一天的工作
来自自恋狂的瞎折腾
作为一个超级丰满的女子,依然阻挡不住自己的自恋,要把照片放到每一个地方。啊,你问为什么?还不是因为自恋嘛!
Moe-Counter Baby版
这个东西其实用了很久了,直到前段时间重建之后才发现这个东西竟然也更新了。并且增加了很多样式,为了拥抱这些样式直接重新构建了一版。原来的版本依赖有点问题,于是顺手给改了以下,提交了一份新的代码:https://gitee.com/obaby/moe-counter
主要问题在于sqllite依赖的问题,修改package.json 改成下面的版本就行了:
"dependencies": {
"better-sqlite3": "^12.6.2",
"compression": "^1.8.0",
"dotenv": "^16.5.0",
"express": "^4.21.2",
"image-size": "^0.8.3",
"mime-types": "^2.1.35",
"mongoose": "^8.15.1",
"pug": "^3.0.3",
"zod": "^3.25.61"
},
重新编译:
# 1. 配置镜像源 pnpm config set registry https://registry.npmmirror.com export npm_config_disturl=https://npmmirror.com/dist export npm_config_node_gyp_mirror=https://npmmirror.com/dist # 2. 删除旧的依赖并重新安装(使用新版本) rm -rf node_modules pnpm-lock.yaml # 3. 重新安装依赖(会自动安装 better-sqlite3@12.6.2) pnpm install # 4. 如果安装后还是找不到 bindings,手动编译 cd node_modules/.pnpm/better-sqlite3@*/node_modules/better-sqlite3 npm run build-release cd ~/Moe-Counter
顺手把里面应用的jsdeliver的链接也给换了,毕竟这个东西在国内访问问题还是蛮多的。
自恋版计数器:
当然啦,为了做这些图也着实废了一番功夫:

最开始是上面的,生成一堆,但是分辨率不高。还有个问题那就是ai不识数,总是会少数字。
后来尝试单个生成,但是ai的数字分辨能力依然跟智障一样。生成了很多乱七八糟的数字:
至于怎么安装主题,那就更简单了,把图片按照0-9整成gif,弄个文件件放到theme下面,重启服务就ok啦。
UserAgent 系统版本号
浏览器的ua在某个时间点之后,操作系统的版本号就固定在了某个特定的值:
windows是Windows NT 10.0
mac是Intel Mac OS X 10_15_7
其实,这个现在已经变成了一个通用的作法,参考:https://bugs.webkit.org/show_bug.cgi?id=216593
这个东西以后大概率也不会更新了,为了让ua显示准确数值,之前修复了win11的识别问题,昨天有点时间,又处理了下osx的识别。但是在mac下目前safari无法获取系统版本信息,暂时没什么解决方案。
主要方法也简单:
1.在提交表单的时候判断操作系统,针对win 和mac 传递一个隐藏字段
////////////////////////////////////////////////////////////////////////////////////////////////
// macOS 主版本号与版本名称映射(15 Sequoia 2024-09-16,26 Tahoe 2025-09-15)
// By:obaby
// 2026-02-04
// https://oba.by
// https://zhongxiaojie.cn
////////////////////////////////////////////////////////////////////////////////////////////////
var macVersionNames = {
10: "macOS 10",
11: "Big Sur",
12: "Monterey",
13: "Ventura",
14: "Sonoma",
15: "Sequoia",
26: "Tahoe"
};
function setOsVersionInput(elementId, value) {
var el = document.getElementById(elementId);
if (el !== null) el.value = value;
}
try {
navigator.userAgentData.getHighEntropyValues(["platformVersion"])
.then(ua => {
var platform = navigator.userAgentData.platform;
if (platform === "Windows") {
var major = parseInt(ua.platformVersion.split('.')[0], 10);
if (major >= 13) {
setOsVersionInput("comment_windows_version", "win11");
console.log("Windows 11 or later");
} else if (major > 0) {
setOsVersionInput("comment_windows_version", "win10");
console.log("Windows 10");
} else {
console.log("Before Windows 10");
}
} else if (platform === "macOS" || platform === "Mac OS") {
var parts = ua.platformVersion.split('.');
var major = parseInt(parts[0], 10);
var minor = parseInt(parts[1] || '0', 10);
var versionLabel = major >= 11 ? (macVersionNames[major] || "macOS " + major) : "macOS 10." + minor;
// setOsVersionInput("comment_mac_version", versionLabel);
setOsVersionInput("comment_windows_version", "Mac OS X " + major + "_" + minor);
console.log("Value: " + "Mac OS X " + major + "_" + minor);
console.log("macOS:", versionLabel, "(" + ua.platformVersion + ")");
// 15 及之后单独标记,便于统计/兼容判断
if (major >= 15) {
setOsVersionInput("comment_mac_15plus", "1");
console.log("macOS 15+ (Sequoia or later):", versionLabel, "(" + ua.platformVersion + ")");
} else {
console.log("macOS:", versionLabel, "(" + ua.platformVersion + ")");
}
} else {
console.log("Not Windows or macOS:", platform);
}
});
} catch (e) {
console.log("OS version detection: Not Supported");
}
2.在wp接受到评论的时候,提前针对ua进行处理,针对传递的特殊的ua进行替换
// 钩子函数,在评论提交前调用
add_filter('pre_comment_user_agent', 'block_specific_user_agent');
function block_specific_user_agent($user_agent) {
// 这里设置你想要阻止的用户代理字符串
// $blocked_ua = 'BadBot/1.0';
// // 如果用户代理匹配,返回一个空字符串来阻止评论
// if (strpos($user_agent, $blocked_ua) !== false) {
// return '';
// }
if (isset($_POST['comment_windows_version']) && $user_agent) {
$raw = trim($_POST['comment_windows_version']);
// 白名单校验,防止 XSS/脏数据:只允许 'win11' 或 "Mac OS X 主_次" 格式
if ($raw === 'win11') {
$user_agent = str_replace('Windows NT 10.0', 'Windows NT 11.0', $user_agent);
} elseif (preg_match('/^Mac OS X\s+(\d+)(?:[_\.](\d+))?$/i', $raw, $m) && strlen($raw) <= 32) {
$major = (int)$m[1];
if ($major > 10) {
$allowed = true;
$user_agent = str_replace('Intel Mac OS X 10_15_7', $raw, $user_agent);
}
}
}
// 否则,返回原始的用户代理字符串
return $user_agent;
}
显示归属地的插件无需任何修改,会自动显示正确的版本。
The post 来自自恋狂的瞎折腾 appeared first on obaby 𝐢𝐧⃝ void.
👗V👗
感觉《2077》在电脑硬盘上已经躺了很长的时间,前几天加载存档的时候发现上个存档竟然还停留在22年,在记忆里似乎并没有那么久没玩过。再次加载完游戏,一切那么陌生又熟悉。似乎V也已经等了我很久了。
这20年发售的游戏,到现在已经6年了。这6年时间里,自己仅仅玩了36个小时,整体进度才不到20%。之前的剧情都已经淡忘了,记不清楚之前经历过什么,连现在的任务都不清楚。只是隐约记得,V出现在这个叫做夜之城的地方,脑子里的芯片里还住着另外一个人-银手。剩下的都记不清楚了,只是直到V要不惜一切代价的活下去,用尽所有的方式。
我的如同金鱼般的的记忆力,无法支撑我写长的游戏记录文章。然而,不管是看电影还是玩游戏,有时候难免会带入到主角的视角,或许从某个程度上来说,rpg游戏的走向也是玩家的游戏走向,甚至不知不觉中就影响了游戏的发展进程。当然有的时候也会刻意选择一些与自己想法完全相反的选项,而这时,多数的目的是为了达成另外一个结局。
6年的时间,我没能让游戏有任何一个结局。年轻的时候,拿到一款游戏总是能快速的达成一个结局,哪怕不是最好的,cod系列的游戏,普通难度的通关时间一般都在80个小时左右,作为一个手残党,能两周左右通关也确实需要付出点努力。当时,玩游戏的时候,有个大学同学总是说,玩游戏当然是选择老兵难度-困难。最高难度,三枪毙命对我来说着实有些扛不住。几年前还能跟朋友一起玩l4d最高难度,通宵的玩,看着那一波波的僵尸袭来,尤其是witcher的笑声,不管听到多少次总是感觉那个快速袭来的僵尸就在身后。如果awp不能远距离解决掉,最后大概率就是别开膛破肚。后来,偶尔还是连线上的服务器,只是再也找不回原来的感觉了。当然,我更喜欢的是里面换的洛丽塔的小裙子,打僵尸的时候都可可爱爱萌萌哒。
现在把她重新拾起来,没有结束,总是有点始乱终弃的感觉。虽然完成了换装游戏,服饰确多数没有达到自己的预期。经过几天的折腾,总算是有能看过眼的了。
这种换装方式,其实依然是属于外挂的范畴了,虽然是叫做mod。内心总是有种感觉,哪怕是游戏里也要打扮的美美哒,如果不美,那就酷酷的。
我在游戏里的选择,决定了V的未来,然而,现实中自己的人生也得自己去选择。多数时候其实跟游戏里区别并不大,在没有攻略的情况下,对于每个选择,并不知道这个选择是对是错。
最近乱七八糟的事情视在太多,甚至连闺蜜圈迭代目前都暂停了。没有时间去维护或者开发更多的功能,公司的屎山代码,每天都在爆出各种问题和bug,处理起来焦头烂额。年关将近,乱七八糟的事情也实在是多。想清闲也是片刻闲暇都没有。
昨天下班的时候,宝子的小姨说,宝子姥姥手疼,都没法正常生活了。下午的时候,宝子的小姨跟她一起去医院检查了以下,抽了积液,注射了药物。晚上带着宝子,从小姨家接姥姥回家。宝子上课外托管回来的时候已经有些晚了,路上提到宝子的晚饭,从餐厅买的水饺。
让姥姥尝试一个,她一口回绝:『我不吃,外面的东西要加各种调料,大油什么的,我不放心不吃!』
『你就试一个』我继续劝。
『不吃,不能顾此失彼,我好不容易降血脂,又吃大油,不吃。本来明天要买里脊的,炸肉,我现在买不了了,等周末吧』
我答复:『没事,不用你管了,我明天去买,全部我自己炸行了,不用你管了』
『本来明天要包水饺的,也不包了吧,现在这个状况,三天不能碰水。等过年能包就行了』
『咱们能不包了吗?直接买现成的?』我问。
『不行,买的不放心,我还是得自己包』她继续坚持。
到门口宝子跟姥姥下车之后,我跟对象去停车。
『现在这个无解了,犟种无药可救』我说。
『现在也没必要可怜她,都是他自己找的』对象答到。
『要不这样吧,咱们买现成的,她自己吃自己包,吃几个包几个。我是无所谓的,我觉得买的速冻的也挺好吃的』
『也只好如此了』
相对于V的宏大叙事,我的生活就在这中鸡毛蒜皮的小事中慢慢蹉跎。你不让她干,她忍不住,自己去干了,又开始埋怨我们不关心她,不带她去看医生。宝子姥姥总是说什么自己小姐身子,丫鬟命。现在没人让她当丫鬟,很多事情也完全可以不用干。只是,可能是出于父母的本能去做了一些事情。
只是现在,我不想在过多干预这种事情了,都是自己的选择。付出自然是令人感动,但是那种自残式的付出,大可不必。自己身体收到残害,还道德绑架自己的子女。
小的时候,总是有各种狂妄的梦想。现在,这些梦想却都成空了。平平无奇,作为一个普通人,在这个泥淖里挣扎,尽量不让沼泽吞没自己。
宝子报了寒假的托管班,第一天就交到了新的朋友。应该在一起也玩的蛮开心的,我经常跟宝子说,咱俩换换吧。我去替你上学,你去上班。真的挺羡慕现在宝子的生活的。有时候虽然慢吞吞的,我也会叨叨。但是,跟自己小的时候完全不一样。
有时候也在想,自己的人生什么时候变得这么无趣了。单调枯燥,一成不变有时候也蛮好的,唯一和游戏里一样的。
那就是充满了利益利用和各种欺骗。只是,自己不用跟V一样真的去出生入死。
而至于游戏的终点,所有人都一样,那就是死亡。
这么一想反而也就释然了,这瞬间的得失又有什么关系呢。未来的路,说长也长,说短也短。
人生,能有几个6年。
The post 👗V👗 appeared first on obaby 𝐢𝐧⃝ void.










