与心灵对话

过去理解的,现在未必理解。 过去懂得的,重温必有新意。 整理过去,整理现在。成就现在,成就未来。
posts - 128, comments - 30, trackbacks - 0, articles - 1

2009年7月3日

《谈话的力量》  by Alan Garner

一、          
通过问题促进交谈

1.      提出开放式问题而非封闭式

2.      避免问题过于宽泛

3.      一开始的问题要简单、对方易于回答、感兴趣回答,不要过于难

4.      事先做好准备

5.      提问时不要在别人回答之前就包含个人的观点和立场

二、           表达诚实的称赞

1.      鼓励喜欢的行为比惩罚不喜欢的行为更有效

2.      将称赞说得更具体一些

3.      在称赞中加入对方名字,让他觉得是针对他说的而不是敷衍

4.      可以在称赞后加上一个相关问题,帮对方接受称赞

5.      称赞别人时不要有任何索取

6.      切忌一味称赞,否则显得太假

7.      不要用对方称赞自己的话回答对方

8.      适当向第三方称赞另一个人(间接称赞)

9.      积极接受别人对自己的称赞

三、           倾听别人的话语

1.      积极倾听,就是告诉别人你对他发出的信息的理解(“你是说……,是么?”),尤其是不太确定对方意思的时候,以及对方传递重要信息或者感情上的信息时。

四、           利用自由信息

1.      学会利用自由信息(即你没有主动要求也没有预料到的信息)去展开话题

五、           让别人知道你

1.      学会自我透露。通常的交流经历四个阶段:套话、事实、意见、感受,自我透露的程度逐渐提高

2.      自我透露时内容要具体,也可以适当展示自己的缺点和反面

3.      自我透露切忌观点不明确,如不用“我”而说“你”,不用陈述句而用问句,等

六、           开始一段谈话

1.      通过谈论环境、对方、自己来开始一段谈话,通常谈论环境和对方比谈论自己更容易开始

七、           发出可能被接受的邀请

1.      要学会用双重视角,发出对方可能感兴趣的邀请

2.      一开始的邀请要随意一些,从小处着手,不要让对方觉得邀请参加的活动意义太大太重要而不敢随意参加

八、           积极地接受批评

1.      当别人批评自己时,不要急于逃避、反击

2.      当别人批评自己时,首先要询问具体内容,对时间、地点、原因、人物、什么、怎么样提问,搞清楚别人到底为啥批评自己

3.      第二步要同意对方的批评,可以同意对方批评的事实,如果不同意,则要同意对方有表达意见的权利

4.      第三步可以通过自我透露表明自己的立场

九、           拒绝别人的操纵

1.      “破唱片”的方法:不管你别人说什么,都可以同意他们的意见或给予他们表达意见的权利,但是自始至终保持一贯的态度,重复同样的话表达拒绝

十、           要求改变

1.      希望别人做出改变时,可以利用如下公式:“我不太满意,你【说明其行为】,(使得)【指出后果】,所以我觉得【描述自己的感受】。

2.      说明其行为的时候,尽量采取客观的态度,说得具体一些,让对方明确领会你的意思,一次只需提一种行为,不要说太多,最好只专注现在发生或刚刚发生不久的行为,不要翻出“陈芝麻烂谷子”的事,不要抱怨对方“总是……”,不要妄加揣测和推断对方的意图

3.      指出后果时,要用积极的态度

4.      描述感受时,要注意用简洁的语言,不要用粗俗的语言

5.      作完以上陈述后要暂停一下,给对方以回想的时间,从而可能提出令人满意的解决方案

6.      如果没有成功,要进行直接要求,要具体要求对方改变某一个做法,一次只提一件事

7.      如果还没有成功,则采用“破唱片”做法,不断重复要求,直到成功

8.      可能对方无法完全按照你的要求去做,这时会进行商谈,商谈过程中要始终牢记你最初的目的——希望某种需要得到满足或者某种权利受到尊重,解决办法可以根据双方反馈进行调整,但一定要满足最初的目的

十一、   通过动作表情达意

1.      注意保持合适的个人空间

2.      表达喜欢的感情可以采用SOFTEN方法:Smile微笑、Open posture开放的姿态(同时和两个人说话时可以上半身对一个人小半身正对另一个人)、Forward lean身体前倾、Touch身体接触、Eye contact眼神交流(对方瞳孔放大表明喜欢你)、Nod点头

十二、   减少社交场合中的紧张心理

1.      紧张的原因是因为有如下几种信念:逃避、恐惧、以偏概全、要求过高。

2.      挑战逃避意识——追问自己有什么证据表明是这件事情让自己紧张;自己对自己叫“停”,从而驱逐头脑中存在的逃避想法

3.      挑战恐惧心理——想想自己头脑中的“可怕”事件发生的可能性有多大(通常会很小);想到最坏的结果,并用感情色彩较弱的词语去描述它(最坏也就是……,顶多只是称得上倒霉……)

4.      挑战以偏概全的习惯——不仅不要对自己“贴标签”也不要对别人“贴标签”,问问自己“贴标签”的证据在哪里,往往发现没有合理的证据;过去发生的事情不代表将来一定发生,失败过并不代表将来不能成功

5.      挑战要求过高的心理——不要要求完美,也不要坚持遵循对自己不利的准则(过去一直以某种方式做事并不意味着必须一直这样做);不要要求别人遵循你自己的准则,别人是你不可控的

十三、   有计划地去努力

1.      设定明确的目标——目标要明确(描述的行为不会与其他行为混淆);要可证实(即使旁观者也可以确定你是否实现了目标);要肯定(“我要……”而不是“我不能/要……”);要可计量;要明白目标的实现完全取决与你自己的行动(不要根据别人的回应来判断是否成功)

2.      划分目标的等级——多个目标需要实现时,分难易,先做最容易的

3.      增加步骤——当一个目标较难时,可以细分为多个步骤,一步一步去实现

4.      预先演练——可以在付诸行动前自己演习

5.      奖励自己——设定目标时同时设定实现目标后对自己的奖励,并切实兑现奖励(奖励要是自己真正想要的),不要吝惜达成目标后对自己的表扬

Learning from "Apprentice"

 

Tips learned:

1.       If you are a leader, do be decisive.

2.       Never underestimate the enemy.

3.       As a leader, you should be able to manage your team members.

 

Suggestions from Mr. Trump

1.       Deal good with boss.

2.       People needed: can handle pressure, creative.

3.       Respect from winning.

4.       领导常常需要力排众议。Lead with authority.

5.       A leader should be decisive.

6.       有时候做生意靠直觉。Business comes from instinct.

7.       Always listen to others, though you may not do as they say.

8.       Go big or go home. Think it big.

9.       Sell your ideas.

10.   Know when to fold.如果一个想法不切实际或效果不理想,即使它是你一手想起来的,也要适时放弃。

11.   There is no failure, you can never quit.

12.   I don’t need choker.(怯场的人)

13.   You should love what you do.

14.   A leader should be able to control his underlings.

15.   Always focus in the goal.

16.   Getting along with people is very important.

17.   Be flexible; be able to change.

18.   A leader should know how to inspire his/her staff.

19.   Good leader knows the strength and weaknesses of his/her employees.

20.   Good deal is all about money; money is what proves your success.

21.   Members in the best team push each other. You should push your team members to perform their best.

22.   Get to the point, don’t waste time.

23.   Loyalty is very important.

24.   Great business man knows how to balance creativity and feasibility.

25.   Always stand up for yourself.

26.   A deal is a deal. Once you shake hands with others, never break up the “hand-shake” for no reason.

27.   A god is in the details.

28.   Never beg when you sell things.

29.   You should believe what you sell, or else you will sell nothing.

30.   Energy is very crucial.

31.   You will not succeed without passion.

posted @ 2009-07-03 12:21 小强摩羯座 阅读(11) | 评论 (0)编辑 收藏

2009年6月30日

知识分子的故园—在复旦大学的演讲

【编者注:这是我阅读复旦大学计算机系博士生孙贺的主页博客时,发现的其讲话稿。阅读之后,对其思想的深邃颇为欣赏。另外我对其文中提到的几个哲学家也都不知道,估计在小孙的眼里,陈首席基本上属于文盲的范畴。有兴趣的读者可参阅知识分子的故园

非常感谢复旦大学本科生资助委员会给我提供了这样一个机会,使我很荣幸的来和大家进行交流,提出自己的一些想法。

今天我和大家谈的倒不是我个人的在专业领域的看法,我主要是想和大家谈一谈作为当代的知识分子,应该扮演着一个什么样的角色。为什么要谈这样一个问题呢?因为我们发现今天知识分子的意义和两百年前或者三百年前已经有了明显的不同。比如在十七八世纪,许许多多的知识分子,比如帕斯卡、康德、卢梭,他们把他们的研究和实践结合在一起。我们首先以说帕斯卡为例,我在这里提到的帕斯卡,就是所有学过初等数学,都知道“帕斯卡三角形”的那个帕斯卡。他是一个法国科学家,为了帮助工作繁忙的父亲,他设计了法国的第一台计算器。他利用自己发明的气压计证明了真空的存在。不仅如此,他的《沉思录》被认为是当代人和思想的第一次对话。他还是一个虔诚的天主教徒。

