且行善举,莫问前程。

0%

如果写同步的程序,我都是使用 requests 发送 http 请求,异步程序,我更倾向于使用 aiohttp,这两个都是非常优秀的工具包,但是写异步代码,如果掌握不精很容易坑了自己。接下来我会讲述一下我在使用中遇到的一个问题。

aiohttp client 抛了异常

下面是简化过的代码。

http.py
1
2
3
4
5
6
7
8
9
10
11
12
import aiohttp

class Http:
def __init__(self):
connector = aiohttp.TCPConnector()
self.session = aiohttp.ClientSession(connector=connector)

async def get(self, url):
async with self.session.get(url) as r:
return await r.text()

http = Http()
main.py
1
2
3
4
5
6
7
8
9
from base import b

async def main():
r = await b.get("https://blog.ibeats.top/robots.txt")
print(r)

if __name__ == "__main__":
import asyncio
asyncio.run(main())

这时候执行 main.py 就抛出了异常

RuntimeError: Timeout context manager should be used inside a task

打断点查看,确实是在 with timer 抛出的错误,这情况很有可能是没在事件循环内实例化 session。代码少还是很容易看出来,运行事件循环前导入了 http,并且实例化了 session。

所以从根本上上解决问题就是导入http时不要初始化 session,然后代码可以改成这样。

http.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import aiohttp

class Http:
def __init__(self):
self.session = None

async def get_session(self):
if self.session is None:
connector = aiohttp.TCPConnector()
self.session = aiohttp.ClientSession(connector=connector)

return self.session

async def get(self, url):
session = await self.get_session()
async with session.get(url) as r:
return await r.text()

http = Http()

这样就可以就可以放心的在任何地方初始化了。

为什么不能运行前实例化session。

运行事件循环前也可以实例化 session。但是不要使用 asyncio.run 方法,可以自己创建一个loop来运行事件循环。

1
2
3
4
5
6
async def main():
...

if __name__ == "__main__":
loop = async.get_event_loop()
loop.run_until_complete(main())

为什么会这样,我们要进入 asyncio 内部看一下了,CPython 有用 Python 实现的 asyncio 代码,就不用直接看C了。在看过 aiohttp 代码后,aiohttp 初始化 session 时,使用的是 asyncio.get_event_loop() ,asyncio.run() 是自己创建的事件循环。那么我将代码简化后写出来再分析一下。

runners.py
1
2
3
4
5
6
7
8
9
10
11
from events import *
def run()
if events._get_running_loop() is not None:
raise RuntimeError("asyncio.run() cannot be called from a running event loop")

loop = events.new_event_loop()
try:
events.set_event_loop(loop)
return loop.run_until_complete(main)
finally:
...
events.py
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
class _RunningLoop(threading.local):
loop_pid = (None, None)

_event_loop_policy = None
_running_loop = _RunningLoop()

def get_running_loop():
loop = _get_running_loop()
if loop is None:
raise RuntimeError('no running event loop')
return loop

def _get_running_loop():
running_loop, pid = _running_loop.loop_pid
if running_loop is not None and pid == os.getpid():
return running_loop

def _set_running_loop(loop):
_running_loop.loop_pid = (loop, os.getpid())

def _init_event_loop_policy():
global _event_loop_policy
with _lock:
if _event_loop_policy is None: # pragma: no branch
from . import DefaultEventLoopPolicy
_event_loop_policy = DefaultEventLoopPolicy()

def get_event_loop_policy():
if _event_loop_policy is None:
_init_event_loop_policy()
return _event_loop_policy

def get_event_loop():
current_loop = _get_running_loop()
if current_loop is not None:
return current_loop
return get_event_loop_policy().get_event_loop()

aiohttp使用get_event_loop,就是说如果不调用 set_event_loop,当执行 asyncio.run 时,会重新创建一个事件循环,导致事件循环不是同一个,运行事件循环时,aiohttp 里抛出,所以启动事件循环时,也使用 get_event_loop 就能保证最后使用的是同一个事件循环,当然还是不建议这么做,稍微控制不好就会耽误很长的时间找问题所在,最后得不偿失了。

延伸阅读

七月是完整的,嘟嘟一直在我身边,让我又有了当爸爸的感觉。

女儿越发可爱,变得更有灵性,学会了嘟嘴巴和撒娇,会张着手要抱抱,有时候也会抓着我的手放到她身上让我抱起来她,不开心了还会哼出声来。

