存档

‘生活’ 分类的存档

【转载】不随便牵手,更不随便放手

2010年8月12日 小卢 7 条评论

不随便牵手,更不随便放手
你发觉了吗?爱的感觉,总是在一开始的时候甜蜜,总觉得多了一个人陪。多了一个人帮你分担,你终于不在孤寂单了,因为至少有一个人想着你、恋着你,不论做什么事情,只要能在一起,就是好的。

但是慢慢的,随着认识的加深,你开始发现了对方的缺点,于是问题一个接一个出现,你开始烦、累、甚至想要逃避,有人说爱情就像捡石头,总想捡到一个适合自己的,但是你又如何知道什么时候能捡到呢?她适合你,那你又适合他吗?

其实,爱情应该像磨石子儿,或许刚捡到的时候,你不是那么满意,但是请记住,人是有弹性的,很多事情是可以改变的,只要你有心,有勇气,与其到处去捡未知的石头,还不如将自己已经拥有的石头磨亮磨光。你开始磨了吗?很多人以为,是感情淡了,人才会变得懒惰,其实人是先被懒惰征服,感情才慢慢变淡的。

在某个聚餐的场合,有人提议多吃点虾对身体好,这时候有个中年男人忽然说:“十年前当我老婆还是我女朋友的时候,她说要吃十只虾,我就剥20只给她!现在如果她要我帮他剥虾壳,简直是开玩笑!我连帮她夹菜都没兴趣了,还剥虾壳呢。”

难怪越来越多的人只想谈一次恋爱,却迟迟不肯走入婚姻。因为婚姻容易让人变得懒惰。

如果每个人都懒得讲话,懒得倾听,懒得制造惊喜。懒得温柔体贴,那么夫妻或是情人之间,又怎会不渐行渐远渐无声呢?所以请记住:有活力的爱情,是需要适度殷勤来灌溉的,谈恋爱更是不可以偷懒的。

有一对情侣,相约下班后去用餐、逛街,可是女孩因为公司会议延误了,当她冒雨赶到的时候已经迟到了30多分钟,她男朋友很不高兴的说:“你每次都这样,现在哦什么心情也没了,我以后再不会等你了!”刹那间女孩的心堤崩溃了,她在想:或许,他们再也没有未来了。

同样,在同一个地点,另一对情侣也面临同样的困境,女孩赶到的时候也迟到了半个小时,她的男朋友说:“我想你一定忙坏了吧?”接着他为女孩拭去脸上的雨水,此刻,女孩流泪了。但是流过她脸颊的泪却是温馨幸福的。

你体会到了吗?其实爱恨往往只在我们一念之间!爱不仅要懂得宽容更要及时,很多事可能只在于你心境的转变罢了。如果有个人爱上你,而你也觉得他不错,那并不代表你会选择他。

我们总说:“我要找一个很爱很爱的人,才会谈恋爱。”但是当对方问你,怎样才算很爱很爱的时候,你却无法回答他,因为你自己也不知道。

没错,我们总是以为,我们会找到一个自己很爱很爱的人,可是后来,当我们猛然回首,才发觉自己曾经多么天真。假如从来没有开始,你怎么知道自己会不会很爱很爱那个人呢?其实,很爱很爱的感觉,是要在一起经历了许多事情以后才会发现的。每个人都希望找到自己心目中百分之百的伴侣,但是你有没有想过,在你身边早有人对你默默付出了,只是你没发觉而已。

所以,还是仔细看看身边的人吧,他或许已经等你很久了。当你爱一个人的时候,爱到八分绝对刚刚好。所有的期待和希望都只有七八分,剩下两三分用来爱自己。如果你还继续爱得更多,很可能给对方造成沉重的压力,让彼此喘不过气来,完全丧失了爱情的乐趣。

所以请记住;喝酒不要超过六分醉,吃饭不要超过七分饱。如果你正在为爱迷茫,下面这段话或许可以给你些启示:爱一个人要了解也要开解;要道歉也要道谢;要体贴也要体谅;是接受而不是忍受;是支持而不是支配;是慰问而不是质问;是倾诉而不是控诉;是难忘而不是遗忘;是彼此交流而不是凡事交代;是为对方默默祈求而不是问对方诸多要求。可以浪漫但不是浪费,不要随便牵手,更不要随便放手。

分类: 生活 标签:

[收藏]简单的了解一堂 应该听的课。(曾被疯狂转载)

2010年6月18日 小卢 1 条评论

下面的内容转自:

海bar的博客

一个字一个字的敲上、一个字一个字的品读。
1、什么是孤独?孤独是从人群中偷来的享受,她高傲、优美,完全是精神的自由。孤独,是需要我们有独处的时间,做到“如我所是”,完全不需要装扮、做作,不需要戴着帽子抽根烟来装深沉。
2、什么是寂寞?寂寞是一种病,是一种精神的饥饿。既然是病,就需要治疗。寂寞的人如何找到治疗的方法?方法就是人群,寂寞的人总是需要他人的陪伴。
3、人群的治疗分为两种。一种是利益需要建造人脉,这仅仅是互为功利(确实有用,不过不会有真正的朋友);还有一种是寂寞者的相互取暖,这是廉价的交往。
4、狂欢是一群人的寂寞,孤独是一个人的狂欢。
5、孤独不求外物,反求诸己(也就是淡定)
6、寂寞是无可慰藉的牢笼。因为寂寞的人无所适从,焦躁不安。他们的思想从贫瘠而荒芜,产生自我厌弃感。
7、他比烟花更寂寞。烟花绽放于无形,消失于乌有,当中是有短暂的释放,伴随而来的是无边的寂寞。
8、孤独不是故作姿态,孤独是一种心境。沉默未必是孤独,孤独没有任何形式,那是孤独者精神上的自我流浪。装出来的叫浮躁,那是一种虚荣心,是为了招揽目光。
9、真正的朋友是二人世界。我们很安静,但是不冷清。多一个人就难免会有不能讨论的话题,这就是一种分心,从一种不设防变成了一种社交。三个人的世界太拥挤。
10、很多东西放到时间里去看就能看清楚。要么越走越远,要么越走越近。
11、如果你把朋友当做了男女朋友的备用,那你也就侮辱了友情和爱情。
12、跟朋友在一起也是一种孤独。但是这种孤独更美好,会比自己一个人的时候还自如。因为真正的朋友全然不设防。
13、朋友是奢侈品,奢侈的东西都是不实用的东西。这种东西拥有了就该满足。因为,它除了友情,什么也不能给你。
14、朋友不是附庸,不会只有赞同、妥协。朋友在现实中需要如切如磋,如琢如磨。
15、有些所谓的倾诉、出气筒,都是语言暴力。不该以“这是对朋友的信任”为借口。这是对朋友的滥用。朋友不该承担这种宣泄。soul mate是灵魂上的一体,他不该承担我的琐事。
16、朋友应该是无用的(此处的“用”指利用)。和他在一起的时候就会感到自由自在。执手相看无语,却心事了然。
17、真正的朋友之间不是尝联系也没有关系,隔上两三年,电话那头的人好像从来没有离开过。需要经常联系才能维护的所谓“友情”是不牢靠的,因为一旦不联系,他们会断。(从来也不会想起,永远也不会忘记)
18、两个戴着面具的人就不用做朋友了。
19、人和人之间要保持距离,距离产生美。靠得太近,我们就会看见对方越多的缺点。两块石头投入水里,太近水波就越会相互干扰。
20、人对最亲近的人最残忍,因为太接近,往往看不到对方点点滴滴的优点。
21、当我看不见所有人的时候,我对他们产生了一种精神上的凝望,这种凝望叫做思念。
22、周围的人太多,于是我们对人群淡漠。我们很多人喜欢旅行,是为什么?因为我们是希望找个没有人的地方去自我放逐一下。我们为什么要避开别人?因为孤独者即有趣者。孤独是自我寻乐的消遣方式。
23、人是有“贱”性的。

