网络日志

8月3日
db2数据库在win2003上的安装
1。创建数据库    例如:db2 create database [数据库名称]using codeset  GBK territory zh_CN
2。数据库参数
    db2 update database cfg for db_name using applheapsz 256  指定每一单个代理程序可用的应用程序堆的大小(以页为单位)。
    UPDATE DATABASE CONFIGURATION FOR DBNAME USING APP_CTL_HEAP_SZ 256;确定应用程序堆的最大大小(以 4 KB 页为单位)。为在代表 MPP 或 SMP 系统中节点上相同应用程序的运行的代理程序间共享信息时需要使用堆。如果应用程序复杂将运行或者 MPP 配置有大量节点,则应增加此堆的大小。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING APPGROUP_MEM_SZ        11595;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING CATALOGCACHE_SZ 260;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING CHNGPGS_THRESH  60;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DBHEAP          600;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOCKLIST        50;指定分配给锁列表的存储器空间数量。锁列表包括并行连接到数据库的所有应用程序保留的锁
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGBUFSZ        98;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGFILSIZ       2500;指定分配给用于数据恢复的日志文件的磁盘存储空间的数量(以页为单位)。该参数定义每一主日志文件和辅助日志文件的大小。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGPRIMARY      3;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING LOGSECOND       4;指定可用于数据库恢复的辅助日志文件的数量。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MAXAPPLS        250;指定可在同一时间连接到数据库的应用程序(本地和远程)的最大数量。
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MAXLOCKS        57;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING MINCOMMIT       1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING NUM_IOCLEANERS  1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING NUM_IOSERVERS   2;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING PCKCACHESZ      915;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING SOFTMAX         120;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING SORTHEAP        214;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING STMTHEAP        2048;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DFT_DEGREE      1;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING DFT_PREFETCH_SZ 32;
UPDATE DATABASE CONFIGURATION FOR DBNAME USING UTIL_HEAP_SZ    78735;
UPDATE DATABASE MANAGER CONFIGURATION USING SHEAPTHRES         25797;
UPDATE DATABASE MANAGER CONFIGURATION USING INTRA_PARALLEL     OFF;
UPDATE DATABASE MANAGER CONFIGURATION USING MAX_QUERYDEGREE    1;
UPDATE DATABASE MANAGER CONFIGURATION USING MAXAGENTS          400;
UPDATE DATABASE MANAGER CONFIGURATION USING NUM_POOLAGENTS     400;
UPDATE DATABASE MANAGER CONFIGURATION USING NUM_INITAGENTS     0;
UPDATE DATABASE MANAGER CONFIGURATION USING FCM_NUM_BUFFERS    4096;
UPDATE DATABASE MANAGER CONFIGURATION USING PRIV_MEM_THRESH        32767;
3.可以使用db2set -all 察看系统中设置的所有配置文件注册表变量。
4。db2 -tvf  *.sql  -z  view.txt   可以执行脚本文件,即输出到view.txt察看。
5. db2 管理方面的命令
    list db directory   列出系统数据库目录
