Thursday, October 28, 2010

Recent debate between 360 and Tencent

There are lots of news about IT of China in the past few days. Some of them may disappear after a short time, but one news is really shocking and hard to be omitted by any netizen in China.

Tencent, the most profitable software company in China, is accused by 360, a antivirus software vendor, that its IM software, QQ, scans user`s computer without permission and notice. At the same time, 360 post a short video, in which an 360 engineer is demonstrating a list of file, which are scanned after QQ is started, by "360 Privacy Protector". In order to enhance the result from "360 Privacy Protector", the engineer also uses some Microsoft tool to prove that the result can be trusted. After this video is released, a storm of privacy security began......

Although Chinese people is very tolerant to hash situation and disparate treatment, they cannot keep silent when their personal information is stolen by a commercial organization. Another reason for causing such severe reaction from netizens is that Tencent is said to be have a very high level cooperation and information sharing with Chinese government. As the government has failed to improve people`s livelihood as they promised and is trying to restrict the internet, Chinese people supposes that any company works for the government is dishonest and cannot be trusted.

However, it cannot be as simple as we guess, a company cannot declare a war with any others without benefits. The above video can be also explained as a challenge from 360 to Tencent, not only the kind concerning of user`s personal information. This point is supported by the blog and twitter posted by Hongyi Zhou, the board chairman of 360. Zhou highly admired the contribution from 360 in protecting internet safety and criticized the improper competition and monopolization, which is obviously aim at Tencent.

Russia To Create 'Windows Rival'...We have "Red flag"

News from OSNews:

"The Russian state plans to revamp its computer services with a Windows rival to reduce its dependence on US giant Microsoft and better monitor computer security, a lawmaker said Wednesday. Moscow will earmark 150 million rubles (3.5 million euros, 4.9 million dollars) to develop a national software system based on the Linux operating system, Russian deputy Ilia Ponomarev told AFP, confirming an earlier report in the Vedomosti daily." Right. I guess this has absolutely nothing to do with this. Want to buy a unicorn?

This news reminds me that there is another Linux modification, or distribution in China, Red Flag Linux. For some security concerning, as same as Russian government, Chinese government supports a couple of universities and relevant companies to develop a Chinese-Full-supported, source code level controlled and Windows-feel operating system. At last, a company, which stems from Chinese Academy of Science, won this competition and receive continuous order from Chinese Government. At the same time, this OS, actually, a distribution, is available to the public, of cause, with charge. After few years, with the patriotic passion cooled down, some scientists and engineers found that Red Flag Linux is quiet similar to Red Hat Linux, such as the installer, which still have many overlaps after many distribution. Red Flag is also challenged by international organizations, such as GNU foundation, and individual open source developers. They claim that Red Flag violates the GNU licences and "copy left"......

Today, the Red Flag is still there, but we have Ubuntu, Fedora, OpenSuse, Debian and so on. As far as I know, none of my friends uses Red Flag or even consider that as an option! However, millions of RMB(¥) had been spent on those projects. I really hope those government support softwares, such as Red Flag, could play a solid role in national security, economic construction and education. Not only a short cut to funding and phenomenon of corruption.

BTW, there is another interest Linux distribution in China, YLMF OS. YLMF are four initials of the pronunciation spell of Chinese "雨林木枫"( Yu Lin Mu Feng), which means "Maple forest in rain". YLMF is the name of that software company, which used to pack and sell piracy Windows. In the past, YLMF had a very large portion of the piracy Windows market, which is said to be the "top 3" and have sold more than 8000000 copies. As the copy right protection in China becomes more and more mature and Microsoft puts more efforts to anti piracy, the traditional business of YLMF have to be shut down. However, those talented and creative guys do not want to give up. Based on Ubuntu, they create a new wrap, everything there is the same as in Windows!!! They call it YLMF OS.

From my point of view, I believe YLMF OS will affect China much more than Red Flag. As Windows used to be cheap, by piracy copy, all Chinese have built a first impression that in a PC`s screen should be a "start". It is a very good opportunity to Microsoft to build up monopolization in China, which is bad without any doubt. Although there have been many scholars and companies found the importance of breaking monopolization and invite other competitors. It is too hard to Chinese netizens to give up Window, which has been with him or her for more than 10 years, and rebuild the familiarity with KDE or Genome. YLMF gives us a solution... Do it step by step and begin with the same UI feeling.

Thursday, September 23, 2010

大侠是怎样练成的 周昆(转载)

转眼之间,我已经在MSRA(微软亚洲研究院)工作了将近六年,回想六年来的研究经历,感触很多。就和练习武功一样,我从一个学徒,到略通精义的武林中人,再到凭借一技所长叱咤一方的的大侠,我在研究院度过了不平凡的六年。

一.2003年:“打哪指哪”与“指哪打哪”

    2002年我加入微软亚洲研究院,刚开始是跟着资深研究员做项目。当时我的老板郭百宁提出了一个很有挑战性的想法:能否用纹理合成技术模拟出豹子皮这样一类的纹理。于是,在实现他这个想法的过程中,我学会了“打哪指哪”的研究方法。

    这个项目的研究过程异常艰苦。在最开始的几个月里,我们尝试了很多种方法,可无论如何,我们做出来的豹子皮都像是假的。直到项目结束期限前的一个月,百宁总结了我们能做出来的最好结果,发现尽管我们不能做出豹子皮这种纹理,但是已经能做出一大类有累进变化的纹理。于是,围绕着这个思路,我们对已经取得的算法和结果进行了整理。最后论文被SIGGRAPH录用,这也是我的第一篇SIGGRAPH论文。

    我在学校里受过的科研训练一般是首先有一个好的想法,接着进行实现,通过写程序和做实验来验证想法是否可行,这种方式可以总结为“指哪打哪”法,就是说目标指向哪里,就打向哪里。可是,我在研究院的第一个项目确教会了另外一种不同的研究门路——“打哪指哪”。比如说百宁给我提供的想法就像一个目标,而需要我想办法把这个目标击中。可是,由于我的知识和研究实力等方面的限制或者本身这个想法就不是很成熟,极有可能这个目标在当时的情况下是实现不了的。可是,就在这个做不出来的过程中,你有可能做出一些科研环节中的副产品来。虽然,之前是沿着一条研究主路一直在前进,但是却会产生很多的分叉与分支出来,逐渐偏离了原来的研究方向。当走了一段时间之后,会恍然发现其实本来就不应该走原来的那条路,要走的就是现在这条走出来的“弯路”。当时的假定目标是A,后来竟做出了一个B出来,而当我们要总结科研成果,撰写科研论文时,我们会总结说其实我们真正要做目标的是B,这就是所谓的“打哪指哪”,J。

    在科研过程中,往往会遇到很多没有设想到、但很有意思的现象,便导致了很多意外的新发现。因此,当一项科研成果出来的时候,你可以相信在其背后可能隐藏着另外一个不为人所知的故事。当然你所能看到的几乎所有的科研论文在讲述研究历程时都是运用“指哪打哪”法的,但是它这个结论的发现过程很有可能是“打哪指哪”出来的——没有打到目标A,却把目标B做出来了。

    “打哪指哪”法对于刚刚进入研究一两年,脑海中只是有些模糊想法但是又未必做不出来的研究人员比较适用。2003年我们没有做出豹子皮,只是在马身上生成了豹皮的斑点图案,看上去像是披着豹皮的马。两年之后,在2005年的SIGGRAPH上我们真正做到了“指哪打哪”,用纹理映射的方法生成了豹子。

二.2004年:科研成果的产品转换

    2004年我发明了一个叫做Iso-charts的技术,主要是借助机器学习的方法对三维网格模型进行自动分片,并且生成纹理坐标。网格参数化是计算机图形学一个非常基础的功能,在游戏和电影产业都被广泛适用。在这一年的工作中,我认识到做研究不只需发论文来展示自己的科研成果,其实还需要看重这项技术的实际价值。被工业界所应用和承认,或许能带来更大的成就感。

    通过技术转化组的胡志鹏工程师的辛勤工作,我们成功地在DirectX的Code Base里贡献了三万行代码,使得这项技术成为DirectX中任意网格参数化工具UVAtlas。现在做贴图的程序员和游戏开发者都会用到UVAtlas这个工具,而且这项技术还用在了微软自行研发的Halo 3游戏引擎里。这就是企业研究院区别于其他科研机构的地方,在企业研究院我们不仅可以发表高水平的顶级论文使得科研成果得到学术界的充分认可,而且还可以使自己的科技成果进行产品转化,被成千上万的用户所使用从而体现其更广泛和深远的价值和影响。

    非常有意思是,这个项目起源于一个SIGGRAPH项目,我们的投稿不幸被拒了,可是万幸的是它转化进了微软的产品中,而且获得了研究院2005年的最佳技术成果转换奖。同时,这篇论文也是我第一次与微软总部的研究员合作完成的论文。

三.2005年:渐入佳境

    2005年对我来说是丰收的一年,我投了三篇SIGGRAPH论文都被录用了,而且三篇都是以第一作者的身份发表的。在同一年里面以第一作者的身份发表三篇论文,这在SIGGRAPH历史上是前所未有的。这一年的丰收标志着我在SIGGRAPH上成熟,也非常庆幸在这一年找到了可以真正命中SIGGRAPH的感觉和信心。当在这种感觉的指引下做出来的三篇论文得到业界同行认可的时候,即充分证明了自己也可以与他们一样跻身世界领先的行列。

    总的来说这一年的收获主要体现在两个方面,首先是2003年金钱豹纹路的创想终于在这一年找到了完美的解决。另一方面就是自己的研究视野更加开阔了,从几何和纹理伸延到了绘制,对图形学本身有了更为深入的探索和了解。我一直觉得计算机图形学是个相对较窄的学科,如果连这个较窄的学科都不能做到比较透彻的理解的话,我担心自己今后能到达的研究高度会非常有限的。我希望自己能在研究的深度和广度上并重。

    我不停地扩展自己的研究范围,尝试去学习更多的东西,试图在多个方向上寻找可以解决的问题。在某个方向上的研究功力体现在发现问题的能力,如果连问题都不知道的话,解决问题就无从谈起。可是有太多的文献和太多的方向,使得发现问题变得相当困难。即使当你找到一些问题之后,有些问题可能是十几年/几十年没有解决的问题。那么,就需要创新性地在当前的范围里找到一个可解的问题,这其中的难度可能并不比找问题难。

四.2006年:从运动员到教练员

    这个阶段我主要从一名运动员转换到同时带学生的教练员,如何培养学生做研究成了我的一个新课题。在研究院工作是幸运的,有很多非常优秀有潜力的学生跟我一起做研究,比如任重、孙鑫、施晓晗、侯启明等。我在培养学生方面也经历了一个比较有意思的发展过程:

阶段 我 学生

    阶段一: 全包培养从Idea, 方法,实验,论文起草都由我来完成 主要从事一些编程的工作

    阶段二: 轻轻放手提出Idea,论文起草由我完成 让学生去寻找一些解决方法,从事编程工作

    阶段三: 大胆放手只提出Idea 鼓励学生自己寻找方法,尝试撰写论文,从事编程工作

    阶段四: 理想状态只提出大的研究方向 从Idea, 方法,实验,论文起草都由学生完成,从事编程工作

    计算机图形学研究对实习生的要求相对比较严格,因为它的门槛很高,除了要有idea,还需要把这个idea实现到极致,做出最漂亮的结果。我对学生的要求非常严厉,但是从另一方面而言,学生出成果也很快很出色。我有责任让这些学生学到知识,提高能力,做出成绩,这样才对得起把这些学生交给我的老师和家长。对学生要求严格的一个简单方法就是以身作则,如果我对自己要求更严,比学生还用功,那么这种工作态度就会激励身边的学生一起热情地投入到项目中。

    就像Harry和百宁常说的,我们从全国各地选拔上来的学生就像是一些优秀的的运动员苗子。我们要培养的是能参与国际竞争的奥林匹克团队。进入研究院的学生都是很好的苗子,但是真的要把这些好的苗子培养成世界一流运动员,需要一个艰巨和漫长的过程。在这个过程中,教练员必须要保持耐心。

五.2007年:科学研究中的猜想

    研究院是一个智商密度很高的地方,不仅有许多聪明员工和实习生在这里工作,而且有很多世界一流的科学家络绎不绝地到这里交流访问,形成了一个非常宽松而活跃的学术交流平台。在与这些海内外知名学者的交流中,我总能在研究方法和思路上深受启发。比如每次和前任院长沈向洋的交谈都让我受益匪浅。他会经常鼓励我思考一些视觉和图形学交叉领域的研究问题。与另外一位理论组的访问学者滕尚华教授的交流也极大地帮助我开拓了研究思路。

    2005年尚华第一次来研究院访问的时候,我们一起做了一个网格形变的项目,尚华对这个项目中涉及到一些非线性优化算法的稳定性和收敛性做出了重要贡献。我们合作的论文也发表在SIGGRAPH 2006上。此后,每次尚华来研究院我们都会在一起聊天。尽管尚华是一个计算机理论科学家,他对应用领域的很多研究问题却有着浓厚的兴趣。有一次在闲聊时候,他提到在做研究的过程中直觉很重要,有的时候对一些没有把握的方向需要做出猜想(conjecture)。他还提到了自己的一个非常好的研究工作就是这样做出来的。当时理论界已经证明单纯形法在最坏情况下具有指数复杂度。按照常理这样一个高复杂度的算法应当很难被应用,可是单纯形法却在工业界被广泛应用。尚华和他的合作者就猜想既然实践已经证明了单纯形法的实用性,那么一定存在着某种限定条件使得单纯形法的复杂度远远低于指数复杂度。沿着这一思路,他们最终证明了在大量的工业应用中单纯形法只是多项式复杂度。这一研究工作在理论界和工业界都产生了深刻的影响,相对于传统的最坏情况分析(worst case analysis),这一工作开创了光滑分析(*oothed analysis)。他们的论文也在2008年获得了计算机理论学界享有盛名的G?del奖。

    当时,我在做一个关于动态散射媒体/烟雾的实时绘制项目,但是却碰到很多困难。烟雾的数据表达是一个包含有很多高频特性的体数据,我们尝试用一些数学模型去近似表达烟雾的数据,然后在这个数学模型上进行有效绘制计算。但是根据这些数学模型得到的绘制效果却不让人满意,因为原始数据在数学函数的逼近下会丢失掉一些细节,所以烟雾绘制出来的效果总是太过光滑,真实感颇为欠缺。另一方面,直接采用烟雾的原始数据会极大地降低绘制效率并且增加存储开销。这时候我们的项目基本上陷入了停顿。而尚华的关于科研猜想的一番谈话如醍醐灌顶般激发了我的灵感——是不是可以尝试不要丢掉残差(原始数据减去函数逼近而剩下的即为残差),在绘制过程中通过某种途径把残差补偿进去(当时完全不知道该如何补偿)。有了这个思路,我马上找任重一起讨论如何利用残差。很快我们就解决了残差数据的有效存储和绘制算法,实验结果表明这个猜想非常完美地把富有真实感的细节表现出来了。这项研究成果也发表在2008年的SIGGRAPH上。就是这样,一个利用早期被我们丢弃的残差数据的算法成为了这整个项目中最核心的部分,而大胆猜想为我们在穷途末路中找到了重新开路的明灯。