不幸的是,他在三十六岁时疯了,在后面的三十七年里一直住在疯人院里。我们再来看康德。在三十一岁那一年,康德写下了《自然通史与天体理论,或根据牛顿定律研究整个宇宙的结构及其力学起源》的非凡著作。之后,康德还写过《将负数引入哲学的尝试》等论文,从此开始了数学和物理学的研究。众所周知,康德最为重要的著作就是三大批判,即《纯粹理论批判》,《实践理论批判》和《判断力批判》。除此以外,康德还有一系列关于教育学的著作,例如《论教育学》、《系科之争》等。康德的主要著作还包括《使用人类学》。我们很难想象一个终身生活在哥尼斯堡这样一个小镇的单身汉,在他八十岁的生活中没有离开过这个小镇一步。在漫长的八十年的单身寂寞的生活中,他思考了人生中一切的伟大的实践。在他的墓碑上有这样的一句话:“有两样东西,我们越是经常不断地思索他们,他们就越是唤起一种始终新颖和日益增长的赞叹和敬畏充溢我们的心灵,那就是我头顶的星空和我心中的道德律。他们向我印证:上帝在我头顶,也在我心中。”我提及的这些事实意在说明:今天的知识分子和两百年前传统意义上的知识分子在形式上出现了非常显著的差别。关于这一点,五十年前的德国哲学家和精神病学家卡尔•雅思贝斯在《在时代的精神生活》这本书中,就已经一针见血地提出了。

尽管雅氏描绘的是二十世纪三四十年代的欧洲社会,但在今天看来,他的针砭时弊、一针见血的分析同样适用于中国现实社会。一言以蔽之,他所阐述的就是在现代社会我们的知识已经瓦解,人的生活缺乏精神上的向导。文艺分析时期,一个人的学术研究和生命实践始终是结合在一起的。但是在今天,我们并不这样来看代学术研究。雅斯贝斯的分析非常精辟,他说,我们的一种以前从事高尚研究的快乐,被一种从事狭窄技术领域研究的快感所取代。在这样的情况下,一种可怕的情况出现了:我们不再认为学术研究是崇高的。比如今天我问大家,大家儿时的梦想是什么,可能对在场的各位同学而言,你们会说童年时代的纯真的梦想是成为一个科学家,因为在那时的我们内心深处科学家代表了一种崇高。但是在今天,当各位从事学术研究的时候,你们会发现:你们现在所走的学术道路与你们儿时的梦想相差甚远。为什么?我们钻入到一个狭窄的领域,我们在进行研究,但是这种研究并不能给我们带来普遍的幸福

于是在这一点上一个很关键的问题出现了。我们就要问:这种情况是如何发生的?对于二十年前的中国知识分子而言,他们的存在首先代表了一种人文情怀。但是这种情况在今天已经消失殆尽。今天的中国社会在一定程度上、或者说今天的中国人和全世界的许许多多人,没有两三百年前的人更富有想象力,更能耐得住寂寞。今天的人们听任于娱乐的安排,我们上网,聊天,看电视,然后有各种各样的休闲手段。你如果寂寞的话,你会有一个各种各样的方式去排除寂寞。叔本华说过一句话 “孤独是一种伟大的情感”,但是今天的人已经甚少有一种真正的孤独的感觉。大家有的是什么,是郁闷,对吧?我们有的是郁闷。但是对于今天的人们,更为可怕的是,今天中国的一部分知识分子,居然走上了模特在T字台上所走的猫步。比如说于丹,等等。正是在这一点上,我们看到:今天的知识分子已经与一种作为知识分子本身的使命感相隔绝了。这种使命感是什么?我作为一个知识分子,我要去为国家而奉献、牺牲。天下兴旺,匹夫有责的中国古代人文精神在今天的知识分子中悄然消失了。所以,每当我忆起起俄罗斯文学的时候,俄罗斯知识分子的那种流亡意识总是给予我深刻的印象和泪如泉涌的感动。即一个知识分子,他可以抛弃生命中物质的一切,也要保守某种精神生活。一旦人们承认人的生活不是兽性的,而是文明的,那么他在世界中的生活本质上讲就应该是一种精神生活。

海德格尔曾经说过:人是追求生活意义的生物。如果一个人在他的生活中找不到生命的意义,他宁愿去自杀,哪怕他的身边全是面包。如果我们试图理解这样一句话,一个自然的问题就会被立即提出:即这种生命的意义应该如何去寻找?其实在人类的启蒙时代,就曾经提到过这样的问题。即人类在文明开始之初,他们就已经想到过一个人的生活必须有一种深刻的意义在其中。为什么,我们今天来想一下:如果我们认为,我们出生之前的一切,和我们毫无关系,在我们死亡之后的一切,和我们也没有任何关系。那么我们的生命是不是没有任何意义,我们在世界中的生活就只剩下吃喝玩乐。但是事实并不是如此。所以在东西方文明的早期,人们同时想到了同一个问题:即在终极上,人的生活应该是有意义的。从这一点出发,东西方文明对于这样一个绝对意义,想出了两个不同的途径,即起源于东方、盛行于西方的基督教文明和中国的儒学思想。在西方的基督教世界中,西方人认为:倘若有一个绝对的上帝在我们中间,人生就可以获得形而上学的意义。因为在这刻,人们可以自然地产生一种超验之思。我们可以,把一个人的生活放到一个上帝的维度,因此人就有一个全能的上帝去审视字词。在这时,他就可以约束着我们。与此同时,中国的儒家学派,将人的根本意义,集中到了礼教,伦理这一层面,这是一种脱离了行而上学的思辨。所以黑格尔在他的《哲学演讲录》的第一卷中就曾写过:”中国没有真正的哲学,有的只是伦理学。”可悲的是,今天的中国人,还在信仰着以伦理为基础的东西。我们有没有深刻地思考过,我们这种伦理,它的合理之处在哪里?也许这是我们需要真正思考的问题。今天许多的中国学生,缺少一种独立思考的精神,我在这里,我称其为一种精神,而不是一种能力,因为这本身非常重要,无法通过世俗教育去培养。在中国的儒家学派中,我们说“不孝有三,无后为大”,“父母在,不远游,游必有方”,等等。我们也都知道,为了纪念投汨罗江自尽的现实主义诗人屈原,中国传统中于是又了端午节,并有了吃粽子、赛龙舟的习俗。我们称屈原是一个伟大的现实主义诗人。原因何在?不妨去读屈原的《天问》,他百思不得其解要问的是什么?在我看来,他问核心的是在这样一个以儒教为统治的国家中,王权的合法性在哪里。屈原最早认识到了这一点,对一个人而言,是一种非常痛苦的事实。因为一个人生活在儒家思想中,却不能为以这种思想为生活的合理性提供依据。今天的人们一方面去宣扬儒教,一方面我们去纪念屈原,这不是一个非常可笑的事实吗?我们拿着伦理不放,但我们今天的人们没有真正地去思考,这种伦理的合理性在哪里?

基督教文明从公元五世纪到十五世纪,经历了漫长的一千年中世纪。一千年后,欧洲迎来了文艺复兴。与此同时,近代的基督教社会有了一次又一次的改革。直到十九世纪末尼采“杀死”了上帝。尼采曾经写过《查拉图斯特拉如是说》这本书,有人说这本书的出版把无数人的宗教信仰一劳永逸地消除了。尼采是种非常自信的人。他曾经在一本书的前言中写到:我的书是为这个社会极少数的人写的,但在这极少数的人当中,可能一个都还没有出生。但尼采断言,我的书终将名垂千古,载入史册。晚年的尼采非常寂寞,在日记中他写道,在大街上,我想拥抱随便哪一个人。寂寞之极,一八八九年尼采在都灵大街上抱住了一匹受马夫虐待而发疯的马,尼采疯了。二十世纪的曙光来临之时,尼采安静地离开了这个世界。

尼采杀死上帝后,西方人的生活突然呈现了一种荒诞性。如果没有一个人,没有一种绝对的规则存在的话,人是可以胡作非为的,因为绝对意义消失了。一旦绝对意义消失,那么人在在一个荒诞世界中的生活,其实很容易,吃喝玩乐,仅此而已。但是一个知识分子,如果在一个荒诞的世界中,既要去承担一种荒诞,并且要从荒诞中寻觅意义的话,这就非常困难。此时,存在主义的兴起为二十世纪人的生活的合理性提供准则。我们以最著名的存在主义大师萨特为例:当我们去看他的《他人就是地狱》这本书的时候,我们会发现一篇著名的文章,即《论五月风暴》。在这篇文章中,萨特谈论的是一九六八年全球范围内的学潮运动。萨特这样写道:他们反了,他们要寻找一个他们自己的世界。而这个世界,在我们的年轻时代,也曾经寻找过。但在我们年轻的时代,我们没有去反抗。而今天,他们的反抗和我们年轻时候沉默的事实,证明了在面对同一个制度的时候,他们的伟大和我们的渺小。通过这样的方式人们发现,在一个虚无的世界上,人的活动就是成了人的意义本身

而在今天的中国社会,一个知识分子如何去创造他自己的意义?今天人们没有,或者说今天的中国人缺乏这样的反思。有人问,中国的知识分子,中国的文学家,为什么没有去拿诺贝尔文学奖。或者有人问,中国的文学家,离诺贝尔奖还有多远。在我看来,这个问题,我可以从这样一个视角给出回答,就是在我们今天中国的作家——或者说从鲁迅开始——所描写的生活,偏重于人的社会生活分析而没有很深刻地剖析人的生存本质。当我们去读马尔克斯的《百年孤独》,我们有一种人的孤寂和幻灭的感觉。甚至有人告诉我,他读过之后有一种自杀的感觉。因为在那里,我们看到了关于人谓之人的深刻反思。而今天的中国作家,中国的知识分子,缺乏这种反思。

 

为什么这种反思尤其重要?黑格尔曾经说过这样一句话“一个民族总要有一些仰望星空的人,这个民族才有希望。如果这个民族所有人都仰望脚下的事物,那么这个民族是没有希望可言的。”今天中国社会的可怕在于我们太缺乏这样的知识分子。这是一个民族的可悲。如果问今天的中国,有什么可以使我们低下头颅来,我认为,在中国近三百年来,我们没有产生一个可以和西方的知识分子相抗衡的知识分子。我们没有产生萨特这样的人物。没有产生康德,黑格尔,叔本华这样的人物。甚至没有产生加缪和福柯这样的人物。这是一个民族的悲哀。每一个深刻思考过时代精神的知识分子都能意会:夫物质之文明,取诸他国,不数十年而具矣,独至精神上之趣味,非千百年之培养,与一二天才之处,不及此。

