2009年4月4日星期六

改变人生命运的两个字

生活中,没有什么比茅塞顿开更令人激动、更让人受用。茅塞顿开能够改变一个人的人生——不只是改变,而且使之变得更好。当然,这样的时刻并不多见,但仍然会发生在我们所有人身上。茅塞顿开有时来自书本,有时来自别人的言说,有时来自一句诗,有时来自朋友之口。
记得那是一个寒冬的下午,我坐在曼哈顿的一个法国小餐馆等人,我当时的心情十分郁闷。由于几次失算,我把有生以来一个相当重要的项目给搞砸了。为此,甚至连很快就能见到我一位关系甚密的朋友(我私下常常亲切地称为老朋友)的情形都无法像往常那样令我高兴起来。我坐在桌边,神情恍惚地看着桌子上的杂色方格台布,后悔不迭。
终于,他穿过了街道。他裹着旧棉袄,一顶没有什么特别形状的帽子从他的光头上挂下来,看上去压根不像什么有名的心理医生,倒活脱脱像个精力充沛的土地神。他的办公地点就在附近,我知道他刚看过自己当天最后一个病人。他年近80,但仍然夹着一只公文包,里面装得满满的,依然宛如一家大公司的主管,一有空,仍然喜欢去高尔夫球场找乐子。
他过来在我旁边落座,此时服务员已把他总是要点的淡啤酒摆好。我已经数月没有见我的老朋友了,但他似乎依然如故,十分刚强。和我打过招呼后,他就开门见山地问道:"说吧,年轻人,怎么啦?"
对他的敏锐,我早就见怪不怪了,所以我便详细地向他诉说令自己烦恼的到底是什么。忧伤中带着自豪,我竭力道出实情。除了责备自己,我没有因为失望而怨天尤人。我分析了整件事情,所有不明智的判断以及走错的每一步棋。我讲了约有十五分钟,而这期间我的老朋友只是静静地听着,慢慢地品着淡啤酒。
说完后,他放下手中的啤酒杯,说道:"走,到我办公室去谈吧。"
"到你办公室去?是不是你忘了什么东西?"
他和蔼地说:"不是,我想看看你对一样东西的反应,没什么别的意思。"
此时,外面下起凉飕飕的小雨,但他的办公室内既暖和又舒适:墙壁边是摆满书的书架,一张皮沙发,一张西格蒙·弗洛伊德亲笔签名的照片,窗子边放着一台录音机。秘书已经回家了,所以,此刻只有我们俩。
我的老朋友先从硬纸盒里拿出一盘磁带放进录音机,然后说道:"磁带里面有三个简短的录音,是三个到我这里来求助的人的录音。当然,没有透露这三个人的具体身份。我想让你听听这几段录音,看看你能否找出其中的一个词,两个字组成的词,这个词三段录音中都有。"他微微一笑,说道:"无须这么茫然,我自有我的道理。"
我一听,录音中三个说话人共有的东西似乎都是不开心。第一个说话的是个男的,他在生意中显然蒙受了某种损失或遭到某种失败,他埋怨自己工作不够努力,埋怨自己缺乏远见。接下来说话的是个女的,她从未成过家,原来她的母亲寡居,而她守着母亲的责任意识很强,因而她放过了所有成家的机会,为此她伤心不已。第三个说话的是位母亲,她十多岁的儿子给警方抓了,为此她不停地自责。
我的老朋友关掉录音机,身子往椅子靠背一仰,说道:"这几段录音中有个词出现了六次,这个词危害性极大。你发现了吗?没有?噢,也许那是因为刚刚你在餐馆那边自己也使用了三次。"他把装着磁带的盒子拿了起来,扔给了我,然后说道:"自己看看吧,就在标签上。那两个字是所有语言中最令人伤心的语言。"
我低头一看,上面清晰地打印着两个红字:要是
我的老朋友说道:"要是你知道我坐在这把椅子上,听过这两个字开头的话成千上万次的话,你准会感到不可思议。大家总是如是对我讲:'要是我换一种方法去做的话或根本不去做的话。要是我当初不发脾气,没有说得那么绝情,没有那么虚伪,没有撒那愚蠢的谎言。要是我能更明智点,或更大度一些,或更自制一些。'要是我不打断他们,他们会一直这么说呀说。有时我也让他们听一听你刚听过的几段录音。我跟他们讲:'要是你不再说要是的话,我们或许就有救了。'"
我的老朋友伸直了双腿,说道:"现在的问题是,光说'要是'不能解决任何问题。光说'要是'只能让人把握错自己的方向——向后看而不是向前看。光说'要是'只是浪费光阴。要是一味这么下去的话,最后,说'要是'就会成为自己的积习,这么一来,'要是'就会成了真正的绊脚石,成了自己不再尝试的托词。"
"现在我们以你为例:你的方案没有成功,为什么?因为你犯了一些错误。不过,这并没什么关系,犯错误人皆难免,我们都得从错误中吸取教训。但是,刚才你在向我讲述自己的错误,一时悔恨这个,一时抱怨那个,那就说明你并没有真正从错误中吸取教训。"
"那你凭什么这么说我呢?"我为自己辩白,但有些底气不足。我的老朋友接着说道:"因为,这表明你从未从过去的阴影中走出来。你对未来只字未提。而且,老实讲,从某种程度上来说,你当时还陶醉于谈论自己的过去。我们大家都有一个共同的人性弱点,那就是,我们都乐于回味自己以往犯过的一些错误。毕竟,自己讲述遭受过的灾难和挫折时,自己依然是主角和舞台的焦点。"
我悔恨不已,摇了摇头,问道:"那么,有什么补救的法子吗?"
"有啊,转移焦点,"我的老朋友立即答道,"换掉关键字,换上一个催人奋进而不是令人不思进取的词。"
"那你有什么高见吗?"
"当然有!去掉'要是',换上'下次'。"
"下次?"
"一点不错!在这房间里,我已多次看到它创造出小小的奇迹。只要病人反复对我说'要是',那他就麻烦了。不过,假如他能正视着我,说'下次',我便知道他即将渡过难关了,因为这意味着:不论以往多么艰辛或多么痛苦,他已决定运用从往事中吸取的教训了;这意味着:他即将推开悔恨这一绊脚石,振作起来,采取行动,重新生活。你自己也尝试一下看看,你会明白。"我的老朋友不再说了。此时,我能听到窗外雨点溅落在窗户玻璃上的声音。我试着从大脑中慢慢驱出一个词并替换上另一个词。当然,这只是在想象之中进行的,但我却清晰地听到新词在大脑中相应之处安家落户。
"还有,对于能够补救的事情,那就不妨试一试此法。"然后,我的老朋友从身后的书架上抽出一本日记一样的东西,接着说道:"这是一本日记,日记的主人是十几年前我家乡的一位老师。她的丈夫为人随和,但游手好闲,虽然长得好看,但是养家糊口却完全不称职。这么一来,养儿育女和其他一切责任全落在她的肩上。她的日记充满气愤,尽是数落乔纳森的弱点、缺陷和不足。后来,乔纳森死了,此后多年她也再也没有提及此事,只有一次例外。你看这里:今天我当选学监,所以我认为我理当自豪。然而,要是我知道乔纳森在天上哪个地方,而且要是能够到他身边的话,我今夜就会去他那里。"
老朋友轻轻地合起了日记,说道:"明白了吧?她反复在说'要是'。'要是'我接受了他,包括他所有的缺点;'要是'我在当初爱他的话,那该有多好啊!"
他把书放回书架,接着说道:"这是这两个令人伤心的字说得最令人伤心的时候,因为此时一切为时已晚,回天无力。"
我的老朋友有些僵硬地站了起来,说道:"好啦,下课了!小伙子,见到你,我非常开心,一直都是如此!现在,请你帮我拦辆出租车,或许我也该回家了。"
我们走出大楼,进入雨夜。我看到一辆空车在招揽客人,便向前跑了一下准备拦下,可是却被另一个行人捷足先登了。
"哎呀,哎呀,'要是'我们早来一步的话,我们就会拦到那辆出租车了,你说对不对?"我的老朋友狡黠地说道。
我会心地笑了笑,说道:"下次我再跑快点。"
"对啦!这就对啦!"说着,我的老朋友拽了拽自己那滑稽的帽子,盖在自己耳朵的四周。
又一辆出租车放慢了车速。我为我的老朋友打开了车门。车子慢慢地开走,他冲我笑了笑,挥了挥手。此后,我一直未见过他。一个月之后,他心脏病突发,溘然长逝,可以这样说,他死时问心无愧。
而今,那个曼哈顿雨夜已过去一年多了。然而,时至今日,每当我脑海想"要是"这个词的时候,我马上换上"下次"一词。然后,我等待着那几乎听得到的"喀嚓"声。而每当听到这个声音时,我就想起我那位老朋友。
当然,这只是永恒中的一个小小插曲,他要是在世的话,他也希望我如此。