看过以后总能触动心里的一部分!

分类: 生活 标签:

[收藏]内核中 do{}while(0) 作用

2010年6月16日 小卢 没有评论

看师兄的面经,看到了 do{}while(0),一直在想:while(0)?不会运行的吗!怎么会有这样代码?

百度之,恍然大悟!收藏下来,以供学习!

在Linux内核中,经常会看到do{}while(0)这样的语句,许多人开始都会疑惑,认为do{}while(0)毫无意义,因为他只会执行一次,加不加do{}while(0)效果是完全一样的,其实do{}while(0)主要用于宏定义中。
这里用一个简单点的宏来演示:

#define SAFE_FREE(p) do { free(p);= NULL; } while(0)

假设这里去掉do…while(0),即定义SAFE_FREE为:

#define SAFE_FREE(p) free(p);= NULL;

那么以下代码:

if (NULL != p)
SAFE_FREE(p);
else
...

会被展开为:

if (NULL != p)
free(p);= NULL;
else
...

展开的代码中存在两个问题:

  • if 分支后面有两个语句,导致else分支没有对应的if,编译失败;
  • 假设没有else分支,则SAFE_FREE中的第二个语句无论if测试是否通过都会执行。

将SAFE_FREE的定义加上{}就可以解决上诉问题了,即:

#define SAFE_FREE(p) { free(p);= NULL; }

这样,代码:

if (NULL != p)
SAFE_FREE(p);
else
...

会被展开为:

if (NULL != p)
{ free(p);= NULL; }
else
...

但是,在C程序中,每个语句后面加分号是一种约定俗成的习惯,那么,如下代码:

if (NULL != p)
SAFE_FREE(p);
else
...

将为扩展为:

if (NULL != p)
{ free(p);= NULL; };
else
...

这样,else分支就有没有对应的if了,编译将无法通过。假设用了do{}while(0),情况就不一样了,同样的代码会被扩展为:

if (NULL != p)
do { free(p);= NULL; } while(0);
else
...

不会再出现编译问题。do{}while(0)的使用完全是为了保证宏定义的使用者能无编译出错的使用宏,它不对其使用者做任何假设。

看到上面的解释,估计都很清楚了,呵呵,这个用法原来如此只经典….

分类: 生活 标签:

q上转载量很大的一篇文章:工作与做人

