对去中心化网络的信仰

《美剧》硅谷中提到了一种去中心化的网络:人们不再是从网络的中心的服务器上获得资源,网络的资源存在于每个人的设备上。

我比较认同这种互联网,人才是互联网的真正用户,而不是服务器。互联网连接的应该是人与人,而不是人与服务器。

目前的中心化网络存在很多问题。比如审查,在现在的中国基本上不可能在国内的网络上讨论任何政治问题,在知乎、微博等国内社交媒体上存在大量“被删除的内容”,这已经让互联网失去和很大一部分意义。互联网为了分享知识和沟通而诞生,一个理想的互联网应该是可以自由发布任何内容、并且任何资源都不会被删除的。但是目前的互联网却走了一条错误的道路,集中化的网络让政府或者网站所有人对删除资源有了可能。但是设想一下,如果我们的网络是分布式的呢?如果网络存在于任何一个人的机器上,这样任何东西都不会被删除,一份资源可能有无数个冗余备份。Git和Bt就是一个成功的例子,github上有被勒令删除的仓库,但是因为git是分布式的,如果一个仓库足够流行,那么就会有无数份fork,官方仓库可以删除,项目却会永远存在。另外,去中心化的网络有着与生俱来的匿名性,资源从一台计算机到另一台计算机,发布者隐藏自己的身份轻而易举,如果不能保证匿名,如果保证言论自由呢?

安全问题。首先是文件的安全。一切存储介质都是有寿命的,目前可以想像到的最安全的存储方式就是放到云上。个人存储无论有多少冗余备份都觉得不安全,比如说家里着火,就可能把所有的磁盘损坏了。但是如果把文件通过BT的方式加密存储在别人的设备上(或者将适合共享的资源共享出去),可以免费使用很多备份,如果要使这份资源消失,基本上是不可能的(可能有一些隐患,但是这不正是互联网的构想吗?)。对于网站运营者来说,集中式的(比如说一台网站服务器)总有可能沦陷,通过各种各样的漏洞拿到服务器权限,那么攻击者基本上是占有了所有的内容。但是分布式提供了完全不同的另一种的认证机制。除此之外,还有DDoS的问题。DDoS目前基本上是不可解的,无论你有怎么样的策略,机房上层网络发现有巨大流量攻击的时候会采取最笨、也是最暴力的方式应对:将发送给你的网络包直接丢掉,让你的网站下线一段时间,等攻击结束,再恢复响应。如果你的业务足够大,可能还有和机房或运营商谈判的筹码,但是对于中小业务,人家根本不理你,直接给你切断。但是分布式的网络不会存在DDoS,况且如果网络涉及的优秀,你可以去离你最近的节点获取资源,相当于一个无形的超级CDN了(个人设想)。

节省资源。云存储是很昂贵的,带宽也很贵。集中化的网络避免不了要将所有的流量发往一处,将资源存放在一处,比如Google目前维护DC(数据中心)的一年费用大约是120亿,虽然有文章说,个人存储的成本更高,但是不要忘了,分布式的存储是利用的空闲空间!相比于集中式,去中心必然需要更多的冗余,但是却可以利用个人的空闲空间,个人与个人之见的空闲带宽。我认为成本肯定比集中的数据中心低。

目前,很多去中心化项目已经证实了分布式的成功:比特币证明了去掉中心服务器核准交易是可行的,Git证明了分布式的版本控制是可靠、成本低的,BT虽然在很多国家被禁止,但是目前依然有相当多的用户在使用,并且速度也尚可。

我也承认,去中心化的网络会带来一系列的社会问题,例如地下交易。技术是有两面性的,同时也是无罪的,但是不能因为社会问题而阻止技术的发展,当然这也是不现实的。

我相信将来,随着个人存储成本继续降低(摩尔定律),网络带宽越来越大(4G,5G),以及压缩技术、分布式技术的发展,总有一天,我们会看到一个理想的、完美的、真正的互联网。

 

路由器折腾记(1):刷小米青春版路由器

