V2Ray+Cloudflare搭建"永不被墙"的梯子

之前一直在自己的VPS搭建Shadowsocks服务端做梯子, 不过在一些政治敏感时期, 墙的力度会增强, 前段时间我发现Vultr的所有IP几乎都直接被墙了 经过了解, 决定改用V2Ray搭建一个新的梯子. 我觉得V2Ray最牛逼的一个点是可以将流量伪装成Websocket并通过Cloudflare(CDN)来代理, 而CDN整个被墙掉的概率很低的 ... 建议使用这个项目来搭建V2Ray服务端, 非常好用 速度方面可以接受, Google查个资料, YouTube看个视频基本还是没问题的…

读<跨越千年的RSA算法>

原文链接 跨越千年的RSA算法 在当今这个由互联网构筑的世界里, RSA算法几乎无处不在. 例如: 访问任何一个https证书加密的网站 通过SSH登录一台服务器 从GitHub上clone一个项目 说来惭愧, 作为一个每天和RSA算法打交道的程序员, 直到最近学习了Matrix67大神讲解RSA算法的博客我才终于理解RSA算法到底是怎么一回事. 在真正介绍RSA算法之前作者用了大量的篇幅为读者填补了必要的数学基础, 文章共分为六个小节, 真正提到RSA算法的只有最后一个小节, 我之前也看过一两篇其他介绍RSA算法的文章, 但唯有这一次让我有种豁然开朗的感觉. (一)可公度线段 文章介绍了在<几何原本>中一种求取最大公约数的方法(Euclid 算法): 假设刚开始的两个数是 a 和 b ,其中 a > b ,那么把 a 除以 b 的余数记作 c ,把 b 除以 c 的余数记作 d ,c 除以 d 余 e…

理解浮点数

说到理解浮点数, 最著名的一个问题莫过于 0.1 + 0.2 = ? 答案似乎显而易见, 运行python交互式终端, 键入算式按下回车, 结果如下 等等,这似乎并不是我们期待的答案! 要理解这个奇怪的现象,我们就必须从什么是浮点数说起 ... 浮点数的存储 以double类型的浮点数为例,数据在内存中由如下三个部分组成: 符号位S:第 1 位是正负数符号位(sign),0代表正数,1代表负数 指数位E:中间的 11 位存储指数(exponent),用来表示次方数 尾数位M:最后的 52 位是尾数(mantissa),首位的始终为1, 在存储时省略, 超出的部分自动进一舍零 如 4.5 转换成二进制就是 100.1,科学计数法表示是 1.001*2^2,舍去1后…

RocketMQ broker单点宕机导致部分Topic无法发送问题分析

背景 项目生产环境的RocketMQ采用双主双从的架构, 期望达到不丢消息且高可用的目的. 而在实际的生产场景中, 我们却遭遇了当一台broker因内存不足导致java进程终止后, 部分topic消息无法正常发送的问题. 现象和预期不相符, 针对这一问题, 我们对RocketMQ相关部分的设计原理进行了更深入的研究. 设计分析 根据以上状态图可知, Producer 第一次发送会根据 AUTO_CREATE_TOPIC_KEY(TBW102) 从 NameServer 拿到 topicRouteData 作为新创建 topic 的 topicRouteData,而 Producer 中的 MQClientInstance 每30s会从 NameServer 拉取 topic 的 topicRouteData 最新信息并更新到本地内存。 异常情况1 Producer 发送一条信息后关闭掉 Producer,这个时候只有在一个 broker 上面有 topic 信息,下一次启动 Producer 发送消息的时候就会直接从 NameServer…

夏令时的困惑

对于像我一样一直生活在中国的年轻人来说, 夏令时也许是比较一个陌生的概念. 那么, 夏令时到底是什么呢? 答: 夏令时是一种为节约能源而人为规定地方时间的制度,在这一制度实行期间所采用的统一时间称为“夏令时间”。一般在天亮较早的夏季人为将时间调快一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。 据称最早有夏时制构思的是美国著名政治家、科学家本杰明·富兰克林,他在任美国驻法国大使期间,觉得法国人晚起晚睡的生活习惯浪费了大好的阳光,建议他们早睡早起,这样每年可以节约6千4百万磅蜡烛。夏时制在英语里就是“节约阳光时间”的意思。 到1907年,英国建筑师威廉·维莱特正式向英国议会提出夏时制的构思,主要是为了节省能源和提供更多的时间用来训练士兵. 第一次世界大战期间,德国首先实行夏时制,英国因为怕德国会从中得到更大的效益,因此紧跟着也采取了夏时制,夏时制节省了约15%的煤气和电力,而法国不久也效仿实行。 1942年,第二次世界大战期间,美国又再度实行夏时制,1945年战争结束后取消。1966年,美国重新实行夏时制。欧洲大部分国家从1976年,即第四次中东战争导致首次石油危机(1973年)三年后开始实行夏时制。 1986年至1991年,中华人民共和国在全国范围实行了六年夏时制,每年从4月中旬的第一个星期日2时整(北京时间)到9月中旬第一个星期日的凌晨2时整(北京夏令时)…

