阅读视图

发现新文章,点击刷新页面。

解决罗技 G304 鼠标按键连点问题,续命成功!

往前翻了几下,我这台罗技 G304 鼠标是 2021 年配台式机时从咸鱼购入的,当时花了一百多买的“仅拆封”二手机器。上手后完全颠覆了我对无线鼠标的刻板印象:G304 响应速度极快,用来玩 FPS 游戏毫无压力。不仔细对比的话,甚至可以说性能完全不输有线鼠标。

然而,用了一段时间后,这台鼠标也不出意外地出现了“通病”:左键偶尔会连点双击。每次遇到这种情况,我都会用力敲击几下,结果问题竟然会暂时缓解——所谓大力出奇迹!就这样,这台 G304 在“击打修复”的神操作下,稳定地陪伴我到了现在。其间,它经历了无数“灾难性”场景:从一两米高处摔下无数次,变成我儿子的玩具,甚至当过他的磨牙棒……但它依然坚挺,实在是又耐用又抗揍。

不过,由于它被啃了几口,底部的胶垫损坏了,导致滑动变得不那么顺畅。有一次偶然看到有人卖鼠标胶垫,我花两块钱买了一套贴上,结果滑动手感瞬间恢复到了刚买时的状态——那种熟悉的流畅感,又回来了!

解决罗技 G304 鼠标按键连点问题,续命成功![ 阅读全文 ]

原文链接: https://www.shephe.com/post/g304-replace-micro-switch/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

零基础 WordPress 网站建设全攻略:域名注册、环境搭建及内容创作(2024.11)

本零基础 WordPress 网站建设教程涉及内容非常广泛,将从一个小白的视角(老鸟&大神请点右上角)浅显地介绍有关建设网站的方方面面,包括但不限于:域名注册、服务器搭建、WP 建站、内容创作、网络营销等,总归一句话:WordPress 网站建设看完这篇就够了。

就像你一样,博主曾经也是一个对网站建设一无所知的小白,也是经过了无数的挫折和错误才积累了一些经验和见解。这篇文章的目的就是为了帮助你少走弯路,相对简单、直接而全面地学习如何建设一个 WordPress 网站。考虑到你可能是从零开始,文章里所使用的技术和语言尽可能地通俗易懂,倘若你对以下内容有任何疑问也欢迎在评论区留言,Kevin 将会第一时间为你解答。那么,让我们开始吧!

0. 为什么要建设网站?该如何开始

你为什么要建设一个网站呢?请认真思考这个问题,是为了向大家推广你的产品?是对外发布和展示信息?是想建设一个漂亮的页面展示作品?还是说见了别人有属于自己的网站,觉得很酷,想自己也想搞一个…这个问题你必须要明确。

笔者第一次做网站是在十一年前,那会儿我临近大学毕业,可能是看了某个帖子突然就发现做网站似乎也不那么难,于是对此一窍不通的我开始从零开始学习做网站了。得亏我那会儿年轻学习能力强,能熬夜,所以即便走了不少弯路,最终也还是能把小站做得像模像样,当时好像有人愿意出一点钱买那个小破站…???

..... [ 阅读全文 ]

原文链接: https://www.shephe.com/tutorial/wordpress-website-building/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

显示器检测应从哪些方面入手,有哪些检测点?

随着显示器应用的多样化,尤其在专业设计、摄影等领域,对显示效果的要求日益提高。本文列出了检测显示器各方面性能的关键点,合理选购和检测调教显示器可以确保你获得最佳使用体验。

为什么会有这篇文章呢?一则是因为我这边最近新增加了个在线显示器检测的小工具,二则是我觉得自己用的 Dell 2720QM 显示器名不副实,不管是明暗灰度级和色准都和理想有一定差距,每次在上面弄好的照片倒在 iPhone 上都很不一样!现在对它都没信心了,好想弄个 Mac 体验一波啊,奈何钱包不允许!

以上在线屏幕测试工具帮助用户检测显示器性能,包括坏点、亮度不均、模拟信号干扰等问题。通..... [ 阅读全文 ]


原文链接: https://www.shephe.com/post/%e5%9c%a8%e7%ba%bf%e6%98%be%e7%a4%ba%e5%99%a8%e6%a3%80%e6%b5%8b/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

利用雷池WAF,把博客“搬回家”!

利用雷池WAF,把博客“搬回家”! - 第1张图片 这几天在折腾雷池WAF,其实还是很好折腾的。我在《把服务器“藏”起来,让网站快起来!》可能说的不是太直接了当,后来又重新上了一张图,这样看起来更加一目了然。当然,还得要说下硬件环境,就是从海鲜上花了三四十块钱买了阿里云香港轻量24元每月的那款VPS安装雷池作为前端,而后端同样需要采用香港的VPS,这样速度才可以真正快起来。 利用雷池WAF,把博客“搬回家”! - 第2张图片今天就来折腾折腾怎么利用雷池WAF,把博客放在家里的服务器上。

首先介绍下我的硬件环境,家里一台J4125配置了16G内存、1T固态硬盘、4T机械硬盘,这台做成了all in one。ESXI虚拟机做底层,虚拟了爱快做为主路由拨号、Op旁路由、黑群晖,前几天又才折腾了一个debian安装了宝塔准备放网站。网络环境同家里500M电信,上行是40M、公网IP。而外部网络环境就是从海鲜上花了三四十块钱收的阿里云香港轻量24块钱每月的那一款。首先来上个图吧!

利用雷池WAF,把博客“搬回家”! - 第3张图片 博友们访问博客首先向安装了雷池WAF阿里云香港轻量发送请求,由雷池反代后再直接访问了家里的虚拟机上的博客。是的,路线是绕到香港去了,但是这条路线是优质线路,速度方面并没有感觉到慢。下面来说说设置方法吧!

设置动态域名解析、端口映射

家里有公网IP,但是是动态的,每次重启光猫后IP就会变化。我这里是从爱快上设置了动态域名解析,网上教程很多,不再赘述。把相关服务的端口必须要映射出去,这个也是在爱快的操作。

设置域名解析

网站的域名解析IP设置为安装雷池WAF的那台香港轻量。

雷池WAF设置

首先申请证书,傻瓜化,会点鼠标就行;然后就是添加站点。

利用雷池WAF,把博客“搬回家”! - 第4张图片

域名填写你网站的域名;证书选择你刚才申请的证书;上游服务器填写你动态域名解析的那个域名+网站映射出来的端口,如:http://xxx.laozhang.org:5425/

完成以上操作后,你就可以不需要加端口号直接使用域名访问家里虚拟机上的网站了!怎么样,即没有端口号、速度也不慢、还有雷池WAF安全保护,不是美滋滋!

 

 

把服务器“藏”起来,让网站快起来!

把服务器“藏”起来,让网站快起来! - 第1张图片

网站给用户最好的体检就是速度要快,想要网站速度要快,可以把域名备案选国内的服务服务器。但是大家都知道域名备案后把网站放在国内后续会有很多问题。所以很大一部分人就干脆放弃了速度而选择把服务器放在海外。把服务器放在海外,也可以选择对大陆优化的线路,但是这样的线路成本是非常的高。

阿里云香港轻量,那个速度真的是杠杠的,谁用谁知道。但是,24元每月的那款配置只有2C1G的,说真的1G内存真的有点太小了。34块钱每月的配置是2C2G,这款拿来做站还不错,一年408块钱虽然可以接受但是感觉还是有点高。最为重要的一点就是听不少人说阿里云香港轻量虽然线路非常的好,硬件性能却非常的拉,安装个Docker都会把CPU给干爆了。阿里云发放的学生300元优惠卷,用这个卷可以买到一年的2C1G的那一款香港轻量,海鲜上这个卷最初卖30块钱,后来9月中旬新卷被阿里指定商品后老卷涨到了70元,也就是说70块钱可以搞到阿里云香港轻量2C1G款一年时间。

那怎么样花最少的钱让网站的速度飞起来呢,这里老张来谈一谈怎么样花最少的钱让网站的速度最大化。请出今天的主角,雷池WAF。

雷池WAF:网站防护软件,它本质是一个反向代理,架设在网站前面,可以灵活设定各种规则,对所有请求进行过滤,不让黑客"越雷池半步"。它底层基于 Nginx,自带图形操作界面,简单好用。它的核心是智能语义分析算法,用来判断可疑请求,相当于一层自定义的软件防火墙,它在 GitHub 已经收获了12.5K star,目前是全球排名第一的开源 WAF 项目。它可以自己架设,很适合个人和小企业使用。如果你需要防护暴露在公网的 Web 服务器,不妨用它试试看。