看完这个故事以后,我感受非常深刻,"要是"我们可以做到,"下次"一定会有进步,生活中工作中的各个方面都会越来越好!

睡觉的诀窍 ---南怀瑾

一个人真正睡着觉最多只有两个钟头,其余都是浪费时间,躺在枕头上做梦,没有哪个人不做梦。至于醒来觉得自己没有做梦,那是因为他忘记了。
通常一个人睡两个钟头就够了,为什么有人要睡七、八个钟头?那是你赖床躺在枕头上休息的习惯养成的,并非我们需要那么久的睡眠时间,尤其打坐做功夫的人晓得,正午只要闭眼真正睡着三分钟,等于睡两个钟头,不过要对好正午的时间。夜晚则要在正子时睡着,五分钟等于六个钟头。
就这个时间的学问又大了,同宇宙法则、地球法则、易经阴阳的道理有关系,而且你会感觉到,心脏下面硬是有一股力量降下来,与丹田(肾上)的力量融合,所谓"水火既济",豁然一下,那你睡眠够了,精神百倍。
所以失眠或真要夜里熬夜的人,正子时的时刻,哪怕二十分钟也一定要睡,睡不着也要训练自己睡着。
过了正子时大约十二点半以后,你不会想睡了,这很糟糕。更严重的,到了天快亮,四、五点钟,五、六点卯时的时候,你又困得想睡,这时如果一睡,一天都会昏头。
所以想从事熬夜工作的人,正子时,即使有天大的事也要摆下来,睡它半小时,到了卯时想睡觉千万不要睡,那一天精神就够了。
不过失眠的人都挨过十二点,在床上翻来覆去睡不着,结果快天亮睡着了,到第二天下午都昏头昏脑,因此你会感觉失眠、睡眠不足,实际上是你没有经验。
一、睡眠的规则

战国时名医文挚对齐威王说:"我的养生之道把睡眠放在头等位置,人和动物只有睡眠才生长,睡眠帮助脾胃消化食物,所以,所以睡眠是养生的第一大补,人一个晚上不睡觉,其损失一百天也难以恢复。"

晚21点到凌晨5点为有效睡眠时间。人是动物,和植物同属于生物,白天(凌晨5点到晚上21点)活动产生能量,晚上(21点到凌晨5点)开始进行细胞分裂,把能量转化为新生的细胞,是人体细胞休养生息、推陈出新的时间,也是人随着地球旋转到背向太阳的一面。阴主静,是人睡眠的良辰,此时休息,才会有良好的身体和精神状态。这和睡觉多的婴儿长得胖、长得快,而爱闹觉的孩子发育不良是一样的道理。