让我们去审视德意志民族。德国有一个非常伟大的教育家——洪堡。他按照自己的教育思想,建立了洪堡大学。后来,德国许许多多的大学,都是按照他的模式建立起来的。在我读本科的时候,这种思想,我们全世界仍然是他的受益者,那是什么?那就是关于教育之本质的深刻理解。所有人你来德国学习,学费是全部免掉的。因为教育是一种事业。人并不是仅仅生活在现实生活中,人是一种历史的被造物。置于一切历史之下,教育便有了一种根本的意义,教育的目的是去塑造人。今天的中国之教育,中国的高等教育,把人沦为了一种工具。我们总是评论一所大学的毕业生中,有多少人去国企了,有多少人拿了高薪,当一个高等学府用这个作为一种炫耀的资本的时候,我们便不得不承认:一种恢弘壮丽般教育从根本上堕落了。教育的目的是人,人是目的,不是工具。在洪堡的时代,洪堡几乎是把所有的资源平均地用于教育。所以说德国的大学,他们的好与坏,并没有中国的大学这么悬殊,也没有美国的大学这样悬殊。但是德国,按照洪堡的思想,一个人去接受教育,那么这个教育的钱应该是国家来付。今天的中国人,教育部部长扬言:教育不能产业化;但是从国家到地方,我们实际做地恰恰是教育的产业化。但是现在你去德国留学也是要学费的,全世界已经越来越美国化了。全世界已经一起朝资本看齐的。

这世界仍然有一些非常伟大的人。二十世纪有三个最伟大的知识分子:萨特,福柯和乔母斯基。我不知道在座的各位,有多少人知道这者的名字。有人说,二十世纪的人不知道福柯,就像十九世纪的人不知道马克斯一样。不能说他是文盲,至少不能说他是一个知识分子。我知道我身边很多人都不知道福柯。我去年在西班牙。访问期间,我决定去法国扫福柯的墓。我问了一个在西班牙生活多年的华人,他三岁的时候到了马德里。我告诉他,我想去扫福柯的墓,但不知道福柯的墓在巴黎的什么地方。当然我没有这么直接地问,我先问你知不知道福柯,因为我知道中国的许许多多人都不知道福柯。他跟我说了一句话,他说“我也是读过高中的人”。从这个很小的事情,我们可以看出在欧洲的教育中,仍然没有忽略最核心的精神层面的培养。而这一块,在今天的中国,在我们呼喊素质教育的时候,实际上已经把教育庸俗化。教育的根本目的——人的精神力量的培养——在今天的中国已经被完全忽略了。

我现在指导四个本科生进行研究工作。他们中的每个人都在学术领域崭露头角、甚至取得了令人瞩目的成绩。我时常告诉他们,这还不够。一个学者从专业研究中获得快乐,但是一个思想者应该懂得在学术中生活。思想者这一称谓的定义不是来自他的研究,而应该首先来源他的生活。因为教育的首要目的是培养有思想的人,所以我们经常阅读中西方思想史,试图理解与我们看似久远的西方文明。比如说,福柯有句话:“学校是监狱和医院的混合物”,这句话怎么理解?其实在福柯看来,现在许许多多的人文科学,诸如教育学、心理学、社会学,它们不但不是真理,反而是一种权力、一种杀人的工具。比如说,再让我们回望精神病学,福柯在《疯颠与文明》中探讨了现代精神病的起源。在十六世纪之前,我们并不认为精神病人是疯子。我们甚至把他们作为一种可以预见未来的先知一样看待。疯子可以在大街上游走,并且受到人们的尊敬。这个可能是今天的人们所无法想象的。但是在五个世纪后,在我们所谓更加文明的社会当中,他们为什么就被关进了医院呢?实际上,在一六五六年法国国王下了一条命令,就说建立法国总医院。法国总医院的建立,并不是一个医疗机构。它是一个训诫机构。它要告诉人们:一个人要勤奋的工作,你如果不勤奋工作,就会和大街上的所有流浪汉和所谓的疯子一样,全部都关进了这样一个法国总医院里。当时法国总医院的条件极为恶劣,许许多多的人住在一起,下面就是老鼠乱窜。于是,随着麻风病的消退,精神病人成为了社会唾弃的新对象。但是恰恰在于,今天的人们,我们不能说我们是正常的,从而说你们是非正常的。借福柯之言,现代人需要从他们的角度,去证明精神病人的合法性。但是我们发现,在六百多年的历史进程当中,人们文明的若干关键要素、或者说现代文明,正是通过帕斯卡、梵高、尼采,这些所谓的非理性的人来建立的。但是我们要在他们这些疯子面前,去证明我们的理性是正常的,这不是一个很可笑的事实吗?

现代人的精神,远远没有以前人那样纯洁。现在人在精神层面上已经堕落了。比如说,福柯有一句最为尖锐的话:“只要男人和男人的婚姻一天,现代文明就一天无从谈起。”人们无法理解这样一句话,因为大家听到这句话的时候,大家往往首先想到的不是爱情,而是性。人们认为,两个男人和两个男人在一起,这是很恶心的。人们首先不会去想到,两个男人,只要两个男人他们在精神上在一起,那么这种爱情就是高尚的。而这种爱情曾经在古希腊曾经发生过。在公元五世纪以前也曾经有过。只是在今天,人们越来越强调物质,金钱和欲望的满足。当代社会诸如此类的怪现状还有很多。对于今天的中国的知识分子而言,我们应该有许多深思,当你仔细去想这个时代的时候,你会发现许多反常的现象。如果一代青年人还有一部分人去试图改变这种现象,这个国家就会有希望;如果我们这一代人都试图去迎合世俗,这个国家的精神风貌就会停滞不前。我们的许多知识分子——我们姑且称他们为知识分子——不再把教育作为一种神圣的职业来看待。他们开始炒股,他们开始开公司。他们把学生作为一种免费的劳动力。一种非常神圣的师生关系,一种新货相传的思想之光,在今天堕落得一塌糊涂。他们向国家骗基金,几十万或几百万,然后去做一些不痛不痒的学问。更有甚者,少数知识分子一旦走上领导岗位,便扮演了政客的角色。管你学生好坏、是否才华出众,老子嘴大说得算。在复旦,这是多么大的悲哀。当我忆及国父孙文先生的“天下为公,努力前程”的文字时,我为这些人感到奇耻大辱。

这就我们一个时代的悲哀,也是复旦的悲哀。但许许多多的人没有看到这一点。我希望在复旦,在这样一个很小的优秀本科生当中,在你们思考这些问题的时候,你们要看到这一点。若干年后你们才会试图去改变这一切。

加谬在《西西弗斯神话》的开篇就写道:“真正严肃的哲学问题只有一个,那就是人是否可以自杀。”为什么人他要探讨这样一个问题?刘小枫在《拯救与逍遥》这本书中写道,与其让这个世界以暧昧的方式赢,不如让自己以肯定的方式输。但是在今天,唯独有意义的,是一种生活的创造。是我们可以把生活赋予一种真实的意义。这种真实的意义是通过知识分子的精神活动来体现的。这种精神活动,在一个很低级的层面,正是我们所谓的,一日为师,一生为范。在一个很高级的层面来讲,就是真真正正的知识分子的思想,他的精神能够代代相传。

注定有人会被历史的足迹所记录。比如说贾植芳先生。知识分子不能成为一种政府的附庸。知识分子一词,本来就代表了一个人的精神事实,我们中国的知识分子当中,有贾植芳这样的人,也有类似郭沫若这样的作家。一个人在生活当中,他往往会向某些东西妥协。但是一个人的精神,他的视野,应该是向这个天空的方向去了望。这样一个民族才有希望。

回到具体事情上来,我来谈优秀本科生的专门培养。当我去指导本科生的时候,有一次我和一个本科生聊天。我当时我跟他说,我寝室里有两百本书,你随便看,你看不出我是从事哪一个领域研究的。然后他告诉我,他寝室中也有两百本书。我觉得这样的人才是我欣赏的。首先你是一个有追求的人,其次你是一个在专业领域有所成绩的人。但你一个人仅仅在专业领域有所成绩,你仅仅把发文章当作一种目的的话,那么一个人,他生活的价值就会变得很少。曾经有一个老师对我说,我们总是要把一些东西量化,所以我们博士毕业,发表了多少篇SCI,这种量化就非常重要,因为它很客观。我说,错!这种东西很客观,恰恰是由于我们缺乏了许许多多能够高瞻远瞩的教育者,他认为你是不是具有一种博士的胸怀,博士的研究能力。所以说在今天,我们什么都能量化。一个学生的好坏,我们看GPA;一个国家的发展,我们看GDP;那么一个教授的好坏,我们看发了多少SCI/EI。这到底是现代人的一种文明呢?还是现代人的愚蠢。有个伟大的数学家叫做黎曼。他一生只发表了十八篇论文。还包括手稿。但那十八篇论文确是名垂青史。大家如果对于数学有稍微一些多的了解的话,就是说当代数学有个非常重要的难题——黎曼猜想,就是黎曼提出的。

二十世纪之初,年仅三十八岁的希尔伯特在第二届数学家大会发表了二十世纪人类需要解决的二十三个数学难题。像希尔伯特这样伟大的数学家,他曾经说过这样一句话——请大家注意希尔伯特的用语——他说如果我死后一千年能够复活,那么我问的第一个问题就是黎曼猜想解决了没有。与那个已逝的时代相比,现代人比的不是思想的深邃,比的是一个人在物质上的富有,一个人帅不帅,我们舆论已经为这些所左右。这是一个社会的悲哀,学者和大学的媚俗。但是大学的使命并不是如此。我曾经和我的学生讲过康德的《论教育》。你们很难想象康德这样一个八十岁的单身汉,他的《教育学》会写得如此细腻,初读起来仿佛有一种独特的父爱在身边。康德从婴儿出生开始写起。婴儿出生的时候母亲的乳房中总会流出一些透明的液体,我们翻译成中文叫做初乳。是康德首先发问,这种初乳对于婴儿是不是有益。因为在之前这种初乳都是不要的。但康德首先问这种东西是不是对婴儿有益的。他认为人类总不会做无用功。还有,在婴儿哭的时候,家长总喜欢把婴儿抱起来,摇一摇,这样把孩子不哭了。是康德首先发现:婴儿不哭这一表象的原因是由于成人的行为足以导致婴儿的眩晕,就像我们看儿童坐木马转几圈就晕了一样,这对于他大脑的发展是非常不好的影响。康德从此写起,写到一个人的儿童教育,行为习惯的养成。然后,小学时的认知教育,德育的教育,美育的教育,初中时的体育教育,青春期时的性教育,大学时的哲学教育,科学教育。

