【开源项目暑期实习】谷歌编程之夏 Honeynet Project

谷歌编程之夏Google Summer of Code是由谷歌赞助的针对开源社区的暑期活动。学生可以通过这个项目参与开源软件的开发,并且得到5000美金的报酬。对于学生来说是个很好的经历。

 

参加者条件:

必须是大学本科或者研究生在读(不包括五月即将毕业的,或者九月入学的同学)。对开源事业有浓厚的兴趣。

 

更多信息请见:

https://developers.google.com/open-source/soc/

 

Honeynet Project 是一个活跃的网络安全的开源社区。今年Honeynet Project也继续参加谷歌编程之夏。有兴趣的同学可以访问下面的网站,选择一个感兴趣的idea,然后和对应project的mentor联系,或在honeynet maillist中询问

 

http://www.honeynet.org/gsoc/ideas

如果有同学对于network malware simulation感兴趣的,可以与我联系。我的email是hbhzwj@gmail.com

 

更多信息请见

 

http://www.honeynet.org/gsoc/ideas#project8

 

http://people.bu.edu/wangjing/open-source/imalse/html/

 

http://people.bu.edu/wangjing/open-source/sadit/html/

中国的旋律

回家的旅途是辛苦但是富有收获的,在路上读了两本书《激荡三十年》和《邓小平传》。在这里结合以前读的《沸腾十五年》一起写一个随想。

林军的《沸腾十五年》和吴晓波的《激荡三十年》是两本关于中国产业变革的好书。前者讲的是中国互联网的发展,而后者则宏观的讲述了中国自从改革开放以来的一部经济改革史和企业史。在我初读《沸腾》的时候并没有太多的震撼,但是当读完《激荡》一书之后,我对于《沸腾》一书中的许多史实有了全新的认识。同样的,在读完《邓小平传》一书后,我对《激荡》一书也有了更多的感悟。

单一产业的发展从来是离不开整个国家的经济形势和政策,尤其是在中国这一个动荡转型的国家。理解了中国发生了什么,我们才能更好的理解经济和互联网领域所发生的这一切。

计划经济的弊病已经是无需证明的事实。中国三十年的改革开放,就是国家统死到放权给市场的过程。邓小平和朱镕基两个人在其中扮演了决定性的作用,可以说,中国的改革是由邓小平一力促成,而由朱镕基具体施行的。

1978年三中全会到1992邓小平南巡是改革的上半场,由邓小平主导。92年至今是下半场,实际的改革路线在92年到2002年的十年间由朱镕基确立。

在中国这样传统而又古老的社会,改变人们的观念从来不是一个容易的事情。中国花了14年的时间才最终下定了决心市场改革,而在1970年代末的中国,只有少数人对改革的必要性有清醒的认识。所幸的是,邓小平是其中一位。

和毛泽东不同的是,邓小平少年留法的经历使得他具有国际化的视野,他非常的清楚中国的落后和西方先进技术的重要性,并且邓小平具有更加灵活的思维。在改革的早期,邓小平着力破除毛时代留下的对于阶级斗争的观念,向全社会灌输尊重科学规律的观念。中国从此进入了一个不信马列,而信科学的时代,高考恢复,文化事业百废待兴。这为后来的一系列改革铺好了路。

正如清朝末期的改革一样,邓小平的改革开始也是仅仅限定于引进国外的先进技术,并不涉及市场经济体制。由于旧体制运行的惯性,国家妄图通过一次性引进120个大项目来迅速推进国民经济,但是实际收效甚微。国营工厂在这个时候已经积重难返,仅仅通过引进技术已经不能挽救这些共和国的长子们,国企的救赎最终在十几年后由朱镕基完成。

所幸的是另一种来自民间的力量在无意之中接过了改革的接力棒。在官方的宣传里邓小平是改革开放的总设计师,似乎是邓小平绝顶聪明,设计好了改革开放的每个步骤,其他人只是按照他的想法执行。这只不过是中国传统的脸谱式的描述方式。实际上改革开放的许多构想并非邓小平所提出,1980年代初的邓小平也没有对于中国该向何处去的清晰构想。他的伟大之处,在于给予民众试错的自由,随时准备接受每一个可行的方案。

伟人通常都是冷静而沉稳的,随时观察周围的世界,不因狂热否定任何一种可能。邓小平就是这样一位,他的做事风格使得他治下的中国人能够有更多自由,小岗村的包干到户,温州小商户的崛起,这些都是源自民间的尝试。而这些尝试,逐渐的使邓小平认识到,市场经济能够解放生产力,使得中国人过上计划经济时代不能想象的富裕生活。那么,为什么不呢?