睡觉是养生的一大功能,养就是用大量的健康细胞去取代腐败的细胞,如一夜睡不着就换不了新细胞。如果说白天消亡一百万个细胞,一晚上只补回来五十万个细胞,这时你的身体就会出现亏空,时间长了,人就糠了,像糠萝卜似的。为什么世上有百岁老人呢?因为他们每晚都在21点钟准时睡觉。

植物吸收阳光的能量,夜里生长,所以夜晚在农村的庄稼地里可听到拔节的声音。人类和植物同属于生物,细胞分裂的时间段大致相同,错过夜里睡觉的良辰,细胞的新生远赶不上消亡,人就会过早的衰老或患病,人要顺其自然,就应跟着太阳走,即天醒我醒,天睡我睡。人在太阳面前小如微尘,"与太阳对着干"是愚蠢的选择,迟早会被太阳巨大的引力催垮。这是客观真理。

现实生活中,不少人有入睡难,睡眠质量不高的毛病。睡眠不好是一个综合性的问题,如肝火过盛,睡觉警觉;胃火过剩,睡觉不安;肝阴不足,睡觉劳累。

二、睡眠与疾病

现代的生活习惯和生活方式给人们的身体带来了很多负面影响形成"四大病":水果病、冰箱病、电视电脑病、熬夜病。肝脏有一特点:卧则回血,坐立向外供血。
子时(23:00—1:00),其实23点就是新的一天的开始,并不是0点开始的,这是我们犯的误识。肝胆相表里,互为一家,23点胆经开了,如若不睡,大伤胆气,由于十一脏腑皆取决于胆也,胆气一虚,全身脏腑功能下降,代谢力、免疫力纷纷下降,人体机能大大降低,胆气支持中枢神经,胆气受伤易患各种精神疾病,比如抑郁症、精神分裂症、强迫症、躁动症等。子时胆要更换胆汁,胆经渐旺人如不卧,胆汁更替不利,过浓而结晶成石,久之即得胆结石,如果把胆给摘了,一摘就胆怯了,全身的免疫力下降了50%以上,所以不能摘,要用它本系统的巨大潜能把它化掉。

丑时肝经最旺,丑时(1:00—3:00)不眠,肝无法解除掉有毒之物,产生新鲜血液,因藏血不利,面呈青色,久之易患各类肝病,现在有些人肝不太好,特别在欧洲平均4个人就有一个大三阳或是小三阳,大都是因为违反自然规律过了子时不睡觉造成的。甲肝比较好治,乙肝就很难治。乙肝病毒携带者,是由于晚上经常不睡觉,人太虚弱了,也就是说秩序太乱了,病毒已经到了细胞里了。也就是说乙肝的病毒已经到了细胞里面
,但是现在它还没有能力造成肝炎,当人身体处于最薄弱的时候就形成成肝炎,乙型肝炎就意味着将来40%——60%的肝硬化。聪明的人是应该了解天、地、人之间的关系,不聪明的人就是应该被淘汰的人。

肝主疏泄,过子时不睡,可引起肝疏泄不利,肝气郁结,可见易怒,头痛头晕,眼红,眼痛,耳鸣,耳聋,胸肋胀痛,女性月经不调,便秘,也可引起肝气升发不足,人会目倦神疲,腰膝酸软,晕眩,失眠,惊悸,精神恍惚,重则会晕倒在大街上,不省人事。

肝有藏血、调节血液的功能,过子时不睡,会造成肝血不足,还会引起吐血、流鼻血、皮下出血、牙龈出血、眼底出血、耳出血等出血证状。
肝开窍于目,过子时不睡,易引起肝虚,则出现视力模糊、老花、夜盲、畏光、迎风流泪,等症状,还会形成青光眼、白内障、眼底动脉硬化、视网膜病变等眼疾。

肝主筋,其华在爪,过子时不睡觉,会引起肝血不足,就出现筋痛,麻木,屈伸困难,痉挛抽搐,易造成灰指甲,缺钙,髌骨软化,癫痫病,骨质疏松等症。

肝与心,过子时不睡觉,可引起肝血不足,由于心主一身之血脉,肝有储藏和调节血液的功能,会造成心脏供血不足,引起心慌、心颤等症状,严重的形成心脏病、高血压等心脑血管疾病。

肝与脾,过子时不睡觉,会引起肝胃不和,由于肝助脾胃消化,由于肝气太虚不能助脾胃消化,使人脾胃消化功能不好,表现为舌苔厚,长期以来会造成中气塌陷。

肝与肺,过子时不睡觉,无法滋阴潜阳,肝阴亏损,引起肝火过盛灼肺,出现干咳、或咳嗽、咳痰血等木火刑金的证状,易导致牛皮癣等各种皮肤病。

肝与肾,过子时不睡觉,肝虚导致肾亏,由于肝肾同源,容易造成生殖系统疾病、不育、骨病、牙病、脱发、糖尿病、肾衰竭等疾病。

三、睡眠的方法

交通规则——你不懂就容易出事故。比如说,23点至凌晨3点为子丑时,胆肝经最活跃的时候,肝胆要回血,"躺下去回血,站起来供血"。如果你每晚22点钟左右躺下,静静得不要说话,到23点的时候,也就睡着了。肝胆开始回血,把有毒的血过滤掉,产生新鲜的血液,到一百岁也没有胆结石,也没有肝炎、囊肿一类的病。如果你天天熬夜到1点多,肝回不了血,有毒的血排不掉,新鲜的血生不成,胆又无法换胆汁,所以这些人容易得胆结石、囊肿、大三阳、小三阳各种病症。
在欧洲地区,平均四个人就有一个肝炎病毒携带者,这就叫不懂规则。睡前半小时最好不要讲话,睡觉的时候更不要说话,如一说话,肺经动,然后心经又动,(因为心肺共为上焦)人就容易进入兴奋状态,所以就很难入睡。
21:00—23:00为亥时。亥时三焦经旺,三焦通百脉。亥时入眠,百脉皆得濡养,故百岁老人得共同特点即21:00(亥时)之前入睡。女性若想长久的保持容颜娇好,应做到早睡早期。

