今天换了新主题! 之前的 Ultra 主题毕竟是歪果仁写的,完全没有为中文博客优化,而且很多地方也不够完善(其实什么主题都有不够完善的地方的)。因为前两天看见 WordPress 官方出的年度主题 二〇二〇(Twenty Twenty)还挺好看的,就打算换上。 今天花了点时间把二〇二〇改好了,这边把改动了的 style.css 和其他加的一些东西放上来(咕咕咕了好久)。子主题是什么不存在的 style.css 看这里:https://www.justhx.com/wp-content/themes/twentytwenty/style.css 如果你也想拥有本站同样的界面,把上面的 style.css 打开,然后全选复制,进入主题编辑器 - style.css 然后替换掉;接下来进入 classes\class-twentytwenty-non-latin-languages.php,删掉 33 至 95 行。但是这不是全部,请看下面。 样式的改动非常粗暴,主要有以下变化:

  • 把各种超大的字体改成差不多合适的大小(也照顾了移动端)
  • 桌面端文章显示区域改成更宽,从 58rem78rem
  • 由于上面那么窄的显示区域实际上是为 WordPress 的文章块编辑器设计的,换言之我这样改动就没办法用块编辑器里的各种特效了;然而我用 markdown 写博文。
  • 改了所有的 font-family,去除了这个主题引入(还是从本地引入的)Inner 字体系列,全部改 Spectre.css 默认的中文简体 font-family;但是优先了思源宋体的权重(稍后需要从 Google Fonts 引入)。代码 monospace 也改了,现在会 fallback 更多的字体。

首页摘要居中

1
2
3
4
5
6
7
let homepages = [ '/', 'index.html', 'index.htm', 'index.php'];

if (homepages.indexOf(window.location.pathname) == "0") {
let all = document.getElementsByClassName('entry-content');
for (var i = 0; i < all.length; i++) {
all[i].style['text-align'] = 'center';
} }

感谢 @haozi。 首先定义 homepages 为数个常见首页写法,然后看 homepages 是否为 window.location.pathname 的第一个,如果是,遍历所有 entry-content 的类名,加上 text-align: center 属性。

其他的改动

在主题的 header.php,你需要从 Google Fonts 引用思源宋体:

1
<link href="https://fonts.googleapis.com/css?family=Noto+Serif+SC&display=swap" rel="stylesheet">

放心,Google Fonts 在国内的可访问性非常可以,并且因为加了 display: swap 属性,网页上的字体会首先以本机字体显示,等字体加载完成以后才会替换掉原来的字体。所以不会对速度有任何影响。


在主题的 footer.php,你需要引用 instant.page 库。

1
<script src="https://cdn.jsdelivr.net/npm/[email protected]/instantpage.min.js" type="module" defer></script>

instant.page 有利于访客快速加载下一次点击;原理是鼠标移动到超链接上时就直接开始加载,然后点击后再替换页面。

移动端不加载 Google Adsense

本站会加载 Google Adsense 广告;考虑到用户体验,和相比于桌面端移动端屏蔽广告的困难度,移动端访问本站不会加载 Adsense。 通过以下代码实现:

1
2
3
4
5
6
7
8
if( /Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent) ) {
console.log('is mobile, ads will not load')
}
else {
var script = document.createElement('script');
script.src = 'https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js';
document.write(script.outerHTML);
}

访客

访问量

2019 年 1 月 26 日,由于意外的数据丢失,此前的惶心博客全部内容丢失。仅靠第三方服务恢复了少数几篇博文。

1 月 26 日,Google Analytics 上的 惶心博客 | 惶萦纡 目录开始接收到访客数据。从 1 月 26 日到 12 月 30 日,统计到的访客数据如下:

在 339 天里,44753 位访客打开了 50391 个会话,产生了 84203 个页面浏览量。平均每位访客每次访问都会阅读 1.67 个页面。其中 5.9% 的访问为回访(二次访问)。

访客属性

地理位置

来自中国大陆的访客占了总数的 57.62%;然而这并不意味着其余访客都不是中国人。因为博客架设在海外服务上,国内访问速度也许不会理想,所以部分访客在访问时也许使用了代理服务。

浏览器

合计 82.6% 的访客使用了较为符合标准、综合表现相对较好的 “现代浏览器” - Google Chrome, Apple Safari, Microsoft EdgeMozilla Firefox。这是一个非常好的习惯。值得注意的是,5.40% 的访客在访问时使用了 UC 浏览器,而这一部分访客几乎全部为移动端访客,且高达 96.5% 的此类访客使用的设备为华为 P20。

操作系统

54.2% 的访客访问时使用 Windows 系统,18.4% 的访客使用 Android 系统,13.3% 的访客使用 iOS;macOS 用户占总数的 6.00%。

流量来源

引荐

今年 34.8% 的访客来源于直接来源(无 Refferal 点击或者直接输入网址),42.5% 的访客来源于引荐(Referral);其中,GitHub 贡献了其中的 22.0%,百度贡献了其中的 16.6%。个人站点里,樱花庄的白猫 贡献了 3.21% 的引荐流量,孟坤博客 贡献了 1.75%,犬’s Blog 合计贡献了(因为更换了域名所以有两个数据)1.26%。非常感谢 Mashiro, 孟坤 和 狗子 小白-白。

搜索引擎

