Thursday, May 31, 2012

Linux 下压缩文件并加密

1. 利用 zip 加密只需要加 -e 参数即可。
$ zip -e test.zip test.txt
解压直接用 unzip。

2. 利用 rar 加密压缩。
$ rar a -p test.rar test.txt
递归压缩加入参数 -r。

3. 分卷压缩。
$ rar a -p123 -v1024k test.rar test.txt
每卷大小1M。密码123。

更多用法看这里
Read more ...

Wednesday, May 23, 2012

Quotes about programming languages

This post is from here.
Chinese version.



What computer scientists, authors and programmers think of popular programming languages.
All languages
Tony Hoare quote about programming languages
"There are two ways of constructing a software design. One way is to make it so simple that there are obviously no deficiencies. And the other way is to make it so complicated that there are no obvious deficiencies."
Tony (C.A.R.) Hoare.
Computing professor, implemented Algol 60, searcher at Microsoft Research.

Algol 60 (Then taken in C)
"I couldn't resist the temptation to put in a null reference, simply because it was so easy to implement. This has led to innumerable errors, vulnerabilities, and system crashes, which have probably caused a billion dollars of pain and damage in the last forty years."
Tony (C.A.R.) Hoare.
Basic
"It is practically impossible to teach good programming style to students that [sic] have had prior exposure to BASIC; as potential programmers they are mentally mutilated beyond hope of regeneration."
E. W. Dijkstra in "The Threats to Computing Science" .
Edsger Wybe Dijkstra contributed to the first Algol 60 compiler. Known for the Disjkstra algorithm and numerous contributions to computer science.
C
"A C program is like a fast dance on a newly waxed dance floor by people carrying razors."
Waldi Ravens. Programmer.
"In My Egotistical Opinion, most people's C programs should be indented six feet downward and covered with dirt."
Blair P. Houghton. Programmer.
"Going from programming in Pascal to programming in C, is like learning to write in Morse code."
J.P. Candusso. Programmer.
"One of the main causes of the fall of the Roman Empire was that, lacking zero, they had no way to indicate successful termination of their C programs."
Robert Firth. Author of programming books.
"Writing in C or C++ is like running a chain saw with all the safety guards removed."
Bob Gray. Author.
"It's 5.50 a.m.... Do you know where your stack pointer is?"
Anonymous.
C++
"C makes it easy to shoot yourself in the foot. In C++ it's harder, but when you do, you blow off your whole leg."
Bjarne Stroustrup. Creator of C++.
"The evolution of languages: FORTRAN is a non-typed language. C is a weakly typed language. Ada is a strongly typed language. C++ is a strongly hyped language."
Ron Sercely. Programmer.
"I invented the term 'Object-Oriented', and I can tell you I did not have C++ in mind."
Alan Kay. Creator of Smalltalk.
"The latest new features in C++ are designed to fix the previously new features in C++."
David Jameson. Author.
"Fifty years of programming language research, and we end up with C++ ?"
Richard A. O'Keefe. Computer scientist.
"Ever spend a little time reading comp.lang.c++ ? That's really the best place to learn about the number of C++ users looking for a better language."
R. William Beckwith.
"C++ has its place in the history of programming languages. Just as Caligula has his place in the history of the Roman Empire."
Robert Firth.
"Java is C++ without the guns, knives, and clubs."
James Gosling, co-inventor of Java.
"C++ is an horrible language. Even if the choice of C were to do *nothing* but keep the C++ programmers out, that in itself would be a huge reason to use C."
Linus Torvalds, inventor of Linux.
COBOL
"The use of COBOL cripples the mind; its teaching should therefore be regarded as a criminal offense."
E.W. Dijkstra.
Fortran
"FORTRAN is not a flower but a weed — it is hardy, occasionally blooms, and grows in every computer."
Alan J. Perlis. Computer scientist and professor (Yale).
"FORTRAN, the infantile disorder, by now nearly 20 years old, is hopelessly inadequate for whatever computer application you have in mind today: it is now too clumsy, too risky, and too expensive to use."
E. W. Dijkstra.
"FORTRAN was the language of choice for the same reason that three-legged races are popular."
Ken Thompson. Co-creator of B, Unix, Plan 9 and the Go programming language.
Java
"If Java had true garbage collection, most programs would delete themselves upon execution."
Robert Sewell. Programmer.
Lisp
"Lisp isn't a language, it's a building material."
Alan Kay.
Perl
"Perl is the only language that looks the same before and after RSA encryption."
Keith Bostic. Programmer, created Sleepycat, contributed to free BSD unices.
PHP
"PHP is a minor evil perpetrated and created by incompetent amateurs, whereas Perl is a great and insidious evil, perpetrated by skilled but perverted professionals."
Jon Ribbens. Programmer.
Bash and other shells
"It is easier to port a shell than a shell script."
Larry Wall. Creator of Perl.

And finally...

"There are only two kinds of programming languages: those people always bitch about and those nobody uses.”
Bjarne Stroustrup.
Unfortunately, I believe he is right. However, there have always been two schools, one for clear and safe languages (Pascal, and then scripting languages) and the other for languages facilitating hacking but with random results.
Read more ...

给明年依然年轻的我们

This post is from here.



今天是22岁的最后一天。几个月前,我从沃顿商学院毕业,用文凭上“最高荣誉毕业”的标签安抚了已经年过半百的老妈,然后转头辞去了毕业后的第一 份工作,跟一家很受尊敬的公司、还有150万的年薪道了别,回到了上海,加入了“刚毕业就失业”俱乐部,开始了一天三顿盒饭的新生活,中间许多精彩剧情暂 时略过。
我肯定不是第一个做过这样事的人,也肯定不会是最后一个。所以在说自己的一些有趣故事前,我想借用大家(包括30岁甚至40岁以上的朋友)的一点时 间和一点平和的心态,和大家分享过去一年以来一直没说的一些话。所以前两部说的是对于一些一直困扰着我们的关键词的理解和体会。他们是:欲望、外界、标 签、天才、时间、经历、人生目标、后悔、和现实。
这可能会是一篇科普文,也可能会是一篇长篇小说,但我不想这篇文章变成一篇励志文,大家都审美疲劳了。所以我想忽略阳春白雪,尽管信息量很大,但是 至少说一些实实在在的经验和故事,说一些效果立竿见影的观点,再说说活捉林志玲什么的,总之让大家多看一点就多获得一点实际的价值。

第一部:那些最容易被理解错误的事