睡觉要关窗,不能开风扇、不能开空调,人生病很多都与此有关,因为人在睡眠之中,气血流通缓慢,体温下降,人体会在表面形成一种阳气层,这种阳气层它使人叫"鬼魅不侵",什么意思呢,阳气足的人,不做恶梦,就是这种阳气,占了上风。开空调,开风扇,情况就不一样了,开窗户,窗户走的是风,风入的是筋,如果开空调,也有风,风入筋,寒入骨,早上起来,身上发黄,脸发黄,脖子后面那条筋发硬,骨节酸痛,甚至有人就开始发烧,这就是风和寒侵入到了筋和骨头里的缘故,这也就是气受伤了。如果说晚上睡觉不开窗,不开空调,不开风扇,连房门也关上,效果最好,如果热,把房门打开,把窗户关上,效果就差了一点,但是他不至于第二天早上起来浑身乏力,后背僵硬.
有人把客厅的空调开开了,把卧室的门打开,和直接开空调睡觉是差不多的,开了空调以后,空调那个寒进了骨了,所以心里发冷,心在哪,心在脑髓,脑为髓之海,骨髓里有寒,那肯定心里就寒了,怎么办,补肾阳、补中气,什么时候补到心里不冷,烧就退了,寒走出去了。
睡觉要尽量早睡,睡得晚,伤了少阳之气,必然第二天是疲倦无力,要关上窗户,不开空调、电扇,保护阳气。

肝胆在下焦,如果胃出现问题的时候,他就会出现寝睡不安,一个是胃寒,如果这个人胃阳本来就不足,过多的喝绿茶,就会出现胃寒,胃寒的时候人是睡不好觉的,或者吃带泥沙之物过多,胃隐隐作寒,肯定是睡不好;
再一个是胃热,就是热气往上走,嘴里喘的都是热气,像这种情况也睡不好觉;再一个是胃燥,口干舌燥,胃里感觉到燥;
还有一个就是胃厚,气味的味,胃厚,这种情况就是吃了这种厚腻的味道,有人吃海鲜、吃鱼、吃炖鸡,味道好鲜美,吃多了,美味不可多用,这些东西在里面要稀释它,不稀释它,它在里面味太厚了,所以这个也睡不好觉;
再一个腹涨,腹是涨鼓鼓的,也睡不着,翻来覆去也睡不着;再一个是胃气太虚,冒冷汗,这也睡不好觉,这些原因都可能形成胃不宁,胃不宁就睡不好。
睡觉时要肢暖,四肢要暖,因为四肢是阳之本,这个大家都知道了,四肢不暖,肯定是肾阳不足,应该在睡觉之前把手脚捂暖,手脚和肚脐、背后的命门都要盖好。

睡眠法因人而异,下面介绍3种做法:

1、
睡觉前简单的压腿,然后在床上自然盘坐,两手重叠放于腿上,自然呼吸,感觉全身毛孔随呼吸一张一合,若能流泪打哈欠效果最佳,到了想睡觉时倒下便睡。

2、
仰卧,自然呼吸,感觉呼吸像春风,先融化大脚趾,然后是其他脚趾,接着脚、小腿、大腿逐渐融化。如还未醒着,再从头做。

3、
入睡快的人可右侧卧,右手掌托右耳。右掌心为火,耳为水,二者形成水火即济,在人体中形成心肾相交。久之,养心滋肾。

睡眠一定要早起,即使在冬天,也不可超过6点起床,春夏秋季尽量在5点之前起床,因为人在寅时(3点—5点)肺经旺的时候起床,能够使肺气得以舒展,以顺应阳气的舒长,来完成新陈代谢,肃降浊气,使肺气清,这样有助于养肺和顺应太阳的天势升起人体阳气,使人一天阳气充足,否则,就好像发动机,过了这段好时机就很难发动人体阳气,人体阳气淤积在人体下部不能由命门向上发动升起,会形成淫气,严重损害人的身心健康。
早晨5点至7点是人体大肠经最旺的时候,人体需要把代谢的浊物排出体外,此时如果不起床,大肠得不到充分活动,无法很好的完成排浊功能,使浊物停留而形成毒素,危害人体血液和脏腑百骸。早晨7点到9点人体胃经最旺,9点到11点人体脾经最旺,这时人的消化吸收运化的能力最好,如果这时还不起床,人体胃酸会严重腐蚀胃粘膜,人体在最佳吸收营养时间得不到营养,长期以来会患脾胃疾病,造成营养不良、中气塌陷。所以千万不要赖床,赖床会造成头昏、疲惫不堪、睡眠不足的感觉,而应按时起床,历史上许多伟人都是有三四点钟起床的习惯,比如华盛顿、拿破仑、康熙皇帝、曾国藩等。另外早起能增加工作效益,俗话说:"三天早起,一天工"。
现代医学证明,早睡早起的人精神压力较小,不易患精神类疾病。早晨不要太早出去锻炼,因为早晨在太阳没有出来之前,地下道的漳气、浊气正往上走(尤其是城市),这些气对人体损伤是很严重的。