除了康德,我们还可以列举其他人。比如亚当斯密,我们最熟悉他的书是《国富论》。但是他还写过一本道德哲学的经典——《道德情操论》。这是一个道德伦理学的经典之作。在今天的中国人,如果能够产生这样的知识分子,就至少代表了一个民族有一种很高贵的气质在里面。如果今天所有的知识分子都在作秀,那么这个民族就没有希望。

最后我要送给大家的是伟大神学家巴特的一句话。他在论述心爱的莫扎特的书中写道

Das Schwere schwebt und das Leichte uwendlich schwer wieget

生活是沉重之轻与轻之沉重

posted @ 2009-06-30 15:17 小强摩羯座 阅读(24) | 评论 (0)编辑 收藏

2009年6月17日

方法一:在servlet的init()方法中缓存数据

  当应用服务器初始化servlet实例之后,为客户端请求提供服务之前,它会调用这个servlet的init()方法。在一个servlet 的生命周期中,init()方法只会被调用一次。通过在init()方法中缓存一些静态的数据或完成一些只需要执行一次的、耗时的操作,就可大大地提高系统性能。

  例如,通过在init()方法中建立一个JDBC连接池是一个最佳例子,假设我们是用jdbc2.0的DataSource接口来取得数据库连接,在通常的情况下,我们需要通过JNDI来取得具体的数据源。我们可以想象在一个具体的应用中,如果每次SQL请求都要执行一次JNDI查询的话,那系统性能将会急剧下降。解决方法是如下代码,它通过缓存DataSource,使得下一次SQL调用时仍然可以继续利用它:

以下是引用片段:
public class ControllerServlet extends HttpServlet{
private javax.sql.DataSource testDS = null;  
public void init(ServletConfig config) throws ServletException {
super.init(config);   
Context ctx = null;  
try{    
ctx = new InitialContext();   
testDS = (javax.sql.DataSource)ctx.lookup("jdbc/testDS");
}catch(NamingException ne){ne.printStackTrace();}
}catch(Exception e){e.printStackTrace();}
} 
public javax.sql.DataSource getTestDS(){ 
 return testDS; 
} 
...
... 
}


  方法 2:禁止servlet和JSP 自动重载(auto-reloading)

  Servlet/JSP提供了一个实用的技术,即自动重载技术,它为开发人员提供了一个好的开发环境,当你改变servlet和JSP页面后而不必重启应用服务器。然而,这种技术在产品运行阶段对系统的资源是一个极大的损耗,因为它会给JSP引擎的类装载器(classloader)带来极大的负担。因此关闭自动重载功能对系统性能的提升是一个极大的帮助。

  方法 3: 不要滥用HttpSession

  在很多应用中,我们的程序需要保持客户端的状态,以便页面之间可以相互联系。但不幸的是由于HTTP具有天生无状态性,从而无法保存客户端的状态。因此一般的应用服务器都提供了session来保存客户的状态。在JSP应用服务器中,是通过HttpSession对像来实现session的功能的,但在方便的同时,它也给系统带来了不小的负担。因为每当你获得或更新session时,系统者要对它进行费时的序列化操作。你可以通过对 HttpSession的以下几种处理方式来提升系统的性能。

  如果没有必要,就应该关闭JSP页面中对HttpSession的缺省设置。 如果你没有明确指定的话,每个JSP页面都会缺省地创建一个HttpSession。如果你的JSP中不需要使用session的话,那可以通过如下的JSP页面指示符来禁止它:

以下是引用片段:
<%@ page session="false"%>


  不要在HttpSession中存放大的数据对像:如果你在HttpSession中存放大的数据对像的话,每当对它进行读写时,应用服务器都将对其进行序列化,从而增加了系统的额外负担。你在HttpSession中存放的数据对像越大,那系统的性能就下降得越快。

  当你不需要HttpSession时,尽快地释放它:当你不再需要session时,你可以通过调用 HttpSession.invalidate()方法来释放它。尽量将session的超时时间设得短一点:在JSP应用服务器中,有一个缺省的 session的超时时间。当客户在这个时间之后没有进行任何操作的话,系统会将相关的session自动从内存中释放。超时时间设得越大,系统的性能就会越低,因此最好的方法就是尽量使得它的值保持在一个较低的水平。

  方法 4: 将页面输出进行压缩

  压缩是解决数据冗余的一个好的方法,特别是在网络带宽不够发达的今天。有的浏览器支持gzip(GNU zip)进行来对HTML文件进行压缩,这种方法可以戏剧性地减少HTML文件的下载时间。因此,如果你将servlet或JSP页面生成的HTML页面进行压缩的话,那用户就会觉得页面浏览速度会非常快。但不幸的是,不是所有的浏览器都支持gzip压缩,但你可以通过在你的程序中检查客户的浏览器是否支持它。下面就是关于这种方法实现的一个代码片段:

以下是引用片段:
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
OutputStream out = null;
String encoding = request.getHeader("Accept-Encoding");  
if (encoding != null && encoding.indexOf("gzip") != -1){
request.setHeader("Content-Encoding" , "gzip");  
out = new GZIPOutputStream(request.getOutputStream());
} 
else if (encoding != null && encoding.indexOf("comdivss") != -1){
request.setHeader("Content-Encoding" , "comdivss");  
out = new ZIPOutputStream(request.getOutputStream());
}else{  
out = request.getOutputStream();
} 
... 
... 
}

  方法 5: 使用线程池

  应用服务器缺省地为每个不同的客户端请求创建一个线程进行处理,并为它们分派service()方法,当service()方法调用完成后,与之相应的线程也随之撤消。由于创建和撤消线程会耗费一定的系统资源,这种缺省模式降低了系统的性能。但所幸的是我们可以通过创建一个线程池来改变这种状况。

  另外,我们还要为这个线程池设置一个最小线程数和一个最大线程数。在应用服务器启动时,它会创建数量等于最小线程数的一个线程池,当客户有请求时,相应地从池从取出一个线程来进行处理,当处理完成后,再将线程重新放入到池中。如果池中的线程不够地话,系统会自动地增加池中线程的数量,但总量不能超过最大线程数。通过使用线程池,当客户端请求急剧增加时,系统的负载就会呈现的平滑的上升曲线,从而提高的系统的可伸缩性。

  方法 6: 选择正确的页面包含机制

  在JSP中有两种方法可以用来包含另一个页面:

  1、使用include指示符

以下是引用片段:
<%@ includee file=”test.jsp” %>


  2、使用jsp指示符

以下是引用片段:
<jsp:includee page=”test.jsp” flush=”true”/>


  在实际中发现,如果使用第一种方法的话,可以使得系统性能更高。

  方法 7:正确地确定javabean的生命周期

  JSP的一个强大的地方就是对javabean的支持。通过在JSP页面中使用jsp:useBean标签,可以将javabean直接插入到一个JSP页面中。它的使用方法如下:

以下是引用片段:
<jsp:useBean id="name" scope="page|request|session|application" 
class="package.className" type="typeName">
</jsp:useBean>


  其中scope属性指出了这个bean的生命周期。缺省的生命周期为page。如果你没有正确地选择bean的生命周期的话,它将影响系统的性能。

  举例来说,如果你只想在一次请求中使用某个bean,但你却将这个bean的生命周期设置成了session,那当这次请求结束后,这个 bean将仍然保留在内存中,除非session超时或用户关闭浏览器。这样会耗费一定的内存,并无谓的增加了JVM垃圾收集器的工作量。因此为bean 设置正确的生命周期,并在bean的使命结束后尽快地清理它们,会使用系统性能有一个提高。

  其它一些有用的方法

  1、在字符串连接操作中尽量不使用“+”操作符:在java编程中,我们常常使用“+”操作符来将几个字符串连接起来,但你或许从来没有想到过它居然会对系统性能造成影响吧?由于字符串是常量,因此JVM会产生一些临时的对像。你使用的“+”越多,生成的临时对像就越多,这样也会给系统性能带来一些影响。解决的方法是用StringBuffer对像来代替“+”操作符。

  2、避免使用System.out.println()方法:由于System.out.println()是一种同步调用,即在调用它时,磁盘I/O操作必须等待它的完成,因此我们要尽量避免对它的调用。但我们在调试程序时它又是一个必不可少的方便工具,为了解决这个矛盾,我建议你最好使用 Log4j工具(http://Jakarta.apache.org ),它既可以方便调试,而不会产生System.out.println()这样的方法。

  3、ServletOutputStream 与 PrintWriter的权衡:使用PrintWriter可能会带来一些小的开销,因为它将所有的原始输出都转换为字符流来输出,因此如果使用它来作为页面输出的话,系统要负担一个转换过程。而使用ServletOutputStream作为页面输出的话就不存在一个问题,但它是以二进制进行输出的。因此在实际应用中要权衡两者的利弊。

  总结

  本文的目的是通过对servlet和JSP的一些调优技术来极大地提高你的应用程序的性能,并因此提升整个J2EE应用的性能。通过这些调优技术,你可以发现其实并不是某种技术平台(比如J2EE和.NET之争)决定了你的应用程序的性能,重要是你要对这种平台有一个较为深入的了解,这样你才能从根本上对自己的应用程序做一个优化。

posted @ 2009-06-17 21:53 小强摩羯座 阅读(21) | 评论 (0)编辑 收藏

正则表达式规则


String.matches() 这个方法主要是返回是否匹配指定的字符串,如果匹配则为true,否则为false;

如:/**
    * 判断字符创是否是一个有效的日期
    *
    * @param theStr
    * @return true 是,false否
    */
public static boolean isDate(String theStr) {
    return theStr.matches("\\d{4}\\-\\d{1,2}\\-\\d{1,2}");
}

这个方法的参数为正则表达式,关于正则表达式的用法如下:

    正则表达式(regular expression)描述了一种字符串匹配的模式,可以用来:(1)检查一个串中是否含有符合某个规则的子串,并且可以得到这个子串;(2)根据匹配规则对字符串进行灵活的替换操作。

      正则表达式学习起来其实是很简单的,不多的几个较为抽象的概念也很容易理解。之所以很多人感觉正则表达式比较复杂,一方面是因为大多数的文档没有做到由浅入深地讲解,概念上没有注意先后顺序,给读者的理解带来困难;另一方面,各种引擎自带的文档一般都要介绍它特有的功能,然而这部分特有的功能并不是我们首先要理解的。

      文章中的每一个举例,都可以点击进入到测试页面进行测试。闲话少说,开始。  

1. 正则表达式规则

1.1 普通字符

      字母、数字、汉字、下划线、以及后边章节中没有特殊定义的标点符号,都是"普通字符"。表达式中的普通字符,在匹配一个字符串的时候,匹配与之相同的一个字符。

    举例1:表达式 "c",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"c";匹配到的位置是:开始于2,结束于3。(注:下标从0开始还是从1开始,因当前编程语言的不同而可能不同)

    举例2:表达式 "bcd",在匹配字符串 "abcde" 时,匹配结果是:成功;匹配到的内容是:"bcd";匹配到的位置是:开始于1,结束于4。


1.2 简单的转义字符

      一些不便书写的字符,采用在前面加 "\" 的方法。这些字符其实我们都已经熟知了。

 

表达式

可匹配

\r, \n

代表回车和换行符

\t

制表符

\\

代表 "\" 本身

      还有其他一些在后边章节中有特殊用处的标点符号,在前面加 "\" 后,就代表该符号本身。比如:^, $ 都有特殊意义,如果要想匹配字符串中 "^" 和 "$" 字符,则表达式就需要写成 "\^" 和 "\$"。

 

表达式

可匹配

\^

匹配 ^ 符号本身

\$

匹配 $ 符号本身

\.

匹配小数点(.)本身

      这些转义字符的匹配方法与 "普通字符" 是类似的。也是匹配与之相同的一个字符。

    举例1:表达式 "\$d",在匹配字符串 "abc$de" 时,匹配结果是:成功;匹配到的内容是:"$d";匹配到的位置是:开始于3,结束于5。


1.3 能够与 '多种字符' 匹配的表达式

      正则表达式中的一些表示方法,可以匹配 '多种字符' 其中的任意一个字符。比如,表达式 "\d" 可以匹配任意一个数字。虽然可以匹配其中任意字符,但是只能是一个,不是多个。这就好比玩扑克牌时候,大小王可以代替任意一张牌,但是只能代替一张牌。

 

表达式

可匹配

\d

任意一个数字,0~9 中的任意一个

\w

任意一个字母或数字或下划线,也就是 A~Z,a~z,0~9,_ 中任意一个

\s

包括空格、制表符、换页符等空白字符的其中任意一个

.

小数点可以匹配除了换行符(\n)以外的任意一个字符

    举例1:表达式 "\d\d",在匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"12";匹配到的位置是:开始于3,结束于5。

    举例2:表达式 "a.\d",在匹配 "aaa100" 时,匹配的结果是:成功;匹配到的内容是:"aa1";匹配到的位置是:开始于1,结束于4。


1.4 自定义能够匹配 '多种字符' 的表达式

      使用方括号 [ ] 包含一系列字符,能够匹配其中任意一个字符。用 [^ ] 包含一系列字符,则能够匹配其中字符之外的任意一个字符。同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。

 

表达式

可匹配

[ab5@]

匹配 "a" 或 "b" 或 "5" 或 "@"

[^abc]

匹配 "a","b","c" 之外的任意一个字符

[f-k]

匹配 "f"~"k" 之间的任意一个字母

[^A-F0-3]

匹配 "A"~"F","0"~"3" 之外的任意一个字符

    举例1:表达式 "[bcd][bcd]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"bc";匹配到的位置是:开始于1,结束于3。

    举例2:表达式 "[^abc]" 匹配 "abc123" 时,匹配的结果是:成功;匹配到的内容是:"1";匹配到的位置是:开始于3,结束于4。


1.5 修饰匹配次数的特殊符号

      前面章节中讲到的表达式,无论是只能匹配一种字符的表达式,还是可以匹配多种字符其中任意一个的表达式,都只能匹配一次。如果使用表达式再加上修饰匹配次数的特殊符号,那么不用重复书写表达式就可以重复匹配。

      使用方法是:"次数修饰"放在"被修饰的表达式"后边。比如:"[bcd][bcd]" 可以写成 "[bcd]{2}"。

 

表达式

作用

{n}

表达式重复n次,比如:"\w{2}" 相当于 "\w\w""a{5}" 相当于 "aaaaa"

{m,n}

表达式至少重复m次,最多重复n次,比如:"ba{1,3}"可以匹配 "ba"或"baa"或"baaa"

{m,}

表达式至少重复m次,比如:"\w\d{2,}"可以匹配 "a12","_456","M12344"...

?

匹配表达式0次或者1次,相当于 {0,1},比如:"a[cd]?"可以匹配 "a","ac","ad"

+

表达式至少出现1次,相当于 {1,},比如:"a+b"可以匹配 "ab","aab","aaab"...

*

表达式不出现或出现任意次,相当于 {0,},比如:"\^*b"可以匹配 "b","^^^b"...

    举例1:表达式 "\d+\.?\d*" 在匹配 "It costs $12.5" 时,匹配的结果是:成功;匹配到的内容是:"12.5";匹配到的位置是:开始于10,结束于14。

    举例2:表达式 "go{2,8}gle" 在匹配 "Ads by goooooogle" 时,匹配的结果是:成功;匹配到的内容是:"goooooogle";匹配到的位置是:开始于7,结束于17。


1.6 其他一些代表抽象意义的特殊符号

      一些符号在表达式中代表抽象的特殊意义:

 

表达式

作用

^

与字符串开始的地方匹配,不匹配任何字符

$

与字符串结束的地方匹配,不匹配任何字符

\b

匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符

      进一步的文字说明仍然比较抽象,因此,举例帮助大家理解。

    举例1:表达式 "^aaa" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "^" 要求与字符串开始的地方匹配,因此,只有当 "aaa" 位于字符串的开头的时候,"^aaa" 才能匹配,比如:"aaa xxx xxx"

    举例2:表达式 "aaa$" 在匹配 "xxx aaa xxx" 时,匹配结果是:失败。因为 "$" 要求与字符串结束的地方匹配,因此,只有当 "aaa" 位于字符串的结尾的时候,"aaa$" 才能匹配,比如:"xxx xxx aaa"

    举例3:表达式 ".\b." 在匹配 "@@@abc" 时,匹配结果是:成功;匹配到的内容是:"@a";匹配到的位置是:开始于2,结束于4。
      进一步说明:"\b" 与 "^" 和 "$" 类似,本身不匹配任何字符,但是它要求它在匹配结果中所处位置的左右两边,其中一边是 "\w" 范围,另一边是 非"\w" 的范围。

    举例4:表达式 "\bend\b" 在匹配 "weekend,endfor,end" 时,匹配结果是:成功;匹配到的内容是:"end";匹配到的位置是:开始于15,结束于18。

      一些符号可以影响表达式内部的子表达式之间的关系:

 

表达式

作用

|

左右两边表达式之间 "或" 关系,匹配左边或者右边

( )

(1). 在被修饰匹配次数的时候,括号中的表达式可以作为整体被修饰
(2). 取匹配结果的时候,括号中的表达式匹配到的内容可以被单独得到

    举例5:表达式 "Tom|Jack" 在匹配字符串 "I'm Tom, he is Jack" 时,匹配结果是:成功;匹配到的内容是:"Tom";匹配到的位置是:开始于4,结束于7。匹配下一个时,匹配结果是:成功;匹配到的内容是:"Jack";匹配到的位置时:开始于15,结束于19。

    举例6:表达式 "(go\s*)+" 在匹配 "Let's go go go!" 时,匹配结果是:成功;匹配到内容是:"go go go";匹配到的位置是:开始于6,结束于14。

    举例7:表达式 "(\d+\.?\d*)" 在匹配 "$10.9,¥20.5" 时,匹配的结果是:成功;匹配到的内容是:"¥20.5";匹配到的位置是:开始于6,结束于10。单独获取括号范围匹配到的内容是:"20.5"。


2. 正则表达式中的一些高级规则

2.1 匹配次数中的贪婪与非贪婪

      在使用修饰匹配次数的特殊符号时,有几种表示方法可以使同一个表达式能够匹配不同的次数,比如:"{m,n}", "{m,}", "?", "*", "+",具体匹配的次数随被匹配的字符串而定。这种重复匹配不定次数的表达式在匹配过程中,总是尽可能多的匹配。比如,针对文本 "dxxxdxxxd",举例如下:

 

表达式

匹配结果

(d)(\w+)

"\w+" 将匹配第一个 "d" 之后的所有字符 "xxxdxxxd"

(d)(\w+)(d)

"\w+" 将匹配第一个 "d" 和最后一个 "d" 之间的所有字符 "xxxdxxx"。虽然 "\w+" 也能够匹配上最后一个 "d",但是为了使整个表达式匹配成功,"\w+" 可以 "让出" 它本来能够匹配的最后一个 "d"

      由此可见,"\w+" 在匹配的时候,总是尽可能多的匹配符合它规则的字符。虽然第二个举例中,它没有匹配最后一个 "d",但那也是为了让整个表达式能够匹配成功。同理,带 "*" 和 "{m,n}" 的表达式都是尽可能地多匹配,带 "?" 的表达式在可匹配可不匹配的时候,也是尽可能的 "要匹配"。这 种匹配原则就叫作 "贪婪" 模式 。

      非贪婪模式:

      在修饰匹配次数的特殊符号后再加上一个 "?" 号,则可以使匹配次数不定的表达式尽可能少的匹配,使可匹配可不匹配的表达式,尽可能的 "不匹配"。这种匹配原则叫作 "非贪婪" 模式,也叫作 "勉强" 模式。如果少匹配就会导致整个表达式匹配失败的时候,与贪婪模式类似,非贪婪模式会最小限度的再匹配一些,以使整个表达式匹配成功。举例如下,针对文本 "dxxxdxxxd" 举例:

 

表达式

匹配结果

(d)(\w+?)

"\w+?" 将尽可能少的匹配第一个 "d" 之后的字符,结果是:"\w+?" 只匹配了一个 "x"

(d)(\w+?)(d)

为了让整个表达式匹配成功,"\w+?" 不得不匹配 "xxx" 才可以让后边的 "d" 匹配,从而使整个表达式匹配成功。因此,结果是:"\w+?" 匹配 "xxx"

      更多的情况,举例如下:

    举例1:表达式 "<td>(.*)</td>" 与字符串 "<td><p>aa</p></td> <td><p>bb</p></td>" 匹配时,匹配的结果是:成功;匹配到的内容是 "<td><p>aa</p></td> <td><p>bb</p></td>" 整个字符串, 表达式中的 "</td>" 将与字符串中最后一个 "</td>" 匹配。

    举例2:相比之下,表达式 "<td>(.*?)</td>" 匹配举例1中同样的字符串时,将只得到 "<td><p>aa</p></td>", 再次匹配下一个时,可以得到第二个 "<td><p>bb</p></td>"。


2.2 反向引用 \1, \2...

      表达式在匹配时,表达式引擎会将小括号 "( )" 包含的表达式所匹配到的字符串记录下来。在获取匹配结果的时候,小括号包含的表达式所匹配到的字符串可以单独获取。这一点,在前面的举例中,已经多次展示了。在实际应用场合中,当用某种边界来查找,而所要获取的内容又不包含边界时,必须使用小括号来指定所要的范围。比如前面的 "<td>(.*?)</td>"。

      其实,"小括号包含的表达式所匹配到的字符串" 不仅是在匹配结束后才可以使用,在匹配过程中也可以使用。表达式后边的部分,可以引用前面 "括号内的子匹配已经匹配到的字符串"。引用方法是 "\" 加上一个数字。"\1" 引用第1对括号内匹配到的字符串,"\2" 引用第2对括号内匹配到的字符串……以此类推,如果一对括号内包含另一对括号,则外层的括号先排序号。换句话说,哪一对的左括号 "(" 在前,那这一对就先排序号。

      举例如下:

    举例1:表达式 "('|")(.*?)(\1)" 在匹配 " 'Hello', "World" " 时,匹配结果是:成功;匹配到的内容是:" 'Hello' "。再次匹配下一个时,可以匹配到 " "World" "。

    举例2:表达式 "(\w)\1{4,}" 在匹配 "aa bbbb abcdefg ccccc 111121111 999999999" 时,匹配结果是:成功;匹配到的内容是 "ccccc"。再次匹配下一个时,将得到 999999999。这个表达式要求 "\w" 范围的字符至少重复5次,注意与 "\w{5,}" 之间的区别

    举例3:表达式 "<(\w+)\s*(\w+(=('|").*?\4)?\s*)*>.*?</\1>" 在匹配 "<td id='td1' style="bgcolor:white"></td>" 时,匹配结果是成功。如果 "<td>" 与 "</td>" 不配对,则会匹配失败;如果改成其他配对,也可以匹配成功。

