Monthly Archives: 3月 2012

钗黛双收:若你也同Vim难割舍,却又看Emacs情切切

真幽默……

—————————————————————————————————————————

引子editor_war

这篇文章分享我的一些经历,写给和我一样对娇小的Vim难以割舍,又在抱上Emacs这个大家闺秀以后死活不愿意撒手的朋友们。

如果你不知道什么是“编辑器圣战”,那不妨百度Google一下,总之是自从开辟鸿蒙以来,就有两个以伴君左右为己任的贤内助(Vim编辑器和Emacs 编辑器)在互掐。由于两位佳人的理念差别之大,加上各自阵营之间的鸿沟之深,使得先贤先哲基本上都会在这两个阵营里面挑一个来站队。

网络普及以后,凡有帖子对Vim和Emacs这两大编辑器作出比较,大都有成为必删贴的潜质。原因很好理解,无论是谁看了红楼梦,很难不对宝钗黛玉这两位产生点好恶,此后但凡有人起了个头要对钗黛二人做点比较,那后面的楼经常能盖歪到变成地域攻击男女对骂。在技术论坛里,这样折腾不被河蟹掉才怪。更有甚者,如果谁在讨论编程的时候问了一句“需要做xx开发,用什么工具比较好?”随后也常常演变成Vim对Emacs的钗黛攻伐,最后一样飞沙走石天昏地暗。这就说明,选择Vim或Emacs已经不仅取决于我们在编辑文本时的好恶,而已经上升到干活的人怎么挑工具,过日子的人怎么选老婆这种哲学高度的问题。

我一向觉得,成事者不可狭于器。所以选工具时候没必要为了工具本身而搞个粉丝团,而是就着菜选刀,比着孩子找媳妇,揽来什么样的活计使什么样的家伙。若以我的经验来概括,Vim的犀利在于键盘操作,练家子爽得是用最少的手指运动完成编辑;Emacs的NB在于自定义功能,高手们都有一套独门不传的脚本,所以Emacser满手都是绝活,靠这些绝活上天入地无所不能。注意,这里要讲的既不是比出高下,也不是评测完了各打五十大板和稀泥。而是说说提炼出两个工具的精华加以“双修”,用足够务实的态度来平息争端。

先说点野史当引子。大学里面从来都不缺废寝忘食折腾电脑的兄弟。他们当中应该有不少动机都和当年的我一样:希望被人误认为是电脑高手。这种伪装有一个巨大的好处——没准能多给女生重装几次Windows。

不过,重装Windows的高手们为了哥们面前神侃时不露怯,基本上还要玩过点一般人玩不转的GNU/Linux。我想,工科男生们的Linux情结,怕有不少是因此而生。然而凡事不易,玩Linux是要自己改配置文件的,这倒是根硬骨头。

骨头硬的重要原因么,编辑器不顺手。在那没有Ubuntu的年代里,谁要是折腾几个晚上装好一台Linux的小白肉鸡,会发现可用的编辑器只有Vim。这玩意和Windows的记事本、Dos的edit相比简直就是个怪胎。这一点想必Emacser也深有感触吧,进到Vim里面若是不懂命令,肯定是在一阵滴滴滴过后连一个字母都敲不到屏幕上。

当装机圣手们的情商智商普遍被挑战了以后,大致是迅速分化为两派——啃骨头派和换骨头派。啃派如我,继续捏着脚适应Vim的小鞋;换派不用说也能猜到,自然是鞋也不要就转身踏入了Emacs阵营——在那边起码知道怎么打字。

按说天朝对于西方的编辑器圣战应该是打酱油的态度,但实际情况是,啃派和换派俨然形成了自己的圣战副本。

Vim篇

那段时间作为Vim啃派,我和许多队友一样有个自恃甚高的理由来支持Vim:编辑时击键次数最少。但是私下里想想,这个理由多少有些往脸上贴金。

其实Vim用多了以后,并不只是臣服于高效,更多的是手指头上瘾。用我们运动神经控制的行话来说,Vimer的大脑已经被触觉感官和运动神经一起绑架了。那些用手指肌肉记住的命令,执行起来基本不怎么过脑子。而且一旦命令执行成功,脑中还会生成大量“多巴胺”以示奖励。

看过《生活大爆炸》的应该都有印象,Leslie夜晚敲Leonard的门,只不过是为了缓解自己多巴胺分泌过剩……所以Vimer生存在这样一种状态下:只要不用hjkl这种奇怪的击键来移动光标,就会流着眼泪打着呵欠思念不已;反过来一旦用上了hjkl,那就等于在重复《生活大爆炸》里面那种神经感受。你说像在嗑药也行。

vim_tbbt

Vim瘾上身之后必然产生一个愿望,那就是以嗑药的方式,额,以Vim的方式来操作所有的软件。很不幸,持有这种愿望的啃派们几乎都会发现,就算骨头啃下来了,它也是打狗不能的。

首先,想替小家碧玉Vim扩展出十八般武艺,这个基本上真的很难。难的根本原因是Vim给用户预留的扩展能力先天不足。Vim的设计者压根没考虑把它做成一个放之四海而皆准的巨无霸,所以Vim打从娘胎里出来时在胃口上就不太给力。

既然此路不通,那只好另求变法。为了让啃骨头时攒下的功夫不至于荒废,能不能对其他软件的键盘操作方式动动刀,让它们起码和Vim敲起来差不多?这也很难。虽然软件的操作方式通常可以自定义,但自定义的途径大多是修改键位绑定。这种途径有个与生俱来的短板,它并不能区分出Vim里的“命令模式”和“编辑模式”。不巧的是,这种模式区分恰恰是Vim操作方式的核心。说到底,要想在其他软件里面模拟Vim,基本上等同于重新开发一遍。所以这么多年我只见到 Firefox的Vimperator插件做到了在宿主软件(Firefox)中对Vim几乎完全模拟(当然有若干Chrome和Visual Studio的插件也可以部分模拟Vim,但个人意见它们的“类Vim”程度都还差得远)。而且现如今浏览器混战成这个样子,哪个插件都恨不得全机种通吃,但Vimperator却丝毫没有往其他浏览器上移植的意思。这也从某种意义上证明模拟Vim不是件容易的事。

折腾这一大圈,发现一个无奈而不争的事实:Vim由于太过婉约,终归没有可能升任管家。意思就是不可能让所有软件用起来都像是在操作Vim一样。所以我只好把Vim养在硬盘里没事绣绣花打打字,而让管家这个肥缺虚位以待。转机出现在某一天,那天后知后觉的看到了一个老掉牙的故事,福特汽车的创始人亨利福特说,在汽车发明以前如果你问消费者想要什么,他们会说想要跑得更快的马。苹果的乔大爷也总是拿这个故事来说事,意思就是我苹果这才叫真正抓住了问题的核心 ——(出门人)要的未必是马,而是快;(iPhone粉丝)要的未必是多任务,而是上网的时候还能听个小曲。

这个产品设计的例子启发在哪?在我看来,当一个愿望被挖出来以后,不见得需要照本宣科才能满足这个愿望。如果换个解法还能满足,那说明你hit the button了。换句话说,当引子出来后,故事往下怎么续是文无定法的。

回到眼前这个事上,啃骨头派的愿望是用Vim的操作方式来一统江湖,不过果真非得“用Vim的方式”吗?恐怕重点还是“一桶浆糊”吧。玩电脑的都是懒人,懒人有个癖好叫“Don’t repeat yourself”,如果谁弄出一套比较高效的键盘操作方式,能让我学一次以后就不用再学了,那就暂时去tnnd的门派。

用个比方来做总结,Vim实在是精致独特得有点像个林妹妹。但谁要是希望家里也有个林妹妹,光把自家丫头照着绣像打扮打扮是不行的,必须从零开始养成一个。而且就算真能养出来个“天上掉下来”一般的可人儿,管家婆的位置仍然没她的份。

Emacs篇

一旦破除了心理障碍,在Vim之外寻求“管家婆”的人选也就不算作倒戈了。电影《社交网络 The Social Network》里面有这样一个镜头,在扎克伯格同学悲愤不已,要把女生头像和畜生猪狗一起打分时,他来了句“有必要重启Emacs,修改代码”。这个杜撰的场景告诉我们,IT巨星再怎么胸怀壮志,始于足下的不过是手指另一端连着的编辑器。当geek们叫嚣要在世界上留下一个痕迹(make a dent in the universe)的时候,手里常常拎着一把折凳,折凳背面写着——Emacs。

emacs_the_social_network

我用Emacs的最初经历和很多Emacser可能稍有不同,但想必都是从跌跌撞撞的青涩回忆开始,最后让Emacs成了一个“全能伴侣”而浑不自知。博士期间,我主要用的工具是Matlab和Visual Studio,这两个工具自带的编辑器与Vim相比都是小白,属于要严重影响心情和智商的那一种。但是,无论是Matlab还是Visual Studio,它们自带的小白编辑器都只有Emacs模式,没有Vim模式(原因如前所述,模拟Vim很难)。这好歹是聊胜于无,而且既然Emacs用户能从中受益,我凭什么不试试。不得不说,如果目的是用统一的键盘操作方式来使用各种软件,Emacs的领地实在是太广了。除了Matlab和Visual Studio这种内部伪装出一部分Emacs的快捷键以外,非常值得一提的是还有一个日本人写的软件Xkeymacs。这玩意干脆把Windows的快捷键全部接管了,直接让所有Windows软件用起来都跟Emacs一个感觉。所以如果你像我一样不得不在Word里面写文稿的话(Neuroscience领域很多教授不是工程背景,只用Word),就知道Xkeymacs让你舒服在哪里了。难怪一个老外在评价的时候说 Xkeymacs这个李鬼软件好到让人“心中不安(disturbingly good)”。

搞笑的是,我是直到在Xkeymacs这种替身杂牌军中用熟了Emacs快捷键之后,才开始慢慢尝试Emacs本尊。开始时先把Emacs配成了 Matlab IDE,用它搞定了整个博士课题的数据处理,后来又陆续使用了cedet,etag,yasnippet这些扩展,再加上秒杀笔记、日程、Wiki、表格、博文的org-mode……算是把我这个入门级的Hacker武装到了神经末梢。虽然我不像其他Emacser一般可以骄傲的说自己“活在Emacs 里”,但若说最近重要的工作成果都是在Emacs上创作出来,这话却是一点也不假。到了这个时候,Emacs已经完全升任管家婆,堪比宝钗再世。如果谁也有似曾相识的回忆,想必可以深刻体会到这样一个比较狗血的剧情,若宝玉能和Emacs一样的宝钗姐姐继续好下去,那完全有希望弄出个明朝版的百度,东山再起。

可是作为Vim的死忠,对于手掌几乎不挪窝的向往,那是消失不掉的。

坊间对于Emacs有一条经典评语,说Emacs是“伪装成编辑器的操作系统”。言下之意就是Emacs什么都能做(包括经典的煮咖啡)。既然Emacs都神通成瑞士军铲了,何不另辟蹊径,用军铲削出一个Vim呢?西方到底是计算机技术的始作俑者,对Emacs这种恐龙级工具而言,能被摆弄的四十年来都被摆弄一遍了。所以只要放狗一搜,就会发现Emacs居然自带Vim模拟,名叫viper-mode。而且为了让viper-mode更像 Vim,还有第三方开发了一套叫做vimpulse的增强包。也就是说,只要下载一个vimpulse.el脚本,丢到Emacs的启动路径中,它就可以几乎完美的模拟Vim!

写到这里,折腾的两条主线已在此收敛,引发“圣战”的两大神器也已经被和谐进了同一个窗口。再往下就该写些技术笔记和心得回顾,不在这篇的目的之内,因此应该歇笔了。如果要问我到底是在用Emacs还是在用Vim,或问哪一方赢得了我的选择?我也不知道。每当想写点程序、调段脚本、码点wiki、记记笔记的时候,我用的都是Emacs提供的外加自己用eLisp扩展出的功能;但是当码出来的东西让人不爽,需要浏览、修改和整理的时候,手指弹出的又都是 Vim的命令。

回到最开始说的,若是你用电脑要做的事和我差不多,而且也觉得用键盘工作是很爽的一件事,那就应该试试Emacs+Vim双修。道理很简单,假如你是包工头,而Emacs和Vim是两位身手不凡的应聘者,那么当然应该是两个都收了而后“择其善者而从之”,这才是对自家生意负责。不过对选编辑器如选媳妇的人来说,两大神器双修在手,尽在此一句:

惘于环肥燕瘦,颦怅蹙茫

哪比举钗盈黛,牵黄擎苍?

一些软件设计的原则

From: http://coolshell.cn/articles/4535.html

2011年4月25日 陈皓

以前本站向大家介绍过一些软件开发的原则,比如优质代码的十诫Unix传奇(下篇)中所以说的UNIX的设计原则。相信大家从中能够从中学了解到一些设计原理方面的知识,正如我在《再谈“我是怎么招聘程序”》中所说的,一个好的程序员通常由其操作技能、知识水平,经验层力和能力四个方面组成。在这里想和大家说说设计中的一些原则,我认为这些东西属于长期经验总结出来的知识。这些原则,每一个程序员都应该了解。但是请不要教条主义,在使用的时候还是要多多考虑实际情况。其实,下面这些原则,不单单只是软件开发,可以推广到其它生产活动中,甚至我们的生活中。

Don’t Repeat Yourself (DRY)

DRY 是一个最简单的法则,也是最容易被理解的。但它也可能是最难被应用的(因为要做到这样,我们需要在泛型设计上做相当的努力,这并不是一件容易的事)。它意 味着,当我们在两个或多个地方的时候发现一些相似的代码的时候,我们需要把他们的共性抽象出来形一个唯一的新方法,并且改变现有的地方的代码让他们以一些 合适的参数调用这个新的方法。

参考:http://en.wikipedia.org/wiki/Don%27t_repeat_yourself

Keep It Simple, Stupid (KISS)

KISS原则在设计上可能最被推崇的,在家装设计,界面设计 ,操作设计上,复杂的东西越来越被众人所BS了,而简单的东西越来越被人所认可,比如这些UI的设计和我们中国网页(尤其是新浪的网页) 者是负面的例子。“宜家”(IKEA)简约、效率的家居设计、生产思路;“微软”(Microsoft)“所见即所得”的理念;“谷歌”(Google) 简约、直接的商业风格,无一例外的遵循了“kiss”原则,也正是“kiss”原则,成就了这些看似神奇的商业经典。而苹果公司的iPhone/iPad 将这个原则实践到了极至。

把一个事情搞复杂是一件简单的事,但要把一个复杂的事变简单,这是一件复杂的事。