可惜的是,这样的认识并不能一下子被整个执政阶层接受,于是出现了温州“八大王”事件,傻子瓜子事件。整个八十年代,像这样对于民营经济的迫害仍不少见。但是历史的车轮滚滚前进,民营经济最终成为改革开放的中流砥柱。过去三十年在中国发生的一切再一次论证了:一旦被给予自由,民众对于幸福生活的欲望将化作一个势不可挡的力量。

1989的运动使得改革的道路出现了曲折,左派重新开始抬头。在这个时候,邓小平以南巡的方式终结了全国对于改革的争议。南巡看到的成就使得邓小平下定了决心,他明确的表达出了对于市场改革的完全支持,对于极左派思想的反感。中国这艘航船开始向着市场经济这个方向大步前进,再无回头的可能。

和邓小平不同,学者出身的朱镕基更多的依据他的学术经验来进行中国的经济的改革。他治下的影响最深远的两个举措就是放宽汇率和国企改制。前者导致人民币大幅贬值,使得中国具有了强大的出口竞争力,中国成为世界工厂正是得益于这个措施。后者以一种非常痛苦的方式解决了国企积留的问题,抓大放小,国营经济仅仅控制能源矿产通信等国民经济命脉,其他的都放手给私营经济,现在中国的经济还是没有离开当时朱镕基设定的框架。最终国企得以重焕光芒,但是这也导致了相当长的一段阵痛期,遗留了一些社会问题。

在这样的背景下,中国互联网的许多事情就容易理解呢。中国错过了1970年代末到1980年代的PC产业革命,因为那个时候的中国虽然已经开始改革,但是整个社会并没有完全做好准备,市场环境刚刚处于萌芽状态,不可能去承载这样一个巨大的产业革命。

但是到了互联网兴起的1990年代中期,情况就完全不同呢。市场经济的总方向已经完全确定,创业不在会有八十年代那样的政治风险。加上78年高考以来储备的大量人才,中国第一次有了跟世界先进国家大约在同一起跑线上竞争的权利。

如果说中国和美国相比有什么优势的话,唯一的优势就是中国拥有大量精通美国社会的留学生,而美国人对于中国知之甚少。相对完善的市场环境,使得海归成为可能。于是田溯宁,丁健,张朝阳纷纷回国。这在1980年代是不可想象的。

资本的原始积累少有光彩的,尤其是在中国这样动荡转型的国度。中国的民营企业的资本积累通常有几种。第一种是来自于国有资产,这成为了这些企业家的原罪,许多企业家都因此落马,如伊利的郑浚怀,红塔的zhu时健。第二种是来自于变相非法集资和股票市场圈钱,早期市场监管的缺失时代使得许多人钻了空子捞到了第一桶金,他们中的一部分人最终将自己洗白,但是更多的人沉溺这种资本游戏中不能自拔,最终自食其果,比如牟其中。最晚出现的,也是罪阳光的一种资本积累的方式便是风险投资。风险投资是随着一批批海龟回潮而带入中国,最早在中国引入风险投资的人是张朝阳,他在1995年年携20万美金的风险投资回到国内创业,这时候距离改革开放开始已经有18年的时间。随着搜狐,百度,携程等一批批企业的成功,风险投资在中国逐渐的发展壮大。可以断定,由于社会转型的逐渐结束和金融监管的逐渐完善,风险投资最终必将成为最主要的资本积累方式。

最近三十年发生在中国的一切可以说是一种奇迹,在一个历史如此悠久,经济如此落后,社会如此复杂的国度进行改革,其难度可想而知,而改革一旦成功,其迸发出来的活力又是如此的令人吃惊。

常有人恨生不逢时,觉得现在已经没有机会了,我看并非如此。中国经济改革的舞台还远未到落幕的时刻,事实上,舞台的帷幕都尚未被完全掀开。中国,中国经济甚至中国互联网都远未成型。邓小平曾说:中国的改革是摸着石头过河。过去三十年虽然成绩斐然,但是我们的高速发展仅仅是在补以前落下的功课,而当我们真正迈入深水区,中国真正开始获得制度性的创新力的时候,更多的机会将会来临。

 

Chinese Translation of Complexity is the enemy

I just came across a good article about software design written by a Google engineer. I have found a Chinese translation, but some parts, particularly the last paragraph, are not satisfactory enough. So I simply put up my own.