六.2008年: 从计算机图形学到计算机科学

    如果说过去5年的目标是对计算机图形学有一个透彻的了解,那么从2008年开始我把研究范畴扩展到计算机科学中的一些更基础的领域:数据结构和编程语言。

    近年来多核技术(包括多核CPU和GPU)的发展已经成为趋势,如何在多核环境下进行有效的算法设计和程序开发成为整个计算机科学的一个热点研究方向。这对我们图形学研究人员来说也是一个难得的机遇,因为没有人比我们更了解GPU,J。2007年年初我们就计划在 GPU上开发一些基本数据结构的构建算法,并在暑假的时候确定了要设计一个全新的GPU编程语言的目标。到目前为止我们已经开发了包括八叉树,KD树在内的多个基本数据结构,这些数据结构被应用到图形学和视觉等多个领域。

    另外我的学生侯启明和我设计开发的BSGP编程语言使得程序员可以象编写串行C语言程序一样在GPU上进行并行程序设计,大大提高了GPU程序的可读性、可写性和可维护性,使得编程效率提高2~3倍。而我们的BSGP编译器生成的代码可以达到与现有的编程语言相似甚至更高的运行性能。这项成果已经被2008年的SIGGRAPH大会录用。目前我们正在努力把这个新的编程语言产品化。我梦想着有一天我们在数据结构和编程语言上的这些研究工作和成果会为并行计算时代的计算机科学奠定基础。

    科学研究是一个没有止境的、艰苦的历程,如果你能保持耐心,并学会享受这一历程,你就能达到自己想象不到的高度。我希望这篇短文中提到一些的科研经历能对刚开始进行计算机图形学研究工作的新手们有所帮助。请你们相信,也许目前你觉得要成为一名计算机图形学专家是一件遥不可及的事情,但是只要你不断努力,你一定会被学术界所认可;也许你还会觉得成为计算机科学家是遥不可及的,那么只要你坚持,你同样可以证明自己可以成为一流的计算机科学家。就象Harry经常和我们说的,the sky is the only limit(天空是唯一的局限,引申为永无止境)!

作者介绍:

周昆,2002年从浙江大学计算机学院获得工学博士学位,同年加入微软亚洲研究院,历任副研究员、研究员和项目负责人。2008年受聘*长江学者特聘教授,回到浙江大学计算机学院工作。在微软工作6年期间曾在国际计算机图形学大会ACM SIGGRAPH上发表17篇论文,其中多项技术被应用在Windows图形系统DirectX,XBOX游戏Halo 3,以及三维电影特技制作软件中。

Sunday, September 19, 2010

储安平,被背叛的遗嘱 ---- 谢青桐

就在澳大利亚墨尔本,储望华、殷承宗曾经举办了黄河音乐会。一场文艺晚会,弹奏出《东方红》。今年建国大庆时,殷承宗还在国内巡回演奏。

倘若换作别人,弹奏《东方红》也没什么大惊小怪的。就算是在悉尼歌剧院演奏三天三夜,至多就是让猎奇的西方人领教一下这个在中国家喻户晓的红色经典。偏偏演奏者是储望华。储望华,何许人也?中国著名大右派储安平的儿子。

五十多年前,储望华的父亲储安平,就是在这《东方红》的乐曲声中,“活不见人,死不见尸”地消失了。让人不懂的是,在今天,移居海外多年的储望华早已是澳大利亚公民,居住在墨尔本富人聚居区。既没有政治压力,也没有生活压力。一个在澳大利亚的文艺演出,为什么要演奏《东方红》?原来,到场的嘉宾有中国的外交官员,储望华特意用一曲《东方红》答谢官员们的捧场,果然卓有成效地取悦了他们。

五十多年了,储望华不去纪念自己的父亲,纪念那让他的父亲名满天下、又付出生命的“党天下”,反而去高歌那置他父亲于死地,置五十多万右派陷入冤狱的《东方红》。

作为一个中国人,谁都知道《东方红》是为歌颂毛所作。当年,储安平的“党天下”言论,矛头直指毛。在1957年那个山雨欲来风满楼的年代,储安平这个一介书生的声音,曾压倒了千百万人的“东方红”的合唱。

储安平?这是个被人淡忘的名字,即便是许多上了年纪的长者,恐怕也只能对这个冷僻的姓氏摇摇头。我是在1988年读了戴晴的《储安平与“党天下”》长文,才知道储安平其人。他至诚的理想和追求,他一手创办的《观察》周刊,他的一针见血的见解,他那些掷地有声的热血政论,他摔给前后两个政权的断语都让人触目惊心、难以忘怀。

1940年代,在国民党治下的上海,他公开发表了如此批评国民党政府的言论:“若从历史的眼光看,这个前后统治了中国20年的政府,实实在在耽误了中国的国运,它阻碍了中国的进步。而其一切过失之中,最不能宽恕的罪恶,就是由于它的缺德的统治,大大的促成了中国人民道德的堕落。在这个政府的作风和统治之下,一切不守法的、不道德的、没有良心人格的人,都比一般奉公守法洁身自好的人,容易生活下去。在这个政府的作风和治理下,除了极少数坚贞的人物,仍能保持他们的人品、意趣和工作理想之外,大多数人都已趋于取巧、投机、幸进、不守信用、不负责任、不讲公道、强凶霸道、为劣作恶。在这种混乱的情形之下,大家已失去了生活的目标,失去了努力的自信,失去了一切崇高的理想,结果是人的品格愈降愈低,社会的风气愈来愈坏。”

如果说储安平以其金石般的政论达到了那个时代书生议政的最高峰,从《失败的统治》到《一场烂污》、《政治失常》,他为国民党二十多年的统治下了最后的断语,言论之激烈、论述之精辟,令人叹为观止。那么他所创办的《观察》周刊更是攀上了百年言论史的一个新高峰,成为一座几乎难以跨越的丰碑。《观察》是储安平创办于1946年9月1日的杂志,因敢于抨击国民党政权,提倡“民主、自由、进步、理性”,被国民党查封,“新中国”成立后复刊并改为《新观察》。1957年6月储安平响应毛“大鸣大放”的号召,在毛的“诚恳”动员之下,于中央统战部召开的座谈会上做了“党天下”的发言,被打成右派。反右之后,储先生曾经到东北旺放羊,从东北旺回北京旧居,带回了一只羊。那时候,储安平第二次结婚的妻子也已和他划清界线,此后经年,老人茕茕孑立,形影相吊,每天只能与屋里养着的山羊相依为命。

“文革”爆发后,储安平遭受红卫兵和造反派的反复抄家毒打。有一次,他的一位朋友鼓着勇气冒险探看储安平,看到储安平被一伙不明身份和单位的红卫兵和造反派残酷毒打,奄奄一息,架拖而去,从此就没有回来。次日,储的四妹再到储安平住处探看,已是人去屋空,一片狼藉,从此储安平被宣布“失踪”,接着“蹈海自杀”、“深山出家”的传言便纷纷扬扬,真相难辨了。从这位朋友所追忆的情况来看,储安平乃是被人虐杀。

储望华当年也亲眼目睹了他父亲的悲惨与苦难。据谢泳的《储安平与观察》一书中记载,储望华曾回忆,“记得有一个寒冷的冬天,我去探望他,给他带去些食品衣物,他独自住在一间阴暗的小茅泥舍中,房间的一半是他睡的炕,另一半是一格格正在繁殖的菇菌,屋子里黑暗潮湿,充满着霉腐恶臭,完全不是人住的地方。”这是储安平在文革中的真实生活处境。

储望华还说,1982年6月,他准备去澳大利亚留学时,单位的一位领导才匆匆拿来一份文件,告诉他:“刚刚接到中央统战部来函,对你父亲正式做出‘死亡结论’”。这时储安平已经失踪16年了,这个结论对他的孩子们来说已经没有任何意义,一个终身为自由主义理想奋斗的知识分子,最后就这样消失的无影无踪,人们再想起他的时候,对很多人来说,他早已是一个完全的陌生人了。

当年储安平的发言代表了多数知识分子的心声,而他却为此付出了生命。到如今,那显然已成为一个被背叛的遗嘱,背叛者正是奏出《东方红》的儿子。据说在墨尔本演奏时,现场华人是掌声雷动。而且另一个演奏者殷承宗是“文革”中“四人帮”的宠儿,因演奏样板戏《红灯记》而出名。我不明白为什么?但有一点我明白,其实海外的华人和国内的华人一样,健忘是国民共性。

谢泳一本书叫《储安平,一条河流般的忧郁》,书名里短短一句话却贴切地勾勒出储安平卓绝矗立的孤傲气质。

星座血型什么的跟人性格有什么关系

最近又看了一遍《逃出克隆岛》,里面对女主角记忆的描述很有意思,说他们这些克隆人有关童年的记忆预先设定好的,每个人虽有细节的不同,但主干是相同的!

那我们的性格是否也有一定的规律可循呢?如果有,又是为什么呢?例如血型对性格的影响,曾经看过一个日本的视频,制作人员把幼儿园的小朋友按血型分组,并由一个工作人员故意打破花瓶,摄影机记录下了这些小朋友在老师回来后的表现,从视频中能明显的看出来血型相同的小朋友在处事时有很大的相似性,而且无一例外!另外,星座对性格的影响也有一大批支持者,并试图在实践中加以印证!很多人都表示自己符合该星座的对应描述!

如果说人的性格,在不同的地区,家庭环境,教育程度的影响下,还能被这么规律的分类,而且是基于出生时间,或血型,来划分,那这到底说明了什么呢?如果说人的思想是不能被复制的,那这些相似的地方又是怎么来的呢?

这让我想到了Matrix中的世界,我们在所谓的物质世界中过着虚无缥缈的日子,或许在另一端,是收割我们的机器人,或者干脆我们就是一个simulation中的一个agent?看似自由的思想,其实都是遵循有限的几个定势在游走,在不同的问题面前做出符合一定分布的选择?

腾讯此举,其心可诛!

刚才看到一篇日志,揭露腾讯 Web QQ 2.0 中的Gmail应用可能是钓鱼程序,并奉劝使用了该应用的朋友尽快更改密码!

原文如下:

http://share.renren.com/share/GetShare.do?id=3249088015&owner=233531447&ref=newsfeed&sfet=107&fin=25

如果此事查实,真是其心可诛!为什么偏偏只有GMail的应用......说来奇怪,现在倒是能自圆其说了!

腾讯,图穷匕见!Google,黄雀在后!

今天试验了一下腾讯的web QQ 2.0,由衷的感觉腾讯这步棋走的高明!作为80后的我们,不但是腾讯QQ的第一批受众,又将逐步进入各个行业,腾讯有意将web QQ打造成类web OS,不能不说是用心良苦。

因为QQ的娱乐性过强,很多人工作后就转向MSN等聊天软件。腾讯曾尝试用TM对抗MSN等,但结果是基本失败的。因为现有的工作资源已经定型,在TM没有独创特性的前提下,迁移的成本是不可接受的!随着云计算和web OS等概念的逐步兴起,腾讯似乎想另辟蹊径,试图通过一个对操作系统低依赖,与QQ现有资源高度整合,与腾讯其他产品捆绑的web OS来一统江湖!如果腾讯此举成功,将能大幅度提升腾讯的普及率,并大幅压缩其他竞争对手的空间!

在这一版的web QQ中,不但提供了更强的好友管理系统,网络硬盘,还与QQ音乐,QQ Live,QQ词典等产品整合,甚至还有个QQ云输入法......这些俨然一副通吃的气魄!这些功能几乎涵盖了所有的休闲与聊天功能,而且不需要安装,随时使用!不过腾讯下一步的目标还不明朗。因为一些web OS的核心功能它还不具备,例如第三方工具匮乏,只提供了GMail工具;办公应用匮乏,除了计算器就没有办公室能用的了。到底腾讯是想搞个全能的Web OS,向其他领域进军,还是就此打住,专注娱乐,还不好说!不过我倾向第一种可能,因为目前Web QQ 跟传统QQ的交集很大,犯不着搞这么个东西出来!

虽然我看好腾讯的这个尝试,不过还是信不过马化腾,这家伙贪念太重,什么都想着跟钱挂上钩,这个web QQ的眼光有多远,眼界有多大,还是个未知数!如果腾讯不能快速跟进,固步自封,为了保护自己的产品而设置壁垒,那么肯定还是要被淘汰,因为微软式的霸权已经过时了,再说了,你腾讯也不够强!

反观现在Google的策略则更阴损和稳妥,在推出了Chrome OS后,很快偃旗息鼓,静观其变。在无数个web OS和云应用出现时候,Google静静的改进Gmail,围绕Gmail给自己的网络应用增肥,相继推出了Google Calender,Google Doc,Google Reader,收购YouTube和Blogger,GTalk与AIM互通,现在又整了Buzz和GTalk语音视频聊天,甚至打电话!由此可见,Google的策略也很明显了,试图通过以各个独立的产品训练用户,让他们离不开Google的应用,并逐渐整合,等有朝一日web OS时机成熟,Google就会把他们统统整合到自己的Chrome OS中去,到时候还用愁那些脱离不了Google应用的用户不买Chrome OS的帐么?

Monday, May 10, 2010

有些英文 不要不懂装[转]

sporting house 妓院(不是“体育室”)
dead president 美钞(上印有总统头像)(并非“死了的总统”)
lover 情人(不是“爱人”)
busboy 餐馆勤杂工(不是“公汽售票员”)
busybody 爱管闲事的人(不是“大忙人”)
dry goods (美)纺织品;(英)谷物(不是“干货”)
heartman 换心人(不是“有心人”)
mad doctor 精神病科医生(不是“发疯的医生”)
eleventh hour 最后时刻(不是“十一点”)
blind date (由第三者安排的)男女初次会面(并非“盲目约会”或“瞎约会”)

personal remark 人身攻击(不是“个人评论”)
sweet water 淡水(不是“糖水”或“甜水”)
confidence man 骗子(不是“信得过的人”)
criminal lawyer 刑事律师(不是“犯罪的律师”)
service station 加油站(不是“服务站”)
rest room 厕所(不是“休息室”)
dressing room 化妆室(不是“试衣室”或“更衣室”)
horse sense 常识(不是“马的感觉”)
capital idea 好主意(不是“资本主义思想”)
familiar talk 庸俗的交谈(不是“熟悉的谈话”)

black tea 红茶(不是“黑茶”)
black art 妖术(不是“黑色艺术”)
black stranger 完全陌生的人(不是“陌生的黑人”)
white coal (作动力来源用的)水(不是“白煤”)
white man 忠实可靠的人(不是“皮肤白的人”)
yellow book 黄皮书(法国政府报告书,以黄纸为封)(不是“黄色书籍”)
red tape 官僚习气(不是“红色带子”)
green hand 新手(不是“绿手”)
blue stocking 女学者、女才子(不是“蓝色长统袜”)

China policy 对华政策(不是“中国政策”)
Chinese dragon 麒麟(不是“中国龙”)
American beauty 一种玫瑰,名为“美国丽人”(不是“美国美女”)
English disease 软骨病(不是“英国病”)
Indian summer 愉快宁静的晚年(不是“印度的夏日”)
Greek gift 害人的礼品(不是“希腊礼物”)
Spanish athlete 吹牛的人(不是“西班牙运动员”)
French chalk 滑石粉(不是“法国粉笔”)

