发布新日志

  • 坏上司是一所好学校:可以学到三门重要“功课”[转]

    crystallhy 发布于 2008-08-07 16:10:51

    坏上司是一所好学校,在这所学校里有许多功课可以学,并且是非常重要的功课。

      想到这个题目,是因为收到一位朋友的来信。这位朋友刚刚留学回国,在一所大学供职。前几天来信向我诉苦,说他的那位“混蛋”系主任千方百计地挤兑他。这本是我意料之中的事情,因为我这位朋友机敏多才,初来乍到即崭露头角,而且性情刚烈,生就一把刀子嘴,上司既然少才缺德,不怕他、恨他才怪。

      为他颇感不平之后,却突然想到,照他的个性,发展下去于组织、于他人、于自己、于事业都没啥好处,遇上个跟他过不去的上司未尝不是一件好事。于是写信给他说:坏上司是一所学校,在这所学校里有许多功课可以学,并且是非常重要的功课。

      我想,如果你有一个坏上司,至少有三门功课好学:

       第一课:坏上司能教会你一种面对逆境的平常心

      这应该是人生最宝贵的一课。在面对一个不能由我们自己决定的客观环境时,有两种态度可以选择:一是心平气和、平心静气地接受它,因为这是一个客观的环境;二是从心理上不接受这个不能改变的事实,为它而烦躁、叹息、愤慨。第一种态度至少能够保持自己的心理平衡,第二种态度则是拿别人的错误惩罚自己,在客观上受损失的同时,再加一层心理的伤害。

      一座山挡住你的去路,你不会对着山生气,只能想法攀越它,或者绕过它。一群狼围住你时,你也不会对着狼群生气,你会用最大的智慧和力量战胜它们、消灭它们或者逃避它们。一丛荆棘刺破你的手时,你也知道刺人不过是荆棘的本性而已。为什么这些元素代换成“人”的时候,就令你怒火中烧或者愤愤不平呢?古人说:君子不跟牛执气。跟牛执气,就是把自己降低到牛的层次,跟小人执气呢?

      有一位名字叫弗兰克的心理学家,他在希特勒的集中营里呆了十几年,在那里他的一个重要发现就是:如果一切都不能改变,至少还能改变自己的感受;如果一切都不能控制,至少还能控制自己的风度。还有谁面对的环境能比希特勒的集中营更糟糕呢?

      还有人说,婚姻的意义,就是让一对冤家相互磨砺,以培养出坚韧、自制、温和、稳重、耐心、责任感、善与人相处、容忍不同意见等种种单身所不需要的品质。用希腊哲人苏格拉底的话说,“娶一位好老婆的男人会变得快乐;娶一位坏老婆的男人会变成哲学家。”既然婚姻可以成为培养治国、平天下的能力和美德的学校,坏上司为何不能呢?

      要成为一个领域的领袖人物,首先需要培养节制、坚韧等诸多品质。现在你遇上了一个坏上司,不应该感谢上苍的厚爱吗?你应该以“我不入地狱,谁入地狱”的决心,勇敢地面对你的坏上司。然后,在与坏上司的相处中努力培养你的各项美德。


     第二课:坏上司能激发你的潜能

     台湾的刘墉写过这样一个故事,说他在美国留学的时候,有一天,一位已经就业的同学对他抱怨他的美国老板“吃”他,不但给他很少的薪水,而且故意拖延他的绿卡申请。刘墉当时对他说:“这么坏的老板,不做也罢。

      但你岂能白干这么久,总要多学一点再跳槽,所以你要偷偷地学。”他听了刘墉的话,不但每天加班,留下来背那些商业文书写法,甚至连怎样修理影印机,都跟在工人旁边记笔记,以便有一天自己出去创业,能够省点修理费。隔了半年,刘墉问他,是不是打算跳槽了?他居然一笑:“不用!现在我的老板对我刮目相看,又升官,又加薪,而且绿卡也马上下来了,老板还问我为什么做事态度一百八十度转变,变得那么积极呢?”他心里的不平不见了,他做了“报复”,只是换了一种方法,而且他自我检讨,当时其实是他自己不努力。刘墉接着说:你喜欢斗狠吗?你总是心里愤愤不平吗?你要知道,敌人、仇人都可以激发你的潜能,成为你的贵人。你也要知道,许多仇、怨、不平,其实问题都出在你自己。你更要知道,这世间最好的“报复”,就是运用那股不平之气,使自己迈向成功,以那成功和“成功之后的胸怀”,对待你当年的敌人,且把敌人变成朋友。

      人没有敌手是很难发挥自己的全部潜能的,因为最难的是“战胜自我”。没有敌手的激励,难免怠惰、难免放纵、难免降低追求的目标。

      精神病学家J·A·哈德菲尔德深入研究过危机环境在人的身体、心理、感情和精神上激发的非凡力量。他说:“我们过着拘谨的生活,避开困难的任务,除非我们被迫去做或者下决心去做时,才会产生无形的力量。我们面临危机时,勇气就产生了;被迫接受长期的考验时,就发现自己拥有持久的耐力;灾难降临时,我们会发现内在的潜力,仿佛是出自一个永恒手臂的力量。一般的经验告诉我们,只要我们无所畏惧地接受挑战,自信地发挥我们的力量,任何危险和困难都会激发能量。”

      当“怨怨相报何时了”的两败俱伤,变成“相逢一笑泯恩仇”的双赢时,不是人生的最大成功吗?

      第三课:坏上司能增加你处理组织内部事务的政治智慧

      任何一个组织都需要政治。有人说,一个好的企业家,必须是好的政治家。组织中的政治斗争,从来就不会停止,只不过好企业与坏企业的分别是,好组织有明确的政治斗争规则,而坏的组织则没有。或者说好的组织的游戏规则鼓励积极的斗争,而坏的组织则放任大家内耗,从而导致组织在与别的组织的竞争中落败。

      专家出身的人往往缺乏这一课。著名的“陈天生怪圈”就是例证。

      1986年,陈天生到广州,用1500元自有资金,加上800元稿费,另加一位朋友的5000元,办起了一家技术经济发展公司。公司迅速获得了发展。为了图谋进一步发展,他去海南考察。这时,公司内部有人冒充他的签名私收货款。司法机关找上门,内部马上有人栽赃陈天生,甚至合伙“要在思想上、组织上彻底肃清陈天生的流毒”。于是,法人代表的工资被停发,办公桌被搬出门外,连铺盖卷也被扔了出来。一时间,各分公司纷纷倒戈,百万资产瞬间付之东流。

      1989年,陈天生在广州鼎湖区再度白手起家,创办了鼎湖科技实业城。自筹资金,自生自灭。经过三年的苦干,鼎湖开发区终于兴旺起来了。然而,历史悲剧再次重演。就在陈天生雄心勃勃,准备扩大开发区规模时,突然被这个由自己亲手创办的经济组织抛了出来。他抗争无效,静悄悄地走了。

      1992年陈天生与蒲圻市签订合同,以民间方式筹资在蒲圻建赤壁长江大桥、创办开发区。

      很快,陈天生在家乡这块熟悉的土地上再次显示出杰出的组织协调、招商引资、宣传鼓动等各方面的才能。企业又兴旺起来了。不曾料想,脚下的跳板被人抽走了!陈天生跌了有生以来最大的一跤。乡亲亦无情,他再一次饮恨离开。

      广州怪圈、鼎湖怪圈、蒲圻怪圈这三个怪圈,环环相扣,一圈比一圈大。陈天生创业,红火,转眼间烟消云散,孤身一人,又回到原点。这种怪圈,在不同的企业家身上反复不同程度地发生。

      一个人在自己创业之前遇上一个坏上司,逼迫你学习组织政治学,那就太幸运了。就算你永远不打算自己创业,学好这门功课对你的职业生涯也大有助益。

    有一位在美国三大汽车公司之一高级管理人员遇到了一个难题:一方面他喜欢自己的工作,对薪水也很满意;另一方面,他痛恨自己的上司。他已经忍气吞声好多年了,现在到了忍无可忍的地步。于是,他决定通过一个猎头公司找个新工作。在与猎头公司的交流中他获得了灵感,他把上司的情况告诉猎头公司,委托了猎头公司为上司找一份工作。当这位上司接到电话被告知有一份新的工作在等他时,正好也厌倦了当前的工作,爽快地接受了新的职位。妙就妙在当上司的职位空缺时,这位高级主管申请补缺并且成功了。他从这次调职中领悟了一种高超的政治智慧,让他在这个组织中一帆风顺。

      在与坏上司的过招中,你还会悟到许许多多的“招数”。譬如,宁肯得罪君子,不可得罪小人的原则。你现在就得罪小人了——因为一句话,他就要运用他的职权,找茬扣工资奖金。这已经表明是典型的小人了。但是,你能做到不得罪小人,反而利用小人为你服务吗?再譬如,统一战线原则,不要四面出击,一次只能打击一个对手,同时与其他人联合。这点你做的怎样?同上一级领导的关系、与上一级各职能部门的关系,与外界的关系,与一般同事的关系,都是你的环境的一部分。在与上司的斗争中,你做到了“有理、有利、有节”了,还是负气而为?

      这三门功课学完,你的功力必会大长,今后的事业一定会因此而顺利。天将降大任于斯人也,必先让他遇到坏上司

  • 用LoadRunner编写socket应用的测试脚本

    Spark.lee 发布于 2007-04-17 16:03:06

            LoadRunner提供了很好的对socket应用的支持,用户可以通过录制方法完全获得客户端发送和接收的数据,然后在录制的基础上对相应的数据进行参数化和关联等处理。

            但在有些情况下(例如,客户端程序没有windows上的版本),我们就很难通过录制达成生成脚本的目标了。但如果我们能够完全知晓服务端和客户端的交互过程,完全手工编写一个测试脚本也并不是一件特别困难的事情。

           在本文中,我们以一个实际的例子说明如何根据服务端和客户端交互的过程,用LoadRunner自行编写相应的脚本。

            以下是服务端工作线程的代码:
    DWORD WINAPI mythread( LPVOID lpParameter)    //客户线程
    {
        
    struct My my;
        memcpy(
    &my,lpParameter,sizeof(My));    
        printf(
    "One client connect!\n");
        
    char str1[1024];            //接收字符串
        char str2[1024];
                            
        
    int i;
        i
    =recv(my.skt,str1,sizeof(str1),0);    //接收客户请求
        str1[i]=0;

        
    char *filename;
        filename
    =new char[255];
        
    for(int j=2;j<i;j++)            //获得文件名
        {
            filename[j
    -2]=str1[j];
        }
        filename[i
    -2]=0;
       

        
    if (str1[0]=='S')
        {
            printf(
    "The file name : %s\n",filename);
            ofstream 
    out(filename);                //创文件流   
            if (!out)
            {
                printf(
    "cannot open file.\n");        //文件是否正确打开,打开错误则退出
                send(my.skt,"q",1,0);            //向客户发送退出信息
                closesocket(my.skt);            //解除客户连接;
                return 0;
            }
            str2[
    0]='O';                       
            str2[
    1]='K';
            str2[
    2]=0;
            send(my.skt,str2,strlen(str2),
    0);        //回复OK信息

            i
    =recv(my.skt,str1,sizeof(str1),0);        //接收文件长度
            str1[4]=0;
           
            
    int len;
            len
    =str1[0]*1000+str1[1]*100+str1[2]*10+str1[3];
            printf(
    "The File lenght is: %d Byte\n",len);
           
            
    for(int j=0;j<len;j++)
                {
                    
    char str[1];
                    i
    =recv(my.skt,str,sizeof(str),0);//接收文件,按字节接收,接收字符串为2个字节
                    str[i]=0;
                    
    out.put(str[0]);
                }

            
    out.close();                    //关闭文件
            printf("over!One client quit!\n");        //接收文件完毕
            closesocket(my.skt);                //解除此客户连接
            return 0;
        }

        
    if (str1[0]=='R')
        {       
           
            ifstream 
    in(filename);
            
    if (!in)
            {
                printf(
    "cannot open file or file not exist.\n");    //文件是否正确打开,打开错误则退出
                send(my.skt,"q",1,0);                    //向客户发送退出信息
                closesocket(my.skt);                    //解除客户连接;
                return 0;
            }
            
    char ch;
            
    int len=0;
            
    while(in.get(ch))
            {
                len
    ++;                            //get file lenght
            }
            
    in.close();
            str2[
    0]='O';
            str2[
    1]='K';
            str2[
    2]=len/1000;                       
            str2[
    3]=(len%1000)/100;
            str2[
    4]=(len%100)/10;
            str2[
    5]=len%10;
            printf(
    "%s",str2);
            send(my.skt,str2,
    6,0);                        //发OK+文件长度

            
    in.open(filename);
            
    if (!in)
            {
                printf(
    "cannot open file or file not exist.\n");    //文件是否正确打开,打开错误则退出
                send(my.skt,"q",1,0);                    //向客户发送退出信息
                closesocket(my.skt);                    //解除客户连接;
                return 0;
            }

            
    while(in.get(ch))                        //发文件
            {               
                
    char str[1];
                strcpy(str,
    "");
                str[
    0]=ch;
                str[
    1]=0;
                send(my.skt,str,
    1,0);                    //发送一个字符
            }
            
    in.close();
            printf(
    "over,One client quit!\n");                //传输文件完毕
            closesocket(my.skt);                        //解除此客户连接
            return 0;
        }

        printf(
    "Bad command!\n");
        closesocket(my.skt);
        
    return 0;
    }

            从这段代码中可以看到,当客户端和服务端建立连接后,客户端会先向服务端发送一个请求,该请求的第一个字节是大写的“S”或是“R”,分别向服务端写文件或是从服务端读取文件。从第三个字节开始,后面的内容是请求文件的文件名。

            服务端在接收到客户端的请求后,根据请求的类型,如果是“S”,则打开指定的文件,并返回一个字符串“OK”;如果是“R”,则打开指定的文件并向客户端发送“OK”+“文件长度”。

            随后,如果是“S”,则由客户端发送写入的文件长度和文件内容给服务端;如果是“R”,则向客户端发送文件的内容。

            到此我们已经完全明了了客户端和服务端的交互过程,因此,我们可以尝试在LR中建立一个脚本用户模拟客户端行为。

            下面我们以“S”的处理过程为例编写脚本。

            1、打开VUGen应用;
            2、新建脚本,选择“windows sockets”协议,不需录制;
            3、在Action Section中增加以下内容:
        //建立到服务端的连接
        lrs_create_socket("socket1","TCP","RemoteHost=127.0.0.1:8000",LrsLastArg);
       
        
    //发送“S”和文件名
        lrs_send("socket1""buf0", LrsLastArg);
        lrs_receive(
    "socket1""buf1", LrsLastArg);
       
        
    //发送要写入的数据的长度
        lrs_send("socket1""buf2", LrsLastArg);

        
    //发送数据内容
        lrs_send("socket1""buf3", LrsLastArg);
       
        
    //关闭连接
        lrs_close_socket("socket1");
       
            4、这样就成功的描述了整个交互过程,但还没有给出实际要发送的数据。在采用“Windows Sockets”协议的脚本中,实际发送的数据存放在data.ws Section中,因此,打开该Section,直接输入:
    send  buf0 7
        
    "S"
        
    "\x00"
        
    "1.txt"

    recv buf1 
    2
        
    "OK"

    send buf2 
    3
        
    "\x00"
        
    "\x00"
        
    "\x02"
        
    "\x00"

    send buf3 
    20
        
    "12345678901234567890"

            每个发送和接收的数据包在这里都有登记,“send”和“recv”表示数据的方向;“buf0”等表示数据包的描述,和脚本中的内容对应;接下来的一个整数表示数据包的长度;然后是数据包的内容,“\x00”表示16进制的00。

            该脚本描述了客户端向服务端请求写入一个文件1.txt,文件内容为“12345678901234567890”的过程。

            以下是脚本和服务端程序(可执行文件)的下载链接,读者可以下载到本地自行试验。

           下载服务端程序

           下载脚本

         
  • Loadrunner 获取当前系统时间

    qiguojie 发布于 2007-07-04 15:02:48

    今天有个朋友问我lr怎么获取当前系统时间,正好最近几天学习过,就写了几个例子给大家。

     

    本人在51testing所有文章全部为原创,转载请注明出处!!!

     

    文章概述

    方法一是使用lr的参数化,非常方便,对lr熟悉的各位朋友也能马上上手,时间格式也有很多,可以自由选择

    方法二是使用的time()和ctime()函数,得到日历格式的时间,2个函数使用都很方便

    方法三是使用C语言的tm结构,把时间分解成若干元素,这样如果我们只想得到星期、年份、当前秒等值就非常方便,因为上面2个方法如果想得到具体的元素是非常麻烦,可能需要自己写函数把需要的串抓出来

     

    获取当前系统时间方法一

    方法描述:使用loadrunner的参数化获取当前时间

    步骤:

    1、将复制给aa的值参数化
    2、选中abc,使用右键选择"Replace with a parameter."
    3、在弹出窗口内填写参数名称为:localtime_now
    4、选择参数类型为Date/Time
    5、在属性选项里,选择时间格式化选项(可以选择很多种)
    6、关闭属性窗口,确认函数创建窗口,参数化完成
    7、将参数化的内容赋值给字符指针aa,需要使用lr_eval_string()函数转换一下

    示例如下:

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

    Action()
    {
       char *aa;
    // aa = "abc"; //未参数前
    // aa = "{localtime_now}";//参数化后
       aa = lr_eval_string("{localtime_now}");//最终赋值语句
       lr_message("参数化获得本地当前时间的结果是:%s",aa);
       return 0;
    }

    运行结果:参数化获得本地当前时间的结果是:2007-07-04 14:01:39.746

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

     

    获取当前系统时间方法二

    方法描述:使用C语言日历函数获取当前系统时间

    函数出处:time.h

    示例如下:

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

    Action()
    {
        long t;
        time(&t);//获取当前时间
        lr_message("直接获取当前时间的结果是:%s",ctime(&t));
        return 0;
    }

    运行结果:直接获取当前时间的结果是:Wed Jul 04 14:01:39 2007

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

     

    获取当前系统时间方法三

    方法描述:使用tm结构获得组成分解的当前系统时间;

             ANSI C标准:tm表示的结构为时间分解结构(就是把时间分解为表示时间的各个组成)

    结构出处:time.h

    注意:tm结构的名字"tm"不可修改;结构中的9项顺序不可更改;

    示例如下:

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

    /*
    标准库:time.h
    ANSI C标准:tm表示的结构为时间分解结构(就是把时间分解为表示时间的各个组成)

    */

    struct tm {

           int second;   //取得当前秒数(在分钟后);取值区间为[0,59]
           int minute;   //取得当前分钟数(在小时后);取值区间为[0,59]
           int hour;  //取得当前小时数(从凌晨0点开始);取值区间为[0,23]
           int day;      //取得当前天数(从上月结束开始);取值区间为[1,31]
           int month;   //取得当前月份数(从1月开始);取值区间为[0,11]
           int year;   //取得当前年份数(从1900年开始)
           int weekday;  //取得当前日期数(为了获取星期几,从上个星期日开始);取值区间为[0,6]
           int yearday;  //取得当前年份天数(从1月1日开始);取值区间为[0,365]
           int daylight; //取得当前夏令时标识符,实行夏令时的时候,daylight取得一个正数
          //不实行夏令时的进候,daylight为0;
          //不了解情况时,daylight为负数
    };


    Action()
    {
         long timenow;//定义保存时间的变量
         struct tm *now;//定义结构指针
         int a,b,c,d;//非别存储小时、分钟、秒、星期
         char *week;
         time(&timenow);//获取当前时间
         now = (struct tm *)localtime(&timenow);//把当前时间的结构指针赋值给now
         a = now->hour;//获取hour值
         b = now->minute;//获取minute值
         c = now->second;//获取second值
         d = now->weekday;//获取week值

         switch(d)//判断得到中文的星期
         {
           case 1:week ="星期一";//如果d=1,那么就是星期一,以下类似
             break;
           case 2:week ="星期二";
             break;
           case 3:week ="星期三";
             break;
           case 4:week ="星期四";
             break;
           case 5:week ="星期五";
             break;
           case 6:week ="星期六";
             break;
           case 0:week ="星期日";
             break;
          };
         lr_message ("使用结构获取的当前时间为:%d:%d:%d,%s",a,b,c,week);
         return 0;
    }

    运行结果:使用结构获取的当前时间为:14:1:40,星期三

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

     

Open Toolbar