养身三大事,一睡眠,二便利,三饮食,其余起居、服装等皆是辅助。三事中睡眠第一。然胃纳不和者,夜眠不安,故以通便利为第二。而饮食无节,饥饱过度者,肠胃必受伤,而营养日减。睡以安神为主,神以心安为主,应配合年龄,壮年至多七小时至八小时,多睡则智昏头晕眼红胀,四肢疲软,童年必睡足八小时,或过九小时勿碍,老或病人至多六小时已足。
应注意:
(一)睡眠宜早,勿过十时,老年人以八点为正,勿过九点。凡交十一时,为阳生时,属肾,此时失眠,肾水必亏,心肾相连,水亏则火旺,最易伤神。千万勿以安眠药片助睡。
(二)枕上切忌思索计算未来事,睡时宜一切不思,鼻息调匀,自己静听其气,由粗而细,由细而微细而息。视此身如无物,或如糖入于水,化为乌有,自然睡着。
(三)如有思想,不能安着,切勿在枕上转侧思虑,此最耗神,可坐起一时再睡。
(四)如在午时,即上午十一点至一点,为阴生之时,属心,此时如不能睡,可静坐一刻钟,闭目养神,则心气强。凡有心脏病者切宜注意,每日于此二时注意,则元气日强,无心跳腹泄或小便频速之病。
(五)夏日起宜早,冬日起宜迟

发财呀发财

同学们,你们应该发现了,最近我老公的博客,已经很久没有更新了,访问量也萎缩了不少,为什么呢?据说,他在酝酿一篇好的。可是,他说这话,已经1个多月了....什么样惊世骇俗的博文,需要打一个多月的腹稿呢?我不得不给他讲了一个故事:从前,一个秀才正在抓耳挠腮地挑灯夜战,他的娘子来红袖添香,问道:"相公,真这么难写吗?比我生孩子都难吗?"秀才答道:"当然,你好歹肚里有呀,而我....."

我曾劝过老公:"你的文章每多一个数字、一个专业术语,就会吓走1%的读者,轻松幽默才是王道。"可是,他对我的好言,总是不以为然,还说我的作文拉低了他博客的水准。切!没关系,我用冯导的话来回应他:"我有人民支持我!"当然,他要自绝于人民,我也没办法。

但是,我是个心地善良的好姑娘,不能见死不救呀!所以,为了减少他的更新量,增加他的访问量,本期的主题,仍然是人民群众喜闻乐见的爆料趣事。

由于最近的金融危机,老公对发财的愿望,变得越来越迫切。他经常躺在床上冥想后,问我:"老婆,你说,如果我们有1个亿,该怎么办呀?"然后一个鲤鱼打挺坐起来,扳着指头算计说:"就算存银行,一天都有1万多的利息呀!一天1万多耶!"然后,他又会突然担忧起来:"万一,如果象今天这样天气不好,或是我们谁生了病,一天没出门,第二天,我们就得花2万多,多大的压力呀!"我只好拍拍他的脸蛋,安慰他:"老公,放心,我保证,你这辈子,永远不会有这个烦恼的。"

前两天,他又问我:"老婆,如果,我有1000万,你会不会更喜欢我呀?"我说:"会!"他又问我:"如果我有1个亿,你会不会更更喜欢我呀?"我说:"会!"他又问我:"如果我有10个亿,你会不会更更更喜欢我呀?"我说:"会!"然后,他又问我:"如果我有100亿,你会不会更更更更。。。。。"我在他还没有被自己哽死之前,伸出手指,按在他的嘴唇上,救了他一命,温柔地说:"不会,现在我就很喜欢你!"他抱着我猛亲了几口后,仰天长叹:"老天呀,我什么时候才能发财呀,我们的感情都到位啦!"

老公说,我们排个小品吧,名字就叫:就差钱!

2009年4月2日星期四

简单源代码包的制作


                                                     图1. 生成Makefile流程图

本文以"hello world"程序为例,简单说明linux下源代码包(.tar.gz)的制作。

在此,谨以说明源代码包的制作过程。
首先,确保你的系统装有以下GNU软件:
Automake
Autoconf
m4
perl
libtool
1.新建一目录,将你的源代码放在此目录下,以下的操作均在此目录里进行。
shell>; mkdir hello
2.执行autoscan命令来扫描源代码。
shell>;autoscan
执行该命令后会生成configure.scan 和configure.log文件。
3.修改configure.scan文件。
shell>;vi configure.scan
添加,修改以下几行,其它的注释掉。
AC_INIT(hello.c) //括号内为你的源代码.
AC_PROG_CC
AM_INIT_AUTOMAKE(hello,1.0) //括号内hello为文件名,1.0为版本号.
AC_OUTPUT(makefile) //在括号内加入makefile.
保存文件,并修改此文件名为configure.in
shell>;mv configure.scan configure.in
4.运行aclocal命令,之后会生成aclocal.m4文件。
shell>;aclocal
5.运行autoconf命令,之后会生成autom4te.cache目录和configure可执行文件。
shell>;autoconf
6.自己编写makefile.am文件。
shell>;vi makefile.am
此文件格式为:
AUTOMAKE_OPTIONS=foreign
bin_PROGRAMS=hello
hello_SOURCES=hello.c
当然,有兴趣你也可对makefile.am文件进行扩展。
7.用automake --add-missing加入一些生成标准的软件包所必需的文件。
shell>;automake --add-missing
8.执行configure文件。 会生成make所需的makefile及其它文件。
shell>;./configure
9.用make编译,后已生成可执行文件hello,但只能在当前目录下用./执行。要想在任何目录都能执行,还要进行make
install.下述。
shell>;make
10.make install,将可执行文件写入/usr/local/bin下。
shell>;make install
11.最后一步,打包。会生成 .tar.gz的包,注意,这个包并非是用tar命令生成的。
shell>;make dist
至此,一个简单的源代码包制作完毕。ls
看一下,会有一个hello-1.tar.gz的源代码包生成了。

佳文推荐:
http://blog.chinaunix.net/u2/79955/showart_1830365.html
http://hi.baidu.com/zhanglei_186/blog/item/abe75b5c8cafc745faf2c008.html

致所有的已婚夫妻

嘴巴一张一合,一场战争就过去了;
  嘴巴一张不合,一场婚姻就过去了。

2009年4月1日星期三

利用libtool自动生成动态库

