博客再次迁移成功

工作了十几年,原来想跟风写写博客记录一下技术心得,也为了刷点人气(好要工资),一时兴起,但一直写写停停,工作忙是最主要的借口,主要还是自己懒,也感觉没太多好写的,写了也不一定有人看。

前阵时间终于从公司毕业,原来宝贵的时间好像变得廉价起来,但钱包也扁了下去,哭哭。

原来的博客用 Wordpress 搭建的,费用不高,但本着开源节流的精神,现在迁到了免费的 Cloudflare Page,使用 Hexo 框架搭建。

也许是差生文具多,花在博客搭建的时间比正经写博客的时间还多,好消息是以后有时间好好地写写了,坏消息是,之后不一定从事技术方面的工作了。😔😔😔

Linux查看软件包是否默认安装

今天同事问我:CentOS里的ss这个命令是在系统安装时就装了的么?那Ubuntu下也默认安装了?

对CentOS,咱还是熟悉的,想知道是否在系统安装时就默认安装了,首先得先知道这个命令是在那个包里的。可以用这个命令进行查看。

1
2
[root@localhost ~]# rpm -qf `which ss`
iproute-4.11.0-25.el7_7.2.x86_64

可以得知,ss命令是在iproute包中,那下一个问题,就是查这个包是否在系统安装时就默认安装了。CentOS 的yum groups里有一个Minimal 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
31
[root@localhost ~]# yum group info Minimal Install
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile

Environment Group: Minimal Install
Environment-Id: minimal
Description: Basic functionality.
Mandatory Groups:
+core
Optional Groups:
+debugging

[root@localhost ~]# yum group info core
Loaded plugins: fastestmirror
There is no installed groups file.
Maybe run: yum groups mark convert (see man yum)
Loading mirror speeds from cached hostfile

Group: Core
Group-Id: core
Description: Smallest possible installation.
Mandatory Packages:
audit
basesystem
bash
....
initscripts
iproute
iprutils
iptables
....

可以看出,iproute 包在core软件包组里,因此,ss命令是在系统安装时就默认给装上了。

再是Ubuntu,Ubuntu需要用apt-file工具进行查看,这个命令默认没有安装,需要用apt install apt-file 命令进行安装,安装后还需要更新下数据库,更新命令是apt-file update,数据库更新了就可以搜索了。

1
2
3
4
5
6
7
8
9
root@localhost:~# apt-file search /bin/ss
alsa-firmware-loaders: /usr/bin/sscape_ctl
dacs: /usr/bin/sslclient
....
embassy-domainatrix: /usr/bin/ssematch
hash-slinger: /usr/bin/sshfp
iproute2: /bin/ss
libnet-proxy-perl: /usr/bin/sslh
....

