喜报:本站图片目前全部使用 WebP

如题,现在所有图片均使用 WebP 格式。每张图片几乎只有原来的一半大,提升了浏览体验。
另:咱删除了会引起 CPU 飙升的 particles.js,为减缓温室效应做贡献。此外,这个主题并不易于阅读的配色,咱会在以后更改。

注册 DE 域名的经历

在咱购买了人生中第一台 vps 一段时间后,咱决定买一个域名。在此之前,咱一直用的是 dynu.com 提供的免费二级域名。可惜这个域名限制颇多,只允许添加 4 条 DNS 记录,而且也必须使用其提供的 Nameserver。若想要解除限制,获得更多功能,还必须每年交 9.99 美元的会员费。然而它本身也并不好用啊,咱拿十美元完全可以买一年域名了。所以,我才打算自己买域名来用。这篇博客记录了咱在 Dynadot 上购买 DE 域名的经历。

怎么就选择了这个域名呢

其实,DE 域名在某些方面来讲并不是一个很好的选择。但是架不住它便宜啊。其它域名诸如 .XYZ 和 .TOP 也算是便宜域名了,然而这仅限于第一年。后续再要续费时,价格就变高了。这样一来,花费反而高了。调查一番后,咱找到了这个域名费用稳定在 40 RMB 的 DE 域名(实际价格每家商家都会有所不同)。

选择域名商家

最开始咱打算在 Riven Cloud 购买这个域名,却发现只要用机房的 ip 登录,网站就会因不安全为由阻止购买。而当你用中国的 ip 登录时,DE 域名又消失了。在经过反复比价后,咱最终确认从 Dynadot 购买。商家如 GoDaddy 无一例外地都要比 Dyandot 贵。咱本来奔着便宜这一点,自然要挑最便宜的。到现在为止,咱还没有意识到,为了注册这个 DE 域名,咱即将面对什么。

正篇开始

DE 域名还有一个好处,那就是只要你想要注册的域名还可用,且不在拍卖中,无论长短,域名的价格都是一样的。根据网络资料,DE 域名主体长度要求在一个至 63 个字符之间。很明显单字域名肯定是没有的。双字符的我也已经在 Dynadot 上批量查找过,也是都被注册了。众所周知,域名中可以使用 “-“ ,但是其前后必须有其它字母或数字。这样我们可以计算出两个字符以内的域名共 36×36=1296 个。就按照 Dynadot 上提供的价格计算,注册所有这样的域名,一年只需要 1296×40=51840 RMB。咱就只好退而求其次了。
可是这并不能解释咱为什么注册了这个 4iw.de。4iw到底有什么意味,咱也不是很清楚。咱有个同学说他现在他看到 4i 就会想笑,具体什么意思只能大家自己琢磨了。
Dynadot 支持通过支付宝直接支付人民币。咱在支付宝付完钱之后,却没有拿到域名,订单很长时间内订单都显示处理中。没过一会儿,咱就收到了 Dynadot 的邮件,要求验证手机号码。本来没选择国内平台的一个原因就是需要手机号,结果你也要?钱都付了,就照做吧。期间咱还和客服进行了交流,态度还行,但其没有给咱提供替代方案。所以咱就找了个号接了短信,完成了验证。可到这还没结束。Dynadot 又给咱发了一封邮件。如图所示:
Update Dynadot account information & Whois contact record
最开始,咱按照要求认真的重新填写了联系方式(之前是随便填的)。可惜咱没注意到完成后还要发邮件告知他们,导致咱又着急地去询问。第一遍改完还不满意,要求咱继续更改。幸运的是,第二遍过了,咱终于拿到了域名。

Dynadot 的一些优势

Dynadot 总体来说,呃,还是不错的。它的界面易于管理,也比较现代化。如图所示:
截图 2024-05-08 22-33-10.png
除此以外,Dynadot 在你购买了域名后赠送了免费的建站工具(网页可以托管于其上),以及电子邮箱(可以使用你购买的域名)。虽然用处并不是很大,这些功能还是挺有意思的。

DE 域名的一些缺点

首先第一个感受到的是它不支持 Whois Privacy。也就是说你提交的联系信息不能被隐藏。当然,如果你介意的话,你可以填写不真实的信息,不过有可能不给过。
其二,域名注册商告诉你的是其不限制外国人注册。但实际上是有影响的。具体来说,如果域名被举报了,就一定要提供在德国的有效联系信息,否则可能会被收走。详情请参看 德国 .de 域名对外国人的限制
最后,咱曾看到有博主称,de 域名转移后,无论原本有效期还有多久,都会变为一年。原来的文章咱暂时没找到,大家可以自行考证。

