利用deepseek,一晚上迭了超过30代,也算过了一把wordpress插件瘾
一直以来都是网站爱好者,就算说现在搞网站的越来越少,但是这个持续了20年左右的爱好,却一直没放下,从html代码到joekoe到再到discuz、phpcms再到现在唯一留存的wordpress,一 ...
一直以来都是网站爱好者,就算说现在搞网站的越来越少,但是这个持续了20年左右的爱好,却一直没放下,从html代码到joekoe到再到discuz、phpcms再到现在唯一留存的wordpress,一 ...
有时候我还真不明白,为什么现在大家把AI吹得那么牛逼。因为就是我的使用体验而言,我觉得在写代码的时候,AI真的是挺糟糕的.我用的AI是Deepseek。
理论上无论我用的是什么AI,它们都应该是写代码的高手,无论是写什么类型的代码都应该没什么问题。我这么低端的用户,也不会提出一些什么高端的要求,但事实证明,不知道是我提要求提的不够精准还是怎么着,反正出来的结果我个人感觉基本上没有一次就能符合我的要求。有些时候的确能接近生成我想要的结果,但更多时候那串代码当你复制下来运行的时候会发现根本运行不了。对一个什么都不知道的小白在代码运行不了的时候可以怎么办呢?换一个AI继续提问继续复制粘贴?但如果这个AI有问题,其它AI会不会也有问题呢?为什么人家觉得那个玩意那么神奇,但我自己的使用体验却那么差呢?是不是因为AI已经判断出我这个人是个挑剔的完美主义者,所以故意给我些有瑕疵的东西?每一次都有瑕疵,每一次的瑕疵都说不准在什么地方,幸好绝大多数情况之下,我要的不是AI的全过程,我只是要参考一下它的思路而已。当我要求它给我写某个代码的时候,实际上我更看重的是它用什么途径,而不是它的代码具体是什么。如果它的代码能顺利运行,那当然好,但实际上我感觉一次性就能成功运行的几率可能不足10%。
当我给出一串数字,要求它给我做数据分析。噼里啪啦一大段字很牛逼,一贴进去发现根本出不了结果,仔细看Python的那些错误代码,原来一开始那个屌丝把原始数据都给我整没了一些,因为长度不对,所以整不出结果。我要用Excel的公式实现某些功能,的确噼里啪啦有好多个方案。有些方案一看就直接可以忽略,因为又长又臭,另外一些我感觉有些希望的却发现到Excel里面同样也是出不了结果。至于为什么我也不去纠结了,我直接去研究这些方法的思路到底是什么。我让它用Power Query,也就是M语言给我实现某个功能,结果发现把那堆代码贴到高级编辑器,甚至都无法按确定提交,因为显示语法错误。那个编辑器是一个神经的存在,说语法错误,但定位的那个点实际上没有问题,但那个问题到底在哪里,你得人肉上下文去找。我使用的通常是对半检索法,首先留一半,然后一半的一半。理论上是这么找的,但实际上后面某些功能不要我觉得都无所谓,所以我只要找到那些我需要的就可以了。最终发现,某个用了函数的地方,理论上应该是“=>”。DS给我的代码是“->”。如果这份代码是由图片识别过来的,出现这种等号变成减号,我觉得可以理解,但显然这种事情怎么可能发生?!对一个什么都不懂的人来说,你叫他怎么可能人肉找得出这样的低级错误呢?!那个代码除了那个等号变成了减号以外,最后的结果还有一些无厘头的数据合并,那些数据在前面几个步骤里面已经不复存在了,在最后那个步骤又突然间被提起,真牛逼!
在这种情况下,说AI可以取代人类完成编程,我觉得起码暂时是不行的,尤其是要实现一些高度定制的功能的时候。
一文看懂 Sigma 函数:因子分解的终极威力! σ(n) 完全解析:为什么求和函数能“自动”变成乘积? 数学之美:Sigma 函数的推导、公式与 Python 实现 从几何级数到质因数:Sigma 函数的魔法公式大揭秘 搞懂 σ(n) 的那一天,我看到了数学的秩序 为什么 σ(n) = 乘积?带你走进数论的核心思想 Divisor 终极指南:Sigma 函数推导 + 代码 一篇搞定Sigma 函数,记作 [math]\sigma(n)[/math],表示一个整数所有正因子的和。 例如 12 的因子有 1、2、3、4、6、12,因此 [math]\sigma(12)=28[/math]。 本文解释什么是 Sigma 函数、为什么它满足乘法性、如何从质因数分解推导出通用公式,并给出高效的 Python 实现。
def sigma(n: int) -> int:
"""高效计算因子和函数 σ(n)。"""
total = 1
x = n
# 处理质因数 2
count = 0
while x % 2 == 0:
x //= 2
count += 1
if count > 0:
total *= (2 ** (count + 1) - 1) // (2 - 1)
# 处理奇质数
p = 3
while p * p <= x:
if x % p == 0:
count = 0
while x % p == 0:
x //= p
count += 1
total *= (p ** (count + 1) - 1) // (p - 1)
p += 2
# 若剩下的是质数
if x > 1:
total *= (x**2 - 1) // (x - 1)
return total
一大早收到腾讯云漏洞通知的邮件,显示 1Panel 命令注入漏洞 CVE-2025-54424,等级是高危,查了下这是 V2 版本才有的漏洞,我 V1 你提示个 der?
不过几个服务器基本都是 Proxy 用,没放什么东西,看了下官方更新记录 V2.0.6 已经修复了这个问题,索性花一点时间把 1Panel 升级到 V2 尝尝鲜。

