且行善举,莫问前程。

0%

嘟嘟五个月了

一眨眼很快,过年了,嘟嘟五个月了。

旅行

年前正好赶上新冠病毒,因为得到消息早,提前准备好医用外科口罩和婴儿口罩。退掉高铁票换乘飞机去厦门接老婆和孩子。也让嘟嘟有了第二次搭乘飞机的经历,接下来马上就有第三次了。

大运动发展

自从女儿学会翻身之后,紧接着就算进入大运动发展期了,晚上睡觉后就开始翻来覆去。因为床比较小无法让嘟嘟施展,晚上睡觉一会撞醒我,一会撞醒我老婆,还有时突然就翻过来了,看着她睁着无辜的大眼睛,帮她翻过身拍拍继续让她睡觉。也有时候睡着一觉醒来看不到嘟嘟,自己蹭到床尾,真的吓都吓死了。这段时间老婆可是累坏了。

妈妈

很兴奋的是在这段时间听到了嘟嘟喊妈妈,虽然家人不太相信,直到有一天,嘟嘟哭闹的时候一直喊妈妈,妈妈的辛苦总算没有白费。听到喊妈妈什么都值了,后来我还是很郁闷,老婆跟我讲总是教嘟嘟喊爸爸,为什么先学会的喊妈妈。

更多的第一次

第一次喝水

因为北方太干燥需要补水,一般都是先是用鸭嘴杯过渡,因为没买鸭嘴杯用给药器喂水,没想到嘟嘟喝的那么好,还非常喜欢喝水。后来妈妈用自己的吸管杯给嘟嘟喝着玩,更没想到的是竟然喝到了。鸭嘴杯不需要了,可以直接上吸管杯了。不过嘟嘟还是喜欢妈妈的吸管杯,看来还是喜欢第一次的啊。

第一次吃米糊

没了挺舌反应后,五个半月可以吃米糊了,我给嘟嘟买了碗,虽然买的碗妈妈非常不满满意, 最后还是在我的花言巧语下接受了。担心过敏,第一天只能吃几口,没有让嘟嘟吃到满足,接下来几天,看到碗就开始抢了,吃货无疑了。

第一次吃苹果

妈妈担心嘟嘟会便秘,所以要加一些纤维,苹果就是。用双头勺子的金属勺子刮刮苹果,软勺子喂给嘟嘟,第一口吃到虽然表情非常难受,但是还是会抢着要吃,也许是太酸了吧。

老婆很厉害

嘟嘟才刚刚开始,还有很多的东西要学习,要体验。突然回想到过去,自己也是嘟嘟这样的角色,一下子就变成爸爸了,不知道能不能做一个好爸爸,但是妈妈是一个好妈妈,非常用心的妈妈。

育婴群

我创建了一个育婴群,有兴趣的可以联系我,里面大多是程序员,都有很多的经验,备孕的怀孕的生育的都可以加入。

hexo使用的是markdown来写博客的,不过在写文章的时候,我 vim 并没有设置 auto wrap,所以我会自己去换行。但是 hexo 渲染的时候换行会变成多余的空格,排版就会变得很难看。如果从 hexo 的 markdown 渲染引擎入手我感觉会异常麻烦,所以,我打算写个脚本把换行去掉合并成一行,这样就简单的解决了这个问题。

花了几十分钟写完,代码如下。

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
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from glob import glob
from typing import List

files = glob("*/**/*.md", recursive=True)


def fmt(content: List[str]) -> str:
data: List[str] = []
lens = len(content)
n = 0
while True:
if "---" in content[n]:
tmp: List[str] = []
tmp.append("---")
while True:
n += 1
tmp.append(content[n])
if "---" in content[n]:
while True:
n += 1
if content[n] == "":
continue
break
break
continue
data.append("\n".join(tmp))

tmp = []
while True:
if "```" in content[n]:
_tmp: List[str] = []
_tmp.append(content[n])
while True:
n += 1
if lens == n:
n -= 1
break

_tmp.append(content[n])
if "```" in content[n]:
while True:
n += 1
if lens == n:
n -= 1
break

if content[n] == "":
continue
break
break
continue

data.append("\n".join(_tmp))

tmp.append(content[n])
i = n + 1
n += 1
if i == lens or content[i] == "":
data.append("".join(tmp))
break