结语

暂时就是这些了,其它的想到了以后再更新一下。这篇拖了好久了。


关于我所用过的几款 Minecraft 启动器的评测

写在前面

一个好的启动器对于和咱一样的 Minecraft 玩家来说当然是不可或缺的。只有选择了一款稳定实用的启动器后才能安心游戏啊!因而,咱就在这篇文章中简单评价一下咱所用过的启动器,以供大家做个参考。
这里所讨论的启动器,用途都是一般游玩,并不会包括种种作弊端。

官方启动器

官方的启动器真的是一言难尽。首先给咱的感觉就是相当臃肿。(又是那种 Chromium—based 的软件)启动后会有一些相当消耗性能的动画,不过总体外观还是比较美观的。本身没有太多功能,想安装个 OF 都要手动。有的时候运行时会自动更新,会花上较长时间,相当烦人。所以只适合单纯想要完没有任何修改原版的玩家。
不过好处还是有的。皮肤和披风可以直接在启动器内轻松切换,能够查看官网咨询,登录不容易掉,并且是从官方源下载的游戏。(官方启动器其实可以开大号字体的)
A image showing official Minecraft launcher

启动器界“御三家”

HMCL

不得不说的一点是,HMCL 是三家中唯一支持 Windows, OS X 以及 GNU/Linux 的启动器。在 Linux 上该软件以 jar 的方式提供。如果感兴趣的话,可以参看官方给出的支持系统列表。
整体动画相当丝滑,不过咱在使用中也遇到了一些卡顿的情况,一般不影响使用,但遇到了会感觉比较难受。
支持常见的设置,自动下载安装 mod,整合包。同时也有版本隔离功能(玩模组时必备)。

A image showing HMCL

PCL2

PCL 因技术原因只支持 Windows 系统,咱有幸在学校的电脑上使用过,这里就不放截图了。PCL 本身动画也很清爽,个人感觉使用较 HMCL 更加简约,也更有设计感。

BakaXL

可能是三款里最绚丽的一款,而且还附带有一些神奇但可能并没有什么用处的功能。不过很可惜它同样只支持 Windows。咱曾经也在学校电脑上使用过它,然而它却在启动时遇到了某个 dll 文件缺少的情况。总之就是有点小问题,不能做到开箱即用,所以不是很推荐。当然喽,如果你只是想追求一个非常酷的启动器,并且恰好是一个 Windows 用户的话,那么它将很适合你。


来自其他地方的启动器

在这里我会介绍另外两款我所用过的启动器

Prism Launcher

这款启动器是大名鼎鼎的 Multimc 的一个分支。(不过更准确的说,它其实是从 Polymc 中 folk 出来的。据说是因为 Polymc 被用于一些“政治宣传”,在这里不过多讨论。)
它的核心功能就是能够创建一个个 MC 实例,与 Multimc 相同。相对于 Multimc,它能够直接在客户端内下载 Curseforge 整合包,但是 Multicmc 现在做不到。
相比于“御三家”,它管理 mod 以及整合包的能力更加强大,能从 Curseforge 以及 Modrinth 上获取资源,并自动更新。
它的界面更加贴近系统(不过其实是 KDE 风格),有些人可能会更喜欢这种界面风格统一的美。对咱来说,它的设计刚刚好。
A image showing Prism Launcher

Betacraft

这款启动器其实主要功能是用来完各种远古版本。版本齐全,常见的出现于老版本的问题都被完美修复了。它甚至还能在客户端内加 mod。以 jar 提供,支持绝大多数平台。
Betacraft

Altlauncher

最后提一下这个启动器。它专注于整合包支持。感兴趣的可以自行探索。

结语

感谢你的阅读!如果想要打个招呼,欢迎通过邮箱或者 Telegram 联系咱哦。


利用 Let’s Encrypt 给 Hexo 博客上 HTTPS

写在前面

如今 HTTPS 对于一个网站来说几乎是必不可少的。但可惜的是关于 Hexo 使用 HTTPS 的教程比较稀少。咱当然可以根据网上的教程,为 Apache 或者 Nginx 上 HTTPS,并且把 Hexo 的文章部署上去。但如果是这样的话,我也没有必要写这篇教程了。又或者,咱其实可以查阅 Nodejs 官方提供的文档中关于 HTTPS 模块的内容,然后自己照着写 server.js , 不过谁想阅读文档呢?因此,咱以 为Hexo博客启用HTTPS协议 为基础,写了一篇几乎可以说是’step-by-step’的教程。当然,咱用的 SSL 是免费的 Let’s Encrypt.