二。数据库操作的常用技巧
 
 1. 查看本地节点目录
  命令窗口中输入:db2 list node directory
  2. 编目一个TCP/IP节点
  命令窗口:db2 catalog tcpip node <node_name> remote <hostname|ip_address> server <svcname|port_number> ostype <OS2|AIX|WIN95|NT|HPUX|SUN|MVS|OS400|VM|VSE|SCO|SGI|LINUX|DYNIX>

  3. 取消节点编目
  db2 uncatalog node <node_name>

  4. 查看系统数据库目录
  db2 list database directory

  5. 查看本地数据库目录
  db2 list database directory on <盘符>
  在本地数据库目录中有而系统数据库目录中没有的数据库不能访问,可以在控制中心中选中<数据库>右键单击选择添加,然后输入需要添加的数据库名称或者点击刷新按钮选择数据库,加入数据库后即可以访问。

  6. 编目数据库
  db2 catalog database <db_name> as <db_alias> at node <node_name>

  7. 取消数据库编目
  db2 uncatalog database <db_name>

  8. 测试远程数据库的连接
  db2 connect to <db_alias> user <user_id> using <password>

  9. 任何用户均可通过设置Current Schema专用寄存器为特定的数据库连接设置默认模式,初始默认值为当前会话用户的权限ID。
  set schema = <schema name>
  可以由用户交互式的使用,也可在应用程序中使用,如果用Dynamicrules Bind选项绑定包,这个语句就没有作用。此语句不在事务控制之下。

  10. 代码页的设置
  在创建数据库时设置字符集
  create database <db_name> using codeset <codeset> territory <territiry>
  例:
  create database dbtest using codeset IBM-437 territory US
  也可以设置整个数据库的代码页,在win2000/NT/xp中,在我的电脑-->属性-->高级-->环境变量中添加变量DB2CODEPAGE = <codepage>,例:DB2CODEPAGE = 437 或 DB2CODEPAGE = 1386。或者在IBM DB2命令窗口输入 db2set DB2CODEPAGE=1386,设置后需要重新启动DB2生效。

  11. DB2低版本数据到高版本的迁移
  先将低版本数据备份使用恢复功能导入高版本数据库,然后在命令窗口输入 db2 migrate database <db_name>。

  12. 表名或模式中含有引号时访问表
  命令窗口:db2 select * from "tabschema"."tabname"
  命令行处理器:db2=> select * from "tabschema"."tabname"

  13. 导出数据库的表结构生成DDL文件
  命令窗口:db2look -d <db_name> -e -c -o <file_name>

  14. 执行脚本文件
  命令窗口:db2 -tvf <file_name>

  15. 代码页的转换

  16. 获取当前DB2的版本
  select * from sysibm.sysversions

  17. DB2表的字段的修改限制?
  只能修改VARCHAR2类型的并且只能增加不能减少
  alter table <tb_name> alter column <col_name> set data type varchar(SIZE)

  18. 如何查看表的结构?
  describe table <tb_name>
  or
  describe select * from <schema>.<tb_name>

  19. 如何快速清除一个大表?
  ALTER TABLE TABLE_NAME ACTIVE NOT LOGGED INITALLY WITH EMPTY TABLE

  20. 如何查看数据库的存储过程?
  SELECT * FROM SYSCAT.PROCEDURES

  21. 如何查看表的约束?
  SELECT * FROM SYSCAT.CHECKS WHERE TABNAME = <tb_name>

  22. 如何查看表的引用完整约束?
  SELECT * FROM SYSCAT.REFERENCES WHERE TABNAME = <tb_name>

  23. 如何知道BUFFERPOOLS状况?
  select * from SYSCAT.BUFFERPOOLS

  24. 如何在命令行下查看修改实例和数据库配置参数?
  查看实例配置参数: db2 get dbm cfg
  修改实例配置参数: db2 update dbm cfg using 参数名 新值

  查看数据库配置参数: db2 get db cfg for <db_name>
  修改数据库配置参数: db2 update db cfg for <db_name> using 参数名 新值

  25. 如何修改缓冲区?
  增加缓冲区: create bufferpool <buf_name> size <number of pages> [pagesize 4096] {[not] EXTENDED STORAGE}
  修改缓冲区: alter bufferpool <buf_name> size <number of pages> {[not] EXTENDED STORAGE}
  删除缓冲区: drop bufferpool <buf_name>

  如果缓冲区大小设置为 -1 表示缓冲池的页面数目由数据库配置参数buffpage决定。
  注意: 数据库配置参数buffpage仅对缓冲区大小设置为 -1 的缓冲池起作用。

  26. 多个字段时如何不通过使用select子句使用in/not in
  select * from tabschema.tabname where (colA, colB, colC) [not] in (values (valueA1, valueB1, valueC1), (valueA2, valueB2, valueC2), ...(valueAn, valueBn, valueCn))

  27. 查看当前连接到数据库的应用
  db2 list application [show detail]

  28. 如何确认DB2数据库的一致性
  db2dart <db_name> /DB
  /DB表示检查整个数据库的一致性

  29. 测试SQL语句的性能
  db2batch -d <db_name> -f <file_name> [-a userid/passwd] [-r <outfile_name>]
  -r 选项表示将查询结果输出到一个文件中。
  30. 导出某个表的数据
  export to <Derectry><filme>
  如:导出用户表
  export to c:user.ixf of ixf select * from user

  31. 导入数据
  import from
  如:导入用户表。导入时可以直接建立新表。如果有该表存在也可以用INSERT 插入,或者用UPDATE更新
  import from c:user.ixf of ixf [Create/Insert into / update] tablename

。。。。。。。。。。。。。。未完待续
13:44 添加评论 固定链接 引用通告 (0) 记录它 计算机与 Internet
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!152.entry
添加评论正在做oracle向db2数据库移植总结一些经验
1、创建PROCEDURE的参数的区别
        1)参数类型和参数名称的位置不同
            db2:    CREATE PROCEDURE PRO1 (IN OrgID int)
            oracle:CREATE PROCEDURE PRO1 (OrgID IN int)
        2)同时作为输入输出参数的写法不同
            db2:    CREATE PROCEDURE PRO1 (INOUT OrgID int)    INOUT连着写
            oracle:CREATE PROCEDURE PRO1 (OrgID IN OUT int)    IN OUT中间空格隔开,而且必须IN在OUT之前
        3)没有输入或输出参数时
            db2:    CREATE PROCEDURE PRO1 ()    
            oracle:CREATE PROCEDURE PRO1 不能有空的括号
       4)赋值语句写法不一样
           db2:    set var =..
          oracle:  var := ..
      5)异常处理不一样
          db2: 异常处理器类型(handler-type)有以下几种:

CONTINUE 在处理器操作完成之后,会继续执行产生这个异常语句之后的下一条语句。
EXIT 在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
UNDO 在处理器操作执行之前,DB2会回滚存储过程中执行的SQL操作。在处理器操作完成之后,存储过程会终止,并将控制返回给调用者。
异常处理器可以处理基于特定SQLSTATE值的定制异常,或者处理预定义异常的类。预定义的3种异常如下所示:

NOT FOUND 标识导致SQLCODE值为+100或者SQLSATE值为02000的异常。这个异常通常在SELECT没有返回行的时候出现。
SQLEXCEPTIOIN 标识导致SQLCODE值为负的异常。
SQLWARNING 标识导致警告异常或者导致+100以外的SQLCODE正值的异常。
如果产生了NOT FOUND 或者SQLWARNING异常,并且没有为这个异常定义异常处理器,那么就会忽略这个异常,并且将控制流转向下一个语句。如果产生了SQLEXCEPTION异常,并且没有为这个异常定义异常处理器,那么存储过程就会失败,并且会将控制流返回调用者。

以下示例声明了两个异常处理器。 EXIT处理器会在出现SQLEXCEPTION 或者SQLWARNING异常的时候被调用。EXIT处理器会在终止SQL程序之前,将名为stmt的变量设为"ABORTED",并且将控制流返回给调用者。UNDO处理器会将控制流返回给调用者之前,回滚存储过程体中已经完成的SQL操作。
oracle: EXCEPTION
  ----错误处理
  WHEN DUP_VAL_ON_INDEX THEN
    ----主键冲突
    ROLLBACK;

WHEN VALUE_ERROR THEN
    ----长度截断错误
    ROLLBACK;

WHEN PROGRAM_ERROR THEN
    ----PL/SQL内部错误
    ROLLBACK;

WHEN TIMEOUT_ON_RESOURCE THEN
    ----系统等待超时
      ROLLBACK;

WHEN OTHERS THEN
    ----其他异常错误
    ROLLBACK;
2 自定义函数例子
类似oracle 的 to_date() 日期函数
CREATE FUNCTION DB2ADMIN.TO_DATE_EX
 (INPUTDATE VARCHAR(20),
  FORMAT VARCHAR(20)
 )
  RETURNS TIMESTAMP
  SPECIFIC DB2ADMIN.SQL060801174720700
  LANGUAGE SQL
  NOT DETERMINISTIC
  READS SQL DATA
  STATIC DISPATCH
  CALLED ON NULL INPUT
  EXTERNAL ACTION
  INHERIT SPECIAL REGISTERS
  RETURN
with tmp (outdate) as (
  select
      case length(rtrim(INPUTDATE))
        when 10
          then timestamp(inputdate || ' 00:00:00')
        when 19
          then timestamp(inputdate)
      end
    from sysibm.sysdummy1 )
  select outdate
    from tmp;

12:27 添加评论 固定链接 引用通告 (0) 记录它 爱好
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!151.entry
添加评论6月21日
jsp中的日期问题及其它:D :D :D
jsp中的日期问题及其它:D :D :D

/**
* @author imagebear
*/

日期问题
1、获取服务器端当前日期:

<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
%>

2、获取当前年、月、日:

<%@ page import="java.util.Date"%>

<%
Date myDate = new Date();
int thisYear = myDate.getYear() + 1900;//thisYear = 2003
int thisMonth = myDate.getMonth() + 1;//thisMonth = 5
int thisDate = myDate.getDate();//thisDate = 30
%>

3、按本地时区输出当前日期

<%@ page import="java.util.Date"%>
<%
Date myDate = new Date();
out.println(myDate.toLocaleString());
%>

输出结果为:
2003-5-30
4、获取数据库中字段名为”publish_time“、类型为Datetime的值

<%@ page import="java.util.Date"%>
<%
...连接数据库...
ResultSet rs = ...
Date sDate = rs.getDate("publish_time");
%>
[code]
5、按照指定格式打印日期
[code]
<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
Date dNow = new Date();

SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is " + formatter.format(dNow));
%>

输出的结果为:
It is 星期五 2003.05.30 at 11:30:46 上午 CST
(更为详尽的格式符号请参看SimpleDateFormat类)
6、将字符串转换为日期

<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "1222-11-11";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date t = null;
try{
t = formatter.parse(input);
out.println(t);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}
%>

输出结果为:
Fri Nov 11 00:00:00 CST 1222
7、计算日期之间的间隔

<%@ page import="java.util.Date"%>
<%@ page import="java.text.DateFormat"%>
<%
String input = "2003-05-01";
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
Date d1 = null;
try{
d1 = formatter.parse(input);
}catch(ParseException e){
out.println("unparseable using " + formatter);
}

Date d2 = new Date();

long diff = d2.getTime() - d1.getTime();
out.println("Difference is " + (diff/(1000*60*60*24)) + " days.");
%>

输出结果为:
Difference is 29 days.
8、日期的加减运算
方法:用Calendar类的add()方法

<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
Calendar now = Calendar.getInstance();
SimpleDateFormat formatter = new SimpleDateFormat("E yyyy.MM.dd 'at' hh:mm:ss a zzz");
out.println("It is now " + formatter.format(now.getTime()));
now.add(Calendar.DAY_OF_YEAR,-(365*2));
out.println("<br>");
out.println("Two years ago was " + formatter.format(now.getTime()));
%>

输出结果为:
It is now 星期五 2003.05.30 at 01:45:32 下午 CST
Two years ago was 星期三 2001.05.30 at 01:45:32 下午 CST
9、比较日期
方法:用equals()、before()、after()方法