终于!!!我竟然有搜索引擎流量来源了!!!

今年 Google 给我贡献了 23.3% 的用户,百度贡献了 6.99%。

在 Google 里,来自惶心博客的网页出现了 91300 次,被点击了 11200 次(12.3%),平均在 12.3 位(orz)。

博客

今年博客经历了从 WordPress 切换到 Hexo(失手删了数据库),再从 Hexo 迁移回 WordPress 的过程。

其实对于我来说,Hexo 的好处无疑是巨大的,因为是纯静态结构,非常容易优化和提速。但是现有评论系统没有一个符合我的设想的(可访问性、便利性),所以只能换回 WordPress 用原生的内建评论。

WordPress 的优化无疑是一个更大的难题,而且用以托管博客的服务器也有成本上的限制,所以就算已经使用了多种方式试图优化访问速度,初次访问速度(无论是否有缓存)都不够理想。但是,在第一次打开以后,后续访问就会变得非常快(因为缓存和 Instant Click 的关系);所以也算一点点聊以自慰的地方吧。

今年的访客数据相比于去年还是比较令人满意的,尤其是用户数和会话数几乎翻了倍。但是同时更新频率也下降了很多,因为总是有这样那样的事情需要去做。

今年我开始在博客上更新个人的文学创作了,评论还挺令人振奋的hhh。希望明年能够写出来更多的东西吧。

今年我的开源项目加起来有 300 Stars 了。虽然 GitHub 的小格子貌似空了很多,但是确实有时间花进去了,也有挺大的收获。

明年会有奥运会。似乎是唯一目前能够 foresee 的东西。

也不敢说有多大的期许;希望做好自己,向着远方出发就好了。

最后以一首双笙的《江南游记》结尾吧:

哪个人能得百年 将春秋都看遍 不如偷点清闲 诗酒年华 睡在尊前明月边 若有意 山水自为家 又何必梦乡关
哪个人能历千般 而事事都圆满 人生不分长短 吴酒一杯 也醉二十年 若有缘 终会相逢何必问早晚
传奇是寻常人看 寻常人渡情关 归处不是江南 风住红尘 而我常向碧云天 若有情 纵隔数重山 也为她卷珠帘
人生是无常者叹 那无常的聚散 今朝何必长安 一身潇洒 游记天地间 若有幸 或许又在落花时节见

如同很久没见过的 落下去的夕阳,在地平线上缓缓消失。

消失却不是消逝;就好像失去的快乐还是能找回来。就好像前一秒还低着头隔绝着世界,后一秒就为着台上或是熟悉的人或是精彩的演出端坐着鼓掌。脸上带着的是笑容,带着笑容大概就更会幸运。

就好像海边的潮水起起落落,日子亦复如是。没有办法相信未来,就于当下坠落。可是,念念不忘,必有回响。寄出去的,是其他人亲口说着的开心和喜欢。虽然也不是时常都幸运,可是……日子多了,总会幸运一次的。

然后你把眼前没有任何办法掩饰的欢喜记住,深藏在记忆里。等哪天困苦潦倒,就如同从泥里挖出那一樽珍藏的佳酿;虽然细细品尝着的快乐也许只是一瞬,可在奔跑着的时光里,却也弥足珍贵。车子的雨刮把雨水拉着走,外面还是黑天本该澄澈的玻璃上也还是有雨滴,可是,最少你看到了前方闪烁着的红色光晕。

还记得夕阳无数次将影子拉得很长;暖暖的空间里,亦是因为彼此存在于现实或记忆里的笑容而不再惧怕未来的风浪。也许终究还是会浑身湿透,可是等潮水退去,你站在湿润的沙滩上,心里却想写下某一个人的名字。你知道写下来的东西有朝一日会被抹去,可心意,或许是旧时意,却大概会一直存在,会一直倔强地存在。

你看,12 月就在不知不觉间过了去,即将到来的冬天,但愿不会太过寒冷。我们于彼此渐渐远去,也在渐渐行走。也许到很久以后才能重新站在身边,可是远距离里简单的几句话,也能够成为最好的力量。

我愿人长久。我希望未来的岁月里,所有的我们都能够朝着光芒迈去,将过去留在终究还会途经的夜里,然后在漫漫长路里渐远亦渐行;你看,那闪着光的远方,在你的眼睛里。


谨以此文,纪念过去的三天。

惶心,于 2019 年 12 月 5 日。

(598 字)

诗句是什么呢?诗句是盛唐李白肆意写下的,钟鼓馔玉不足贵,但愿长醉不复醒。

很奇怪吧,不是天生我才必有用,也不是对影成三人。

因为,人不会一直快乐,也不会一直乐观。所以到了某个时候,似乎一切都已经无关紧要,似乎……只是想在黑暗里一直睡下去。

快乐也会伴随着悲伤,就好像对影成三人前面是 花间一壶酒,独酌无相亲。就好像在城市白天的光影和棱角里肆意穿行,晚上看着远方和近处的车流和淋湿地面反射出的倒影和光晕。你要知道再热闹的筵席终究会散场,离别不过会是一个拥抱,一句保重和一个背影。