在java语言中使用正则表达式

  首先让我们构成一个正则表达式。为简单起见,先构成一个正则表达式来识别下面格式的电话号码数字:(nnn)nnn-nnnn。  
   
  第一步,创建一个pattern对象来匹配上面的子字符串。一旦程序运行后,如果需要的话,可以让这个对象一般化。匹配上面格式的正则表达可以这样构成: (\d{3})\s\d{3}-\d{4},其中\d单字符类型用来匹配从0到9的任何数字,另外{3}重复符号,是个简便的记号,用来表示有3个连续的数字位,也等效于(\d\d\d)。\s也另外一个比较有用的单字符类型,用来匹配空格,比如Space键,tab键和换行符。  
   
  是不是很简单?但是,如果把这个正则表达式的模式用在java程序中,还要做两件事。对java的解释器来说,在反斜线字符(\)前的字符有特殊的含义。在java中,与regex有关的包,并不都能理解和识别反斜线字符(\),尽管可以试试看。但为避免这一点,即为了让反斜线字符(\)在模式对象中被完全地传递,应该用双反斜线字符(\)。此外圆括号在正则表达中两层含义,如果想让它解释为字面上意思(即圆括号),也需要在它前面用双反斜线字符(\)。也就是像下面的一样:  
   
  \\(\\d{3}\\)\\s\\d{3}-\\d{4}  
   
  现在介绍怎样在java代码中实现刚才所讲的正则表达式。要记住的事,在用正则表达式的包时,在你所定义的类前需要包含该包,也就是这样的一行:  
   
  import   java.util.regex.*;  
   
  下面的一段代码实现的功能是,从一个文本文件逐行读入,并逐行搜索电话号码数字,一旦找到所匹配的,然后输出在控制台。  
   
  BufferedReader   in;  
   
  Pattern   pattern   =   Pattern.compile("\\(\\d{3}\\)\\s\\d{3}-\\d{4}");  
   
  in   =   new   BufferedReader(new   FileReader("phone"));  
   
  String   s;  
   
  while   ((s   =   in.readLine())   !=   null)  
   
  {  
   
  Matcher   matcher   =   pattern.matcher(s);  
   
  if   (matcher.find())  
   
  {  
   
  System.out.println(matcher.group());  
   
  }  
   
  }  
   
  in.close();  
   
  对那些熟悉用Python或Javascript来实现正则表达式的人来说,这段代码很平常。在Python和Javascript这些语言中,或者其他的语言,这些正则表达式一旦明确地编译过后,你想用到哪里都可以。与Perl的单步匹配相比,看起来多多做了些工作,但这并不很费事。  
   
  find()方法,就像你所想象的,用来搜索与正则表达式相匹配的任何目标字符串,group()方法,用来返回包含了所匹配文本的字符串。应注意的是,上面的代码,仅用在每行只能含有一个匹配的电话号码数字字符串时。可以肯定的说,java的正则表达式包能用在一行含有多个匹配目标时的搜索。本文的原意在于举一些简单的例子来激起读者进一步去学习java自带的正则表达式包,所以对此就没有进行深入的探讨。  
   
  这相当漂亮吧!   但是很遗憾的是,这仅是个电话号码匹配器。很明显,还有两点可以改进。如果在电话号码的开头,即区位号和本地号码之间可能会有空格。我们也可匹配这些情况,则通过在正则表达式中加入\s?来实现,其中?元字符表示在模式可能有0或1个空格符。  
   
  第二点是,在本地号码位的前三位和后四位数字间有可能是空格符,而不是连字号,更有胜者,或根本就没有分隔符,就是7位数字连在一起。对这几种情况,我们可以用(-|)?来解决。这个结构的正则表达式就是转换器,它能匹配上面所说的几种情况。在()能含有管道符|时,它能匹配是否含有空格符或连字符,而尾部的?元字符表示是否根本没有分隔符的情况。  
   
  最后,区位号也可能没有包含在圆括号内,对此可以简单地在圆括号后附上?元字符,但这不是一个很好的解决方法。因为它也包含了不配对的圆括号,比如" (555"   或   "555)"。相反,我们可以通过另一种转换器来强迫让电话号码是否带有有圆括号:(\(\d{3}\)|\d{3})。如果我们把上面代码中的正则表达式用这些改进后的来替换的话,上面的代码就成了一个非常有用的电话号码数字匹配器:  
   
  Pattern   pattern   =  
   
  Pattern.compile("(\\(\\d{3}\\)|\\d{3})\\s?\\d{3}(-|)?\\d{4}");  
   
  可以确定的是,你可以自己试着进一步改进上面的代码。  
   
  现在看看第二个例子,它是从Friedl的中改编过来的。其功能是用来检查文本文件中是否有重复的单词,这在印刷排版中会经常遇到,同样也是个语法检查器的问题。  
   
  匹配单词,像其他的一样,也可以通过好几种的正则表达式来完成。可能最直接的是\b\w+\b,其优点在于只需用少量的regex元字符。其中\w元字符用来匹配从字母a到u的任何字符。+元字符表示匹配匹配一次或多次字符,\b元字符是用来说明匹配单词的边界,它可以是空格或任何一种不同的标点符号(包括逗号,句号等)。  
   
  现在,我们怎样来检查一个给定的单词是否被重复了三次?为完成这个任务,需充分利用正则表达式中的所熟知的向后扫描。如前面提到的,圆括号在正则表达式中有几种不同的用法,一个就是能提供组合类型,组合类型用来保存所匹配的结果或部分匹配的结果(以便后面能用到),即使遇到有相同的模式。在同样的正则表达中,可能(也通常期望)不止有一个组合类型。在第n个组合类型中匹配结果可以通过向后扫描来获取到。向后扫描使得搜索重复的单词非常简单:\b(\w+) \s+\1\b。  
   
  圆括号形成了一个组合类型,在这个正则表示中它是第一组合类型(也是仅有的一个)。向后扫描\1,指的是任何被\w+所匹配的单词。我们的正则表达式因此能匹配这样的单词,它有一个或多个空格符,后面还跟有一个与此相同的单词。注意的是,尾部的定位类型(\b)必不可少,它可以防止发生错误。如果我们想匹配"Paris   in   the   the   spring",而不是匹配"Java's   regex   package   is   the   theme   of   this   article"。根据java现在的格式,则上面的正则表达式就是:Pattern   pattern   =Pattern.compile("\\b(\\w+)\\s+\\1\\b");  
   
  最后进一步的修改是让我们的匹配器对大小写敏感。比如,下面的情况:"The   the   theme   of   this   article   is   the   Java's   regex   package.",这一点在regex中能非常简单地实现,即通过使用在Pattern类中预定义的静态标志CASE_INSENSITIVE   :  
   
  Pattern   pattern   =Pattern.compile("\\b(\\w+)\\s+\\1\\b",  
   
  Pattern.CASE_INSENSITIVE);  
   
  有关正则表达式的话题是非常丰富,而且复杂的,用Java来实现也非常广泛,则需要对regex包进行的彻底研究,我们在这里所讲的只是冰山一角。即使你对正则表达式比较陌生,使用regex包后会很快发现它强大功能和可伸缩性。如果你是个来自Perl或其他语言王国的老练的正则表达式的黑客,使用过 regex包后,你将会安心地投入到java的世界,而放弃其他的工具,并把java的regex包看成是手边必备的利器。