复杂是敌人
作者 Evan Martin
原文地址:http://neugierig.org/software/blog/2011/04/complexity.html

我来到谷歌都快要满七个年头呢。我在这里学会了许多,远比我能写下来的要多得多。我想我至少可以和你们分享一些经验。

复杂是软件的死敌。它非常难于定量描述,而且日积月累。它像一个逐渐变烂的脓包,通常发现它时为时以晚。另一方面,通常增加复杂度的好处显而易见:新的间接曾允许新的特性,另一个例子是,把运行在一个机器上的程序拆分成为两个,在两个机器上面分别运行来解决扩展的问题,但是你必须实现一个RPC层来管理这两个机器。

不论新手老手,上面这些好处都是显而易见的。通过这几年的工作,我认为我已经可以很好的平衡什么时候该加入新的复杂度,而什么时候不该。我经常回想我的一个朋友对Ken Tompson的Go编译器的评价:它很快,因为它做得很少,也正因此它的代码简洁明了。

写一篇长博客很容易,但是言简意赅的表达相同的观点就很难。同样,写简洁明了的代码也很难。最明显的例子就是程序语言设计;新手设计的语言总是有很多特性,但是缺乏c语言那样的清晰性。在现在的程序开发中有一种不好的风气,程序的优劣在于它用了多少对象,而在分布式系统中,在于有多少可以活动的部件。

另一个对于这个问题的描述是“过分聪明”。引用一位c大牛的话说: 调试比写代码难一倍,因此,如果你的代码写的太聪明,调试的时候你就得抓狂呢。

怎么才可以解决这个问题呢,我怀疑是不是只有通过痛苦的经验来解决---等你调完其他人用“元编程”写的程序你就明白呢。不过我发现如果加入一些设计目标用于评估新的代码,这个问题可以得到有效的缓解。因为这样你就可以更容易的判断新代码能否帮助解决开始的问题,从而决定是否应该拒绝。在谷歌内部的设计文档模板开头都有一个None Goals 列表:你需要合理拒绝的项目扩展。

具有讽刺意味的是,我发现使用较原始的工具能够有效的降低复杂读。你不太可能写一个很复杂的c语言程序,因为c语言所能做的不多。c语言倾向于使用数组这种原始的结构,因为数组确实很棒,紧凑的存储,O(1)的存取复杂度,很好的数据局部性。我这样说并不是倡导使用原始的工具。事实上,我的经验是:写python的时候最好将它当做c语言对待。

Reference

This is the translation I noted in the beginning of the article, thanks the translator, too.

http://photo.weibo.com/1915548291/wbphotos/large/photo_id/3520526301358418?refer=weibofeed

Work Efficiently In the Information Age

Python Program Configuration

Python Code Optimization

Code optimization is very important, especially for dynamic language like python. Recently I finished a python program of Approximate Dynamic Programming. One part of the program was to use dijkstra algorithm to calculate the shortest path distance in the network. Since the network is really large(about 1 million node), the first version of code was really slow which took about 2000 seconds each run. After code optimization(it took me about 6 hours), each run just takes 0.2 second. This is incredible improvement.

I used the  the following tools during the process, which I highly recommend:

  1. python cprofile module  –> this is a builtin profile module
  2. runsnakerun –> this is a viewer of the cProfile output
  3. line_profiler –> this is line by line profiler


The usage of runsnakerun is quite easy, just use the following two commands
$ python -m cProfile -o <outputfilename> <script-name> <options>
$ runsnake <outputfilename>

line_profil\ is a line by line python profiler and its webpage is:
http://packages.python.org/line_profiler/

add profile decorator to the function you want to optimize
$kernprof.py [-l/--line-by-line] script_to_profile.py

$ python -m line_profiler script_to_profile.py.lprof

 

Here are some tips to improve python performance:

1. in operator is really slow when the list is large. You may often use

if a in S:

           somehting

else:

          other thing

When S is very large, thousands, for instance, in operator will become a bottleneck.

 

A good way to optimize this is have list with binary value to indicate whether a element is in the set or not. Then the code will be:

if I[s]:

        do something

else:

        do some other thing

Of course, it will use more memory.

2.   Call the library function as much as possbile.

Most of the library functions are highly optimized, or implemented in C++.  So if you can call library functions, don’t implement it by you self in python. The for loop in python is slow. You can use scipy vectors to accelerate the program. You should try your best to reduce the for loop in python.