pull one's leg 开玩笑(不是“拉后腿”)
in one's birthday suit 赤身裸体(不是“穿着生日礼服”)
eat one's words 收回前言(不是“食言”)
an apple of love 西红柿(不是“爱情之果”)
handwriting on the wall 不祥之兆(不是“大字报”)
bring down the house 博得全场喝彩(不是“推倒房子”)
have a fit 勃然大怒(不是“试穿”)
make one's hair stand on end 令人毛骨悚然—恐惧(不是“令人发指——气愤”)
be taken in 受骗,上当(不是“被接纳”)
think a great deal of oneself 高看或看重自己(不是“为自己想得很多”)
pull up one's socks 鼓起勇气(不是“提上袜子”)
have the heart to do (用于否定句)忍心做……不是“有心做”或“有意做”)

What a shame! 多可惜!真遗憾!(不是“多可耻”)
You don't say! 是吗!(不是“你别说”)
You can say that again! 说得好!(不是“你可以再说一遍”)
I haven't slept better. 我睡得好极了。(不是“我从未睡过好觉”)
You can't be too careful in your work. 你工作越仔细越好。(不是“你工作不能太仔细”)
It has been 4 years since I smoked. 我戒烟4年了。(不是“我抽烟4年了”)
All his friends did not turn up. 他的朋友没全到。(不是“他的朋友全没到”)
People will be long forgetting her. 人们在很长时间内会记住她的。(不是“人们会永远忘记她”)

He was only too pleased to let them go. 他很乐意让他们走。(不是“他太高兴了,不愿让他们走”)

It can't be less interesting. 它无聊极了。(不是“它不可能没有趣”)

Thursday, May 6, 2010

一篇故事讲述了计算机网络里的基本概念:网关,DHCP,IP寻址,ARP欺骗,路由,DDOS等...

计算机主机网关的作用是什么?

假设你的名字叫小不点,你住在一个大院子里,你的邻居有很多小伙伴,在门口传达室还有个看大门的李大爷,李大爷就是你的网关。当你想跟院子里的某个小伙伴玩,只要你在院子里大喊一声他的名字,他听到了就会回应你,并且跑出来跟你玩。
但是你不被允许走出大门,你想与外界发生的一切联系,都必须由门口的李大爷(网关)用电话帮助你联系。假如你想找你的同学小明聊天,小明家住在很远的另外一个院子里,他家的院子里也有一个看门的王大爷(小明的网关)。但是你不知道小明家的电话号码,不过你的班主任老师有一份你们班全体同学的名单和电话号码对照表,你的老师就是你的DNS服务器。于是你在家里拨通了门口李大爷的电话,有了下面的对话:

小不点:李大爷,我想找班主任查一下小明的电话号码行吗?

李大爷:好,你等着。(接着李大爷给你的班主任挂了一个电话,问清楚
了小明的电话)问到了,他家的号码是211.99.99.99

小不点:太好了!李大爷,我想找小明,你再帮我联系一下小明吧。

李大爷:没问题。(接着李大爷向电话局发出了请求接通小明家电话的请
求,最后一关当然是被转接到了小明家那个院子的王大爷那里,然后王大
爷把电话给转到小明家)

就这样你和小明取得了联系。

至于DHCP服务器嘛,可以这样比喻:

你家院子里的居民越来越多了,传达室李大爷那里的电话交换机已经不能满足这么多居民的需求了,所以只好采用了一种新技术叫做DHCP,居民们开机的时候随机得到一个电话号码,每一次得到的号码都可能会不同。

你家门口的李大爷:就是你的网关
你的班主任:就是你的DNS服务器
传达室的电话交换机:就是你的DHCP服务器

同上,李大爷和王大爷之间的对话就叫做路由。

另:如果还有个小朋友叫做小暗,他住的院子看门的是孙大爷,因为小暗的院子刚盖好,孙大爷刚来不久,他没有李大爷和王大爷办公室的电话(李大爷和王大爷当然也没有他的电话),这时会有两种情况:
1、居委会的赵大妈告诉了孙大爷关于李、王两位大爷的电话(同时赵大妈也告诉了李、王关于孙的电话),这就叫静态设定路由
2、赵大妈病了,孙大爷自己到处打电话,见人就说:“我是小暗他们院子管电话的”,结果被李、王二位听到了,就记在了他们的通讯录上,然后李、王就给孙大爷回了个电话说:“我是小明(小不点)他们院子管电话的”,这就叫动态设定路由

然后有一天小不点要找小暗,结果自然是小不点给李大爷打电话说:“大爷,我找小暗”(这里省略了李大爷去查小暗电话的过程,假设他知道小暗的电话),李大爷一找通讯录:“哦,小暗的院子的电话是孙大爷管着的,要找小暗自然先要通知孙大爷,我可以通知王大爷让他去找孙大爷,也可以自己直接找孙,那当然是自己直接找孙方便了”,于是李大爷给孙大爷打了电话,然后孙大爷又把电话转到了小暗家。

这里李大爷的通讯录叫做路由表。
李大爷选择是自己直接找孙大爷还是让王大爷帮忙转接叫做路由选择。

李大爷之所以选择直接找孙大爷是有依据的,因为他直接找孙大爷就能一步到位,如果要王大爷转接就需要两步才能完成,这里的“步”叫做“跳数”,李大爷的选择遵循的是最少步骤(跳数)原则(如果他不遵守这个原则,小不点可能就会多等些时间才能找到小暗,最终结果可能导致李大爷因工作不力被炒鱿鱼,这叫做“延时太长,选路原则不合理,换了一个路由器”)

当然,事情总是变化的,小不点和小明吵架了,这些天小不点老是给小暗打电话,小明心里想:“操,他是不是在说我坏话啊?”于是小明决定偷听小不点和小暗的通话,但是他又不能出院子,怎么办呢?小明做了这样一个决定:

首先他告诉自己院里管电话的王大爷说:“你给李大爷打个电话说小暗搬到咱们院子了,以后凡是打给他的电话我来接”,王大爷没反映过来(毕竟年纪大了啊!)就给李大爷打了电话,说:“现在我来管理小暗的电话了,孙已经不管了”,结果李大爷就把他的通讯录改了,这叫做路由欺骗。

以后小不点再找小暗,李大爷就转给王大爷了(其实应该转给孙大爷的),王大爷收到了这个电话就转给了小明(因为他之前已经和小明说好了),小明收到这个电话就假装小暗和小不点通信。因为小明作贼心虚,害怕明天小不点和小暗见面后当面问他,于是通信断了之后,又自己以小不点的名义给小暗通了个电话复述了一遍刚才的话,有这就叫数据窃听

再后来,小不点还是不断的和小暗联系,而零落了小明,小明心里嘀咕啊:“我不能总是这样以小暗的身份和小不点通话啊,外一有一天露馅了怎么办!”于是他想了一个更阴险的招数:“干脆我也不偷听你们的电话了,你小不点不是不给我打电话吗!那我让你也给小暗打不了,哼哼!”,他怎么做的呢?我们来看:

他联系了一批狐朋狗友,和他们串通好,每天固定一个时间大家一起给小暗院子传达室打电话,内容什么都有,只要传达室的孙爷爷接电话,就会听到“打雷啦,下雨收衣服啊!”、“人是人他妈生的,妖是妖他妈生的”、“你妈贵姓”等等,听的脑袋都大了,不听又不行,电话不停的响啊!终于有一天,孙爷爷忍不住了,大喊一声:“我受不了拉!!!!”,于是上吊自杀了!

这就是最简单的DDOS攻击,孙爷爷心理承受能力弱的现象叫做“数据报处理模块有BUG”,孙爷爷的自杀叫做“路由器瘫痪”。如果是我,就会微笑着和他们拉家常,例如告诉他们“我早就听了天气预报,衣服10分钟前已经收好了”或者“那你妈是人还是妖”或者“和你奶奶一个姓”等等,我这种健全的心理叫做“健壮的数据报处理,能够抵御任何攻击”

孙爷爷瘫了之后,小不点终于不再给小暗打电话了,因为无论他怎么打对方都是忙音,这种现象叫做“拒绝服务”,所以小明的做法还有一个名字叫做“拒绝服务攻击”。

小明终于安静了几天,...

几天后,小明的院子来了一个美丽的女孩,名字叫做小丽,小明很喜欢她(小小年纪玩什么早恋!)可是小丽有个很帅的男朋友,小明干瞪眼没办法。当然这里还是要遵循上面的原则:小丽是不能出院子的。那个男的想泡小丽自然只能打电话,于是小明又蠢蠢欲动了:
还记得王爷爷是院子的电话总管吗?他之所以能管理电话是因为他有一个通讯录,因为同一个院子可能有2个孩子都叫小明,靠名字无法区分,所以通讯录上每一行只有两项:

门牌电话
一号门 1234567 (这个是小明的)
二号门 7654321 (这个是小丽的)
......

王爷爷记性不好,但这总不会错了吧(同一个院子不会有2个“二号门”吧)?每次打电话人家都要说出要找的电话号码,然后通过通讯录去院子里面敲门,比如人家说我找“1234567”,于是王爷爷一比较,哦,是一号门的,他就去敲一号门“听电话”,如果是找“7654321”,那他就找二号门“听电话”。

这里的电话号码就是传说中的“IP地址”
这里的门牌号就是传说中的网卡的’MAC‘地址(每一块网卡的MAC地址都是不一样的,这是网卡的制造商写死在网卡的芯片中的)

小明心里想“奶奶的,老子泡不到你也别想泡”,于是他打起了王爷爷通讯录的主意,经过细心的观察,周密的准备,他终于发现王爷爷有尿频的毛病(毕竟是老人啊...),终于在一个月黑风高的白天,王爷爷去上厕所了,小明偷偷的摸进传达室,小心翼翼的改了王爷爷的通讯录......

过了几天,小丽的男朋友又给小丽打来了电话,对方报的电话是“7654321”,王爷爷一看通讯录,靠:

门牌电话
一号门 1234567 (这个是小明的)
一号门 7654321 (注意:这个原来是小丽的,但是被小明改了)
......

王爷爷不知道改了啊,于是就去找一号门的小明了,小明心里这个美啊,他以小丽父亲的口吻严厉的教训了那个男的和小丽之间不正当的男女关系,结果那个男的恭恭敬敬的挂了电话。当然小丽并不知道整个事情的发生...

这里小明的行为叫做“ARP欺骗”(因为在实际的网络上是通过发送ARP数据包来实现的,所以叫做“ARP欺骗”),王爷爷的通讯录叫做“ARP表”

这里要注意:王爷爷现在有两个通讯录了,一个是记录每个院子传达室电话的本本,叫做“路由表”,一个是现在说的记录院子里面详细信息的本本,叫做“ARP表”。

有句命言是“人们总是在追求完美的,尽管永远也做不到”(请记住这句话,因为这是一个大名人--也就是我,说的)

王爷爷的制度中有一条是这么写的“每个月要重新检查一下门牌号和电话的对应本(也就是ARP表)”,这个动作叫做“刷新ARP表”,每个月的时间限制叫做“刷新ARP表的周期”。这样小明为了让那个男的永远不能找到小丽,之后每个月都要偷偷改一次那个通讯录,不过这样也是不得不做的事啊!
补充一点,小明是很聪明的,如果通讯录(ARP表)被改成了这样:

门牌(MAC)电话(IP)
一号门 1234567 (这个是小明的)
二号门 1234567 (注意:这个被小明改了,但是他一时头晕改错了)
......

就会是计算机就会弹出一个对话框提示“出现重复的IP地址”,最终会导致王爷爷不知所措,于是通知一号门和二号门,你们的电话重复了。这样小丽就知道有人在破坏她的好事,这个现象叫做“骗局被揭穿了”

小不点知道了小明偷听他和小暗的电话,于是就和小暗约定好了密码。小不点在家里把要说的加密了之后告诉小暗。土豆-〉星期三,地瓜-〉请客,笨蛋-〉小不点家。于是小不点告诉小暗:土豆笨蛋地瓜。小明听了???不懂。。。。郁闷了。。。这是加密。
除此之外,小丽也知道了小明改他家的电话号码了。于是王爷爷就登门一个一个把电话和门牌号记下来。并且藏起来不允许外人修改,只能自己有钥匙(密码)。这是ip地址和MAC地址绑定。当有人改了电话号码的时候,就得找王爷爷改。麻烦是麻烦了,但是安全了。不过小明偷偷的把王爷爷的钥匙偷配了一把(盗窃密码成功),于是他还可以修改。这样么,就这样了。

本文来自: 华夏黑客同盟论坛

Tuesday, May 4, 2010

SVN的使用:基本知识,Server的搭建与Client日常使用维护

本文转载自 “gnuhpc”的专栏,在此表示感谢!

一、基本知识:

1.为什么要使用SVN?

程序员编写程序的过程中,每个程序都会生成很多不同的版本.

这就需要程序员能有效的管理代码,在需要的时候可以迅速,准确取出相应的版本

任何需要管理频繁信息改变的地方都需要它,这就是Subversion的舞台

2. Subversion是什么?

Sub Version(简称SVN)是版本管理工具

Subversion是一个自由/开源版本控制系统

一组文件存放在中心版本库, 记录每一次文件和目录的修改

Subversion可以通过网络访问它的版本库

任意数量的客户端可以连接到版本库,读写这些文件.

通过写,别人可以看到这些信息,通过读数据,可以看到别人的修改

3.Subversion的特性有哪些?

版本化的目录:Subversion实现了一个可以跟踪目录树更改的“虚拟”版本化文件系统

真实的版本历史:可以新增一个具有干净历史的文件

原子提交:可以让用户构建一个要提交修改的逻辑块,防止部分修改提交到版本库

版本化的元数据:每一个文件或目录都有一套属性—键和它们的值

可选的网络层:在版本库访问方面有一个抽象概念,利于人们去实现新的网络机制

一致的数据操作:文件是建立在二进制文件区别算法基础上的

有效率的分支和标签:建立分支与标签时只是拷贝整个工程,使用了一种类似于硬链接的机制

可修改性:由一系列良好的共享C库实现,具有定义良好的API

4.Subversion的原理是什么?

锁定-解锁

image
拷贝-修改-合并

image image

Subversion主要采用拷贝-修改-合并模型,配合锁定-解锁模型管理数据的共享

5.Subversion的基本工作流程是什么?

image

二、SVN服务器的搭建与配置:

1.启动:安装好VisualSVN Server后,运行VisualSVN Server Manger,下面是启动界面:

2.添加一个代码库【Repository】:如下图:

按上图所示,创建新的代码库,在下图所示的文本框中输入代码库名称:

注意:上图中的CheckBox如果选中,则在代码库StartKit下面会创建 trunk、branches、tags三个子目录;不选中,则只创建空的代码库StartKit。

点击OK按钮,代码库就创建成功了。

3.安全性设置:

在左侧的Users上点击右键:

输入上面的信息,点击OK,我们就创建一个用户了。按照上面的过程,分别添加用户 Developer1、tester1、manager1,好了,我们开始添加这些用户到我们刚才创建的项目里:

点击上图中的"Add..."按钮,在下图中选择我们刚才添加的用户,点击OK按钮:

说明:大家可能注意到了下图中的Groups,是的,你也可以先创建组,把用户添加到各个组中,然后对组进行授权,操作比较简单,在此略过。

按照下图所示,分别对用户【或组】进行授权:

点击"确定"按钮,上面的用户就具有了访问代码库的不同权限。

二、SVN客户端的使用方法——TotoiseSVN 的基本使用方法

1.导入源代码到SVN服务器

假如我们要把项目StartKit的源代码签入到SVN Server上的代码库中里,首先右键点击StartKit文件夹,这时候的右键菜单如下图所示:

点击Import,弹出下面的窗体,其中http://zt.net.henu.edu.cn 是服务器名,svn是代码仓库的根目录,StartKit是我们在SVN Server上建立的一个代码库:

说明:左下角的CheckBox,在第一次签入源代码时没有用,但是,在以后你提交代码的时候是非常有用的。

点击OK按钮,会弹出下面的窗体,要求输入凭据:

在上面的窗体中输入用户名和密码,点击OK按钮:

如上图所示,好了,源代码已经成功导入SVN服务器了。这时候团队成员就可以从SVN服务器上的导出源代码到自己的机器了。

2迁出源代码到本机

就是从版本库中取出某个目录的拷贝到本机上某个目录的操作,叫做CheckOut,这个操作是工作的基础。

在本机创建文件夹,右键点击Checkout,弹出如下图的窗体:

在上图中URL of Repository:下的文本框中输入svn server中的代码库的地址,其他默认,点击OK按钮,就开始迁出源代码了。

说明:上图中的Checkout Depth,有4个选项,分别是迁出全部、只签出下一级子目录和文件、只导出文件、只签出空项目,默认的是第一项。上面的例子中,我们也可以使用web的方式访问代码库,在浏览器中输入http://zt.net.henu.edu.cn/svn/StartKit/

这时候也会弹出对话框,要求输入用户名和密码,通过验证后即可浏览代码库中的内容。

打开目录,可以看到如下图的文件夹结构:

一旦你对文件或文件夹做了任何修改,那么文件或文件夹的显示图片机会发生变化。下图中我修改了其中的二个文件:

看一下不同状态所对应的图片:

3.提交修改过的文件到SVN服务器

例如,修改了位于Model文件中的二个文件ImageInfo.cs和NewsInfo.cs

注意:提交源代码到服务器时,一定确保本机的代码是最新版本,否则可能提交失败,或者造成版本冲突。

在Model文件夹上点击右键或在Model文件下的空白处点击右键,点击SVN Commit…弹出下面的窗体:

点击OK按钮后,弹出如下图的窗体:

commit的功能不仅仅是上传,他会和服务器上面的文件进行对比,假如你更新了某个文件而服务器上面也有人更新了这个文件,并且是在你checkout之后做的更新,那么它会尝试将你的更新和他人的更新进行融合(merge),假如自动 merge不成功,那么报告conflict,你必须自己来手动merge,也就是把你的更新和别人的更新无冲突的写在一起。commit的时候,最好填写Log信息,这样保证别人可以看到你的更新究竟做了写什么。这就相当于上传文件并且说明自己做了那些修改,多人合作的时候log非常重要。

4.添加新文件到SVN服务器

假设我们在Model文件下添加一个新的类文件UserInfo.cs,在文件UserInfo.cs上点击右键,点击TortoiseSVN=>>Add,弹出如下图的窗体:

选中UserInfo.cs文件,点击OK按钮,这样并没有将这个文件提交到SVN服务器,只是将这个文件标记为源代码库库中的文件,并将其状态置为修改状态。之后,我们要再SVN Commit这个文件一次,才可以将其真正提交到SVN服务器上的代码库中。添加文件夹的步骤也是一样的。

5.更新本机代码与SVN服务器上最新的版本一致

这个也很简单,只要在需要更新的文件夹上点击右键或在该文件下的空白处点击右键,点击SVN Update,就可以了。一般在提交修改之前,必须运行一下update操作来合并别人作出的新更改。

注意:更新操作可能会因为版本冲突而失败,这是可以使用合并【Merge】或其他方法解决;也可能因为锁定【Get Lock】而失败,这是需要先解锁【Release Lock】。 如果本地的代码已经被修改,和commit一样会先进行merge,不成功的话就会报告conflict 。另外需要注意的是,假如别人删除了某个文件,那么更新之后你在本地的也会被删除。

6.重命名文件或文件夹,并将修改提交到SVN服务器

只要在需要重命名的文件或文件夹上点击右键,点击TortiseSVN=>Rename…,在弹出的窗体中输入新名称,点击OK按钮,就可以了。此方法也不是直接重命名,而是将该文件或文件夹的名称标记为重命名后名称,也需要我们使用SVN Commit提交到SVN服务器后才真正重命名。

7.删除文件或文件夹,并将修改提交到SVN服务器

最简单就是,你直接删除文件或文件夹,然后使用SVN Commit提交更新到SVN服务器。另外一种方法是在你要删除的文件或文件夹上点击右键=>>TortoiseSVN=>> Delete删除,此方法也不是直接删除,而是将该文件或文件夹的状态置为删除,也需要我们使用SVN Commit提交到SVN服务器后才真正删除。

8. 如何在同一个在一个工程的各个分支或者主干之间切换
使用tortoise SVN—>switch ,在URL中输入branch或trunk的url地址。

9.比较两个版本之间的差别

如果你想看到你的本地副本有哪些更加,只用在资源管理器中右键菜单下选TortoiseSVN→ 比较差异。

如果你想查看主干程序(假如你在分支上开发)有哪些修改或者是某一分支(假如你在主干上开发)有哪些修改,你可以使用右键菜单。在你点击文件的同时按住Shift键,然后选择TortoiseSVN→ URL比较。在弹出的对话框中,将特别显示将与你本地版本做比较的版本的URL地址。

10. 如何为一个SVN主工程建立分支或tag

image

分支的基本概念:开发的一条线独立于另一条线,如果回顾历史,可以发现两条线分享共同的历史,一个分支总是从一个备份开始的,从那里开始,发展自己独有的历史。

SVN分支的管理实际上就是把不同的分支用不同的文件保存,因此你在取得新版本的时候会发现,不同分支的最新文件也会被获取下来。创建tag操作,相当于把当前的代码版本复制一份到其他地方,然后以这个地方为出发点进行新的开发,与原来位置的版本互不干扰。

选择你要产生分支的文件,点击鼠标右键,选择[分支/标记...]

在[至URL(T)]输入框中将文件重命名为你的分支文件名,输入便于区分的日志信息,点击确认。

在SVN仓库中会复制一个你所指定的文件,文件名称就是你所命名的,但是在你的本地目录上看不到新建的分支文件名,要使你的文件更新作用到你的分支上,你必须选择文件,点击鼠标右键,选择[切换...],选择你重命名的文件,点击确定即可。这样你的本地文件就和分支文件关联上了,不要奇怪,这时本地目录上看到的文件名仍然为旧的文件名。

11.冲突解决

当文件发生冲突时,SVN会额外创建3个不受版本控制的文件,同时被冲突文件如果能够合并,会在被冲突文件内部留下冲突记录。例如,冲突的文件为plugin.c,BASE版本是1458,HEAD为1459,会产生3个临时文件plugin.c.mine,plugin.c.r1458,plugin.c.r1459,

解决思路:A. 手动修改被冲突文件 B. 放弃自己的更改。实际中,解决办法很灵活,一般需要与他人商量

注意:由于这3个文件是在Update后才创建的,而Update之后,工作拷贝的BASE目录已经变成更新后的版本了,所以放弃自己的更改会回到新版本。如果不是用Revert的方法解决冲突的话,由于那3个临时文件留在那里,会使Subversion认为冲突没有解决,所以要运行resolved告诉SVN冲突解决或者删除临时文件。

三、Linux下SVN客户端的使用:

1.Checkout:

语法:checkout(co) URL[@REV]... [PATH]

可以指明Checkout的版本号,默认CheckOut操作是针对HEAD版本进行的,大多数情况下我们需要HEAD版本,但如果需要历史版本,可以用-r(--revision)参数或者是用“@版本号”的形式

例:

… -r 1452 会检出1452版,如果存在的话

… -r {“2007-05-05”} 会检出最接近这个日期的版本

…/trunk@1452 效果同第1个例子

递归与不递归,-N:不递归(仅针对顶层目录),否则目录递归(默认,常用)

例1:svn co svn://218.94.9.38/svnrepos/skizcorp/trunk 在当前目录建立一个trunk目录,里面是工作拷贝

例2:svn co svn://localhost/torm I:\PROJECTS\torm 会在I:\PROJECTS\目录下创建torm目录,里面存放工作拷贝

2.Update:

语法: update(up) [PATH...]

把版本库的修改同步到本地的过程是Update。

例1:up 直接把工作拷贝更新到最新版(HEAD版)

例2:up -r 2007 更新到2007版

例3:up doc/design 只更新doc/design下的文件

-r和-N参数仍然有用

Update会修改被更新目录的BASE版本号。某个文件的BASE版本是指存放在管理目录.svn中的该文件拷贝的版本,Revert会使该文件回到BASE版本

做Update操作时,SVN会打印出受影响文件的状态,有以下几种:

A Added

D Deleted

U Updated

C Conflict

G Merged

注意:若提示C,表示冲突,冲突可以用status命令加-u参数来预测

3.Revert:

Revert是指放弃对某个文件的修改,把该文件的内容回复和BASE版本相同,也就是,把该文件的状态回复到未修改状态

语法:revert 文件/路径

例子:

例1 revert abc.c 丢弃对abc.c的所有修改

例2 revert src/edu/nju/pojo 放弃对此目录下所有文件的修改

四、注意事项:

1.实际上,从你把源代码迁签入SVN服务器开始,每一个版本的数据和文件,就算是你已经删除了的,也都可以随时迁出。

2.向SVN服务器提交源代码的时候,一定不要提交bin、obj 等文件夹,否则会很麻烦。但是web项目的bin目录除外,但是web项目的bin目录中的引用其他项目而生成的dll不需要提交。

3.对于第三方库或程序集,不要简单从他们的安装位置引用,而是在你的解决方案下,添加一个Library的目录,把需要的程序集或者库文件复制到这里,然后从Library目录引用。

4.关于checkout和export的区别,当你要发布或编译的时候,最好采用export,它不会引入svn的附加文件,这样文件结构显得比较干净。而当你需要修改和提交的时候,用checkout,它会在你本地建立一个工作区,Checkout到某处的代码,将会被 TortoiseSVN监视,里面的文件可以享受各种SVN的服务。

5.假如你需要给带有绿色对勾文件改名或者移动它的位置,请不要使用windows的功能,右键点击它们,TortoiseSVN都有相应的操作。想象这些文件已经不在是你本地的东西,你的一举一动都必须让Tortoise知道:

  • 把一个文件加入SVN版本控制,用add命令
  • 从版本控制中移除,用delete(rm, remove)命令
  • 移动或者重命名,用move(rename)命令
  • 拷贝,用copy命令
  • 创建目录,用mkdir命令
  • ……

6.假如修改了某个文件但是你后悔了,可以右键点击它选择Revert,它将变回上次checkout时候的情况,或者Revert整个工程到任意一个从前的版本。

7.使用Commit时注意: 如有多个文件需要同时提交,同时文件在不同的目录下,必须找到这些文件的最上层目录上点击 Commit,TortoiseSVN会搜索被点击目录以及该目录下所有的文件,并将修改变动的文件罗列在列表中。 仔细查看列表中的文件,确定哪些文件时需要更新的,如果不需要更新某个已经变化了的文件,只需要在该文件上点击右键,选择还原操作;如遇到文件冲突(冲突:要提交的文件已被其他人改动并提交到版本库中)要启用解决冲突功能。

8.对于branches、tags、trunk这三个目录,并不是subversion必需的,而是被总结的一种良好的团队开发习惯,其使用方法为:

开发者提交所有的新特性到主干。 每日的修改提交到/trunk:新特性,bug修正和其他。

这个主干被拷贝到“发布”分支。 当小组认为软件已经做好发布的准备(如,版本1.0)然后/trunk会被拷贝到/branches/1.0。

项目组继续并行工作,一个小组开始对分支进行严酷的测试,同时另一个小组在/trunk继续新的工作(如,准备2.0),如果一个bug在任何一个位置被发现,错误修正需要来回运送。然而这个过程有时候也会结束,例如分支已经为发布前的最终测试“停滞”了。

分支已经作了标签并且发布,当测试结束,/branches/1.0作为引用快照已经拷贝到/tags/1.0.0,这个标签被打包发布给客户。

分支多次维护。当继续在/trunk上为版本2.0工作,bug修正继续从/trunk运送到/branches/1.0,如果积累了足够的 bug修正,管理部门决定发布1.0.1版本:拷贝/branches/1.0到/tags/1.0.1,标签被打包发布。

一般建立最初的repository时,就建好这三个目录,把所有代码放入/trunk中,如:要将project1目录下的代码导入 repository,project1的结构就是:project1/branches,project1/tags,project1 /trunk,project1/trunk/food.c,project1/trunk/egg.pc……,然后将project1目录导入 repository,建立最初的资料库。然后export回project1,作为本地工作目录。

9.检验修改:

通过status命令可以检查工作拷贝的状态

通过diff命令可以检查更改的内容

Monday, May 3, 2010

星巴克的术语

Americano, 美式咖啡,两shots 的浓缩咖啡,用热水调治而成;

Breve, 拿铁咖啡的一种,用一半浓缩咖啡和一半热牛奶调制而成;

Cappuccino, 浓缩咖啡和泡沫牛奶调成,比拿铁的牛奶泡沫多;

Con Panna, 意大利语,意思是“加上搅打过得牛奶”;

Demitasse, 法语,半杯的意思,这里指用极小的杯子装浓缩咖啡;

Doppio, 意大利语,意思是双份。但只用在两shots的浓缩咖啡,比如你可以说 doppio espresso, double latte;

Dry, 多奶末,少奶;

Espresso, 浓缩咖啡;

Frappuccino blended beverage, 星巴克特制;

Gande, 第二大型号的杯子;

Half-caf,  1 shot 普通咖啡,1 shot 低咖啡因咖啡;

Latte, 拿铁,热牛奶加浓缩咖啡;

Macchiato, 意大利语,显著的。比如星巴克焦糖 Macchiato;

Misto, 意大利语,意为混合,是滴滤式咖啡和热牛奶的混合;

Mocha: 摩卡咖啡,用浓缩咖啡,热巧克力和热牛奶;

Quad: 4 shots 浓缩咖啡;

Ristretto: 浓缩咖啡中提取出的,是浓缩咖啡中比较甘甜的部分;

Skinny, 用脱脂牛奶调入咖啡;

Tall, 小尺寸的杯子;

Triple, 3 shots 浓咖啡;

Unleaded, 无咖啡因的咖啡;

Valencia, 橙子糖浆;

Venti, 最大的杯子;

Espresso:浓缩咖啡的种类。

Regular, 普通的浓缩咖啡

Decaf, 无咖啡因

Extra shots, 加强的浓缩咖啡

Half and caf 一半无咖啡因一半普通的 shot

Ristretto, 仅有甜味的提取物

糖浆或果汁的选择

