TrueNAS(FreeBSD)通过Jail安装calibre-web

首先在TrueNAS的Web管理界面新建Jail。

新建Jail

配置网络,建议关闭IPv4的DHCP,以便于管理。

网络配置

待Jail配置完成后,启动Jail并进入命令行。

进入命令行

在命令行中,以此执行以下指令:

pkg update
//若提示需要安装pkg,输入y,可能等待较长时间。
pkg install sqlite3 libxml2 libxslt python3
//安装需要的依赖包
python3 -V
//查询python3具体版本,便于安装扩展包,本次安装的版本为Python3.8
pkg install py38-sqlite3 py38-pip
//安装对应的sqlite3、pip扩展包
pip install calibreweb
//使用pip安装calibreweb
cps
//运行calibreweb,正常情况下没有任何输出,且关闭命令行将终止运行
nohup cps
//使用nohup指令保持calibreweb在后台运行,但关闭终端后,若安装豆瓣搜刮插件,元数据搜索将出现错误。
//推荐使用screen命令,具体在此不对赘述。

calibreweb默认使用8083端口提供Web服务,即在浏览器中打开http://address:8083即可进行配置,默认用户名为admin,默认密码为admin123。

首次登陆

登陆后可能会要求Database,稍后再说。

可以将存有图书的目录作为挂载点挂在到Jail上(挂在是需终止Jail)。

添加挂载点
添加挂载点
添加挂载点
添加挂载点

在Windows上安装calibre软件,并新建一个书库,在书库文件夹中找到metadata.db文件,或点击下载,并上传到True NAS的挂载目录里。重新启动Jail并运行calibreweb后,设置database location为上传的文件即可(记得修改文件权限)。

元数据中,豆瓣搜刮的插件使用github上的开源代码点击打开,按照说明添加文件后重启即可。

电子书格式转换功能直接使用Windows的文件不成功,需要在Jail里安装calibre:

pkg install calibre

安装好后,在calibre-web的设置→编辑基本设置→扩展程序配置中,设置Calibre 电子书转换器路径,默认路径为:

/usr/local/bin/ebook-convert

PS:默认上传功能未开启,且admin上传权限也需要手动允许。

PHP中时间的处理

常用格式符号:

d - 表示月里的某天(01-31)
m - 表示月(01-12)
Y - 表示年(四位数)
1 - 表示周里的某天
h - 带有首位零的 12 小时小时格式
i - 带有首位零的分钟
s - 带有首位零的秒(00 -59)
a - 小写的午前和午后(am 或 pm)

无需转换可使用date()函数:

date('Y-m-d h:i:sa');
date('Y-m-d h:i:sa', $d);  //$d为Unix时间戳

可使用mktime()函数获得某一日期的Unix时间戳:

mktime(hour,minute,second,month,day,year)

strtotime()函数可将自然语言智能的转化为时间戳(个人认为不可靠):

strtotime("10:38pm April 15 2015");
strtotime("tomorrow");
strtotime("next Saturday");
strtotime("+3 Months");
strtotime("+6 weeks",$startdate);

可也是用DateTime类进行高级操作:

$datetime = new \DateTime;
$datetime->format('Y-m-d H:i:s');

$datetime = new \DateTime('2016-06-13');

$datetime = \DateTime::createFromFormat('Ymd','20160618');
 
$datetime->getTimestamp();

$datetime->setTimestamp();

$datetime->setDate(2015, 2, 28); //类似mktime()


$datetime1 = new \DateTime('2016-01-01 10:11:18');
 
$datetime2 = new \DateTime('2017-05-11 22:21:21');
 
$interval = $datetime1->diff($datetime2);
 
print_r($interval->format('%Y'));
 
// %表示使用格式化,R表示是大于这个日期(+),还是小于这个日期(-),a表示大于或小于多少天,时分秒正常使用y,m,d,h,i,s

WordPress插件开发笔记

1、add_menu_page采用与add_submenu_page相同的callback function可去除与menu重复的submenu。

2、使用 $wpdb->prepare可使用%而不冲突。

$wpdb->query(‘query’); //直接的Query语句

$wpdb->get_var(‘query’,column_offset,row_offset); //得到一个变量值

$wpdb->get_row(‘query’, output_type,row_offset); //得到一行的数组

$wpdb->get_col(‘query’,column_offset); //得到一列的数组

$wpdb->get_results(‘query’, output_type); //一个对象数组

$wpdb->insert( $table, $data, $format );

$wpdb->update( $table, $data, $where, $format = null, $where_format = null );