准备工作

  1. 一台可以从外网访问的主机(当然,已经安装了 Hexo 以及必要软件。还有,你用的应该是 GNU/Linux 吧?)
  2. 一个域名
  3. Certbot

Certbot 部分

首先咱要安装 Certbot。官方文档给的方案是使用 snap,不过咱觉得这样并不有利于管理,所以建议大家选用原生的软件包管理来装吧。

  • Debian 系安装:sudo apt install certbot
  • 红帽系安装:sudo dnf install certbot

接下来我们在终端里运行 sudo certbot certonly, 跟着指引输入,需要的必要信息有邮箱地址和域名。
颁发证书后会 Certbot 会告诉你证书的位置,把它记录下来。一般形如 /etc/letsencrypt/live/bethaod.gleeze.com/fullchain.pem(证书),/etc/letsencrypt/live/bethaod.gleeze.com/privkey.pem(密钥)。其他的文件不需要去管。
不过呢如果咱现在不是 root 用户的话,是访问不了这两个文件的。 为了保证即使是以普通用户的身份运行服务器时,咱依然能访问这两个文件,此时要改变这两个文件的访问权限。
运行chmod 0755 /etc/letsencrypt/{live,archive}, 然后chmod 0644 /etc/letsencrypt/live/yourdomain.com/{privkey,fullchain}.pem。记得要用sudo,并且替换成你的目录。
到这里证书就已经准备好了。

编辑server.js

咱直接把改好的代码贴上来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
'use strict';

const connect = require('connect');
const http = require('http');
const chalk = require('chalk');
const Promise = require('bluebird');
const open = require('open');
const net = require('net');
const url = require('url');
const https = require("https");
const fs = require("fs");

module.exports = function(args) {
const app = connect();
const { config } = this;
const ip = args.i || args.ip || config.server.ip || undefined;
const port = parseInt(args.p || args.port || config.server.port || process.env.port, 10) || 4000;
const { root } = config;

//$PWD is your actual file path
const options = {
key:fs.readFileSync("/etc/letsencrypt/live/yourdomain.com/privkey.pem"),
cert:fs.readFileSync("/etc/letsencrypt/live/yourdomain.com/fullchain.pem")
};
//enable Https server
//Using https.createServer()
//
return checkPort(ip, port).then(() => this.extend.filter.exec('server_middleware', app, {context: this})).then(() => {
if (args.s || args.static) {
return this.load();
}

return this.watch();
}).then(() => startServer(https.createServer(options,app), port, ip)).then(server => {
const addr = server.address();
const addrString = formatAddress(ip || addr.address, addr.port, root);

this.log.info('Hexo is running at %s . Press Ctrl+C to stop.', chalk.underline(addrString));
this.emit('server');

if (args.o || args.open) {
open(addrString);
}

return server;
}).catch(err => {
switch (err.code) {
case 'EADDRINUSE':
this.log.fatal(`Port ${port} has been used. Try other port instead.`);
break;

case 'EACCES':
this.log.fatal(`Permission denied. You can't use port ${port}.`);
break;
}

this.unwatch();
throw err;
});
};


function startServer(server, port, ip) {
return new Promise((resolve, reject) => {
server.listen(port, ip, resolve);
server.on('error', reject);
}).then(() => server);
}

function checkPort(ip, port) {
if (port > 65535 || port < 1) {
return Promise.reject(new RangeError(`Port number ${port} is invalid. Try a number between 1 and 65535.`));
}

const server = net.createServer();

return new Promise((resolve, reject) => {
server.once('error', reject);
server.once('listening', resolve);
server.listen(port, ip);
}).then(() => { server.close(); });
}

function formatAddress(ip, port, root) {
let hostname = ip;
if (ip === '0.0.0.0' || ip === '::') {
hostname = 'localhost';
}

return url.format({protocol: 'http', hostname: hostname, port: port, path: root});
}

最后不要忘了把yourdomain.com替换掉。

结语

总的来说这一套操作还是很简单的,快来练习一下吧!
如果觉得写得不错的话,欢迎通过邮箱或者 Telegram 联系咱哦。
更新 实际上通过 Nginx 反向代理并配置 HTTPS 是更好的方式。或者阁下可以直接套 Cloudflare,也能有 HTTPS。