Vanilla 香草 sugar-free vanilla 无糖香草 Caramel 焦糖 Toffee nut 太妃糖/坚果 hazelnut 榛子 sugar-free hazelnut 无糖榛子 raspberry 覆盆子 peppermint 薄荷 Valencia 橙子 cinnamon 肉桂

Dry or foamy 干性的

Whipped cream 搅大奶油

Light whip 搅拌

light syrup 糖浆

light foam 泡沫

Saturday, May 1, 2010

How to install Flash player on Fedora 12 64-bit

Although there are many posts on Internet to demo how to install flash player, I think it is convenient to copy the steps to my own blog and check when it is necessary. This method is posted by "leigh123linux", and thanks for your contribution and help!

su yum erase flash-plugin nspluginwrapper*  cd /etc/yum.repos.d/ curl -O http://www.dfm.uninsubria.it/compiz/fusion-testing/flashplayer.x86_64/flash.repo rpm --import http://www.dfm.uninsubria.it/compiz/fusion-testing/flashplayer.x86_64/RPM-GPG-KEY-leigh123linux yum install flash-plugin

Thursday, April 29, 2010

英文电子邮件高频句

1. initiate a meeting

I would like to hold a meeting in the afternoon about our development planning for the project A.

I suggest we have a call tonight at 9:30 PM( China Time ) with you and Brown. Please let me know if the time is okay for you and Ben.

We`d like to have the meeting on Thu Oct 30. The same time.

Let`s make a meeting next Monday at 5:30 PM SLC time.

I want to take to you over the phone regarding issues about report development and the XXX project.

2. Seeking for more information/feedbacks/suggestions

Shall you have any problem accessing the folders, please let me knows.

Thank you and look forward to having your opinion on the estimation and schedule.

look forward to your feedbacks and suggestions soon.

What is your opinion on the schedule and next steps we proposed?

What do you think about this?

Feel free to give your comments.

Any question, please don’t hesitate to let me know.

Please contact me if you have any questions.

Your comments and suggestions are welcomed!

Please let me know what you think!

Do you have any idea about this?

It would be nice if you could provide a bit more information on the use’s behavior.

At your convenience, I would really appreciate you looking into this matter/issue.

3. Give feedbacks

Please see comments below.

My answers are in blue below.

I add some comments to the document for your reference.

4.Attachment

I enclose the evaluation report for your reference.

Attached please find today’s meeting notes.

Attach is the design document, please review it.

For other known issues related to individual features, please see attached release notes.

5. Point listing

Today we would like to finish following tasks by the end of today:

1….; 2….;

Some known issues in this release: 1….; 2….;

Our team here reviewed the newest SCM policy and has following concerns: 1….; 2….;

Here are some more questions/issues for your team: 1…; 2….;

The current status is as following: 1….; 2….;

Some items need your attention: 1….; 2….;

6. Raise question

I have some questions about the report XXXX;

For the assignment ABC, I have the following questions:……

7. Proposal

For the next step of platform implementation, I am proposing…

I suggest we can have a weekly project meeting over the phone call in the near future.

Achievo team suggest to adopt option A to solve outstanding issue…

8. Thanks note

Thank you so much for the cooperation!

I really appreciate the effort you all made for this sudden and tight project.

Thanks for your attention!

Your kind assistance on this are very much appreciated.

Really appreciate your help!

9. Apology

I sincerely apologize for this misunderstanding!

I apologize for the late asking but we want to make sure the correctness of our implementation ASAP.

Monday, April 26, 2010

How to: Setup Qt 4.5+ Visual Studio Integration

By dcsoft
QT IS NOW RELEASED UNDER LPGL

Qt is a cross platform GUI toolkit which was acquired from Trolltech by Nokia.  Starting with Qt 4.5, it is dual-licensed under both LPGL and Commercial.  The Commercial license can be a bit pricey, but the LPGL license means you can use it free of charge to develop proprietary, commercial, closed-source software.  Instantly, Qt has become available to a wide audience of software developers (DCSoft included).  Thank you Nokia!

More than a year ago, DCSoft has become very interested in Qt.  Much as we love MFC, it hasn’t changed much since 1999, and this is 2009.  Qt is easy to learn given its concise syntax and documentation, plugs into Visual Studio (more below), comes with a supported toolset including Designer (a resource editor), Linguist (a localization tool), and Qt Creator (an IDE), giving Qt more momentum than MFC, and a higher performance alternative to .NET.  It’s easily one of the best ways to create Windows apps, never mind it can also target Mac, Linux, and several embedded devices.

Starting with Qt 4.6, the LPGL version now comes pre-built for Visual Studio 2008 RTM.  If this fits your need, you can simply install it and skip to INSTALL VISUAL STUDIO ADD-IN. However, you will need to build Qt yourself if:

  1. You are using VS 2008 and you have installed SP1 and/or the ATL Security Update, and you are building your app with the _BIND_TO_CURRENT_VCLIBS_VERSION defined (or another means to specify the non-RTM version).  This is because both Qt and your app need to be built with the same version of the Visual Studio redistributables, and Qt has been built with RTM, but your app is not being built with RTM.
  2. You are using any version of VS 2005.  This is because Qt does not come prebuilt for VS 2005.

Here’s how to get our favorite IDE (Visual Studio 2005/2008) working with Qt!

DOWNLOAD QT SOURCE CODE

As the option to download only the Qt source code is a bit obfuscated on the current Nokia website, please follow these directions:

  1. Go to http://qt.nokia.com/downloads and click the Go LGPL button.
  2. Since you want only source code, look at the Qt: Framework Only column on the right.  Click e.g. Download Qt libraries 4.6.1 for Windows (VS 2008, 194 MB) — choose the VS2008 one.
  3. This starts the download for pre-built Qt.  But we don’t want that as we will be building Qt ourselves.  A page will appear with <Source code available on this link>.  Cancel the Save As dialog in your browser to cancel the binaries download you had clicked on, then click on this link, e.g.http://get.qt.nokia.com/qt/source/qt-everywhere-opensource-src-4.6.1.zip
  4. Unzip the file into e.g. c:\qt\4.6.1-vc.  Please use a path with no embedded spaces, as the Qt build tools have issues with them.
SET ENVIRONMENT VARIABLES

Open Computer Properties | Advanced system settings | Environment Variables:

  1. Edit environment variable to add:  QTDIR = c:\qt\4.6.1-vc
  2. Edit the PATH environment variable to add:  %QTDIR%\bin
  3. Either close all command prompts and Visual Studio instances, or reboot the computer so the new command-line takes effect.
BUILD VC++ VERSION OF QT
  1. Open a Microsoft Visual Studio Command Prompt, which is a command console with environment variables set for the specified VS.  This is easily accomplished using Start | All Programs | Microsoft Visual Studio 2005 (or 2008) | Visual Studio Tools | Visual Studio 2005 (or 2008) Command Prompt.
  2. Cleanup any previous build:
    1. c:\> cd c:\qt\4.6.1-vc
    2. c:\qt\4.6.1-vc> nmake distclean
    3. c:\qt\4.6.1-vc> rm -rf tmp*  // <– recursively remove all tmp\ folders and files

This requires finding a *nix workalike.  I use Total Commander to search for Tmp*, select all the found files, and delete them with one keystroke.

3. Run Configure to target platform vc2005 or vc2008:

c:\qt\4.6.1-vc> configure -platform win32-msvc2005<other options as needed>

Substitute win32-msvc2008 for VC2008

Run Configure with no parameters to see a help screen.  Configure generates nmake compatible makefiles to build all the Qt DLL’s, tools, and demos.

4.  Run nmake to build.

c:\qt\4.6.1-vc> nmake

It will take awhile, but this grinds through building the specified Qt DLL’s, tools, and demos with Visual Studio.

INSTALL VISUAL STUDIO ADD-IN

The Qt Visual Studio Add-in is indispensible for developing Qt apps in Visual Studio. The Add-in has replaced the previous Qt Visual Studio Integration, which was only available to Commercial customers.  Now the Add-in is used by both LPGL and Commercial licensees, and the Integration has been deprecated.  While the Add-in does not allow integrated .ui editing (it instead launches Qt Designer to edit .ui files), it is fully supported and maintained by Nokia, whereas the Integration hadn’t been modified since the 4.3/4.4 timeframe.

Because Visual Studio Express does not allow add-ins, using these free versions of Visual Studio is not recommended for Qt development.  You need at least Visual Studio Standard (Pro, Team System, etc. of course will also work).

1.  Download and install the Qt Visual Studio Add-in to install the Qt plug-in into Visual Studio (both 2005 and 2008 are supported by the add-in).

2.  Start Visual Studio.

3.  Select menu Qt | Configure Qt Versions.  Add c:\qt\4.6.1-vc.

4.  Now Qt is fully functional, and you can use VS2005/2008 to build Qt apps.

QT IN VISUAL STUDIO

1.  See Qt menu item.  Launch Qt Designer (the Resource editor) and Qt Linguist (the localization tool).

2.  Create new Qt projects.  File | New project, select Qt4 project.

3.  Read Qt Help.  Available from Help menu (Qt help is merged in with Visual Studio Help and viewed in Document Explorer.)  Or, manually launch

C:\Qt\4.6.1-vc\bin\assistant.exe

4.  The Whole Tomato Visual Assist X plug-in is highly recommended to develop Qt within Visual Studio.  See thisblog entry for tips.

Qt installation for Visual Studio

For professional and express edition.

The steps for a successful integration of Qt in Visual Studio IDE are as follows:

Pre-requisites:

Make sure the platform SDK is installed if using Express Edition of Visual Studio.

Visual Studio Express and the platform SDK can be downloaded freely from Microsoft downloads.

STEP 1:

Download the Qt library form Nokia’s website and select “LGPL/Free Downloads”;

Although the SDK mentions that its based on MinGW and do not support VS compiler, it does not matter. Qt can be made compatible with VS.

STEP 2:

Set the environment variable: “C:\Qt\2009.01\bin” and “C:\Qt\2009.01\qt\bin”. The only thing we need to pay attention is the semicolon between two paths.

STEP3:

Open Visual Studio Command Prompt, which may be located in “Start > Program Files > Visual Studio > Visual Studio Tool > Visual Studio Command Prompt”;

Go to the folder which Qt installed. You may run command “cd c:\Qt\2009.01\qt”;

Type in “configure” and run. This command will configure Qt library for your computer. If you have multiple compiler installed, you may use “configure –platform win32-msvc” to emphasize which compiler you want to use!

STEP4:

Run “nmake” in the command prompt, which may cause lots of time!

This document is based on Kabilen’s instruction! You may contact the author by “kabilen@delinkx.com”.

【CSDN】有关设计模式的一点讨论

举个例子,比如我新建了一个模板。模板里面可以添加无数个图层,每个图层都有N多个操作动作。
所有图层的操作都是串行进行的,现在要实现PS里面的撤销重复功能,如下图
步骤 0 1 2 3 4 5
类型 新增layer1 新增layer2 move layer1 删除layer2 新增layer3 move layer3
那撤销时,从第5个步骤往回一步步执行
我的实现方法是,先定义一个动作命令基类,再定义一些动作命令的派生类

   1:  type
   2:    TCommand = class
   3:    private
   4:      FLayerData : TData;//对应的图层数据结构体
   5:    protected
   6:      procedure DrawLayer; virtual; abstract;  
   7:    public
   8:      procedure Execute;//在这个过程中执行 DrawLayer过程
   9:    end;
  10:    //移动
  11:    TCommandMove = class
  12:    private
  13:      FLayerData : TData;
  14:    protected
  15:      procedure DrawLayer; override;  
  16:    public
  17:    end;
  18:    //重画
  19:    TCommandReDraw = class
  20:    private
  21:      FLayerData : TData;
  22:    protected
  23:      procedure DrawLayer; override;  
  24:    public
  25:    end;





新建的模板也有一个对应的类


  TComBine = class
private
FList : TList ; //用于添加动作类
FCommand : TCommand ; //动作命令类
FCurIndex : integer; //当前执行的操作列表下标
protected
public
property Items[Index : integer] : TCommand read SetItems write GetItem;
end;





每进行一个操作,就添加在TComBine 中添加一个具体的动作命令类对象,然后让动作命令类对象去执行相应的操作
撤销和重复时,只要修改FCurIndex 属性,然后用 TCommand(items[i]).Execute;
当有撤销操作时,再新增操作,直接将当前步骤之后的动作命令类对象全部销毁,类似于PS中的功能(撤销后再操作,当前步骤之后的操作就没了)
现在出来的问题:
比如从第5撤销到第4步时,它的操作应该是将 layer3 移到新建的位置,那我具体要怎么处理?直接执行第四步的话,它会创建一个LAYER,这显然不符合要求
又或者从第4撤销到第3步时,实际操作是删除layer3,直接执行的结果是将layer2删除
可能是我的处理模式本来就有问题,不知道大家有没有什么可行的方案可分享一下?不胜感激!!



网友 CoderPlusPlus 提出了一种方法:





你的每个动作类都定义Execute方法和Undo、Redo方法,例如新建动作,Execute方法里进行新建,Undo里执行删除,Redo里也是新建
用一个栈来保存命令,执行命令时先将其入栈,然后执行Execute,需要撤销时栈顶做临时回退(此时只是栈顶的移动,实际命令对象还没有真正出栈,同时记录原栈顶),同时对经过的每一个命令对象执行Undo,在执行若干次撤销后有两种情况,如果调用了新的命令,此时此前撤销过的命令对象真正出栈,而如果选择重复,则栈顶前进,经过的命令对象执行Redo方法,这样可实现任意次的撤销与重复
总之思想就是把命令会引起变化的状态的初值和终值由命令对象来保存
下面是一个简单示意图:



{依次执行C1、C2、C3命令后的命令栈}



C1——C2——C3(Top)



{执行两次撤销后的栈,此时C2、C3处于“待定状态”}



C1(Top)——C2——C3



{执行一次重复,此时C3处于“待定状态”}



C1——C2(Top)——C3



{执行C4命令}


C1——C2——C4(Top)



weiym给出了如下的代码和分析:



LZ有没有看我那个程序, 实际上用的是设计模式里的Command模式,
那里面包含3种操作:新画一个图形, 橡皮擦掉一个图形,改变选择区域,
分别对应不同的Command: CSCGraphAddCmd,CSCGraphEraseCmd,CSCSelectRectChangeCmd.
然后由CSCCanvasCmdMgr来对所有的操作进行管理,它里面有2个Stack: m_arUndoCmd和m_arRedoCmd, 分别保存Undo和Redo的操作。

class CSCCanvasCmdMgr: public CRefCountBase
{
public:
BOOL IsUndoStackEmpty();
BOOL IsRedoStackEmtpy();

BOOL Undo();
BOOL Redo();

VOID OnAddGraphDone(CRefPtr<CSCGraphObject> pGraph);
VOID OnEraseGraphDone(CRefPtr<CSCGraphObject> pGraph);

VOID OnSelectRectChangeDone(CRect& rtOld, CRect& rtNew);

protected:
std::list<CRefPtr<CSCCmdBase> > m_arUndoCmd;
std::list<CRefPtr<CSCCmdBase> > m_arRedoCmd;
};