关于欲望
这些是我们内心里和人生理想一样真实的东西:学历、工作、房、车、财富、以及爱。我们每个人都愿意为了这些欲望去付出,无论付出的是汗水、鲜血、还 是身体健康、又或是其它你懂的。尽管我们付出的方式可能不被社会主流认同、可能没那么具有有戏剧性,但你和我、北大图书馆里的学生和网吧中奋斗的少年、职 场杜拉拉和夜场里跳舞的小姐、韩寒和芙蓉凤姐(韩少躺着也中枪-_-),我们谁没有为了一个目标连续熬夜奋斗过呢?我们谁没有为了得到一样东西而撕心裂肺 地付出过呢?谁没有过那种拼命得快受不了的感觉呢?所以我们最不缺励志的故事,因为我们每个人都是付出领域的专家。
真正的问题是,当我们跑得越快,越是无法考虑我们是否在朝着正确的方向奔跑。
北野武讲过一个很有趣的故事。他说他没出名之前想有一天有了钱,一定要开跑车,吃高档餐厅,跟女人们睡觉。而真正功成名就的时候,他发现开保时捷的 感觉并没有那么好,因为“看不到自己开保时捷的样子”。结果他就让朋友开,自己打个出租车,在后面跟着,还对出租司机说:看,那是我的车。
我想说,过去几年里我认识的、深交的、共事过的所有人,包括身边一批又一批二十出头收入一百多万的金融朋友、三十岁左右收入几百万的前辈朋友、以及简历金碧辉煌得已经不在乎收入的大BOSS、以及我自己的经历告诉我两件事:
一,顶级学校的文凭、顶级公司的工作、顶级的收入、顶级的房、顶级的车、顶级的声望,这些都无法满足人类。
二,无论是通过爸妈,通过运气,还是通过奋斗得到这些顶级的东西,人类都不会得到更多的幸福感。
接着北野武的故事说下去。想象一下:你今天骑在一辆助动车上,一个小山村来的年轻人经过,说你的车好帅,你不会有任何的满足感。十几年的奋斗后,你 坐在一辆你今天都叫不出型号的保时捷的驾驶位上,一个路人经过,说你的车好帅,相信我,你也不会有任何的满足感。你不在乎他,就像你今天不在说你助动车帅 的人。你的视角在变。每当我们考虑许多年后能够取得的成就,我们总是习惯站在今天的角度去衡量幸福感和满足感。你今天的视角只是错觉,却让你相信自己的目 标是正确的。这是我们最容易跑错方向的时候。
人类的需求是很奇特的。我们吃第一个面包的时候的幸福感,和我们吃第一千个面包的时候的幸福感,是差不多的,前者甚至比后者还多一些。同样的感觉适 用于我们赚到的第一笔一万元和第一笔一千万元,第一辆十万的车和第一辆一千万的车,第一个女孩和第十个女人,第一个男生和第十个男人。“生理需求、安全需 求、归属与爱的需求、尊重的需求和自我实现的需求”-在著名的马斯洛五大需求中,你从任意一个细分需求里获得的幸福感只能有那么多。
我们清楚地知道快感和幸福感的不同,我们也知道欲望和需求是两个东西(你从来没有听说过“马斯洛五大欲望”对不对?),但是我们的不幸福却是因为不 小心把快感当成了幸福感,把欲望当成了需求,而这就是因为我们常站在现在的视角去想象未来的感受。事实是,就好像我们不需要很多的面包一样,我们不需要很 多的财富,不需要很多的爱。因为他们很难给你带来更多快乐。当然,我们也不需要去拔高理想和自由的重要性。你可以尝试着停下来思考一下,这五种需求是否真 的有高低之分,思考一下,是否连最贫穷最饥饿的人们,都一直在生活中同时追求着这五个高低层次的需求。你会发现其实这五种需求一样真实,离你一样近,也一 样远。然后你需要找到一个可以同时实现这五种需求的平衡点。这个平衡点就是只属于你的奔跑方向。这篇文章会实实在在地帮你找到这个方向。但在这之前,我们 先谈一些别的。
关于外界
外界带给我们生活最大的影响是嫉妒和比较。
我们一直高估了嫉妒。举个例子,没有人嫉妒雷帝Gaga。雷帝Gaga应该要比我们都更有名、更有钱、坐更好的车、住更大的房子,比我们更随心所 欲,而且也比我们更有才华。但你不嫉妒她,对么?我们没有人嫉妒雷帝Gaga-因为她实在是太雷了。她奇怪得让我们完全不能把我们自己跟她联系在一起,所 以我们在名利和才华面前没有自卑,也没有嫉妒,更没有仇恨。反而,我们会去思考,觉得她挺有趣的,挺发人深省的,不是么?
所以当你见到好事情发生在了那个他或者那个她身上,嫉妒的小火苗在你心中扑哧扑哧的时候,不如把TA当成那个很奇怪的雷帝Gaga吧。因为这样的时候,我们就会懂得抛开个人的杂念,去真正思考别人的亮点。
至于比较(Social Comparison),我们可以选择努力向那个绩点4.0的同学看齐,努力向那个年薪几十万的旧识看齐,努力向那个不断得到提拔的同事看齐。或者,我们 也可以选择看看外面更大的世界,那些和我们一样年轻的人们。看上去像是有30岁阅历的阿呆Adele,19岁时出了张白金专辑《19》,21岁时出了全销 量1200万张的专辑《21》,拿了两座格莱美。她出生于1988年。眼神和心态似乎已经像中年人那样淡定的杜兰特和德里克罗斯,两个毫无疑问的超级球 星,他们也出生于1988年。如果你喜欢实用一点的,那么iPhone上用户量最大的个人开发第三方浏览器猛犸浏览器的开发者,是一个1992年出生的北京少年。如果你的视线中有一个世界舞台,那么你会看到上面的人物已经越来越接近你的年龄。
我们不需要去看齐,我们只需要去“看”。去看到这个世界除了你现在正处在的那个若干平米的封闭空间以外,还有许多许多精彩的事正在发生。当你发现这 个世界的深度和广度,你就会发现你跟你身边的那些“同类人”根本没什么好比的。这个世界太大了。你不是你自己的标杆,别人也不是。谁都不是你的标杆,这是 一个没有标杆的时代。
我们要做的是试着不去嫉妒,不去比较,更不要批判,但要试着去观察、去倾听,然后去思考、去沉淀、去让所有外界的信息在你大脑里经历一个长时间的处 理过程。在你的大脑还没有沉淀出你自己对一件事的观点前,不要发表观点,不要给出你的定论。我们可以不断在大脑中质疑我们所看到的、听到的,我们可以不断 挑战自己的想法、挑战任何理所当然的存在,只要我们保证我们的大脑一直在思考,独立地思考。要记得,你和世界上所有人都不一样。
关于标签
“牛逼”是过去几年里笔者听到的比较多的一个形容词。当我们喜欢的人称赞我们的时候,我们总是P颠P颠的。在这里为自己开脱一下,觉得这挺好,说明活得挺真实。
但笔者想用一个很好的朋友(自己来认领)去年当着我面描述我听的原话,来翻译一下这个已经被用得和“帅哥”“美女”一样烂俗的词。她说,“你想太多 了(这是她一贯的开场白)。你只是有很多很牛的标签-上海中学、沃顿商学院、最高荣誉、黑石的全职Offer、百万年薪。至于你本身么,牛不牛就说不清楚 了。”
这个故事告诉我们:一、“牛”和“帅哥”“美女”一样,是一种打招呼的方式,二、“牛”的从来都是那些标签,那些改变了金融产业的企业,那些通过培 养人才改变了世界的学校,那些定义了时尚的品牌。虽然我无意改变大家打招呼的方式,但对于还没奔到三的人类来说,“高档”“精英”“牛逼”其实不如“做得 不错”或者“挺有意思的”来得更实在。当然,等奔到了三,我们就更不想用这些词了。
如果你曾经或者将来获得了任何标签,不管是高盛中金麦肯锡,还是北大清华常春藤,又或是Gucci Prada Armani,有两件事值得思考一下。
第一件事用来提醒自己:撕去这些标签,我们或许还未能为500强的客户们创造等同于我们年薪的价值,我们或许还未能用知识改变世界,我们或许还未能把那件衣服穿出五位数价格的范儿。
第二件事用来看清自己:这的确是一个人人都用标签来识别对方的社会,但是我们要记住我们的价值和我们身上的标签没有半毛钱关系。成功不是你有什么标 签,而是你用这些标签做了什么。(是的,文章开头的“沃顿商学院”“150万”“最高荣誉毕业”这些个标签让一部分人把这篇文章看到了现在,但无论如何, 对于心理上被冒犯到了的人,在此致以诚恳的歉意)。
总之,把标签用在正确的地方,创造一些价值,虽然不是大到改变世界,也至少带来一些存在的意义。就不展开来说了。
关于天才
不要去考虑什么天赋异禀,一切都来自经历和渴望。特别是这些年,当我认识了一些全中国、甚至全美国最“天才”的年轻人以后,才发现哪有什么天才,如 果把他们的经历一个个说出来,大家肯定觉得完全就是一群苦逼啊。但这些苦逼有一个共同点,他们很清楚的知道自己究竟需要什么,并且很嗨地追求着。