libtool是什么?
使用libtool的好处在于该工具替user处理一些细节,最主要的是:
1。自动处理库的依赖关系;2。对于共享库,自动加入运行时搜索路径(在GNU/LINUX下面通过在
executable中hardcode一个路径名实现)。3,其他好处(我还不知道)。
而用户在链接生成executable的时候只需要使用libtool工具,并指定libtool库文件的名字作为参数就可以。

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

生成库:
$ libtool --mode=compile gcc -c hello.c
$ libtool --mode=link gcc -g -O -o libhello.la foo.lo hello.lo
-rpath /usr/local/lib -lm
注意:
手册上说libtool库类型有三种:
1。libtool shared library,
必须加入-rpath选项(不能加入-static),同时也产生libtool static library.
2。libtool static library(好像又叫libtool static convenience
library),必须加入-rpath,同时加入-static选项。
3。convenience library
两个参数都不加,它与2。的区别在于convenience library具有PIC特性。


=======================================
安装库:(摘于手册)
在gnulinux下:libtool的安装过程如下:
a23# libtool --mode=install cp libhello.la
/usr/local/lib/libhello.la
cp libhello.la /usr/local/lib/libhello.la
cp .libs/libhello.a /usr/local/lib/libhello.a
ranlib /usr/local/lib/libhello.a
a23#
或者
burger# libtool --mode=install install -c libhello.la
/usr/local/lib/libhello.la
install -c .libs/libhello.so.0.0 /usr/local/lib/libhello.so.0.0
install -c libhello.la /usr/local/lib/libhello.la
install -c .libs/libhello.a /usr/local/lib/libhello.a
ranlib /usr/local/lib/libhello.a
burger#
注意:用户可以先安装再使用(即用executables
libhello.la来链接);好像也可以先链接再安装?!
如果最终使用不安装的libtool库文件,有时候会有问题的!

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

使用库:

libtool --mode=link gcc -o hello main.c /home/szx/test/libadd.la

注意:如果在libtool链接命令中使用-L/-l参数,那么库名字首先被解释为la库文件(在当前路径下和-L指定的目录下搜索),
如果找不到再解释为.a或.so文件(此时libtool功能就退化成gcc或ld了)!所以为了避免二义性,最好使用绝对路径的形式,比如/home/szx/test/libadd.la


1 libtool的工作原理
libtool
是一个通用库支持脚本,将使用动态库的复杂性隐藏在统一、可移植的接口中;使用libtool的标准方法,可以在不同平台上创建并调用动态库。可以认为libtool是gcc的一个抽象,其包装了gcc(或者其他的编译器),用户无需知道细节,只要告诉libtool需要编译哪些库即可,libtool将处理库的依赖等细节。libtool只与后缀名为lo、la为的libtool文件打交道。
libtool主要的一个作用是在编译大型软件的过程中解决了库的依赖问题;将繁重的库依赖关系的维护工作承担下来,从而释放了程序员的人力资源。libtool提供统一的接口,隐藏了不同平台间库的名称的差异等细节,生成一个抽象的后缀名为la高层库libxx.la(其实是个文本文件),并将该库对其它库的依赖关系,都写在该la的文件中。该文件中的dependency_libs记录该库依赖的所有库(其中有些是以.la文件的形式加入的);libdir则指出了库的安装位置;library_names记录了共享库的名字;old_library记录了静态库的名字。
当编译过程到link阶段的时候,如果有下面的命令:
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
libtool会到/usr/lib路径下去寻找liba.la,然后从中读取实际的共享库的名字(library_names中记录了该名字,比如liba.so)和路径(lib_dir中记录了,比如libdir='/usr/lib'),返回诸如/usr/lib/liba.so的参数给激发出的gcc命令行。
如果liba.so依赖于库/usr/lib/libb.so,则在liba.la中将会有dependency_libs='-L/usr/lib
-lb'或者dependency_libs='/usr/lib/libb.la'的行,如果是前者,其将直接把"-L/usr/lib
–lb"当作参数传给gcc命令行;如果是后者,libtool将从/usr/lib/libb.la中读取实际的libb.so的库名称和路径,然后组合成参数"/usr/lib/libb.so"传递给gcc命令行。
当要生成的文件是诸如libmylib.la的时候,比如:
$libtool --mode=link gcc -o libmylib.la -rpath /usr/lib –L/usr/lib –la
其依赖的库的搜索基本类似,只是在这个时候会根据相应的规则生成相应的共享库和静态库。
注意:libtool在链接的时候只会涉及到后缀名为la的libtool文件;实际的库文件名称和库安装路径以及依赖关系是从该文件中读取的。
2 为何使用 -Wl,--rpath-link -Wl,DIR?
使用libtool解决编译问题看上去没什么问题:库的名称、路径、依赖都得到了很好的解决。但下结论不要那么着急,一个显而易见的问题就是:并不是所有的库都是用libtool编译的。
比如上面那个例子,
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
如果liba.so不是使用libtool工具生成的,则libtool此时根本找不到liba.la文件(不存在该文件)。这种情况下,libtool只会把"–L/usr/lib
–la"当作参数传递给gcc命令行。
考虑以下情况:要从myprog.o文件编译生成myprog,其依赖于库liba.so(使用libtool生成),liba.so又依赖于libb.so(libb.so的生成不使用libtool),而且由于某种原因,a对b的依赖并没有写入到liba.la中,那么如果用以下命令编译:
$libtool --mode=link gcc -o myprog -rpath /usr/lib –L/usr/lib –la
激发出的gcc命令行类似于下面:
gcc –o myprog /usr/lib/liba.so
由于liba.so 依赖于libb.so(这种依赖可以用readelf读liba.so的ELF文件看到),而上面的命令行中,并没有出现libb.so,于是,可能会出现问题。
说"可能",是因为如果在本地编译的情况下,gcc在命令行中找不到一个库(比如上面的liba.so)依赖的其它库(比如libb.so),链接器会按照某种策略到某些路径下面去寻找需要的共享库:
1. 所有由'-rpath-link'选项指定的搜索路径.
2. 所有由'-rpath'指定的搜索路径.
'-rpath'跟'-rpath_link'的不同之处在于,由'-rpath'指定的路径被包含在可执行文件中,并在运行时使用,
而'-rpath-link'选项仅仅在连接时起作用.
3. 在一个ELF系统中, 如果'-rpath'和'rpath-link'选项没有被使用,
会搜索环境变量'LD_RUN_PATH'的内容.它也只对本地连接器起作用.
4. 在SunOS上, '-rpath'选项不使用, 只搜索所有由'-L'指定的目录.
5. 对于一个本地连接器,环境变量'LD_LIBRARY_PATH'的内容被搜索.
6.
对于一个本地ELF连接器,共享库中的`DT_RUNPATH'和`DT_RPATH'操作符会被需要它的共享库搜索.
如果'DT_RUNPATH'存在了, 那'DT_RPATH'就会被忽略.
7. 缺省目录, 常规的,如'/lib'和'/usr/lib'.
8. 对于ELF系统上的本地连接器, 如果文件'/etc/ld.so.conf'存在,
这个文件中有的目录会被搜索.
从以上可以看出,在使用本地工具链进行本地编译情况下,只要库存在于某个位置,gcc总能通过如上策略找到需要的共享库。但在交叉编译下,上述八种策略,可以使用的仅仅有两个:-rpath-link,-rpath。这两个选项在上述八种策略当中优先级最高,当指定这两个选项时,如果链接需要的共享库找不到,链接器会优先到这两个选项指定的路径下去搜索需要的共享库。通过上面的描述可以看到:-rpath指定的路径将被写到可执行文件中;-rpath-link则不会;我们当然不希望交叉编译情况下使用的路径信息被写进最终的可执行文件,所以我们选择使用选项-rpath-link。
gcc的选项"-Wl,--rpath-link
–Wl,DIR"会把-rpath-link选项及路径信息传递给链接器。回到上面那个例子,如果命令行中没有出现libb.so,但gcc指定了"-Wl,--rpath-link
–Wl,DIR",则链接器找不到libb.so的时候,会首先到后面-rpath-link指定的路径去寻找其依赖的库。此处我们使用的编译命令的示例是使用unicore平台的工具链。
$ unicore32-linux-gcc –o myprog /usr/lib/liba.so \
-Wl,--rpath-link -Wl,/home/UNITY_float/install/usr/lib
这样,编译器会首先到"/home/UNITY_float/install/usr/lib"下面去搜索libb.so
libtool如何把选项"-Wl,--rpath-link
–Wl,DIR"传递给gcc?libtool中有一个变量"hardcode_libdir_flag_spec",该变量本来是传递"-rpath"选项的,但我们可以修改它,添加我们需要的路径,传递给unicore32-linux-gcc。
"hardcode_libdir_flag_spec"原来的定义如下:
hardcode_libdir_flag_spec="\${wl}--rpath \${wl}\$libdir"
我们修改后的定义如下:
hardcode_libdir_flag_spec="\${wl}—rpath-link \${wl}\$libdir \
-Wl,--rpath-link -Wl,/home/UNITY_float/install/usr/lib \
-Wl,--rpath-link
-Wl,/home/UNITY_float/install/usr/X11R6/lib "
这样,当libtool在"--mode=link"的模式下,就会把选项"-Wl,--rpath-link
–Wl,DIR"传递给gcc编译器了。