当你新画了图形时, 传入新画的图形对象,调用OnAddGraphDone, 在里面构造一个新画Command,保存到Undo的Stack;如果要撤销你的新画动作, 就从Undo Stack里面把你的最新Command出栈,并调用它的Unexecute(), 因为你的这撤销动作也能Redo, 所以同时又要把它存到redo的Stack;如果你要redo这个动作,就把它存会undo stack, 同时调用它的Execute().
然后就要看你各个动作的Execute和Unexecute怎么实现了。
总之,原理就是把你的各个动作封装成就Execute和Unexecute功能的Command对象,然后参照上面的原理就可以了。





我感觉这个就是典型的Command模式,遇到典型的例子真是又形象又直接!收益非浅!

 

Friday, April 23, 2010

【程序即人生】Boost::Bind

这次的主题是boost:bind。在历经了
boost::asio(1)
boost::asio(2)
boost::asio(3)
boost::foreach
boost::function
boost::lambda
boost::serialization(1)
boost::serialization(2)
boost::string_algo
boost::thread
之后,boost常用的很多都学会了,现在自己写点小东西,那是大胆的用大。。。。。。。呵呵,反正自己的东西,就当用来锻炼技术了。在学习boost::signal2的过程中发现自己其实对boost::bind这个将来要进C++标准的库了解还不够多,(在boost::functon中有所提及,也同时学了一点),所以抽了点时间,好好的学习了一下。

Purpose

原来文档中的purpose完全就是教程了,事实上,bind主要用于改造函数,比如,一个地方需要一个无参的函数,你只有一个以int为参数的函数,并且你知道此时int一直为1就可以了,你怎么办?传统方法,直接实现一个函数,然后以1调用以前的那个int为参数的函数。如下:
void  Fun1(int  i) {
    printf(" %d \n " , i);
}
void  FunWeNeed() {
    Fun1(1 );
}
int  main()
{
    FunWeNeed();
return 0 ;
};
当然,这个例子太扯了,我们只需要直接用Fun1(1)调用就可以了,但是bind的目的就是如此,只不过现实中因为各种各样的原因,你的确需要改造函数。再比如下面的情况,你有一个原来写好的函数,接受一个以无参函数为参数,那么,你的Fun1就没有办法派上用场了,那么,传统上,怎么办?如下:
typedef void  FunWeNeed_t(void );
void  CallFun( FunWeNeed_t f) {
    f();
}
void  Fun1(int  i) {
    printf(" %d \n " , i);
}
void  FunWeNeed() {
    Fun1(1 );
}
int  main()
{
//  CallFun(Fun1);          // this line can't compile
    CallFun(FunWeNeed);
return 0 ;
};
Ok,你不得不写新的函数以满足需求,因为你没有简单的办法改变一个函数的参数。事实上,假如你是STL流派的话,那么随着你使用标准库的算法的次数的增加,你会遇到越来越多上面描述的情况,到底很简单,C++是如此的类型安全的语言,它不会加上诸如参数过多就忽略后面参数的胡扯特性。那么,一个算法需要你传进来的是什么形式的函数(或者函数对象),那么你就的怎么做。
去看看,标准库中提供了一大堆多么扯的函数对象吧,less, more,,greater_equal,not1,not2,。。。。。。然后还给了你一堆compose1,compose2........最后附带最恶心的bind1st,bind2nd,事实上,这些东西如此之多,以至于我甚至懒的列举出来,但是事实上我们在项目中用到了多少?简而言之,None!一次也没有,甚至因为很多算法与此相关,我们连那些算法也不用!
为啥C++当年出现了那么多奇怪臃肿无用的设计?可能是,C++标准出现的那个年代,编程技术的发展也就到那个地步吧。。。。。。。。。在C/C++语言中,关于函数的抽象特别的少,原因很简单,因为函数指针太不好用了!(函数抽象也用,但是好像用的最多的是在C语言中无物可用时,不得已的而为之)
记得在哪看过一句话,技术再花哨也没有用,最重要的是足够简单,因为不够简单的技术就很难给人讲解,别人很难理解那么就很难应用。这些C++特性应该算是其中的一例了。
boost中的bind,function ,lambda 就是为此而生的。注意,在tr1中,你就已经可以使用bind和function特性了,这也很可能是将来的C++标准之一。现在boost中的lambda还不够成熟,语法很怪,限制很多,因为,毕竟,boost再强大,仅仅是库啊。。。。。。。。。匿名函数的功能完全值得用语言特性来实现!
上面那个很扯的例子,总的给个bind的解决方案吧。
#include <boost/bind.hpp>
#include <boost/function.hpp>
void  CallFun( boost::function<void (void )> f) {
    f();
}
void  Fun1(int  i) {
    printf(" %d \n " , i);
}
void  FunWeNeed() {
    Fun1(1 );
}
int  main()
{
    CallFun(boost::bind(Fun1, 1 ));         // this line can't compile
    CallFun(FunWeNeed);
return 0 ;
};
需要注意的是,此时不能再使用函数指针了,bind的天生合作伙伴是function,而function是支持函数指针的(如上例所示) 。目的将的很多了,下面看看用法吧(不是什么问题)。

普通函数

最有意思的是,你甚至能用bind来扩充原有函数的参数,见下例:
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
using namespace  std;
using namespace  boost;
void  f(int  a, int  b)
{
    cout <<"Argument 1 is "  <<a <<endl;
}
void  g(int  a, int  b, int  c)
{
    cout <<"sum is "  <<a+b+c <<endl;
    cout <<"arg 1: "  <<a <<endl;
    cout <<"arg 2: "  <<b <<endl;
    cout <<"arg 3: "  <<c <<endl;
    cout <<"---------------------------"  <<endl;
}
int  main()
{
    function<void (int ,int )>  f1= bind(f, _2, _1);                 // 调整参数1,2的位置
    f1(1 , 2 );
    function<void (int )> sum1 = bind(g, _1, _1, _1);        // 3个参数变1个
    sum1(10 );
    function<void (int , int )> sum2 = bind(g, _2, _2, _2);       // 3个参数变2个,仅用一个
    sum2(10 , 20 );
    function<void (int , int , int )> sum3 = bind(g, _3, _3, _3);      // 3个参数还是3个,但是仅用1个
    sum3(10 , 20 , 30 );
    function<void (int , int , int , int )> sum4 = bind(g, _4, _4, _4);     // 3个参数变4个,但是仅用1个
    sum4(10 , 20 , 30 , 40 );
return 0 ;
};
输出结果:
Argument 1 is 2
sum is 30
arg 1: 10
arg 2: 10
arg 3: 10
---------------------------
sum is 60
arg 1: 20
arg 2: 20
arg 3: 20
---------------------------
sum is 90
arg 1: 30
arg 2: 30
arg 3: 30
---------------------------
sum is 120
arg 1: 40
arg 2: 40
arg 3: 40
---------------------------

函数对象

注意用法中很重要的一条:通常情况下,生成的函数对象的 operator() 的返回类型必须显式指定(没有 typeof 操作符,返回类型无法推导)。(来自Boost文档)
#include <boost/bind.hpp>
#include <boost/function.hpp>
using namespace  std;
using namespace  boost;
struct  F
{
int operator ()(int  a, int  b) { return  a - b; }
bool operator ()(long  a, long  b) { return  a == b; }
};
int  main()
{
    F f;
int  x = 104 ;
    function< int (int ) > fun1 = bind<int >(f, _1, _1);      // f(x, x), i.e. zero
    cout <<fun1(1 );
    function< bool (long ) > fun2 = bind<bool >(f, _1, _1);       // f(x, x), i.e. zero
    cout <<fun2(1 );
return 0 ;
};
其他的也就很简单了。

成员指针

例子来源于boost文档。
#include <iostream>
#include <boost/bind.hpp>
#include <boost/function.hpp>
#include <boost/smart_ptr.hpp>
using namespace  std;
using namespace  boost;
struct  X
{
void  f(int  a) {
        cout <<a <<endl;
    }
};
int  main()
{
    X x;
    shared_ptr<X> p(new  X);
int  i = 1 ;
    bind(&X::f, ref(x), _1)(i);     // x.f(i)
    bind(&X::f, &x, _1)(i);         //(&x)->f(i)
    bind(&X::f, x, _1)(i);          // (internal copy of x).f(i)
    bind(&X::f, p, _1)(i);          // (internal copy of p)->f(i)
return 0 ;
}
可见bind的强大,支持自己拷贝需要的对象,支持引用,甚至,支持智能指针。
最后一个例子,结合标准库容器及算法的例子,这才是展示bind的强大的地方。
还是来自于boost文档。
class  image;
class  animation
{
public :
void  advance(int  ms);
bool  inactive() const ;
void  render(image & target) const ;
};
std::vector<animation> anims;
template <class  C, class  P> void  erase_if(C & c, P pred)
{
    c.erase(std::remove_if(c.begin(), c.end(), pred), c.end());
}
void  update(int  ms)
{
    std::for_each(anims.begin(), anims.end(), boost::bind(&animation::advance, _1, ms));
    erase_if(anims, boost::mem_fn(&animation::inactive));
}
void  render(image & target)
{
    std::for_each(anims.begin(), anims.end(), boost::bind(&animation::render, _1, boost::ref(target)));
}
例子展示了erase_if,for_each算法中使用bind的方法,当然,实际中,假如是你的游戏引擎中的update,render函数,碰到上述需求或者类似代码实现是很正常的,但是,你会放心的仅仅为了简化一些代码,然后将如此性能相关的位置,直接交给bind吗?

Wednesday, April 21, 2010

【转】美剧字幕组长讲述她如何练听力的

她的新浪博客:http://blog.sina.com.cn/loveandpeacejoy

今天写点儿正事。说说该如何修炼咱们的耳朵。此文只针对能力的提高,不针对应试!往往能力提高了,应试就不会有问题!

先说一个基础问题:有一个真理是不变的,那就是,语言,是一种能力。听、说、读、写,四种能力任何一个,没有连续的三个月以上的辛苦付出,是不会有显著提高的。不管怎样的方法,怎样的秘诀,如果你不坚持,是不可能有任何提高的,所以这个得先明确了。

其次再来说技术性问题:该如何练听力。不同人适合不同的办法,没有一套方案是可以做到放诸四海皆准的。所以我只能分享我自己的练习耳朵的过程,然后提些建议。

1. "到底应该怎么练听力啊?"
我正式开始重视起听力,是从大一开始的。郑老师给我们推荐Step by Step四册书听,于是我就和张希开始每天听这套书。一共四册,我每个学期听一册,用两年听完了这四册书,上面的题都认真做了。最一开始一定是什么都听不懂的,因为高中之前,我基本没怎么练习过听力,准确地说,那时候不知道原来耳朵是需要练习的。。我没有别的办法,听不懂就重新听,用复读机一遍一遍地听,四册书我觉得我听了不下二十遍,听坏了两台复读机,N个耳机,耳朵插耳机插的出水疱,后来换成戴在头上的大耳机就稍微好了些。这套教材很好,因为难度是一点点提升的,所以比较推荐。

除了Step by Step以外,同时进行的听力练习就是听广播。专四有新闻听力,所以我和张希就去店里买收音机,因为是痛下决心要练好听力的,所以我们都狠下心买最好的收音机,接收效果强的那种。于是,我们就买了全店里最大的收音机,比一般的正常收音机都大两倍,我俩买的一模一样的,只是她是黑色的我是灰色的。于是学校里就多了一道亮丽的风景线,总有两个人拿着砖头大的收音机在学校的清晨走来走去,嘴里还一直念念叨叨。

起初刚开始听的时候,听的是VOA,因为传说BBC很快,所以我没敢碰它,只碰了VOA。第一天听的时候我给崩溃掉了,只能听懂"This is VOA。。。"。但是没有办法,只能一天覆一天的听,不能断开。于是我就每天像一个石头一样,早晨六点半到八点整,雷打不动,起床听VOA。正好步行去学校。到后来的时候,八点开始上课了,我还偷偷把天线伸出去继续转台听BBC。大家别觉得听不懂很可怕,咱们是中国人,北方人第一次听广东话也听不懂,但是你多听,硬着头皮听,不就也慢慢能听懂了吗?比如小怡子,她一开始也不懂上海话啊,那么复杂,谁能听懂?但是在上海活了四年,现在小怡子不但能听懂上海话说话,还能听懂上海话骂人,还会说上海话,就是这个道理!所以你别问,你就听。听不懂咋办?听不懂继续听啊!说那么多废话干啥!你就听就行了!只要你别放弃,你早晚有一天能听懂!就比如我,大一一年基本没咋听懂,但是就傻傻地听,在大二的一天早晨,我正在刷牙,广播里好像正在播布什的一个演讲,我突然发现我一字不落的都能听懂了,我一兴奋,就把刷牙水喝了。

后来越听VOA越觉得速度慢,于是转战BBC。第一次听BBC,以为是在辩论会,后来发现,是正常语速,我就给崩溃了。崩溃完以后,继续听,终于发现,要想练耳朵,BBC才是王道。我觉得跟读是一个比较不错的方法,他说一句,你就在三秒钟以后重复他的话,你只要能重复下来,你必定是听懂了才去重复的吧。我就那么一直跟读了好几个月。英音和美音都听习惯了,才是真正听力好。光吃美音,不吃英音,那不行。毕竟现在国际正式场合,新闻发布会的同传之类,都说的是英音。

我就这样听力教材加VOA和BBC,坚持了四年没断,当然肯定有过年之类早晨没起来的可能。但如果一般早晨没起来,那么当天的听力我一定会在下午五点补回来。听力,是需要每天都坚持的,一天都不能断,不能断,把它当成吃饭和喝水。耳朵这个东西,你不用了,一定会生疏的。

如果听广播因为条件等没法做到的人,可以上网听,我博客左边有VOA,BBC,CNN,CSPAN等听力网站的链接,进去以后都有在线可以听的。再说一下,我的这个办法,不可能保证都能提高听力,到底可行不可行,完全看你自己的坚持程度。坚持的时间越久,你的听力会越好。

2. "我真的认真听了,但是我为啥就听不懂呢?"

这是一般人们爱问的第二个问题。我觉得如果听不懂的话,有两个可能。第一,你练习的不够久。比如小怡子,她如果只在上海待了一年,是不可能听懂上海话的,只有她待了四年,她才能真正听懂。明白?第二,很可能是你发音不准。听力能听懂东西,是一个语音识别的问题。比如你一直把"尴尬"念成"监介",那么别人说"尴尬"的时候,你一定听不出来那是"尴尬"。所以,如果你真的很下辛苦练听力了,坚持了至少三个月以上,你还是一点起色都没有,就也许是你的语音识别有问题,当然不可能像尴尬监介那么严重的语音识别有误,但只要发音不准确,就绝对可能导致你听差。这样的情况下,就好好补习一下音标一类的知识,让自己首先能把音念准了,然后再听。这样也许会有帮助。

3. "我听听力的时候总走神,到底怎么回事啊?"
有人听听力总是听着听着就差了,听着听着就走神了,听着听着就睡着了。如果是这样,就说明你不能长时间集中精力做事,这样的话,你要是总走神,就算坚持了三个月,其实也相当于只听了3天的功力,没啥大用。你要是坚持不了,你可以试一下跟读,哪怕隔句跟读,也能保证帮助你集中注意力。因为你要是要做到跟读,就必须使劲听,并努力记忆他的话,这样就可以集中精力了。还有,强烈建议早晨听听力,可以很清爽,不要再睡过去了。