小心区间锁

某日收到项目监控系统报警, 经查询业务日志后发现, 是数据库中发生一处死锁触发业务异常回滚导致的. 执行 show engine innodb status; 得到如下死锁日志(相关数据已做脱敏处理): ------------------------ LATEST DETECTED DEADLOCK ------------------------ 2018-01-01 20:09:11 7fa66d7be700 *** (1) TRANSACTION: TRANSACTION 138251491, ACTIVE 0.152 sec inserting mysql tables in use 1, locked 1 LOCK WAIT 12 lock struct(s), heap size 2936, 7 row lock(s), undo…

Codewars:一个鸡蛋引发的思考

在codewars上遇到这样一道题: Eulampy 有一筐鸡蛋, 有一天在一幢摩天大楼下, 他的朋友对他说, 如果你给我n个鸡蛋, 我保证可以告诉你, 在h层楼的范围内, 鸡蛋最多从第几次楼扔下来而不会被摔破. Eulampy说, "没问题, 但是我最多同意你扔m次, 看你扔的次数太多我会难过的.", 请设计一个函数, height(n, m), 求扔鸡蛋实验的总量程, 即 h. 需要说明的是, 我们假设每个鸡蛋的都是完全一样的, 当一个鸡蛋被扔下了而没破, 就可以再次使用. 原题地址:https://www.codewars.com/kata/faberge-easter-eggs-crush-test/train/python 重点来了, 这道题有三组测试, 分别是: 基础的(basic), 进阶的(advanced), 真格的(serious). test.it('basic tests') test.assert_…

一个奇葩的Chrome插件:Flappy Octocat

前段时间看朋友写了个 Chrome 插件觉得特别酷,可以在 github 的 contributions board 上玩康威生命游戏。 大概是像这样的: 受朋友的启发,我也写了一个 Chrome 小插件,可以让我在 contributions board 上玩 flappy bird 一样的游戏,画面大概是这样的: 不过,到底是什么样的神经病才会在 github 的 contributions board 上玩游戏呢 🌚 如果喜欢的话,可以从 https://github.com/chxj1992/flappy-octocat 获得这个插件及其源码 或者,直接从 Chrome 的 Web Store 安装这个游戏…

Codewars:从逆波兰表达式到Three-Pass编译器(2)

在这里我想说的第二道题,我把它理解成一次对逆波兰表达式的运用和延伸。关于逆波兰表达式的相关知识,可以在前一篇博客中读到 : Codewars:从逆波兰表达式到Three-Pass编译器(1) 和前一题相比,这道题的题面就要复杂多了。 我们有一种如下的语法规则的编程语言: [ a b ] a*a + b*b 这里我们定义了一个函数,这个函数有两个参数(a 和 b),函数功能是计算 a 和 b 的平方和。 现在,请为该语言实现一个简单的语法编译器。编译过程可以拆分为三个步骤: 1.将函数解析为一个抽象语法树(AST ) AST有如下规则: { 'op': '+', 'a': a, 'b': b } // add subtree a to subtree b { 'op': '-', 'a': a,…

Codewars:从逆波兰表达式到Three-Pass编译器(1)

最近沉迷于在 codewars 上做题无法自拔,其中有两道题我感觉挺有意思,觉得值得记下来,故成此文。 第一道题的题面非常简单,实现一个包含 + - * / 四则运算的计算器,输入样例:1 + 2 * 3, 期望结果 7。 原题链接见下: https://www.codewars.com/kata/calculator 从小学数学的角度来思考这道题,答案是显而易见的:乘除法的优先级要高于加减法,所以我们可以把表达式中所有乘除法先提出来计算出结果并放回原来的位置,再依次计算加减法得到整个表达式的结果。依照这样的思路,我们可以有如下的代码实现(In Python): from operator import add, sub, mul, div FIRST = {'*' : mul, '/': div} SECOND = {'+': add,…