第二部:那些最重要的事

time-management-clock
关于时间
时间是唯一的货币。你所拥有的财富很重要,因为你可以用它用来换很多东西。你所拥有的时间远远更重要,因为你可以用时间来换这世界上的任何东西,包 括财富,包括成就感,包括幸福感,包括其他那些我们都清楚的、比财富更让我们的生命有价值的东西。是的,每个人拿时间换每样东西的汇率都不同,有些人可以 用很少的时间换到很多的财富,有些人需要用很多的时间换到很少的幸福。但是事实是,只要你愿意花时间,你可以换到任何东西。所以你要想清楚,你到底要用时 间来换取这世上无限可能中的哪些。打开你的视野,你会发现有太多经历和体验可以让你去换取。但你的时间银行里每天只存了24个小时。你可能以为你还有一辈 子的时间去做一些你想做的事,但事实是,没有人可以保证明天上帝是否会往你的银行里存另一个24小时。所以,你要想清楚。
关于经历
如果你今天能从这篇文章中带走任何一样东西,我希望会是接下来关于经历的这一段。
经历的英文叫什么?如果你曾经玩过角色扮演类游戏(RPG),你会知道有一个概念叫EXP,全称叫Experience,这就是经历的英文。人生就是一场巨大的RPG,你扮演你自己。你唯一升级的方法,就是不断地积累EXP。
我们都了解那些故事,我们都懂那些道理,看了那么多励志贴,我们甚至都快知道为什么乔布斯会成为乔布斯。但只有经历才能让我们真正把那些道理变成意识。那些改变我们一生的道理,都不是别人教会的。
所以即使你有最完美的理论,你都没有把握说服那些还没有开上保时捷的人们,让他们懂得保时捷不是他们想要的,也没有把握去说服那些还没有在投行工作 过的孩子,让他们懂得去放弃投行(更何况,对于那些热爱金融的孩子来说,你的劝诫极有可能是错的)。所以哪怕这篇文章非常努力地想要往实用的方向靠拢,可 能你看完以后还是没有任何领悟。这一切就像你无法说服还没有吃过很多很多面包的人们,让他们懂得吃一千个面包是要反胃的。
在人生的每个阶段,只有我们已经拥有的那些经历,决定了我们下一步会做什么。所以很多时候,你只要记得一件事,那就是: 去体验不同的经历。去爱,去恨,去在热恋中没心没肺地笑,去在失恋后声嘶力竭地哭,去翘课,去打架,去拼了命的读书,去让自己真的领悟那些道理。你所尝试 的事,你所认识的人,都是你经历的一部分。他们帮助你去理解你一只知道但是不曾真正理解的事,他们帮助你去看到一直存在着但是你不曾看到的世界。
但是,你的人生很短,你的时间货币只有那么多。所以除了乔布斯已经告诉你的“不要生活在别人的世界里”你还要记得,永远不要重复一样的经历,因为你 不会从第二次一样的经历中收获到更多,更因为这个庞大的世界有太多有趣的人等待着我们去认识、太多截然不同的经历等待着我们去体验。
这篇文章也会实实在在地帮助你探索不同的经历。你只要记住,如果你每个星期都在做着差不多的事情,那么一年以后你还是一年前的你,只是老了一岁。如 果你愿意每个星期、或者每个月都去尝试一种新的体验,或者认识一个来自完全不同背景的朋友,那么一年后你和一年前一样年轻,只是比别人多活了一年,多了一 年的阅历和对世界的认知。
关于是否会为了去经历、去追随感情和理想而后悔
我们一定会后悔。但我们不会为了作出追随感情、或者追随理想的决定而后悔。事实是,如果我们有努力追寻、不愿放弃的梦想、如果我们有深爱的、不想伤 害的人,那么在这条道路上,我们必然会为我们曾经做过的某些事而后悔。当我们离理想和真爱越是近,我们越是容易后悔。就好像晚了一分钟错过飞机的人会比晚 了一个小时错过飞机的人更后悔懊恼-因为我们会清楚地看到如果自己不曾犯下某些错误,如果我们再多那么一点点的坚持,就或许已经实现了理想。所以后悔其实 是一个信号,它告诉我们,离目标已经很近了。更重要的是,我们活着不是为了追求什么瞎扯的“无悔的生活”,我们不用为那些后悔而伤心痛苦。因为在我们选择 的这条道路上,后悔不是告诉我们曾经做错了,而是告诉我们怎样可以做得更好。
关于如何找到人生目标
兑现承诺的时候到了。我想用一种最简单、直接、有成效方法来解决那些励志文章和成功故事的一个通病:就是他们一直鼓励我们“做我们想做的事”,但从 来不告诉年轻迷茫的我们怎么去找到“我们想做的事”(以至于误导了很多朋友以为那就是“我想一觉睡到国庆节”或者“我想做个吃货”之类的意思)。
我要说的这个方法在我认识的许多人身上成功过,但它不是我想出来的。知名博客写手Steve Pavlina在它的博客中对这个方法有很详细的描述,但似乎也不是Steve Pavlina自己想出来的。网上也有不少中文翻译版本,有可能你曾经看到过,但那些翻译都有失偏颇,以至于让读者很难理解精髓。所以在这里把原文重新编 辑,结合以上的经验分享,再用比较适合中国人的陈述方式分享给大家。如果你愿意尝试,愿意按照要求去做,或许我们可以用接下来的不到500个字,帮助你在 20分钟到1个小时内找到你的人生目标。
我们开始吧。
(1) 先在你忙碌的生活中找出一个小时的完全空闲的时间。关掉手机,关掉电脑,关上房门,保证这一个小时没有任何打扰。这一小时只属于你,和你要找到人生理想这 件事。你要记住,这可能是你人生最重要的一个小时。你的生命可能在这一个小时候变得不同。如果一个小时的时间货币只能用来换一样东西,那么就是找到你的人 生目标绝对是最值得的。
(2) 准备几张大的白纸,和一支笔。
(3) 在第一张白纸上的最上方中央,写下一句话:“你这辈子活着是为了什么?”
(4) 是的,接下来你要做的,就是回答这个问题。把你脑中闪过的第一个想法马上写在第一行。任何想法都可以,而且可以只是几个字。比如说:“赚很多钱。”
(5) 不断地重复第4步。直到你哭出来为止。
是的,就是这么简单。尽管这个方法看上去很傻,但是它很有效。如果你想要找到人生目标,你就必须先剔除脑中所有那些“伪装的答案”。你通常需要 15-20分钟的时间和过程去剔除那些覆盖在表面上的那些受到外界观念、主流思维影响而得出的答案。所有的这些伪装的答案都来自于你的大脑、你的思维、和 你的回忆,但真正的答案出现时,你会感觉到它来自你的内心最深处。
对于从来没有考虑过这类问题的人来说,可能会需要比较长的时间(一个小时或者更多)才能把脑子里面的那些杂物剔除掉。在你写到50-100条的时 候,你可能会想放弃,或者找个借口去做别的事。因为你可能觉得这个方法没有任何效果,你的答案很杂乱,你也完全没有想哭的感觉。这很正常。不要放弃,坚持 想和写下去,这个抵触的感觉会慢慢地过去的。记住,你坚持下去的决定会将这一个小时变成你人生最重要的一个小时。
当你写到第100个或者第200个答案的时候,你可能突然会有一阵内心情感上的涌动,但还不至于让你哭出来。这 说明那还不是最终的答案。但是把这些答案圈起来,在你接下来的写的过程中你可以回顾这些答案,帮助你找到最终的答案,因为那可能会是几个答案的排列组合。 但无论如何,最终的答案一定会让你流泪,让你情感上崩溃。
此外,如果你一开始不相信人这辈子活着有什么目的,你也可以写下“1. 活着不为了什么。” 没关系,只要你愿意坚持想和坚持写下去,你也会找到让你哭出来的答案。
作为你的参考,Steve Pavlina在做这个练习的时候,花了25分钟在第106步找到了他的最终答案。而那些让他有一阵情感涌动的答案分别出现在在第17,39,53步。他 将这些抽出这些答案重新排列,最后在第100步到第106步答案得到了升华。想要放弃的感觉出现在第55到60步(想站起来做点其他事情,感觉极度没有耐 心等等)。写到第80步的时候,他休息了2分钟,闭上眼,放松大脑,然后重新整理自己的思绪。这么做很有效果,在那2分钟的休息后,他的思路和答案变得更 加清楚。
如果你一定要拿笔者来做参考,那么答案是我当时比较无知,还不知道这个系统的方法,所以我用了四个月的摸索和迷茫,撞了很多墙,才找到了最终的答案(在第二章个人故事里会提到)。但经过笔者核实,这个方法科学有效,只因为它提炼出了关键的原理。
无论你愿意用什么方法,你最终的答案一定会是一句比较长的句子,或者几句句子的组合。这个答案在外人看来一定非常的空洞,就像是我前面所说的那种 “谁都知道,但是只有少数人真正理解的大道理”。但是这几句空洞的句子会对你有非常丰富而且有意义的含义-因为这是你自己用了至少一个小时的时间和精力去 整理你过去所有的经历,去思考,去判断,去剔除,去整合,去沉淀,最终领悟出来的。如果你认真看完了从文章开始到这里为止所有的分析,你就会理解为什么这 个方法是非常有效的。
关于为什么要有个人生目标(以及它和活捉林志玲的关系)
这是个好问题。所有人的终极目标其实都一样,就是用有限的人生货币去换最多的幸福感(这个幸福感可以来自内在的、外在的、和世界上任何人和物)。但 大部分人都觉得这是件很困难、而且不知道如何下手的事。最大的问题其实就是,如何最大化人生幸福感是一个几万行的方程式,当中你要做出数亿个选择,而我们 却指望用逻辑去解决它。你也知道,逻辑是多么不靠铺的一个东西。很多时候,你往往觉得你已经把脑子想炸了,但还是做不出一个选择,这是大脑逻辑功能达到处 理极限的问题,它只能解决绕五个弯的问题,面对绕一百个弯的问题它弱得和奔2一样;又有的时候,你的逻辑很容易被你的欲望给废掉了,这个情况最常出现在早 上起床的时候-“我该起床么?”“Hmmm…睡着挺舒服的,不起了。”-你以为你用逻辑完美地解决了问题,其实你只是让欲望解决了问题,然后用逻辑完美地 说服了自己。所以我们经常在过了一段时间后,突然发现,我们的欲望挂着“逻辑”的羊头“解决”了所有问题,但是自己却空虚得没有任何幸福感。我们不想这 样,所以我们需要把你的大脑处理每一个选择的过程变得非常简单正确。
确立一个人生目标为什么可以解决这个问题?很简单,人生目标把你那个不知道是什么火星进制的大脑逻辑简化成了二进制。假设你的人生目标是“活捉林志 玲”(当然,这只是一个不可能发生的例子,千万不要有人因为写到这个目标哭了出来),那么你每天早上的起床的时候的过程就是:“我该起床 么?”“Hmmm…继续睡下去能帮助我活捉林志玲么?”“很明显不能。起床!”
这就是你听过很多励志演讲者会说:“究竟是什么让那些幸福快乐的人每天一大早醒来想也不想得就冲下床去做他们要做的事情?”-是林志玲。噢不,是他 们的人生目标。其他事情也一样:“我要吃饭么?”“不吃饭我能活捉林志玲么?””不能,所以我要吃饭。”“我要去夜店么?”“去夜店能帮我活捉林志玲 么?”“不能,锻炼好身体一定可以。所以我还是用去夜店的时间货币去换强健的体格和咏春拳吧。”你会发现你不用再去依赖不靠谱的复杂逻辑,做任何决定都很 简单而且正确。当然,你的人生目标会“活捉林志玲”看上去高尚、空洞很多,它也一定会涵括你对自己、对身边亲人好友、对世界的考量。但记住无论如何,你那 外人看似空洞的目标曾让你哭出来,所以它对你来说一定有极为丰富的含义。
最后,你可能会问:“我怎么能确定一直按照人生目标做出选择,我一定能最大化幸福感呢?” (其实这个问题看上去不怎么需要解释的)那是因为你的人生目标是你自己剔除了你欲望带来的杂七杂八的“伪装的需求”,经过沉淀以后得出的你内心最深处最想 要的东西,它是你真正的需求。跟随着它你会在短期获得应该获得的快感,更会在长期得到你需要的幸福感。
关于现实和人生目标
我想给所有已经、即将、或者希望找到人生理想的人,和大家分享两个很平凡的故事,作为结束。
我想讲的第一个故事来自我大学最重要的两个导师之一。他是沃顿的一个明星教授,麻省理工本科,哈佛法学院毕业,五十多岁,教了十七年谈判学的课程。尽管他的课作业量很大,但每一年他的课都已几乎满分的学生评分位列沃顿所有课程的前三甲。
在我大学毕业前,我约他在费城附近的一个小镇吃了顿午饭。他跟我讲他年轻时候的故事的时候,我问他,他这辈子做出过得最让他后悔的决定是什么?
他说,他从小一直很想当老师,特别是小学老师。当他二十多岁从麻省理工毕业的时候,他有一个很好的机会,去家里附近的一家他很喜欢的小学做老师。但 即使在美国,小学老师也几乎是待遇很低、不受尊重的一个职业。而同时,他拿到了哈佛法学院的Offer。最后他去了哈佛法学院,而这就是他这辈子做出过最 让他后悔的决定。他后悔,不仅仅因为他后来发现哈佛法学院是那么的无聊而且勾心斗角,更因为他当时为了一个被社会所尊重、所仰慕的选择,放弃了一个被社会 遗弃、看不起的选择。
他说他很幸运,一直那么喜欢当老师,在从法学院毕业许多年的颠沛流离以后,终于如愿以偿成为了一个老师。当我和一些人说起这个故事的时候,他们的第 一反应就是,这不是乱说么?如果不是去了哈佛,他可能现在还只是个小学老师,根本不可能成为沃顿教授啊。我想,现实和理想的意义对于每一个人都是不同的, 我们只需要理解并不是所有人都觉得成为成为名校的教授是比普通学校的小学老师更伟大、更幸福的成就。
第二个故事开头,我想问一个问题:你有没有考虑过我们每天上校内上微薄,看到很多人分享各种励志、免俗、追求梦想的文章,但他们最后究竟做什么去 了?你可能以为他们马上回归现实去了。但其实他们很多时候,是怀揣着那些道理,继续去做他们知道怎么做的事情。这就有了第二个故事。
每一个二十岁左右的年轻人都像一台高速运行的电脑。一代比一代运转地更快。我们从懂事开始就有别人告诉我们要运行各种程序,上幼儿园,上小学,上初 中,上高中,上大学,工作,等等等。我们停不下来。关键是,我们很难运行自己想要运行的程序,因为过去二十年里面我们运行的所有程序都是别人编好以后给我们 的-我们自己不会编程序。
如果有一天,有一台电脑突然下了决心,要运行自己的程序,他就必须先停下来。这时,他会看着周围所有的电脑依然在高速运行着,甚至嘲笑他怎么不动 了,然后把他远远地甩在后面。而他,需要慢慢地开始学习自己编程,这个过程很漫长,很痛苦,因为从来没有人教过他。这就是为什么世界上只有少数人在运行自 己的程序。
说这两个故事不是为了励志,而只是为了告诉大家如果今天或者明天你找到了人生目标,将会发生一些什么:一、即使你内心已经明确地知道你想要什么,依 然会有一些更为社会认同的东西来诱惑你,要永远记得坚持。二、如果你坚持了,你一定会经历一个学习自己写程序的过程,这个过程会是痛苦并漫长的。总有一天 我们会愿意去面对这个过程。好消息是,我们都还年轻。所以不如趁着现在还有那些热情和勇气,去撞一撞那些墙,用最少的代价。