目前我准备的方案是阿里云香港轻量作为前端,安装雷池WAF;后端采用HH家的香港性能机(去年黑五推出的一款2刀一个月可以搞到2C6G的香港VPS。),安装宝塔做网站。通过雷池WAF,把阿里香港轻量和HH香港性能机组合起来,既有了HH机器的性能又有了阿里香港轻量的速度,同时还多了一层安全保护。至于花费嘛,和34元每月的阿里香港轻量差不多,但是性能得到了提长、防护上有了保障。

把服务器“藏”起来,让网站快起来! - 第2张图片

雷池的安装、设置非常的简单,不做赘述。这里给大家避一个坑,我在把甲骨文新加坡VPS的两个小破站做雷池WAF反代的时候,出现了一个问题,只要通过雷池反代,wordpress的CSS文件就加载不出来,。AI给出的解释如下:

在使用雷池进行前端代理和后端反向代理时,老张遇到了WordPress样式丢失和后台无法访问的问题。初步分析认为是SSL跳转的问题,但检查后发现实际上宝塔配置没有问题。更深入的分析显示,网站在反向代理期间,由于回源使用HTTP协议,导致WordPress误认为站点也是HTTP,从而加载了错误的资源(CSS、JS等),最终导致样式丢失和重定向过多的错误。

为了解决这一问题,建议采取以下步骤:

  1. 确保前端使用HTTPS,回源采用HTTP:这样可以利用Cloudflare(CF)的证书,免去直接在源服务器上处理SSL证书的烦恼,简化维护和更新。
  2. 更新WordPress配置:在wp-settings.php文件中添加$_SERVER['HTTPS'] = 'on';一行代码,以强制WordPress将网站协议识别为HTTPS,这样可以防止出现HTTP资源加载的问题。

通过以上方法,最终达到了正确加载资源并解决了访问问题,确保了WordPress的正常运行。

具体原因可以看NL论坛坛主的文章分析《WordPress 反代后,css丢失或者后台进不去的问题的解决》,解决的方法是编辑 wp-settings.php ,在 <? php 下增加一行

$_SERVER['HTTPS'] = 'on';

把服务器“藏”起来,让网站快起来! - 第3张图片

 

 

 

WordPress首页调用typecho方法!

Wordpress首页调用typecho方法! - 第1张图片

前段时间花了那么多的时间折腾了《WordPress首页调用memos方法!》后,怎么又来折腾Wordpress首页调用typecho呢!原因有这样的两点,首先memos的作者对memos的更新真的是太随意了,每次版本的升级,你会想不到他会把什么功能给删掉、或是更想不到把数据库的结构给改了、还有就是随意改变API的接口。也正因为他的随意,一部分人还保持在低版本来使用,另外一部分人就是直接弃用了,所以我想着说不定哪一天也会弃用memos。另外的一个原因就是除了老张博客之外,我还有一个老张随笔,一直保持每日一更新,字数都是在二百字,就像朋友圈一样,最初是用typecho程序,后来改用memos,目前那个typecho上面还放着一千两百多篇随笔。我想与其这样牵强的用着memos,不如退回来用typecho算了。

有了上面的想法后,就想着把我的wordpress和typecho来个“整合”,在wordpress调用typecho的首篇文章。有了上一次的折腾,这次算是轻车熟路了,前前后后的折腾有两个小时。通过这次的折腾,让我对AI又有了新的认识,上次我认为是“豆包最聪明”,结果经过这次的“折腾”发现把相同的问题多次的提问同一个AI,每次他给出的答案也是不一样的。单单就响应速度来说,官方的GPT最为快,所以这次代码就是借助官方GPT来完成的。话不多说,直接上代码吧!

忘了一个重要的事: typecho本身没有提供API接口服务,这里我找到一款插件,Restful,安装后直接启用就行,因为我是直接调用文章的,其他的API接口就被我给关了!

1.把下面的代码插入到主题文件的index.php合适位置。

<?php
$data = fetch_typecho_data();
if ($data):
?>
<div class="latest-update" style="background-color: #f8f8f8;">
<div class="latest-update-header">
<h2>最新动态</h2>
<span class="latest-update-time"><?php echo esc_html($data['time_content']); ?></span>
</div>
<div class="latest-update-divider"></div>
<div class="latest-update-content"><?php echo esc_html($data['content']); ?></div>
<div class="latest-update-images">
<?php foreach ($data['image_content'] as $img_url): ?>
<a href="<?php echo esc_url($img_url); ?>" data-lightbox="latest-update-gallery">
<img src="<?php echo esc_url($img_url); ?>" alt="Image">
</a>
<?php endforeach; ?>
</div>
<div class="latest-update-footer">
<span class="latest-update-tag"><?php echo esc_html($data['tag_content']); ?></span>
<a class="latest-update-link" href="<?php echo esc_url($data['link_content']); ?>" target="_blank">查看全文</a>
</div>
</div>
<?php endif; ?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox-plus-jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css">

2.把CSS样式代码放置到主题CSS定义设置里,当然也可以直接放到style.css中。


/* 首页调用typecho样式 */
.latest-update {
    width: calc(100% - 40px); /* 设置宽度为100%减去40px,确保有左右边距 */
    background-color: #f8f8f8 ; /* 强制设置背景颜色为浅灰色 */
    border: 1px solid #ddd; /* 添加1像素的灰色边框 */
    border-radius: 10px; /* 圆角边框,半径为10px */
    padding: 20px 20px 10px 20px; /* 内边距,上下10px,左右20px */
    margin: 20px 0; /* 外边距,上下20px,左右0 */
    text-align: left; /* 文本左对齐 */
    margin-top: -10px; /* 减少与顶部的距离为0 */
    margin-bottom: 30px; /* 增加与文章列表的距离为40px */
    margin-right: 20px; /* 设置右边距为20px */
}

.latest-update-header {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 头部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-bottom: 10px; /* 头部与下方内容的外边距为10px */
}

.latest-update h2 {
    font-size: 15px; /* 标题字体大小为15px */
    margin: 0; /* 去除默认外边距 */
    padding-left: 0px; /* 左边填充为0 */
}

.latest-update-time {
    font-size: 14px; /* 时间字体大小为14px */
    color: #666; /* 时间文本颜色为中灰色 */
    margin-right: 0px; /* 右边距为0 */
}

.latest-update-divider {
    border-bottom: 1px solid #333; /* 添加底部边框,颜色为深灰色 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-content {
    text-align: left; /* 内容文本左对齐 */
    line-height: 1.5; /* 行高设置为1.5倍 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images {
    text-align: left; /* 图片区域文本左对齐 */
    margin: 10px 0; /* 上下外边距为10px */
}

.latest-update-images img {
    width: 100px; /* 图片宽度为80px */
    height: 75px; /* 图片高度为80px */
    object-fit: cover; /* 图片覆盖方式,保持比例并裁剪 */
    border-radius: 8px; /* 图片圆角,半径为8px */
    box-shadow: 0 4px 10px rgba(0, 0, 0, 1); /* 添加阴影效果 */
    margin: 3px; /* 图片外边距为5px */
    transition: transform 0.3s, opacity 0.3s; /* 添加平滑过渡效果 */
}

.latest-update-images img:hover {
    transform: scale(1.1); /* 鼠标悬停时放大10% */
    opacity: 0.9; /* 鼠标悬停时透明度降低到0.9 */
}

.latest-update-footer {
    display: flex; /* 使用弹性盒模型布局 */
    justify-content: space-between; /* 底部元素左右分散排列 */
    align-items: center; /* 垂直居中对齐 */
    margin-top: 10px; /* 底部与上方内容的外边距为10px */
    padding-top: 10px; /* 上内边距为10px */
    border-top: 1px solid #ddd; /* 添加顶部边框,颜色为浅灰色 */
}

.latest-update-tag {
    background-color: #e0e0e0; /* 标签背景颜色为淡灰色 */
    border-radius: 5px; /* 标签圆角,半径为5px */
    padding: 5px 10px; /* 内边距,上下5px,左右10px */
    font-size: 14px; /* 标签字体大小为14px */
}

.latest-update-link {
    text-decoration: none; /* 去除链接的下划线 */
    color: #0073aa; /* 设置链接颜色为蓝色 */
    font-size: 14px; /* 链接字体大小为14px */
}
/* 首面调用typecho结束 */

3.把下面代码插入到主题functions.php文件中。