<%@ page import="java.util.*"%>
<%@ page import="java.text.*"%>
<%
DateFormat df = new SimpleDateFormat("yyy-MM-dd");
Date d1 = df.parse("2000-01-01");
Date d2 = df.parse("1999-12-31");

String relation = null;
if(d1.equals(d2))
relation = "the same date as";
else if(d1.before(d2))
relation = "before";
else
relation = "after";
out.println(d1 +" is " + relation + ' ' + d2);
%>

输出结果为:
Sat Jan 01 00:00:00 CST 2000 is after Fri Dec 31 00:00:00 CST 1999
10、记录一件事所花费的时间
方法:调用两次System.getTimeMillis()方法,求差值

<%@ page import="java.text.*"%>
<%
long t0,t1;
t0 = System.currentTimeMillis();
out.println("Cyc starts at " + t0);
int k = 0;
for(int i =0;i<100000;i++){
k += i;
}
t1 = System.currentTimeMillis();
out.println("<br>");
out.println("Cyc ends at " + t1);
out.println("<br>");
out.println("This run took " + (t1-t0) + "ms.");
%>

输出结果为:
Cyc starts at 1054275312432
Cyc ends at 1054275312442
This run took 10ms.

其它:如何格式化小数

<%@ page import="java.text.*"%>
<%
DecimalFormat df = new DecimalFormat(",###.00");
double aNumber = 33665448856.6568975;
String result = df.format(aNumber);
out.println(result);
%>

输出结果为:
33,665,448,856.66

10:33 添加评论 固定链接 引用通告 (0) 记录它 计算机与 Internet
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!138.entry
添加评论5月27日
设计模式之父谈如何使用设计模式
在接受Artima.com的采访时,《设计模式》的作者Erich Gamma介绍了如何正确地使用设计模式。

设计模式(design pattern)一直是一个开发者中间流行的话题,借助于它开发者可以更好地思考设计问题。但怎样才是思考设计模式的正确方式?在接受Artima.com的采访时,经典著作《设计模式》一书的作者之一Erich Gamma介绍了自己的经验。

全文请看:http://www.artima.com/lejava/articles/gammadp.html

15:56 添加评论 阅读评论 (1) 固定链接 引用通告 (0) 记录它 爱好
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!137.entry
添加评论5月24日
如何把数据写到excel文件中
jxl的一些总结

要往xls文件里面写入数据的时候需要注意的是第一要新建一个xls文件
OutputStream os=new FileOutputStream("c:\\excel2.xls");

再建完这个文件的时候再建立工作文件
jxl.write.WritableWorkbook wwb = Workbook.createWorkbook(new File(os));

如果这个文件已经存在,那么我们可以在这个文件里面加入一个sheet为了和以前的数据进行分开;
jxl.write.WritableSheet ws = wwb.createSheet("Test Sheet 1", 0);
在createSheet方法里前面的参数是sheet名,后面是要操作的sheet号

接下来就可以往这个文件里面写入数据了

写入数据的时候注意的格式

(1)添加的字体样式
jxl.write.WritableFont wf = new jxl.write.WritableFont(WritableFont.TIMES, 18, WritableFont.BOLD, true);
WritableFont()方法里参数说明:
这个方法算是一个容器,可以放进去好多属性
第一个: TIMES是字体大小,他写的是18
第二个: BOLD是判断是否为斜体,选择true时为斜体
第三个: ARIAL
第四个: UnderlineStyle.NO_UNDERLINE 下划线
第五个: jxl.format.Colour.RED 字体颜色是红色的

jxl.write.WritableCellFormat wcfF = new jxl.write.WritableCellFormat(wf);

jxl.write.Label labelC = new jxl.write.Label(0, 0, "This is a Label cell",wcfF);
ws.addCell(labelC);
在Label()方法里面有三个参数
第一个是代表列数,
第二是代表行数,
第三个代表要写入的内容
第四个是可选项,是输入这个label里面的样式
然后通过写sheet的方法addCell()把内容写进sheet里面。

(2)添加带有formatting的Number对象
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");

(3)添加Number对象
(3.1)显示number对象数据的格式

jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#.##");
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(nf);

jxl.write.Number labelNF = new jxl.write.Number(1, 1, 3.1415926, wcfN);
ws.addCell(labelNF);
Number()方法参数说明:
前两上表示输入的位置
第三个表示输入的内容

(4)添加Boolean对象
jxl.write.Boolean labelB = new jxl.write.Boolean(0, 2, false);
ws.addCell(labelB);

(5)添加DateTime对象
jxl.write.DateTime labelDT = new jxl.write.DateTime(0, 3, new java.util.Date());
ws.addCell(labelDT);
DateTime()方法的参数说明
前两个表示输入的位置
第三个表示输入的当前时间

(6)添加带有formatting的DateFormat对象
这个显示当前时间的所有信息,包括年月日小时分秒
jxl.write.DateFormat df = new jxl.write.DateFormat("dd MM yyyy hh:mm:ss");
jxl.write.WritableCellFormat wcfDF = new jxl.write.WritableCellFormat(df);
jxl.write.DateTime labelDTF = new jxl.write.DateTime(1, 3, new java.util.Date(), wcfDF);
ws.addCell(labelDTF);

