发布新日志

  • SVN的配置管理

    2010-03-09 10:40:39

  • TD字体的修改方法

    2009-11-23 15:21:08

    1.关闭所有使用TD的浏览器(这一步很重要)
    2.进入C:\program files\common files\Mercury Interactive\TD2000目录,备份原TDClientUI.ocx文件
    3.将下载的字体控件TDClientUI.ocx拷贝至C:\program files\common files\Mercury Interactive\TD2000目录
    4.注册TDClientUI.ocx控件。
    方法:请确认该机器上所有使用TD的IE均关闭;“开始”-〉“运行”,输入:
    regsvr32 “C:\Program Files\Common Files\Mercury Interactive\TD2000\TDClientUI.ocx”
    5.打开IE,进入TD。
  • cvs的配置管理

    2009-11-12 18:29:50

     

    /*
    说明:

    1.${CVSNT},表示,CVSNT的安装路径
    2.${CVSNTROOT},表示,CNSNT的 ROOT Repository 路径
    3.本文提到的 CVSNT 一般指 CVSNT Server
    */


    ****************
    * CVSNT 的安装 *
    ****************
    平台
    CVSNT-2.5.03.2151;
    windows xp sp2;
    /*
    注意:
    一般需要 ntfs 格式的系统
    CVSNT Server 官方站点
    http://www.march-hare.com/
    http://www.cvsnt.org/archive/?M=A
    这个网址可以下载到原始安装文件和手册

    */

    安装 CVSNT-2.5.03.2151
    过程略

    注意:
    1.安装完成之后,安装程序会自动把 ${CVSNT} 加入到 path 中
    2.cvs.ext 既是 server 又是 client,如果仅作为 client 端,想要运行 cvs 命令,也必须安装它;
    3.注意设定 CVSNT Repository.

    ***********************
    * CVSNT的用户验证方式 *
    ***********************
    CVSNT的用户验证方式分两种

    1.Windows系统用户与CVSNT用户共存的混合验证方式:

    即 windows 操作系统用户和 CVSNT 的 passwd 文件定义的用户都可以作为 CVSNT 的用户。
    1.1 作为操作系统的用户登陆:输入操作系统的用户和密码;
    1.2 作为 CVSNT 的用户登陆:输入 passwd 文件中定义的用户和密码。
    在这种方式,操作系统的管理员帐户同时也是 CVSNT 服务器的管理员帐户。

    2.CVSNT用户单一验证方式:

    只有 CVSNT passwd 文件定义的用户作为 CVSNT 的用户。
    登陆:输入 passwd 文件中定义的用户和密码。

    默认工作模式是混合验证方式,但是使用单一验证方式对用户的管理比较方便一点,因此下面的介绍,基于 CVSNT 用户单一验证方式。

    ***********************
    * CVSNT的主要配置文件 *
    ***********************
    CVSNT 服务器安装完成之后,要定义 ROOT Repository (即上文定义的 ${CVSNTROOT} ),在该目录中,定义了服务器的各种配置,在这里可以定义管理选项参数。

    本文主要介绍以下几个文件:config,passwd,admin,group,checkoulist,fileattr.xml,cvswrappers

    *** config 文件 ***
    只关注文中第一、二行注释

    #Set this to `no" if pserver shouldn"t check system users/passwords
    #SystemAuth=yes

    SystemAuth: 定义验证方式,默认是 SystemAuth=yes ,即混合验证方式。
    这项设置默认是注释掉的,相当于 SystemAuth=yes

    如果想要修改为 CVSNT 用户单一验证方式,修改为 SystemAuth=no
    注意,如果修改为 SystemAuth=no ,操作系统用户就不能登陆 CVSNT 服务器了,所以要在定义好 CVSNT 服务器的管理员之后(即修改好 passwd,admin,checkoutlist 三个文件之后),再修改它。

    *** passwd 文件 ***

    该文件中定义了 CVSNT 用户的用户名、密码、操作系统用户别名;
    默认该文件是不存在的,只有管理员有权限创建和修改它;
    该文件不能被 checkout。

    格式:
    cvsadmin:fqr1fS4gDghrt:administrator
    用户名:密码:操作系统用户别名

    密码是CVS使用UNIX标准加密函数对密码进行加密后的结果;
    这个用户名和密码和操作系统用户没有关系,修改它们不会对操作系统产生任何影响;
    每个用户必须要有一个操作系统用户别名,这个别名必须在操作系统中真实存在,并且是管理员身份,否则该用户无法进行 cvs 操作。(为什么必须是管理员?)
    /*
    实际上, CVSNT 服务器是以该操作系统用户的身份进行文件的读写操作的,如果该操作系统用户为 guest ,则不能 checkout ,ls 等。
    不知道为为什么 CVSNT 服务器没有把这项设置对使用者透明化,因为每个用户都要进行 checkout ,ls 等基本的操作,如果连这些基本的操作都不能进行的话,这个用户就没有存在的必要了。
    按我的理解,格式就要用户名和密码,后面的操作系统别名默认为管理员,就像 servu 一样易于使用。
    (也可能有其他的原因)

    附:
    cvsnt manual
    The cvs passwd command can be used to add or delete new users. Only an administrator can do this.
    Note that deleting a user does not remove them from any user permissions.
    */

    *** admin 文件 ***

    文件中定义了 CVSNT 服务器的管理员列表

    格式:
    user1
    user2
    ...

    该文件中的用户同样必须出现在 passwd 文件中;
    该文件中的用户,拥有 CVSNT 服务器管理员的所有权限;
    该文件默认是不存在的,需要手工建立;
    该文件要加入到 checkoutlist 文件中。

    实际上,cvsnt server 把这个文件当作一个特殊的 group 来对待的。

    *** group 文件 ***

    这个文件用来定义组,我们可以将同样性质的用户归入一个组,然后用给用户赋权限的方式给组赋权限,这样,一个组的用户就会具有同样的权限。

    格式:
    group1:user1 user2 user3
    group2:user4 user5 user6
    group3:user7 user8 user9
    组的名称+冒号+用户名+空格+用户名+空格...

    多个用户名之间用空格来进行分割;
    组中的用户,要在 passwd 文件中存在。


    *** checkoutlist 文件 ***

    # The "checkoutlist" file is used to support additional version controlled
    # administrative files in $CVSROOT/CVSROOT, such as template files.
    #
    # File format:
    #
    # [<whitespace>]<filename><whitespace><error message><end-of-line>
    #
    # comment lines begin with '#'

    该文件用来支持附加的版本控制操作,在 CVSROOT 中添加的文件,要在此文件中声明.
    目前只知道,admin 文件需要声明.
    格式举例:
    admin err msg by Apollo

    注意:不要忘记文件名称之前的空格。

    *** fileattr.xml 文件 ***

    在每一个 Repository 建立之后,都会在 Repository 的 ROOT 中建立一个名字叫做 CVS 目录,该目录中只有一个文件 fileattr.xml;
    fileattr.xml 文件中定义了访问该 Repository 的用户的权限;
    对于新建立的 Repository ,默认是所有人拥有所有权限(CVSNT ROOT 除外);
    CVSNT ROOT 的 fileattr.xml:默认是只有管理员拥有其所有权限。


    *** cvswrappers 文件 ***
    refers to
    http://www.mobilefish.com/developer/cvsnt/cvsnt.html

    Before using CVS, it is recommended to update the cvswrappers file. The cvswrapper file contains file extensions which determines which file should be stored as binary files in the CVS Repository. To update this file do the following:

    Add the following file extensions in the cvswrappers file, e.g.:

    *.cab -k 'b'
    *.class -k 'b'
    *.doc -k 'b'
    *.dll -k 'b'
    *.ear -k 'b'
    *.exe -k 'b'
    *.exp -k 'b'
    *.fla -k 'b'
    *.gif -k 'b'
    *.gz -k 'b'
    *.jar -k 'b'
    *.jpg -k 'b'
    *.jpeg -k 'b'
    *.lib -k 'b'
    *.msi -k 'b'
    *.mso -k 'b'
    *.pdf -k 'b'
    *.pfw -k 'b'
    *.png -k 'b'
    *.ppt -k 'b'
    *.sit -k 'b'
    *.swf -k 'b'
    *.tar -k 'b'
    *.tlb -k 'b'
    *.vsd -k 'b'
    *.xls -k 'b'
    *.war -k 'b'
    *.wmz -k 'b'
    *.zip -k 'b'


    ******************
    * CVSNT 配置实验 *
    ******************

    *** 实验目的 ***

    1.修改 CVSNT 服务器验证方式为 CVSNT 用户单一验证方式;
    2.定义 CVSNT 服务器的管理员为 cvsadmin,密码为 cvsadmin;
    3.定义两个 Repository(testa,testb) ,添加四个普通用户,每个 Repository 有两个用户.
    test1:test1 , test2:test2 为 Repository testa 的用户,test1,只能读(checkout),test2 能读、写、添加文件(read,write,create).
    test3:test3 , test4:test4 为 Repository testb 的用户,test3,只能读(checkout),test4 能读、写、添加文件(read,write,create).

    *** 完成效果 ***

    cvsadmin 能设置 CVSNT 服务器的配置,并且能对所有的 Repository 拥有全部权限;
    test1,test2 只能看见 testa,并且 test1 只能对 teata 进行 checkout(read),test2 能对 testa 进行 checkout,commit,add (read,write,create);
    test3,test4 只能看见 testb,并且 test3 只能对 teatb 进行 checkout(read),test4 能对 testb 进行 checkout,commit,add (read,write,create);

    /*
    说明:
    权限参数有 read,write,add,tag,control. 这里只举例说明最常要的 read,write,add(参见帮助文档);
    control 没有应用成功。

    */

    *** 开始配置 ***

    /*
    说明:
    1. 以下从命令行进行配置,注意步骤地顺序;
    2. 设置权限等,都要把 Repository checkout 出来;
    3. 对于 CVSNT 服务器的设置,实际上就是对 CVSROOT 这个特殊的 Repository 进行设置,所以首先也要把 CVSROOT checkout 出来.注意 checkout CVSROOT 需要用管理员身份;
    4. 刚安装完成之后的 CVSNT server 默认的管理员是操作系统的管理员,所以用操作系统管理员身份 checkout CVSROOT;

    */

    1 *** 进入命令行,建立一个临时目录,用来放置 checkout 出来的 Repository ,修改完成之后,再提交到 CVSNT server 上去。

    d:\ md 00   # 在 d: 建立一个临时目录,进入
    d:\00\

    2 *** 登陆 CVSNT server

    d:\00\set cvsroot=:pserver:administrator:123456@localhost/cvsroot

    /*
    说明:
    set cvsroot 是设置一个临时的环境变量,变量值为 = 右边部分;
    pserver     为登陆协议,是一种明文协议,用户名和密码可以被监测到。本次实验用这种协议,其他的协议以后再总结;
    administrator:123456    为本机操作系统的管理员用户和密码;
    localhost   为登陆的机器地址,可以用 IP;
    /cvsroot    cvsroot 是安装 CVSNT server 的时候,指定 CVSROOT 的别名。
    */

    3 *** 列表
    d:\00\ cvs ls
    /*
    说明:
    列出 CVSNT server 的 CVSROOT 下面的所有 Repository;
    此时应该只有一个 CVSROOT ,它是服务器的根,服务器的所有配置都在这里;
    此时登陆的身份是管理员,前文说过,CVSNT ROOT 的 fileattr.xml 已经定义,默认是只有管理员拥有其所有权限;
    列表命令成功,同时也说明登陆成功。
    */

    4 *** checkout CVSNTROOT 到 d:\00\
    d:\00\cvs co cvsroot
    /*
    说明:
    co 是 commit 命令的简写,具体简写的命令,见帮助;
    该命令会把 CVSNTROOT checkout 到 d:\00\ ,并且会在 d:\00\ 建立一个 cvsroot 目录;
    d:\00\cvsroot 里面是 CVSNTROOT 中的所有配置信息;
    修改配置信息之后,再 commit 上去, CVSNT server 的配置随之改变了。
    */

    5 *** 添加用户信息

    d:\00\cvs passwd -r administrator -a cvsadmin
    d:\00\cvs passwd -r administrator -a test1
    d:\00\cvs passwd -r administrator -a test2
    d:\00\cvs passwd -r administrator -a test3
    d:\00\cvs passwd -r administrator -a test4
    /*
    说明:
    该命令会直接在 CVSNT server 的 server 端直接建立一个 passwd 文件,而不会在已经 checkout 的 d:\00\cvsroot 目录中建立此文件;
    该文件只能由管理员建立,并且不能被非管理员修改,不能被 checkout;

    -r 是管理的操作系统用户的别名
    注意:
    该命令不会影响操作系统用户;
    此操作系统用户必须为管理员。

    -a 添加用户

    添加用户的时候,会提示输入密码。(本次实验,用户名和密码取相同)。

    建立的 passwd 文件内容应如下内容:

    cvsadmin:oVaaG5hcPSOQY:administrator
    test1:eXetD79lHrTgw:administrator
    test2:zX3nQkEmS/Se2:administrator
    test3:cZgugWplhpBd.:administrator
    test4:pZ5M7WTmCHMmI:administrator

    The cvs passwd command can be used to add or delete new users. Only an administrator can do this.
    Note that deleting a user does not remove them from any user permissions.

    参考上文 passwd 文件说明。
    */

    6 *** 定义 cvsadmin 为 CVSNT server 管理员
    在 d:\00\cvsroot 建立文件名为 admin 的文件(注意,无扩展名)
    内容为 :

    cvsadmin

    即定义了 cvsadmin 为 CVSNT Server 管理员;
    如果还想加入其他的用户作为管理员,依次加入用户名即可,每个用户名一行;
    实际上 CVSNT 把这个文件中的所有用户,当作是管理员组。

    7 *** 注册文件 admin 到 checkoutlist 文件

    打开 d:\00\cvsroot 中 checkoutlist 文件,加入这一句:

    admin err msg by jh

    注意 admin 前后的空格,具体的格式信息,参照前文 checkoutlist 文件 说明部分;
    只有添加的 admin 文件需要注册到 checkoutlist 中,其他的添加文件不用。

    8 *** 定义 group 组

    在 d:\00\cvsroot 建立文件名为 group 的文件(注意,无扩展名)
    内容为 :

    #testall :hava all permissions
    testaall:test1 cvsadmin
    #testar :read only
    testar:test2
    #testbll :hava all permissions
    testball:test3 cvsadmin
    #testbr :read only
    testbr:test4

    testaall,testball 有完全权限;
    testar,testbr     只读权限;
    该文件不用注册到 checkoutlist。


    9 *** 修改 cvswrappers 文件
    参考上文。

    10 *** 修改验证方式

    修改   d:\00\cvsroot 下面的 config 文件
    修改前面第二行为:
    SystemAuth=no

    即修改验证方式为 CVSNT用户单一验证方式。


    11 *** 提交对 CVSROOT 的修改

    11.1 进入 d:\00\cvsroot

    11.2 d:\00\cvsroot\cvs add admin group
    由于 admin 和 group 文件是新产生的,所以提交之前要添加到 commit 的计划之中;
    运行完该命令之后,会提示运行 cvs commit 命令提交该文件。

    11.3 d:\00\cvsroot\cvs commit
    运行该命令,会提交 d:\00\cvsroot\ 目录中的所有文件,包括新建立的文件;
    中间过程会弹出来一个提示文件,说明哪些文件被修改了,哪些文件是添加的,该文件的信息如下:

    CVS: ----------------------------------------------------------------------
    CVS: Enter Log. Lines beginning with `CVS:' are removed automatically
    CVS:
    CVS: Committing in .
    CVS:
    CVS: Modified Files:
    CVS: checkoutlist cvswrappers config
    CVS: Added Files:
    CVS: admin group
    CVS: ----------------------------------------------------------------------

    即提示修改了 checkoutlist config cvswrappers 三个文件,添加了 admin group 两个文件;
    这个提示文件可以添加内容,所有信息都会被提交并且被 CVSNT Server 记录;
    关掉该文件,选择继续提交。

    /*
    至此,完成工作如下:
    CVSNT server 已经设置为 CVSNT用户单一验证方式;
    CVSNT server 管理员已经设置为 cvsadmin;
    test1,test2,test3,test4 已经添加。

    此时,如果再运行命令 cvs ls ,则会提示该用户不存在。
    因为我们最开始登陆的时候,设置的是 set cvsroot=:pserver:administrator:123456@localhost/cvsroot
    所以此时运行 cvs ls 是在 set cvsroot=:pserver:administrator:123456@localhost/cvsroot 环境下面进行的,而我们已经改变了验证方式为 CVSNT用户单一验证方式,administrator 用户不在 passwd 文件中,所以 cvs ls 命令不会被执行了。

    以 cvsadmin 用户登陆:
    关掉命令窗口,打开一个新的命令窗口

    进入临时目录 d:\00\
    d:\00\set cvsroot=:pserver:cvsadmin:cvsadmin@localhost/cvsroot
    d:\00\cvs ls

    就可以看到 CVSROOT 下面的所有 Repository 了。

    测试其他的用户为非管理员,即看不到 CVSROOT:
    关掉命令窗口,打开一个新的命令窗口
    进入临时目录 d:\00\
    d:\00\set cvsroot=:pserver:test1:test1@localhost/cvsroot
    d:\00\cvs ls
    会提示
    Listing modules on server

    空白,即不能看到 CVSROOT。

    前文提到过,CVSNT ROOT 默认是只有管理员拥有其所有权限,它是靠 fileattr.xml 文件这一句
    <all deny="1" />
    来实现的,具体的详细解释见下文。
    */

    12 *** 至此,对 CVSRT Server 的 CVSROOT 的修改已经完成,为了安全起见,删除临时 checkout 出来的 CVSROOT
    d:/00/rd cvsroot /s
    dos 命令,删除根目录下面的所有文件及文件夹。
    /*
    dos 命令
    1. help # 列出所有命令
    2. help xxx #列出 xxx 的帮助
    */

    13 *** 以 test1 用户身份 import 一个 testa 工程,做如下权限限制:
    只有 cvsadmin,test1,test2 能看见 testa,;
    test1 只能对 teata 进行 checkout(read);
    cvsadmin,test2 能对 testa 进行 checkout,commit,add (read,write,create).

    关闭窗口,建立临时目录 d:/00/test/,在 test 中放入几个文件,准备 import 到 CVSNT Server 上面去。
    重新以 test1 用户登陆:
    d:/00/test/set cvsroot=:pserver:test1:test1@129.9.200.253/CVSNTROOT

    把 d:/00/test/目录中的所有文件 import 进入 CVSNT Server,并且命名为 testa:
    d:/00/test/cvs import -m "Imported sources test1 " testa start

    -m 为导入时的日志信息
    cvs --help import 可以查看 import 参数

    设置权限:
    必须导出来才可以定制权限;
    只有 CVSNT Server 的管理员才可以设置权限,项目的建立者(owner)也不能更改权限(是这样吗,麻烦!);
    新建立的项目:默认是所有人拥有所有权限;
    cvs lsacl :查看当前 Repository 权限。

    /*

    关于权限的说明:

    CVSNT 2.5 对 Repository 的访问控制设置,是使用命令 chacl,chown 来进行的;
    当新建立一个 Repository 之后,会在其中建立一个 cvs 文件夹,里面有一个 fileattr.xml 文件,该文件定义了其所在 Repository 的访问控制权限,实际上 chacl,chown 命令就是对该文件的操作;
    chacl,chown 命令,只有管理员能够执行,就是 Repository 的创建者(owner)也不能执行!(管理员累死了!怎么会有这种管理方法!)
    执行 chacl 命令,必须先把 Repository 导出来,以下执行命令,都是导出来之后执行的。

    */

    13.1 一个新的 Repository 创建之后,默认是对所有人开放所有权限的。一个新建立的 Repository 的 fileattr.xml 文件如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <fileattr>
    <directory>
        <owner>test1</owner>
    </directory>
    </fileattr>


    仅仅表明,该 Repository 的拥有者 owner (即创建者) 是 test1.

    CVSNT 2.5 权限管理的原则是:如果不显示的指出否定权限,则赋予肯定权限。(这一点个人觉得非常不方便,安全是第一位的。)
    例如上面的 fileattr.xml 是所有人,拥有所有权限

    13.2 如果要把默认的权限关闭,要用 chacl 命令
    以管理员身份执行
    cvs chacl -a none

    执行完毕之后,应该是这个样子:

    <?xml version="1.0" encoding="UTF-8"?>
    <fileattr>
    <directory>
        <owner>test1</owner>
        <acl>
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.00.04</modified_date>
          <all deny="1" />
        </acl>
    </directory>
    </fileattr>

    modified_by,modified_date 是注释信息;
    <all deny="1" /> 一句,把默认得权限都关闭了,即使是管理员、创建者都没有任何权限了;
    并且,如果不显示的指出肯定权限,都是默认的否定权限(和默认的权限规则相反)。

    13.3 开通管理员的所有权限
    cvs chacl -u testaall -a all
    即,testaall 组对 testa 拥有全部权限;
    -u 可以是组名称,也可以是单个用户名称。

    <?xml version="1.0" encoding="UTF-8"?>
    <fileattr>
    <directory>
        <acl>
          <all deny="1" />
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.00.04</modified_date>
        </acl>
        <owner>test1</owner>
        <acl user="testaall">
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.00.41</modified_date>
          <all />
        </acl>
    </directory>
    </fileattr>

    这样,testaall 组中的用户拥有所有权限了,其他的用户无任何权限;
    如果想要让一个用户拥有 所有权限,加入到 testaall 组即可。

    13.4 添加 testar 组用户只读权限
    cvs chacl -u testar -a read
    说明:
    经过 cvs chacl -a none ,如果不显示的指出肯定权限,都是默认的否定权限(和默认的权限规则相反);
    相当于 cvs chacl -u testar -a read,nowrite,nocreate,no...(所有的参数加上前缀 no).


    <?xml version="1.0" encoding="UTF-8"?>
    <fileattr>
    <directory>
        <acl user="testaall">
          <all />
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.00.41</modified_date>
        </acl>
        <acl>
          <all deny="1" />
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.00.04</modified_date>
        </acl>
        <owner>test1</owner>
        <acl user="testar">
          <modified_by>cvsadmin</modified_by>
          <modified_date>2005.12.11.11.09.33</modified_date>
          <read />
        </acl>
    </directory>
    </fileattr>


    /*

    对于 CVSNTROOT Repository 的说明

    刚建立 CVSNTROOT 的时候 fileattr.xml 是这样的(CVSNT 自动建立的)

    <?xml version="1.0" encoding="UTF-8"?>
    <fileattr>
    <directory>
        <owner>administrator</owner>
        <acl user="administrator">
          <all />
        </acl>
        <acl user="admin">
          <all />
        </acl>
        <acl>
          <all deny="1" />
        </acl>
    </directory>
    </fileattr>


    即只有 administrator 用户和 admin 组的用户拥有全部权限;
    而 安装 CVSNT 的时候,是以操作系统管理员 administrator 安装的,所以 administrator 默认给了所有权限,当更改了验证方式之后,administrator 用户就无效了。
    admin 也是 CVSNT 自动加上的,即默认 admin组中的用户也拥有全部权限.

    实际上,我们可以直接用编辑工具按照格式更改 fileattr.xml 文件,而不用 chacl 命令,效果是一样的。


    我们可以测试:
    test1,cvsadmin 用户可以 read,write,create ...
    而test2 用户只能 read

    */


    14 *** testb 工程
    同 11 testa 的过程

    建立以后,我们会发现:
    test1,tes2 用户运行 cvs ls 的时候,只能看见 testa
    test3,tes4 用户运行 cvs ls 的时候,只能看见 testb
    而 cvsadmin 用户,可以看见全部的 Repository(cvsroot,testa,testb)

    15   *** 完成,可以测试实验的结果了

    ********
    * 备注*
    *******

    1. 基本概念介绍
    refers to
    http://www.guoly.com/wincvs-guide.html

        CVS是很早的时候在Unix下发展起来的,它使用的术语比较特殊,需要先熟悉和理解,这是使用CVS的第一步。
    1.1 Repository: 中文名称:仓库。它是 CVS服务器(可能在远程,也可能在本地)的根目录,我们所有的工作都保存在这个仓库中,包括源代码和这些代码的全部历史。你可以把Repository想像成一个仓库,仓库中有许多“木桶”,每个“木桶”就
    是我们的一个让CVS管理起来的工程。对于CVS来说,这些“木桶”之间是没有什么关联的,删除一个“木桶”不会影响别的“木桶”。我们所想像的木桶,在CVS术语中,又叫模块(Module)。
    1.2 Module:中文名称:模块。就是上面我们所想像的仓库中的“木桶”,里面放的是一个项目的所有文件(包括源代码,文档文件,资源文件等等)。在物理上,Module是CVS服务器根目录下的第一级子目录。
    1.3 Import:中文名称:导入。我们本地有一个软件项目,里面有许多各种类型的文件,都需要用CVS进行版本管理,那么第一步就是把这个软件项目的整个目录结构都Import到CVS的仓库中去。经过这种导入,CVS将为你的项目创建一个新的“木桶”----Module,即模块。
    1.4 Checkout:中文名称:导出。指将仓库中的一个“木桶”(Module, 模块)中的东西导出到本地的工作目录下,然后我们可以在WinCvs的管理下,进行工作,修改其中的内容。
    1.5 Commit:中文名称:提交修改。我们在本地的工作目录下,对工程中的文件进行修改,这些修改,需要提交给CVS的仓库,这个过程,就叫Commit。你可以Commit一个文件,也可以Commit整个目录。
    1.6 Update:中文名称:同步。它与Commit相对应,是从仓库中的“木桶”(模块)中下载你同事修改过的文件(别忘记你的项目有许多人共同参与),如果这个文件在你本地也有,就会更新本地的拷贝,如果你本地没有,就会把新文件下载到你的本地。
    1.7 Revision:中文名称:文件版本。这是CVS中一个需要特别注意的概念,它指的是单个文件的版本,而不是整个项目的版本。基本上,单个文件每次的修改,经过Commit之后,它的Revision都要改变一次,比如从1.1到1.2到1.3等等。特别要注意,单个文件的版本(Revision)与整个工程产品的版本(Version,或者Release)可以没有任何关系。例如,整个产品现在发行1.0版本(Version 1.0)了,但是产品的源代码文件中,有的文件版本(Revision)可能是1.9, 有的是2.1,等等。这很容易理解,因为为了发行产品V1.0,我们需要对源代码进行多次修改编译。
    1.8 Release:中文名称:发行版本。整个产品的版本,例如VC5.0, VC6.0等。
    1.9 Tag:中文名称:标签。在一个开发的特定期,对一个文件或者多个文件给的符号名,一般是有意义的字符串,如 “stable”,“release_1_0”等。比如,我们对某个文件的1.5版本加上标签:“memory_bug_fixed”,借助这个有意义的标签,我们可以理解1.5版本解决了内存Bug,所以说Tag赋予了版本一些文字含义。
    上述这些基本概念,与其它的版本控制工具(例如Microsoft Source Safe)有一定的差异,建议您仔细体会。


    2. cvsroot 文件介绍
    举例 :exmple
    .#exmple   以 .# 开头的文件是备份文件,不能被 checkout
    exmple,v   以 ,v 结尾的文件:此文件记录了文件的各次版本变化的历史记录,cvs 根据此文件,进行版本控制。
    exmple     该文件记录真正的文件内容,在进行 cvs 命令操作的时候,和 exmple,v 一起作为 cvs 版本控制的依据。

    3. cvs 命令
    cvs help
    # 列出所有命令
    cvs --help command
    # 查看某个命令的语法

    命令简写
    http://www.mobilefish.com/developer/cvsnt/cvsnt.html


    *************
    * refers to *
    *************


    http://blog.csdn.net/lonelyegg/
    http://www.mobilefish.com/developer/cvsnt/cvsnt.html
    http://blog.csdn.net/jdskyy/archive/2005/10/18/508567.aspx
    http://www.8848software.com/scmforum/forum.asp?FORUM_ID=49&CAT_ID=9
    (一个讨论论坛)

    *******
    * faq *
    *******
    1.
    关于登陆CVSNT server 出现信息 :
    Error reading from server xxxx: -1: Unknown error
    的解释

    一般是无法链接到 CVSNT server ,是通讯受到阻止的原因。
    排查一下原因:
    查看本机的防火墙;
    局域网中的端口限制。

    ***********
    * 遗留问题*
    ***********

    1. 其他的登陆协议的登陆方法

    2. 访问权限控制,如何让 owner 拥有其所在 Repository 的 fileattr.xml 修改权限?
    这样,Repository 的创建者就拥有其维护权限了,减轻了 CVSNT Server 管理员的权限。如果 Repository 有很多个的话,仅靠管理员来维护是不现实的。
    control

  • 程序中的接口

    2009-10-10 11:57:08

    典型的例子,就是 订阅者模式

    消息发布者 怎么能每次发布消息,都能正确 发到 订阅者手上呢,因为
    首先有一个接口,比如叫 interface a{},其有一个空方法 比如 function a_xyz();
    之后,订阅者们 全要实现这一接口,也就是把空方法 a_xyz();自己填充满
    之后,发布者 每次只要执行
    $订阅者1->a_xyz('新消息');
    $订阅者2->a_xyz('新消息');
    ……
    这样遍历一下就可以了

    如果没有这个接口 a{}和里面的 空方法 function a_xyz();会怎么样呢?

    从代码层次看,由于没有规范每个订阅者,一定要实现 a_xyz()方法,那么发布者只能这样执行
    $订阅者1->ab1('新消息');
    $订阅者2->c2de('新消息');
    $订阅者3->fgk('新消息');
    ……
    完全无规则的,调用各个订阅者的,不同方法,
    这太困难了,这要求 发布者,必须 知道 那么多订阅者不同的方法名,这是匪夷所思的
    所以在代码层次看,接口的作用,就是需要知道方法名称

    从编程层次看,不使用接口,
    但是,我让每个$订阅者,在编码细节的时候,都具备同一方法,比如 function kkk(),然后,
    $订阅者1->kkk('新消息');
    $订阅者2->kkk('新消息');
    ……
    这样不行吗?
    行啊,但是,这种编程,是适合一个人,随心所欲的,不计效率,想到哪写到哪改到哪的方式
    不适合,多人,在规定时间,规定地点,按规范完成任务
    所以,在编程层次看,接口的作用,是一种规范/契约,要求每个编程的人遵守

    从设计层次看,不使用接口,
    请问,那么如何表达出来,上面这种设计模式呢?
    每一种设计模式,都是一个范式,抽象的范式,
    这些范式,都是把现实生活中的物件,以及物件间的关系,经过迭代梳理后,抽象出来的,也就是归纳总结
    这种总结到理论的东西,难道还要这样写
    $订阅者1->kkk('新消息');
    $订阅者2->kkk('新消息');
    ……
    奥,这好像就是说,所以每个订阅者吗,都需要有一个同样的方法名,这样子的话,好像就好一点,是不是这样啊
    这样来让人猜?
    所以,在设计层次看,接口的作用,是为了表达 抽象的设计

    抽象的设计有什么用,复用,和开闭原则
    复用有什么用,减少 设计的工作量阿
    开闭原则有什么用,在设计层次上,更好的维护升级
    所以,复用 和开闭原则,说的都是设计,而不是细节代码,
    这谁说的,给我拖出去打死为止……

    接口衍生出来各种各样设计,
    订阅者模式,也是典型的控制反转ioc,
    还有像面向切面设计,依赖注入设计,23种设计模式,都和接口/虚类相关

    最简单的,从最低层去理解,接口,就是需要知道一个名字,因为不知道名字,什么都干不了,
    但是,这个名字,不能是细节编码的时候,那时想出来的,
    必须是设计的时候,先定义好的,才能达到抽象,范式,才好去复用/维护升级 设计
  • 小的细节记录-sql模糊匹配中含有变量

    2009-09-29 18:13:43

    use lianxi
    GO

    DECLARE @Key VARCHAR(200)
    DECLARE TmpCursor CURSOR FOR SELECT K
                  FROM HZ
    OPEN TmpCursor
    FETCH NEXT FROM TmpCursor INTO @Key
    WHILE (@@FETCH_STATUS=0)
    BEGIN
        DECLARE @Tmp VARCHAR(200)
        SELECT @Tmp = (SELECT count(*) FROM  POI where poi like '%'+@key+'%'
         print @key+'#'+@Tmp              
        FETCH NEXT FROM TmpCursor INTO @Key
    END
    CLOSE TmpCursor
    DEALLOCATE TmpCursor 

    其中:红色部分的格式为要注意的细节,在模糊匹配中如果含有变量,用,分开,print如果想将两个值打印在同一行可以用+连接。

  • apache tomcat

    2009-08-17 12:04:28

    apache tomcat

      联系:
      Apache是普通服务器,本身只支持html即普通网页。不过可以通过插件支持php,还可以与Tomcat连通(单向Apache连接Tomcat,就是说通过Apache可以访问Tomcat资源。反之不然)。Apache只支持静态网页,但像asp,php,cgi,jsp等动态网页就需要Tomcat来处理。 Apache和Tomcat整合使用:如果客户端请求的是静态页面,则只需要Apache服务器响应请求;如果客户端请求动态页面,则是Tomcat服务器响应请求;因为jsp是服务器端解释代码的,这样整合就可以减少Tomcat的服务开销 。
      Apache和Tomcat是独立的,在通一台服务器上可以集成。
      区别:
      Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展。 Apache和Tomcat都可以做为独立的web服务器来运行,但是Apache不能解释java程序(jsp,serverlet)。
      两者都是一种容器,只不过发布的东西不同:Apache是html容器,功能像IIS一样;Tomcat是jsp/servlet容器,用于发布jsp及java的,类似的有IBM的webshere、EBA的Weblogic,sun的JRun等等。
      打个比方:Apache是一辆卡车,上面可以装一些东西如html等。但是不能装水,要装水必须要有容器(桶),Tomcat就是一个桶(装像Java这样的水),而这个桶也可以不放在卡车上。
      Apache是世界使用排名第一的Web服务器。它可以运行在几乎所有广泛使用的计算机平台上。
      Apache 源于 NCSAhttpd服务器,经过多次修改,成为世界上最流行的Web服务器软件之一。Apache取自“a patchy server”的读音,意思是充满补丁的服务器,因为它是自由软件,所以不断有人来为它开发新的功能、新的特性、修改原来的缺陷。Apache的特点是简单、速度快、性能稳定,并可做代理服务器来使用。Apache对Linux的支持相当完美。
      Apache有多种产品,可以支持SSL技术,支持多个虚拟主机。Apache是以进程为基础的结构,进程要比线程消耗更多的系统开支,不太适合于多处理器环境,因此,在一个Apache Web站点扩容时,通常是增加服务器或扩充群集节点而不是增加处理器。到目前为止Apache仍然是世界上用的最多的Web服务器,市场占有率达60%左右。世界上很多著名的网站如Amazon.com、Yahoo!、W3 Consortium、Financial Times等都是Apache的产物,它的成功之处主要在于它的源代码开放、有一支开放的开发队伍、支持跨平台的应用(可以运行在几乎所有的Unix、 Windows、Linux系统平台上)以及它的可移植性等方面。
      Apache的诞生极富有戏剧性。当NCSA WWW服务器项目停顿后,那些使用NCSA WWW服务器的人们开始交换他们用于该服务器的补丁程序,他们也很快认识到成立管理这些补丁程序的论坛是必要的。就这样,诞生了Apache Group,后来这个团体在NCSA的基础上创建了Apache。如果你准备选择Web服务器,毫无疑问Apache是你的最佳选择。
      Tomcat是一个开放源代码、运行servlet和JSP Web应用软件的基于Java的Web应用软件容器。Tomcat Server是根据servlet和JSP规范进行执行的,因此我们就可以说Tomcat Server也实行了Apache-Jakarta规范且比绝大多数商业应用软件服务器要好。
      Tomcat是Java Servlet 2.2和JavaServer Pages 1.1技术的标准实现,是基于Apache许可证下开发的自由软件。Tomcat是完全重写的Servlet API 2.2和JSP 1.1兼容的Servlet/JSP容器。Tomcat使用了JServ的一些代码,特别是Apache服务适配器。随着Catalina Servlet引擎的出现,Tomcat第四版号的性能得到提升,使得它成为一个值得考虑的Servlet/JSP容器,因此目前许多WEB服务器都是采用Tomcat。
      **JSP=Java Server Pages (Java服务器网页)
      **ASP=Active Server Pages (活动服务器网页)
      **CGI=Common Gateway Interface (通用网关接口)
      **J2EE=Java 2 Platform, Enterprise Edition (Java2平台,企业版)
      **XML=eXtensible Markup Language (扩展标记语言)
      **IIS=Internet Information Server (互联网信息服务器)
  • tomcat相关用户配置

    2009-08-17 10:58:41

    手动安装的tomcat没有生成admin跟manager用户,要进入tomcat的admin管理界面必须自己手动添加.

    打开tomcat安装目录下的conf/tomcat-users.xml文件,在<tomcat-users>和</tomcat-user>中间添加:

    <role rolename="manager"/>
    <role rolename="admin"/>

    <user username="manager" password="tomcat" roles="manager"/>
    <user username="admin" password="tomcat" roles="admin"/>

    其中user字段中的username和password就是你的用户名跟密码,添加完成后就可以用这个用户名跟密码登录tomcat的admin以及manager页面了.

    http://localhost:8080/admin
    http://localhost:8080/manager

  • Linux中硬链接与软连接

    2009-08-17 10:44:54

    1. 使用方法:ln [option] source_file dist_file
                        -f 建立时,将同档案名删除.
                        -i 删除前进行询问.
                        ln -s abc cde 建立abc 的软连接
                        ln abc cde 建立abc的硬连接,

    2. 软链接与硬链接的区别(通俗):
                        硬链接可认为是一个文件拥有两个文件名;而软链接则是
                         系统新建一个链接文件,此文件指向其所要指的文件

    3. 软链接与硬链接的区别(讲解):

    首先要弄清楚,在Linux系统中,内核为每一个新创建的文件分配一个Inode(索引结点),每个文件都有一个惟一的inode号。文件属性保存在索引结点里,在访问文件时,索引结点被复制到内存在,从而实现文件的快速访问。

    链接是一种在共享文件和访问它的用户的若干目录项之间建立联系的一种方法。Linux中包括两种链接:硬链接(Hard Link)和软链接(Soft Link),软链接又称为符号链接(Symbolic link)。

    一、硬链接

    硬链接说白了是一个指针,指向文件索引节点,系统并不为它重新分配inode。可以用:ln命令来建立硬链接。

    语法:

    ln [options] existingfile newfile
    ln[options] existingfile-list directory

    用法: 第一种:为”existingfile”创建硬链接,文件名为”newfile”。第二种:在”directory”目录中,为” existingfile-list”中包含的所有文件创建一个同名的硬链接。常用可选[options] –f 无论”newfile”存在与否,都创建链接。-n 如果”newfile”已存在,就不创建链接。


           二、软链接(符号链接)

    软链接克服了硬链接的不足,没有任何文件系统的限制,任何用户可以创建指向目录的符号链接。因而现在更为广泛使用,它具有更大的灵活性,甚至可以跨越不同机器、不同网络对文件进行链接。

    建立软链接,只要在ln后面加上选项 –s
Open Toolbar