//-------首页调用typehco代码-----开始
function fetch_typecho_data() {
    $api_url = "https://suibi.zhangbo.net/api/posts?pageSize=1";
    $response = wp_remote_get($api_url);
    if (is_wp_error($response)) {
        return;
    }
    $body = wp_remote_retrieve_body($response);
    $data = json_decode($body, true);

    if ($data['status'] !== 'success' || empty($data['data']['dataSet'])) {
        return;
    }

    $post = $data['data']['dataSet'][0];
    
    // 1. 链接内容
    $link_content = "https://suibi.zhangbo.net/archives/" . $post['cid'] . ".html";
    
    // 2. 标签内容
    $tag_content = "#" . $post['categories'][0]['name'];
    
    // 3. 时间内容
    $created_time = (int)$post['created'];
    $current_time = time();
    $time_diff = $current_time - $created_time;
    
    if ($time_diff < 3600) {
        $time_content = floor($time_diff / 60) . "分钟前";
    } elseif ($time_diff < 86400) {
        $time_content = floor($time_diff / 3600) . "小时前";
    } elseif ($time_diff < 2592000) {
        $time_content = floor($time_diff / 86400) . "天前";
    } else {
        $time_content = date("Y年m月d日", $created_time);
    }
    
    // 4. 摘要内容
    $digest = strip_tags($post['digest'], "");
    $content = mb_strlen($digest, 'UTF-8') <= 200 ? $digest : mb_substr($digest, 0, 200, 'UTF-8') . "......";
    
    // 5. 图片内容
    preg_match_all('/<img.*?src=["\'](.*?)["\'].*?>/i', $post['digest'], $matches);
    $image_content = $matches[1];

    return [
        'link_content' => $link_content,
        'tag_content' => $tag_content,
        'time_content' => $time_content,
        'content' => $content,
        'image_content' => $image_content
    ];
}

 

 

 

 

WordPress首页调用memos方法!

WordPress首页调用memos方法! - 第1张图片

老张一直想把wordpress和memos能整合在一起,前几天在段先生的博客上看到了教程,便死皮赖脸的问他方法,原来是AI搞定的。刚开始的时候是直接拿段先生的用,但是里面有一些达不到自己想要的效果。比如段先生是从memos的RSS文件里取数但,如果memo里有多篇图片的话,RSS只能输出一张链接地址,其他找不到。通过找木木大佬,用了他提供的《Memos API 非官方不完全说明》便可以解决。另外在CSS布局上也不是自己想要的效果,便想着自己也来让AI搞吧!

让AI帮你写代码,你必须要学会怎么样能更好的和AI对话,必须要有一点点的代码基础,才能把把问题问在点子上。我在把memos的API输出的数据模式先告诉AI,然后再提出自己的要求,要求如下:

我想在wordpress获取memos的api发布第一条动态内容,API的链接地址是https://zhangbo.net/api/v1/memo?creatorId=1&rowStatus=NORMAL&limit=1 ,内容格式如下:
按以下要求进行操作:
1.读取第一个"id"后面的数据,并形成“https://zhangbo.net/m/+“id后面的数据”” 做为链接,赋值给变量$link_content
2.读取"content"后面的数据,读取以#号开始、空格结束的内容,并在前面加#号后赋值给变量$tag_content。
3.读取"createdTs"后面的数值,转化为时间后与当前时间计算时间间隔。时间间隔为1小时内的,以时间间隔+“分钟前”赋值给$time_content;时间间隔为24小时内的,以时间间隔+“小时前”赋值给$time_content;时间间隔为30天内的,以时间间隔+“天之前”赋值给$time_content;时间间隔超过30天的,直接以“年月日”形式赋值给$time_content。
4.读取"content"后面的数据,排除“![]()”图片形式、排除#、#及空格前的内容后,赋值给$content。
5.读取"content"后面的数据,如果有“![]()”图片形式,将()内的图片链接赋值给$image_content;如果"externalLink": 后面有数据,赋值给$image_content;如果"filename"后面有数据,将以“https://zhangbo.net/o/r/+filename上第四行ID后的数值+"filename"的数据”赋值给$image_content。如果以上情况都存在,那将以数值组形式赋值。
以上生成的代码,将保存在wordpress的主题文件functions.php中以便调用。
按以下要求生成CSS代码
1.对于在首页展示的要求,在首页文章列表上方,与首页文章空两行
2.显示框宽度100%、背景灰色、四角椭圆。
3.第一个DIV展示框以"h2”格式展示“最新动态”四个字、靠左对齐、左边距空20px;务必同一行展示$time_content值,右居中对齐,右边距空20PX
4.第二DIV插入细实线、深灰色
5.第三DIV展示$content值
5.第四DIV展示$image_content值的缩略图,缩略图四角椭圆并有阴影,如果多图从左往右排列。并按确保引入 Lightbox.js,也写入到本代码中,达到点击放大效果
6.第五DIV靠左对齐展示$tag_content值,背景灰色并四角椭圆,靠右展示“点击评价”点击链接到$link_content。
再生成输出代码以便插入在首页文件index.php,以便在首页显示。/

我分别测试了官方GPT、三方GPT和豆包,结果是官方GPT直接来句“问题太复杂,请分类进行提问”,三方GPT给出的代码效果完全不对,而豆包给出的代码基本上达到要求。当然,还是由于自己的表述,导致代码在图片显示这块有些问题。今天中午利用几分钟时间,进行了修改,对获取图片链接地址重新让AI写,我是这样提问的:

我现在的要求是其他代码不需修改,只对获取图片链接重新按以下要求来修改
1.读取"content"后面的数据,如果有“![]()”图片形式,将()内的图片链接赋值给$image_content;
2.获取  "resourceList": []的中括号里数据,这是图片组,每组以{}进行区分,查询每个{}内的"externalLink",如果"externalLink": 后面有数据,赋值给$image_content;如果"externalLink"无数据,则以“https://zhangbo.net/o/r/+该图片id+"filename"的数据”赋值给$image_content。
如果以上情况都存在,那将以数值组形式赋值。

经过这样的修改,图片才得要正确显示。后来又陆陆续续的修改了CSS样式,最终达到目前的效果。

现在把相关代码贴给大家吧,需要的自取,不合自己要求的,也可以让AI帮你来修改。

1.把下面的代码插入到主题文件的index.php合适位置。

 <?php
$memoOutput = processMemoData();
if ($memoOutput) {
echo $memoOutput;
}
?>
<script src="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/js/lightbox-plus-jquery.min.js"></script>
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/lightbox2/2.11.4/css/lightbox.min.css">/* Your code... */

2.把CSS样式代码放置到主题CSS定义设置里,当然也可以直接放到style.css中。


/* 首页调用memos效果---开始 */
/* 缩小与顶部距离,增加与首页文章列表距离 */
.memo-display {
    margin-top: 0px; /* 减少与顶部的距离 */
    margin-bottom: 40px; /* 增加与文章列表的距离 */
    margin-right: 40px; /* 设置右边距为20px */
    width: calc(100% - 40px); /* 计算宽度以适应右边距 */
    background-color: #f2f2f2;
    border-radius: 10px;
    padding: 20px;
    border: 1px solid #ccc; /* 添加细线边框,颜色为浅灰色 */
}


/* 第一个 DIV:展示“最新动态”和时间 */
.memo-header {
    display: flex;
    justify-content: space-between;
    align-items: center;
}
.memo-header h2 {
    margin-left: 0px;
}

.memo-header span {
    margin-right: 0px;
}

/* 第二 DIV:插入细实线、深灰色 */
.memo-divider {
    border-top: 1px solid #999;
    margin: 10px 0;
}

/* 第三 DIV:展示内容 */
.memo-content {
    margin-bottom: 10px;
    line-height: 1.5; /* 或者可以使用具体的像素值,如 1.5em 或 24px */
}
/* 第四 DIV:展示缩略图 */
.memo-images {
    display: flex;
    flex-wrap: wrap;
}

.memo-images img {
    border-radius: 10px;
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.3);
    margin-right: 10px;
    cursor: pointer;
    transition: transform 0.3s ease; /* 添加过渡效果 */
}

.memo-images img:hover {
    transform: scale(1.1); /* 鼠标悬浮时放大 */
}

/* 第五 DIV:展示标签和链接 */
.memo-footer {
    display: flex;
    align-items: center;
    margin-top: 10px; /* 设置与上面容器的距离为 30px */
}

.memo-footer div:first-child {
    background-color: #9999;
    border-radius: 6px;
    padding: 5px 10px;
    margin-right: 10px;
}

.memo-footer a {
    text-decoration: none;
    margin-left: auto; /* 靠右对齐 */
    margin-right: 0px; /* 右边距 20px */
}
/* 首页调用memos效果---结束 */

3.把下面代码插入到主题functions.php文件中。