第三部:过去一年里的个人故事,给所有十年来认识的、和喜欢听故事的朋友们

辞职前的故事
我从去年暑假结束,拿到回黑石的offer后,就开始了寻找自己人生目标的旅程。2010年的九月到12月,我过得挺糟糕的。因为我每天起来都在想 我接下来这辈子要干什么。我可以很清楚地看到如果我接受了那个offer,我未来两年的前景。我们办公室里有一个韩国人Jay,我实习的时候是他做分析师 的第三年。每年的反馈中,他都是黑石他那一届全球所有分析师里最强的那一个。我没有怀疑自己能够成为这届最好的分析师,但同时,我也可以很清楚地看到,J 是我能成为的极限。但仔细想想,J也不过只是那样,像永动机一样地在办公室努力工作,像尊贵的孩子一样在夜店潇洒地玩耍。J是最出色的,但也是黑石所能创 造的最出色的。
后来我想到了环境的局限性,想到了密集网络。我在上中的时候,我这届最好的学生去了北大和清华。而在沃顿时,最好的学生去了高盛直投、贝恩资本、凯 雷、KKR、Jane Street等买方。我想到我们是不是已经成为模式化思维的牺牲品(victims of stereotypes)。 我们的社交圈里都是与我们同类的人,我们互相交流、竞争、鼓励、启发,处于所谓的密集网络。我们自以为我们充分见识了整个世界,但其实我们只是在重复肯定 同一类信息。所以如果你是“最出色的”那一个,那么你极有可能就是所有和你同类的人当中最出色那一个。但这也就是你的极限。而有另外一群人,他们只是想和 别人有点不一样,他们想去外面看看,去见识见识这个世界究竟有多大,他们想要找到自己独特的生活。对于这些人来说,天空才是极限。说实在的,所有当年选择 DIY出国的朋友们,如果今天你有幸拿到了让那些当年去北大、清华的那些同学羡慕的Offer(再次向躺着也中枪的北大、清华同学致以崇高的歉意),如果 你有了比同龄人更多的见识,那绝对不一定是 因为你比他们更出色,很大程度上是因为在那个出国还没有像今天一样流行的年代,你没有被那个上北大、上清华的模式化思维所套住。所以老天很弄人,因为所有 一直在追求“出色”和“卓越”的人最后都在他们最坚信的标准上“输”给了那些只是想过自己独特生活的人。
当然,2010年末的时候,我只是确定了自己是被老天玩弄的人哪。但幸好我还有一年时间,我决定一定要要找到一个属于自己的生活目标,然后坚定地走 下去。一开始,我和很多人一样,觉得人生的终极目标就是要多走走,去见识这个世界,活出自我。但后来我发现这个目标其实只是说着好听,但是其实不能给人带 来持续的动力,然后我就很伤心。再然后,我好不容易想出了一个有点与众不同的目标,就是“做个有意思的人”(Be an interesting person)。因为对我来说,这是我当时能给另一个人的最高评价。但后来我又想了想,这个目标用管理学的标准来说,就是太不具体太不精确所以很难提供持 续动力。然后我就更伤心了。所以从九月到十二月的四个月里,每天起来就因为找不到人生目标而痛苦。因为自己跟自己的内心对话太多,经常一不小心就错乱了。 当时也没有人告诉我什么20分钟就可以找到人生目标的这种好事。于是我就上了很多奇奇怪怪的课,和各种奇奇怪怪的人交流,希望从他们的经历中获得一些启 发。那段时间我过得真的很彷徨也很烦躁,好在我坚持了下来。我谈判课上的教授成为了我很重要的一个导师-尽管他从来没有一对一给予我任何指导。但就像我前 面提到的,那些改变我们人生的道理,都不会是别人教会的。进入到十二月以后,我的目标慢慢找到了我。
四个月里经过无数内心挣扎之后沉淀下来的思想最终被我总结成了两句很简单、看似和“做个有意思的人”一样不具体、但对我而言包含了丰富含义的话:
”To grow and to help others grow. To live and to help others live.”
”成长,并帮助别人成长。体验和经历生活,并帮助别人体验和经历生活。”
这两句话就成了我的人生目标。它能让我感动得哭,也能让我感动得笑。最重要的是,尽管这两句话在外人看来可能莫名其妙,但我发现这两句话解释了过去 二十多年里自己做的许多事情背后的原因,其中包括了我为什么从小一直都不好好读书,为什么选择出国,为什么一直逃课,为什么在2009年和一群朋友一起创 建了BIMP这样一个神奇的项目,等等等等。
关于辞职的决定
在确定了人生目标以后,我的思路和视野都变得清晰了很多。我很快找到了我想要做的事。和身边许多的朋友一样,创业也曾经是我大脑中的考虑过的一个想 法。但我一直想不到任何我愿意用我几乎所有的时间货币去换的一个创业项目。但在确定了人生目标的今年一月份,我几乎没有花什么时间就确定了一个项目的大方 向,这个商业项目的创意像是奔着我而来的。然后再通过不断的完善从一个不成熟的产品渐渐变成一个成熟的产品,一个真正可以持久给所有人带来价值的产品。
所以,可能和许多我很尊敬的朋友不同,我的出发点并不是“慈善”和“义务服务”,“创业”也从来都不是我的目标(一个学了四年金融的人怎么可能一直 心存“创业”这个目标呢),我的目标就是实现“成长,并帮助别人成长。体验和经历生活,并帮助别人体验和经历生活。” 简单的说,我的内心并没有一个声音告诉我“你一定要创业、你一定要创业”,只是碰巧创造一个商业化的项目是实现这个目标最好的方式,而创立一个商业项目这 件事碰巧叫做创业。
而另一方面,在黑石工作可以帮助我“成长”和“经历”,但是我觉得在黑石的一个暑假实习里,我用20%的时间经历了接下来的两年里可能会经历的 80%的体验,对我来说已经很值得了。我也一定会“成长”,但是未必会比创业成长得更快、更深刻、更理想、更多样化(比如说我就没有办法做我一直很想做的 美工设计工作了!)。最重要的是,我意识到在黑石我基本上不能实现我人生目标的另外50%-“帮助别人成长。帮助别人体验和经历生活”。所以结果就是, “是否辞去毕业后的第一份工作,直接成为无业游民”这么重大的一个选择,被我用人生目标给瞬间解决了。有多瞬间呢?我后来发现了个有趣的巧合。
四年前,我曾经尝试着去写一篇回忆录,来回忆出国两年多的旅程,然后这篇回忆录不幸地才写到出国的第一年就没有后来了。尽管写回忆录是一件有点折磨 人的事情,但读回忆录绝对是件超开心的事。当中我写到过六年前我决定放弃轻松进北大清华的机会,毅然决定出国念高中,因为上海中学不支持孩子们申请国外大 学。原文如下:
“北大清华这种学校我肯定不去!”我当时的有两个很简单也很清晰的想法:一,I deserve the best in the world,二,也是更重要的想法,我想,就算最终在美国毁了,我至少做了一个帅到五体投地的决定,我鄙视了北大清华。更离奇的是,从那以后的两年至今, 我几乎从来没有为这个决定后悔过,也不觉得这有什么好想的。仿佛这道选择题是在侮辱我的智商而不是测试我的智商一样。无论如何,两年后的现在,我相信,这 个帅到五体投地的决定,是我一生至今最正确的决定。”
这个故事告诉我们:人是不会变的。把上文中的北大清华换成黑石,就是我的大脑在半秒中以内做出辞职这个决定的思考流程。可见大脑在考虑一些人生大事上是不怎么需要运作的,让心去运作就足够了,而你的人生目标就是你的心。
如果说这六年里,相比上面这段话我又多了什么领悟,那就是(1)一个人生目标(2)人生没有任何决定是错误的,因为你永远无法知道另外一个选择是否是正确的。
撞上的许多堵墙
Randy Pausch在他著名的“最后的演讲”中提到过一个很实在的观点。他说,在我们追寻理想的道路上,我们一定会撞上很多墙,但是这些墙不是为了阻挡我们,它 们只是为了阻挡那些没有那么渴望理想的人们。这些墙是为了给我们一个机会,去证明我们究竟有多想要得到那些东西。
我撞上的第一堵墙,就是我没有如我所愿地一毕业就辞职。考虑到团队开发的进度,个人诚信问题方面带来的压力,家庭的压力,以及很多直接辞职可能带来 的负面因素,我最终还是回去工作了四个月才得以正式辞职,其中包括一个月的培训。很长一段时间里,大老板都不允许我告诉任何人我辞职的事情,但大老板自己 却没有做好保密工作,以至于同事们最终都知道了我一个小小的分析师要辞职。但我又被规定不能公开,所以在我座位附近的办公室气氛很糟糕,上班感觉度日如 年。当中还穿插了许多压力山大的故事,比如我遇上了公司最高管理层一年一度的3v1谈话,在一个阳光明媚的下午被三个在华尔街响当当的名字各种拷问,因为 我光荣成为了公司历史上第一个干都没怎么干就宣布不干了的分析师(从小到大,坏孩子光荣榜上真是永远有我的名字)。又比如曾经跟我关系很好的一个VP整整 四个星期把坐在整个办公室出入口的我当空气。但是无论当时多煎熬,现在想来都是非常独特的人生经历。
其实我很感谢和尊敬黑石,不仅因为我仍然是个热爱金融的家伙,更因为每一个我接触过的同事的做事风格都对我的个人风格产生了一定程度的影响。从情感 的层面上,我最感激的是负责团队人事的韩国VP,在我辞职的过程中帮我做了许多疏通的工作。在我离开的前两天的晚上,他说了一句我印象很深的话。他 说,“Denny,你知道,作为你的上司,这次我面对着一个选择,是照顾公司的利益还是你一个年轻人的利益。我选择了后者。我希望你以后不用面临这样的选 择。但如果你有一天遇上了,我希望你可以跟我做一样的决定。”
我离开的那一天,我的同事和几个以前一起共事过的朋友给我发来了道别邮件。让我很高兴的是,他们在祝福中都用了同一句话“You are very brave”(“你很勇敢”)。之所以高兴,是因为无论今后的道路如何艰难,至少在旅程的起点我实现了奥巴马用来形容乔布斯一生的第一个形容词。对于一个 活在当下的傻子来说,这已经足够了。
现在我在上海的家中,和我非常喜欢而且非常有创造力的人们一起工作。虽说生活条件很普通(以银行家的标准来说的话简直是糟糕透了),虽说工作强度和 时间依然和在黑石的时候差不多(以银行家的标准来看的话处于中上水平),但回到上海后的这段日子确确实实是我人生中自我学习曲线上升最快的一段日子。所以 顺便说一个建议,当那些备受尊敬的金融机构告诉你为什么要选择他们的时候,特别是关于学习曲线的那些理由,不要那么快就为之屈服。他们不仅有可能(虽然也 仅仅是可能)在推销给你一些你并不需要的东西,并且他们永远不会带你看清楚这个世界上全部的可能性。你要跳出“密集网络”,自己去看清楚。这个建议出自依 然热爱金融的笔者。
我一年的故事就这么讲完了。如果回顾总结过去一年的人生,那么最好的形容就是从一年前我确定了人生目标的那天起,一切就开始失控。但我想在这个回顾 的最后,和所有已经确定了自己人生前进方向的朋友,分享这一年最大的感想:你的理想就像一辆车,如果你觉得这辆车的一切都在你的控制之中,那么可能说明你 开得还不够快 (Your dream is like your car. If you are in full control of it, you are not driving it fast enough)。

