宠辱不惊,看庭前花开花落;去留无意,望天空云卷云舒

发布新日志

  • 句柄数、线程数、进程数

    2010-07-26 10:21:27

    所谓句柄实际上是一个数据,是一个Long (整长型)的数据。

    句柄是WONDOWS用来标识被应用程序所建立或使用的对象的唯一整数,WINDOWS使用各种各样的句柄标识诸如应用程序实例,窗口,控制,位图,GDI对象等等。WINDOWS句柄有点象C语言中的文件句柄。

    从上面的定义中的我们可以看到,句柄是一个标识符,是拿来标识对象或者项目的,它就象我们的姓名一样,每个人都会有一个,不同的人的姓名不一样,但是,也可能有一个名字和你一样的人。从数据类型上来看它只是一个16位的无符号整数。应用程序几乎总是通过调用一个WINDOWS函数来获得一个句柄,之后其他的WINDOWS函数就可以使用该句柄,以引用相应的对象。

    如果想更透彻一点地认识句柄,我可以告诉大家,句柄是一种指向指针的指针。我们知道,所谓指针是一种内存地址。应用程序启动后,组成这个程序的各对象是住留在内存的。如果简单地理解,似乎我们只要获知这个内存的首地址,那么就可以随时用这个地址访问对象。但是,如果您真的这样认为,那么您就大错特错了。我们知道,Windows是一个以虚拟内存为基础的操作系统。在这种系统环境下,Windows内存管理器经常在内存中来回移动对象,依此来满足各种应用程序的内存需要。对象被移动意味着它的地址变化了。如果地址总是如此变化,我们该到哪里去找该对象呢?

    为了解决这个问题,Windows操作系统为各应用程序腾出一些内存储地址,用来专门登记各应用对象在内存中的地址变化,而这个地址(存储单元的位置)本身是不变的。Windows内存管理器在移动对象在内存中的位置后,把对象新的地址告知这个句柄地址来保存。这样我们只需记住这个句柄地址就可以间接地知道对象具体在内存中的哪个位置。这个地址是在对象装载(Load)时由系统分配给的,当系统卸载时(Unload)又释放给系统。

    句柄地址(稳定)→记载着对象在内存中的地址————→对象在内存中的地址(不稳定)→实际对象

    本质:WINDOWS程序中并不是用物理地址来标识一个内存块,文件,任务或动态装入模块的,相反的,WINDOWS API给这些项目分配确定的句柄,并将句柄返回给应用程序,然后通过句柄来进行操作。

    但是必须注意的是程序每次从新启动,系统不能保证分配给这个程序的句柄还是原来的那个句柄,而且绝大多数情况的确不一样的。假如我们把进入电影院看电影看成是一个应用程序的启动运行,那么系统给应用程序分配的句柄总是不一样,这和每次电影院售给我们的门票总是不同的一个座位是一样的道理。


    线程是指程序的一个指令执行序列,WIN32 平台支持多线程程序,允许程序中存在多个线程。 在单 CPU 系统中,系统把 CPU 的时间片按照调度算法分配给各个线程,因此各线程实际上是分时执行的,在多 CPU 的 Windows NT 系统中, 同一个程序的不同线程可以被分配到不同的 CPU 上去执行。由于一个程序的各线程是在相同的地址空间运行的,因此设及到了如何共享内存, 如何通信等问题,这样便需要处理各线程之间的同步问题,这是多线程编程中的一个难点。

    线程,也被称为轻量进程(lightweight processes)。计算机科学术语,指运行中的程序的调度单位。

    线程是进程中的实体,一个进程可以拥有多个线程,一个线程必须有一个父进程。线程不拥有系统资源,只有运行必须的一些数据结构;它与父进程的其它线程共享该进程所拥有的全部资源。线程可以创建和撤消线程,从而实现程序的并发执行。一般,线程具有就绪、阻塞和运行三种基本状态。

    在多中央处理器的系统里,不同线程可以同时在不同的中央处理器上运行,甚至当它们属于同一个进程时也是如此。大多数支持多处理器的操作系统都提供编程接口来让进程可以控制自己的线程与各处理器之间的关联度(affinity)。

    进程是程序在一个数据集合上运行的过程(注:一个程序有可能同时属于

    多个进程),它是操作系统进行资源分配和调度的一个独立单位,进程可以简单的分为系统进程(包括一般

    Windows程序和服务进程)和用户进程
  • linux 指令

    2009-04-29 19:57:22

     

    指令名称 : chown
    使用权限 : root
    使用方式 : chmod [-cfhvR] [--help] [--version] user[:group] file...
    说明 : Linux/Unix 是多人多工作业系统,所有的档案皆有拥有者。利用 chown 可以将档案的拥有者加以改变。一般来说,这个指令只有是由系统管理者(root)所使用,一般使用者没有权限可以改变别人的档案拥有者,也没有权限可以自己的档案拥有者改设为别人。只有系统管理者(root)才有这样的权限。

    应用实例
    chown seggps:seggps DataWriter

     

    su
      作用是变更为其它使用者的身份,超级用户除外,需要键入该使用者的密码。
        
      u [选项]... [-] [USER [ARG]...] 
      -f , --fast:不必读启动文件(如 csh.cshrc 等),仅用于csh或tcsh两种Shell。
      -l , --login:加了这个参数之后,就好像是重新登陆为该使用者一样,大部分环境变量(例如HOME、SHELL和USER等)都是以该使用者(USER)为主,并且工作目录也会改变。如果没有指定USER,缺省情况是root。
       -m, -p ,--preserve-environment:执行su时不改变环境变数。
      -c command:变更账号为USER的使用者,并执行指令(command)后再变回原来使用者。
      USER:欲变更的使用者账号,ARG传入新的Shell参数。
      
      应用实例
      
      变更账号为超级用户,并在执行df命令后还原使用者。  su -c df root  su-seggps

    xhost 是用来控制X server访问权限的。

      通常当你从hostA登陆到hostB上运行hostB上的应用程序时,

      做为应用程序来说,hostA是client,但是作为图形来说,

      是在hostA上显示的,需要使用hostA的Xserver,所以hostA是

      server.因此在登陆到hostB前,需要在hostA上运行xhost +

      来使其它用户能够访问hostA的Xserver.

      xhost + 是使所有用户都能访问Xserver.

      xhost + ip使ip上的用户能够访问Xserver.

      xhost + nis:user@domain使domain上的nis用户user能够访问

      xhost + inet:user@domain使domain上的inet用户能够访问。

     

    gedit

     

    文本编辑器,就像是win的记事本。 不过是在视窗模式下面的。 在Linux下面最流行的文本编辑器是vi建议你使用vi。 不要用gedit。

    另外你用gedit修改文件的时候给看下权限不是所有文件都有权利修改的除非你是root
    实例: gedit .bash_profile

  • Linux操作

    2009-04-29 19:28:02

    一、基础知识

    1、  Linux是区分大小写的系统,需要养成区分大小写的习惯。

    2、  Linux系统对内存的利用,总是尽可能利用的。Linux系统会把空闲内存,即除自身和应用系统需要的内存之外的内存,总是作为文件的Cache利用。如果应用程序是第一次打开文件访问其内容,速度可能比较慢,但如果是第二次打开同一个文件访问其内容。其速度就会快起来。在Linux系统中,内存的利用率可以达到90%以上,这也是与Window不一样的地方。

    3、  Linux中没有C盘、D盘、E盘这种概念,但也有分区和文件系统的概念。Linux中的分区类似Window中的未格式化的逻辑盘,但表示方法不一样,它是通过/dev/hd[a][n]IDE硬盘)或/dev/sd[a][n]SATASAS硬盘)来表示的。类似在Window中对未格式化的逻辑盘进行格式化,在Linux中也可以对分区进行格式化,可选的文件系统格式有ext2ext3gfs等。一旦Linux中的分区进行了格式化,就可以把Linux中的各个文件系统,如//boot/root/usr/home/tmp/opt等挂接在不同的分区。

    4、  对于Linux中的文件,后缀名并不重要,甚至不需要后缀名。一个文件是否可以执行,由文件内容来决定和文件权限共同来决定,如一个ELF可执行文件,如果不给它加上”x”可执行执行权限,它也是不可以运行的。

    5、  Linux中具有严格的权限控制,普通文件和目录的权限由ugo三个部分的权限来表示,u表示文件拥有者,g表示拥有者所在组,o表示其它人。权限可分为1(可执行)、2(可写)、4(可读),这三个权限可以累加,如要表示可写可读,则用6表示,扩充一点,如果要设置某个文件的属性为文件拥有者对该文件可读可写可执行、所在组可读可执行、其它人可执行,则只要给该文件赋予751即可。如果想更加详细的控制文件权限,可以参考ACL

    6、  Linux有不同的运行等级,运行等级0为关机;1为单用户模式,此时只有root用户可以进行操作;2为多用户,但是没有 NFS(Net File System)3为完全多用户模式;4现阶段没有用到;5X11(图形模式);6为重新启动。各个运行等级可以通过“init 需要切换到的等级”进行改变,如发出“init 6,则就可以重新启动系统。当发出“init 需要切换到的等级”的时候,如发出“init 6,则一般情况下/etc/rc6.d/S打头和K打头的脚本将被执行,其中S打头的脚本以start参数执行,K打头的脚本以stop参数执行。

    7、  Linux或其它类Unix环境中,被误删除的文件和目录比较难恢复,在删除的时候需要小心谨慎。

    二、基本操作命令

    1、  生成一个空文件 touch

    用法 touch 文件名

    例子 touch xyz

    则将生成xyz这个文件,不过如果执行操作的用户没有对相应目录的写入权限,执行将会失败。其它的文件拷贝、删除都一样。

     

    2、  文件拷贝 cp

    用法 cp 文件名 新文件名

    cp 文件名 /新目录/新文件名

    例子

    cp xyz abc              xyz拷贝一份,并以abc命名

    cp xyz /tmp/abcxyz   拷贝一份到/tmp下,并以abc重新命名

    cp -R /home/oracle/* /tmp /home/oracle/目录下的所有文件,包括子目录,都拷贝到/tmp

     

    3、  删除文件 rm

    用法 rm 文件名

    参数 –R 递归目录

         -f 强制删除,不提示

    例子

    rm xyz    则把xyz这个文件删除,在某些系统中,可能会提示一个是否删除

    rm –f xyz  删除xyz这个文件,且不会进行任何提示

    rm –fR 目录名 则会把该目录下的所有文件,包括子目录都删除。

     

    4、  显示文件内容 cat

    用法 cat 文件名

    例子 cat xyz 则显示xyz这个文件的内容

    注意,如果xyz这个文件的内容大于一屏,则使用该命令会飞快的滚到文件内容的最后一屏。

     

    5、  分页显示文件内容 more

    用法 more文件名

    例子 more xyz 则分页显示xyz这个文件的内容第一页,此时,按回车,文件内容将向下增加一行,按空格键,文件内容将向下增加一屏幕,按q键,退出显示。

     

    6、  分页显示文件内容 less

    用法 less 文件名

    此命令用法和more基本相同,不过less 可以把显示过的内容按b键向后滚屏,而more只能向前滚动分页。

     

    7、  显示文件头部内容 head

    用法 head –n 行数 文件名

    例子 head –n 15 xyz 则显示xyz前面15行的内容,如果忽略-n参数,如head xyz,则默认显示xyz的前10行内容。

     

    8、  显示文件尾部内容 tail

    tail –n 行数 文件名

    例子 tail –n 15 xyz 则显示xyz后面15行的内容,如果忽略-n参数,如tail xyz,则默认显示xyz的后10行内容。

     

    9、  搜索文件内容

    搜索文件内容,需要用到more指令、grep、管道(|),如搜索xyz这个文件中含有abc的行

    例子 more xyz | grep abc

     

    10、              新建目录 mkdir

    用法 mkdir 目录名

    mkdir /tmp/oracle 则将会在/tmp下建立一个oracle目录

    如果需要建立多级目录,需要加参数p,如mkdir -p /tmp/x/y/z,则将在/tmp下的建立x子目录,在x子目录下建立y子目录,在y子目录下建立z子目录。

     

    11、              删除目录 rmdir

    用法 rmdir 目录名

    rmdir xyz 则将会把xyz目录删除,如果xyz目录不为空,删除将失败。删除多级目录,需要加参数p

    rmdir –p x 则会把x目录及x下面的其它空目录一并删除。

     

    12、              改变当前路径 cd

    用法 cd 新路径

    例子 cd /tmp 则会把当前路径改变到/tmp下面。

    Window一样,“..”在Linux中也表示为上级目录,所以如果想更改路径为上级目录,可以输入下面的命令

    cd ..  注意,cd ..之间是有一个空格的,这和Window不一样。

     

    13、              显示当前路径 pwd

    用法 pwd

     

    14、              列出文件和目录 ls

    用法 ls

    参数 –l 以宽格式显示详细内容

         -t 以文件的修改时间排序

         -S以文件的大小排序

         -R 递归目录显示

    15、              查找文件或目录 find

    用法 find 路径 –name 文件名

    例子 find . –name xyz在当前路径及子目录下xyz这个文件

         find / –name xyz 在根目录及子目录下xyz这个文件

         find / -name ‘*xyz*’ 在根目录及子目录下查找文件名中含有xyz字符的文件

         find /usr -mtime +2 找出在/usr目录下,修改时间在2<SPAN style="FONT-FAMILY: 宋体; mso-ascii-font-family: 'Times New Roman'; m

     

    指令名称 : chown
    使用权限 : root
    使用方式 : chmod [-cfhvR] [--help] [--version] use

  • SQL事务

    2008-06-30 12:02:44

    事务

    事务是单个的工作单元。如果某一事务成功,则在该事务中进行的所有数据更改均会提交,成为数据库中的永久组成部分。如果事务遇到错误且必须取消或回滚,则所有数据更改均被清除。

    事务模式

    每条单独的语句都是一个事务。 显示事务每个事务均以begin transaction 语句显示开始,以commit或Rollback语句显示结束。

     

     

  • LDAP

    2008-03-19 17:16:53

    LDAP是轻量目录访问协议,英文全称是Lightweight Directory Access Protocol,一般都简称为LDAP。它是基于X.500标准的,但是简单多了并且可以根据需要定制。与X.500不同,LDAP支持TCP/IP,这对访问Internet是必须的。LDAP的核心规范在RFC中都有定义,所有与LDAP相关的RFC都可以在LDAPman RFC网页中找到。
    简单说来,LDAP是一个得到关于人或者资源的集中、静态数据的快速方式。
    LDAP是一个用来发布目录信息到许多不同资源的协议。通常它都作为一个集中的地址本使用,不过根据组织者的需要,它可以做得更加强大。
    LDAP其实是一电话簿,类似于我们所使用诸如NIS(Network Information Service)、DNS (Domain Name Service)等网络目录,也类似于你在花园中所看到的树木。
    不少LDAP开发人员喜欢把LDAP与关系数据库相比,认为是另一种的存贮方式,然后在读性能上进行比较。实际上,这种对比的基础是错误的。LDAP和关系数据库是两种不同层次的概念,后者是存贮方式(同一层次如网格数据库,对象数据库),前者是存贮模式和访问协议。LDAP是一个比关系数据库抽象层次更高的存贮概念,与关系数据库的查询语言SQL属同一级别。LDAP最基本的形式是一个连接数据库的标准方式。该数据库为读查询作了优化。因此它可以很快地得到查询结果,不过在其它方面,例如更新,就慢得多。
    从另一个意义上 LDAP是实现了指定的数据结构的存贮,它是一种特殊的数据库。但是LDAP和一般的数据库不同,明白这一点是很重要的。 LDAP对查询进行了优化,与写性能相比LDAP的读性能要优秀很多。
    就象Sybase、Oracle、Informix或Microsoft的数据库管理系统(DBMS)是用于处理查询和更新关系型数据库那样,LDAP服务器也是用来处理查询和更新LDAP目录的。换句话来说LDAP目录也是一种类型的数据库,但不是关系型数据库。要特别注意的是,LDAP通常作为一个 hierarchal数据库使用,而不是一个关系数据库。因此,它的结构用树来表示比用表格好。正因为这样,就不能用SQL语句了。
  • 网闸常识

    2008-03-19 16:36:42

    网闸的工作原理是什么?
    解答:
    网闸的基本原理是:切断网络之间的通用协议连接;将数据包进行分解或重组为静态数据;对静态数据进行安全审查,包括网络协议检查和代码扫描等;确认后的安全数据流入内部单元;内部用户通过严格的身份认证机制获取所需数据。

    问题:
    什么是网闸?
    解答:
    网闸是在两个不同安全域之间,通过协议转换的手段,以信息摆渡的方式实现数据交换,且只有被系统明确要求传输的信息才可以通过。其信息流一般为通用应用服务。注:网闸的“闸”字取自于船闸的意思,在信息摆渡的过程中内外网(上下游)从未发生物理连接,所以网闸产品必须要有至少两套主机和一个物理隔离部件才可完成物理隔离任务。现在市场上出现的的单主机网闸或单主机中有两个及多个处理引擎的过滤产品不是真正的网闸产品,不符合物理隔离标准。其只是一个包过滤的安全产品,类似防火墙。注:单主机网闸多以单向网闸来掩人耳目。

    问题:
    隔离网闸是什么设备?
    解答:
    隔离网闸是一种由专用硬件在电路上切断网络之间的链路层连接,能够在物理隔离的网络之间进行适度的安全数据交换的网络安全设备。

    问题:
    隔离网闸是硬件设备还是软件设备?
    解答:
    隔离网闸是由软件和硬件组成的设备。

    问题:
    隔离网闸硬件设备是由几部分组成?
    解答:
    隔离网闸的硬件设备由三部分组成:外部处理单元、内部处理单元、隔离硬件。

    问题:
    单向传输用单主机网闸可以吗?
    解答:
    隔离网闸的组成必须是由物理的三部分组成,所以单主机(包括多处理器)的安全产品并不是网闸产品,无法完成物理隔离任务。其所谓的单向传输只是基于数据包的过滤,类似防火墙产品,并不是物理隔离产品。

    问题:
    为什么要使用隔离网闸?
    解答:
    当用户的网络需要保证高强度的安全,同时又与其它不信任网络进行信息交换的情况下,如果采用物理隔离卡,信息交换的需求将无法满足;如果采用防火墙,则无法防止内部信息泄漏和外部病毒、黑客程序的渗入,安全性无法保证。在这种情况下,隔离网闸能够同时满足这两个要求,又避免了物理隔离卡和防火墙的不足之处,是物理隔离网络之间数据交换的最佳选择。

    问题:
    政府机关上网计算机为什么必须内外网物理隔离?
    解答:
    在政府建立内部网的工程中,安全保密问题一直是工程建设的重点内容,这是因为内部网中的信息常常是涉密或内部信息。为此,国家明确规定涉及国家秘密的计算机信息系统,不得直接或间接地与国际互联网或其它公共信息网络相联接,必须实行物理隔离,以确保国家秘密的安全。

    问题:
    为什么说隔离网闸能够防止未知和已知木马攻击?
    解答:
    通常见到的木马大部分是基于TCP的,木马的客户端和服务器端需要建立连接,而隔离网闸从原理实现上就切断所有的TCP连接,包括UDP、ICMP等其他各种协议,使各种木马无法通过隔离网闸进行通讯。从而可以防止未知和已知的木马攻击。

    问题:
    隔离网闸与防火墙有何不同?
    解答:
    主要有以下几点不同:
    A、隔离网闸采用双主机系统,内端机与需要保护的内部网络连接,外端机与外网连接。这种双系统模式彻底将内网保护起来,即使外网被黑客攻击,甚至瘫痪,也无法对内网造成伤害。防火墙是单主机系统。
    B、隔离网闸采用自身定义的私有通讯协议,避免了通用协议存在的漏洞。防火墙采用通用通讯协议即TCP/IP协议。
    C、隔离网闸采用专用硬件控制技术保证内外网之间没有实时连接。而防火墙必须保证实时连接。
    D、隔离网闸对外网的任何响应都保证是内网合法用户发出的请求应答,即被动响应,而防火墙则不会对外网响应进行判断,也即主动响应。这样,网闸就避免了木马和黑客的攻击。

    问题:
    隔离网闸能取代防火墙吗?
    解答:
    无论从功能还是实现原理上讲,隔离网闸和防火墙是完全不同的两个产品,防火墙是保证网络层安全的边界安全工具(如通常的非军事化区),而隔离网闸重点是保护内部网络的安全。因此两种产品由于定位的不同,因此不能相互取代。

    问题:
    隔离网闸通常布置在什么位置?
    解答:
    隔离网闸通常布置在两个安全级别不同的两个网络之间,如信任网络和非信任网络,管理员可以从信任网络一方对安全隔离网闸进行管理。

    问题:
    隔离网闸是否可以在网络内部使用?
    解答:
    可以,网络内部安全级别不同的两个网络之间也可以安装隔离网闸进行隔离。

    问题:
    如果对应网络七层协议,隔离网闸是在哪一层断开?
    解答:
    如果针对网络七层协议,隔离网闸是在硬件链路层上断开。

    问题:
    有了防火墙和IDS,还需要隔离网闸吗?
    解答:
    防火墙是网络层边界检查工具,可以设置规则对内部网络进行安全防护,而IDS一般是对已知攻击行为进行检测,这两种产品的结合可以很好的保护用户的网络,但是从安全原理上来讲,无法对内部网络做更深入的安全防护。隔离网闸重点是保护内部网络,如果用户对内部网络的安全非常在意,那么防火墙和IDS再加上隔离网闸将会形成一个很好的防御体系。

    问题:
    隔离网闸适用于什么样的场合?
    解答:
    第1种场合:涉密网与非涉密网之间。
    第2种场合:局域网与互联网之间。有些局域网络,特别是政府办公网络,涉及敏感信息,有时需要与互联网在物理上断开,用物理隔离网闸是一个常用的办法。
    第3种场合:办公网与业务网之间
    由于办公网络与业务网络的信息敏感程度不同,例如,银行的办公网络和银行业务网络就是很典型的信息敏感程度不同的两类网络。为了提高工作效率,办公网络有时需要与业务网络交换信息。为解决业务网络的安全,比较好的办法就是在办公网与业务网之间使用物理隔离网闸,实现两类网络的物理隔离。
    第4种场合:电子政务的内网与专网之间
    在电子政务系统建设中,要求政府内网与外网之间用逻辑隔离,在政府专网与内网之间用物理隔离。现常用的方法是用物理隔离网闸来实现。
    第5种场合:业务网与互联网之间
    电子商务网络一边连接着业务网络服务器,一边通过互联网连接着广大民众。为了保障业务网络服务器的安全,在业务网络与互联网之间应实现物理隔离。

  • grep、fgrep 和 egrep 命令

    2008-03-19 13:46:04

    c:\>grep "^..........02" e0700031.txt >20.txt

     

    这组命令以指定模式搜索文件,并通知用户在什么文件中搜索到与指定的模式匹配的字符串,并打印出所有包含该字符串的文本行,在该文本行的最前面是该行所在的文件名。 grep 命令一次只能搜索一个指定的模式;egrep 命令检索扩展的正则表达式(包括表达式组和可选项);fgrep 命令检索固定字符串,它不识别正则表达式,是快速搜索命令。

    这组命令在搜索与定位文件中特定的主题方面非常有用。要搜索的模式可以被认为是一些关键词,您可以用它们来搜索文件中包含的这些关键词。编写程序时,可以用它来寻找某一个函数,或是相关的词组。grep 命令的搜索功能比 fgrep 强大,因为 grep 命令的搜索模式可以是正则表达式,而 fgrep 却不能。

    该组命令中的每一个命令都有一组选项,利用这些选项可以改变其输出方式。例如,可以在搜索到的文本行上加入行号,或者只输出文本行的行号,或者输出所有与搜索模式不匹配的文本行,或只简单地输出已搜索到指定模式的文件名,并且可以指定在查找模式时忽略大小写。

    这组命令在指定的输入文件中查找与模式匹配的行。如果没有指定文件,则从标准输入中读取。正常情况下,每个匹配的行被显示到标准输出。如果要查找的文件是多个,则在每一行输出之前加上文件名。

    语法:
    
    grep [选项] [查找模式] [文件名1,文件名2,……]
    
    egrep [选项] [查找模式] [文件名1,文件名2,……]
    
    fgrep [选项] [查找模式] [文件名1,文件名2,……]
    
    

    该命令的各选项含义如下:

    -E 每个模式作为一个扩展的正则表达式对待。
    -F 每个模式作为一组固定字符串对待(以新行分隔),而不作为正则表达式。
    -b 在输出的每一行前显示包含匹配字符串的行在文件中的字节偏移量。
    -c 只显示匹配行的数量。
    -i 比较时不区分大小写。
    -h 在查找多个文件时,指示grep不要将文件名加入到输出之前。
    -l 显示首次匹配串所在的文件名并用换行符将其隔开。
       当在某文件中多次出现匹配串时,不重复显示此文件名。
    -n 在输出前加上匹配串所在行的行号(文件首行行号为1)。
    -v 只显示不包含匹配串的行。
    -x 只显示整行严格匹配的行。
    -e expression 指定检索使用的模式。用于防止以“-”开头的模式被解释为命令选项。
    -f expfile 从expfile文件中获取要搜索的模式,一个模式占一行。
    
  • dos命令 通过IP查看机器名

    2008-03-19 09:44:44

    如果对方与你在同一个网段内的话,通过下面方法可以得到对方的name:  
              ping   -a   ip;   nbtstat   -A   ip;    
      如果不在一个网段内的话,应该无法通过命令直接得到对方的名字的.

    一,ping

      它是用来检查网络是否通畅或者网络连接速度的命令。作为一个生活在网络上的管理员或者黑客来说,ping命令是第一个必须掌握的DOS命令,它所利用的原理是这样的:网络上的机器都有唯一确定的IP地址,我们给目标IP地址发送一个数据包,对方就要返回一个同样大小的数据包,根据返回的数据包我们可以确定目标主机的存在,可以初步判断目标主机的操作系统等。下面就来看看它的一些常用的操作。先看看帮助吧,在DOS窗口中键入:ping/?回车,出现如图1所示的帮助画面。在此,我们只掌握一些基本的很有用的参数就可以了。

      -t表示将不间断向目标IP发送数据包,直到我们强迫其停止。试想,如果你使用100M的宽带接入,而目标IP是56K的小猫,那么要不了多久,目标IP就因为承受不了这么多的数据而掉线,呵呵,一次攻击就这么简单的实现了。

      -l定义发送数据包的大小,默认为32字节,我们利用它可以最大定义到65500字节。结合上面介绍的-t参数一起使用,会有更好的效果哦。

      -n定义向目标IP发送数据包的次数,默认为3次。如果网络速度比较慢,3次对我们来说也浪费了不少时间,因为现在我们的目的仅仅是判断目标IP是否存在,那么就定义为一次吧。

      说明一下,如果-t参数和-n参数一起使用,ping命令就以放在后面的参数为标准,比如“pingIP-t-n3”,虽然使用了-t参数,但并不是一直ping下去,而是只ping3次。另外,ping命令不一定非得pingIP,也可以直接ping主机域名,这样就可以得到主机的IP。

      下面我们举个例子来说明一下具体用法

      这里time<10ms表示从发出数据包到接受到返回数据包所用的时间小于10ms,从这里可以判断网络连接速度的大小。从TTL的返回值可以初步判断被ping主机的操作系统,之所以说“初步判断”是因为这个值是可以修改的。这里TTL=128表示操作系统可能是Win2000。

      (小知识:如果TTL=32,则表示目标主机可能是win98;如果TTL=250,则目标主机可能是Unix)

      至于利用ping命令可以快速查找局域网故障,可以快速搜索最快的QQ服务器,可以对别人进行ping攻击……这些就靠大家自己发挥了。

      二,nbtstat

      该命令使用TCP/IP上的NetBIOS显示协议统计当前TCP/IP连接,使用这个命令你可以得到远程主机的NETBIOS信息,比如用户名、所属的工作组、网卡的MAC地址等。在此我们就有必要了解几个基本的参数。

      -A这个参数可以得到远程主机的NETBIOS信息,但需要你知道它的IP。

      -a使用这个参数,只要你知道了远程主机的机器名称,就可以得到它的NETBIOS信息。

      -n列出本地机器的NETBIOS信息。

      当得到了对方的IP或者机器名的时候,就可以使用nbtstat命令来进一步得到对方的信息了,这又增加了我们入侵的保险系数。

      三,netstat

      这是一个用来查看网络状态的命令,操作简便功能强大。

      -a查看本地机器的所有开放端口,可以有效发现和预防木马,可以知道机器所开的服务等信息。

      -r列出当前的路由信息,告诉我们本地机器的网关、子网掩码等信息。用法:netstat-rIP。

      四,tracert

      跟踪路由信息,使用此命令可以查出数据从本地机器传输到目标主机所经过的所有途径,这对我们了解网络布局和结构很有帮助。

      这里说明数据从本地机器传输到192.168.0.1的机器上,中间没有经过任何中转,说明这两台机器是在同一段局域网内。用法:tracertIP。

      五,net

      这个命令是网络命令中最重要的一个,必须透彻掌握它的每一个子命令的用法,因为它的功能实在是太强大了,这简直就是微软为我们提供的最好的入侵工具。首先让我们来看一看它都有那些子命令,键入net/?,回车。

      在这里,我们重点掌握几个入侵常用的子命令。

      netview

      使用此命令查看远程主机的所有共享资源。命令格式为netview\\IP。

      netuse

      把远程主机的某个共享资源影射为本地盘符,图形界面方便使用,呵呵。命令格式为netusex:\\IP\sharename。下面表示和192.168.0.7建立IPC$连接(netuse\\IP\IPC$"password"/user:"name")。

      建立了IPC$连接后,呵呵,就可以上传文件了:copync.exe\\192.168.0.7\admin$,表示把本地目录下的nc.exe传到远程主机,结合后面要介绍到的其他DOS命令就可以实现入侵了。

      netstart

      使用它来启动远程主机上的服务。当你和远程主机建立连接后,如果发现它的什么服务没有启动,而你又想利用此服务怎么办?就使用这个命令来启动吧。用法:netstartservername,如用netstarttelnet命令启动telnet服务。

      netstop

      入侵后发现远程主机的某个服务碍手碍脚,怎么办?利用这个命令停掉就ok了,用法和netstart同。

      netuser

      查看和帐户有关的情况,包括新建帐户、删除帐户、查看特定帐户、激活帐户、帐户禁用等。这对我们入侵是很有利的,最重要的,它为我们克隆帐户提供了前提。键入不带参数的netuser,可以查看所有用户,包括已经禁用的。下面分别讲解。

      1,netuserabcd1234/add,新建一个用户名为abcd,密码为1234的帐户,默认为user组成员。

      2,netuserabcd/del,将用户名为abcd的用户删除。

      3,netuserabcd/active:no,将用户名为abcd的用户禁用。

      4,netuserabcd/active:yes,激活用户名为abcd的用户。

      5,netuserabcd,查看用户名为abcd的用户的情况。

      netlocalgroup

      查看所有和用户组有关的信息和进行相关操作。键入不带参数的netlocalgroup即列出当前所有的用户组。在入侵过程中,我们一般利用它来把某个帐户提升为administrator组帐户,这样我们利用这个帐户就可以控制整个远程主机了。用法:netlocalgroupgroupnameusername/add。

      现在我们把刚才新建的用户abcd加到administrator组里去了,这时候abcd用户已经是超级管理员了,呵呵,你可以再使用netuserabcd来查看他的状态,就可以看出来。但这样太明显了,网管一看用户情况就能漏出破绽,所以这种方法只能对付菜鸟网管,但我们还得知道。现在的手段都是利用其他工具和手段克隆一个让网管看不出来的超级管理员,这是后话。

      nettime

      这个命令可以查看远程主机当前的时间。如果你的目标只是进入到远程主机里面,那么也许就用不到这个命令了。但简单的入侵成功了,难道只是看看吗?我们需要进一步渗透。这就连远程主机当前的时间都需要知道,因为利用时间和其他手

  • 监控Tomcat服务器

    2008-03-11 09:58:03

    Tomcat 5在缺省安装时是不允许用户直接访问 http://yourhost:port/manager/status 的,访问的时候会给出一个403(forbidden)的错误信息。在Tomcat的Manual里说明了允许用户访问的方法:
    1. 转到Tomcat的安装目录下;
    2. 修改conf/tomcat-users.xml文件,在其中加入一行
         <user username="servermon" password="passwd" roles="manager"/>
  • 数据库缓冲池

    2008-03-08 10:33:44

    一个数据库缓冲池指的是缓存于内存空间中的数据库物理连接,这些数据库连接可以被重复使用。数据库缓冲池对于提高Java 数据库应用程序的性能十分重要,尤其是当这个Java 数据库应用程序运行于中间层服务器环境时。

    数据缓冲池存在于中间层服务器环境当中,可以被不同的Java 应用程序所调用。javax.sql.RowSet 包添加了对缓冲数据源的支持,即可以将缓冲池缓冲的数据库连接看作是一个是实实在在的数据源服务来使用。RowSet 包提供了好几个接口用于处理数据库缓冲池,主要的接口有:
    1、DataSource 接口:DataSource 接口的实例对象代表了存在于中间层服务器中的缓冲数据源服务。使用它可以返还数据库缓冲池中现存的数据库连接,DataSource 接口的实例对象实际上是某个JNDI 服务的提供者,在使用它之前,该JNDI 服务对象必须先在中间层服务器环境中注册,并且和某个服务名绑定在一起,然后它才能被别的Java 应用程序调用。
    2、ConnectionPoolDataSource 接口:该接口可以用于创建一个被缓冲于缓冲池的数据库物理连接,它有可能会被DataSource 接口的实例对象调用。
    3、PooledConnection 接口:该接口代表被缓冲的数据库连接,它定义了一个getConnection()方法使用这个方法可以返回java.sql.Connection 接口的实例对象。
    如何使用RowSet 包定义的类和接口操作数据库缓冲池,下面的JSP 代码段提供了一个简单的不完整的例子



    <%

    Context ctx = new InitialContext();

    DataSource ds = (DataSource)ctx.lookup(“jdbc/EmployeeDB”);

    // First get a Connection. Connection pooling is done

    // internally by the DataSource object.

    Connection con = ds.getConnection(jdbc/webDatabase” "sa” “");

    // Do all the work as a single transaction (optional).

    con.setAutoCommit(false);

    // The actual work (queries and updates) would go here.

    // Work is done using standard JDBC code as defined in the

    // rest of the JDBC API.

    // Commit the transaction.

    con.commit();

    // Close the connection. This returns the underlying physical

    // database connection to the pool.

    con.close();

    %>

    上面的JSP 代码段的运行机理如下

    ???? 1、首先程序代码获取初始化的JNDI 环境并且调用Context.lookup()方法从JNDI服务提供者那里获一个DataSource 对象

    ???? 2、中间层JNDI 服务提供者返回一个DataSource 对象给当前的Java 应用程序这个DataSource 对象代表了中间层服务上现存的缓冲数据源

    ????3、 应用程序调用DataSource 对象的getConnection()方法

    ???? 4、当DataSource 对象的getConnection()方法被调用时中间层服务器将查询数据库连接缓冲池中有没有PooledConnection 接口的实例对象这个PooledConnection对象将被用于与数据库建立物理上的数据库连接

    ???? 5、如果在缓冲池中命中了一个PooledCoonection 对象那么连接缓冲池将简单地更新内部的缓冲连接队列并将该PooledConnection 对象返回如果在缓冲池内没有找到现成的PooledConnection 对象那么ConnectionPoolDataSource 接口将会被用来产生一个新的PooledConnection 对象并将它返回以便应用程序使用

    ???? 6\中间层服务器调用PooledConnection 对象的getConnection()方法以便返还一个java.sql.Connection 对象给当前的Java 应用程序

    ???? 7、当中间层服务器调用PooledConnection 对象的getConnection()方法时JDBC 数据库驱动程序将会创建一个Connection 对象并且把它返回中间层服务器

    ???? 8、中间层服务器将Connection 对象返回给应用程序Java 应用程序可以认为这个Connection 对象是一个普通的JDBC Connection 对象使用它可以和数据库建立事实上的连接与数据库引擎产生交互操作

    ???? 9、当应用程序不需要使用Connection 对象时,可以调用Connection 接口的close()方法。请注意这种情况下close()方法并没有关闭事实上的数据库连接,仅仅是释放了被应用程序占用的数据库连接,并将它还给数据库连接缓冲池,数据库连接缓冲池会自动将这个数据库连接交给请求队列中下一个的应用程序使用。
  • Tuxedo

    2008-03-06 18:12:29

    Tuxedo是一个客户机/服务器的“中间件”产品,它在客户机和服务器之间进行调节,以保证正确地处理事务。Tuxedo是一个事务处理(TP)监督器,它管理联机事务处理(OLTP)系统(参见“事务处理”)操作的事务。客户通过结构化查询语言(SQL)调用,或其它类型的请求,产生对服务器的请求。这个事务处理监督器确信,正确地进行了修改,以保证数据的完整性。这在一个事务可以改变多个位置的数据库的分布式数据库环境是非常重要的。这个事务处理监督器使用双阶段提交,以保证所有的数据库都已经接收和认可了这些数据的正确性。否则,这个数据库返回它的事务前状态。
      事务监督器从前都是与大的大型计算机系统联系在一起的,但是Tuxedo的设计是为了在不昂贵的基于UNIX的系统上运行。AT&T最初是作为它自己使用的联机事务处理开发Tuxedo的。虽然Tuxedo必须在U-NIX系统上运行,但是它可以与DOS、OS/2、Windows和UNIX客户一起工作。它还使用通用的通信协议,如传输控制协议/因特网协议(TCP/IP)和网络基本输入输出系统(NetBIOS),并且可以在这些环境提供分布式处理支持。例如,它可以根据请求的类型,服务请求从一个客户选择路由到一个特定的服务器。Tuxedo的基本特征是它的联机事务处理系统,但是,Tuxedo也工作于集成关系型的平面文件,以及层次数据库系统。
  • 面向对象软件的测试策略

    2008-02-26 12:11:48

    面向对象分析:将问题空间中的实例抽象为对象,用对象的结构反映问题空间的复杂实例和复杂关系,用属性和服务表示实例的特性和行为。面向对象分析(OOA)的测试重点:其完整性和冗余性。

    OOA测试:对认定的对象的测试。对认定结构的测试。对认定主题的测试。对定义的属性和实例关联的测试。对定义的服务和消息关联的测试。

     

  • 逻辑驱动测试与数据驱动测试

    2008-02-26 11:45:53

       白盒测试(White-box Testing,又称逻辑驱动测试,结构测试)是把测试对象看作一个打开的盒子。利用白盒测试法进行动态测试时,需要测试软件产品的内部结构和处理过程,不需测试软件产品的功能。白盒测试又称为结构测试和逻辑驱动测试。

          白盒测试法的覆盖标准有逻辑覆盖、循环覆盖和基本路径测试。其中逻辑覆盖包括语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖。

          六种覆盖标准:语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖和路径覆盖发现错误的能力呈由弱至强的变化。语句覆盖每条语句至少执行一次。判定覆盖每个判定的每个分支至少执行一次。条件覆盖每个判定的每个条件应取到各种可能的值。判定/条件覆盖同时满足判定覆盖条件覆盖。条件组合覆盖每个判定中各条件的每一种组合至少出现一次。路径覆盖使程序中每一条可能的路径至少执行一次。

      白盒测试也称结构测试或逻辑驱动测试,它是知道产品内部工作过程,可通过测试来检测产品内部动作是否按照规格说明书的规定正常进行,按照程序内部的结构测试程序,检验程序中的每条通路是否都有能按预定要求正确工作,而不顾它的功能,白盒测试的主要方法有逻辑驱动、基路测试等,主要用于软件验证。

      "白盒"法全面了解程序内部逻辑结构、对所有逻辑路径进行测试。"白盒"法是穷举路径测试。在使用这一方案时,测试者必须检查程序的内部结构,从检查程序的逻辑着手,得出测试数据。贯穿程序的独立路径数是天文数字。但即使每条路径都测试了仍然可能有错误。第一,穷举路径测试决不能查出程序违反了设计规范,即程序本身是个错误的程序。第二,穷举路径测试不可能查出程序中因遗漏路径而出错。第三,穷举路径测试可能发现不了一些与数据相关的错误。

    黑盒测试(Black-box Testing,又称为功能测试或数据驱动测试)是把测试对象看作一个黑盒子。利用黑盒测试法进行动态测试时,需要测试软件产品的功能,不需测试软件产品的内部结构和处理过程。

          采用黑盒技术设计测试用例的方法有:等价类划分、边界值分析、错误推测、因果图和综合策略。

          黑盒测试注重于测试软件的功能性需求,也即黑盒测试使软件工程师派生出执行程序所有功能需求的输入条件。黑盒测试并不是白盒测试的替代品,而是用于辅助白盒测试发现其他类型的错误。

          黑盒测试试图发现以下类型的错误:

          1)功能错误或遗漏;
          2)界面错误;
          3)数据结构或外部数据库访问错误;
          4)性能错误;
          5)初始化和终止错误。

    一、黑盒测试的测试用例设计方法

    ·等价类划分方法
    ·边界值分析方法
    ·错误推测方法
    ·因果图方法
    ·判定表驱动分析方法
    ·正交实验设计方法
    ·功能图分析方法

    等价类划分:

          是把所有可能的输入数据,即程序的输入域划分成若干部分(子集),然后从每一个子集中选取少数具有代表性的数据作为测试用例.该方法是一种重要的,常用的黑盒测试用例设计方法.

          1) 划分等价类: 等价类是指某个输入域的子集合.在该子集合中,各个输入数据对于揭露程序中的错误都是等效的.并合理地假定:测试某等价类的代表值就等于对这一类其它值的测试.因此,可以把全部输入数据合理划分为若干等价类,在每一个等价类中取一个数据作为测试的输入条件,就可以用少量代表性的测试数据.取得较好的测试结果.等价类划分可有两种不同的情况:有效等价类和无效等价类.

          有效等价类:是指对于程序的规格说明来说是合理的,有意义的输入数据构成的集合.利用有效等价类可检验程序是否实现了规格说明中所规定的功能和性能.

          无效等价类:与有效等价类的定义恰巧相反.

          设计测试用例时,要同时考虑这两种等价类.因为,软件不仅要能接收合理的数据,也要能经受意外的考验.这样的测试才能确保软件具有更高的可靠性.

    2)划分等价类的方法:下面给出六条确定等价类的原则.

          ①在输入条件规定了取值范围或值的个数的情况下,则可以确立一个有效等价类和两个无效等价类.

          ②在输入条件规定了输入值的集合或者规定了“必须如何”的条件的情况下,可确立一个有效等价类和一个无效等价类.

          ③在输入条件是一个布尔量的情况下,可确定一个有效等价类和一个无效等价类.

          ④在规定了输入数据的一组值(假定n个),并且程序要对每一个输入值分别处理的情况下,可确立n个有效等价类和一个无效等价类.

          ⑤在规定了输入数据必须遵守的规则的情况下,可确立一个有效等价类(符合规则)和若干个无效等价类(从不同角度违反规则).

          ⑥在确知已划分的等价类中各元素在程序处理中的方式不同的情况下,则应再将该等价类进一步的划分为更小的等价类.

    3)设计测试用例:在确立了等价类后,可建立等价类表,列出所有划分出的等价类:

          输入条件 有效等价类 无效等价类

          ... ... ...

          ... ... ...

          然后从划分出的等价类中按以下三个原则设计测试用例:

          ①为每一个等价类规定一个唯一的编号.

          ②设计一个新的测试用例,使其尽可能多地覆盖尚未被覆盖地有效等价类,重复这一步.直到所有的有效等价类都被覆盖为止.

          ③设计一个新的测试用例,使其仅覆盖一个尚未被覆盖的无效等价类,重复这一步.直到所有的无效等价类都被覆盖为止.

    边界值分析法

          边界值分析方法是对等价类划分方法的补充.

    (1)边界值分析方法的考虑:

          长期的测试工作经验告诉我们,大量的错误是发生在输入或输出范围的边界上,而不是发生在输入输出范围的内部.因此针对各种边界情况设计测试用例,可以查出更多的错误.

          使用边界值分析方法设计测试用例,首先应确定边界情况.通常输入和输出等价类的边界,就是应着重测试的边界情况.应当选取正好等于,刚刚大于或刚刚小于边界的值作为测试数据,而不是选取等价类中的典型值或任意值作为测试数据.

    (2)基于边界值分析方法选择测试用例的原则:

          1)如果输入条件规定了值的范围,则应取刚达到这个范围的边界的值,以及刚刚超越这个范围边界的值作为测试输入数据.

          2)如果输入条件规定了值的个数,则用最大个数,最小个数,比最小个数少一,比最大个数多一的数作为测试数据.

          3)根据规格说明的每个输出条件,使用前面的原则1).

          4)根据规格说明的每个输出条件,应用前面的原则2).

          5)如果程序的规格说明给出的输入域或输出域是有序集合,则应选取集合的第一个元素和最后一个元素作为测试用例.

          6)如果程序中使用了一个内部数据结构,则应当选择这个内部数据结构的边界上的值作为测试用例.

          7)分析规格说明,找出其它可能的边界条件.

    错误推测法

          错误推测法: 基于经验和直觉推测程序中所有可能存在的各种错误, 从而有针对性的设计测试用例的方法.

          错误推测方法的基本思想: 列举出程序中所有可能有的错误和容易发生错误的特殊情况,根据他们选择测试用例. 例如, 在单元测试时曾列出的许多在模块中常见的错误. 以前产品测试中曾经发现的错误等, 这些就是经验的总结. 还有, 输入数据和输出数据为0的情况. 输入表格为空格或输入表格只有一行. 这些都是容易发生错误的情况. 可选择这些情况下的例子作为测试用例.

    因果图方法

          前面介绍的等价类划分方法和边界值分析方法,都是着重考虑输入条件,但未考虑输入条件之间的联系, 相互组合等. 考虑输入条件之间的相互组合,可能会产生一些新的情况. 但要检查输入条件的组合不是一件容易的事情, 即使把所有输入条件划分成等价类,他们之间的组合情况也相当多. 因此必须考虑采用一种适合于描述对于多种条件的组合,相应产生多个动作的形式来考虑设计测试用例. 这就需要利用因果图(逻辑模型).

          因果图方法最终生成的就是判定表. 它适合于检查程序输入条件的各种组合情况.

          利用因果图生成测试用例的基本步骤:

          (1) 分析软件规格说明描述中, 那些是原因(即输入条件或输入条件的等价类),那些是结果(即输出条件), 并给每个原因和结果赋予一个标识符.

          (2) 分析软件规格说明描述中的语义.找出原因与结果之间, 原因与原因之间对应的关系. 根据这些关系,画出因果图.

          (3) 由于语法或环境限制, 有些原因与原因之间,原因与结果之间的组合情况不不可能出现. 为表明这些特殊情况, 在因果图上用一些记号表明约束或限制条件.

          (4) 把因果图转换为判定表.

          (5) 把判定表的每一列拿出来作为依据,设计测试用例.

          从因果图生成的测试用例(局部,组合关系下的)包括了所有输入数据的取TRUE与取FALSE的情况,构成的测试用例数目达到最少,且测试用例数目随输入数据数目的增加而线性地增加.

          前面因果图方法中已经用到了判定表.判定表(Decision Table)是分析和表达多逻辑条件下执行不同操作的情况下的工具.在程序设计发展的初期,判定表就已被当作编写程序的辅助工具了.由于它可以把复杂的逻辑关系和多种条件组合的情况表达得既具体又明确.

          判定表通常由四个部分组成.

          条件桩(Condition Stub):列出了问题得所有条件.通常认为列出得条件的次序无关紧要.

          动作桩(Action Stub):列出了问题规定可能采取的操作.这些操作的排列顺序没有约束.

          条件项(Condition Entry):列出针对它左列条件的取值.在所有可能情况下的真假值.

          动作项(Action Entry):列出在条件项的各种取值情况下应该采取的动作.

          规则:任何一个条件组合的特定取值及其相应要执行的操作.在判定表中贯穿条件项和动作项的一列就是一条规则.显然,判定表中列出多少组条件取值,也就有多少条规则,既条件项和动作项有多少列.

          判定表的建立步骤:(根据软件规格说明)

          ①确定规则的个数.假如有n个条件.每个条件有两个取值(0,1),故有 种规则.

          ②列出所有的条件桩和动作桩.

          ③填入条件项.

          ④填入动作项.等到初始判定表.

          ⑤简化.合并相似规则(相同动作).

          B. Beizer 指出了适合使用判定表设计测试用例的条件:

          ①规格说明以判定表形式给出,或很容易转换成判定表.

          ②条件的排列顺序不会也不影响执行哪些操作.

          ③规则的排列顺序不会也不影响执行哪些操作.

          ④每当某一规则的条件已经满足,并确定要执行的操作后,不必检验别的规则.

          ⑤如果某一规则得到满足要执行多个操作,这些操作的执行顺序无关紧要.

    黑盒测试的优点

          1. 基本上不用人管着,如果程序停止运行了一般就是被测试程序crash了
          2. 设计完测试例之后,下来的工作就是爽了,当然更苦闷的是确定crash原因

    黑盒测试的缺点

          1. 结果取决于测试例的设计,测试例的设计部分来势来源于经验,OUSPG的东西很值得借鉴
          2. 没有状态转换的概念,目前一些成功的例子基本上都是针对PDU来做的,还做不到针对被测试程序的状态转换来作
          3. 就没有状态概念的测试来说,寻找和确定造成程序crash的测试例是个麻烦事情,必须把周围可能的测试例单独确认一遍。而就有状态的测试来说,就更麻烦了,尤其不是一个单独的testcase造成的问题。这些在堆的问题中表现的更为突出。

  • CRM软件简介

    2008-01-30 19:47:53

    企业为什么需要CRM
    企业在实现商业流程的自动化和优化的同时,意识到关注客户,就是关注企业的成长。但由于企业中的销售、营销和客户服务/支持部门都是作为独立的实体来工作的。部门界限的存在使这些不同的业务功能往往很难以协调一致的方式将注意力集中在客户身上。CRM则正是着眼于企业的这一需求应运而生的。在如今竞争激烈的商业环境中,越来越多的商家开始通过实施客户关系管理(CRM)来赢得更多的客户并且提高客户的忠诚度。传统的数据库营销是静态的,经营需要好几个月时间才能对一次市场营销战役的结果做出一个分析计表格,许多重要的商业机遇经常在此期间失去。CRM软件建立在多个营销战役交叉的基础上,能够对客户的活动及时做出反应,因而能够更好地抓住各种商业机遇。

    客户关系管理是什么?
    在目前充满竞争的市场上,如何抓住客户、留住客户,维持客户的忠诚度,保持市场竞争力,是今天所有厂商关心的问题。能赢得和留住客户的唯一方法就是更加关注客户的需求。

    客户关系管理(CRM)源于以“客户为中心”的新型商业模式,是一种旨在改善企业与客户之间关系的新型管理机制。通过向企业的销售、市场和客户服务的专业人士提供全面、个性化的客户资料,并强化跟踪服务、信息分析的能力,使他们能够协同建立和维护一系列与客户和生意伙伴之间卓有成效的“一对一关系”,从而使企业得以提供更快捷和周到的优质服务、提高客户满意度、吸引和保持更多的客户,从而增加营业额;并通过信息共享和优化商业流程有效的降低企业经营成本。

    采用富于创新的“一对一营销策略”可以帮助你发现并留住客户,随着时间的推移,它将成为您创造事业成功的真正伙伴。客户关系管理 (CRM) 这一突破性理念是通过重视每个员工在业务上开拓,培养和维持多变而又富于产出性的客户关系来提高客户忠诚度,使企业赢得竞争优势和长足利润。


    使用客户关系管理(CRM)的好处
    ● 提高销售额。
    利用CRM系统提供的多渠道的客户信息,确切了解客户的需求,增加销售的成功几率,进而提高销售收入。
    ● 增加利润率。
    由于对客户的更多了解,业务人员能够有效地抓住客户的兴趣点,有效进行销售,避免盲目的以价格让利取得交易成功,从而提高销售利润。
    ● 提高客户满意程度。
    CRM系统提供给客户多种形式的沟通渠道,同时又确保各类沟通方式中数据的一致性与连贯性,利用这些数据,销售部门可以对客户要求做出迅速而正确的反应,让用户在对购买产品满意的同时也认可并愿意保持与企业的有效沟通关系。
    ● 降低市场销售成本。
    由于对客户进行了具体甄别和群组分类,并对其特性进行分析。使市场推广和销售策略的制定与执行避免了盲目性,节省时间和资金。
    客户关系管理(CRM)系统的功能构成

    CRM系统的核心是客户数据的管理。我们可以把客户数据库看作是一个数据中心,利用它,企业可以记录在整个市场与销售的过程中和客户发生的各种活动,跟踪各类活动的状态,建立各类数据的统计模型用于后期的分析和决策支持。为达到上述目的,一套CRM系统大都具备市场管理、销售管理、销售支持与服务和竞争对象记录与分析的功能。
    1、 市场管理
    ● 现有客户数据的分析。
    ● 提供个性化的市场信息。
    ● 提供销售预测功能。
    2、 销售管理
    ● 提供有效、快速而安全的交易方式。
    ● 提供订单与合同的管理。
    3、销售支持与服务
    ● 呼叫中心服务(CallCenterService)。
    ● 订单与合同的处理状态及执行情况跟踪。
    ● 实时的发票处理。
    ● 提供产品的保修与维修处理。
    ● 记录产品的索赔及退货。
    4、竞争者分析
    ●记录主要竞争对手。
    ●记录主要竞争产品。
    不难看出,一套CRM集成系统的功能构成不应当是独立存在的,它必然与企业后端的供应链管理(SupplyChainManagement)紧密相关,从而保证CRM系统中每一张订单能够在保证利润的前提下有效及时地得到确认并确保执行。每一笔销售交易的达成都有赖于企业后台的支撑平台,即ERP系统(EnterpriseResourcePlanningSystem),其中包括分销与运输管理、生产与服务计划、信用与风险控制、成本与利润分析等功能。

    CRM的概念由美国Gartner 集团率先提出。我们认为,CRM是辨识、获取、保持和增加“可获利客户”的理论、实践和技术手段的总称。它既是一种国际领先的、以“客户价值”为中心的企业管理理论、商业策略和企业运作实践,也是一种以信息技术为手段、有效提高企业收益、客户满意度、雇员生产力的管理软件。

    CRM(Customer Relationship Management),即客户关系管理。这个概念最初由Gartner Group提出来,而在最近开始在企业电子商务中流行。CRM的主要含义就是通过对客户详细资料的深入分析,来提高客户满意程度,从而提高企业的竞争力的一种手段,它主要包含以下几个主要方面(简称7P):  

      客户概况分析(Profiling)包括客户的层次、风险、爱好、习惯等;  

      客户忠诚度分析(Persistency)指客户对某个产品或商业机构的忠实程度、持久性、变动情况等;  

      客户利润分析(Profitability)指不同客户所消费的产品的边缘利润、总利润额、净利润等;  

      客户性能分析(Performance)指不同客户所消费的产品按种类、渠道、销售地点等指标划分的销售额;  

      客户未来分析(Prospecting)包括客户数量、类别等情况的未来发展趋势、争取客户的手段等;  

      客户产品分析(Product)包括产品设计、关联性、供应链等;  

      客户促销分析(Promotion)包括广告、宣传等促销活动的管理。  

      在不同场合下,CRM可能是一个管理学术语,可能是一个软件系统,而通常我们所指的CRM,是指用计算机对上述分析流程自动化的软件系统,其中涉及销售、市场营销、客户服务以及支持应用等软件。它的目标是缩减销售周期和销售成本、增加收入、寻找扩展业务所需的新的市场和渠道以及提高客户的价值、满意度、赢利性和忠实度。  

      在传统企业引入电子商务后,企业关注的重点由提高内部效率向尊重外部客户转移。而CRM理念正是基于对客户的尊重,要求企业完整地认识整个客户生命周期,提供与客户沟通的统一平台,提高员工与客户接触的效率和客户反馈率。一个成功的客户关系管理系统至少应包括如下功能:通过电话、传真、网络、移动通讯工具、电子邮件等多种渠道与客户保持沟通;使企业员工全面了解客户关系,根据客户需求进行交易,记录获得的客户信息,在企业内部做到客户信息共享;对市场计划进行整体规划和评估;对各种销售活动进行跟踪;通过大量积累的动态资料,对市场和销售进行全面分析。

  • SnagIt定时截图

    2008-01-30 11:39:47

    通信程序出现一个问题,开发人员修改后就不认帐了。还好我有保存原来的版本。又用snagit定时把问题截屏出来了,呵呵。。。  

    运行SnagIt,点击菜单“输出/属性”,在弹出窗口中选择“图像文件”选项卡。在文件格式列表框中选择 “GIF”格式,这样捕获后的图像文件会以GIF格式保存。效果不错,体积也不大,较节省硬盘空间。在“文件名”部分,选择“固定文件名”单选框;在框中输入文件名,如监视。这样SnagIt会自动以“监视00”、“监视01”、“监视02”的形式保存图像文件。“输出文件夹”中设置图像文件的保存路径,点击“确定”后返回主界面。
     

        在菜单“工具”中选择“图像捕获”,然后在菜单“输入”中选择“屏幕”。接下来点击“工具/定时捕获”,在弹出的“定时设置”窗口里选“定时捕获器”选项卡,在该选项卡中我们可以设置SnagIt每隔多少秒进行自动捕获窗口的操作。先选中“启用定时激活捕获”单选框,“周期”根据实际情况设置,单位最好是“秒”,点击“确定”保存。
     

        最后点击主界面上的“立即捕获”按钮启动计时器,再按下“Ctrl+Shift+X”组合键将SnagIt隐藏在后台运行,SnagIt便不知不觉地执行起了监视任务。

        你可以按“CTRL+SHIFT+X”和“CTRL+SHIFT+P”显示并停止拍照,点击软件界面的上“图像浏览器”,切换到SnagIt图像浏览器,可以看到,自你离开电脑后屏幕的所有变化都以一幅幅图片的形式记录在这里了。

  • 自动化测试工具简介

    2008-01-22 10:17:25

     

    工具名称
    生产厂商
    说明:
    Jtest
    Parasoft
    java代码分析和动态类、组件测试
    .test
    Parasoft
    .Net代码分析和动态测试
    Purifyplus
    IBM rational
     
    Rational Test Realtime
    IBM rational
     
    DevPartnerJavaEdition
    Compuware
     
    JProbe Suite
    Quest Software
     
    Sql optimizer
    Quest Software
     
    DBPartner
    Compuware
     
    Aqtime
    AutomatedQA
     
    QESatJava
    AutomatedQA
     

    JTest:自动化Java软件和部件测试。。Jtest的自动化测试过程能够极大地加速单元测试,并测试得更彻底更精确。您只需要简单地告诉Jtest一个需要测试的类或项目(一组被测类),然后Jtest能够自动检查每个类,生成相应的测试驱动程序以及任何必要的桩函数,并使用构造、功能和回归测试技术自动测试每个类;还能对所有的.java文件执行静态分析。白盒测试 Jtest能够对任何Java类或部件进行白盒测试,包括那些引用外部资源(如外部文件、数据库、EJB和CORBA)的类。如果您正在测试一些引用外部资源的类,Jtest将自动生成必要的桩函数,或者您可以选择直接调用实际的外部方法或您自己的桩函数。对使用CORBA的类,Jtest提供ORB和其它引用对象的桩函数。对使用EJB的类,Jtest调用Bean初始化程序并提供一个模拟的容器,然后执行白盒测试,保证这些类能够恰当地执行。黑盒测试使用Jtest进行黑盒测试比使用任何其它工具更简单(也更有效)。Jtest的专利技术通过分析类的字节码自动生成一组核心输入;这些输入经过精心设计能够达到尽可能高的代码覆盖。由于自动生成的输入的设计目标是覆盖类的方法,而非验证其定义,因此用户可能需要增加自己的测试用例。(这一点是可以理解的,自动技术是针对语法的,机器并不能理解人的真正意图。)

    用户定义的输入可以直接添加到树形表示的测试用例中,其中节点代表方法的每个参数或者能够存贮在全局或局部存储库中的常量和方法;在这里,输入可以方便地加入到任何方法的参数中。当测试进行时,Jtest自动执行所有的输入并以简单的树形表示显示相应的输出。在以后的功能测试或回归测试测试中出现错误时,Jtest会自动通告用户

     
  • 排序或分类

    2008-01-14 16:39:21

      所谓排序,就是要整理文件中的记录,使之按关键字递增(或递减)次序排列起来。其确切定义如下:
      输入:n个记录R1,R2,…,Rn,其相应的关键字分别为K1,K2,…,Kn
      输出:Ril,Ri2,…,Rin,使得Ki1≤Ki2≤…≤Kin。(或Ki1≥Ki2≥…≥Kin)。

    1.被排序对象--文件
      被排序的对象--文件由一组记录组成。
      记录则由若干个数据项(或域)组成。其中有一项可用来标识一个记录,称为关键字项。该数据项的值称为关键字(Key)。
      注意:
         在不易产生混淆时,将关键字项简称为关键字。

    2.排序运算的依据--关键字
         用来作排序运算依据的关键字,可以是数字类型,也可以是字符类型。
         关键字的选取应根据问题的要求而定。
    【例】在高考成绩统计中将每个考生作为一个记录。每条记录包含准考证号、姓名、各科的分数和总分数等项内容。若要惟一地标识一个考生的记录,则必须用"准考证号"作为关键字。若要按照考生的总分数排名次,则需用"总分数"作为关键字。

    排序的稳定性

         当待排序记录的关键字均不相同时,排序结果是惟一的,否则排序结果不唯一。
         在待排序的文件中,若存在多个关键字相同的记录,经过排序后这些具有相同关键字的记录之间的相对次序保持不变,该排序方法是稳定的;若具有相同关键字的记录之间的相对次序发生变化,则称这种排序方法是不稳定的
      注意:
         排序算法的稳定性是针对所有输入实例而言的。即在所有可能的输入实例中,只要有一个实例使得算法不满足稳定性要求,则该排序算法就是不稳定的。

    排序方法的分类

    1.按是否涉及数据的内、外存交换分

         在排序过程中,若整个文件都是放在内存中处理,排序时不涉及数据的内、外存交换,则称之为内部排序(简称内排序);反之,若排序过程中要进行数据的内、外存交换,则称之为外部排序
      注意:
         ① 内排序适用于记录个数不很多的小文件
         ② 外排序则适用于记录个数太多,不能一次将其全部记录放人内存的大文件。

    2.按策略划分内部排序方法
         可以分为五类:插入排序、选择排序、交换排序、归并排序和分配排序。

    插入排序(Insertion Sort)的基本思想是:每次将一个待排序的记录,按其关键字大小插入到前面已经排好序的子文件中的适当位置,直到全部记录插入完成为止。
         本节介绍两种插入排序方法:直接插入排序和希尔排序。

    直接插入排序基本思想

    1、基本思想

         假设待排序的记录存放在数组R[1..n]中。初始时,R[1]自成1个有序区,无序区为R[2..n]。从i=2起直至i=n为止,依次将R[i]插入当前的有序区R[1..i-1]中,生成含n个记录的有序区。

    2、第i-1趟直接插入排序:
         通常将一个记录R[i](i=2,3,…,n-1)插入到当前的有序区,使得插入后仍保证该区间里的记录是按关键字有序的操作称第i-1趟直接插入排序。
         排序过程的某一中间时刻,R被划分成两个子区间R[1..i-1](已排好序的有序区)和R[i..n](当前未排序的部分,可称无序区)。
         直接插入排序的基本操作是将当前无序区的第1个记录R[i]插人到有序区R[1..i-1]中适当的位置上,使R[1..i]变为新的有序区。因为这种方法每次使有序区增加1个记录,通常称增量法。
         插入排序与打扑克时整理手上的牌非常类似。摸来的第1张牌无须整理,此后每次从桌上的牌(无序区)中摸最上面的1张并插入左手的牌(有序区)中正确的位置上。为了找到这个正确的位置,须自左向右(或自右向左)将摸来的牌与左手中已有的牌逐一比较。

    一趟直接插入排序方法

    1.简单方法

         首先在当前有序区R[1..i-1]中查找R[i]的正确插入位置k(1≤k≤i-1);然后将R[k..i-1]中的记录均后移一个位置,腾出k位置上的空间插入R[i]。
      注意:
         若R[i]的关键字大于等于R[1..i-1]中所有记录的关键字,则R[i]就是插入原位置。

    2.改进的方法
      一种查找比较操作和记录移动操作交替地进行的方法。
    具体做法:
         将待插入记录R[i]的关键字从右向左依次与有序区中记录R[j](j=i-1,i-2,…,1)的关键字进行比较:
         ① 若R[j]的关键字大于R[i]的关键字,则将R[j]后移一个位置;
          ②若R[j]的关键字小于或等于R[i]的关键字,则查找过程结束,j+1即为R[i]的插入位置。
         关键字比R[i]的关键字大的记录均已后移,所以j+1的位置已经腾空,只要将R[i]直接插入此位置即可完成一趟直接插入排序。

    直接插入排序算法

    1.算法描述

      void lnsertSort(SeqList R)
       { //对顺序表R中的记录R[1..n]按递增序进行插入排序
        int i,j;
        for(i=2;i<=n;i++) //依次插入R[2],…,R[n]
          if(R[i].key<R[i-1].key){//若R[i].key大于等于有序区中所有的keys,则R[i]
                                  //应在原有位置上
            R[0]=R[i];j=i-1; //R[0]是哨兵,且是R[i]的副本
            do{ //从右向左在有序区R[1..i-1]中查找R[i]的插入位置
             R[j+1]=R[j]; //将关键字大于R[i].key的记录后移
             j-- ;
             }while(R[0].key<R[j].key); //当R[i].key≥R[j].key时终止
            R[j+1]=R[0]; //R[i]插入到正确的位置上
           }//endif
       }//InsertSort

    交换排序的基本思想是:两两比较待排序记录的关键字,发现两个记录的次序相反时即进行交换,直到没有反序的记录为止。
         应用交换排序基本思想的主要排序方法有:冒泡排序和快速排序。

    冒泡排序

    1、排序方法

         将被排序的记录数组R[1..n]垂直排列,每个记录R[i]看作是重量为R[i].key的气泡。根据轻气泡不能在重气泡之下的原则,从下往上扫描数组R:凡扫描到违反本原则的轻气泡,就使其向上"飘浮"。如此反复进行,直到最后任何两个气泡都是轻者在上,重者在下为止。
    (1)初始
         R[1..n]为无序区。

    (2)第一趟扫描
         从无序区底部向上依次比较相邻的两个气泡的重量,若发现轻者在下、重者在上,则交换二者的位置。即依次比较(R[n],R[n-1]),(R[n-1],R[n-2]),…,(R[2],R[1]);对于每对气泡(R[j+1],R[j]),若R[j+1].key<R[j].key,则交换R[j+1]和R[j]的内容。
         第一趟扫描完毕时,"最轻"的气泡就飘浮到该区间的顶部,即关键字最小的记录被放在最高位置R[1]上。

    (3)第二趟扫描

         扫描R[2..n]。扫描完毕时,"次轻"的气泡飘浮到R[2]的位置上……
         最后,经过n-1 趟扫描可得到有序区R[1..n]
      注意:
         第i趟扫描时,R[1..i-1]和R[i..n]分别为当前的有序区和无序区。扫描仍是从无序区底部向上直至该区顶部。扫描完毕时,该区中最轻气泡飘浮到顶部位置R[i]上,结果是R[1..i]变为新的有序区。

    2、冒泡排序过程示例
         对关键字序列为49 38 65 97 76 13 27 49的文件进行冒泡排序的过程【参见动画演示

    3、排序算法
    (1)分析
         因为每一趟排序都使有序区增加了一个气泡,在经过n-1趟排序之后,有序区中就有n-1个气泡,而无序区中气泡的重量总是大于等于有序区中气泡的重量,所以整个冒泡排序过程至多需要进行n-1趟排序。
         若在某一趟排序中未发现气泡位置的交换,则说明待排序的无序区中所有气泡均满足轻者在上,重者在下的原则,因此,冒泡排序过程可在此趟排序后终止。为此,在下面给出的算法中,引入一个布尔量exchange,在每趟排序开始前,先将其置为FALSE。若排序过程中发生了交换,则将其置为TRUE。各趟排序结束时检查exchange,若未曾发生过交换则终止算法,不再进行下一趟排序。

    (2)具体算法

      void BubbleSort(SeqList R)
       { //R(l..n)是待排序的文件,采用自下向上扫描,对R做冒泡排序
         int i,j;
         Boolean exchange; //交换标志
         for(i=1;i<n;i++){ //最多做n-1趟排序
           exchange=FALSE; //本趟排序开始前,交换标志应为假
           for(j=n-1;j>=i;j--) //对当前无序区R[i..n]自下向上扫描
            if(R[j+1].key<R[j].key){//交换记录
              R[0]=R[j+1]; //R[0]不是哨兵,仅做暂存单元
              R[j+1]=R[j];
              R[j]=R[0];
              exchange=TRUE; //发生了交换,故将交换标志置为真
             }
           if(!exchange) //本趟排序未发生交换,提前终止算法
                 return;
         } //endfor(外循环)
        } //BubbleSort

  • 算法效率的度量

    2008-01-14 16:36:24

    算法效率的度量

    算法执行时间需过依据该算法编制的程序在计算机上运行时所消耗的时间来度量。而度量一个程序的执行时间通常常有两种方法:

    1、事后统计的方法。因为很多计算机内部都有计时功能,有的甚至可精确到毫秒及,不同算法的程序可通过一组或若干组相同的统计数据以分辨优劣。但这种方法有两个缺陷:一是必须先运行依据算法编制的程序;二是所得时间的统计量依赖于计算机的硬件、软件等环境因素,有时容易掩盖算法本身的优劣。因此人们常常采用另一种事前分析估算的方法。

    2、事前分析估算的方法。一个用高级程序语言编写的程序在计算机上运行时所消耗的时间取决于下列因素:a依据的算法选用何种策略。b问题的规模,例如求100内还是1000内的素数。c书写程序的语言,对于同一个算法,实现语言的级别越高,执行效率就越底。e机器执行指令的速度。

    一个算法是由控制结构(顺序、分支和循环三种)和原操作(指固有数据类型的操作)构成的,则算法时间取决于两者的综合效果。为了便于比较同一问题的不同算法,通常的做法是,从算法中选取一种对于所研究的问题平说是基本操作的原操用,以该基本操作重复执行的次数做为算法的时间量度。

  • 软件测试常用单词

    2008-01-10 10:47:11


    软件测试常用单词:(转)
    1.静态测试:Non-Execution-Based Testing或Static testing
        代码走查:Walkthrough
    代码审查:Code Inspection
    技术评审:Review
    2.动态测试:Execution-Based Testing
    3.白盒测试:White-Box Testing
    4.黑盒测试:Black-Box Testing
    5.灰盒测试:Gray-Box Testing
    6.软件质量保证SQA:Software Quality Assurance
    7.软件开发生命周期:Software Development Life Cycle
    8.冒烟测试:Smoke Test
    9.回归测试:Regression Test
    10.功能测试:Function Testing
    11.性能测试:Performance Testing
    12.压力测试:Stress Testing
    13.负载测试:Volume Testing
    14.易用性测试:Usability Testing
    15.安装测试:Installation Testing
    16.界面测试:UI Testing
    17.配置测试:Configuration Testing
    18.文档测试:Documentation Testing
    19.兼容性测试:Compatibility Testing
    20.安全性测试:Security Testing
    21.恢复测试:Recovery Testing
    22.单元测试:Unit Tes
    23.集成测试:Integration Test
    24.系统测试:System Test
    25.验收测试:Acceptance Test
    26.测试计划应包括:
    测试对象:The Test Objectives,
    测试范围: The Test Scope,
    测试策略: The Test Strategy
    测试方法: The Test Approach,
    测试过程: The test procedures,
    测试环境: The Test Environment,
    测试完成标准:The test Completion criteria
                              测试用例:The Test Cases
                              测试进度表:The Test Schedules
                              风险:Risks
                              Etc
    27.主测试计划: a master test plan
    28.需求规格说明书:The Test Specifications
    29.需求分析阶段:The Requirements Phase
    30.接口:Interface
    31.最终用户:The End User
    31.正式的测试环境:Formal Test Environment
    32.确认需求:Verifying The Requirements
    33.有分歧的需求:Ambiguous Requirements
    34.运行和维护:Operation and Maintenance.
    35.可复用性:Reusability
    36.可靠性: Reliability/Availability
    37.电机电子工程师协会IEEE:The Institute of Electrical and Electronics Engineers)
    38.要从以下几方面测试软件:
    正确性:Correctness
    实用性:Utility
    性能:Performance
    健壮性:Robustness
    可靠性:Reliability

    关于Bugzilla:
    1.Bug按严重程度(Severity)分为:
    Blocker,阻碍开发和/或测试工作
            Critical,死机,丢失数据,内存溢出
            Major,较大的功能缺陷
            Normal,普通的功能缺陷
            Minor,较轻的功能缺陷
    Trivial,产品外观上的问题或一些不影响使用的小毛病,如菜单或对话框中的文字拼写或字体问题等等
        Enhancement,建议或意见
    2.Bug按报告状态分类(Status)
      待确认的(Unconfirmed)
          新提交的(New)
        已分配的(Assigned)
      问题未解决的(Reopened)
          待返测的(Resolved)
          待归档的(Verified)
          已归档的(Closed)
    3.Bug处理意见(Resolution)
                  已修改的(Fixed)
    无效的缺陷(Invalid)
                  不计划修改(Wontfix)
        以后版本解决(Later)
              保留(Remind)
                    重复(Duplicate)
              无法重现(Worksforme)
  • 数据结构

    2008-01-07 20:16:51

    最近在看软件评测师教程,前面的理论篇很快就看完了,也很容易懂,做了一下题目,发现还不错,可在看到白测试技术的时候就不顺了,数据结构都忘记的差不多了。还是要把基础看一下,要不就如空中楼阁。再看下去可能也不能理解的很深入了。

    我个人认为不懂白盒就谈自动化测试是白忙。

1032/6<123456>
Open Toolbar