/* Your code... */
//-------首页调用memoe代码-----开始
function getTimeContent($createdTs) {
    $current_time = time();
    $time_diff = $current_time - $createdTs;
    static $cachedTimeContent = null;
    static $lastCreatedTs = null;
    if ($lastCreatedTs === $createdTs) {
        return $cachedTimeContent;
    }
    if ($time_diff  100) {
        $substr_content = mb_substr($content, 0, 100, 'UTF-8');
        $last_char = mb_substr($substr_content, -1, 1, 'UTF-8');
        $last_char_ascii = ord($last_char);
        while ($last_char_ascii  126) {
            $substr_content = mb_substr($substr_content, 0, -1, 'UTF-8');
            $last_char = mb_substr($substr_content, -1, 1, 'UTF-8');
            $last_char_ascii = ord($last_char);
        }
        $content = $substr_content. '......';
        $link_text = '查看原文';
    } else {
        $link_text = '点击评价';
    }

    $content_without_tags_and_images = preg_replace('/#.*? /', '', $content);
    $content_without_tags_and_images = preg_replace('/!\[.*?\]\(.*?\)/', '', $content_without_tags_and_images);
    $content = $content_without_tags_and_images;

    // 构建输出内容
    $output = '
'; $header = '

最新动态

'. $time_content. '
'; $divider = '
'; $contentDiv = '
'. $content. '
'; $imagesDiv = ''; if (!empty($image_content)) { $imagesDiv = '
'; foreach ($image_content as $image_link) { $imagesDiv.= 'Image'; } $imagesDiv.= '
'; } $footer = '
'. $tag_content. '
'. $link_text. '
'; $output.= $header. $divider. $contentDiv. $imagesDiv. $footer; $output.= '
'; return $output; }

OK,结束!折腾十几个小时,就是出了这篇教程!!

完美实现手机照片自动上传至NAS并同步到网盘!

完美实现手机照片自动上传至NAS并同步到网盘! - 第1张图片

昨天一天时间,博客群里都是在谈论NAS,这又把我折腾的心勾的痒痒。对于NAS,我一直的观点就是自己DIY不买成品,买成品的价格至少要贵上1倍。在2019年的时候就折腾过NAS,那个时候买的都是矿渣,先是买了蜗牛星际,后来《上车了!暴风播酷云二期“开包”记!》。为了折腾NAS,单独买了两块4T的红盘,但是,但是后来其中一块硬盘还没有到一年时间就挂掉了。虽然免费换了新,但是里面的数据没有了,还好里面存的都是一些电影而不是重要数据。至此,NAS会坏硬盘这个阴影一直存在脑子里。没多久,就把暴风二期给卖了。

昨天我说出我对NAS存在坏硬盘的阴影时,老刘说我这是因噎废食。想想也是,NAS上硬盘坏了的直接原因是硬盘本身的质量问题,而不能去怪Nas。那就把吃灰的NAS重新折腾起来吧。目前我的硬件环境是用的J4125小主机外拖一个硬盘盒,里面是拆机的硬盘1T和4T各一块,搞的all in one。选用ESXI做的底层,ikuai爱快做主路由拨号,openwrt做旁路由负责科学等,另外通过一键脚本安装了黑群晖DSM。J4125主机资源还没有用完,准备再搞个Debian来折腾。那个黑群晖自安装后就一直吃灰,后来干脆把电源都给关了,昨天晚上回到家,才连上ESXI给NAS开了机。

如何将手机里的照片自动上传到NAS,并自动同步到网盘呢?这里我们需要用到这样的两个套件Synology Photos和Cloud Sync,两个都是官方套件,直接安装即可。

完美实现手机照片自动上传至NAS并同步到网盘! - 第2张图片完美实现手机照片自动上传至NAS并同步到网盘! - 第3张图片

Synology Photos 是 Synology NAS(网络附加存储)设备上的一款强大的照片管理和共享应用程序。它集成了照片存储、管理、备份和分享等功能,旨在为用户提供一个安全、高效的照片管理解决方案。以下是一些 Synology Photos 的主要功能和特点:智能分类和搜索、多设备同步、分享功能、高效的备份解决方案、照片编辑。相册管理等。

Cloud Sync 是 Synology NAS 提供的一个功能,允许用户将本地 NAS 数据与云存储服务(如 Google Drive、Dropbox、OneDrive 等)进行同步。这个功能非常适合需要备份数据、实现数据冗余或在不同设备间访问文件的用户。以下是 Cloud Sync 的主要功能、使用场景以及设置步骤。主要功能:双向同步、单向同步、增量同步、自定义同步规则、版本控制、调度同步、文件过滤等。

手机上需要安装Photos这款APP,直接从群晖的官方网站下载。Photos这款APP是和群晖上Synology Photos是配套使用的,都是属于照片管理器。

具体使用方法不再多去赘述了,傻瓜式的安装、使用。简单原理就是通过手机Photos这款APP和群晖Synology Photos套件配合把手机照片自动上传至NAS,再通过Cloud Sync 自动同步到各大网盘等。今天早上测试了下,手机刚刚拍的照片,到百度网盘上就可以看到了,真的是实现了秒传。

这样,所拍摄的照片,手机→NAS→网盘,全自动化,再也不用担心硬盘坏掉了!

近期想搞个高配一点的小主机做个all in one,基本要求32G内存、2块4T硬盘、CPU嘛12300T或以上、多网口网卡等,要小,可以放在鞋柜里。大家有什么可以推荐的嘛!价位在3000以下!

 

 

 

写在老张博客十五周年

写在老张博客十五周年 - 第1张图片

真的没有刻意去记今天,只是今天偶尔看网站信息时,才注意到建站时间是2009年10月9日,算到今天,正好是十五周年。到我提笔止,老张博客十五年里,不包括本篇共发布了787篇文章。评论数为18412条,其中应该有一大半是我回复评论。浏览总次数为5230094次,乍看这523万浏览量蛮大的,其实这是长时间积累的,平均每天也不过千。

老张根据文章归档,来回忆下老张博客走过的十五年的路。其实老张建博客是在2008年,只不过那个时候对“数据安全”没有概念,搞个博客正常丢数据。目前的数据是从2009年10月9日一直使用到现在的,现在是每天做备份,生怕哪数把数据搞丢了。

2009.10-2010.7:摸索爬行期:

想不起来老张当初因为什么建博客了,根据2009年归档的所谓的文章来看,从2009年10月建站到2010年7月中旬,基本上是转载别人的文章或是自己简单发两句话。可能是前一年对写博客并没有什么经验,只是去折腾但并没有把折腾的过程记录下来。建站前一年,可以说是摸索爬行阶段。

2010.7-2011.4:辉煌成就期

从2010年7月28日《WordPress更换域名后所要注意的十件事》这篇文章开始,到2011年4月份,原创了大量Wordpress方面的教程,同时总结了SEO方面的技术经验文章。这一年时间里,是原创高质量文章最多的一年,很多篇教程当时被admin5等站长网站收录,当然也引来了很大的流量,可以说这一年是老张博客最为辉煌的一年。

2011.5-2018.9:歇菜苟活期

2011年5月份开始,歇菜了,这段时间应该去折腾易语言去了,因为出现了一些易语言方面的教程。也就是从那个时候开始,老张博客在“苟活期”,你说不更新吧,偶尔那么转载两篇文章,你说更新吧,一年也就是更新十来篇。老张博客的苟活期或是说“空白期”相当的长,从2011年5月一直持续到2018年9月,长达七年之久。

2018.10-今:平稳发展期

2018年10月份起,老张博客从技术型博客转到“技术生活类”博客后,才算是基本上稳定。也就是那这个时候开始,内容为记录一些自己折腾的过程,分享一些自己的生活。更新基本上算是有规律,达到每个月四五篇,一直保持到现在。也就是说,真正意义上的写博客只能算是2010年7月至2011年5月,以及2018年10月起到现在,满打满算,也就是6年时间。博客十五周年,而真正写博客也就是六年时间,也算是可悲哟。

博客大事件

结合着前段时间软云的跑路风波涉及的数据安全来讲,来说说老张博客这十五年来遇到了两件“大事件”。

第一件事就是2017年长时间不上博客,未能及时更新博客程序和各种插件,导致各项版本太旧,有黑客利用漏洞入侵了我的空间,所有网站文件全被挂马。这个技术方面的事自己是搞不来的,还是在“游子”的帮助下花了大量的时间才得以解决。

另外一件大事就是“游子失联”。游子,一个非常不错的空间商,他真的能和客户打成一片,包括我在内,他的长期客户非常多,我用他的空间有十余年时间。但是在2020年11月份,游子的所有服务器全部停机,而游子又联系不上。我在《历经一劫,博客重生!》详细介绍了整个事件的过程。好在后来在朋友的帮忙下,直接打款给IDC商后开通了一个季度的机器才把数据得以保存。对于游子的失联,我们所有群里客户并不是担心“赔偿问题”,而是考虑到游子的个人安危问题。有位客户离游子比较近,单独开车百余公里去找游子,功夫不负有心人,找到了游子的老婆。这时才知道,原来游子在给一家P2P公司做网络方面的技术顾问,最终这家公司资金断链而被起诉,被定性为诈骗,游子也被牵涉其中而被留置。到现在已经五年时间了,游子客户微信群一直还在,但是还没有游子的身影,不知道他过的怎么样了。

老张博客十五周年了,不管你的博客在大厂还是小厂,定期做数据备份,把数据牢牢的抓在自己手里,还会有下一个十五年!再下个十五年,无数个十五年。

Memos完美降级到Memos0.18.2版

Memos完美降级到Memos0.18.2版 - 第1张图片

前几天一直都在折腾Memos,原因就是我的Docker容器是利用《如何优雅的一键升级宝塔面板多个Docker容器》的watchtower项目,通过计划任务每周定时检测Docker版本并完成自动更新。所以我的所有Docker版本都是一直保持着最新。也就是这点,违背了“求稳不求新”的原则,导致出现了一些问题。最为严重是Memos,作者更新很随意导致新版本的数据库结构、API接口都发生了改变,与目前使用的“哔哔点啥”的memos页面出现不兼容。

国庆节前,折腾把《完美解决Memos页评论与博客哔哔页面评论互不显示问题。》的问题解决了,方法就是备份数据库文件后直接删除新版Memos容器,安装Memos0.18.2版老板容器,并恢复数据库文件。安装后并没有经过大久测试,结果新的问题出现了。降级后Memos不能发布内容了,乖乖,这可是个大问题。

经过分析,不能发布内容的原因就是新老版本的Memos的数据库结构发生了改变,那么解决的思路也就是把新版数据库数据结构修改为与memos0.18.2保持一致即可。

备份数据库、删除新版安装memos0.18.2版

我在《无需代码,宝塔面板Docker部署便签工具Memos》提到过,当初我们在部署Memos时,已经把Docker内的数据库文件memos_prod.db映射到服务器上,找到新版数据库文件下载到本地后,可以另存为其他名称后删除最新版本memos容器。这次我是直接使用代码安装的0.18.2版,代码如下:

docker run -d --init --name memos --publish 5230:5230 --volume /docker-data/memos/:/var/opt/memos ghcr.io/usememos/memos:0.18.2

利用Navicat Premium工具导出-修改-导入数据库文件

安装好0.18.2版之后,到/docker-data/memos/下同样把memos_prod.db文件下载到本地。

这个时候我们请出今天的主角,Navicat Premium,直接到官网下载即可,14天的试用时间,完全够你折腾了。利用Navicat Premium同时连接打开新、老数据库文件。

Memos完美降级到Memos0.18.2版 - 第2张图片

经过比较你就会发现新版数据库文件中表名为memo的字段比0.18.2版本多一列uid字段。第一思路就是在新版表memo的uid字段上直接右键点删除,结果报错,只能另寻思路,如果这一步哪位大神有什么方法,一定要分享出来,因为正面我的方法比较繁琐。

那简单方法行不通,只能通过繁琐的方法了,把数据库表的内容导出成可编辑的文件,在相应软件里把memos的uid字段删除后再导入0.18.2版的数据库。具体方法如下:

Memos完美降级到Memos0.18.2版 - 第3张图片

选中新版数据库memo表,选择工具-导出,这里我选择的是excel数据表(*.xls),导出后用ecxel打开你导出的表格,直接把uid这一列删除即可。注意,这个时候我们再连接0.18.2数据库的memo表,再选择工具导入,注意一定要选对文件类型把修改后的excel文件导入。这个时候,我们就完美地把memo这个表导入了。

其他表的内容按上步方法导出-修改-导入,其实也就是memo和表resource两个表需要删除uid字段,其他像标签、用户、用户设置、系统设置等表只需要把内容导出成excel文件后再直接导到0.18.2的数据库即可。这样就完成了所有的数据迁移工作。

停止容器,恢复数据,完美降级

在服务器上把Memos这个容器先停止,把0.18.2版数据库文件上传到你映射的目录,覆盖旧文件即可。再重新启动容器,OK,十分完美地把Memos0.22.2降到Memos0.18.2版。

经过这一周多时间的测试,再无任何问题,Memos降级完美完成!

完美解决Memos页评论与博客哔哔页面评论互不显示问题。

完美解决Memos页评论与博客哔哔页面评论互不显示问题。 - 第1张图片

暑假两个月放飞自我后,近段时间开始收心了,把精力从游戏上转回到博客。第一件事就是把博客的“哔哔点啥”网页布局进行了调整,把内容的标签设置与评论图标一行,这样看上去就顺眼多了。虽然只是一个小调整,但是苦于自己的代码小白,还是找了AI帮忙。

目前我的哔哔点啥页面还是用《巧搬空白Koobai大佬Memos页面,完美与博客整合。》,哔哔点啥页面的工作原理就是直接调用Memos数据。Memos前期版本没有原生评论,而新版本即使有评论在memos的数据库里并非单独列。为了能让在memos以及博客的哔哔点啥页面有评论能力,便把《Artalk评论嵌入Memos,完美接近朋友圈、微博!暨宝塔面板Docker部署artalk评论系统》。

后来随着memos版本的升级,出现了个问题,就是在Memos在直接评论的内容与直接在哔哔点啥上评论的内容相互不显示了。因为当时评论数比较少,也并没有在意,这个问题一直也就拖到了现在。既然已经收心想折腾博客,那就索性把这个BUG也给搞定吧。

Memos的作者更新真的是很随性的,各种功能随意增减,导致很多人说Memos只是个项目不是个产品。前期版本单篇Memos显示匹配的路径是序号,用域名+M+序号形式,比如https://memos.laozhang.org/m/423;而后期版本匹配显示的路径却是内容前几个字符编码,比如https://memos.laozhang.org/m/GR65Lmbquyb5QuVuZgj9G7(打不开了,因为我的版本降了)。正是因为这次的升级,而导致了上述的问题。

老孙的帮助下,通过修改哔哔点啥的JS文件,把 var memo_id = data[i].id;修改为 var memo_id = data[i].name; ,是可以正常显示了,但是又有一个小问题,就是评论通知邮件里的链接又不匹配了。

后来询问了木木大佬、koobai大佬,才知,最为稳定的memos版本是0.18版,那解决的方法就是“降级”了!

之前我习惯于在宝塔面板下部署各种Docker,当时我是用了《无需代码,宝塔面板Docker部署便签工具Memos》。现在想来,还是代码更为方便一些。降级之前必须要很把你原来映射出来的文件夹备份并下载下来,那是你Memos全部数据。然后删除目前的Memos项目及镜像,重新用代码安装0.18.1版即可。

docker run -d --init --name memos --publish 5230:5230 --volume ~/.memos/:/var/opt/memos ghcr.io/usememos/memos:0.18.1

正常使用的这些Docker,我们应该保持一个原则“求稳不求新”,为了能正常运行,还是用稳定版本的为好!

 

停止 SSH 服务器监听 IPv6 地址

为啥要停止 SSH 服务器监听 IPv6 地址?

  许多同学家里都有软路由或者小型服务器,用来跑一些个人的小程序,或者跑 TeamTalk 等。现在 IPv6 已经基本普及,好处是每个设备甚至每个容器都能分配到一个公网 IP 地址,坏处也显而易见,那就是,之前靠路由器来充当防火墙的搞法已经不奏效了。为啥捏?因为之前基本都是在路由器上做端口映射,可以有选择地开放端口到互联网上,现在则是整个系统暴露到了互联网。

  看到这里,聪明的同学应该都已经知道俺想表达的意思啦。没错,咱们都是通过 SSH 来控制服务器的,一旦它被入侵,后果是很严重滴!删库跑路还不是最大的问题,最大的问题是骇客潜伏在服务器里,三天两头搞些事情,如果你有很多的虚拟机,仅凭一己之力,是很难彻底跟踪入侵踪迹的。

怎么停止 SSH 服务器监听 IPv6 地址?

  首先,通过终端/SSH 之类的方法登录你的服务器,并进入 /etc/ssh 目录,用 cp 命令备份一下 sshd_config 文件,具体命令俺就不多费口水了。备份好之后,用你习惯的编辑器打开 sshd_config 文件,比如俺喜欢用 nano 编辑器,命令是 nano sshd_config

  找到 #AddressFamily any 这一行,把前面的“#(警号)”删除,改成 AddressFamily inet。往下找到 #ListenAddress 0.0.0.0,再把前面的“#”删除。最后,保存 sshd_config 文件。

  这还没完!要想让修改生效,必须重启 SSH 服务端软件,在 CentOS/Debian/Ubuntu 系统上,命令是 systemctl restart sshd,在 Alpine Linux 系统上,命令是 service sshd restart

  切记!先别断开 SSH 连接,一定要看刚才执行命令后是否有报错信息,如果有,赶紧恢复之前的备份,然后重新修改配置文件并再次尝试重启。

检查 SSH 服务器是否停止监听 IPv6 地址

  当修改完成后,一定要有复查的习惯。咋复查捏?在有 IPv6 连接的内网电脑上,通过 SSH 连接服务器的 IPv6 地址,如果连接不上就表示修改成功了。为了避免误判,俺建议通过 ping 以及连接这台服务器的其他端口(例如 Web 端口)来再次确认。

更换宏碁 Swift 3 SF314-511 笔记本键盘

几年前给老婆买了这台宏碁 Swift 3 笔记本电脑,单从配置(11Gen I5/16GB RAM/512G SSD,当时四千多买的全新机)来看它的性能并不算高,但一直以来用着都还不错,不论是响应速度和续航体验都挺好,甚至超过了我那台小新 Pro…我也不知道为啥。

前不久,老婆突然要用的时候发现键盘几乎完全失灵了,我检查过后初步判定是键盘坏了…但从肉眼看不知道是什么引起的,也没见进水和挤压等等,难道是陈小果干的好事儿?事不宜迟我从万能的淘宝花了五十几块大洋下单了一个同款的原装键盘(封面图)回来,结果发现专程让老板送的螺丝刀根本没法用…笔电外壳的 12 颗螺丝是相对少见的六角花型,家里的螺丝刀也奈何不了……😒😒😒

想着省钱,于是又从拼多..... [ 阅读全文 ]


原文链接: https://www.shephe.com/post/replace-acer-swift-3-sf314-511-keyboard/
版权声明: Kevin's Space 版权所有,转载请用明链标明本文地址
本站相关: 随机文章 | 站长微博 | 关于本站 | 联系站长 | 捐助作者

不会再见,点心云!

在去年九月份的时候,写了一篇《利用家里闲置宽带,给宽带费回回血!》跟大家一起分享了如何利用PCND技术利用家里的闲置宽带给网费回回血。当时我配置了两台J4125,其中一台是all in one,里面跑了两个网心云,一个是迅雷插件版,另外一个是Docker版。而另外一台J4125则是单独跑了一个点心云。为了能有更大的收益,把家里的宽带从300M升级到了500M,上行是20M。利用爱快多拨,上行可以跑到50M。这两台设备,平均每月的收益能有150块钱左右。其实如果要是项目再早,收益还会更高,可惜没有赶上那个时候。

大概一个月前,突然发现家里的宽带卡了,不管是重启路由还是给光猫断电重拨都解决不了。用了测速软件一测下行才百十来M,上行就更低。最最为重要的是,发现公网IP也失效了,再打电信报修,客服在后台查询公网IP是正常的。以为是硬件问题,打10000报修,维修师傅来测试路线完全没有问题。后来和维修师傅聊天才知道,现在江苏电信正在大力查处PCND,只要查到宽带降速、公网IP停止。就连你长时间PT下载都会把你的宽带降速。维修师傅说你这个情况算是好了的,只是给你降速,就在我们同小区有一家查到之后就直接停宽带。我的个乖乖,真的是怕了。为了减少不必要的麻烦,经过思考,还是把点心云、网心云给下了吧。

PCND大概停了有两周后,再打电话报修。报修什么,宽带还没有给我恢复、公网IP也没有给我恢复呢。报修了,维修师傅又到现场了,但是解决不了,说是后台原因。难道就这样完蛋了?找在电信公司的朋友帮忙解决吧,他也就是一个电话的事情,一切搞定。唉,问题搞定了,又少不了一顿酒给他。

项目停掉了,那台单独跑点心云的J4125就在我身旁吃灰呢,得要把它放在海鲜上给卖掉了哟。至于宽带,也不会再去降到300M。因为以前单独300M宽带的就是800块钱一年,而现在虽然是79的套餐,但是有500M宽带、5个手机号共享500分钟通话、共享40G流量呢,还是很划算的了!

由“软云事件”想到的!

初识软云_RuanCloudf是在去年11月份大佬论坛上看到的,当时他在论坛上搞促销活动,便买了他一台香港VPS活动机,2C2G的一年133块钱。这台VPS就拿来当备用服务器,在上面折腾一些Docker待稳定运行之后再迁到CloudCone 的主服务器上。虽然是活动机,但是网络还是非常稳定的。

在今天三月份,软云找到我,说想在我的网站上投放广告,给我的报酬就是免费送一台4C4G5M的香港安畅服务器。因为之前有用他的香港活动机,对他家的机器还是比较满意,便答应了。在是否撤下我原来的CloudCone 广告时也协商一致,就是把送我的香港服务器配置提升至8C8G10M,并口头协议长期有效,当然是给他写一篇博文推广。这也就是他推出的“站长扶持计划”。

和软云合作的不止我一个,还有博客界知名度很高的杜老师说邹江博客等。如果我一人给他推广可能没有什么影响力,但是三五个一起推广,在我们这个博客圈里还是有一定有影响力。最为关键的是软云推出的活动机性价比真的是高。如果没有后续的事情发生,可以说可能还有一部分博友会入手他家的香港安畅机。

五一假期的时候,收到软云QQ通知,说是香港安畅全线下架,原因就是注册会员没有要求实名而导致很多人在香港安畅服务器做了非法的事情而被查。从这一点明眼人都可以看出来是服务商管理疏忽而导致被查服务器下架,责任在于服务商。可是很多博友要求软云退款的时候却被告之余款不能原渠道退回,只能退到软云个人中心余额。另外一种可以选择国内服务器后再补偿配置。其实于这件事对于我们做博客的来说之所以选择香港的就是想不用备案而省事的,补偿国内的服务器真的是没有什么意义。另外就是服务器下架的原因是管理不善,与博主们无关,不能因为你的管理不善的后果来让博友承担。

唉,以后不会再有这样的合作了,虽然这样只是扶持、只是广告,但是无形当中也等于给他做了“担保人”。很多博友中看着我们的“担保”才去购买的。这样一来,无疑给我们自己的声誉带来了一定的影响。

其实,作为博主们选择服务器还是很难的,大厂的服务器有保障但是太贵,而小厂的服务器便宜吧但是又没有保障,说下架就下架说跑路就跑路。还是那句话,为了自己数据的安全,一定要记做每天备份,否则后悔真的来不急。

和软云终止合作后,我还是搬回到了CloudConeCloudCone家的服务器虽然不是性价比最高,但是胜在稳定。如果你信任不过小厂,那还是来用CloudCone家的吧。

拿下了zhangbo.net完成ICP及公安备案,正式启用!

域名,于博主来说,这真的是一个老生常谈的东西了。对于域名的使用,我相信几乎所有的博客都不至一次的换过博客的域名吧。人,就是善变的动物,对于自己的域名也是同样,某断时间想搞个短域名玩玩,或又是某个时间想搞个主流域名玩玩,再过一段时间还又想搞一些非主流的域名玩玩,到最后手里都有那么多的域名在吃灰。曾经我迷恋过短域名,搞过bm.md这个域名,但是拿来只是放在手里吃灰,还好后来被原价卖了。

因为我的博客名称一直用“老张博客”或是“张波博客”,所以域名也就是围绕这两个名称换来换去罢了。最早的是用imzhang.com,后来在游子的帮助下注册了zhangbo.org这个域名,这个域名我使用时间最长,应该用有十来年,后来被人7000块钱收购了,收去搞什么引流去了。把zhangbo.org卖了之后用过一段时间的izhang.org。后来在邹江博客的帮助下,成功《抢注了laozhang.org》。其实对于“laozhang”这个拼音,在之前也有关注,曾经laozhang.cn可以抢注的时候我都报了名,但是因为那段时间一直使用zhangbo.org并没有打算去换域名,所以虽然报了名但在竞价的时候拍了出价,最终被人600块钱抢走了。没几天我联系的那个人想着加个一二百块钱给买过来,结果人家报价是2万一分不少。乖乖,炒域名的真的是十年不开张,开张管十年呀!

曾经我也用过一年续费1330块钱的“贵族域名”,那就是zhang.bo,结果《启用zhang.bo之后,我成了调侃的对象》,这个域名用了几个月就被我停掉了。随着时间的推移,手里的域名就慢慢的积累,那么多的域名放在手里只有两个作用,一是续费,另外就是“自慰”了。在2023年底的时候,下定决心《将博客减法进行到底!》,手里除了这个博客的域名,其他的域名不再续费。

前几天五一放假的时候,同样又是在邹江博客的帮助下拿下了我姓名全拼的域名zhangbo.net。对于这个域名,并没有十分坚定的想法换成主博客的域名,还是想着把ICP备案和公安备案给做了放在国内,这样一些国内的免费的东西也可以用用。

其实很多人,特别是新建站的朋友都会问把博客放在国内还是海外,而大部分的回答答案也是一样的。放在海外不需要备案没有管束,而放在国内需要备案,各种规矩特别多放不开等等。其实想想,网络也不是法外之地,即使你放在海外你做了不该做的事情照样会被请去喝茶。

既然要把zhangbo.net放在国内,那服务器选择又是个问题,大家都知道国内常规的服务器价格真的是太贵,还好阿里云的99一年的活动还在,搞了两年。但是两年后何去何从又不知道了。域名和服务器都在阿里云,便提交备案。现在备案真的是方便,记得以前备案的时候服务器商还会寄拍照用的背景布给你,而现在全是在网上操作。5月2日注册的域名,5月7日提交ICP备案,一周后ICP备案通过,当即便提交了公安备案,5月20日公安备案通过。公安备案当时提交的是非交互式,想着过几天申请修改给交互式的看看,因为非交互式是不给开评论的。

目前手里也就是laozhang.org和zhangbo.net这两个域名了,估计应该会长期持有下去。

利用docker-compose方式搭建极简朋友圈!

前段时间“朋友圈”还是非常火的,每天更新博客真的太累,就不如每天写两句“朋友圈”,一句话,一张图片即可。便有很多人找WordPress的“朋友圈主题”,感觉用WordPress来跑极简的朋友圈,真的是没有必要,今天老张就向大家推荐Docker版的“极简朋友圈”!

极简朋友圈项目地址是https://github.com/kingwrcy/moments,作者是Mblog的作者,我在《宝塔面板Docker部署个人微博程序Mblog-前后端不分离sqlite版》有过介绍,大家有兴趣可以移步看看。

以前我部署Docker项目时习惯地在宝塔的可视面板里部署,虽然那样看着比较直观,但是多多少少还是有些麻烦,今天老张就来简单点,利用docker-compose方式进行部署。

1.创建docker-compose目录

进入宝塔面板,打开文件管理,进入你的Docker的映射数据目录里,我们可以把所有的Docker的项目都映射到一个总目录,总目录下再分子目录,这样便于管理。比如我在服务器的根目录下创建了Dockerdata,用来放置Docker项目的映射数据,不同的Docker项目,创建不同的子目录。

2.创建docker-compose.yml

这里我们来创建Moments目录,在Moments目录下创建文件,命名为docker-compose.yml ,将下段代码复制到该文件内即可。

利用docker-compose方式搭建极简朋友圈! - 第1张图片

 

version: '3'
services:
moments:
image: kingwrcy/moments:latest 
ports:
- "3000:3000"
volumes:
- moments-data:/app/data
- /etc/localtime:/etc/localtime:ro
- /etc/timezone:/etc/timezone:ro
volumes:
moments-data:

3.运行docker-compose命令

利用SSH工具远程进入服务器,进入到moments目录下,一定要进入到该目录下,命令是cd /XX你的Docker映射目录/moments/,进入目录后,我们来启动docker-compose,直接输入命令docker-compose up 即可

利用docker-compose方式搭建极简朋友圈! - 第2张图片

 

命令输入后开始跑代码,最后提示“ All migrations have been successfully applied.”后该Docker项目即安装完成。用你服务器IP+3000端口即可访问。

4.反向代理

如果不想用IP加端口方式访问,可以进行反代设置,具体方法可以参考老张的《宝塔面板反向代理,用域名访问Trilium

 

 

我的“博友圈”

前段时间,利用《利用RSS订阅功能添加博友圈,实时展示博友最新文章!》给博客顶部导航菜单添加了“博友圈”这个栏目,那现在就很有必要来聊一聊我的“博友圈”!

《我的博友圈》,并不是我的博主朋友们,而是单指我的博客上顶部导航菜单“博友圈”这个栏目,它的作用就是通过RSS订阅工具FreshRSS,来实现订阅博友博客最新文章的标题、摘要输出功能。

我必须承认我的博客的流量大部分都是靠“博客互访”而来的,所以很多博友会说经常在其他博客上看到我的留言。毕竟我的博客文章质量不是太好,而想要获得流量,那博客互访是一个主要的途径,我在博友的博客上留言的,博友也会友谊性的通过留下的网址来回访。

那么问题来了,怎么样才能知道博友的博客有文章更新呢?!在没有接触RSS订阅之前,老张是在浏览器的收藏夹里分组收藏了近二百个博客网址,每天都会打开一次,而大部分博客又不能做到日更,所以这样浪费了很大的时间。后来接触到了RSS订阅工具后,就把收藏的博客网址订阅起来,博友的博客更新之后RSS订阅工具就会第一时间显示。但是也有个弊端,就是每天需要打开RSS订阅工具。有时因为种种原因,三五天都没有及时打开RSS订阅工具而导致博友的博客更新后没有第一时间访问。那么,通过RSS订阅工具实现在博客顶部导航菜单里添加“博友圈”后,就不必再每天打开RSS订阅工具了,毕竟我们每天都会看自己的博客,这样就可以通过“博友圈”是第一时间知道博友的博客文章更新。极大的增加了与博友之间的互动、增强了用户体验。

目前我的RSS订阅工具里收藏了一百五十位多博友的博客网址,那么我都是收藏了哪些博客网址呢?条件真的是非常的简单,能和我的博客互评三五次的,我基本上都会收藏,当然并不是全部,有些博友的博客一天更新十来篇文章,全是抄过来的,像这样博客不会收藏 ,至少能是写写生活、折腾折腾技术类的博客,至少能是原创博客做到一个月更新那么两三篇的。

这一百五十多个网址并不是固定不变的,会不定期的进行清理。首先清理的是“死站”,很明了,网站长期打不开;其次是清理长期不更新的,这里长期不更新的长期是半年以上的;再次是清理“我去你不来”的。重点说说“我去你不来的”,可能才“建交”时关系很好,能达到有效的“互访互评”,时间久了以后你的博客更新我都会去“关照”而我的文章更新你却从来不来了。我们做博客的,本来就是“你来我往”的,我们没有必要做“单相思”!

可能会有人说你的博友圈就这么屌嘛,有很多优质的博客也入不了你的博友圈嘛!其实不然,博友圈我只是用来展示博友最新文章而达到第一时间的互访互评,我也有另外一个RSS订阅工具,这里都是订阅一些大佬的博客,这些大佬真的是“我去他不来的”,你在他博客上评论N次也不会来你的博客上说一句话。但是,大佬毕竟是大佬,人家文章质量高、博客里干货多。像这类博客,我就用另外一个RSS订阅工具订阅。

总而言之,一个字来概况博友圈的作用:展示、互访、互评!

利用RSS订阅功能添加博友圈,实时展示博友最新文章!

博友圈展示博友文章的好处

个人博客没有评论是没有灵魂的,而博客互访才是博客的运营之道。老张在《如何有效的博客互访、互评!》等众多文章里都提到博客互访的重要性。在没有接触RSS订阅工具之前,老张都是在浏览器的收藏夹里收藏了一两百个博客,每天都要打开一次,但是这近两百个博客中其实只有十来个博客更新内容,所以这样操作浪费了大量的时间。后来有了RSS工具,可以对常访的博客进行订阅,当博客有文章更新时,就会得到通知。但是这样操作也有一个弊端,你的博客每天都会打开好几次,但是RSS订阅工具却不是常打开。这个时候我们可以利用RSS订阅功能添加博友圈,在自己的博客上实时看到博友们更新的内容而可以及时的进行访问评论。

利用RSS订阅功能添加博友圈,实时展示博友最新文章的好处是不言而喻的,首先对于博主来说,不必频繁的打开RSS工具而可以第一时间知道博友的文章更新而进行访问评论,于博友来说,也可以说是得到了到别人博客上的展示,极大了增加了博客的用户体验、极大了增强博友之间的互动、极大增强了博友们博客的曝光度。

我的“博友圈”的入选标准

博友圈不是友情链接,我的博友圈是都是我常访问的一些博客,目前收集了近一百五十个博客。能和老张博客互评达到四五次的,博客原创文章能及时更新的我都会收集到我的博友圈。这样,你的最新文章也就可以展示到我的博客的博友圈里。

如何添加博友圈

搭建rss订阅服务-FreshRSS

关于RSS订阅工具,老张博客在以前折腾过很多,RSS订阅工具的文章也写了有十来篇,其实《RSS订阅工具miniflux、tiny tiny rss、freshrss使用体会》对常用的几个RSS订阅工具进行了全面的比较,有兴趣的可以看看。FreshRSS的项目地址是https://github.com/FreshRSS/FreshRSS/我按照官方的方法Doocker部署一直没有成功,用宝塔的Docker面板部署也没有成功,后来按小宋的《搭建一个自己的rss订阅服务-FreshRSS》方法得要成功,不知什么原因。

docker run -d --restart unless-stopped --log-opt max-size=10m \
-p 8880:80 \
-e TZ=Europe/Paris \
-e 'CRON_MIN=1,31' \
-v /www/dockerdata/freshrss/data:/var/www/FreshRSS/data \
-v /www/dockerdata/freshrss/extensions:/var/www/FreshRSS/extensions \
--name freshrss \
freshrss/freshrss

直接SSH到服务器,运行以上代码,常访问我的博客或是常折腾Docker的小伙伴都可以看懂上面的代码意思,这里就不再多表了。

完成后打开你的IP+端口,就可以安装FreshRss了,成功之后,一定要执行以下两步

1.安装完成后进入设置-账户-API 管理,填写api密码提交。

2.进入设置-认证,勾选允许 API 访问 (用于手机应用),提交。

实现博友圈实时展示最新文章

这里我参考了小段的《跟风利用FreshRSS实现朋友圈》文章,但是遇到了几个坑,给大家提醒下。

3.在自己站点根目录下创建一个php文件,命名为rss.php,将以下代码复制进去。此文件用于放FreshRSS api调用函数,例如:rss.php。访问https://你的博客域名/rss.php,显示数据已保存到JSON文件中。

<?php
/**
 * 获取最新订阅文章并生成JSON文件
 */
function getAllSubscribedArticlesAndSaveToJson($user, $password)
{
    $apiUrl = 'https://你部署FreshRSS的域名/api/greader.php';
    $loginUrl = $apiUrl . '/accounts/ClientLogin?Email=' . urlencode($user) . '&Passwd=' . urlencode($password);
    $loginResponse = curlRequest($loginUrl);
    if (strpos($loginResponse, 'Auth=') !== false) {
        $authToken = substr($loginResponse, strpos($loginResponse, 'Auth=') + 5);
        $articlesUrl = $apiUrl . '/reader/api/0/stream/contents/reading-list?&n=1000';
        $articlesResponse = curlRequest($articlesUrl, $authToken);
        $articles = json_decode($articlesResponse, true);
        if (isset($articles['items'])) {
            usort($articles['items'], function ($a, $b) {
                return $b['published'] - $a['published'];
            });
            $subscriptionsUrl = $apiUrl . '/reader/api/0/subscription/list?output=json';
            $subscriptionsResponse = curlRequest($subscriptionsUrl, $authToken);
            $subscriptions = json_decode($subscriptionsResponse, true);
            if (isset($subscriptions['subscriptions'])) {
                $subscriptionMap = array();
                foreach ($subscriptions['subscriptions'] as $subscription) {
                    $subscriptionMap[$subscription['id']] = $subscription;
                }
                $formattedArticles = array();
                foreach ($articles['items'] as $article) {
                    $desc_length = mb_strlen(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 'UTF-8');
                    if ($desc_length > 20) {
                        $short_desc = mb_substr(strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8')), 0, 99, 'UTF-8') . '...';
                    } else {
                        $short_desc = strip_tags(html_entity_decode($article['summary']['content'], ENT_QUOTES, 'UTF-8'));
                    }
                    
                    $formattedArticle = array(
                        'site_name' => $article['origin']['title'],
                        'title' => $article['title'],
                        'link' => $article['alternate'][0]['href'],
                        'time' => date('Y-m-d H:i', $article['published']),
                        'description' => $short_desc,
                    );

                    $subscriptionId = $article['origin']['streamId'];
                    if (isset($subscriptionMap[$subscriptionId])) {
                        $subscription = $subscriptionMap[$subscriptionId];
                        $iconUrl = $subscription['iconUrl'];
                        $filename = 'https://你部署FreshRSS的域名'.substr($iconUrl, strrpos($iconUrl, '/') + 1);
                        $formattedArticle['icon'] = $filename;
                    }

                    $formattedArticles[] = $formattedArticle;
                }

                saveToJsonFile($formattedArticles);
                return $formattedArticles;
            } else {
                echo 'Error retrieving articles.';
            }
        } else {
            echo 'Error retrieving articles.';
        }
    } else {
        echo 'Login failed.';
    }
    return null;
}
function curlRequest($url, $authToken = null)
{
    $ch = curl_init($url);
    if ($authToken) {
        $headers = array(
            'Authorization: GoogleLogin auth=' . $authToken,
        );
        curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
    }
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    $response = curl_exec($ch);
    curl_close($ch);
    return $response;
}
/**
 * 将数据保存到JSON文件中
 */
function saveToJsonFile($data)
{
    $json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE);
    file_put_contents('output.json', $json);
    echo '数据已保存到JSON文件中';
}

// 调用函数并提供用户名和密码
getAllSubscribedArticlesAndSaveToJson('这里是FreshRSS的用户名', '这里是第3步设置的api密码');

注意修改代码的几处设置。设置好处,直接用浏览器访问https://你的博客域名/rss.php,就会显示“数据已保存到JSON文件中”,表示成功了。

注意一个小坑:两处"你部署FreshRSS的域名",一定要是你的FreshRss设置-账户-API管理里的地址,如果是IP地址,可以修改Freshrss的配置文件改成域名。这个时候有部分地址是有“/p/”这个目录年,一定要看清了。

这个时候注意一个大坑,最开始我的PHP版本是8.0的,访问https://你的博客域名/rss.php死活报错,折腾好长时间也不成功,最后换服务器PHP版本是7.4成功了,不知道是什么原因造成的,但是结果我们却知道了,就是PHP8.0不成功。解决方法是把RSS.php文件放在其他网站上,在第4步代码中“./output.json”修改为“https://放rss.php文件的网站/output.json”

4.主题的funtions.php里添加以下代码:

// 在 functions.php 中添加 shortcode 函数
function display_articles_shortcode() {
    // 获取JSON数据
    $jsonData = file_get_contents('./output.json');
    // 将JSON数据解析为PHP数组
    $articles = json_decode($jsonData, true);
    // 对文章按时间排序(最新的排在前面)
    usort($articles, function ($a, $b) {
        return strtotime($b['time']) - strtotime($a['time']);
    });
    // 设置每页显示的文章数量
    $itemsPerPage = 30;

    // 生成文章列表
    ob_start(); // 开始缓存输出
    foreach (array_slice($articles, 0, $itemsPerPage) as $article) {
    ?>
        <div class="article">
            <h3>
                <img src="<?php echo htmlspecialchars($article['icon']); ?>" alt="Icon" class="icon">
                <a href="<?php echo htmlspecialchars($article['link']); ?>" target="_blank"><?php echo htmlspecialchars($article['title']); ?></a>
            </h3>
            <p>作者:<?php echo htmlspecialchars($article['site_name']); ?></p>
            <p><?php echo htmlspecialchars($article['description']); ?></p>
            <time><?php echo htmlspecialchars($article['time']); ?></time>
        </div>
    <?php
    }
    return ob_get_clean(); // 返回缓存的输出并清除缓存
}

// 注册简码
add_shortcode('display_articles', 'display_articles_shortcode');

5.自定义css样式

/* Article container */
.article {
    border: 1px solid #ccc;
    border-radius: 5px;
    padding: 15px;
    margin-bottom: 20px;
}

/* Article title */
.article h3 {
    margin-top: 0;
}

/* Article icon */
.icon {
    width: 50px;
    height: 50px;
    margin-right: 10px;
    border-radius: 50%;
}

/* Article metadata */
.article p, .article time {
    margin: 5px 0;
}

/* Article time */
.article time {
    font-style: italic;
}

/* Hover effect on article */
.article:hover {
    box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
    transition: box-shadow 0.3s ease;
}
/* Article icon */
.icon {
    width: 1.5em; /* 使用 em 单位可以根据标题字体大小调整图标大小 */
    height: auto; /* 自动调整高度以保持宽高比 */
    margin-right: 10px;
    vertical-align: middle; /* 垂直居中对齐 */
    border-radius: 50%;
}

以上代码可以直接写在主题的CSS文章里,也可以在主题的自定义样式里添加。

6.新建页面,在代码文本模式下输入[display_artices]

7.在宝塔面板下创建一个计划合作,每1小时或2小时访问一次https://你的博客域名/rss.php,这样达成生成最新的output.json文件以便博友圈调取展示。

至此,已全部完成,样式可以自行修改CSS文件!

 

 

 

 

❌