发布新日志

  • linux ulimit 正确配置(转)

    2013-12-20 09:52:41

    linux ulimit 正确配置(转)

    正确配置Linux系统ulimit值的方法

    在Linux下面部署应用的时候,有时候会遇上Socket/File: Can’t open so many files的问题;这个值也会影响服务器的最大并发数,其实Linux是有文件句柄限制的,而且Linux默认不是很高,一般都是1024,生产服务器用其实很容易就达到这个数量。下面说的是,如何通过正解配置来改正这个系统默认值。因为这个问题是我配置Nginx+php5时遇到了,所以我将这篇归纳进nginx+apache篇。

    查看方法

    我们可以用ulimit -a来查看所有限制值
    [root@centos5 ~]# ulimit -a
    core file size          (blocks, -c) 0
    data seg size           (kbytes, -d) unlimited
    max nice                        (-e) 0
    file size               (blocks, -f) unlimited
    pending signals                 (-i) 4096
    max locked memory       (kbytes, -l) 32
    max memory size         (kbytes, -m) unlimited
    open files                      (-n) 1024
    pipe size            (512 bytes, -p) 8
    POSIX message queues     (bytes, -q) 819200
    max rt priority                 (-r) 0
    stack size              (kbytes, -s) 10240
    cpu time               (seconds, -t) unlimited
    max user processes              (-u) 4096
    virtual memory          (kbytes, -v) unlimited
    file locks                      (-x) unlimited||<

    其中 "open files (-n) 1024 "是Linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的SOCKET数量,可影响MySQL的并发连接数目)。这个值可用ulimit命令来修改,但ulimit命令修改的数值只对当前登录用户的目前使用环境有效,系统重启或者用户退出后就会失效(在布署Nginx+FastCGI我就遇到这个问题,将ulimit -SHn 65535放到/etc/rc.d/rc.local也没起什么作用)

    系统总限制是在这里,/proc/sys/fs/file-max。可以通过cat查看目前的值,修改/etc/sysctl.conf 中也可以控制。

    另外还有一个,/proc/sys/fs/file-nr,可以看到整个系统目前使用的文件句柄数量。

    查找文件句柄问题的时候,还有一个很实用的程序lsof。可以很方便看到某个进程开了那些句柄,也可以看到某个文件/目录被什么进程占用了。

    修改方法
    若要令修改ulimits的数值永久生效,则必须修改配置文档,可以给ulimit修改命令放入/etc/profile里面,这个方法实在是不方便,还有一个方法是修改/etc/sysctl.conf。我修改了,测试过,但对用户的ulimits -a 是不会改变的,只是/proc/sys/fs/file-max的值变了。

    我认为正确的做法,应该是修改/etc/security/limits.conf
    里面有很详细的注释,比如
    * soft   nofile   32768
    * hard nofile 65536
    就可以将文件句柄限制统一改成软32768,硬65536。配置文件最前面的是指domain,设置为星号代表全局,另外你也可以针对不同的用户做出不同的限制。

    注意:这个当中的硬限制是实际的限制,而软限制,是warnning限制,只会做出warning;其实ulimit命令本身就有分软硬设置,加-H就是硬,加-S就是软
    默认显示的是软限制,如果运行ulimit命令修改的时候没有加上的话,就是两个参数一起改变。

    生效
    因为我平时工作最多的是部署web环境(Nginx+FastCGI外网生产环境和内网开发环境),重新登陆即可(reboot其实也行)我分别用root和www用户登陆,用ulimit -a分别查看确认,做这之前最好是重启下ssh服务,service sshd restart。
    博客地址:【爱开卷360】http://www.cnblogs.com/ibook360

  • 复杂的sql

    2013-12-18 17:39:33

    §7.1   复杂查询语句的使用

    使用SELECT语句和子查询(SUBQUERY)可以从一个或多个表、视图、实体视图中返回数据。

    §7.1.1  相关子查询

        可以将子查询(前面提到的 as subquery )或In exists当成 where 的一个条件的一部分,这样的查询称作子查询。

     

    l  where中可以包含一个select语句子查询;

    l  where中可以包含IN, EXISTS 语句;

    l  最多可嵌套16层;

    l  层数过多会影响性能。

     

    例:比如一个查询是否有专家既以研究所的名义申请基金项目又以大学系为单位申请项目(按规定只能以一个单位来申请):

     

    SQL>select name,per_id,dept_name from univ_subjects

    Where per_id in  ( select  per_id  from colle_subjects );

     

    §7.1.2  外连接

        招生中,如果所有学生的信息放在 students 表中,而部分有特长的学生在另一个表student_skill 中同样有该学生信息。现在要全部列出所有学生,如果某个学生在表student_skill 中有其特长信息,就显示特长内容,如果某个学生没有特长(在表student_skill 中无其特长信息)就显示特长为空:

    SQL>select a.st_id, name, age,skill from students  a, student_skill b

    Where a.st_id=b.st_id(+)

    Order by a.name;

     

    Students 结构为:

    St_id  varchar(20),

    Name varchar2(10),

    Age   number(2),

    Tot_score   number(3),

    ... ...

     

    Student_skill 结构为:

    St_id  varchar(20),

    Skill   varchar2(20),

    ... ...

    Students 的记录,Student_skill的记录少。上面的“+”跟在记录少的表后面,它表示当没有与a.st_id 匹配时就为 b.st_id增加一空行。

    +号在左边表示右关联,在右边表示左关联

     

    St_id          name          tot_score    skill

    ----------  ----------    -------------  ------------------

    1111     aaaa        600               足球

    2222     bbbb        590               篮球

    3333     cccc        620                    

    4444     dddd        610               跳高

    ...  ...

     

    §7.1.3  自我连接

    自我连接是在同一个表或视图内进行条件连接。下面语句返回的是每个雇员的名字及该雇员的经理的名字:

     

    SELECT e1.ename||’ works for ’||e2.ename

    "Employees and their Managers"

    FROM emp e1, emp e2 WHERE e1.mgr = e2.empno;

     

    Employees and their Managers

    -------------------------------

    BLAKE works for KING

    CLARK works for KING

    JONES works for KING

    FORD works for JONES

    SMITH works for FORD

    ALLEN works for BLAKE

    WARD works for BLAKE

    MARTIN works for BLAKE

    SCOTT works for JONES

    TURNER works for BLAKE

    ADAMS works for SCOTT

    JAMES works for BLAKE

    MILLER works for CLARK

     

    连接条件是 e1.mgr = e2.empno

     

     

    §7.1.4  UNION,INTERSECTMINUS

    有时需要从多个表中组合具有一种相似类型的信息。Union 可以完成将两个以上的表的相类似的查询结果合并在一起,并且相同的只取其一;如果union all 则表示返回所有行(不管是否重复)。Intersect返回在两个表中都有相同内容的信息。Minus 则返回只在一个表中出现的信息。

     

    1. 语法:

    select ...

    union[all]

    select ...

     

    select ...

    intersect

    select ...

     

    select ...

    minus

    select ...

     

    例:

    sql>

       select sum(balance) into lf_return from

         (

    select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance

             from per_fix_det

             where acc_no=as_acc_no

           union all

    select sum(nvl(tran_val,0)*decode(db_cr_flag,'1',1,'0',-1,0) ) balance

              from per_detail

              where acc_no=as_acc_no

         );

     

    列出有特长的考生(在表students,student_skill 同时出现):

    sql>select name from sutdents

          intersect

         select name from  student_skill;

     

    列出没有特长的考生(仅在表students出现):

    sql>select name from sutdents

          minus

         select name from  student_skill;

  • group by... having

    2013-12-18 16:25:10

    1.以用 GROUP By 来实现对一组数进行分组统计(如SUM,count(*) 等),如:

     

    要列出部门代码、部门人数,部门工资总和,则用到GROUP BY

     

    SQL> select deptno,count(*) ,sum(sal) from emp group by deptno;

     


    2.在分组GROUP BY 中,一般都不管 统计的结果是多少都要全显示,我们可以在GROUP BY 前或后加 HAVING 子句来限制结果的统计,比如要求被统计的人数有5个人以上,则有两方法可以实现:

     

    SQL> select deptno,count(*) ,sum(sal) from emp group by deptno

      having count(*)>=5;

    或者

    select deptno,count(*) ,sum(sal) from emp having count(*)>=5 group by deptno

    没有包含聚合函数的,having 条件要放在group by 后面


    聚合函数指:

      

     



     

     

     

  • linux系统批量修改文件内容的命令

    2013-12-13 17:17:41

    批量修改文件内容的linux命令:
    :1,$s/替换前的内容/替换后的内容/g
    1表示从第一行开始
    /g表示一行有多项替换前内容的情况

  • Web_reg_find()函数的使用

    2013-10-17 17:06:09

    下面是51testing上网友总结的,在LR的帮助文档中,也有详尽的描述。

    1. 将脚本切换到树结构,在page view页面上找到你要check的文本内容, 并执行鼠标邮件,选择copy selection.

    2. 将脚本切换回代码界面, 在光标闪烁的上行,添加如下的代码:

    备注:光标闪烁的上行: 若光标闪烁行为第10行,那光标闪烁的上行为第9行。

    添加的代码根据你检查的方式不同而不同, 你可以选择其中之一即可。

     

    代码一:

    web_reg_find("Text=Payment Details",LAST);

    代码思路:

    1."Payment Details" 为你要检查的文本;

    2. 脚本执行到此处,若在页面上找到了这几个字符串,那脚本继续执行下去;若没有找到,脚本将在此报错并且结束。

      

    代码二:

    web_reg_find("Text=Payment Details", "SaveCount=para_count", LAST); //check 的函数

    web_submit_form("reservations.pl_2", //要check的页面的录制时的代码

    "Snapshot=t22.inf",

    ITEMDATA,

    "Name=outboundFlight", "Value=003;0;06/23/2007", ENDITEM, 

    "Name=reserveFlights.x", "Value=61", ENDITEM,

    "Name=reserveFlights.y", "Value=2", ENDITEM,

    LAST);

    if (atoi(lr_eval_string("{para_count}"))>0) //验证是否找到了页面上的要检查的字符串

    lr_output_message("we find the string!");

    else

    lr_output_message("sorry,don't find the string!");

    代码思路:

    1."Payment Details" 为你要检查的文本;

    2. 脚本执行到此处,不管页面上是否存在你要检查的字符串,脚本都不会报错,而是执行下去。

    3. 此段代码将找到的你要检查的字符串的个数,存为一个参数。 然后在页面代码的后面,通过检查这个参数的值是否大于0,来判断是否找到了你所要检查的字符串。

     

    代码三:

    A. web_reg_find("Text=Payment Detdils", "Fail=NotFound",LAST);或者

    B. web_reg_find("Text=Payment Detdils", "Fail=Found",LAST);

    代码思路:

    1."Payment Details" 为你要检查的文本;

    2. 若是A代码:脚本执行到此处,若没有找到check的字符串,脚本将FAIL, 并且停止执行下去。反之,则一直执行下去。

    3. 若是B代码:脚本执行到此处,若找到check的字符串,脚本将FAIL, 并且停止执行下去。反之,则一直执行下去。

  • QTP中的同步等待方式

    2013-03-19 10:36:44

      在自动化测试中,往往会遇到这样一种情况,当点击了一个链接或按钮之后,脚本马上报错,说是没有找到对象。这其实不是对象不存在的问题,而是在脚本中没有增加同步点。在一些Web网站中,当点击了链接或按钮后经常会跳转到一个新的页面,而这个页面需要一定的加载时间,但这个时候QTP已经执行下一行语句了,在这个页面还没有加载完的情况下就去寻找下一步需要操作的对象,那自然是会出错的了。因此,我在这里总结了几种同步方式。


    1. QTP设置中的默认等待时间

            通过QTP菜单在File --> Settings --> Run 选项中进行设置,如图所示。

            设置了对象同步超时时间后,QTP在运行脚本时会根据对象的属性去搜索这个对象,如果超出了所设的时间仍未找到对象,才会认为此对象不存在。


    2. Wait

            wait函数的语法结构非常简单,只需在后面加一个时间参数即可。

            使用方法:

    Wait 5
    Browser().Page().Link().Click

            以上代码的意思是先等待5秒再点击某个链接,在这5秒中QTP会暂时停止执行脚本。


    3. Exist

            Exist后也可以像wait一样加时间参数,不过Exist会根据对象的属性判定对象是否存在。

            使用方法:

    With Browser().Page().Link()
        If .Exist(5) Then
            .Click
        End If
    End With

            这里要注意不能直接使用object.Exist(timeout)来同步,因为Exist属性是有一个布尔返回值的,需要配合条件语句。


    4. Sync

            Sync方法是Web中最常用的同步方法,适用于Browser对象和Page对象,作用是自动等待页面完成加载。

            使用方法:

    Browser().Page().Sync


    5. WaitProperty

            WaitPorperty ( PropertyName, PropertyValue, [TimeOut] )

            WaitProperty方法的作用是在TimeOut的时间内等待对象的属性值,如果在规定时间内出现了属性值则执行下一步,否则继续等直到超时。这种方法是我个人比较推荐的一种方法,既稳定又灵活。

            使用方法:

    With Browser().Page().Link()
        If .WaitProperty("text", "登录", 5) Then
            .Click
        End If
    End With

            需要注意的是WaitProperty与Exist一样,都是有返回值的,所以需要与条件语句搭配。

    6.激活窗口AppActive

    set Wshell=CreateObject(Wscript.Shell)
    oWshell.run "notepad"
    while not oWshell.AppActive("无标题-记事本"):Wend
    oWshell.SendKeys "zzzzdddd"
    set Wshell=nothing

  • 测试用例设计

    2012-07-04 18:59:35

    一、等价类划分
        等价类划分主要适用于单个输入条件,输入为数值型的情况,如果输入规定了输入区间,可划分出一个有效等价类,两个无效等价类;如果输入只规定了输入范围,可划分出一个有效等价类,一个无效等价类。
    二、边界值
        边界值
    方法也是适用于单个输入条件的情况,输入类型可以数值、字符等,要测试的边界包括上点、下点、离点。
    三、错误推测法
        错误推测法主要是测试
    设计人员的测试经验相关,测试经验不同,设计出来的测试用例也区别很大。
    四、因果图法
        因果图方法考虑输入的组合,特别适用于多个输入条件相关有关联又相互约束的情况。
        设计步骤:
        1)罗列出输入与输出;
        2)根据输入与输出画出因果图;
        3)标出约束跟限制;
        4)把因果图转化成判定表;
        5)根据判定表的每一列设计测试用例。
    五、判定表驱动法
        判定表适合于解决多个逻辑条件的组合。将各种逻辑的组合罗列出来,避免遗漏。不能表达重复的操作。
        判定表包括条件桩、条件项、动作桩、动作项。
        条件桩:列出所有条件,次序无关;
        条件项:列出所对应条件的所有可能情况下的取值;
        动作桩:列出可能采取的操作,次序无关;
        动作项:列出条件项各种取值情况下采取的操作。
        设计步骤:
        1)确定规则个数,条件及各条件取值的组合;
        2)列出条件桩、动作桩;
        3)列出条件项;
        4)列出动作项;
        5)初始化判定表;
        6)规则简化、合并。
    六、正交法
        当输入条件很多时,因果图等设计方法设计出来的用例数往往多的惊人,用正交法可有效减少用例数。正交法的核心思想是从大量测试数据中选取有代表性的点来测试,从而减少测试用例数。
        设计步骤:
        1)确定因子并画出正交表草图;
        2)填充各因子的状态值;
        3)加权筛选;
        4)根据筛选过的正交表设计测试用例。
    七、功能图法
        功能图法适合于用来设计程序的控制结构的测试用例。有顺序、选择、重复三种控制结构。
        设计步骤:
        1)画出功能图;
        2)生成局部测试用例;
        3)生成测试路径;
        4)合成测试用例。
    八、场景法
        场景法特别适用于控制流清晰的系统。
        设计步骤:
        1)画出程序控制流图(如果不能直接画出控制流图,可先画出程序流程图,再把流程图转换成控制流图);
        2)根据控制流图设计出场景;
        3)根据场景设计测试用例。
        中间可能会要计算环路复杂度V(G),计算公式如下:
        V(G)=e-n+2
        其中e是边的数目,n是结点的数目。

    测试用例设计策略:
        1、任何都要用边界值法;
        2、用等价类划分补充测试用例;
        3、根据测试设计人员经验用错误推测法追加测试用例;
        4、根据程序逻辑追加逻辑测试用例;
        5、根据程序情况,选择使用因果图法设计测试用例。

    测试用例设计步骤:
        1、根据设计规格设计基本的功能测试用例;
        2、边界值测试用例;
        3、状态转换测试用例;
        4、错误推测测试用例;
        5、异常测试用例;
        6、性能测试用例。

        另外还需反复利用八种测试用例设计方法对测试用例进行分解与合并,利用发散思维追加测试用例。

  • Linux 定时器常用命令

    2012-07-04 11:56:07

    常用命令:
    *定时器
      touch test.sh
      crontab -e
      crontab -l
      service crond stop
      service crond start
      30 15 * * * /home/test.sh

    *修改服务器时间:
      
       修改时间:date -s 11:00:00
       修改日期:date -s 081127   (修改为2008-11-27)
  • windows下JBOSS4.2的安装配置说明(1)

    2012-07-04 11:53:40

    一.              下载与安装JBoss

    在本文中,我们下载的JBoss版本为:4.2.1.GA

    下载地址:

    www.jboss.org

    在如上的下载页中下载JBoss-4.2.1.GA.zip文件。

    下载完成后,将其解压缩后即可完成安装,解压缩后将其放置到一个不带空格的目录(若目录带有空格,例如:C:"Program Files,日后可能会产生一些莫名的错误)egE:"JBoss4.2.1。同时在环境变量设置中设置名为JBOSS_HOME的环境变量,值为JBoss的安装路径,如下图所示:

    在此,JBoss的安装工作已经结束,可通过如下方式测试安装是否成功:

    运行JBoss安装目录"bin"run.bat,如果窗口中没有出现异常,且出现:10:16:19,765 INFO [Server] JBoss (MX MicroKernel) [4.2.1.GA (build: SVNTag=JBoss_4_2_1_GA date=200707131605)] Started in 30s:828ms字样,则表示安装成功。

    我们可以通过访问: http://localhost:8080/ 进入JBoss的欢迎界面,点击JBoss Management下的JMX Console可进入JBoss的控制台。

    若启动失败,可能由以下原因引起:

    1              JBoss所用的端口(8080109910988083等)被占用。一般情况下为8080端口被占用(例如,Oracle占用了8080端口),此时需要修改JBoss的端口,方法为进入JBoss安装目录"server"default"deploy"jboss-web.deployer目录,修改其下的server.xml目录,在此文件中搜索8080,将其改成你想要的端口即可(例如8088);

    2              JDK安装不正确;

    3              JBoss下载不完全。

    二.             JBoss 的目录结构说明

    目录

    描述

    bin

    启动和关闭 JBoss 的脚本( run.bat windows 系统下的启动脚本, shutdown.bat windows 系统下的关闭脚本)。

    client

    客户端与 JBoss 通信所需的 Java 库( JARs )。

    docs

    配置的样本文件(数据库配置等)。

    docs/dtd

    JBoss 中使用的各种 XML 文件的 DTD

    lib

    一些 JAR JBoss 启动时加载,且被所有 JBoss 配置共享。(不要把你的库放在这里)

    server

    各种 JBoss 配置。每个配置必须放在不同的子目录。子目录的名字表示配置的名字。 JBoss 包含 3 个默认的配置: minimial default all ,在你安装时可以进行选择。

    server/all

    JBoss 的完全配置,启动所有服务,包括集群和 IIOP

    server/default

    JBoss 的默认配置。在没有在 JBoss 命令行中指定配置名称时使用。 ( 我们下载的 4.2.1 版本默认采用此配置 )

    server/default/conf

    JBoss 的配置文件。

    server/default/data

    JBoss 的数据库文件。比如,嵌入的数据库,或者 JBossMQ

    server/default /deploy

    JBoss 的热部署目录。放到这里的任何文件或目录会被 JBoss 自动部署。 EJB WAR EAR ,甚至服务。

    server/default /lib

    一些 JAR JBoss 在启动特定配置时加载他们。 (default minimial 配置也包含这个和下面两个目录。 )

    server/default/log

    JBoss 的日志文件。

    server/default/tmp

    JBoss 的临时文件。

    三.             JBoss 的配置

    1.       日志文件设置

    若需要修改JBoss默认的log4j设置,可修改JBoss安装目录"server"default"conf下的jboss-log4j.xml文件,在该文件中可以看到,log4j的日志输出在JBoss安装目录"server"default"log下的server.log文件中。对于log4j的设置,读者可以在网上搜索更加详细的信息。

    2.       web 服务的端口号的修改

    这点在前文中有所提及,即修改JBoss安装目录"server"default"deploy"jboss-web.deployer下的server.xml文件,内容如下:

    <Connector port="8080" address="${jboss.bind.address}"   

             maxThreads="250" maxHttpHeaderSize="8192"

             emptySessionPath="true" protocol="HTTP/1.1"

             enableLookups="false" redirectPort="8443" acceptCount="100"

             connectionTimeout="20000" disableUploadTimeout="true" />

    将上面的8080端口修改为你想要的端口即可。重新启动JBoss后访问:http://localhost/:新设置的端口,可看到JBoss的欢迎界面。

    3.       JBoss 的安全设置

    1 jmx-console 登录的用户名和密码设置

    默认情况访问 http://localhost:8080/jmx-console 就可以浏览jboss的部署管理的一些信息,不需要输入用户名和密码,使用起来有点安全隐患。下面我们针对此问题对jboss进行配置,使得访问jmx-console也必须要知道用户名和密码才可进去访问。步骤如下:

    i) 找到JBoss安装目录/server/default/deploy/jmx-console.war/WEB-INF/jboss-web.xml文件,去掉<security-domain>java:/jaas/jmx-console</security-domain>的注释。修改后的该文件内容为:

    <jboss-web>

       <!-- Uncomment the security-domain to enable security. You will

          need to edit the htmladaptor login configuration to setup the

          login modules used to authentication users.-->

          <security-domain>java:/jaas/jmx-console</security-domain>

    </jboss-web>

    ii)修改与i)中的jboss-web.xml同级目录下的web.xml文件,查找到<security-constraint/>节点,去掉它的注释,修改后该部分内容为:

    <!-- A security constraint that restricts access to the HTML JMX console

       to users with the role JBossAdmin. Edit the roles to what you want and

       uncomment the WEB-INF/jboss-web.xml/security-domain element to enable

       secured access to the HTML JMX console.-->

       <security-constraint>

         <web-resource-collection>

           <web-resource-name>HtmlAdaptor</web-resource-name>

           <description>An example security config that only allows users with the

             role JBossAdmin to access the HTML JMX console web application

           </description>

           <url-pattern>/*</url-pattern>

           <http-method>GET</http-method>

           <http-method>POST</http-method>

         </web-resource-collection>

         <auth-constraint>

           <role-name>JBossAdmin</role-name>

         </auth-constraint>

       </security-constraint>

       在此处可以看出,为登录配置了角色JBossAdmin

    iii在第一步中的jmx-console安全域和第二步中的运行角色JBossAdmin都是在login-config.xml中配置,我们在JBoss安装目录/server/default/config下找到它。查找名字为:jmx-consoleapplication-policy

    <application-policy name = "jmx-console">
           <authentication>
              <login-module code="org.jboss.security.auth.spi.UsersRolesLoginModule"
                 flag = "required">
               <module-option name="usersProperties">props/jmx-console-users.properties</module-option>
               <module-option name="rolesProperties">props/jmx-console-roles.properties</module-option>
              </login-module>
           </authentication>
        </application-policy>

    在此处可以看出,登录的角色、用户等的信息分别在props目录下的jmx-console-roles.propertiesjmx-console-users.properties文件中设置,分别打开这两个文件。

    其中jmx-console-users.properties文件的内容如下:

    # A sample users.properties file for use with the UsersRolesLoginModule

    admin=admin

    该文件定义的格式为:用户名=密码,在该文件中,默认定义了一个用户名为admin,密码也为admin的用户,读者可将其改成所需的用户名和密码。

    jmx-console-roles.properties的内容如下:

    # A sample roles.properties file for use with the UsersRolesLoginModule

    admin=JBossAdmin, HttpInvoker

    该文件定义的格式为:用户名=角色,多个角色以“,”隔开,该文件默认为admin用户定义了JBossAdminHttpInvoker这两个角色。

  • JBOSS常用配置文件的路径

    2012-07-04 11:52:24

    JBOSS常用配置文件的路径   
     为了描述方便,以下描述将以JBOSS3.2.6版本,default配置为例,如果你以别的配置启动,则在对应的目录下寻找或配置相关文件。

    1、相关DTD定义文件位于$JBOSS-HOME/docs/dtd,在其下的文件中可以查阅某个XML配置文件中某个元素或属性的意义。
    2、数据源配置文件的路径,$JBOSS-HOME/server/default/deploy,文件格式必须是*-ds.xml的样式。不同的数据库配置参数可参考$JBOSS-HOME/docs/examples/jca/下的示例文档。有关参数的细节在下面会有一定的描述。

    3、公共的jar包我们可以放在$JBOSS-HOME/server/default/lib下,如数据库的JDBC jar,log4j.jar等,如果这些JAR已经在该lib下放置了,那么我们的应用WEB-INF/lib下不应该再放置,否则JBOSS也会将他们再一次加载,白白占用内存。

    4、配置日志的文件,log4j.xml位于$JBOSS-HOME/server/default/conf下,具体配置下文还会有一点介绍

    5、$JBOSS-HOME/server/default/work下存放的是JSP编译后的.java及.class文件,如果调试JSP时出错了,可以到该目录下(一级级去翻吧)去找对应的文件,调试问题。还有个小TIPS,有时我们明明把一个JSP更新到对应的目录里了,可是去刷新页面时,内容还是旧的,为了解决该问题,我们可以到work目录下,将对应的.java及.class文件删了,再刷新即可,这个原因不好推测,有时可以自动刷新,有时不行。单个的TOMCAT都能自动刷新,不知为何集成到JBOSS里却有时不行。还需注意的事,你在清除旧的java、class文件时,不能为了省事,而直接删除目录,否则刷新时会报错的,等着你的就是要重启JBOSS服务了。

    6、$JBOSS-HOME/server/default/log下存放的是日志文件,默认的log4j.xml配置是将日志输出到该文件夹下的server.log文件,可以去查看信息进行调试。

    7、我们的应用一般部署在$JBOSS-HOME/server/default/deploy/jbossweb-tomcat50.sar/下,建个TestCrm.war目录,把我们的整个应用部署在该.war目录下,这样JSP、Servlet将由tomcat引擎来解析处理。

    8、配置应用的WEB服务的端口号及参数。

    JBOSS3.2.6是在…./ deploy/jbossweb-tomcat50.sar/server.xml中,自己找8080,修改为你想设定的端口即可。
    JBOSS3.2.3是在…/default/deploy/jbossweb-tomcat41.sar/META-INF/jboss-service.xml中配置。

  • SQL 语句

    2012-07-04 11:48:41

    select * from hrb_today_news order by id desc limit 1 查数据库表最后一条数据
  • Linux 性能命令

    2012-07-04 11:46:37

    查看内存命令:free
    ----------------------------------------------------------------------------
           total       used       free     shared    buffers     cached
    Mem:       2070108    1933192     136916          0      38512     916196
    -/+ buffers/cache:     978484    1091624
    Swap:      2031608        208    2031400
    ------------------------------------------------------------------------
    total:总计物理内存的大小。
    used:已使用多大。
    free:可用有多少。
    Shared:多个进程共享的内存总额。
    Buffers/cached:磁盘缓存的大小。
    第三行(-/+ buffers/cached):
    used:已使用多大。
    free:可用有多少。
    说明:第二行是从OS角度看的
    第三行是从应用程序角度看的,从应用程序角度来看,对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
    所以从应用程序的角度来说,可用内存=系统free memory+buffers+cached.
    buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
    cached是用来给文件做缓冲。
    那就是说:buffers是用来存储,目录里面有什么内容,权限等等。
    而cached直接用来记忆我们打开的文件
    free 使用:free -s 1 (间隔1秒打印一次内存数据) free -m 以MB为单位显示内存使用情况  free -t 显示总内存量
    ****************************************************************************************
    top
    查看当前服务器内核服务的任务,还显示了当前主机状态的统计数据,
  • scp 命令

    2012-07-04 11:38:46

    1.copy远程机器上的档案到本地来
    scp my@www.upsdn.net:/etc/lilo.conf /etc
    会将 http://www.upsdn.net 中 /etc/lilo.conf 档案 copy 到本地的 /etc 目录下。
     
    2.copy 本地的档案到远程的机器上
    scp /etc/lilo.conf my@www.upsdn.net:/home/my
    会将本地的 /etc/lilo.conf 这个档案 copy 到 www.upsdn.net,使用者my 的家目录下。
  • ssh scp 命令不用输密码的设置

    2012-07-04 11:34:35

    ssh, scp 不输入密码
    2009-10-19 17:47

    经常在不同linux机器之间互相scp拷文件,每次总是要输入密码才可行。

    通过ssh-keygen生成公钥,在两台机器之间互相建立信任通道即可。

    假设本地机器client,远程机器为server。

    1. 生成rsa keygen

    [winter@client winter] $ ssh-keygen -b 1024 -t rsa
    Generating public/private rsa key pair.
    Enter file in which to save the key (/home/winter/.ssh/id_rsa): <Enter>
    Enter passphrase (empty for no passphrase): <Enter>
    Enter same passphrase again: <Enter>
    Your identification has been saved in /home/winter/.ssh/id_rsa.
    Your public key has been saved in /home/winter/.ssh/id_rsa.pub.
    The key fingerprint is:
    33:d4:7b:9c:87:04:cf:14:40:22:6d:c7:15:78:97:6a winter@client

    直接上面公钥和私钥存放地址可以直接回车,私钥密码可以直接回车,也可以输入。

    2. 查看.ssh目录下了多私钥和公钥文件

    [winter@client winter] $ ls .ssh/
    id_rsa  id_rsa.pub  known_hosts

    3. 拷贝公钥到目标机器上,并改名成authorized_keys

    [winter@client winter] $ scp .ssh/id_rsa.pub winter@192.168.0.110:/home/winter/.ssh/authorized_keys
    The authenticity of host '192.168.0.110(192.168.0.110)' can't be established.
    RSA key fingerprint is 5b:78:e8:e9:dc:d8:db:bd:f7:66:44:e6:3b:ce:f2:79.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added '192.168.0.110' (RSA) to the list of known hosts.
    winter@192.168.0.110's password: <Enter>
    id_rsa.pub                                                                     100%  221     1.2MB/s   00:00

    首次scp命令时候还是会提示输入密码,还有是否继续链接的提示,以后

    4. 测试ssh进入

    [winter@client winter] $ ssh 192.168.0.110

    5. ok,搞定!

  • QTP CreatObject 大全

    2012-06-27 11:39:18

    ADO对象
    Connection
    Command
    RecordSet
    Record
    Stream


    Server.CreateObject(
    "Scripting.FileSystemObject")
    Server.CreateObject(
    "Scripting.Dictionary")   HashTable
    Server.CreateXObject(
    "Word.Application")    //Server
    ActiveXObject(
    "Word.Application")    //Client
    Server.CreateObject(
    "Excel.Application")   //Server
    ActiveXObject(
    "Excel.Application")    //Client
    CreateObject("PowerPoint.Application")
    Server.CreateObject(
    "Microsoft.XMLHTTP")
    Server.CreateObject(
    "Microsoft.XMLDOM")
    Server.CreateObject(
    "MSXML2.XMLHTTP.4.0")
    Server.CreateObject(
    "WScript.Shell")
    Server.CreateObject(
    "wscript.network"
    Server.CreateObject(
    "MSWC.AdRotator")
    CreateObject("Excel.Sheet")
    MS FrontPage: oFP 
    = CreateObject("FrontPage.Application")
    MS Access: oAccess 
    = CreateObject("Access.Application")
    MS Graph: oGraph 
    = CreateObject("MSGraph.Application")


    CreateObject("PhotoShop.Application")

    CreateObject("SQLDMO.SQLServer")
    CreateObject("SQLDMO.Login")
    CreateObject("SQLDMO.Backup")
    CreateObject("SQLDMO.User")
    Server.CreateObject(
    "SQLDMO.BackupDevice")
    Server.CreateObject(
    "SQLDMO.Database")
    Server.CreateObject(
    "SQLDMO.Restore")

    Server.CreateObject(
    "MSMQ.MSMQQueueInfo")
    CreateObject("MSMQ.MSMQQuery")
    Server.CreateObject(
    "ixsso.Query")
    Server.CreateObject(
    "ixsso.Util")

    AccPac Advantage Corporate: 
    oAccPac
    =CreateObject("ACCPAC.xapiSession")

    AccPac Report Master 
    for Windows: 
    oImpApp
    =CreateObject("Impromptu.Application.30")

    BarTender: 
    oBarTender 
    = CreateObject("BarTender.Application")

    CrystalReports: 
    oCRApplication 
    = createobject ("CrystalRuntime.Application"
    This doesn
    't invoke an IDE actually.

    EUDORA: 
    oEud 
    = CreateObject("Eudora.EuApplication.1")

    FaxMaker: 
    oFax 
    = CREATEOBJECT("fmfaxapi.application")

    GroupWise:
    oGroupWise 
    = CreateObject("NovellGroupWareSession")

    LotusNotes: 
    oNotes 
    = CreateObject("Notes.NotesSession")
    oNotes 
    = CreateObject("Notes.NotesUIWorkspace")
    oNotes 
    = CreateObject("Lotus.Notessession") (Domino 5.0.3)

    MS Common Dialog: 
    oCommmonDialog 
    = CreateObject("MSComDlg.CommonDialog"&& !!! You can't directly create this object without a development licence, so for dynamically doing it on another machine, see below. -- PeterCrabtree

    MS Internet Explorer: 
    oIE 
    = CreateObject("InternetExplorer.Application"
    IEAutomationExample

    MS MapPoint:
    oMapPoint 
    = CreateObject("MapPoint.Application")

    MSN Messenger:
    oMessenger 
    = CREATEOBJECT("MSNMessenger.MessengerApp")

    MS NetMeeting:
    oNetMeeting
    =CREATEOBJECT("netmeeting.app.1")

    MS Outlook: 
    oOutlook 
    = CreateObject("Outlook.Application")

    MS Outlook Express: None 
    - It is not a COM server!

    MS PowerPoint: 
    oPP 
    = CreateObject("PowerPoint.Application")

    MS Project: 
    oProj 
    = CreateObject("msProject.Application")

    MS SourceSafe: 
    oVSS 
    = CreateObject("SourceSafe.0")

    MS Word: 
    oWord 
    = CreateObject("Word.Application")

    MS Visio: 
    oVisio 
    = CreateObject("Visio.Application")


    MS VisualCPlusPlus: (VC
    ++)
    oCpp 
    = CreateObject("MSDev.Application")

    MS VisualFoxpro: 
    oVFP 
    = CreateObject("VisualFoxPro.Application")

    MS WindowsScriptingHost: 
    oWSH 
    = CreateObject("WScript.Shell"

    Novell GroupWise: 
    oGroupWise 
    = CreateObject("NovellGroupWareSession")

    PCAnywhere (host): 
    oPCAHost 
    = CreateObject("WinAWSvr.BeHostDataManager")

    PCAnywhere (remote): 
    oPCARem 
    = CreateObject("WinAWSvr.RemoteDataManager")

    QuickBooks: 
    QBSessionManager 
    = CreateObject("QBFC2.QBSessionManager")

    RationalRose: 
    oRose 
    = CreateObject("Rose.Application")

    TAPIFax: 
    oTAPIFax 
    = CreateObject('FaxServer.FaxServer')

    WindowsShell: 
    oWSH 
    = CreateObject("Shell.Application")

    Windows Media Player: 

    oWMP 
    = CREATEOBJECT("WMPlayer.OCX")
    oPlayList 
    = oWmp.PlaylistCollection.GetAll()
    oWmp.currentPlaylist 
    = oPlayList.Item(0&& Zero based array
    *!* Music starts!

    Windows Messenger: 
    oMessenger 
    = CREATEOBJECT("Messenger.MessengerApp")

    WinFax: 
    oWinFax 
    = CreateObject("WinFax.SDKSend"

    WinPrint : 
    oWinPrint 
    = CreateObject("WinPrint.WinPrintX")

    SQL
    -DMO object
    loSQL 
    = CREATEOBJECT("SQLDMO.Application")

    Others:

    Scripting Shell: 
    oShell 
    = CreateObject("WScript.Shell")

    Scripting Network 
    Object
    oNet 
    = CreateObject("WScript.Network")

    Scripting Regular Expression Parser: 
    oReg 
    = CreateObject("VBScript.RegExp")

    SQL DMO SQL Server: 
    CreateObject("SQLDMO.SQLServer")

     
  • linux LVS负载均衡

    2012-03-27 14:09:58

  • nginx实现负载均衡

    2012-03-27 14:06:05

  • haproxy负载均衡

    2012-03-27 13:54:53

  • nginx +tomcat 实现负载均衡

    2012-03-27 11:59:49

  • rpm命令

    2008-07-11 16:27:01

    1.安装一个包
    # rpm -ivh
    2.升级一个包
    # rpm -Uvh
    3.移走一个包
    # rpm -e
    4.安装参数
    --force 即使覆盖属于其它包的文件也强迫安装
    --nodeps 如果该RPM包的安装依赖其它包,即使其它包没装,也强迫安装。
    5.查询一个包是否被安装
    # rpm -q < rpm package name>
    6.得到被安装的包的信息
    # rpm -qi < rpm package name>
    7.列出该包中有哪些文件
    # rpm -ql < rpm package name>
    8.列出服务器上的一个文件属于哪一个RPM包
    #rpm -qf
    9.可综合好几个参数一起用
    # rpm -qil < rpm package name>
    10.列出所有被安装的rpm package
    # rpm -qa
    11.列出一个未被安装进系统的RPM包文件中包含有哪些文件?
    # rpm -qilp < rpm package name>

241/212>
Open Toolbar