2010年4月1日 小卢 5 条评论

 1、说话要用脑子,敏于事,慎于言,话多无益。很多事成也是嘴,败也是嘴。平时一定要把好门,否则会给自己带来许多麻烦。讲话不要只顾一时痛快、信口开河,以为人家给你笑脸就是欣赏,没完没了的把掏心窝子的话都讲出来,结果让人家彻底摸清了家底。还得偷着笑你。

    2、遇事不要急于下结论。即便有了答案也要等等,也许有更好的解决方式,站在不同的角度就有不同答案,要学会换位思维,特别是在遇到麻烦的时候,千万要学会等一等、看一看,静观其变。很多时候不但麻烦化解了,说不准好运也来了。

    3、要学会大事化小、小事化了。把复杂的事情尽量简单处理,千万不要把简单的事复杂化。掌握办事效率是一门学问,控制好节奏很重要。

    4、这世上没有无缘无故的爱,也没有无缘无故的恨。不要参与评论任何人,做到心中有数就可以了。所谓盖棺定论的道理很简单,就是有人操之过急。谁也没有理论依据来介定好人与坏人,说白了就是利益关系的问题。邓小平三七开了毛泽东,说明伟人也不是完人。
 
    5、做任何事情都要遵守游戏规则,小偷也清楚有些东西是绝对不能偷的。所以说做事情万万不可做绝,落井下石的事绝对不要干,给别人让出退路就等于给自己扫清障碍。

    6、对于那些经常找你麻烦甚至欺负你的人,能忍则忍,没必要时刻与莽夫过不去,但一定要做到心中有数,给他攒着,新仇旧怨积累起来,正义和真理就属于你了。瞅准机会一定要彻底教训他一次,在法律赋予的权限以内,往死里整,往死里揍,让他永远记住:除了亲爹,没人会惯你这些臭毛病.
  
    7、有些人习惯了占你小便宜,小人小肚肠,大人大度量,有机会坑他一把大的,让他出一次血。同样让他记住:天下根本就没什么免费的午餐,哪有白拣的便宜让你赚。
  
    8、明枪易躲,暗箭难防,背后算计你的小人永远不会消失,这是中国特色。小人不可得罪,同样小人也不可饶恕,这是万世不变的真理。对小人要忍让,退一步海阔天空。惹着小人就等于惹了麻烦,天底下顶数小人惹不起。说到底小人也有心小的一面,对待这种人一定要稳准狠,你可以装做什么也没发生,天下太平,万事大吉,然后来个明修栈道,暗渡陈仓,以毒攻毒,让他知道:小人也不是谁都可以做的,做好人要有水准,做小人同样有难度.但是,古往今来,哪个朝代都有小人,真的没有对付小人的好办法,不知道 敬而远之是否可行?

   9、钱,只有花掉的那部分才是真正属于你的财富。你就是家缠万贯,生时舍不得吃、舍不得穿,俩眼一闭,剩下的钱你知道谁花了?冤不冤?就像小品说的,这世上最痛苦的事,就是人死了,钱没花完。(比人活着钱没了还痛苦,只要活着,钱没了,还可以赚。)还有那些省吃俭用的贪官,好好的高官不做,结果因贪返贫,一分钱没花着,还搭上个人财产全部没收,名誉扫地,惨不惨?

    10、对待爱你的人一定要尊重。爱你是有原因的,不要问为什么,接受的同时要用加倍的关爱回报。但是千万不要欺骗别人的感情,哪怕你对人家没兴趣,哪怕人家有缺点,这是你用钱买不来的财富。记住:轻视别人付出的情感就等于蔑视自己,玩物丧志,玩人丧德。爱,是一种美德.
  
    11、背后夸奖你的人,知道了,要珍藏在心里,这里面很少有水分。当面夸奖你那叫奉承,说的再难听些叫献媚。你可以一笑而过,就当什么也没发生。也许不久就有求于你.对于那些当众夸奖你的人,就疏忽不得,也许你转过身去,他就会用指头戳你。掌握一条原则:逢人多贬自己,也少夸别人,选先评优的时候除外。
  
    12、做人做事都不能太贪。小恩小惠攒多了就是一个大窟窿。只要接受就一定要找机会回报,行下春风望夏雨,付出就是为了收获。其实就是一个简单的种子与果实的关系。千万别让天真给害了,记住:人生如戏,都在寻找利益的平衡,只有平衡的游戏才有可能玩下去。
    13、患有心理疾病的人是不负法律责任的。可以没有理由的咬你一口,所以对待疯狗般的人物要敬而远之,保持不来往,不交流。退一步,海阔天空,相信疯狂也是一种人格,虽不值得尊重,但自有其存在的道理,生物链少不了这一环。
  
    14、做一个人生的观光客。说到底只要与人为善,以德服人,离是非远点,靠家人近点,便有了心安,有了惬意。乐观的心态来自宽容,来自大度,来自善解人意,来自与世无争.
  
    15、要有一个平和的心态。坏心情是想不开时折磨出来的,其实现实并没有你想的那样糟糕。生命有高峰也有低谷,根本没有一帆风顺的人生。要拿得起,放得下,拿得起是一种勇气,放得下就需要一种胸怀。邓小平怎么样,三起三落,最后还不是凡事他说了算。
  
    16、所谓的缘分无非只有善恶两种,珍惜善的,也不要绝对排斥恶的,相信擦肩而过也是缘吧。全世界近60亿人口,碰上谁也不容易,所以遇到恶缘,也要试着宽容,给对方一次机会,不可以上来就全盘否定。
 
    17、不要让事业上的不顺影响家人,更不要让家庭的纠纷影响事业。那样做很不划算,家人和事业都受影响,甚至损失。尤其是男人,要善于扛事,男儿有泪不轻弹,要把眼泪咽下去。
  
    18、待人接物要摆正自己的位置,不可以老把自己当人物,老拿自己当领导,老把自己当富翁,老以为自己是情圣,老是自我感觉良好…即便真是小有作为,业绩斐然,也要谨慎,要虚怀若谷,要大智若愚,其实人的最终结局都是一样的,只是你把自己看复杂了。说句俗话:千万别把自己当回事……
  
    19、骗你一次的人绝不会放弃第二次骗你的机会,对骗子不要抱任何幻想. 靠贬低别人提高自己的身份,其结果就暴露自己的无知与贫乏。这就需要良好的素质和渊博的知识,让骗子不敢靠近你!

分类: 工作与就业, 生活 标签:

失之毫厘,差以千里–时间处理引起的麻烦

2010年4月1日 小卢 3 条评论

 

老师说让做两个星期的统计数据,每天或者每小时(如果有空闲时间的话)把数据在A服务器上FTP到B服务器,因为数据以文件的形式缓存了,所以手动做起来比较简单,而且数据是以时间来命名存放的,因此,想到把数据处理程序改一下,然后配合写一个脚本,利用crontab自动化处理?

这样就不用每天都去输命令,只要做一个log,前两天去看看log是不是正常,如果不正常,修整一下,如果数据正常,就可以去休息啦,呵呵

本来这个事情,我想了一下,比较简单,放给师弟去做,结果,他这几天有任务,忙得很,只有自己来动手了,呵呵

先写一个FTP下载,每天8点处理,昨天的数据,把24个数据文件down到服务器B上来;然后修改程序自动化处理昨天24小时数据,处理代码

 time(&timep);
 p=gmtime(&timep);
 for(hour = 0 ; hour <= 23 ; hour++)
 {
   sprintf(filename,"./record/%d-%d-%d.txt",1+p->tm_mon,p->tm_mday-1,hour);
   ...
   ...
 }

我是在3.25开始这样实现这个功能,起初几天很正常,没有什么问题,但是我4.1号用的时候出现了问题,log里面显示程序报错,说的是没有”4-0-*.txt”文件,看到这里我恍然大悟,原来自己忽略了一个细节,每月一号的时候是不能直接减一的,去网上百度下,突然想起 time_t 是格林时间,一个秒数,于是简单修改,实现功能…

 time(&timep);
 timep = (time_t)((long)timep-86400);
 p=gmtime(&timep);
 for(hour = 0 ; hour <= 23 ; hour++)
 {
   sprintf(filename,"./record/%d-%d-%d.txt",1+p->tm_mon,p->tm_mday-1,hour);
   ...
   ...
 }

这个只是很平常的一个问题了,让我想到得就是,作为一个程序员,细心是很重要的,也许就是一个小小的错误,会出现意想不到的危难的后果…

附属知识:

在inux的shell下获取时间戳一般用两种方法,一是直接调用系统变量;二是用纯shell脚本获取,举例如下
一,直接调用系统变量
获取今天时期:`date +%Y%m%d`
获取昨天时期:`date -d yesterday +%Y%m%d`
获取前天日期:`date -d -2day +%Y%m%d`
依次类推比如获取10天前的日期:`date -d -10day +%Y%m%d`
注意以上中间有空格
二,自己用shell实现,如下例子是已知今天日期,推算出昨天的日期的shell

startdate=`date`
d1=`date ‘+%Y%m%d’`
if test ! “$1″ = “”
  then
  d1=$1
