“未来的世界:方向比努力重要,能力比知识重要,健康比成绩重要,生活比文凭重要,情商比智商重要! ”    ——清华大学校长留给毕业生的一段话

发布新日志

  • 图片验证码性能测试解决方案

    2007-07-10 00:58:01

    如何测试图片验证码功能,大家常用的有三种方法: 鄛%鳰?瑏9  
    1.设置一个万能验证码. G?沉N`i饒  
    2.取消验证码功能. 歍?c牸?  
    3.编写个专用插件,动态获取真实的验证码.  敌瘆I哽R  
    E箉睞?萌y  
    1,2两种方法实现比较容易,缺点是不能真实的模拟实际应用环境. j妻?滜? 
    3的方法技术难度较高. ;?Wq~鱺6x  
    欒d?宇ES=  
    其实我们还有第4种即简单又能够真实的模拟实际应用的方法. p#O湕?  
    cZ冬淈F螧  
    以Jsp网站为例,先来看看验证码功能的实现方法.图片验证码由以下几个步骤实现. G a7百7  
    1.生成随机数. Ud?
  • Tcl编程简介(六)

    2007-07-09 17:38:23

    Tcl编程简介(六)
     

    Tcl 名字空间

    namespace

      创建和操纵命令和变量的上下文(content)。

    简介:

      一个名字空间是一个命令和变量的集合,通过名字空间的封装来保证他们不会影响其它名字空间的变量和命令。 Tcl 总是维护了一个全局名字空间 global namespace 包含了所有的全局变量和命令。

      namespace eval允许你创建一个新的namespace。

      例如:


    namespace eval Counter {
    namespace export Bump
    variable num 0

    proc Bump {} {
    variable num//声明局部变量
    incr num
    }
    }

      名字空间是动态的,可变的。

      例如:


    namespace eval Counter {
    variable num 0//初始化
    proc Bump {} {
    variable num
    return [incr num]
    }
    }

    //添加了一个过程
    namespace eval Counter {
    proc test {args} {
    return $args
    }
    }

    //删除test
    namespace eval Counter {
    rename test ""
    }

      引用:


    set Counter::num
    //return 0

      也可以用下面的方式添加:

    proc Foo::Test {args} {return $args}

      或在名字空间中移动:

    rename Foo::Test Bar::Test


  • Tcl编程简介(五)

    2007-07-09 17:38:03


    Tcl编程简介(五)
     

    lsort -mode list

    排列列表。

    -mode : -ascii

      -dictionary 与acsii类似,只是不区分大小写

      -integer 转化为整数再比较

      -real 转化为浮点数再比较

      -command command 执行command来做比较


    open fileName
    open fileName access

      打开文件,返回一个文件描述符。


    access
    r w a r+ w+ a+

      定义与C中相同。如文件名的第一个字符为|表示一管道的形式来打开。


    set f [open |more w]
    set f [open /etc/pass r]

    proc name args body

      创建一个新的过程,可以替代任何存在的过程或命令。


    proc wf {file str} {
    puts -nonewline $file str
    flush $file
    }
    set f [open /tmp/a w]
    wf $f "first line "
    wf $f "second line "

      在函数末尾可用 return 来返回值。

    puts -nonewline fileId string

      向fileId中写入string,如果不加上 -nonewline 则自动产生一个换行符。

    pwd

      返回当前目录。


    read fileId
    read fileId numBytes

      从fileId中读取numBytes个字节。


    regexp ?switches? exp string ?matchVar? ?subMatchVar
    subMatchVar ...?

      执行正则表达式的匹配。


    ?switches? -nocase 不区分大小写
    -indices 返回匹配区间

      如:


    regexp ^abc abcjsdfh
    //return 1
    regexp ^abc abcjsdfh a
    //return 1
    puts $a
    //return abc

    regexp -indices ^abc abcsdfjkhsdf a
    //return 1
    puts $a
    //return "0 2"


    regsub ?switchs? exp string subSpec varName

      执行正则表达式的替换,用subSpec的内容替换string中匹配exp的部分。

      ?switchs? -all 将所有匹配的部分替换,缺省子替换第一个,返回值为替换的个数。

      -nocase 不区分大小写。

      如:


    regsub abc abcabcbac eee b
    //return 1
    puts $b
    //return "eeeabcabc"

    regsub -all abc abcabcabc eee b
    //return 3
    puts $b
    //return "eeeeeeeee"


    return
    立即从当前命令中返回。
    proc ff {} {
    return friday
    }

    set a [ff]
    //a = "friday"


    scan string `format" varname ...

      从string中安format来读取值到varname。

    seek fileId offset ?origin?

      移动文件指针。

    origin: start current end

      offset从哪里开始算起。

    set varname ?value?

      设置varname用value,或返回varname的值。如果不是在一个proc命令中则生成一个全局变量。

    source fileName

      从filename中读出内容传给Tcl解释起来执行。

    split string ?splitChars?

      将string分裂成列表。缺省以空白为分隔符,也可通过splitChars来设定分隔符

    string subcommand arg ...

      用于字符串的命令。

    string compare string1 string2

      执行字符串的比较,按 C strcmp 的方式。返回 -1, 0, or 1。

    string first string1 string2

      在string1种查找string2的定义次出现的位置。未找到返回-1。

    string length string

      返回字符串string的长度。

    string match pattern string

      判断string是否能匹配pattern。pattern是以shell文件名的统配格式来给出。

    string range string first last

      返回字符串string中从first到last之间的内容。

    string tolower string

      将string转换为小写。

    string toupper string

      将string转换为大写。

    string trim string

      将string的左右空白去掉。

    string trimleft string

      将string的左空白去掉。

    string trimright string

      将string的右空白去掉。

    tell fileId

      返回fileId的文件指针位置。

    time command

      执行命令,并计算所消耗的时间。


    time "ls --color"
    some file name
    503 microseconds per iteration
    trace subcommand
    trace subcommand arg ...

      监视变量的存储。子命令定义了不少,但目前只实现了


    virable。
    trace variable name ops command
    name 为变量的名字。
    ops 为要监视的操作。
    r 读
    w 写
    u unset

      command 条件满足时执行的命令。

      以三个参数来执行 name1 name2 ops name1时变量的名字。当name1为矢量时,name2为下标,ops为执行的操作。

      例如:


    proc ff {name1 name2 op} {
    puts [format "%s %s %s" name1 name2 op]
    }
    set a hhh
    trace variable a r {ff}
    puts $a
    //return "a r hhh"

    unknown cmdName

      unknown 并不是 Tcl 的一部分,当 Tcl 发现一条不认识的命令时会看看是否存在 unknown命令,如果有,则调用它,没有则出错。

      如:


    #!/usr/bin/tclsh
    proc unknown {cwd args} {
    puts $cwd
    puts $args
    }
    //下面是一条错误命令
    sdfdf sdf sdkhf sdjkfhkasdf jksdhfk
    //return "sdfdf sdf sdkhf sdjkfhkasdf jksdhfk"


    unset name ...

      删除一个或多个变量(标量或矢量)。

    uplevel command ...

      将起参数连接起来(象是在concat中)。最后在由level所指定的上下文中来执行。如果level是一个整数,给出了在栈中的距离(是跳到其它的命令环境中来执行)。缺省为1(即上一层)。

      如:


    #!/usr/bin/tcl
    proc ff {} {
    set a "ff" //设置了局部的a
    -------------------------
    }
    set a "global"
    ff
    puts $a
    //return "global"

      再看下一个:


    #!/usr/bin/tcl
    proc ff {} {
    uplevel set a "ff" //改变上一级栈中的a
    -------------------------------------
    }
    set a global
    ff
    puts $a
    //return "ff"

      如果level是以#开头后接一个整数,则level指出了在栈中的绝对位置。如#0表示了顶层(top-level)。

      a b c 分别为三个命令,下面是它们之间的调用关系,

    top-level -> a -> b -> c -> uplevel level

      绝对位置: 0 1 2 3

      当level为 1 或 #2 都是在 b 的环境中来执行。

      3 或 #0 都是在 top-level 的环境中来执行。

    upvar ?level? otherVar myVar ?otherVar myVar ...?

      在不同的栈中为变量建立连接。这里的level与uplevel中的level是同样风格的。

      例如:


    #!/usr/bin/tcl
    proc ff {name } {
    upvar $name x
    set x "ff"
    }
    set a "global"
    ff a
    puts $a
    //return "ff"

    while test body

      举个例子吧:


    set x 0
    while {$x<10} {
    puts "x is $x"
    incr x
    }

      Built-in variables 内建的变量下名的全局变量是由 Tcl library 自动来管理的。一般是只读的。

    env

      环境变量数组。

      如:


    puts $env(PATH)
    // return /bin:/usr/bin:/usr/X11R6/bin

    errorCode

      当错误发生时保存了一些错误信息。用下列格式来存储:

    CHILDKILLED pid sigName msg

      当由于一个信号而被终止时的信息。

    CHILDSTATUS pid code

      当一个子程序以非0值退出时的格式。

    CHILDSUSP pid sigName msg

      当一个子程序由于一个信号而被终止时的格式。

    NONE

      错误没有附加信息。

    UNIX errName msg

      当一个内核调用发生错误时使用的格式。

    errorInfo

      包含了一行或多行的信息,描述了错误发生处的程序和信息。


  • Tcl编程简介(四)

    2007-07-09 17:37:39

    Tcl编程简介(四)
     

      Error命令


    error message
    error message info
    error message info code

      返回一个错误,引起解释器停止运行。info用于初始化全局变量errorInfo。code被付给errorCode。

    eval arg ...

      将所有的参数连起来作为命令语句来执行。

    exec arg ...

      仿佛是在shell下执行一条命令。


    exec ls --color
    exec cat /etc/passwd > /tmp/a

    exit
    exit returnCode

      中断执行。

    expr arg

      处理表达式。


    set a [expr 1+1]
    //a=2

    file subcommand name

      一组用于文件处理的命令。


    file subcommand name arg ...
    file atime name

      返回文件的最近存取时间。

    file dirname name

      返回name所描述的文件名的目录部分。

    file executable name

      返回文件是否可被执行。

    file exists name

      返回1 表示文件存在,0 表示文件不存在。

    file extension name

      返回文件的扩展名。

    file isdirectory name

      判断是否为目录。

    file isfile name

      判断是否为文件。

    file lstat name varName

      以数组形式返回。执行lstat系统函数。存储在varName。

    file mtime name

      文件的最近修改时间。

    file owned name

      判断文件是否属于你。

    file readable name

      判断文件是否可读。

    file readlink name

      都出符号连接的真正的文件名。

    file rootname name

      返回不包括最后一个点的字符串。

    file size name

      返回文件的大小。

    file stat name varName

      调用stat内和调用,以数组形式存在varName中。

    file tail name

      返回最后一个斜线以后的部分。

    file type name

      返回文件类型file, directory, characterSpecial, blockSpecial, fifo, link, 或socket。

    file writable name

      判断文件是否可写。

    flush fileId

      立即处理由fileId描述的文件缓冲区。

    for start test next body

      for循环。同C总的一样。


    for {set i 1} {$i < 10} {incr i} {puts $i}
    foreach varname list body

      类似于C Shell总的foreach或bash中的for..in...


    format formatString
    format formatString arg ...

      格式化输出,类似于C中的sprintf。


    set a [format "%s %d" hello 100]
    //a="hello 100"

    gets fileId
    gets fileId varName

      从文件中读出一行。


    set f [open /etc/passwd r]
    gets $f

    glob filename ...
    glob -nocomplain filename ...

      使用C Shell风格的文件名通配规则,对filename进行扩展。


    ls /tmp
    a b c

    tclsh>glob /tmp/*
    a b c

      当加上参数 -nocomplain 时,如文件列表为空则发生一个错误。

    global varname ...

    定义全局变量。


    if test trueBody
    if test trueBody falseBody
    if test then trueBody
    if test then trueBody else falseBody

      条件判断,是在没什么说的。


    incr varName
    incr varName increment

      如果没有incremnet,将varName加一,反之将varName加上increment。


    set i 10
    incr i
    //i=11
    incr i 10
    //i=21
    info subcommand
    info subcommand arg ...

      取得当前的Tcl解释器的状态信息。

    info args procname

      返回由procname指定的命令(你自己创建的)的参数列表。

      如:


    proc ff { a b c } {puts haha}
    info args ff
    //return "a b c" 

    info body procname

      返回由procname指定的命令(你自己创建的)的函数体。

      如:


    proc ff { a b c } {puts haha}
    info body ff
    //return "puts haha" 
    info cmdcount

      返回当前的解释器已经执行的命令的个数。


    info commands
    info commands pattern

      如果不给出模式,返回所有的命令的列表,内建和自建的。

      模式是用C Shell匹配风格写成的。


    info complete command

      检查名是否完全,有无错误。

    info default procname arg varname

      procname的参数arg,是否有缺省值。

    info exists varName

      判断是否存在该变量。


    info globals
    info globals pattern

      返回全局变量的列表,模式同样是用C Shell风格写成的。

    info hostname

      返回主机名。


    info level
    info level number

      如果不给参数number则返回当前的在栈中的绝对位置,参见uplevel中的描述。如加了参数number,则返回一个列表包含了在该level上的命令名和参数。

    info library

      返回标准的Tcl脚本的可的路径。实际上是存在变量tcl_library中。


    info locals
    info locals pattern

      返回locale列表。


    info procs
    info procs pattern

      返回所有的过程的列表。

    info scrīpt

      返回最里面的脚本(用 source 来执行)的文件名。

    info tclversion

      返回Tcl的版本号。


    info vars
    info vars pattern

      返回当前可见的变量名的列表。

      下面是一些用于列表的命令,范围可以是end。


    join list
    join list joinString

      将列表的内容连成一个字符串。


    lappend varName value ...

      将value加入列表varName中。

    lindex list index

      将list视为一个列表,返回其中第index个。列表中的第一个元素下标是0。


    lindex "000 111 222" 1
    111
    linsert list index element ...

      在列表中的index前插入element。

    list arg ...

      将所有的参数发在一起产生一个列表。


    list friday [exec ls] [exec cat /etc/passwd]
    llength list

      返回列表中元素的个数。


    set l [list sdfj sdfjhsdf sdkfj]
    llength $l
    //return 3

    lrange list first last

      返回列表中从frist到last之间的所有元素。


    set l [list 000 111 222 333 444 555]
    lrange $l 3 end
    //return 333 444 555

    lreplace list first last
    lreplace list first last element ...

      替换列表中的从first到last的元素,用element。


    set l [list 000 111 222 333 444 555]
    lreplace $l 1 2 dklfj sdfsdf dsfjh jdsf
    000 dklfj sdfsdf dsfjh jdsf 333 444 555

    lsearch -mode list pattern

      在列表中搜索pattern,成功返回序号,找不到返回-1。


    -mode : -exact 精确
    -glob shell的通配符
    -regexp 正则表达式

    lsearch "111 222 333 444" 111
    //return 0
    lsearch "111 222 333 444" uwe
    //return 1

  • Tickle编程(三)

    2007-07-09 17:37:06

    Tcl编程简介(三)
     

      Tcl 内置命令

    内置的命令

      Tcl提供了下面描述的内置函数。

      .其中: ... 表示参数不定具体有:

      append命令:


    append varName value
    append varName value value value ...

      将那一大堆value附加到varName后面。如果变量不存在,会新建一个。

      例子:


    set i "aaa"
    append i "bbb" "ccc"
    //i = aaabbbccc

      array命令:


    array subcommand arrayName
    array subcommand arrayName arg ...

      这是一组用于向量操作的命令。第二个参数是子命令名。

      假设:


    set a(1) 1111
    set a(2) 2222
    set a(three) 3333

      一下均以它为例子(tclsh在中运行)。

    array names arrayName

      返回一个数组元素名字的列表。


    tclsh>array names a
    1 2 three
    array size arrayName

      返回数组的元素个数。


    tclsh>array size a
    3

      下面是用于遍历的命令

    arrry startsearch arrayName

      初始化一次遍历,返回一个遍历标示(searchId)在下面的命令是中使用。

    array nextelement arrayName searchId

      返回下一个数组中的元素。如果没有返回一个空串。

    array anymore arrayName searchId

      返回 1 表示还有更多的元素。0 表示没有了。

    array donesearch arrayName searchId

      结束该次遍历。

    array nextelement arrayName searchId

      返回下一个元素。


    tclsh>array startsearch a
    s-1-a
    tclsh>array nextelement a s-1-a
    1111
    tclsh>array nextelement a s-1-a
    2222
    tclsh>array anymore a s-1-a
    1
    tclsh?array nextelement a s-1-a
    3333
    tclsh>array donesearch a s-1-a

      注意可以同时并发多个遍历。


    break命令
    break

      跳出最近的循环。


    case string in patList body ...
    case string patList body ...
    case string in {patList body ...}
    case string {patList body ...}

      分支跳转。

      例如:


    case abc in {a b} {puts 1} default {puts 2} a* {puts 3}
    return 3.

    case a in {
    {a b} {format 1}
    default {format 2}
    a* {format 3}
    }
    returns 1.

    case xyz {
    {a b}
    {format 1}
    default
    {format 2}
    a*
    {format 3}
    }
    returns 2.

      注意default不可以放在第一位。支持shell文件名风格的匹配符。

    catch 命令

    catch command varName

      用于阻止由于错误而导致中断执行。执行command, 每次都返回TCL_OK, 无论是否有错误发生。如有错误发生返回1 ,反之返回0 。如果给了varName这被置为错误信息。注意varName是已经存在的变量。


    cd 命令(如shell)
    cd dirName

      转换当前工作目录。如dirName未给出则转入home目录。

    close fileId

      关闭文件描述符。

    concat arg ...

      将参数连接产生一个表。


    concat a b {c d e} {f {g h}}
    return `a b c d e f {g h}"

    continue

      结束该次循环并继续循环。

    eof fileId

      如fileId以结束 返回1,反之返回 0。

  • Tickle编程(二)

    2007-07-09 17:36:34

    Tcl编程简介(二)
     

    列表

      字符串的另一种解释为列表。一个列表是类似于结果的一个字 符串包含了用空白分开的很多域。例如 "Al Sue Anne John" 是 一个有四个元素的例表,在列表中换行父被视为分隔符。例如:

      b c {d e {f g h}} 是一个有三个元素的列表 b 、c 和 {d e {f g h}}。

      Tcl的命令 concat, foreach, lappend, lindex, linsert,list, llength, lrange,lreplace, lsearch, 和 lsort 可以使你对列表操作。

    正则表达式

      Tcl 提供了两个用于正则表达式的命令 regexp 和 regsub。 这里的正则表导师实际上是扩展的正则表达式,与 egrep 相一致。

      支持 ^ $ . + ? > < () | []

    命令结果

      每一条命令有俩个结果:一个退出值和一个字符串。退出值标志着命令是否正确执行,字符串给出附加信息。有效的返回制定议在`tcl.h", 如下:

    TCL_OK

      命令正确执行,字符串给出了命令的返回值。

    TCL_ERROR

      表示有一个错误发生,字符串给出了错误的描述。全局变量 errorInfo 包含了人类可读的错误描述,全局变量errorCode 机器使用的错误信息。

    TCL_RETURN

      表示 return 命令被调用,当前的命令(通常是一个函数)必须立刻返回,字符串包含了返回值。

    TCL_BREAK

      表示break已经被调用,最近的巡环必须立刻返回并跳出。字符串应该是空的。

    TCL_CONTINUE

      表示continue已经被调用,最近的巡环必须立刻返回不跳出。字符串应该是空的。

      Tcl编程者一般需要关心退出值。当Tcl解释器发现错误发生后会立刻停止执行。

    Procedures 函数

      Tcl 允许你通过proc命令来扩充命令(定义新的命令),定义之后可以向其它的内建命令一样使用。

      例如:


    proc pf {str} {
    puts $str
    }
    pf "hello world"
    这里有一个初学者不注意的地方,上述的定义一定要写成那样子。而不能向下面那样写:
    proc pf {str}
    {
    puts $str
    }

      因为proc实际上也只不过是一条命令,是一换行符或分号来结束的,用集群参数来传递函数体。proc的定义如下:


    proc name args tclcommand
    Variables: scalars and arrays

      变量:标量和向量(即数组)

      向量就是数组,而标量是没有下表的变量。

      我们用C来类比:


    int i; // i 是标量
    int j[10]; // j 是向量

      变量不需要定义,使用的时候会自动的被创建。Tcl支持两种

      变量:标量和向量

      举个例子来说明吧,


    set i 100
    set j(0) 10
    set k(1,3) 20

      i是标量,j是向量。

      引用的时候:


    $i
    $j(0)
    $k(1,3)

  • Tickle编程(一)

    2007-07-09 15:43:37

    简介

      Tcl是一种很通用的脚本语言,它几乎在所有的平台上都可以解释运行,功能强大。是tool command language的缩写,发音为 "tickle”, 实际上包含了两个部分:一个语言和一个库。

      首先,Tcl是一种简单的脚本语言,主要使用于发布命令给一 些互交程序如文本编辑器、调试器和shell。它有一个简单的语法 和很强可扩充性,Tcl可以创建新的过程以增强其内建命令的能力。

      其次,Tcl是一个库包,可以被嵌入应用程序,Tcl的库包含了一个分析器、用于执行内建命令的例程和可以使你扩充(定义新的 过程)的库函数。应用程序可以产生Tcl命令并执行,命令可以由用户产生,也可以从用户接口的一个输入中读取(按钮或菜单等)。 但Tcl库收到命令后将它分解并执行内建的命令,经常会产生递归的调用。

      下面简单介绍以下txl的语法规则:

    解释器

      在Tcl的数据结构中的核心是Tcl_Interp.一个解释器包含了一套命令,一组变量和一些用于描述状态的东西。每一个 Tcl命令是 在特定的Tcl_Interp中运行的,基于Tcl的应用程序可以同时拥有几个Tcl_Interp。Tcl_Interp是一个轻量级的结构,可以快速的新建和删除。

    数据类型

      Tcl只支持一种数据结构:字符串(string)。所有的命令,命令的所有的参数,命令的结果,所有的变量都是字符串。请牢记这一点,所有的东西都是字符串。 这是它比较有特点的方面字符串有三种形式:命令(command), 表达式(expresion)和表(list)。

    Basic Command Syntax 基本语法

      Tcl有类似于shell和lisp的语法,当然也有许多的不同。一 条Tcl的命令串包含了一条或多条命令用换行符或分号来隔开,而每一条命令包含了一个域(field)的集合,域使用空白分开的,第一个域是一个命令的名字,其它的是作为参数来传给它。

      例如:

      set a 22 //相当于C中的 a=22 a是一个变量这条命令分为三个域:1: set 2: a 3: 22 set使用于设置变量的值的命令,a、20 作为参数来传给它,a使它要操作的变量名,22是要付给的a值。

      Tcl的命令名可以是内置的命令也可以是用户建的新命令,如果是用户用户建的新命令应用程序中用函数Tcl_CreateCommand来创建。所有的参数作为字符串来传递,命令自己会按其所需来解释的参数的。命令的名字必须被打全,但 Tcl解释器找不到一同名的命令时会用 unknown命令来代替。

      在很多场合下,unknown 会在库目录中搜寻,找到一个的话,会自动生成一个Tcl命令并调用它。unknown经常完成缩略的命令名的执行。但最好不要使用。

    注释

      和shell很象,第一个字母是"#"的Tcl字符串是注释。

    其他细节规则

      Grouping arguments with double-quotes 用双引号来集群参数,目的在于使用有空白的参数。

      例如:

    set a "this string contains whitespace" 

      如够一个参数一双引号来开始,该参数会一直到下一个双引号才结束。其中可以有换行符和分号。

      Variable substitution with $ 用美元符进行变量替换说白了就是引用该变量。

      如:


    set a hello
    set b $a // b = "hello" 实际上传给set命令的参数
    //是b,"hello"
    set c a // b = "a"

      Command substitution with brackets 命令子替换(用方括号)

      例如:

    set a [set b "hello"] 

      实现执行 set b "hello" 并用其结果来替换源命令 中的方括号部分,产生一条新命令

      set a "hello" //"hello" 为 set b "hello" 的返回值

      最终的结果是b="hello" a="hello"

      当命令的一个子域以方括号开始以方括号结束,表示要进行一个命令子替换。并执行该子命令,用其结果来替换原命令中的方括号部分。方括号中的部分都被视为Tcl命令。

      如下一个复杂一点的例子:


    set a xyz[set b "abc"].[set c "def"]
    //return xyzabcdef

      Backslash substitution 转移符替换

      转移符时间不可打印字符或由它数意义的字符插入进来。这一概念与C语言中的一样。


     Backspace (0x8).
    f Form feed (0xc).

    Newline (0xa).

    Carriage-return (0xd).
    Tab (0x9).
    v Vertical tab (0xb).
    { Left brace (`{").
    } Right brace (`}").
    [ Open bracket (`[").
    ] Close bracket (`]").
    $ Dollar sign (`$").
    sp Space (` "): does not terminate argument.
    ; Semicolon: does not terminate command.
    " Double-quote.

      Grouping arguments with braces 用花扩括号来集群参数

      用花扩括号来集群参数与用双引号来集群参数的区别在于:用花扩括号来集群参数其中的三种上述的子替换不被执行。而且可以嵌套。

      例如:


    set a {xyz a {b c d}}//set收到俩个参数 a "xyz a {b c d}"
    eval {
    set a 22
    set b 33
    }//eval收到一个参数 "set a 22
    set b 33"

    命令综述

      1.一个命令就是一个字符串(string)。

      2.命令是用换行符或分号来分隔的。

      3.一个命令由许多的域组成。第一个于是命令名,其它的域作为参数来传递。

      4.域通常是有空白(Tab横向制表健 Space空格)来分开的。

      5.双引号可以使一个参数包括换行符或分号。三种子替换仍然发生。

      6.花括号类似于双引号,只是不进行三总体换。

      7.系统只进行一层子替换,机制替换的结果不会再去做子替换。而且子替换可以在任何一个域进行。

      8.如果第一个非控字符是`#", 这一行的所有东西都是注释。

    表达式

      对字符串的一种解释是表达式。几个命令将其参数按表达式处理,如:expr、for 和 if,并调用Tcl表达式处理器(Tcl_ExprLong, Tcl_ExprBoolean等)来处理它们。其中的运算符与C语言的很相似。

    ! 

      逻辑非


    * / % + -
    << >>

      左移 右移 只能用于整数。

    < > <= >= == != 

      逻辑比较

    & ^ | 

      位运算 和 异或 或

    &&'  '

      逻辑"和" "或"

    x ? y : z 

      If-then-else 与C的一样

      Tcl 中的逻辑真为1,逻辑假为0。

      一些例子:


    5 / 4.0
    5 / ( [string length "abcd"] + 0.0 )

      计算字符串的长度 转化为浮点数来计算


    "0x03" > "2"
    "0y" < "0x12"

      都返回 1


    set a 1
    expr $a+2
    expr 1+2

      都返回 3






  • linux 常用命令使用技巧

    2007-06-14 23:23:33

                             
    1. 使用虚拟控制台   
      登录后按Alt+F2键这时又可以看到“login:“提示符, 这 个就是第二个虚拟控制台. 一般新安装的Linux有四个虚拟控 制台, 可以用Alt+F1~Alt+F4来访问. 虚拟控制台最有用的时 候是当一个程序出错锁住输入时可以切换到其他虚拟控制台 ? [color=red:8ea1de57f3]现在一般默认是7个,可以用Alt+F1~Alt+F7来切换,第七个一般是Xwindow;如果启用了xwindow则要用ctrl+alt+F*来切换[/color:8ea1de57f3]
    2. 拷贝与粘贴  
      字符界面: 不管是Slackware 还是RedHat 安装后每次启 动时都会自动运行一个叫gpm的程序, 该程序运行后就可以用 鼠标来拷贝与粘贴了. 具体做法是按住鼠标左键拖动使要拷贝的地方反白, 这时反白的区域已经被拷贝, 再按鼠标右键拷贝的内容就会被粘贴在光标所在位置了. X-Window下: 拷贝的操作与字符界面下一样, 三键鼠标的话 按中键粘贴, 两键鼠标的话同时按左右键粘贴(须在配置XF86 时在鼠标的设置里选择 Emulate 3 Button).
    3. 快速进入某些目录
      键入 cd ~ 可进入用户的home目录. 键入 cd - 可进入上一个进入的目录. [color=red:8ea1de57f3]在RH8,9中用cd回车就可以进入登录目录了,比如是root用户cd则进入/root.[/color:8ea1de57f3]
    4. 软驱的使用
      如果是Linux 的ext2文件系统用如下命令: #mount -t ext2 /dev/fd0 /mnt dos格式的软盘则用命令: #mount -t msdos /dev/fd0 /mnt 然后就可以在/mnt里访问软盘的内容了, 注意在取出软盘之 前要先卸掉软盘上的文件系统, #umount /mnt 否则会导致信息丢失. 在软盘上建立文件系统可用如下命令: #mke2fs /dev/fd0 1440
    5. RedHat下显示彩色目录列表
      打开/etc/bashrc, 加入如下一行: alias ls=“ls --color“ 下次启动bash时就可以像在Slackware里那样显示彩色的目录列表了, 其中颜色的含义如下: 蓝色-->目录 绿色-->可执行文件红色-->压缩文件 浅蓝色-->链接文件 灰色-->其他文件
    6. 显示文件的类型   
      用命令 file 可以使你知道某个文件究竟是ELF格式的可执行文件, 还是shell scrīpt文件或是其他的什么格式 例如: #file startx
    7 .命令文件的路径
      当你键入一些命令如find, shutdown, mount, startx时是否 想过要知道这些文件究竟放在哪个目录里? 用命令 whereis 可以实现,如 #whereis startx [color=red:8ea1de57f3]还可以用which,例如which ls[/color:8ea1de57f3]
    8. 查找文件
      find 命令要加一些参数才能查到文件, 如: #find /usr -name XF86Setup -print 在/usr里查找文件XF86Setup.
    9. 删除无用的core文件
      程序运行出后有时候会产生一个名为core的文件, 这个文件一般很大而且没什么用, 可以删除掉以释放空间.
    10. 一次解开.tar.gz文件
      解开.tar.gz文件一般要先用gunzip解压再用tar解包, 在Linux下可以一次完成, 如: #tar zxpvf sample.tar.gz
    11. 显示win95分区里的长文件名   
      如果你发现win95分区里的长文件命不能显示, 可以重新 用vfat方式来mount. 对于启动时就mount的分区可以修改文 件/etc/fstab, 将里面的msdos字样改为vfat. 如果无法用 vfat mount, 则要重新编译一下核心, 加入对vfat的支持.
    12. Linux 里的Norton Commander   
      在提示符下键入命令mc后你就会看到一个与Norton Commander很相似的界面, 实际上功能也很相似甚至更强大, 比如可以直接对.tar.gz 压缩包里的文件进行操作(有点像 ZipMagic).
    13. 启动后直接进入X
      编辑/etc/inittab文件, 把id:3:initdefautl改为 id:4:initdefautl. 不过搜索路径可能会有些问题, 关机时 你得直接进入/sbin 里去执行 shutdown.
    [color=red:8ea1de57f3]这个地方有错,应该是id:5:initdefault.现在也不用进入/sbin里去执行shutdown了因为已经在/etc/profile中加了path.[/color:8ea1de57f3]
    14. 后台运行 X 程序
      执行一个X程序时别忘了在后面加一个&号,如 #netscape & 否则的话在你推出执行的程序之前再无法在那个终端窗口里输入命令?
    15. 强行退出 X
      有时候在 X 里由于程序出错鼠标键盘都不起作用, 这时 候不用着急, 因为在Linux下几乎不会像在Win95里那样恶性 死机, 你只须键入Ctrl+Alt+BackSpace键就可以回到字符界 面下了. [color=red:8ea1de57f3]如果默认启动的x,则按这三个键会重新启动x.[/color:8ea1de57f3]
    16. 重装Win9x后lilo失效无法启动Linux  
      只须先用软盘启动Linux然后运行一次lilo即可。对于 RedHat可以用命令mkbootdisk来制作启动盘,例如: mkbootdisk --devices /dev/fd0 2.0.34-1 其中2.0.34-1是 /lib/modules下的一个目录。
    [color=red:8ea1de57f3]那个2.0.34-1其实就是内核版本号,如果你不知道可以这样.mkbootdisk --devices /dev/fd0 `uname -r`.注意这个`是tab键上方的那个键,不是单引号.[/color:8ea1de57f3]
    17. 把dos/windows改为缺省启动的OS  
      RedHat把Linux作为lilo缺省启动的OS,即出现 boot: 提示符后直接回车启动Linux。如果想改为dos/Windows,修 改文件/etc/lilo.conf,把有关启动dos的部分放在前面,再 运行一次lilo即可。例如把lilo.conf从: boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    image=/boot/vmlinuz-2.0.34-1
    label=linux
    root=/dev/hdc5 read-only
    other=/dev/hda1
    label=dos
    table=/dev/hda
    改为:
    boot=/dev/hda
    map=/boot/map
    install=/boot/boot.b
    prompt
    timeout=50
    other=/dev/hda1
    label=dos
    table=/dev/hda
    image=/boot/vmlinuz-2.0.34-1
    label=linux root=/dev/hdc5 read-only
    [color=red:8ea1de57f3]这个写法也过时了,如果你用lilo,则直接在prompt的下面加一行default=dos,然后运行lilo -v就可以,如果是grub,则更改default=0看你windows是0还是1.grub一般不用重新安装[/color:8ea1de57f3]
    18. 去掉引导区内的lilo信息
      安装lilo后如果硬盘数量或分区情况有改变的话将导致硬盘不能启动,这时只须用软盘启动dos再运行 fdisk/mbr 即可。(这个方法还可清除任何引导区病毒)
    19. 让 X 支持 AGP 显卡
      下载一个 AX 4.1 即 AcceleratedX 4.1 , 一个商业版 的 X Server 。除 AGP 显卡外 AX 还支持很多牌号的显卡。 另外还可以用AX 带的设置程序 Xsetup 方便的对分辨率,刷新率等参数进行设置。不过我也不知道用AGP卡效果如何,因为我现在还在用老掉牙的 S3 765 。[color=red:8ea1de57f3]现在默认都支持AGP了 [/color:8ea1de57f3]
    20. 把 man 或 info 的信息存为文本文件
      以 tcsh 为例: man tcsh | col -b > tcsh.txt info tcsh -o tcsh.txt -s
    21. 用当前路径作提示符
      对 bash 来说,在 .bashrc 里加一行: PS1=“$PWD$“ 对 tcsh 来说,在 .tcshrc 里加一行: set prompt=“%/>“
    22. 压缩可执行文件
      Linux 下有一个类似 dos 里的 pklite 和 lzexe 的命 令 -- gzexe 。而且压缩率一般都可以超过 50% ,在空间紧 张时很有用。比如:
    /dosc/temp# ls -al total 148 -rwxr-xr-x 1 root root 149564 Dec 8 15:33 gawk /dosc/temp# gzexe gawk gawk: 54.5% /dosc/temp# ls -al total 216 -rwxr-xr-x 1 root root 68710 Dec 8 15:36 gawk -rwxr-xr-x 1 root root 149564 Dec 8 15:33 gawk /dosc/temp#
    [color=red:8ea1de57f3]现在可以用gzip[/color:8ea1de57f3]
    23. 查看 Linux 启动时的信息  
      Linux 启动时屏幕显示的信息来不及看清就一闪而过, 如果对这些信息感兴趣的话可以在启动完后用命令 dmesg 查看。[color=red:8ea1de57f3]用dmesg |more可能看的更仔细些 [/color:8ea1de57f3]
    24. 处理文件名内含有特殊字符的文件  
      如果有一个文件名叫 -file 如果想删除它,键入 rm -file 会显示 invalid option ,原来由于文件名的第一个字符为 - , Linux 把文件名当作选项了,可以加 -- 解决 这个问题, 如 rm -- -file 。如果是其他特殊字符的话可 以在特殊字符前加一个 ,或者用双引号把整个文件名括起来。
    25. 一次处理一整个目录
      Linux/UNIX 的很多常用命令如 rm , cp 等都有一个参 数---- -r , 是递归的意思, 命令里加了参数 -r 就可以对目标目录及其下所有子目录进行操作,如: rm -rf /test (f 是 force 意为强行) , 该命令完全删除 根目录下的子目录 test ,作用类似于 dos 下的 deltree ,当然使用这个命令时要特别小心。再如: cp -r /test /test1 有类似 dos 下 xcopy /s 的作用。
    26. 修改登录画面
      对本机: 先修改文件 /etc/issue 改为相要显示的内容, 再修改文件 /etc/rc.d/rc.local(RedHat) 或 /etc/rc.d/rc.S(Slackware) 把下面几句注释掉:
    # This will overwrite /etc/issue at every boot. So, make any changes you # want to make to /etc/issue here or you will lose them when you reboot. echo ““ > /etc/issue echo “Red Hat Linux $R“ >> /etc/issue echo “Kernel $(uname -r) on $a $(uname -m)“ >> /etc/issue
    cp -f /etc/issue /etc/issue.net echo >> /etc/issue
     不然的话每次重新启动 /etc/issue 都会被更改。
      对 telnet 的远地机器: 先把文件 /etc/usr/sbin/in.telnetd 改名,如改为 in.telnetd.exe ,再编一个名为 in.telnetd 的 shell 脚 本, 在显示完需要的内容后再调用 in.telnetd.exe 。如:
    #!/bin/sh cat /etc/login.banner #需要在登录提示符前显示的内容 echo -n ““ exec /usr/sbin/in.telnetd.exe
    27. 几个有用的别名
      几个能方便操作和减少误操作的别名,建议把它们放到启动 文件里, 如 /etc/bashrc 。
    alias rm=‘rm -i‘ alias cp=‘cp -i‘ alias mv=‘mv -i‘
    #前三个别名的作用是在删除、覆盖文件之前先提示确认, RedHat已经自动 #加上了,强烈建议Slackware的用户也加上,因为 Linux/UNIX下文件一旦删 #除就再也无法恢复了。
    alias l=‘ls -l‘ alias cd..=‘cd ..‘ alias utar=‘tar xvfz‘ #解 *.tar.gz 文件 alias inforpm=‘rpm -qpi‘ #显示rpm包的信息 alias instrpm=‘rpm -Uhv‘ #安装rpm包 alias listrpm=‘rpm -qpl‘ #列rpm包内的文件 alias uistrpm=‘rpm -e‘ #反安装rpm包
    28. 使用命令补齐
      所谓命令补齐(Command-Line Completion)是指当键入的 字符足以确定目录下一个唯一的文件时只须按 Tab 键就可以 自动补齐该文件名的剩下部分,例如要把目录 /freesoft 下 的文件 gcc-2.8.1.tar.gz 解包,当键入到 tar xvfz /freesoft/g 时如果该文件是该目录下唯一以 g 起头的文件 的话就可以按下 Tab 键,这时命令会被自动补齐为:tar xvfz /freesoft/gcc-2.8.1.tar.gz ,非常方便。
    29. 最后一条技巧  
      有时间的话多看看系统提供的FAQ文件,因为通常遇到的 问题大多数都能在里面找到答案。 [color=red:8ea1de57f3]这个可以用man命令来查看,比如man ls或者info来看更详细的帮助信息,比如info /etc/fstab.另外,你还可以直接到/usr/share/doc中查看帮助手册.[/color:8ea1de57f3]
    [color=green:8ea1de57f3]30.进入单用户模式和限制进入单用户模式.
      单用户模式可以让普通用户拥有root的所有权限,如果你忘记root密码了,或者系统出现了问题而系统管理员不在急着要修复系统的话,用处还是很大的.但也有安全隐患.
      a.进入单用户模式
        lilo的话,在出现引导界面时按ctrl+x然后在boot:后输入linux single回车即可进入单用户模式.
          grub:出现引导界面后,按e,然后选择第二行(kernel*那一行),再按e.再结尾处输入single或者init 1或者1(都可以),按回车,然后按b引导即可.
      b.只限制进入单用户模式,引导系统时不要密码
        lilo:在install=/boot/boot.b的下一行加上           password=password
    restricted
    然后运行lilo -v
        需要注意的是,最好限制普通用户修改编辑lilo.conf不然这明文的密码就没有用了.chmod 600 /etc/lilo.conf.只给root用户读写权限就OK了.
          grub:在grub.conf中在第一段任何位置加password=明文密码,或者先用grub-md5-crypt生成一个加密的密码,然后用鼠标选中它,按ctrl+shift+c复制,然后打开grub.conf在title的上面一段加上password=--md5(注意这儿有一个空格),然后击右键,把你的加过密的密码粘过来.或者你可以写成password --md5空格加过密的密码的格式都可以.然后保存重启就行了.
          建议使用加密的密码.这样即使普通用户打开grub.conf也不知道密码是什么.
      c.限制用户进入指定的系统.(对多重引导的系统有用)
        lilo:在label=*的下面加password=密码
      grub:在title=*的下面加password --md5 加过密的密码[/color:8ea1de57f3]

  • 网络公司常问到的端口

    2007-06-14 23:14:55

    端口便是计算机与外部通信的途径,没有它,计算机便又聋又哑。一个端口就是一个潜在的通信通道,也就是一个入侵通道。
    先说服务,我们首先要明白“连接”和“无连接”的概念。最简单的例子莫过于打电话和写信。两个人如果要通电话,得首先建立连接——即拨号,等待应答后才能相互传递信息,最后还要释放连接——即挂电话。写信就没有那么复杂了,地址姓名填好以后直接往邮筒一扔,收信人就能收到。
    因特网上最流行的协议是TCP/IP协议,需要说明的是,TCP/IP协议在网络层是无连接的(数据包只管往网上发,如何传输和到达以及是否到达由网络设备来管理)。而我们一旦谈“端口”,就已经到了传输层。协议里面低于1024的端口都有确切的定义,它们对应着因特网上常见的一些服务。这些常见的服务可以划分为使用TCP端口(面向连接如打电话)和使用UDP端口(无连接如写信)两种。
    使用TCP端口常见的有:
    ftp:定义了文件传输协议,使用21端口。常说某某主机开了 ftp服务便是文件传输服务。下载文件,上传主页,都要用到ftp服务。
    telnet:你上BBS吗?以前的BBS是纯字符界面的,支持BBS的服务器将23端口打开,对外提供服务。其实Telnet的真正意思是远程登陆:用户可以以自己的身份远程连接到主机上。
    smtp:定义了简单邮件传送协议。现在很多邮件服务器都用的是这个协议,用于发送邮件。服务器开放的是25端口。
    http:这可是大家用得最多的协议了——超文本传送协议。上网浏览网页就需要用到它,那么提供网页资源的主机就得打开其80端口以提供服务。我们常说“提供www服务”、“Web服务器”就是这个意思。
    pop3:和smtp对应,pop3用于接收邮件。通常情况下,pop3协议所用的是110端口。在263等免费邮箱中,几乎都有pop3收信功能。也就是说,只要你有相应的使用pop3协议的程序(例如Foxmail或Outlook),不需要从Web方式登陆进邮箱界面,即可以收信。
    使用UDP端口常见的有:
    DNS:域名解析服务。因特网上的每一台计算机都有一个网络地址与之对应,这个地址就是我们常说的IP地址,它以纯数字的形式表示。然而这却不便记忆,于是出现了域名。访问主机的时候只需要知道域名,域名和IP地址之间的变换由DNS服务器来完成。DNS用的是53端口。
    snmp:简单网络管理协议,使用161端口,是用来管理网络设备的。由于网络设备很多,无连接的服务就体现出其优势。
    聊天软件Oicq:Oicq的程序既接受服务,又提供服务,这样两个聊天的人才是平等的。oicq用的是无连接的协议,其服务器使用8000端口,侦听是否有信息到来;客户端使用4000端口,向外发送信息。如果上述两个端口正在使用(有很多人同时和几个好友聊天),就顺序往上加。
    以上是计算机常用的一些端口,此外还有很多端口,由于我们这次实验没用到,所以就不一一介绍了。
    1、端口的扫描
    端口扫描的方法现在有N种,最常用,也是最简捷的方法就是在任务栏里点开始、运行框里输入cmd,出现一个DOS框,输入netatat –an,那么你电脑目前所有的端口状况就一览无余。
    2、端口的关闭
           3389端口的关闭:
    首先说明3389端口是windows的远程管理终端所开的端口,它并不是一个木马程序,请先确定该服务是否是你自己开放的。如果不是必须的,请关闭该服务。
    方法: 在我的电脑上点右键选属性-->远程,将里面的远程协助和远程桌面两个选项框里的勾去掉。
           4899端口的关闭:
    首先说明4899端口是一个远程控制软件(remote administrator)服务端监听的端口,他不能算是一个木马程序,但是具有远程控制功能,通常杀毒软件是无法查出它来的,请先确定该服务是否是你自己开放并且是必需的。如果不是请关闭它。
    方法: 请在开始-->运行中输入cmd,然后cd C:\winnt\system32(你的系统安装目录),输入r_server.exe /stop后按回车。然后再输入r_server /uninstall /silence,到C:\winnt\system32(系统目录)下删除r_server.exe admdll.dll radbrv.dll三个文件
           139端口的关闭
    139端口是NetBIOS Session端口,用来文件和打印共享
    方法: 在“网络和拨号连接”中“本地连接”中选取“Internet协议(TCP/IP)”属性,进入“高级TCP/IP设置”“WINS设置”里面有一项“禁用TCP/IP的NETBIOS”,打勾就关闭了139端口。
    对于个人用户来说,可以在各项服务属性设置中设为“禁用”,以免下次重启服务也重新启动,端口也开放了。
           113端口木马的清除
    这是一个基于irc聊天室控制的木马程序。
    1.首先使用netstat -an命令确定自己的系统上是否开放了113端口。
    2.使用fport命令察看出是哪个程序在监听113端口。
    例如我们用fport看到如下结果:
    Pid Process Port Proto Path\system32\vhos.exe
    我们就可以确定在监听在113端口的木马程序是vhos.exe而该程序所在的路径为c:\winnt\system32下。
    3.确定了木马程序名(就是监听113端口的程序)后,在任务管理器中查找到该进程,并使用管理器结束该进程。
    4.在开始-运行中键入regedit运行注册表管理程序,在注册表里查找刚才找到那个程序,并将相关的键值全部删掉。
    5.到木马程序所在的目录下删除该木马程序。(通常木马还会包括其他一些程序,如rscan.exe、psexec.exe、ipcpass.dic、ipcscan.txt等,根据木马程序不同,文件也有所不同,你可以通过察看程序的生成和修改的时间来确定与监听113端口的木马程序有关的其他程序)
    6.重新启动机器。
         限制端口的方法
    对于个人用户来说,您可以限制所有的端口,因为您根本不必让您的机器对外提供任何服务;而对于对外提供网络服务的服务器,我们需把必须利用的端口(比如WWW端口80、FTP端口21、邮件服务端口25、110等)开放,其他的端口则全部关闭。
    1、右键点击“网上邻居”,选择“属性”,然后双击“本地连接” ,弹出“本地连接状态”对话框。
      2、点击[属性]按钮,弹出“本地连接属性”,选择“此连接使用下列项目”中的“Internet协议(TCP/IP)”,然后点击[属性]按钮。
      3、在弹出的“Internet协议(TCP/IP)”对话框中点击[高级]按钮。在弹出的“高级TCP/IP设置”中,选择“选项”标签,选中“TCP/IP筛选”,然后点击[属性]按钮。
      4、在弹出的“TCP/IP筛选”对话框里选择“启用TCP/IP筛选”的复选框,然后把左边“TCP端口”上的“只允许”选上
      这样,您就可以来自己添加或删除您的TCP或UDP或IP的各种端口了。
    添加或者删除完毕,重新启动机器以后,您的服务器就被保护起来了。
    最后提醒,如果您只上网浏览的话,可以不添加任何端口。但是要利用一些网络联络工具,比如OICQ的话,就要把“4000”这个端口打开,同理,如果发现某个常用的网络工具不能起作用的时候,请搞清它在您主机所开的端口,然后在“TCP/IP筛选”中添加端口即可。
  • Winrunner经验总结

    2007-06-14 23:14:02

    1.1 脚本录制规范:
    基本原则是录制脚本要分开、gui文件要合并、批调用回放验证、可移植回放验证。
    1.1.1 录制脚本要分开:
    脚本太大,不仅不利于以后的维护,并且会导致WinRunner的不可预测的错误产生(具体可以参考WinRunner 的Readme文档)。录制时,可以根据测试用例的流程,拆分为几个小流程,对每个小流程分别录制成不同的脚本。
    1.1.2 gui文件要合并:
    首先,要在系统参数中,设置gui的录制模式为“Global GUI Map File
    录制过程中,WinRunner会自动产生gui文件,一个测试用例要确保生成一个公用gui文件。用一个gui文件主要是为了以后gui对象的维护,脚本回放时gui对象的查找。但是由于我们的测试用例是分开录制的,每个小流程录制时都会产生一个gui临时文件,因此录制完脚本后要把临时gui文件合并到该测试用例的公用gui文件中。但是也要注意,开始新的录制前,一定要先手工加载测试用例的公用gui文件。
    如果划分的子流程超过20个,则按每20个子流程录制一个gui文件的方式。Gui文件太大,会影响WinRunner的回放效率。
    1.1.3 批调用回放验证:
    为了提高脚本的正确性,每录制完成一个子流程后,都要恢复数据库,其他初始环境进行回放,以近早发现脚本错误。
    单个测试用例脚本录制完成后,要专门写一个主脚本,进行各子脚本的主次调用处理,然后恢复数据库和其他初始环境进行回放,以验证整个脚本是否可以正确回放。
    1.1.4 可移植回放验证:
    由于WinRunner 工具的限制,在本机回放成功后,如果把脚本移植到其他机器上,往往无法成功。这其中既有自己编写的脚本问题,又有WinRunner录制自动生成的脚本问题。
    自己编写脚本问题:往往是编写的可移植性较差,如加载gui文件时用的是绝对地址,如gui_load(“c:\\aa\\aa.gui”),这样的脚本换到其他机器必然出错。
    WinRunner录制自动生成的脚本问题: WinRunner的录制脚本往往和机器的环境有关,如果换了其他机器环境,往往回放不成功,这就需要手工修改脚本。
    因此,可移植性回放是非常必要的。
    1.1.5 脚本中使用的ODBC数据源名称统一命名为WR。
    1.1.6 录入中文数据时统一使用简体。
    1.1.7 数据表列名称规定
    录入数据驱动的脚本时,数据表列名称统一采用英文,使用PB数据窗口中列对象的名称。数据表列名称下的第一行用中文对英文列名称做注释,使用PB数据窗口中列对象的中文标签,这一行不作为有效的录入数据。与数据表相关的循环语句请修改脚本从数据表的第二行开始读取数据。典型的例子是将数据驱动脚本中For循环的第一个表达式改为table_Row = 2。
    1.1.8 脚本成功回放判定规定
    一个子测试录制完成后,一定要及时回放测试,直到测试报告显示测试结果为OK,且子测试明细报告中没有红色的出错提示。如果是回放主测试,回放成功的标准是:主测试的结果报告显示为OK,同时所有子测试的结果报告也为OK,且子测试明细报告中没有红色的出错提示。
    1.1.9 WinRuner主脚本中关于设置系统日期时间设置的规定,以保证脚本所描述的业务过程按业务逻辑在时间上有序。
    因为脚本回放与脚本录制时的系统日期时间不一致,会导致与系统时间关系密切的测试脚本回放时失败。
    为了消除时间差导致的回放错误,要求每一个测试用例的主测试在第一个子测试前加上date_set_system_date(年,月,日,时,分,秒)函数,以修改本地机器的日期时间等于这个主测试在接力式验收回放成功执行后的日期时间.这样再次回放时系统的日期时间就和上一次成功回放时的日期时间一致。

    1.2 测试脚本存放规范:
    各子测试脚本必须放到同一目录下,即环境目录下的scrīpt目录下。这样便于批调用时引用。
    1.3 Gui文件的存放:
    Gui 文件,必须和测试脚本放到同一目录下,即环境目录下的scrīpt目录下。
    1.4 WinRunner使用规范:
    (1) 必须写上清楚的注释:编写测试脚本,要进行详细的标注,每测试一小段,就要写一段备注,以便于将来修改,格式可以参考如下:
      功能描述:描述脚本的功能
      前置条件:该脚本在满足什么条件下才可以被执行
      步骤描述:描述脚本录制的动作
      检查点描述:描述作了对什么的检查,检查条件。
      录入人:录制人
      录入时间:
      备注:
    (2) gui文件的加载保存:
    每次开始测试用例的录制脚本前,如果该测试用例已经存在gui文件,一定要手工打开gui文件,再开始录制。如果不想手工打开,可以写段自动加载gui的脚本,每次录制前运行一下该脚本。录入脚本后,要注意保存GUI文件,如果测试用例已经存在gui文件,一定要把临时的gui文件合并到该用例的公用gui文件中,然后保存。
    (3) 如果机器数据较慢,或者网络较慢、或者数据库运行较慢,需要把等待打开窗口的时间设长。或者在脚本中插入同步点来处理。
    (4) WinRunner不支持Fomular One,目前不可以用wr测试Fomular One
    使用WinRunner录制时不可以切换不同输入法录制,仅可以用一种输入法。
    (5) WinRunner 对shift 键无法纪录,需要特殊处理 ,可以加入如下处理
    obj_type "dw_1.fslipbugno","<kShift_L>-";(告诉WinRunner按下Shift键)
    中间是选择行的脚本
    obj_type ("dw_1.FBugNo","<kShift_L>+";(告诉WinRunner释放Shift键)
    (6) 保证录制的脚本干净性:
    在录制过程中,不可避免的要进行其他动作,如打开邮件、打开非录制程序等,这些动作也会被WinRunner录制下来,这些动作会严重影响测试脚本的回放(除非作这些动作前停止录制)。
    因此,为了保证脚本的干净,在WinRunner的参数中进行如下设置:设置Recode 的“Selected Applications” 为要录制的程序。
    (7) 录制脚本时,不允许同时打开两个运行程序(指进行wr测试的程序)
    (8) 变量的声明:WinRunner有auto \public \static \extern 四个类型的变量作用域声明,其中public为默认的类型。由于public 是全局的,只要在一个脚本中声明了,在任何其他脚本都可以引用,这就带来一个问题,如果其他的脚本修改了这个public 变量的值,将会引发问题。因此变量声明时必须明确的加上类型(auto \public \static \extern),public 的一般不要使用,推荐使用static \auto 。
    2. 异常处理规范:
    在录制或者编写测试脚本时,必须进行异常的错误处理。以提高程序的错误检查能力。
    2.1 函数异常检测:
    对于一些常用函数,必须进行函数执行异常的处理。至少进行如下函数的异常检测:et_window、win_activate、menu_select_item、ddt_open。
    发现异常后,要终止程序的执行,并发邮件通知相关人员。
    2.2 返回值规范:
    模块、函数的返回值约定如下,0 表示成功 ,其他失败。
    对于一些函数的返回值,需要进行判断处理:
    (1) 每一个call语句都应该检查它的返回值是否为0, 如果不为0则报错退出。
    所有GUI检查点、数据库检查点都应做返回值检查。如果不为0则报错退出。
  • 必须掌握的几个常用网络测试命令!

    2007-06-14 23:12:55

    如果你是一个网络维护人员,那么肯定要经常处理网络故障,了解和掌握下面几个命令将会有助于您更快地检测到网络故障所在,从而节省时间,提高效率。

      Ping

      Ping是测试网络联接状况以及信息包发送和接收状况非常有用的工具,是网络测试最

      常用的命令。Ping向目标主机(地址)发送一个回送请求数据包,要求目标主机收到请求后给予答复,从而判断网络的响应时间和本机是否与目标主机(地址)联通。

      如果执行Ping不成功,则可以预测故障出现在以下几个方面:网线故障,网络适配器配置不正确,IP地址不正确。如果执行Ping成功而网络仍无法使用,那么问题很可能出在网络系统的软件配置方面,Ping成功只能保证本机与目标主机间存在一条连通的物理路径。

      命令格式:

      ping IP地址或主机名 [-t] [-a] [-n count] [-l size]

      参数含义:

      -t不停地向目标主机发送数据;

      -a 以IP地址格式来显示目标主机的网络地址 ;

      -n count 指定要Ping多少次,具体次数由count来指定 ;

      -l size 指定发送到目标主机的数据包的大小。

      例如当您的机器不能访问Internet,首先您想确认是否是本地局域网的故障。假定局域网的代理服务器IP地址为202.168.0.1,您可以使用Ping避免202.168.0.1命令查看本机是否和代理服务器联通。又如,测试本机的网卡是否正确安装的常用命令是ping 127.0.0.1。

      Tracert

      Tracert命令用来显示数据包到达目标主机所经过的路径,并显示到达每个节点的时间。命令功能同Ping类似,但它所获得的信息要比Ping命令详细得多,它把数据包所走的全部路径、节点的IP以及花费的时间都显示出来。该命令比较适用于大型网络。

      命令格式:

      tracert IP地址或主机名 [-d][-h maximumhops][-j host_list] [-w timeout]

      参数含义:

      -d 不解析目标主机的名字;

      -h maximum_hops 指定搜索到目标地址的最大跳跃数;

      -j host_list 按照主机列表中的地址释放源路由;

      -w timeout 指定超时时间间隔,程序默认的时间单位是毫秒。

      例如大家想要了解自己的计算机与目标主机www.cce.com.cn之间详细的传输路径信息,可以在MS-DOS方式输入tracertwww.cce.com.cn。

      如果我们在Tracert命令后面加上一些参数,还可以检测到其他更详细的信息,例如使用参数-d,可以指定程序在跟踪主机的路径信息时,同时也解析目标主机的域名。

      Netstat

      Netstat命令可以帮助网络管理员了解网络的整体使用情况。它可以显示当前正在活动的网络连接的详细信息,例如显示网络连接、路由表和网络接口信息,可以统计目前总共有哪些网络连接正在运行。

      利用命令参数,命令可以显示所有协议的使用状态,这些协议包括TCP协议、UDP协议以及IP协议等,另外还可以选择特定的协议并查看其具体信息,还能显示所有主机的端口号以及当前主机的详细路由信息。

      命令格式:

      netstat [-r] [-s] [-n] [-a]

      参数含义:

      -r 显示本机路由表的内容;

      -s 显示每个协议的使用状态(包括TCP协议、UDP协议、IP协议);

      -n 以数字表格形式显示地址和端口;

      -a 显示所有主机的端口号。

      Winipcfg

      Winipcfg命令以窗口的形式显示IP协议的具体配置信息,命令可以显示网络适配器的物理地址、主机的IP地址、子网掩码以及默认网关等,还可以查看主机名、DNS服务器、节点类型等相关信息。其中网络适配器的物理地址在检测网络错误时非常有用。

      命令格式:

      winipcfg [/?] [/all]

      参数含义:

      /all 显示所有的有关IP地址的配置信息;

      /batch [file] 将命令结果写入指定文件;

      /renew_ all 重试所有网络适配器;

      /release_all 释放所有网络适配器;

      /renew N 复位网络适配器 N;

      /release N 释放网络适配器 N。
  • 测试计划的十二项内容

    2007-06-14 23:11:32

    测试计划的十二项内容

    测试计划十二般,
    进度方法工具安,
    过程准则人机特,
    复略范围有风险。

    测试计划应该有十二项内容

    ⒈测试进度综述,供项目经理参考;
    ⒉测试方法,包括工具的使用;
    ⒊测试工具,包括何时和如何取得测试工具及这些工具的搭建;
    ⒋测试的执行过程及测试结果分析的过程;
    ⒌测试工作进入、挂起及测试结束的规范与准则;
    ⒍测试需要配备哪些人员及如何分工;
    ⒎测试需要的设备和机器基准的配置等等;
    ⒏执行测试需要的某些特种殊的硬件及软件支持;
    ⒐测试需要完成的覆盖率;
    ⒑测试策略;
    ⒒测试范围,指哪些性能必须测,哪些性能可以不测;
    ⒓有可能发生的风险和意外情况。
  • 腾讯公司的面试题 (转)

    2007-06-14 22:56:27

    腾讯公司的面试题

    1 、对 MMORPG 的 CLIENT/SERVER 使用白盒和黑盒的方法进行集成和系统测试; 2 、编写测试计划完成测试任务。
    工作要求: 1、了解C/S结构,并熟悉TCP/IP、UDP协议; 2、掌握常用的软件测试工具、测试流程 ,熟悉软件工程; 3、熟悉C++或Delphi Windows编程; 4、了解游戏客户端程序设计和服务器架构方式;

    此题是腾讯招聘游戏测试人员的题目!
    通知偶去面试!
    今天上午偶p点p点的就去坐了公交,一个半小时后到了公司总部,(附:公司总部是受其他城市的委托来面试我的)

    主考是北方人,我也是北方人,于是很快就出题了!如下!


    1,网络游戏交易的流程,用Oracl,sql,叙述出来
    2,找到交易这个流程之间的测试点

    然后问偶,能写出来吗?
    偶说,能,
    问:需要多久?
    偶:20分钟
    然后对表!
    关门,
    偶开始狂写狂画,之后偶觉的思路没理清,
    换张纸,慢慢画,急切间服务器的英文---server忘记了,而且字体超级烂,偶本来字很好看的,,,毕业至今没写过几个字哈,生疏了,也紧张。
    终于在20分钟内大概画了个流程图针对于第一题,并附上测试用例!
    第二题,偶只写出了两个测试点!
    门开,主考进来,看偶的纸,说,我要的就是这个,然后问:软件测试最重要的是什么?
    偶觉的哪个阶段都重要啊,不厌其烦也很重要,于是偶就头晕晕的很笃定的说功能测试最重要!
    又问些对游戏的感受和了解,就ok了!最后问偶愿意去另外的城市工作吗?给偶一个考虑的机会,
    偶呆了一秒说:您知道,我刚来这里,是自己来的,无牵无挂,只要是xx公司,哪个城市都行!
    于是结束了面试!
    偶本来以为不会这么良好吧,偶的第一次面试!

    刚刚从公交上下来,准备回住的地洗澡澡,电话响了,是那个城市的分部打来的电话,说是要电话面试我,由于大街上很嘈杂,狂跑到小区的里面蹲在草坪上接受面试,呵呵!

    问的问题跟上午面试的题一样,不过交易变成了组队,偶还照我上午的思路说了下,但是人家说那不对,然后自己说了下去,可惜我没听清楚他说的什么,因为那会信号不好,然后我跟他口风说对对,是那样,然后继续问我第2个问题:玩过什么游戏,对游戏的熟悉程度,以及你认为的游戏测试包括那些?

    我的回答:因为本人接触游戏很早,从传奇到奇迹,到现在的3d,天堂2,魔兽世界,英雄,热血江湖,只要是rpg的基本上都玩过,不管是q版的还是武侠魔幻的,还有休闲类的,比如泡泡堂,疯狂坦克等等,强调了我的测试经验是休闲类的游戏,包括大富翁,泡泡龙,主要负责功能测试,立足于用户角度,包括键盘的操作,指令的确认返回,可玩性测试等,[这期间他还问我竞技类游戏呢?比如cs,我说呵呵,cs以前是我的最爱]
    然后他问:你对可玩性测试是怎么认识的
    偶回答:包括色彩的显示,画面的连接,服务器的流畅度,以及游戏平衡性的设置,举例来说,以前的奇迹比传奇操作简单一点,这是一个方面,奇迹的装备很华丽能够吸引人,泡泡堂的角色造型很可爱,容易吸引女孩子,这些都是可玩性方面的

    第三个问题:你认为象早期的超级玛丽游戏上面的按键怎么做测试?
    偶回答:超级玛丽的游戏的键盘很简单,手柄上面的跳,走,跑,和四个方向键,四个方向键可以用枚举的方法测试,看其输入跟确认结果是否一样,不一样了就是问题所在,同样的功能键--跑跳走等也是这样!
    (其实偶回答的应该是属于测试目的,和测试脚本,与测试执行,测试平估之间的联系~渴望高手指点一下偶这样的思路正确与否?)
    他问:有没有想到测试时候同时按几个键,或者乱按键会出现什么结果?
    偶回答:当然需要这样的测试,站在用户的角度来说,我们做测试应该尽全力的进行全方位的思考和测试!
    第四个问题:给你一个测试脚本,你怎么制定测试计划?你的测试目标是什么?
    偶回答:测试目标我想应该有个最高测试目的,游戏测试和软件测试的不同也包含有这一点,游戏测试的最终目标是让普通大众去把握和接受,而软件有没这个普遍性,所以制定测试计划的时候也应该跟随脚本向这个目标走。然后就是个人认为测试过程是随着软件游戏的开发过程而进行的,每个阶段都应该有不同的开发过程和测试过程,所以每个阶段的测试计划和测试目的是不同的,我不知你问的具体指哪个方面,而我以前从事的是功能测试,就是黑盒测试!
    这时还问偶一个问题:你做的功能测试是怎么发现并提交bug的?
    偶的回答:我以前的测试过程是每天的测试内容侧重点是不同的,要根据leader发布的测试计划走,提交bug一般要形成图文并茂,再现bug出现场景,有理有据,形成文档,提交!
    然后就是他说:那好,今天就问到这里,有其他联系了会有别的人给你其他的面试。
    最后我问一点:我想问一下,我记得你们招收的学历是本科,可是我是大专,所以我想感谢你们给我面试的机会!
    他笑到,这个没什么的,学历我们并不看中,老总是想把你外聘的,好的,就这样,一起学习!呵呵

    当时我就傻了~~~
    外聘,,,就是打工扫地也好啊,不管是不是正式,有个工作就行!!!

    本人今天的面试就是这样!

  • VBS脚本的应用

    2007-06-02 21:09:16

    暂无
  • 转的面试题

    2007-05-30 14:00:19

    一个小时做完以下题目.

    01. 为什么要在一个团队中开展软件测试工作

    02. 您是否了解以往所工作的企业的软件测试过程?如果了解,请试述在这个过程中都有哪些工作要做?分别由哪些不同的角色来完成这些工作?

    03. 您是否了解以往所工作的企业的软件开发过程?如果了解,请试述一个完整的开发过程需要完成哪些工作?分别由哪些不同的角色来完成这些工作?(对于软件测试部分,可以简述)

    04. 您在以往的测试工作中都曾经具体从事过哪些工作?其中最擅长哪部分工作?

    05. 您所熟悉的软件测试类型都有哪些?请试着分别比较这些不同的测试类型的区别与联系(如功能测试性能测试……)

    06. 请试着比较一下黑盒测试、白盒测试、单元测试、集成测试、系统测试、验收测试的区别与联系。

    07. 测试计划工作的目的是什么?测试计划工作的内容都包括什么?其中哪些是最重要的?

    08. 您认为做好测试计划工作的关键是什么?

    09. 您所熟悉的测试用例设计方法都有哪些?请分别以具体的例子来说明这些方法在测试用例设计工作中的应用。

    10. 您认为做好测试用例设计工作的关键是什么?

    11. 请以您以往的实际工作为例,详细的描述一次测试用例设计的完整的过程。

    12. 您以往的工作中是否曾开展过测试用例的评审工作?如果有,请描述测试用例评审的过程和评审的内容。

    13. 您以往是否曾经从事过性能测试工作?如果有,请尽可能的详细描述您以往的性能测试工作的完整过程。

    14. 您在从事性能测试工作时,是否使用过一些测试工具?如果有,请试述该工具的工作原理,并以一个具体的工作中的例子描述该工具是如何在实际工作中应用的。

    15. 您认为性能测试工作的目的是什么?做好性能测试工作的关键是什么?

    16. 在您以往的工作中,一条软件缺陷(或者叫Bug)记录都包含了哪些内容?如何提交高质量的软件缺陷(Bug)记录?

    17. 您以往所从事的软件测试工作中,是否使用了一些工具来进行软件缺陷(Bug)的管理?如果有,请结合该工具描述软件缺陷(Bug)跟踪管理的流程。

    18. 您以往是否曾经从事过单元测试和集成测试?如果有,请谈一下这些工作的实际开展情况。

    19. 您如何看待软件过程改进?在您曾经工作过的企业中,是否有一些需要改进的东西呢?您期望的理想的测试人员的工作环境是怎样的?

    20. 您以往工作过的企业中,是否开展了软件配置管理工作?您能否描述一下这项工作的开展情况和您对这项工作的认识?

    21. 您是否熟悉一些主流的软件工程方法论和思想,如RUP、CMM、CMMI、XP、PSP、TSP。如果熟悉,您是否可以谈一下对这些方法论和思想的认识?

    22. 您认为在测试人员同开发人员的沟通过程中,如何提高沟通的效率和改善沟通的效果?维持测试人员同开发团队中其他成员良好的人际关系的关键是什么?

    23. 在您以往的测试工作中,最让您感到不满意或者不堪回首的事情是什么?您是如何来对待这些事情的?

    24. 在即将完成这次笔试前,您是否愿意谈一些自己在以往的学习和工作中获得的工作经验和心得体会?(可以包括软件测试、过程改进、软件开发或者与此无关的其他方面)

  • 测试面试题

    2007-05-28 18:35:22


    测试管理职位面试题

    •  ( TM )请列举你曾经担任的测试工作职位

    •  ( TM )你认为项目测试经理的工作职责和内容是什么?

    •  ( TM )请描述如果你是测试队伍的负责人,你如何提高测试队伍的技术能力?

    •  ( TM )你认为测试工程师的工作职责和内容是什么?

    •  ( TM )请画图描述项目测试过程与开发、配置管理、质量管理这三个过程之间的关系

    •  ( TM )某个项目为长期外包测试,测试人员长期派驻客户现场执行测试工作,你作为一个现场的项目测试经理如何维持组中测试工程师的稳定性?可从任意方面分析

    •  ( TM )如何解决测试需求、测试用例等测试信息的版本控制问题?

    •  ( TE )请列举你曾经做过的测试(你认为有技术含量的或者提高了测试管理能力的),并描述你从中如何受益

    •  ( TE )请列举至少 5 个项目测试过程中可能存在的实施风险,并给出每项风险的规避方法

    •  ( TE )在完整的测试过程中,你选择在何时进行自动化功能测试?为什么?

    •  ( TE )在完整的测试过程中,你选择在何时进行性能测试?为什么?



    功能测试职位面试题


    •  ( FT )请比较 Rational TestManager 与 MI TestDirector 的优缺点

    •  ( FT )请描述黑盒测试、白盒测试、灰盒测试

    •  ( FT )请描述如何进行测试需求的跟踪分析?

    •  ( FT )请列举至少三种测试用例的设计方法,并说明其基本的原理

    •  ( FT )请画出一个缺陷的生命周期示意图

    •  ( FT )请列举至少三种缺陷统计分析的方法,并说明每个方法的作用

    •  ( FT )请画出一个单元测试、集成测试、系统测试、验收测试的流程示意图


    自动测试职位面试题


    •  ( AT )请列举你曾经做过的自动化功能测试项目的经验

    •  ( AT )你认为适合进行自动化功能测试的时机是什么?请解释原因

    •  ( AT )请列举至少三个自动化测试在实现过程中会遇到的难点

    •  ( AT )请问:怎么在自动测试中实现数据驱动?

    •  ( AT )你会计算自动测试工程的投入回报比吗?怎么计算?

    •  ( AT )请比较 Rational Robot 与 MI QTP 的优缺点

    •  ( AT )你认为 Robot 在数据参数化的时候有什么不便之处吗?

    •  ( AT )请问 QTP 中如何不用录制的方法启动 IE ,并对 IE 窗口进行操作

    •  ( AT )在用自动测试工具制作测试脚本的时候,当需要对某个界面上的对象进行操作时,如何保证操作成功?

    •  ( TP )请选择一个自动功能测试工具并用该测试工具的脚本语言写一个脚本:每天早上 9 点弹出对话框,提示“现在 9 点了”。说明在测试工具中使用你的脚本的方式


    性能测试职位面试题


    •  ( PT )请列举你曾经做过的性能测试项目,包括被测系统名称、硬件架构、应用架构和性能测试工具

    •  ( PT )给你一个 J2EE 的 Web 应用系统,请描述完整的性能测试流程

    •  ( PT )请描述如何有效的监控 WEBLOGIC 应用服务器的性能情况

    •  ( PT )请描述如何有效的监控 Oracle 数据库服务器的性能情况

    •  ( PT )请问:当操作系统的 PageFaults/s 数值很大且频繁波动,说明什么?

    •  ( PT )请问:在性能测试的时候,怎样判断网络存在瓶颈?

    •  ( PT )请描述性能测试报告中应该包含的主要内容

    •  ( PT )请比较 Rational 性能测试工具与 MI LoadRunner 的优缺点

    •  ( PT )在性能测试时,如果被测系统没有带界面的客户端,你有什么办法?

    •  ( TP )请说明在性能测试中用测试工具进行数据关联是什么意思,解决什么问题?


    英语能力面试题

    •  ( English )翻译下面的内容

    An important special case of overlooking bugs is checking that the product does what it's supposed to do, but not that it doesn't do what it isn't supposed to do. As an example, suppose you have a program that updates a health care service's database of family records. A test adds a second child to Dawn Marick's record. Almost all testers would check that, after the update, Dawn now has two children. Some testers - those who are clever, experienced, or subject matter experts - would check that Dawn Marick's spouse, Brian Marick, also now has two children. Relatively few testers would check that no one else in the database has had a child added. They would miss a bug where the programmer over-generalized and assumed that all "family information" updates should be applied both to a patient and to all members of her family, giving Paul Marick (aged 2) a child.
        Ideally, every test should check that all data that should be modified has been modified and that all other data has been unchanged. With forethought, that can be built into automated tests. Complete checking may be impractical for manual tests, but occasional quick scans for data that might be corrupted can be valuable.

    •  ( English )根据下面的中文内容写一个缺陷报告

    我们正在给国外的一家软件公司的“ klsoft ”软件做测试,你发现了一个 bug ,在“ Mkbox ”对话框中输入八位的数字点“ save ”按钮,再次查询后该数字就会变成另外一个数字,而且任何什么规则,如果输入小于八位或者大于八位的数字就不会出现此问题。这个问题在 Win2000 professional 系统存在,其他系统不存在。现在该软件已经投入使用了,所以你感觉到问题的严重性,现在要求你写一封英文的 email 给美国公司的 Simen ,希望他可以帮助转达给相关的负责人员,引起注意,记住 Simen 并不是这部分的负责人,而且他工作很忙,所以要注意措辞。
  • 访问ADO数据库之三

    2007-05-21 23:34:00

    () WHERE子句设置查询条件

    WHERE子句设置查询条件,过滤掉不需要的数据行。例如下面语句查询年龄大于20的数据:

    SELECT * FROM usertable WHERE age>20

    WHERE子句可包括各种条件运算符:

    比较运算符(大小比较)>>==<<=<>!>!<

    范围运算符(表达式值是否在指定的范围)BETWEEN…AND…

    NOT BETWEEN…AND…

    列表运算符(判断表达式是否为列表中的指定项)IN (1,2……)

    NOT IN (1,2……)

    模式匹配符(判断值是否与指定的字符通配格式相符):LIKENOT LIKE

    空值判断符(判断表达式是否为空)IS NULLNOT IS NULL

    逻辑运算符(用于多条件的逻辑连接)NOTANDOR

    1、范围运算符例:age BETWEEN 10 AND 30相当于age>=10 AND age<=30 作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    2、列表运算符例:country IN ('Germany','China')

    3、模式匹配符例:常用于模糊查找,它判断列值是否与指定的字符串格式相匹配。可用于char varchartextntextdatetimesmalldatetime等类型查询。 作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    可使用以下通配字符:

    百分号%:可匹配任意类型和长度的字符,如果是中文,请使用两个百分号即%%

    下划线_:匹配单个任意字符,它常用来限制表达式的字符长度。

    方括号[]:指定一个字符、字符串或范围,要求所匹配对象为它们中的任一个。 作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    [^]:其取值也[] 相同,但它要求所匹配对象为指定字符以外的任一个字符。

    例如:作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    限制以Publishing结尾,使用LIKE '%Publishing'

    限制以A开头:LIKE '[A]%'

    限制以A开头外:LIKE '[^A]%'

    4、空值判断符例WHERE age IS NULL

    5、逻辑运算符:优先级为NOTANDOR

    最后,让我们用一个简单的例子结束这篇教程:

    Objku = InputBox("请输入单位数据库的路径","默认位置","d:\jbqk.mdb")
    Set ōbjconn = createobject("adodb.connection")
    Objconn.open ="provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Objku
    作者:临汾市外事旅游局薛靖澜,转载请注明出处]
    sql = "CREATE TABLE [单位资料](ID Autoincrement PRIMARY KEY,[姓名] text(8),[性别] text(2),[科室] text(6),[住址] text(30))"
    Objconn.execute(sql)
    sql = "INSERT INTO [单位资料]([姓名],[性别],[科室],[住址]) VALUES('张三','男','行管科','解放路12号')"
    Objconn.execute(sql)
    sql = "INSERT INTO [单位资料]([姓名],[性别],[科室],[住址]) VALUES('李斯','女','市场科','五一路12号')"
    Objconn.execute(sql)
    sql = "DELETE FROM [单位资料] WHERE [姓名] = '张三' "
    Objconn.execute(sql)
    sql = "UPDATE [单位资料]"
    sql = "SELECT COUNT(ID) FROM [单位资料]"

  • 访问ADO数据库之二

    2007-05-21 23:33:31

    常用的SQL语句

    在学习SQL语句之前,让我们先来对数据库做一个基本的了解。一个数据库中可能包含了很多个基本单位叫做表。表格被分为“行”和“列”。每一行代表表的一个单独组成部分,每一列代表相同性质的一组数据。举例来说,如果我们有一个记载顾客资料的表格,行包括姓、名、地址、城市、国家、生日等。而一列则代表了所有的地址或者国家等。

    一、建立数据表,我们前边说过利用ADOX.Catalog建立数据库和数据表的方法,但是用的似乎不是很多,一般情况下,如果我们需要在数据库中动态建立一个表,我们将工作交给SQL语句来做,其基本语法是:

    CREATE TABLE [表格名]([列名1] 数据类型 , [列名2]  数据类型,... )

    例如我们要建立一个基本顾客表:

    Create table [顾客表]([姓名] text8, [性别] text2),[住址] text(30))

    二、插入数据项

    insert into [数据表名称] (数据项1,数据项2,...) values (1,2,...)

    insert into语句用来添加新的数据到数据库中的指定表。通过(数据项1,数据项2,...) values (1,2,...)来为新添加的数据赋初值。

    三、删除数据项

    delete from [数据表名称] where [数据项1] like [1] and/or [数据项2] like [2] ...作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    四、更新数据项

    update [数据表名称] set 数据项1=1,数据项2=2,... where [数据项1] like [1] and/or [数据项2] like [2] ...
    该语句可以修改数据库中指定数据表内的指定数据,如果不是用where限定条件就表示修改该表内所有的数据条目。

    五、查询数据项

    select [数据内容] from [数据表名称] where [数据项1] like [1] and/or [数据项2] like [2] ... order by [数据项] asc/desc

    [数据内容]部分表示所要选取的表格中的数据项,使用*表示选取全部。[数据表名称]表示要从哪一个表格中选取,如果你没有接触过数据库可能很难了解什么是数据表格,没关系,我将在后面用到它的时候再说明。where表示选取的条件,使用like表示相等,也支持>=这样的判断符号,同时使用多个条件进行选取时中间要使用and进行连接。order by决定数据的排列顺序,asc表示按照[数据项]中的数据顺序排列,desc表示倒序,默认情况为顺序。select语句中除selectfrom之外其它均为可选项,如果都不填写表示选取该数据表中的全部数据。例如:下面的语句查询某数据库中表名称为:testtable中姓名为张三nickname字段和email字段。

    SELECT nickname,email FROM testtable WHERE name='张三'

    () 选择列表 作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    选择列表(select_list)指出所查询列,它可以是一组列名列表、星号、表达式、变量(包括局部变量和全局变量)等构成。

    1、选择所有列

    例如,下面语句显示testtable表中所有列的数据:

    SELECT * FROM testtable

    2、选择部分列并指定它们的显示次序查询结果集合中数据的排列顺序与选择列表中所指定的列名排列顺序相同。

    例如:SELECT nickname,email FROM testtable

    3、更改列标题 作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    在选择列表中,可重新指定列标题。定义格式为:列标题=列名

    列名 列标题如果指定的列标题不是标准的标识符格式时,应使用引号定界符,例如,下列语句使用汉字显示列标题:

    SELECT 昵称=nickname,电子邮件=email FROM testtable

    () FROM子句指定SELECT语句查询的表。

    最多可指定256个表,它们之间用逗号分隔。如果选择列表中存在同名列,这时应使用对象名限定这些列所属的表或视图。例如在usertablecitytable表中同时存在cityid列,在查询两个表中的cityid时应加以限定。


  • 访问ADO数据库之一

    2007-05-21 23:33:01

    ADOMicrosoft提供和建议使用的新型数据访问接口,它是建立OLEDB之上的一个抽象层。微软公司在操作系统中默认提供了 Access ODBC 驱动程序以及 JET 引擎,

    一、对ADO对象的主要操作,一般包括6个方面:

    1.连接到数据源。通常使用ADOConnection对象。一般使用相应的属性打开到数据源的连接,设置游标的位置,设置默认的当前数据库,设置将使用的OLEDBProvider,直接提交SQL脚本等。

    2.向数据源提交命令。通常涉及ADOCommand对象。可查询数据库并返回结果在Recordset对象中。

    3.执行SELECT查询命令。在提交SQL脚本的任务时,不用创建一个Command对象,就可完成查询。

    4.可以通过ADORecordset对象对结果进行操作。

    5.更新数据到物理存储。作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    6.提供错误检测。通常涉及ADOError对象。

    二、ADO中主要对象的功能

    Recordset对象,用来封装查询的结果。

    Field对象,用来表达一行结果中各子段的类型和值。

    Error对象,用来检测和判断在数据库操作中出现的错误,比如连接失败。 ADO中,许多对象名后多了一个"s",比如Error->ErrorsField->Fields等等。添加"s"意味着是相应对象的Collection(集合)对象,比如ErrorsError对象的Collection对象。Collection有点像数组(Array),但不同的是,Collection可以以不同类型的数据或对象作为自己的元素,而数组中的各元素通常都是相同类型的。所以,在看到一个对象名最后是"s",通常表明这是一个Collection对象,比如Errors中的各元素是由Error对象的实例组成的。

    三、具体应用作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    1、创建mdb数据库

    ADOX ADO 对象的扩展库。它可用于创建、修改和删除模式对象,如数据库和表格等。

    其常用的对象有:Catalog>创建数据库。Column>表示表、索引或关键字的列。作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    Key>表示数据库表中的关键字。

    常用的方法有: Append 将对象添加到 其集合。Delete 删除集合中的对象。作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    set cat= createobject("ADOX.Catalog")

    cat.Create "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=d:\shujuku.mdb"

    Set  tbl=createobject("ADOX.Table")       

    tbl.Name ="MyTable"   

    tbl.Columns.Append  "姓名",  202  'adInteger   

    tbl.Columns.Append  "性别",  3  'adInteger   

    tbl.Columns.Append  "工作单位",  202  ,50  'adVarWChar   

    cat.Tables.Append  tbl     

    不过你要操纵数据库就连一个数据库也不建,未免懒惰了点,用代码虽然可以完成,但是我觉得对数据约束完成的比较困难,本代码也就是示范个例子,并不推荐使用此类方法。

    2、打开数据库作者:临汾市外事旅游局薛靖澜,转载请注明出处]

    Provider=″Provider=Microsoft.Jet.OLEDB.4.0 ; Data Source="

    Set ōbjconn = createobject("ADODB.Connection")

    Objconn.Open Provider & "数据库名称"

    3、创建记录集

    Set ōbjrs = CreateObject("ADODB.Recordset")

    4、执行SQL查询语句

    Sql="SQL查询语句"  '例如:Select count(*) from table1

    Set ōbjrs = objconn.execute(sql)

    一般情况下,我们将绝大多数的操作转化为SQL语句完成。


  • 响应事件

    2007-05-21 23:32:17

    什么是事件?在我看来,事件就象我们手机上的闹钟,闹钟一响,我们就要去做某些特定的事情。或者这样说,事件就像警钟,当程序运行时,有特殊的事情发生,就会激发事件,事件本身就是一条消息,如果你编写的脚本要对事件进行处理,就需要一个特殊的过程或者函数来接受和处理事件。那么这个特殊的过程或者函数在程序运行时,就不断的监听,看系统是否传来了相应的事件,一旦接受到事件,脚本对此作出反应。

    那么事件是从那里来的呢?是否需要我们在脚本中对事件进行编写呢?一般情况下,[作者:临汾市外事旅游局薛靖澜,转载请注明出处]事件是某个程序在运行中的特殊状态发出的,我们不需要对事件进行编写,只需要编写处理事件的函数。比如说我们用vbs建立了ie的一个实例,那么当ie的窗口被关闭的时候,就会激发出一个叫做OnQuit的事件。

    是不是脚本自然而然就能接受事件并进行处理呢?我们说不是的,在创建对象的时候,我们将使用WSHcreateobject命令,例如:

    Set ōbjie=Wscrīpt.createobject(“internetexplorer.application”,”event_”)

    注意到了吗?多了一个参数,这个参数的作用是什么呢?它叫做事件接收端,当脚本连接的对象包含事件时,如果对象调用的事件是OnBegin,那么WSH将会在脚本中调用一个event_OnBegin的事件处理程序。当然事件接受端并不是固定的,如果对象将其定义为MyObj_的话,那么事件处理程序将是:MyObj_OnBegin

    是否很熟悉?在打造个性化QQ一讲中,曾经出现过Window_OnSize(cx,cy)函数,它其实就是一个事件处理程序。

    让我们来举个实际的例子完整的看看事件的处理过程:

    Set ōbjie=Wscrīpt.CreateObject("InternetExplorer.Application","event_")

    objie.Visible=True

    MsgBox "请关闭浏览器窗口看看效果!",vbSystemModal

    Wscrīpt.sleep 6000

    MsgBox "现在已经正常关闭了"

    Sub event_onquit()

    MsgBox "您确定要关闭浏览器吗?",vbSystemModal

    End Sub

    这段脚本打开了一个IE窗口,然后要求你关闭IE窗口,当你关闭窗口的时候,自动调用事件响应程序。

1034/6<123456>
Open Toolbar