关于感谢
感谢所有支持你、欣赏你、否定你、看低你的人。
我一直说,永远不要忘记你从哪里来,要到哪里去。我不是一出生就上了好到可以改变我的学校,一直到六年前,我都不算是个好学生,学生生涯当过的最高 的职位是小队长,期中期末考试好像从来没有进过班级前三,有一年甚至还是全校倒数10%,更不知道自己要什么。感谢自己不知为什么突然一根筋地开始愿意好 好努力,自从那以后就知道实现梦想就靠坚持付出,没有别的秘诀。后来我出国,看到了一个很大很大的世界,在一路的坚持中,遇上了许许多多带给我灵感的人, 他们用他们的经历影响和改变了我。这就是为什么我一直告诉自己不要忘记你从哪里来,这也是为什么我想继续传播我受到的影响,可能是作为一种感谢。
今年上半年还在上创业课的时候,我一边要照顾自己的项目的开发,另一边又创业课项目团队中的其他四个成员眼看即将毕业,完全不作任何事情。我的教授 Gelburd,一个前创业家,也是我在沃顿的第二个导师,他并没有因为我一个人担纲整个项目的开发和准备而减轻对我们团队的项目的要求,但是他给了我很 多鼓励。期末演示日的那天,我在一天有三个期末演讲的情况下,被迫一个人完成了80%的项目演示。没有什么奇迹,我们的质量肯定不是最好的。但在我毕业的 前几天,我收到了这门课的成绩。Gelburd给了我A+。他写了一封感谢信给他,他回复我说,每一年上这个课的学生中,真正去创业的不出三个,I think you will be come very successful。
Read more ...