(7)添加带有字体颜色Formatting的对象
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL, 10, WritableFont.NO_BOLD, false,UnderlineStyle.NO_UNDERLINE, jxl.format.Colour.RED);
jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);

import="jxl.format.*
jxl.write.WritableFont wfc = new jxl.write.WritableFont(WritableFont.ARIAL,20,WritableFont.BOLD,false,UnderlineStyle.NO_UNDERLINE,jxl.format.Colour.GREEN);

(8)设置单元格样式

jxl.write.WritableCellFormat wcfFC = new jxl.write.WritableCellFormat(wfc);
wcfFC.setBackGround(jxl.format.Colour.RED);//设置单元格的颜色为红色
wcfFC = new jxl.write.Label(6,0,"i love china",wcfFC);

15:44 添加评论 固定链接 引用通告 (0) 记录它 计算机与 Internet
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!136.entry
添加评论5月23日
cvs应用指南
CVS 是 Concurrent Version System(并行版本系统)谈 羽斌 整理  (参与分:938,专家分:105)   发表:2005-05-23 12:00   版本:1.0   阅读:7次
CVS 是 Concurrent Version System(并行版本系统)的缩写,用于版本管理。在多人团队开发中的作用更加明显。CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序。这样,就好象只有一个人在修改文件一样。避免了冲突。每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改。这样就可以做到跟踪文件变化,冲突控制等等。

  由于CVS是建立在在原先 Unix 体系里很成熟的 SCCS 和 RCS 的基础上,所以CVS多是Linux(UNIX)系统中所使用,本文中服务器端设置也是以Linux为例。

  一、CVS服务器的安装

  首先确认系统中是否安装CVS服务:

  [root@localhost /]# rpm -qa|grep cvs
cvs-1.11.2-cvshome.7x.1

 如果命令输出类似于上面的输出则说明系统已经安装有cvs,否则就需要从安装光盘中安装cvs的rpm包,或者到http://www.cvshome.org下载。

  1、建立 CVSROOT

  目录,因为这里涉及到用户对CVSROOT里的文件读写的权限问题,所以比较简单的方法是建立一个组,然后再建立一个属于该组的帐户,而且以后有读写权限的用户都要属于该组。假设我们建一个组叫cvs,用户名是cvsroot。建组和用户的命令如下

#groupadd cvs
#adduser cvsroot
  
生成的用户宿主目录在/home/cvsroot(根据自己的系统调整)

  2、用cvsroot 用户登陆,修改 /home/cvsroot (CVSROOT)的权限,赋与同组人有读写的权限: 

  $chmod 771 . (或者770应该也可以)

  注意:这一部分工作是按照文档说明做的,是否一定需要这样没有试验,我会在做试验后在以后版本的教程说得仔细一点。如果您有这方面的经验请提供给我,谢谢。

  3、建立CVS仓库,(仍然是 cvsroot 用户),用下面命令:

  $cvs -d /home/cvsroot init

  4、以root身份登陆,修改 /etc/inetd.conf(使用 xinetd 的系统没有此文件)和 /etc/services

  如果用的是 inetd 的系统,在 /etc/inetd.conf 里加入:
  

  cvsserver  stream tcp nowait root /usr/bin/cvs cvs -f --allow-root=/home/cvsroot pserver
 
 说明:上面的行是单独一整行,/usr/bin/cvs 应该是你的cvs版本的命令路径,请根据自己的系统调整./home/cvsroot是你建立的CVSROOT的路径,也请根据上面建立目录的部分的内容做调整。

  如果是使用 xinetd 的系统,需要在 /etc/xinetd.d/ 目录下创建文件 cvspserver(此名字可以自己定义),内容如下:

  # default: on
  # description: The cvs server sessions;

  service cvsserver
  {
  socket_type = stream
  wait = no
  user = root
  server = /usr/bin/cvs
  server_args = -f --allow-root=/cvsroot pserver
  log_on_failure += USERID
  only_from = 192.168.0.0/24
  }

  其中only_from是用来限制访问的,可以根据实际情况不要或者修改。修改该文件权限:

  
# chmod 644 cvspserver

  在/etc/services里加入:

 
 cvsserver 2401/tcp

  说明:cvsserver 是任意的名称,但是不能和已有的服务重名,也要和上面修改 /etc/inetd.conf 那行的第一项一致。

  5、添加可以使用 CVS 服务的用户到 cvs 组:

  以 root 身份修改 /etc/group,把需要使用 CVS 的用户名加到 cvs 组里,比如我想让用户 laser 和gumpwu 能够使用 CVS 服务,那么修改以后的 /etc/group 应该有下面这样一行:

  cvs:x:105:laser,gumpwu

  在你的系统上GID可能不是105,没有关系。主要是要把laser和gumpwu用逗号分隔开写在最后一个冒号后面。当然,象RedHat等分发版有类似linuxconf这样的工具的话,用工具做这件事会更简单些。

  6、重起inetd使修改生效:
  
#killall -HUP inetd

  如果使用的是 xinetd 的系统:

  # /etc/rc.d/init.d/xined restart

