且行善举,莫问前程。

0%

在国内,想要看看什么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)

0x00

使用 <C-d> 可以显示补全列表

0x01

使用补全时,可以使用<C-n><Right><Tab>键选择下一个补全,使用<S-Tab><C-p><Right>键择上一个补全。

0x02

当使用Ex命令时,如:bn,可以按 @: 来重复上一次命令,运行一次后就可以使用 @@ 来重复他,如果想回到上一个文件,可以使用使用 :bp 命令,但是更好的替代方案是,使用<C-o>来反向遍历缓冲区列表。

0x03

粘贴内容时,使用 :set nopaste,这样粘贴板的内容就不会自动缩进了,而是保持原格式。

0x04

vim中,% 代表当前文件,所以可以使用 :!python % 来执行当前文件。

0x05

使用 :args 列出vim缓冲区列表。输出中的[]字符表明哪个是活动文件。:ls 也是如此,但更加好看,其中%标识当前缓冲区打开文件,#则代表轮换文件。

0x06

使用 :edit . 或者 :Explore 打开vim内置文件管理器netrw。

我的一个朋友问我,哪里有下载python的镜像源,我一直都是在是pypi下载,而且路由都已经翻墙,平时很少会碰 到下载python慢的问题。不过在我们伟大的墙下,访问pypi.python.org确实会慢很多。

Pyenv

一般管理下载python除了brew还会用pyenv,推荐直接用pyenv安装python,这样就可以很方便的管理python版本。 pyenv是可以设置PYTHON_BUILD_MIRROR_URL环境变量来加速下载python。添加之后也下载python会快很多,当然 也要看mirror的位置,如果在github上也不会快到哪里。我都是用这个源http://pyenv.qiniudn.com/pythons, 但是目前已经没人维护了。

然后我找到了淘宝python源,然后设置pyenv的mirror url环境变量, 发现并没有任何作用。经过一番查找,在 pyenv issue 18知道了 pyenv使用了python build。

Python Build

python build,看 实现是把python包和sha256写入到配置文件,下载的时候通过sha256的值来获取python包,我写了个web sever证实 了这一点。

当你使用pyenv安装python时,找不到python版本号会提示你更新pyenv,也就是git pull,更新的就是python build 的映射文件。

我通过重定向讲下载跳转到具体的淘宝源url,pyenv可以成功下载。当然pyenv最终会比较下载的包的sha256的值, 校验不通过依然会去python.org下载。

那么我们只需要把python build配置中的包名和sha256的值取出来做一个映射,就完全可以全部转发到淘宝镜像源 了。具体怎么取偷个懒,毕竟这样的需求还真不多。或者在淘宝直接下载包放到pyenv的cache中,就可以直接安装了。

上一周Neovim发布了0.3.0版本,这次版本更新修复了很多问题。也包括我之前遇到的按键无法使用问题,还有 一个困扰我许久的bug,也就是在neovim中使用!command,无法打印unicode字符。

我尝试也打印终端的编码,也修改了vimrc种的编码配置都没有任何效果,这使得我需要频繁推出neovim,切换到终端来执行 一些shell命令。所以这个bug一直放到了todo list中,在neovim github的issuse中也没有搜索到相关问题。在我还没提issue的 情况下,这次0.3.0的版本就已经更新了。

MacOSX中更新neovim

肯定要第一时间更新neovim。使用brew upgrade neovim来更新,发现我碰到的问题都已经解决了。真心 给neovim团队点赞,今后也会为neovim尽一份力。