周五上班的时候听同事说,小米青春版的路由器也可以刷openwrt的固件,就忍不住想试一下。

小米青春版非常小巧,整个外表只有一个灯,很漂亮,也比较稳定,大约去年这个时候买的吧,服役一年了,我比较喜欢这个路由器。

在网上查了一下,之前了解到的小米青春版不能刷是因为官方并没有开放ssh,即使你绑定了路由器,在官方的获得ssh root密码页面依然是空白的。但是通过查了一些资料,发现小米路由器存在一个漏洞,可以让你在本地直接修改root密码,拿到权限。具体的步骤如下:

修改ssh密码

登录小米路由器后台,输入管理密码,这个时候网址如下:

http://192.168.31.1/cgi-bin/luci/;stok=<你的stok>/web/home#router

看来这个stok就是登录之后认证权限的。然后把地址替换成下面的。

http://192.168.31.1/cgi-bin/luci/;stok=《你的stok》/api/xqsystem/set_name_password?oldPwd=《你当前的后台管理密码》&newPwd=《新密码》

然后会返回{"code": 0},如果正常的话。看来小米路由器的后台认证只是简单的判断是否登录,只要登录就可以修改root密码啦。

网上的人是这么说的,但是我实际操作的时候,总是遇到下面这个返回结果:{"msg":"参数错误","code":1523},在试了好几次之后都是这样,我开始怀疑,是不是小米后来把这个漏洞补上了。于是打算重新刷一个旧版的官方固件:miwifi_r1cl_all_59371_2.1.26.bin。

果然,刷完这个之后返回了期待已久的code0.

(有点奇怪,既然小米路由器存在ssh这个功能,那官方为什么要把密码藏的这么深呢直接告诉用户不就得了,这又不是ps4破解之后后果不堪设想)

登录了小米的ssh,我发现这是个Linux啊,简直是学好Linux,走遍天下都不怕。(XiaoQiang什么鬼)

刷入潘多拉固件

对于Linux用户来说接下来的操作就很简单了,从网上下载了PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin,然后将文件scp到/tmp里面,执行mtd -r write /tmp/PandoraBox-ralink-mt7620-xiaomi-mini-squashfs-sysupgrade-r1024-20150608.bin开始刷入操作。

至此,我的小米青春版就正式退役了……

因为……

我下载错了固件,上面这个固件是小米3的,并不是青春版的固件……

再见……我的青春……

然后我在淘宝下单了极路由1S,期待下周可以到货,没想到今天就到了,于是开始拿这个刷Openwrt。

使用极路由1s刷Openwrt

首先,打开路由器的后台管理界面。准备开启ssh。

好吧朋友们我们15天后第二期见……

 

Python正则表达式解惑

其实我已经使用Python的正则表达式很久了,今天看了Pycon2017的一个speech[2],又加深了理解。这是一个很简单的Speech,概括了Python正则表达式的用法以及一些Best Practice。

其实正则表达式常用的就那几种,熟悉了就很强大了:

  1. [ ] 表示都可以匹配,比如[abc]匹配a或b或c
  2. {1,3}表示重复1-3次
  3. [^abc]表示非abc
  4. 一些常用的匹配比如.*?表示非贪婪地匹配任何东西

现在已经有很多正则表达式教程了(包括基本上任何Python入门教程都会涉及正则表达式),这里就不多说。我对Python的正则有几个疑惑,在这个视频里面找到了答案。

一、永远使用r前缀。

python的r前缀表示原字符串(raw_string),就是字面意思的字符串,\并不表示转移。比如说r’\n’表示的是一个反斜杠,一个字母n。如果不加r即’\n’,那么\就表示转移,\和n一起表示一个换行符。可以理解为r'\n' == '\\n'

二、正则表达式中需要转义的字符。

三、Python正则表达式groups和group的区别。

详细解释在我的这个gist:https://gist.github.com/laixintao/1a550e98726ddbada0268f6b6a6490cf

group – 是获得所有的匹配,第0个是整个匹配的字符串,后面的是子匹配