然后察看cvs服务器是否已经运行:

[root@localhost /]# netstat -lnp|grep 2401
  tcp 0 0 0.0.0.0:2401 0.0.0.0:* LISTEN 1041/xinetd

则说明cvs服务器已经运行。

  二、管理CVS服务器
  服务器可以用了,现在大家最关心的就是如何管理服务器,比如,我想让一些人有读和/或写 CVS 仓库的权限,但是不想给它系统权限怎么办呢?

  不难,在 cvs 管理员用户(在我这里是 cvsroot 用户)的家目录里有一个 CVSROOT 目录,这个目录里有三个配置文件,passwd, readers, writers,我们可以通过设置这三个文件来配置 CVS 服务器,下面分别介绍这几个文件的作用:

 
 passwd:cvs 用户的用户列表文件,它的格式很象 shadow 文件:

  {cvs 用户名}:[加密的口令]:[等效系统用户名]

  如果你希望一个用户只是 cvs 用户,而不是系统用户,那么你就要设置这个文件,刚刚安装完之后这个文件可能不存在,你需要以 cvs 管理员用户手工创建,当然要按照上面格式,第二个字段是该用户的加密口令,就是用 crypt (3)加密的,你可以自己写一个程序来做加密,也可以用我介绍的偷懒的方法:先创建一个系统用户,名字和 cvs 用户一样,口令就是准备给它的 cvs 用户口令,创建完之后从 /etc/shadow 把该用户第二个字段拷贝过来,然后再把这个用户删除。这个方法对付数量少的用户比较方便,人一多就不合适了,而且还有冲突条件(race condition)的安全隐患,还要 root 权限,实在不怎么样。不过权益之计而已。写一个小程序并不难,可以到 linuxforum 的编程版搜索一下,有个朋友已经写了一个贴在上面了。

第三个字段就是等效系统用户名,实际上就是赋与一个 cvs 用户一个等效的系统用户的权限,看下面的例子你就明白它的功能了。

readers:有 cvs 读权限的用户列表文件。就是一个一维列表。在这个文件中的用户对 cvs只有读权限。

writers:有 cvs 写权限的用户的列表文件。和 readers 一样,是一个一维列表。在这个文件中的用户对 cvs 有写权限。

上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来教学吧。假设我们有下面几个用户需要使用 cvs:

laser, gumpwu, henry, betty, anonymous。

其中 laser 和 gumpwu 是系统用户,而 henry, betty, anonymous 我们都不想给系统用户权限,并且 betty 和 anonymous 都是只读用户,而且 anonymous 更是连口令都没有。那么好,我们先做一些准备工作,先创建一个 cvspub 用户,这个用户的责任是代表所有非系统用户的 cvs 用户读写 cvs 仓库。

#adduser
...

然后编辑 /etc/group,令 cvspub 用户在 cvs 组里,同时把其它有系统用户权限的用户加到 cvs 组里。(见上文)

然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行:

laser:$xxefajfka;faffa33:cvspub
gumpwu:$ajfaal;323r0ofeeanv:cvspub
henry:$fajkdpaieje:cvspub
betty:fjkal;ffjieinfn/:cvspub
anonymous::cvspub

注意:上面的第二个字段(分隔符为 :)是密文口令,你要用程序或者用我的土办法生成。

编辑 readers 文件,加入下面几行:

anonymous
betty

编辑 writers 文件,加入下面几行:

laser
gumpwu
henry

注意:writers中的用户不能在readers中,要不然不能上传更新文件。

对于使用CVS的用户要修改它的环境变量,例如laser用户的环境变量,打开/home/laser(laser的宿主目录)下的.bash_profile文件,加入

CVSROOT=/home/cvsroot
export CVSROOT

用laser登陆就可以建立CVS项目,如果要root使用,可以修改/etc/profile文件。

现在我们各项都设置好了,那么怎么用呢,我在这里写一个最简单的(估计也是最常用的)命令介绍:

首先,建立一个新的CVS项目,一般我们都已经有一些项目文件了,这样我们可以用下面步骤生成一个新的CVS项目:

进入到你的已有项目的目录,比如叫 cvstest:

$cd cvstest

运行命令:

$cvs import -m "this is a cvstest project" cvstest v_0_0_1 start

说明:import 是cvs的命令之一,表示向cvs仓库输入项目文件。 -m参数后面的字串是描述文本,随便写些有意义的东西,如果不加 -m 参
数,那么cvs会自动运行一个编辑器(一般是vi,但是可以通过修改环境变量EDITOR来改成你喜欢用的编辑器。)让你输入信息,cvstest 是项目名称(实际上是仓库名,在CVS服务器上会存储在以这个名字命名的仓库里。)
v_0_0_1是这个分支的总标记。没啥用(或曰不常用。)
start 是每次 import 标识文件的输入层次的标记,没啥用。
这样我们就建立了一个CVS仓库了。

建立CVS仓库的文件夹应该是“干净”的文件夹,即只包括源码文件和描述的文件加,而不应该包括编译过的文件代码等!

三、使用CVS

winCVS是一个很好的CVS客户端软件,在http://cnpack.cosoft.org.cn/down/wincvsdailyguide.pdf可以下载到这个软件的使用手册。这里不在赘述了。

