2008年1月11日星期五

又到一年毕业时(It's Graduation Time)

昨天研三毕业的师兄师姐们请吃饭,好久没有聚在一起了,大家在一起聊的很开心。共同的感叹是时间过的真是飞快啊,去年研三请吃饭的情景还历历在目呢,今天就又一届的毕业了,明年就要轮到我们了。那个时候围坐在一起的,会怀着什么样的心情呢?
祝愿他们在今后的生活如意,工作顺利。

2008年1月9日星期三

学车总结(含夜考攻略)(Road Test at Night)

今天终于把所有驾校的课程和考试都结束了,三大通行证都拿全了,虽说早已在二十一世纪呆了七八年了。总结一下过去的历程,顺便也给其他人一个借鉴。报的是远航驾校的班,在海淀车管所考的试。
八月中报的名,开始有个法培,90分算及格。发两本书和一个小册子,把上面的试题都背熟了就行。网上资料很多,口诀很有用,试题库可以练练手。考试是机考,一个小时时间。北京这边我考试的时候考题是有四个选项的——而书上的题目通通只有三个选项——所以最后一个肯定是不用选的。
然后开始约车,集体班是四个人一辆车,周末两天学车,三周桩三周路再加一周集中,每个阶段完了之后考试,因为十一要回家,就安排十一后上车,结果十一月初才开始。第一次上车才刚摸方向盘教练就直接指挥着走道了,着实出了身冷汗。教学完全是以考试为标杆,贴库移库倒库什么的,两上两下的口诀背的烂熟。每天就是翻来覆去的练这些动作。集体班没有计时班灵活,好处就是时间短,四个人可以分上下午来,不用每次五点多就要起来。
桩考在车管所用电子眼,等候的时候百十号人在大厅里看教育片“车轮碾碎的童年”,大概是教育未来的驾驶员们注意行车安全,果然很有效力,我们这组大家好像就在比着谁的车开着更慢似的。别的组都叫到12号了,这边8号还没考完。桩考有两次机会,其他考试只有一次。
考完桩考,就是上路。在驾校后面有座山,上面弯弯曲曲的建了不少障碍。最主要的是侧方停车、直角弯、定点停车和坡起。最后考试考的就要是这三样。还有掉头、曲线路、限速门、百米加减档什么的都是练练,单边桥、过井盖什么的根本就是看看但没教。
考的时候恰逢驾校迎接检查,考的特别严格,同去的四个折了俩,全是前面的人一组动作做完,他上车考官要他掉头没掉过来就直接挂了——意外情况的发生是考场上最大的不确定因素。
考完已经是十二月份了,因为有补考的,还要准备开题,就约了一月份才上实际路考的集中培训。第一天上午还是很紧张的:毕竟就要真刀真枪的上路了,往常在场地内练的时候档位一上三档旁边的师傅就要说了。而这边教的就是启动之后如何最快最自然的加到五档,旁边的社会车一辆一辆呼啸而去,而我这边上到45迈就有点不放心了。练习中的意外路况层出不穷,并道不看镜的情况没少出。练到了第二天下午的时候就熟练很多了,感觉有点底了,结果隔了一天接到通知我被“幸运”的抽中了夜考,总共就六个人,不过过程倒是很顺利,考的很快,连灯都没开。后来总结觉得是因为书上教的都是纯夜路的情况,而考试路段两边都是路灯,路况较好,所以用不到灯光切换和闪灯。到我时恰逢一个大直道,直接启动加档,开了几百米之后靠边停车,考官评价说:“动作有点僵硬,回去多练练。”然后吐出了那句期望中的话:“算你及格了!”
终于长舒了一口气,绵延了四个月的旅程终于走到了终点,再也不用每天挣扎着早起和做公车了。

2008年1月3日星期四

英文网站

每日变动中
1、英国《经济学家》 http://www.economist.com
2、CNN http://www.cnn.com
3、BBC http://www.bbc.co.uk/
4、《华盛顿邮报》 http://www.washingtonpost.com/
5、《洋葱》http://www.theonion.com/(有趣新闻站点)
4、《纽约时报》 http://www.nytimes.com
6、美国全国广播公司 http://www.msnbc.com/news
7、《华尔街日报》评论 http://www.opinionjournal.com
3、《财富》http://www.fortune.com/fortune
4、《远东经济评论》http://www.feer.com
5、《福布斯》http://www.forbes.com
5、英国《简氏防务周刊》http://www.janes.com/(出色的军事杂志)
24、《时代周刊》www.time.com
25、《国家地理》http://www.nationalgeographic.com
26、《新闻周刊》http://www.msnbc.com/news/NW-front_Front.asp
23、可以在线阅读英文小说 http://hnbc.hpe.sh.cn/01/01A/04/UVWX.HTM
5、普利策新闻奖历年全部获奖作品 http://www.pulitzer.org

三、英美外电新闻
1、《泰晤士报》http://www.thetimes.co.uk
2、《基督教科学箴言报》http://www.csmonitor.com
3、《今日美国》http://usatoday.com
4、美国广播公司http://abcnews.go.com
5、英国《观察家》http://www.observer.co.uk
6、英国《每日电讯》http://www.dailytelegraph.co.uk

四、英美周刊杂志
1、《每周标准》http://www.weeklystandard.com
2、《外交事务杂志》http://www.foreignaffairs.org
3、《沙龙》http://www.salon.com
4、《美国观察者》http://www.gilder.com/amspec/index.html
5、《新共和》http://www.tnr.com/
6、《国家评论》http://www.nationalreview.com
7、《国家杂志》http://nationaljournal.com/about/njweekly/stories/
8、《纽约客》http://www.newyorker.com/
9、《纽约书评》 http://www.nybooks.com/
10、《外交政策》http://www.foreignpolicy.com/
11、《大西洋月刊》The Atlantic Online http://www.theatlantic.com/
12、《外交政策聚焦》http://www.foreignpolicy-infocus.org/
13、《民族》The Nation http://www.thenation.com/
14、《进步》Homepage of The Progressive magazine http://www.progressive.org/

六、英美常用经济网站
1、《金融时报》http://news.ft.com/home/rw
2、《商业周刊》http://www.businessweek.com

七、非英美周刊杂志和资料站点
15、全球主义者http://www.theglobalist.com/

八、非英美外电新闻
22、联合国新闻中心http://www.un.org/News

2007年12月29日星期六

英语学习资源整理

未经测试,不保证所有链接可用。
1. http://www.chinadaily.com.cn/language_tips/index.html chinadaily--language tips
2. http://broadcast.yahoo.com/ 雅虎广播站,多个频道。
6.http://www.52en.com/tl/(英语听力特区)
7.http://www.putclub.com/(普特英语听力)8.http://www.51test.net/yyky/(无忧考网口语频道)
12.http://www.51test.net/yytl/(无忧考网听力频道)10.http://www.iselong.com/English/c/16index.htm(万千英语族)
11.http://www.pass-e.com/sort.php?sortid=8(真题网)15.http://www.meno.com.cn/view/bbs.html(美诺学习网)

english-at-home http://www.english-at-home.com/
主题:是一个全方位的学英语作为第二语言的网站
功能:聊天室,语法讲解,练习,小测试,成语讲解
特色:特别深入地介绍了语法,听力,沟通技巧等
对象:esl教师和学英语人士

english, baby! http://www.englishbaby.com/
主题:是一个年轻人学习交流的美国英语网站
功能:每天不同的网上课程,以美国流行文化为主题
特色:可以学到很多美国俚语和方言
对象:面向年轻人

englishclub.net http://www.englishclub.net/
主题:丰富齐全的商业性英文网站
功能:语法讲解,练习,参考资料,教师材料
对象:esl教师和学英语人士

englishpage http://www.englishpage.com/index.html
主题:针对英文基础较好的学习人士和教师的网站
功能:阅读,游戏。语法讲解,讨论等
特色:深入讲解了时态用法,每周有新课程推出,旧课程可以在存档中找到
对象:esl教师和学英语人士

esl partyland http://www.eslpartyland.com/default.htm
主题:自学和互相交流
功能:75个互动式测试和15个论坛,让学生互相交流,教师可以下载课程材料
特色:互动式
对象:esl教师和学英语人士

to learn english.com http://www.tolearnenglish.com/
主题:内容广泛,资源丰富,值得一看
功能:聊天室,语法讲解,练习,小测试,图片,论坛
特色:做完练习可以得到评语,老师可以在线制作试题
对象:esl教师和学英语人士

longman english language teaching
http://www.longman-elt.com/index.html
主题:为中国朋友所熟知的朗曼英语教学方法
功能:测试,专题文章,链接,小窍门
对象:esl教师和学英语人士

schmooze university http://schmooze.hunter.cuny.edu/
主题:英语学习个网站,可以一对一或分小组进行对话
功能:在线字典,语言游戏,usenet
对象:学英语人士

2、汉英、英汉、英英、汉汉词典:
http://www.m-w.com/ 韦氏大词典,英英,韦氏字典家族尽览。http://www.thesaurus.com/
http://www.dictionary.com/ 综合词典,同义词/反义词,分类,英英。

3、百科辞典
http://www.bartleby.com/reference/ 美国最大的免费在线参考网站。下有columbia encyclopedia, roget's thesauri, american heritage dictionary, columbia history of english and american literature等众多参考词典。更新快,内容丰富。英文。
http://www.encycolpedia.com/ 在线简明哥伦比亚百科全书,有5万多词条。英文。
http://www.ask.com/ 最常用的提问网站,可以通过查询分类查找问题答案,也可上帖提问。

4、翻译
http://www.bilinguist.com/ 汉英论坛,高手云集,可上贴提问,回答率高。
http://www.chinatranslate.net/ 中国翻译网,号称全国最大的翻译专业网站。知识全面,但更新较慢。
http://www.cn-trans.com/ 译者俱乐部,个人网站,其精选短文与翻译论坛尚可。更新慢。

5、语法、阅读、教学、写作
http://www.edufind.com/english/grammar/subidx.cfm 英文在线教学网站的语法部分,120条。
http://www.englishchina.com/ 英语中国,有丰富的站点链接,更新较慢。
http://webster.commnet.edu/writing/writing.htm 英文写作助手。多种国外资源链接。

6、社区、听力、口语、演讲
http://www.crazyenglish.org/ 疯狂英语俱乐部。英语学习方法、教程、各种最新资料。
http://www.hongen.com/eng/index.htm 洪恩在线。英语学习社区。外教讲座。
http://edu.china.com/zh_cn/elearn/second/test/index.html 提高英语听力的方法。
http://www.listeningexpress.com/ 部分voa、bbc、nce的听力材料。
http://www.un.org/av/
联合国广播,需待网况良好时使用。
http://www.historychannel.com/speeches/ 美国历史频道演说集,需要realplayer。
http://www.americanrhetoric.com/speechbank.htm 强大的名人演说集(文本+录音)。可搜索。
http://library.westmont.edu/英文公共演讲练习资源。
http://www.listeningexpress.com/ 英语听力特快

7. 综合类
http://www.360abc.com/ 世博英语
http://www.icansay.com/ 英文锁定, 精彩我来说
http://www.englishww.com/ 旺旺英语

8. 英语考试
寄托天下 http://www.gter.net/
太傻 http://www.taisha.org/
免费学习gre的好网站(e) http://www.number2.com/
testmagic.com(e) http://www.testmagic.com/

Podcast:
* 播客凯恩的EnglishPod: http://www.englishpod.com/
* English Through Stories: http://www.englishthroughstories.com/ :听故事学英语。播客也是Jeff McQuillan教授。
* BBC learning English :http://www.bbc.co.uk/worldservice/learningenglish/radio/specials/1728_uptodate/index.shtml :世界著名语言学家David Crystal教授做的关于英语新词的节目。虽然没有RSS,但是可以下载文字。BBC的东西,精品。
* The Word Nerds :http://www.thewordnerds.org/ :一家很专业的关注语言、词汇的Podcast网站。适合英语水平较高的听众。
* The Daily Idiom :http://www.englishcaster.com/idioms 介绍英语俚语、惯用语的英语学习网站。
* Flo-Joe:http://www.splendid-learning.co.uk/podcast 英国一家针对Cambridge First Certificate in English (FCE), Certificate in Advanced English (CAE) 以及 Certificate of Proficiency in English (CPE)应试的网站。英国口音。
美国有不少大学已经把教授的讲座制作成Podcast了,要听这些讲座,这里是一份列表: List of Academic Lecture Podcasts :http://productivity.strategy-blogs.com/2005/10/list_of_academi.html
* 知行播客李钳昌的英语随身学 http://go.afterclass.cn/
*Today’s Podcast http://todayspodcast.com/ 一日一词
*Just Vocabulary http://justvocabulary.libsyn.com/
*http://www.insuns.com/podcast/

2007年12月11日星期二

比尔·盖茨在哈佛大学毕业典礼上的演讲发信(zz)

看了“一个36 岁RD 工程师的心声”,有点感慨。关于这个行业的讨论已经很多很多了,从光明到黑暗都有。看到下面一篇文章,才发现自己的眼界是多么狭小,心中感觉一时表达不清,有点激昂的东西在回荡。

  比尔·盖茨在哈佛大学毕业典礼上的演讲
  2007年6月7日
  阮一峰 译
  President Bok, former President Rudenstine, incoming President Faust, members of the Harvard Corporation and the Board of Overseers, members of the faculty, parents, and especially, the graduates:
  尊敬的Bok校长,Rudenstine前校长,即将上任的Faust校长,哈佛集团的各位成员,监管理事会的各位理事,各位老师,各位家长,各位同学:
  I've been waiting more than 30 years to say this: "Dad, I always told you I'd come back and get my degree."
  有一句话我等了三十年,现在终于可以说了:"老爸,我总是跟你说,我会回来拿到我的学位的!"
  I want to thank Harvard for this timely honor. I'll be changing my job next year … and it will be nice to finally have a college degree on my resume.
  我要感谢哈佛大学在这个时候给我这个荣誉。明年,我就要换工作了(注:指从微软公司退休)……我终于可以在简历上写我有一个本科学位,这真是不错啊。
  I applaud the graduates today for taking a much more direct route to your degrees. For my part, I'm just happy that the Crimson has called me "Harvard's most successful dropout." I guess that makes me valedictorian of my own special class … I did the best of everyone who failed.
  我为今天在座的各位同学感到高兴,你们拿到学位可比我简单多了。哈佛的校报称我是"哈佛大学历史上最成功的辍学生"。我想这大概使我有资格代表我这一类学生发言……在所有的失败者里,我做得最好。
  But I also want to be recognized as the guy who got Steve Ballmer to drop out of business school. I'm a bad influence. That's why I was invited to speak at your graduation. If I had spoken at your orientation, fewer of you might be here today.
  但是,我还要提醒大家,我使得Steve Ballmer(注:微软总经理)也从哈佛商学院退学了。因此,我是个有着恶劣影响力的人。这就是为什么我被邀请来在你们的毕业典礼上演讲。如果我在你们入学欢迎仪式上演讲,那么能够坚持到今天在这里毕业的人也许会少得多吧。
  Harvard was just a phenomenal experience for me. Academic life was fascinating. I used to sit in on lots of classes I hadn't even signed up for. And dorm life was terrific. I lived up at Radcliffe, in Currier House. There were always lots of people in my dorm room late at night discussing things, because everyone knew I didn't worry about getting up in the morning. That's how I came to be the leader of the anti-social group. We clung to each other as a way of validating our rejection of all those social people.
  对我来说,哈佛的求学经历是一段非凡的经历。校园生活很有趣,我常去旁听我没选修的课。哈佛的课外生活也很棒,我在Radcliffe过着逍遥自在的日子。每天我的寝室里总有很多人一直待到半夜,讨论着各种事情。因为每个人都知道我从不考虑第二天早起。这使得我变成了校园里那些不安分学生的头头,我们互相粘在一起,做出一种拒绝所有正常学生的姿态。
  Radcliffe was a great place to live. There were more women up there, and most of the guys were science-math types. That combination offered me the best odds, if you know what I mean. This is where I learned the sad lesson that improving your odds doesn't guarantee success.
  Radcliffe是个过日子的好地方。那里的女生比男生多,而且大多数男生都是理工科的。这种状况为我创造了最好的机会,如果你们明白我的意思。可惜的是,我正是在这里学到了人生中悲伤的一课:机会大,并不等于你就会成功。
  One of my biggest memories of Harvard came in January 1975, when I made a call from Currier House to a company in Albuquerque that had begun making the world's first personal computers. I offered to sell them software.
  我在哈佛最难忘的回忆之一,发生在1975年1月。那时,我从宿舍楼里给位于Albuquerque的一家公司打了一个电话,那家公司已经在着手制造世界上第一台个人电脑。我提出想向他们出售软件。
  I worried that they would realize I was just a student in a dorm and hang up on me. Instead they said: "We're not quite ready, come see us in a month," which was a good thing, because we hadn't written the software yet. From that moment, I worked day and night on this little extra credit project that marked the end of my college education and the beginning of a remarkable journey with Microsoft.
  我很担心,他们会发觉我是一个住在宿舍的学生,从而挂断电话。但是他们却说:"我们还没准备好,一个月后你再来找我们吧。"这是个好消息,因为那时软件还根本没有写出来呢。就是从那个时候起,我日以继夜地在这个小小的课外项目上工作,这导致了我学生生活的结束,以及通往微软公司的不平凡的旅程的开始。
  What I remember above all about Harvard was being in the midst of so much energy and intelligence. It could be exhilarating, intimidating, sometimes even discouraging, but always challenging. It was an amazing privilege – and though I left early, I was transformed by my years at Harvard, the friendships I made, and the ideas I worked on.
  不管怎样,我对哈佛的回忆主要都与充沛的精力和智力活动有关。哈佛的生活令人愉快,也令人感到有压力,有时甚至会感到泄气,但永远充满了挑战性。生活在哈佛是一种吸引人的特殊待遇……虽然我离开得比较早,但是我在这里的经历、在这里结识的朋友、在这里发展起来的一些想法,永远地改变了我。
  But taking a serious look back … I do have one big regret.
  但是,如果现在严肃地回忆起来,我确实有一个真正的遗憾。
  I left Harvard with no real awareness of the awful inequities in the world – the appalling disparities of health, and wealth, and opportunity that condemn millions of people to lives of despair.
  我离开哈佛的时候,根本没有意识到这个世界是多么的不平等。人类在健康、财富和机遇上的不平等大得可怕,它们使得无数的人们被迫生活在绝望之中。
  I learned a lot here at Harvard about new ideas in economics and politics. I got great exposure to the advances being made in the sciences.
  我在哈佛学到了很多经济学和政治学的新思想。我也了解了很多科学上的新进展。
  But humanity's greatest advances are not in its discoveries – but in how those discoveries are applied to reduce inequity. Whether through democracy, strong public education, quality health care, or broad economic opportunity – reducing inequity is the highest human achievement.
  但是,人类最大的进步并不来自于这些发现,而是来自于那些有助于减少人类不平等的发现。不管通过何种手段——民主制度、健全的公共教育体系、高质量的医疗保健、还是广泛的经济机会——减少不平等始终是人类最大的成就。
  I left campus knowing little about the millions of young people cheated out of educational opportunities here in this country. And I knew nothing about the millions of people living in unspeakable poverty and disease in developing countries.
  我离开校园的时候,根本不知道在这个国家里,有几百万的年轻人无法获得接受教育的机会。我也不知道,发展中国家里有无数的人们生活在无法形容的贫穷和疾病之中。
  It took me decades to find out.
  我花了几十年才明白了这些事情。
  You graduates came to Harvard at a different time. You know more about the world's inequities than the classes that came before. In your years here, I hope you've had a chance to think about how – in this age of accelerating technology – we can finally take on these inequities, and we can solve them.
  在座的各位同学,你们是在与我不同的时代来到哈佛的。你们比以前的学生,更多地了解世界是怎样的不平等。在你们的哈佛求学过程中,我希望你们已经思考过一个问题,那就是在这个新技术加速发展的时代,我们怎样最终应对这种不平等,以及我们怎样来解决这个问题。
  Imagine, just for the sake of discussion, that you had a few hours a week and a few dollars a month to donate to a cause – and you wanted to spend that time and money where it would have the greatest impact in saving and improving lives. Where would you spend it?
  为了讨论的方便,请想象一下,假如你每个星期可以捐献一些时间、每个月可以捐献一些钱——你希望这些时间和金钱,可以用到对拯救生命和改善人类生活有最大作用的地方。你会选择什么地方?
  For Melinda and for me, the challenge is the same: how can we do the most good for the greatest number with the resources we have.
  对Melinda(注:盖茨的妻子)和我来说,这也是我们面临的问题:我们如何能将我们拥有的资源发挥出最大的作用。
  During our discussions on this question, Melinda and I read an article about the millions of children who were dying every year in poor countries from diseases that we had long ago made harmless in this country. Measles, malaria, pneumonia, hepatitis B, yellow fever. One disease I had never even heard of, rotavirus, was killing half a million kids each year – none of them in the United States.
  在讨论过程中,Melinda和我读到了一篇文章,里面说在那些贫穷的国家,每年有数百万的儿童死于那些在美国早已不成问题的疾病。麻疹、疟疾、肺炎、乙型肝炎、黄热病、还有一种以前我从未听说过的轮状病毒,这些疾病每年导致50万儿童死亡,但是在美国一例死亡病例也没有。
  We were shocked. We had just assumed that if millions of children were dying and they could be saved, the world would make it a priority to discover and deliver the medicines to save them. But it did not. For under a dollar, there were interventions that could save lives that just weren't being delivered.
  我们被震惊了。我们想,如果几百万儿童正在死亡线上挣扎,而且他们是可以被挽救的,那么世界理应将用药物拯救他们作为头等大事。但是事实并非如此。那些价格还不到一美元的救命的药剂,并没有送到他们的手中。
  If you believe that every life has equal value, it's revolting to learn that some lives are seen as worth saving and others are not. We said to ourselves: "This can't be true. But if it is true, it deserves to be the priority of our giving."
  如果你相信每个生命都是平等的,那么当你发现某些生命被挽救了,而另一些生命被放弃了,你会感到无法接受。我们对自己说:"事情不可能如此。如果这是真的,那么它理应是我们努力的头等大事。"
  So we began our work in the same way anyone here would begin it. We asked: "How could the world let these children die?"
  所以,我们用任何人都会想到的方式开始工作。我们问:"这个世界怎么可以眼睁睁看着这些孩子死去?"
  The answer is simple, and harsh. The market did not reward saving the lives of these children, and governments did not subsidize it. So the children died because their mothers and their fathers had no power in the market and no voice in the system.
  答案很简单,也很令人难堪。在市场经济中,拯救儿童是一项没有利润的工作,政府也不会提供补助。这些儿童之所以会死亡,是因为他们的父母在经济上没有实力,在政治上没有能力发出声音。
  But you and I have both.
  但是,你们和我在经济上有实力,在政治上能够发出声音。
  We can make market forces work better for the poor if we can develop a more creative capitalism – if we can stretch the reach of market forces so that more people can make a profit, or at least make a living, serving people who are suffering from the worst inequities. We also can press governments around the world to spend taxpayer money in ways that better reflect the values of the people who pay the taxes.
  我们可以让市场更好地为穷人服务,如果我们能够设计出一种更有创新性的资本主义制度——如果我们可以改变市场,让更多的人可以获得利润,或者至少可以维持生活——那么,这就可以帮到那些正在极端不平等的状况中受苦的人们。我们还可以向全世界的政府施压,要求他们将纳税人的钱,花到更符合纳税人价值观的地方。
  If we can find approaches that meet the needs of the poor in ways that generate profits for business and votes for politicians, we will have found a sustainable way to reduce inequity in the world. This task is open-ended. It can never be finished. But a conscious effort to answer this challenge will change the world.
  如果我们能够找到这样一种方法,既可以帮到穷人,又可以为商人带来利润,为政治家带来选票,那么我们就找到了一种减少世界性不平等的可持续的发展道路。这个任务是无限的。它不可能被完全完成,但是任何自觉地解决这个问题的尝试,都将会改变这个世界。
  I am optimistic that we can do this, but I talk to skeptics who claim there is no hope. They say: "Inequity has been with us since the beginning, and will be with us till the end – because people just … don't … care." I completely disagree.
  在这个问题上,我是乐观的。但是,我也遇到过那些感到绝望的怀疑主义者。他们说:"不平等从人类诞生的第一天就存在,到人类灭亡的最后一天也将存在。——因为人类对这个问题根本不在乎。"我完全不能同意这种观点。
  I believe we have more caring than we know what to do with.
  我相信,问题不是我们不在乎,而是我们不知道怎么做。
  All of us here in this Yard, at one time or another, have seen human tragedies that broke our hearts, and yet we did nothing – not because we didn't care, but because we didn't know what to do. If we had known how to help, we would have acted.
  此刻在这个院子里的所有人,生命中总有这样或那样的时刻,目睹人类的悲剧,感到万分伤心。但是我们什么也没做,并非我们无动于衷,而是因为我们不知道做什么和怎么做。如果我们知道如何做是有效的,那么我们就会采取行动。
  The barrier to change is not too little caring; it is too much complexity.
  改变世界的阻碍,并非人类的冷漠,而是世界实在太复杂。
  To turn caring into action, we need to see a problem, see a solution, and see the impact. But complexity blocks all three steps.
  为了将关心转变为行动,我们需要找到问题,发现解决办法的方法,评估后果。但是世界的复杂性使得所有这些步骤都难于做到。
  Even with the advent of the Internet and 24-hour news, it is still a complex enterprise to get people to truly see the problems. When an airplane crashes, officials immediately call a press conference. They promise to investigate, determine the cause, and prevent similar crashes in the future.
  即使有了互联网和24小时直播的新闻台,让人们真正发现问题所在,仍然十分困难。当一架飞机坠毁了,官员们会立刻召开新闻发布会,他们承诺进行调查、找到原因、防止将来再次发生类似事故。
  But if the officials were brutally honest, they would say: "Of all the people in the world who died today from preventable causes, one half of one percent of them were on this plane. We're determined to do everything possible to solve the problem that took the lives of the one half of one percent."
  但是如果那些官员敢说真话,他们就会说:"在今天这一天,全世界所有可以避免的死亡之中,只有0.5%的死者来自于这次空难。我们决心尽一切努力,调查这个0.5%的死亡原因。"
  The bigger problem is not the plane crash, but the millions of preventable deaths.
  显然,更重要的问题不是这次空难,而是其他几百万可以预防的死亡事件。
  We don't read much about these deaths. The media covers what's new – and millions of people dying is nothing new. So it stays in the background, where it's easier to ignore. But even when we do see it or read about it, it's difficult to keep our eyes on the problem. It's hard to look at suffering if the situation is so complex that we don't know how to help. And so we look away.
  我们并没有很多机会了解那些死亡事件。媒体总是报告新闻,几百万人将要死去并非新闻。如果没有人报道,那么这些事件就很容易被忽视。另一方面,即使我们确实目睹了事件本身或者看到了相关报道,我们也很难持续关注这些事件。看着他人受苦是令人痛苦的,何况问题又如此复杂,我们根本不知道如何去帮助他人。所以我们会将脸转过去。
  If we can really see a problem, which is the first step, we come to the second step: cutting through the complexity to find a solution.
  就算我们真正发现了问题所在,也不过是迈出了第一步,接着还有第二步:那就是从复杂的事件中找到解决办法。
  Finding solutions is essential if we want to make the most of our caring. If we have clear and proven answers anytime an organization or individual asks "How can I help?," then we can get action – and we can make sure that none of the caring in the world is wasted. But complexity makes it hard to mark a path of action for everyone who cares — and that makes it hard for their caring to matter.
  如果我们要让关心落到实处,我们就必须找到解决办法。如果我们有一个清晰的和可靠的答案,那么当任何组织和个人发出疑问"如何我能提供帮助"的时候,我们就能采取行动。我们就能够保证不浪费一丁点全世界人类对他人的关心。但是,世界的复杂性使得很难找到对全世界每一个有爱心的人都有效的行动方法,因此人类对他人的关心往往很难产生实际效果。
  Cutting through complexity to find a solution runs through four predictable stages: determine a goal, find the highest-leverage approach, discover the ideal technology for that approach, and in the meantime, make the smartest application of the technology that you already have — whether it's something sophisticated, like a drug, or something simpler, like a bednet.
  从这个复杂的世界中找到解决办法,可以分为四个步骤:确定目标,找到最高效的方法,发现适用于这个方法的新技术,同时最聪明地利用现有的技术,不管它是复杂的药物,还是最简单的蚊帐。
  The AIDS epidemic offers an example. The broad goal, of course, is to end the disease. The highest-leverage approach is prevention. The ideal technology would be a vaccine that gives lifetime immunity with a single dose. So governments, drug companies, and foundations fund vaccine research. But their work is likely to take more than a decade, so in the meantime, we have to work with what we have in hand – and the best prevention approach we have now is getting people to avoid risky behavior.
  艾滋病就是一个例子。总的目标,毫无疑问是消灭这种疾病。最高效的方法是预防。最理想的技术是发明一种疫苗,只要注射一次,就可以终生免疫。所以,政府、制药公司、基金会应该资助疫苗研究。但是,这样研究工作很可能十年之内都无法完成。因此,与此同时,我们必须使用现有的技术,目前最有效的预防方法就是设法让人们避免那些危险的行为。
  Pursuing that goal starts the four-step cycle again. This is the pattern. The crucial thing is to never stop thinking and working – and never do what we did with malaria and tuberculosis in the 20th century – which is to surrender to complexity and quit.
  要实现这个新的目标,又可以采用新的四步循环。这是一种模式。关键的东西是永远不要停止思考和行动。我们千万不能再犯上个世纪在疟疾和肺结核上犯过的错误,那时我们因为它们太复杂,而放弃了采取行动。
  The final step – after seeing the problem and finding an approach – is to measure the impact of your work and share your successes and failures so that others learn from your efforts.
  在发现问题和找到解决方法之后,就是最后一步——评估工作结果,将你的成功经验或者失败经验传播出去,这样其他人就可以从你的努力中有所收获。
  You have to have the statistics, of course. You have to be able to show that a program is vaccinating millions more children. You have to be able to show a decline in the number of children dying from these diseases. This is essential not just to improve the program, but also to help draw more investment from business and government.
  当然,你必须有一些统计数字。你必须让他人知道,你的项目为几百万儿童新接种了疫苗。你也必须让他人知道,儿童死亡人数下降了多少。这些都是很关键的,不仅有利于改善项目效果,也有利于从商界和政府得到更多的帮助。
  But if you want to inspire people to participate, you have to show more than numbers; you have to convey the human impact of the work – so people can feel what saving a life means to the families affected.
  但是,这些还不够,如果你想激励其他人参加你的项目,你就必须拿出更多的统计数字;你必须展示你的项目的人性因素,这样其他人就会感到拯救一个生命,对那些处在困境中的家庭到底意味着什么。
  I remember going to Davos some years back and sitting on a global health panel that was discussing ways to save millions of lives. Millions! Think of the thrill of saving just one person's life – then multiply that by millions. … Yet this was the most boring panel I've ever been on – ever. So boring even I couldn't bear it.
  几年前,我去瑞士达沃斯旁听一个全球健康问题论坛,会议的内容有关于如何拯救几百万条生命。天哪,是几百万!想一想吧,拯救一个人的生命已经让人何等激动,现在你要把这种激动再乘上几百万倍……但是,不幸的是,这是我参加过的最最乏味的论坛,乏味到我无法强迫自己听下去。
  What made that experience especially striking was that I had just come from an event where we were introducing version 13 of some piece of software, and we had people jumping and shouting with excitement. I love getting people excited about software – but why can't we generate even more excitement for saving lives?
  那次经历之所以让我难忘,是因为之前我们刚刚发布了一个软件的第13个版本,我们让观众激动得跳了起来,喊出了声。我喜欢人们因为软件而感到激动,那么我们为什么不能够让人们因为能够拯救生命而感到更加激动呢?
  You can't get people excited unless you can help them see and feel the impact. And how you do that – is a complex question.
  除非你能够让人们看到或者感受到行动的影响力,否则你无法让人们激动。如何做到这一点,并不是一件简单的事。
  Still, I'm optimistic. Yes, inequity has been with us forever, but the new tools we have to cut through complexity have not been with us forever. They are new – they can help us make the most of our caring – and that's why the future can be different from the past.
  同前面一样,在这个问题上,我依然是乐观的。不错,人类的不平等有史以来一直存在,但是那些能够化繁为简的新工具,却是最近才出现的。这些新工具可以帮助我们,将人类的同情心发挥最大的作用,这就是为什么将来同过去是不一样的。
  The defining and ongoing innovations of this age – biotechnology, the computer, the Internet – give us a chance we've never had before to end extreme poverty and end death from preventable disease.
  这个时代无时无刻不在涌现出新的革新——生物技术,计算机,互联网——它们给了我们一个从未有过的机会,去终结那些极端的贫穷和非恶性疾病的死亡。
  Sixty years ago, George Marshall came to this commencement and announced a plan to assist the nations of post-war Europe. He said: "I think one difficulty is that the problem is one of such enormous complexity that the very mass of facts presented to the public by press and radio make it exceedingly difficult for the man in the street to reach a clear appraisement of the situation. It is virtually impossible at this distance to grasp at all the real significance of the situation."
  六十年前,乔治·马歇尔也是在这个地方的毕业典礼上,宣布了一个计划,帮助那些欧洲国家的战后建设。他说:"我认为,困难的一点是这个问题太复杂,报纸和电台向公众源源不断地提供各种事实,使得大街上的普通人极端难于清晰地判断形势。事实上,经过层层传播,想要真正地把握形势,是根本不可能的。"
  Thirty years after Marshall made his address, as my class graduated without me, technology was emerging that would make the world smaller, more open, more visible, less distant.
  马歇尔发表这个演讲之后的三十年,我那一届学生毕业,当然我不在其中。那时,新技术刚刚开始萌芽,它们将使得这个世界变得更小、更开放、更容易看到、距离更近。
  The emergence of low-cost personal computers gave rise to a powerful network that has transformed opportunities for learning and communicating.
  低成本的个人电脑的出现,使得一个强大的互联网有机会诞生,它为学习和交流提供了巨大的机会。
  The magical thing about this network is not just that it collapses distance and makes everyone your neighbor. It also dramatically increases the number of brilliant minds we can have working together on the same problem – and that scales up the rate of innovation to a staggering degree.
  网络的神奇之处,不仅仅是它缩短了物理距离,使得天涯若比邻。它还极大地增加了怀有共同想法的人们聚集在一起的机会,我们可以为了解决同一个问题,一起共同工作。这就大大加快了革新的进程,发展速度简直快得让人震惊。
  At the same time, for every person in the world who has access to this technology, five people don't. That means many creative minds are left out of this discussion -- smart people with practical intelligence and relevant experience who don't have the technology to hone their talents or contribute their ideas to the world.
  与此同时,世界上有条件上网的人,只是全部人口的六分之一。这意味着,还有许多具有创造性的人们,没有加入到我们的讨论中来。那些有着实际的操作经验和相关经历的聪明人,却没有技术来帮助他们,将他们的天赋或者想法与全世界分享。
  We need as many people as possible to have access to this technology, because these advances are triggering a revolution in what human beings can do for one another. They are making it possible not just for national governments, but for universities, corporations, smaller organizations, and even individuals to see problems, see approaches, and measure the impact of their efforts to address the hunger, poverty, and desperation George Marshall spoke of 60 years ago.
  我们需要尽可能地让更多的人有机会使用新技术,因为这些新技术正在引发一场革命,人类将因此可以互相帮助。新技术正在创造一种可能,不仅是政府,还包括大学、公司、小机构、甚至个人,能够发现问题所在、能够找到解决办法、能够评估他们努力的效果,去改变那些马歇尔六十年前就说到过的问题——饥饿、贫穷和绝望。
  Members of the Harvard Family: Here in the Yard is one of the great collections of intellectual talent in the world.
  哈佛是一个大家庭。这个院子里在场的人们,是全世界最有智力的人类群体之一。
  What for?
  我们可以做些什么?
  There is no question that the faculty, the alumni, the students, and the benefactors of Harvard have used their power to improve the lives of people here and around the world. But can we do more? Can Harvard dedicate its intellect to improving the lives of people who will never even hear its name?
  毫无疑问,哈佛的老师、校友、学生和资助者,已经用他们的能力改善了全世界各地人们的生活。但是,我们还能够再做什么呢?有没有可能,哈佛的人们可以将他们的智慧,用来帮助那些甚至从来没有听到过"哈佛"这个名字的人?
  Let me make a request of the deans and the professors – the intellectual leaders here at Harvard: As you hire new faculty, award tenure, review curriculum, and determine degree requirements, please ask yourselves:
  请允许我向各位院长和教授,提出一个请求——你们是哈佛的智力领袖,当你们雇用新的老师、授予终身教职、评估课程、决定学位颁发标准的时候,请问你们自己如下的问题:
  Should our best minds be dedicated to solving our biggest problems?
  我们最优秀的人才是否在致力于解决我们最大的问题?
  Should Harvard encourage its faculty to take on the world's worst inequities? Should Harvard students learn about the depth of global poverty … the prevalence of world hunger … the scarcity of clean water …the girls kept out of school … the children who die from diseases we can cure?
  哈佛是否鼓励她的老师去研究解决世界上最严重的不平等?哈佛的学生是否从全球那些极端的贫穷中学到了什么……世界性的饥荒……清洁的水资源的缺乏……无法上学的女童……死于非恶性疾病的儿童……哈佛的学生有没有从中学到东西?
  Should the world's most privileged people learn about the lives of the world's least privileged?
  那些世界上过着最优越生活的人们,有没有从那些最困难的人们身上学到东西?
  These are not rhetorical questions – you will answer with your policies.
  这些问题并非语言上的修辞。你必须用自己的行动来回答它们。
  My mother, who was filled with pride the day I was admitted here – never stopped pressing me to do more for others. A few days before my wedding, she hosted a bridal event, at which she read aloud a letter about marriage that she had written to Melinda. My mother was very ill with cancer at the time, but she saw one more opportunity to deliver her message, and at the close of the letter she said: "From those to whom much is given, much is expected."
  我的母亲在我被哈佛大学录取的那一天,曾经感到非常骄傲。她从没有停止督促我,去为他人做更多的事情。在我结婚的前几天,她主持了一个新娘进我家的仪式。在这个仪式上,她高声朗读了一封关于婚姻的信,这是她写给Melinda的。那时,我的母亲已经因为癌症病入膏肓,但是她还是认为这是又一个传播她的信念的机会。在那封信的结尾,她写道:"对于那些接受了许多帮助的人们,对他们的期待也更多。"
  When you consider what those of us here in this Yard have been given – in talent, privilege, and opportunity – there is almost no limit to what the world has a right to expect from us.
  想一想吧,我们在这个院子里的这些人,被给予过什么——天赋、特权、机遇——那么可以这样说,全世界的人们几乎有无限的权利,期待我们做出贡献。
  In line with the promise of this age, I want to exhort each of the graduates here to take on an issue – a complex problem, a deep inequity, and become a specialist on it. If you make it the focus of your career, that would be phenomenal. But you don't have to do that to make an impact. For a few hours every week, you can use the growing power of the Internet to get informed, find others with the same interests, see the barriers, and find ways to cut through them.
  同这个时代的期望一样,我也要向今天各位毕业的同学提出一个忠告:你们要选择一个问题,一个复杂的问题,一个有关于人类深刻的不平等的问题,然后你们要变成这个问题的专家。如果你们能够使得这个问题成为你们职业的核心,那么你们就会非常杰出。但是,你们不必一定要去做那些大事。每个星期只用几个小时,你就可以通过互联网得到信息,找到志同道合的朋友,发现困难所在,找到解决它们的途径。
  Don't let complexity stop you. Be activists. Take on the big inequities. It will be one of the great experiences of your lives.
  不要让这个世界的复杂性阻碍你前进。要成为一个行动主义者。将解决人类的不平等视为己任。它将成为你生命中最重要的经历之一。
  You graduates are coming of age in an amazing time. As you leave Harvard, you have technology that members of my class never had. You have awareness of global inequity, which we did not have. And with that awareness, you likely also have an informed conscience that will torment you if you abandon these people whose lives you could change with very little effort. You have more than we had; you must start sooner, and carry on longer.
  在座的各位毕业的同学,你们所处的时代是一个神奇的时代。当你们离开哈佛的时候,你们拥有的技术,是我们那一届学生所没有的。你们已经了解到了世界上的不平等,我们那时还不知道这些。有了这样的了解之后,要是你再弃那些你可以帮助的人们于不顾,就将受到良心的谴责,只需一点小小的努力,你就可以改变那些人们的生活。你们比我们拥有更大的能力;你们必须尽早开始,尽可能长时期坚持下去。
  Knowing what you know, how could you not?
  知道了你们所知道的一切,你们怎么可能不采取行动呢?
  And I hope you will come back here to Harvard 30 years from now and reflect on what you have done with your talent and your energy. I hope you will judge yourselves not on your professional accomplishments alone, but also on how well you have addressed the world's deepest inequities … on how well you treated people a world away who have nothing in common with you but their humanity.
  我希望,30年后你们还会再回到哈佛,想起你们用自己的天赋和能力所做出的一切。我希望,在那个时候,你们用来评价自己的标准,不仅仅是你们的专业成就,而包括你们为改变这个世界深刻的不平等所做出的努力,以及你们如何善待那些远隔千山万水、与你们毫不涉及的人们,你们与他们唯一的共同点就是同为人类。
  Good luck.
  最后,祝各位同学好运。

附:比尔.盖茨的11条准则
Bill Gates" 11 Rules 比尔.盖茨的11条准则   
In Bill Gates" Book for high school and college graduates, there is a list of 11 things they did not learn in school. In his book, Bill Gates talks about how feelgood, politically-correct teachings created a full generation of kids with no concept of reality and how this education set them up for failure in the real world.
在比尔·盖茨写给高中毕业生和大学毕业生的书里,有一个单子上面列有11项学生没能在学校里学到的事情。比尔·盖茨在书中谈到让你感觉良好的"政治上正确"的教导培养出一整代不知现实为何物的年轻人,这种教育只能导致他们成为现实世界中的失败者。
The 11 things are:
这11项事情是:
1. Life is not fair, get used to it.
1. 生活是不公平的;要去适应它。
2. The world won"t care about your selfesteem. The world will expect you to accomplish something before you feel good about yourself. 2.这世界并不会在意你的自尊。这世界指望你在自我感觉良好之前先要有所成就。
3. You will not make 40 thousand dollars a year right out of high school. You won"t be a vice president with a car phone, until you earn both.
3.高中刚毕业你不会一年挣4万美元。你不会成为一个公司的副总裁,并拥有一部装有电话的汽车,直到你将此职位和汽车电话都挣到手。
4. If you think your teacher is tough, wait till you get a boss. He doesn"t have tenure.
4.如果你认为你的老师严厉,等你有了老板再这样想。老板可是没有任期限制的。
5. Flipping burgers is not beneath your dignity. Your grandparents had a different word for burger flipping; they called it opportunity.
5.烙牛肉饼并不有损你的尊严。你的祖父母对烙牛肉饼可有不同的定义;他们称它为机遇。
6. If you mess up, it"s not your parents" fault, so don"t whine about our mistakes, learn from them.
6.如果你陷入困境,那不是你父母的过错,所以不要尖声抱怨我们的错误,要从中吸取教训。
7. Before you were born, your parents weren"t as boring as they are now. They got that way from paying your bills, cleaning your clothes and listening to you talk about how cool you are. So before you save the rain forest from the parasites of your parents" generation, try "delousing" the closet in your own room.
7.在你出生之前,你的父母并非像他们现在这样乏味。他们变成今天这个样子是因为这些年来他们一直在为你付账单,给你洗衣服,听你大谈你是如何的酷。所以,如果你想消灭你父母那一辈中的"寄生虫"来拯救雨林的话,还是先去清除你房间衣柜里的虫子吧。
8. Your school may have done away with winners and losers, but life has not. In some schools they have abolished failing grades; they"ll give you as many times as you want to get the right answer. This doesn"t bear the slightest resemblance to anything in real life.
8.你的学校也许已经不再分优等生和劣等生,但生活却仍在作出类似区分。在某些学校已经废除不及格分;只要你想找到正确答案,学校就会给你无数的机会。这和现实生活中的任何事情没有一点相似之处。
9. Life is not divided into semesters. You don"t get summers off and very few employers are interested in helping you find yourself. Do that on your own time.
9.生活不分学期。你并没有暑假可以休息,也没有几位雇主乐于帮你发现自我。自己找时间做吧。
10. Television is NOT real life. In real life people actually have to leave the coffee shop and go to jobs.
10.电视并不是真实的生活。在现实生活中,人们实际上得离开咖啡屋去干自己的工作。
11. Be nice to nerds. Chances are you"ll end up working for one. 11.善待乏味的人。有可能到头来你会为一个乏味的人工作。

2007年11月29日星期四

去滑雪(Nanshan ski)

今天组织去南山滑雪,这两天天气晴朗的一塌糊涂,所以都是人工造雪。中午在山上吃了一顿黑心饭,到下午发现雪都被晒化了,被那么多人一压,都快成冰了。非常难以控制速度。
最大的感受就是:人真多。上一次坡顶要排长队,到了顶上哧溜一下就下来了,然后就是再一次漫长的等待。


人工造雪

一半是雪,一半是草

游人如织

排长龙

都化成冰了

2007年11月28日星期三

生成等值面(Marching Cube)

看看文件的日期,最初的开始是21日,到现在又是一周了,才有了个初步的版本。
上周布置了一个活,让用Marching Cube算法实现在数据体中生成一个等值面的算法。听说这是上上届一位师兄毕业论文的内容,让我也照着实现一个。可后来发现找不到当初的代码了,没办法,只能自己动手。在UAF的网上课程中查到一份实现代码,接下来的工作就是看懂它然后应用到程序中来。我料到了开头,可是没有猜到过程会这么艰难。
MC算法的原理还比较简单,就是分析一个正方体体素八个顶点分别位于等值面外和内两种情况时的组合,根据这256种不同的情况生成体素内的三角形。在代码中用到了八叉树,用来保存等值面穿过的体素,为了理解这个结构,花了相当多的时间,一连几天都在研究这个算法,好不容易有点眉目了,巴巴地实现出来,结果被李博一针见血地指出每次生成的时候都要重新生成八叉树,虽然不一定每次都更新到整个树,但是考虑到其本身存储空间的开销,还是有点吃不消,真是备受打击。只好三下五除二把八叉树砍掉,原来1200多行的代码一下子砍的不到700行,其中约300行还是两个大的查找表。当初就是被这两个大表里面密密麻麻的冰冷的16进制数给吓住了。没有深入分析就去看八叉树了。后来发现其实里面的数据相当规律,就是在第一个表用01表示各个边是否被等值面截,然后到下一个表中找到相应的三角形组合方式。256种情况一一在目,要是让我自已写可能要多花几倍的功夫还不能保证穷尽所有情况。想到中科院自动化所田捷博士说的,图形学算法的特点就是容易理解,但是细节太烦琐。总结这一周的经验,对于网上下的源码的每一个部分,都应该吃透,不能留下死角,然后根据自己的实际需要,选择需要的部分,不能为了赶时间把整个块拿过来,期望它能够像一个黑盒似的工作正常。即使侥幸别人的代码写的不错,为了把其与自身代码结合所花费的改写时间也已经超出了读懂代码所要花费的时间了。

2007年11月20日星期二

需求变更(Software Change Control)

“什么东西是绿的,有两个轮子,长在房子周围?”
“……不知道,是什么?”
“草,轮子是我瞎说的。”

绕了一圈,又回到原点了。当初因为不知道将来的扩展情况,在效率和可扩展性之间选择的是后者,采用尽量独立的数据结构。随着项目的深入,原来的速度渐渐的变得不可容忍,而未来的应用范围已经可以基本上确定了,不用再考虑过多,于是又重新把过去写的数据结构去了,改成了当初那种ungraceful的写法,速度一下暴增,将来会出什么问题,还不知道,一步一步调,一点一点试吧。既然干编程这一行,就得随时做好需求变更的准备,一方面上是心态上的,对变化不要厌烦;一方面是技术上的,程序的编写要尽量灵活以利于扩充。看来有必要再好好学习一下设计模式的内容。

2007年11月18日星期日

保护眼睛(改变窗口颜色和Pdf背景颜色)

首先需要改一下设置,如果常常用电脑很容易导致眼睛过度疲劳而得干眼症,所以大夫建议电脑屏幕不要用白色,因为白色对眼睛的刺激是最大的。像我们这样整天对着电脑,也应该注意一下。其实,只要稍微设置一下,就能让你电脑上的窗口从白花花的颜色变成淡淡的绿色。

设置方法:
打开控制面板中的"显示" 选择外观(appearance)-高级(advanced), 然后在项目(items)那栏选窗口(windows),再点颜色(color)-其它(others),然后把Hue(色调设为85,Sat(饱和度)设为90,Lum(亮度)设为205。 然后单击 添加到自定义颜色(Add tocustom colors),一直确定。
把窗口设成绿色之后,再来把IE的网页背景也变成养眼的绿色吧:
打开IE,点击工具(TOOLS),点INTERNET选项(INTERNET OPTIONS),点右下角的辅助功能 (Assessibility),然后勾选 不使用网页中指定的颜色(ignore colors specifiedon web pages),然后点 确定退出。

现在你就会发现屏幕已经变成淡淡的绿色了。这个颜色会比白色柔和许多,刚开始可能你还有些不适应,但确实对我们的眼睛有好处,建议大家试一下。

PDF格式背景改变方法如下:

点击 编辑 -》首选项-》辅助工具-》选中“替换文档颜色”和“
自定义颜色”-》将背景颜色改成你想要的背景颜色。。-》

2007年11月13日星期二

为什么会出现LNK2005,LNK1169错误

许多Visual C++的使用者都碰到过LNK2005:symbol already defined和LNK1169:one or more multiply defined symbols found这样的链接错误,而且通常是在使用第三方库时遇到的。对于这个问题,有的朋友可能不知其然,而有的朋友可能知其然却不知其所以然,本文就试图为大家彻底解开关于它的种种疑惑。

大家都知道,从C/C++源程序到可执行文件要经历两个阶段:
(1)编译器将源文件编译成汇编代码,然后由汇编器(assembler)翻译成机器指令(再加上其它相关信息)后输出到一个个目标文件(object file,VC的编译器编译出的目标文件默认的后缀名是.obj)中;
(2)链接器(linker)将一个个的目标文件(或许还会有若干程序库)链接在一起生成一个完整的可执行文件。

编译器编译源文件时会把源文件的全局符号(global symbol)分成强(strong)和弱(weak)两类传给汇编器,而随后汇编器则将强弱信息编码并保存在目标文件的符号表中。那么何谓强弱呢?编译器认为函数与初始化了的全局变量都是强符号,而未初始化的全局变量则成了弱符号。比如有这么个源文件:

extern int errorno;
int buf[2] = {1,2};
int *p;
int main()
{
return 0;
}

其中main、buf是强符号,p是弱符号,而errorno则非强非弱,因为它只是个外部变量的使用声明。

有了强弱符号的概念,链接器(Unix平台)就会按如下规则(参考[1],p549~p550)处理与选择被多次定义的全局符号:

规则1: 不允许强符号被多次定义(即不同的目标文件中不能有同名的强符号);
规则2: 如果一个符号在某个目标文件中是强符号,在其它文件中都是弱符号,那么选择强符号;
规则3: 如果一个符号在所有目标文件中都是弱符号,那么选择其中任意一个;

虽然上述3条针对的是Unix平台的链接器,但据作者试验,至少VC6.0的linker也遵守这些规则。由此可知多个目标文件不能重复定义同名的函数与初始化了的全局变量,否则必然导致LNK2005和LNK1169两种链接错误。可是,有的时候我们并没有在自己的程序中发现这样的重定义现象,却也遇到了此种链接错误,这又是何解?嗯,问题稍微有点儿复杂,容我慢慢道来。

众所周知,ANSI C/C++ 定义了相当多的标准函数,而它们又分布在许多不同的目标文件中,如果直接以目标文件的形式提供给程序员使用的话,就需要他们确切地知道哪个函数存在于哪个目标文件中,并且在链接时显式地指定目标文件名才能成功地生成可执行文件,显然这是一个巨大的负担。所以C语言提供了一种将多个目标文件打包成一个文件的机制,这就是静态程序库(static library)。开发者在链接时只需指定程序库的文件名,链接器就会自动到程序库中寻找那些应用程序确实用到的目标模块,并把(且只把)它们从库中拷贝出来参与构建可执行文件。几乎所有的C/C++开发系统都会把标准函数打包成标准库提供给开发者使用(有不这么做的吗?)。

程序库为开发者带来了方便,但同时也是某些混乱的根源。我们来看看链接器(Unix平台)是如何解析(resolve)对程序库的引用的(参考[1],p556)。

在符号解析(symbol resolution)阶段,链接器按照所有目标文件和库文件出现在命令行中的顺序从左至右依次扫描它们,在此期间它要维护若干个集合:(1)集合E是将被合并到一起组成可执行文件的所有目标文件集合;(2)集合D是所有之前已被加入E的目标文件定义的符号集合;(3)集合U是未解析符号(unresolved symbols,即那些被E中目标文件引用过但在D中还不存在的符号)的集合。一开始,E、D、U都是空的。

(1): 对命令行中的每一个输入文件f,链接器确定它是目标文件还是库文件,如果它是目标文件,就把f加入到E,并把f中未解析的符号和已定义的符号分别加入到U、D集合中,然后处理下一个输入文件。
(2): 如果f是一个库文件,链接器会尝试把U中的所有未解析符号与f中各目标模块定义的符号进行匹配。如果某个目标模块m定义了一个U中的未解析符号,那么就把m加入到E中,并把m中未解析的符号和已定义的符号分别加入到U、D集合中。不断地对f中的所有目标模块重复这个过程直至到达一个不动点(fixed point),此时U和D不再变化。而那些未加入到E中的f里的目标模块就被简单地丢弃,链接器继续处理下一输入文件。
(3): 当扫描完所有输入文件时如果U非空或者有同名的符号被多次加入D,链接器报告错误信息并退出。否则,它把E中的所有目标文件合并在一起生成可执行文件。

上述规则针对的是Unix平台链接器,而VC(至少VC6.0)linker则有相当的不同: 它首先依次处理命令行中出现的所有目标文件,然后依照顺序不停地扫描所有的库文件,直至U为空或者某遍(从头到尾依次把所有的库文件扫描完称为一遍)扫描过程中U、D无任何变化时结束扫描,此刻再根据U是否为空以及是否有同名符号重复加入D来决定是出错退出还是生成可执行文件。很明显Unix链接器对输入文件在命令行中出现的顺序十分敏感,而VC的算法则可最大限度地减少文件顺序对链接的影响。作者不清楚Unix下新的开发工具是否已经改进了相应的做法,欢迎有实践经验的朋友补充这方面的信息(补充于2005年10月10日: 经试验,使用gcc 3.2.3的MinGW 3.1.0的链接器表现与参考[1]描述的一致)。

VC带的编译器是cl.exe,它有这么几个与标准程序库有关的选项: /ML、/MLd、/MT、/MTd、/MD、/MDd。这些选项告诉编译器应用程序想使用什么版本的C标准程序库。/ML(缺省选项)对应单线程静态版的标准程序库(libc.lib);/MT对应多线程静态版标准库(libcmt.lib),此时编译器会自动定义_MT宏;/MD对应多线程DLL版(导入库msvcrt.lib,DLL是msvcrt.dll),编译器自动定义_MT和_DLL两个宏。后面加d的选项都会让编译器自动多定义一个_DEBUG宏,表示要使用对应标准库的调试版,因此/MLd对应调试版单线程静态标准库(libcd.lib),/MTd对应调试版多线程静态标准库(libcmtd.lib),/MDd对应调试版多线程DLL标准库(导入库msvcrtd.lib,DLL是msvcrtd.dll)。虽然我们的确在编译时明白无误地告诉了编译器应用程序希望使用什么版本的标准库,可是当编译器干完了活,轮到链接器开工时它又如何得知一个个目标文件到底在思念谁?为了传递相思,我们的编译器就干了点秘密的勾当。在cl编译出的目标文件中会有一个专门的区域(关心这个区域到底在文件中什么地方的朋友可以参考COFF和PE文件格式)存放一些指导链接器如何工作的信息,其中有一项就叫缺省库(default library),它指定了若干个库文件名,当链接器扫描该目标文件时将按照它们在目标模块中出现的顺序处理这些库名: 如果该库在当前输入文件列表中还不存在,那么便把它加入到输入文件列表末尾,否则略过。说到这里,我们先来做个小实验。写个顶顶简单的程序,然后保存为main.c :


/* main.c */
int main() { return 0; }


用下面这个命令编译main.c(什么?你从不用命令行来编译程序?这个......) :

cl /c main.c

/c是告诉cl只编译源文件,不用链接。因为/ML是缺省选项,所以上述命令也相当于: cl /c /ML main.c 。如果没什么问题的话(要出了问题才是活见鬼!当然除非你的环境变量没有设置好,这时你应该去VC的bin目录下找到vcvars32.bat文件然后运行它。),当前目录下会出现一个main.obj文件,这就是我们可爱的目标文件。随便用一个文本编辑器打开它(是的,文本编辑器,大胆地去做别害怕),搜索"defaultlib"字符串,通常你就会看到这样的东西: "-defaultlib:LIBC -defaultlib:OLDNAMES"。啊哈,没错,这就
是保存在目标文件中的缺省库信息。我们的目标文件显然指定了两个缺省库,一个是单线程静态版标准库libc.lib(这与/ML选项相符);一个是oldnames.lib(它是为了兼容微软以前的C/C++开发系统,基本不用了,为了简化讨论可以忽略它)。另外,如果在源程序中用了

/* xxxx代表实际的库文件名 */
#pragma comment(lib,"xxxx")

编译指示命令(compiler directive)指定要链接的库,那么这个信息也会被保存到目标文件的缺省库信息项中,且位于缺省标准库之前。如果有多个这样的命令,那么对应库名在目标文件中出现的顺序与它们在源程序中出现的顺序完全一致(且都在缺省标准库之前)。

VC的链接器是link.exe,因为main.obj保存了缺省库信息,所以可以用
link main.obj libc.lib
或者
link main.obj
来生成可执行文件main.exe,这两个命令是等价的。但是如果你用
link main.obj libcd.lib
的话,链接器会给出一个警告: "warning LNK4098: defaultlib "LIBC" conflicts with use of other libs; use /NODEFAULTLIB:library",因为你显式指定的标准库版本与目标文件的缺省值不一致。通常来说,应该保证链接器合并的所有目标文件指定的缺省标准库版本一致,否则编译器一定会给出上面的警告,而LNK2005和LNK1169链接错误则有时会出现有时不会。那么这个有时到底是什么时候?呵呵,别着急,下面的一切正是为喜欢追根究底的你准备的。

建一个源文件,就叫mylib.c,内容如下:

/* mylib.c */
#include

void foo(void)
{
printf("%s","I am from mylib!\n");
}


用
cl /c /MLd mylib.c
命令编译,注意/MLd选项是指定libcd.lib为默认标准库。lib.exe是VC自带的用于将目标文件打包成程序库的命令,所以我们可以用
lib /OUT:my.lib mylib.obj
将mylib.obj打包成库,输出的库文件名是my.lib。接下来把main.c改成:

/* main.c */
void foo(void);

int main()
{
foo();
return 0;
}

用
cl /c main.c
编译,然后用
link main.obj my.lib
进行链接。这个命令能够成功地生成main.exe而不会产生LNK2005和LNK1169链接错误,你仅仅是得到了一条警告信息:"warning LNK4098: defaultlib "LIBCD" conflicts with use of other libs; use /NODEFAULTLIB:library"。我们根据前文所述的扫描规则来分析一下链接器此时做了些啥(加一个/VERBOSE选项就可以看到详尽的链接过程,但要注意,几乎所有的C编译器都会在符号前加一个下划线后再输出,所以在目标文件和链接输出信息中看到的符号名都比在源程序中见到的多出一个'_',此点不可不察。)。

一开始E、U、D都是空集。链接器首先扫描main.obj,把它的默认标准库libc.lib加入到输入文件列表末尾,它自己加入E集合,同时未解析的foo加入U,main加入D。接着扫描my.lib,因为这是个库,所以会拿当前U中的所有符号(当然现在就一个foo)与my.lib中的所有目标模块(当然也只有一个mylib.obj)依次匹配,看是否有模块定义了U中的符号。结果mylib.obj确实定义了foo,于是它加入到E,foo从U转移到D,未解析的printf加入到U,指定的默认标准库libcd.lib也加到输入文件列表末尾(在libc.lib之后)。不断地在my.lib库的各模块上进行迭代以匹配U中的符号,直到U、D都不再变化。很明显,现在就已经到达了这么一个不动点,所以接着扫描下一个输入文件,就是libc.lib。链接器发现libc.lib里的printf.obj里定义有printf,于是printf从U移到D,printf.obj加入到E,它定义的所有符号加入到D,它里头的未解析符号加入到U。如果链接时没有指定/ENTRY(程序入口点选项),那么链接器默认的入口点就是函数mainCRTStartup(GUI程序的默认入口点则是WinMainCRTStartup),它在crt0.obj中被定义,所以crt0.obj及它直接或间接引用的模块(比如malloc.obj、free.obj等)都被加入到E中,这些目标模块指定的默认库(只crt0init.obj指定了kernel32.lib)加到输入文件列表末尾,同时更新U和D。不断匹配libc.lib中各模块直至到达不动点,然后处理libcd.lib,但是它里面的所有目标模块都没有定义U中的任何一个符号,所以链接器略过它进入到最后一个输入文件kernel32.lib。事实上,U中已有和将要加入的未解析符号都可以在其中找到定义,那么当处理完kernel32.lib时,U必然为空,于是链接器合并E中的所有模块生成可执行文件。

上文描述了虽然各目标模块指定了不同版本的缺省标准库但仍然链接成功的例子,接下来你将目睹因为这种不严谨而导致的悲惨失败。

修改mylib.c成这个样子:

#include

void foo(void)
{
// just a test , don't care memory leak
_malloc_dbg( 1, _NORMAL_BLOCK, __FILE__, __LINE__ );
}

其中_malloc_dbg不是ANSI C的标准库函数,它是VC标准库提供的malloc的调试版,与相关函数配套能帮助开发者抓各种内存错误。使用它一定要定义_DEBUG宏,否则预处理器会把它自动转为malloc。继续用
cl /c /MLd mylib.c
lib /OUT:my.lib mylib.obj
编译打包。当再次用
link main.obj my.lib
进行链接时,我们看到了什么?天哪,一堆的LNK2005加上个贵为"fatal error"的LNK1169垫底,当然还少不了那个LNK4098。链接器是不是疯了?不,你冤枉可怜的链接器了,我拍胸脯保证它可是一直在尽心尽责地照章办事。

一开始E、U、D为空,链接器扫描main.obj,把libc.lib加到输入文件列表末尾,把main.obj加进E,把foo加进U,把main加进D。接着扫描my.lib,于是mylib.obj加入E,libcd.lib加到输入文件列表末尾,foo从U转移到D,_malloc_dbg加进U。然后扫描libc.lib,这时会发现libc.lib里任何一个目标模块都没有定义_malloc_dbg(它只在调试版的标准库中存在),所以不会有任何一个模块因为_malloc_dbg而加入E。但因为libc.lib中的crt0.obj定义了默认入口点函数mainCRTStartup,所以crt0.obj及它直接或间接引用的模块(比如malloc.obj、free.obj等)都被加入到E中,这些目标模块指定的默认库(只crt0init.obj指定了kernel32.lib)加到输入文件列表末尾,同时更新U和D。不断匹配libc.lib中各模块直至到达不动点后再处理libcd.lib,发现dbgheap.obj定义了_malloc_dbg,于是dbgheap.obj加入到E,它的未解析符号加入U,它定义的所有其它符号加入D,这时灾难便来了。之前malloc等符号已经在D中(随着libc.lib里的malloc.obj加入E而加入的),而dbgheap.obj及因它而引入的其它模块又定义了包括malloc在内的许多同名符号,导致了重定义冲突。所以链接器在处理完所有输入文件(是的,即使中途有重定义冲突它也会处理所有的文件以便生成一个完整的冲突列表)后只好报告: 这活儿没法儿干。

现在我们该知道,链接器完全没有责任,责任在我们自己的身上。是我们粗心地把缺省标准库版本不一致的目标文件(main.obj)与程序库(my.lib)链接起来,引发了大灾难。解决办法很简单,要么用/MLd选项来重编译main.c;要么用/ML选项重编译mylib.c;再或者干脆在链接时用/NODEFAULTLIB:XXX选项忽略默认库XXX,但这种方法非常不保险(想想为什么?),所以不推荐。

在上述例子中,我们拥有库my.lib的源代码(mylib.c),所以可以用不同的选项重新编译这些源代码并再次打包。可如果使用的是第三方的库,它并没有提供源代码,那么我们就只有改变自己程序的编译选项来适应这些库了。但是如何知道库中目标模块指定的默认库呢?其实VC提供的一个小工具便可以完成任务,这就是dumpbin.exe。运行下面这个命令
dumpbin /DIRECTIVES my.lib
然后在输出中找那些"Linker Directives"引导的信息,你一定会发现每一处这样的信息都会包含若干个类似"-defaultlib:XXXX"这样的字符串,其中XXXX便代表目标模块指定的缺省库名(注意,如果在编译时指定了/Zl选项,那么目标模块中将不会有defaultlib信息)。

知道了第三方库指定的默认标准库,再用合适的选项编译我们的应用程序,就可以避免LNK2005和LNK1169链接错误。喜欢IDE的朋友,你一样可以到 "Project属性" -> "C/C++" -> "代码生成(code generation)" -> "运行时库(run-time library)" 项下设置应用程序的默认标准库版本,这与命令行选项的效果是一样的。

---------------------------------------------------------------------------------------------------
在vc 2003下,如果使用了静态库,很有可能会发生link 2005的连接错误,主要是由于crt 库引起的,CRT 库对 new、delete 和 DllMain 函数使用弱外部链接,如果我们改变一下库的连接顺序,就可以解决这个错误

解决方案
解决该问题有两种方法:第一种解决方案涉及到强制链接程序按照正确的顺序链接库。第二种解决方案是让您查找导致问题的模块并纠正它。
解决方案一:强制链接程序按照正确的顺序链接库
1.在“生成”菜单上,单击“设置”。2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。3.在“链接”选项卡上,单击以选中“类别”组合框中的“INPUT”。4.在“要忽略的库”中,插入库名(例如,Nafxcwd.lib;Libcmtd.lib)。

注意:等效的链接程序命令行是:/NOD:。5.在“对象/库模块”框中,插入库名。必须确保这些库按顺序列出,且作为命令行中的前两个库(例如,Nafxcwd.lib 和 Libcmtd.lib)列出。要在 Visual C++ .NET 中设置该选项,请阅读“设置 Visual C++ 项目属性”联机帮助主题。
解决方案二:找到并纠正出现问题的模块
要查看当前的库链接顺序,请按照下列步骤操作: 1.在“生成”菜单上,单击“设置”。2.在“项目设置”对话框的“以下项目的设置”视图中,单击以选中出现链接错误的项目配置。3.在“链接”选项卡上,在“项目选项”框中键入 /verbose:lib

Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1431093