Sunday, May 20, 2012

MAC OS X LION THEME FOR UBUNTU 12.04 PRECISE PANGOLIN/UBUNTU 12.10 QUANTAL QUETZAL/LINUX MINT 13

This post is from here.


Version 1


Previous shared Mac OS X Lion for Ubuntu 11.10, People liked this theme also we should thank to Author.
Many People Search for Macbuntu 12.04/Macbuntu 11.10/Mac4lin, Mac Ubuntu theme and so on. So here we are ready with Mac OS X Lion Theme for Ubuntu 12.04 Precise Pangolin and Hopefully Mac Theme will work with Linux Mint 13.
macbuntu 12.04

mac ubuntu

mac4lin

ubuntu mac

mac os x ubuntu


How Gnome Shell Looks? (Not applied on Gnome Shell - Only GTK Applied)

mac gnome shell

gnome shell mac theme




Now Theme Installation:

1: Download Mac OS X Lion Wallpapers
2: Install Latest Cairo Dock

3: To Install Mac OS X Lion Theme on Ubuntu 12.04 Precise Pangolin open Terminal (Press Ctrl+Alt+T) and copy the following commands in the Terminal:
  • sudo add-apt-repository ppa:noobslab/themes
  • Now Enter This Command than go to install commands
  • sudo apt-get update

  • Install Cursors
  • sudo apt-get install mac-os-lion-cursors
  • Install Icons
  • sudo apt-get install mac-os-lion-icons
  • Install Theme
  • sudo apt-get install mac-os-lion-theme