四、用CVS管理项目

本人正在一加公司从事该公司ERP项目的开发,在没有使用CVS的时候,多次出现了由于不同的开发人员修改同一程序,而导致程序错误,解决版本控制问题迫在眉睫。

由于这个项目采用Linux平台下JAVA开发,使用的开发工具Jbulider是支持CVS进行项目管理的,作为主程序员,我决定采用CVS进行版本控制,首先参照上文在Linux服务器上建立了CVS服务,然后我把我本地的工程文件传至服务器。

例如:我的工程文件在F:\ERP下,我把ERP下的erp.jpx文件、defaultroot文件夹和src文件夹上传至服务器/usr/local/erp下,然后登陆Linux服务器,登陆的用户是CVS的用户,其环境变量要正确(我的用户名为admin)

#cd /usr/local/erp
#cvs import -m "this is a ERP project" erp v_0_0_1 start

这样名为erp的CVS仓库就建立了。

之后开发小组的成员可以用winCVS把该项目下载到本地:

打开winCVS
点击工具栏Create -> Create a new repository... 弹出窗口
在Grenral中
Enter the CVSROOT填写admin@192.168.1.9:/home/cvsroot 其中admin是cvs的用户,在本例中admin也是linux的系统用户,192.168.1.9是服务器的地址,/home/cvsroot是CVS的主目录,参考上文。
Authentication中选择"passwd file on the cvs server"
Use version中选择cvs 1.10 (Standard)

其它项默认即可。

确认后,点工具栏Admin --> Login... 会提示输入密码,输入密码后,看看winCvs的状态栏。如果提示

*****CVS exited normally with code 0*****

表示登录正常。

点击工具栏Create --> Checkout module...弹出对话框,其中的Checkout settings项中
Enter the module name and path on the server 填写erp,即我们建立的名为erp的CVS仓库
Local folder to checkout to 选择要下载到本地的目录,我选了F:\myerp

其它项目可以默认,确定后就可以下载到本地了,在F:\myerp\下会有一个erp文件夹,其文件结构和F:\erp下的文件结构是一样的。

用Jbulider打开F:\myerp\erp\下的erp.jpx文件,这个工程文件就可以使用了。

在Jbuilder的工具栏Team --> Select Project VCS 弹出对话框,选择CVS

对于你要进行修改的文件,在Project View中点中该文件,然后点右键,探出快捷菜单,选择CVS --> CVS Edit "xxxx.java(文件名)"

第一次使用可能会提示CVS服务器的密码。

在修改之前还要选择CVS --> Update "xxxx.java(文件名)"

修改之后选择CVS --> Commit "xxxx.java(文件名)"

这样,修改的文件就保存到CVS服务器了,Update的目的是下载、比较文件。每次在修改之前都Update,保持最新版本。

CVS在项目管理使用中确实起到了良好的效果,仔细研究CVS的命令,可以更好的发挥CVS在版本控制上的能力。

