日历

« 2008-09-05  
 123456
78910111213
14151617181920
21222324252627
282930    

音乐欣赏

统计信息

  • 访问量: 1506
  • 日志数: 27
  • 建立时间: 2007-04-17
  • 更新时间: 2008-07-23

RSS订阅

我想做些事,我想做些有用的事,我想做些我可以做到的事,我想做些软件开发和测试的事……

我的最新日志

  • IE打不开.xml文件弹出下载对话框的解决办法

    2008-7-23

    今天查看某网站用.xml文件做的时,才是提示下载。根本打不开

    我试图在文件夹选项可注册表中重新设置打开方式,结果还是不行。。

    到网上搜索一下相关的方法呢。

    果然搜索到了,使用以下命令就可以恢复XML文件的默认关联:
     
    REGSVR32 MSXML3.DLL

    运行之后,XML的打开方式就恢复默认了。

  • 使用LoadRunner监控Linux方法

    2008-4-23

    需要下载3个包,到网上google一个吧:

    (1)rsh-0.17-14.i386.rpm

    (2)rsh-server-0.17-14.i386.rpm

    (3)rpc.rstatd-4.0.1.tar.gz

    1.安装rsh,和rsh-server两个服务包。

    a. 卸载rsh

    rpm –q rsh----------查看版本号

    rpm -e 版本号---------卸载该版本。

    b.安装

    rpm –ivh rsh-0.17-14.i386.rpm rsh-server-0.17-14.i386.rpm

    这两个包在我的目录下有共享。

    2.下载并安装rstatd

    gunzip rpc.rstatd-4.0.1.tar.gz

    Tar –cvf rpc.rstatd-4.0.1.tar.

    ./configure ---配置

    make ---编译

    make install ---安装

    rpc.rstatd ---启动rstatd进程

    3. 打开/etc/xinetd.conf

    里面内容是:

    # Simple configuration file for xinetd

    #

    # Some defaults, and include /etc/xinetd.d/

    defaults

    {

    instances = 60

    log_type = SYSLOG authpriv

    log_on_success = HOST PID

    log_on_failure = HOST

    cps = 25 30

    }

    includedir /etc/xinetd.d

    4.重启xinetd:

    A: service xinetd reload

    B: /sbin/service xinetd rstart

    5.修改/etc/xinetd.d/下的三个conf文件 rlogin ,rsh,rexec 这三个配置文件

    打这三个文件,将里面的disable = yes都改成 disable = no (disabled用在默认的{}中禁止服务)

    或是把# default: off都设置成 on ,并把“#”去掉,这个的意思就是在xinetd启动的时候默认都启动上面的三个服务!

    6.启动rstatd: rpc.rstatd

    7.查看rstatd是否启动:

    rpcinfo –p

    假如能看到:

    100001 5 udp 618 rstatd

    100001 3 udp 618 rstatd

    100001 2 udp 618 rstatd

    100001 1 udp 618 rstatd

    就说明rstatd服务已经启动。可以用LR去添加LINUX机器监视它了。

  • JAVA对象中的hashCode()方法

    2008-2-28

    有效和正确定义hashCode()和equals() 

    每个Java对象都有hashCode()和 equals()方法。许多类忽略(Override)这些方法的缺省实施,以在对象实例之间提供更深层次的语义可比性。在Java理念和实践这一部分,Java开发人员Brian Goetz向您介绍在创建Java类以有效和准确定义hashCode()和equals()时应遵循的规则和指南。您可以在讨论论坛与作者和其它读者一同探讨您对本文的看法。(您还可以点击本文顶部或底部的讨论进入论坛。) 
    虽然Java语言不直接支持关联数组 -- 可以使用任何对象作为一个索引的数组 -- 但在根Object类中使用hashCode()方法明确表示期望广泛使用HashMap(及其前辈Hashtable)。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式中支持散列可以促进基于散列的容器的开发和使用。 
    定义对象的相等性 
    Object类有两种方法来推断对象的标识:equals()和hashCode()。一般来说,如果您忽略了其中一种,您必须同时忽略这两种,因为两者之间有必须维持的至关重要的关系。特殊情况是根据equals() 方法,如果两个对象是相等的,它们必须有相同的hashCode()值(尽管这通常不是真的)。 
    特定类的equals()的语义在Implementer的左侧定义;定义对特定类来说equals()意味着什么是其设计工作的一部分。Object提供的缺省实施简单引用下面等式: 
    public boolean equals(Object obj) { return (this == obj); } 
    在这种缺省实施情况下,只有它们引用真正同一个对象时这两个引用才是相等的。同样,Object提供的hashCode()的缺省实施通过将对象的内存地址对映于一个整数值来生成。由于在某些架构上,地址空间大于int值的范围,两个不同的对象有相同的hashCode()是可能的。如果您忽略了hashCode(),您仍旧可以使用System.identityHashCode()方法来接入这类缺省值。 
    忽略 equals() -- 简单实例 
    缺省情况下,equals()和hashCode()基于标识的实施是合理的,但对于某些类来说,它们希望放宽等式的定义。例如,Integer类定义equals() 与下面类似: 
    public boolean equals(Object obj) { 
    return (obj instanceof Integer 
    && intValue() == ((Integer) obj).intValue()); 

    在这个定义中,只有在包含相同的整数值的情况下这两个Integer对象是相等的。结合将不可修改的Integer,这使得使用Integer作为HashMap中的关键字是切实可行的。这种基于值的Equal方法可以由Java类库中的所有原始封装类使用,如Integer、Float、Character和Boolean以及String(如果两个String对象包含相同顺序的字符,那它们是相等的)。由于这些类都是不可修改的并且可以实施hashCode()和equals(),它们都可以做为很好的散列关键字。 
    为什么忽略 equals()和hashCode()? 
    如果Integer不忽略equals() 和 hashCode()情况又将如何?如果我们从未在HashMap或其它基于散列的集合中使用Integer作为关键字的话,什么也不会发生。但是,如果我们在HashMap中使用这类Integer对象作为关键字,我们将不能够可靠地检索相关的值,除非我们在get()调用中使用与put()调用中极其类似的Integer实例。这要求确保在我们的整个程序中,只能使用对应于特定整数值的Integer对象的一个实例。不用说,这种方法极不方便而且错误频频。 
    Object的interface contract要求如果根据 equals()两个对象是相等的,那么它们必须有相同的hashCode()值。当其识别能力整个包含在equals()中时,为什么我们的根对象类需要hashCode()?hashCode()方法纯粹用于提高效率。Java平台设计人员预计到了典型Java应用程序中基于散列的集合类(Collection Class)的重要性--如Hashtable、HashMap和HashSet,并且使用equals()与许多对象进行比较在计算方面非常昂贵。使所有Java对象都能够支持 hashCode()并结合使用基于散列的集合,可以实现有效的存储和检索。 
    实施equals()和hashCode()的需求 
    实施equals()和 hashCode()有一些限制,Object文件中列举出了这些限制。特别是equals()方法必须显示以下属性: 
    Symmetry:两个引用,a和 b,a.equals(b) if and only if b.equals(a) 
    Reflexivity:所有非空引用, a.equals(a) 
    Transitivity:If a.equals(b) and b.equals(c), then a.equals(c) 
    Consistency with hashCode():两个相等的对象必须有相同的hashCode()值 
    Object的规范中并没有明确要求equals()和 hashCode() 必须一致 -- 它们的结果在随后的调用中将是相同的,假设“不改变对象相等性比较中使用的任何信息。”这听起来象“计算的结果将不改变,除非实际情况如此。”这一模糊声明通常解释为相等性和散列值计算应是对象的可确定性功能,而不是其它。 
    对象相等性意味着什么? 
    人们很容易满足Object类规范对equals() 和 hashCode() 的要求。决定是否和如何忽略equals()除了判断以外,还要求其它。在简单的不可修值类中,如Integer(事实上是几乎所有不可修改的类),选择相当明显 -- 相等性应基于基本对象状态的相等性。在Integer情况下,对象的唯一状态是基本的整数值。 
    对于可修改对象来说,答案并不总是如此清楚。equals() 和hashCode() 是否应基于对象的标识(象缺省实施)或对象的状态(象Integer和String)?没有简单的答案 -- 它取决于类的计划使用。对于象List和Map这样的容器来说,人们对此争论不已。Java类库中的大多数类,包括容器类,错误出现在根据对象状态来提供equals()和hashCode()实施。 
    如果对象的hashCode()值可以基于其状态进行更改,那么当使用这类对象作为基于散列的集合中的关键字时我们必须注意,确保当它们用于作为散列关键字时,我们并不允许更改它们的状态。所有基于散列的集合假设,当对象的散列值用于作为集合中的关键字时它不会改变。如果当关键字在集合中时它的散列代码被更改,那么将产生一些不可预测和容易混淆的结果。实践过程中这通常不是问题 -- 我们并不经常使用象List这样的可修改对象做为HashMap中的关键字。 
    一个简单的可修改类的例子是Point,它根据状态来定义equals()和hashCode()。如果两个Point 对象引用相同的(x, y)座标,Point的散列值来源于x和y座标值的IEEE 754-bit表示,那么它们是相等的。 
    对于比较复杂的类来说,equals()和hashCode()的行为可能甚至受到superclass或interface的影响。例如,List接口要求如果并且只有另一个对象是List,而且它们有相同顺序的相同的Elements(由Element上的Object.equals() 定义),List对象等于另一个对象。hashCode()的需求更特殊--list的hashCode()值必须符合以下计算: 
    hashCode = 1; 
    Iterator i = list.iterator(); 
    while (i.hasNext()) { 
    Object obj = i.next(); 
    hashCode = 31*hashCode + (obj==null ? 0 : obj.hashCode()); 

    不仅仅散列值取决于list的内容,而且还规定了结合各个Element的散列值的特殊算法。(String类规定类似的算法用于计算String的散列值。) 
    编写自己的equals()和hashCode()方法 
    忽略缺省的equals()方法比较简单,但如果不违反对称(Symmetry)或传递性(Transitivity)需求,忽略已经忽略的equals() 方法极其棘手。当忽略equals()时,您应该总是在equals()中包括一些Javadoc注释,以帮助那些希望能够正确扩展您的类的用户。 
    作为一个简单的例子,考虑以下类: 
    class A { 
    final B someNonNullField; 
    C someOtherField; 
    int someNonStateField; 

    我们应如何编写该类的equals()的方法?这种方法适用于许多情况: 
    public boolean equals(Object other) { 
    // Not strictly necessary, but often a good optimization 
    if (this == other) 
    return true; 
    if (!(other instanceof A)) 
    return false; 
    A otherA = (A) other; 
    return 
    (someNonNullField.equals(otherA.someNonNullField)) 
    && ((someOtherField == null) 
    ? otherA.someOtherField == null 
    : someOtherField.equals(otherA.someOtherField))); 

    现在我们定义了equals(),我们必须以统一的方法来定义hashCode()。一种统一但并不总是有效的定义hashCode()的方法如下: 
    public int hashCode() { return 0; } 
    这种方法将生成大量的条目并显著降低HashMaps的性能,但它符合规范。一个更合理的hashCode()实施应该是这样: 
    public int hashCode() { 
    int hash = 1; 
    hash = hash * 31 + someNonNullField.hashCode(); 
    hash = hash * 31 
    + (someOtherField == null ? 0 : someOtherField.hashCode()); 
    return hash; 

    注意:这两种实施都降低了类状态字段的equals()或hashCode()方法一定比例的计算能力。根据您使用的类,您可能希望降低superclass的equals()或hashCode()功能一部分计算能力。对于原始字段来说,在相关的封装类中有helper功能,可以帮助创建散列值,如Float.floatToIntBits。 
    编写一个完美的equals()方法是不现实的。通常,当扩展一个自身忽略了equals()的instantiable类时,忽略equals()是不切实际的,而且编写将被忽略的equals()方法(如在抽象类中)不同于为具体类编写equals()方法。关于实例以及说明的更详细信息请参阅Effective Java Programming Language Guide, Item 7 (参考资料) 。 
    有待改进? 
    将散列法构建到Java类库的根对象类中是一种非常明智的设计折衷方法 -- 它使使用基于散列的容器变得如此简单和高效。但是,人们对Java类库中的散列算法和对象相等性的方法和实施提出了许多批评。java.util中基于散列的容器非常方便和简便易用,但可能不适用于需要非常高性能的应用程序。虽然其中大部分将不会改变,但当您设计严重依赖于基于散列的容器效率的应用程序时必须考虑这些因素,它们包括: 
    太小的散列范围。使用int而不是long作为hashCode()的返回类型增加了散列冲突的几率。 
    糟糕的散列值分配。短strings和小型integers的散列值是它们自己的小整数,接近于其它“邻近”对象的散列值。一个循规导矩(Well-behaved)的散列函数将在该散列范围内更均匀地分配散列值。 
    无定义的散列操作。虽然某些类,如String和List,定义了将其Element的散列值结合到一个散列值中使用的散列算法,但语言规范不定义将多个对象的散列值结合到新散列值中的任何批准的方法。我们在前面编写自己的equals()和hashCode()方法中讨论的List、String或实例类A使用的诀窍都很简单,但算术上还远远不够完美。类库不提供任何散列算法的方便实施,它可以简化更先进的hashCode()实施的创建。
    当扩展已经忽略了equals()的 instantiable类时很难编写equals()。当扩展已经忽略了equals()的 instantiable类时,定义equals()的“显而易见的”方式都不能满足equals()方法的对称或传递性需求。这意味着当忽略equals()时,您必须了解您正在扩展的类的结构和实施详细信息,甚至需要暴露基本类中的机密字段,它违反了面向对象的设计的原则。 
    结束语 
    通过统一定义equals()和hashCode(),您可以提升类作为基于散列的集合中的关键字的使用性。有两种方法来定义对象的相等性和散列值:基于标识,它是Object提供的缺省方法;基于状态,它要求忽略equals()和hashCode()。当对象的状态更改时如果对象的散列值发生变化,确信当状态作为散列关键字使用时您不允许更更改其状态。 
  • PostgreSQL 8.2.5 + PostGIS 1.3.1 安装 (修改kylin日志)

    2008-1-16

    一、LINUX下安装

    1. 环境
    OS: RedHat AS4 Update4
    PostgreSQL: 8.2.5
    PostGIS: 1.3.1

    2. 需要的软件包
    postgresql-8.2.5.tar.gz
    proj-4.5.0.tar.gz
    geos-3.0.0rc4.tar.bz2
    postgis-1.3.1.tar.gz

    3. 编译安装源码
    (1)PostgreSQL 的安装
    # tar xvfz postgresql-8.2.5.tar.gz
    # cd postgresql-8.2.5
    # ./configure --prefix=/opt/postgresql-8.2.5
    # make
    # make install
    # cd /usr/local
    # ln -s /opt/postgresql-8.2.5 pgsql
    # useradd postgres
    # su - postgres
    $ mkdir data
    $ /usr/local/pgsql/bin/initdb -D data

    (2)Proj 的安装
    # tar xvfz proj-4.5.0.tar.gz
    # cd proj-4.5.0
    # ./configure --prefix=/opt/proj-4.5.0
    # make
    # make install
    # ln -s /opt/proj-4.5.0 /usr/local/proj

    (3)Geos 的安装
    # tar xvfj geos-3.0.0rc4.tar.bz2
    # cd geos-3.0.0rc4
    # ./configure --prefix=/opt/geos-3.0.0rc4
    # make; make install
    # ln -s /opt/geos-3.0.0rc4 /usr/loca/geos

    (4)PostGIS 的安装
    # tar xvfz postgis-1.3.1.tar.gz
    # cd postgis-1.3.1
    # LDFLAGS=-lstdc++ ./configure --prefix=/opt/postgis-1.3.1 --with-pgsql=/usr/local/pgsql/bin/pg_config --with-proj=/usr/local/proj --with-proj-libdir=/usr/local/proj/lib --with-geos=/usr/local/geos/bin/geos-config --with-geos-libdir=/usr/local/geos/lib
    # make; make install
    # ln -s /opt/postgis-1.3.1 /usr/local/postgis

    4. 配置环境
    (1)创建用户 postgres
    # groupadd postgres
    # useradd -g postgres postgres

    (2)用户postgres的环境变量
    # su - postgres
    $ vi .bash_profile

    PGDATA=$HOME/data
    PGSQL_HOME=/usr/local/pgsql
    PROJ_HOME=/usr/local/proj
    GEOS_HOME=/usr/local/geos
    POSTGIS_HOME=/usr/local/postgis
    LD_LIBRARY_PATH=$PGSQL_HOME/lib:$PROJ_HOME/lib:$GEOS_HOME/lib:$POSTGIS_HOME/lib
    PATH=$PGSQL_HOME/bin:$PATH:$HOME/bin

    export PATH PGDATA PGSQL_HOME PROJ_HOME GEOS_HOME POSTGIS_HOME LD_LIBRARY_PATH

    $ exit

    (2)PostgreSQL 数据库配置
    # su - postgres
    $ cd data
    修改postgres.conf, pg_hba.conf, 使用户可以远程访问。

    (3)PostGIS 安装配置
    # su - postgres
    $ postgres -D data &
    $ createdb gisdb
    $ createlang plpgsql gisdb
    $ cd $POSTGIS_HOME/share
    $ psql -d gisdb -f lwpostgis.sql
    $ psql -d gisdb -f lwpostgis_upgrade.sql
    $ psql -d gisdb -f spatial_ref_sys.sql

    至此安装成功,注意LD_LIBRARY_PATH里的路径设置一定要包含 proj 和 geos 的库的路径,否则 psql -f xxxx.sql 的时候会失败。

    5. 最后安装Windows客户端 PgAdminIII,安装好了,就可以用PgAdminIII连接的数据库服务器,可以查看到gisdb数据库里有了PostGIS的空间函数,数据类型等支持了。

    二、WINDOWS下安装,相对很简单就不再细化步骤了。

    在此要提醒一下,安装完成之后,使用客户端调用GIGS模板创建数据库时老是会弹出有另一用户在使用该数据库!然而根本就没有另外的用户在使用它。找了半天都不知其原因,最后在服务里面把数据库重启一下,就OK了。

  • QTP录制不了的原因

    2008-1-07

    问题起因:
    在安装QTP后,或者禁用IE浏览器里的一些ActiveX控件后,正常录制QTP事,不能产生相应的录制脚本,脚本内容为空。

    解决方法:QTP在IE中录制脚本是依靠一个叫BHOManager Class的动态链接库来完成的。当这个控件没有被加载,或者被禁用时,就会出现上述症状。于是,解决方法就很简单了,重新加载,或启用这个控件,一切就OK啦。

    具体步骤:
    打开IE,在菜单中选择[工具]/[Internet选项]进入Internet配置界面。选择[程序]/[管理加载项],查看目前加载的ActiveX的情况。

    当看到存在BHOManager Class并且其状态是“禁用”时,点击“启用”开启这个功能,并保存后退出即可解决问题。
    当在管理加载项里找不到BHOManger Class这个加载项时,如果你安装了QTP,那么在C:\WINDOWS\system32下会存在一个叫BHOManager.dll的动态链接库,或者可以直接在计算机里搜索BHOManager.dll,然后查看其路径。加载这个dll,加载方法为:点击[开始]/[运行],输入cmd,然后定位到dll所在目录,键入regsvr32 BHOManager.dll命令,即可注册此dll。问题解决。

    注:如发现BHOManger Class是启用状态,但仍录制不了,就先禁用再重新启用一遍!

     

  • 〔转〕10年跳槽经验总结 高级人才不用找工作

    2008-1-03

    首先,真正的高级人才是不用找工作的,因为只有被工作找的份。

    但是,难免有些高级人才厌倦了旧的工作环境,或者遇到天花板,没有了发展空间,或者遇到新老板上任后排除异己来提拔自己的亲信等等,如果您真打算自己去找工作,那么至少需注意以下几点:

    1、网上求职尤其需注意那些一天到晚在网上打招聘广告的公司。这类公司通常分成两类:
    一类是垃圾公司,如一些别有用心的保险公司、中介公司等。这类公司以获取你的个人资源和个人信息为目的。

    二类是某些小有名气的公司,但由于用人条件苛刻并且薪资待遇与他们的苛刻要求不匹配,所以一年到头在招人,却总也招不到让他们满意的人。还有一些著名公司,以打广告为目的,招人为幌子,一个破烂职位能放在网上招一两年。

    2、千万小心猎头公司。他们更象是猎狗公司,他们嗅觉灵敏,对打探个人隐私有着狂热而又执着的癖好,往往是工作没给你找成功,却把你现在工作的公司,以前工作的公司闹得沸沸扬扬。如果你不想丢掉现在的工作,不想让你以前的同事议论非非,那么,请慎重选择猎头公司,慎重透露你的隐私给猎头公司。切记切记。

    3、只给你发邮件而不打电话叫你去面试的公司,必须不予理睬。通常是一些垃圾公司,没有能力满足你的基本要求。他们自己也没把握雇得起你,所以连电话费也免了。

    4、第一次电话就让你于某月某日几点钟去哪里面试的公司,必须立刻回绝。因为你到时候到那里一看,一堆刚毕业2、3年的年轻后生正爬在桌子上填写简历。你跟这些人竞争的结果就是你的工资最多只有他们的1倍高,5、6千顶天了。那么应该怎么回答呢?告诉人事经理,我没空,我只有莫月某日下午几点钟才有空,若不然,就不用去了,浪费时间,肯定是低级职位。
     
    5、第一次面试就让你带好学历学位证书去面试的公司,千万别去,因为不用问,肯定是低级职位。

    6、去公司面试前必须问清楚是谁面试你,如果得知不是总经理或副总经理来面你,那么我劝你立刻回绝这个职位,因为如果面你的是个低三下四的中层干部,那么你的职位肯定是低四下五的低贱职位。总之,打扮得笔挺结果给猪看了,即花钱又浪费时间。

    7、一进门就让你填一堆表格的公司,必须立马走人,因为这是招聘中低等员工的惯用伎俩,特别是对那些喜欢出一些狗屁不通的试卷的公司,千万不要跟他们浪费时间。况且,应聘的人为了得到这份工作,根本就不可能按自己的真实情况回答这种测试卷,废纸一堆,招聘的人根本不懂人事管理。

    8、不要去人才市场找工作,高端职位不是放在菜市场上卖的。

    9、如果公司所在城市离你较远,需要飞机前往,一定要问明公司报销不报销路费。如果不报销,或者说如果录取就报销的公司,建议不要冒险去试。即使十个面试者中最后被你淘汰了九个,你还是会发现该公司的福利待遇极差极差。惨痛教训,切记勿再试。

    10、要知道一个公司的整体面貌和素质如何,那就请留意人事部职员的面貌,尤其是人事经理的素质往往是一个公司整体素质的缩影。如果接待你的人事经理较热心较礼貌周到,那么该公司的工作氛围一般较好,如果人事经理较冷漠或不很礼貌,那么该公司同事关系往往较残酷较冷漠。

    11、不要试图跟新加坡或台湾老板共事,否则你就等着身心接受摧残和扭曲吧。

    12、注意Hr的职业病,几乎每个HR都有窥探癖和多疑症。

    13、最后一条,也是最重要的一条,12年的跳槽经验表明,较好的中国公司及正规的外企正愈来愈倾向于日本企业的终身雇佣制度,即:拒绝跳槽,拒绝人才流动。所有的HR都有一种固执而又变态的心理:他不希望成为你的第一个开苞的男人,但却强烈地希望是你的第二个雇主,并且是在该领域被第一个雇主用了5年到八年之后,同时希望自己是你的最后一个雇主。所以HR对你的跳槽经历往往怀有一种强烈的偏见和关注,对你跳槽原因的研究兴趣近乎变态。所以,对于绝大多数求职者来讲,最好的选择就是:不跳槽。或者至少在一个单位工作5~8年再考虑跳槽,而作为对这5~8年经验的积累的回报,薪水往往应该加倍,否则就是你贱卖了自己。这就是薪水一路加倍的秘密。

    14、最后,祝各位达人职业生涯中薪水加倍加倍再加倍

     

  • QuickTest Plus小工具,大作用(转)

    2007-12-26

    象我这样初学QTP的朋友刚开始时很可能没有注意到QuickTest Plus,因为QTP安装后默认是
    没有安装plus的,千回百转知道了plus,大概看了看,发现plus虽然都是些辅助性的小工具,但
    往往会给你的工作带来事半功倍的效果。

    一、安装QuickTest plus

      QTP安装后,在 程序 > QuickTest Professional下点击QuickTest Plus,然后按照提示一步步往下安装即可,
      其中要求输入序列号,输入和QTP安装时相同的序列号就可以了(8888-8888888888)。

    二、提示和技巧

      plus不仅提供了一些工具,还在它的帮助手册里给出了一些提示和技巧,以及一些实用的Function。
      在这里我把一些比较常用的好东东贴出来,其他的就看plus的帮助吧。

    1、创建action template.
        当希望在每一个新建action时都增加一些头部说明,比如作者、创建日期、说明等,用action template
        来实现最简单快捷。
        方法:用记事本等文本编辑器,输入如下类似的内容:
              'Company: xxxx
              'Author: xxx
              'Product: xxx
              'Date: xx
             然后将文件保存为ActionTemplate.mst,并存放到QTP安装目录下的dat目录,重启QTP,新建一个action试试,新建的action会包含以上信息。

    2、关于设置测试报告里只显示error的信息。
        帮助中说:修改安装目录下bin\QTReport.ini文件,增加以下内容:
             [FilterDialog]
             ReportAppDefaultFilter=1 # for error only
             ReportAppDefaultFilter=3 # shows all messages (default)
        但根据我的测试结果,不尽其然:
         1)当ReportAppDefaultFilter=1时,如果Object Repository中缺少对象,在报告中会在相应的
           action前打叉,但不会提示具体错误,而成功的步骤都有具体信息显示。
         2)用Reporter.ReportEvent测试的结果是:
            ReportAppDefaultFilter=1时,只显示micDone的具体信息;
            ReportAppDefaultFilter=2时,只显示micFail的具体信息;
            ReportAppDefaultFilter=3时,只显示micDone和micFail的具体信息;
            ReportAppDefaultFilter=4时,只显示micPass的具体信息;

        似乎无规律可寻,所以我的结论暂时是:不要设置这个参数,用默认的,显示所有信息,更多的信息有利于分析结果。

    3. 启动IE的语句:SystemUtil.Run "iexplore.exe", "http://www.mercuryinteractive.com"
    4. 关闭IE或其他程序的语句:SystemUtil.CloseProcessByName "app.exe"
         or  SystemUtil.CloseProcessByWndTitle "Some Title"

    三、Function Libraries

        plus的帮助中提供了一些常用的Function,把这些function copy到文本编辑器中保存为.vbs文件,并添加到Resources中就可以直接调用了,
      或直接copy到你的action中,就可以在当前的action中调用。更推荐第一种方法,所有的action都可以调用。

    1、文件操作相关的function,如下,望名则可生意:
        Function CreateFile(sFilename, bOverwrite);
        Function OpenFile(sFilename, iomode, create);
        Function AppendToFile(sFilename, sLine);
        Function WriteToFile(sFilename, sLine);
       
    2、Function NormalizeString(OrgStr); (将字符串变成regular express)

    3、GlobalDictionary的使用,这是另外一种可以共享全局变量的方法,在所有的action中,包括local和external action中都可以访问。

    4、使用文件系统相关的function:
        Function ReadLineFromFile (byref FileRef);
        Sub FileDelete ( FilePath);
        Function FileCompare (byref FilePath1, byref FilePath2, byref FilePathDiff, ignoreWhiteSpace);
        Function CheckFileExists (FilePath)

    5. web table相关的function:
        Function ItemByKeyColumn(): 根据table中某列的值,得到同一行中另一列的对象。(这个功能非常有用。)
        Function ObjectsByMicClass(Obj, micClass): 得到table中所有的micClass类型的对象集合。


    四、工具
      
      1、Automation Generator Utility
         添加一系列动作,然后自动完成。如:启动QTP,然后执行test1, test2, test3...,最后关闭QTP,还可以连接或断开Quality center.
         值得注意的是,每个test都可以分别指定test result文件,这样可以把所有test result指定到同一个目录下,所有test执行完成后,
         用Test Result Viewer就可以快速的查看测试报告。

      2、External Action Call Modifier Utility
         外部Action调用修改工具。当删除一个Reusable action前,如果没有先删除其他test中对它的调用,则打开其他test时,会提示找不到某某
         action,这种情况下启用该工具,工具会列出test下所有调用的外部action(如果调用的action是使用相对路径,则不会列出来),如果外部
         action找不到,会用红色的问号表示,删除它并保存后就OK了。
         也可以在此处修改外部action的来源,修改后原来的action parameter仍会保留。
      
      3、Repository Merge Utility
         合并多个对象库文件中的对象,如果出现冲突,可以选择忽略,或手工合并,或自动合并。
         对象库文件是Action目录下的Resource.mtr文件。

      4. Report Analyzer
         Test Result的另一个查看工具,提供了一些过滤条件,比如只查看failed step, 或只查看checkpoints,或只查看某个action。

    先就写这么多了,抛砖引玉,希望你能发现你想要的东西。写得不对的,不要客气,请指出来,不胜感激。
  • 八种反应表示员工认可你

    2007-12-18

    发表在www.hr.com上的一篇文章指出,欲了解你的管理风格是否为员工所认可,有八种迹象可供参考。

      第一,即使你不在办公室,你的员工也知道你期望他们做什么。这意味着你已经让每个人明白了你对他们的期望,并且赋予了他们充分的自由去做自己认为正确的事情。

      第二,当你回到办公室,你的员工会主动告诉你他们做了什么,为什么那样做,出现了什么样的结果。这意味着他们对自己做的事情相当自信,并且相信你也认为他们做对了。

      第三,在你召开例行会议时,你的员工个个都很放松,并且能够畅所欲言。如果开口的人寥寥无几,意味着你平时可能太过独裁。

      第四,对于公司里发生的一切,鲜有人传播小道消息或无端猜测。这意味你的沟通工作做得相当不错。

      第五,你的员工对待客户的方式与你对待客户的方式一样。这意味着你已经在这方面给员工确立了一个适当的标准,也意味着他们非常清楚公司的目标,知道自己应该做什么。

      第六,你的员工能够彼此尊重,合作无间。通常,员工之间冲突不断,是因为领导容忍某些人的不良表现。当他们之间合作无间,往往意味着你是一个公平、得力的领导者。

      第七,在收到你的负面反馈后,你的员工不会生气或觉得震惊。这意味着员工认可你的看法,也意味着你很好地掌握了在不伤害他们自尊的情况下,提供负面反馈的技巧。

      第八,当出现人手不足的情况时,你的员工会主动推荐好的候选人,公司的员工流失率低。这意昧着他们乐意追随你,乐意与你一起工作。
  • 相信就是效率,相信就是力量,相信就是成功的起点

    2007-12-18

    路在你的脚下延伸
      1、努力有结果但不一定有好结果,你想过没有,你的结果为什么不好?
      2、你好忙!好忙!你停下来仔细想过没有,到底为谁在忙?
      3、你没时间!你时间好紧张!你想过没有,你有24小时,我也只有24小时呢?
      4、你只会说你好累!好辛苦!你会不会说你明天一定不会再累!再辛苦了?
      5、你老是说你不行!你有没想过,生活在这个社会里,你不行也得要行?
      6、问你要一个电话好似要你的命一样,就算有几个烦心的电话,你都应对不了,你还想成功?
      7、说多了好象骗子,想多了你是在骗自己,越想还越信以为真,你想那么多干什么,问题是想出来的,不想就没有问题!
      8、你生来是解决问题的,不要被问题解决了!
      9、门开着也许好的、坏的都会进来,但是,如若你的门关着,肯定是好的也进不来了,打开你的心灵之门,好事会源源而来的!
      10、你要时常记住:不是你有话要说,而是你听不听得懂!
      11、你老是说你知道,你确实也知道很多,但是我要告诉你的是:知道你又没有得到,知道是没有力量的,相信才有力量!
      12、你这样不想做那样不想做,你想做什么?你要做自己该做的事情,不要做自己想
      做的事情,当你成功以后你才可以说,我想做什么就去做什么!成功是要有些勉强的!
      13、你老是说你不习惯,你习惯什么?你习惯上班打卡、你习惯挤大巴、你习惯不想
      起床也得起、你习惯回家坐汽车,你不习惯也得习惯、但是、你要养成一个成功的习惯!
      14、你那么痛苦的去爱人,还不如让别人来爱你!
      15、不相信的事情并不等于不存在,不了解的事情并不等于不发生!
      16、奇迹就是把不可能变为可能!
      17、说来就话长了,总之是你今天没有做明天的事吧,所以你的明天永远是今天,而今天通常是好累的!
      太多了,要想知道,你就找我吧,但不要费话太多,不然你会失去机会的!
      因为问题是你想出来的,不想就没有问题!解决了问题你还会出来好多好多的问题!
      人的一生就是在解决问题,你可以是自己解决,也可以是请别人为你解决,也有可能你是被问题解决了,谁是解决问题的高手谁就成功了!
      在我这里,你只要拥有一份相信,你就开始走向成功了!
      相信就是效率,相信就是力量,相信就是你成功的起点。。。 
  • MYECLIPSE6.0.1注册码(转载)!仅共学习研究使用

    2007-12-15

    package test;

    import java.io.*;

    public class MyEclipseGen {
        private static final String LL = "Decompiling this copyrighted software is a violation of both your license agreement and the Digital Millenium Copyright Act of 1998 (http://www.loc.gov/copyright/legislation/dmca.pdf). Under section 1204 of the DMCA, penalties range up to a $500,000 fine or up to five years imprisonment for a first offense. Think about it; pay for a license, avoid prosecution, and feel better about yourself.";
        public String getSerial(String userId, String licenseNum) {
            java.util.Calendar cal = java.util.Calendar.getInstance();
            cal.add(1, 3);
            cal.add(6, -1);
            java.text.NumberFormat nf = new java.text.DecimalFormat("000");
            licenseNum = nf.format(Integer.valueOf(licenseNum));
            String verTime = new StringBuilder("-").append(new java.text.
                    SimpleDateFormat("yyMMdd").format(cal.getTime())).append("0").
                             toString();
            String type = "YE3MP-";
            String need = new StringBuilder(userId.substring(0, 1)).append(type).
                          append("300").append(licenseNum).append(verTime).toString();
            String dx = new StringBuilder(need).append(LL).append(userId).toString();
            int suf = this.decode(dx);
            String code = new StringBuilder(need).append(String.valueOf(suf)).
                          toString();
            return this.change(code);
        }

        private int decode(String s) {
            int i;
            char[] ac;
            int j;
            int k;
            i = 0;
            ac = s.toCharArray();
            j = 0;
            k = ac.length;
            while (j < k) {
                i = (31 * i) + ac[j];
                j++;
            }
            return Math.abs(i);
        }

        private String change(String s) {
            byte[] abyte0;
            char[] ac;
            int i;
            int k;
            int j;
            abyte0 = s.getBytes();
            ac = new char[s.length()];
            i = 0;
            k = abyte0.length;
            while (i < k) {
                j = abyte0[i];
                if ((j >= 48) && (j <= 57)) {
                    j = (((j - 48) + 5) % 10) + 48;
                } else if ((j >= 65) && (j <= 90)) {
                    j = (((j - 65) + 13) % 26) + 65;
                } else if ((j >= 97) && (j <= 122)) {
                    j = (((j - 97) + 13) % 26) + 97;
                }
                ac[i] = (char) j;
                i++;
            }
            return String.valueOf(ac);
        }

        public MyEclipseGen() {
            super();
        }

        public static void main(String[] args) {
            try {
                System.out.println("please input register name:");
                BufferedReader reader = new BufferedReader(new InputStreamReader(
                        System.in));
                String userId = null;
                userId = reader.readLine();
                MyEclipseGen myeclipsegen = new MyEclipseGen();
                String res = myeclipsegen.getSerial(userId, "20");
                System.out.println("Serial:" + res);
                reader.readLine();
            } catch (IOException ex) {
            }
        }
    }

     

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

    运行该代码,在控制台中会出现:

    please input register name:
    ×××××(你的name)

    即生成序列号:

    please input register name:
    camille
    Serial:pLR8ZC-855575-53668556514322852

Open Toolbar