分类
WordPress美化

再见,2020!你好,2021!

兜兜转转又是一年,2020是不平凡的一年,这一年发生了太多的事,建立了这个小站,无处不在的疫情,得到一些想要的,失去一些放不下的,徘徊在一些想要到达的……不能说这一年过的很糟糕,只是觉得这一年过的恍恍惚惚,时间少了,野心大了,不满足的多了。
2020前半年在家上课,总想学点什么,就接触了易语言,lua语言,用它们写出了我的第一款游戏脚本。学习了html和css,亲手美化了这个小站。又学习了php,解决了小站后端的一些问题。家里的宽带用着不尽人意,就重新布线,学习计算机网络,自己一步一步调教家里的网络。网络完善后又动手组装了一台家用nas,用来存储一些不常用的重要文件。
2020后半年学校开学,回到了学校,跟着正常的课表每天上课下课。也学到了一些东西,但总感觉没有在家学习的充实。加入到学院的科创中心,认识了很多人,也又有了继续学习新知识的动力。在学校里,能干自己喜欢的事情的时间少了,小站更新的频率也变低了。
一整年忙忙碌碌,却表现得不让自己满意。还有几个小时就要2021年了,心里还是非常期待的,期待明年的自己会变得更加优秀,期待明年的自己能学会更多,期待明年的自己不会再失去,期待明年的自己变得让自己满意。

再见,2020!你好,2021!

分类
计算机理论

路由器基础概念

路由器(Router)又称网关设备(Gateway)是用于连接多个逻辑上分开的网络,所谓逻辑网络是代表一个单独的网络或者一个子网。当数据从一个子网传输到另一个子网时,可通过路由器的路由功能来完成。因此,路由器具有判断网络地址和选择IP路径的功能,它能在多网络互联环境中,建立灵活的连接,可用完全不同的数据分组和介质访问方法连接各种子网,路由器只接受源站或其他路由器的信息,属网络层的一种互联设备。