也许曾经一步三回头,就像曾经粘连着的似乎就算如履薄冰依然会藕断丝连的,我们。也许曾经真的仿佛和对方完美契合,后来那样远距离的分离依然是在书写最悲伤的故事。那样多的日与夜里,没有了光芒,没有了星芒。只有望眼欲穿也看不见的远方。古时候人们总是在守望,因为如果船只归港,那么在天黑之前地平线的尽头,大概会有一个小小小小的影子。大概那样是希望,而夜里燃起的船灯,则是小小的慰藉,还有企盼。

我试图把岁月书写成诗句,把生活过成诗句,把诗句藏入梦里。可是,诗句并不是一直都会引人入胜。诗句也有国破山河在,城春草木深。诗句也不会一直是桃花潭水深千尺,也可以是丞相祠堂何处寻,锦官城外柏深深。也许曾经惊才绝艳,可是也许没有人会念想你太久。也许要等到时过境迁数百年后。

我尝试把我所喜欢和信仰的文字写成诗句,可是更多的我只是在写自己,在写的诗句,大概也没有那么美好,也没有那样多的诗意。大概这就是现实;夜晚的城市,略显安静的街道,和淅淅沥沥的雨声。天气冷的刚刚好,地上透着橘黄色的灯光。可是,橘黄色,也不一定就是温暖的代表。你看你伸出手,能感到的只是冰凉的雨丝。倘若一直伸着手,而小雨变成了倾盆大雨,你只会在原地那样狼狈,看上去那样脆弱又那样傻气。

我曾经那样喜欢 Excalibur Umbra,大概他不只是一个只会杀戮的战争机器,而是一个有着背负的,曾经的年轻人。岁月磨蚀了他的理想,直到他找到他的 Operator,从此一起战斗,做最亲密的伙伴。他脖子上从未取下的红色长巾,也许是鲜血,也许是意志,又或许是旗帜。

如果人只有灵魂,没有外貌,那么走在路上蹦蹦跳跳的我大概能够更快乐一些,也不必忍受周围只是路人的奇怪眼光。如果人只有理想,没有困扰和负担,那大概可以安静安详,享受早上八点钟,还不是那么暖和的初阳。

生活本身就只是一个故事,而我们是亲历者,偶尔可以靠自己做出改变。可是,剧本本身不会有太多变动,该发生的,也许就一定会发生。诗句和远方,听起来很不真切的词汇,却是我时刻的理想。远方会有什么?我真的不会知道;可是既然是远方,那么一定是离所熟悉城市或小镇很远的地方,大概会有崇山峻岭,还有有点褪色的小小植物。大概能够一眼千年,然后回头的时候所有的事情都朝着理想发展;就如同藤蔓盘旋而上,最后和依附着的石头一样变得古朴,拥有了岁月。

会有一些瞬间人们显得很靠近,可是热闹的节日过去以后,也许会比以往更加疏离。疏离是冰冷的距离。距离是含蓄的别离。

等到最后,只有自己陪着自己。曾经幻想的新年,大概也不会充斥着希望。大概也不会有喜悦。曾经许下那样多的诺言,也听到了同样多的诺言,最后自己还是一个一个去毁掉,而听到的那些也变得那样不真切。仿佛经历的所有过去全都是一场异常荒谬的梦,而梦醒以后还是在小房间里,一无所有。

就好像房间的主人去了远行,而落在桌子上的钢笔和写了一半的稿纸铺满灰尘。他大概也不会再回来。也许在那样大的世界里你们会相逢,可也许他已经在或许如意或许颠簸的路途中客死他乡。

直到最后,雪白宣纸上,大概只留有未曾写完的诗句。可是,大概也不会写完,因为大概不知道如何写下去。因为大概曾经理想和幻想如今都变得那样黯淡无光,虽然存在但是已经不再闪耀,亦不足以引来注目。

终究还是一整首,还未曾写完的诗句。


文章与现实没有联系。部分灵感来自 双笙 -《不成诗》:

我听过许多情话 假语存焉口吻真挚 生来死去到春满枯枝 白纸与黑字 …… 未写完的诗


“我像废弃天体 / 随着你轨迹绕行 / 引力的名字是你 / 坠落也没关系”

谨以此文,纪念过去的九月和即将过去的十月。

“直道相思了无益,未妨惆怅是清狂。”

截至 2020.02.20,网易云音乐全平台已经支持海外手机号注册。来了就不要走,看看本站其他文章吧!

非常感谢你的关注。目前这个方法已经失效。 感谢评论区网友 @namstar,目前此方法仍然有效,请继续阅读。