利用libtool自动生成动态库
#
1. autoscan命令在当前目录生成configure.scan文件, 内容为:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([src/bot.h])
AC_CONFIG_HEADER([config.h])
# Checks for programs.
AC_PROG_CXX
AC_PROG_CC
# Checks for libraries.
# Checks for header files.
AC_HEADER_STDC
AC_CHECK_HEADERS([limits.h malloc.h stdlib.h string.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
AC_HEADER_STDBOOL
AC_C_CONST
AC_C_INLINE
# Checks for library functions.
AC_FUNC_MALLOC
AC_FUNC_REALLOC
AC_CHECK_FUNCS([memset strcasecmp strchr strdup])
AC_OUTPUT
将其该名为configure.ac 然后修改:
configure.ac 文件是 autoconf 的输入文件,经过 autoconf 处理,展开里面的
m4宏,
输出的是 configure 脚本。
第 4 行声明本文件要求的 autoconf 版本,因为本例使用了新版本
2.57,所以在此注明。
第 5 行 AC_INIT 宏用来定义软件的名称和版本等信息
AC_INIT([test], 1.0,****@gmail.com)
增加版本信息(为生成lib库做准备)
lt_major=1
lt_age=1
lt_revision=12
dist_version=0.1.12
AM_INIT_AUTOMAKE(test, $dist_version) //自动生成Makefile文件
增加宏, 打开共享库
AC_PROG_LIBTOOL
# Check for dl
DL_PRESENT=""
AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
if test "x$DL_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
DL_LIBS="-ldl"
AC_SUBST(DL_LIBS)
fi
# Check for libm
M_PRESENT=""
AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
if test "x$M_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
M_LIBS="-lm"
AC_SUBST(M_LIBS)
fi
增加依赖库
# Check for pthread
PTHREAD_PRESENT=""
AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",,
$PTHREAD_LIBS
-lpthread )
if test "x$PTHREAD_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
PTHREAD_LIBS="-lpthread"
AC_SUBST(PTHREAD_LIBS)
fi
要生成项目工程目录和其它目录下的Makefile 文件, 必需加入
AM_CONFIG_FILES的宏:
例如: AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
docs/Makefile])
修改完后Makefile.ac如下:
# -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.
AC_PREREQ(2.57)
AC_INIT([test],[1.0],[****@users.sourceforge.net])
AM_CONFIG_HEADER(config.h)
lt_major=1
lt_age=1
lt_revision=12
dist_version=0.1.12
AM_INIT_AUTOMAKE(test, $dist_version)
AC_SUBST(lt_major)
AC_SUBST(lt_revision)
AC_SUBST(lt_age)
# Checks for programs.
#AC_PROG_CC
#AC_PROG_INSTALL
#AC_PROG_LN_S
#AC_PROG_LIBTOOL
AM_PROG_LIBTOOL
# Checks for libraries.
pkg_modules="gtk+-2.0 >= 2.0.0"
PKG_CHECK_MODULES(GTK_PACKAGE, [$pkg_modules], HAVE_GTK2="yes",
HAVE_GTK2="no" )
AC_SUBST(GTK_PACKAGE_CFLAGS)
AC_SUBST(GTK_PACKAGE_LIBS)
# Check for dl
DL_PRESENT=""
AC_CHECK_LIB( dl, dlopen, DL_PRESENT="yes",, $DL_LIBS -ldl )
if test "x$DL_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBDL, 1, [Define if DL lib is present])
DL_LIBS="-ldl"
AC_SUBST(DL_LIBS)
fi
# Check for libm
M_PRESENT=""
AC_CHECK_LIB( m, sin, M_PRESENT="yes",, $M_LIBS -lm )
if test "x$M_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBM, 1, [Define if libm is present])
M_LIBS="-lm"
AC_SUBST(M_LIBS)
fi
# Check for pthread
(如示例中检测pthread,在生成的Makefile就会自动添加-lpthread)
PTHREAD_PRESENT=""
AC_CHECK_LIB( pthread, pthread_create, PTHREAD_PRESENT="yes",,
$PTHREAD_LIBS
-lpthread )
if test "x$PTHREAD_PRESENT" = "xyes"; then
AC_DEFINE(HAVE_LIBPTHREAD, 1, [Define if libpthread is present])
PTHREAD_LIBS="-lpthread"
AC_SUBST(PTHREAD_LIBS)
fi
# Checks for header files.
#AC_HEADER_DIRENT
#AC_HEADER_STDC
#AC_CHECK_HEADERS([fcntl.h stdlib.h string.h sys/time.h unistd.h])
# Checks for typedefs, structures, and compiler characteristics.
#AC_TYPE_PID_T
#AC_TYPE_SIZE_T
#AC_HEADER_TIME
# Checks for library functions.
#AC_FUNC_CLOSEDIR_VOID
#AC_FUNC_MALLOC
#AC_CHECK_FUNCS([memset strstr])
AC_CONFIG_FILES([Makefile
src/Makefile
data/Makefile
doc/Makefile])
AC_OUTPUT