嘟嘟讲话也不仅限于咿咿呀呀,她竟然先学会了喊爸爸,这让我感到很惊讶,比我更惊讶的是妈妈了,不过妈妈更多的是吃醋。嘟嘟的一声爸爸,让我感觉以后她有什么要求都会答应她。她没事就会讲话,有时候讲的多了,我和妈妈都感觉她好啰嗦啊。

因为疫情原因,这一个月里不能请阿姨,父母也没办法过来,只有我和妈妈两个人照顾嘟嘟,所以这也是非常劳累的一个月。欣慰的是,嘟嘟睡眠比之前稍微好一些了,也仅仅是好了一些,有时候也会睡眠很睡眠倒退,一晚上会醒个十几次,也许是因为开始长牙的原因。由于嘟嘟每天很早就睡觉,她都会在早上五点或六点起床。起床后她都会很罗嗦的大声讲话,要把我们叫醒,如果还是没人理她,她就要开始无情的拍打踢人了。我担心自己睡眠不足,回家后只能早早就睡觉了。

妈妈一直关注着嘟嘟长牙,想掰开嘟嘟嘴唇看一下的时候又很不配合,嘟嘟最不喜欢别人动她的鼻子和嘴巴了。不过还是有机会看到的,下颚已经开始冒出一点点乳牙了,不过是那种还没出来的,只是隐约看到牙龈里白白的牙齿。有时候也许是牙痒痒,拿东西给嘟嘟的时候,她会很着急的夺过去放进嘴巴里,她这样做的时候,我总以为是饿急了。

嘟嘟的辅食也多样化了,面条,米糊,南瓜蒸蛋,鸡肉粥,牛肉粥,各式各样的。不过都是打碎的那种,我看到反正是一点食欲都没有。嘟嘟有时候也没有食欲,会扭头反抗就是不吃,妈妈会先把辅食自己吃一口,说一句好吃,再喂她,这样嘟嘟就会乖乖的吃起来,毕竟味道还是很不错的。

我和妈妈经常会把嘟嘟放在她的小毯子上面,然后一人站一边,把被子抬起来摇晃,妈妈说这样可以刺激她的前庭发育。嘟嘟非常喜欢这样,后来只要把嘟嘟放在小毯子子上,她就知道接下来要发生什么,然后就开心的笑起来。有天摇晃嘟嘟的时候,我跟妈妈讲,嘟嘟大了好多啊。

嘟嘟会坐了,坐的也更稳了,但是还不会爬,因为没有足够大的地方放爬爬垫,床上太软,趴着时胳膊总会陷下去,这样也不容易学会爬行。其实现在更好,如果会爬了,就会爬来爬去就更不好带了。后来我们把家里归置了下,终于可以放一个爬爬垫了。

妈妈还是每天带嘟嘟出去玩,虽然上海没办法看海,但是也可以让嘟嘟见到更多新鲜事物,经常出去对嘟嘟身体也好,晒太阳可以促进维D的转化。嘟嘟从小就经常出门玩,所以不怕生人,有时候看到人会主动笑,如果不理她,她还会主动咿咿呀呀的朝着人喊话,我们都很担心这傻孩子以后跟别人跑了,还是要看紧一些。因为疫情关系现在还是要戴口罩的,我们发现小孩子戴口罩是真的张着嘴的,其实小孩子不爱戴口罩才这样,张着嘴口罩就容易掉下来了。

妈妈带嘟嘟更多一些,所以嘟嘟也更粘妈妈,妈妈对嘟嘟很温柔,我对嘟嘟有些严厉。妈妈总说我跟嘟嘟玩,像是是在玩嘟嘟,我感觉其实都差不多。嘟嘟变化真的很大,以至于很多事情让我感觉到她已经有了自己的想法,有了喜怒哀乐,是让我摸不着头脑的喜怒哀乐。有时候不懂为什么她会因为我扔海洋球会笑个不停,为什么会突然哭起来,为什么会生气的拍打自己的腿。后来我想我应该正视嘟嘟,虽然她还那么小。嘟嘟正在融入我们的生活当中,不再像以前一样,每天就是吃和睡,她已经有了自己的意识了。