if lens == n:
break

return "\n\n".join(data)


for f in files:
with open(f) as fp:
c = fp.read()

data = fmt(c.split("\n"))
with open(f, "w") as fp:
fp.write(data)

当然代码依然有一些问题,没有覆盖到所有的 markdown 语法,所以很多问题手动修改了。不过使用 Python 编写脚本确实能提升不少的效率,所以Python 是很值得学习的一门语言。

今天早上醒来,突然感到浑身发冷无力,感觉大事不好,赶紧拿被子把自己裹起来。片刻之后,虽然身体暖和了,但是一阵恶心涌了上来。真的大事不好,让老婆赶紧给我量体温,在这节骨眼上要是发烧,真的是比死还惨了,心理是真的难受,再加上最近疫情严重谣言众多,突然感觉自己可能是患病了,然后就不理性了起来。在乌合之众里讲过,群众都是不理性的,看过众多谣言之后,自己也不就变得不理性了,人云亦云,最终分不清真假。如果真的被感染,那我可爱的女儿和老婆该如何是好,我打好年华才刚开始,就要结束了么。

接下来就是恶心,反胃,腹泻,无力,发热,没有食欲,全都对上了,我这不完了。最后还是听了父亲的话,吃了点挂面后,吃了消炎药和退烧药,开始消热。一个小时后,不在那么难受了,我妈给我煮了面,吃过之后继续消热,终于体温降到了37度,这才舒服一些。

看过人民日报的安抚文章之后,其实想想,这些也都会流感的症状,如果贸然去发热门诊,也加大了感染的风险,不如先自诊隔离的好。虽然退烧了,也要观察两天才好。虽然可能虚惊一场,但是仔细想想,恐慌才是人群的致命弱点。这些天微信群各种谣言四起,不明白为什么会有这些谣言,但是这些谣言只会让人们更加慌乱,这时候,更应该万众一心对抗肺炎。我也并不推崇国外的个人主义,更喜欢人们万众一心对抗肺炎。

这段时间,肺炎盖过了很多的热点新闻,不过人们并没有忘记。红三,故宫,伤医,隐瞒疫情,我们并没有忘记,更希望能够秋后算账。在没有言论自由的社会,还能做些什么呢,只能希望会越来越好,也许现在就是最适合的。

还有武汉加油,今天真的感受到了他们的恐惧感,希望不要传播谣言,多多鼓励他们,为他们加油。

在国内,想要看看什么Youtube,用Google查查资料是不可能的。如果你还在用百度,建议你在hosts添加127.0.0.1 baidu.com,然后搭建自己的代理服务器,使用Google来高效搜索。所以我来说一下如何科学上网。

科学上网就需要有自己的代理服务器,不管是买的也好,还是自己自己搭建的也好,需要一个代理服务器(媒介)帮你跨越防火墙,那么我们聊一下有哪些方式。

有哪些方法?

提前说一下,我不推荐购买私人贩卖的代理,因为有蜜罐和跑路的风险。所以最好是自己搭建。

VPN和购买VPN

VPN我指的是像OpenVPN这样的服务,或者使用更简单的PPTP来实现的VPN。不推荐使用和购买,因为防火墙可以精准查封。

ShadowSocks和v2ray

都是很注明的反向代理软件,这两种协议有很多种实现版本,但是因为防火墙已精准检测这两种协议,也不推荐使用。

Ngnix反向代理

这种问题不大,时间久了也有风险。但是功能较单一,每个域名代理一个,还需要加HTTPS,操作复杂,不推荐。

JSProxy

我曾经看了jsproxy的实现,是利用Service Worker来实现的。感兴趣的可以访问附录1。这种形式体验很好,可以将前端部署在serverless computing上,如cloudflare 的workers,非常简单。当然也有缺点,只能帮助你来浏览网站。如果你是软件开发人员,需要代理像golang这样镜像站很少的语言时,就不可以了(此处只为黑golang)。

重点来了,我推荐的

使用shadowsock或者v2ray加混淆软件,如simple-obfs、v2ray-plugin。这样能达到隐匿的作用,而且速度也很快。我目前使用的这种方式,我没有介绍SSR软件,是因为我感觉那并没有必要。

该如何做

搭建需要一台服务器,建议使用Google Cloud的台湾或者香港节点,速度很快。根据线路的不同有一些不同。

申请Google Cloud需要一张国际信用卡(VISA等),注册过程网上有很多。注册成功后创建一个最小的服务器。创建完成之后登录服务器直接执行下面命令。

1
sudo wget https://raw.githubusercontent.com/Unbinilium/Twist/master/twist -O twist.sh && chmod -x twist.sh && bash twist.sh

成功后会自动重启,直接使用ShadowSocks扫描二维码即可。

这个是一键安装脚本,脚本会自动安装代理软件和混淆并且优化服务器,保证你的服务器的443端口可以访问。如果需要看源码,请访问Twist的Github https://github.com/Unbinilium/Twist

建议使用路由器翻墙

如果你为路由器翻墙,你连接路由器的设备就都已经翻墙了,包括你的terminal。这种翻墙方式体验最好。路由器我推荐使用话说的,因为话说路由器可以直接上传安装梅林系统(梅林是基于华硕路由器系统魔改,也许是因为国内法律原因才有了梅林)。

我自己买的华硕AC68U,如果需要可以访问梅林社区(KoolShare),下载梅林固件访问梅林firmware。当然也可以使用别的路由器,可能会比较麻烦,不过想省事千万不要买小米。

如果你使用Twist,ShadowSocks软件要使用4.2.0以下,最新版本已经用了v2ray-plugin,Twist依然再用simple-obfs。问题不大,不需要更新。

后续

我感觉我博客离封不远了,请自己享受,不要分享。

附录

  1. 基于 JS Hook 技术,打造最先进的在线代理

通过pyenv是安装python的最好的方法,从而避免很多环境上的坑。但是由于国内网络环境原因,pyenv在python.org下载很慢,所以就需要对pyenv设置代理,以加快下载速度。之前有写过一篇文章来介绍pyenv的python build。那么我们来说一下还有什么办法来加速pyenv。

使用http_proxy加速

pyenv下载python安装包使用的是http协议,那么我们可以使用http proxy来加速,直接设置shell的http_proxy环境变量即可。或者安装shadowsocksX-NG桌面端软件(该软件只适用于MacOS,其他平台在组织的其他项目中)并打开全局代理。

该方法需要你有一个代理服务器,门槛比较高。如果有你有代理服务器,我更推荐将代理部署在路由器中,来获得最好的体验。这些是后话,今后我会花时间来写一下。

搭建代理服务器访问如何科学上网

使用PYTHON_BUILD_MIRROR_URL加速

这是pyenv支持的环境变量,由于部署在七牛的mirror不在维护,目前只能使用github pages上部署的一个mirror了,不过github也比较慢,所以并没有什么效果。

有条件的可以使用国内的CDN或者服务器部署自己的mirror,项目在yyuu.github.com,需要自己跑脚本更新python的版本。

这种方法成本较高,并且国内没人维护。

手动下载加速

国内有python镜像站,像是淘宝源,手动下载相应版本并移动到~/.pyenv/cache/下,如果没有该文件,请手动创建。

然后使用pyenv进行安装即可,是不是很方便。那么可以自动化吗?

最完美加速

因为之前看过python build,了解过机制后写了一个代理,项目地址:pyenv-proxy

利用这个,就可以直接在淘宝源下载python了,不过pypy和miniconda等目前还不支持。为了大家方便,我在自己的腾讯云搭建了一个代理服务器,可以直接配置使用,接下来我会用WebAssembly部署到cloudflare的workers上。

配置如下:

1
export PYTHON_BUILD_MIRROR_URL="http://140.143.140.234"

不过有个小缺憾,目前我只拿出了tar.gz的包哈希,tar.xz的还没支持,所以需要修改源码了,使用vim ~/.pyenv/plugins/python-build/bin/python-build打开文件,定位到has_tar_xz_support方法。将返回值置位false就可以使用了。在后续的优化中,我会解决这个问题。

简单介绍

因为主题出了问题,所以将next-theme升级到了7.7.0的版本,由此一来要对博客重新做一次美化。在次过程中感觉next-theme的模块化越来越好了。并且原生支持了很多功能。老版本7.x以下大多都需要通过修改源码来实现美化或增加功能,而7.x完全可以通过修改主题配置实现。仔细读以下hexo的配置,修改配置后就可以实现美化,所以不再赘述。