参考:http://en.wikipedia.org/wiki/KISS_principle

Program to an interface, not an implementation

这是设计模式中最根本的哲学,注重接口,而不是实现,依赖接口,而不是实现。接口是抽象是稳定的,实现则是多种多样的。以后面我们会面向对象的SOLID原则中会提到我们的依赖倒置原则,就是这个原则的的另一种样子。还有一条原则叫 Composition over inheritance(喜欢组合而不是继承),这两条是那23个经典设计模式中的设计原则。

Command-Query Separation (CQS)  – 命令-查询分离原则

  • 查询:当一个方法返回一个值来回应一个问题的时候,它就具有查询的性质;
  • 命令:当一个方法要改变对象的状态的时候,它就具有命令的性质;

通常,一个方法可能是纯的Command模式或者是纯的Query模式,或者是两者的混合体。在设计接口时,如果可能,应该尽量使接口单一化,保证 方法的行为严格的是命令或者是查询,这样查询方法不会改变对象的状态,没有副作用,而会改变对象的状态的方法不可能有返回值。也就是说:如果我们要问一个 问题,那么就不应该影响到它的答案。实际应用,要视具体情况而定,语义的清晰性和使用的简单性之间需要权衡。将Command和Query功能合并入一个 方法,方便了客户的使用,但是,降低了清晰性,而且,可能不便于基于断言的程序设计并且需要一个变量来保存查询结果。

在系统设计中,很多系统也是以这样原则设计的,查询的功能和命令功能的系统分离,这样有则于系统性能,也有利于系统的安全性。

参考:http://en.wikipedia.org/wiki/Command-query_separation

You Ain’t Gonna Need It (YAGNI)

这个原则简而言之为——只考虑和设计必须的功能,避免过度设计。只实现目前需要的功能,在以后您需要更多功能时,可以再进行添加。

  • 如无必要,勿增复杂性。
  • 软件开发先是一场沟通博弈。

以前本站有一篇关于过度重构的文章,这个示例就是这个原则的反例。而,WebSphere的设计者就表示过他过度设计了这个产品。我们的程序员或是架构师在设计系统的时候,会考虑很多扩展性的东西,导致在架构与设计方面使用了大量折衷,最后导致项目失败。这是个令人感到讽刺的教训,因为本来希望尽可能延长项目的生命周期,结果反而缩短了生命周期。

参考:http://en.wikipedia.org/wiki/You_Ain%27t_Gonna_Need_It

Law of Demeter – 迪米特法则

迪米特法则(Law of Demeter),又称“最少知识原则”(Principle of Least Knowledge),其来源于1987年荷兰大学的一个叫做Demeter的项目。Craig Larman把Law of Demeter又称作“不要和陌生人说话”。在《程序员修炼之道》中讲LoD的那一章叫作“解耦合与迪米特法则”。关于迪米特法则有一些很形象的比喻:

  • 如果你想让你的狗跑的话,你会对狗狗说还是对四条狗腿说?
  • 如果你去店里买东西,你会把钱交给店员,还是会把钱包交给店员让他自己拿?

和狗的四肢说话?让店员自己从钱包里拿钱?这听起来有点荒唐,不过在我们的代码里这几乎是见怪不怪的事情了。

对于LoD,正式的表述如下:

对于对象 ‘O’ 中一个方法’M’,M应该只能够访问以下对象中的方法:

  1. 对象O;
  1. 与O直接相关的Component Object;
  1. 由方法M创建或者实例化的对象;
  1. 作为方法M的参数的对象。

在《Clean Code》一书中,有一段Apache framework中的一段违反了LoD的代码:

final String outputDir = ctxt.getOptions().getScratchDir().getAbsolutePath();

这么长的一串对其它对象的细节,以及细节的细节,细节的细节的细节……的调用,增加了耦合,使得代码结构复杂、僵化,难以扩展和维护。

在《重构》一书中的代码的环味道中有一种叫做“Feature Envy”(依恋情结),形象的描述了一种违反了LoC的情况。Feature Envy就是说一个对象对其它对象的内容更有兴趣,也就是说老是羡慕别的对象的成员、结构或者功能,大老远的调用人家的东西。这样的结构显然是不合理的。 我们的程序应该写得比较“害羞”。不能像前面例子中的那个不把自己当外人的店员一样,拿过客人的钱包自己把钱拿出来。“害羞”的程序只和自己最近的朋友交 谈。这种情况下应该调整程序的结构,让那个对象自己拥有它羡慕的feature,或者使用合理的设计模式(例如Facade和Mediator)。

参考:http://en.wikipedia.org/wiki/Principle_of_Least_Knowledge

面向对象的S.O.L.I.D 原则

一般来说这是面向对象的五大设计原则,但是,我觉得这些原则可适用于所有的软件开发。

Single Responsibility Principle (SRP) – 职责单一原则

关于单一职责原则,其核心的思想是:一个类,只做一件事,并把这件事做好,其只有一个引起它变化的原因。单一职 责原则可以看作是低耦合、高内聚在面向对象原则上的引申,将职责定义为引起变化的原因,以提高内聚性来减少引起变化的原因。职责过多,可能引起它变化的原 因就越多,这将导致职责依赖,相互之间就产生影响,从而极大的损伤其内聚性和耦合度。单一职责,通常意味着单一的功能,因此不要为一个模块实现过多的功能 点,以保证实体只有一个引起它变化的原因。

  • Unix/Linux是这一原则的完美体现者。各个程序都独立负责一个单一的事。
  • Windows是这一原则的反面示例。几乎所有的程序都交织耦合在一起。

Open/Closed Principle (OCP) – 开闭原则

关于开发封闭原则,其核心的思想是:模块是可扩展的,而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

  • 对扩展开放,意味着有新的需求或变化时,可以对现有代码进行扩展,以适应新的情况。
  • 对修改封闭,意味着类一旦设计完成,就可以独立完成其工作,而不要对类进行任何修改。

对于面向对象来说,需要你依赖抽象,而不是实现,23个经典设计模式中的“策略模式”就是这个实现。对于非面向对象编程,一些API需要你传入一个 你可以扩展的函数,比如我们的C 语言的qsort()允许你提供一个“比较器”,STL中的容器类的内存分配,ACE中的多线程的各种锁。对于软件方面,浏览器的各种插件属于这个原则的 实践。

Liskov substitution principle (LSP) – 里氏代换原则

软件工程大师Robert C. Martin把里氏代换原则最终简化为一句话:“Subtypes must be substitutable for their base types”。也就是,子类必须能够替换成它们的基类。即:子类应该可以替换任何基类能够出现的地方,并且经过替换以后,代码还能正常工作。另外,不应该 在代码中出现if/else之类对子类类型进行判断的条件。里氏替换原则LSP是使代码符合开闭原则的一个重要保证。正是由于子类型的可替换性才使得父类 型的模块在无需修改的情况下就可以扩展。

这么说来,似乎有点教条化,我非常建议大家看看这个原则个两个最经典的案例——“正方形不是长方形”和“鸵鸟不是鸟”。通过这两个案例,你会明白 《墨子 小取》中说的 ——“娣,美人也,爱娣,非爱美人也….盗,人也;恶盗,非恶人也。”——妹妹虽然是美人,但喜欢妹妹并不代表喜欢美人。盗贼是人,但讨厌盗贼也并不代表 就讨厌人类。这个原则让你考虑的不是语义上对象的间的关系,而是实际需求的环境。

在很多情况下,在设计初期我们类之间的关系不是很明确,LSP则给了我们一个判断和设计类之间关系的基准:需不需要继承,以及怎样设计继承关系。

Interface Segregation Principle (ISP) – 接口隔离原则

接口隔离原则意思是把功能实现在接口中,而不是类中,使用多个专门的接口比使用单一的总接口要好。

举个例子,我们对电脑有不同的使用方式,比如:写作,通讯,看电影,打游戏,上网,编程,计算,数据等,如果我们把这些功能都声明在电脑的抽类里 面,那么,我们的上网本,PC机,服务器,笔记本的实现类都要实现所有的这些接口,这就显得太复杂了。所以,我们可以把其这些功能接口隔离开来,比如:工 作学习接口,编程开发接口,上网娱乐接口,计算和数据服务接口,这样,我们的不同功能的电脑就可以有所选择地继承这些接口。

这个原则可以提升我们“搭积木式”的软件开发。对于设计来说,Java中的各种Event Listener和Adapter,对于软件开发来说,不同的用户权限有不同的功能,不同的版本有不同的功能,都是这个原则的应用。

Dependency Inversion Principle (DIP) – 依赖倒置原则

高层模块不应该依赖于低层模块的实现,而是依赖于高层抽象。

举个例子,墙面的开关不应该依赖于电灯的开关实现,而是应该依赖于一个抽象的开关的标准接口,这样,当我们扩展程序的时候,我们的开关同样可以控制 其它不同的灯,甚至不同的电器。也就是说,电灯和其它电器继承并实现我们的标准开关接口,而我们的开关产商就可不需要关于其要控制什么样的设备,只需要关 心那个标准的开关标准。这就是依赖倒置原则。

这就好像浏览器并不依赖于后面的web服务器,其只依赖于HTTP协议。这个原则实在是太重要了,社会的分工化,标准化都是这个设计原则的体现。

参考:http://en.wikipedia.org/wiki/Solid_(object-oriented_design)

Common Closure Principle(CCP)– 共同封闭原则

一个包中所有的类应该对同一种类型的变化关闭。一个变化影响一个包,便影响了包中所有的类。一个更简短的说法是:一起修改的类,应该组合在一起(同 一个包里)。如果必须修改应用程序里的代码,我们希望所有的修改都发生在一个包里(修改关闭),而不是遍布在很多包里。CCP原则就是把因为某个同样的原 因而需要修改的所有类组合进一个包里。如果2个类从物理上或者从概念上联系得非常紧密,它们通常一起发生改变,那么它们应该属于同一个包。

CCP延伸了开闭原则(OCP)的“关闭”概念,当因为某个原因需要修改时,把需要修改的范围限制在一个最小范围内的包里。

参考:http://c2.com/cgi/wiki?CommonClosurePrinciple

Common Reuse Principle (CRP) – 共同重用原则

包的所有类被一起重用。如果你重用了其中的一个类,就重用全部。换个说法是,没有被一起重用的类不应该被组合在一起。CRP原则帮助我们决定哪些类 应该被放到同一个包里。依赖一个包就是依赖这个包所包含的一切。当一个包发生了改变,并发布新的版本,使用这个包的所有用户都必须在新的包环境下验证他们 的工作,即使被他们使用的部分没有发生任何改变。因为如果包中包含有未被使用的类,即使用户不关心该类是否改变,但用户还是不得不升级该包并对原来的功能 加以重新测试。

CCP则让系统的维护者受益。CCP让包尽可能大(CCP原则加入功能相关的类),CRP则让包尽可能小(CRP原则剔除不使用的类)。它们的出发点不一样,但不相互冲突。

参考:http://c2.com/cgi/wiki?CommonReusePrinciple

Hollywood Principle – 好莱坞原则

好莱坞原则就是一句话——“don’t call us, we’ll call you.”。意思是,好莱坞的经纪人们不希望你去联系他们,而是他们会在需要的时候来联系你。也就是说,所有的组件都是被动的,所有的组件初始化和调用都 由容器负责。组件处在一个容器当中,由容器负责管理。

简单的来讲,就是由容器控制程序之间的关系,而非传统实现中,由程序代码直接操控。这也就是所谓“控制反转”的概念所在:

  1. 不创建对象,而是描述创建对象的方式。
  1. 在代码中,对象与服务没有直接联系,而是容器负责将这些联系在一起。

控制权由应用代码中转到了外部容器,控制权的转移,是所谓反转。

好莱坞原则就是IoC(Inversion of Control)或DI(Dependency Injection )的基础原则。这个原则很像依赖倒置原则,依赖接口,而不是实例,但是这个原则要解决的是怎么把这个实例传入调用类中?你可能把其声明成成员,你可以通过 构造函数,你可以通过函数参数。但是 IoC可以让你通过配置文件,一个由Service Container 读取的配置文件来产生实际配置的类。但是程序也有可能变得不易读了,程序的性能也有可能还会下降。

参考:

High Cohesion & Low/Loose coupling & – 高内聚, 低耦合

这个原则是UNIX操作系统设计的经典原则,把模块间的耦合降到最低,而努力让一个模块做到精益求精。

  • 内聚:一个模块内各个元素彼此结合的紧密程度
  • 耦合:一个软件结构内不同模块之间互连程度的度量

内聚意味着重用和独立,耦合意味着多米诺效应牵一发动全身。

参考:

Convention over Configuration(CoC)– 惯例优于配置原则

简单点说,就是将一些公认的配置方式和信息作为内部缺省的规则来使用。例如,Hibernate的映射文件,如果约定字段名和类属性一致的话,基本 上就可以不要这个配置文件了。你的应用只需要指定不convention的信息即可,从而减少了大量convention而又不得不花时间和精力啰里啰嗦 的东东。配置文件很多时候相当的影响开发效率。

Rails 中很少有配置文件(但不是没有,数据库连接就是一个配置文件),Rails 的fans号称期开发效率是 java 开发的 10 倍,估计就是这个原因。Maven也使用了CoC原则,当你执行mvn -compile命令的时候,不需要指源文件放在什么地方,而编译以后的class文件放置在什么地方也没有指定,这就是CoC原则。

参考:http://en.wikipedia.org/wiki/Convention_over_Configuration

Separation of Concerns (SoC) – 关注点分离

SoC 是计算机科学中最重要的努力目标之一。这个原则,就是在软件开发中,通过各种手段,将问题的各个关注点分开。如果一个问题能分解为独立且较小的问题,就是 相对较易解决的。问题太过于复杂,要解决问题需要关注的点太多,而程序员的能力是有限的,不能同时关注于问题的各个方面。正如程序员的记忆力相对于计算机 知识来说那么有限一样,程序员解决问题的能力相对于要解决的问题的复杂性也是一样的非常有限。在我们分析问题的时候,如果我们把所有的东西混在一起讨论, 那么就只会有一个结果——乱。

我记得在上一家公司有一个项目,讨论就讨论了1年多,项目本来不复杂,但是没有使用SoC,全部的东西混为一谈,再加上一堆程序员注入了各种不同的观点和想法,整个项目一下子就失控了。最后,本来一个1年的项目做了3年。