posted @ 2009-06-17 20:44 小强摩羯座 阅读(25) | 评论 (0)编辑 收藏

2009年5月20日

     摘要: 莫小米文章 地址:http://blog.tianya.cn/blogger/view_blog.asp?BlogName=xiaomi520&idWriter=0&Key=0 几米语录: 米语录 生活永远不是童话 ...  阅读全文

posted @ 2009-05-20 22:52 小强摩羯座 阅读(48) | 评论 (0)编辑 收藏

郑源vs沈丹丹幸福恋人

我相信

posted @ 2009-05-20 20:00 小强摩羯座 阅读(22) | 评论 (1)编辑 收藏

2009年4月15日

**君子耻其言而过其行**

typedef   int*   pint;
typedef   pint*   ppint;
void   func(ppint   &x)
{
 x   =   new   int*;
 *x=   new   int(32);
}
//使用方法

 int   **p=0;
 func(p);
 cout<<(**p)<<endl;

 int *pV;
 pV =  new int(2);  //这里注意与在cpp中与java中语法的差异
 cout<<"PV = "<<(*pV)<<endl;

 int ival = 1024;
 int *pi = &ival;
 int* &ptrVal2 = pi;

posted @ 2009-04-15 21:03 小强摩羯座 阅读(34) | 评论 (0)编辑 收藏

2009年4月12日

菩提本无树(2009-04-04 17:48:59)
                                                          
    佛对我说:你的心上有尘。我用力地擦拭。
    佛说:你错了,尘是擦不掉的。我于是将心剥了下来.
    佛又说:你又错了,尘本非尘,何来有尘
    我想这是从神秀和慧能那两个偈子引申出来。
    神秀说:“身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃。”
    慧能说:“菩提本无树,明镜亦非台,本来无一物,何处惹尘埃。”
    的确,要能够参透这两个偈子的确很难,就是正确的理解也不易。 
 
    身是菩提树,心如明镜台,时时勤拂拭,勿使惹尘埃
    众生的身体就是一棵觉悟的智慧树,
    众生的心灵就象一座明亮的台镜。
    要时时不断地将它掸拂擦试,
    不让它被尘垢污染障蔽了光明的本性。
    菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
    菩提原本就没有树,
    明亮的镜子也并不是台。
    本来就是虚无没有一物,
    那里会染上什么尘埃?

    这首畿子可以看出慧能是个有大智慧的人(后世有人说他是十世比丘转世),他这个畿子很契合禅宗的顿悟的理念。是一种出世的态度,主要意思是,世上本来就是空的,看世间万物无不是一个空字,心本来就是空的话,就无所谓抗拒外面的诱惑,任何事物从心而过,不留痕迹。这是禅宗的一种很高的境界,领略到这层境界的人,就是所谓的开悟了。

    禅的境界一花一世界,一叶一如来。这样的境界,是何等的完美。

    禅的生活是非常朴实,没有欲望及贪求的,一切的作用都能融入空性。空不是什么都没有,而是使自己生活得更逍遥自在,如鱼得水。做事不要过于认真执着,而是要认真雕刻。

    禅是“感情”的生活,禅的感情就是无缘大悲,同体大悲的心量。

    禅是启发我们要学会舍得;真正的快乐只有舍得才能得,从舍中构筑一切的有。要辨证的看待拥有和失去,拥有不一定快乐,因为一旦想要拥有烦恼就出现了,因为“有”未必不是一种负担,只有豁达地看待得与失,成与败,拥有一颗无所得的心,你才会快乐。

    最快乐的生活,就是善于驭心的生活。境不转心转,如果能够常常调心,就能常生喜悦而少烦恼。

    佛法教我们把快乐和痛苦都放下,但是,放下并不是不去追求,而是随缘不变。

    当我们能了解到,环境是无法控制、变化无常的,就能获致真正的快乐与内心的安定。

    用清静心看世间,世间即清静,用解脱心看世间,心即解脱。

    会调心的人就会生活,会生活的人才得大智慧,智慧高的人生活范围大,因为他能包容,能够令人安定,每个人都喜欢跟他在一起。

    处理事务要多包容、忍耐,量大福大,量小阻碍多。

    尊重别人,就能获得别人的尊重,

    不听人我是非,听人我是非即是是非人,不能成大事。

    修行就是管自己,自己都管不了,还管得了谁?众生就是我,我就是众生。

    认识自己,如果不认识自己的心,就无法安排人生,也许你可以安排你的事业,家庭,希望一切如意,可是你却随时要接受无常的安排。认清自己为认清世界的根本,要研究这世界不如先研究自己。

    修行就是要:审查自己的心、规画自己的心、企划自己的心。

    身体的健康与心理有关,能够放下,不想烦恼的事,身心就能解脱。

    佛法不是在庙里,而是在心里。

    浪有高有低,海水依旧是海水,生活有苦有乐,心依旧是心。

    其实尘在外,心在内,常拂之,心净无尘;

    尘在内,心在外,常剥之,无尘无心;

    心中有尘,尘本是心,

    何畏心中尘,无尘亦无心?正如慧能所说的仁者心动

    佛家追求的是一种超脱
    却不是刻意的寻求

    主旨在心

    世间人,法无定法,然后知非法法也;
    天下事,了犹未了,何妨以不了了之


菩提本无树,明镜亦非台。本来无一物,何处惹尘埃?
  
  佛家的学说往往浸透着深奥的人生哲学,从而引得无数人将此作为座右铭,因为一方面这是一种处世方式,另一方面也是人们几千年的经验结晶。在学哲学时,常把佛家学说定义为唯心主义,从这句诗中也可以看出,菩提本无树,就是说,首先没有物质的存在,所以又如何惹尘埃呢?
  
  菩提真的无树吗?记得以前有一部电影,是欧美的,描述的是一个非洲丛林的原始部落,生产力低下,以猎物为生,彼此生活安逸,波澜不惊。但是有一天,有一个人在海滩上拣到了一个易拉罐,把它带到了部落,虽然是一个对于我们来说不值钱的物件,但在那里却是件希罕物,可以说是珍宝。围绕着这一物件,为了得到它,部落里展开了一场争斗,在一场你争我夺的,钩心斗角的争夺后,他们省悟了,最后将易拉罐重新扔入了无际的大海。部落又恢复了昔日的平静。
  
  人是从自然界演变而来,人类的本性就是永远也不满足,这种本性演发了无穷无尽的矛盾,也同时推动者人类社会的前进,在这种前进中,满含着血腥与残酷,在矛盾中,人们会选择一种信仰,目的只是为了逃避现实。
  
  菩提既是树,明镜就是台,这些都是物质,皆是物,你可以闭眼不见,但都是客观存在。本来无一物,只是主观的逃避。
  
  对于现实,我们会采取多种方式,当我们享受着生活的美好时,当我们在阳光下时,是不会去考虑菩提树是否存在的问题的;或当我们在爱河中徜徉,陶醉于其中时,何曾想过明镜?
  
  只有当我们面临着生活的压力,面临着现实的残酷,当我们的爱被背叛,被蹂躏,在施展全身之力皆无果时,便会无奈的寻求心理的安慰。将烦恼抛之脑后,以重新焕发生活的斗志,或者,已丧失了斗志,仅寻求一种解脱。这也就是佛学这种理论赖以存在的基础。
  
  这种理论在今天看来,也许有其积极的作用,那便是引导人们理智对待人生,当有冲突时,回避或退让或是好办法。
  
  然而,人终究是人,一种贪婪,健忘的生物,当生活,现实,爱情等等因素重新回归美好时,便又会看到菩提树,看到明镜台了,便又会去惹尘埃了。

posted @ 2009-04-12 16:30 小强摩羯座 阅读(51) | 评论 (0)编辑 收藏

2009年4月9日

 

转载 Tutorial: The H.264 Scalable Video Codec (SVC)收藏

Codecs are used to compress video to reduce the bandwidth required to transport streams, or to reduce the storage space required to archive them. The price for this compression is increased computational requirements: The higher the compression ratio, the more computational power is required.

Fixing the tradeoff between bandwidth and computational requirements has the effect of defining both the minimum channel bandwidth required to carry the encoded stream and the minimum specification of the decoding device. In traditional video systems such as broadcast television, the minimum specification of a decoder (in this case a set-top box) is readily defined.

Today, however, video is used in increasingly diverse applications with a correspondingly diverse set of client devices—from computers viewing Internet video to portable digital assistants (PDAs) and even the humble cell phone. The video streams for these devices are necessarily different.

