由于奇奇怪怪的原因,我在国内打开 Epic Games 启动程序的时候无法打开 Library(游戏库)页面,导致无法运行 / 安装任何游戏。


经测试下述方式可以解决问题:

  1. 打开文件资源管理器,上面地址栏输入 %USERPROFILE%\AppData\Local\EpicGamesLauncher
  2. 返回上一层目录,即 Local
  3. 退出 Epic Games 启动程序,删除整个 EpicGamesLauncher 文件夹。如果在已经退出客户端的情况下提示还有文件被占用,忽略即可。
  4. 重启 Epic Games 启动程序。问题已解决。

无用且无趣的小知识:EGS 启动程序可以通过 https://get.js.org/epicgames (https://get.js.org/epicgames) 快速下载 来源:https://www.reddit.com/r/EpicGamesPC/comments/eaezt8/not\_able\_to\_install\_game\_in\_library\_stuck\_in/fb3ph5b (https://www.reddit.com/r/EpicGamesPC/comments/eaezt8/not\_able\_to\_install\_game\_in\_library\_stuck\_in/fb3ph5b)

在 2018 年 4 月 13 日,Google 的 goo.gl 短网址服务停止了运行;已有短网址会依然工作,但是用户将无法创建任何新的短网址。 在昨天,一个偶然,登陆了百度的短网址平台 [dwz.cn](https://dwz.cn),发现其已于 2020 年 4 月 23 日停止了个人服务;转为企业付费服务。 在过去,我一直在寻找着搭建自有短网址服务的方式(且不需要有 “用户系统”,让用户可以注册、创建自己的短链接)。尝试过 Polr,以及一些 SaaS (Software as a Service, 软件即服务)。通常,短网址程序都需要 PHP 和数据库,以及较高的性能要求;而 SaaS 短网址们的免费版本又会有诸多限制。 最近想起了 Google Firebase 里面的 Dynamic Links 服务;根据官方介绍、网上论坛和客服回复,我们可以确定以下事实:

  • Dynamic Links 在用户端拥有无限配额 - 无限次数打开,无限流量,不怕被刷。
  • Dynamic Links 在管理端有速率限制 - 每个项目每天可以请求创建 20,0000 次短网址,每个 IP 每秒能请求 5 次。可以提交表格请求增加限制
  • Dynamic Links 默认域名 {custom}.page.link 托管在 Google 的服务上,中国大陆无法访问;自定义域名服务托管在 Fastly 上,国内丢包较严重。但是一旦自定义域名在 Firebase 的控制台里接入完成(要求绑定 A 记录),Firebase 会一直服务自定义域名,并不会随着 A 记录的更改而停止服务。所以,我们可以接入 CloudFlare 来解决 Fastly 在国内丢包的问题。

如果你要继续阅读,你需要满足以下条件: - 会魔法 - 有 Google 账号 - 有自己的域名,知道如何管理 DNS - 有 CloudFlare 账号,并且域名接入 CloudFlare 让我们开始吧。


首先,打开 https://console.firebase.google.com,选择免费计划,完成 Firebase 基础设置,然后创建一个项目。 进入项目,右边侧边栏往下滑,找到 Dynamic Links: 选择开始: 输入你喜欢的域名: 继续继续到第 3 步,添加提供的 A 记录到你选择的域名;如果域名使用 CloudFlare NS 接入,先不要开启小云朵: 点击完成;回到 CloudFlare 开启小云朵,或者更换解析记录到 CloudFlare 的 IP,这时候域名已经可以正常打开。 回到 Firebase 控制台,点击 New Dynamic Link 输入你想要的短网址域名后缀: 输入目标网址,和一个可以随便填写的短网址名称: 由于 Dynamic Links 实际上是为跨平台 APP 的安装和跳转设计的,但我们这里只作为最简单的短网址服务来使用,所以接下来的两个定义链接在安卓 / iOS 上的表现我们都选择 Open the deep link in a browser 直接在浏览器中打开;基于同样的原因,我们在最后一步也选择 Skip the app preview page 跳过应用预览页面;最后点击创建。


你可以打开 https://go.hxis.me/hello 看看效果。

写在前面

以下是本文核心内容:

1
2
3
4
5
6
apt update
apt install python3 python3-pip ffmpeg screen
pip3 install --upgrade you-get ykdl youtube-dl
you-get https://youtube.com/playlist/xxx
screen
python3 -m http.server

明白这是什么的可以直接复制粘贴;本文终结。以下正文:


挺久以前写过一篇含有 you-get, youtube-dlykdl 三个常用命令行视频下载软件在 Windows 上安装教程的博文;很多阅读了的人都觉得太繁琐了,安装不易。当时并没有想到(似乎也不知道)同样的事情是可以用更为简单的方式完成的。这就需要提到我们今天的主角:Ubuntu 系统(或者任何相似的 Linux 系系统,例如 Debian)。

拥有一个 Ubuntu 系统

Ubuntu 是完全开源免费的,基于 Debian 的 Linux 发行版,由英国的 Canonical 公司开发。Ubuntu Server 是 Ubuntu 系统的分支,仅包含命令行页面。 初识 Ubuntu,是在 Steam 的下载页面上。这个页面如今已经没有了,因为在一次 UI 更新中(Steam Chat),Steam 重新制作了他们的下载页面。但是通过网页时光机,我们还是能找到这一段文字。 后来有了自己的服务器,一直在用 CentOS 的我禁不住本站友链 - 樱花庄的白猫的博主 - Mashiro 的疯狂安利,于某一次重装服务器的时候毅然决然选择了尝试 Ubuntu Server。 再后来发现,Ubuntu 的生态远比 CentOS 成熟,而对于操作系统的维护,以及其本身的精致程度,都远超 CentOS。虽然偶尔能听到 CentOS 远比 Ubuntu 稳定的观点,但是本站这样小门小户的,似乎也不需要考虑什么稳定性(笑)。能用,够用,好用,就好了。 感叹先放一边,我们看看如何拥有一个 Ubuntu 系统。方式大致有三种:使用虚拟机安装,WSL(Windows Subsystem for Linux,适用于 Linux 的 Windows 子系统)以及一台 Linux 服务器。

虚拟机安装 Ubuntu

首先我们需要一个虚拟机软件。以 Windows 为例,最常见的虚拟机软件是 VMware Workstation,在 macOS 上则为 VMware Fusion。当然,有一些其他的选择,比如免费的 VirtualBox。 截止至 2020.05.13,Ubuntu 最新的 LTS(Long-term Support,长期支持)版本是 20.04 Focal Fossa,官方下载地址是这里。 由于可能会分配到国外的下载节点(镜像),可以使用阿里云的下载源代替:https://mirrors.aliyun.com/ubuntu-releases/20.04/ubuntu-20.04-live-server-amd64.iso。 至于安装,这里有一篇来自 CSDN 的教程:https://blog.csdn.net/github_38336924/article/details/82427252,可以作为参考。过程就不再赘述。

WSL 安装 Ubuntu

WSL 仅在版本 1607 之后的 64 位版本的 Windows 10 或者 Windows Server 2019 中可用;如果达到系统要求,你可以参考这篇来自微软的官方教程以使用 WSL 安装 Ubuntu Server:https://docs.microsoft.com/zh-cn/windows/wsl/install-win10。 教程里并没有列出 Ubuntu 的 20.04 版本,你可以在 Windows Store 的这里:https://www.microsoft.com/zh-cn/p/ubuntu-2004-lts/9n6svws3rx71 找到它;默认的 18.04 Bionic Beaver 版本也能用。 如果你想使用本地机器(虚拟机,WSL)下载国外视频,你可能需要全局魔法;可能可以通过 SStap 实现。

在 Linux 服务器上使用 Ubuntu

除非你拥有物理服务器,你需要向各类云服务厂商租用一台。除非你只打算使用服务器来下载国内的视频,并且能够忍受较低的服务器带宽(1-20 Mbps 对比几乎人均 1 Gbps 的国外服务器),你应当考虑国外的服务器。 对于最基础的 1C1G (1个 CPU 核心,1G 运行内存)的服务器配置,价格一般为 $3 - 5 (合 21 - 35 人民币)每月,并且有一部分支持按小时计费。 说到服务器,就免不了老生常谈,提及一些常见、简单易用的服务器厂商(或者叫服务提供者?),也免不了各种引荐链接。下面会对它们进行简单的介绍,以及阐明这里给出的引荐链接的效果。


  • 首当其冲的当然是 Vultr。
  • Vultr 虽然中国用户众多,造成大陆地区网络连通性大幅下降,且较多 IP 被封锁,依然是对入门玩家而言最有代表性的服务商。部分地区有 IPv6 Only(仅有 IPv6 IP) $2.5 每月 1C 0.5G 的小鸡(例如 Atlanta 亚特兰大和 New York 纽约,而在这些地区可以通过 Bug 开出来同样配置价格但是带有 IPv4 的小鸡,不一定有效)。
  • 在所有地区都有 $5 / 月,1C1G 按小时计费的小鸡可用。对于你家网络对 Vultr 的多个可用去的连通性,可以打开 https://www.msmbps.com 进行测试。延迟越低越好。注意 Vultr 有可能开到被封锁 IP,这个时候就需要删除机器重新创建。会扣 $0.01(因为已经开始使用第一个小时)。
  • 引荐链接方面,使用这个链接注册并绑定支付方式,即可获得有效期一个月的 $100 用来试用服务器。

  • 紧随 Vultr 之后的是 Digital Ocean。
  • 这家有一个好处就是开机超级快,并且可以创建一个 Float IP,相当于能免费赠送多一个 IP,并且就算开出来的默认 IP 被封锁,也可以通过创建 Float IP 多赌一次。个人经验是 DO 家的 IP 并不经常被封锁,且创建小鸡很快(20s)。可用区有伦敦德国阿姆斯特丹新加坡等等,依然建议使用 https://www.msmbps.com 测试。
  • 价格方面最低配置只有 1C1G $5 可选;本站的源服务器就是 Digital Ocean 家的。
  • 引荐链接方面,使用这个链接注册并绑定支付方式,即可获得有效期_两_个月的 $100 用来试用服务器。

还有一些类似的服务商,例如 Linode, BuyVM, Vmhaus, AWS Lightsail 等等。这些个人没使用过 / 深入体验过,就只作列举。Oracle 也提供免费(但是性能很弱)的 1/8C 1G 50G 20T 的服务器,但是需要信用卡申请;如果感兴趣可以自行搜索。 在云服务器上使用 Ubuntu Server 很简单:安装时选择就好了。在创建服务器以后,服务商都会通过直接显示或者电子邮件的方式告知你服务器的预设密码,或者让你直接创建。系统创建的默认密码在登陆后可以使用 passwd 命令重置。

登陆云服务器

创建完小鸡以后,会分配一个公网 IP。这时,我们需要使用 ssh 协议登陆服务器,进行远程操作。 目前,我所使用的方法是直接从 Windows 程序和功能安装 openssh 组件,可以直接在 cmd(命令提示符)内使用。你也可以使用 Windows Terminal 代替 cmd。 对于如何安装 Openssh 组件,你可以参考这篇来自微软的官方教程:https://docs.microsoft.com/zh-cn/windows-server/administration/openssh/openssh_install_firstuse 按照上方教程安装完毕后,你可以打开 cmd,使用以下命令进行登陆:

1
ssh [email protected]{你的IP}

通常在初次连接服务器的时候会询问如下内容:

The authenticity of host ‘167.172.165.188 (167.172.165.188)’ can’t be established. ECDSA key fingerprint is SHA256:v4oQMSS9zrxzbzi2lQNSt6nzm5JNriYlAjkmBeQaPDA. Are you sure you want to continue connecting (yes/no)?

输入 yes 然后回车即可。然后会显示:

root@167.172.165.188‘s password:

输入预设密码(不会显示)回车即可登陆。登陆后可使用 passwd 命令更改密码。

更换 apt 源

如果在国内使用 Ubuntu 系统(服务器 / 系统本身物理在国内),那么你需要对 Ubuntu 系统的包管理器 apt 使用镜像以加快下载速度。 你可以参考这篇来自阿里云的官方教程:https://developer.aliyun.com/mirror/ubuntu 以 Ubuntu 20.04 为例:

1
2
3
4
cp /etc/apt/sources.list /etc/apt/sources.list.bak 
# 备份
rm /etc/apt/sources.list
vim /etc/apt/sources.list

按下键盘上的 ‘insert’,复制以下内容,右键粘贴

1
2
3
4
5
6
7
8
9
10
11
12
13
14
deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

然后按 ‘esc’, 输入 ‘:wq’ 保存。

安装 pip3

1
2
apt update
apt install python3-pip

即可完成安装。

更换 pip 源

pip 使用 https://files.pythonhosted.org 分发,国内访问较慢。使用以下命令更换 pip 源到阿里云镜像:

1
pip config set global.index-url https://mirrors.aliyun.com/pypi/simple/

安装 you-get 和其他

因为视频下载时常涉及到视频分片合并,所以 ffmpeg 是必须的。使用以下命令安装:

1
apt install ffmpeg

然后安装 you-get, ykdl 和 youtube-dl:

1
pip install --upgrade you-get ykdl youtube-dl

稍等片刻即可完成安装。 使用方式:you-get https://youtube.com/playlist/xxx,其余两个程序同理。

取回文件

使用海外服务器有一个好处:下载海外视频非常快。但是下载了还需要取回到本地;我们可以使用 python3 的 http.server 功能快速解决:

1
2
apt update
apt install python3

然后

1
python3 -m http.server

如果需要长时间下载、取回多个或者大量视频,可以先使用 screen 创建一个会话,这样可以一直保持 http.server 运行:

1
2
3
4
apt update
apt install screen
screen
python3 -m http.server

在浏览器内打开 http://{你的IP}:8000 即可看到目录下所有文件: 右键选择复制链接地址,即可使用各类多线程下载工具(如 IDMFDM)快速下载

为表达全国各族人民对抗击新冠肺炎疫情斗争牺牲烈士和逝世同胞的深切哀悼,国务院决定,2020年4月4日举行全国性哀悼活动。在此期间,全国和驻外使领馆下半旗志哀,全国停止公共娱乐活动。4月4日10时起,全国人民默哀3分钟,汽车、火车、舰船鸣笛,防空警报鸣响。 国务院公告:4月4日举行全国性哀悼活动

于是就想着跟一波风;虽然本站并没有多少人访问。 本来想着 0 点准时放代码,然后清除 CloudFlare 缓存,一天以后再去除。可是那样太麻烦了,于是就想着用 js 判断下日期然后直接 document.write 一个带有变灰 CSS 代码的 <style> 标签。这样不仅可以做到准时准点变灰,还顺带适配不同的时区。下次再需要变灰就改一下日期即可;完整代码如下:

1
2
3
4
5
6
7
let today = new Date().toLocaleDateString();
// document.body.innerHTML += today;
if (today == "04/04/2020" || today == "4/4/2020") {
// change the date to today to see instant effect
document.body.innerHTML +=
"<style>html,body{filter: grayscale(75%); -webkit-filter: grayscale(75%); -moz-filter: grayscale(75%); -ms-filter: grayscale(75%); -o-filter: grayscale(75%);filter: progid:DXImageTransform.Microsoft.BasicImage(grayscale=0.75);}</style>";
}

由于我是 CVM 开发模式高级工程师,代码来源如下:

上述代码演示:https://codesandbox.io/s/eloquent-keldysh-on8fq;灰度设置成了 75%,看起来其实没多大区别,不喜欢改成 100% 即可。 更新: - 加上了听说适配 IE(反正百度首页也是这样用的)的 CSS 写法(然而对 IE11 还是无效) - 添加了 today = "4/4/2020" 的表述;部分设备会输出这个格式的日期,而不是 04/04/2020(说的就是你,小米)

小米官网驱动下载页面给小米笔记本 Pro 的核显驱动还是 100.6518 版本的,搜了下似乎是 2019 年 2 月的版本,比最新版 100.7755 旧了挺多的;然而官方的驱动是 “定制版” 的,并没有办法通过 Intel 官网下载的最新驱动安装包更新驱动。我也尝试过直接卸载显卡驱动,也还是没有办法安装。 在使用 Intel® Driver & Support Assistant 检查系统更新的时候,核芯显卡一栏也会出现提示:

Error: A customized computer manufacturer driver is installed on your computer. The Intel® Driver & Support Assistant is not able to update the driver. Installing a generic Intel® driver instead of the customized computer manufacturer driver can cause technical issues. Contact your computer manufacturer for the latest driver for your computer.

网上搜了一波,基本上都说 “定制” 的核显驱动都是厂家为了稳定性云云,最好别乱更新官方版本。然而新版本香啊,还支持 Vulkan API,管他什么稳定性(而且我独显也一样用 NVIDIA 官方驱动,也没见什么不稳定),先更新一波。 首先从 Intel 官网进入最新核显驱动的下载页面(分系统位数和处理器代数,然而 6 代以后都是一个驱动,除非你在用更旧的处理器,不然都是一样的):https://downloadcenter.intel.com/zh-cn/product/80939 然后进入下载页面后,从左边选择 .zip 那个下载项,下载并且解压缩。 任务栏 Windows 图标右键,选择设备管理器,显示适配器,然后双击你核芯显卡的名称(Intel xxx)。 从弹出来的对话框里选择驱动标签,选择更新驱动,选择从本机选择驱动软件的那个选项(第二个),选择下面那个箭头(大意是说让我从可用驱动中选择),选择从磁盘,然后打开你刚刚下载解压缩了的那个驱动文件夹,进入 Graphics 目录,选择 i 开头的 .inf 文件(我这边有两个,我选了比较大的那个),然后点击确认。 驱动在现在开始会自动安装,等一下就好了。装好了最好重启下。 这样,我们就可以在已经安装了 “定制版” 核显驱动的情况下更新到最新的官方驱动了。注意,这样做可能(但是我觉得不会)会让系统变得不稳定,请自负后果。 此外,强烈推荐使用 Intel® Driver & Support Assistant,谁用谁知道。

前言

在使用 GitHub 的时候,有时候会遇到想要 Fork 一个代码仓库,然而目的并不是提交 Pull Requests,而是自己想部署一份。GitHub 官方的帮助文档里,这篇 Syncing a fork 有提到同步 fork 的方式,然而需要命令行。 在我们什么都不想做只想点鼠标的情况下,我们可以使用 Pull app 自动为我们同步原作者对这个代码仓库的更改;这样,我们就可以收到后续的 Bug 修复和更新(但是请注意,不要在生产 / 商业环境这样做)。

安装

在这里,如你所见,我 Fork 了一个 xirikm 写的 hostloc-auto-get-points,能够通过 GitHub Actions 自动获取 Hostloc 论坛积分。 在登陆了 GitHub 账号并且 fork 好了代码仓库的情况下,首先我们打开 Pull app 的页面:https://github.com/apps/pull,点击 Install(安装): 然后选择想要安装的账号(包括组织): 接下来可以选择安装到所有代码仓库还是单个;为了以后麻烦,我们选所有。 (所以写到这里才发现如果你不想你所有 fork 了的代码仓库都被瞬间同步的话,还是选择安装到特定的代码仓库好了) 然后输入密码,app 就安装好了:

使用

使用方法:不用管了.jpg Pull app 现在每小时自动检测并且通过提交 Pull Requests 然后 我 通 过 我 自 己 的方式同步你(所有的) fork 了的代码仓库。 你也可以手动访问 https://pull.git.ci/process/${owner}/${repo} 现在立刻马上同步你的某一个安装了 Pull 的代码仓库。 当然这个 app 也提供 N 种具体化配置,但是要写配置文件,可以参考官方文档:https://github.com/wei/pull#advanced-setup-with-config 上面都说了我们只想点鼠标怎么可能会去写配置文件呢

今天换了新主题! 之前的 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);
}

截至 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