而对于我,想更多的是嘟嘟的教育问题,有时很担心她会发展不好而给她制定很多人生规划,因此也怕制定太多人生规划让她出现逆反心理。有时候想教给她很多东西担心她会走太多的弯路。担心让她学的太少以后责怪我。担心她受到不好思想的干扰。担心学的太多会压力很大。还担心与嘟嘟之后的关系,是严肃的父亲还是知心的朋友。

也许这些担忧不是必须的,今后也有很多不确定性,但是这些问题都还在,和整个家庭有关,影响着嘟嘟的一生。

我感谢我的父亲给予我如今的眼界,我是幸运的。嘟嘟是幸运的,我们都没有饥饿的困扰,没有战争的威胁,我们都是幸福的。也希望自己早日实现阶级跨越能给嘟嘟一个更好的人生。

之前说过如何科学上网,如果不会的可以先看一下《如何科学上网》。科学上网之前当然要有一个好的服务器,所以我推荐akkocloud,这也是我在使用的服务器,如果感兴趣的可以使用我的推荐链接https://www.akkocloud.com/aff.php?aff=256注册购买,非常感谢。接下来我来介绍下这个服务器。

akkocloud介绍

这家运营商是比较新的,知道的人比较少,所以不会像搬瓦工那样,总是处于售空的状态,即便补货你也是抢不到的那位。所以这个是个机会,如果错过你将再也买不到这样的服务器。

线路

翻墙肯定是要稳定,推荐美国圣何塞CN2 GIA,如果你不知道什么是CN2 GIA可以谷歌搜索一下,CN2简单就是说,这是中美之间的VIP通道,GIA就是去程和回程都是CN2,所以线路是非常稳定的,高峰期基本都不会丢包。更重要的是,三网优化。

带宽

最低是50mbps,双向600G流量,油管2k基本无压力,最大是150mbps,1500G流量。当然越大的价格越贵。

奈非?HBO?

最厉害的是,这家可以看奈非和HBO,也许体量小,IP还没有被封,今后是否能看还不清楚。

价格

支持支付宝支付,最便宜的50元一个月。不时会推出一个活动,打个八折,还是非常优惠的。建议买75元一个月的,带宽能达到100mbps。

关于注册

手机号可以不填,邮箱最好填真实的,虽然说它不会验证你的邮箱,但是是用来接收invoice的,还是用真的比较好。

MC服务器

akkocloud整体偏向于二次元,所以还提供我的世界服务器托管,10块钱一个月,太良心了。

为什么翻墙

和世界接轨。

后记

最近发现搬瓦工有个补货监控网站,网站链接https://status.bwgyhw.cn/,他们也有补货通知的 TG 群,感兴趣的可以加一下。如果有买搬瓦工服务器的,可以点击我的邀请链接https://bandwagonhost.com/aff.php?aff=59518,在此谢过了。

美股月内四次熔断,比特币也从一万美元跌至最低三千八百美元,在比特币产量减半之前,首先实现了资产减半,可以说很刺激了。随着币价的暴跌,也出现了各种流言,前两天就听到了一个这样的消息。

“比特币系统出错,矿工已经四小时没有出块了,后台增发数量造成算力漏洞被攻击,可以双花了。黑客利用这个漏洞凭空造出了一千万个比特币出来”。虽然说的有头有尾,但是稍微了解区块链的人直接可以确认这是谣言了。那么我们就针对这个谣言来聊聊细节吧。

比特币挖矿

挖矿在区块链中就是出块的意思,也就是矿机做哈希计算得到合法的结果,进而生成区块。所有的块连接到一起就形成区块链,这就像是链表一样的结构。然后通过共识进而达到无法篡改的目的。那么如果说比特币系统出错,或者算力大幅度减少,后台也不可能增发数量,也不可能一直不出块,毕竟挖矿是有一定的幸运率的。或者在一些区块链浏览器看一下谣言也不证自破了。

难度

哈希计算出来的值,前面的有多少个零就代表难度是多少。比特币定义difficulty 1为0x1d00ffff,十六进制也就是:

0x00ffff 2**(8 (0x1d - 3)) = 0x00000000FFFF

target用十六进制来表示,target和difficulty的换算是:

difficulty = difficulty_1_target / current_target

所以当一个通过哈希计算出来的值小于当前的target也说明这个块是合法的。就可以打包写入区块链,并广播自己挖出的块。谁计算的快,谁就可以得到挖矿奖励,目前大概是12.5个比特币奖励,因为包括矿工费所以一般大于12.5。下次奖励减半时间大概是2020年5月14日。具体可以看btc.com/stats/halving