To be made more compatible with a specific viewing device and channel bandwidth, the video stream must be encoded many times with different settings. Each combination of settings must yield a stream that targets the bandwidth of the channel carrying the stream to the consumer as well as the decode capability of the viewing device. If the original uncompressed stream is unavailable, the encoded stream must first be decoded and then re-encoded with the new settings. This quickly becomes prohibitively expensive.

In an ideal scenario, the video would be encoded only once with a high efficiency codec. The resulting stream would, when decoded, yield the full resolution video. Furthermore, in this ideal scenario, if a lower resolution or bandwidth stream was needed to reach further into the network to target a lower performance device, a small portion of the encoded stream would be sent without any additional processing. This smaller stream would be easier to decode and yield lower resolution video. In this way, the encoded video stream could adapt itself to both the bandwidth of the channel it was required to travel through and to the capabilities of the target device. These are exactly the qualities of a scalable video codec.

H.264 SVC
The Scalable Video Codec extension to the H.264 standard (H.264 SVC) is designed to deliver the benefits described in the preceding ideal scenario. It is based on the H.264 Advanced Video Codec standard (H.264 AVC) and heavily leverages the tools and concepts of the original codec. The encoded stream it generates, however, is scalable: temporally, spatially, and in terms of video quality. That is, it can yield decoded video at different frame rates, resolutions, or quality levels.

The SVC extension introduces a notion not present in the original H.264 AVC codec−that of layers within the encoded stream. A base layer encodes the lowest temporal, spatial, and quality representation of the video stream. Enhancement layers encode additional information that, using the base layer as a starting point, can be used to reconstruct higher quality, resolution, or temporal versions of the video during the decode process. By decoding the base layer and only the subsequent enhancement layers required, a decoder can produce a video stream with certain desired characteristics. Figure 1 shows the layered structure of an H.264 SVC stream. During the encode process, care is taken to encode a particular layer using reference only to lower level layers. In this way, the encoded stream can be truncated at any arbitrary point and still remain a valid, decodable stream.


(Click to enlarge)

Figure 1. The H.264 SVC Layered Structure.

This layered approach allows the generation of an encoded stream that can be truncated to limit the bandwidth consumed or the decode computational requirements. The truncation process consists simply of extracting the required layers from the encoded video stream with no additional processing on the stream itself. The process can even be performed "in the network". That is, as the video stream transitions from a high bandwidth to a lower bandwidth network (for example, from an Ethernet network to a handheld through a WiFi link), it could be parsed to size the stream for the available bandwidth. In the above example, the stream could be sized for the bandwidth of the wireless link and the decode capabilities of the handheld decoder. Figure 2 shows such an example as a PC forwards a low bandwidth instance of a stream to a mobile device.


Figure 2. Parsing Levels to Reduce Bandwidth and Resolution.

 

H.264 SVC Under the Hood
To achieve temporal scalability, H.264 SVC links its reference and predicted frames somewhat differently than conventional H.264 AVC encoders. Instead of the traditional Intra-frame (I frame), Bidirectional (B frame) and Predicted (P frame) relationship shown in Figure 3, SVC uses a hierarchical prediction structure.


(Click to enlarge)

Figure 3. Traditional I, P, and B Frame Relationship.

The hierarchical structure defines the temporal layering of the final stream. Figure 4 illustrates a potential hierarchical structure. In this particular example, frames are only predicted from frames that occur earlier in time. This ensures that the structure exhibits not only temporal scalability but also low latency.


(Click to enlarge)

Figure 4. Hierarchical Predicted Frames in SVC.

This scheme has four nested temporal layers: T0 (the base layer), T1, T2, and T3. Frames constituting the T1 and T2 layers are only predicted from frames in the T0 layer. Frames in the T3 layer are only predicted from frames in the T1 or T2 layers.

To play the encoded stream at 3.75 frames per second (fps), only the frames that constitute T0 need be decoded. All other frames can be discarded. To play the stream at 7.5 fps, the layers making up T0 and T1 are decoded. Frames in layers T2 and T3 can be discarded. Similarly, if frames that constitute T0, T1 and T2 are decoded, the resulting stream will play at 15 fps. If all frames are decoded, the full 30 fps stream is recovered.

By contrast, in H.264 AVC (for Baseline Profile where only unidirectional predicted frames are used), all the frames would need to be decoded irrespective of the desired display rate. To transit to a low bandwidth network, the entire stream would need to be decoded, the unwanted frames discarded, and then re-encoded.

Spatial scalability in H.264 SVC follows a similar principle. In this case, lower resolution frames are encoded as the base layer. Decoded and up-sampled base layer frames are used in the prediction of higher-order layers. Additional information required to reconstitute the detail of the original scene is encoded as a self-contained enhancement layer. In some cases, reusing motion information can further increase encoding efficiency.

Simulcast vs. SVC
There is an overhead associated with the scalability inherent in H.264 SVC. As can be seen in Figure 3, the distance between reference and predicted frames can be longer in time (from T0 to T1 for example) than with the conventional frame structure. In scenes with high motion, this can lead to slightly less efficient compression. There is also an overhead associated with the management of the layered structure in the stream.

Overall, an SVC stream containing three layers of temporal scalability and three layers of spatial scalability might be twenty percent larger than an equivalent H.264 AVC stream of full resolution and full frame rate video with no scalability. If scalability is to be emulated with the H.264 AVC codec, multiple encode streams are required, resulting in a dramatically higher bandwidth requirement or expensive decoding and re-encoding throughout the network.

Additional SVC Benefits
Error Resilience:
Error resilience is traditionally achieved by adding additional information to the stream so errors can be detected and corrected. SVC's layered approach means that a higher level of error detection and correction can be performed on the smaller base layer without adding significant overhead. Applying the same degree of error detection and correction to an AVC stream would require that the entire stream be protected, resulting in a much larger stream. If errors are detected in the SVC stream, the resolution and frame rate can be progressively degraded until, if needed, only the highly protected base layer is used. In this way, degradation under noisy conditions is much more graceful than with H.264 AVC.

Storage Management:
Since an SVC stream or file remains decodable even when truncated, SVC can be employed both during transmission and after the file is stored. Parsing files stored to disk and removing enhancement layers allows file size to be reduced without additional processing on the video stream stored within the file. This would not be possible with an AVC file which necessitates an "all or nothing" approach to disk management.

Content Management:
The SVC stream or file inherently contains lower resolution and frame rate streams. These streams can be used to accelerate the application of video analytics or for cataloging algorithms. The temporal scalability also makes the stream easier to search in fast forward or reverse.

 

An Application Case Study
A typical application for H.264 SVC is a surveillance system. (Stretch offers market-leading solutions in this area; see its web site for details.) Consider the case where an IP camera is sending a video feed to a control room where it is stored, and basic motion detection analytics are run on the stream. The video feed is viewed at the camera's maximum resolution (1280 x 720) on the control room monitors, and is stored in D1 (720 x 480) resolution to conserve disk space. A first-response team also has access to the stream in the field on mobile terminals within the response vehicle. The resolution of those displays is CIF (352 x 240) and the stream is served at 7 fps.

In an implementation using H.264 AVC, the first likely constraint would be that the camera serves multiple streams. In this example, one at 1280x720 resolution and one at 720 x 480 resolution. This places additional cost within the camera, but allows one stream to be directly recorded at the control room while another is decoded and displayed. Without this feature, an expensive decode, resize, and re-encode step would be needed. The D1 stream is also decoded and resized to CIF resolution to feed the video analytics being run on the stream. The CIF resolution video is temporally decimated to achieve 7 frames per second and re-encoded so that it can be made available to the first-response vehicle over a wireless link. Figure 5 shows a potential implementation of the system using H.264 AVC.


Figure 5. H.264 AVC Video Surveillance Application.

Using an H.264 SVC codec, the multi-stream requirement placed on the camera can be relaxed, reducing complexity and network bandwidth between the camera and control room. The full 1280 x 720 stream can now be stored on the network video recorder (NVR) with the knowledge that it can be easily parsed to create a D1 (or CIF) stream to free up disk space after a specified period. A CIF stream can be served directly from the NVR for analytics work, and a second stream at a reduced frame rate can be made available to the first-response vehicle. Figure 6 shows a potential H.264 SVC implementation.


Figure 6. H.264 SVC Video Surveillance Application.

At no point is there a need to operate on the video stream itself—operating on the stored file suffices. The advantages are clear:

  • Reduced network bandwidth
  • Flexible storage management
  • Removal of expensive decode and re-encode stages
  • High definition video available on the NVR for archive if needed

Conclusion
Scalable video codecs have been in development for many years. The broadcast industry, strictly controlled by well-established standards, has been slow to adopt this technology. Advances in processor, sensor, and display technology are fuelling an explosion in video adoption. The Internet and IP technologies are seamlessly serving video to an ever more diverse and remote community of display devices. Scalable video codecs such as H.264 SVC satisfy many of the demands of these systems, and they are poised to become a catalyst in wide the spread adoption of video as a communication medium.

About the author
Mark Oliver is the Director of Product Marketing at Stretch. A native of the UK, Oliver gained a degree in Electrical and Electronic Engineering from the University of Leeds. During a ten year tenure with Hewlett Packard, Oliver managed Engineering and Manufacturing functions in HP Divisions both in Europe and the US before heading up Product Marketing and Applications activities at a series of video related startups. Prior to joining Stretch, Oliver managed Marketing for Video and Imaging within the DSP Division of Xilinx.

Related Articles:

posted @ 2009-04-09 21:43 小强摩羯座 阅读(96) | 评论 (0)编辑 收藏

     摘要: The Scalable Video Coding Amendment of the H.264/AVC Standardfunction StorePage(){d=document;t=d.selection?(d.selection.type!='None'?d.selection.createRange().text:''):(d.getSelection?d.getSelection()...  阅读全文

posted @ 2009-04-09 21:41 小强摩羯座 阅读(108) | 评论 (0)编辑 收藏