groups – 是获得所有的子匹配,接受一个参数作为default。类似dict的get用法。

参考资料:

  1. PyCon Slides: https://drive.google.com/file/d/0BxJ4y96AC8m3NEpreVZLcDl0Nlk/view
  2. PyCon youtube: https://www.youtube.com/watch?v=abrcJ9MpF60&t=205s
 

git-ext:在命令行提交PullRequests的小工具

我们主要用的仓库托管是 bitbucket,感觉不是很好用。每次推分支之后要打浏览器开 pr 很烦,而且要一个一个一个点 reviewers。就写了一个命令行工具,可以不用开浏览器搞这些东西了。其实主要是用的 REST 的 api 做了个客户端,授权是 HTTPBASIC,所以要将密码写到~/.git_ext.yml 。

安装:

主要特性:

  • 在命令行提交 pr,使用 git config 的 core.editor 来编辑 pr 信息,第一行是 title,其余是 description
  • pr 的模板会显示 source 分支和目标分支的 diff 和 stat
  • 如果 pr 提交失败(比如服务器并没有 source branch )会备份本次写的 pr 信息,下次 create 的时候,如果有存在上次失败的 commit message,会自动使用上次写的(不用重写一遍啦)
  • 支持 reviewers group,比如你设定了一个组 dev,里面有 10 个人,那么在命令行填写 reviewers 的时候只要写 @dev,reviewers 就会变成这 10 个人。
  • 支持查看服务器的 pr 列表
  • 支持查看 pr 的动态

放两张预览图:

TODO

  • 由于我提 pr 基本都是在 bitbucket,所以现在只写了 bitbucket,下面做 github 的吧(再下来是 gitlab,如果这东西有人用的话)。
  • snippets 和 gist 支持

源代码

https://github.com/laixintao/git-ext

话说,能工作和作为开源工具发布真是不一样啊,刚开始写的时候,基本上一个晚上就写好了,但是后来想加一下travis和codecov,折腾了好久。然后总觉得设计不好,想用面向对象,github bitbucket gitlab都从base的PullRequest继承,又重构了下,等于重写了一次,竟然有一百多次commits了。不过不写不知道,打包发布,ci,也有不少坑呢。

 

Vim:移动窗口和tab

Vim相比于IDE一个高效的地方就是可以快速移动和切换窗口,完全不必借助于鼠标。

开启多窗口非常简单:

  • 在NerdTree中使用s键或i键在当前的窗口中以横/竖分屏的方式打开目标文件
  • 在NerdTree中使用t/T在新的tab打开目标文件(区别在于是否focus到新的tab)
  • 在buffer中使用:split命令对当前buffer分屏
  • 使用:tabnew打开一个新的tab

在多个分屏中移动也很简单:

  • <CTRL+W>hjkl,光标在不同的分屏中移动
  • <CTRL+W>HJKL,将光标所在的分屏移动到最左/下/上/右
  • gt到下一个tab
  • gT到上一个tab

但是有时候有这样的需求:我在一个分屏的窗口编辑文件,想要将当前的这个分屏全屏化,也就是说,将目前的一个分屏作为一个新的tab。也很简单:<CTRL+W>T 将当前buffer作为一个新的tab打开。

又有时候有这样的需求:在一个tab中编辑文件,但是想要参考上一个tab中已经打开的一个窗口的内容,这时候想要将当前的tab变成上一个tab的一个分屏。其实这是很常用的需求,但是这比较难办了,搜了一圈没有发现这样的Vim内置功能。但是找到了一个同样作用的VimScript。

于是可以在.vimrc中加入这些代码,其实就是两个函数:

这两个函数可以做到,将tab变成上一个tab的一个分屏,或者将tab变成下一个tab的一个分屏。模仿之前有关tab的快捷键,我加了下面这两个映射:

这样使用mt可以快速移动tab了,亲测有效。至此好像在vim中没有什么移动是做不到了,可以穿梭自如了。

参考资料:

  1. Move current window between tabs