4: Apply Mac OS X Splash:
macbuntu 12.04
Install Following commands to install splash:
  • wget http://dl.dropbox.com/u/53319850/NoobsLab.com/Paw-OSX.zip
  • unzip Paw-OSX.zip
  • sudo cp -R Paw-OSX/ /lib/plymouth/themes
  • sudo update-alternatives --install /lib/plymouth/themes/default.plymouth default.plymouth /lib/plymouth/themes/Paw-OSX/paw-osx.plymouth 100
Enter following command and select paw-osx splash:
  • sudo update-alternatives --config default.plymouth
Now Enter this command:
  • sudo update-initramfs -u

If you don't like Paw Splash, You can get back Ubuntu splash:
Enter following command and select Ubuntu Splash number:
  • sudo update-alternatives --config default.plymouth
Now Enter this command to update Splash:
  • sudo update-initramfs -u
See the following picture.


5: Install Compiz Setting Manager to Autohide Unity Launcher: 
  • sudo apt-get install compizconfig-settings-manager
unity autohide


6: Install Gnome Tweak Tool to change Themes, Icons, Cursors: 
  • sudo apt-get install gnome-tweak-tool
mac os x




Read more ...

Friday, May 18, 2012

rsync 的核心算法

This post is from here.



rsync 是unix/linux下同步文件的一个高效算法,它能同步更新两处计算机的文件与目录,并适当利用查找文件中的不同块以减少数据传输。rsync中一项与其他大部分类似程序或协定中所未见的重要特性是镜像是只对有变更的部分进行传送。rsync可拷贝/显示目录属性,以及拷贝文件,并可选择性的压缩以及递归拷贝。rsync利用由Andrew Tridgell 发明的算法。这里不介绍其使用方法,只介绍其核心算法。我们可以看到,Unix下的东西,一个命令,一个工具都有很多很精妙的东西,怎么学也学不完,这就是Unix的文化 啊。
本来不想写这篇文章的,因为原先发现有很多中文blog都说了这个算法,但是看了一下,发现这些中文blog要么翻译国外文章翻译地非常烂,要么就是介绍这个算法介绍得很乱让人看不懂,还有错误,误人不浅,所以让我觉得有必要写篇rsync算法介绍的文章。(当然,我成文比较仓促,可能会有一些错误,请指正)
首先, 我们先来想一下rsync要解决的问题,如果我们要同步的文件只想传不同的部分,我们就需要对两边的文件做diff,但是这两个问题在两台不同的机器上,无法做diff。如果我们做diff,就要把一个文件传到另一台机器上做diff,但这样一来,我们就传了整个文件,这与我们只想传输不同部的初衷相背。
于是我们就要想一个办法,让这两边的文件见不到面,但还能知道它们间有什么不同。这就出现了rsync的算法。
rsync的算法如下:(假设我们同步源文件名为fileSrc,同步目的文件叫fileDst
1)分块Checksum算法。首先,我们会把fileDst的文件平均切分成若干个小块,比如每块512个字节(最后一块会小于这个数),然后对每块计算两个checksum,
  • 一个叫rolling checksum ,是弱checksum,32位的checksum,其使用的是Mark Adler发明的adler-32 算法,
  • 另一个是强checksum,128位的,以前用md4,现在用md5 hash算法。