实现关注点分离的方法主要有两种,一种是标准化,另一种是抽象与包装。标准化就是制定一套标准,让使用者都遵守它,将人们的行为统一起来,这样使用 标准的人就不用担心别人会有很多种不同的实现,使自己的程序不能和别人的配合。Java EE就是一个标准的大集合。每个开发者只需要关注于标准本身和他所在做的事情就行了。就像是开发镙丝钉的人只专注于开发镙丝钉就行了,而不用关注镙帽是怎 么生产的,反正镙帽和镙丝钉按标来就一定能合得上。不断地把程序的某些部分抽像差包装起来,也是实现关注点分离的好方法。一旦一个函数被抽像出来并实现 了,那么使用函数的人就不用关心这个函数是如何实现的,同样的,一旦一个类被抽像并实现了,类的使用者也不用再关注于这个类的内部是如何实现的。诸如组 件,分层,面向服务,等等这些概念都是在不同的层次上做抽像和包装,以使得使用者不用关心它的内部实现细节。

说白了还是“高内聚,低耦合”。

参考:http://sulong.me/archives/99

Design by Contract (DbC) – 契约式设计

DbC的核心思想是对软件系统中的元素之间相互合作以及“责任”与“义务”的比喻。这种比喻从商业活动中“客户”与“供应商”达成“契约”而得来。例如:

  • 供应商必须提供某种产品(责任),并且他有权期望客户已经付款(权利)。
  • 客户必须付款(责任),并且有权得到产品(权利)。
  • 契约双方必须履行那些对所有契约都有效的责任,如法律和规定等。

同样的,如果在程序设计中一个模块提供了某种功能,那么它要:

  • 期望所有调用它的客户模块都保证一定的进入条件:这就是模块的先验条件(客户的义务和供应商的权利,这样它就不用去处理不满足先验条件的情况)。
  • 保证退出时给出特定的属性:这就是模块的后验条件——(供应商的义务,显然也是客户的权利)。
  • 在进入时假定,并在退出时保持一些特定的属性:不变式。

契约就是这些权利和义务的正式形式。我们可以用“三个问题”来总结DbC,并且作为设计者要经常问:

  • 它期望的是什么?
  • 它要保证的是什么?
  • 它要保持的是什么?

根据Bertrand Meyer氏提出的DBC概念的描述,对于类的一个方法,都有一个前提条件以及一个后续条件,前提条件说明方法接受什么样的参数数据等,只有前提条件得到 满足时,这个方法才能被调用;同时后续条件用来说明这个方法完成时的状态,如果一个方法的执行会导致这个方法的后续条件不成立,那么这个方法也不应该正常 返回。

现在把前提条件以及后续条件应用到继承子类中,子类方法应该满足:

  1. 前提条件不强于基类.
  1. 后续条件不弱于基类.

换句话说,通过基类的接口调用一个对象时,用户只知道基类前提条件以及后续条件。因此继承类不得要求用户提供比基类方法要求的更强的前提条件,亦 即,继承类方法必须接受任何基类方法能接受的任何条件(参数)。同样,继承类必须顺从基类的所有后续条件,亦即,继承类方法的行为和输出不得违反由基类建 立起来的任何约束,不能让用户对继承类方法的输出感到困惑。

这样,我们就有了基于契约的LSP,基于契约的LSP是LSP的一种强化。

参考:http://en.wikipedia.org/wiki/Design_by_contract

Acyclic Dependencies Principle (ADP) – 无环依赖原则

包之间的依赖结构必须是一个直接的无环图形,也就是说,在依赖结构中不允许出现环(循环依赖)。如果包的依赖形成了环状结构,怎么样打破这种循环依 赖呢?有2种方法可以打破这种循环依赖关系:第一种方法是创建新的包,如果A、B、C形成环路依赖,那么把这些共同类抽出来放在一个新的包D里。这样就把 C依赖A变成了C依赖D以及A依赖D,从而打破了循环依赖关系。第二种方法是使用DIP(依赖倒置原则)和ISP(接口分隔原则)设计原则。

无环依赖原则(ADP)为我们解决包之间的关系耦合问题。在设计模块时,不能有循环依赖。

参考:http://c2.com/cgi/wiki?AcyclicDependenciesPrinciple

————————————————————————————

上面这些原则可能有些学院派,也可能太为理论,我在这里说的也比较模糊和简单,这里只是给大家一个概貌,如果想要了解更多的东西,大家可以多google一下。

不过这些原则看上去都不难,但是要用好却并不那么容易。要能把这些原则用得好用得精,而不教条,我的经验如下:(我以为这是一个理论到应用的过程)

  1. 你可以先粗浅或是表面地知道这些原则。
  1. 但不要急着马上就使用。
  1. 在工作学习中观察和总结别人或自己的设计。
  2. 再回过头来了回顾一下这些原则,相信你会有一些自己的心得。
  3. 有适度地去实践一下。
  4. Goto第 3步。

我相信可能还会有其实一些原则,欢迎大家提供。

(全文完)

Linux .desktop 文件

———————————————————————————————————————————

From: http://www.ibm.com/developerworks/cn/linux/l-cn-dtef/index.html#main

1.Desktop Entry 文件标准简介

 
在Windows 平台上,用户可以通过点击位于桌面或菜单上的快捷方式轻松打开目标应用程序。现代 Linux 桌面系统也提供了此项功能。目前,Linux KDE 和 Linux GNOME 桌面系统都使用 Desktop Entry 文件标准来描述程序启动配置信息。Desktop Entry 文件标准是由 FreeDesktop.org(http://freedesktop.org/wiki/)制定的,目前最新的版本是”Desktop Entry Specification 1.0″[1]。

2.Desktop Entry文件

图1 Linux GNOME 应用程序浏览器
image001
 
Desktop Entry 文件以”.desktop”为后缀名。以 Linux GNOME 桌面系统为例,用户打开应用程序浏览器后(见图1)会看见很多应用程序快捷方式。事实上,每个应用程序快捷方式都和一个 Desktop Entry 文件相对应。这些 Desktop Entry 文件通常被存放在 /usr/share/applications/ /opt/gnome/share/applications/ 等目录下。从文件浏览器进入这些目录,点击相应的 Desktop Entry 文件同样可以启动相对应的应用程序。
 
假设当前”/usr/share/applications/”目录下有一文件”cbt.desktop”,用任意文件编辑软件(如 vi 或 gedit)打开”cbt.desktop”,将得到如下内容:
 
清单1 “cbt.desktop”文件内容
[Desktop Entry]
Version = 1.0
Encoding = UTF-8
Name = Quick Start Tour
GenericName = User Tutorial
Comment = Computer Based Training tutorial to \
     guide and help you learn how to use the Desktop
Exec = 
gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html
Icon = cbt
StartupNotify = true
Terminal = false
Type = Application
Categories = GNOME;Application;Documentation;
OnlyShowIn = GNOME;
X-SuSE-translate = true
Name[cs] = Rychlá prohlídka systému
Comment[cs] = V?ukov? program seznamující u?ivatele 
       se základy pracovního prost?edí
GenericName[cs] = U?ivatelsk? tutoriál
Name[hu] = Rendszerbemutató
Comment[hu] = A munkaállomés használatát bemutató segédlet
GenericName[hu] = Felhasználói segédlet
本文将在下一节中结合上述”cbt.desktop”文件内容重点解析 Desktop Entry 的文件结构。读者可以从中深入领会上述各条语句的具体含义。

3.Desktop Entry 文件结构

 
Desktop Entry 文件通常以字符串”[Desktop Entry]”开始。由清单1可以得知,Desktop Entry 文件的内容是由若干{关键字,数值}配对的 Entry 组成的。例如,”Version”就是一个关键字,关键字”Version”对应的数值是”1.0″。Desktop Entry 文件标准定义了一系列标准关键字。标准关键字分为必选和可选两种:必选标准关键字必须在 .desktop 文件中被定义;而可选关键字则不必。以下是对重点关键字的解析。
 
  • 关键字”Version”:[可选] 该数值指定了当前 Desktop Entry 文件所遵循的 Desktop Entry 文件标准版本。
  • 关键字”Encoding”:[1.0 版本不推荐使用] 该数值指定了当前 Desktop Entry 文件中特定字符串所使用的编码方式。尽管Desktop Entry 文件标准 1.0 不再推荐使用该关键字,但由于历史原因该关键字仍然广泛出现在现有的 Desktop Entry 文件中。
  • 关键字”Name”:[必选]该数值指定了相关应用程序的名称。比如在清单1中关键字”Name”的数值是”Quick Start Tour”。打开文件浏览器,进入”/usr/share/applications”目录,就可以看见”cbt.desktop”文件所定义的快捷方式的显示样式,如图2所示。其中,快捷方式的显示名称由关键字”Name”的数值所决定,快捷方式所使用的图标由下文中将要介绍的关键字”Icon”的数值来决定。当然,这些定义在应用程序浏览器中同样适用,请参考图3。

图2 “cbt.desktop”文件在文件浏览器中的显示样式 

image003

  • 关键字”GenericName”:[可选]该数值指定了相关应用程序的通用名称。比如在清单1中关键字”GenericName”的数值是”User Tutorial”。打开应用程序浏览器,就可以看见字符串”User Tutorial”被显示在图标的右侧,如图3所示:

图3 “cbt.desktop”文件在应用程序浏览器中的显示样式 

image005

  • 关键字”Comment”:[可选]该数值是对当前Desktop Entry的简单描述。
  • 关键字”Type”:[必选]关键字”Type”定义了Desktop Entry文件的类型。常见的”Type”数值是”Application”和”Link”。”Type = Application”表示当前Desktop Entry文件指向了一个应用程序;而”Type = Link”表示当前Desktop Entry文件指向了一个URL (Uniform Resource Locator)。
  • 关键字”Exec”:[可选]关键字”Exec”只有在”Type”类型是”Application”时才有意义。”Exec”的数值定义了启动指定应用程序所要执行的命令,在此命令是可以带参数的。在本例中,关键字”Exec”的数值是字符串”gnome-open /usr/share/doc/manual/sled-gnome-cbt_en/index.html”。在shell中输入该字符串并按回车键同样可以启动指定应用程序。
  • 关键字”URL”:[可选]关键字”URL”只有在”Type”类型是”Link”时才有意义。”URL”的数值定义了该Desktop Entry文件指向的URL。例如:

清单2 “Type = Link”类型Desktop Entry文件示例

Type = Link
URL = http://www.ibm.com/developerworks

双击含有上述内容的Desktop Entry文件将启动web浏览器,并打开指定网页”http://www.ibm.com/developerworks“,运行结果请参考图4。

  • 关键字”Icon”:[可选]该数值定义了当前Desktop Entry文件在应用程序浏览器或是在文件浏览器中所显示的图标。如果关键字”Icon”的数值是以绝对路径的格式给出,那么其数值所指定图标文件将被使用;反之,Linux系统将使用”Icon Theme Specification”[2]在系统指定图标目录下定位所需要使用的图标文件。比如在本例中关键字”Icon”的数值是”cbt”,它实际对应着系统指定图标目录下的图片文件”cbt.png” 。该图片作为图标的显示效果如图2,图3所示。
  • 关键字”StartupNotify”:[可选]关键字”StartupNotify”的数值是布尔值(true 或是 false)。该关键字只有在”Type”类型是”Application”时才有意义。其数值的含义由规范”Startup Notification Protocol Specifications”[3]定义,在此不再详述。
  • 关键字”Terminal”:[可选]和”StartupNotify”一样,关键字”StartupNotify”的数值也是布尔值,并且该关键字只有在”Type”类型是”Application”时才有意义。其数值指出了相关应用程序(即关键字”Exec”的数值)是否需要在终端窗口中运行。本文将在下一节中给出关键字”Terminal”的具体使用方法。
  • 关键字”Categories”:[可选]关键字”Categories”只有在”Type”类型是”Application”时才有意义。”Categories”的数值指出了相关应用程序在菜单中显示的类别。具体菜单分类由规范”Desktop Specification Menu”具体定义[4]。
  • 关键字”OnlyShowIn”和”NotShowIn”:[可选]这两个关键字分别定义了当前Desktop Entry是否在特定Linux 桌面系统(例如:Linux GNOME 或 Linux KDE)下显示(由”OnlyShowIn”定义),或不显示(由”NotShowIn”定义)。具体定义请参考”Desktop Specification Menu”[4]。
  • 关键字”X-SuSE-translate”:[SUSE Linux特有]关键字”X-SuSE-translate”是SUSE Linux(http://www.novell.com/linux/)特有的。”X-SuSE-translate”符合SUSE RPM Package风格。”X-SuSE-translate”数值表示是否要对关键字”Name”和”GenericName”进行翻译。详情请参考”SUSE Package Conventions”[5]。
  • 本地化关键字”[LOCALE]”根据”Desktop Entry Specification”规范[1],在关键字后加上字符串”[LOCALE]”就可以对该关键字进行特定的本地化定义。”LOCALE”的合法取值为:
    LOCALE= lang_COUNTRY.ENCODING@MODIFIER

    在此,域”_COUNTRY”,”.ENCODING”和”@MODIFIER”是可以被忽略的。当指定Desktop Entry文件被解析时,解析器应当根据当前POSIX locale来正确获取本地化的关键字数值。例如清单1就分别定义了在”cs”和”hu”语言环境下关键字”Name”,”Comment”和”GenericName”的不同数值。

  • 其余关键字除了上述在清单1中出现的关键字外,”Desktop Entry Specification”还定义了”Hidden”,”TryExec”,”MimeType”等可选关键字。用户可以根据需要进行选取。

4.分析运行 Desktop Entry 文件

Desktop Entry文件是一种常见的Linux文件格式,很多Linux程序需要对该种文件提供支持。在此,本文给出分析运行 Desktop Entry 文件的基本编成思路。

4.1 分析 Desktop Entry 文件内容

操作 Desktop Entry 文件的第一步是获取文件的内容。假设有一 Desktop Entry 文件,其路径信息存储在变量 pPath 中: const char* pPath; 下列代码将把该文件内容读入内存”buffer”中。

清单3 读取 Desktop Entry 文件内容

int file_size = 0;
char *file_contents = NULL;
char *buffer = NULL;

if( eel_read_entire_file ( pPath, &file_size, &file_contents ) == GNOME_VFS_OK )
{
    buffer = (char *)g_realloc ( file_contents, file_size + 1 );
    buffer[file_size] = '';
}
else
{
    return 1;
}

获取 Desktop Entry 文件内容后,就可进一步分析文件内容。在此,分析的重点是获取关键字”Type”,”Exec”/”URL”,以及”Terminal”的数值。首先定义结构 DestopEntryType:

清单4 DestopEntryType 结构定义

enum DestopEntryType
{
    Application, // Type = Application
    Link,             // Type = Link
    Unknown
};

下列程序将提取关键字”Type”,”Exec”/”URL”和”Terminal”的数值,并把这些数值分别存储在变量”type”,”uri”和”bTerminal”中。

清单5 获取关键字”Type”,”Exec”/”URL”,以及”Terminal”数值

    

DestopEntryType type = Unknown;
char *uri = NULL;
bool bTerminal = false;

GnomeDesktopItem *desktop_file;

desktop_file = gnome_desktop_item_new_from_string( NULL, buffer, file_size,
(GnomeDesktopItemLoadFlags)0, NULL );
if ( !desktop_file )
{
    g_free( buffer );
    return 1;
}

const char *strType = gnome_desktop_item_get_string( desktop_file, "Type" );
if ( !strType )
{
    g_free( buffer );
    gnome_desktop_item_unref ( desktop_file );
    return 1;
}

if ( 0 == strcmp( strType, "Application" ) )    //type = Application
{
    const char *exec_str = gnome_desktop_item_get_string( desktop_file, "Exec" );
    if( !exec_str )
    {
        g_free( buffer );
        gnome_desktop_item_unref( desktop_file );
        return 1;
    }
   uri = g_strdup( exec_str );
    type = Application;

    const char *strTerminal = gnome_desktop_item_get_string( desktop_file, "Terminal" );
    if ( strTerminal )
    {
        if ( 0 == strcmp( "true", strTerminal ) )
            bTerminal = true;
        else
            bTerminal = false;
    }
}
else if(strcmp(strType, "Link") == 0)    //type = Link
{
    uri = g_strdup( gnome_desktop_item_get_string( desktop_file, "URL" ) );
    type = Link;
}

    g_free( buffer );
    gnome_desktop_item_unref( desktop_file );

4.2 运行”Type = Application”类型Desktop Entry文件

有了关键字”Type”,”Exec”和”Terminal”的数值,就可如下运行Desktop Entry文件。

清单6 运行”Type = Application”类型Desktop Entry文件

if ( type == Application )
{
    if( bTerminal )
        eel_gnome_open_terminal_on_screen( uri, NULL );
    else
        eel_gnome_shell_execute_on_screen( uri, NULL);
    g_free( uri );
    return 0;
}

4.3 运行”Type = Link”类型Desktop Entry文件 有了关键字”Type”,”URL”和”Terminal”的数值,就可如下运行Desktop Entry文件。

清单7 运行”Type = Link”类型Desktop Entry文件

if ( type == Link )
{
    gnome_url_show( uri, NULL );
    g_free( uri );
    return 0;
}

5.创建Desktop Entry文件实例

在这部分中,本文将给出创建Desktop Entry文件的两个具体实例。这两个实例的目标都是要创建自动访问IBM DeveloperWorks网站的快捷方式,具体运行结果如图4所示。这两个实例将使用不同的方法实现这一目标。第一个实例将创建的文件类型是”Application”的Desktop Entry文件”VisitDeveloperWorks-Application.desktop”;第二个实例将创建的文件类型是”Link” 的Desktop Entry文件”VisitDeveloperWorks-Link.desktop”。

图4 “VisitDeveloperWorks-Application.desktop” / “VisitDeveloperWorks-Link.desktop”运行结果

image009

5.1 创建”Type = Application”Desktop Entry文件实例

假设系统指定图标目录下存有图片文件”gaim.png”gaim.png 。如图5所示编辑文件”VisitDeveloperWorks-Application.desktop”,并把结果存于”/usr/share/applications/”目录下。

图5 “VisitDeveloperWorks-Application.desktop”文件内容

image013

该文件的核心内容是将应用程序图标设置为”gaim.png”文件,将Desktop Entry文件的类型设置为”Application”,并将应用程序所要执行的命令设置为”firefox http://www.ibm.com/developerworks“。编辑完成后,在文件浏览器和应用程序浏览器下(如图6所示)就可以看见该实例的显示样式。

图6 “VisitDeveloperWorks-Application.desktop”文件在应用程序浏览器中的显示样式

image015

5.2 创建”Type = Link”Desktop Entry文件实例

对上述”VisitDeveloperWorks-Application.desktop”文件进行如图7所示的修改,并将文件更名为”VisitDeveloperWorks-Link.desktop”,保存于”/usr/share/applications/”目录下。

图7 “VisitDeveloperWorks-Link.desktop”文件内容

image017

该文件的核心内容是将 Desktop Entry 文件的类型设置为”Link”,并将 Desktop Entry 文件指向的 URL 设置为”http://www.ibm.com/developerworks”。编辑完成后,在文件浏览器下(如图8所示)就可以看见该实例的显示样式。值得注意的是,由于该实例并不是一个应用程序,因此在应用程序浏览器下是看不到相应快捷方式的。

图8 “VisitDeveloperWorks-Link.desktop”文件在文件浏览器中的显示样式

image019


6.结束语

Desktop Entry文件是Linux KDE 和Linux GNOME桌面系统中标准的程序启动配置描述方式。本文对该文件格式的定义和应用进行了深入的探讨。欲求更详细的使用和编程信息,请查找相关参考文献。 参考资料

关于作者

龚奕平,软件工程师,IBM 中国软件开发中心 WPLC 部。现主要从事 Notes Linux 产品的研究及开发。研究兴趣包括 Windows 应用程序跨平台移植、GDI 开发、网络设备开发和调度算法研究。联系方式:gongyp@cn.ibm.com.

历史栽在“下跪”上面

“中国太难改变了,即使搬动一张桌子,改装一个火炉,几乎都要流血。而且,也未必一定能搬动,能改装,不是用很大的鞭子打在背上,中 国自己是不肯动弹的……”

————————————————————————————————

From: http://blog.ifeng.com/article/3109152.html

2009-08-30 10:17:56

周英杰

在近代以前的很长一段时间内,地处东亚地区的中国都是这“一亩三分地”里的第一强国。因之,很早就扯出了“天下共 主”或曰“天朝上国”的大纛用来号令天下。在这种深入骨髓的优越心理的作用下,中央帝国一向把自己看作是整个世界文明的中心,是高人一等的上天的选民。但 与此同时,则把所有中国之外的国家统统视为粗野少文的“夷狄”之邦,并在此基础之上建立起了以中央帝国为中心的悠久的“朝贡体制”。

关于“朝贡制度”,按照费正清、刘广京主编的《剑桥中国晚清史》的解释就是:“在理论上,非中国人被指望通过谒见天子时遵守适当的礼仪,来加入中国的世界秩序。这种实践便是外国人所称的朝贡制度。”

也就是说,中国和亚洲大陆上的许多有交往的国家的关系,长久以来都被中国看成是类似于藩属国和宗主国之间的不平等的关系。而剩下的个别不愿意接受这种朝贡体制的国家,则直接被中土列为低贱的“化外之地”打入另册。

因为视别的国家为附属国和处于化外的蛮夷之地,所以在中国皇帝接见这些国家派来“向化”的贡使时,为了固化这种由中 国人自己制订的“中国在上,其他国家在下”的所谓天下秩序,尽皆要求人家的使臣行中国的国粹“下跪”大礼。在中国的统治者们看来,“下跪”的背后实际上涉 及到天朝上国的面子问题和绝对权威,同时也意味着蛮夷之邦对这个由中国建立起来的天下秩序的自觉认可和臣服。正是由于这个原因,所以在外国使团来访时,尽 管负责接待工作的理藩院要处理的各种具体事务纷繁复杂,但唯于“下跪”一节上尤其较真儿,在具体执行时甚至讲究到了斤斤计较的程度。

于1644年入主中原的大清王朝,尽管在汉族知识分子看来,本身就属于夷狄乱华的异种王朝,但由于“八旗铁骑”武运 亨通,一时间征服了很多弱小的邻邦,所以在定鼎北京之后,对于以前由汉族政权所发明的这个古礼,同样采取了“拿来主义”的政策继续奉行不悖。甚至还将这一 礼仪发扬光大,把由前朝皇帝明太祖朱元璋发明的要求各国贡使在觐见时所行的“五拜三叩”之礼,换成了颇具满族特色更加繁琐的“三跪九叩”大礼。

但是,沉浸在天朝上邦的乌托邦里沾沾自喜的大清王朝的统治者们并没有意识到,当历史的一页翻到了18世纪中晚期之 后,中国的外部环境实际上已经发生了天翻地覆的变化。从这个时间点开始,自他们所比较熟悉的亚洲小天地之外,一些裹挟着文艺复兴和工业革命的气息,驾驶着 先进舰船的高鼻梁、蓝眼睛的欧洲人开始越来越多地登陆华夏故土传教经商。大清的统治者们所面临的新情况是,这些国家的洋人和那些一向对中国俯首称臣的亚洲 各国的人种根本不同,他们所属的那些遥远的国家并不是中国的“贡国”,而是和大清王朝并起并坐的独立之邦。因此,和这样一些国家的人员打交道,倘若仍然固 守原来夜郎自大式的“朝贡体制”,动辄以“文明的中心”傲人,必然会引发这些国家的强烈反弹。总之,历史给大清王朝的统治者提出了一道崭新的命题。

然而,非常不幸的是,被自大和盲目冲昏了头的大清王朝统治者并没有对外部世界的这种变化做出及时而正确的回应。由于 他们根本不知道中国接下来面临的将是“三千年未有之大变局”,所以,在对待欧美来的外国人时,仍然以老掉牙的“夷狄之邦”的陈旧观念来看待人家,硬是要把 这些国家统统列入朝贡之国的范畴,并逼迫着人家予以承认。尤其是当这些国家派出的使臣在觐见大清皇帝时,顽固地坚持让人家行在欧洲文明里明显带有侮辱意味 的下跪大礼。结果,在中国和西方世界最初的几次试探性接触中,一个简单的“下跪问题”便成了一座根本无法逾越的高山,将一切可能进行的正常对话和交流远远 地挡在了山脚之下,并最终“化玉帛为干戈”,演化成了一场人类文明交流史上的大悲剧。

众所周知,在这方面最突出的事例就是乾隆皇帝晚年在接待由英国政府派出的马戛尔尼使团时弄得双方都很不愉快的“礼仪之争”。

1792年9月,为了和东方这个遥远而神秘的国度正式建立商业和政治上的关系,当时的英王乔治三世借着为乾隆皇帝祝 寿的名义,向中国派遣了一支由马戛尔尼勋爵率领的官方使团。这支由800多人组成的庞大船队,带着精心准备的19宗、590件充分反映了欧洲现代文明成果 的国礼,远渡重洋,经过10个月的航行,在1793年7月顺利抵达了中国天津的大沽口。

当时,乔治三世时代的英国刚刚完成了工业革命,在全世界建立起了许多殖民地,纯然是世界上的第一等强国。由于迅速发 展的英国急需获得中国的原材料尤其是庞大的市场,所以出使中国的马戛尔尼使团的一个主要使命就是希望能够和清政府谈判通商事宜,并逐渐建立起正式的外交关 系。以今天的眼光来看,英国向清政府提出的要求实属正常,并无任何非分之处。

但是,在天朝大国的温开水里悠哉游哉惯了的清王朝统治者根本没有也不可能认识到这一访问的重大历史意义。虽然清王朝 上下对使团的接待不可谓不隆重,但是在内心里还是把这个使团当成了仰慕天朝威仪、远道而来以表示倾心“向化”的贡使。顺理成章的一个逻辑就是,在马戛尔尼 要求觐见乾隆皇帝时,清朝的官员硬是逼着使团人员像朝贡国的使臣一样行三跪九叩之礼。
很显然,这样的要求在马戛尔尼勋爵看来近乎是对大英帝国国王陛下和他自己的一种侮辱,自然是遭到了他的强烈反对。为 此,清朝的官员和英国的代表进行了几个回合的磋商。为了能够完成此行的使命,马戛而尼的态度后来有所软化,但他还是坚持说,清国和英国本为互相平等的友 邦,既然清国要求英国的使臣在觐见清国皇帝时行跪拜礼,那么,根据现代外交关系中的“对等交往”原则,在英国使臣对大清皇帝行下跪礼的同时,清朝的官员也 应该向英国国王陛下的画像行相同的下跪礼。毫无疑问,这样的建议是不可能为妄自尊大的清朝官员所接受的。双方由此陷入了难堪的僵局之中。

现在还不是很清楚,这个“礼仪之争”最后是如何获得了暂时性的化解的。总之,马戛尔尼最后终于在承德的避暑山庄见到 了乾隆皇帝。对于马戛尔尼在觐见大清皇帝时究竟有没有按照大清朝的礼制行“三跪九叩”之礼,现有的中外各种资料说法不一。大清朝留下来的资料坚持称马戛尔 尼是下了跪的。但是,考虑到大清朝的官员一贯文饰太平,拔高自己,贬低别国,所以此说并不可信。在这个问题上,我们还是宁愿相信英国人的说法,也就是说马 戛尔尼在见到乾隆皇帝时,并没有按照清朝的礼制下跪,而是采用了在欧洲觐见异国国王时一度使用过的“单腿下跪”礼制。总之,以觐见乾隆皇帝为高潮,这场标 志着东西方两个大国之间的“两个聋子之间的对话”,就这样在很不愉快的气氛中草草收场了。

事后,马戛尔尼使团除了得到了乾隆皇帝赐予的极为丰厚的礼品之外,事先向满清王朝所提出的派公使常驻北京等几项要求 几乎悉数被否定。乾隆皇帝还以上国之君才有的极为傲慢而霸道的语气,给大英帝国国王写了一份充满了炫耀和训诫意味的“赦书”。在这个奇怪的文件里,这位满 清皇帝牛皮哄哄地写到——

“天朝抚有四海,惟励精图治,办理政务,奇珍异宝,并不贵重。尔国王此次赍进各物,念其诚心远献,特谕该管衙门收纳。其实天朝德威远被,万国来王,种种贵重之物,梯航毕集,无所不有。”

满怀希望出使中国的马戛尔尼就这样结束了这次被英国主流社会解读为“充满了羞辱”的远东之旅。据说,因为自感有辱使 命,马戛尔尼一度甚至想到过自杀。但从更为宏大一点的视野来看,这次事件对于英国来讲,收获其实很大的。正式因为这次远行,英国人第一次看清楚了这个曾经 被伏尔泰等个别启蒙思想家捧上了天的神秘国度的真相,发现了它在华丽的外衣下面的真实底色。正如法国人阿兰·佩雷菲特在《停滞的帝国——两个世界的撞击》 一书说:“那只是一个泥足巨人,只要轻轻一抵就可把他打倒在地上。”

在英国的马戛尔尼使团出访中国之后不久,欧洲的俄罗斯、荷兰以及葡萄牙等国也向中国派出了各自负有类似使命的使团。 但是,由于清王朝誓死不愿意承认这些国家的平等地位,顽固地坚持过时的“朝贡体制”,这些使团都铩羽而归。其中,由戈洛夫金伯爵率领的俄罗斯使团在库伦就 因为不愿意向清朝皇帝的赐宴行叩首礼而被逼从蒙古折回。而由荷兰东印度公司驻日本和孟加拉的代表蒂津所率领的使团和葡萄牙的使团,虽然都被迫入乡随俗,在 觐见清朝皇帝时行了三拜九叩之礼,但最后的结局似乎并不美妙,他们仍然遭到了野蛮和粗暴的对待,最后带着一颗被伤害的自尊心返回了欧洲。

值得一提的仍然是英国。也许是对马戛尔尼之行的失败有点不死心,在1816年,英国政府再一次向中国派出了一个由阿 美士德率领的外交使团。可这一次使团的际遇比马戛尔尼使团还要糟糕。对于马戛尔尼使团,不管怎么说,满清王朝总体上是以“微笑政策”予以接待的;而对待阿 美士德使团则一变而成了“斥骂政策”。阿美士德甚至根本没有见到嘉庆皇帝,就被“驱逐”出了中国大陆。

哈佛大学的中国近代史专家孔飞力教授在其《叫魂——1768年中国妖术大恐慌》一书中这样指出:历史就是这样,未来 的一切尽管不可预见,但是构成未来的种种要件却正存在于现在的各种因素之中。从这个意义上说,马戛尔尼使团以及后来几个欧洲外交使团在满清王朝遭到的外交 失败,已经为后来发生在中国的一系列历史悲剧的上演画好了大的背景。

既然用彬彬有礼的外交渠道打不开中国的那扇巨大而封闭的大门,西方世界的必然选择就是用先进的舰队和大炮强硬地对 话。在马戛尔尼出使清廷之后不到50年,阿美士德出使清廷之后23年,他的国家终于以清朝在广东沿海所实施的激进的“禁烟运动”为口实,采取血与火的“炮 舰政策”杀进了中国的堂奥。而此前在英国的议会上坚决支持大英帝国对大清朝用兵的就有当年陪同阿美士德使团访问中国的主要成员托马斯·斯当东。

在著名的《剑桥中国晚清史》一书中,开宗明义就鲜明地指出:“欧洲人的到来并牢牢地在这里扎下了根”是决定晚清历史 走向的三大因素之一。从第一次鸦片战争开始,凭借着在炮舰政策的压力下几个与满清朝廷签订的条约,西方人大量进入中国经商、传教和游历。截至1861年, 西方各国已经正式在北京和各个沿海的通商口岸开设了公使馆和领事馆,终于实现了马戛尔尼们所要求的外国使节常驻北京和通商口岸的计划。而随着天朝所一向奉 行的“朝贡体制”的渐次崩溃,新型的“条约体制”的逐步建立,在京的外国使节觐见大清皇帝的问题遂成为一个不能回避的难题。

之所以说是“难题”,乃是因为尽管在屡次战争中吃过洋人的不少苦头,但满清的统治者还是迟迟不肯放下那种虚无的优越 感。在外国使节觐见清朝皇帝时究竟“跪还是不跪”,依然没有得到一个令人欣慰的解决方案。故此,很长一段时间内,清王朝对外国使节越来越迫切地要求觐见满 清皇帝递交国书的请求,一律祭出“拖”字诀,千方百计能拖一天算一天。

当然,谁都清楚这个“拖”字诀,只能将问题往后压,而解决不了根本性的问题。19世纪60年代,随着同治皇帝的长大成人,各国使节要求觐见皇帝的调门也在不断升高,终于迫使刚刚成立的总理衙门不得不为此在1867年专函征求几个对时局有重大影响的封疆大吏的意见。

自然,在这些清廷所依仗的督抚里面是断然少不了保守派的。这些人往往没有和洋人打交道的经验,但却最喜欢坐在衙门内 夸夸其谈地谈论“夷务”。他们罔顾世界大势,不允许天朝体制有任何更改,顽固地坚持外国使节在觐见大清皇帝时一定要行跪拜大礼。但与此同时,在与西方世界 不断打交道过程当中逐渐清醒起来的开明派督抚们,却力主放弃要求外国使节跪拜的老规矩。“同治中兴”的名臣曾国藩就援引康熙年间平等对待俄罗斯的先例,建 议朝廷把各国公使看成是具有平等地位的敌国的使节,提议允许他们免于遵守中国的习俗。正忙于自强运动的李鸿章也持相同的意见,他主张允许外国公使在觐见大 清皇帝时沿用晋见本国统治者的礼节。

经过再三权衡,总理衙门倾向于接受曾国藩和李鸿章的建议,有意放弃要求外国人觐见大清皇帝一定要下跪的老黄历。

1873年2月,同治皇帝宣布亲政。驻北京的各国代表又一次提出觐见大清皇帝的要求。看到这一次无论如何是拖不过去了。总理衙门终于做出决定:不再要求各国使节在觐见皇帝的时候行三拜九叩大礼,而以国际通行的鞠躬礼取而代之。

1873年6月27日是一个在东西方交往史上值得大书一笔的日子。这一天的早上五点半钟,在北京的外国使节早早地来 到了皇宫的外面等待大清皇帝破天荒的接见。值得一提的是,在接见前,还发生了一起颇具戏剧性的小插曲——前来北京交换1871年条约批准书的日本外务大臣 副岛种臣以自己的职位是大使级为理由,要求在各国使臣中第一个觐见同治皇帝,结果他靠着自己的聪敏达到了目的。

上午九点钟,接见正式开始。在恭亲王奕的陪同下,年轻的同治皇帝在紫光阁相继会见了日本、俄国、美国、英国、法国 和荷兰的公使以及德国的翻译官。各国的使节们将自己国家的国书放到皇帝前面的桌案上,行鞠躬礼,同治皇帝则通过恭亲王之口对使节们所代表的国家元首表示了 良好的问候和祝愿,使节们随即告退。这场被西方外交界企盼了12年之久的会见,据说只持续了三十分钟就宣告结束。(见费正清、刘广京主编《剑桥中国晚清 史》)

尽管在会见之后,西方的外交官们发现清廷将觐见地点选择在了紫光阁其实是大有深意的,因为那里一向是清廷接见贡使的地方,并为此而有些被愚弄的感觉,但他们如果能够想到他们的前辈马戛尔尼、戈洛夫金、蒂津和阿美士德的遭遇,应该能够懂得这半个小时所具有的重大历史意义。

屈指算来,从乾隆皇帝接见马戛尔尼到同治皇帝接见外国使臣,这中间整整过了将近80年的时间!大清王朝用了80年, 才解决了一个外国使节在觐见皇帝时下跪与不下跪的问题!于此可见,在中国任何一点些许的进步所付出的沉重的时间成本。这就不免令人想起了鲁迅先生在《娜拉走后怎样》中的警言:“中国太难改变了,即使搬动一张桌子,改装一个火炉,几乎都要流血。而且,也未必一定能搬动,能改装,不是用很大的鞭子打在背上,中 国自己是不肯动弹的……”

2009年3月12日-14日写于烟台

男人城邦——很man很基本的衣柜

———————————————————————————————————————————

From: http://www.douban.com/note/149901497/

男人城邦——很man很基本的衣柜

2011-05-09 22:48:44

题记:

因为感慨于大家在说什么男人们穿着这样那样的衣服请自行退下,那么,究竟什么样的才不用退下呢?

花俏的T恤,各种看起来让人会觉得很gay的衣服,是大部分自以为很man的男童鞋不屑的。

虽然Geek装最近很潮,但是谁也知道卡其色的灯芯绒西服是土到掉渣的东西。那么,衣柜里总要有些不那么土的,拿得出手的基本款吧?

什么叫做基本款?

基本款就是正统的西装领上衣、西裤、简单的牛仔裤、卡其布裤、大衣、风衣、方领衬衫等,它们的共同特征是款式不很复杂,亦没什么时代特征(即不会过时)。

【阅读提示(请一定记得啊喂T.T)】:

·1·、本文是我从《时尚先生》时装总监周周的《in买life之男人城邦》里抽出的主题思想所做,大部分都遵循周周书中的主题思想。有兴趣的童鞋可以找找这本书,不过,书中的主要精髓都在下面,看过这里,那本书你可以不用买了。送给转眼就要奔三了,可还没有二够的男童鞋们互勉。

·2·、学习搭配请找达人和时尚杂志哟,童鞋们,表因为这篇日志就关注我,因为我也是个搞不清楚状况的土渣路人啊喂……

·3·、没有写香水篇,因为男士香水这个东西说起来蛮麻烦,我引用周周书里的那句话:即便你喷了古龙水,我还是能隐约闻到一股人渣味儿。男人味吗,干净就好,可以颓废点带着胡茬子和烟草的味道,也可以带着刚晒好的阳光味道,香味什么的,谨慎谨慎再谨慎。

·4·、写了蛮久,无论爱或者拍,都欢迎,记的尊重我的劳动,转载注明出处,谢咯!~

·5·、文中配图神马的都是我挠着头发四处在网上寻觅的而已,只是相对可以帮助文字理解,所以请以文字为重!!!!(不过尽管如此估计还是没人会管文字吧,囧rz)

第一部分:上衣

一、衬衣

1、对于衣柜刚刚起步的男士而言,一件白色礼服衬衫可以解决一切重要礼仪场合。

p149901497-1

2、衬衫要素:

a、干净、合身
b、所有纽扣都齐全
c、曾经熨烫过
d、和商务装一起穿

二、毛衣:

V领毛衣 搭配灯芯绒裤子或者牛仔裤能凸显休闲感觉 加分项:对比鲜明的领带和条纹衬衫

p149901497-2

圆领毛衣 搭配亚麻或者卡其布裤子,格子花呢运动外套,小山羊皮loafer懒人鞋

p149901497-3

前开襟毛衣 可以打开露出衬衫和领带 也可以加入一些点睛细节元素 如彩色里衬或者有对比效果的领子

p149901497-4

三、风衣

一件可靠的风衣,长短适合你的身高。

p149901497-5

冬天的三件外套

1、马球外套 宽大的双排扣剪裁式样,有着大的块状贴袋以及全长或者半长的饰带

p149901497-6

2、毛呢外套 一个宽大的兜帽和前襟上自上而下的四个角形的木栓扣

p149901497-7

3、水手厚呢短大衣

p149901497-8

第二部分:裤子

卡其布裤:

1、不要把裤脚挽到小腿 看起来在摸鱼
2、卡其布裤前面的折痕会使穿着者看上去增加了十五岁
3、请只配置一条卡其布裤足矣

p149901497-9

牛仔裤:

1、有质感有分量的才叫牛仔布
2、对弹性牛仔裤、黑色牛仔裤、闪亮的牛仔裤说不
3、不要使用过细或者过于时髦的腰带搭配牛仔裤,应选择结实耐用的
4、时尚趋势倾向于更结实的经典392克牛仔布和深色面料
5、购买牛仔裤注意两个尺寸:腰部和内接缝。腰部实际是髋部的围长,而内接缝是从裆部量到踝骨

p149901497-10

裤长:

翻边西装裤 使裤管笔直并有清晰的线条,下摆不能是斜的
不翻边西装裤 前面略有折痕 下摆向后倾斜
休闲裤 底部7cm盖在休闲鞋上
牛仔裤 刚好盖住鞋带到脚踝关节处或者周围

三裤一生

除了牛仔裤,你还应该有三条正式的裤子来应付一些相对正式的场合:

灰色热带羊毛裤
木炭灰法兰绒裤
任意色灯芯绒裤

p149901497-11

第三部分:套装

一、商务装

基本款:

1、先藏青色,再深灰色

之所以不选黑色,是因为职业杀手和殡仪业者不是商务人士的楷模。

p149901497-12

2、1>2原则:一套定制的1200元的西装要比两套成品800元西装的更有价值。(修正:货币单位美元)

3、精选三件基本款西装:一件藏青色,一件灰色,一件带图案

配件:一打各种颜色和面料的衬衫和领带。然后用创意来搭配它们吧。

合身标准:

1、裤长 裤子的布料可以触碰到鞋子,裤子的褶边可以覆盖携带并向下朝鞋跟稍微倾斜,止于延边上方2.5cm处。
tips:裤腿前方这周应该在胫骨中不形成小“凹口”,若褶皱是直的,说明裤子太短。
2、肩部 肩垫未下垂或袖子顶部的肩膀没有很突出,说明上衣很合身
3、腰部 正确的测量位置在屁股到肚脐之间的1/2处,如此测量会让西服更合身
4、衬衫袖口 应始终露出大约0.6~1.5cm(保持这种状态可谓男人人生最大挑战之一)

因为没有人为男士正装设计出可靠的替代品,因此改变西装的古板形象的途径只能是通过在面料、细节和结构上寻求突破。

三、礼服

Don’ts:
1、不要选择平驳领。枪驳领和青果领才是正确选择。
2、上衣选单扣而不是三扣。
3、带腰封。
4、自己系领带
5、不要总是替别人斟酒

p149901497-13

p149901497-14

p149901497-15

第四部分:配饰

腕表:

男人一生需要三块表。

1、正装表 一块称得上奢侈的表 在正式场合使用

 p149901497-16

2、休闲手表 大表盘 表体较厚 表面要有趣

p149901497-17

3、工作计时表 轻薄,钢制或者黄金大计时表为佳

p149901497-18

镶钻腕表只适合皮条客、嘻哈天王和女性继承人

三双鞋子:

一双考究的系带皮鞋

p149901497-19

一双短靴 切尔西的

p149901497-20

一双不系带的休闲鞋

p149901497-21

太阳镜

不戴的时候,把太阳镜放在
1、不要放在额头,放在眼镜盒装在包里
2、没带包,就放在上衣夹克的内口袋里
3、没有穿夹克 就把太阳镜放在桌上并时不时看看他,走的时候别忘记。
在和没戴墨镜的人说话时,别忘记把它摘下,这是尊重

p149901497-22

第五部分:技巧

一、衣柜里的永恒元素

1、两套深色西装

p149901497-23

2、几件品质不错的衬衫 (从白色起步,点缀条纹衬衫)

p149901497-24

3、基本款领带(黑色针织、灰色及暗灰斜纹面料)

p149901497-25

永远不会错的并且可以轻松让人眼前一亮的搭配:黑白搭配。

p149901497-26

身上的组合数目:两种图案和一种纹理。

正装而未打领带或者领带松开只有两种状况:准备上床或者准备下岗

p149901497-27

衣柜备用:两件干净的白衬衫 一件海军蓝便装上衣

p149901497-28

不要随便穿卡其布衣服

p149901497-29

衣服挂在衣架而不是椅背上

p149901497-30

擦亮皮鞋是迎接新的一周的好方式

p149901497-31

二、“空中飞人”的搭配心得

1、舒适方便,也要装扮得体
2、不要穿运动裤绒拖鞋还有略显松垮的旧T恤。
3、随身旅行箱请大小合适并材质精良。
4、记得绅士风度,帮助女伴提行李——推车是减分的东西。
5、一具打满鸡血的强悍身板和一颗不知疲倦的心

三、出行衣物清单:

登山:
白天 一件连帽外套 两件薄针织衫 两件T恤 一件高领衫 一条牛仔裤 一双徒步旅行靴 一双手套
夜间 一件衬衣 一条灯芯绒裤 一件羊毛外套
完全没必要带:厚重毛衣

海边:
白天 四件T恤 两件带领短袖衫(Polo衫) 一条卡其布裤 一条游泳裤 一双人字拖
夜间 一条卡其布裤 一件单层棉质外套 两件衬衫 一双平底皮质便鞋
完全没必要带:紧身鲨鱼泳裤 印着菠萝图案的夏威夷衬衫

城市旅行
白天 一条牛仔裤 季节衣衫(一件毛衣或者两件T恤) 一双舒适的徒步便鞋
夜间 一条长裤 两件衬衫 一双平底皮鞋 一件深色外套
完全没必要带:黑色贝雷帽 印着口号或者歇后语的T恤

跑步方法和姿势

From: http://www.douban.com/group/topic/9398738/

2010-01-09 17:22:55 来自: Mr. D

特别说明:本人使用前掌着地的方法已经半年有余。前掌着地的方法在一定程度上对于减少膝盖的冲击 方面的作用非常大。但是就本人的感觉,前掌跑会对足弓造成更多的压力。特别是对于大体重的朋友们。长距离、长时间的前掌着地有可能导致足底筋膜炎等病症, 导致足弓、后跟疼痛。因此在跑步姿势的选择上,也许本身就没有什么统一的正确姿势。大家需要根据自己的特点来选择适合自己的姿势。(GOIN_DOWN于 2011年1月3日)

由于09年的时候跑组尚很年轻,对于跑步的知识和理论都不成熟,因此一段时间里后掌着地成为了大家讨论长跑姿势的主流声音。

那个时候,本人初来跑组,菜鸟的我以脚跟着地的方式跑完了10km, 21km,和42km,终于膝盖受伤。导致2010年半年以来半停跑的

想跑却不能跑,跑起来不能欢畅尽兴,实在是一件非常郁闷的事情。

新加坡的大狗兄提供了两个视频,《EVOLUTION RUNNING》和《CHI RUNNING》,视频从理论和实际角度阐明了如何跑步。

这两个视频,新跑友都应该看看。祝大家都能够享受健康的跑步。

在线观看地址:
<EVOLUTION RUNNING>:http://www.tudou.com/playlist/id/7830379/
<CHI RUNNING>:http://www.tudou.com/playlist/id/7830549/

腹肌教程

Tougher Abs

Part 1

Tougher Abs

Part 2

Tougher Abs

7条实用技能告别单身贵族

From: http://www.douban.com/note/133574865/

7条实用技能告别单身贵族

2011-02-08 21:27:52

春节期间,很多豆友跟亲友相聚,长辈都会问“婚事如何”之类的问题,这几天出现大量抱怨贴,推荐优秀未婚男青年知秋同学,优秀未婚女青年别歌同学。

我这个人是天生的八卦媒婆命,我的出发点是,促人姻缘是大功德,做上那么几件,其它的罪孽当然就会被赦免了。

闲话少说,造福单身贵族的技术贴马上就出现了!

1、增加目标对象的基数

以前写过,暖手同学推荐过一本书,叫《上钩的鱼都很美》,开首就说“首站,拜仁慕尼黑”。那是能容纳几万人的地方,无论如何,统计学上的扩大样本数在任何领域都是至理名言。老说找不到对象的人,好歹接触过100个异性,接触过10个适龄未婚长相不卡西莫多的异性,从中选择2个进一步接触,再来说找不到的问题。

如果你接触的异性数量只有个位数,那找到如意郎君的比例实在是堪忧。

2、增加样本选择的典型性。
社会学家在1974年根据统计数据写了一份论文叫《找到一份工作》,其中写道,56%以上的人是通过个人关系找到工作的(可以另写一篇找工作技巧啊),而这56%中,有55.6%的人与被求助者是“微弱社会关系”,即,他们是“偶尔”见到被求助者的。

原因很简单:因为与你非常亲密的人,跟你的社交圈子是一样的,他能发现的工作机会,你早就能发现了。

同理可证,如果你想寻找对象,适当“跨圈子”是很重要的。从统计学上来说,如果第一的基数增加仅仅在一个很小的范围,例如,寻找卡西莫多的工作仅仅在一个浙江省开展,一个省找到100个候选人,那就远没有在全国10个省市开展,每个省市找10个候选人来得更科学。

一般人最重要的圈子只有一个,工作的人就是“同事”,读书的人就是“同学”。想办法扩大这个领域,尤其是兴趣领域。例如我给知秋同学的建议,不妨在“喜欢投资”的圈子里想想办法,或者可以参加下“豆瓣同城活动”。再不然组织一次高中同学聚会(我朋友当中可有不少是在工作后的同学聚会时找到对象的),要不参加户外俱乐部(朋友中也有成功案例哦)。还有参加公益组织也是很有效的地方,我参加JA志愿者培训的时候,一圈10个人,要分别介绍自己的年龄,工作单位及大概背景。

3、要针对目标对象集中的区域。

任何地方都有20/80法则,因此不要把力气花费在80%不靠谱的地方。针对第二条来说,如果是以“找对象”为目的的兴趣小组,那无比要注意目标对象会不会出现。如果女生参加的是“美容俱乐部活动”,如果男生参加的是“皇马粉丝聚会”,那恭喜各位,你们孤独一生的几率大大提高了。

暖手同学做的是IT行业,男生比例高达85%,他们公司附近走过一只母猫都会引起一阵喧哗,那就难怪他们公司组织羽毛球活动,我带去两个MM简直得到了公主待遇。如果一个男生去了我参加过的一个烹饪学习班,那他会遇见除他以外100%的女生比例。既然很多男生的要求是“下得厨房”,为什么不去烹饪学习班碰碰运气呢?在日本,这可是最流行的相亲方式哦。

至于女生,呃,好吧,我必须承认,优秀男生大多忙于工作。不过不妨试试“理财投资小组”之类的,那里男生比例还算高。(那个,我不想暴露我的经历啦,你懂的)另外,联系下你在不错公司里就职的高中大学男同学看看,等他们同事聚会的时候不妨一起过去玩个三国杀什么的,说不定会遇见白马王子哦。

至于户外俱乐部,我要提醒你的是,参与者普遍年龄比较低,如果你已经是“剩女”类型,除非你是“姐弟恋”爱好者,否则别多浪费时间了。

参加公益组织的活动?要是你想找一个心地善良的对象,那你可去对地方了。

4、寻找“联系员”— 关键人物法则

畅销书《引爆点》中有这样一个观点,有些人,他们就是认识很多人,他们就是乐于把不同的人联系起来。一个简单的办法是,列一个40人的朋友名单,想想跟他们最初认识的情形,其实很容易找到,就是那么少数的几个人,帮助你认识了所有的朋友。这些人就是“联系员”,他们就是最关键的少数人

(我不得不骄傲地说,我就是这么号人物)

多联系他们, 想想看你小学初中高中大学同学聚会的组织者,他们一定是热心且具有广泛社会关系的人,多跟他们联系,然后就等着鱼长脚,自己走上门吧!

5、制定一定的标准。

很多人回答“你想找什么样对象的时候”都回答说“投缘就好”。我的娘,我听过的次数之多已经罄竹难书了(好吧我乱用成语)。 凡是有这类回答的人,就是把所有想帮他一把的人拒之门外。

我怎么知道什么标准是你的“投缘标准”,当我再拜托另外一个人帮我寻找目标的时候怎么阐述?

你必须要制定一个比较客观和明确的标准,让想帮你的人能迅速从资料库中调用出合适对象的信息。

例如,我想找“25-35岁,月收入6000以上,有一技之长,身高170以上,长相过得去,比较幽默的单身男生”。有了这样简单的标准,如果是金牌媒婆我登场,则立即可以调出3-5个候选名单出来。

6、保持一定的接触频率

相信我,相亲成功率不高的原因之一是“一次定终身”的选择。而真正了解一个人是需要时间的。“一次定终身”的选择标准只能是外貌,收入之类的(这是备受诟病的,也是媒婆们最头疼的)。而当你真正喜欢那个人的幽默,善良之后,你是不会那么在乎这些的。

以我说的那些“兴趣圈子”,烹饪班是3个月的,2周一次。 户外俱乐部,大家可以相处个3-5天的,而且还可以继续约出来。参加个法语学习班,那可能是1年。如此等等,在一定频率的接触后,你可以多方面的了解一个人(包括他结婚没,相信我,了解这点也很重要)。 如果你外貌条件不是很好,也有足够的时间来让别人了解你其它优点。

7、行动起来。

当然,最后一条一定是最重要的一条。有了上述6条,你一定会成功,但是你还差最后一步,那就是“行动起来”!自暴自弃的人很多,但那不应该是你。幸福的婚姻生活值得用任何代价去换取,很多人会制定“时间规划”“年度工作计划”“职业规划”,但是对感情却极度随波逐流。
相信我,没有任何的美好是凭空从天上掉下来的,那个完美的他(她)一定要凭你自己的力量动手把他(她)从人群中找出来,然后捆上带回家的。2011年,制定一个幸福计划吧!今天就行动起来吧!

加拿大8年的经验 献给想立足的中国人

From: http://www.kanzhongguo.com/news/11/12/28/434686.html

我来加拿大8年了,四前从Concordia大学毕业时正好赶上911事件之后,北美的工作大量外包到印度中国墨西哥的时候,我们全班大约12位中 国同学没有一位找到与电子工程专业相关的工作。那段时间可以说是我一生中最痛苦的时候,后来痛定思痛、总结教训,去麦大又有读了个研究生,虽说碰到这次的 金融危机,我还是在今年初找到了一份高薪、稳定、在医院的工作,每个月落入口袋的钱都有5k USD.这两天终于抽出时间把我来加拿大8年所总结的经验分享给大家(尤其是想读书的人),希望更多的华人早日立稳足根。

1. 从中国来到加拿大,就好象你以前习惯在空中飞,现在却要你在水中游,要尽快搞清楚”游戏规则”并尽快调适自己。

我想这是显而易见的,这边与中国有很大不同的地方很多,例如:工作经验远比学历重要,在北美,有经验没学历的人在雇主眼里绝对比有学历没经验的人优 先得多。这一点与国内是很大不同的。国内的人太重学历了。这边的雇主老是怀疑每个人在简历中吹嘘的东西,但同时又过分相信熟人的介绍。要充分利用这一特 点。

中国连续二、三十年都在高速发展,作为中国人,很难体会或预测经济危机带给你的残酷和血腥,下面我会详细解释,这一点会很大程度上影响你的决策。

北美的job hunting市场极其的发达,有很多规律和学问,学习和体验如何找工作大约需要相当于你在大学修四门课的时间和功夫,千万不可轻视。

2. 读书只是一条相对比较稳妥的路,有不少其他的途径可以立足。

来到北美的人第一的话题就是到底要不要读书。我的个人意见是,在中国基本上是一种填鸭式的教育,但是这边老师绝对不会管你,他们认为过了18岁你就 该对自己负责,所以大学基本上只适用淘汰的办法来管理学生,简言之,两门功课不及格你就不可以再读你的专业了,请你转专业或者退学。例如康大的电子工程专 业基本上每两个入学只有一个能毕业。所以我的结论是:如果你在国内从小到大基本上是迫于家长或者老师的压力而学到大学毕业的话,你也许不一定适合读书。当 然我的结论是基于这样一个假设:要读书就一定要读好。

不读书其实有很多的出路:例如开一个杂货店(网上有很多华人开店的精彩总结,我就不赘述了);英语很好的,可以去考一个政府工然后一级一级的往上 考,或者去应聘销售工作然后一步一步往上爬;如果英语还过得去,可以直接去应聘一些像物流啊、贸易啊、仓库啊之类的工作;如果英语不行可以去做个大货车司 机、叉车司机、护工之类的(需要短期培训).但是注意,北美绝对是一个一份辛劳一份回报的地方,抱着混日子的想法或者投机取巧的想法是绝对行不通的。我曾 经见过一个经过培训拿到叉车工执照的人去中介公司找工作,人家说暂时没有叉车工的工作,让他先做 labour工,一边做一边帮他找叉车工,很可惜那个人就信以为真,一边混日子一样懒散地做着labour工一边傻等,不知道中介公司其实是在试用他,看 他的表现才决定是否给他叉车工的机会。我在国内曾经做到过一家跨国金融公司的销售经理,这点猫腻我还是相信我的判断的。

总之一点,这边的人极其根深蒂固的相信事实(这也是西方科学和西方医学的基石),他们近于固执的认为人的行为是一贯性的,也就是说,你过去是个坏 蛋,现在也肯定不是个好东西;你现在偷懒,将来也绝对不会改。所以千万注意了。在中国是户籍跟着你一辈子,在这边是信用跟着你一辈子,而信用是基于你平时 一点一滴坚守如一的积累而来的。希望你能明白我在说什么。

如果你选择读书的话,到底是读training、还是再读个本科、或是往高读个研究生也是个难题。我可以给你一些信息:

这边读training大多数program 90%的时间都是在实习,用的都是真刀真枪的家伙(不像国内会用一些陈旧淘汰的设备来培训),所以培训完之后你就是”有工作经验”的人,这个在北美找工作 的最大障碍解决了,找工作相对而言容易一些。我曾经见过两个training毕业的人,刚一毕业就找到$14/hr的在工厂的工作,上班第一天老板看见他 俩确实能干活也会干活,第二天就把两个$16/hr的工人解雇了,搞得这两个中国人觉得很不好意思。且慢,你看出你需要的信息了吗?老板可以炒那两个老工 人,但是也可以炒这两个中国人(任何地方新人都有3个月试用期).你可千万不要以为仅仅只是中国人要价低,要是这么认为,那你就是低估中国人相比其他人种 的优势了,或者就是你不明白雇主到底想要什么。明白这一点,下回你就知道你上班第一天该干什么了,让别人做第二,中国人在哪儿都做第一!

再来说说读研究生,我个人的想法是,很多来加拿大的人英语都不是特牛,读本科时间长点,正好可以给你一个了解北美和强化英语的机会,读研究生2年就 出来了,我觉得有点让我应付不来。但是我还是建议两种人读研:一种是英语好能力也强的人,一种是打算回国发展的人。不言而喻,因为国内是一个很重学历的地 方,想回国的人削尖脑袋也得读研!如果想读本科的话,请接着往下看。

3. 想办法读回你以前在国内的专业,转行千万小心,危险大,慎重考虑

注意,在北美找工作的最大障碍就是没有”工作经验”.你先想象一下一个场景:在中国某城市的一个人才市场上,一个只有高中学历的人想求职。我想告诉 你,在北美一个没有工作经验的人找工作,就有点像那个高中生在中国找工作!北美的雇住永远都在找有经验的人。这就是为什么我建议你尽一切可能别转专业。

我刚来加拿大的时候如果不是被迫从国内的空调暖气专业转到电子工程,我绝对相信4年前我就已经找到工作了,而不是现在。我走过的弯路希望你不要再重走。

这里有一个技巧,为什么说我是被迫转专业?其实没人逼我。那是因为我8年前去Corcordia大学傻乎乎地问管招生的人,我在国内有一个机械本科 的文凭,可不可以在这边仍然报读机械本科?人家客气地说,你已经有了一个机械本科,原则上你没有必要再去重复拿一个机械本科!北美的人永远不肯能了解我们 的需求:我们的专业背景和经验其实不差,但是加拿大的雇主不认同;所以我们需要的只是用英语再一次的温习一下我们的专业,那我们就能马上飞了!况且,带着 经验来学习,事半功倍。你加拿大也不想我浪费掉我在中国多年的宝贵经验吧?

这里需要用一点技巧:第一,你翻译国内的专业名称时,尽量翻译得与你这边想读的专业不一样。第二,如果别人问你为什么还读相似的专业,你得事先准备 好立马接口说:no, no, no, 这两个专业差别远了,let me tell you why, 然后一定记得带着笑脸和信心给别人解释,你知道,管招生的人不可能懂你的专业的,她/他唯一能做的就是从你的笑脸和信心去做判断,对吧?第三,如果最后实 在不行了,你就先进一个属同一个大类的专业(例如都是工程类、或者都属金融类),然后一个学期后转专业还是转到你的本行。这个时候就没有任何人问你了,因 为转专业在北美是被极其鼓励的行为(是的,我没写错,在中国的大学转专业是做梦,但在这边是美梦成真).记得提前认真的看一看学校的转专业的 regularions, 别错过了deadline.还有一点小技巧就是,你第一个学期尽量选公共课,这样你转了专业之后学分也可以转,没有任何损失。

当然,我这绝不是教你投机取巧,你想想看,读回本专业这个绝对是利国利民利己的。利国:加拿大当初让你移民是看中你的专业背景和经验,你曾么能换专 业呢? 利民:你读回本专业绝对可以尽早找到工作、早日交税、通过税收惠及穷人。利己:你读过的专业再读一遍,怎么也比别人轻松,GPA超高是不难的。几年经验再 加回炉深造,相信雇主也会从中受益。所以,千万别想着你自己有读回本专业、骗加拿大的助学金的心理负担。不过呢,做人的功夫还是要做足:千万别跟你的同学 说你以前读的专业跟现在的差不多,否则他们或觉得不公平,甚至会上告到学校都有可能。你跟他们说:这世界变化真快呀!我以前学的东西全落后了没用了,然后 感叹的摇两下头、叹两口气。这样你的超高GPA别人才会既羡慕又不嫉妒,你说呢?

有在中国的几年专业工作经验,再加上北美的专业文凭(GPA别太低了),毕业时我相信你会是你们班上最先找到工作的那一批人。

4. Job hunting是从你开始选择专业的时候已经开始了,而不是从你毕业的时候。

在北美,读大学与中国有很多的不同,例如,同样是本科文凭,电子工程要读4年甚至5年,会计专业2年就差不多了。但是,正像我前面所提到的,在北美 绝对是一份耕耘一分收获,电子工程毕业时的起薪约为4.9万(在美国),平均7.6万,top 10%可以挣11.5万,而会计毕业时的起薪约为3.4万(美国),平均5.5万,top 10%可以挣到9.4万。也就是说,多读两年书,平均每年可以多挣2.1万。此外,如果你有幸进入医学院、出来做医生的话,家庭医生的平均年薪是15.6 万,外科医生的平均年薪是28.2万。这也是为什么医学院那么难进的原因。总之,一份努力一份回报。

此外,任何一个专业你最好事先了解一下此行业的未来需求,你可以google一下”occupational outlook handbook”去美国劳工部的网站看一看,那里有关于每个专业的详尽的解释,包括这个工作的特征、需要什么教育、多少薪水、行业的未来需求、相关职 业、等等。不过可能因为金融危机,今年的报告明显比以前年份的报告粗略多了。加拿大也有几个类似的网站,但好像没有一个全国性的权威评测。

了解你所选择的行业,能够让你对你的未来和找工作的预期有一个正确的预测,比如说,我曾经见到好几个中国学生学统计的,以为学完就可以找份工作,可 是他们不知道,在北美90%的统计本科专业毕业的人是找不到工作的,因为不论是统计师还是数学家,一般最少都要求硕士毕业、博士更好。也就是说,从你选择 读统计专业的那天起,你基本上就得做好打算读研!或者再拿第二个文凭、跟你的统计专业相结合。(在北美有些工作是需要两个专业文凭的).我是做了不少的调 查才选择我在McGill的研究生专业的。

5. 如果能进入co-op的专业最理想,否则自己也要在毕业前一年的时候开始找internship.

重复一次,在北美找工作的最大障碍就是没有”工作经验”.所以有很多大学的co-op专业就应运而生。Co-op是指任何学习两年之后可以去实习半 年或一年的专业。例如Condordia大学的很多工程专业有co-op的,也有非co-op的。可以的话,尽量进有co-op的专业(有co-op的专 业录取条件也更为苛刻一些),尤其是你在国内没有本专业的工作经验的人更是如此。否则,毕业的时候你就是白纸一张,找工作的难度大很多。

当然,进了co-op也千万别高兴得太早,co-op只是学校为你的实习提供一切可以提供的便利,实习单位从本质上说还得你自己找。就算真有哪一个 雇主主动来学校要人,你的所有同学也都可以参与竞争,在那种时候,你得把你所学的所有找工作的功夫都展现出来。此外,通常教授推荐的人有极大的优势。所以 你得想办法让某个教授对你印象深刻,参见下文第10点。

6. 给最后一个学期留下最轻松的几门课,甚至只选一门课都行。

前文已说,北美的job hunting市场极其的发达,有很多规律和学问,学习和体验如何找工作大约需要相当于你在大学修四门课的时间和功夫,千万不可轻视。也就是说,最后一个 学期的中心不要放在学习上,而是正儿八经地找工作。北美的学校有一点做得很好,就是所有的大学都有”找工作辅导培训”,Concordia和McGill 都有专门的部门和专业的job hunting人士免费给你辅导。我劝每一个中国人在大学一年级的时候,就一定要抽空去”享受”一下这些免费服务,很快你就能明白北美的工作市场是多么的 复杂和多么的不同与中国,我在这里就不赘述了。

我常常很惊异的发觉有很多中国学生读了几年书,毕业了之后竟然都还不知道大学里有这种免费的服务。他们甚至可以免费帮你一对一的修改简历和你申请读 研所需要的personal statement. 我当时就让一个Concordia大学的专业辅导人员帮我修改了两次personal statement,修改得非常好,让我极受启发。要知道,你每年交的学费当中,有一项就是专门funding大学里面的这些部门的,你不去享用,等于你 的钱白交了。换言之,他们的服务不是免费的,羊毛出在羊身上。

7. 没找到工作就千万别毕业,一毕业你就开始进入倒计时了。

如果你留最轻松的几门课在最后一个学期,还是找不到工作,我劝你千万别毕业。哪怕你学分修够了,也要再去修一门课。这样不仅可以申请学生贷款暂时维 持生计,以前的学生贷款也不用急着还。为什么不能毕业呢?你知道吗,在北美的失业人员调查中,排在第一位的原因是什么吗?是因为”在过去的一年中没有找到 工作”!这样的比例占到差不多一半!我开始很纳闷为什么,后来终于明白了,比如说,雇主如果看见你一月份就毕业了,现在都九月了,那就是说,你在工作市场 上都已经推销自己8个月了,不管有没有过面试,别的雇主都不想要你,那他还干嘛浪费时间看你的简历呀!

更糟糕的是,北美的人通常都是在毕业前几个月甚至半年就开始找工作的,所以雇主可以认为你已经找工作12个月了,要么就是没人面试你,要么就是有面试但是没人看上你,你敢说他的推断不正确吗?只能说你不熟悉加拿大的国情,白吃亏!

有人会问,没毕业怎么找工作呀?我的妈呀,你可千万不要把中国的经验用到北美来!你在简历里面说I am graduating 之类的话就行了,甚至根本不用提你什么时候毕业的事儿!就写比如…, Concordia University. 09/2006~present. 之类的就行了。如果雇主真要问,那起码也是有机会面试了才会问。至于面试时问起来应该怎么回答,google一下或是找你学校的Career Placement Center那些专家问一问吧,免得你的学费里白交了那一部分。这里恕不赘述。

8. 如果能够在读书期间找到工作,千万不要再读书,等过半年你工作稳定之后,再part time完成你的学业,或者等到经济危机把你裁员了,再回去完成你的学业。

就像前文所说,不用毕业证一样可以找工作,北美的雇主从来不看你的毕业证,甚至很多公司面试的时候连专业问题都不问!花一些时间好好研究一下雇主究 竟关心什么、寻找什么、以及他们如何做出判断,你就会明白了。所以别等到毕业才找工作,如果你运气好,读书的时候就有朋友推荐你去某公司,赶紧去争取那个 面试机会,千万别想着书还没读完。

所有雇主都会在面试成功之后让你前一个合同,里面有一款写着,如果你的简历里面有任何虚假的资料(包括毕业学校和毕业时间),公司可以起诉你赔偿所 有相关损失及惩罚性赔偿,并无条件开除你。也就是说,北美的人都是你说什么他就信什么,从来不怀疑你,因为这个法治国家的严苛法律让他们敢于这么做。

记住,能找到工作就千万别读书,等工作稳定了或者被裁员了再回来读书。原因很简单:读书的目的就是为了找工作,如果目的都达到了,你还追求过程干什么?

如果你想知道深一层的原因,我也只能告诉你这样一个数字:如果失业率上升1%,基本上大学刚毕业的学生的失业率就会增加15%.所以美国的失业率从 4%上升到7%,基本上可以预测45%的应届大学毕业生肯定找不到工作。这也是为什么中国把”保8″(保证8%的经济增长)不仅当作一个经济目标、同时也 把它当成一个政治目标的原因。

中国连续二、三十年都在高速发展,作为中国人,很难体会或预测经济危机带给你的残酷和血腥,这里涉及到很多的经济学原理,就不多讲了,反正我4年前是深受其害。总之记住:找到工作就千万别读书,权当过来人的忠告吧。你要是毕业的时候正好碰上经济危机,你可就倒大霉了!!

9. 毕业前尽量参加一些社会活动,让你的简历在这一栏不会空白。

其实国内现在也很时兴这个了,你如果在大学时担任过什么全学校的学生会主席、或者随便一个什么部门的头头,哪怕你没有工作经验,也会有很多大公司对 你注目。这边也一样,只是恐怕我们中国人极少有能耐在北美的大学混个什么头头的,所以只能退而求其次了。至少加入一些社会活动来显示一下你不是一个只读书 的书呆子,而且,北美的人很讲究也很喜欢那些回报社会的人,至少你也可以表示一下你的意愿。我当时的做法是,在Concordia大学的Office of Disabilities做了一个学期的义工,并拿到了一张义工证书。具体就是帮那些残疾学生克服学习上的困难,都是些琐碎小事,不难。但是有些雇主会看 这些。

10. 想一些办法让某几个教授对你印象深刻,便于在你毕业时给你写推荐信。

幸好当时我在Concordia时给我的几个教授印象极其深刻,否则本科毕业时不仅找不到工作,可能连读研给我写推荐信的人都找不到。我建议每个人 在做好一切准备找到工作的同时,也要留一条后路读研究生,因为万一碰上经济不景气的时候,你使出浑身解数也可能一无所获,这个时候就只能学习很多北美人的 做法了,就是继续猫在学校,伺机出动、或者躲过不景气。

如果想读研,很多中国学生怕让教授写推荐信,在Concordia大学一个班上常常是50多个人,教授能认识你就不错了,谁还会记得你并给你写推荐信啦?

我当时用了三个办法获得教授的深刻印象:第一个是中国人教授,这个不难,我选了他的两门课,两门课都是A+,中国人教授看见中国人学生,记住一点不 难。第二个是印度教授,她当时上课喜欢发一些东西,50几个学生哪儿发的过来呀,我就经常帮她发,那她能不认识我吗?其实,她当时问有没有学生愿意帮她 发,竟然好几秒钟没有人反应,我就呼的一下上了,多好的机会呀。后来每次帮她发,好几个中国学生还笑我是不是想当班干部?第三个教授是我事先就策划好的, 她虽然只是个副教授,可是是一个实验室的头儿,能量挺大。还没开学的时候,我就乘着圣诞节把那一门课自己先全部学了一遍,等她讲课的时候我就等于在复习 了,所以经常可以问她一些别的学生没可能问得出的问题,好几次把她问得冒汗。好在国外的教授从来不在意你问倒她,在中国问倒教授可能会说你是出风头,在这 儿问倒教授会讨喜欢,后来这个”冒汗教授”给我的推荐信是最好的。我也很感激她,一直到现在还和她有email联系。

后来申请McGill读研被拒绝之后我也一样,我先是找到了一个绝佳的机会给McGill同一个系里的一个老师打工,做programmer,这样 可以近距离的接触系主任,低头不见抬头见的。两个月后我申请成为special student, 就是只修课不拿文凭的那种。其实,我心里非常清楚,这是系主任有意要试探我的实力,以便决定是否下一年录取我。当时有一门功课是系主任亲自教授,教材也是 他自己写的,我那几个月的紧张赶得过当年高考,结果后来我不仅成绩上好,而且考完之后还给了系主任一个清单,上面列出了他教材中的17出错误,虽然他当时 非常吃惊,并当场验证了有10处是印刷错误,但仍然有7处是原文错误,他对此行为很为赞赏(当时我趁机谦虚了一番).此外,他说我被McGill拒绝了之 后、却一直锲而不舍地争取机会、脚踏实地的干事,让他感觉很好,所以后来系里开例会时,提前9个月就已经决定下一年肯定录取我。再后来在研究生二年级时, 系主任帮我解决了一个极大的做研究的困扰,毕业之际也少不了给我写推荐信之类的,虽然他最终没能帮上我找到工作,但是他帮我得到了一个面试机会和绝佳的面 试经验、并给我极大的信心。我一直很感激他。

11. 有意识的制造一些可以放在你简历中的亮点。

如果你懂得北美找工作的竞争策略的话,就会知道,虽然”工作经验”是最重要的,是敲门砖,但是要想在几个甚至几十个竞争者中最终取胜,你必须向雇主证明,同样做某一件事,你总是最优秀的。

这里举几个例子:我在Concordia大学的毕业总GPA是3.68,大约是top 5%吧。虽然申请McGill的研究生时被拒绝了,但是他们说是因为我的本科的专业与所申请的研究生专业并不对口(有点像转行).但是因为我认准了这个专 业毕业后好找工作,所以才有后来做programmer和做special student的故事。如果没有这个3.68的GPA作底,我想McGill连做special student的机会都不会给我,因为这个专业录取的中国学生的历史记录中,大约一半本来就是博士、另一半本来就是硕士加上还有论文发表,我是唯一的本科 生。(由此也可见,好找工作的专业竞争也是极其激烈的。)

第二个例子,我在Concordia大学时,试过一个学期选6门三个学分的课,结果拿了5个A+,一个A-,我的推荐人多次引用这个事实来向McGill推荐我的实力。

第三,在McGill读研时,我的研究被发表在我们这一行在北美最权威的杂志上,是关于内照射放疗治疗癌症的,绝大多数的研究生在校期间的成果是不会被发表的。

此外,我做programmer时所编的程序也被放在McGill的网站上,一年内被全世界下载600余次,并获得McGill一个什么教育奖(忘了),获得一万多加币的资助。

记住,要想压倒其他的竞争者最终取胜,你得向雇主拿出事实证明,不管做什么事,你总是最优秀的。真正杰出的公司有时关心你的优秀多过关心你的经验。说的白一点就是:有经验的人是绩优股,优秀而没经验的人是成长股,总有人会亲睐成长股的。

12. 尽量通过行业协会之类的渠道找一些可能帮助你找工作的人

如果说我的看得见的上述事实让我的系主任和某一个老师肯推荐我,并最终导致了我一个工作的offer的话。那么我的另一个offer就是通过北美本 行业协会的中国人找到的,去年初的时候,我就搞到了那个行业协会的会员名单,有6000多人,从名字看有大约500人是中国人,于是我给500个中国人都 去了一封精心准备的email,简短的email里有一个网页链接,网页上是我的个人介绍和简历等。大约有20多人回复了我,有那么四五个人还认认真真的 想办法帮我,我真的非常感激这些中国同胞。虽然最后这几个人都没有帮成功我,但是,不知道这500人当中谁把我的资料转交给了一个在美国加州的本行业的中 国老板,而那个老板从来不主动招人,以他的说法,就是中国人太缠人,他曾经放过一次很小规模的广告,结果美国有不少的中国来的研究生拼命地每天给他打电 话,、一天打几次的都有,所以他从此就不再放广告了,虽然他每年还在招人。

他从他朋友那里(我发email的500人当中的一个)得到我的资料,说对我的经历十分的感兴趣,于是约了个时间初步电话交谈。结果第一次交谈就谈 了半个小时,我与他谈得很投缘,三天后他就决定把他手头现有的一个offer给我,说如果我去的话,他会马上打发走另一个在他那儿已经实习了两个星期的另 一个中国人!

你看,拐弯抹角的最后竟然成功了,虽然确实带有运气的成分,但是那最后剩下的愿意帮我的五六个中国人不停的帮我联系,并让我几乎得到两次面试的机 会,这些来来往往的联系对我整个找工作的过程中的鼓励极大,让我一直保持着积极的态度,闯过了经济危机带给工作市场的阴霾,坚持到最后得到了两张 Offer.

13.花点小钱,可以让你的简历变得很值钱。

与北美最大的找工作网站Monster的打交道的过程当中,让我真正明白了北美工作市场的一些实质性的东西。我最开始是学习了很多怎样写简历的资 料,自己写完之后,让我的朋友改,让我的老师改,然后自己再根据雇主的反应和面试的经验再加以修改,一直到后来,我怀着好奇与试探的心里,花了三百多美元 让Monster的专家帮我修改了Resume.刚开始还很不习惯他们帮我修改后的内容和格式,后来慢慢越来越悟出里面的专业水平和北美找工作之竞争法 宝。其实说白了很简单,就是我在上面第11点里所说的:你怎么向雇主证明,同样做某一件事,你总是最优秀的。对于缺乏工作经验的大学毕业生来说,这是唯一 可用的杀手锏!我建议每个找工作的人,给Monster交这笔钱很值。以我自己来说,我先试过把自己的简历放到Monster上,基本上没雇主找我,但是 Monster的专家帮我修改之后,两周之内竟然有3家非常不错的公司向我主动招手。只是我当时还是一心想到医院工作,觉得不仅薪水高,而且工作稳定,所 以没有理他们。我后来把那几家作为后备了。

14. 永远都要表现得很优秀,锲而不舍,并要尽量让你周围的所有人都看到。

我是一直相信:人的IQ相差不会太大、要想优秀就一定得付出代价。所以,上面第11点所说的事实,不过是建立在我每周工作或学习60个小时的基础上 而已。如果您能抵挡得住绝大多数的诱惑,坚持每周工作或学习60个小时的话,你不论做什么都会很优秀,比我还优秀。我自认不是一个IQ高的人,尤其是记忆 力奇差,所以英语老也学不好,一直到今天,在我工作的医院,我的英语都只是可以应付的水平,虽然中文我可以对着上千人演讲。

当然,接触过我的人都知道,我绝不是那种只知道读书的书呆子。一个在国内读空调暖气专业出身的书呆子,是做不到跨国金融公司在中国广州的销售部经理 的。只不过我年轻时玩得很多也很广,甚至自己开过公司,感觉什么都玩得差不多了,那些东西对我已经构不成致命的诱惑而已。年龄越大,越觉得事业的成就才最 让我开心。”挡得住各种娱乐的诱惑”就是我比那些二、三十岁的人比起来唯一的优势。只要我想,我就能focus我自己。

此外,永远不要向挫折低头。4年前我从Concordia大学以3.68的GPA毕业,可是正好碰上911事件之后北美的电脑电子行业的工作大规模 外包,我同班的12个中国同学没一给找到本专业工作的,直到现在还有一个在打Labour工,那一年可以说也是我一生中最郁闷的一年,郁闷得我后来一直怀 疑我一年之内会得癌症。可是,我是一个信奉”绝不在同一个地方跌倒第二次”的人,就算跌倒了,也要抓一把沙再站起来!几年下来,我总结了上文的这些经验甚 至是教训,坚持读完了研究生,也终于走出了阴霾。

FYI,我到现在依然坚持每周工作60个小时。当我看见因为我的超时工作而快速进步时,我心里有一种异样的满足。此外,说一句题外话,努力工作并不 等于忽视对子女的教育,自己如何做就是给自己子女最好的榜样,我从来不用管女儿的学习,但她的成绩永远是班上的第一名,她当然也不是书呆子,体育的、音乐 的、绘画的、国际象棋的、综合表现的等等奖牌十余枚,有两个还是Quebec省的冠军。每个周末我都带她坐公车、挤地铁去参加她的那些兴趣班,八年来每周 如此。我从来都相信:成功必有理由,失败没有借口。

理解inode

————————————————————————————————————

From: http://www.ruanyifeng.com/blog/2011/12/inode.html

作者: 阮一峰

日期: 2011年12月 4日

inode是一个重要概念,是理解Unix/Linux文件系统和硬盘储存的基础。

我觉得,理解inode,不仅有助于提高系统操作水平,还有助于体会Unix设计哲学,即如何把底层的复杂性抽象成一个简单概念,从而大大简化用户接口。

下面就是我的inode学习笔记,尽量保持简单。

===================================

理解inode

作者:阮一峰

一、inode是什么?

理解inode,要从文件储存说起。

文件储存在硬盘上,硬盘的最小存储单位叫做”扇区”(Sector)。每个扇区储存512字节(相当于0.5KB)。

操作系统读取硬盘的时候,不会一个个扇区地读取,这样效率太低,而是一次性连续读取多个扇区,即一次性读取一个”块”(block)。这种由多个扇区组成的”块”,是文件存取的最小单位。”块”的大小,最常见的是4KB,即连续八个 sector组成一个 block。

文件数据都储存在”块”中,那么很显然,我们还必须找到一个地方储存文件的元信息,比如文件的创建者、文件的创建日期、文件的大小等等。这种储存文件元信息的区域就叫做inode,中文译名为”索引节点”。

每一个文件都有对应的inode,里面包含了与该文件有关的一些信息。

二、inode的内容

inode包含文件的元信息,具体来说有以下内容:

* 文件的字节数

* 文件拥有者的User ID

* 文件的Group ID

* 文件的读、写、执行权限

* 文件的时间戳,共有三个:ctime指inode上一次变动的时间,mtime指文件内容上一次变动的时间,atime指文件上一次打开的时间。

* 链接数,即有多少文件名指向这个inode

* 文件数据block的位置

可以用stat命令,查看某个文件的inode信息:

  stat example.txt

总之,除了文件名以外的所有文件信息,都存在inode之中。至于为什么没有文件名,下文会有详细解释。

三、inode的大小

inode也会消耗硬盘空间,所以硬盘格式化的时候,操作系统自动将硬盘分成两个区域。一个是数据区,存放文件数据;另一个是inode区(inode table),存放inode所包含的信息。

每个inode节点的大小,一般是128字节或256字节。inode节点的总数,在格式化时就给定,一般是每1KB或每2KB就设置一个inode。假定在一块1GB的硬盘中,每个inode节点的大小为128字节,每1KB就设置一个inode,那么inode table的大小就会达到128MB,占整块硬盘的12.8%。

查看每个硬盘分区的inode总数和已经使用的数量,可以使用df命令。

  df -i

查看每个inode节点的大小,可以用如下命令:

  sudo dumpe2fs -h /dev/hda | grep "Inode size"

由于每个文件都必须有一个inode,因此有可能发生inode已经用光,但是硬盘还未存满的情况。这时,就无法在硬盘上创建新文件。

四、inode号码

每个inode都有一个号码,操作系统用inode号码来识别不同的文件。

这里值得重复一遍,Unix/Linux系统内部不使用文件名,而使用inode号码来识别文件。对于系统来说,文件名只是inode号码便于识别的别称或者绰号。

表面上,用户通过文件名,打开文件。实际上,系统内部这个过程分成三步:首先,系统找到这个文件名对应的inode号码;其次,通过inode号码,获取inode信息;最后,根据inode信息,找到文件数据所在的block,读出数据。

使用ls -i命令,可以看到文件名对应的inode号码:

  ls -i example.txt

五、目录文件

Unix/Linux系统中,目录(directory)也是一种文件。打开目录,实际上就是打开目录文件。

目录文件的结构非常简单,就是一系列目录项(dirent)的列表。每个目录项,由两部分组成:所包含文件的文件名,以及该文件名对应的inode号码。

ls命令只列出目录文件中的所有文件名:

  ls /etc

ls -i命令列出整个目录文件,即文件名和inode号码:

  ls -i /etc

如果要查看文件的详细信息,就必须根据inode号码,访问inode节点,读取信息。ls -l命令列出文件的详细信息。

  ls -l /etc

六、硬链接

一般情况下,文件名和inode号码是”一一对应”关系,每个inode号码对应一个文件名。但是,Unix/Linux系统允许,多个文件名指向同一个inode号码。

这意味着,可以用不同的文件名访问同样的内容;对文件内容进行修改,会影响到所有文件名;但是,删除一个文件名,不影响另一个文件名的访问。这种情况就被称为”硬链接”(hard link)。

ln命令可以创建硬链接:

  ln 源文件 目标文件

运行上面这条命令以后,源文件与目标文件的inode号码相同,都指向同一个inode。inode信息中有一项叫做”链接数”,记录指向该inode的文件名总数,这时就会增加1。

反过来,删除一个文件名,就会使得inode节点中的”链接数”减1。当这个值减到0,表明没有文件名指向这个inode,系统就会回收这个inode号码,以及其所对应block区域。

这里顺便说一下目录文件的”链接数”。创建目录时,默认会生成两个目录项:”.”和”..”。前者的inode号码就是当前目录的inode号码,等同于当前目录的”硬链接”;后者的inode号码就是当前目录的父目录的inode号码,等同于父目录的”硬链接”。所以,任何一个目录的”硬链接”总数,总是等于2加上它的子目录总数(含隐藏目录)。

七、软链接

除了硬链接以外,还有一种特殊情况。

文件A和文件B的inode号码虽然不一样,但是文件A的内容是文件B的路径。读取文件A时,系统会自动将访问者导向文件B。因此,无论打开哪一个文件,最终读取的都是文件B。这时,文件A就称为文件B的”软链接”(soft link)或者”符号链接(symbolic link)。

这意味着,文件A依赖于文件B而存在,如果删除了文件B,打开文件A就会报错:”No such file or directory”。这是软链接与硬链接最大的不同:文件A指向文件B的文件名,而不是文件B的inode号码,文件B的inode”链接数”不会因此发生变化。

ln -s命令可以创建软链接。

  ln -s 源文文件或目录 目标文件或目录

八、inode的特殊作用

由于inode号码与文件名分离,这种机制导致了一些Unix/Linux系统特有的现象。

1. 有时,文件名包含特殊字符,无法正常删除。这时,直接删除inode节点,就能起到删除文件的作用。

2. 移动文件或重命名文件,只是改变文件名,不影响inode号码。

3. 打开一个文件以后,系统就以inode号码来识别这个文件,不再考虑文件名。因此,通常来说,系统无法从inode号码得知文件名。

第3点使得软件更新变得简单,可以在不关闭软件的情况下进行更新,不需要重启。因为系统通过inode号码,识别运行中的文件,不通过文件名。更新的时候,新版文件以同样的文件名,生成一个新的inode,不会影响到运行中的文件。等到下一次运行这个软件的时候,文件名就自动指向新版文件,旧版文件的inode则被回收。

(完)