比特币大概每十分钟出一个块

感兴趣可以去btc.com看一看,比特币大概每十分钟出一个块,有时会接连出一两个,有时则会超过十分钟甚至一个小时都不出,这都跟幸运值有关,也和算力的增长有关。当矿机增加或减少就对应着算力的增加或减少,如今散户们都是接入矿池以获得更多的收益,毕竟现在矿池当道,solo并不是一个太好的选择。

为了维持每十分钟一个块,比特币每2016个块重新计算一次网络的难度,使挖矿继续维持在每十分钟一个块。也就是:

2 weeks / 10 minutes = 14 24 60 / 10 = 2016

重新计算难度也是根据2016个块来计算的:

new target = old target * time for 2016 blocks / 2 weeks

也可以看我的实现github.com/ciknight/microchain/blob/master/microchain/chain.py#L76,我使用比率来计算,并且规定比率在4到1/4之间。

如果想要了解更多的比特币知识

可以看一下《mastering bitcoin》这本书,谷歌一下就可以搜到在线阅读,十本免费的书籍。想了解更多技术相关可以看比特币的开发手册和wiki。当然比特币只是区块链技术的一角,还有更多的链可以学习,他们互相取长补短,不知道在未来的某一天,区块链会不会改变我们的生活。

引用

嘟嘟六个月了

因为疫情缘故,今年是在家待过最久的一年,北方的天气比较干燥,环境的突变让嘟嘟变得更加烦躁。

怎么还不拉屎

吃辅食之后,便便不再像只吃母乳那样,会比较干燥,而且一不小心就会便秘。经历过嘟嘟第一次便秘之后,真的是怕了,嘟嘟哭的撕心裂肺,所以我变的和妈妈一样,会因为嘟嘟不拉屎而心急。昨天没拉屎,两天了怎么没拉屎,这都三天了怎么还没拉屎,明天再看看,要不吃点火龙果?自从有了嘟嘟,生活里就基本都是屎尿奶了。

一见我就笑

二月龄之后就分开,五月龄在家短短相聚,一晃一个月后,六月团聚,嘟嘟变的更加黏妈妈了。在嘟嘟小的时候妈妈经常带嘟嘟去海边走,所以嘟嘟一点都不怕生。嘟嘟每次见了我还是会开心的一笑,我也会跟着她一起笑,也许这就是亲情的联系?

回家

不像以往,这次乘飞机嘟嘟异常烦躁,因为舱内气压原因一路哭个不停。嘟嘟已经不再是那个低需求宝宝了,明白的事情也越来越多了。好的一方面,终于一家人团聚了,虽然经历了千辛万苦。自从回家嘟嘟睡眠也突然变好了。

第一次喂食

虽说嘟嘟已经吃了很久的辅食了,不过我第一次喂嘟嘟是回上海后,第一次没有能喂嘟嘟是一个不幸,虽然视频里见到了第一次嘟嘟吃辅食的样子,但没有在场未免有些遗憾。我第一次喂她是吃苹果泥,因为不熟练各种被抢勺子,又没有围口水巾,结果弄的脸上和衣服上都是苹果泥,最后不知道是何种原因,吃下去的苹果泥,全吐出来了。总之,我是笑的人仰马翻,留下嘟嘟一个人懵逼。

一张白纸

嘟嘟就像一张白纸,什么都没有,她什么都不懂,对什么都感到好奇,开心难过的也都那么纯粹。

清澈的眼神

和嘟嘟对视,她的眼睛是多么的清澈,没有任何杂念,水汪汪又单纯的眼睛。第一次感觉这种清澈的眼神真的存在。

叫我爸爸

嘟嘟还不会讲话,也没有叫我爸爸,当然她应该也不知道我是她的爸爸,也不知道爸爸意味着什么。我不知道自己有没有准备好嘟嘟叫我爸爸,这一声爸爸意味着什么呢。

嘟嘟五个月了

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

旅行

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

大运动发展

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

妈妈

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

更多的第一次

第一次喝水

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

第一次吃米粉

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

第一次吃苹果

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

老婆很厉害

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

育婴群

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

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就可以使用了。在后续的优化中,我会解决这个问题。