13:45 添加评论 固定链接 引用通告 (0) 记录它 计算机与 Internet
固定链接http://hahayang.spaces.live.com/blog/cns!C99CA57DBFEB25E0!133.entry
添加评论5月20日
JAVA开发者应该去的20个英文网站-转贴
[http://www.javaalmanac.com] - Java开发者年鉴一书的在线版本. 要想快速查到某种Java技巧的用法及示例代码, 这是一个不错的去处.
[http://www.onjava.com] - O'Reilly的Java网站. 每周都有新文章.
[http://java.sun.com] - ;官方的Java开发者网站 - 每周都有新文章发表.
[http://www.developer.com/java] - ;由Gamelan.com 维护的Java技术文章网站.
[http://www.java.net] - Sun公司维护的一个Java社区网站.
[http://www.builder.com] - Cnet的Builder.com网站 - 所有的技术文章, 以Java为主.
[http://www.ibm.com/developerworks/java] - IBM的Developerworks技术网站; 这是其中的Java技术主页.
[http://www.javaworld.com] - ;最早的一个Java站点. 每周更新Java技术文章.
[http://www.devx.com/java] - DevX维护的一个Java技术文章网站.
[http://www.fawcette.com/javapro] - JavaPro在线杂志网站.
[http://www.sys-con.com/java] - Java Developers Journal的在线杂志网站.
[http://www.javadesktop.org] - ;位于Java.net的一个Java桌面技术社区网站.
[http://www.theserverside.com] - ;这是一个讨论所有Java服务器端技术的网站.
[http://www.jars.com] - ;提供Java评论服务. 包括各种framework和应用程序.
[http://www.jguru.com] - ;一个非常棒的采用Q&A形式的Java技术资源社区.
[http://www.javaranch.com] - ;一个论坛,得到Java问题答案的地方,初学者的好去处。
[http://www.ibiblio.org/javafaq/javafaq.html] - comp.lang.java的FAQ站点 - 收集了来自comp.lang.java新闻组的问题和答案的分类目录.
http://java.sun.com/docs/books/tutorial/] - ;来自SUN公司的官方Java指南 - 对于了解几乎所有的java技术特性非常有帮助.
http://www.javablogs.com] - ;互联网上最活跃的一个Java Blog网站.
http://java.about.com/] - ;来自About.com的Java新闻和技术文章网站.

转载于:https://www.cnblogs.com/subiaoji/archive/2006/08/22/483495.html

java 日期及别的小技巧相关推荐

  1. java 整数变负数_年年有余之java求余的小技巧

    背景 传说里玉皇大帝派龙王马上降雨到共光一带,龙王接到玉皇大帝命令,立马从海上调水,跑去共光施云布雨,但粗心又着急的龙王不小心把海里的鲸鱼随着雨水一起降落在了共光,龙王怕玉皇大帝责怪,灵机一动便声称他 ...

  2. win怎么在计算机里按日期搜索文件,小编教你在Win10系统电脑中设置搜索内容日期范围的小技巧...

    在使用电脑的过程中,很多时候为了我们为了快速找到某个文件,都会使用到系统的搜索功能,不过大家会发现,这项搜索功能在默认情况下,只能选择固定的日期范围比如:今天.昨天.本周.上周.本月.上月.今年.去年 ...

  3. gcore java_获取一直FullGC下的java进程HeapDump的小技巧

    小技巧 我们应用的java进程出问题的时候,我们往往会用jmap或者gcore拿到一份HeapDump,拿到MAT上做一次Heap分析,但是 如果你排查的是一直在FullGC的gc问题,你Dump下来 ...

  4. java编程定义狗_大狗干货铺:13个java编程中的小技巧

    1.return 一个空的集合,而不是 null 如果一个程序返回一个没有任何值的集合,请确保一个空集合返回,而不是空元素.这样你就不用去写一大堆 "if else" 判断null ...

  5. Java性能调优小技巧

    1.在必要之前,先不要优化 1.5同步代码块的范围也小于同步方法,建议使用,相比之下能够提高性能. 2.使用分析器来找到真正的瓶颈 3 .为整个应用程序创建性能测试套件 4.首先解决最大的瓶颈问题 5 ...

  6. java学习日记之小技巧(跟着变量走一走)

    hello 大家好! 昨天写了方法的创建与如何调用,今天我们写带参数的方法 先new个java project,然后点开工程,点击src右键new一个class   , 然后我们在自动生成的主函数下边 ...

  7. java计数循环及小技巧

    要运行一个很大次数的循环应该选择一个小数,然后去判断 例如本例子是100可以选择10去判断 public static void main(String[] args) {// TODO Auto-g ...

  8. 用Eclipse调试Java程序的一些小技巧

    Created by Jerry Wang, last modified on Sep 11, 2015 1. 条件断点 选中断点,enable Conditional,以下图为例,意思是当j == ...

  9. 初进JAVA职场面试小技巧:一个老学长的吐血之作!

    看着一批批小白的遭遇,有些无奈,又跟我年轻时有些类似.今天正好有点时间,给你几个建议. 1.在结业之前一定要把自己参与过的项目仔细审视一下,一点要特别熟悉项目的流程功能,另外也要重视自己做过的模块,看 ...

最新文章

  1. ipsec *** 多对等体
  2. Python 字符串换行的几种方式
  3. QT键盘响应卡顿的解决方法
  4. Java黑皮书课后题第8章:**8.14(探讨矩阵)编写程序,提示用户输入一个方阵的长度,随机地在矩阵中填入0和1,打印这个矩阵,然后找出整行、整列或者对角线都是1或0的行、列和对角线
  5. jQuery插件FontSizer实现自定义动态调整网页文字大小
  6. 尴尬!三星Galaxy S10系列面部识别疑似翻车:连兄妹都分不清
  7. EFI下WIN8.1和Ubuntu的双系统安装
  8. Python中字符串String去除出换行符(\n,\r)和空格的问题
  9. 剑指offer——16.数值的整数次方
  10. MySQL 刷脏页问题
  11. windows 下杀掉占用端口的程序
  12. 最新CCC认证目录范围(2019)
  13. 1万条数据大概占多大空间_国漫丨2019年上半年漫画数据报告
  14. pcie总线与cpci总线_PCI和CPCI
  15. word打开老是配置进度_打开word2007时总是出现配置进度,怎么解决?
  16. 水果食用大全 -- 果品食疗 - 葡萄
  17. 仿掌阅app打开书籍动画效果
  18. 2022-5-17-验证外星语词典
  19. C# 实现类似SMSS的执行脚本的功能
  20. ubuntu 终端常用命令大全

热门文章

  1. HDU 4870 Rating 高斯消元法
  2. OpenCV中Mat总结
  3. 如何修改MFC的图标
  4. 窗口类、窗口类对象与窗口 三者之间关系
  5. Xcode12.5的自定义代码块的使用和函数注释(学会事半功倍)
  6. 使用s3sec批量化自动扫描S3存储桶泄露数据
  7. 信息收集 ——C段扫描
  8. p4: php5ts.dll p5: 5.6.14.0,服务器httpd.exe 应用程序错误
  9. 菜鸟教程python3 mysql_MySQL 教程
  10. vue 关闭弹如何销毁子组件_vue中的eventBus会产生内存泄漏吗