sum idea双人游戏闯关怎么攻破13关

小站会根据您的关注,为您发现更多,
看到喜欢的小站就马上关注吧!
下一站,你会遇见谁的梦想?
分享一些linux的内容
Linux的胜利:Chrome OS成功抵御黑客攻击
摘要:Linux,再一次证明,它远远比其他操作系统安全。谷歌为能在Pwnium黑客大赛上攻破其基于Linux的Chrome OS的黑客们提供累计高达314万美元的奖金,然而黑客们却没能攻破Chrome OS。
Windows上的Chrome Web浏览器很容易被攻击,然而它的小弟&&基于Linux的Chrome OS,在加拿大召开的CanSecWest会议上,证明基本上无懈可击。
在惠普赞助的年度黑客挑战赛 Pwn2Own上,微软的IE 10,谷歌的Chrome和Mozilla的火狐浏览器全部沦陷。另外,Java也被攻破很多次。
此外,谷歌为自己的Pwnium 3 黑客大赛提供累计高达314万的奖金。
What is Branch Prediction
Consider a railroad junction:
Image by Mecanismo, from Wikimedia Commons: Now for the sake of argument, suppose this is back in the 1800s - before long distance or radio communication.You are the operator of a junction and you hear a train coming. You have no idea which way it will go. You stop the train to ask the captain which direction he wants. And then you set the switch appropriately.
Trains are heavy and have a lot of momentum. So they take forever to start up and slow down.Is there a better way? You guess which direction the train will go!
If you guessed right, it continues on.
If you guessed wrong, the captain will stop, back up, and yell at you to flip the switch. Then it can restart down the other path.
If you guess right every time, the train will never have to stop.
If you guess wrong too often, the train will spend a lot of time stopping, backing up, and restarting.
Consider an if-statement: At the processor level, it is a branch instruction:
You are a processor and you see a branch. You have no idea which way it will go. What do you do? You halt execution and wait until the previous instructions are complete. Then you continue down the correct path.
Modern processors are complicated and have long pipelines. So they take forever to "warm up" and "slow down".Is there a better way? You guess which direction the branch will go!
If you guessed right, you continue executing.
If you guessed wrong, you need to flush the pipeline and roll back to the branch. Then you can restart down the other path.
If you guess right every time, the execution will never have to stop.
If you guess wrong too often, you spend a lot of time stalling, rolling back, and restarting.This is branch prediction. I admit it's not the best analogy since the train could just signal the direction with a flag. But in computers, the processor doesn't know which direction a branch will go until the last moment.So how would you strategically guess to minimize the number of times that the train must back up and go down the other path? You look at the past history! If the train goes left 99% of the time, then you guess left. If it alternates, then you alternate your guesses. If it goes one way every 3 times, you guess the same...
In other words, you try to identify a pattern and follow it. This is more or less how branch predictors work.Most applications have well-behaved branches. So modern branch predictors will typically achieve &90% hit rates. But when faced with unpredictable branches with no recognizable patterns, branch predictors are virtually useless.Further Reading: As hinted from above, the culprit is this if-statement:
if(data[c]&=128)
& & sum += data[c];
Notice that the data is evenly distributed between 0 and 255. When the data is sorted, roughly the first half of the iterations will not enter the if-statement. After that, they will all enter the if-statement.This is very friendly to the branch predictor since the branch consecutively goes the same direction many times. Even a simple saturating counter will correctly predict the branch except for the few iterations after it switches direction.
Quick visualization:
T = branch takenN = branch not taken
data[]=0,1,2,3,4,...126,127,128,129,130,...250,251,252,...
branch = N &N &N &N &N &... & N & &N & &T & &T & &T &... & T & &T & &T &...
& & & &= NNNNNNNNNNNN ... NNNNNNNTTTTTTTTT ... TTTTTTTTTT &(easy to predict)
However, when the data is completely random, the branch predictor is rendered useless because it can't predict random data. Thus there will probably be around 50% misprediction. (no better than random guessing)
data[]=226,185,125,158,198,144,217,79,202,118, &14,150,177,182,133,...
branch = & T, & T, & N, & T, & T, & T, & T, &N, & T, & N, & N, & T, & T, & T, & N &...
& & & &= TTNTTTTNTNNTTTN ... & (completely random - hard to predict)
So what can be done?If the compiler isn't able to optimize the branch into a conditional move, you can try some hacks if you are willing to sacrifice readability for performance.Replace:
if(data[c]&=128)
& & sum += data[c];
int t =(data[c]-128)&&31;
sum +=~t & data[c];
This eliminates the branch and replaces it with some bitwise operations.
(Note that this hack is not strictly equivalent to the original if-statement. But in this case, it's valid for all the input values of data[].)
Benchmarks: Core i7 920 @ 3.5 GHzC++ - Visual Studio 2010 - x64 Release
// &Branch - Random
seconds =11.777
// &Branch - Sorted
seconds =2.352
// &Branchless - Random
seconds =2.564
// &Branchless - Sorted
seconds =2.587
Java - Netbeans 7.1.1 JDK 7 - x64
// &Branch - Random
seconds =10.
// &Branch - Sorted
seconds =5.
// &Branchless - Random
seconds =3.
// &Branchless - Sorted
seconds =3.
Observations:
With the Branch: There is a huge difference between the sorted and unsorted data.
With the Hack: There is no difference between sorted and unsorted data.
In the C++ case, the hack is actually a tad slower than with the branch when the data is sorted.A general rule of thumb is to avoid data-dependent branching in critical loops. (such as in this example)
GCC 4.6.1 with -O3 or -ftree-vectorize on x64 is able to generate a conditional move. So there is no difference between the sorted and unsorted data - both are fast.
VC++ 2010 is unable to generate conditional moves for this branch even under /Ox.
Intel Compiler 11 does something miraculous. It , thereby hoisting the unpredictable branch to the outer loop. So not only is it immune the mispredictions, it is also twice as fast as whatever VC++ and GCC can generate! In other words, ICC took advantage of the test-loop to defeat the benchmark...
If you give the Intel Compiler the branchless code, it just out-right vectorizes it... and is just as fast as with the branch (with the loop interchange).
This goes to show that even mature modern compilers can vary wildly in their ability to optimize code...
function/bind的救赎(上)
这是那篇C++0X的正文。太长,先写上半部分发了。
Function/bind可以是一个很简单的话题,因为它其实不过就是一个泛型的函数指针。但是如果那么来谈,就没意思了,也犯不上写这篇东西。在我看来,这个事情要讲的话,就应该讲透,讲到回调(callback)、代理(delegate)、信号(signal)和消息传递(messaging)的层面,因为它确实是太重要了。这个话题不但与面向对象的核心思想密切相关,而且是面向对象两大流派之间交锋的中心。围绕这个问题的思考和争论,几乎把20年来所有主流的编程平台和编程语言都搅进来了。所以,如果详尽铺陈,这个话题直接可以写一本书。
写书我当然没那个水平,但这个题目确实一直想动一动。然而这个主题实在太大,我实在没有精力把它完整的写下来;这个主题也很深,特别是涉及到并发环境有关的话题,我的理解还非常肤浅,总觉得我认识的很多高手都比我更有资格写这个话题。所以犹豫了很久,要不要现在写,该怎么写。最后我觉得,确实不能把一篇博客文章写成一本20年面向对象技术史记,所以决定保留大的架构,但是对其中具体的技术细节点到为止。我不会去详细地列举代码,分析对象的内存布局,画示意图,但是会把最重要的结论和观点写下来,说得好听一点是提纲挈领,说的不好听就是语焉不详。但无论如何,我想这样一篇东西,一是谈谈我对这个事情的看法,二是&抛砖引玉&,引来高手的关注,引出更深刻和完整的叙述。
下面开始。
0. 程序设计有一个范式(paradigm)问题。所谓范式,就是组织程序的基本思想,而这个基本思想,反映了程序设计者对程序的一个基本的哲学观,也就是说,他认为程序的本质是什么,他认为一个大的程序是由什么组成的。而这,又跟他对于现实世界的看法有关。显然,这样的看法不可能有很多种。编程作为一门行业,独立存在快60年了,但是所出现的范式不过三种&&过程范式、函数范式、对象范式。其中函数范式与现实世界差距比较大,在这里不讨论。而过程范式和对象范式可以视为对程序本质的两种根本不同的看法,而且能够分别在现实世界中找到相应的映射。
过程范式认为,程序是由一个又一个过程经过顺序、选择和循环的结构组合而成。反映在现实世界,过程范式体现了劳动分工之前&全能人&的工作特点&&所有的事情都能干,所有的资源都是我的,只不过得具体的事情得一步步地来做。
对象范式则反映了劳动分工之后的团队协作的工作特点&&每个人各有所长,各司其职,有各自的私有资源,工件和信息在人们之间彼此传递,最后完成工作。因此,对象范式也就形成了自己对程序的看法&&程序是由一组对象组成,这些对象各有所能,通过消息传递实现协作。
对象范式与过程范式相比,有三个突出的优势,第一,由于实现了逻辑上的分工,降低了大规模程序的开发难度。第二,灵活性更好&&若干对象在一起,可以灵活组合,可以以不同的方式协作,完成不同的任务,也可以灵活的替换和升级。第三,对象范式更加适应图形化、网络化、消息驱动的现代计算环境。
所以,较之于过程范式,对象范式,或者说&面向对象&,确实是更具优势的编程范式。最近看到一些文章抨击面向对象,说面向对象是胡扯,我认为要具体分析。对面向对象的一部分批评,是冲着主流的&面向对象&语言去的,这确实是有道理的,我在下面也会谈到,而且会骂得更狠。而另一个批评的声音,主要而来自STL之父Alex Stepanov,他说的当然有他的道理,不过要知道该牛人是前苏联莫斯科国立罗蒙诺索夫大学数学系博士,你只要翻翻前苏联的大学数学教材就知道了,能够在莫大拿到数学博士的,根本就是披着人皮的外星高等智慧。而我们编写地球上的程序,可能还是应该以地球人的观点为主。
1. 重复一遍对象范式的两个基本观念:
程序是由对象组成的;
对象之间互相发送消息,协作完成任务;
请注意,这两个观念与后来我们熟知的面向对象三要素&封装、继承、多态&根本不在一个层面上,倒是与再后来的&组件、接口&神合。
2. 世界上第一个面向对象语言是Simula-67,第二个面向对象语言是Smalltalk-71。Smalltalk受到了Simula-67的启发,基本出发点相同,但也有重大的不同。先说相同之处,Simula和Smalltalk都秉承上述对象范式的两个基本观念,为了方便对象的构造,也都引入了类、继承等概念。也就是说,类、继承这些机制是为了实现对象范式原则而构造出来的第二位的、工具性的机制,那么为什么后来这些第二位的东西篡了主位,后面我会再来分析。而Simula和Smalltalk最重大的不同,就是Simula用方法调用的方式向对象发送消息,而Smalltalk构造了更灵活和更纯粹的消息发送机制。
具体的说,向一个Simula对象中发送消息,就是调用这个对象的一个方法,或者称成员函数。那么你怎么知道能够在这个对象上调用这个成员函数呢?或者说,你怎么知道能够向这个对象发送某个消息呢?这就要求你必须确保这个对象具有合适的类型,也就是说,你得先知道哦这个对象是什么,才能向它发消息。而消息的实现方式被直接处理为成员函数调用,或虚函数调用。
而Smalltalk在这一点上做了一个历史性的跨越,它实现了一个与目标对象无关的消息发送机制,不管那个对象是谁,也不管它是不是能正确的处理一个消息,作为发送消息的对象来说,可以毫无顾忌地抓住一个对象就发消息过去。接到消息的对象,要尝试理解这个消息,并最后调用自己的过程来处理消息。如果这个消息能被处理,那个对象自然会处理好,如果不能被处理,Smalltalk系统会向消息的发送者回传一个doesNotUnderstand消息,予以通知。对象不用关心消息是如何传递给另一个对象的,传递过程被分离出来(而不是像Simula那样明确地被以成员函数调用的方式实现),可以是在内存中复制,也可以是进程间通讯。到了Smalltalk-80时,消息传递甚至可以跨越网络。
为了方便后面的讨论,不妨把源自Simula的消息机制称为&静态消息机制&,把源自Smalltalk的消息机制称为&动态消息机制&。
Simula与Smalltalk之间对于消息机制的不同选择,主要是因为两者于用途。前者是用于仿真程序开发,而后者用于图形界面环境构建,看上去各自合情合理。然而,就是这么一点简单的区别,却造成了巨大的历史后果。
3. 到了1980年代,C++出现了。Bjarne Stroustrup在博士期间深入研究过Simula,非常欣赏其思想,于是就在C语言语法的基础之上,几乎把Simula的思想照搬过来,形成了最初的C++。C++问世以之初,主要用于解决规模稍大的传统类型的编程问题,迅速取得了巨大的成功,也证明了对象范式本身所具有的威力。
大约在同期,Brad Cox根据Smalltalk的思想设计了Objective-C,可是由于其语法怪异,没有流行起来。只有Steve Jobs这种具有禅宗美学鉴赏力的世外高人,把它奉为瑰宝,与1988年连锅把Objective-C的团队和产品一口气买了下来。
4. 就在同一时期,GUI成为热门。虽然GUI的本质是对象范型的,但是当时(1980年代中期)的面向对象语言,包括C++语言,还远不成熟,因此最初的GUI系统无一例外是使用C和汇编语言开发的。或者说,最初的GUI开发者硬是用抽象级别更低的语言构造了一个面向对象系统。熟悉Win32 SDK开发的人,应该知道我在说什么。
5. 当时很多人以为,如果C++更成熟些,直接用C++来构造Windows系统会大大地容易。也有人觉得,尽管Windows系统本身使用C写的,但是其面向对象的本质与C++更契合,所以在其基础上包装一个C++的GUI framework一定是轻而易举。可是一动手人们就发现,完全不是那么回事。用C++开发Windows框架难得要死。为什么呢?主要就是Windows系统中的消息机制实际上是动态的,与C++的静态消息机制根本配合不到一起去。在Windows里,你可以向任何一个窗口发送消息,这个窗口自己会在自己的wndproc里来处理这个消息,如果它处理不了,就交给default window/dialog proc去处理。而在C++里,你要向一个窗口发消息,就得确保这个窗口能处理这个消息,或者说,具有合适的类型。这样一来的话,就会导致一个错综复杂的窗口类层次结构,无法实现。而如果你要让所有的窗口类都能处理所有可能的消息,且不论这样在逻辑上就行不通(用户定义的消息怎么处理?),单在实现上就不可接受&&为一个小小的不同就得创造一个新的窗口类,每一个小小的窗口类都要背上一个多达数百项的v-table,而其中可能99%的项都是浪费,不要说在当时,就是在今天,内存数量非常丰富的时候,如果每一个GUI程序都这么搞,用户也吃不消。
6. 实际上C++的静态消息机制还引起了更深严重的问题&&扭曲了人们对面向对象的理解。既然必须要先知道对象的类型,才能向对象发消息,那么&类&这个概念就特别重要了,而对象只不过是类这个模子里造出来的东西,反而不重要。渐渐的,&面向对象编程&变成了&面向类编程&,&面向类编程&变成了&构造类继承树&。放在眼前的鲜活的对象活动不重要了,反而是其背后的静态类型系统成为关键。&封装、继承&这些第二等的特性,喧宾夺主,俨然成了面向对象的要素。每个程序员似乎都要先成为领域专家,然后成为领域分类学专家,然后构造一个完整的继承树,然后才能new出对象,让程序跑起来。正是因为这个过程太漫长,太困难,再加上C++本身的复杂度就很大,所以C++出现这么多年,真正堪称经典的面向对象类库和框架,几乎屈指可数。很多流行的库,比如MFC、iostream,都暴露出不少问题。一般程序员总觉得是自己的水平不够,于是下更大功夫去练剑。殊不知根本上是方向错了,脱离了对象范式的本质,企图用静态分类法来对现实世界建模,去刻画变化万千的动态世界。这么难的事,你水平再高也很难做好。
可以从一个具体的例子来理解这个道理,比如在一个GUI系统里,一个 Push Button 的设计问题。事实上在一个实际的程序里,一个 push button 到底&是不是&一个 button,进而是不是一个 window/widget,并不重要,本质上我根本不关心它是什么,它从属于哪一个类,在继承树里处于什么位置,只要那里有这么一个东西,我可以点它,点完了可以发生相应的效果,就可以了。可是Simula && C++ 所鼓励的面向对象设计风格,非要上来就想清楚,a Push Button&is-a&Button, a Button&is-a&Command-Target Control, a Command-Target Control&is-aControl, a Control&is-a&Window. 把这一圈都想透彻之后,才能 new 一个 Push Button,然后才能让它工作。这就形而上学了,这就脱离实际了。所以很难做好。你看到 MFC 的类继承树,觉得设计者太牛了,能把这些层次概念都想清楚,自己的水平还不够,还得修炼。实际上呢,这个设计是经过数不清的失败和钱磨出来、砸出来的,MFC的前身 Afx 不是就失败了吗?1995年还有一个叫做 Taligent 的大项目,召集了包括 Eric Gamma 在内的一大堆牛人,要用C++做一个一统天下的application framework,最后也以惨败告终,连公司都倒闭了,CEO车祸身亡,牛人们悉数遣散。附带说一下,这个Taligent项目是为了跟NextSTEP和Microsoft Cairo竞争,前者用Objective-C编写,后来发展为Cocoa,后者用传统的Win32 + COM作为基础架构,后来发展为Windows NT。而Objective-C和COM,恰恰就在动态消息分派方面,与C++迥然不同。后面还会谈到。
客观地说,&面向类的设计&并不是没有意义。来源于实践又高于实践的抽象和概念,往往能更有力地把握住现实世界的本质,比如MVC架构,就是这样的有力的抽象。但是这种抽象,应该是来源于长期最佳实践的总结和提高,而不是面对问题时主要的解决思路。过于强调这种抽象,无异于假定程序员各个都是哲学家,具有对现实世界准确而深刻的抽象能力,当然是不符合实际情况的。结果呢,刚学习面向对象没几天的程序员,对眼前鲜活的对象世界视而不见,一个个都煞有介事地去搞哲学冥想,企图越过现实世界,去抽象出其背后本质,当然败得很惨。
其实C++问世之后不久,这个问题就暴露出来了。第一个C++编译器 Cfront 1.0 是单继承,而到了 Cfront 2.0,加入了多继承。为什么?就是因为使用中人们发现逻辑上似乎完美的静态单继承关系,碰到复杂灵活的现实世界,就破绽百出&&蝙蝠是鸟也是兽,水上飞机能飞也能游,它们该如何归类呢?本来这应该促使大家反思继承这个机制本身,但是那个时候全世界陷入继承狂热,于是就开始给继承打补丁,加入多继承,进而加入虚继承,。到了虚继承,明眼人一看便知,这只是一个语法补丁,是为了逃避职责而制造的一块无用的遮羞布,它已经完全已经脱离实践了&&有谁在事前能够判断是否应该对基类进行虚继承呢?
到了1990年代中期,问题已经十分明显。UML中有一个对象活动图,其描述的就是运行时对象之间相互传递消息的模型。1994年Robert C. Martin在《Object-Oriented C++ Design Using Booch Method》中,曾建议面向对象设计从对象活动图入手,而不是从类图入手。而1995年出版的经典作品《Design Patterns》中,建议优先考虑组合而不是继承,这也是尽人皆知的事情。这些迹象表明,在那个时候,面向对象社区里的思想领袖们,已经意识到&面向类的设计&并不好用。只可惜他们的革命精神还不够。
7. 你可能要问,Java 和.NET也是用继承关系组织类库,并进行设计的啊,怎么那么成功呢?这里有三点应该注意。第一,C++的难不仅仅在于其静态结构体系,还有很多源于语言设计上的包袱,比如对C的兼容,比如没有垃圾收集机制,比如对效率的强调,等等。一旦把这些包袱丢掉,设计的难度确实可以大大下降。第二,Java和.NET的核心类库是在C++十几年成功和失败的经验教训基础之上,结合COM体系优点设计实现的,自然要好上一大块。事实上,在Java和.NET核心类库的设计中很多地方,体现的是基于接口的设计,和真正的基于对象的设计。有了这两个主角站台,&面向类的设计&不能喧宾夺主,也能发挥一些好的作用。第三,如后文指出,Java和.NET中分别对C++最大的问题&&缺少对象级别的delegate机制做出了自己的回应,这就大大弥补了原来的问题。
尽管如此,Java还是沾染上了&面向类设计&的癌症,基础类库里就有很多架床叠屋的设计,而J2EE/Java EE当中,这种形而上学的设计也很普遍,所以也引发了好几次轻量化的运动。这方面我并不是太懂,可能需要真正的Java高手出来现身说法。我对Java的看法以前就讲过&&平台和语言核心非常好,但风气不好,崇尚华丽繁复的设计,装牛逼的人太多。
至于.NET,我听陈榕介绍过,在设计.NET的时候,微软内部对于是否允许继承爆发了非常激烈的争论。很多资深高人都强烈反对继承。至于最后引入继承,很大程度上是营销需要压倒了技术理性。尽管如此,由于有COM的基础,又实现了非常彻底的delegate,所以 .NET 的设计水平还是很高的。它的主要问题不在这,在于太急于求胜,更新速度太快,基础不牢。当然,根本问题还是微软没有能够在Web和Mobile领域里占到多大的优势,也就使得.NET没有用武之地。
8. COM。COM的要义是,软件是由COM Components组成,components之间彼此通过接口相互通讯。这是否让你回想起本文开篇所提出的对象范型的两个基本原则?有趣的是,在COM的术语里,&COM Component & 与&object &通假,这就使COM的心思昭然若揭了。Don Box在Essential COM里开篇就说,COM是更好的C++,事实上就是告诉大家,形而上学的&面向类设计&不好使,还是回到对象吧。
用COM开发的时候,一个组件&是什么&不重要,它具有什么接口,也就是说,能够对它发什么消息,才是重要的。你可以用IUnknown::QueryInterface问组件能对哪一组消息作出反应。向组件分派消息也不一定要被绑定在方法调用上,如果实现了 IDispatch,还可以实现&自动化&调用,也就是COM术语里的 Automation,而通过 列集(mashal),可以跨进程、跨网络向另一组件发送消息,通过 moniker,可以在分布式系统里定位和发现组件。如果你抱着&对象&&消息&的观念去看COM的设计,就会意识到,整个COM体系就是用规范如何做对象,如何发消息的。或者更直白一点,COM就是用C/C++硬是模拟出一个Smalltalk。而且COM的概念世界里没有继承,就其纯洁性而言,比Smalltalk还Smalltalk。在对象泛型上,COM达到了一个高峰,领先于那个时代,甚至于比它的继任.NET还要纯洁。
COM的主要问题是它的学习难度和安全问题,而且,它过于追求纯洁性,完全放弃了&面向类设计& 的机制,显得有点过。
9. 好像有点扯远了,其实还是在说正事。上面说到由于C++的静态消息机制,导致了形而上学的&面向类的设计&,祸害无穷。但实际上,C++是有一个补救机会的,那就是实现对象级别的delegate机制。学过.NET的人,一听delegate这个词就知道是什么意思,但Java里没有对应机制。在C++的术语体系里,所谓对象级别delegate,就是一个对象回调机制。通过delegate,一个对象A可以把一个特定工作,比如处理用户的鼠标事件,委托给另一个对象B的一个方法来完成。A不必知道B的名字,也不用知道它的类型,甚至都不需要知道B的存在,只要求B对象具有一个签名正确的方法,就可以通过delegate把工作交给B的这个方法来执行。在C语言里,这个机制是通过函数指针实现的,所以很自然的,在C++里,我们希望通过指向成员函数的指针来解决类似问题。
然而就在这个问题上,C++让人扼腕痛惜。
《我奋斗了十八年不是为了和你一起喝咖啡》
&3年前,麦子的一篇《我奋斗了18年才和你坐在一起喝咖啡》引起多少共鸣,一个农家子弟经过18年的奋斗,才取得和大都会里的同龄人平起平坐的权利,一代人的真实写照。然而,3年过去,我恍然发觉,他言之过早。18年又如何?再丰盛的年华叠加,我仍不能和你坐在一起喝咖啡。&
那年我25,无数个夙兴夜寐,换来一个硕士学位,额上的抬头纹分外明显,脚下却半步也不敢停歇。如果不想让户口打回原籍,子子孙孙无穷匮,得赶紧地找份留京工作。你呢?你不着急,魔兽世界和红色警报?早玩腻了!你野心勃勃地筹划着&创业创业&。当时李彦宏、陈天桥、周云帆,牛人们还没有横空出世,百度、Google、完美时空更是遥远的名词,可青春所向披靡不可一世,你在校园里建起配送网站,大张旗鼓地招兵买马,大小媒体的记者蜂拥而至。334寝室很快在全楼名噪一时,小姑娘们从天南地北寄来粉粉的信纸,仰慕地写道:&从报上得知你的精彩故事&&&得空,爬上楼顶吹吹风,你眉飞色舞地转向我,以照顾自己人的口气说,兄弟,一起发财如何?&&好呀,可惜,我不能。创业于你,是可进可退可攻可守的棋,启动资金有三姑六眷帮忙筹集,就算铩羽而归,父母那三室一厅、温暖的灶台也永不落空。失败于我,意味着覆水难收一败涂地,每年夏天,为了节省三五百块钱的机器钱,爹娘要扛着腰肌劳损在大日头下收割5亩农田。我穿着借来的西服完成了第一次面试,戴着借来的手表与心爱的女孩进行了第一次约会。当你拿到了第一笔投资兴奋地报告全班时,我冷静地穿越大半个北京城,去做最后一份家教。没错,&这活儿技术含量忒低&,但在第一个月工资下发前,我租来的立锥之地与口粮全靠它维持。&&不多久,互联网就遭遇了寒流,你也对创业意兴阑珊,进了家国有性质的通信公司,我被一家外企聘用。坐井观天的我,竟傻傻地以为扳回了一局。明面上的工资,我比你超出一截,税后8000,出差住5星级宾馆,一年带薪休假10天。玩命一样地投入工作,坚信几年后也有个童话般的结尾,&和公主过上幸福的生活&。&&好景不长,很快,我明白了为什么大家说白领是句骂人的话。写字楼的套餐,标价35,几乎没人搭理它。午餐时间,最抢手的是各层拐角处的微波炉,&白领&们端着带来的便当,排起了长长的队伍。后来,物业允许快餐公司入住,又出现了&千人排队等丽华&的盛况。这些月入近万的人士节约到抠门的程度。一位同事,10块钱的感冒药都找保险公司理赔;另一位,在脏乱差的火车站耗上3个小时,为的是18:00后返程能多得150元的晚餐补助。&&这幕幕喜剧未能令我发笑,我读得懂,每个数字后都凝结着加班加点与忍气吞声;俯首帖耳被老板盘剥,为的是一平米一平米构筑起自己的小窝。白手起家的过程艰辛而漫长,整整3年,我没休过一次长假没吃过一回鸭脖子;听到&华为25岁员工胡新宇过劳死&的新闻,也半点儿不觉得惊讶,以血汗、青春换银子的现象在这个行业太普遍了。下次,当你在上地看见一群人穿着西装革履拎着IBM笔记本奋力挤上4毛钱的公交车,千万别奇怪,我们就是一群IT民工。&惟一让人欣慰的是,我们离理想中的目标一步步靠近。&突如其来地,你的喜讯从天而降:邀请大家周末去新居暖暖房。怎么可能?你竟比我快?可豁亮的100多平方米、红苹果家具、37寸液晶大彩电无可质疑地摆在眼前。你轻描淡写地说,老头子给了10万,她家里也给了10万,老催着我们结婚&&回家的路上,女朋友郁郁不说话,她和我一样,来自无名的山城。我揽过她的肩膀,鼓励她也是鼓励自己,没关系,我们拿时间换空间。&&蜜月你在香港过的,轻而易举地花掉了半年的工资,回来说,意思不大,不像TVB电视里拍的那样美轮美奂;我的婚礼,在家乡的土路、乡亲的围观中巡游,在低矮昏暗的老房子里拜了天地,在寒冷的土炕上与爱人相拥入眠。幸运的是,多年后黯淡的图景化作妻子博客里光芒四射的图画,她回味:&有爱的地方,就有天堂。&&&我们都想给深爱的女孩以天堂,天堂的含义却迥然不同。你的老婆当上了全职太太,每天用电驴下载《老友记》和《越狱》;我也想这么来着,老婆不同意,你养我,谁养我爸妈?不忍心让你一个人养7个人。当你的女孩敷着倩碧面膜舒服地翘起脚,我的女孩却在人海中顽强地搏杀。&&两个人赚钱的速度快得多。到2004年年底,我们也攒到了人生中第一个10万,谁知中国的楼市在此时被魔鬼唤醒,海啸般狂飙突进,摧毁一切渺小虚弱的个体。2005年3月,首付还够买西四环的郦城,到7月,只能去南城扫楼了。我们的积蓄本来能买90平方米的两居来着,9月中旬,仅仅过去2个月,只够买80多平。&&没学过经济学原理?没关系。生活生动地阐释了什么叫资产泡沫与流动性泛滥。这时专家跳出来发言了,&北京房价应该降30%,上海房价应该降40%。&要不,再等等?我险些栖身于温吞的空方阵营,是你站出来指点迷津:赶快买,房价还会涨。买房的消息传回老家,爹娘一个劲儿地唏嘘:抵得上俺们忙活半年。在他们看来,7500元一平方米是不可思议的天价。3年后的2008,师弟们纷纷感叹,你赚大发了,四环内均价1万4,已无楼可买。&&几天前,我看见了水木上一句留言,颇为感慨:&工作5年还没买房真活该,2003年正是楼市低迷与萧条之时。等到今天,踏空的不仅是黄金楼市,更是整个人生。&&真要感谢你,在我不知理财为何物之时,你早早地告诉我什么叫消费什么叫投资。&并非所有人都拥有前瞻的眼光和投资的观念。许多和我一样来自小地方、只知埋头苦干的兄弟们,太过关注脚下的麦田,以至于错过一片璀璨的星空。你的理论是,赚钱是为了花,只有在流通中才能增值,买到喜爱的商品,让生活心旷神怡。而我的农民兄弟&&这里特指是出身农家毕业后留在大城市的兄弟,习惯于把人民币紧紧地捏在手中。存折数字的增长让他们痴迷。该买房时,他们在租房;该还贷时,他们宁可忍受7%的贷款利率,也要存上5年的定期。辛苦赚来的银子在等待中缩水贬值。他们往往在房价的巅峰处,无可奈何地接下最后一棒;也曾天真地许愿,赚够100万就回家买房。可等到那一天真的到来,老家的房价,二线、三线城市甚至乡镇的都已疯长。&&这便是我和你的最大差别,根深蒂固的分歧、不可逾越的鸿沟也在于此。我曾经以为,学位、薪水、公司名气一样了,我们的人生便一样了。事实上,差别不体现在显而易见的符号上,而是体现在世世代代的传承里,体现在血液里,体现在头脑中。18年的积累,家庭出身、生活方式、财务观念,造就了那样一个你,也造就了这样一个我,造就了你的疏狂佻达与我的保守持重。当我还清贷款时,你买了第二套住房;上证指数6000点,当我好容易试水成为股民,你清仓离场,转投金市;我每月寄1000元回去,承担起赡养父母的责任,你笑嘻嘻地说,养老,我不啃老就不错了;当我思考着要不要生孩子、养孩子的成本会在多大程度上折损生活品质时,4个老人已出钱出力帮你抚养起独二代;黄金周去一趟九寨沟挺好的了,你不满足,你说德国太拘谨美国太随意法国才是你向往的时尚之都&&&&我的故事,是一代&移民&的真实写照&&迫不得已离乡背井,祖国幅员辽阔,我却像候鸟一样辗转迁徙,择木而栖。现行的社会体制,注定了大城市拥有更丰富的教育资源、医疗资源、生活便利。即便取得了一纸户口,跻身融入的过程依然是充满煎熬,5年、10年乃至更长时间的奋斗才获得土著们唾手可得的一切。曾经愤慨过,追寻过,如今,却学会了不再抱怨,在一个又一个缝隙间心平气和。差距固然存在,但并不令人遗憾,正是差距和为弥补差距所付出的努力,加强了生命的张力,使其更有层次更加多元。可以想见的未来是,有一天我们的后代会相聚于迪斯&尼(这点自信我还是有的),讲起父亲的故事,我的那一个,虽然不一定更精致更华彩,无疑曲折有趣得多。那个故事,关于独立、勇气、绝地反弹、起死回生,我给不起儿子名车豪宅,却能给他一个不断成长的心灵。我要跟他说,无论贫穷富贵,百万家资或颠沛流离,都要一样地从容豁达。&至此,喝不喝咖啡又有什么打紧呢?生活姿态的优雅与否,不取决于你所坐的位置、所持的器皿、所付的茶资。它取决于你品茗的态度。&我奋斗了18年,不是为了和你一起喝咖啡。
他破解了iPhone和PS3 引发了黑客战争
2007年夏季,世界上的第一台iPhone闪亮登场。但在它问世没多久后,就被天才小子&&乔治&霍兹(George Hotz)破解了。苹果公司在发布iPhone的时候,是以AT&T合约机的形式发布的,也就是说iPhone的用户只能使用AT&T公司的网络服务,而霍兹是T-mobile的用户,他想对手上的iPhone进行改装,让其也能够在T-mobile的网络下使用。没有什么能够难倒我们的天才破解。
每个黑客要面临的最基本问题都一样&&如何让机器运行根本就不该它运行的功能。霍兹认为,破解的核心在于让硬件能够接收到你的指令,并按接收到的指令去做,这有点像是催眠。几周后,他找到了基本的思路。凭借着一把螺丝刀和一个吉他拨片,霍兹撬开了iPhone,找到了自己要找的东西&&基带处理器。正是这小小的黑色塑料片,决定了iPhone只能在AT&T的网络下工作。霍兹在基带处理器上焊进一条线,附上电压,扰乱了它的编码,实现了操控iPhone的目的。之后他为这台破解机写了一个程序,使其能够在任何运营商的网络下使用。次日一早,霍兹就迫不及待地用摄像机记录下了自己的&新闻发布会&,并把视频发送到Youtube上。这段展示全球首台破解版iPhone的视频很快就吸引了200万的访问量。霍兹也因此一举成名,成为&青年才俊击败苹果帝国&的知名黑客。马上,他通过网络将自制的破解iPhone进行拍卖,换得了一辆Nissan 350Z跑车和3台新iPhone。在之后接受CNBC电视台采访时霍兹表示:&可以的话我想和乔布斯面对面聊一聊&。当然他没有得到这个机会,乔布斯在面对记者采访时说:&这好比一个猫抓老鼠的游戏,他们想方设法地破解,我们就想方设法阻止他们。&苹果和AT&T则表示沉默。破解手机在美国是合法的,但有可能涉及到版权问题。因为很多运营商在售卖手机时事实上是赔本的,而利润要依靠于一些收费软件和用户每月的话费。不过同为苹果创建者的沃兹尼亚克(Steve Wozniak)给霍兹寄了一封贺信,对他的行为表示了赞赏。大概因为沃兹尼亚克年轻时也是黑客吧。在上世纪七十年代,他折腾出了一套可以免费打电话的黑客系统。他用这个系统冒充国务卿亨利&基辛格(Henry Kissinger)打电话给梵蒂冈教廷,想给自己谋一个主教当当。在破解了iPhone,惹得一片掌声之后,霍兹找到了自己的下一个目标&&江湖上号称铜墙铁壁坚不可摧,傲立三年未遭破解的,索尼旗舰之作PlayStation 3。日,霍兹在自己的博客中写下一句话:&是时候了。&
乔治&霍兹的成名正是源于破解iPhone
天才少年的一个侧面黑客这个词最初出现时,指的是那些研究机器机械的技术帝。他们不会做太过分的事,最多就是弄出些恶作剧。随着时间的推进,黑客这个词慢慢地变得带有阴暗色彩,人们用它来形容那些窃取银行卡、摧毁公共电力系统的高科技罪犯。不过到了今天,这个词出现了两种截然相反的解释&&&白帽黑客&和&黑帽黑客&。&白帽黑客&指以消灭电脑病毒为己任的技术帝,比如军队里的网络防御专家,&黑帽黑客&指那些以科技手段进行违法犯罪行径的个人。根据美国国土安全部(the Department of Homeland Security)的报导,仅在去年十月到今年三月间美国国内就发生了五万起黑客闯入。
天才小子霍兹自然不是黑帽黑客,他破解的目的在于观测和非恶意的改装。对他来说,破解更像是一种竞技,是一种技术较量。他在5岁就写出了自己的第一套电脑程序,14岁凭借自制的测绘机器人入围英特尔国际科学与工程大奖赛(Intel International Science and Engineering Fair)决赛,高中时期就制作出了科幻读物中才会出现的脑电波控制系统(系统还在初级阶段),2007年又再次入围英特尔国际科学与工程大奖赛决赛。对他来说,破解硬件就像是一种竞技,是他和硬件创造者之间的一种技术较量。《纽约客》的记者在去年六月对霍兹进行了一次采访,霍兹穿着随意,房间里散落着废弃的红牛空罐与其他生活垃圾,厨房中贴满了外卖单。除了三个巨型电脑屏幕外,房间里还有一块教学白板,上面潦草地记载着大量的备忘录和运算公式。&我是天生的黑客,&霍兹对记者说,&我不是因为某种理念而成为黑客,而是因为我无聊。&&这玩意很刺激,破解就是和系统进行较量。我在和硬件原作者进行较量。当破解进入一台电脑系统时,我感觉自己充满了血性。&那天下午霍兹刚入手一台iPad 2,他准备当晚就把它给破解了。&不过我还需要一条连接线。&霍兹与采访记者一同驾车到附近的电子店去采购所需物件。&当时已经是深夜了,&记者回忆道,&我们驾车往回走,车内的音乐隆隆作响。当我们到了一个了空旷的十字入口时正好碰上了红灯。只见霍兹一踩油门一甩方向盘,就从临近的停车位上掠过去了。&霍兹对此的解释是,&我是有道德感的,但别指望我多尊重法律。你看这些操蛋的红灯,简直是浪费时间!都是些白痴在制定法律。&
也许少年黑客只是想展现自己的强大
破解PS3,引发和索尼的冲突霍兹成功破解iPhone后声名鹊起,全世界的破解爱好者们都时不时地给他寄来一些电子设备,希望大神能够将其破解。就在这时,有人给他寄来了一台PlayStation 3,告诉他这至今为止还无人足以破解。霍兹接受了挑战,却遭遇到前所未有的困难。经历了无数次的失败,数周之后霍兹终于写出了一套足有500行的代码,取得了成功。满眼血丝的他把程序命名为芬尼根守灵夜(Finnegans Wake,乔伊斯最后一部长篇小说,内容是有个搬砖工人芬尼根从梯子上跌落,大家都以为他死了,他却活了过来)。PS3被破解的消息发布到网上后,索尼紧急发布了系统补丁,但霍兹没有止步,他继续破解了升级版的PS3,并掌握了PS3中的根密钥(Root Key)。被霍兹完全破解的PS3突破了一切限制,不仅可以卸载原有系统,还可以玩盗版游戏。在朋友的鼓动下,霍兹把PS3的最终越狱教程发到了网上。
与苹果的宽容相反,索尼以违反&联邦反电脑欺诈与滥用法案&(Computer Fraud and Abuse Act)并侵犯了自己的版权为由,将霍兹告上法庭。一石激起千层浪,霍兹的支持者认为他的行为是在捍卫信息自由,索尼不仅愚蠢,而且侵犯了消费者对已购得商品的处置权。而索尼认为,霍兹的行为不仅侵犯了自己的版权,还引出了游戏作弊,对其他消费者也构成了侵犯,他们此举在于捍卫自己与其他消费者的权益。法院支持了索尼的控诉,判决霍兹不得再对索尼的产品进行破解或是传播破解信息,同时索尼还有权监控霍兹在Paypal的账户变动。更重要的是,索尼有权获得越狱视频观看者与下载者的IP地址,这一点引起了众怒。&
黑客团体的介入
&霍兹遭遇索尼起诉的事件引来了全球最有影响力的黑客组织Anonymous的注意。Anonymous是一个全球化的民间匿名组织,其成员公开反对山达基教会(Church of Scientology),也曾因维基解密(Wikileaks)风波对政府网站下手。日,Anonymous向公众发布新闻稿,要求索尼为它的行为付出代价,随后就黑掉了和。他们在YouTube上发布视频,发言人脸带组织的符号&&盖伊&福克斯(Guy Fawkes,企图在国会大厦炸死英王詹姆士一世&火药阴谋&的策划者)的面具,要求索尼放弃一切诉讼,支持对PS3的破解。
网络示威与现实中的示威游行并无大异,一旦有一两个骚动者出现,整个示威人群就会陷入暴动情绪。Anonymous中部分极端分子建立了一个针对索尼的组织&&SonyRecon,在网上发布索尼高管的私人电话号码及家庭住址等信息,组织号召抗议者对索尼工作人员进行人身骚扰。霍兹面对事态如此的走向,表现出了极度的担忧。&我,乔治&霍兹,向来做事光明磊落,从不做违反江湖道义的勾当。对于Anonymous的行为我表示极大的不认可与不赞同,也希望索尼别把这笔账算在我的头上。&在压力的面前,索尼与霍兹达成了和解。索尼放弃对霍兹的一切起诉,而霍兹终身不得涉足索尼产品的技术保护措施。不过双方的和解没有给事态带来任何的和缓,霍兹的支持者对他遭受的任何限制都表现出愤怒与不妥协。抗议者走入索尼的门店进行示威,而黑帽黑客踊跃地组织对索尼进行更大的网络进攻。&&
黑客战争日,索尼(Sony Network Entertainment)的工作人员发现自己的四组服务器被非法入侵了,大约有7700万的用户信息数据被泄露,信息不仅包括了用户密码、生日、邮箱和居住地址等个人信息,还有可能包括了用户的信用卡数据等金融信息。索尼立即关闭相关服务器进行紧急弥补,此举每周造成的损失达到一千万美金。面对这场轰动世界的索尼泄露用户信息事件,Anonymous表示不对此事负责。日,霍兹通过网络对盗取用户信息的黑客发表了谴责。霍兹写道:&创造和探索是美好的,但即便是对待索尼这样的小人,盗窃都是最可耻的行为。你们在给黑客的名字抹黑。&同时,霍兹也感到,正是自己引发了这场风波。5月1日,索尼在线娱乐(Sony Online Entertainment)又被入侵,2400万用户信息被盗。索尼立即召开发布会,众高管在发布会上向公众鞠躬赔罪。祸不单行,又一个黑客团体LulzSec盯上了索尼。LulzSec是Anonymous分裂出的一个小集团,破坏力和行动力不容小视。他们在同年5月30日入侵了美国公共广播公司(PBS)的网站,只因不满PBS对维基解密的创始人朱利安&阿桑奇(Julian Assange)做了负面报导。日,LulzSec用SQL注入的方法入侵索尼电影公司(Sony Picture)服务器,声称盗出了超过百万份的用户密码。事后,他们解释说此次进攻只是为了揭露索尼在安保方面的短腿,并且号召广大黑客到索尼的服务器去&各取所需&(take from them everything)。从此之后,黑客们又陆续对各大公司、组织的服务器发起进攻。在短短的一个夏天里,包括任天堂(Nintendo)、世嘉(Sega)、艺电(Electronic Art)、新闻集团(the News Cooperation)、博思艾伦咨询公司(Booz Allen Hamilton)、北约(NATO)在内的公司组织都遭到了黑客入侵,连Lady Gaga的网络主页也未能幸免。LulzSec宣称他们还攻入了美国中情局(C.I.A)的网站。面对由自己引起的这一切,霍兹表现得很沉稳。&他们最开始只是为了捍卫网络自由,却酿出这片腥风血雨。&在谈起黑客时,他继续说道,&我认为黑客只是一群有着电脑技术的人,而技术是无罪的。&
&日,美国官方对六名黑客提起了诉讼,执法机构透露六名黑客都是Anonymous和LulzSec组织的核心成员,但这六名黑客的被捕并没有敲响警钟,其余组织成员仍坚持将运动进行到底。当问起自己对此事件的感触时,霍兹表示自己已经退隐江湖了,不再想对这些事做出道义上的评断,不过他也提出,如果从技术上看,他们还是不够老道,否则也不会锒铛入狱。据可靠的消息,索尼在纷争后曾邀请他到美国的总部,请他为PS3的工程师们讲课。霍兹经历了这一切后任职于Facebook,没人知道他确切的工作是什么。记者再次对他进行采访时他说:&Facebook是个好地方,有效率,很年轻。不过我可能不会做太久。&没有人知道他之后会去做什么,但他表示不会再把破解信息发布在网络上,&在这点上我已经毕业了。&他笑笑说道。
Linux程序在内存中的组织
原文:今天调龙芯模拟器,发现里面有个ld_brk_point,一直不知道是啥东西,后来搜了下,发现就是malloc函数申请空间的起始地址。改值可以通过brk()以及sbrk函数设置。为了说清楚这个问题,有必要先了解下Linux下程序运行时(进程)在内存中的组织。
linux Flexible Address Space Layout如上图,总体来说,对于32位的linux程序,总共可访问的地址空间为4G,但是由于有1G预留给了内核,因此用户程序空间才3G,而这3G空间(实际程序用到的空间一般小于这个值),又分为代码段(Text segment),常量数据段(Data segment),BSS段(BSS segment)以及堆栈段,一般来说,各段存储的数据如下:
代码段(Text segment):程序的二进制代码,一般来说,程序PC的范围就在这段(执行动态链接库代码例外)。
常量数据段(Data segment):存储常量数据(初始化好了的全局变量以及静态变量),如常量字符串,一般全局常量都放在此处,但是局部常量分配和编译器相关。
BSS段(BSS segment):存储未初始化的静态变量等。以上程序段,都是通过操作系统的load程序在程序加载时分配的,不会动态管理。下面的堆栈段就需要动态管理了。
堆(Heap),这些内存由操作系统的提供的malloc等系统调用管理。其中就会用到brk以及sbrk这些函数,来设置新空间分配的起始地址,堆一般比较大,地址向上增长。
栈(Stack),这些空间一般由用户程序自行管理,如函数调用中传参以及返回值就需要用到该段,地址向下增长。假如堆顶和栈顶地址想撞了,malloc函数申请空间就会失败(一般来说,malloc申请空间时,回比较ld_brk_point和栈顶指针sp的值)。至于brk以及sbrk的用法,由于资料二说得比较清楚,在此不在赘述。参考资料:
图片来源:
程序员面试、算法研究、编程艺术、红黑树4大系列集锦与总结
作者:July--结构之法算法之道blog之博主。&时间:2010年10月-2011年6月。&出处:。&声明:版权所有,侵犯必究。
前言&开博已过8个月,回首这8个月,发现自己在本blog上着实花费了巨大的时间与精力,写的东西可能也够几本书的内容了。希望我真真正正的为读者提供了实实在在的价值与帮助。
无私分享,造福天下&以下是本blog内的微软面试100题系列,经典算法研究系列,程序员编程艺术系列,红黑树系列4大经典原创系列作品与一些重要文章的集锦。有任何问题,欢迎不吝指正。&
一、微软面试100题系列
&(在此文中,你能找到与微软100题所有一切相关的东西)
&(微软面试完整100题2010版)
&(微软100题第二版前60题)
&(微软100题第二版第61-70题)
&(十道海量数据处理面试题)
&(十七道海量数据处理面试题)
(2011年度九月最新面试三十题)
(2011年度十月最新面试七十题)
四、红黑树系列
五、其它重要文章节选
&(02.08)
后记&世上本无路,走的人多了,也就成了路。世上本无免费的午餐,分享的人多了,也就造就了开源的辉煌。至此,本blog已是一个阶段性终结。不过,本blog永久更新,永久勘误。如果你发现了本blog中的任何一个错误,漏洞,bug,和问题,请一定不吝指正,本人感激不尽。有任何问题,也可随时联系我。本人邮箱,。(你可以永久在百度或谷歌中搜索本博客名称的前4个字,即:&结构之法& 这4个关键字,进入本博客)最后,感谢CSDN,感谢编程艺术室的所有朋友,感谢所有一直以来关注本blog的所有朋友。谢谢大家,谢谢各位。谢谢。
很好,很强大&&转自&
shell笔记(命令部分)
find ~/ -name "*.txt" -exec ls -l {} \;&&&&&&& #从用户的home目录中写出所有txt文件的详细信息
&ls *.gz |xargs gzip -d&&&&&&&&&& & & & && #解压所有的压缩文件&
LRFDATE=`expr "$LRFDATE" : '[[:space:]]*\(.*\)[[:space:]]*$'`&& #去掉字符串前后的空白x=1234zipper4321
expr length $x & & && #字符串x的长度14
expr index $x 23 & && #c字符串在x字符串的下标2
expr substr $x 2 6&&&&& #在x字符串取2~6
expr match $a '[0-9]*' & & #在x字符串开始的数字数目
expr mathc $a '\([0-9]*\)'&&&& #在字符串x前端的数目
&在expr 中可以使用:来代替match
expr $a : '[0-9]*'&&&&& #在x字符串开始的数字数目
expr $a : '\(....\)'&&&&&& # x字符串的前4个字符
expr $a : '.*\(....\)'&&&& #x字符串的最后4个字符
date +%k%M&& &&& &&& &#使用24小时的格式来显示当前的小时书和分数 date +%j && &&& &&& &#显示今天是本年度的第几天 date --date='6 days ago'&& &#6天前 date --date='1 month ago' &&& &#4周前 date --date='1 year ago'&& &#1年前
expand命令将会把每个tab转化为一个空格. 这个命令经常用在管道中. unexpand命令将会把每个空格转化为一个tab. 效果与expand命令相反.
awk中使用的print $N 命令很相似,在脚本中使用cut命令会比使用awk命令来得容易一些. 最重要的选项就是 -d (字段定界符)和 -f (域分隔符)选项. cut -d ' ' -f1,2 /etc/mtab&&&& #获得所有mount上的文件系统的列表:
head -c4 /dev/urandom | od -N4 -tu4 | sed -ne '1s/.* //p'&&&&& #产生十进制随机数
script -f screen.log&& #记录终端的输出,用exit退出
factor 12344&& #把一个数分解为质数
bc是An arbitrary precision calculator language,即一个任意精度的计算语言,注意是一种语言。
scale=2;3/4&& #scale表示小数位数。
echo "scale=7;355/113"|bc&& #使用管道的方式
bc的另一种常见的用法是进制转换,
echo "ibase=16; FFFF" | bc&&& #65535
echo "obase=16; 1000" | bc&&& #3E8
这些工具用来生成一系列整数, 用户可以指定生成范围, -s后面可以设定分割符
seq -s: 6&&&&& #1:2:3:4:5:6
exec&&&&&&&
这个shell内建命令将使用一个特定的命令来取代当前进程. 一般的当shell遇到一个命令, 它会forks off一个子进程来真正的运行命令. 使用exec内建命令, shell就不会fork了, 并且命令的执行将会替换掉当前shell. 因此, 在脚本中使用时, 一旦exec所执行的命令执行完毕, 那么它就会强制退出脚本exec命令还能够用来重新分配文件描述符. 比如, exec &zzz-file将会用zzz-file来代替stdin
caller&&&&&&
将caller命令放到函数中, 将会在stdout 上打印出函数的调用者信息
【算法】文科生终于可以被消灭了
你羡慕那些出口就会吟诗的文人吗?现在可以不用再羡慕他们了!因为一位网友&yixuan&闲来无事,把《全宋词》拿出来&捣鼓&,算出了其中的99个高频词汇。熟记这些高频词,你就可以随性所欲进行创作了!你还可以用&无序&的数字来创造一首&美妙绝伦&的宋词,圆周率也可以哦!
简化宋词就是&东风何处在人间& &&
署名为&yixuan&的网友在个人博客里写道:&突然想看看宋词里面什么样的意象是最常见的,比如可以做个频率分析什么的。当然文本挖掘需要分词,我没法在其中花太多时间,于是想出了一个土办法。宋词的句子都很短,如果穷举可能的字的组合的话并不是太多,况且最常见的词语一般是两三个字,这样可能的组合就更少了。&比如&犹解嫁东风&这句话,可能的二字组合是&犹解&&解嫁&&嫁东&&东风&,三字组合是&犹解嫁&&解嫁东&&嫁东风&,词的字数越多,可能的组合就越少。如果把每句话可能的字的组合都列举出来,就可以整体统计频率了。&大家一致分析这位网友一定是个理科生。
随后, &yixuan&贴出了他算出来的高频词,排在前面的分别是:
1、1485&2、东风(1382)3、何处(1230)4、人间(1202)5、风流(857)&6、归去(812)7、春风(802)8、西风(779)9、归来(771)10、江南(765)&&
至于为什么第一名是数字,他解释:&排在第一的是无效字符,这跟数据源有关。&
这个结果一出来,一位网友就一语道破了&玄机&,&原来,最流行的宋词就是&东风何处在人间&啊!&&
生日、手机号 随意组合都很美&
还有更绝的呢!署名为&达芬奇的鸡蛋&的果壳网友不知怎么地,就想到了拿大家都会背一点的圆周率进行创作,两个数字一断,对照高频词表,一首&华丽丽&的词就出来了!还附上了说明,特别像模像样。
达芬奇的鸡蛋 @ 果壳
清平乐&圆周率&
回首明月(一看就是抒情诗)14 15悠悠心事空(果然,貌似失恋了)92 65西湖何事寂寞中(触景生情)35 89 79风吹斜阳匆匆(回忆那天下午的艳遇)32 38 46
芳草平生斜阳(平生见过最美的太阳和芳草,都是因为那里有你的身影)26 43 38风吹寂寞今日(到现在就剩我自己)32 79 50一枝富贵年年(好花美丽年年开,好景宜人不常在)28 84 19断肠长安不知(我的思念远方的你可知道?)71 69 39
如梦令&根号二&
深处时节千里(过了许多年,男猪脚来到了很遥远的地方)41 42 13消息当年鸳鸯(这。。找老相好去了?)56 23 73归来今日(妹子,我胡汉三回来啦)09 50一点无情多少(你还知道来看我啊!)48 80 16今夜,今夜(要出问题了。。。)88 88而今时节归来(仿佛重回当年,男猪脚依然那么坚挺)72 42 09
看完这首诗,网友们一边膜拜,一边自己的创作灵感也被打开了。
&丘寒&留言道:&试着用某个号码创作了一首:天上相思,芳草年年,昨夜江南,回首一笑多情。&&零Ronnie&很有创作激情:&我的生日:年年江上,江南春风;我的手机号:明月芳草去年,江南阑干归去&&还真挺上口的!我也能做诗人了哈哈!&&
理科生欢呼:消灭文科生的日子来了&
可是这么一来,文科生又不淡定了,一群文科生跳起来反击。
&雯名霞迩&大叫:&统统拖出去,斩了!这让学中文的人情何以堪啊!&&Rockfish&代表理科生还击:&理科宅男们消灭文科生的日子到来了!拿起你的计算器,消灭文艺青年吧!&&可可&童鞋呼唤:&就让科技小清新来得更猛烈些吧!& &
还有一群网友七嘴八舌讨论着。
&沌世界&淡定地说:&不知宋词的粉丝看了是不是有一种偶像破灭的感觉。&&家杰仕&童鞋也总结道:&文艺男女已经阻止不了技术宅作诗了!&网友&Rakin&点评:&理科生文艺得真凶猛!&&焰心Spring&呼吁:&想文艺一回的同学请转!&&ChanIm&表示:&当时学写诗的时候超鄙视这些,现在淡定了,因为没那么多愁善感了。&&思念的秋天&感慨:&穿越必备!&&NetCharm&说:&背熟了,随便组合一下,写出来的也不会太烂。&&huahualipo&童鞋还提出了意见:&高人,能不能把平仄也加上&&如果平仄太困难,至少考虑一下词尾押韵如何?韵脚也就十来个,每个都分配一个数值,然后每隔一行,末尾的词就只从一个值下选。这样会大大增加仿真度啊!&&再次神经短路,突然想看看宋词里面什么样的意象是最常见的,比如可以做个频率分析什么的。当然文本挖掘需要分词,我没法在其中花太多时间,于是想出了一个土办法。宋词的句子都很短,如果穷举可能的字的组合的话并不是太多,况且最常见的词语一般是两三个字,这样可能的组合就更少了。比如&犹解嫁东风&这句话,可能的二字组合是&犹解&&解嫁&&嫁东&&东风&,三字组合是&犹解嫁&&解嫁东&&嫁东风&,词的字数越多,可能的组合就越少。如果把每句话可能的字的组合都列举出来,就可以整体统计频率了。&当然里面会有很多无意义的字的组合,不过这类&词语&本身的出现就是一个偶然,所以可以预期的是它们整体的频数会很低,是入不了&大雅之堂&的。话不多说,直接上代码和结果。
数据:《全宋词》文本代码:l=scan("Ci.txt","character",sep="\n");l.len=nchar(l);# 某些行是作者和标题,所以选取长度大于10的行;# 另外这个文本文件不太规整,有些网址什么的,# 所以也要排除那些长度太长的。ci=l;# 句子用标点符号分割。sentences=strsplit(ci,",|。|!|?|、");sentences=unlist(sentences);sentences=sentences[sentences!=""];s.len=nchar(sentences);# 单句太长了说明有可能是错误的字符,去除掉。sentences=sentences[s.len&=10];s.len=nchar(sentences);# 暴力挨个拆分,比如&犹解嫁东风&的所有二字组合为# &犹解&&解嫁&&嫁东&&东风&,# 无意义的词其频数自然就落在后面了。splitwords=function(x,x.len) substring(x,1:(x.len-1),2:x.len);words=mapply(splitwords,sentences,s.len,SIMPLIFY=TRUE,USE.NAMES=FALSE);words=unlist(words);words.freq=table(words);words.freq=sort(words.freq,decreasing=TRUE);data.frame(Word=names(words.freq[1:100]),Freq=as.integer(words.freq[1:100]));
结果(排在第一的是无效字符,这跟数据源有关):Word Freq1 1485  2 东风 1382  3 何处 1230  4 人间 12025 风流 857  6 归去 812  7 春风 802  8 西风 7799 归来 771  10 江南 765  11 相思 753  12 梅花 73213 千里 676  14 回首 656  15 明月 651  16 多少 64817 如今 642  18 阑干 630  19 年年 613  20 万里 59021 一笑 582  22 黄昏 550  23 当年 542  24 天涯 53725 相逢 528  26 芳草 527  27 尊前 516  28 一枝 51229 风雨 505  30 流水 472  31 依旧 472  32 风吹 47133 风月 461  34 多情 457  35 故人 451  36 当时 45037 无人 445  38 斜阳 438  39 不知 430  40 不见 42941 深处 422  42 时节 403  43 平生 398  44 凄凉 39845 春色 394  46 匆匆 383  47 功名 383  48 一点 37849 无限 377  50 今日 369  51 天上 368  52 杨柳 36253 西湖 356  54 桃花 354  55 扁舟 353  56 消息 35157 憔悴 344  58 何事 339  59 芙蓉 338  60 神仙 33461 一片 334  62 桃李 333  63 人生 332  64 十分 33165 心事 329  66 黄花 328  67 一声 325  68 佳人 32469 长安 321  70 东君 319  71 断肠 316  72 而今 31573 鸳鸯 314  74 为谁 313  75 十年 310  76 去年 30977 少年 308  78 海棠 307  79 寂寞 306  80 无情 30681 不是 305  82 时候 304  83 肠断 303  84 富贵 30385 蓬莱 303  86 昨夜 303  87 行人 302  88 今夜 30189 谁知 300  90 不似 299  91 江上 298  92 悠悠 29693 几度 295  94 青山 295  95 何时 294  96 天气 29397 惟有 293  98 一曲 291  99 月明 291  100 往事 290不知各位看官看到上面这些既熟悉又悠远的话语又将作何感想?或许,她们就是我们千百年来的精神寄托吧。&试了下在R下面执行此代码, 不过在我机子上好像有问题. 于是按照这个思路用KNIME做了个简单统计流程. (数据源相同)因为多处理了一点异常, 双字词频顺序基本一样, 数量稍有区别, 不重复贴了. 不过可以贴出短句句频:D"到如今",50  "君知否",46  "谁知道",30  "功名事",28"须信道",28  "最好是",27  "人间世",26  "从今去",26"凝伫",25  "归去",24  "不如归去",23  "知否",23"谁信道",23  "倚阑干",21  "到而今",21  "又还是",21"归去来兮",21  "人不见",20  "当此际",20  "记当年",19"东风里",18  "怎奈向",18  "春去也",18  "须知道",18"争知道",17  "更那堪",17  "留不住",17  "谩赢得",17"那堪更",17  "一觞一咏",16  "休休",16  "君不见",16"家山好",16  "归来也",16  "思往事",16  "悠悠",16"无绪",16  "还知否",16  "追往事",16  "人间天上",15"最苦是",14  "疏影横斜",14  "空怅望",14  "空惆怅",14"记年时",14  "人间事",13  "又只恐",13  "回首处",13"夜沈沈",13  "断人肠",13  "早归来",13  "有多少",13"空凝伫",13  "向尊前",12  "微雨过",12  "情脉脉",12"斜阳外",12  "无语",12  "月明中",12  "朱颜绿鬓",12"绿鬓朱颜",12  "谁念我",12  "还知么",12  "问何如",12"不堪回首",11  "东风恶",11  "人何处",11  "人正在",11"今老矣",11  "从别后",11  "倚东风",11  "又何须",11"多少事",11  "天长地久",11  "安阳好",11  "对东风",11"对西风",11  "广寒宫殿",11  "归去也",11  "归来晚",11"愿年年",11  "江南岸",11  "空回首",11  "终不似",11"肠断",11  "肠断处",11  "落花飞絮",11  "西源好",11"阑干外",11  "风流",11  "飕飕",11  "与谁同",10"五云深处",10  "人间何处难忘酒",10  "人静",10  "从此去",10"倚西风",10  "分明是",10  "功名富贵",10  "南徐好",10"岁岁年年",10  "思晴好",10  "想当年",10  "无限事",10"朝朝暮暮",10  "歌窈窕",10  "独自个",10  "竹篱茅舍",10"纶巾羽扇",10  "良辰美景",10  "记当时",10  "诗曰",10"醉归来",10  "七十古来稀",9  "人如玉",9  "人尽道",9"何处",9  "凝望处",9  "千古恨",9  "千秋岁",9"去年今日",9  "向此际",9  "坐中客",9  "天赋与",9"好天良夜",9  "年年今日",9  "待归来",9  "愁绝",9"故人何处",9  "明月清风",9  "暗香浮动",9  "曲水流觞",9"浑不似",9  "清绝",9  "盈盈",9  "空肠断",9"空赢得",9  "算人间",9  "算只有",9  "缘底事",9"记当日",9  "还又是",9  "道骨仙风",9  "都付与",9"都休问",9  "酒醒时",9  "问人间",9  "问何时",9"风不定",9  "一声声",8  "不见",8  "二十年",8"人散后",8  "人易老",8  "从今后",8  "休去",8"休辞醉",8  "依然是",8  "几时休",8  "凭阑久",8"去天尺五",8  "又谁知",8  "君且住",8  "吾老矣",8"回首",8  "堪羡",8  "多少恨",8  "夜来风雨",8"天下事",8  "天如水",8  "如何得",8  "嫣然一笑",8"寂寞",8  "山居好",8  "归去来",8  "心下事",8"怎知道",8  "思悠悠",8  "恁时节",8  "悄无人",8"愿岁岁",8  "文章太守",8  "无个事",8  "最关情",8"最好处",8  "有谁知",8  "浮世事",8  "满城风雨",8"玉骨冰肌",8  "画堂深",8  "登临处",8  "看不足",8"真个是",8  "知何处",8  "知音少",8  "称寿处",8"空相忆",8  "笑人间",8  "纱窗外",8  "落花流水",8"长安道",8  "问当年",8  "雨初晴",8  "频回首",8"风又雨",8  "风流云散",8  "一杯酒",7  "一蓑烟雨",7"三千岁",7  "东风外",7  "人去后",7  "人未老",7"人道是",7  "今夜里",7  "但怅望",7  "佳人何处",7"再相逢",7  "冰肌玉骨",7  "净几明窗",7  "凄凉",7"凌波微步",7  "凝望久",7  "千山万水",7  "卷珠帘",7"又何妨",7  "又过了",7  "叹人生",7  "君看取",7"吴头楚尾",7  "地久天长",7  "堪恨处",7  "堪爱处",7"多应是",7  "夜将阑",7  "天付与",7  "天寒日暮",7"如今憔悴",7  "山无数",7  "帘栊静",7  "广寒宫里",7"待明朝",7  "忆当年",7  "急管繁弦",7  "恨悠悠",7"憔悴",7  "携手处",7  "无一事",7  "暗香疏影",7"最难忘",7  "月明风细",7  "有个人人",7  "水悠悠",7"江南春早",7  "深院宇",7  "深院静",7  "清风明月",7"画图中",7  "留恋",7  "留春不住",7  "相逢",7"相逢处",7  "看明年",7  "算惟有",7  "经行处",7"绮罗丛里",7  "缓带轻裘",7  "肠欲断",7  "自别后",7"莫匆匆",7  "行乐处",7  "许多愁",7  "试与问",7"试屈指",7  "谈笑里",7  "谩回首",7  "还知道",7"送君南浦",7  "都不管",7  "都莫问",7  "酒巡未止",7"采菱拾翠",7  "长亭路",7  "问谁是",7  "难忘处",7"非烟非雾",7  "风前月下",7  "黯销魂",7  "一叶扁舟",6"一年一度",6  "一杯相属",6  "一枝枝",6  "一轮明月",6"下缺",6  "不知今夕何夕",6  "东风起",6  "举杯相属",6"之句",6  "人似玉",6  "人别后",6  "人生行乐",6"人都道",6  "人间",6  "今夕何夕",6  "仙风道骨",6"似当年",6  "但回首",6  "但赢得",6  "佳丽地",6"依前是",6  "依然",6  "便从今",6  "便直饶",6"凝眸",6  "几番风雨",6  "凭谁说",6  "凭阑处",6"凭阑干",6  "分付与",6  "分携处",6  "别离情绪",6
哥们儿,神州行,你真行~
尽量每天发点东西完善小站
linux 下的一些超酷的操作
1.如果你的系统是RedHat、Suse的话,切换到tty命令行模式&& init 3,& 切换回xwindow init 5.如果你的系统是Ubuntu等Debian系统就简单多了啊,Ctrl+Alt+F1~F6是tty,Ctrl+Alt+F7切回到窗口模式。这里涉 及到的东西是Linux到runlevel ,如果是RedHat 或SUse的话vi /etc/inittab 你就会看到runlevel相关的内容了,其中有一条是id:5:default,相关的内容你可以看到5表示的是多任务图形界面模式,呵呵,如果改成3 就表示默认开机进入到tty模式了,It is said& Ubuntu 也支持inittab的。嘿嘿,如果改为6呢?(有点邪恶啊)
2.dd 命令大家熟悉不? dd if=/dev/sda1 of=/tmp/tmp.tmp bs=512 count=1 ,OK 接下来 用vim -b /tmp/tmp.tmp 好了,全部是乱码吧,没事,接下来 在vim的命令行模式:%!xxd, 你会看到什么?是不是跟ultraedit很像了啊?是的,vim也是可以编辑二进制文件的,不过要注意只能在左边编辑哦,编辑完成后:%!xxd -r保存为文本,保存退出就OK了。回到前面的文件,将光标移到最后,你看到什么55aa,有没有很熟悉的感觉?明白是干什么用的了吧?还有更邪恶的了 dd if=/dev/zero of=/sda 严重警告:此举很危险,成年人须在未成年人的监护下进行。。。。(你的硬盘就被归零了,上帝也无能为力了)
3. 你可能在别的什么地方听说过&vim是编辑器之神,emacs是神之编辑器&,意思就是vim很强大,emacs很变态。emacs就不清楚了,但是 vim的确很强的啊,至于把vim+gcc+。。。搭建IDE开发环境就不说了,大家可以看我以前的日志(如果我没记错的话),现在给大家介绍一个有意思 的,到vim的官网上下载badapple.vim(网上很火的,有各种形式的)http://www.vim.org/scripts/script.php?script_id=3477,下载后解压,打开vim(最好是在终端,最大化)然后 :so /home/szqh97/game/badapple.vim(路径当然是根据自己的情况了),然后,自己看吧。
4.Linux下有个cal命令,是用来查看日历的,BUT,cal 9 1752, 是不是少了十几天啊,据说是新历变化时的。windows就没有机会看到这个了,why? 不解释。
5. 有没有用firfox的同学啊?其实firefox可以修改为vim形式的哦,就是所有的操作都可以用vim操作的啊。加一个插件 Pentadactyl,再设置一下,很酷的,跟vim一样的操作。(身边很少有人用firefox,就更少有人用Pentadactyl了,我在毕业前 夕才发现原来班上还有一个同学也热衷与此)听说最近vs2010都有vim的插件了,这说明什么?所以大家还是好好熟悉一下vim吧。
6.还有两个小的彩蛋啊,apt-get moo,&& apt-build moo,& 还有sl 不过这三个命令是Ubuntu 下的,不知道其他系统可否。还有终端下浏览网页w3m
很有感觉的,有点telnet bbs的感觉
7.方法:进入你的音乐文件夹执行如下代码: &&& mid3iconv -e GBK *.mp3
然后重新导入rhythmbox,OK!为什么会如此呢?
这里用到了mid3iconv 命令,用mid3iconv --help 显示帮助如下: Mutagen-based replacement the id3iconv utility, which converts ID3 tags from legacy encodings to Unicode and stores them using the ID3v2 format.
Options: --version&&&&&&&&&&&& show program's version number and exit -h, --help&&&&&&&&&&& show this help message and exit -e ENCODING, --encoding=ENCODING &&&&&&&&&&&&&&&&&&&&&&& Specify original tag encoding (default is UTF-8) -p, --dry-run&&&&&&&& Do not actually modify files --force-v1&&&&&&&&&&& Use an ID3v1 tag even if an ID3v2 tag is present --remove-v1&&&&&&&&&& Remove v1 tag after processing the files -q, --quiet&&&&&&&&&& Only output errors -d, --debug&&&&&&&&&& Output updated tags
不用说,这个提示很简单,mid3iconv 命令主要是将原来mp3音乐文件的ID3信息转换成了Unicode并用ID3v2的格式存回文件中。因为原来的mp3音乐文件中存入的信息并不全都是 Unicode格式的,所以才会导致一些播放器的乱码问题。而wma格式的音乐信息并不采用ID3 tags,所以也就没有这样转换的必要。
&8.linux 下载迅雷链接,你可以使用firefox中的Ease Link来修复相关的迅雷链接,但是却不能直接下载一些 thunder://开头的链接,其实这种链接也是一种加密方式,可以破解得到真正的下载地址。echo xxxx |base64 -d,其中xxx部分是Thunder://后面的部分,你就可以看到迅雷链接的真实地址了,就是AAZZ中间的部分。不过,好像是很多都不能下载了,据 说是迅雷支持正版。可恶的迅雷,去他妈的正版,开源啊,
9.平时可能会用到不同进制的转换,其实在shell下可以轻松搞定,闲话少说,直接上代码。szqh97@ubuntu:~$ num=$((0123))szqh97@ubuntu:~$ echo $num83-----------------------------------------------------------------------------------szqh97@ubuntu:~$ num=$((0x123))szqh97@ubuntu:~$ echo $num291第一个是八进制转十进制,第二个是十六进制转十进制还有一种常用的方式szqh97@ubuntu:~$ num=$((30#11))szqh97@ubuntu:~$ echo $num31明白?就是$((n#xx))的形式,其中n是表示多少进制十进制转为其它进制:&这里使用到:bc外部命令完成。bc命令格式转换为:echo "obase=进制;值"|bc
十进制转八进制&
这里使用到:bc外部命令完成。bc命令格式转换为:
echo "obase=进制;值"|bcszqh97@ubuntu:~$ echo "obase=8;100"|bc144
站长在关注}

我要回帖

更多关于 单人小游戏闯关 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信