$wpdb->prepare( ‘query’ [, value_parameter, value_parameter … ] );

$wpdb->show_errors();

$wpdb->hide_errors();

$wpdb->print_error();

$wpdb->get_col_info(‘type’, offset);

$wpdb->flush();

3、修改JS的时候,要在Edge(或Chrome)的控制台中的网络里禁止缓存。

4、从后端传回的JSON数据是string,需要转换才能变成数组。

response=JSON.parse(response);

5、JS中长的HTML字符串可以用`约束。

6、PHP的性能优化。引用

1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。
2、$row[’id’] 的速度是$row[id]的7倍。
3、注销那些不用的变量尤其是大数组,以便释放内存。
4、尽量避免使用__get,__set,__autoload。
5、require_once()代价昂贵。
6、include文件时尽量使用绝对路径,因为它避免了PHP去include_path里查找文件的速度,解析操作系统路径所需的时间会更少。
7、如果你想知道脚本开始执行(译注:即服务器端收到客户端请求)的时刻,使用$_SERVER[‘REQUEST_TIME’]要好于time()
8、函数代替正则表达式完成相同功能。
9、str_replace函数比preg_replace函数快,但strtr函数的效率是str_replace函数的四倍。
10、如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换的参数。
11、使用选择分支语句(译注:即switch case)好于使用多个if,else if语句。
12、用@屏蔽错误消息的做法非常低效,极其低效。
13、打开apache的mod_deflate模块,可以提高网页的浏览速度。
14、数据库连接当使用完毕时应关掉,不要用长连接。
15、在方法中递增局部变量,速度是最快的。几乎与在函数中调用局部变量的速度相当。递增一个全局变量要比递增一个局部变量慢2倍。递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。递增一个未预定义的局部变量要比递增一个预定义的局部变量慢9至10倍。
16、仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。
17、方法调用看来与类中定义的方法的数量无关,因为我(在测试方法之前和之后都)添加了10个方法,但性能上没有变化。
18、派生类中的方法运行起来要快于在基类中定义的同样的方法。
19、调用带有一个参数的空函数,其花费的时间相当于执行7至8次的局部变量递增操作。类似的方法调用所花费的时间接近于15次的局部变量递增操作。
20、Apache解析一个PHP脚本的时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。
21、除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%的性能,以免除编译开销。
22、尽量做缓存,可使用memcached。memcached是一款高性能的内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码 (OP code)的缓存很有用,使得脚本不必为每个请求做重新编译。
23、当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C的内置数据结构,用于存储PHP变量)中存储的已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用的函数一起执行。在某些情况下,你可以使用isset() 技巧加速执行你的代码。
24、当执行变量$i的递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有的,并不适用于其他语言,所以请不要修改你的C或Java代码并指望它们能立即变快,没用的。++$i更快是因为它只需要3条指令(opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理的一种,正如Zend的PHP优化器所作的那样。牢记这个优化处理不失为一个好主意,因为并不是所有的指令优化器都会做同样的优化处理,并且存在大量没有装配指令优化器的互联网服务提供商(ISPs)和服务器。
25、并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。
26、并非要用类实现所有的数据结构,数组也很有用。
27、尽量采用大量的PHP内置函数。
28、如果在代码中存在大量耗时的函数,你可以考虑用C扩展的方式实现它们。
29、评估检验(profile)你的代码。检验器会告诉你,代码的哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码的瓶颈。
30、mod_zip可作为Apache模块,用来即时压缩你的数据,并可让数据传输量降低80%。
31、在可以用file_get_contents替代file、fopen、feof、fgets等系列方法的情况下,尽量用file_get_contents,因为他的效率高得多!但是要注意file_get_contents在打开一个URL文件时候的PHP版本问题;
32、尽量的少进行文件操作,虽然PHP的文件操作效率也不低的;
33、优化Select SQL语句,在可能的情况下尽量少的进行Insert、Update操作(在update上,我被恶批过);
34、循环内部不要声明变量,尤其是大变量:对象(这好像不只是PHP里面要注意的问题吧?);
35、多维数组尽量不要循环嵌套赋值;
36、在可以用PHP内部字符串操作函数的情况下,不要用正则表达式;
37、foreach效率更高,尽量用foreach代替while和for循环;
38、用单引号替代双引号引用字符串;
39、“用i+=1代替i=i+1。符合c/c++的习惯,效率还高”;
40、对global变量,应该用完就unset()掉;

华为笔记本配置电阻探究

PS:终止。荣耀MagicBook(KPL-W00)的官方BIOS中没有16G的SPD信息。淘宝的扩展服务还不如把电脑埋了换个Y9000X。

PS*:重启,发现之所以4G是因为双通道,两条DIMM合成8G,两条8G的SPD合成16G。

PS**:再次终止,原厂BIOS中SPD的8G非常奇怪,疑似单通道8G的78球FBGA的SPD(有校验,不能随便改,只能替换),且需要增加group线(原厂未连通),风险太大。

配置电阻

HMA851S6AFR6N-UH 对应 Hynix 8G 2400

//HMA851S6CJR6N-VK 对应 Hynix 8G 2666

//HMAA1GS6CMR6N-VK 对应 Hynix 16G 2666

//M471A5244CB0-CTD 对应 Samsung 8G 1R16 2666

M471A5244BB0-CRC 对应 Samsung 8G 1R16 2400

MTA4ATF51264HZ-2G3B 对应Micron 4G 2400

M471A1K43BB1-CRC 对应 Samsung 8G 2400

计划使用
K4AAG165WB-MCRC
H5ANAG6NCMR-VKC

利用IDA Freeware反编译官方的BIOS,寻找APCB开头的SPD信息,内有包含各种内存条的名称的string(不是颗粒名称)。

美光颗粒命名规则

百度贴吧-荣耀升级案例

百度贴吧-XPS升级案例

WPSuperCache的Nginx配置

使用WPSuperCache必须令WordPress使用固定链接,而WordPress的固定链接在Nginx条件下必须修改nginx.conf(否则页面404),添加如下代码:

location / {
try_files $uri $uri/ /index.php?$args;
}

(而在Apache中则是一个名为rename的功能)。

CentOS8+PHP8踩雷记录

1、CentOS8安装的时候语言要选英语,选择中文有中文的报错,但实际上并不适合Google纠错。

2、快速安装remi源。

dnf install dnf-utils
dnf install http://rpms.remirepo.net/enterprise/remi-release-8.rpm

3、CentOS8采用了dnf取代yum,其中module功能可快捷的切换软件源。

dnf [OPTIONS] module [COMMAND] [MODULE-SPEC]

OPTIONS:
详情查询 dnf(8) 的 man 帮助文档

COMMAND:
enable 启用模块
info 查询模块信息
remove 卸载模块
provides 查询模块的提供软件库信息
list 查询模块的详细信息
update 更新模块
install 安装模块
reset 重置模块
disable 禁用模块

MODULE-SPEC:
Name[:Stream[/Profiles]] 模块名称[:流[/配置]]
例如
dnf module list php                //查询php的可用module
dnf reset php                      //重置php的module(有可能需要添加--allowerasing)(必要,若直接install可能报错)
dnf module install php:remi-8.0/common    //安装新的php的module
dnf install php-{common,mysql,xml,xmlrpc,curl,gd,imagick,cli,fpm,mbstring,opcache,zip}

4、一定要关闭SELinux,否则php-fpm无法修改文件,即使是文件拥有者也不行!!!

setenforce 0    //临时关闭
vim /etc/selinux/config

SELINUX=enforcing改为SELINUX=disabled   //永久关闭
reboot

5、记得打开防火墙的80端口。

systemctl配置脚本

vim /usr/lib/systemd/system/nginx.service
chmod +x /usr/lib/systemd/system/nginx.service
[Unit]
Description=nginx - high performance web server
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t -c /usr/local/nginx/conf/nginx.conf
ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
ExecQuit=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start nginx.service

Ubuntu下WireGuard的常用操作

Wireguard的配置文件位置:

/etc/wireguard/wg0.conf

不中断服务更新配置文件:

wg syncconf wg0<(wg-quick strip wg0)

重启服务:

systemctl restart wg-quick@wg0.service

显示状态:

wg show

生成密钥对:

wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

启动与停止某端口:

wg-quick up wg0
wg-quick down wg0

初次安装需要开启内核的转发功能:

echo 1 > /proc/sys/net/ipv4/ip_forward

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

Ubuntu下配置MariaDB

先确定root已设置密码;

sudo passwd root

安装mariadb-server;

sudo apt install mariadb-server

mariadb初始配置;

sudo mysql_secure_installation

修改配置文件,以允许远程连接;

sudo vim /etc/mysql/mariadb.conf.d/50-server.cnf
→#bind-address 127.0.0.1

重启mariadb-server;

systemctl restart mariadb.service

登录mariadb;

sudo mariadb -u root -p

配置远程访问用户权限;


select User, host from mysql.user;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
FLUSH PRIVILEGES;

尝试远程连接。

FreeBSD下对硬盘健康状态的检测方法

S.M.A.R.T检测使用smartctl

//硬盘详细信息
smartctl -i /dev/da1
//硬盘健康状态
smartctl -H /dev/da1
//运行smart自检(-C 前台)
smartctl -t long /dev/da1
smartctl -t short /dev/da1
//终止自检
smartctl -X /dev/da1
//查看自检结果
smartctl -l selftest /dev/da1

坏块检测使用badblocks

// -s 显示进度; -v 显示执行详情; -w 写入检测(已挂载不可执行)
badblocks -s -v /dev/da1

速度测试使用hdparm

//检测读取速度
hdparm -t /dev/sda

Windows中为WireGuard配置NAT的简单方法

网上在Linux使用IPtable为WireGuard进行NAT的教程很多,但却没有在Windows中的教程。

实际上在Windows中实现更加简单,但也缺乏一些自由性。下面以Windows7为例:

系统中存在两个接口:本地连接2(接入外网的LAN),test(WireGuard的接口)。

原始网络配置

在“本地连接2”的属性中,将其共享。

配置“本地连接2”的共享

共享后,此Windows7主机相当于充当了WireGuard虚拟局域网的路由器(网关),但虚拟局域网的IP只有一个(类似于真实局域网中公网IP只有一个),如果真实局域网中的终端想要访问虚拟局域网的终端,就像公网中的设备主动访问NAT内的设备一样,需要配置DMZ主机或者端口映射。

设置“端口映射”

确定后,Windows默认会将受共享接口(test)的IP地址(网关地址)改为192.168.137.1,需要手动更改为WireGuard中设定的地址,或者重新连接WireGuard,将自动更改。

Windows7的该功能可能自动开启了DHCP,关闭方法未知,忽略警告暂未发现影响。

确定是有警告弹窗

在受共享的WireGuard终端配置文件中,应将被共享真实局域网的IP段加入到AllowedIPs中。若希望全局使用WireGuard隧道连接公网,则设置0.0.0.0,同时要配置::/0防止IPv6漏出。

客户端WireGuard配置文件

重新连接WireGuard后,即可在客户端连接到真实局域网内的终端了。

注意:每次重启服务端时,都需要重新设置一次Internet连接共享!!

WireGuard架设公网点对点隧道(虚拟局域网)

WireGuard不分服务端、客户端,各端点相互平行,共同组成一个加密的虚拟局域网。(转发功能暂未学会,不能翻墙,据说基于UDP的WireGuard翻墙已被禁)。

首先,前往wireguard.com(已被墙)下载Windows客户端,TureNAS集成于系统中,可直接使用。

以下是FreeBSD下的配置。

//编辑配置文件
vim /usr/local/etc/wireguard/wg0.conf
//修改sysrc参数,也可在图形界面“微调”中修改
sysrc wireguard_interfaces="wg0"
sysrc wireguard_enable="YES"
//启动、停止、重启
service wireguard start
service wireguard stop
service wireguard restart
//查看运行状态
wg
ps aux | grep wireguard

部分网络相关的常用FreeBSD指令:

//查看路由表
netstat -f inet -r -n
netstat -f inet6 -r -n
//查看进程
ifconfig wg0

配置文件的内容(可多Peer):

[Interface]
PrivateKey = {私钥}

ListenPort = {端口号}

//虚拟IP地址,不可与本地局域网地址冲突
Address = 10.100.101.1/24

[Peer]
PublicKey = {对端的公钥}
AllowedIPs = 10.100.101.2/32

[Peer]
PublicKey = {对端公钥}
AllowedIPs = 10.100.101.3/32
Endpoint = {对端地址:端口}

//心跳包间隔时间
PersistentKeepalive = 25

可使用UDP&TCP测试工具测试端口是否畅通(UDP不好用),也可使用netcat在命令行下操作(netcat集成于linux)。

WireGuard连接后,ping指令无效,因为ping基于IGMP。

TCP协议更加可靠,因为对方收到后会回复信息确认,而UDP则不会回复,延迟会低一点,但丢包更加不可控,适合视频串流等对丢包要求低,但对延迟要求高的场景。

路由器设置端口转发时,应将TCP/UDP两个都选择上。

转发的配置相关资料较少,没有在FreeBSD和Windows上的教程,在Linux上应该是基于IPtable的IP地址转发,不太难。因为WireGuard的客户端对网络的影响是全局的,缺少转发可能导致断网。

可以使用UDPSpeeder和UDP2raw来优化UDP数据的传输,一个可以通过添加冗余信息避免丢包影响,另一个可以伪装UDP数据,防止拦截。