常见名词

  • wan口:WAN口是广域网接口,接外网用的。要实现正常无线上网需要猫、无线路由器和可以无线上网的设备(笔记本电脑、智能手机、只能电视)。在广域网内,用于通信的传输装置和传输介质可由电信部门提供。
  • lan口:路由器LAN接口是连接的内网,家里如有几台设备需要拉线上网都是从这个接口接出去的。这是一个输出口。
  • 管理地址/路由器IP:路由器的管理地址也叫网址、IP地址,是进入路由器的接口。电脑连接路由器后,在电脑浏览器的地址栏中输入该地址,点击回车键就可以登录路由器。一般路由器会在背面贴有管理地址、用户名及初始密码(部分路由器不需要用户名登录,如:小米路由
  • 路由器固件:路由器的系统,概念类似于手机或电脑的操作系统。通常不同的路由器厂家会有不同的路由器固件。
  • 不死固件/不死breed:可以理解成比路由器固件更底层的固件,可以将正常的路由器固件安装在不死固件之上,当刷机玩家进行刷机时,如果出现刷机失误导致路由器变砖无法正常启动,可以通过不死固件进行救砖恢复。
  • MAC地址:MAC地址也叫物理地址、硬件地址,由网络设备制造商生产时烧录在网卡(Network lnterface Card)的EPROM(一种闪存芯片,通常可以通过程序擦写)。形象地说,MAC地址就如同身份证上的身份证号码,具有唯一性。
  • DHCP服务器:DHCP(动态主机配置协议)是一个局域网的网络协议。指的是由服务器控制一段IP地址范围,客户机登录服务器时就可以自动获得服务器分配的IP地址和子网掩码。DHCP服务器就是路由器中为链接的设备分配局域网IP的角色。
  • PPPOE拨号:PPPOE拨号是为了实现PPPoE Client与PPPoE Server 之间的连接,建立PPPoE会话。工作流程包含发现(Discovery)和会话(Session)两个阶段,发现阶段是无状态的,目的是获得 PPPoE 终端(在局端的ADSL设备上)的以太网 MAC 地址,并建立一个惟一的 PPPoE SESSION-ID。发现阶段结束后,就进入标准的PPP会话阶段。
  • 2.4GHz/5GHz:5GH和2.4Ghz是无线路由器用的无线频率,如果同时标的话就是双频无线路由器,是指同时工作在2.4GHz和5.0GHz频段的无线路由器。
    • 2.4GHz传输速率通常为72Mbps,穿墙性更好。家电与一些无线通信设备通常使用2.4GHz
    • 5GHz传输速率能达到千兆,但穿墙性差,信号不稳定。

后续会继续补充~

分类
服务器与web应用

PocketMine核心分支介绍

众所周知,PocketMine-MP是一款我的世界服务器出色的核心,但其实它还有很多同源的分支,这篇文章就用来详细介绍一下各个分支及其特性。

PMMP

  • 简述:邪恶的官方势力内核
  • 最后支持游戏版本:1.16.x
  • API:3.11.4 (最新)
  • PHP:≥7.2
  • 状态:活跃
  • 介绍:官方内核,更新迅速,国外的插件体系较为完善,对api要求较为严格

Altay

  • 简述:PMMP的优秀分支
  • 最后支持游戏版本:1.14.x
  • API要求:3.0.0
  • PHP要求:≥7.2
  • 状态:活跃
  • 介绍:Altay是PMMP的一个分支,在其基础上进行了优化,兼容性较PMMP较好,活跃更新

Steadfast2

  • 简述:多版本游戏核心
  • 最后支持游戏版本:1.x(测试1.14.6进服无法加载)
  • API:1.12.0
  • PHP:≥7
  • 状态:活跃
  • 介绍:老牌PM内核,稀有的支持多版本,多数时候用于游戏服

Genisys

  • 简述:曾经最好用的内核
  • 最后支持游戏版本:1.0
  • API:——
  • PHP要求:≥7
  • 状态:停更
  • 介绍:PM早期的第三方内核,各项优化较完善,兼容性极佳,曾经是最优秀最受欢迎的内核

GenisysPro

  • 简述:Genisys的继承者
  • 最后支持游戏版本:1.1.x
  • API:——
  • PHP要求:≥7
  • 状态:停更
  • 介绍:中外开发者联手基于Genisys继续开发的项目,继承了Genisys的完善优化和高兼容性,在国内倍受欢迎

分类
服务器与web应用

Windows server搭建我的世界服务器(基岩端)

我的世界基岩版就是我们所说的手机国际版

在Windows系统上搭建我的世界服务器还是比较简单的,只需要简单的几步即可完成服务器的部署,和小伙伴们快乐的开黑~

首先我们需要明确几个基础的概念:

  • 服务器核心:这是服务器运行的核心文件,当前基岩版服务器常见的核心种类有三种:BDS,PocketMine,Nukkit
    • 其中,PocketMine的插件是比较丰富的,本文也以PocketMine核心为例,该核心有各种版本,建议使用最新版本或接近最新版本的,核心的版本决定我的世界客户端的版本。
  • 服务器配置文件:在根目录下文件名为server.properties的文件就是服务器的配置文件,在这个文件中可以设置服务器人数,端口号,服务器名称,控制台语言,游戏模式等基础属性
  • 服务器插件:插件通常会放plugin文件夹中,在各种各样的插件可以实现各种各样的功能,如经济api插件可以为服务器提供金钱经济系统,商店插件可以实现商店功能
  • 插件配置文件:插件配置文件是控制各种插件参数的文件,通常会放在plugin_data文件夹中
  • 地图文件:地图文件通常放在world文件夹中
  • OP:服务器的管理员
  • 指令:实现服务器某些功能的指令,如修改当前时间,天气

具体步骤

  1. 我们需要准备好一个PocketMine服务器核心(下方提供1.16.20版本的下载),重命名为PocketMine-MP.phar
  2. 准备服务器运行需要的php环境(即下方下载框下载到的bin文件夹),将该文件夹和服务器核心放到同一目录下
  3. 下载vc_redist.x64文件,双击运行,安装服务器运行必须的vc库文件
  4. 在核心的同一目录下加入start.bat启动文件,文件可以在该页面下方直接下载。
  1. 双击start.bat文件,即可启动服务器,下图是已经安装插件的服务端启动的控制台界面

分类
服务器与web应用

Windows server系统如何开放防火墙端口

在我们日常使用Windows server系统运行程序时,常常因为某个程序运行时的必须端口未开放而导致程序无法正常联网运行。这是因为系统自带的防火墙系统默认关闭部分端口导致的,要解决这个问题只需要在防火墙的端口放行列表中添加需要开放的端口即可。

具体步骤

  1. 从开始菜单打开“控制面板”,点击“控制面板”中的防火墙。
  1. 点击“防火墙”界面的高级设置。在“高级设置”界面可以看到入站规则与出站规则两个选项。
  1. 在我们需要放行某个端口时,只需要点击入站规则或出站规则,在右侧的操作栏点击“新建规则”,会弹出新建向导界面。
  1. 在向导界面选择“端口”→“TCP或UDP”→“选择所有端口或特定端口”→“允许链接”→“配置文件三项全选”→“设置端口名称”,即可完成相关端口的开放。
分类
WordPress美化

WordPress美化 – 下雪特效

马上就要过年了,今天来分享一个下雪的美化特效。

具体教程

该js文件已支持https,同时已将其及相关雪花图片进行CDN加速处理,可直接调用。

找到WordPress主题的footer.php文件,在末尾</body>上方(这样可以最后加载特效,以免影响其他内容的访问速度),添加以下代码:

<script type="text/javascript" src="https://api.dujin.org/js/xiaxue/xiaxue.js"></script>

保存上传/替换/覆盖即可。

如果有缓存的小伙伴记得清理下缓存(静态文件缓存、页面缓存、CDN缓存、内存缓存等)。

懂前端的同学可以直接将js代码添加到源码中即可:

(function() {
    function k(a, b, c) {
        if (a.addEventListener) a.addEventListener(b, c, false);
        else a.attachEvent && a.attachEvent("on" + b, c)
    }

    function g(a) {
        if (typeof window.onload != "function") window.onload = a;
        else {
            var b = window.onload;
            window.onload = function() {
                b();
                a()
            }
        }
    }

    function h() {
        var a = {};
        for (type in {
            Top: "",
            Left: ""
        }) {
            var b = type == "Top" ? "Y" : "X";
            if (typeof window["page" + b + "Offset"] != "undefined")
                a[type.toLowerCase()] = window["page" + b + "Offset"];
            else {
                b = document.documentElement.clientHeight ? document.documentElement : document.body;
                a[type.toLowerCase()] = b["scroll" + type]
            }
        }
        return a
    }

    function l() {
        var a = document.body,
            b;
        if (window.innerHeight) b = window.innerHeight;
        else if (a.parentElement.clientHeight) b = a.parentElement.clientHeight;
        else if (a && a.clientHeight) b = a.clientHeight;
        return b
    }

    function i(a) {
        this.parent = document.body;
        this.createEl(this.parent, a);
        this.size = Math.random() * 10 + 15; /* 两个数字控制雪花的大小,目前代码控制雪花尺寸为10~25px */
        this.el.style.width = Math.round(this.size) + "px";
        this.el.style.height = Math.round(this.size) + "px";
        this.maxLeft = document.body.offsetWidth - this.size;
        this.maxTop = document.body.offsetHeight - this.size;
        this.left = Math.random() * this.maxLeft;
        this.top = h().top + 1;
        this.angle = 1.4 + 0.2 * Math.random();
        this.minAngle = 1.4;
        this.maxAngle = 1.6;
        this.angleDelta = 0.01 * Math.random();
        this.speed = 2 + Math.random()
    }
    var j = false;
    g(function() {
        j = true
    });
    var f = true;
    window.createSnow = function(a, b) {
        if (j) {
            var c = [],
                m = setInterval(function() {
                    f && b > c.length && Math.random() < b * 0.0025 && c.push(new i(a));
                    !f && !c.length && clearInterval(m);
                    for (var e = h().top, n = l(), d = c.length - 1; d >= 0; d--)
                        if (c[d]) if (c[d].top < e || c[d].top + c[d].size + 1 > e + n) {
                                c[d].remove();
                                c[d] = null;
                                c.splice(d, 1)
                            } else {
                                c[d].move();
                                c[d].draw()
                            }
                },
                    40);
            k(window, "scroll", function() {
                for (var e = c.length - 1; e >= 0; e--) c[e].draw()
            })
        } else g(function() {
                createSnow(a, b)
            })
    };
    window.removeSnow = function() {
        f = false
    };
    i.prototype = {
        createEl: function(a, b) {
            this.el = document.createElement("img");
            this.el.setAttribute("src", b + "https://api.dujin.org/js/xiaxue/" + Math.floor(Math.random() * 4) + ".gif"); /* 注意修改为四个雪花文件所在的目录地址 */
            this.el.style.position = "absolute";
            this.el.style.display = "block";
            this.el.style.zIndex = "99999";
            this.parent.appendChild(this.el)
        },
        move: function() {
            if (this.angle < this.minAngle || this.angle > this.maxAngle)
                this.angleDelta = -this.angleDelta;
            this.angle += this.angleDelta;
            this.left += this.speed * Math.cos(this.angle * Math.PI);
            this.top -= this.speed * Math.sin(this.angle * Math.PI);
            if (this.left < 0) this.left = this.maxLeft;
            else if (this.left > this.maxLeft) this.left = 0
        },
        draw: function() {
            this.el.style.top = Math.round(this.top) + "px";
            this.el.style.left = Math.round(this.left) + "px"
        },
        remove: function() {
            this.parent.removeChild(this.el);
            this.parent = this.el = null
        }
    }
})();
createSnow("", 40);
分类
WordPress教程

WordPress教程 – 仪表盘添加百度统计数据展示模块

现在国内有不少的站点都是使用百度统计来统计每日的访客的,不得不说百度统计在统计浏览量、访客数、ip数量这方面还是非常不错的。

这篇教程是来教大家如何把百度统计的统计模块添加到站点后台的仪表盘中,这样,我们就不必每天单独打开百度统计的的页面去查看这些数据了。

添加百度统计数据模块

WordPress 百度统计可以通过 function 函数实现,只需要在当前使用主题目录下的functions.php文件中添加以下代码即可:

//WordPress 仪表盘添加百度统计数据展示模块 - https://wpexp.cn/86.html
function wpexp_add_dashboard_widgets() { 
wp_add_dashboard_widget('custom_help_widget', '百度统计数据', 'bdtj_dashboard_wpexp'); 
} 
add_action('wp_dashboard_setup', 'wpexp_add_dashboard_widgets' ); 
function bdtj_dashboard_wpexp() {
$body = array('header'=>array(
'username' => '百度统计账户',
'password' => '百度统计密码',
'token'=>'百度统计token',
'account_type'=>1
),'body'=>array(
'site_id'=>'百度统计站点ID',
'start_date'=>date("Y-m-d",strtotime("-1 day")),
'end_date'=>date("Y-m-d"),
'metrics'=>'pv_count,visitor_count,ip_count',
'method'=>'overview/getTimeTrendRpt'
));
$url='https://api.baidu.com/json/tongji/v1/ReportService/getData';//百度商业账号请求地址
$request = new WP_Http;
$result = $request->request( $url, array( 'method' => 'POST', 'body' => json_encode($body)) );
$rst=json_decode($result['body']);

$yest=$rst->body->data[0]->result->items[1][0];
$nowt=$rst->body->data[0]->result->items[1][1];
echo '日期&nbsp&nbsp&nbsp&nbsp浏览量&nbsp&nbsp&nbsp&nbsp访客数&nbsp&nbsp&nbsp&nbspIP数';
echo '</br>';
echo '今日:&nbsp&nbsp&nbsp&nbsp';
for($i=0;$i<count($nowt);$i++){
echo $nowt[$i];
echo '&nbsp&nbsp&nbsp&nbsp';
}
echo '</br>';
echo '昨日:&nbsp&nbsp&nbsp&nbsp';
for($i=0;$i<count($yest);$i++){
echo $yest[$i];
echo '&nbsp&nbsp&nbsp&nbsp';
}
}

使用了 WordPress 自带的 HTTP 请求类,没有使用 Curl 提交 Post 请求。

获取代码相关参数

百度统计的 Token 值可以自行申请开通:在百度统计右上角选择对应站点,点击顶部导航菜单的管理,然后在左侧菜单底部找到其他设置数据导出服务,选择开通即可获得百度统计 Token 值。

百度统计站点ID可以点击网站概况,然后地址栏尾部会有个siteId=1234567这串对应数字就是站点ID。

分类
服务器与web应用

强制更改Docker容器MYSQL数据库密码

使用docker容器时,通过镜像安装mysql数据库,但是容器内的mysql密码没有自定义设置,需要重新设置密码

解决方案

1.更改配置文件,增加”忘记密码启动”模式
2.重新设置root密码
3.删除”忘记密码启动”模式
4.重启容器镜像

具体操作

  1. 进入容器
#查看docker容器ID
[root@web01 ~]# docker ps -a
CONTAINER ID        IMAGE                       COMMAND                  CREATED             STATUS              PORTS                NAMES
ec35e80c33f7        seafileltd/seafile:latest   "/sbin/my_init -- ..."   3 days ago          Up 14 hours         0.0.0.0:80->80/tcp   seafile
 
#进入容器
[root@web01 ~]# docker exec -it ec35e80c33f7 bash
root@ec35e80c33f7:/opt/seafile# 
  1. 编辑mysql配置文件,增加”忘记密码启动”模式:skip-grant-tables
#必须是docker.cnf,如果没有就直接编辑个
root@ec35e80c33f7:/opt/seafile# vi /etc/mysql/conf.d/docker.cnf
root@ec35e80c33f7:/opt/seafile# cat /etc/mysql/conf.d/docker.cnf
[mysqld]
skip-host-cache
skip-name-resolve
skip-grant-tables
  1. 退出容器,重启docker容器
[root@web01 ~]# docker restart ec35e80c33f7
ec35e80c33f7
  1. 进入容器,输入mysql命令,免密登录MySQL
[root@web01 ~]# docker exec -it ec35e80c33f7 bash
root@ec35e80c33f7:/opt/seafile# mysql
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 5
Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04
 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
 
MariaDB [(none)]> 
  1. 设置root用户密码,刷新权限,退出mysql
#进入mysql数据库
MariaDB [(none)]> use mysql;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A
 
#更改root密码
Database changed
MariaDB [mysql]> UPDATE user SET Password = password ( '123456' ) WHERE User = 'root';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 4  Changed: 0  Warnings: 0
 
#刷新权限
MariaDB [mysql]> flush privileges;
Query OK, 0 rows affected (0.00 sec)
 
#退出mysql
MariaDB [mysql]> quit
Bye
root@ec35e80c33f7:/opt/seafile# 
  1. 重新编辑mysql配置文件,删除”忘记密码启动”模式,退出重启容器
root@ec35e80c33f7:/opt/seafile# vi /etc/mysql/conf.d/docker.cnf
root@ec35e80c33f7:/opt/seafile# exit
[root@web01 ~]# docker restart ec35e80c33f7
ec35e80c33f7
  1. 进入容器,使用新密码登录MySQL
[root@web01 ~]# docker exec -it ec35e80c33f7 bash
root@ec35e80c33f7:/opt/seafile# mysql -uroot -p123456
Welcome to the MariaDB monitor.  Commands end with ; or g.
Your MariaDB connection id is 6
Server version: 10.1.34-MariaDB-0ubuntu0.18.04.1 Ubuntu 18.04
 
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
 
Type 'help;' or 'h' for help. Type 'c' to clear the current input statement.
 
MariaDB [(none)]> 

分类
服务器与web应用

MYSQL主从复制出现Could not initialize master info structure错误

日日备份是运维一个网站的基本要求,数据库的备份尤其是重中之重,MYSQL数据库支持两台服务器进行主从同步,既一台服务器备份数据库到另一台服务器。但有时我们在通过slave start启动同步进程时会出现Could not initialize master info structure错误。这个错误比较常见,解决方法如下:

  1. 进入Mysql,查看同步状态:show slave statusG;,记住当前同步的文件名和位置
  2. 停止复制进程:stop slave;
  3. 重置复制信息:reset slave;
  4. 重新配置Mysql主从复制信息:
mysql> change master to 
    -> master_host='主库ip',
    -> master_port=主库端口,
    -> master_user='复制用户名',
    -> master_password='复制密码',
    -> master_log_file='已同步的文件名',
    -> master_log_pos=已同步的文件位置;
  1. 启动复制进程:start slave;

启动复制进程不报错的话,说明已经正确配置成功了。通过show slave statusG; 命令能看到日志读取IO线程正常工作,其他信息均正常。

分类
WordPress教程

WordPress教程 – 用纯代码限制评论间隔时间

各种垃圾评论让我们防不胜防,但我们可以通过合理的设计各种限制,在一定情况下缓解。这一次分享的就是限制用户评论太快的代码。

在设定的时间内,除了对当前文章生效,对其他文章同样生效,需过了设定时间才可继续评论。

在主题根目录下的functions.php文件中的<?php下添加以下代码并保存。

//评论间隔
add_filter('comment_flood_filter', 'suren_comment_flood_filter', 10, 3);
function suren_comment_flood_filter($flood_control, $time_last, $time_new)
{
 $seconds = 60;//间隔时间
 if(($time_new - $time_last) < $seconds)
 {
	$time=$seconds-($time_new - $time_last);
wp_die ('评论过快!请'. $time.'秒后再次评论');
 }
 else
 {
 return false;
 }
}