3  Don’t check each time for rare case.
you may have list with 100 elemnent, you will receive a index may or may not within range(0, 100). If it is in the range return the corresponding value, otherwise return -1. but 99.99% of the time the index is in the range.  The bad is:
if idx < 1000:
B = A[idx]
else:
B = -1
A better approach is:
try:
B = A[idx]
except IndexError:
B = 1
Be careful that don’t use broad Exception, use specific type of Exception.

 

杂论

最近眼睛一直不太舒服,应该是暑假对电脑时间太长了,平时Research一直要对着电脑,暑假做Google Summer of Code,要编程的时间就更多了。我从小都有弱视眼,长时间的面对电脑屏幕使我的眼睛不堪重负,被迫尽量多的远离电脑屏幕,工作虽然受到影响,但也多了一些思考的时间。

以前,我应该算是一个唯心主义者,觉得只要是下定决心做的事情就一定可以完成。但是随着年纪的增长,我越来越意识到任何食物都是有极限的,人也不例外。做什么事情都要顺应人的自然规律,硬来是没有好结果的。

中国有句谚语叫做“人贵有自知之明”。自知之明就是知道自己的极限,知道一件事情自己是能够做还是不能够做,如果实在是超出自己的能力范围或者外部条件不允许的,就不要犯傻劲。

当然,在更多的情况下,这句话充当了失败者的借口和挡箭牌。对于在自己能力范围之内的事情,就要义无反顾的去做。最忌讳的事情就是没有充分的调研和分析就轻易的放弃,这实际上就是“懒”筋在作祟。

最近在阅读哲学入门读物《苏菲的世界》。小的时候,我就看过同名电影,当时就觉得非常的震撼。前些日子听静雅思听的时候又听到了苏菲的世界的连载,勾起了我的兴趣,于是在Amazon上面买了Kindle的电子书。

我们中国人有一种特殊的自负情绪,大约就是虽然我们现在是第三世界,但是在古代我们是独步世界的。这在一定程度上也是事实。但是今日中国的落后的根源,是早在我们文明灿烂的古代就埋下了的。

中国自从董仲舒罢黜百家独尊儒术之后,实际上就没有了真正的哲学。儒家之思想,本质是“入世”的。所以儒家研究的修身齐家治国平天下归根结底,都只是御人之术。而欧洲一直都没有放弃哲学的本质,那就是思考“世界是什么,人是什么,人存在的意义与世界的关系”。顺着这一哲学的脉络,欧洲诞生了“民主的政治观念”和“科学的研究精神”。中国之所以没有德先生和赛先生,就在于中国没有如此这般“出世”的哲学。

古代希腊哲学三大家苏格拉底,柏拉图和亚里士多德系统的阐述了人与世界的关系。苏格拉底因为没有留下成文著作,思想主要是由柏拉图阐述。柏拉图人为,世界分为自然世界和超自然世界。超自然世界并不是我们通常所说的“神魔鬼怪”构成的世界,二十由万物的理想模型构成的世界。我们常常说一个东西是圆的,但是谁又见过真正的圆?可能你要说我们在数学课本的插图上面见过圆,但是那些插图实际上并不是圆,它们只是看起来像圆的图案而已。你用足够精确的尺子去量,它必定有一些地方宽一些,另一些地方窄一些。数学定义里面的圆是半径处处相等的图案。显然这样的图案不存在与我们的自然世界中,真实世界中的所有物体都是有缺陷的。圆作为所有圆形物体的理型,只存在于理想世界中,也就是柏拉图所说的超自然世界中。

柏拉图人为理型是独立并且先于真实世界的,也就是说我们这个世界中的所有物体,包括人自己,都是用理想世界中的理型制造出来的,就像姜饼人是用相应的模子制造出来的一样。

亚里士多德却不这样认为,亚里士多德认为只有一个世界,那就是我们所处于的真实世界。所以理想模型只是人在接触了许多类似事物之后抽象出来的,并没有独立于实体的理想模型。

古希腊的思想哲学深刻地影响了欧洲几千年,柏拉图依据他的哲学思想构建除了社会的理型,也就是他的理想国。后世的哲学家的哲学家在他的基础上总结出了自然法。自然法就是我们现在所说的人权和普适价值。为什么这些价值普适,因为它们适用于社会的理型。而亚里士多德注重于观察和实践的哲学思想催生了科学。科学就是自然哲学。这就是为什么所有的理工科的博士仍然被称为哲学博士。科学之用意就是要通过对自然之观察和人类与生俱来之理性总结出自然的规律。

2012年7月27日

Follow

Get every new post delivered to your Inbox.