2013年10月份某一天,从搬砖的工地回到办公室,甩掉破了几个洞的手套,解下油腻腻的安全帽,打开已有7,8年使用历史的IBM笔记本电脑,灰暗无光的眼睛瞬间变得精亮精亮的(我从屏幕反光看到),叼着娃哈哈,进入博客园看有木有干货出现,鬼使神差地进入了小虾的个人博客,看到了那篇关于DHT的文章,发现dianying.fm是他的杰作,当时把我激动得……事情回到5月份,当时我想做一个跟dianying.fm类似的网站,当时采取的是把他资源给扒下来,但是后来给放弃了,个人觉得,扒别人的资源来做资源站显得没技术含量。 所以一直就挂在心上,时不时地在琢磨他是怎么办到的。 很笨的是,居然没写信问他是如何做到的。 也不知道他的个人博客。
时隔5个月后,终于发现了这个秘密,于是就开始研究DHT,但是国内关于DHT文章少得可怜,根本就没几个人在研究(这更使我觉得要是实现了会更有成就感),加之根本就看不懂英文官方文档。 对DHT也是一知半解,当时一直以为DHT的"distance metric"指的就是实际地理距离,也一直以为如果把爬虫放到日本地区的话,会爬取到更多的AV视频。 于是只好借用别人DHT爬虫(dhtcrawler),用了一段时间,始终不满意它的通过HTTP请求种子下载方式,而且一点成就感都没有,毕竟爬虫代码不是自己写的。 貌似dhtcrawler的作者也在博客园来着,嘿嘿! 于是下定决心学英语(本人初中毕业,在学校几乎没学过英语),一定要写一个属于自己的DHT爬虫。 于是开始闭关修炼,不再上QQ闲扯蛋。
接着开始狠看Python中英对照技术文档练英语,看了差不多半个月,了解了一些技术文档常用的语法。 还把DHT官方文档不认识的单词给背了。 弃掉用了一两年的PHP这个只擅长web端编程语言,改用NodeJS,看上了它那事件编程,后来发现写的代码实在难以理解,嵌套太深,"内涵"太低,改用Perl,学了一周就上马了,一开始用着还不错,一两行代码顶NodeJS和PHP十几行代码,但就是因为太强悍了,驾驭不了它那乱七八糟的^$#@_*~%什么的符号,一眼望去,整篇代码丑陋不堪(咋一看还挺高深的样),依靠上下文环境的代码太多。 于是打算换其他的编程语言,花了几天就是找不到顺手的。 C像个巫婆,法力大,脾气怪,Java"官僚化",太繁琐,C#只支持Windows(虽然Linux有mono)。 Lisp深不可测,erlang看不懂,语法怪。 Ruby更是怪。 一时陷入世界这么大,无编程语言可用的状态,一连好几天搬砖都没精神,好几次都差点被落下的建筑物给砸到。
后来猛地想起还有个叫Python这个动态语言,于是赶紧地看手册,草草学了一周,发现用着还真顺手,好用得我只能说"爽爆了!"。 它那异常处理很自然,不像PHP那样硬生生的; 也不像Java那样太繁琐; 有点像Lisp/Haskell,虽然一点都不会,不过特别喜欢里面的某些风格,比如那lambda,list comps; 还有自己的shell,语法简单无比; 库也特别多,让我这个不爱写小工具的懒人真是个宝贝; 于是你们懂得。 我就成了Python的教徒了。 以前用PHP的那一两年,从未有这么个"宗教感"。
上述毫无挑起语言宗教战争的意思,请勿对号入座,只是激动了点!
接着开始了解Python的多线程,事件编程,各种各样的web框架,模板,挑出Flask,jinja这俩玩意儿来做web开发,文档简单例子多,推荐那些用Django的人试试Flask,不知是不是名字太过火爆,官网都要靠翻墙。 jianja模板引擎跟PHP的Symfony2的默认模板引擎Twig非常相似,干货一个,话说好知网都是用的Symfony2。 然后学习Twisted网络框架,这个玩意儿只有英语文档,写得不是很通顺,让我费了很大的劲才学懂一点点,还不错! 只是感觉事件编程没有NodeJS那么自然。 转眼就到了12月份,天气冷得在野外撒尿都掏不出JJ; 于是全部放假回家,回到家,猛骑了几天的稀泥山地车活跃身体,就开始闭关修炼专攻DHT。 因为第一次看协议类的文档,总感觉协议文档很虚无,很容易让人忘记是在看协议而不是在看手册,一点样例代码都没。 有点头大,不过放弃这么意思的协议实现不是我的风格,所以还是硬着头皮仔仔细细地看文档,好不容易懂了概念,就开始coding了,因为对DHT还不是很熟,所以代码写了推,推了写,一直都没多少效果,于是就搞了几个开源代码看,看了几个后,豁然开朗。 后来总算搞出一个可以运行的版本。 又花了几天重新整了下代码。 总算实现了DHT爬虫: https://github.com/laomayi/simDHT 简单粗暴不做作! 这个是要做类似dianying.fm的发动机。
霉运正式开始:
由于是在Linux环境下编写,有次不小心删掉了所有代码,当时感觉脑袋一黑,脸通红,头冒汗,腿打摆子,心想: 完鸟完鸟,我几个月的代码就这么完鸟,头一次体会到一国外牛说的"rm -rf *。log"就是个错误设计的内涵了(我在"*" 和"。log"之间不小心空了一格)。 缓了一会,蛋定地睡觉去了,之所以这么蛋定,是因为稍后想到写了无数次,代码构造都差不多能背下来了,不急,再加上编辑器还缓存着几个文件代码,复制粘贴来,最主要的是代码又很精简。 第二天骑着我那巨无霸山地车到了亲戚家聚会,花了一两个小时给写了回来。 顺便向一用Java,站在我旁边看我coding的美女炫耀了一番我程序,把她惊奇得一个劲儿地问我一台电脑怎么可能认识几百万,几千万的电脑? 怎么可能把他们电脑的共享资源给收集下来? 怎么可能你服务器就只记录这么点信息? 怎么可能服务器还不用承受资源下载负担? 还问我的什么语言,代码看起来一点不像代码? 我都一一自豪又耐心地回答。 我也看了她那Java写的代码,写得很搞笑,都是些Dog/Cat/Master/Food Class什么的,好吧,她是个大学生,那些都是跟着他们老师写的。 也顺便给她说了句,设计模式要稳打稳扎地学,学得随手拈来才接下一个,免得像邯郸学步,都忘了如何走路,趴着回来,多看看开源代码,少看点烂书。 话说,在聚会时,人人都在玩游戏,而你戴着一副防光镜编程,是一件多么拉风的事情。 当然也有人明着暗着说编程有个毛线用,我一笑了之。 借用Zed A。 Shaw说的: 当有人说你编程像个怪物,不随大众,与众不同,甚至因戳穿了他们的逻辑漏洞而他们开始和你争辩,不用鸟他们,他们只是嫉妒你掌握了他们做梦都不能得到的技能而已,要记住这是你的旅程,不是他们的。 后来吸取经验,整了个bitbucket来做备份,私有代码免费滴。
实现了DHT还不够,得想办法弄到种子文件,只有这样才能做一个资源下载站,看了很多开源DHT爬虫程序,要么没实现,要么就是通过HTTP向别的种子站下载,这方式对我来说,有种危机感,万一那种子站关闭了咋办? 而且没成就感有木有? 所以还是要自己实现协议整一个BT客户端,看了好几天协议文档,还是搞不懂怎么实现,借鉴的也只有libtorrent,但是太庞大,C/C++语言又不是很熟悉,所以暂时把它当库在Python里调用,好歹也是靠自己去DHT网络下载的,比那些使用HTTP下别人的种子强多了。 等休息一段时间再来研究,连续4,5个月没怎么好好休息了。
后来,一件件让我发疯的事情出现,我买的3G无线网卡居然停机了,没法测试种子下载部分代码。 于是只好带着笔记本到我们这乡村唯一的网吧去上网,使用小米的网络共享,开启热点。 霉运未就此打住,连上USB不能直接使用网络共享,得安装小米助手,但是小米助手里有驱动,很多网吧可是禁止安装驱动,一安立马重启,重启后可啥都没了,后来鼓捣鼓捣,把那小米安装文件设置成windows 2000兼容模式,搞定,只是不稳定,易崩溃。 霉运又接着开始,根本就没法进行ICMP和UDP(网吧电脑可以),始终不了解原因。 后来把之前用来测试DHT那部分的阿里云主机搞来,在那上面测试,由于不支持Gentoo(谐音"贱兔"),那些Ubuntu,CentOS,Debian真的很难用有木有,使用包管理自定义个软件安装参数都不支持(就是像源代码安装configure自定义参数那样,可以开启什么关闭什么的),软件源又老,虽然Debian/Ubuntu可以ppa什么的,使用源代码安装又有那么多的依赖要整。 花了好长时间都没搞定,弃用之。
真疑惑国外那么流行的Gentoo为什么在国内得不到重视? 是不是Gentoo太低调了? 还是Gentoo咋一看很难用? 在国内也仅知道晋江文学城,豆瓣,知乎在用Gentoo。 后两者还用的是Python做web端开发。 于是乎又到budgetvm开了个VPS,支持Gentoo,这个更让我发疯,始终无法启动,问他们神马原因,居然说Gentoo template出了问题,在修复。 建议我用Ubuntu/CentOS/Debian神马的,我要是爱用这俩,我还到你那干吗? 由于仅会阅读英语,不擅长写,没法用长一点的英语"批评"他们。 于是回复等待他们修。 第一通宵就继续研究我电脑为嘛无法UDP/ICMP(这可不是神马防火墙,杀毒软件的问题,我是裸奔的,知道的大神指教下,只有在借助于小米手机电脑网络共享才会这样,连接真正的无线路由器可不会这样)
第三天晚,还是没收到budgetvm给我的Gentoo template修好就给我Email的信息,我当时就在想,国外的客服说不定也像国内一样,敷衍了事。 于是又冒雨翻山越岭去了网吧,打开budgetvm,能启动Gentoo了,真不敬业,说好要通知的。 可是。。。可是为嘛不能SSH? 连网吧电脑ping都不能ping? 提交ticket询问之,没给我解决,一气之下,又弃之! 我算是死心了,只好到城里再说了。 短时间可找不到价格便宜,支持Gentoo,支付宝的VPS。 于是坐在网吧那下几个电影放松放松。 感谢我一兄弟,陪我熬了俩通宵,受不了通宵,一直躺在我大腿上睡觉,幸好带了被子,这里很冷的有木有? 更丢脸的是,因钱包忘在老家,网费都是他付的。 话说我教他前端编程,不过他人太帅,人缘好,事多,无法专心,没学会。
在工地的最后两个月是我人生最邋遢的日子,白天搬砖,晚上coding。 为省时间,两个月不洗澡,不洗头,洗脚都是凉水冲冲,脏衣服积累了几十斤,在工地休息时也处于神游状态。 话说工地上那些人要不是看过我在黑洞洞屏幕前编写代码的那"神秘感",都以为我脑子不正常来着,怪不得工地上的一痴呆小工都喜欢和我说话。
写这个程序给我带来几个好处:
0,编程技能上升一个等级,都不敢直视以前那些乱用各种各样的设计模式混在一堆四不像PHP代码;
1,英语被逼到能看懂技术文档,爽歪了我,更加热爱英语了;
2,成了Python教徒,话说无"宗教感"的程序员不是好程序员,哈哈,这当然不是说程序员要被编程语言所禁锢,要根据不同的项目选用合适的语言;
最后,我想说一句: 你会编程,他们不会,这真tmd的酷!