为什么要这样?因为若干年前的硬件上跑md4的算法太慢了,所以,我们需要一个快算法来鉴别文件块的不同,但是弱的adler32算法碰撞概率太高了,所以我们还要引入强的checksum算法以保证两文件块是相同的。也就是说,弱的checksum是用来区别不同,而强的是用来确认相同。(checksum的具体公式可以参看这篇文章 
2)传输算法。同步目标端会把fileDst的一个checksum列表传给同步源,这个列表里包括了三个东西,rolling checksum(32bits)md5 checksume(128bits)文件块编号
我估计你猜到了同步源机器拿到了这个列表后,会对fileSrc做同样的checksum,然后和fileDst的checksum做对比,这样就知道哪些文件块改变了。
但是,聪明的你一定会有以下两个疑问:
  • 如果我fileSrc这边在文件中间加了一个字符,这样后面的文件块都会位移一个字符,这样就完全和fileDst这边的不一样了,但理论上来说,我应该只需要传一个字符就好了。这个怎么解决?
  • 如果这个checksum列表特别长,而我的两边的相同的文件块可能并不是一样的顺序,那就需要查找,线性的查找起来应该特别慢吧。这个怎么解决?
很好,让我们来看一下同步源端的算法。
3)checksum查找算法。同步源端拿到fileDst的checksum数组后,会把这个数据存到一个hash table中,用rolling checksum做hash,以便获得O(1)时间复杂度的查找性能。这个hash table是16bits的,所以,hash table的尺寸是2的16次方,对rolling checksum的hash会被散列到0 到 2^16 – 1中的某个整数值。(对于hash table,如果你不清楚,建议回去看大学时的数据结构教科书)
顺便说一下,我在网上看到很多文章说,“要对rolling checksum做排序”(比如这篇 这篇 ),这两篇文章都引用并翻译了原作者的这篇文章 ,但是他们都理解错了,不是排序,就只是把fileDst的checksum数据,按rolling checksum做存到2^16的hash table中,当然会发生碰撞,把碰撞的做成一个链表就好了。这就是原文 中所说的第二步——搜索有碰撞的情况。
4)比对算法。这是最关键的算法,细节如下:
4.1)取fileSrc的第一个文件块(我们假设的是512个长度),也就是从fileSrc的第1个字节到第512个字节,取出来后做rolling checksum计算。计算好的值到hash表中查。
4.2)如果查到了,说明发现在fileDst中有潜在相同的文件块,于是就再比较md5的checksum,因为rolling checksume太弱了,可能发生碰撞。于是还要算md5的128bits的checksum,这样一来,我们就有 2^-(32+128) = 2^-160的概率发生碰撞,这太小了可以忽略。如果rolling checksum和md5 checksum都相同,这说明在fileDst中有相同的块,我们需要记下这一块在fileDst下的文件编号
4.3)如果fileSrc的rolling checksum 没有在hash table中找到,那就不用算md5 checksum了。表示这一块中有不同的信息。总之,只要rolling checksum 或 md5 checksum 其中有一个在fileDst的checksum hash表中找不到匹配项,那么就会触发算法对fileSrc的rolling动作。于是,算法会住后step 1个字节,取fileSrc中字节2-513的文件块要做checksum,go to (4.1) - 现在你明白什么叫rolling checksum了吧。
4.4)这样,我们就可以找出fileSrc相邻两次匹配中的那些文本字符,这些就是我们要往同步目标端传的文件内容了。
怎么,你没看懂? 好吧,我送佛送上西,画个示意图给你看看(对图中的东西我就不再解释了)。
这样,最终,在同步源这端,我们的rsync算法可能会得到下面这个样子的一个数据数组,图中,红色块表示在目标端已匹配上,不用传输(注:我专门在其中显示了两块chunk #5,相信你会懂的),而白色的地方就是需要传输的内容(注意:这些白色的块是不定长的),这样,同步源这端把这个数组(白色的就是实际内容,红色的就放一个标号)压缩传到目的端,在目的端的rsync会根据这个表重新生成文件,这样,同步完成。
最后想说一下,对于某些压缩文件使用rsync传输可能会传得更多,因为被压缩后的文件可能会非常的不同。对此,对于gzip和bzip2这样的命令,记得开启 “rsyncalbe” 模式。
Read more ...