添加文章结束标志

在hexo目录下创建source/_data/post-body-end.swig,添加以下内容。

1
<div style="text-align:center;color: #ccc;font-size:14px;">------ 本文结束 ------</div>

然后删除主题配置文件custom_file_pathpostBodyEnd的注释。

动态显示title

在hexo配置文件中添加subtitles,内容以W分割,或者自己修改分隔符,如:

1
subtitles: 人生当苦无妨,良人当归即可。W且行善举,莫问前程。

在hexo目录下创建source/_data/header.swig,添加以下内容。

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
<script>
function GetRandomNum(Min,Max)
{
var Range = Max - Min;
var Rand = Math.random();
return(Min + Math.round(Rand * Range));
}

function setSidebarMarginTop (headerOffset) {
return $('#sidebar').css({ 'margin-top': headerOffset });
}

function getHeaderOffset () {
return $('.header-inner').height() + CONFIG.sidebar.offset;
}

window.onload=function(){
var subtitle = "{{config.subtitles}}";
var mytitle = subtitle.split("W");
var max = mytitle.length-1;
var index = GetRandomNum(0,max);
var text = mytitle[index];
$(".site-subtitle").html(text);
var headOffset = getHeaderOffset();
setSidebarMarginTop(headOffset);
}
</script>

然后删除主题配置文件custom_file_pathheader的注释。

为主题文章添加阴影效果

在hexo目录下创建source/_data/styles.styl,添加以下内容。

1
2
3
4
5
6
7
.post-block {
margin-top: 60px;
margin-bottom: 60px;
padding: 25px;
-webkit-box-shadow: 0 0 5px rgba(202, 203, 203, .5);
-moz-box-shadow: 0 0 5px rgba(202, 203, 204, .5);
}

然后删除主题配置文件custom_file_pathstyle的注释。

禁止广告拦截软件

为了保证广告能够正常投放,并且产生收益,要禁止广告拦截软件,可以使用第三方代码fuckadblock

1
npm install fuckadblock

在hexo目录下创建source/_data/header.swig,添加以下内容。

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
<script>
// Function called if AdBlock is not detected
function adBlockNotDetected() {
// console.log('AdBlock check is ok');
}
// Function called if AdBlock is detected
function adBlockDetected() {
for ( i=0; i<document.styleSheets.length; i++) {
void(document.styleSheets.item(i).disabled=true);
}
alert('本站显示不正常,可能因为您使用了广告拦截器。');
}

// We look at whether FuckAdBlock already exists.
if(typeof fuckAdBlock !== 'undefined' || typeof FuckAdBlock !== 'undefined') {
// If this is the case, it means that something tries to usurp are identity
// So, considering that it is a detection
adBlockDetected();
} else {
// Otherwise, you import the script FuckAdBlock
var importFAB = document.createElement('script');
importFAB.onload = function() {
// If all goes well, we configure FuckAdBlock
fuckAdBlock.onDetected(adBlockDetected)
// fuckAdBlock.onNotDetected(adBlockNotDetected);
};
importFAB.onerror = function() {
// If the script does not load (blocked, integrity error, ...)
// Then a detection is triggered
adBlockDetected();
};
importFAB.integrity = 'sha256-xjwKUY/NgkPjZZBOtOxRYtK20GaqTwUCf7WYCJ1z69w=';
importFAB.crossOrigin = 'anonymous';
importFAB.src = 'https://cdnjs.cloudflare.com/ajax/libs/fuckadblock/3.2.1/fuckadblock.min.js';
document.head.appendChild(importFAB);
}
</script>

检测到广告拦截程序后,会禁用所有的网站样式。

小结

我的博客,除以上自己添加代码外,都是通过修改配置实现,无需修改主题代码,如更新主题,直接git pull即可。

如需要自定义功能或样式,在source/_data/下添加即可。

2020年上班第一天,我们搭在阿里云的一个服务突然无法访问了。调查许久后,找到了原因。

想要在国内部署一个网站,是需要备案的。如果不备案还要部署可以通过域名访问的网站,只能使用https协议,也就是443端口。这也是因为https协议的优势,加密你的网站访问。

但是2020年可能大多数网站就不能这么搞了。因为2020年注定是不平凡的一年,开个玩笑。2020年之后很多浏览器就不再支持TLS 1.0/1.1,那么目前就只剩下TLS 1.2了。