4. "给推荐点儿练习听力的教材哇!"
这个问题我没什么发言权,因为我用过的书版的教材很少,只有Step by Step和中级听力、高级听力。我练听力主要就是听广播了。

5. "咋能通过看电影来练习听力呢?我发现我每次电影看了,但是听力没练"
我自己是在听力练到一定程度以后,才开始做电影的。我最一开始的听力,并不是通过看电影提高的。我最一开始看电影,也是看中央六台那种的,中文配音,中文字幕,跟英文不沾边。后来才开始买碟看(那个年代还没开始流行从网上下载看)。买碟租碟的时候就遇到了问题,说的是英文,我觉得我好像似乎能听懂他们说什么,但是底下的字幕翻译却和我听到的不一样,我就郁闷啦,觉得他们翻译的好烂,自己很愤怒,因为很搞笑的东西我都笑翻了,但是我妈看了底下的字幕都笑不出来。后来就加入了字幕组,一开始没敢尝试听译,因为我对我自己的听力那时候还没自信到那种程度。听电影和听新闻绝对不是一回事,就算你BBC和VOA都听得百分之百了,电影绝对有听不出来的东西,一是因为角色发音各种奇怪,各种口音,二是因为新闻里是正式用语,而电影里是俚语偏多,语速快的时候能吓死人。

你要是选择用电影练习听力,建议最好有听力基础,至少VOA的水平应该能听懂百分之七十。可以选择一部你最喜欢的百看不厌的电影,反复看好几遍,遇到听不懂的地方,拖回来重新听,听了五遍以上若是还没听懂,就不要听了,直接挂字幕看看人家说的是啥,看到subtitle以后再分析一下你为啥没听懂,如果单词明明都认识,但你就是没听懂,那八成就是因为吞音连音等问题。这些问题很好解决,你自己学会这样的读法,下次就能听懂了,还是一个语音识别的问题。

如果你决定用电影来提高听力,那你一定要记住你看这个电影的目的不是for fun,是要练听力,所以别看着看着太高兴,到后来直接挂着字幕一路看过去,那样就没有效果啦。谁最一开始都不习惯看裸片(即无字幕),你得坚持住,哪怕半懂不懂半猜半懂得也得看完,多看几遍,多听几遍,就明白了。然后再外挂字幕看。

6. "为啥电影里总有听不懂的东西"
这个问题我专门问过阿比大叔,就是我最最崇拜的听译牛人,他的答案就是缺乏对画面的分析,在短短两分钟左右的预告片里,很有可能突然插出来一句莫名其妙的台词,这个时候如果能仔细分析背景画面,就能分析出来很多剧情。这点我做的很不好,因为每个预告片里,总有那么一句两句我听不懂,郁闷的要死。还是缺乏练习,得多练多练,啥时候电影能看到阿比大叔那个水平,我就开心了。所以我还要努力!!!

再强调一遍,语言能力的提高,没有任何捷径而言。(有捷径,书山有路勤为径)听说读写四项能力,都是硬功夫,你什么时候不狠下心死练,是不会有实质性提高的。我想起了XDF一个老师说的经典的话,能力提高的最大捷径就是努力,但是努力最痛苦,所以很少人能走成捷径。So,如何提高,其实人们自己心里都清楚,但还是会期望度很高的去问别人该如何做,当得到一个答案的时候,自己又失望,怪人家没有把"真经"传授给你。但其实,世上根本没有什么真经,没有秘诀,唯一有的,只有一日一日的切实付出。如果你能疑虑的少一些,付出的多一些,你的听力早就上去了。(说得多好啊,还说自己语文不好,让本人汗颜了!)

所以,赶快抓起任何一个材料,只要是native speaker说的东西,开始练吧。时间很宝贵。Hard work counts,其他都是扯淡。

单词篇:

Ragbear Survivor听译组组长

我们为什么要默写六级单词?(一种由我发明的英语学习方法的理论化叙述)

WHY

我们为什么要默写六级单词?

◆CET-6在非英语专业的求职过程中起着Vital般的作用。甚至可以说六级这个分数是会伴随你一生的。

◆CET-6这些单词并非是中国CET考试院从某本Dictionary里面挑出来的,而是由美国历史上最著名的词汇家Webster根据生活实际经验以及通过统计学意义上的计算而筛选出来的。

◆因此六级单词非常具有现实意义:(1)六级单词属于报刊文章中出现频率最高的Basic Vocabulary。(2)六级单词几乎涵盖了所有生活中要常用的、比较fancy的meaning.

◆六级单词在考试过程中的重要性比其他考试体现地要明显很多。

◆在听说读写译的五项技能中,先不论最高层次的译。只有说和写才能真正地做到:make a direct profit! 因为只有这两者是output.(只进无出,那叫闷骚!)而写的过程中,拼写这个问题困绕了太多人。英语单词拼错,就像中文写白字那样,是一种写作者自身修养还未到家的体现!

◆何谓我认识这个单词(e.g: exaggerate)?

第一,是音。我听到别人读exaggerate,我明白这是夸张的意思。这就引出了
第二点,意。
第三点,是形。也就是说我看到这个词,我知道她表达的意思是夸张这个concept。。
好,现在我们来过一遍是怎么默写exaggerate这个单词的?首先你听到了发音,如果你熟悉"音",就知道是在说夸张的concept。OK接着开始默,根据发音e-xa-gge-rate。事实上如果你对这个词形不熟悉的话。你根本无法确认自己根据发音而作的拼写是否正确。因此,如果你能准确默出一个单词。95%的情况下说明你对这个word的音形意都掌握了。(5%的情况是:不知道词的意思,恰好根据发音猜对了拼写)

◆因此默写的整个思维过程就是一种将音形意完全融合在一起,相互碰撞,相互促进的BrainStorm(直译)。

◆如果能在读完单词的下一秒中就默出一个单词,95%的情况说明你已经完全掌握这个单词的音形意了。反过来说,如果音形意任何一项的掌握不牢都会导致单词的默写错误。

◆语言学上有所谓的"记单词的最佳路径":先记发音,再通过发音识记词形,最后才是把音形与意通过记忆、实际运用等方式牢牢掌握住。[其实整套学习思维方法Follow的就是这条Best Route]

HOW

我们怎样默写六级单词?

◆我不认识俞敏洪,也和NEWOriental无任何利益瓜葛。但好书就是好书:《六级词汇 词根+联想 记忆法》 [这个软文写的厉害的,不过组长应该是真心推荐的]

◆这本书最好的几个优点叙述如下
(1)分为30个lists。滴水穿石,每天7到8分钟。累计起来不得了。实际上"任务分解法"应该算是一种很好的英语学习方法。
(2)联想法(胡思乱想),词根法,漫画法…俞敏洪同志发扬了无论用什么猫狗方法,只要能背出单词的就是好方法的伟人思路写下了这本书。将各类单词记忆法发挥到了极致!
(3)有mp3光盘。这是默写的基本条件。这其实也预示了另一个真理:词汇书必须有发音光盘。(其实我觉得新东方其实可以做得更好:把例句也读出来,那就更棒了。[伟大的Time1000就是这样的])

◆推荐默3遍。(半年时间内搞定)
每天默1到2个unit。我第一遍默的时候是这样的:第一天晚上先看两个unit。然后勾出自己不稳作的词。第二天早上默。默好后对,错了抄在书上。并再听一遍,跟读,有例句的读例句。第二天晚上再看后面2个unit……
虽然我觉得自己从小就比较注重拼写,但默第一遍时还是会错得比较多,此时一定要挺住。现在错绝对是好事,不错哪能进步。
语言学家说:当接触一个单词7遍后,你将能永远记住这个单词。由于每次默写后还要读一遍,再加上第一遍默的时候还在前一晚看过一遍:加起来正好7遍。

◆Note:当一个单词意思比较多时,不要黑心,每次就记一个意思就成。

口语篇: 我是怎么看friends练口语的
很早就开始看F6,最开始是从起床开始,就一个人对着电脑,傻笑一天,每天吃一顿饭,傍晚和同学一起吃饭的时候,基本就不会说中国话了,被人说什么第一个反应就是英文。周末同学都回家了,更是变本加厉,因为没有人和我说话,内心独白都是F6里的各种声音,还有那种“哄笑”配乐,一个周下来,感觉人快疯了。

大学的时候是为了好玩,没想着真的用它来学英语。

后来工作了几年,因为一直野心勃勃的要去美国公干,所以从那个时候开始重新FAN F6,很长一段时间过去,学下来,感觉有些许体会了,上来冒个泡。

第一遍,带中文字幕看一遍
10季真不是个小数字,看了一遍把当初那种感觉找了回来,所谓的感觉,就是在内心独白的时候都是英语,说话的第一个反应也是英文。

第二遍,带英文字母看了一遍

我买的是60张的那种DVD,英文字母有几季还是不错的,后面的越做越差,真是没法看,就当了剧本。第二次看,基本都能听懂了,就帮着DVD校对字幕,校对的过程中,听力本身就是一个提升。

第三遍,不说你也知道了,去掉字幕,
去掉字母有一个好处,就像丢了拐棍,你听起来就不会像看着英文字母那样一下就反映到脑子里,还要想一下,哦,这个单词是什么来着,因为我们很多时候对于掌握了的单词,突然冒出来,还是会思维停滞一下,就在这停滞的一下,新的内容又冲进来了,你就顾此失彼,到最后,前面的没想起来,后面的又忘了听,刚开始的时候是懊丧不已,因为前两遍的信心全被他给摧毁了,不过没关系,很正常的么,这个地方,你就要不停的重复听,所以你买DVD机比较好,有那个A-B重复健,可以无限重复你要听的句子,你总有想起来的那一刻吧

第三遍是最痛苦的,也是最能升华的一个阶段。
我在做第三遍的时候,是听力口语一起来的,其实这两个本来就是分不开的,

口语,要求自己强力模仿!!!!!注意这个词哦~~~不是吃干饭的,充分利用了A-B健,一个句子重复放,跟着读,然后跟着说,最后脱口而出,一点也不比他们差,甚至可以在语气,语调上,和他们一模一样。作这一部分的时候,我犯了一个错误,就是跟着读剧本,这是十分错误的,正确的做法是,像学鸟叫一样,学他们的声音,不要把自己原来读英文的习惯带到里面去,剧本只是告诉你他们再说什么内容,只是一个提示的作用,因为他们有很多连度,四个音节,在他们嘴里常常变成了2个音节,甚至一个音就带过了,你根本就反应不过来,这也就是我们听不懂他们说话的原因,太快了,而你根本不知道他连读了,如果按照自己的读英文的习惯,永远也做不到他们一样快。所以记住,!!!!!!学他们发出的声音,而不是读他们说出的句子!!!!!!!

这第三遍,我可以用老牛拉破车来形容,实在是很慢很无聊,要花费大量的时间,特别是一开始,记得101背到我想吐,莫尼卡的那句 “THERE IS NOTHING TOTELL@!#$%@#%@!%@$#%”可以直接当减肥药了,一听到就想吐!!但是,有一点保证,以后老外用多快的速度,我都能听懂她在说“THERE IS NOTHING TOTELL@!#$%@#%@!%@$#%”而且可以和她说的一样快,一样纯正的美国纽约音。兄弟们~~~代价惨重阿~~~~~`你可以算一下,一集大约20分钟,每句话重复10遍,那是什么概念,就是一集学下来要200分钟,折合3个多小时,如果你特别笨的话,多跟几遍,时间又上去了,我经常会思想溜号,A-B的时候不知道想什么去了,就要多重复几遍。我当初算了一下,我大约要跟到第7遍的时候才有感觉,前面不是语速慢了,就是快了,要么就是停顿不对,也可能我比较笨?加上笨的原因,加上溜号,大约有4个小时一集把.

下面分析一下他们六个人的口音语速,RACH,我最喜欢的角色,她的口音不很好学,因为她经常会发出很可爱的声音,感情丰富啊,而且连音也比较多,但是学她很有用,因为她的发音很性感,个人认为。CHANDLER这个家伙经常会把我逼疯的,他太贫了,语速又快,最难学了,,最好学的是PHEEBS,很喜欢她,她的发音很圆润,语速也很正常,MONIKA 可以用她来练长句子,她经常会一口气说很多,JOEY,他反映慢,语速适中应该是最好学的一个,可是他的声音太低了,不适合女生学,我学他太吃力了,男生的话是个首选~~~~

这样我整了3季的时候,除了生词,在新天地泡吧的时候,可以和老外自由对话,心理满足了一把

过了3季,后面的7季就会块很多,因为很多句子,在你的耳朵里已经是很简单的,根本不需要重复,你要练习的只是特别难的那些长句,记不记得伦敦之行?走之前,莫尼卡的那一口气说完的长句子,呵呵,那就是最高境界,你可以脱口而出,和她一样快,一样不喘气,后面的你就不用跟了,你可以出师了~~~
但是,这是3季以后的事了,3季不过,一切免谈~~~

而且有一项工作是必须作的,是贯穿10季的工作,那就是笔记!!!
除非你的牛人,不过牛人也就不来看我这个帖子了,呵呵

笔记很重要,里面会有生词,特别是“该死的ROSS”,他在里面经常不出好词,你就查吧,

再就是俚语,很多俚语这才是地道的美语,你只有作了笔记你才有积累,最重要的是多有成就干啊,看到那么多的笔记,我的笔记可以从地板摞到写字台那么高,因为我字特别大?不是!是我做得很细!细到从头看IS的用法,把它当作一个事业来做,当作一个重整英语的契机,好好的梳理一下自己的存货。

说实话,这也很痛苦的~~~~~看肥皂剧是很开心的,可是学肥皂剧就没那么开心了
最后,就是坚持的动力了,
我不知道别人是为什么,要学好英语,但是你的动力要足,而且经常要受受刺激,否则的话很容易坚持不下来。

好啦,罗嗦了一大堆,就是想献给所有喜欢F6的朋友,因为老在各个F6的英文论坛上潜水,只当不传,现在写了这一大队,也不知道对你有没有用,不管怎么样,鲜花鸡蛋,统统收下了。

谢谢~~~~

【转】Matlab 心得

Today I need to give a presentation on Matlab. So I read some documents and relevant questions. Here is some studies form other people who have already known matlab well.

matlab心得zz 首先我想说的是,matlab跟其他语言不一样(我用的比较多的编程语言,除了matlab就应该是c或c++了,VB和Delphi也接触过,我想大部分人也差不多),如果你抱着“把其他语言的思想运用在matlab里面”的话,那么我想,即使程序运行不出错,也很难把握matlab的精髓,也就很难发挥matlab的作用了。所以,如果你是希望matlab作为VC的附属品,即你不想在matlab上面花太多功夫,只纯粹想用matlab来完成VC做不了或很难做成的任务的话,那么,这篇文章你也不需要再阅读下去了;如果你是希望掌握一门语言、一个工具,使它更有效为你服务的话,那么,希望本文对你有所帮助。 Matlab是一个基于矩阵运算的软件,这恐怕是众所周知的事情了,但是,真正在运用的时候(就是在编程的时候),许多人(特别是初学者)往往没有注意到这个问题,因此,for循环(包括while循环)满天飞…………..这不仅是暴殄天物(没有发挥matlab所长),还浪费了你宝贵的时间。对此,一些朋友(MVH)在他的“MATLAB 小技巧”一文中也有所涉及,雷同的东西我也就不重复了,matlab的“帮助”里面也有相关的指示。我这里想说的一点是,初学者往往在初始化矩阵的时候注意到这个问题,懂得了使用矩阵而不是循环来赋值,但是,在其他环节上,就很容易疏忽,或者说,仍然没有摆脱C++的思想。举个例子吧,下面的代码是我的一个师弟写的,我想他接触matlab也有2、3年时间了(在此说明一下,接触2、3年并不是表示每天都会跟matlab打交道,我本人也不是,只是在一年某几个时间段里面连续使用),但是仍然会出现类似的问题:

J = 0;

lt = size(imf1,2);

for (i = 1:lt)

if (abs(imf1(i)) > 1)

J = 1;

break

end

end

上面的代码实现了一个目的――检查信号imf1(一个向量)是否存在绝对值大于1的点,这显然是基于C++的思想写出来的。如果在matlab下面,其实用两个语句就足够了(当然,可以合并为一个): q = find(imf1>0); J = ~isempty(q); 这样的修改带来的好处是很可观的。 又如: for j = 1:num imf1(start1+j) = 2*li1(j+1) - imf1(start1+j); end 这是一个对称翻折的问题,它完全可以用以下这个语句简洁表示: imf1(start1+1:start1+num) = 2*li1(2:num+1) - imf1(start1+1:start1+num); 因此,如果是新手,可以先用循环(基于C++的思想)来编写代码,然后看看能否用matlab的语言(基于矩阵的思想)来改进。当然,这样做的前提是你对matlab提供的一些函数比较熟悉才行,这些函数在matlab的“帮助”那里搜索“Functions Used in Vectorizing”就可以找到一些,其他的也可以找相关的书籍(没找到?不可能,电子版总可以下载到的) 对提高matlab编程能力的方法,我想主要有以下三个:

1. 查help

2. 多上上论坛,搜索帖子、发帖子问人

3. 阅读别人、特别是牛人的程序

当然了,正如所有的程序语言一样,“3分课本7分上机”,一定要动手才行,不能光看。多想、多思考、多尝试,才是正路。

最后,整理一下常用的快捷键(用【】表示)或命令:

1. 在命令窗口(Command Window)中: 1) 【上、下键】――切换到之前、之后的命令,可以重复按多次来达到你想要的命令 2) clc――清除命令窗口显示的语句,此命令并不清空当前工作区的变量,仅仅是把屏幕上显示出来的语句清除掉 3) clear――这个才是清空当前工作区的变量命令,常用语句clear all来完成 4) 【Tab】键――(转自版友心灯)在matlab@hit.edu.cn看到的:在command窗口,输入一个命令的前几个字符,然后按tab键,会弹出前面含这几个字符的所有命令,找到你要的命令,回车,就可以自动完成。目前讨论结果是:matlab6.5版本中,如果候选命令超过100个,则不显示。而在matlab7以后版本中,则没有这个显示,均可正常提示 5) 【Ctrl+C】(或【Ctrl+Break】)――(转自版友yangjin_ren)在matlab程序运行过程中,可能由于程序编写的失误,导致程序不停的运行,在命令窗口输入“Ctrl+C”可以将运行的程序停下来,而不需要将整个Matlab程序关掉。不过进行此操作的前提是能够激活切换到命令窗口才行,呵呵。


2. 在编辑器(Editor)中: 1) 【Tab】(或【Ctrl+]】)――增加缩进(对多行有效) 2) 【Ctrl+[】--减少缩进(对多行有效) 3) 【Ctrl+I】--自动缩进(即自动排版,对多行有效) 4) 【Ctrl+R】――注释(对多行有效) 5) 【Ctrl+T】――去掉注释(对多行有效) 6) 【Ctrl+B】――括号配对检查(对版本6.5有效,但版本7.0无效,不知道是取消了还是换了另外的快捷键,请大牛们指点,其他版本没有测试过) 7) 【F12】――设置或取消断点 8) 【F5】――运行程序其余的例如在Debug状态下的快捷键就不多说了,自己看菜单Debug吧 累了, 有时间再写吧。希望大家多交流~~~~~~


关于计时我摸索到这样的语句,tic; t=toc; 程序运行到tic时,开始计时,以秒为单位。运行到t=toc时,就把这个时间值赋给了t.如果再运行到t=toc语句,会把累计时间赋给t. 这应该是很有用的,在matlab中有时候会运行到死循环,而又不会改库函数时,就可以用这个计时变量,当时间t大于定值时跳过这个循环。

Monday, April 19, 2010

If you are a Chinese and using English Windows 7!

How to switch you langrage setting from English to Chinese and support Chinese character rendering!

Control Panel->Change Keyboards or other input methods->Administrative->Change System Locale->Pick Chinese Simplified PRC etc or Traditional Taiwan etc based on your needs.

Saturday, April 17, 2010

There is an opportunity to continue the research on Computer Vision!

I found a project on pattern recognition in our department. As separated from computer vision for one year, I really want to return and do something!

More than one year ago, I met a very kind person. He guided me and told me what is research and how to do research. He is very kind… Although I made mistakes, wasted time and ignore his requirements sometime, he never drops me or leaves me alone. He use his patient and wisdom drive away the darkness occupying at the front of me!

From then on, I really want to follow your example, to be a person could give others hope. Dr. Cao, please give me a little more time, and I will not let your down!

Wednesday, April 14, 2010

How to use “FreeGLUT” on windows with MinGW and Qt Creator


GLUT has been a very popular light weight library for student and enter-level researchers for years, as its clear structure, not excluded I mean, small size and perfect connectivity with OpenGL. However, GLUT is not a free software and has not been maintained for a while, although I am not sure about the maintainability of GLUT, it has been same since I was an undergraduate and learn OpenGL first time. So FreeGLUT is another recommended option for GLUT people.
In recent days, I am trying to compile and program some code on Window with GCC/G++. My first idea is Cygwin, which is an total solution for GNU stuff on Windows. However, the problem is that Cygwin does not have a IDE for Qt development and you have to take care all of the make file and dependence. Instead, I think MinGW is an executable substitution. Qt Creator is based on MinGW and Qt library has been deployed on MinGW. So, comparing the problem caused by Qt on Cygwin and make file, I prefer to transplant FreeGLUT to MinGW!
Ok, let us begin the instruction! The installation of FreeGLUT is simple! As I mentioned, FreeGLUT is a light weighted, the package is small. Some kind hearted people has been compiled the source code and publish it on the web. Thanks for that! You may download a package called “freeglut-MinGW-2.6.0-3.mp.zip” and unzip it. You gonna get two folders and a DLL( if you do not know what is DLL, forget about it)! Please copy the header files in “include/GL” to “include/GL”, which may under “C:\Qt\2010.02.1\mingw\”, and copy the lib files in “lib” to “C:\Qt\2010.02.1\mingw\lib”. Then you need to copy the “freeglut.dll” to system32, or sysWOW64, if you are using a 64 bit computer. The next step is configure Qt creator. Make sure that your PRO file has “QT += opengl” and “LIBS += libfreeglut”! That is all, enjoy the “Hello world” below!

If you want to know something about static linking or beyond, please chech this blog:
http://www.transmissionzero.co.uk/computing/using-glut-with-mingw/

#include
#include

void keyboard(unsigned char key, int x, int y);
void display(void);

int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutCreateWindow("GLUT Test");
glutKeyboardFunc(&keyboard);
glutDisplayFunc(&display);
glutMainLoop();

return EXIT_SUCCESS;
}


void keyboard(unsigned char key, int x, int y)
{
switch (key)
{
case '\x1B':
exit(EXIT_SUCCESS);
break;
}
}


void display()
{
glClear(GL_COLOR_BUFFER_BIT);

glColor3f(1.0f, 0.0f, 0.0f);

glBegin(GL_POLYGON);
glVertex2f(-0.5f, -0.5f);
glVertex2f( 0.5f, -0.5f);
glVertex2f( 0.5f, 0.5f);
glVertex2f(-0.5f, 0.5f);
glEnd();

glFlush();
}

My first work has been labelled a sick tag

I have gotten my first publication few days ago. Instead of exacting and celebrating, I feel a little sorrow and upset. My undergraduate work, action recognition, accepted by ICPR, keep her as the fourth author. I do not care which slot I should be placed, as I know I only initialize the topic and write little code for the idea. My colleagues and formal supervisor put a lot of efforts on it. One day, the paper published, it means our ideas, our implementations and results are highly acknowledged by the computer vision community and other researchers.
But, there are still an individual, doing nothing but keep her name on it. If I were her, I will be very shamed on this, no matter it is intent or not.
You need papers, me too. But if you cannot publish those paper by your own, how could you demand your student to do so?

Sunday, April 11, 2010

You enhanced my strength and confidence, thank you!

Today, another boring Sunday morning, we get up later. Maybe the shopping yesterday consumed to much energy, or the food yesterday have not recover her body from shopping, Coco does not feel well. She sweats out a lot and even wet the bed sheet. I cook some hot food for her, including a bowl of spicy soup, two hot dogs and a cup of coffee. Hope she gonna eat them up, but she disappointed me once more. Whit no other options, I swallow the remainder and go to lab.

Up to now, everything in my life goes well and ordinary, go to lab without propers and cook meals without motivations. But now, it is changes by an Email, the paper was accepted by a conference, which means I have publication now......

New graduate school, new job opportunities and new colleagues/supervisor are waiting for me.....
Thanks!

Tuesday, February 23, 2010

Talking with the professor from VT

1. If you treat your student like professionals, they will act like professionals. If you treat your student like kids, they will act like kids.
 
2. Some faculties have MIT addiction. No matter what MIT did, they want to make a copy or re-implement it. I do not think it is a right direction. No matter how good you did, you will always be the second. If you are the second, how could you get grant? You should find an area which you can lead them.

Saturday, February 20, 2010

[C#]利用Socket送傳class or struct序列化資料

一般利用Sockert都傳送文字字串.

那如果要傳送class or struct的資料怎麼辦呢.

重點就是先將class or struct序列化.

直接看範例吧.

共用Class or Struct

person.cs

01 using System;
02 using System.Collections.Generic;
03 using System.Text;
04  
05 namespace ClassLibrary2
06 {
07     [Serializable]
08     public class class_person
09     {
10         public string id;
11         public string name;
12     }
13  
14     [Serializable]
15     public struct struct_person
16     {
17         public string id;
18         public string name;
19     }
20 }

Client端,要using共用的dll

Form1.cs

01 using System;
02 using System.Collections.Generic;
03 using System.ComponentModel;
04 using System.Data;
05 using System.Drawing;
06 using System.Text;
07 using System.Windows.Forms;
08 using System.Net.Sockets;
09 using System.Net;
10 using System.Threading;
11 using ClassLibrary2;
12 using System.Runtime.Serialization.Formatters.Binary;
13 using System.IO;
14  
15 namespace WindowsApplication5
16 {
17     public partial class Form1 : Form
18     {
19         public Form1()
20         {
21             InitializeComponent();
22         }
23  
24         private void btnSendClassData_Click(object sender, EventArgs e)
25         {
26             try
27             {
28                 IPEndPoint hostEP = new IPEndPoint(IPAddress.Parse(this.tbIp.Text), int.Parse(this.tbPort.Text));
29                 Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
30                 socket.Connect(hostEP);
31                 byte[] bytesSend = new byte[1024];
32  
33                 //序列化
34                 BinaryFormatter bf = new BinaryFormatter();
35                 MemoryStream stream = new MemoryStream();
36                 class_person person = new class_person();
37                 person.id = this.tbId.Text;
38                 person.name = this.tbName.Text;
39                 bf.Serialize(stream, person);
40  
41                 bytesSend = stream.ToArray();
42                 socket.SendTo(bytesSend, 0, hostEP);
43                 socket.Shutdown(SocketShutdown.Both);
44                 socket.Close();
45             }
46             catch (Exception ex)
47             {
48                 MessageBox.Show(ex.ToString());
49             }
50         }
51     }
52 }


Server端,要using共用的dll

Form1.cs

001 using System;
002 using System.Collections.Generic;
003 using System.ComponentModel;
004 using System.Data;
005 using System.Drawing;
006 using System.Text;
007 using System.Windows.Forms;
008 using System.Net.Sockets;
009 using System.Net;
010 using System.Threading;
011 using ClassLibrary2;
012 using System.Runtime.Serialization.Formatters.Binary;
013 using System.IO;
014  
015 namespace WindowsApplication4
016 {
017     public partial class Form1 : Form
018     {
019         delegate void SetTextCallback(byte[] data);
020         delegate void GetTextCallback();
021  
022         Thread startThread;
023         Socket socket;
024  
025         public Form1()
026         {
027             InitializeComponent();
028         }
029  
030         private void btnOpenListen_Click(object sender, EventArgs e)
031         {
032             startThread = new Thread(new ParameterizedThreadStart(start));
033             startThread.Start();
034             this.btnOpenListen.Enabled = false;
035             this.btnCloseListen.Enabled = true;
036         }
037  
038         private void btnCloseListen_Click(object sender, EventArgs e)
039         {
040             socket.Close();
041             startThread.Abort();
042             this.btnOpenListen.Enabled = true;
043             this.btnCloseListen.Enabled = false;
044         }
045  
046         private void start(object TransMsg)
047         {
048             IPEndPoint hostEP = new IPEndPoint(IPAddress.Parse(this.tbIp.Text), int.Parse(this.tbPort.Text));
049             socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
050             socket.Bind(hostEP);
051  
052             while (true)
053             {
054                 try
055                 {
056                     socket.Listen(50);
057                     Socket NewSocket = socket.Accept();
058                     byte[] bytesReceive = new byte[1024];
059                     NewSocket.Receive(bytesReceive);
060                     SetText(bytesReceive);
061                     NewSocket.Shutdown(SocketShutdown.Both);
062                     NewSocket.Close();
063                 }
064                 catch (Exception ex)
065                 {
066                     MessageBox.Show(ex.ToString());
067                 }
068             }
069         }
070  
071         private void SetText(byte[] data)
072         {
073             //反序列化
074             BinaryFormatter bf = new BinaryFormatter();
075             MemoryStream stream = new MemoryStream(data);
076             class_person person = (class_person)bf.Deserialize(stream);
077  
078             if (this.tbId.InvokeRequired)
079             {
080                 SetTextCallback d = new SetTextCallback(SetText);
081                 this.Invoke(d, new object[] { data });
082             }
083             else
084             {
085                 this.tbId.Text = person.id;
086             }
087  
088             if (this.tbName.InvokeRequired)
089             {
090                 SetTextCallback d = new SetTextCallback(SetText);
091                 this.Invoke(d, new object[] { data });
092             }
093             else
094             {
095                 this.tbName.Text = person.name;
096             }
097  
098         }
099     }
100 }


執行結果:

參考網址:

http://www.blueshop.com.tw/board/show.asp?subcde=BRD20090402141557OY6&fumcde=FUM20050124192253INM
http://topic.csdn.net/t/20031128/10/2504360.html
http://hi.baidu.com/ysdonet/blog/item/2915d2f4ebb2b56bddc47418.html