这个命令并不如rpm好用,首先得更新数据库,然后会列出所有符合搜索条件的结果(包括未安装的包里的文件,因此可以用这个命令来搜索只记得部分内容的软件包),因此搜索会比较慢。人工判断识别后得知Ubuntu里是在iproute2软件包中,再对比Ubuntu最小号安装列表(https://packages.ubuntu.com/bionic/ubuntu-minimal ),得知iproute2包是默认安装的包。

事后搜索了一番,Debian系其实也有类似rpm -qf的命令工具,使用dpkg -S whereis就可以直接得到结果了。这篇文章还整理了其他Linux发行版的命令,收藏以备查阅。

iOS 15 初体验,IP隐藏功能测试,还有Private Relay

iOS 15 Intro

作为一个果粉(其实我是三持用户,不过奈何微软不给力啊),一年一度的WWDC,还是熬夜看完了,很多人看完以后都在骂,戏称iOS 15为iOS 14.8,更新的一堆功能没卵用,iPadOS开倒车。我倒感觉还是蛮好的,FaceTime大更新,隐私功能继续加强,NFC开放,iPadOS“万物互联”,Safari移动端也支持插件了,这些都是我比较喜欢的点。

第一时间更新了iOS 15的beta版本,和往常一样,更新beta版本只需要下载安装描述文件,根据提示重启手机再检查更新即可。更新包蛮大的,3.5G左右,从下载到安装完毕耗时将近一小时。

iOS 15 Upgrade

系统更新重启后,从桌面上并没看出差别(其实有更新一张壁纸,但并没自动换上),直奔最感兴趣的功能:Safari浏览器增强了隐私保护,能对追踪器隐藏真实IP了。

如果在互联网上想隐藏IP,不外乎两种方式,一种是隧道技术,另一种是代理技术。但无论哪种方案,都需要先把流量在中间服务器上走一遭才行,难道苹果给弄了一堆服务器专门做这个?虽然苹果财大气粗,正想干也不是没可能,但这明显不对,且不说这会非常影响用户体验,苹果这庞大的用户群的流量汇总起来可不是闹着玩的。所以相比是单独为追踪器的流量做了过滤处理。

找到Safari的设置选项,新选项已然默认打开。

iOS 15 Safari Configrue

那就那我这小破站来试试水吧!

测试方法很简单,打开谷歌统计后台,再用手机和电脑同时、分别访问网站,看统计后台的统计结果。

IP Info

这个实验最开始失败了,原因是选项中默认开启了“阻止跨网站跟踪”功能。关掉后再访问,就可以发现谷歌统计统计到了两个地区的请求,证明确实达成了对追踪器隐藏IP的效果。那对于网站自身呢?下图是我网站的服务日志,日志统计到的用户IP是正确的,因此验证前面的猜想是正确的,Safari对流量进行了分流,这个功能在帮助用户保护隐私的同时,并不会影响网站的功能。

IP Info Source

至于Private Relay,现在iOS设置选项中已经有相关菜单,但不知道是因为iCloud+服务还未上线,还是BUG,我在点击开启的时候会提示我付费更新,而我本身已经订阅了iCloud服务。

iOS 15 iCloud

iOS 15 Private Relay

除此之外还体验了其他,比如FaceTime、钱包、照片信息等等,不过这不是本文对重点,总之更新挺好,但也确实遇到了bug,毕竟是第一版测试版本嘛,可以理解。无论如何,iOS在隐私方面是越来越强了,这也是大势所趋,移动互联网野蛮生长的年代已经过去,只是广告行业的人要头疼了,想必谷歌一定不喜欢iOS的这个更新就是了。

修复homebrew安装软件404问题

作为追新族,基本上我所有设备上的系统、软件,都会在第一时间更新到最新。因此我经常运行各种update命令,包括brew upgrade,但今天,发现和往常不太一样。

在更新软件时,终端中有不少黄字提示404警告,并且最后的结果也出错了。

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
#=#=-#  #
curl: (22) The requested URL returned error: 404 Not Found
Warning: Bottle missing, falling back to the default domain...
==> Downloading https://ghcr.io/v2/homebrew/core/libyaml/manifests/0.2.5
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/libyaml/blobs/sha256:83547fba540a38c30705a59a2e746952c68857212e823c6ee97c186e088f75cd
==> Downloading from https://pkg-containers-az.githubusercontent.com/ghcr1/blobs/sha256:83547fba540a38c30705a59a2e746952c68857212e823c6ee97c186e088f75cd?se=2021-04-22T06%3A55%3
######################################################################## 100.0%
==> Downloading https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/ruby-3.0.1.big_sur.bottle.tar.gz
==> Downloading from https://homebrew.bintray.com/ruby-3.0.1.big_sur.bottle.tar.gz
#=#=-# #
curl: (22) The requested URL returned error: 404 Not Found
Warning: Bottle missing, falling back to the default domain...
==> Downloading https://ghcr.io/v2/homebrew/core/ruby/manifests/3.0.1
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/ruby/blobs/sha256:00daa93e4b30d3bbeac5089c1c34355315774e0d9fd1d9588402b2e755089c53
==> Downloading from https://pkg-containers-az.githubusercontent.com/ghcr1/blobs/sha256:00daa93e4b30d3bbeac5089c1c34355315774e0d9fd1d9588402b2e755089c53?se=2021-04-22T06%3A55%3
######################################################################## 100.0%
==> Downloading https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/vim-8.2.2775.big_sur.bottle.tar.gz
==> Downloading from https://homebrew.bintray.com/vim-8.2.2775.big_sur.bottle.tar.gz
#=#=-# #
curl: (22) The requested URL returned error: 404 Not Found
Warning: Bottle missing, falling back to the default domain...
==> Downloading https://ghcr.io/v2/homebrew/core/vim/manifests/8.2.2775
######################################################################## 100.0%
==> Downloading https://ghcr.io/v2/homebrew/core/vim/blobs/sha256:2d48b73b8157241aef912e1fdc7e587837b60e4898f69d597b1f4182a520afe2
==> Downloading from https://pkg-containers-az.githubusercontent.com/ghcr1/blobs/sha256:2d48b73b8157241aef912e1fdc7e587837b60e4898f69d597b1f4182a520afe2?se=2021-04-22T06%3A55%3
######################################################################## 100.0%
==> Installing dependencies for vim: gettext, lua, ncurses, [email protected], berkeley-db, gdbm, perl, mpdecimal, readline, sqlite, xz, [email protected], libyaml and ruby
==> Installing vim dependency: gettext
==> Pouring gettext-0.21.big_sur.bottle.tar.gz
tar: Error opening archive: Failed to open '/Users/username/Library/Caches/Homebrew/downloads/8835c3d1869eedf98376360b02e32e1ec1fcb790687cfa164713bea02c45e577--gettext-0.21.big_sur.bottle.tar.gz'
Error: Failure while executing; `tar --extract --no-same-owner --file /Users/username/Library/Caches/Homebrew/downloads/8835c3d1869eedf98376360b02e32e1ec1fcb790687cfa164713bea02c45e577--gettext-0.21.big_sur.bottle.tar.gz --directory /var/folders/7h/dkrm4zdd6bv315h44vqhx5pr0000gn/T/d20210422-22363-1sups7j` exited with 1. Here's the output:
tar: Error opening archive: Failed to open '/Users/username/Library/Caches/Homebrew/downloads/8835c3d1869eedf98376360b02e32e1ec1fcb790687cfa164713bea02c45e577--gettext-0.21.big_sur.bottle.tar.gz'

不会吧?一个用户基数这么大的服务,居然会出现这么多404 :mrgreen: ?去GitHub一查,好嘛,原来是bintray要关闭了,具体看这里,应该是截止到某个时间点,之后的包就没再往bintray传了,也就是404了。

其实Homebrew社区对这个问题早就做了准备的,新版的homebrew程序已经去除了bintray相关,使用ghcr.io服务了,所以只要正常使用,正常先update,再upgrade,是可以完美过渡,用户是无感的。

至于我为啥不行,是因为我用了清华大学的镜像,目前清华大学的镜像中依然是指向到bintray的,所以也跟着404了。所以要解决问题,那就是去掉清华大学的镜像设置就好了。具体的环境变量是$HOMEBREW_BOTTLE_DOMAIN。使用export HOMEBREW_BOTTLE_DOMAIN=’’命令就可以去除。上面是临时修改,如果想永久修改,则需要去更新profile文件,zsh是/.zprofile文件,bash要修改/.bash_profile文件。

修改完后,再进行安装,就一切正常了。

我后来又去清华大学的GitHub上看了,已经有人反馈这个问题了,同时发现 https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/ 目录下并没有直接列出各种包,反而多了一个bottles目录,想必清华大学已经是在处理这个问题,开始同步了吧。只是这个镜像有2.5T大,要完全同步完,真不知道猴年马月了。

macOS在iterm2使用touch ID

macOS sudo Prompt

最近老得修改系统hosts文件,然后也就老得sudo后输入系统密码,久而久之,有点烦,遂研究了下在终端下使用Touch ID的方法。

首先,修改/etc/pam.d/sudo文件,当然,这步依然需要sudo。在最上面一行添加上auth sufficient pam_tid.so,下面是在我电脑上修改后的内容,修改后:wq!强制保存退出。

1
2
3
4
5
6
7
# sudo: auth account password session
auth sufficient pam_tid.so
auth sufficient pam_smartcard.so
auth required pam_opendirectory.so
account required pam_permit.so
password required pam_deny.so
session required pam_permit.so

这时候,你如果使用系统自带的终端进行sudo,那已经可以弹出Touch ID验证框了。但iterm2下并不行,依然提示输入密码,起初我以为是因为iterm2枚重启,然而并不是。原来是iterm2需要额外设置,具体选项为Prefs > Advanced > Allow sessions to survive logging out and back in,默认是Yes,需要修改为No,再重启iterm2,就可以愉快的使用Touch ID验证sudo了~

macOSPreferences

Python实现命令行单行倒计时

说明:实现在命令行中单行显示的倒计时功能。

重点:转义字符\r ,定宽输出 $2s

目标效果:

单行倒计时

代码:

1
2
3
4
5
import time
for i in range(10,0,-1):
print('还需等待%2s 秒' % i, end = '\r')
time.sleep(1)
print('还需等待%2s 秒' % 0)

最后实现效果:

Python 单行倒计时实现效果

失败案例(未采用定宽输出):

Python 单行倒计时错误示范

一个无语的mysql问题

今天收到任务,要求在mysql中对某库新建一个用户,并可以通过局域网访问。嗯,很简单的需求,我也操作过很多遍了,三下五除二搞定并把相关信息发给了研发同事。

过了一会研发同事告诉我说不行啊, 有问题,登录不上呢,我测试了以后还真是,提示说
ERROR 1045 (28000): Access denied for user 'dbuser'@'192.168.1.5' (using password: YES)
。不光远程登录不上,连本机也是如此。

再次用root登录mysql,检查用户表,检查授权表,均未发现异常,之前操作授权的窗口还未关闭,再次确定不是密码错误。创建了一个测试库以及测试用户试试,这里的密码是直接复制粘贴的

1
2
3
4
5
6
7
8
9
10
11
mysql> create database testdb;
Query OK, 1 row affected (0.00 sec)

mysql> create user testuser@'%' identified by 'dSVtT-S&H4L>9ZF\Zk';
Query OK, 0 rows affected (0.00 sec)

mysql> grant all privileges on testdb.* to testuser@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

测试的结果显示新用户testuser居然也登录不上。难道是我记错什么地方了?查了查笔记,我的操作并没有什么问题,毕竟也没有报错嘛。在mysql的官方网文档中查了半天也没查到什么有用的信息。至于直接搜索登录时的报错信息,那查出来的基本都是说教你怎么重置mysql root密码的,这显然不对。

一个多小时过去了,无奈只好请教了下DBA朋友,朋友没看出什么问题,但提醒说你试试改个简单点的密码?我最开始还想反驳对方,毕竟我这个是强密码,不过我还是照做了。没想到改了一个弱密码后还真可以了。我朋友告诉我说mysql的密码尽量别用特殊字符了,直接用大小写英文+数字就好了。回看一下我之前的密码”dSVtT-S&H4L>9ZF\Zk”,看起来特殊字符”" 的嫌疑最大,实际测试果然如此,到此,问题总算水落石出了。

总结:mysql下的密码不能随便设置,一些特殊字符出现在密码中可能会引起意想不到的错误。

聊聊MacBook Pro

MacBook Pro

今天收拾了下屋子,无意中扫落了柜子上的盒子,那是MacBook Pro的盒子,里面的发票掉了出来,拾起来一看,我才注意到原来我已经买来一年半了。收拾完房间,我盯着前方的电脑,回想到很多事情,决定写一篇文章来聊一聊。

为什么

我拥有自己的电脑的时间已经很晚了,我还记得我第一台电脑是我叔送我的,型号是Compaq CQ40(后来才知道这个品牌当时已经属于HP旗下了),具体配置记不清了,只记得是2G DDR2内存的,后来加了一条2G内存升级到了4G,这台笔记本陪伴了我差不多5年,15年的时候我换了第二台电脑-联想Y430P,这是我工作后换的第一台电脑,也是真正意义上花自己的钱买的第一台电脑。这台电脑我当时差不多买了这个型号顶配的样子,后续我又给它升级到了3块SSD(因为闲着也没用,就全装进去了),16G内存,前前后后差不多8K左右。这台电脑至今还在服役,颇有还能再战3年的架势。

第三台电脑就是本文的主角-18款13寸版MacBook Pro,我18年8月份购买的,配置是在乞丐版基础上把内存加到了16G。我还记得我是把电脑快递到公司的,最开始还是想低调点,下班直接偷偷带回家的,奈何同事帮我签收了快递,Apple独特的包装一眼被我同事识破,无奈在大家的起哄下打开了包装,果不其然被冠以“土豪”,“有钱人”的标签。

“为什么要买MacBook Pro”?“后悔买MacBook Pro了么”?最开始这3个问题被问到的最多。在很多人印象中,Mac电脑都是“人傻钱多速来”。他们会问这10K+干啥不好,要买这一台性能弱鸡,玩不了游戏,除了装逼一无是处的Mac,有这钱买个Windows电脑不妥妥的性能比这个强好几倍?

为什么要买MacBook Pro?这个问题我确实有好好想过,我之前的工作中,因职务之便,把自己的工作电脑换成了之前研发淘汰下来的Mac mini(11款),因此接触到了macOS,我对Mac的开箱即用,干爽清净非常喜欢。这是我选择MacBook Pro的一大动机。同时因为上一台笔记本是在太过笨重,因工作需要经常需要背着跑,深受其害,因此我发誓再买笔记本一定买轻薄款的,两者结合,顺理成章的就选择了MacBook Pro。至于上面说到的玩游戏方面,我买这个笔记本就是为了干活的,游戏实属不是考虑了重点,因此直接忽略了。

问题

这台电脑用了一年半了,由于我当时没有购买Apple Care+,因此现在已经过保了。在这一年半里,我对使用体验打85分。这期间也不是一帆风顺的,发生过两件“大问题”,除此之外一切安好。

第一次是18年9月的一个下雷雨的下午,我给售后打了一个下午的电话,因为电脑安装完一个小更新后系统故障,进不了系统,或者偶尔进去了,一小会后就死机了。客服帮忙远程诊断(我第一次感到真心牛逼,但又没啥用)后,并没有发现问题,无奈只好格盘重装系统。好在当时电脑买来不久,再加上我本人也有备份的习惯,基本没啥损失,就是花了我好多话费;

第二次是19年的中秋节前几天,当时我就发现我的touch bar靠近开关的位置经常会闪烁(见下方视频),当时我已经过保了,电话咨询客服后客服建议我去天才吧看看,我怀着忐忑的心情(网上有相似的案例,解决方案是换了整个C面)去了天才吧。天才吧的工作人员表示需要返厂检测后才能得出结论,同时查看了电脑序列号后告知我的Mac在免费更换键盘的机型当中,当然一切以返厂结果为准,7天后(正好中秋),我从天才吧取回了电脑,同时被告知我电脑整个C面(包含电池)都换新了,电脑本身已经不再有保修,但键盘保修3个月。touch bar的问题也解决完毕,从此我对苹果的好感更进了一步。

方便?不方便?

这个话题我得先从我的手机说起。我目前主力手机是iPhone 6S,一台比我电脑还老的设备,但不得不说一旦接受了苹果的生态,是真的很方便,由于手机和电脑登录的是同一个Apple ID,我手机拍的照片马上在电脑的相册里就能查看,手机看到一半的网页可以一键在电脑上打开继续阅读,电脑上复制手机上粘贴,遇到没网的环境电脑还会提示使用iPhone作为热点,iPhone上输入过一次Wi-Fi密码,所有设备都会直接连上这个Wi-Fi等等。当然,这些功能很多在Windows上也能实现,但这里说的是方便,是真的非常方便。

说完了方便,再说说不方便的,2018款的Macbook pro配置了4个type-c接口,这当然很先进,但因此我也遇到了麻烦:我其他设备都是USB接口,因此我额外购买了一个扩展坞,一根type-c转DP线,一根type-c转lightning;然后是硬盘问题,苹果让人吐槽最多的应该就是磁盘空间问题(无论iPhone还是Mac),我电脑只配置了256G的磁盘。虽说基本够用,但还是有所掣肘,为此我买了一块500G的外接SSD硬盘,挂载着使用,除了用来保存文件以及安装一些软件外,外接硬盘同时还为电脑开启了时间机器功能,这个功能非常棒,可以让文件回溯到很久之前,包括误删了的文件。下面是我使用了一年半后的磁盘使用率。

MacBook Pro磁盘使用率

刚刚提到了移动硬盘,那不得不说的一点就是Mac对磁盘格式的要求和Windows上的差别了,Windows下常见的NTFS格式在Mac下默认可度但不可写,因此如果经常需要两个系统之间用移动硬盘或U盘倒文件,最好还是格式化成exFat格式,这样两个系统下都可以读写。然后还有一个细节:如果Mac下用右键菜单里的压缩选项压缩的文件夹,Windows下有时候会解压不了,可能和系统字符集有关系。

还有一个不方便的点就是鼠标、键盘和Windows下的逻辑不太一样,鼠标如果不设置,那滚轮方向和Windows下是相反的,同时键盘布局也略有不同,这个作为一个双机党,最开始的时候还真不适应,不过现在可以很自然的切换了。

软件,游戏?

软件方面,就IT行业来讲,其实Windows上常用的软件(包括XX卫士,XX安全管家之类的)在Mac下都有,在习惯上和Windows下基本无差别,而没有Mac版本的很多软件都有其他解决方案,再加上我在购买MacBook Pro之前已经有了一年的使用经验,因此在日常使用以及工作中倒也没遇到什么问题。同时Mac下也有很多独占的软件是Windows下没有且让Windows用户很眼红的,比如多媒体剪辑软件Final cut,iterm2。当然了,要说数量,那肯定比Windows下是少很多很多的,同时我刚刚也说了这是IT行业下的软件现状,那自然还有很多行业、场景是Mac不能完全胜任的,就比如各种银行的网银插件等。

Mac下其实能玩的游戏也不少的,我前面虽然说买Mac就是为了工作,游戏基本不在考虑范围内,其实还是有所考虑的,我电脑上玩的最多的游戏就是魔兽世界了,这个在Mac下是可以运行的,我实际体验在1080P分辨率,画质5档的情况下,基本稳定60fps,唯一的问题就是这游戏太大了,近100G的磁盘占用,占用了我电脑一半的磁盘空间,不过我购买了外接移动硬盘后,就把很多软件都安装到移动硬盘下了,磁盘空间问题解决。

除了魔兽世界,steam下的可在Mac下运行的游戏也不少,就刚刚我打开steam搜索了下,支持macOS的游戏有23,023款,其中不乏大作,比如dota2,文明6等,不过这种大作对电脑性能要求普遍较高,对我的电脑来讲,玩起来就很吃力了。不过甜品级的游戏比如死亡细胞啥的,玩起来就毫无压力了,配置上手柄,Mac就直接成为游戏机了。

生产力工具?

先给出答案:是的,就我自己而言能比Windows提升20%工作效率。干的活相同,个人能力也不变,那为啥说提升了效率?这个主要有几点:

1、Mac下干扰少,不容易分心。

这个和Mac下的软件环境有关系,一样的软件,Windows下经常会有弹窗、广告啥的吸引你的眼球,而Mac下软件都很安静。

2、macOS系统自带shell环境。

因为工作关系,经常需要用到shell环境,Mac下可以很方便的本地调试,这个虽然win10有wsl子系统,但终究还是不如macOS下方便。

3、苹果的良好生态

这个上面有说,因为苹果在各个设备之间同步、切换非常方便,我可以在没电脑的时候手机上安排工作,然后不需要任何操作就可以在电脑上进行提醒、处理等。

后悔?

不,当然不后悔,甚至我可能下一台电脑依然选择Mac。当然我也有Windows电脑,开了3389远程桌面作为macOS等补充。

洋洋洒洒流水账似的写了这么一大堆,回看了一遍,发现还真是流水账,基本没个重点,不过这个就是我使用MacBook Pro一年半后的体验,电脑终究还是只是一个工具,只有适合自己的才是最好的,对我来说MacBook pro买的非常值,至少以前我从来不会背着电脑去星巴克,现在我可没少跑呢。

搬山计划

书山

“买书如山倒,读书如抽丝”,我是一个爱书人士,每当电商打折,看到高额打折券,我都会忍不住剁手,多则一次十来本,少则一次三五本。但是呢,买来的书又很少会看,看完前几章就算不错了,甚至还有买了三五年还没开封的(我花钱买来的书为啥还要花时间看?

直到上次搬家,我发现这个问题非常严重:我的书比我的衣服还多一箱。从那以后,我才开始约束我自己(实际上是我想买的书基本上买的差不多了),绝对不再为了买书而买书了,只有真需要的时候才能买书。

但,虽然已经约束了,原来的“山”还在啊,怎么解决呢?卖是不可能的,那只有一个办法了:把它们读完。于是乎,就有了本篇文章的主题,我把这个计划起了个名,叫做“搬山计划”,借鉴了愚公移山的故事,我要把这座“山”搬空。

下面是我这个计划的一些细则:

  • 每个月阅读1本非技术类书籍,同时阅读200页技术类书籍(可视内容难度适当增减)
  • 每周阅读时间3个小时。
  • 非技术类书籍必须看完一本才能开另一本
  • 技术类书籍最多可同时开2本一起阅读,只有看完一本才能开另一本
  • 技术类书籍如遇到当下必须看的书,可插队
  • 阅读技术类书籍,实践类的内容需要做笔记,同时每个月需要发布至少2篇阶段总结型的文章。

这是我2020年制定的第一个目标,坚持一年,看年终总结时的成果如何。

Nginx fastcgi_cache 的坑

这两天迁移完后发现一个奇怪的问题:我nginx里配置了两个vhost,分别是博客(www.repfaststart.com)和图床(tu.repfaststart.com),然后有时候,当我访问图床时,打开来的结果是博客。

遇到这种问题,第一印象是我nginx配置文件写错了?检查了下,没错啊,server_name 配置的明明白白,清清楚楚的。看日志,抓包,两个结果都是相同的,显示直接返回的200状态码。而nginx的日志,我两个vhosts的日志是分开记录的,当出现上诉情况时,tu.log里会记录一条200,然后在www.log里记录了其他页面元素的记录。

在排除了CDN配置和php-fpm错误的可能性后,我又想到了日志里那条诡异的200日志,之前没注意看,现在看发现这条日志没有upstream,也就是说没经过php-fpm处理,那可以肯定,还是nginx自己的问题了。

又重新审视了下nginx的配置文件,终于找到了原因,下面是图床(tu.repfaststart.com)配置文件。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
fastcgi_cache_path /data/cache/tu levels=1:2 keys_zone=tu:10m;
#省略无关配置
server {
listen 443 ssl http2;
server_name tu.repfaststart.com;
#省略无关配置
location ~ \.php$ {
fastcgi_pass unix:/dev/shm/php-cgi.sock;
include /app/nginx/conf/fastcgi.conf;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
try_files $uri =404;

expires -1;
#下面这行就是根源所在
fastcgi_cache www;
fastcgi_cache_key $request_uri;
fastcgi_cache_use_stale error timeout invalid_header updating http_500 http_503;
fastcgi_cache_valid 200;
add_header X-Cache $upstream_cache_status;
}
}

可以看到,我这里配置了fastcgi_cache,然后我这个配置文件是拷贝博客(www.repfaststart.com)的配置文件修改的,下面的fastcgi_cache的keys_zone没有更改过来,因此两个网站使用了共同的缓存,而缓存是用request_uri做主键的,所以当直访问/这个两者共有的请求时,fastcgi_cache会直接把缓存的内容返回给客户端,就出现了这次的症状。

知道了问题根源,那就很好办了,修改完配置文件,重载nginx,至此问题解决。这次还是粗心大意导致的问题,还好是自己的网站,如果是公司业务,那麻烦可就大咯。