fi
echo “TODAY IS ${d1}”
yesterday()
{
  YEAR=`expr substr “${d1}” 1 4`
  MONTH=`expr substr “${d1}” 5 2`
  DAY=`expr substr “${d1}” 7 2`
  if [ $DAY -eq 1 ]
  then
    if [ $MONTH -eq 1 ]
    then
      YEAR=`expr $YEAR – 1`
      MONTH=12
    else
      MONTH=`expr $MONTH – 1`
    fi
  DAY=`echo \`cal $MONTH $YEAR\`|tail -n1|awk ‘{print $NF}’`
  else
    DAY=`expr $DAY – 1`
  fi
d2=`echo “$YEAR $MONTH $DAY”|awk ‘{if (length($2)==1) $2=0$2;if (length($3)==1) $3=0$3;printf “%s%s%s”,$1,$2,$3}’`
}
yesterday
echo “yesterday IS ${d2}”
关于二中的shell脚本不完善,还有些bug比如计算平年和闰年的时候4月份的天数就弄错了,有兴趣的朋友可以继续.

 

时间与日期

通常对于一个程序来说可以确定时间与日期是十分用的。也许他要记录其运行的时间,或者是他要一个特定的时间改变其形为。例如,一个游戏程序也许不会在工作时间运行,或者是一个备份调度会在启动自动备份之前等待早些的工作完成。

所有的Unix系统对于时间与日期都使用相同的起始点:1970年1月1日午午夜GMT。这是Unix的创世纪,而Linux也不例外。而在Linux系统中所有的时间都是以秒记量的。这与MS-DOS处理时间的方式相似,所不同是MS-DOS是由1980年开始的。其他的系统使用其他的记时起始时间。

时间是使用一个定义的time_t类型来处理。这是一个足够大的整数类型来包含以秒计的日期与时间值。在Linux系统上,他是一个长整数,其定义以及相关的操作函数都定义在头文件time.h中。

不要认为时间是32位的。在Unix以及Linux系统上使用一个32位的time_t类型,而这个时间会在2038年重叠。到那时,我们希望这些系统都使用一个大于32位的time_t类型。

#include <time.h>
time_t time(time_t *tloc);

我们可以调用time函数来得到一个底层的时间值,这个函数会返回由纪元起点开始的秒数。如果tloc不为空指针,函数就会将返回值写入tloc所指的变量中。
试验--时间
这里是一个简单的时间程序,envtime.c,来演示time函数:

#include <time.h>
#include <stdio.h>
#include <unistd.h>
int main()
{
  int i;
  time_t the_time;
  for(i = 1; i <= 10; i++) {
      the_time = time((time_t *)0);
      printf(“The time is %ld\n”, the_time);
      sleep(2);
  }
  exit(0);
}

当我们运行这个程序时,他会每隔2秒打印出底层时间值。

$ ./envtime
The time is 1044695820
The time is 1044695822
The time is 1044695824
The time is 1044695826
The time is 1044695828
The time is 1044695830
The time is 1044695832
The time is 1044695834
The time is 1044695836
The time is 1044695838

工作原量

这个程序使用一个空指针参数来调用time函数,这个函数会返回以秒计的时间与日期值。程序会休眠2秒,并且重复调用time函数10次。

使用由1970年开始的以秒计的时间与日期值对于估量某件事持续多少时间是十分有用的。我们只需要简单的使用两个由time调用得到的时间进行减法操作即可。然而结过仔细的考虑,ISO/ANSIC C标准委员会并没有说时time_t类型要用于计量以秒计的时间间隔值,所以他们开发了一个函数,difftime,这个函数会计算两个time_t值之间的间隔,并且返回一个double类型:

#include <time.h>
double difftime(time_t time1, time_t time2);

difftime函数计算两个时间值之间的间隔,并且返回time1-time2的浮点值。对于Linux系统而言,由time返回的值是秒数,并且可以进行操作,但是为了移植考虑,我们应使用difftime函数。

为了以更为有意义的方式来表示时间与日期,我们需要将时间值转换为可以识别的时间与日期。这有标准的函数可以帮助我们做到。

gmtime函数将底层的时间值分隔并且存放到包含更为通用域的一个结构中:

#include <time.h>
struct tm *gmtime(const time_t timeval);

tm结构的定义至少包含下列成员:

成员        描述
int tm_sec    秒,0-61
int tm_min    分,0-59
int tm_hour    时,0-23
int tm_mday    一月中的天,1-31
int tm_mon    一年中的月,0-11(一月为0)
int tm_year    由1900年起的年数
int tm_wday    一星期中的天,0-6(星期日为0)
int tm_yday    一年中的天,0-365
int tm_isdst    有效的白天数

试验--gmtime

这里有一个程序,gmtime.c,使用tm结构与gmtime函数打印当前时间与日期:

#include <time.h>
#include <stdio.h>
int main()
{
    struct tm *tm_ptr;
    time_t the_time;
    (void) time(&the_time);
    tm_ptr = gmtime(&the_time);
    printf(“Raw time is %ld\n”, the_time);
    printf(“gmtime gives:\n”);
    printf(“date: %02d/%02d/%02d\n”,
        tm_ptr->tm_year, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
    printf(“time: %02d:%02d:%02d\n”,
        tm_ptr->tm_hour, tm_ptr->tm_min, tm_ptr->tm_sec);
    exit(0);
}

当我们运行这个程序时,我们会得到更可读的时间与日期值:

$ ./gmtime; date
Raw time is 1044696004
gmtime gives:
date: 103/02/08
time: 09:20:04
Sat Feb 8 09:20:04 GMT 2003

工作原理

这个程序调用time函数得到一个底层的时间值,然后调用gmtime将其转换为一个具有时间与日期值的结构。程序会使用printf函数打印输出。严格来讲,我们不应使用这种方式打印原始时间,因为并不能保证在所有的系统他都是一个long类型。在gmtime函数之后,我们立即运行date命令来比较其输出。

然而,在这里我们一个小问题。如果我们在一个不使用格林尼治时间的时区运行这个程序,或者是我们本地的白天存储时间是有效的(问题?),我们就会注意到这个时间并不正确。这是因为gmtime是使用GMT返回时间。Linux与Unix系统这样做,从而世界上的程序与系统都是同步的。不同时区在同一时间创建的文件会显示出具有相同的创建时间。要查看本地时间,我们需要使用localtime函数来代替。

#include <time.h>
struct tm *localtime(const time_t *timeval);

localtime函数与gmtime相同,所不同的是他会返回一个包含为本地时区进行过调整后的结构。如果我们再次试验gmtime程序,但是使用localtime函数来替换gmtime,我们就会看到一个正确的时间与日期报告。

要将一个打乱的tm结构转换为一个原始的time_t值,我们可以使用mktime函数:

#include <time.h>
time_t mktime(struct tm *timeptr);

如果结构不可以表示为一个time_t值,mktime函数会返回-1。

与date程序所提供的时间与日期等机器值相反,为了友好,我们可以使用asctime与ctime函数:

#include <time.h>
char *asctime(const struct tm *timeptr);
char *ctime(const time_t *timeval);

asctime函数返回一个代表tm结构timeptr给出的时间与日期的字符串。返回的字符串的格式如下:

Sun Jun 6 12:30:34 1999\n\0

他总是26个字符长的固定格式。函数ctime与下面的函数调用等同:

asctime(localtime(timeval))

他使用一个原始时间值作为参数,并将其转换为一个更可读的本地时间。

试验--ctime

让我们使用下面的代码来实际的看一下ctime:

#include <time.h>
#include <stdio.h>
int main()
{
    time_t timeval;
    (void)time(&timeval);
    printf(“The date is: %s”, ctime(&timeval));
    exit(0);
}

将其保存为ctim.c,编译运行,我们应可以看到下面的输出:

$ ./ctime
The date is: Sat Feb 8 09:21:17 2003

工作原理

ctime.c程序调用time函数来得到一个底层的时间值,然后让ctime来完成所有的困难工作,将其转换为一个可读的字符串并打印输出。

为了可以对实际的时间与日期字符串进行更多的控制,Linux与现代的类Unix系统提供了strftime函数。这与用在日期与时间上的sprintf函数相类似,且其工作方式也相似:

#include <time.h>
size_t strftime(char *s, size_t maxsize, const char *format, struct tm *timeptr);

strftime函数会格式化由timeptr指向的tm结构表示的时间与日期,并将其结构放在字符串s中。字符串被指明至少maxsize字符长。format字符串用来控制写入字符串的字符。与printf相似,他包含要传递到字符串的通常字符与格式化时间与日期元素的转义说明。转义说明包括:

转义符        描述
%a        简写的星期名
%A        全写的星期名
%b        简写的月名
%B        全写的月名
%c        日期与时间
%d        一月中的天,01-31
%H        时,00-23
%I        12小时时钟表示的小时,01-12
%j        一年中的天,001-366
%m        一年中的月,01-12
%M        分,00-59
%P        a.m或p.m
%S        秒,00-61
%u        星期中的天,1-7(星期1为1)
%U        一年中的星期,01-53(星期日为一个星期的第一天)
%V        一年中的星期,01-53(星期一为一个星期的第一天)
%w        一个星期中的天,0-6(星期日为0)
%x        本地格式日期
%X        本地格式时间
%y        小于1900的年号
%Y        年
%Z        时区名字
%%        A%字符

所以,由date程序所指定的通常日期对应于strftime中的格式化字符串为

“%a %b %d %H:%M:%S %Y”

为了有助于读取日期,我们可以使用strptime函数,这个函数会将一个表示日期与时间的字符串作为参数,并且创建一个表示同样日期与时间tm结构:

#include <time.h>
char *strptime(const char *buf, const char *format, struct tm *timeptr);

format字符串的组成与strftime的格式化字符串完全相同。strptime的动作形为与sscanf相似,因为他们都搜索字符串,查找标识的域,然后将他们写入变量。在这里的变量为依据格式化字符串要填充的tm结构的成员。然而,与strftime的转义字符比起来,strptime的转义字符是不严密的,因为strptime会在天与月上允许简写与全名两种形式。每一个表示都会匹配strptime中的一个%a说明符。strftime总是在小于10的数字上添加0,而strptime会将其看作可选的。

strptime会返回一个指向转换操作中最后一个处理字符之后的字符的指针。如果遇到不可以转换的字符,转换操作就简单的在那里停止。调用程序需要检测以确保所传递的字符都是可以写入tm结构的有意义的字符。

试验--strftime与strptime

下面我们看一下下面的程序中所使用的转义字符:

#include <time.h>
#include <stdio.h>
int main()
{
    struct tm *tm_ptr, timestruct;
    time_t the_time;
    char buf[256];
    char *result;
    (void) time(&the_time);
    tm_ptr = localtime(&the_time);
    strftime(buf, 256, “%A %d %B, %I:%S %p”, tm_ptr);
    printf(“strftime gives: %s\n”, buf);
    strcpy(buf,”Sat 26 July 2003, 17:53 will do fine”);
    printf(“calling strptime with: %s\n”, buf);
    tm_ptr = &timestruct;
    result = strptime(buf,”%a %d %b %Y, %R”, tm_ptr);
    printf(“strptime consumed up to: %s\n”, result);
    printf(“strptime gives:\n”);
    printf(“date: %02d/%02d/%02d\n”,
        tm_ptr->tm_year % 100, tm_ptr->tm_mon+1, tm_ptr->tm_mday);
    printf(“time: %02d:%02d\n”,
        tm_ptr->tm_hour, tm_ptr->tm_min);
    exit(0);
}

当我们运行这个程序strftime.c时,我们会得到下面的输出:

$ ./strftime
strftime gives: Sunday 06 June, 11:55 AM
calling strptime with: Sat 26 July 2003, 17:53 will do fine
strptime consumed up to: will do fine
strptime gives:
date: 03/07/26
time: 17:53

工作原理

strftime程序通过调用time与localtime函数得到当前的本地时间。然后他通过使用一个合适的格式化字符串作为参数来调用strftime将其转换为可读的格式。为了演示strptime的用法,程序设置了一个包含日期与时间的字符串,然后调用strptime来得到原始的时间与日期值,并且打印输出。转义字符%R是strptime中%H:%M的简写形式。

在这里要注意的一点就是,为了可以成功的搜索一个日期,strptime函数需要一个精确的格式化字符串。通常,他并不会精确的搜索由用户读取的时间,除非这个格式是非常严格的。
也许当我们编译strftime.c时,编译器会提出警告。这是因为GNU库默认并没有声明strftime。这个问题的修正方法就是通过在包含time.h之前添加下面的行来显示的请求X/Open标准特征:
#define _XOPEN_SOURCE

分类: 生活 标签: , , ,

linux程序调试助手–core,解决段错误!

2010年3月24日 小卢 没有评论

出现问题,不知道怎么解决,出现段错误,解决不了。那试一下core文件信息吧!

采用core文件的方法
1.core文件在什么位置创建?

在进程当前工作目录的下创建。通常与程序在相同的路径下。但如果程序中调用了chdir函数,则有可能改变了当前工作目录。这时core文件创建在chdir指定的路径下。有好多程序崩溃了,我们却找不到core文件放在什么位置。和chdir函数就有关系。当然程序崩溃了不一定都产生core文件。

2. 什么时候不产生core文件?

在下列条件下不产生core文件:

( a )进程是设置-用户-ID,而且当前用户并非程序文件的所有者;
( b )进程是设置-组-ID,而且当前用户并非该程序文件的组所有者;
( c )用户没有写当前工作目录的许可权;
( d )文件太大。core文件的许可权(假定该文件在此之前并不存在)通常是用户读/写,组读和其他读。

3.如何产生core文件?
系统中默认的是禁止产生core文件的

[root@localhost ~]# ulimit -c
   0
[root@localhost ~]# ulimit -c 1000

允许产生core文件,并且限制大小为1000
如果还是无法产生core文件,注意看一下,程序是否有当前目录权限。

[root@localhost ~]# gdb Quesimv core

就会定位到出错的具体位置

分类: 生活 标签: , ,

细谈linux gcc的概念及其参数

2010年3月24日 小卢 1 条评论

 

经过长时间的学习linux gcc,发现要理解常用gcc其他参数也是必要的,今天搜集了关于块设备的概念以及作用,希望大家看后会有很多收获。

1、linux gcc包含的c/c++编译器

gcc、cc、c++、g++:

gcc和cc是一样的,c++和g++是一样的,一般c程序就用gcc编译,c++程序就用g++编译

2、linux gcc的基本用法

gcc test.c这样将编译出一个名为a.out的程序

gcc test.c -o test这样将编译出一个名为test的程序

-o参数用来指定生成程序的名字

3、为什么会出现undefined reference to ‘xxxxx’错误?

首先这是链接错误,不是编译错误,也就是说如果只有这个错误,说明你的程序源码本身没有问题,是你用编译器编译时参数用得不对,你没有指定链接程序要用到得库,比如你的程序里用到了一些数学函数,那么你就要在编译参数里指定程序要链接数学库,方法是在编译命令行里加入-lm #P#

4、l参数和L参数

-l参数就是用来指定程序要链接的库,-l参数紧接着就是库名,那么库名跟真正的库文件名有什么关系呢?就拿数学库来说,他的库名是m,他的库文件名是libm.so,很容易看出,把库文件名的头lib和尾.so去掉就是库名了,好了现在我们知道怎么得到库名,当我们自已要用到一个第三方提供的库名字libtest.so,那么我们只要把libtest.so拷贝到/usr/lib里,编译时加上-ltest参数,我们就能用上libtest.so库了(当然要用libtest.so库里的函数,我们还需要与libtest.so配套的头文件)放在/lib和/usr/lib和/usr/local/lib里的库直接用-l参数就能链接了,但如果库文件没放在这三个目录里,而是放在其他目录里,这时我们只用-l参数的话,链接还是会出错,出错信息大概是:“/usr/bin/ld: cannot find -lxxx”,也就是链接程序ld在那3个目录里找不到libxxx.so,这时另外一个参数-L就派上用场了,比如常用的X11的库,它在/usr/X11R6/lib目录下,我们编译时就要用-L/usr/X11R6/lib -lX11参数,-L参数跟着的是库文件所在的目录名。再比如我们把libtest.so放在/aaa/bbb/ccc目录下,那链接参数就是-L/aaa/bbb/ccc -ltest。

另外,大部分libxxxx.so只是一个链接,以RH9为例,比如libm.so它链接到/lib/libm.s

o.x,/lib/libm.so.6又链接到/lib/libm-2.3.2.so,如果没有这样的链接,还是会出错,因为ld只会找libxxxx.so,所以如果你要用到xxxx

库,而只有libxxxx.so.x或者libxxxx-x.x.x.so,做一个链接就可以了ln -s libxxxx-x.x.x.so libxxxx.so手工来写链接参数总是很麻烦的,还好很多库开发包提供了生成链接参数的程序,名字一般叫xxxx-config,一般放在/usr/bin目录下,比如:gtk1.2的链接参数生成程序是gtk-config,执行gtk-config –libs就能得到以下输出"-

L/usr/lib -L/usr/X11R6/lib -lgtk -lgdk -rdynamic、-lgmodule -lglib -ldl -lXi -lXext -lX11 -lm",这就是编译一个gtk1.2程序所需的gtk链接参数,xxx-config除了–libs参数外还有一个参数是–cflags用来生成头文件包含目录的,也就是-I参数,在下面我们将会讲到。你可以试试执行gtk-config

–libs –cflags,看看输出结果。

现在的问题就是怎样用这些输出结果了,最笨的方法就是复制粘贴或者照抄,聪明的办法是在编译命令行里加入这个`xxxx-config –libs –cflags`,比如编译一个gtk程序:gcc gtktest.c `gtk-config –libs –cflags`这样就差不多了。注意`不是单引号,而是1键左边那个键。

除了xxx-config以外,现在新的开发包一般都用pkg-config来生成链接参数,使用方法跟xxx-config类似,但xxx-config是针对特定的开发包,但pkg-config包含很多开发包的链接参数的生成,用pkg-config –list-all命令可以列出所支持的所有开发包,pkg-config的用法就是pkg -config pagName –libs –cflags,其中pagName是包名,是pkg-config–list-all里列出名单中的一个,比如gtk1.2的名字就是gtk+,pkg-config gtk+ –libs –cflags的作用跟gtk-config –libs –cflags是一样的。比如:gcc gtktest.c `pkg-config gtk+ –libs –cflags`

5、include和I参数

-include用来包含头文件,但一般情况下包含头文件都在源码里用#include xxxxxx实现,-include参数很少用。-I参数是用来指定头文件目录,/usr/include目录一般是不用指定的,gcc知道去那里找,但是如果头文件不在/usr/include里我们就要用-I参数指定了,比如头文件放在/myinclude目录里,那编译命令行就要加上-I/myinclude参数了,如果不加你会得到一个"xxxx.h: No such file or directory"的错误。-I参数可以用相对路径,比如头文件在当前目录,可以用-I.来指定。上面我们提到的–cflags参数就是用来生成-I参数的

6、O参数

这是一个程序优化参数,一般用-O2就是,用来优化程序用的,比如gcc test.c -O2,优化得到的程序比没优化的要小,执行速度可能也有所提高

7、shared参数

编译动态库时要用到,比如gcc -shared test.c -o libtest.so #P#

8、几个相关的环境变量

PKG_CONFIG_PATH:用来指定pkg-config用到的pc文件的路径,默认是/usr/lib/pkgconfig,pc文件是文本文件,扩展名是.pc,里面定义开发包的安装路径,Libs参数和Cflags参数等等。

CC:用来指定c编译器

CXX:用来指定cxx编译器

LIBS:跟上面的–libs作用差不多

CFLAGS:跟上面的–cflags作用差不多

CC,CXX,LIBS,CFLAGS手动编译时一般用不上,在做configure时有时用到,一般情况

下不用管环境变量设定方法:export ENV_NAME=xxxxxxxxxxxxxxxxx

9、关于交叉编译

交叉编译通俗地讲就是在一种平台上编译出能运行在体系结构不同的另一种平台上,比

如在我们地PC平台(X86 CPU)上编译出能运行在sparc

CPU平台上的程序,编译得到的程序在X86 CPU平台上是不能运行的,必须放到sparc CPU平台上才能运行。当然两个平台用的都是linux,这种方法在异平台移植和嵌入式开发时用得非常普遍相对与交叉编译,我们平常做的编译就叫本地编译,也就是在当前平台编译,编译得到的程序也是在本地执行,用来编译这种程序的编译器就叫交叉编译器,相对来说,用来做本地编译的就叫本地编译器,一般用的都是gcc,但这种gcc跟本地的gcc编译器是不一样的,需要在编译gcc时用特定的configure参数才能得到支持交叉编译的gcc为了不跟本地编译器混淆,交叉编译器的名字一般都有前缀,比如sparc-xxxx-linux-gnu-gcc,sparc-xxxx-linux-gnu-g++ 等等

10、交叉编译器的使用方法

使用方法跟本地的gcc差不多,但有一点特殊的是:必须用-L和-I参数指定编译器用sparc系统的库和头文件,不能用本地(X86)的库(头文件有时可以用本地的)

例子:sparc-xxxx-linux-gnu-gcc test.c -L/path/to/sparcLib -I/path/to/sparcInclude

gcc与g++

Linux 中最重要的软件开发工具是 GCC。GCC 是 GNU 的 C 和 C++ 编译器。实际上,GCC 能够编译三种语言:C、C++ 和 Object C(C 语言的一种面向对象扩展)。利用 gcc 命令可同时编译并连接 C 和 C++ 源程序。

GCC 可同时用来编译 C 程序和 C++ 程序。一般来说,C 编译器通过源文件的后缀名来判断是 C 程序还是 C++ 程序。在 Linux 中,C 源文件的后缀名为 .c,而 C++ 源文件的后缀名为 .C 或 .cpp。

gcc 命令只能编译 C++ 源文件,而不能自动和 C++ 程序使用的库连接。因此,通常使用 g++ 命令来完成 C++ 程序的编译和连接,该程序会自动调用 gcc 实现编译。

选项 解释

-ansi 只支持 ANSI 标准的 C 语法。这一选项将禁止 GNU C 的某些特色,例如 asm 或 typeof 关键词。

-c 只编译并生成目标文件。

-DMACRO 以字符串“1”定义 MACRO 宏。

-DMACRO=DEFN 以字符串“DEFN”定义 MACRO 宏。

-E 只运行 C 预编译器。

-g 生成调试信息。GNU 调试器可利用该信息。

-IDIRECTORY 指定额外的头文件搜索路径DIRECTORY。

-LDIRECTORY 指定额外的函数库搜索路径DIRECTORY。

-lLIBRARY 连接时搜索指定的函数库LIBRARY。

-m486 针对 486 进行代码优化。

-o FILE 生成指定的输出文件。用在生成可执行文件时。

-O0 不进行优化处理。

-O 或 -O1 优化生成代码。

-O2 进一步优化。

-O3 比 -O2 更进一步优化,包括 inline 函数。

-shared 生成共享目标文件。通常用在建立共享库时。

-static 禁止使用共享连接。

-UMACRO 取消对 MACRO 宏的定义。

-w 不生成任何警告信息。

-Wall 生成所有警告信息。

以上介绍linux gcc的概念及其参数。

分类: 生活 标签: , , ,

Linux编程中的噩梦–段错误

2010年3月24日 小卢 3 条评论

我们做项目的时候,经常会遇到出现段错误的情况,我们都知道段错误是由于内存、指针或者循环不当造成。

你也学会认为这只是新手出现的问题,但你也许忽略了:当你写了几千行程序了以后,很容易就出现一个莫名的段错误。

我昨天在做远程传输的时候,就遇到了一个问题,两千多行的代码,出现了段错误,因为是多线程,一时还难定位到哪里出了错误。我的gdb以及core也不显示哪一行出错,调了一个晚上也百度了很多知识,今天早上才搞通了。再调试过程中搜了不少资料,整理一下,共享!

 

 

1、段错误的定义

英文:A segmentation fault (often shortened to segfault) is a particular error condition that can occur during the operation of computer software. In short, a segmentation fault occurs when a program attempts to access a memory location that it is not allowed to access, or attempts to access a memory location in a way that is not allowed (e.g., attempts to write to a read-only location, or to overwrite part of the operating system). Systems based on processors like the Motorola 68000 tend to refer to these events as Address or Bus errors.
    Segmentation is one approach to memory management and protection in the operating system. It has been superseded by paging for most purposes, but much of the terminology of segmentation is still used, "segmentation fault" being an example. Some operating systems still have segmentation at some logical level although paging is used as the main memory management policy.
    On Unix-like operating systems, a process that accesses invalid memory receives the SIGSEGV signal. On Microsoft Windows, a process that accesses invalid memory receives the STATUS_ACCESS_VIOLATION exception.

中文:段错误:访问的内存超出了系统给这个程序的内存空间,通常这个值是由gdtr来保存的,gdtr是一个48位的寄存器,其中的32位是保存由它指向的 gdt表,中间13位保存相应于gdt的下标,最后3位包括了程序是否在内存中以及程序的在cpu中的运行级别,指向的gdt是由以64位为一个单位的表,在这张表中就保存着程序运行的代码段以及数据段的起始地址以及与此相应的段限和页面交换还有程序运行级别还有内存粒度等等的信息。一旦一个程序发生了越界访问,cpu就会产生相应的异常保护,于是segmentation fault就出现了。
    通过上面的解释,段错误就是访问了不可访问的内存,这个内存区要么是不存在的,要么是受到系统保护的。

2、段错误是如何产生的?

Segment fault 之所以能够流行于世,是与Glibc库中基本所有的函数都默认型参指针为非空有着密切关系的。

1)代码1:
<br />#include &lt;stdio.h&gt; </p> <p>int main(){&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>int i = 0;&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>&#160;&#160; scanf (&quot;%d&quot;, i);&#160;&#160; //应该使用&amp;i,否则产生段错误,因为访问了保护地址0&#160;&#160;&#160;&#160;&#160;&#160; </p> <p> printf (&quot;%d\n&quot;, i);&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>return 0; </p> <p>} </p> <p>

2)代码2:

</p> <p>#include &lt;stdio.h&gt; </p> <p>int main(){&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>&#160; char *p;&#160;&#160;&#160;&#160; </p> <p>&#160;&#160; p = NULL;&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>&#160; *p = ‘x’;&#160;&#160;&#160;&#160;&#160; //往内存地址0处写东西,所以会产生段错误 </p> <p> printf(&quot;%c&quot;, *p);&#160;&#160;&#160;&#160;&#160;&#160; </p> <p> return 0; </p> <p>} </p> <p>

3)代码3:

<br />#include &lt;stdio.h&gt; </p> <p>int main(){&#160;&#160;&#160;&#160;&#160; </p> <p>&#160;&#160; char test[1];&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>printf(&quot;%c&quot;, test[1000000000]);&#160;&#160;&#160; //数组越界,或者这个地址根本不存在 </p> <p>return 0; </p> <p>} </p> <p>

4)代码4:
</p> <p>#include &lt;stdio.h&gt; </p> <p>int main(){&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>int b = 10;&#160;&#160;&#160;&#160;&#160;&#160; </p> <p> printf(&quot;%s\n&quot;, b); </p> <p> //在打印字符串的时候,实际上是打印某个地址开始的所有字符,但是当你想把整数当字符串打印的时候,这个整数被当成了一个地址,然后printf从这个地址开始去打印字符,直到某个位置上的值为\0。所以,如果这个整数代表的地址不存在或者不可访问,自然也是访问了不该访问的内存——segmentation fault。 </p> <p>return 0; </p> <p>} </p> <p>

5)代码5:
</p> <p>#include &lt;stdio.h&gt; </p> <p>#include &lt;string.h&gt; </p> <p>char c = ‘c’; </p> <p>int i = 10; </p> <p>char buf[100]; </p> <p>printf(&quot;%s&quot;, c);&#160;&#160;&#160;&#160;&#160;&#160; </p> <p>//出现段错误的原因:试图把char型按照字符串格式输出,这里的字符会解释成整数,再解释成地址,所以原因同上面那个例子printf(&quot;%s&quot;, i),试图把int型按照字符串输出。 </p> <p>memset(buf, 0, 100); </p> <p>sprintf(buf, &quot;%s&quot;, c);&#160;&#160; </p> <p>试图把char型按照字符串格式转换。 </p> <p>memset(buf, 0, 100); </p> <p>sprintf(buf, &quot;%s&quot;, i);&#160; <br />
试图把int型按照字符串转换。

6)代码6:

我在进行一个多线程编程的例子里头,定义了一个线程数组

#define THREAD_MAX_NUM

pthread_t thread[THREAD_MAX_NUM];

用pthread_create创建了各个线程,然后用pthread_join来等待线程的结束。

刚开始我就直接等待,在创建线程都成功的时候,pthread_join能够顺利等待各个线程结束,但是一旦创建线程失败,用pthread_join等待那个本不存在的线程时,自然会存在访问不能访问的内存的情况,从而导致段错误。

解决办法为:在创建线程之前,先初始化我们的线程数组,在等待线程的结束的时候,判断线程是否为我们的初始值。如果是的话,说明我们的线程并没有创建成功,所以就不能等,否则就会存在释放那些并不存在或者不可访问的内存空间。

3、怎样避免段错误?
   1)定义了指针后记得初始化,在使用的时候记得判断是否为NULL。
   2)在使用数组的时候是否被初始化,数组下标是否越界,数组元素是否存在等。
   3)在变量处理的时候变量的格式控制是否合理等。

4、怎样发现程序的段错误?
常用的调试方法有:
1)在程序内部的关键位置输出(printf)信息,那样可以跟踪段错误在代码中可能的位置。为了方便使用这种调试方法,可以用条件编译指令#ifdef DEBUG和#endif把printf函数给包含起来,编译的时候加上-DDEBUG参数就可以查看调试信息。反之,不加上该参数进行调试就可以。
2)用gdb来调试,在运行到段错误的地方,会自动停下来并显示出错的行和行号。这个应该是很常用的,如果需要用gdb调试,记得在编译的时候加上-g参数,用来显示调试信息。
3)使用catchsegv命令:通过查看帮助信息,可以看到Catch segmentation faults in programs

【我们】就业,你准备好了吗? FROM CCTV

2010年3月14日 小卢 没有评论

这个视频是我在susie同学q上看到的,我想用susie上推荐 来推荐这个节目:

《我们》栏目有一期,就业,你准备好了吗
是采用了两个典型的案例
中国人民大学一名本科生和北京大学的一名硕士研究生
很优秀,只是有不同的突出点

本以为是简单的程序式的说教式
但是却想起来自己的种种
回顾之前的所谓的“一帆风顺”
是自身的努力,小聪明,还有按部就班和其他的偶然因素

朱民老师说“你能不能靠你内心的动力和意愿,而不完全靠压力,鼓励和支持,
这才是成功和为人的根本的几点”
想来,我也是因人成事,而且成事,也是nothing,
因人成事——因我成事
不清楚自己内心真正的期望
内心的推动和冲动的力量 这个才是永恒,外力总有消逝
追求理想
承认现实
想的心比天高

一个人的生存价值,有两个评价系统

自我的
社会的

两者有很大的gap
社会贡献度是社会评价的唯一标准,
两者结合起来
价值和责任
父母,兄弟,国家,民族,这些都是我们这一代人的责任

所以,就业—职业—-事业

曾经的自由

即将面临的老板,团队合作,这些都是对我们的束缚

了解自己—-发现自己

1.人力资本增值

2.内心的呼唤

3.实现自我的价值

这些也都只是大道理,但是和现实真正的结合起来,显得是有写苍白,却能给我一些启示

 

风和日丽,春天的太阳暖洋洋!

2010年3月14日 小卢 2 条评论

       今天还是像往常一样起了一个大早!洗洗头,回来实验室,空无一人!唉!这一届研一的都比我们去年还要懒啊!就因为是一个星期六都不来实验室了。面对着空空四壁,突然间心里有了一种失落感,非常强烈的失落感。那么好的天,总不能闷在实验室力吧?但是又不能跑出去,其实这几天一直都想着放松一下了,但是马上要开题了,准备资料,整理思路…要做的事情还有很多。着急着呢,昨天和徐总聊了一下,徐总和我大体上指导了下。还好的是有了一些思路。

       研一、以及研二上,一直忙着学习,做开发,一直没有认真的考虑过开题,论文方向的事情。一直拖啊,拖得。所以说:任务远虑必有近忧啊!呵呵!

      突然间就记起了研一的时候,一个比较牛的师兄给我讲的一句话:“不要睡懒觉,每天早点起床!这是你迈向成功的第一步!”当时我还有些不以为然,现在想想,确实是这样!以后坚持每天早上八点起!

分类: 生活 标签:

Site speeded up by PHP Speedy Site speeded up by PHP Speedy