网易云音乐支持使用手机号码,微信,QQ,微博 和网易邮箱登陆。可惜的是,经过短暂的尝试,前三种方式都需要绑定中国大陆手机号码才可以完成注册(或者你也可以只用中国手机号码注册一个而不绑定任何东西。 对于中国大陆以外的使用者,同样也是经过短暂的尝试,发现了一个不使用中国大陆地区手机号码也可以完成网易云音乐的注册的方法。当然,这里的前提,是需要你拥有一个任意国家或地区的手机号码。 我们利用的,就是上面陈述里唯一的例外,网易邮箱。首先从 https://zc.reg.163.com/m/regInitialized 通过验证手机号码的方式注册一个网易账号,首先输入想要注册的邮箱前缀(如 hifocus123),然后输入密码;在点击下一步以后选择你所在的国家或者地区,输入你的电话号码,然后点击发送验证码并完成验证。不要使用网易邮箱 mail.163.com 页面上的注册入口,该入口需要手动发送验证码到网易的号码,且在测试下无论如何也无法发送成功(无论是否带 0086): 而使用上述可行的接口就可以顺利收到验证码,且无需自行发送。 (海外)手机号码验证成功以后,网易邮箱(网易账号)就注册成功了。 接下来,使用这个网易邮箱的账号和密码,无论以何种方式登陆网易云音乐(Web, APP),都会依旧要求绑定中国大陆手机号码;然而,我们可以通过网易邮箱内的 “应用” 对网易云音乐进行鉴权,直接登陆,设置 ID 之后就可以在电脑端和手机端正常使用:

以网易免费邮 yeah.net 示例,126.com 和 163.com 方式大同小异。

在首页点击 “应用中心”: 向下滑动,找到网易云音乐: 点击试用看看: 在页面内填写好想用的 ID,稍后可以更改: 确认 ID 以后,无论桌面版还是移动版的网易云音乐均可正常登陆使用,无需中国手机号码。

8 月 1 日 PHP 释出了 7.3.8 稳定版本。昨天折腾好了 Nginx 今天就来升级 PHP 吧!其实是昨天弄了好久都没成功今天才成功了

备份当前 PHP

为了避免翻车,先对当前的 PHP 安装目录进行备份:

1
2
3
4
[email protected]:~# which php
/usr/local/php/bin/php

cp -r /usr/local/php /usr/local/php_backup

获取当前 PHP 编译参数

为了避免新装的 PHP 缺少已经在使用的功能造成错误,需要使用以前编译的相同参数(当然也可以加上新的参数)进行全新编译。

1
2
# From https://stackoverflow.com/questions/9520957/get-current-php-install-settings
php -i | head -n 10

我的 PHP 是 Oneinstack 一键包安装的,输出的参数如下:

phpinfo()
PHP Version => 7.3.6

System => Linux castle 4.15.0-54-generic #58-Ubuntu SMP Mon Jun 24 10:55:24 UTC 2019 x86_64
Build Date => Jul 3 2019 14:18:49
Configure Command => ‘./configure’ ‘–prefix=/usr/local/php’ ‘–with-config-file-path=/usr/local/php/etc’ ‘–with-config-file-scan-dir=/usr/local/php/etc/php.d’ ‘–with-fpm-user=www’ ‘–with-fpm-group=www’ ‘–enable-fpm’ ‘–disable-opcache’ ‘–disable-fileinfo’ ‘–enable-mysqlnd’ ‘–with-mysqli=mysqlnd’ ‘–with-pdo-mysql=mysqlnd’ ‘–with-iconv-dir=/usr/local’ ‘–with-freetype-dir’ ‘–with-jpeg-dir’ ‘–with-png-dir’ ‘–with-zlib’ ‘–with-libxml-dir=/usr’ ‘–enable-xml’ ‘–disable-rpath’ ‘–enable-bcmath’ ‘–enable-shmop’ ‘–enable-exif’ ‘–enable-sysvsem’ ‘–enable-inline-optimization’ ‘–with-curl=/usr/local/curl’ ‘–enable-mbregex’ ‘–enable-mbstring’ ‘–with-password-argon2’ ‘–with-sodium=/usr/local’ ‘–with-gd’ ‘–with-openssl=/usr/local/openssl’ ‘–with-mhash’ ‘–enable-pcntl’ ‘–enable-sockets’ ‘–with-xmlrpc’ ‘–enable-ftp’ ‘–enable-intl’ ‘–with-xsl’ ‘–with-gettext’ ‘–enable-zip’ ‘–without-libzip’ ‘–enable-soap’ ‘–disable-debug’
Server API => Command Line Interface
Virtual Directory Support => disabled
Configuration File (php.ini) Path => /usr/local/php/etc
Loaded Configuration File => /usr/local/php/etc/php.ini

由于输出的编译参数是带 ‘’ 的,复制到代码编辑器里把 ‘ 替换掉就可以了。

仔细阅读编译参数,看是否有需要外部库的部分,确认各种 DIR 参数是否有相应目录,例如

1
2
ls /usr/local/openssl
bin cert.pem certs include lib man misc openssl.cnf private

下载 PHP 源码

新建临时文件夹,在 https://www.php.net/downloads.php 页面下载 PHP 的最新 Stable 版本,解压缩,进入源码目录。

1
2
3
4
cd ~ &amp;&amp; mkdir php_temp &amp;&amp; cd php_temp
wget https://www.php.net/distributions/php-7.3.8.tar.gz
tar -xzf php-7.3.8.tar.gz
cd php-7.3.8

开始编译

确认编译参数无误以后开始编译。

1
./configure  --prefix=/usr/local/php --with-config-file-path=/usr/local/php/etc --with-config-file-scan-dir=/usr/local/php/etc/php.d --with-fpm-user=www --with-fpm-group=www --enable-fpm --disable-opcache --disable-fileinfo --enable-mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-iconv-dir=/usr/local --with-freetype-dir --with-jpeg-dir --with-png-dir --with-zlib --with-libxml-dir=/usr --enable-xml --disable-rpath --enable-bcmath --enable-shmop --enable-exif --enable-sysvsem --enable-inline-optimization --with-curl=/usr/local/curl --enable-mbregex --enable-mbstring --with-password-argon2 --with-sodium=/usr/local --with-gd --with-openssl=/usr/local/openssl --with-mhash --enable-pcntl --enable-sockets --with-xmlrpc --enable-ftp --enable-intl --with-xsl --with-gettext --enable-zip --without-libzip --enable-soap --disable-debug

如果没有出错,大概可以看到这样的输出:

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
Generating files
configure: creating ./config.status
creating main/internal_functions.c
creating main/internal_functions_cli.c
+--------------------------------------------------------------------+
| License: |
| This software is subject to the PHP License, available in this |
| distribution in the file LICENSE. By continuing this installation |
| process, you are bound by the terms of this license agreement. |
| If you do not agree with the terms of this license, you must abort |
| the installation process at this point. |
+--------------------------------------------------------------------+

Thank you for using PHP.

config.status: creating php7.spec
config.status: creating main/build-defs.h
config.status: creating scripts/phpize
config.status: creating scripts/man1/phpize.1
config.status: creating scripts/php-config
config.status: creating scripts/man1/php-config.1
config.status: creating sapi/cli/php.1
config.status: creating sapi/fpm/php-fpm.conf
config.status: creating sapi/fpm/www.conf
config.status: creating sapi/fpm/init.d.php-fpm
config.status: creating sapi/fpm/php-fpm.service
config.status: creating sapi/fpm/php-fpm.8
config.status: creating sapi/fpm/status.html
config.status: creating sapi/phpdbg/phpdbg.1
config.status: creating sapi/cgi/php-cgi.1
config.status: creating ext/phar/phar.1
config.status: creating ext/phar/phar.phar.1
config.status: creating main/php_config.h
config.status: executing default commands

此时可以先执行 make 命令;但是这一步在我的机器上有出错,错误如下:

1
2
3
4
5
6
7
8
ext/xmlrpc/libxmlrpc/encodings.o: In function &#x60;convert&#039;:
/root/php_temp/php-7.3.8/ext/xmlrpc/libxmlrpc/encodings.c:65: undefined reference to &#x60;libiconv_open&#039;
/root/php_temp/php-7.3.8/ext/xmlrpc/libxmlrpc/encodings.c:72: undefined reference to &#x60;libiconv&#039;
/root/php_temp/php-7.3.8/ext/xmlrpc/libxmlrpc/encodings.c:88: undefined reference to &#x60;libiconv_close&#039;
/root/php_temp/php-7.3.8/ext/xmlrpc/libxmlrpc/encodings.c:88: undefined reference to &#x60;libiconv_close&#039;
collect2: error: ld returned 1 exit status
Makefile:293: recipe for target &#039;sapi/cli/php&#039; failed
make: *** [sapi/cli/php] Error 1

搜索以后,根据 https://fukun.org/archives/10102487.html 里的命令解决了问题:

make ZEND_EXTRA_LIBS=’-liconv’

make 就成功了:

Build complete.
Don’t forget to run ‘make test’.

最后执行 make install 即可完成编译:

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
[email protected]:~/php_temp/php-7.3.8# make install
Installing PHP CLI binary: /usr/local/php/bin/
Installing PHP CLI man page: /usr/local/php/php/man/man1/
Installing PHP FPM binary: /usr/local/php/sbin/
Installing PHP FPM defconfig: skipping
Installing PHP FPM man page: /usr/local/php/php/man/man8/
Installing PHP FPM status page: /usr/local/php/php/php/fpm/
Installing phpdbg binary: /usr/local/php/bin/
Installing phpdbg man page: /usr/local/php/php/man/man1/
Installing PHP CGI binary: /usr/local/php/bin/
Installing PHP CGI man page: /usr/local/php/php/man/man1/
Installing build environment: /usr/local/php/lib/php/build/
Installing header files: /usr/local/php/include/php/
Installing helper programs: /usr/local/php/bin/
program: phpize
program: php-config
Installing man pages: /usr/local/php/php/man/man1/
page: phpize.1
page: php-config.1
Installing PEAR environment: /usr/local/php/lib/php/
[PEAR] Archive_Tar - already installed: 1.4.7
[PEAR] Console_Getopt - already installed: 1.4.2
[PEAR] Structures_Graph- already installed: 1.1.1
[PEAR] XML_Util - already installed: 1.4.3
[PEAR] PEAR - already installed: 1.10.9
Wrote PEAR system config file at: /usr/local/php/etc/pear.conf
You may want to add: /usr/local/php/lib/php to your php.ini include_path
/root/php_temp/php-7.3.8/build/shtool install -c ext/phar/phar.phar /usr/local/php/bin
ln -s -f phar.phar /usr/local/php/bin/phar
Installing PDO headers: /usr/local/php/include/php/ext/pdo/

使用 php -v 命令查看当前 PHP 版本:

1
2
3
4
[email protected]:~/php_temp/php-7.3.8# php -v
PHP 7.3.8 (cli) (built: Aug 10 2019 10:23:35) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.8, Copyright (c) 1998-2018 Zend Technologies

升级成功了;最后重启 PHP 以应用更改。

1
service php-fpm restart

Ubuntu 版本为 18.04.3 LTS

今天想使用 Nginxnginx-module-geoip 模块实现对不同地域访客的重定向功能,就想起了 Mashiro 的这篇文章:Nginx + GeoIP 区分用户 IP 归属国,打算按照文章的步骤做。

然而在文章的第一步就遇到了问题:

1
2
3
4
5
[email protected]:~# apt-get install nginx-module-geoip
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package nginx-module-geoip

在网上搜索了一下,有人说需要添加 Nginx PPA 仓库:

1
2
sudo add-apt-repository ppa:nginx/stable
sudo apt-get update

照做了以后还是出现错误。无奈卡在第一步只能另寻他路,决定直接从源码开始重新编译。

我的 Nginx 是使用 Oneinstack 一键包编译安装的,通过 nginx -V 命令可以查看编译时的参数:

1
2
3
4
5
6
[email protected]:~# nginx -V
nginx version: nginx/1.16.0
built by gcc 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
built with OpenSSL 1.1.1c 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=openssl-1.1.1c --with-pcre=pcre-8.43 --with-pcre-jit --with-ld-opt=-ljemalloc --with-http_sub_module

接下来我们创建一个新的临时文件夹并且进入:

1
cd ~ &amp;&amp; mkdir nginx-temp &amp;&amp; cd nginx-temp

https://nginx.org/en/download.html 下载最新 stable 版本并且解压缩,进入 nginx 源码目录:

1
2
3
wget https://nginx.org/download/nginx-1.16.0.tar.gz
tar -xzf nginx-1.16.0.tar.gz
cd nginx-1.16.0

通过之前 nginx -V 获取的编译参数可以发现,里面需要 OpenSSLpcre 两个库;分别通过 https://www.openssl.org/source/https://ftp.pcre.org/pub/pcre/ 查看两个库的最新版本并且下载,解压缩:

1
2
3
4
wget https://www.openssl.org/source/openssl-1.1.1c.tar.gz
tar -xzf openssl-1.1.1c.tar.gz
wget https://ftp.pcre.org/pub/pcre/pcre-8.43.tar.gz
tar -xzf pcre-8.43.tar.gz

上述两个库的最新版本和 nginx -V 里面的编译参数符合,故此不需要修改;如果未来发布了新的版本,则需要在编译参数里面修改相应变量到准确的路径,否则会出现类似下述的错误:

1
2
3
4
5
6
/bin/sh: 1: cd: can&#039;t cd to ../pcre-8.43
objs/Makefile:1374: recipe for target &#039;../pcre-8.43/Makefile&#039; failed
make[1]: *** [../pcre-8.43/Makefile] Error 2
make[1]: Leaving directory &#039;/root/custom-nginx/nginx-1.16.0&#039;
Makefile:8: recipe for target &#039;build&#039; failed
make: *** [build] Error 2

然后开始编译过程:

1
2
# 在参数的最后加上 --with-http_geoip_module
./configure --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=openssl-1.1.1c --with-pcre=pcre-8.43 --with-pcre-jit --with-ld-opt=-ljemalloc --with-http_sub_module --with-http_geoip_module

这个时候发现出现错误:

1
2
./configure: error: the GeoIP module requires the GeoIP library.
You can either do not enable the module or install the library.

继续搜索了一下,在 https://serverfault.com/questions/503909/geoip-for-configuration-into-nginx 找到了可行的方案:

1
apt install libgeoip-dev

然后就可以看到 configure 成功的信息了:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Configuration summary
+ using PCRE library: ../pcre-8.43
+ using OpenSSL library: ../openssl-1.1.1c
+ using system zlib library

nginx path prefix: &quot;/usr/local/nginx&quot;
nginx binary file: &quot;/usr/local/nginx/sbin/nginx&quot;
nginx modules path: &quot;/usr/local/nginx/modules&quot;
nginx configuration prefix: &quot;/usr/local/nginx/conf&quot;
nginx configuration file: &quot;/usr/local/nginx/conf/nginx.conf&quot;
nginx pid file: &quot;/usr/local/nginx/logs/nginx.pid&quot;
nginx error log file: &quot;/usr/local/nginx/logs/error.log&quot;
nginx http access log file: &quot;/usr/local/nginx/logs/access.log&quot;
nginx http client request body temporary files: &quot;client_body_temp&quot;
nginx http proxy temporary files: &quot;proxy_temp&quot;
nginx http fastcgi temporary files: &quot;fastcgi_temp&quot;
nginx http uwsgi temporary files: &quot;uwsgi_temp&quot;
nginx http scgi temporary files: &quot;scgi_temp&quot;

然后执行 make && make install 命令,如果上述部分没有出错的话,就可以成功编译。

1
2
3
test -d &#039;/usr/local/nginx/logs&#039; \
|| mkdir -p &#039;/usr/local/nginx/logs&#039;
make[1]: Leaving directory &#039;/root/custom-nginx/nginx-1.16.0&#039;

通过重启 nginx 看看编译是否成功:

1
service nginx restart

然后访问了一下托管在这台服务器上的网站,嗯,没挂,成功了。

此时再通过 nginx -V 命令就可以看到新的 mod 已经被添加上去了。

1
2
3
4
5
6
[email protected]:~# nginx -V
nginx version: nginx/1.16.0
built by gcc 7.4.0 (Ubuntu 7.4.0-1ubuntu1~18.04.1)
built with OpenSSL 1.1.1c 28 May 2019
TLS SNI support enabled
configure arguments: --prefix=/usr/local/nginx --user=www --group=www --with-http_stub_status_module --with-http_v2_module --with-http_ssl_module --with-http_gzip_static_module --with-http_realip_module --with-http_flv_module --with-http_mp4_module --with-openssl=openssl-1.1.1c --with-pcre=pcre-8.43 --with-pcre-jit --with-ld-opt=-ljemalloc --with-http_sub_module --with-http_geoip_module

今天开了台华为云学生机,使用 Ubuntu Server 18.04.3 LTS 系统。由于是国内机器,在安装各式软件的时候都需要通过镜像以提升下载速度。

apt

首先是 Ubuntu 自带包管理器 apt。apt 在国内有非常多的镜像可供选择,而这些镜像都需要和官方仓库 http://archive.ubuntu.com/ubuntu/ 同步以提供服务;通过 https://api.i-meto.com/mirrors.page 页面可以查看众多镜像在国内的同步情况,同步越新镜像的可用性就越高,安装到旧版本软件的可能性就会越小。

我会更加偏向于选择云服务厂商提供的镜像,因为他们本身拥有足够的计算和网络资源去维护镜像,同时因为是商业公司他们提供的服务往往会比部分高校稳定;通过查看 https://api.i-meto.com/mirrors.page 页面也可以发现部分高校提供的镜像确实是欠缺同步甚至是无法访问的。而镜像的不稳定会为日后服务器维护工作带来更高的成本。

起初我选择了华为云本身提供的镜像 https://mirrors.huaweicloud.com,但是发现华为云的镜像仅仅为北京单点,经 @sukkaw 提示为对象存储 OSS(Object Storage Service)。而通过 ping 命令也可以发现就算是华为的机器,访问华为提供的镜像也不会走内网,而广州的机器访问北京也会在速度上也会有较小的影响(虽然真的很小)。

1
2
3
4
5
6
7
8
9
10
[email protected]:~# ping mirrors.huaweicloud.com
PING 60dc0ac37e0c45b28c616b484b1c6ea6.waf.huaweicloud.com (117.78.24.32) 56(84) bytes of data.
64 bytes from ecs-117-78-24-32.compute.hwclouds-dns.com (117.78.24.32): icmp_seq=1 ttl=44 time=38.6 ms
64 bytes from ecs-117-78-24-32.compute.hwclouds-dns.com (117.78.24.32): icmp_seq=2 ttl=44 time=38.0 ms
64 bytes from ecs-117-78-24-32.compute.hwclouds-dns.com (117.78.24.32): icmp_seq=3 ttl=44 time=38.0 ms
64 bytes from ecs-117-78-24-32.compute.hwclouds-dns.com (117.78.24.32): icmp_seq=4 ttl=44 time=38.0 ms
64 bytes from ecs-117-78-24-32.compute.hwclouds-dns.com (117.78.24.32): icmp_seq=5 ttl=44 time=37.9 ms
--- 60dc0ac37e0c45b28c616b484b1c6ea6.waf.huaweicloud.com ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4005ms
rtt min/avg/max/mdev = 37.989/38.182/38.689/0.310 ms

回头看了下阿里云提供的镜像 https://mirrors.aliyun.com,点进去文档一看:

OPSX 软件仓库依托于阿里云成熟的 分布式网络文件存储 和 内容分发加速 (CDN) 技术

好了那就这个了。

以及,腾讯云也提供了镜像源 https://mirrors.cloud.tencent.com 然而是中国上海单点。

然而写到这里的我发现,华为云也是有内网镜像 http://mirrors.myhuaweicloud.com 的!

然后就换到了华为云的内网镜像以达到 apt 的最大速度:

1
2
3
4
5
6
7
8
9
10
11
12
13

# 备份 sources.list 文件
cp -a /etc/apt/sources.list /etc/apt/sources.list.bak

# 修改官方镜像至内网镜像
sed -i "[email protected]://.*[email protected]://[email protected]" /etc/apt/sources.list
sed -i "[email protected]://.*[email protected]://[email protected]" /etc/apt/sources.list

# 更新 apt 源
apt update

# 安装常用软件
apt install build-essential wget curl vim coreutils

另外腾讯云的内网镜像为 http://mirrors.tencentyun.com,阿里云内网镜像为 http://mirrors.aliyuncs.com,青云内网镜像为 http://mirrors.ks.qingcloud.com,使用时留意替换即可。

pip

我日常使用有几个 python 软件,如 speedtest-cliyoutube-dlyou-get; 故此在通过

1
apt install python-pip python3-pip

安装 python 以后,需要设置相应的镜像以正常下载使用通过 pip 分发的 python 软件。通过阅读 更改pip源至国内镜像,显著提升下载速度,决定使用豆瓣提供的镜像:

1
2
3
4
5
# 通过镜像安装 pip 最新版本(?)
pip install -i https://pypi.douban.com/simple/ pip -U

# 切换到镜像
pip config set global.index-url https://pypi.douban.com/simple/

值得留意的是,由于不同主机提供商提供的镜像有所区别,在配置完 pip 镜像以后,需要先运行

1
pip install setuptools

以避免安装其他软件时出现错误。

nodejs

1
2
# 添加 nodejs 最新 LTS 版本(目前为 10.16.1)分发仓库 - 可在 https://nodejs.org 查看最新 LTS 版本号
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash

接下来参考 https://mirror.tuna.tsinghua.edu.cn/help/nodesource/

编辑 /etc/apt/sources.list.d/nodesource.list,把 https://deb.nodesource.com/node/ 替换为 https://mirrors.tuna.tsinghua.edu.cn/nodesource/deb/ 即可。 如果是 https://deb.nodesource.com/node_10.x/ ,则改为 https://mirrors.tuna.tsinghua.edu.cn/nodesource/deb_10.x/

然后

1
apt install nodejs

一般安装完毕以后 nodejs 会自带 npm(除非安装进程被中断 这时可能需要删除已经安装的 nodejs 并且按照上述步骤重新安装。

也可以尝试在运行完

1
curl -sL https://deb.nodesource.com/setup_10.x | sudo -E bash

后尝试

1
apt install npm

npm 可以选择切换到国内淘宝提供的镜像:

1
npm config set registry https://registry.npm.taobao.org

或者使用 cnpm

1
npm install -g cnpm --registry=https://registry.npm.taobao.org

到这里,个人常用的软件源镜像均已配置完成。

(1) past-stories,有着故事和回忆。

有着窗外白天白色无云的天空,和夜晚黄色寂静无人的街道。

有着轰鸣声里突然悬空,黑夜里灯火模糊成一片,刹那间视线和距离变得遥不可及。

有着唐诗宋词和歌词,何日功成名遂了,后来他乡即故乡。

有着无数次的并肩,有着带着笑的等候,有着对一举一动一颦一笑的沉迷。

有着无数次还会继续发生也无法阻止的离别,总是说着的祝你一切都好。

或者终于有一次足够勇敢或者果决按下删除,或者像无数次一样擅长口是心非。
(2) past-stories,有着文字和希冀。

有着很多隐去了人称的长句和排比,和奇奇怪怪措辞组成的比喻或者隐喻。

有着发自内心的喜欢,千百个汉字被排列成行,成了想要的模样。

有着来自内心的恐惧和悲伤,最后都到达了现实。

有着一直相信着的写人即写心,只可惜后来成了自己的心。

那么多似是而非的词句像是黑夜里燃起了大火照亮了森林,鲜艳的红色温暖了守望着远方的脸庞。
(3) past-stories,有着相遇和欣喜。

有着没有什么诗意的初次见面,没有多少指教也没有多少触动。

有着转角里下一秒就是陌生人的失措,只是平淡无奇匆匆路过。

有着后来形影不离伴着风声依旧,天南地北说着不着边际的话语。

那抑制不住的笑意,真的不是我没有在认真学习。

(4) past-stories,像素点低于了大气压,扑灭了本就不该存在的火花。微微发热的外壳背对着带着血丝的瞳孔,轻轻地听见水滴滑过皮肤和空气,落在布料上的响声。蓝颜色是天空的样子,在心里偷偷喜欢着。past-stories,长夜已经没有办法再被点燃。

…… 曾经你,数不清的日与夜里被藏起来的私语,义无反顾地让意外发生的那样自然。

大雨总是说来就来。雨滴打在栏杆上扬起水雾变成冰冷的温度,将全身覆盖。

像是试图去消除白天的炙热天气,凉爽而惬意的大风忽地吹来。雨滴在窗户上留下痕迹,在窗外霓虹灯光衬托下变成七彩的颜色。

很经常想起,“君问归期未有期 巴山夜雨涨秋池”。在黑夜里,昏黄的灯盏空洞地在黑夜里雨水嘀嗒声中守候。守候那个从未归来而也不知何时归来的故人。

就算是再爱的人,消失在你的世界里以后,都会成了故人。甚至忘了那个人的模样。那个人说过的话,在记忆里时刻回想着,甚至连语调都会惟妙惟肖。也许会刻意在其他人面前故作轻松地提起,装作完全没有在意过。

也许那将会是很多年以后,你记起很多年以前有个人的影子走近了你门前的小路。你记得那次惊鸿一瞥,后来偶尔一起并肩对彼此说的话。还有到最后的最后,书信末尾的勿念。

你读着书上说的一别两宽各生欢喜,看着窗外落叶悄悄在微风里旋转。你在心里念着待到秋来九月八 我花开后百花杀,却想着九月菊花漫山的时候花海里是否会有人影等待着再一次的相逢。

长安城里盛世繁花,不知何方花火里燕尔新人月下比肩。你眺望着面前冰凉湖水一望无际。湖中没有断桥没有小庭,没有记忆里或是理想中的模样。时代亦或是盛唐亦或是晚清,你站在原地不知道覆盖了多少霜雪。也许无喜无悲,也许依旧挂着期盼。最少还能有希望。

旭日东升。水晶剔透的玻璃上雨季留下的雨迹路过窗棂,最后在不知什么时候消隐无踪。

像极了这个世界里的悲欢离合,还有在这之间的等待和期许。偶尔脸上掩饰不住快要溢出来的微笑。

从很久以前的远行要开心,到后来的我的新年,或许乘着地铁离开了家乡,去了蝉鸣可以打破寂寥的地方。那里那个很久以前的俄罗斯青年说阴郁的日子要心平气和,雨水在台风季偶尔留下了痕迹。

“何当共剪西窗烛 却话巴山夜雨时”。

字里行间,也许有某一个影子奔跑跳跃,行走如风。在小小的城市 冷暖交加的四月里,让心脏跳动,让守候的人终究重逢。


放个彩蛋: