levine

let dream fly without limit~

日历
网志分类
· 所有网志 (24)
· 编程艺术 (5)
· 摘录 (5)
· Network Simualtion (3)
· Linux/Unix (3)
· English (1)
· 未分类 (7)
最新的评论
站内搜索
友情链接
· 我的歪酷 非非共享界

订阅 RSS

0001593

歪酷博客

热血最强 @ 2009-03-02 18:20

    每次启动机器后能上网,但不一会儿就掉了?如果你也遇到类似情况,那么你的电脑很有可能在遭受arp病毒欺骗攻击。。。
    当局域网内某台主机运行ARP欺骗的木马程序时,APR病毒会将自己机器的MAC地址映射到网关的IP的地址上,并向局域网内发送大量伪造的ARP响应包,从而使同一网段地址内的其它主机误将其视为网关,导致本机上ARP缓存中储存的网关设备信息紊乱,这样当机器要上网发送数据包给网关时就会因为地址错误而失败,造成计算机无法上网。这也就是为什么掉线时内网是互通的,计算机却不能上网。

处理对策:
 步骤一: 在能上网时,进入MS-DOS窗口,输入命令:arp –a 查看网关IP对应的正确MAC地址,将其记录下来。
  注:如果已经不能上网,则先运行一次命令arp –d将arp缓存中的内容删空,计算机可暂时恢复上网(攻击如果不停止的话),一旦能上网就立即将网络断掉(禁用网卡或拔掉网线),再运行arp –a
 
   步骤二:如果已经有网关的正确MAC地址,在不能上网时,手工将网关IP和正确MAC绑定,可确保计算机不再被攻击影响。手工绑定可在MS-DOS窗口下运行以下命令: arp –s 网关IP 网关MAC

例如:96号楼的网关为219.254.104.245,在计算机上运行arp –a后输出如下:
C:\Documents and Settings>arp -a
Interface: 219.245.104.134 --- 0x2
Internet Address Physical Address Type
.
.
219.245.104.254  00-00-0c-07-ac-47  dynamic

其中00-00-0c-07-ac-47 就是网关218.197.192.254对应的MAC地址,类型是动态(dynamic)的,因此是可被改变。
被攻击后,再用该命令查看,就会发现该MAC已经被替换成攻击机器的MAC(比如00-e0-4d-53-25-bd,那位老兄的啊,杀毒去!!!),如果大家希望能找出攻击机器,彻底根除攻击,可以在此时将该MAC记录下来,为以后查找做准备。

手工绑定的命令为:
arp –s 219.245.104.254 00-00-0c-07-ac-47

绑定完,可再用arp –a查看arp缓存,
C:\Documents and Settings>arp -a
Interface: 219.245.104.134 --- 0x2
Internet Address Physical Address Type
.
.
219.245.104.254 0 0-00-0c-07-ac-47 static

这时,类型变为静态(static),就不会再受攻击影响了。但是,需要说明的是,因为重启机器后ARP缓存信息会被全部清除,手工绑定在计算机关机重开机后就会失效,需要再绑定,我们应该把这个ARP静态地址添加指令写到一个批处理文件(例如:bat)中,并将这个文件放到系统的启动项中。当程序随系统的启动而加载的话,就可以免除因为ARP静态映射信息丢失的困扰了。 所以,要彻底根除攻击,只有找出网段内被病毒感染的计算机,令其杀毒,方可解决。

当然也可选择安装ARP病毒专杀工具来解决ARP攻击问题,推荐使用AntiARP
详细资料请参考:
ARP病毒攻击技术分析与防御
http://netsecurity.51cto.com/art/200609/31883.htm




 
热血最强 @ 2008-12-13 11:11

将军迟浩田母亲节撰文 怀念母亲 


  转眼我已年过古稀,真是时光如流水,母亲已离去38个年头了。
 
这些年来,每当我一个人的时候,母亲的身影便时常萦绕在眼前。尤其过了75岁生日后,脑海中更是波涛起伏,思绪万千,思念母亲之情经常如潮奔涌,无休止地叩打着我记忆的闸门。

   我出生在胶东一个贫穷落后的小山村。母亲一共生了11个孩子,其中4个夭折。我在男性中排行老三。家里人多物薄,我小时候的记忆就是穷,“家徒四壁”的 矮屋和“糠菜半年粮”的日子。我家孩子那么多,一人一张嘴就是无底洞。父母每天日出而作,日落方息,只求能勉强糊住十余张嘴,就是最大的满足。母亲是位身 材弱小的缠足妇女,没读过一天书。但母亲的的确确是我们家的顶梁柱。她就是凭着那双小脚、那副弱小的身躯和如柴的双手,跟父亲一起担负着繁重的农务劳作, 还要整天为全家人的吃饭穿衣精打细算。为困苦的事情费尽心思,这就是母亲生活的全部内容。然而就在我长到7岁时,妈妈竟下定决心,把全家人召集在一起,宣 布要送我去学堂念书。记得那次妈妈说:“我想了想,只有念书,学到文化,才能改变咱们一辈子在地里刨食的命运。不念书就没有出路,一辈子让人家看不起。我 看小三挺机灵的,是块当先生的料,让他去念书吧。”

  后来,妈妈又专门叮嘱我:“妈妈供你上学,就是希望你能做一个有出息、有志气的孩 子,而不是像你爸、妈一样,一辈子都是睁眼瞎,累死累活连顿饱饭也吃不上。你上了学,一定得努力,争取多学点文化,长大了去当先生。”那时的我是懵懵懂 懂,对妈妈的话理解并不深刻,就问妈妈为什么要让我当先生呢?妈妈充满憧憬地对我说:“当先生好呀!先生不但是不干庄稼活的文化人,还能到各家去吃‘派饭 ’,谁家上学一年轮上个一两次呢!能吃到一块咸鱼,一块饼子,有时候运气好,还能吃上个鸡大腿!”

  在我的记忆中,那时家里一年到头糠 菜为伴,吃的尽是谷糠、地瓜叶子,偶尔能吃上顿带点五谷杂粮的“干饭”,那不是过年就是过节。在妈妈眼里,先生一年到头都有饭吃,先生了不起。这使妈妈羡 慕先生,更希望我能当先生。正是在妈妈的坚持下,我离开了整天赤着脚、光着屁股在村头玩耍的小伙伴,背着妈妈用旧衣裳改做的小书包,迈进了学堂,迈向了从 此改变我一生的一个全新的世界。

  为了妈妈的笑容,我拼命吸吮知识的雨露。一份汗水,一份收获。每次的成绩都会让妈妈笑得像孩子一样开 心。我让妈妈深信,这条路她为我选对了,一直走下去,我一定能当先生。在妈妈的支持下,我断断续续地读到高小。就在我继续求学信心百倍的时候,国家和民族 的灾难现实改变了妈妈,也改变了我。但直至今日,尽管“当先生”早已不再是我的一个明确的追求目标,但因之而来自于妈妈的鞭策,却成了一直铭记我左右的警 句,激励着我踏实做事,老实做人。

  1941年的一天,日本鬼子“大扫荡”到我们那里。过去耀武扬威的国民党兵跑得不见踪影了。我们村 子西边大庙,是八路军用土翻砂试制手榴弹、地雷的“兵工厂”,被鬼子一把火烧成一片火海。乡亲们到处躲避。当时,妈妈什么东西也顾不上带,拉上我们几个孩 子就往外跑。妈妈心惊胆战地喊着这个叫着那个,拽着我们的手拼命地跑,想尽快冲出鬼子的包围圈。一双小脚、几个孩子哪能跑得快?在村头的河畔遇上了鬼子, 一拳把我打倒在地,用穿着铁掌皮鞋的脚把瘦小的妈妈踢到了沟里,也正是这一次,我们和妈妈第一次看到了真实的杀人场面,看到鬼子的野兽暴行。凶残的日军杀 害了一个刚结婚不久的新郎,又在光天化日之下轮奸了新娘。目睹这惨不忍睹的一幕,我们感到妈妈那攥紧我们的双手在颤抖。乡亲们也都个个咬紧牙关,攥紧双 拳,但也只能强压怒火、用仇恨的目光进行着无声的反抗,心灵挣扎在痛苦的无底深渊。

  也正是这一次血的经历,震撼着妈妈那颗慈软的心, 和家人商量后,妈妈毅然做出了送我当兵的决定。妈妈那天对我说:“小三,你要和二哥一样去当八路,不打走鬼子,日子没法过!”我听到这为之一震,在这战火 愈演愈烈的时候,妈妈做出这样的决定,难道不怕我有个三长两短吗?是妈妈看到日军暴行后的一时冲动吗?不,不是的!妈妈是经过深思熟虑后的抉择,是妈妈又 明白了一个道理。哪个妈妈不爱惜自己的儿子,她知道仅凭自己的儿子亦是沧海一粟,可是八路的队伍里不正是千千万万个母亲的孩子吗?她后来对我说:“我们祖 祖辈辈在这里过安稳的日子,这些孬种、坏蛋为什么欺负我们这些老实巴交的老百姓?看来,光靠当一个先生,挣几顿饱饭,改变不了我们穷人的命运!”

   几十年后每当想起妈妈从“好男不当兵”到送儿子当八路这一思想转变过程,总是感慨万千。作为一个目不识丁的农村妇女,妈妈的这一转变就她本人而言是再朴 素不过了。她也许没有抗击外敌、翻身解放的智慧和胆略,当然那时更不会期盼儿子通过从军征战,走上仕途,成名成将。她的想法只是,当日本鬼子逼得我们一名 普通百姓连成为一名“先生”、过上能吃顿饱饭的日子都不可能的时候,就只有去抗争,去反抗,去拿起枪打击敌人。从对鱼肉百姓的国民党军队的厌恶,到送又一 个读过书的十几岁的儿子参加八路军,投身革命队伍,从与世无争到奋起抗日,妈妈以及千千万万的妈妈这一朴素转变中,又包含着怎样的伟大啊!

   离开家后,我先是在县大队里当通信员、文书。因为我喜欢写写画画,穷人的孩子又不怕苦,所以部队领导对我印象都不错,很快推荐我到当时的“抗大”一分校 学习。到达后,我被编入三支队教二团二大队9连,成了一名真正的“学兵”。连队在选人当机枪手时,我被看中,经过两个月的艰苦训练,考核成绩合格。在抗日 战争最后一仗打响的时候,我在全连第一个报名参战。被批准后,我又被编到胶东主力团——13团,即后来的“济南第一团”,在这支能打能拼的荣誉团队,从当 文书,直到当团政委,这一干就是20年。“烽火连三月,家书抵万金”,随部队南征北战,已几年没有与家里联系了。行军途中,战斗间隙,妈妈送我的那一幕时 常浮现在我眼前。

  1947年在孟良崮以北的南麻战役中,我的左小腿被打断了,由于失血过多,人近昏迷。在生死边缘的我,真想和小时候 一样依偎在妈妈的怀里尽享幸福。这个时候外面谣言四起,传我已经牺牲了。转到莱阳后,巧遇邻村学友,我便迫不及待地让他给家里带了口信:“我还活着。”家 人知道我没有死的确切消息后,妈妈并没有完全从担心中解脱出来,她老人家已知道从没离开过家的孩子,现在正忍受着战火摧残的痛苦,忍受着伤痛的煎熬。骄阳 似火,再加上医疗条件有限,我的伤口逐渐恶化,化脓生蛆,恶臭难闻。在崎岖不平的小路上,我和一个腹部受伤的战友坐在一辆沂蒙老大爷推着的独轮车上,向战 地医院赶。当时医疗条件极差,没有消炎药品,医生将热盐水晾一晾,用小扫帚蘸着盐水扫扫蛆,仔细清洗伤口时,就像用利刀在我身上割肉一样,豆粒大的汗珠落 地有声。医生们在商议对我的治疗方案,南方口音我不全懂,大概是担心恶化到这样会造成破伤风,只见他们在我膝盖上方划了一个杠后,就把我推到开刀房。到了 门口我才明白过来,是要截肢。我那股拗脾气一上来,什么都不顾,只顾死死用手把住门框,坚决不同意,并斩钉截铁地对他们说:“要截腿,先截头,我还要打 仗,我还要回前方,死也要死在战场上!”医生说我是条汉子,是硬骨头,就没有截肢。在医生的精心救护下,总算保住了我完整的身体,做完手术后我在想,可以 上战场了,可以自己走回去见妈妈了。

  我于1953年抗美援朝战争快结束时回国,并作为志愿军观礼代表团的一员,去首都参加了当年的 “五一”劳动节观礼。不久,才回到了已阔别12年的家乡。听说我要回家的消息后,妈妈高兴得像换了个人似的,专门叮嘱几个儿女,把家里的几间老房子扫了又 扫,又修又补,然后便是每天颠着一双小脚,早早就到村口看着,等着儿子归来。

  一看见我,妈妈一句话不说上下打量着我,布满皱纹的脸上 露出了可掬的笑容,无声胜有声!12年未见,这12年我在枪林弹雨中穿行,妈妈无时无刻不在提心吊胆中度过,再见到妈妈已是满头银丝,岁月的风霜刻满了脸 庞。全家人相见兴奋不已,爸爸说:“我们家从来没杀过老牛(指没做过坏良心的事),我儿子会平安归来的。”弟弟说:“妈妈半夜睡觉都经常叫你的名字。”到 家的当天晚上,妈妈在锅台上又熬又炒,亲手为凯旋的儿子做了满满一桌子好菜,其中还不忘了给我熬了一碗咸鱼,烙了一张金黄的玉米饼子。

   吃过饭后,妈妈执意要给我洗洗脚。我理解妈妈的心思,顺从地按妈妈的意思,坐到了一把高椅上。我正准备脱掉鞋袜,老人执意不肯,她把我的两只脚全揽在怀 里,放在膝盖上,细心地帮我脱鞋、脱袜,挽起裤脚,也就在那一刻,妈妈看到了我腿上的累累伤痕。妈妈吃惊地叫了一声,赶忙又抱紧了我的双腿,把裤筒挽了又 挽,一双粗糙、长满老茧的手在疤痕处抚摸着、停留着、颤颤巍巍的。我感到有水滴掉到了我的双腿上,凉凉的,又重重的。我听到了妈妈极力控制又难以抑制的抽 咽声,妈妈哭了,苍老而又瘦弱的肩头剧烈抖动着,银白的头发显得那么凌乱。

  年轻时在地里刨食,吃糠咽菜的时候,妈妈没有哭过。含辛茹 苦地把一大群孩子拉扯成人,妈妈没有哭过。面对日本鬼子的烧杀抢掳,妈妈有过愤怒和仇恨,但也未曾哭过。送儿子上战场,刚强的妈妈同样也没有哭。可今天, 年迈的老人面对儿子的伤痕,她流泪了,而且哭得是那样的伤痛。那一刻,我忍不住也掉了泪。“醉卧沙场君莫笑,古来征战几人回”。想着与我一同征战南北的战 友一个又一个地倒下去就再也没有起来,想着无数母亲已经失去了为征战回来的儿子再洗一次脚的享受,革命的成功,共和国的成立是多么的来之不易啊。我一边用 手细心地为妈妈梳理着稀疏的银发,一边和老人讲着这个道理。年迈的妈妈听懂了儿子的话,不住地含泪点头,用她那颤颤巍巍的满是青筋的双手摸着儿子腿上的一 处处伤痕,眼泪却仍旧不断线地涌出。

  临走时,妈妈为我新做了一双土布鞋。我提出不让大家送了,自己一个人走就行了。可妈妈坚决不同 意。她在我的搀扶下,送了一段又一段路,最后还是我硬阻止她老人家停住了步子。然而,走出好远,我一回头,再回头,妈妈瘦弱的身躯却一直伫立在村边石碾盘 上,向我挥着手。就在这依依不舍中,我几步一回头地离开了妈妈,离开了家乡。

  1968年10月,我在北京接到妈妈病危的电话。当时正 是“文革”比较乱的时期,部队有任务不能请假,只好让11岁的儿子代我回去看望。我没有来得及赶回去,妈妈就离开了人世,儿子替我给妈妈送了终。及至我到 家,妈妈已经下葬。儿子告诉我,奶奶临走的时候还问:“三儿哪去了?”我顿时泪如泉涌。妈妈一生为我操碎了心,可我没有为妈妈做点什么,就连妈妈走的时 候,也没能见她一面。看着地上的一堆黄土,想着操劳一生却没享一天福的妈妈,无尽愧疚都化成伤心的放声痛哭。

  回顾她老人家的一生,可 谓普普通通,平平凡凡,没有任何可以夸耀的地方,也没有任何可值得记载的历史。然而,在儿子的眼里,盛满的却是妈妈的伟大。妈妈是最无私的,为了孩子的成 长,妈妈犹如一头躬耕乡田的老牛,从年轻力壮到岁月染白双鬓,妈妈像千千万万的妈妈一样,无怨无悔地付出着,透支着,流尽了汗水,淘尽了青春,皱纹布满了 曾经年轻的脸,重担压弯了曾经挺拔的腰。孩子们一个个长大了,成家立业了,妈妈也老了。但老了的妈妈心中装满的,仍然是远行的孩子,哪怕是在临终前的一 刻,她依然想着我。

  妈妈没有文化,也不懂得什么大道理,但却懂得国家兴亡,匹夫有责。所以在国家危难之时,她能放弃自家利益,冲破封建思想的束缚,送两个爱子奔赴革命的最前方。妈妈是平凡的,是伟大的,是值得我们永远学习的。作为她的儿子,我引以为荣。

   一个经过炮火硝烟洗礼,经过生与死考验的老兵,一个战争的幸存者,一个在妈妈百般呵护下成长起来的热血男儿,多年来,没有在妈妈的床前、膝下尽孝,这种 愧疚是难以言表的。但几十年来我没有辜负妈妈对我的希望,为党、国家和人民尽了自己最大的努力,做了些工作。使自己能在忠孝的天平上寻求点平衡,这也算是 对妈妈的养育之恩做点滴的报答吧!妈妈对我的教育和影响改变了我的一生。从妈妈最初对我的希望,到经过激烈地思想斗争后做出送儿参军的选择,以及多年后妈 妈见到带有多处伤痛的儿子的悲与喜,这一切都淋漓尽致地透露着母亲的平凡、伟大与对我的无限疼爱。“树欲静而风不止,子欲养而亲不待”,这种爱只能化作永 久的回忆和无尽的思念了。

  不知道有过多少次,每当夜深人静时,妈妈那忙碌的身影、殷切的教诲,常常浮现在我眼前,一觉醒来总是老泪纵横。

  妈妈,我永远想念您! 

  《人民日报》 (2006-05-13 第07版)



 
热血最强 @ 2008-11-29 18:40

典型的西电男都是传统,内向,好学,勤奋,很有些思想,但是不善于表达(也就是一些人所谓的闷骚型)不是很潮流,不是很懂的浪漫,不很会讨一般的女孩子开心!不知道怎么追女生!看见了自己喜欢的女生,只能在心里想想罢了! 

有事业心,喜欢享受生活,内心火热表面冷酷,不会笑,都有一两手能拿得出手,不爱和女生来往,想问题比较全面,一般比较中庸,技术型的比较多。。。。

要么板寸头,要么清汤挂面式

戴副眼镜,看着很斯文。。。

不太会注重穿着打扮,很朴素

低调,沉稳。

保守,内向,斯文




 
热血最强 @ 2008-11-27 21:46

(一)选择自己的问题取向,学会创新
    你一旦是研究生,你就已经进入另一个阶段,不只是要完全乐在其中,更要从而接受各种有趣的知识,进入制造知识的阶段,也就是说你的论文应该有所创新。由接受知识到创造知识,是身为一个研究生最大的特色,不仅如此,还要认识到自己不再是个容器,等着老师把某些东西倒在茶杯里,而是要开始逐步发展和开发自己。做为研究生不再是对于各种新奇的课照单全收,而是要重视问题取向的安排,就是在硕士或博士的阶段里面,所有的精力、所有修课以及读的书里面都应该要有一个关注的焦点,而不能像大学那般漫无目标。大学生时代是因为你要尽量开创自己接受任何东西,但是到了硕士生和博士生,有一个最终的目的,就是要完成论文,那篇论文是你个人所有武功的总集合,所以这时候必须要有个问题取向的学习。

(二)尝试跨领域研究,主动学习
    提出一个重要的问题,跨越一个重要的领域,将决定你未来的成败。我也在台大和清华教了十几年的课,我常常跟学生讲,选对一个领域和选对一个问题是成败的关键,而你自己本身必须是带着问题来探究无限的学问世界,因为你不再像大学时代一样泛滥无所归。所以这段时间内,必须选定一个有兴趣与关注的主题为出发点,来探究这些知识,产生有机的循环。由于你是自发性的对这个问题产生好奇和兴趣,所以你的态度和大学部的学生是截然不同的,你慢慢从被动的接受者变成是一个主动的探索者,并学会悠游在这学术的领域。
    我举一个例子,我们的中央研究院院长李远哲先生,得了诺贝尔奖。他曾经在中研院的周报写过几篇文章,在他的言论集里面,或许各位也可以看到,他反复提到他的故事。他是因为读了一个叫做马亨教授的教科书而去美国柏克莱大学念书,去了以后才发现,这个老师只给他一张支票,跟他说你要花钱你尽量用,但是从来不教他任何东西。可是隔壁那个教授,老师教很多,而且每天学生都是跟着老师学习。他有一次就跟那个老师抱怨:“那你为什么不教我点东西呢?”那个老师就说:“如果我知道结果,那我要你来这边念书做什么?我就是因为不知道,所以要我们共同探索一个问题、一个未知的领域。”他说其实这两种教法都有用处,但是他自己从这个什么都不教他,永远碰到他只问他“有没有什么新发现”的老师身上,得到很大的成长。所以这两方面都各自蕴含深层的道理,没有所谓的好坏,但是最好的方式就是将这两个方式结合起来。我为什么讲这个故事呢?就是强调在这个阶段,学习是一种“self-help”,并且是在老师的引导下学习“self-help”,而不能再像大学时代般,都是纯粹用听的,这个阶段的学习要基于对研究问题的好奇和兴趣,要带着一颗热忱的心来探索这个领域。
    然而研究生另外一个重要的阶段就是 Learn how to learn ,不只是学习而已,而是学习如何学习,不再是要去买一件很漂亮的衣服,而是要学习拿起那一根针,学会绣出一件漂亮的衣服,慢慢学习把目标放在一个标准上,而这一个标准就是你将来要完成硕士或博士论文。如果你到西方一流的大学去读书,你会觉得我这一篇论文可能要和全世界做同一个问题的人相比较。我想即使在非一流大学也应该要有这样的心情,你的标准不能单单只是放在旁边几个人而已,而应该是要放在领域的普遍人里面。你这篇文章要有新的东西,才算达到的标准,也才符合到我们刚刚讲到那张拉丁文的博士证书上面所讲的,有所贡献与创新。

二、一个老师怎么训练研究生
   
    身为老师你要怎么训练研究生。我认为人文科学和社会科学的训练,哪怕是自然科学的训练,到研究生阶段应该更像师徒制,所以来自个人和老师、个人和同侪间密切的互动和学习是非常重要的,跟大学部坐在那边单纯听课,听完就走人是不一样的,相较之下你的生活应该要和你所追求的知识与解答相结合,并且你往后的生活应该或多或少都和这个探索有相关。

(一)善用与老师的伙伴关系,不断 Research
    我常说英文 research 这个字非常有意义, search 是寻找,而 research 是再寻找,所以每个人都要 research ,不断的一遍一遍再寻找,并进而使你的生活和学习成为一体。中国近代兵学大师蒋百里在他的兵学书中曾说:“生活条件要跟战斗条件一致,近代欧洲凡生活与战斗条件一致者强,凡生活与战斗条件不一致者弱。”我就是藉由这个来说明研究生的生活,你的生活条件与你的战斗条件要一致,你的生活是跟着老师与同学共同成长的,当中你所听到的每一句话,都可能带给你无限的启发。
    回想当时我在美国念书的研究生生活,只要随便在楼梯口碰到任何一个人,他都有办法帮忙解答你语言上的困难,不管是英文、拉丁文、德文、希腊文 …… 所以能帮助解决问题的不单只是你的老师,还包括所有同学以及学习团体。你的学习是跟生活合在一起的。当我看到有学生呈现被动或是懈怠的时候,我就会用毛泽东的“革命不是请客吃饭!”来跟他讲:“作研究生不是请客吃饭。”

(二)藉由大量阅读和老师提点,进入研究领域
    怎样进入一个领域最好,我个人觉得只有两条路,其中一条就是让他不停地念书、不停地报告,这是进入一个陌生的领域最快,又最方便的方法,到最后不知不觉学生就会知道这个领域有些什么,我们在不停念书的时候常常可能会沉溺在细节里不能自拔,进而失去全景,导致见树不见林,或是被那几句英文困住,而忘记全局在讲什么。藉由学生的报告,老师可以讲述或是厘清其中的精华内容,经由老师几句提点,就会慢慢打通任督二脉,逐渐发展一种自发学习的能力,同时也知道碰到问题可以看哪些东西。就像是我在美国念书的时候,我修过一些我完全没有背景知识的国家历史,所以我就不停地念书、不停督促自己吸收,而老师也只是不停地开书目,运用这样的方式慢慢训练,有一天我不再研究它时,我发现自己仍然有自我生产及蓄发的能力,因为我知道这个学问大概是什么样的轮廓,碰到问题也有能力可以去查询相关的资料。所以努力让自己的学习产生自发的延展性是很重要的。

(三)循序渐进地练习论文写作
    到了硕士或博士最重要的一件事,是完成一篇学位论文,而不管是硕士或博士论文,其规模都远比你从小学以来所受的教育、所要写的东西都还要长得多,虽然我不知道教育方面的论文情况是如何,但是史学的论文都要写二、三十万字,不然就是十几二十万字。写这么大的一个篇幅,如何才能有条不紊、条理清楚,并把整体架构组织得通畅可读?首先,必须要从一千字、五千字、一万字循序渐进的训练,先从少的慢慢写成多的,而且要在很短的时间内训练到可以从一万字写到十万字。这么大规模的论文谁都写得出来,问题是写得好不好,因为这么大规模的写作,有这么许多的脚注,还要注意首尾相映,使论述一体成型,而不是散落一地的铜钱;是一间大礼堂,而不是一间小小分割的阁楼。为了完成一个大的、完整的、有机的架构模型,必须要从小规模的篇幅慢慢练习,这是一个最有效的办法。
    因为受计算机的影响,我发现很多学生写文章能力都大幅下降。写论文时很重要的一点是,文笔一定要清楚,不要花俏、不必漂亮,“清楚”是最高指导原则,经过慢慢练习会使你的文笔跟思考产生一致的连贯性。我常跟学生讲不必写的花俏,不必展现你散文的才能,因为这是学术论文,所以关键在于要写得非常清楚,如果有好的文笔当然更棒,但那是可遇不可求的,文彩像个人的生命一样,英文叫 style , style 本身就像个人一样带有一点点天生。因此最重要的还是把内容陈述清楚,从一万字到最后十万字的东西,都要架构井然、论述清楚、文笔清晰。
    我在念书的时候,有一位欧洲史、英国史的大师 Lawrence Stone ,他目前已经过世了,曾经有一本书访问十位最了不起的史学家,我记得他在访问中说了一句非常吸引人注意的话,他说他英文文笔相当好,所以他一辈子没有被退过稿。因此文笔清楚或是文笔好,对于将来文章可被接受的程度有举足轻重的地位。内容非常重要,有好的表达工具更是具有加分的作用,但是这里不是讲究漂亮的 style ,而是论述清楚。

(一)尝试接受挑战,勇于克服
    研究生如何训练自己?就是每天、每周或每个月给自己一个挑战,要每隔一段时间就给自己一个挑战,挑战一个你做不到的东西,你不一定要求自己每次都能顺利克服那个挑战,但是要努力去尝试。我在我求学的生涯中,碰到太多聪明但却一无所成的人,因为他们很容易困在自己的障碍里面,举例来说,我在普林斯顿大学碰到一个很聪明的人,他就是没办法克服他给自己的挑战,他就总是东看西看,虽然我也有这个毛病,可是我会定期给我自己一个挑战,例如:我会告诉自己,在某一个期限内,无论如何一定要把这三行字改掉,或是这个礼拜一定要把这篇草稿写完,虽然我仍然常常写不完,但是有这个挑战跟没这个挑战是不一样的,因为我挑战三次总会完成一次,完成一次就够了,就足以表示克服了自己,如果觉得每一个礼拜的挑战,可行性太低,可以把时间延长为一个月的挑战,去挑战原来的你,不一定能做到的事情。不过也要切记,硕士生是刚开始进入这一个领域的新手,如果一开始问题太小,或是问题大到不能控制,都会造成以后研究的困难。

(二)论文的写作是个训练过程,不能苛求完成经典之作
    各位要记得我以前的老师所说的一句话:“硕士跟博士是一个训练的过程,硕士跟博士不是写经典之作的过程。”我看过很多人,包括我的亲戚朋友们,他之所以没有办法好好地完成硕士论文,或是博士论文,就是因为他把它当成在写经典之作的过程,虽然事实上,很多人一生最好的作品就是硕士论文或博士论文,因为之后的时间很难再有三年或六年的时间,沉浸在一个主题里反复的耕耘,当你做教授的时候,像我今天被行政缠身,你不再有充裕的时间好好探究一个问题,尤其做教授还要指导学生、上课,因此非常的忙碌,所以他一生最集中又精华的时间,当然就是他写博士、或是硕士论文的时候,而那一本成为他一生中最重要的著作也就一点都不奇怪了。
    不一定要刻意强求,要有这是一个训练过程的信念,应该清楚知道从哪里开始,也要知道从哪里放手,不要无限的追下去。当然我不是否认这个过程的重要性,只是要调整自己的心态,把论文的完成当成一个目标,不要成为是一种的心理障碍或是心理负担。这方面有太多的例子了,我在普林斯顿大学念书的时候,那边旧书摊有一位非常博学多文的旧书店老板,我常常赞叹地对他说:“你为什么不要在大学做教授。”他说:“因为那篇博士论文没有写完。”原因在于他把那个博士论文当成要写一本经典,那当然永远写不完。如果真能写成经典那是最好,就像美丽新境界那部电影的男主角 John Nash 一样,一生最大的贡献就是博士那二十几页的论文,不过切记不要把那个当作是目标,因为那是自然而然形成的,应该要坚定的告诉自己,所要完成的是一份结构严谨、论述清楚与言之有物的论文,不要一开始就期待它是经典之作。如果你期待它是经典之作,你可能会变成我所看到的那位旧书摊的老板,至于我为什么知道他有那么多学问,是因为那时候我在找一本书,但它并没有在旧书店里面,不过他告诉我:“还有很多本都跟他不相上下。”后来我对那个领域稍稍懂了之后,证明确实如他所建议的那般。一个旧书店的老板精熟每一本书,可是他就是永远无法完成,他梦幻般的学位论文,因为他不知道要在哪里放手,这一切都只成为空谈。

(三)论文的正式写作

1. 学习有所取舍
    到了写论文的时候,要能取也要能舍,因为现在信息爆炸,可以看的书太多,所以一定要建构一个属于自己的知识树,首先,要有一棵自己的知识树,才能在那棵树挂相关的东西,但千万不要不断的挂不相关的东西,而且要慢慢的舍掉一些挂不上去的东西,再随着你的问题跟关心的领域,让这棵知识树有主干和枝叶。然而这棵知识树要如何形成?第一步你必须对所关心的领域中,有用的书籍或是数据非常熟悉。

2. 形成你的知识树
    我昨天还请教林毓生院士,他今年已经七十几岁了,我告诉他我今天要来作演讲,就问他:“你如果讲这个题目你要怎么讲?”他说:“只有一点,就是那重要的五、六本书要读好几遍。”因为林毓生先生是海耶克,还有几位近代思想大师在芝加哥大学的学生,他们受的训练中很重要的一部份是精读原典。这句话很有道理,虽然你不可能只读那几本重要的书,但是那五、六本书将逐渐形成你知识树的主干,此后的东西要挂在上面,都可以参照这一个架构,然后把不相干的东西暂放一边。生也有涯,知也无涯,你不可能读遍天下所有的好书,所以要学习取舍,了解自己无法看遍所有有兴趣的书,而且一但看遍所有有兴趣的书,很可能就会落得普林斯顿街上的那位旧书店的老板一般,因为阅读太多不是自己所关心的领域的知识,它对于你来说只是一地的散钱。

3. 掌握工具
    在这个阶段一定要掌握语文与合适的工具。要有一个外语可以非常流畅的阅读,要有另外一个语文至少可以看得懂文章的标题,能学更多当然更好,但是至少要有一个语文,不管是英文、日文、法文 ……,一定要有一个语文能够非常流畅的阅读相关书籍,这是起码的前提。一旦这个工具没有了,你的视野就会因此大受限制,因为语文就如同是一扇天窗,没有这个天窗你这房间就封闭住了。为什么你要看得懂标题?因为这样才不会有重要的文章而你不知道,如果你连标题都看不懂,你就不知道如何找人来帮你或是自己查相关的数据。其它的工具,不管是统计或是其它的任何工具,你也一定要多掌握,因为你将来没有时间再把这样的工具学会。

4. 突破学科间的界线
    应该要把跨学科的学习当作是一件很重要的事,但是跨学科涉及到的东西必须要对你这棵知识树有帮助,要学会到别的领域稍微偷打几枪,到别的领域去摄取一些概念,对于本身关心的问题产生另一种不同的启发,可是不要泛滥无所归。为什么要去偷打那几枪?近几十年来,人们发现不管是科学或人文,最有创新的部份是发生在学科交会的地方。为什么会如此?因为我们现在的所有学科大部分都在西方十九世纪形成的,而中国再把它转借过来。十九世纪形成这些知识学科的划分的时候,很多都带有那个时代的思想跟学术背景,比如说,中研院的李院长的专长就是物理化学,他之所以得诺贝尔奖就是他在物理和化学的交界处做工作。像诺贝尔经济奖,这二十年来所颁的奖,如果在传统的经济学奖来看就是旁门走道,古典经济学岂会有这些东西,甚至心理学家也得诺贝尔经济奖,连 John Nash 这位数学家也得诺贝尔经济奖,为什么?因为他们都在学科的交界上,学科跟学科、平台跟平台的交界之处有所突破。在平台本身、在学科原本最核心的地方已经 search 太多次了,因此不一定能有很大的创新,所以为什么跨领域学习是一件很重要的事情。
    常常一篇硕士论文或博士论文最重要、最关键的,是那一个统摄性的重要概念,而通常你在本学科里面抓不到,是因为你已经泡在这个学科里面太久了,你已经拿着手电筒在这个小仓库里面照来照去照太久了,而忘了还有别的东西可以更好解释你这些材料的现象,不过这些东西可遇而不可求。 John Nash 这一位数学家为什么会得诺贝尔数学奖?为什么他在赛局理论的博士论文,会在数十年之后得诺贝尔经济奖?因为他在大学时代上经济学导论的课,所以他认为数学可以用在经济方面来思考,而这个东西在一开始,他也没有想到会有这么大的用处。他是在数学和经济学的知识交界之处做突破。有时候在经济学这一个部分没有大关系,在数学的这一个部分也没有大关系,不过两个加在一起,火花就会蹦出来。

5. 论文题目要有延展性
    对一个硕士生或博士生来说,如果选错了题目,就是失败,题目选对了,还有百分之七十胜利的机会。这个问题值得研一、博一的学生好好思考。你的第一年其实就是要花在这上面,你要不断的跟老师商量寻找一个有意义、有延展性的问题,而且不要太难。我在国科会当过人文处长,当我离开的时候,每次就有七千件申请案,就有一万四千个袋子,就要送给一万四千个教授审查。我当然不可能看那么多,可是我有个重要的任务,就是要看申诉。有些申诉者认为:“我的研究计划很好,我的著作很好,所以我来申诉。”申诉通过的大概只有百分之十,那么我的责任就是在百分之九十未通过的案子正式判决前,再拿来看一看。有几个印象最深常常被拿出来讨论的,就是这个题目不必再做了、这个题目本身没有发展性,所以使我更加确认选对一个有意义、有延展性、可控制、可以经营的题目是非常重要的。
    我的学生常常选非常难的题目,我说你千万不要这样,因为没有人会仔细去看你研究的困难度,对于难的题目你要花更多的时间阅读史料,才能得到一点点东西;要挤很多东西,才能筛选出一点点内容,所以你最好选择一个难易适中的题目。
    我写过好几本书,我认为我对每一本书的花的心力都是一样,虽然我写任何东西我都不满意,但是在过程中我都绞尽脑汁希望把他写好。目前为止很多人认为我最好的书,是我二十几岁刚到史语所那一年所写的那本书。我在那本书花的时间并不长,那本书的大部分的稿子,是我和许添明老师同时在当兵的军营里面写的,而且还是用我以前旧的笔记写的。大陆这些年有许多出版社,反复要求出版我以前的书,尤其是这一本,我说:“不行。”因为我用的是我以前的读书笔记,我怕引文有错字,因为在军队营区里面随时都要出操、随时就要集合,手边又没有书,怎么可能好好的去核对呢?而如果要我重新校正一遍,又因为引用太多书,实在没有力气校正。
    为什么举这个例子呢?我后来想一想,那本书之所以比较好,可能是因为那个题目可延展性大,那个题目波澜起伏的可能性大。很多人都认为,我最好的书应该是剑桥大学出的那一本,不过我认为我最好的书一定是用中文写的,因为这个语文我能掌握,英文我没办法掌握得出神入化。读、写任何语文一定要练习到你能带着三分随意,那时候你才可以说对于这一个语文完全理解与精熟,如果你还无法达到三分的随意,就表示你还在摸索。
    回到我刚刚讲的,其实每一本书、每一篇论文我都很想把它写好。但是有些东西没办法写好,为什么?因为一开始选择的题目不够好。因此唯有选定题目以后,你的所有训练跟努力才有价值。我在这里建议大家,选题的工作要尽早做,所选的题目所要处理的材料最好要集中,不要太分散,因为硕士生可能只有三年、博士生可能只有五年,如果你的材料太不集中,读书或看数据可能就要花掉你大部分的时间,让你没有余力思考。而且这个题目要适合你的性向,如果你不会统计学或讨厌数字,但却选了一个全都要靠统计的论文,那是不可能做得好。

6. 养成遵照学术格式的写作习惯
    另一个最基本的训练,就是平时不管你写一万字、三万字、五万字都要养成遵照学术规范的习惯,要让他自然天成,就是说你论文的脚注、格式,在一开始进入研究生的阶段就要培养成为你生命中的一个部份,如果这个习惯没有养成,人家就会觉得这个论文不严谨,之后修改也要花很多时间,因为你的论文规模很大,可能几百页,如果一开始弄错了,后来再重头改到尾,一定很耗时费力,因此要在一开始就养成习惯,因为我们是在写论文而不是在写散文,哪一个逗点应该在哪里、哪一个书名号该在哪里、哪一个地方要用引号、哪一个要什么标点符号,都有一定的规定,用中文写还好,用英文有一大堆简称。在 1960 年代***知识还很封闭的时候,有一个人从美国回来就说:“美国有个不得了的情形,因为有一个人非常不得了。”有人问他为什么不得了,他说:“因为这个人的作品到处被引用。”他的名字就叫 ibid 。所谓 ibid 就是同前作者,这个字是从拉丁文发展出来的,拉丁文有一大堆简称,像 et. al. 就是两人共同编的。英文有一本 The Chicago Manual of Style 就是专门说明这一些写作规范。各位要尽早学会中英文的写作规范,慢慢练习,最后随性下笔,就能写出符合规范的文章。

7. 善用图书馆
    图书馆应该是研究生阶段最重要的地方,不必读每一本书,可是要知道有哪些书。我记得我做学生时,新进的书都会放在图书馆的墙上,而身为学生最重要的事情,就是要把书名看一看。在某些程度上知道书皮就够了,但是这仍和打计算机是不一样的,你要实际上熟悉一下那本书,摸一下,看一眼目录。我知道现在从计算机就可以查到书名,可是我还是非常珍惜这种定期去 browse 新到的书的感觉,或去看看相关领域的书长成什么样子。中研院有一位院士是哈佛大学信息教授,他告诉我他在创造力最高峰的时候,每个礼拜都到他们信息系图书室里,翻阅重要的信息期刊。所以图书馆应该是身为研究生的人们,最熟悉的地方。不过切记不重要的不要花时间去看,你们生活在信息泛滥的时代,跟我生长在信息贫乏的时代是不同的,所以生长在这一个时代的你,要能有所取舍。我常常看我的学生引用一些三流的论文,却引得津津有味,我都替他感到难过,因为我强调要读有用、有价值的东西。

8. 留下时间,精致思考
    还要记得给自己保留一些思考的时间。一篇论文能不能出神入化、能不能引人入胜,很重要的是在现象之上作概念性的思考,但我不是说一定要走理论的路线,而是提醒大家要在一般的层次再提升两三步, conceptualize 你所看到的东西。真切去了解,你所看到的东西是什么?整体意义是什么?整体的轮廓是什么?千万不要被枝节淹没,虽然枝节是你最重要的开始,但是你一天总也要留一些时间好好思考、慢慢沉淀。 conceptualize 是一种非常难教的东西,我记得我念书时,有位老师信誓旦旦说要开一门课,教学生如何 conceptualize ,可是从来都没开成,因为这非常难教。我要提醒的是,在被很多材料和枝节淹没的时候,要适时跳出来想一想,所看到的东西有哪些意义?这个意义有没有广泛连结到更大层面的知识价值。
    傅斯年先生来到***以后,同时担任中央研究院历史语言研究所的所长及台大的校长。台大有个傅钟每小时钟声有二十一响、敲二十一次。以前有一个人,写了一本书叫《钟声二十一响》,当时很轰动。他当时对这二十一响解释是说:因为台大的学生都很好,所以二十一响是欢迎国家元首二十一响的礼炮。不久前我发现台大在每一个重要的古迹下面竖一个铜牌,我仔细看看傅钟下的解释,才知道原来是因为傅斯年当台大校长的时候,曾经说过一句话:“人一天只有二十一个小时,另外三小时是要思考的。”所以才叫二十一响。我觉得这句话大有道理,可是我觉得三小时可能太多,因为研究生是非常忙的,但至少每天要留个三十分钟、一小时思考,想一想你看到了什么?学习跳到比你所看到的东西更高一点的层次去思考。

9. 找到学习的楷模
    我刚到美国念书的时候,每次写报告头皮就重的不得了,因为我们的英文报告三、四十页,一个学期有四门课的话就有一百六十页,可是你连脚注都要从头学习。后来我找到一个好办法,就是我每次要写的时候,把一篇我最喜欢的论文放在旁边,虽然他写的题目跟我写的都没关系,不过我每次都看他如何写,看看他的注脚、读几行,然后我就开始写。就像最有名的男高音 Pavarotti 唱歌剧的时候都会捏着一条手帕,因为他说:“上舞台就像下地狱,太紧张了。”他为了克服紧张,他有习惯性的动作,就是捏着白手帕。我想当年那一篇论文抽印本就像是我的白手帕一样,能让我开始好好写这篇报告,我学习它里面如何思考、如何构思、如何照顾全体、如何用英文作脚注。好好的把一位大师的作品读完,开始模仿和学习他,是入门最好的方法,逐步的,你也开始写出自己的东西。我也常常鼓励我的学生,出国半年或是一年到国外看看。像现在国科会有各式各样的机会,可以增长眼界,可以知道现在的餐馆正在卖些什么菜,回来后自己要作菜也才知道要如何着手。

四、用两条腿走路,练习培养自己的兴趣
   
    最后还有一点很重要的,就是我们的人生是两只脚,我们不是靠一只脚走路。做研究生的时代,固然应该把所有的心思都放在学业上,探索你所要探索的那些问题,可是那只是你的一只脚,另外还有一只脚是要学习培养一、两种兴趣。很多人后来会发现他的右脚特别肥重(包括我自己在内),也就是因为忘了培养左脚。很多很有名的大学者最后都陷入极度的精神困扰之中,就是因为他只是培养他的右脚,他忘了培养他的左脚,他忘了人生用两只脚走路,他少了一个小小的兴趣或嗜好,用来好好的调解或是排遣自己。
    去年夏天,香港《亚洲周刊》要访问我,我说:“我不想接受访问,我不是重要的人。”可是后来他们还是把一个简单的对话刊出来了,里面我只记得讲了一段话:做一个研究生或一个学者,有两个感觉最重要 -- 责任感与罪恶感。你一定要有很大的责任感,去写出好的东西,如果责任感还不够强,还要有一个罪恶感,你会觉得如果今天没有好好做几个小时的工作的话,会有很大的罪恶感。除非是了不得的天才,不然即使爱因斯坦也是需要很努力的。很多很了不得的人,他只是把所有的努力集中在一百页里面,他花了一千小时和另外一个人只花了十个小时,相对于来说,当然是那花一千个小时所写出来的文章较好。所以为什么说要赶快选定题目?因为如果太晚选定一个题目,只有一年的时间可以好好耕耘那个题目,早点选定可以有二、三年耕耘那个题目,是三年做出的东西好,还是一年的东西好?如果我们的才智都一样的话,将三年的努力与思考都灌在上面,当然比一年还要好。

五、营造卓越的大学,分享学术的氛围
    现在很多人都在讨论,何谓卓越的大学?我认为一个好的大学,学校生活的一大部份,以及校园的许多活动,直接或间接都与学问有关,同学在咖啡厅里面谈论的,直接或间接也都会是学术相关的议题。教授们在餐厅里面吃饭,谈的是“有没有新的发现”?或是哪个人那天演讲到底讲了什么重要的想法?一定是沉浸在这种氛围中的大学,才有可能成为卓越大学。那种交换思想学识、那种互相教育的气氛不是花钱就有办法获得的。我知道钱固然重要,但不是唯一的东西。一个卓越的大学、一个好的大学、一个好的学习环境,表示里面有一个共同关心的焦点,如果没有的话,这个学校就不可能成为好的大学。




 