CVE-2025-54424 目前影响返回仅 V2.0.0 ~ V2.0.5,V1 用户不在此次楼都影响范围内,可以不用升级。当然跟我一样想升级 V2 尝鲜除外。
因为我现在还是 V1.10.32,所以还得先想办法升级到 V2 再升级 2.0.6,好在查了下官方已经有迁移脚本了:
升级有风险,操作需谨慎。一切操作请提前备份好文件或创建磁盘快照。
此处以 X86 架构为例,升级版本为 v2.0.6,如果使用其它加购或要升级到其它版本请参考官方数据迁移脚本 1panel-migrator:
# 1. 进入临时目录
cd /tmp
# 2. 下载适用于您服务器架构的二进制文件(以 amd64 架构为例)
wget https://gitee.com/fit2cloud-feizhiyun/1panel-migrator/releases/download/v2.0.6/1panel-migrator-linux-amd64
# 3. 添加执行权限
chmod +x 1panel-migrator-linux-amd64
# 4. 移动至系统 PATH 中并重命名
mv 1panel-migrator-linux-amd64 /usr/local/bin/1panel-migrator
V2 版本开始,1Panel 划分了主节点和从节点,简单解释如下:
| 主节点 | 从节点 |
| 支持外部访问 包含 1panel-core 和 1panel-agent 两个服务包含V1社区版所有功能 | 受主节点管理,不支持外部访问 仅包含 1panel-agent 服务没有付费购买专业版就可以忽略这个功能了 |
升级过程分为两步:升级服务 和 升级网站,务必先完成服务升级,再进行网站升级。
# 升级服务
1panel-migrator upgrade core
# 升级网站,需确保 V2 服务启动成功后再执行该命令。
1panel-migrator upgrade website
升级指令参见:upgrade.md,过程其实还算顺利,只是我也遇到了一些问题,在此也记录一下我的修复方案,仅供参考:
这是因为V2开始支持多个PHP网站共用一个PHP容器了,是一个比较大的改动升级,升级1Panel后建议卸载旧的PHP运行环境,重新安装一个新的PHP运行环境,再编辑网站重新设置PHP版本即可。
此处也是V2版本的一处大改动,重新开启缓存即可。
-bash: docker-compose: command not found 相关错误?遇到这个问题首先试一下 docker compose --version 能否执行,如果可以建议直接挂在软链接 sudo ln -s $(which docker) /usr/local/bin/docker-compose 重试,否则可能需要重新安装compose。
migrator v1 to v2 core failed, err: SQL logic error: no such table: mcp_servers (1) 相关错误?这个错误是我 飞牛NAS 里的 1Panel 升级时遇到的,因为飞牛应用商店安装的 1Panel 版本非常陈旧,当初根据飞牛论坛的帖子升级到 V1 最新版后一直没有发现问题,但是其实升级后的 1Panel 是没有 AI 菜单的。
根据错误信息我搜索到了 1Panel 论坛有相关的帖子以及修复方案:
# 下载新版v1 1Panel
wget https://resource-fit2cloud-com.oss-cn-hangzhou.aliyuncs.com/1panel/package/stable/v1.10.32-lts/release/1panel-v1.10.32-lts-linux-amd64.tar.gz
# 解压
tar -xzvf 1panel-v1.10.32-lts-linux-amd64.tar.gz
# 然后找到其中的 1panel 二进制文件 替换到你 /usr/loca/bin 下面 然后重启
需要注意的是如果你是 飞牛NAS 应用商店安装的 1Panel 可能重启后会发现依然没有 AI 菜单,此时可以尝试拷贝 1panel 文件到 /vol1/@appcenter/1Panel/bin 再重启应该就有AI菜单并可以升级了。
虽然虚惊一场,但是也借此机会花了大概一早上的时间。将三台服务器的 1Panel 升级到了 V2,前段时间把博客丢到 NAS 里了,结果今天因为 Q4 那个问题导致博客宕机了一上午,不过问题不大,总算都升级完毕了。
参考链接
最近主题想实现一个分享链接自动解析 URL,并以卡片形式展示目标链接内容的功能,几经调研发现这个需求早在10多年前就已经有相应的标准了,它就是有 FaceBook 提出的 OpenGraph 协议(开放图谱协议)
我们知道,构建一个网站采用的技术和实现方式并不相同,普通方法无法完美地解析目标页面的基本信息,导致没有 OpenGraph 协议时分享的链接展示形式相当有限,而且看起来没有非常大的点击欲望。
OpenGraph 协议简单来说就是向网页 head 下插入一些统一标准的 meta 元信息,支持标题、描述、缩略图等信息,大大方便了第三方网站和应用地解析出目标页面的基本信息,并加以优化展示链接的目标页面,使其点击率可以大大提升。
比较直观的讲就是,网页只需要加入 OpenGraph 元信息,当页面被分享到微博、FB、Twitter 时,URL 会被智能地解析成一个非常精美地卡片显示:

了解了这么多,我们自己的网站和应用如果想要优化链接展示让然也可以读取 OpenGraph 元信息。
其中PHP就可以使用 get_meta_tags 方法从一个URL中提取所有的 meta 标签 content 属性,并返回一个数组:
<?php
$tags = get_meta_tags('https://biji.io/about');
// 注意所有的键(key)均为小写,而键中的‘.’则转换成了‘_’。
echo $tags['title'];
echo $tags['description'];
echo $tags['image'];
echo $tags['geo_position'];
?>
// 附加元信息
function head_append_meta() {
$metas = [
'og:title' => get_the_title(),
'og:site_name' => get_bloginfo( 'name' ),
'og:type' => 'website',
];
if ( is_single() || is_page() ) {
$metas['og:url'] = get_permalink();
$metas['og:description'] = get_the_excerpt();
if ( has_post_thumbnail() ) {
$meta_image_url = wp_get_attachment_image_src( get_post_thumbnail_id(), 'full' );
if ( $meta_image_url ) {
$metas['og:image'] = $meta_image_url[0];
}
}
$metas['og:type'] = 'article';
}
foreach ( $metas as $key => $value ) {
echo '<meta property="' . $key . '" content="' . $value . '" />' . "\n";
}
}
add_action( 'wp_head', 'head_append_meta', 1 );
当然,你也可以访问 The Open Graph protocol (ogp.me) 来了解所有 OpenGraph 元信息和其含义,并灵活地运用到你的网站上。
可以 FaceBook 的分享调试器来调试和预览 OpenGraph 元信息展示能力:分享调试器 - Facebook 开发者
本文参考资料:
【WordPress教程】 什么是 Open Graph(property=”og:type”)_细说外贸推广_杭州 SEO 研究_ISEOer (rrdaj.com)
前端应该知道的:开放图谱协议(The Open Graph protocol) - SegmentFault 思否
The Open Graph protocol (ogp.me)
Image()函数将会创建一个新的HTMLImageElement实例。它的功能等价于 document.createElement('img')
正常情况下,我们使用下面方法加载图片,是能能够获取到onload事件的:
const img = new Image();
img.src = 'picture.jpg';
img.onload = () => {
console.log('success');
}
但是如果你需要加载的图片是base64图片时,可能是因为没有请求发出,onload事件是无法执行的。
几经尝试,最终考虑将base64图片转位ObjectUrl再加载,好处是无需后端,纯前端即可兼容。移动端兼容性也非常不错。
具体实现如下:
// base64转Blob
const base64ToBlob = (base64Data) => {
const arr = base64Data.split(','),
type = arr[0].match(/:(.*?);/)[1],
bstr = atob(arr[1]),
len = bstr.length,
u8Arr = new Uint8Array(l);
while (len--) u8Arr[l] = bstr.charCodeAt(len);
return new Blob([u8Arr], { type });
}
const base64 = "data:image/gif;base64,R0lGODlhAQABAIAAAP///wAAACH5BAEAAAAALAAAAAABAAEAAAICRAEAOw==";
const imgBlob = base64ToBlob(base64)
const img = new Image();
img.src = window.URL.createObjectURL(imgBlob); // blob:http://xxx
img.onload = function () {
console.log('success')
}
URL.createObjectURL 可能有一些兼容性问题,如果你在使用过程遇到,可以hack兼容一下
function getObjectURL(blob) {
var url = null;
if (window.createObjectURL != undefined) {
url = window.createObjectURL(blob);
} else if (window.URL != undefined) {
url = window.URL.createObjectURL(blob);
} else if (window.webkitURL != undefined) {
url = window.webkitURL.createObjectURL(blob);
}
return url;
}
本文参考资料:
Image() - Web API 接口参考 | MDN (mozilla.org)
使用img.onload事件加载base64图片的兼容问题 - 简书 (jianshu.com)
vue 上传图片,转base64取不到.onload的值 - 小蘑菇123 - 博客园 (cnblogs.com)
2017年6月20日(v1.0.9)起,主题的更新、发布就已经迁移到了Github,通过Github收集了48条issues、16条PR以及340多个Star,非常感谢关注和使用Adams主题的每一位博主。
虽然我的博客已经近3年没有新的文章产出了,但是博客里的每一条留言我都有认真在看,每一个问题我也都尽可能的给予回复并尝试提供解决方案。Github也尽可能的去解决每一个issues,这篇文章仅仅是记录主题现有问题收集,以及更新计划。
暂时就这么多吧,这是一篇2018年11月19日的草稿改的一篇水文,希望还够解渴。
6.1快乐