具体详情点击链接查看,SSL Labs Grade Change for TLS 1.0 and TLS 1.1 Protocols

再支持TLS 1.2之后,因为SNI(Server Name Indication)并没有加密,所以很容易被国内云服务器的监控抓取到,比如阿里的云盾等。当然你也可以想办法把云服务的这些监控给关掉,关掉后是否可以使用443端口我并没有尝试过,所以不做讲解了。

所以还是老老实实的用IP访问,或者部署到香港或者日本等比较近的地方吧。也可以等待TLS 1.3普及开来,等到TLS 1.3,SNI也就可以加密了。

我们经常会使用远程服务器当跳板机和开发机,如果说你的远程开发机有很多,当要从github clone代码时要怎么办。我们不可能将每台机器的公钥添加到我们的github账号,并且将我们的私钥放到服务器是很不安全的。

其实操作很简单,但是我发现很多人都不这么做,使用ssh agent。

确保你系统上的ssh agent在运行。

1
eval `ssh-agent -s`

打印agent daemon的pid,证明服务运行成功。

.ssh/config中添加以下内容,让ssh-agent可以转发。

1
ForwardAgent yes

添加你的私钥

1
ssh-add 'your pk path'

此时你就可以本地远程连接服务器,来clone你的代码,或者连接其他服务器了。如果远程服务器也需要转发,也要重复以上操作。

博客有一年没有更新了,并不是说有多忙,是自己有了一些想法,认为自己搞的东西在谷歌都能搜索到的,并没有很高大上的研究,所以就不想写一些科普文和简单的技术文章了,毕竟都是大家可以在网络上搜索到的内容。这种想法持续了很久,不知道是不是在为自己的懒惰开脱,经过一段时间的验证,还是想坚持写博客,不管是生活上还是杂谈或者是技术博客,都可以写下来。原因有三点。

第一,是可以帮助自己提高写作能力与总结能力。写下的文章自己也要通读几遍,对文章再做修剪和纠错,再次提高语言总结能力。

第二,坚持一个好习惯。我认为写博客是一个好习惯,可以记录生活,可以帮助一些人,也能提高自己的写作能力和总结能理力。或许还可以让自己变得更不浮躁更能独立思考。坚持也能让自己变得更有毅力(还有一个提高毅力和耐力的方式,那就是去运动)。

第三,可以加强记忆,习惯用印象笔记裁剪网页进行保存,虽然说可以进行搜索,但是长久以来,阅读能力下降,感觉保存起来就变成了自己的东西,而不能真正的消化掉,囫囵吞枣的看一遍,不能深入了解。俗话说,想记得牢而且真正的理解,那就是教别人一遍。

大学的时候,还会坚持写文章,博客从emlog到WordPress,又从之前Python写的一个模板渲染到现在hexo,之前的文章经过筛选留下了现在这些,也有很多文章已经被删掉了。

所以我决定继续坚持写博客,不过不会像以前那么简单,比如在xxx系统安装yyy类型的文章了,毕竟软件的readme都会告诉你的啊。

在macOS下,使用V-Block复制粘贴行内文字时,nvim总会自己在末尾加入一个\n字符,也不算是很严重的问题,但是和vim的表现是不一致的,或者也可以用v替换^v。

我使用vim一般都是用V-Block来复制粘贴,所以自从换了neovim就一直被这个问题困扰。最近有时间研究了下这个问题。

我通过nvim -u NORC启动nvim,使用v-block模式粘贴复制,发现问题不存在了。那肯定是配置的问题,配置有一千多行,只能用二分注释法去查找是哪个配置的问题了。

最后找到是clipboard=unnamed与系统剪切板共享出了问题。google无果,issue搜索clipboard相关问题,因为issue太多未找到。所以自己提了issue。

最后才知道,其实这个问题在2015年就有人提出了,在issue#1822可以找到,并且有很多人提了相同的issue。标为了bug,放到了todo的milestone,修复无望。

有大佬给出解决方案,只要在init.vim中添加下面的配置就可以了。

1
2
3
Plug 'bfredl/nvim-miniyank'
map p <Plug>(miniyank-autoput)
map P <Plug>(miniyank-autoPut)