热血最强 @ 2008-11-27 21:45

三十五个经典句型 帮你过写作关(看完回帖哦)


一、~~~ the + ~ est +名词+ (that) +主词+ have ever + seen ( known/heard/had/read, etc)

  ~~~ the most +形容词+名词+ (that) +主词+ have ever + seen ( known/heard/had/read, etc)

  例句:Helen is the most beautiful girl that I have ever seen.

  海伦是我所看过最美丽的女孩。

  Mr. Chang is the kindest teacher that I have ever had.

  张老师是我曾经遇到最仁慈的教师。

e>  二、Nothing is + ~~~ er than to + V

  Nothing is + more +形容词+ than to + V

  例句:Nothing is more important than to receive education.

  没有比接受教育更重要的事。

  三、~~~ cannot emphasize the importance of ~~~ too much.

  (再怎么强调...的重要性也不为过。)

  例句:We cannot emphasize the importance of protecting our eyes too much.

  我们再怎么强调保护眼睛的重要性也不为过。

  四、There is no denying that + S + V ...(不可否认的...)

  例句:There is no denying that the qualities of our living have gone from bad to worse.

  不可否认的,我们的生活品质已经每况愈下。

  五、It is universally acknowledged that +句子~~(全世界都知道...)

  例句:It is universally acknowledged that trees are indispensable to us.

  全世界都知道树木对我们是不可或缺的。

  六、There is no doubt that +句子~~(毫无疑问的...)

  例句:There is no doubt that our educational system leaves something to be desired.

  毫无疑问的我们的教育制度令人不满意。

  七、An advantage of ~~~ is that +句子(...的优点是...)

  例句:An advantage of using the solar energy is that it won‘t create (produce) any pollution.

  使用太阳能的优点是它不会制造任何污染。

  八、The reason why +句子~~~ is that +句子(...的原因是...)

  例句:The reason why we have to grow trees is that they can provide us with fresh air.

  The reason why we have to grow trees is that they can supply fresh air for us.

  我们必须种树的原因是它们能供应我们新鲜的空气。

  九、So +形容词+ be +主词+ that +句子(如此...以致于...)

  例句:So precious is time that we can‘t afford to waste it.

  时间是如此珍贵,我们经不起浪费它。

  十、Adj + as + Subject(主词)+ be, S + V~~~(虽然...)

  例句:Rich as our country is, the qualities of our living are by no means satisfactory.

  {by no means = in no way = on no account一点也不}

  虽然我们的国家富有,我们的生活品质绝对令人不满意。

  十一、The + ~er + S + V, ~~~ the + ~er + S + V ~~~

  The + more + Adj + S + V, ~~~ the + more + Adj + S + V ~~~(愈...愈...)

  例句:The harder you work, the more progress you make.

  你愈努力,你愈进步。

  The more books we read, the more learned we become.

  我们书读愈多,我们愈有学问。

  十二、By +Ving, ~~ can ~~(借着...,..能够..)

  例句:By taking exercise, we can always stay healthy.

  借着做运动,我们能够始终保持健康。

  十三、~~~ enable + Object(受词)+ to + V(..使..能够..)

  例句:Listening to music enable us to feel relaxed.

  听音乐使我们能够感觉轻松。

  十四、On no account can we + V ~~~(我们绝对不能...)

  例句:On no account can we ignore the value of knowledge.

  我们绝对不能忽略知识的价值。

  十五、It is time + S +过去式(该是...的时候了)

  例句:It is time the authorities concerned took proper steps to solve the traffic problems.

  该是有关当局采取适当的措施来解决交通问题的时候了。

  十六、Those who ~~~(...的人...)

  例句:Those who violate traffic regulations should be punished.

  违反交通规定的人应该受处罚。

  十七、There is no one but ~~~(没有人不...)

  例句:There is no one but longs to go to college.

  没有人不渴望上大学。

  十八、be + forced/compelled/obliged + to + V(不得不...)

  例句:Since the examination is around the corner, I am compelled to give up doing sports. 

  既然考试迫在眉睫,我不得不放弃做运动。

  十九、It is conceivable that +句子(可想而知的)

  It is obvious that +句子(明显的)

  It is apparent that +句子(显然的)

  例句:It is conceivable that knowledge plays an important role in our life.

  可想而知,知识在我们的一生中扮演一个重要的角色。

  二十、That is the reason why ~~~(那就是...的原因)

  例句:Summer is sultry. That is the reason why I don‘t like it.

  夏天很燠热。那就是我不喜欢它的原因。

  二十一、For the past +时间,S +现在完成式...(过去...年来,...一直...)

  例句:For the past two years, I have been busy preparing for the examination.

  过去两年来,我一直忙着准备考试。

  二十二、Since + S +过去式,S +现在完成式。

  例句:Since he went to senior high school, he has worked very hard.

  自从他上高中,他一直很用功。

  二十三、It pays to + V ~~~(...是值得的。)

  例句:It pays to help others.

  帮助别人是值得的。

  二十四、be based on(以...为基础)

  例句:The progress of thee society is based on harmony.

  社会的进步是以和谐为基础的。

  二十五、Spare no effort to + V(不遗余力的)

  We should spare no effort to beautify our environment.

  我们应该不遗余力的美化我们的环境。

  二十六、bring home to +人+事(让...明白...事)

  例句:We should bring home to people the value of working hard.

  我们应该让人们明白努力的价值。

  二十七、be closely related to ~~(与...息息相关)

  例句:Taking exercise is closely related to health.

  做运动与健康息息相关。

  二十八、Get into the habit of + Ving

  = make it a rule to + V(养成...的习惯)

  We should get into the habit of keeping good hours.

  我们应该养成早睡早起的习惯。

  二十九、Due to/Owing to/Thanks to + N/Ving, ~~~(因为...)

  例句:Thanks to his encouragement, I finally realized my dream.

  因为他的鼓励,我终于实现我的梦想。

  三十、What a + Adj + N + S + V!= How + Adj + a + N + V!(多么...!)

  例句:What an important thing it is to keep our promise!

  How important a thing it is to keep our promise!

  遵守诺言是多么重要的事!

  三十一、Leave much to be desired(令人不满意)

  例句:The condition of our traffic leaves much to be desired.

  我们的交通状况令人不满意。

  三十二、Have a great influence on ~~~(对...有很大的影响)

  例句:Smoking has a great influence on our health.

  抽烟对我们的健康有很大的影响。

  三十三、do good to(对...有益),do harm to(对...有害)

  例句:Reading does good to our mind.读书对心灵有益。

  Overwork does harm to health.工作过度对健康有害。

  三十四、Pose a great threat to ~~(对...造成一大威胁)

  例句:Pollution poses a great threat to our existence.

  污染对我们的生存造成一大威胁。

  三十五、do one‘s utmost to + V = do one‘s best(尽全力去...)

  例句:We should do our utmost to achieve our goal in life.

  我们应尽全力去达成我们的人生目标



 
热血最强 @ 2008-07-18 10:55

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://citynight.blogbus.com/logs/11648949.html

linux下面用c++写代码,在所难免会遇到segmentation fault (段错误)。个人在编写ns扩展模块时候,遇到过很多段错误,虽然运行时刻经常由程序抛出段错误,但是段错误的发生的程序级别的原因多种多样,不过归结到系统级别上,段错误都是由于内存原因引起的(个人总结)。

会造成内存错误的程序级别的原因,也就是我们程序员所经常犯的错误大致可以分为以下几个方面:
1,使用未初始化的指针 - 这是必然的,指针指空的东西,必然出错。
2,重复删除一个指针 - 必然,再次删除就会删除一个已经分配给别的程序的数据或者其他。
3,内存冲突 - 由于程序声明的两块数据区域重叠,造成混乱。
4,混杂的指针错误 - 只能具体问题具体分析,情况比较复杂。

对于一位刚开始用c++在linux编程的人来说,最常遇到的应该的就是1与2了。当工程规模比较大,程序由小组完成而后整合等的情况下,很容易出现2,3,4的情况。这时候的调试比较麻烦,也需要很多耐心。