2.生成各目录下的Makefile.am文件
./Makefile.am //工程目录下
SUBDIR = src data doc
../src/Makefile.am //源码目录下
MAINTAINERCLEANFILES = Makefile.in
INCLUDES = -I../include
CPPFLAGS=-DINSTALL_PREFIX="\"$(prefix)\""
lib_LTLIBRARIES = libtest.la
libtest_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
libtest_la_SOURCES = \
test.c \
test_private.h \
check_match.c \
check_match.h \
test_helpers.c \
test_helpers.h \
debug.h
libtest_la_LIBADD = \
@DL_LIBS@ \
@M_LIBS@

3. 生成autogen.sh脚本, 内容
#! /bin/sh
set -x
aclocal
autoheader
automake --foreign --add-missing --copy
autoconf

保存后修改权限 chmod a+x autogen.sh

3.运行脚本./autogen.sh, 生成configure脚本. 这里可能会遇到错误,
可以根据错误提示作相应修改.

4.运行./configure脚本.自动生成src目录下的makefile文件

5. 切换到目录src, 运行make 自动在当前目录下建立.libs文件,
编程生成的库文件就保存在该目录下.
make install 安装在默认目录 /usr/local/lib/下.

6.如果要生成其它的安装目录,Makefile.am就要这样写
MAINTAINERCLEANFILES = Makefile.in
INCLUDES = -I../include
lib_LTLIBRARIES = libtt.la
libdir = $(prefix)/lib/test
libtt_la_LDFLAGS = -version-info @lt_major@:@lt_revision@:@lt_age@
libtt_la_LIBADD = @PTHREAD_LIBS@
libtt_la_SOURCES = \
tt.c \
video.c \
video.h

Static library & dynamic library -- linux系统下的静态库与动态库

关于实现动态库链接的makefile, 看了<<Advanced Linux
Programming>>,笔记如下:
我们知道,几乎所有的程序在运行时都会链接到一个或多个库。比如C语言的printf函数,调用此函数时就会用到c的标准输入输出库;而在GUI下面,会用到对应的图形库;调用数据库时,会用到数据库系统提供的相应的库,等等。
1.静态库
静态库(archive / static library)就是一些简单的目标文件整合而成的单个文件。可以暂且把它看作是windows下的.lib文件。当把这个库提供给某个文件作为某个程序的接口(不知道"接口"用在这里恰不恰当,个人理解的)时,链接就会把这个库解压,然后搜寻需要的接口,把它加载到程序中来。
linux中静态库的后缀是.a,前缀默认为lib。使用ar命令可以把一个或多个目标文件打包成一个文件。基本格式是:
ar -cr lib*.a opt1.o ... optn.o
其中 参数cr表示creat 和 replace,即创建并替换(这里的替换是指当文件创建成功时,如果有同名文件则替换之)。lib*.a是目标库文件。optx.o是目标文件列表。
生成了库文件后,需要该库的程序只需要在编译的时候加载改库即可。
比如定义了一个函数out(char *s);该函数输出对应的串
对应的文件如下:

out.h:
#ifndef OUT_H
#def OUT_H
void out(char *);
#endif

out.c
#include
#include"out.h"
void out(char *s){
  printf("%s\n",s);
}

main.c
#include"out.h"
int main(int argc,char ** argv){
  int i;
  for(i=1;i