我在做的wimax mesh的项目就是这样。对于一个timer的使用,没有初始化,造成的段错误,一目了然。工程进展非常顺利。当工程做到50%时候(11.08号),遇到了一个段错误,结果调试到12.02号才调出来!我就来说一下我的调试历程吧!真是一波三折阿!开始的时候以为是1或者2的情况,反复检查,不是这样。然后怀疑3或者4,结果由于没有使用任何工具,只是在代码中加打印信息,这时候只能把错误定位到transmit(p)这个函数上。但是这个函数我只写了一行,就是
transmit(p)
{
     downtarget_->recv(p,(Handle*)NULL);
}
程序在这个地方出错实在让人摸不到头绪,因为再往下执行就不是我代码的问题了,而是下层已有代码甚至是系统代码的问题阿!非常困扰!
然后开始用gdb调试,gdb是一个很好的很强大的调试工具,我用的命令行的,所能完成的功能和vc下的调试工具差不多,只是需要看什么变量就是要用print ×××来看罢了,不过功能决不比它差。但是我用了gdb只能把错误定位在:
(gdb) bt
#0  0x082d16ba in CheckChannelErrors ()
#1  0x082d43a5 in Tcl_Write ()
#2  0x081cdb52 in BaseTrace::namdump (this=0x90e09d0) at trace/basetrace.cc:109
#3  0x08137aa4 in CMUTrace::nam_format (this=0x90e10b0, p=0x90fb860, offset=64) at trace/cmu-trace.cc:1123
#4  0x081384db in CMUTrace::format (this=0x90e10b0, p=0x90fb860, why=0x833ec34 "---") at trace/cmu-trace.cc:1137
#5  0x08138751 in CMUTrace::recv (this=0x90e10b0, p=0x90fb860, h=0x0) at trace/cmu-trace.cc:1239
#6  0x0821e9e7 in Mac802_16::mac_log (this=0x90d1f08, p=0x90fb860) at wimax/mac802_16.h:909
#7  0x082268e6 in Mac802_16MSS::receive (this=0x90d1f08) at wimax/mac802_16MSS.cc:660
#8  0x08228b08 in WimaxRxTimer::handle (this=0x90d29a4, e=0x90d29b4) at wimax/mac802_16timer.cc:98
#9  0x08054332 in Scheduler::dispatch (this=0x8eb6a10, p=0x90d29b4, t=10.017116268588) at common/scheduler.cc:150
#10 0x0805457e in Scheduler::run (this=0x8eb6a10) at common/scheduler.cc:129
#11 0x0805485d in Scheduler::command (this=0x8eb6a10, argc=2, argv=0xbfa20730) at common/scheduler.cc:198
#12 0x0828b7ae in TclClass::dispatch_cmd ()
#13 0x082903d0 in OTclDispatch (cd=<value optimized out>, in=0x8e97250, argc=3, argv=0xbfa2077c) at otcl.c:434
#14 0x0829712e in TclInvokeStringCommand ()
#15 0x08298c4b in TclEvalObjvInternal ()
#16 0x082c2ef1 in TclExecuteByteCode ()
#17 0x082c6d1c in TclCompEvalObj ()
#18 0x082c2fca in TclExecuteByteCode ()
#19 0x082c6d1c in TclCompEvalObj ()
#20 0x082eec76 in TclObjInterpProc ()
#21 0x082ef092 in TclProcInterpProc ()
#22 0x08290520 in OTclDispatch (cd=<value optimized out>, in=0x8e97250, argc=2, argv=0xbfa2131c) at otcl.c:477
#23 0x0829712e in TclInvokeStringCommand ()
#24 0x08298c4b in TclEvalObjvInternal ()
#25 0x082c2ef1 in TclExecuteByteCode ()
#26 0x082c6d1c in TclCompEvalObj ()
#27 0x082eec76 in TclObjInterpProc ()
#28 0x082ef092 in TclProcInterpProc ()
#29 0x082903d0 in OTclDispatch (cd=<value optimized out>, in=0x8e97250, argc=2, argv=0xbfa21c2c) at otcl.c:434
#30 0x0829712e in TclInvokeStringCommand ()
#31 0x08298c4b in TclEvalObjvInternal ()
#32 0x08299207 in Tcl_EvalEx ()
#33 0x082ded12 in Tcl_FSEvalFile ()
#34 0x082e2307 in Tcl_Main ()
#35 0x0804cafc in main (argc=2747804, argv=0x178b62) at common/tclAppInit.cc:67

这让我更加不解,为什么会在调用ns原有代码的地方出问题呢???后来决定再换一个工具。用valgrind

在这里我先贴一下valgrind的用法,我自己搜到的,很详细的。姑且就不自己写了。
============================================

Valgrind

Valgrind 已经在 Linux 应用程序开发社区中广泛用来调试应用程序。它尤其擅长发现内存管理的问题。它可以检查程序运行时的内存泄漏问题。这个工具目前正由 Julian Seward 进行开发,并由 Paul Mackerras 移植到了 Power 架构上。

要安装 Valgrind,请从 Valgrind 的 Web 站点上下载源代码(参阅 参考资料)。切换到 Valgrind 目录,并执行下面的命令:

# make
# make check
# make install

堆栈分析器,它能测量程序在堆栈中使用了多少内存,告诉我们堆块,堆管理块和栈的大小。Massif能帮助我们减少内存的使用,在带有虚拟内存的现代系统中,它还能够加速我们程序的运行,减少程序停留在交换区中的几率。

Valgrind 安装

1、 到www.valgrind.org下载最新版valgrind-3.2.3.tar.bz2
2、 解压安装包:tar –jxvf valgrind-3.2.3.tar.bz2
3、 解压后生成目录valgrind-3.2.3
4、 cd valgrind-3.2.3
5、 ./configure
6、 Make;make install

Valgrind 使用

用法: valgrind [options] prog-and-args [options]: 常用选项,适用于所有Valgrind工具

  1. -tool=<name> 最常用的选项。运行 valgrind中名为toolname的工具。默认memcheck。
  2. h –help 显示帮助信息。
  3. -version 显示valgrind内核的版本,每个工具都有各自的版本。
  4. q –quiet 安静地运行,只打印错误信息。
  5. v –verbose 更详细的信息, 增加错误数统计。
  6. -trace-children=no|yes 跟踪子线程? [no]
  7. -track-fds=no|yes 跟踪打开的文件描述?[no]
  8. -time-stamp=no|yes 增加时间戳到LOG信息? [no]
  9. -log-fd=<number> 输出LOG到描述符文件 [2=stderr]
  10. -log-file=<file> 将输出的信息写入到filename.PID的文件里,PID是运行程序的进行ID
  11. -log-file-exactly=<file> 输出LOG信息到 file
  12. -log-file-qualifier=<VAR> 取得环境变量的值来做为输出信息的文件名。 [none]
  13. -log-socket=ipaddr:port 输出LOG到socket ,ipaddr:port

LOG信息输出

  1. -xml=yes 将信息以xml格式输出,只有memcheck可用
  2. -num-callers=<number> show <number> callers in stack traces [12]
  3. -error-limit=no|yes 如果太多错误,则停止显示新错误? [yes]
  4. -error-exitcode=<number> 如果发现错误则返回错误代码 [0=disable]
  5. -db-attach=no|yes 当出现错误,valgrind会自动启动调试器gdb。[no]
  6. -db-command=<command> 启动调试器的命令行选项[gdb -nw %f %p]

适用于Memcheck工具的相关选项:

  1. -leak-check=no|summary|full 要求对leak给出详细信息? [summary]
  2. -leak-resolution=low|med|high how much bt merging in leak check [low]
  3. -show-reachable=no|yes show reachable blocks in leak check? [no]

 

Valgrind 的错误报告

Valgrind 的输出格式如下:


清单 1. Valgrind 的输出消息
                
# valgrind du –x –s
.
.
==29404==  Address 0x1189AD84 is 0 bytes after a block of size 12 alloc'd
==29404==    at 0xFFB9964: malloc (vg_replace_malloc.c:130)
==29404==    by 0xFEE1AD0: strdup (in /lib/tls/libc.so.6)
==29404==    by 0xFE94D30: setlocale (in /lib/tls/libc.so.6)
==29404==    by 0x10001414: main (in /usr/bin/du)

==29404== 是进程的 ID。消息 Address 0x1189AD84 is 0 bytes after a block of size 12 alloc'd 说明在这个 12 字节的数组后面没有存储空间了。第二行以及后续几行说明内存是在 130 行(vg_replace_malloc.c)的 strdup() 程序中进行分配的。strdup() 是在 libc.so.6 库的 setlocale() 中调用的;main() 调用了 setlocale()

未初始化的内存

最为常见的一个 bug 是程序使用了未初始化的内存。未初始化的数据可能来源于:

  • 未经初始化的变量
  • malloc 函数所分配的数据,在写入值之前使用了

 

下面这个例子使用了一个未初始化的数组:


清单 2. 使用未初始化的内存
                
      2 {
      3         int i[5];
      4 
      5         if (i[0] == 0)
      6                 i[1]=1;
      7         return 0;
      8 }

在这个例子中,整数数组 i[5] 没有进行初始化;因此,i[0] 包含的是一个随机数。因此使用 i[0] 的值来判断一个条件分支就会导致不可预期的问题。Valgrind 可以很容易捕获这种错误条件。当您使用 Valgrind 运行这个程序时,就会接收到下面的消息:


清单 3. Valgrind 的输出消息
                
# gcc –g –o test1 test1.c
# valgrind ./test1
.
.
==31363== 
==31363== Conditional jump or move depends on uninitialised value(s)
==31363==    at 0x1000041C: main (test1.c:5)
==31363== 
==31363== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 7 from 1)
==31363== malloc/free: in use at exit: 0 bytes in 0 blocks.
==31363== malloc/free: 0 allocs, 0 frees, 0 bytes allocated.
==31363== For counts of detected errors, rerun with: -v
==31363== No malloc'd blocks -- no leaks are possible.

Valgrind 的输出说明,有一个条件分支依赖于文件 test1.c 中第 5 行中的一个未初始化的变量。

内存泄漏

内存泄漏是另外一个常见的问题,也是很多程序中最难判断的问题。内存泄漏的主要表现为:当程序连续运行时,与程序相关的内存(或堆)变得越来越大。结果是,当这个程序所消耗的内存达到系统的上限时,就会自己崩溃;或者会出现更严重的情况:挂起或导致系统崩溃。下面是一个有内存泄漏 bug 的示例程序:


清单 4. 内存泄漏示例
                
      1 int main(void)
      2 {
      3         char *p1;
      4         char *p2;
      5 
      6         p1 = (char *) malloc(512);
      7         p2 = (char *) malloc(512);
      8 
      9         p1=p2;
     10 
     11         free(p1);
     12         free(p2);
     13 }

上面的代码分别给字符指针 p1 和 p2 分配了两个 512 字节的内存块,然后将指向第一个内存块的指针设置为指向第二个内存块。结果是,第二个内存块的地址丢失了,并导致内存泄漏。在使用 Valgrind 运行这个程序时,会返回如下的消息:


清单 5. Valgrind 的输出消息
                
# gcc –g –o test2 test2.c
# valgrind ./test2
.
.
==31468== Invalid free() / delete / delete[]
==31468==    at 0xFFB9FF0: free (vg_replace_malloc.c:152)
==31468==    by 0x100004B0: main (test2.c:12)
==31468== Address 0x11899258 is 0 bytes inside a block of size 512 free'd
==31468==    at 0xFFB9FF0: free (vg_replace_malloc.c:152)
==31468==    by 0x100004A4: main (test2.c:11)
==31468== 
==31468== ERROR SUMMARY: 1 errors from 1 contexts (suppressed: 7 from 1)
==31468== malloc/free: in use at exit: 512 bytes in 1 blocks.
==31468== malloc/free: 2 allocs, 2 frees, 1024 bytes allocated.
==31468== For counts of detected errors, rerun with: -v
==31468== searching for pointers to 1 not-freed blocks.
==31468== checked 167936 bytes.
==31468== 
==31468== LEAK SUMMARY:
==31468==    definitely lost: 512 bytes in 1 blocks.
==31468==      possibly lost: 0 bytes in 0 blocks.
==31468==    still reachable: 0 bytes in 0 blocks.
==31468==         suppressed: 0 bytes in 0 blocks.
==31468== Use --leak-check=full to see details of leaked memory.

正如您可以看到的一样,Valgrind 报告说这个程序中有 512 字节的内存丢失了。

非法写/读

这种情况发生在程序试图对一个不属于程序本身的内存地址进行读写时。在有些系统上,在发生这种错误时,程序会异常结束,并产生一个段错误。下面这个例子就是一个常见的 bug,它试图读写一个超出数组边界的元素。


清单 6. 非法读写
                
      1 int main() {
      2         int i, *iw, *ir;
      3 
      4         iw = (int *)malloc(10*sizeof(int));
      5         ir = (int *)malloc(10*sizeof(int));
      6 
      7 
      8         for (i=0; i<11; i++)
      9                 iw[i] = i;
     10 
     11         for (i=0; i<11; i++)
     12                 ir[i] = iw[i];
     13 
     14         free(iw);
     15         free(ir);
     16 } 

从这个程序中我们可以看出,对于 iw[10]ir[10] 的访问都是非法的,因为 iwir 都只有 10 个元素,分别是从 0 到 9。请注意 int iw[10 ]iw = (int *)malloc(10*sizeof(int)) 是等效的 —— 它们都是用来给一个整数数组 iw 分配 10 个元素。

当您使用 Valgrind 运行这个程序时,会返回如下的消息:


清单 7. Valgrind 的输出消息
                
# gcc –g –o test3 test3.c
# valgrind ./test3
.
.
==31522== Invalid write of size 4
==31522==    at 0x100004C0: main (test3.c:9)
==31522==  Address 0x11899050 is 0 bytes after a block of size 40 alloc'd
==31522==    at 0xFFB9964: malloc (vg_replace_malloc.c:130)
==31522==    by 0x10000474: main (test10.c:4)
==31522== 
==31522== Invalid read of size 4
==31522==    at 0x1000050C: main (test3.c:12)
==31522==  Address 0x11899050 is 0 bytes after a block of size 40 alloc'd
==31522==    at 0xFFB9964: malloc (vg_replace_malloc.c:130)
==31522==    by 0x10000474: main (test10.c:4)
==31522== 
==31522== ERROR SUMMARY: 2 errors from 2 contexts (suppressed: 7 from 1)
==31522== malloc/free: in use at exit: 0 bytes in 0 blocks.
==31522== malloc/free: 2 allocs, 2 frees, 84 bytes allocated.
==31522== For counts of detected errors, rerun with: -v
==31522== No malloc'd blocks -- no leaks are possible.

在 test3.c 的第 9 行发现一个非法的 4 字节写操作,在第 12 行发现一个非法的 4 字节读操作。

Valgrind 也可以帮助判断内存误用的问题,例如:

  • 读/写已经释放的内存
  • C++ 环境中错误地使用 malloc/new 与 free/delete 的配对

 

下面这个列表介绍了 POWER 架构上 Valgrind 的状态:

  • memcheck 和 addrcheck 工具都可以很好地工作。然而,其他工具还没有进行大量的测试。另外,Helgrind (一个数据竞争的检测程序)在 POWER 上尚不能使用。
  • 所有的 32 位 PowerPC? 用户模式的指令都可以支持,除了两条非常少用的指令:lswx 和 stswx。具体来说,所有的浮点和 Altivec(VMX)指令都可以支持。
  • Valgrind 可以在 32 位或 64 位 PowerPC/Linux 内核上工作,但是只能用于 32 位的可执行程序。

 

有关 Valgrind 内存调试的更多信息,请访问 Valgrind HOW TO 站点。还可以参阅 Steve Best 的“Debugging Memory Problems”(Linux Magazine,2003 年 5 月)。参考资料 中有它们的链接

除了 Valgrind 之外,还可以使用其他几个内存调试工具;例如,Memwatch 和 Electric Fence。

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

上述的例子足以应付我们日常遇到的内存错误。那么我来说说我是怎么用valgrind调试我的程序的。

用命令:
[tengda@localhost tcl]$ valgrind --tool=memcheck --leak-check=full --db-attach=yes ns sss.tcl
==26507== Memcheck, a memory error detector.
==26507== Copyright (C) 2002-2007, and GNU GPL'd, by Julian Seward et al.
==26507== Using LibVEX rev 1732, a library for dynamic binary translation.
==26507== Copyright (C) 2004-2007, and GNU GPL'd, by OpenWorks LLP.
==26507== Using valgrind-3.2.3, a dynamic binary instrumentation framework.
==26507== Copyright (C) 2000-2007, and GNU GPL'd, by Julian Seward et al.
==26507== For more details, rerun with: -v
==26507==

然后出现调试信息:
Mac 2 has transmit a packet at 10.015894
==26507==
==26507== Invalid read of size 4
==26507==    at 0x82D439B: Tcl_Write (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x81CDB51: BaseTrace::namdump() (basetrace.cc:109)
==26507==    by 0x813768E: CMUTrace::nam_format(Packet*, int) (cmu-trace.cc:1034)
==26507==    by 0x81384DA: CMUTrace::format(Packet*, char const*) (cmu-trace.cc:1137)
==26507==    by 0x8138750: CMUTrace::recv(Packet*, Handler*) (cmu-trace.cc:1239)
==26507==    by 0x822513C: Mac802_16MSS::transmit(Packet*) (mac802_16MSS.cc:569)
==26507==    by 0x82149B2: Mac802_16::send_ncfg() (mac802_16.cc:1086)
==26507==    by 0x8228EFB: NcfgTimer::expire(Event*) (mac802_16timer.cc:418)
==26507==    by 0x8052A2C: TimerHandler::handle(Event*) (timer-handler.cc:99)
==26507==    by 0x8054331: Scheduler::dispatch(Event*, double) (scheduler.cc:150)
==26507==    by 0x805457D: Scheduler::run() (scheduler.cc:129)
==26507==    by 0x805485C: Scheduler::command(int, char const* const*) (scheduler.cc:198)
==26507==  Address 0x54D4540 is 0 bytes inside a block of size 28 free'd
==26507==    at 0x40050FF: free (vg_replace_malloc.c:233)
==26507==    by 0x83125AC: TclpFree (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x829DBDC: Tcl_Free (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82EDFB4: Tcl_EventuallyFree (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82D4094: FlushChannel (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82D3B9C: Tcl_Close (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82D57D3: Tcl_UnregisterChannel (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82D8C90: Tcl_CloseObjCmd (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x8298C4A: TclEvalObjvInternal (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82C2EF0: TclExecuteByteCode (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82C6D1B: TclCompEvalObj (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==    by 0x82EEC75: TclObjInterpProc (in /home/tengda/ns-allinone-2.31/ns-2.31/ns)
==26507==
==26507== ---- Attach to debugger ? --- [Return/N/n/Y/y/C/c] ----

程序一直在10s时候出现非法读4字节,只到最后偏移出缓冲区,彻底down掉。对于非法读,无非就是非法读缓冲,读共享变量,读文件。前两种我排除了。应该是非法读文件,于是我检查nam文件。发现在10s时候写入一条以w开头的行,ns中nam文件的开始和结束是以w开始的行标记的,关于传输数据的行是以+,-,h开头的,那么就是在10s时候关闭了nam文件。于是我开始检查tcl测试脚本,果然,我的测试时间是200s,我在10s关闭了nam文件,当我把10s改为200s时候,程序正常了!!!

gdb与valgrind配合使用效果非常好阿!