发布新日志

  • 中间件的概念及应用

    2009-01-10 08:51:50

    中间件是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。中间件的作用,主要是为复杂的应用程序抽象出通用的公共部分,以降低应用开发的复杂程度。

      什么是中间件

      中间件的确需要有人来给它下定义了,因为实践往往会走在理论的前面,在中间件的概念产生以前,有些软件可能就已经存在了。此外,有些软件虽然不是作为中间件开发出来的,但是它们符合中间件的定义。

      应该说,中间件是处于操作系统和应用程序之间的软件,也有人认为它应该属于操作系统中的一部分。人们在使用中间件时,往往是把一组中间件集成在 一起,构成一个平台(包括开发平台和运行平台),但在这组中间件中必需要有一个通信中间件,因此,如果用一种比较形象方式表示的话:中间件 = 平台 + 通信 这个定义也限定了只有用于分布式系统中才能称为中间件,同时还可以把它与支撑软件和实用软件区分开来,认为中间件是分布计算机系统中集成各个组成的软件粘 接剂。

      也有人把中间件定义为网络环境中一组为许多应用需要的、可复用和可扩充的服务或(资源相关的)功能。

      "Middleware can be viewed as a reusable, expandable set of services and functions that are commonly needed by many applications to function well in a networked environment".

      至今很难给出一个精确的定义和界限其范围,大家发现每个人在谈论中间件时,常关系到他所涉及特定的范围,常常与应用相关,也有人企图将中间件分 层,但发现这样做并不带来很多好处,因此,有人干脆认为中间件是一组正交的非结构化的集合,按领域划分或许更方便。但也有许多人,把中间件看成是介于应用 和平台之间的一个中间层,它们又可区分上层与特定应用相关的中间件,中间层是较通用的一类中间件,底层则是与特定平台和资源相关的中间件。无论怎样的观 点,都要求中间件应具有如下的一些特点:

      满足大量应用的需要

      运行于多种硬件和OS平台

      支持分布计算,提供跨网络、硬件和OS平台的透明性的应用或服务的交互

      支持标准的协议

      支持标准的接口

      由于标准接口对于可移植性和标准协议对于互操作性的重要性,中间件已成为许多标准化工作的主要部分。对于应用软件开发,中间件远比操作系统和网 络服务更为重要,中间件提供的程序接口定义了一个相对稳定的高层应用环境,不管底层的计算机硬件和系统软件怎样更新换代,只要将中间件升级更新,并保持中 间件对外的接口定义不变,应用软件几乎不需任何修改,从而保护了企业在应用软件开发和维护中的重大投资。

      二 中间件的作用

      一般认为,中间件属于系统软件范畴,与操作系统、数据库并称为三大系统软件。中间件的作用,主要是为复杂的应用程序抽象出通用的公共部分,以降 低应用开发的复杂程度。中间件是基础软件的一大类,属于可复用软件的范畴。顾名思义,中间件处于操作系统软件与用户的应用软件的中间。中间件在操作系统、 网络和数据库之上,应用软件的下层,总的作用是为处于自己上层的应用软件提供运行与开发的环境,帮助用户灵活、高效地开发和集成复杂的应用软件。

      中间件随着客户需求的更新以及技术条件的变革,得到了不断地发展。 中间件的发展,经历了TM监控器、交易中间件、消息中间件、ORB中间件、应用服务器等阶段,一方面,是用户需求从追求单方面的功能如事务、交易、消息逐 渐转移到需要一个功能完整的基础平台,而技术上,则从基于C、以及CORBA的技术、发展到J2EE。

      目前,Java 2平台企业版(J2EE)已经成为一种行业普遍认可的标准中间件体系结构,根据J2EE规范开发的中间件即称为J2EE应用服务器。J2EE应用服务器可 以简化和规范多层分布式企业应用系统的开发和部署,横跨各类不同的数据库和操作系统,并通过Web Services 及RMI-IIOP提供对异构系统的集成。因此,经过几年的发展,J2EE应用服务器已经成为市场上主流的中间件产品。

      从整个软件产业来说,中间件搭建了应用与技术之间的桥梁,成为软件产业链条上不可或缺的一环,其作用巨大。中间件为客户提供了性价比更好的应用 方案、为开发商提供了高效率及高可用性的开发平台、并且可以适应不同的操作系统不同数据库产品的需要。中间件,把软件产业相关厂商以及客户紧密的结合在一 起,形成一个良性的生态系统。

    世界著名的咨询机构Standish Group在一份研究报告中归纳了中间件的十大优越性:

      · 缩短应用的开发周期

      · 节约应用的开发成本

      · 减少系统初期的建设成本

      · 降低应用开发的失败率

      · 保护已有的投资

      · 简化应用集成

      · 减少维护费用

      · 提高应用的开发质量

      · 保证技术进步的连续性

      · 增强应用的生命力

      具体地说,中间件屏蔽了底层操作系统的复杂性,使程序开发人员面对一个简单而统一的开发环境,减少程序设计的复杂性,将注意力集中在自己的业务上,不必再为程序在不同系统软件上的移植而重复工作,从而大大减少了技术上的负担。

      中间件带给应用系统的,不只是开发的简便、开发周期的缩短,也减少了系统的维护、运行和管理的工作量,还减少了计算机总体费用的投入。 Standish的调查报告显示,由于采用了中间件技术,应用系统的总建设费用可以减少50%左右。在网络经济大发展、电子商务大发展的今天,从中间件获 得利益的不只是IT厂商,IT用户同样是赢家,并且是更有把握的赢家。

      其次,中间件作为新层次的基础软件,其重要作用是将不同时期、在不同操作系统上开发应用软件集成起来,彼此像一个天衣无缝的整体协调工作,这是 操作系统、数据库管理系统本身做不了的。中间件的这一作用,使得在技术不断发展之后,我们以往在应用软件上的劳动成果仍然物有所用,节约了大量的人力、财 力投入。


  • 字节&字符

    2009-01-07 09:51:09

    JAVA中:  
    字节是ASCII   8  
    字符是UNICODE   16    
    1
    个字符=2个字节

     

    1、  计算机存储信息的最小单位,称之为位(bit),音译比特,二进制的一个“0”或一个“1”叫一位。

    2、  计算机存储容量基本单位是字节(Byte),音译为拜特,8个二进制位组成1个字节,一个标准英文字母占一个字节位置,一个标准汉字占二个字节位置。

     

    ASCII码:

    我 们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有01两种状态,因此八个二进制位就可以组合出256种状 态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 000000011111111

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

    ASCII码一共规定了128个字符的编码,比如空格"SPACE"32(二进制00100000),大写的字母A65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0

    Unicode码:

    正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

    可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

    Unicode 当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母AinU+0041表示英语的 大写字母AU+4E25表示汉字""。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。

  • 2009年9大最热门IT技能

    2009-01-06 16:00:31

    旧观念:公司对于某些技能,如编程,主要靠外包。新规则:公司想拥有自己内部的开发人员和其他IT类人才。
    无论以何种标准评价,美国经济都正处于自1929年经济大萧条以来最为严峻的时期。消费者开销减少,信贷市场持续疲软,另外1000多万美国人失业。

    然而,尽管金融形势如此严峻,公司对某些IT类技能的需求仍持续走高,如SAP,.net和help desk/support。虽然有些雇主将继续从公司外部寻找此类和其他领域的专家,但一些首席信息官(CIO)们构建内部的技术雇佣冻结团队也越来越普遍。
     
    那么就让我们跟随《计算机世界》(Computerworld)年度预测调查一同细说2009年9大最热门IT技能。
     

    1. 编程/应用软件开发
    询问任何一位招聘人员“当今最吃香的IT技能是什么”,你所得到的最普遍的答复就是三个字母:SAP。
     
    “现在我们IT行业流行这样一个玩笑,如果你的简历上标有SAP技能,你就不会失业,你就拥有了一个金饭碗”,iSymmetry有限公司的执行总裁 (CEO)布鲁斯·卡尔伯特(Bruce Culbert)如是说,iSymmetry有限公司是一个IT咨询及招募公司,办公室分设于华盛顿和乔治亚州的阿尔法利塔。
     
    卡尔伯特说,SAP精英,尤其有特殊模块开发从业经验的专家,狮子大开口每小时要价35美元至40美元不等,平均工资高出其他IT类的高级技师。 JDResources有限公司的IT部门招聘经理吉尔·赫林(Jill Herrin)表示,由于众多公司正努力构建全球企业资源计划(Enterprise Resource Planning, ERP)系统程序,对SAP技能人才的需求一直保持红热态势。
     
    赫林及其他观察员认为,仅次于SAP,有.net从业经验的 IT专家也是供不应求。一些依赖海外劳动力传递.net和C#技能的公司,几年前发现生产线供应渠道不足。现在他们正准备从内部挖掘人才填补空缺。
     
    美国爱荷华州Casey's General Stores 有限公司IT部 门高级主管Rich Schappert说,过去五年他招募和培训了众多当地的大学生,一直在填补.net和SQL服务器程序师的经销商需求缺口。该公司贯穿美国中西部运转着 1500多个存储器,一直致力于将基于面向商业的通用语言(Common Business-Oriented Language, Cobol)的金融应用软件转移到.net环境中以降低主机成本。Rich Schappert表示,找到通晓Cobol语言的人才也变得越来越难。

     
    2. 帮助台/技术支持
     
    IT界对帮助台和技术支持技能的需求持续走高,势头强劲,兼备深厚专业技能和雄厚客户服务功底的人才更是一将难求。赫林说:“我的好多客户向我诉苦,说他们的客户服务功能失效,表示急需具备良好沟通技巧的人才”。
     
    IT安 置员工公司Robert Half Technology的行政经理Katherine Spencer Lee表示,“最近,我们公司亟待需要一个万事通(JOAT:a jack-of-all-trades)型的人才,既要懂故障/修复,有懂帮助台技术支持。”公司更倾向于聘用综合型的IT类技师,因为公司都想少雇人多 办事。

     
    3. 项目管理
     
    Katherine Spencer Lee表示,尽管很多公司正在其IT项目上裁员, 但对成绩显赫的项目经理的需求仍然只增不减。辨别优秀项目经理的关键是,看他是否有在预算内按时完成或更好地完成一个项目的经验,并且能清楚地讲明项目执行的各个环节。
     
    纽约Center for CIO Leadership的执行董事Harvey Koeppel表示,“为了能经受住,公司总会不停地寻找理解项目和系统开发生命周期的人才,确保项目能够实现公司的商业目的”。 项目管理就是其中众多事务的一个领域。
     
    据一些猎头透露,雇主也要求项目经理具备项目管理资格证书,连副总裁级别的高管也不例外。截止去年7月下旬,美国计算机行业学会颁发的项目管理资格证书比前年同期高出了20%,该协会技能开发项目部的主管Gretchen Koch说。

     
    4. Networking
     
    语音,电子邮件,视频,即时通信和其它通信系统的不断融合将会继续提升对有执行经验的网络专家的需求。例如,位于纽约的Scholastic有限公司在 11月张贴了一个招聘岗位,需要一个网络综合工程师,任务是通过IP使用语音创建一个呼叫中心,儿童教育公司的高级副总裁兼首席信息官 Saad Ayub说。
     
    那些类型的项目同样经常要求新技能。在2008年,例如,CRST International有限公司将一个帧中继网络转移到美国电话电报公司(AT&T)的多协议标记交换网络,并且安装了Cisco公司的 VoIP系统。作为这个项目的一部分,爱荷华州基传输公司Cedar Rapids对他们的一些IT员工进行培训,使它们成为Cisco公司认证的语音专家,IT部门的副总裁Steve Hannah说。
     
    网络融合项目也提升了对具备网络安全和数据保密才能的工人的需求,Koeppel说,并补充这不仅仅是雇主寻找的纯粹网络骨干和构架方面的技能。

     
    5. 商业智能
     
    现在的公司执行官们比以往任何时候都希望具备分析消费者和销售数据的能力,从而对商业战略做出可靠的决策。这驱动了公司对商业智能专家的全方位需求,其中包括具备数据挖掘、数据仓储和数据管理技能的人才。
     
    Aspen Skiing Co.在西科罗拉多州公司经营着四个滑雪胜地,公司官员们年复一年地对顾客开销进行对比,包括分析早先的经济萧条期的消费习惯,首席信息官Paul Major说,我们不得不对我们的分析进行细化。
     
    同时,对有过诸如Business Objects和Cognos公司指定的商业智能工具使用经验的IT专家的需求也很稳定,Spencer Lee说。但在这个领域最紧缺的人才,是能协助商业经理理解他们用以分析的数据,并协助他们理解如何解释分析结的人才。但困难之处就是你很难找到这样的一 个综合性的人才。

     
    6. 安全
     
    说到对某些类型的安全专家的需求,Herrin表示,那些拥有SAP安全经验的人现在可能要称得上奇货可居了。
     
    在各个领域,公司对安全专家的兴趣都非常强烈。“每个公司都不可能忽略安全需求,即使在经济艰难时期也不例外,”Penske Corp.公司的首席信息官、往届Society for Information Management主席Stephen Pickett说。
     
    同样,有网络和无线安全技能的人群以及那些具有认证信息系统安全专业证书的也备受青睐。
     
    7. Web 2.0
     
    正当很多公司开始着手轻松地与诸如MySpace和Facebook之类的社交网络应用软件协作之时,越来越的公司开始着手尝试通过Web来直接和客户接触,Pickett说。
     
    持续扩张的B2B连接也驱动了对Web 2.0技能的需求的增长。例如,最近美国密尔沃基的儿童医院与健康系统为大约一半远程工作的医生的创建了一个门户网站。副总裁兼首席信息官 Mike Jones说,该系统为他们提供了病人的概要医疗数据的获取渠道。

     
    8. 数据中心


    大多数高楼大厦中的嗡嗡声都是服务器和存储虚拟项目发出的。它们帮助各个集团降低它们的能源开销,紧缩他们的数据中心规模。
     
    但是很少有公司会专门针对数据中心这一技能进行招募。相反,他们正在培训现有员工掌握VMware及其他的虚拟技术。例如,Aspen Skiing公司正在考虑于2009年将其40%以上的服务器虚拟化,Major说。为了实现这个目标,Aspen Skiing公司计划依赖VMware和EMC公司为其员工提供必要的培训。

    9. 电信
    VoIp和那些围绕标准通信的项目驱动着对电信与网络混合技术的需求,尤其是那些正在着手部署这些系统的中小型业务,Spencer Lee说。对Wi-Fi,WiMax,蓝牙和相关的技能的关注也在不断增长,Koeppel说,“尤其就像各个城市指望着把WiMax作为特色产业招商引 资一样”。


  • ORACLE学习笔记-ORACLE(基本命令)

    2009-01-05 18:37:01

    ORACLE第一章:

    --查看VGA信息:

     show sga;

     
    select * from v$sgastat;

    --可以通过以下几个动态性能视图查看信息:

     V$sysstat                系统统计信息
     V$sesstat                用户会话统计信息 
     V$pgastat               显示内存使用统计信息
     V$sql_workarea          SQL游标所用工作区的信息
     V$ sql_workarea_active    当前系统工作区的信息
    data_file:dba_data_files;
    control_file:从init.ora里面可以看到,D:ora92adminora92pfileinit.ora.
    redo_log:v$logfile;
    实际上D:ora92oradataora92里面放着很多东西。
    select * from v$database;里面可以查询archivelog的信息。
    段:dba_segments
    区:dba_extents

    --在V$process动态性能视图中可以查询到每个Oracle进程的PGA分配的内存和已使用的内存情况,
    --
    其中PGA_used_mem表示已使用的,pag_alloc_mem表示已分配的,pga_max_men表示PGA的最大值。

     SQL
    > select pid,pga_used_mem,pga_alloc_mem,pga_max_mem from v$process;

    --查看后台进程:

    SELECT * FROM v$bgprocess WHERE paddr <> '00';

    --查看所有的表空间;

     SQL
    > select tablespace_name from dba_data_files  order by tablespace_name;

    --查看表空间的名字及大小:
     SQL> select t.tablespace_name, round(sum(bytes/(1024*1024)),0) ts_size    
     
    from dba_tablespaces t, dba_data_files d    where t.tablespace_name = d.tablespace_name   
     
    group by t.tablespace_name;

    --创建表空间的语法是:
     CREATE TABLESPACE tablespacename
     DATAFILE 
    'filename' [SIZE integer [K|M]
     
    [AUTOEXTEND [OFF|ON]];
    --创建有多个数据文件的表空间:
     SQL> create tablespace  SALES
      datafile  
    'd:salesSALES_DATA01.dbf' size 10m autoextend on next 10m maxsize 100m,
      
    'd:salesSALES_DATA02.dbf' size 10m  autoextend   on next 10m maxsize
      unlimited,
    'd:salesSALES_DATA03.dbf' size 10m;

    --查看表空间的大小;

     SQL
    > SELECT TABLESPACE_NAME,SUM(BYTES)/1024/1024 MB FROM DBA_FREE_SPACE GROUP BY TABLESPACE_NAME;

    --查看表空间中数据文件存放的路径:

     SQL
    > SELECT    TABLESPACE_NAME,  BYTES/1024/1024   FILE_SIZE_MB,  FILE_NAME    FROM DBA_DATA_FILES;


    insert into date_test values(interval '12' month,'adjf');测试interval 数据类型;


    删除表空间:
    SQL
    > drop tablespace worktbs including contents;
    表空间已丢弃。

    再次查询表空间会发现已经没有worktbs表空间了。
    如果我们再次删除表空间会出现什么后果?
    删除一个不存在的表空间:
    SQL
    > drop tablespace worktbs including contents;
    drop tablespace worktbs including contents
    *
    ERROR 位于第 
    1 行:
    ORA
    -00959: 表空间'WORKTBS'不存在
    o 为表空间增加数据文件
    SQL
    > alter tablespace sales add datafile 'd:oracleoradata est esttablespace
    sales_data04.dbf
    ' size 10m autoextend on next 10m maxsize 100m,
    'c:oracleoradata est esttablespacesales_data05.dbf' size 10m autoextend on next 10m maxsize unlimited, 'c:oracleoradata est esttablespacesales_data06.dbf' size 10m;

    表空间已更改。
    o 修改数据文件的大小
    o 在数据文件中的可用空间未使用完时,允许对数据文件进行压缩,当压缩空间大小超过未使用空间大小时,将会产生错误。
    SQL
    >  alter database datafile 'c:oracleoradata est esttablespaceSALES_DATA04.dbf' resize 30m;

    数据库已更改。
    o 关闭表空间数据文件的自动扩展属性
    alter database
    o     datafile  
    'c:SALES_DATA04.dbf' ,
    o                    
    'c:SALES_DATA05.dbf',
    o                     
    'c:SALES_DATA06.dbf'
    o                      autoextend  
    off;
    o 打开表空间数据文件的自动扩展属性
    alter database
    o     datafile  
    'c:SALES_DATA04.dbf' ,
    o                    
    'c:SALES_DATA05.dbf',
    o                     
    'c:SALES_DATA06.dbf'
    o                      autoextend  
    on;

    o 修改表空间属性(离线)
    alter tablespace   sales  offline;  
    o 修改表空间属性(在线)
    alter tablespace   sales  online;
    o 修改表空间属性(只读)
    alter tablespace   sales  read  only;
    o 修改表空间属性(读写)
    alter tablespace   sales  read   write;
    o 如下系统表空间不得设置为  offline   或者  
    read only
    o system  , 
    temp,undo  ,undotbs 

    o 移动表空间的数据文件
    1.  使表空间脱机(系统表空间不得脱机,故不得移动)
    2.  修改数据文件的名称
    3.  执行  alter  tablespace  rename  datafile 命令
    4.  使表空间联机
    o 第一步:
    alter  tablespace    sales  offline;  
    o 第二步:物理移动数据文件到目的地(可以是表空间的
    o                部分数据文件,可以修改数据文件的名称)
    o 第三步:    逻辑移动,修改控制文件的内容

    alter  tablespace sales  rename 
    o datafile 
    'c:sales01.dbf' to 'd:sales02.dbf'
    --可以有多个数据文件,但是源文件
    o 要在to的左边,目的文件要在to 右边,文件名称之间逗号分割.
    o 第四步: 将表空间联机
    alter   tablespace  sales   online;
    o 第五步:查询dba_data_files确认

    o 创建用户,指定默认表空间,磁盘配额
    o  
    create  user rose identified by rose   default
    o tablespace sales quota 10m 
    on sales;
    o 给用户授权
    grant   connect,resource,dba to rose;
    o 用户登录
    o connect   rose
    /rose
    o 创建表
    create table  emp(eid  number
    o 该表默认放在表空间  sales   中
    o 查询用户的存储限额dba_ts_quotas 
    o 删除表空间(如果该表空间为空)
    drop tablespace sales  ;
    o 删除表空间的同时删除数据文件(不为空)
    drop tablespace sales  including contents  and  datafiles;
    o 创建表的同时指定该表的存储位置
    o  
    create table mytab(tid  int ) tablespace sales;

    o 删除表空间(如果该表空间为空)
    drop tablespace sales  ;
    o 删除表空间的同时删除数据文件(不为空)
    drop tablespace sales  including contents  and  datafiles;
    o 创建表的同时指定该表的存储位置
    o  
    create table mytab(tid  int ) tablespace sales;


    o 查看当前用户每个表占用空间的大小:
    select  segment_name,sum(bytes)/1024/1024 from user_extents group by segment_name 
    o 查看每个表空间占用空间的大小:
    select tablespace_name,sum(bytes)/1024/1024 from dba_segments group by tablespace_name 


    只有用合法的用户帐号才能访问Oracle数据库
    Oracle 有几个默认的数据库用户  
    Scott
    /tiger

    创建一个名称为 martin 的用户,其密码为 martinpwd
    CREATE USER MARTIN IDENTIFIED BY martinpwd
    DEFAULT TABLESPACE USERS
    TEMPORARY TABLESPACE TEMP;

    GRANT 命令可用于为用户分配权限或角色;
    CONNECT角色允许用户连接至数据库,并创建数据库对象。
    GRANT CONNECT TO MARTIN; 

    RESOURCE角色允许用户使用数据库中的存储空间。
    GRANT RESOURCE TO MARTIN; 

    此系统权限允许用户在当前模式中创建序列,此权限包含在CONNECT角色中。
    GRANT CREATE SEQUENCE TO MARTIN; 

    GRANT CREATE SESSION TO MARTIN;

    GRANT CREATE TABLE TO MARTIN;

    GRANT CREATE VIEW TO MARTIN;

    GRANT CREATE SEQUENCE TO MARTIN;

     

    授予用户 MARTIN 操作emp表对象的权限 :
    允许用户查询 TEST 表的记录
    GRANT SELECT ON EMP TO MARTIN; 

    允许用户更新 TEST 表中的记录
    GRANT UPDATE ON EMP TO MARTIN; 

    允许用户插入、删除、更新和查询 TEST 表中的记录
    GRANT ALL ON EMP TO MARTIN; 


    ALTER USER 命令可用于更改口令:
    修改 MARTIN 用户的密码:
    ALTER USER MARTIN IDENTIFIED BY martinpass;
    DROP USER 命令用于删除用户: 
    删除 MARTIN 用户模式:
    DROP USER MARTIN CASCADE;


    alter session set nls_date_format='yyyy-mm-dd';

    create table customer(customer_id int not null,constraint pk_id primary key(customer_id));
    create table salesinfo(salesid varchar2(10),customer_id int not null,primary key(salesid,customer_id),
    foreign key (customer_id) references customer(customer_id) on delete cascade);

    insert into date_test values(to_date('09-09-09','dd-mm-yy'),'akldjf');
    alter table date_test modify current_date timestamp
    create table timestamp_test (currenttime timestamp with time zone);
    insert into timestamp_test values(to_timestamp('2006-09-09 12:12:12','yyyy-mm-dd hh:mi:ss'));
  • SQL Server,Oracle,DB2数据库SQL语句比较

    2009-01-05 18:32:15

    1.1.1 取前n条记录

           SQL Server:      Select top n * from xtable

           Oracle:          Select * from xtable where rownum <=n

           DB2:             Select * from xtable fetch first n rows only

    1.1.2 取当前日期

           SQL Server:      Select getdate()

           Oracle:          Select sysdate from dual

           DB2:             Select current   timestamp from sysibm.sysdummy1

    1.1.3 连接字符串

    SQL Server:    Select Hello+Toone

    Oracle:        Select   Hello||Toone from dual

    DB2:           Select   Hello||Toone from sysimb.sysdummy1

    1.1.4 空值转换

           SQL Server:      SELECT   userid,username,isnull(email,0) FROM AUTH_USER

           Oracle:          SELECT   userid,username,nvl(email,0) FROM AUTH_USER

           DB2:             SELECT   userid,username,value(email,0) FROM AUTH_USER

    1.1.5 类型转换

           SQL Server:      SELECT convert(varchar,getdate(),20)

           Oracle:          SELECT   to_char(sysdate,yyyy-mm-dd hh24:mi:ss) from dual

           DB2:             SELECT   varchar(current timestamp) from sysibm.sysdummy1

           注1:

       ■SQL   Server中转换日期格式改变Style参数:20 ;    

       ■Oracle中转换日期格式改变格式化参数:yyyy-mm-dd   hh24:mi:ss   ‘yyyy’、’mm’、’dd’、’hh12’、’hh24’、’mi’、’ss’等;     

       ■Db2中转换日期格式改变系统常量:current timestamp ‘current date’、’current   time’等;

           注2:     

       ■SQL Server数据类型改变“数据类型参数”:int、varchar等;     

       ■Oracle数据类型改变函数:to_char()、to_date()、to_number()等;     

       ■DB2数据类型改变函数:varchar()、int()、date()、time()等;

    1.1.6 取值判断

    SQL Server:   select   case Convert = case when g.master_type =system    then 管理员     when g.master_type =roletype then 特殊角色    else 普通用户    end from global_code g

    Oracle:       select   case g.master_type    when system    then 管理员    when roletype then 特殊角色   else 普通用户 end    AS caseConvert from global_code g

    DB2:          select   case g.master_type   when system    then 管理员   when roletype then 特殊角色 else 普通用户   end    AS caseConvert From global_code g

    1.1.7 位置 SQL

           Server:      select charindex(E,ABCDEF) select patindex(%E%,ABCDEF)

           Oracle:      select instr(ABCDEF,E) from dual

           DB2:         Select locate(E,ABCDEF) from

           sysibm.sysdummy1

    1.1.8 其他函数          SQL Server    Oracle      DB2

       长度    Len()        Length()    Length()

       取子串 Substring() Substr()    Substr()                  

    1.2      

           附

    1.2.1 DB2V8.

    1常用命令

    ■   创建数据库 在服务器上执行      db2 CREATE DB oatemp

    ■   删除数据库 在服务器上执行      db2 DROP DB oatemp

    ■   创建表空间 db2 CREATE USER TEMPORARY TABLESPACE USERSPACE1 MANAGED BY SYSTEM USING ( USERSPACE1)

             ■   启动数据库 切换用户         su – db2inst1      启动数据库:          db2start

             ■   关闭数据库 切换用户         su – db2inst1      关闭数据库          db2stop [force]

             ■   创建远程管理节点      进入   DB2命令窗口      db2 CATALOG TCPIP NODE asnode REMOTE 10.1.22.176 SERVER 50000    db2 CATALOG DB oadb2 AS oadb2 AT NODE asnode

    ■   连接数据库          db2 CONNECT   TO oadb2 USER db2inst1 USING ibmdb2

             ■   关闭数据库连接      db2 terminate

             ■   执行脚本            db2 -td! -vf ioa2.db2 -z info.log

    ■   导出脚本            db2look -d oadb2 -i db2inst1 -w ibmdb2 -e -o putsql.db2 -t auth_user db2look -d oadb2 -i db2inst1 -wibmdb2 -e -o putsq.db2

             ■   查看正在使用的端口 netstat -a

             ■   查询系统表          select count(*) from SYSCAT.TABLES where TABSCHEMA=’DB2INST1’      select count(*)   from SYSCAT.PROCEDURES where PROCSCHEMA=’DB2INST1’

             ■   常用命令 DB2 SELECT DROP TALBE ||TABNAME FROM SYSCAT.TABLES WHERE T ABSCHEMA=DB2INST1 AND TYPE=T >db2droptables.db2    DB2 SELECT DROP VIEW ||TABNAME FROM SYSCAT.TABLES WHERE T ABSCHEMA=DB2INST1 AND TYPE=V >db2dropviews.db2    DB2 –vf db2droptables.db2 –z info.log db2 SELECT username FROM auth_user FETCH FIRST 3 ROWS ONLY  

             ■   启动JDBC      db2jstrt JDBC APPLET SERVER 6789     

    1.1       数据库移植注意事项

    1.1.1 取前n条记录

    SQL Server: Select top n * from xtable

    Oracle:Select * from xtable where rownum <=n

    DB2:Select * from xtable fetch first n rows only

    1.1.2 取当前日期

    SQL Server: Select getdate()

    Oracle: Select sysdate from dual

    DB2: Select current timestamp from sysibm.sysdummy1

    1.1.3 连接字符串

    SQL Server: Select 'Hello'+'Toone'

    Oracle: Select 'Hello'||'Toone' from dual

    DB2: Select 'Hello'||'Toone' from sysimb.sysdummy1

    1.1.4 空值转换

    SQL Server:SELECT userid,username,isnull(email,'0') FROM AUTH_USER

    Oracle: SELECT userid,username,nvl(email,'0') FROM AUTH_USER

    DB2:SELECT userid,username,value(email,'0') FROM AUTH_USER

    1.1.5 类型转换

    SQL Server: SELECT convert(varchar,getdate(),20)

    Oracle:SELECT to_char(sysdate,'yyyy-mm-dd hh24:mi:ss') from dual

    DB2: SELECT varchar(current timestamp) from sysibm.sysdummy1

    注1:

         ■SQL Server中转换日期格式改变Style参数:20 ;

         ■Oracle中转换日期格式改变格式化参数:yyyy-mm-dd hh24:mi:ss XML:namespace prefix = o ns = "urn:schemas-microsoft-com:Office:office" />

             ‘yyyy’、’mm’、’dd’、’hh12’、’hh24’、’mi’、’ss’等;

         ■Db2中转换日期格式改变系统常量:current timestamp

             ‘current date’、’current time’等;

    注2:

         ■SQL Server数据类型改变“数据类型参数”:int、varchar等;

         ■Oracle数据类型改变函数:to_char()、to_date()、to_number()等;

         ■DB2数据类型改变函数:varchar()、int()、date()、time()等;

    1.1.6 取值判断

    SQL Server:

    select caseConvert =

          case when g.master_type ='system'    then '管理员'

               when g.master_type ='roletype' then '特殊角色'

               else '普通用户'

          end

    from global_code g

    Oracle:

    select   case g.master_type

               when 'system'    then '管理员'

               when 'roletype' then '特殊角色'

               else '普通用户'

          end

          AS caseConvert

    from global_code g

    DB2:

        

    select   case g.master_type

               when 'system'    then '管理员'

               when 'roletype' then '特殊角色'

               else '普通用户'

          end

          AS caseConvert

    From global_code g

    1.1.7 位置

    SQL Server:

         select charindex('E','ABCDEF')

    select patindex('%E%','ABCDEF')

    Oracle:

         select instr('ABCDEF','E') from dual

    DB2:

         Select locate('E','ABCDEF') from sysibm.sysdummy1

    1.1.8 其他函数

          SQL Server      Oracle     DB2

    长度   Len()          Length()   Length()

    取子串Substring()    Substr()   Substr()

      

      

      

      

      

      

    1.2       附

    1.2.1 DB2V8.1常用命令

    ■   创建数据库在服务器上执行 db2 CREATE DB oatemp

    ■   删除数据库在服务器上执行db2 DROP DB oatemp

    ■   创建表空间

    db2 "CREATE USER TEMPORARY TABLESPACE USERSPACE1 MANAGED BY SYSTEM USING (' USERSPACE1')"

    ■   启动数据库 切换用户 su – db2inst1

         启动数据库:db2start

    ■   关闭数据库 切换用户 su – db2inst1 关闭数据库 db2stop [force]

    ■   创建远程管理节点进入   DB2命令窗口

         db2 CATALOG TCPIP NODE asnode REMOTE 10.1.22.176 SERVER 50000

         db2 CATALOG DB oadb2 AS oadb2 AT NODE asnode

    ■   连接数据库

         db2 CONNECT TO oadb2 USER db2inst1 USING ibmdb2

    ■   关闭数据库连接

         db2 terminate

    ■   执行脚本

         db2 -td! -vf ioa2.db2 -z info.log

    ■   导出脚本

    db2look -d oadb2 -i db2inst1 -w ibmdb2 -e -o putsql.db2 -t auth_user

    db2look -d oadb2 -i db2inst1 -w ibmdb2 -e -o putsq.db2

    ■   查看正在使用的端口

         netstat -a

    ■   查询系统表

         select count(*) from SYSCAT.TABLES where TABSCHEMA=’DB2INST1’     select count(*) from SYSCAT.PROCEDURES where PROCSCHEMA=’DB2INST1’

  • windows2003如何创建系统用户?

    2009-01-05 18:01:45

    1,运行“lusrmgr.msc”命令
    2,在users组里新建用户
    3,进入Groups组,根据所要给的权限,把新建的用户加到相应的组里。
  • ASCII、Unicode和UTF-8

    2009-01-04 19:15:21

    ASCII、Unicode和UTF-8

     

    1. ASCII码

    我 们知道,在计算机内部,所有的信息最终都表示为一个二进制的字符串。每一个二进制位(bit)有0和1两种状态,因此八个二进制位就可以组合出256种状 态,这被称为一个字节(byte)。也就是说,一个字节一共可以用来表示256种不同的状态,每一个状态对应一个符号,就是256个符号,从 0000000到11111111。

    上个世纪60年代,美国制定了一套字符编码,对英语字符与二进制位之间的关系,做了统一规定。这被称为ASCII码,一直沿用至今。

    ASCII码一共规定了128个字符的编码,比如空格"SPACE"是32(二进制00100000),大写的字母A是65(二进制01000001)。这128个符号(包括32个不能打印出来的控制符号),只占用了一个字节的后面7位,最前面的1位统一规定为0。

    2、非ASCII编码

    英 语用128个符号编码就够了,但是用来表示其他语言,128个符号是不够的。比如,在法语中,字母上方有注音符号,它就无法用ASCII码表示。于是,一 些欧洲国家就决定,利用字节中闲置的最高位编入新的符号。比如,法语中的é的编码为130(二进制10000010)。这样一来,这些欧洲国家使用的编码 体系,可以表示最多256个符号。

    但是,这里又出现了新的问题。不同的国家有不同的字母,因此,哪怕它们都使用256个符号的编码方式,代 表的字母却不一样。比如,130在法语编码中代表了é,在希伯来语编码中却代表了字母Gimel (ג),在俄语编码中又会代表另一个符号。但是不管怎样,所有这些编码方式中,0-127表示的符号是一样的,不一样的只是128-255的这一段。

    至 于亚洲国家的文字,使用的符号就更多了,汉字就多达10万左右。一个字节只能表示256种符号,肯定是不够的,就必须使用多个字节表达一个符号。比如,简 体中文常见的编码方式是GB2312,使用两个字节表示一个汉字,所以理论上最多可以表示256x256=65536个符号。

    中文编码的问题需要专文讨论,这篇笔记不涉及。这里只指出,虽然都是用多个字节表示一个符号,但是GB类的汉字编码与后文的Unicode和UTF-8是毫无关系的。

    3.Unicode

    正如上一节所说,世界上存在着多种编码方式,同一个二进制数字可以被解释成不同的符号。因此,要想打开一个文本文件,就必须知道它的编码方式,否则用错误的编码方式解读,就会出现乱码。为什么电子邮件常常出现乱码?就是因为发信人和收信人使用的编码方式不一样。

    可以想象,如果有一种编码,将世界上所有的符号都纳入其中。每一个符号都给予一个独一无二的编码,那么乱码问题就会消失。这就是Unicode,就像它的名字都表示的,这是一种所有符号的编码。

    Unicode 当然是一个很大的集合,现在的规模可以容纳100多万个符号。每个符号的编码都不一样,比如,U+0639表示阿拉伯字母Ain,U+0041表示英语的 大写字母A,U+4E25表示汉字"严"。具体的符号对应表,可以查询unicode.org,或者专门的汉字对应表。

    4. Unicode的问题

    需要注意的是,Unicode只是一个符号集,它只规定了符号的二进制代码,却没有规定这个二进制代码应该如何存储。

    比如,汉字"严"的unicode是十六进制数4E25,转换成二进制数足足有15位(100111000100101),也就是说这个符号的表示至少需要2个字节。表示其他更大的符号,可能需要3个字节或者4个字节,甚至更多。

    这 里就有两个严重的问题,第一个问题是,如何才能区别unicode和ascii?计算机怎么知道三个字节表示一个符号,而不是分别表示三个符号呢?第二个 问题是,我们已经知道,英文字母只用一个字节表示就够了,如果unicode统一规定,每个符号用三个或四个字节表示,那么每个英文字母前都必然有二到三 个字节是0,这对于存储来说是极大的浪费,文本文件的大小会因此大出二三倍,这是无法接受的。

    它们造成的结果是:

    1)出现了unicode的多种存储方式,也就是说有许多种不同的二进制格式,可以用来表示unicode。
    2)unicode在很长一段时间内无法推广,直到互联网的出现。

     

    5.UTF-8

    互联网的普及,强烈要求出现一种统一的编码方式。UTF-8就是在互联网上使用最广的一种unicode的实现方式。其他实现方式还包括UTF-16和UTF-32,不过在互联网上基本不用。重复一遍,这里的关系是,UTF-8是Unicode的实现方式之一。

    UTF-8最大的一个特点,就是它是一种变长的编码方式。它可以使用1~4个字节表示一个符号,根据不同的符号而变化字节长度。

    UTF-8的编码规则很简单,只有二条:

    1)对于单字节的符号,字节的第一位设为0,后面7位为这个符号的unicode码。因此对于英语字母,UTF-8编码和ASCII码是相同的。

    2)对于n字节的符号(n>1),第一个字节的前n位都设为1,第n+1位设为0,后面字节的前两位一律设为10。剩下的没有提及的二进制位,全部为这个符号的unicode码。

    下表总结了编码规则,字母x表示可用编码的位。

    Unicode符号范围 | UTF-8编码方式
    (十六进制) | (二进制)
    --------------------+---------------------------------------------
    0000 0000-0000 007F | 0xxxxxxx
    0000 0080-0000 07FF | 110xxxxx 10xxxxxx
    0000 0800-0000 FFFF | 1110xxxx 10xxxxxx 10xxxxxx
    0001 0000-0010 FFFF | 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx

     

     

    下面,还是以汉字"严"为例,演示如何实现UTF-8编码。

    已 知"严"的unicode是4E25(100111000100101),根据上表,可以发现4E25处在第三行的范围内(0000 0800-0000 FFFF),因此"严"的UTF-8编码需要三个字节,即格式是"1110xxxx 10xxxxxx 10xxxxxx"。然后,从"严"的最后一个二进制位开始,依次从后向前填入格式中的x,多出的位补0。这样就得到了,"严"的UTF-8编码 是"11100100 10111000 10100101",转换成十六进制就是E4B8A5。

    6. Unicode与UTF-8之间的转换

    通过上一节的例子,可以看到"严"的Unicode码是4E25,UTF-8编码是E4B8A5,两者是不一样的。它们之间的转换可以通过程序实现。

    在Windows平台下,有一个最简单的转化方法,就是使用内置的记事本小程序Notepad.exe。打开文件后,点击"文件"菜单中的"另存为"命令,会跳出一个对话框,在最底部有一个"编码"的下拉条。

    里面有四个选项:ANSI,Unicode,Unicode big endian 和 UTF-8。

    1)ANSI是默认的编码方式。对于英文文件是ASCII编码,对于简体中文文件是GB2312编码(只针对Windows简体中文版,如果是繁体中文版会采用Big5码)。

    2)Unicode编码指的是UCS-2编码方式,即直接用两个字节存入字符的Unicode码。这个选项用的little endian格式。

    3)Unicode big endian编码与上一个选项相对应。我在下一节会解释little endian和big endian的涵义。

    4)UTF-8编码,也就是上一节谈到的编码方法。

    选择完"编码方式"后,点击"保存"按钮,文件的编码方式就立刻转换好了。

    7. Little endian和Big endian

    上 一节已经提到,Unicode码可以采用UCS-2格式直接存储。以汉字"严"为例,Unicode码是4E25,需要用两个字节存储,一个字节是4E, 另一个字节是25。存储的时候,4E在前,25在后,就是Big endian方式;25在前,4E在后,就是Little endian方式。

    这 两个古怪的名称来自英国作家斯威夫特的《格列佛游记》。在该书中,小人国里爆发了内战,战争起因是人们争论,吃鸡蛋时究竟是从大头(Big- Endian)敲开还是从小头(Little-Endian)敲开。为了这件事情,前后爆发了六次战争,一个皇帝送了命,另一个皇帝丢了王位。

    因此,第一个字节在前,就是"大头方式"(Big endian),第二个字节在前就是"小头方式"(Little endian)。

    那么很自然的,就会出现一个问题:计算机怎么知道某一个文件到底采用哪一种方式编码?

    Unicode规范中定义,每一个文件的最前面分别加入一个表示编码顺序的字符,这个字符的名字叫做"零宽度非换行空格"(ZERO WIDTH NO-BREAK SPACE),用FEFF表示。这正好是两个字节,而且FF比FE大1。

    如果一个文本文件的头两个字节是FE FF,就表示该文件采用大头方式;如果头两个字节是FF FE,就表示该文件采用小头方式。

    8. 实例

    下面,举一个实例。

    打开"记事本"程序Notepad.exe,新建一个文本文件,内容就是一个"严"字,依次采用ANSI,Unicode,Unicode big endian 和 UTF-8编码方式保存。

    然后,用文本编辑软件UltraEdit中的"十六进制功能",观察该文件的内部编码方式。

    1)ANSI:文件的编码就是两个字节"D1 CF",这正是"严"的GB2312编码,这也暗示GB2312是采用大头方式存储的。

    2)Unicode:编码是四个字节"FF FE 25 4E",其中"FF FE"表明是小头方式存储,真正的编码是4E25。

    3)Unicode big endian:编码是四个字节"FE FF 4E 25",其中"FE FF"表明是大头方式存储。

    4)UTF-8:编码是六个字节"EF BB BF E4 B8 A5",前三个字节"EF BB BF"表示这是UTF-8编码,后三个"E4B8A5"就是"严"的具体编码,它的存储顺序与编码顺序是一致的。

    9. 延伸阅读

    * The Absolute Minimum Every Software Developer Absolutely, Positively Must Know About Unicode and Character Sets(关于字符集的最基本知识)

    * 谈谈Unicode编码

    * RFC3629:UTF-8, a transformation format of ISO 10646(如果实现UTF-8的规定)

    (完)

    PS:本文只是主要介绍了UTF-8编码,下面这篇文章对于GB码与Big5有更详细的介绍。

    汉字编码中现在主要用到的有三类,包括GBK,GB2312和Big5。

    1、 GB2312又称国标码,由国家标准总局发布,1981年5月1日实施,通行于大陆。新加坡等地也使用此编码。它是一个简化字的编码规范,当然也包括其他 的符号、字母、日文假名等,共7445个图形字符,其中汉字占6763个。我们平时说6768个汉字,实际上里边有5个编码为空白,所以总共有6763个 汉字。

    GB2312规定"对任意一个图形字符都采用两个字节表示,每个字节均采用七位编码表示",习惯上称第一个字节为"高字节",第二个 字节为"低字节"。GB2312中汉字的编码范围为,第一字节0xB0-0xF7(对应十进制为176-247),第二个字节0xA0-0xFE(对应十 进制为160-254)。

    GB2312将代码表分为94个区,对应第一字节(0xa1-0xfe);每个区94个位 (0xa1-0xfe),对应第二字节,两个字节的值分别为区号值和位号值加32(2OH),因此也称为区位码。01-09区为符号、数字区,16-87 区为汉字区(0xb0-0xf7),10-15区、88-94区是有待进一步标准化的空白区。

    2、Big5又称大五码,主要为香港与台湾使 用,即是一个繁体字编码。每个汉字由两个字节构成,第一个字节的范围从0X81-0XFE(即129-255),共126种。第二个字节的范围不连续,分 别为0X40-0X7E(即64-126),0XA1-0XFE(即161-254),共157种。

    3、GBK是GB2312的扩展,是向 上兼容的,因此GB2312中的汉字的编码与GBK中汉字的相同。另外,GBK中还包含繁体字的编码,它与Big5编码之间的关系我还没有弄明白,好像是 不一致的。GBK中每个汉字仍然包含两个字节,第一个字节的范围是0x81-0xFE(即129-254),第二个字节的范围是0x40-0xFE(即 64-254)。GBK中有码位23940个,包含汉字21003个。

  • WordPress

    2008-12-26 18:52:37

    WordPress 是一种使用 PHP 语言和 MySQL 数据库开发的开源、免费的 Blog(博客,网志)引擎,用户可以在支持 PHP 和 MySQL 数据库的服务器上建立自己的 Blog。

      WordPress 是一个功能非常强大的博客系统,插件众多,易于扩充功能。安装和使用都非常方便。目前 WordPress 已经成为主流的 Blog 搭建平台。

      WordPress 的原版是英文版的,UTF-8 编码,最新版本为 2.5。有爱好者开发了中文语言包,使其可以支持中文。不过,由于使用的编码原因,中文字符截断时会出现乱码。不过桑葚网友制作的中文 WordPress 工具箱插件可以解决这个问题。

      WordPress 的下载地址是:http://wordpress.org/
      WordPress 的在线中文帮助说明文档:http://codex.wordpress.org.cn/
       wordPress 中文论坛:http://hd.zzbaike.com/wordpress/


      WordPress 拥有世界上最强大的插件的模板。个人可以根据它的核心程序提供的规则自己开发模板和插件。他可以在瞬间把你的博客改变成 cms、foruns、门户等各种类型的站点。它强大的功能另你刮目相看。   WordPress Theme 风格模板是世界上的程序里最多的。类型复杂,品质可嘉,样式繁多,你只需要把不同的模板文件放到空间的 Theme 目录下就可以自由的在后台变幻,方便适用,而且不管你安装的的什么语言包,都可以自由的使用这些风格。根本没有限制。

      WordPress Plugin 扩展插件太多,导致我都无法选择几种来为你详细的解释。但是我要告诉你的是,只要你掌握了 plugin 目录下插件文件的使用方法,什么程序在你的眼里都将会是小儿科。只需要把插件文件上传到你 FTP 的 plugin 目录下,就可以直接在后台起用管理。甚至功能强大点的插件会有一个自己的管理目录在后台出现,就象程序自带似的方便,它强大的插件囊括的所有互联网上可以 实现的功能。拥有这些插件,笑傲江湖不在是神话。

      WordPress 可以说是世界上目前最先进的 weblog 程序。目前开发的程序大多都是根据它仿造的。它更能把握搜索引擎,在你使用 WordPress 并掌握几种插件后,对于优化将不用过多的操心,它会为你想的更多。  

    WordPress.com是全球重要的博客运营商之一,也是一个开源的博客信息发布系统,网站总部位于美国德克萨斯州的休斯敦,创始人是马修穆伦 维格(Matthew Mullenweg)。WordPress.com是最近一年来全球最火的网站之一,去年8月,该网站在Alexa的排名还仅列69位。不到一年的时间, 其排名就飙升了35位。根据Alexa网站的最新统计数据,现在WordPress.com的流量排名为全球第34位。

      WordPress.com现有员工不到20名,但网站自2000年3月20日问世以来访问量一直稳步攀升,来自Google Analytics的数据显示,截至2008年5月18日,该公司的日最大页面访问量已突破2800万,访问用户主要来自美国、印尼、巴西、墨西哥、印 度。目前已开通了中文网站:http://zh.wordpress.com/。

      WordPress.com目前拥有3个数据中心,分别位于美国的达拉斯、旧金山和圣安东尼奥,运营的服务器数量达数百台。高速度、大容量的后 台支持保证了用户的数据能够迅速更新,强大的备份支持使用户的数据不会轻易丢失。这对于许多博客来说非常有吸引力。该网站另外一个吸引人的地方是所有基本 服务都是免费的,虽然注册的程序略显繁琐,但强大的数据服务功能和免费使用还是令大量博主趋之若骛。

      WordPress.com提供近60个博客主题,从专业博客到娱乐博客到奇闻趣事几乎无所不包。此外,该网站与其它网站兼容良好。用户可以在 WordPress.com博客上轻松编辑Flickr或Photobucket的相片,也可以方便地将来自谷歌和YouTube的视频嵌入到博客文章 中。网站还提供预览功能,使编辑的效果一览无余。

      除此之外,WordPress.com还具备较强的抗干扰功能,能够有效地识别和过滤垃圾信息。该网站使用目前最为流行的Akismet信息过 滤和追溯系统,能够将绝大多数垃圾评论和信息拒之博客之外。据说部分博客每天收到的上千条垃圾评论都能被该系统屏蔽掉。WordPress.com目前已 经形成了一个范围广泛的网络社区,爱好和兴趣相似的博客们可以共享信息,并且可以相互联系。

      除了大众化的博客服务外,WordPress.com还为高级用户提供了一些专门的服务,比如WordPress.com付费服务、 WordPress.com VIP主机服务、WordPress.com翻译服务、m.wordpress.com手机博客服务等等。这些高级服务为博客们提供了丰富的选择,同时也 为WordPress.com赢得了更加广泛的知名度。总体而言,WordPress.com称得上是一个功能齐全、服务优良的博客运营网站。

  • SAP常识

    2008-12-26 13:53:31

    实施ERP,至少有三个方面的好处:1.各种信息能够得到即时的处理与传递。如有非常及时性的财务数据及库存数据,这对于大型企业是非常必要的。2.可以打破企业管理者 的管理边界,同时不会造成效率上的损失。传统的分工理论形成的每个管理人员的管理边界,超出次边界将是不经济的,但实施ERP,如上问题可以轻松得以解 决,因为ERP的精髓就是要信息的及时处理与传递。信息的及时传递及处理可以使管理的边界得以突破。实施ERP可以将管理的需求“一竿子捅到底” 3.可以降低企业内部的交易费用,同时也有利于企业组织结构的再造。实施了ERP,各项交易、业务流程都变得透明,信息也得到了及时的处理与传递,带来的 结果是内部交易费用的降低,机构的设置也将变的简单、高效,原来“金字塔型”的组织结构变成了“扁平型”的组织结构。毫无疑问,如上种种好处,将会使成功 实施ERP的企业在激烈的市场竞争中获得极大的优势,具体地说,将会使企业降低费用、提高资金的运用效率,提供决策的准确数据、降低机会成本等。
         SAP 公司成立于1972年,总部位于德国沃尔多夫市,是全球最大的企业管理和协同化商务解决方案供应商、全球第三大独立软件供应商。目前,在全球有120多个 国家的超过24,450家用户正在运行着84,000多套SAP软件。财富500强80%以上的企业都正在从SAP的管理方案中获益。SAP在全球50多 个国家拥有分支机构,并在多家证券交易所上市,包括法兰克福和纽约证交所。SAP早在八十年代就开始同中国的国营企业合作,并取得了成功经验。1995年 在北京正式成立SAP中国公司,并陆续建立了上海、广州、大连分公司。
        作为中国市场绝对的领导者,SAP 早在八十年代就开始同中国的国营企业合作,并取得了成功经验。1995年在北京正式成立 SAP 中国公司,并陆续建立了上海、广州、大连等分公司。10年间,SAP 本着将国际先进的管理知识同中国企业的实际相结合的宗旨,充分满足了中国企业追求管理变革的要求。SAP 以信息技术为核心不断推出适应企业管理需求和符合企业行业特点的商务解决方案,并汇同合作伙伴帮助中国企业进行管理改革,增强竞争力。作为中国 ERP 市场的绝对领导者,SAP 的市场份额已经达到30%,年度业绩以50%以上的速度递增。
    SAP(ERP)德文:systeme, anwendungen, produkte in der datenverarbetung
    英文:systems, applications, and products in data processing
    中文:数据处理中的系统、应用、产品的简称


    SAP Business Suite


        当前SAP公司的主力产品包,里面包含了mySAP ERP, mySAP CRM, mySAP SCM .... 几乎是SAP的所有东东。如果购买的是此种许可证,就意味着几乎可以用SAP的所有产品的功能--某些特定行业的特定引擎(Engine)除外。
    mySAP ERP主要就是以前的SAP R/3加上SAP最新的集成平台SAP Netweaver。

    mySAP CRM

            之 所以叫mySAP CRM而不是SAP CRM,就是为了突出SAP的CRM产品是以客户为中心的、灵活可配置的……所以叫”my***“,mySAP CRM主要就是包括SAP的CRM产品功能包(Logic Box)再加上SAP最新的集成平台SAP Netweaver。SAP Netweaver是SAP最新的集成应用平台,一方面SAP用这么一个平台来集成SAP与非SAP(Oracle,Siebel, ...)应用系统;另一方面SAP把一些各个系统都可以通用的功能放入此平台中,如SAP门户( SAP Portal)可以访问各种SAP应用系统(ERP, CRM...)及非SAP系统、SAP商务智能(SAP BI)可以对来自各种系统的数据进行分析……
    mySAP.com这是前几年SAP为了迎合网络风潮而给自己的产品包改的名字,它跟
    http://www.mysap.com/这个网站没有任何实质关系,其实它就是现在的sap,和http://www.mysap.com/这个网站没有任何实质关...它就是现在的SAP Business Suite。
            SAP R/3以前SAP公司的主力产品,包括大家非常熟悉的SD, MM, FI, CO, PP..等模块。但从今年起SAP已经不再单独出售R/3的许可证,代之以mySAP ERP。也就意味着客户无论选择SAP的何种产品(mySAP ERP, mySAP CRM...)都会得到SAP Netweaver,其中包括了SAP Portal 与SAP BW的使用许可。
    SAP All-in One (SAP A1)在SAP R/3的基础上,SAP做了一些预配置,然后按不同行业交给咨询合作伙伴,由他们再加一些预配置,然后以咨询合作伙伴的名义将加了预配置的系统销售给用户。内含mySAP CRM的部分功能。
            SAP Business One (SAP B1)在SAP收购的另一家公司的产品基础上改造而成,优点是价格低廉,并且由于数据结构相同可以无缝地将系统升级至SAP A1, SAP Business Suite。SAP B1中有CRM功能,但远不及mySAP CRM系
    统中的那么强大。
        SAP Release版本之间的差异和关系:
    版本4.6C以前是所谓传统的r3系 统,建立在SAP Basis的基础上;版本4.70以后,改为R3Enterprise,最大的变化是SAP WEB AS取代了传统的Basis,核心业务功能模块也作了划分;R3 Enterprise之后改称为mySAP ERP2004,基础平台演变成SAP NetWeaver,并产生SAP ECC (ECC = ERPCentral Component) ,作为Enterprise的替代,并集成了BW,SEM和ITS;2005第4季度开始mySAP ERP2005的准备,最大的变化将是全面转向ESA体系(基于消息机制的企业应用体系),并引入了新的功能模块,比如PLM和SRM.

  • SAP

    2008-12-26 13:52:18

    SAP介绍

    是一个erp系统,sap公司的
    SAP是一个领先的ERP软件.
    Systems ,Application,and Products in Data processing
    SAP R/3软件具备以下功能和主要特点:
    功能性:R/3以模块化的形式提供了一整套业务措施,其中的模块囊括了全部所需要的业务功能并把用户与技术性应用软件相联而形成一个总括的系统,用于公司或企业战略上和运用上的管理。
    集成化: R/3把逻辑上相关联的部分连接在一起。重复工作和多余数据被完全取消,规程被优化,集成化的业务处理取代了传统的人工操作。
    灵活性:R/3系统中方便的裁剪方法使之具有灵活的适应性,从而能满足各种用户的需要和特定行业的要求。R/3还配备有适当的界面来集成用户自己的软件或外来的软件。
    开放性:R/3的体系结构符合国际公认的标准,使客户得以突破专用硬件平台及专用系统技术的局限。同时,SAP提供的开放性接口,可以方便地将第三方软件产品有效地集成到R/3系统中来。
    用户友好:图标与图形符号简化了人机交互时的操作。统一设计的用户界面确保了工作人员能够运用同样的熟悉的技术从事不通的工作。
    模块化:R/3的模块结构使用户既可以一个一个的选用新的实用程序,也可以完全转入一个新的组织结构体系。
    可靠:作为用户的商业伙伴SAP始终不断地为集成化软件的质量设立越来越多的国际标准。
    低成本高效益:信息处理是取得竞争优势的要点之一。当竞争加剧时,企业必须更加努力地获取其市场占有量。这就要使用高度集成化的数据处理软件,而R/3正是这种软件的优秀典范。
    国际适用:R/3支持多种语言,而且是为跨国界操作而设计的。R/3可以灵活地适应各国的货币及税物要求。
    服务:R/3系统实施过程中,用户将得到SAP技术专家的全面支持与服务,包括组织结构方面与技术方面的咨询,项目计划与实施方面的协助,以及培训课程。
    1972年,德国,曼海姆的IBM公司。任职销售顾问的Hasso Plattner在等待着公司对自己建议的回复。他的建议就是开发财务软件包,用现成的软件包取代昂贵的定制应用。
    当IBM公司回绝了他的建议之后,他和4名做软件工程师的同事离开了IBM,白手起家创办SAP软件公司。
    而今,每天早上,世界500强中80%的公司都会进入由SAP公司提供的管理和协同商务平台,进行高效率的工作。一向好斗、性格倔强、勇于接受 挑战的SAP联合主席兼首席执行官Plattner在经历了SAP的诸多风浪之后,当他看到SAP在软件市场低迷的情况下,2001年第三季度仍旧实现了 赢利预期,前三个月的收入达到50亿欧元,收入增长率为23%,高兴地评论道: “虽然近来软件市场,特别是美国市场有巨大的变化,客户纷纷推迟软件的购买计划,但对于现在最有效的解决方案,企业还是愿意投资的。越来越多的企业转向 SAP,因为他们相信SAP能给他们带来更高的投资回报率、更优秀的功能和便捷的集成。”
    这家总部位于德国沃尔多夫市,号称“全球最大的企业管理解决方案供应商、全球第三大独立软件供应商、全球领先的协同电子商务解决方案供应商”的 软件巨人目前在全球的120多个国家和地区拥有1.65多万家客户,向全球提供基于“五大支柱”战略的产品,这就是mySAP SCM(供应链管理)、mySAP PLM(产品生命周期管理)、mySAP CRM(客户关系管理)、SAP Portals 的Enterprise Portals(企业门户)和SAPMarkets 的Exchanges(交易集市)。 在全球,SAP拥有员工2.5万多名,在总部,SAP的开发人员有5000多名,而SAP的开发实验室和开发中心更是遍布全球多个角落。
     

    下面是他的某一个版本的介绍
    =========================
    SAP R/3软件具备以下功能和主要特点:
    功能性:R/3以模块化的形式提供了一整套业务措施,其中的模块囊括了全部所需要的业务功能并把用户与技术性应用软件相联而形成一个总括的系统,用于公司或企业战略上和运用上的管理。
    集成化: R/3把逻辑上相关联的部分连接在一起。重复工作和多余数据被完全取消,规程被优化,集成化的业务处理取代了传统的人工操作。
    灵活性:R/3系统中方便的裁剪方法使之具有灵活的适应性,从而能满足各种用户的需要和特定行业的要求。R/3还配备有适当的界面来集成用户自己的软件或外来的软件。
    开放性:R/3的体系结构符合国际公认的标准,使客户得以突破专用硬件平台及专用系统技术的局限。同时,SAP提供的开放性接口,可以方便地将第三方软件产品有效地集成到R/3系统中来。
    用户友好:图标与图形符号简化了人机交互时的操作。统一设计的用户界面确保了工作人员能够运用同样的熟悉的技术从事不通的工作。
    模块化:R/3的模块结构使用户既可以一个一个的选用新的实用程序,也可以完全转入一个新的组织结构体系。
    可靠:作为用户的商业伙伴SAP始终不断地为集成化软件的质量设立越来越多的国际标准。
    低成本高效益:信息处理是取得竞争优势的要点之一。当竞争加剧时,企业必须更加努力地获取其市场占有量。这就要使用高度集成化的数据处理软件,而R/3正是这种软件的优秀典范。
    国际适用:R/3支持多种语言,而且是为跨国界操作而设计的。R/3可以灵活地适应各国的货币及税物要求。
    服务:R/3系统实施过程中,用户将得到SAP技术专家的全面支持与服务,包括组织结构方面与技术方面的咨询,项目计划与实施方面的协助,以及培训课程。
    ★生产计划和控制
    ★销售与分销
    ★物料管理
    ★财务会计
    ★管理会计
    ★资产管理
    ★系统技术基础
  • 对自己好这件事是不用对别人妥协的

    2008-12-04 19:33:42

    对自己好这件事是不用对别人妥协的

    作者:黃力泓 (原创) 2008-10-12 8:09 阅读:148
    关键字: 妥协 关怀自我 

     

    有位大学同学的婆婆是美国人,现住在美国的养老院,朋友每星期和她先生到养老院看婆婆,她婆婆已独居30多年,88岁时还可以独自开车旅行。

    最令我惊讶的是,当我到美国同他们到养老院探视婆婆时,她说婆婆前一星期才换装6颗假牙,共花了20多万台币。如果印象没错,在台湾的老人或家属大概不会想到要帮一位96岁的老太太换更合嘴的假牙,如果假牙不合用,往往老人本身也会觉得算了,家属也多半认为,都96岁了,何必费事、花这个钱?可是朋友的老公是美国人,想法不一样,他希望母亲有较好的牙齿享受食物的美味,没有想过这口假牙用多久的问题,只想着就是要给老妈妈好的生活品质。

    年长了更有资格善待自己
    这件事让我想起,有一次探访一位知名的专栏作家,那年她70岁决定植牙,她不太有钱仍决定花这100万元,有朋友知道后都问,都70岁了为何仍大费周章的植牙?

    面对朋友的质疑,她的想法很简单,「只要活着,就要有好的生活品质。」她说,如果知道植牙后只有2年可活,她照样会植牙,因为可以过2年好品质的生活也值得。

    是的,人总是劳累一辈子,希望到老时可以享受清闲的生活,但真正到老时,却又认为已经老了,也就什幺都算了,仍选择侷促、将就将就地活着,一辈子都没对自己好过。


    人生有限,想做什幺就去做,就是一种生命品质的体现。我们的长者一向被「老」字拘束得紧,觉得老了就应妥协,不应奢求,不应多所要求。

    不!服过社会役和亲子役的你们是最有资格对自己好的一群,何况常常所做的只是合理而没有「特别好」。

    对自己好这件事是不用对别人妥协的。

    享受生活别等到下辈子
    一位朋友的妈妈之前因为不好意思说要换假牙,一直带着一副不合嘴的假牙,只有委屈自己谁也不知。有一天在公园运动时,听同样为假牙而苦的老朋友说换了假牙后吃东西那种快活的感觉,心想「目光不清,牙齿不健,活到老,难道就这幺等着回苏州卖鸭蛋?」

    因而觉悟不再委屈自己,84岁 的她以半年的时间,接受迷你植牙手术,从此不再三餐只喝流质食物,重拾吃花生的滋味,这让她觉得非常开心,不但如此,这位老太太现在更爱笑了。的确,有品 质的生活从体贴自己的需要开始。有不少长者花自己的钱做想做或喜欢的事,还要在意别人的眼光或评价,这样,生命的品质一直出不了头。

    记得以前邻居的阿公阿妈,每次巧遇他们准备出门去玩的模样,问他们要上哪去玩,他们却总是说,「呒啦,只是要去刈香啦!」到庙里刈香是乡镇旅游活动中

    最好的替代字眼,也是真的去庙里进香了,但他们总不好意思直言自己是去玩的,好像去玩是不道德或是逾越本分的事。

    其实,尊重自己的意愿或适度的表达,就是一种品质,喜欢就好,想玩就去玩吧!喜欢就值得去做,别忘了,这辈子就只这一次,遇到好玩的或是幸福的事,

    可别总是期待留给下辈子。有没有下辈子,只有天知道,是吧?

    这辈子就在自己的手中,像一个化妆品的广告词说的「因为你值得」,亲爱的银发长辈,你们值得对自己更好一点。
     
  • 网易硬盘

    2008-11-27 13:06:20

  • 上班三年的一点心得体会 (转载)

    2008-11-26 15:07:41

    上班三年的一点心得体会


       我挺笨的,很多道理搞不好我一说大家觉得这还用三年才明白呀,不管怎么说我现在基本是总结了这几点,就当给刚工作的DDMM的一点教训总结了:

       &nbsp1) 工作是为了让生活过得更好,如果你的工作已经让你感觉到影响了你的生活质量,夜不能寐,食不知味,让你心情低迷,虽然说人要知难而上,但人生苦短,无论性 别,统共就这么几年好日子,如果努力了还没什么改变,又何必和自己为难呢,想开点,放手算了。要拿得起放得下,不然你会被自己不放手的东西压挎了。

       &nbsp2)把人看得复杂一点,事情看得简单一点,事情都是人做出来的,看清了人,他做什么事情你都不会感到意外。也不会重复的吃同样的亏。

       &nbsp3) 除非你一无是处不值得说,否则你做的再好也一样有人在你背后说你是非。做好99件事1件没做好你就可能被骂得狗血喷头。就象足球后卫一样,前锋进一个球就 可能名扬天下,后卫防了99个球漏了一个就会被骂死。所以不要太在意别人说你什么,关键你自己判断下自己做的到底对不对,如果你觉得对了,那就OK了。适 当借鉴别人的意见,如果全盘接收,你会无所适从不知道怎么做才对

       &nbsp4)任何时候保持风度,有理说理,有事说事。不管你在什么位置,对任何人,哪怕是做卫生的阿姨。

       &nbsp5)学会装装糊涂,谁都有心情不好,抱怨发泄的时候。听到闲话了,只要不是当着你面说的,就当耳边风过去,没什么大不了的。

       &nbsp6)办公室里嘴巴严一点好,少说多做。别以为这样会吃亏,你可能会吃小亏,但不会倒大霉

       &nbsp7)如果你确实有很多心眼可以耍,当然可以用。长袖善舞的人在这个社会确实很吃得开。但如果你没有那么聪明,那还是老实点比较好。否则碰上比你更精明的,你可能第一个吃大亏

       &nbsp8)保持端正的心态。不要和别人比,只和你自己比,我现在的待遇和情况是不是让我满意,而不是谁谁比我多,谁谁比我职位高,这样比下去你会越来越不快乐。

       &nbsp9)学会感恩的面对一切,不是你付出的就一定有回报。没有,当做是正常;有了,当做是上天的恩赐。这样你才会快乐:)

       &nbsp10)不要用别人的错误惩罚自己

       &nbsp11)不要因为你不适合做的工作而怀疑你的工作能力

       &nbsp12)最后,要懂得善待自己。时刻享受人生。除非你是工作狂,否则——除了工作,你的生活里总是还有点别的,比如友谊,家庭,工作不会跟你一辈子,但有些东西是你一辈子都需要的.

        来源:天下商机
  • SQLServer学习网址

    2008-11-19 14:13:30

    http://itsoftjpkc.hdu.edu.cn/index1.asp?courseID=10000048&ParentID=10000443&pagelink=10000638&pageid=1
  • 重新定位

    2008-11-18 21:42:46

    做测试一段时间了,对于自己所测试的adapter的基本方法已经掌握了,可是还有许多未知的。而最近一段时间处于两个release的中间阶段,所以比较空闲。自己也试图想去更深入的了解自己对于adapter未知的领域,由于自己性格方面的原因(想个什么,就要做个什么),这两天又在瞎搞一些IBM的自动化测试工具(RFT and RPT)。突然间醒悟过来,发现自己这样一味的来按自己的想法来是不对的,应该把心思都放在自己目前正在干的事情上来,重新定位自己的方向。


  • 次贷危机与SOA

    2008-11-18 21:24:51

    信息不对称而产生信息孤岛,归根究底是技术方面的原因。美国并不缺乏像微软、IBM英特尔 些在科技上领先的大企业,但是,为什么这些美国企业,没有利用自己的科技研发实力,提前解决政府与商业企业之间信息不对称的问题,遏制住次贷危机的爆发 呢?一个原因可能是由于美国经济结构过于复杂、庞大,要做这样一个能够整合所有数据资源的系统,超出了企业现有的技术能力;另外一个原因则可能是次贷危机 爆发的速度过快,包含着许多不确定因素,企业来不及为政府思考如何从技术层面上去防范危机的产生。我们应当相信的是,在今时今日信息技术如此发达的社会, 没有科技解决不了的问题,所以,一切都只是时间的问题。

      事实上,在解决信息不对称的问题上,IBM公司一直在努力。从2008年的9月份开始,IBM在中国的一些权威媒体上大力推广SOA(面向服务体系的结构)解决方案 务,帮助企业与政府机构解决信息不对称、分散资源和异构系统的整合难题SOA的核心在于确保不同应用程序和异构系统之间的信息数据得到无缝连接与实时交 互。其实早在1996年,全球最具权威的IT研究与顾问咨询公司Gartner便最早提出SOA的思想;200212月,Gartner又提出SOA现代应用开发领域最重要的课题,呼吁社会各界一起来研究SOA的应用性。IBM其实蓄势已久,只是没能赶在次贷危机爆发之前,把服务架构向政府与企业之间延伸。

      可以想像得到,如果处于社会大系统中的各个环节的信息与数据,能够利用SOA解决方案连接紧密,彼此反馈,那么美国次贷危机的发生可能性将会 小之又小。与IBM做的事情不尽相同,位于江苏无锡市的一家潜心于SOA实施的技术服务型企业——德意科技,也注意到了信息不对称引发的管理、经济上的重 大问题,并不断用实力证明中国软件企业可以从中国制造走向中国创造这样的事实。早在2005年,德意科技便开始研发基于SOA实施的产品和解决方 案,经过三年攻关,终于突破了技术障碍,研发成功了基于SOA关联型数据库实时交换管理软件,并在业内率先提出RDMPRealData Management Planning)实时数据管理计划的概念,将管理层所需的数据用实时的、可视的图形界面数据形式表现出来,将管理提升到了量化的数据化层面。据了解,该 产品因此获得国家版权局颁发的计算机软件著作权证书,也获得了无锡市科技局创新项目奖。基于全球领先的技术创新的基础,德意科技获得了国际软件巨头的青睐,在9月份先后与IBM、英特尔结成了合作伙伴关系,强强联手,准备在异构系统的数据整合领域有所作为,与国际同行共同推动SOA事业的发展。

      中国经济面临的风险与机会

      美国经济在信息不对称的前提下爆发了次贷危机,那么在中国,由于信息不对称将会爆发什么危机呢?其实笼统点来看,人民币汇率上升,银根紧缩, 物价、房价上涨,股指下跌等,都是整个社会的信息不对称所导致。港股直通车的提议及全国社保系统的统一、环保治理和实施监控等方案,当然也是出于信息 数据无法在多平台、多系统中流通,而迟迟未能实现。从年初起,国内的一大批企业由于资金链断裂、原材料成本上升、人力成本加大,而不得不关停并转,谋求企 业在经济萎靡期里的出路。说到底,倒掉的企业里,90%以上是由于管理不善导致。中国的企业大多停留在草创期,信息闭塞,对科技不感冒,对管理软件的使用 少之又少,为数不多的一些企业使用了OAoffice automatic)、ERP(Enterprise Resource Plan)CRM(Customer Relationship Management)HRM(Human Resource Management)SCM(Supply Chain Management)等管理软件,但也只是停留在业务层面的简单操作,而不能整合到背后与管理相关联 的数据流,导致管理层判断出错,决策失误,最终让企业走上了一条不归路。

      中国经济要实现自救,中国企业首先要解决信息数据不及时、不准确的问题。为避免像美国一样出现类似于次贷危机这样的事件,相关人士普遍认为中 国政府应大力推动SOA事业的前进,从根本上解决信息孤岛的问题,利用技术平台,一方面能实时监管一些大型私有及国有企业,及时发现企业存在的弊端,施以援手,同时规范市场环境,打击投机倒把的行为;另一方面做为企业方,要从长远着想,正确评估企业现况,及早解决信息不对称,消除信息孤岛,从信息化的基础建设做起,用实实际际量化的数据来审视企业内外部环境,做到未雨绸缪,及时遏制风险的滋长,做出正确的管理决策。

      风险总是与机会并存的,从美国的次贷危机中我们也看到了中国经济的缩影,每个国家的经济结构都有一定的相同性与可借鉴性,如果不客观汲取美国过去的经验教训,从根本上解决问题的本质,那么中国经济,也许将会成为次贷危机下的另一个华尔街

  • 敏捷测试体会谈

    2008-11-07 17:42:24

    严格的说,我对于传统测试没有太多经验。从06年进入游戏测试行业开始,我所在的团队就在尝试向敏捷方式的转变,成功敏捷后至今,已一年有余。而这近一年半的经历给了我很大的冲击,让我每天都对我的工作有新的认识和体会,这和以前在学院里获得的对于软件开发和软件测试的理解有很大的不同。

       至少在我看来,传统的测试应该是——可以坐在我们测试部门专用的办公区内,等待产品策划的文档;拿到文档后着手准备用例,并看一下项目的计划;在程序员 提交可用版本后对产品进行测试,然后将找到的bug提交bug管理系统;最后在产品计划发布之前,拿出几个还未修改的bug理直气壮地说,产品还未准备 好……然而现在,我们不再和产品团队有空间距离,不再只是看文档写用例,不再只是提交bug,不再只是争论某个bug是否必须修改……敏捷的开发决定了我 们必须以敏捷的测试来应对。

      “沟通”成了最重要的技能之一

       敏捷宣言里讲:个体和交互胜过过程和工具,客户合作胜过合同谈判。在内部需求上,开发人员就是我们的客户。而我在加入团队后所做的第一件事,就是搬位子 到开发人员旁。当然,是被要求这么做的。一开始还有点不适应,毕竟我们被分离开了曾引以为豪的独立的测试团队,这和传统的观念是相悖的。不过在经历过几个 测试阶段后,这么做的好处就体现了出来。

      以往我们总要等到一个正式的版本,才可以开始测试,否则过多的介入会打乱开发计划。而现在,程 序员就坐在我对面的隔间,他一抬头就说:“嘿,X功能做好了,我跑了一遍没问题,你来试试看?”结果我过去试了试,bug出来了。程序员的反应则是: “好,我马上改”。——这样一个bug从发现到修正,最多不超过半个小时。而以往,我要等到版本正式提交,再build好,再up好,发现bug后还要通 过提交bug管理系统,等待系统发邮件给程序员。如果恰好程序员忘记开邮箱了,那就可能要更多的时间。

      事实上这里面还有更多的细节。我 相信大多数测试人员会和我有同样的经历,在发现并提交一个bug时,我们写了大量的文字来描述bug的环境,bug的重现步骤;程序员修正bug时,也自 信满满的说,该bug已修正。但当你一复查时,却发现你所认识的那个bug还在,而程序员完全理解错了你所说的bug。而现在,你所需要做的,只是抬一下 头,把问题说出来,直接和程序员进行沟通,让他能够准确的理解你的意思,甚至包括你对于该bug的分析。接下来一切就十分好办了。

      此外,有时有些bug确实不是那么容易重现的,你需要和程序员配合操作,才能发现其中的蛛丝马迹。我们现在最常做的一种合作就是,由我来制造环境,按重现步骤操作,由程序员在另一端跟踪调试代码,一边沟通,一边进行,这样就能很准确的发现问题,并且能很快的得到修正。

       仅仅是几句话的沟通,就能将一个bug在最短的时间内修正,这节省了多少时间?这皆得益于比以往更便捷的沟通。而我们所做的,不过是移动了一下位子,减 少了我们之间的沟通成本,却大大的提高了开发效率——我已经记不清有多少bug在还没提交之前就被消灭掉了。但这也对我们测试提出了更高的要求,虽然之前 的我们也很强调沟通能力,但现在由于需要更频繁的沟通,我们对沟通能力的提高也变得也越来越重要,成为了最重要的技能之一。

      说到这里,其实我们已经能感受到,测试的角色定位已经变了。因为敏捷开发中,要对质量负责的是整个团队,这一目标就要求测试人员不再是一个独立的质量监督部门,而是要融入到整个团队中,成为开发中不可分割的一部分。

      调整测试用例的粒度

       敏捷宣言里还说,可以工作的软件胜过面面俱到的文档,响应变化胜过遵循计划。那么我们是不是可以都不要文档,不用写用例了呢。我想,如果你的项目是一个 “Hello world多国语言版”,大可以如此。但如果是面对一个大型的,多人的,在线的,角色扮演游戏,还是算了吧。

      曾经有位前辈跟我说,测试员最重要的技能就是写用例,通过用例来表达测试思想。我想,即使是到了敏捷时代,这个技能仍然是第一位的。只是,如果你的用例写得过于详细和复杂,那么在团队开始响应变化的时候,你就会措手不及了。

       我就真的遇到过这种情况,某一个设计做到一半的时候,由于效果并不好,被要求进行修改。这时我的用例也要相应的进行修改——最怕这个了。如果这是一系列 粒度很细的用例,动辄上千条,一旦改起来,费时又费力。但如果我的用例的粒度本来就并不是非常细,那我调整起来就快速多了。

      至于粒度到 什么程度才是合适的呢?那就要看个人的能力,是否强大到能随时调整一份复杂和详细的用例的程度。我个人并不推崇十分详细的用例,因为有些很细节的地方,也 没有文档可以参考。而且我们测试的游戏,很多细节没有绝对的对与错之分。即使真的出现了一些有疑问的地方时,迅速的和程序员和策划进行沟通也比写一份更详 细的用例要有效得多。要知道,我们的目标也应该和团队内所有的成员一样,是一款可以玩和好玩的游戏,而不是面面俱到的测试用例。

      更多的测试方式

       我看过不少介绍敏捷开发的文章,大都有这么说过:在进行敏捷开发中,快速的响应变化的前提,一定是对质量的保证。如果质量无法保证,那是无法对变化做出 响应的。因此这要求程序员能更多的进行自测,包括白盒的,自动化的,测试驱动的。而站在测试人员的角度上,我们能做些什么呢?

      因为对产品接触的更具体,我有了很多机会接触详细的程序设计,这使得我已经可以尝试直接阅读代码,并在此基础上进行测试用例的设计。行话说,这就是灰盒测试。灰盒测试带来的好处是,用例的设计可以比黑盒测试更简洁,而且随着你对程序框架的理解更加的深入,你对所测的产品会更有安全感。当然,传统的黑盒测试是不能抛弃的,因为很多bug都是在你所意料不到的情况下发生的。如何合理的分配灰盒测试和黑盒测试,这还需要在漫长的敏捷测试中慢慢体会。

      除了简单的灰盒黑盒,测试人员尝试做一下白盒也是很有用处的。虽然程序员也做了这样的工作,但测试人员的测试思路会和程序员有所不同,得到的结果也许就会不一样。我就尝试过对核心代码进行白盒测试:包括代码的走查,对函数的独立测试,以及使用内存检测工具的检测,尽管最后还是没有查出bug。

      最后别忘了自动化。由于产品会经常的响应变化——相信我,这事儿真的很轻易的就发生了,对于某些重要的系统的测试就会一次又一次的要重来。若系统简单些还好,若系统是比较复杂,或是比较核心的,如果还是用手动测试,那就会很让人头痛了。所以测试人员的自动化测试是很有必要的。为自己最容易自动化的系统写一个自动测试脚本,这样,随便他们怎么改动,我们都可以随时的进行回归测试了。

      让更多的人参与测试

      当测试人员已经不再是一个独立的测试部门时,需要进行测试的也就不只是测试人员了。程序员要自测,策划也要测试,甚至玩家也可以来测试。不同的人可以得到不同的结果,这样才能使我们对产品有全面的把握,才能时刻的知道产品下一步应该怎样“响应变化”。

      程序员的自测可以减少程序上的bug。策划的测试可以使策划更清楚的看到目前游戏的现状,亲自体验自己设计的系统。而玩家的测试则可以给我们带来我们的最终用户的反馈,这是最有价值的信息。

      我们现在就会经常邀请玩家来进行测试,让我们团队的所有人看到我们所做的游戏在玩家手里是怎么玩的,在玩家心里是怎么想的。这样不断的获得反馈信息,不断的改进后,相信产品会越来越受用户欢迎。最终的目标,就是一个可玩,好玩的游戏,每个人都是这样想的。

      信任你的测试人员

       虽然我是在谈论敏捷测试的体会,但无论你是测试,是策划,还是程序,或者制作人,甚至经理。你都可以而且应该多花点时间和你们的测试人员进行沟通。信任 他们,因为他们比这个团队中的任何一个人都更了解产品的现状,他们也是产品面世之前的唯一的玩家。你可以私下找他们聊一聊产品,也可以偷偷的登陆bug管 理系统看看现在的bug,甚至可以让他们协助你做一些非测试的工作(例如,产品演示,但不要占用他们的工作时间)。无论如何,他们一定会对你下一步的决策 产生巨大的帮助的。

      敏捷究竟是什么?说实话我没怎么仔细考虑过,只是就这样跟着一个敏捷的团队做了一年半的测试,把我们很多传统的测试 理念都颠覆了,其实也只不过是在实践中不断的摸索着去改变自己的观念,改变工作方式。直到最近认真的看了看有关敏捷开发和敏捷测试方面的文献,才发现原来 这一年半的经历和体会和书中所言是那么的相似,索性借此文和大家分享一下,欢迎指正。

  • IBM 软件开发中心的敏捷测试实践分享

    2008-11-07 17:36:47

    如果您已经阅读过敏捷测试系列文章的第一篇,敏捷的实质,您应该已经了解敏捷的定义,了解什么样的团队是敏捷的团队了。而您也可能早已开始思考,什么是敏捷测试的实质?敏捷的测试团队又是如何形成自我管理、自我发展的组织呢?测试团队又是如何安排日常工作呢?敏捷测试活动与传统测试活动有很大差异吗?为了进一步让您了解如何将敏捷原则运用到活生生的日常测试活动中,我们为您推荐敏捷测试系列文章的第二篇——敏捷测试的实践。

            在敏捷活动如火如荼的推广运动中,我们显然无法预知如何在您的特定的复杂环境中您能否最后达成所愿,也无法为您预测出前进道路的分岔口可能唯一的正确的线 路,我们却可以为您点起一盏明亮“街灯”,在这迷雾中驱除黑暗。我们将为您提供一个可以借鉴和可供参考的成功的敏捷测试实践案例。我们将逐一向您介绍、分 析这个案例中的敏捷团队的组织结构,主要的敏捷测试行为,迭代的测试模型和一套以四周为周期的敏捷测试活动时间表。

            请您运用您已具备的敏捷实质、敏捷原则的知识,并结合您的独特项目环境、带着您的问题,与笔者一起再度分析这个案例,希望您最终也能得到满意的答案,并随后开始实施部署敏捷测试。

    敏捷测试的实质

            测试不仅仅是测试软件本身,还包括软件测试的过程和模式。产品发布后才发现很多问题,很可能是软件开发过程出了问题。因此测试除了需要确保软件的质量,即 软件做了正确的事情,以及软件做了应该做的事情以外,敏捷的测试团队还要保证整个软件开发过程是正确的。

            敏捷开发的最大特点是高度迭代,有周期性,并且能够及时、持续的响应客户的频繁反馈。敏捷测试即是不断修正质量指标,正确建立测试策略,确认客户的有效需 求得以圆满实现和确保整个生产的过程安全的、及时的发布最终产品。敏捷测试人员因而需要在活动中关注产品需求,产品设计,解读源代码;在独立完成各项测试 计划、测试执行工作的同时,敏捷测试人员需要参与几乎所有的团队讨论,团队决策。作为一名优秀的敏捷测试人员,他(她)需要在有限的时间内完成更多的测试 的准备和执行,并富有极强的责任心和领导力。更重要的是,优秀的测试人员需要能够扩展开来做更多的与测试或许无关,但与团队共同目标直接相关的工作。他 (她)将帮助团队其他成员解决困难、帮助实现其预期目标,发扬高度协作精神以帮助团队的最终获取成功。需要指出的是,团队的高度协作既需要团队成员的勇敢,更需要团队成员的主动配合和帮助。对于测试人员如此,对于开发、设计人员,其他成员也是如此。

    敏捷测试的方法与实践

            是的,敏捷测试也需要高度迭代工作、频繁得到 STAKEHOLDER、客户的反馈,需要动态调整测试计划、测试的执行。并且,敏捷测试人员参与到了更多的敏捷生产活动中,积极的影响了团队做出的决定和计划。

            是的,“人”才是敏捷的实体,敏捷测试也是以人为本的。不难理解,“敏捷”的一切都围绕着人展开,如敏捷鼓励直接,平行的沟通;敏捷需要持续的客户反馈以 及敏捷活动的设计,方案和决策需要团队协同制定等等,敏捷测试需要一支非同寻常的团队,不同于以往传统开发模式下的团队结构。关于敏捷团队、敏捷测试团队 的组成和介绍,将是我们讲述敏捷测试实践的第一步。

            “人”是重心,方法、策略是辅。为了适应不同的团队结构,不同的项目环境,敏捷项目和敏捷活动的实践也应该因“人”而异,但是,并不是说可以天马行空,我行我素。一旦脱离了正确的敏捷方法、和敏捷原则的指导,我们的敏捷活动就好比摸黑前行了。

            这正是我们需要学习前 辈和敏捷主义大师们的经验意义所在了,笔者在过去的实践中受益颇多的也正是前人的实践经验和方法。因此,学习前人的经验和方法,并运用这些最佳实践来帮助 敏捷开发团队,甚至是传统团队来解决时下重要的问题是十分有意义的事情。笔者不敢妄自尊大将自己的一般实践纳入经典方法范畴,但经历了两年的研究和改进, 笔者提出的敏捷测试的原则也得到了业内同僚和“大师”的普遍认可。经过多次和其他项目团队的经验交流,我们也不断的改进着我们的原则、方法。因此,笔者要 非常感谢参与讨论的同僚们,没有你们的热情参与,也不会有今天的笔者信心百倍的执笔了。正如笔者在借鉴了前人的成功案例中的经验和方法之后定制了符合项目 需求的测试原则一样,相信,读者们在阅读了笔者的敏捷测试原则和方法后,同样也会有所收获。而对笔者经历的敏捷实践活动中的方法和测试模型的讲解将成为我 们讲述敏捷实践的第二步,也是本文的重点。

            综上所述,笔者将运用本文的主要篇幅为大家讲解这个敏捷实践。它们是:

            敏捷团队组织构成,敏捷测试团队的任务和使命; 
            敏捷开发团队以测试为驱动的开发方式——测试驱动开发,这是种独特的测试?还是开发? 
            递增型的迭代测试,它首先是对敏捷测试过程活动和生命周期模型的介绍,通过学习经典的敏捷增量测试模型,我们将敏捷测试的各类活动有机的组合到了一起。在此之上,对定制后的独特敏捷增量测试模型的分析和理解,帮助我们理解测试活动的规划和管理; 
            以及需要特别关注的递增型迭代测试的关键活动之一——“静态测试”;这也是笔者认为的最高难度、最具影响力的敏捷测试活动。它将测试团队最早的引入产品开 发环节,测试人员以第一用户的角度判断设计的有效性,此活动较早的暴露了设计缺陷、避免了团队对目标的不一致理解等,是测试活动中最有创造性价值的部分;  
            最后,笔者将谈谈测试活动中的测试计划和管理,即关于测试任务估计,测试活动计划,各个重要测试活动时间分配与安排的介绍。 
            然而,敏捷测试不是一蹴而就的,做到真正的敏捷,无论是从传统测试模式向敏捷测试的过渡,还是组建全新的团队都是需要循序渐进的,同时也需要团队成员的通力合作和不断的实践来完善敏捷测试的实践原则和方法。

  • 使用 WebSphere Adapter for JDBC 开发 EIS 应用程序的方法及问题

    2008-11-07 17:22:48

    在本文中,我们将首先简要介绍 WebSphere Adapter for JDBC,描述 J2EE 组件如何通过 WebSphere Adapter for JDBC 来连接 DB2 数据库。然后我们将提供针对于实际应用的 WebSphere Adapter for JDBC 的解决方案。在此解决方案中,我们通过一个股票管理与交易系统来展示 WebSphere Adapter for JDBC 的用法,描述了如何使用 WebSphere Adapter for JDBC的 Inbound 和 Outbound 功能。另外针对在使用 WebSphere Adapter for JDBC 过程中所碰到的问题,我们将介绍这些问题产生的原因、避免的方法及途径。

    摘要

    IBM WebSphere Adapter 实现了 J2EE Connector Architecture(JCA),能够帮助在 J2EE 组件和 Enterprise Inforamtion Systems(EIS) 之间进行双向易于管理的连接。而 IBM WebSphere Adapter for JDBC 是专门针对于支持 JDBC 的数据库开发的。WebSphere Adapter for JDBC 由两部分组成:

    1. JCA 的实现,这是用来支持 WebSphere Process Server (WPS) 或者 WebSphere Enterprise Service Bus (ESB);

    2. 企业元数据发现组件,可以通过这个组件来连接数据库产生 Data Objects 及其他 Service Component Architecture(SCA) 组件。

    WebSphere Adapter for JDBC 通过提供基于 JCA 的两种编程接口 Inbound 和 Outbound 来实现 EIS 的双向连接。通过 Outbound 操作,WebSphere Adapter for JDBC 把 Data Object 传递给 EIS,进行指定的数据库操作。通过 Inbound 操作,数据库的改变将触发 WebSpher Adapter for JDBC 的相应操作。

    在本文中,我们将首先简要介绍 WebSphere Adapter for JDBC,描述 J2EE 组件如何通过 WebSphere Adapter for JDBC 来连接 DB2 数据库。然后我们将提供针对于实际应用的 WebSphere Adapter for JDBC 的解决方案。在此解决方案中,我们通过一个股票管理与交易系统来展示 WebSphere Adapter for JDBC 的用法,描述了如何使用 WebSphere Adapter for JDBC 的 Inbound 和 Outbound 功能。另外针对在使用 WebSphere Adapter for JDBC 过程中所碰到的问题,我们将介绍这些问题产生的原因、避免的方法及途径。以下是本文主要内容:

    第一章将介绍 WebSphere Adapter for JDBC 的功能。

    第二章将给出一个示例场景描述 WebSphere Adatper for JDBC 在 WID 中的用法,包括如何使用 WebSphere Adapter for JDBC 的 Inbound 和 Outbound 功能。

    第三章指出在使用过程中所碰到的各种问题,包括数据库连接驱动的选择等。

    本文假定读者已经具有 J2EE 以及 DB2 数据库的基础知识,主要针对那些需要使用 WebSphere Adapter for JDBC 来 开发应用程序设计者而编写的。另外本文也可以作为 WebSphere Adapter for JDBC 开发人员的参考,以便在开发过程中如何避免这些问题的出现。





    回页首


    一、 引言

    1.1 JCA 介绍

    在商业整合开发中,J2EE 应用程序经常需要与各种企业信息系统(EIS)交互,以获得所需的资源或数据,如 ERP 系统、SCM 系统以及各种数据库系统等等。现有的传统模式在整合过程中需要开发者为每一对 J2EE 应用和 EIS 系统之间提供交互方式,并且每对 J2EE 应用程序和 EIS 系统之间的交互方式可能完全不同,因此这显然需要花费大量的人力物力,是不现实的。为了解决这个问题,一种称为 J2EE Connector Architecture (JCA) 的标准被提出来,目前最新的版本是 1.5。JCA 1.5 的标准中定义了一个资源适配器(Resource Adapter)组件。任何符合规范的资源适配器,都可以在 J2EE 的应用服务器环境中部署和运行。于是,符合 JCA 规范的 J2EE 应用程序通过资源适配器便能够和不同的 EIS 系统通过同一种方式交互,而符合 JCA 规范的 EIS 系统也能够和不同的 J2EE 应用程序通过同一种方式交互。简言之,符合 JCA 规范的各种 J2EE 应用程序就可以通过资源适配器中实现的标准接口(Common Client Interface)来和符合 JCA 规范的任何 EIS 系统交互。这使得每个 EIS 系统,只需要一个资源适配器,就可以整合到任何标准的 J2EE 应用中去,简化了开发流程。下图是 JCA 1.5的体系结构,包括三个部分:系统协议(System Contracts),用户接口(Client API),资源适配器模块(Resource Adapter Module)。


    图1:JCA体系结构
    图1: JCA 体系结构

    系统协议定义了 J2EE 应用程序和 EIS 系统之间的接口和交互标准,并且由资源适配器模块来实现这些接口,因此资源适配器可以看作是系统协议的实现。下图描述的是 JCA 的系统协议和资源适配器的体系结构。

    系统协议分为三个部分:

    • 连接管理协议,它提供了一种管理和缓存 EIS 连接实体的机制,包括如何建立连接,如何管理连接的生命期等,比如图2中的 connection 等模块;
    • 事务协议,它提供了两种事务管理模式,可以由 J2EE 应用服务器来管理事务,也可以由 EIS 来管理,比如图2中的 LocalTransaction 模块;
    • 安全协议,它对 EIS 的连接进行认证和访问控制,保障 EIS 的安全。

    在实现系统协议的基础上,资源适配器模块遵循以下规范:

    • 根据规范接口和系统协议,实现面向特定 EIS 系统的连接代码,连接库等;
    • 实现一个部署描述符 ra.xml(deployment descrīptor),给 J2EE 应用服务器提供所需的配置信息;
    • 所有Java类打包成 jar 文件,并和部署描述符 ra.xml 一起放在后缀为 RAR (Resource Adapter Archive) 的资源适配器文件中。这个 RAR 文件符合 jar 的打包格式,可以直接部署到 J2EE 应用服务器中。

    另外用户接口(Client API)是提供给 J2EE 应用程序的 API,以便其能够访问 EIS 系统。通用用户接口(Common Client Interface)是被推荐使用的协议,资源适配器将负责实现这些接口。通过它,J2EE 应用程序可以使用统一的接口去访问各种 EIS 系统。


    图2:JCA 中的系统协议和资源适配器模块结构
    图2:JCA 中的系统协议和资源适配器模块结构

    1.2 WebSphere Adapter 介绍

    IBM WebSphere Adapter 是IBM公司开发的符合 JCA 1.5 标准的一系列资源适配器的统称。它针对不同的 EIS 系统提供不同的解决方案,使得符合 JCA 1.5 标准的 J2EE 应用程序能够和各种 EIS 系统进行方便的交互。每个 WebSphere Adapter 都是以资源适配器的形式提供,它是实现了 JCA 标准的一个组件,以 RAR (Resource Adapter Archive) 文件的形式提供给开发者使用。现在有三种类型的适配器:

    • Application Adapter: 这类适配器是针对特定的 EIS 系统来提供的,比如 WebSphere Adapter for SAP 就是为 SAP 的 ERP 系统设计的,用来访问其 ERP 系统,WebSphere Adapter for Oracle 是针对 Oracle 数据库提供的,用来支持各种 J2EE 应用程序访问 Oracle 数据库。
    • Technology Adapter: 这类适配器针对实现某种技术的 EIS 系统,比如本文要介绍的 WebSphere Adapter for JDBC 就是针对那些实现 JDBC 2.0 规范的数据库系统,WebSphere Adapter for JMS 针对实现 JMS 的 EIS 系统。
    • Adapter 开发工具:严格来说,这不是适配器的一种,它只是为用户开发自己的适配器提供了方便,比如 WebSphere Adapter Toolkit。

    1.3 WebSphere Adapter for JDBC 介绍

    WebSphere Adapter for JDBC就是符合 JCA 1.5标准的一个资源适配器,它提供了 J2EE 应用程序和支持JDBC 2.0的数据库系统沟通的桥梁。WebSphere Adapter for JDBC完全满足 JCA 的标准,被设计成可以在 WebSphere Integration Development(WID)上使用、并且在 WebSphere Process Server (WPS) 或者 WebSphere Enterprise Service Bus (ESB) 等应用服务器上运行的一个组件。它提供如下的功能:

    • 与 WPS 或 ESB 等应用服务器整合。
    • 连接服务器上的 J2EE 应用程序和支持JDBC 2.0的数据库。
    • 支持 J2EE 应用程序和数据库的数据交换。

    WebSphere Adapter for JDBC 由下列组件构成:

    • JCA 的实现,用来支持应用服务器。
    • 企业元数据发现组件,可以通过这个组件来连接 EIS 产生Business Objects (BO)及其他Service Component Architecture(SCA)组件。

    WebSphere Adapter for JDBC 通过 JDBC 的 API 提供对于数据库访问的两种方式:inboud 和 outbound 。在 outbound 方式下, J2EE 应用程序产生 Data Object,并将其传递给 WebSphere Adapter for JDBC 。Adapter 根据 Data Object 中指定的操作访问其连接的数据库,这些操作可以是查询单条记录、查询全部记录、创建记录、更新记录及删除记录。在 inbound 方式下,当数据库的记录改变时,数据库会产生一定的事件,这个事件连同被改变的记录的信息将会被插入到 EventStore 中,这由数据库的 trigger 或者其他方法完成。Adapter 会监测 EventStore,得到相应的一批记录。Adapter 处理这些记录以便构建 JDBC business graph,并且将这些 business graph 发送到订阅相应的数据表改变事件的应用程序,从而使应用程序获得数据库改变的通知。下图描述的是 inbound 和 outbound 对应的体系结构。


    图3:WebSphere Adapter for JDBC 提供的两种操作
    图3:WebSphere Adapter for JDBC 提供的两种操作




    回页首


    二、 使用 WebSphere Adapter for JDBC

    本章将介绍一个针对于实际应用的 WebSphere Adapter for JDBC 的解决方案。在此解决方案中,我们通过一个股票管理与交易系统来展示 WebSphere Adapter for JDBC 的用法,描述了如何使用 WebSphere Adapter for JDBC 的 Inbound 和 Outbound 功能。首先介绍股票管理与交易系统的解决方案,其次介绍 WebSphere Adapter for JDBC 的用法。

    2.1 场景介绍


    图4:股票管理与交易系统
    图4:股票管理与交易系统

    上图展示的是我们提供的股票管理和交易系统的解决方案,此解决方案包括三个部分:股票交易系统、用户通知反馈系统以及监控系统。这三个子系统通过 WebSphere Enterprise Service Bus 来进行消息传递和交互。其中 Stock Interface 子系统是用 Portal 技术开发的股票管理与交易系统门户网站,包括了三个子模块:e-stock, membership 以及 admin。E-stock 表示在线股票查询以及交易功能,membership 表示用户管理功能,比如用户的信息等,admin 表示后台管理功能。Notification system 子系统表示当某支股票发生一定的变化时通知用户的功能,user notification 表示用户所购入的股票低于或者高于某个价格时,将通过手机短消息的形式通知用户。DB2 保存股票信息、用户信息、用户购买和卖出股票的详细记录。而 Monitor 子系统使用 WebSphere Monitor 来监控系统的性能。

    Outbound 场景如图5所示。用户通过股票系统的门户网站登录、查询股票信息以及购入或者卖出某支股票等。门户网站通过部署在ESB上的 WebSphere Adapter for JDBC 来访问 DB2 数据库,并返回信息给用户。其中有 loadUserInfo(), getStockInfoBySearchCondition(), confirmBuy(), confirmSell()等操作。

    inbound 场景如图6所示。首先管理员通过门户网站对某一股票信息作了更改,比如股票的信息等,另外股票的价格也可能受外界的影响而变化。此时DB2数据表的改动将 触发 trigger,添加事件到某一事件表中。WebSphere Adapter for JDBC 监测到这一事件,根据这一事件的来源查找受影响的用户,从而给这些用户发送短消息通知。此场景不仅包含 inbound 操作,也包含 outbound 操作,我们只把注意力放在 inbound 操作上。


    图5: outbound 场景
    图5: outbound 场景

    图6: inbound 场景
    图6: inbound 场景

    2.2 如何使用 WebSphere Adapter for JDBC

    下面将介绍如何在 WID 中使用 WebSphere Adapter for JDBC 来开发上述解决方案中的 outbound 和 inbound 场景。

    WebSphere Adapter for JDBC 的安装过程非常简单,只要按照提示一步一步的安装就行了。安装之后的 Adapter 将以一个 rar 包的形式提供给开发者使用。因此无论本地机器还是远程机器上安装 Adapter,只要能够访问它,WID 就能通过它访问指定的数据源。首先需要在 WID 中导入 Adapter 提供的 rar 包,此时 WID 就会自动生成一个 Connector project,然后就可以在这个 connector project 的基础上创建需要的组件,比如企业服务发现组件 (Enterprise Service Discovery) 等。最后将项目部署在 ESB 或者 WPS 服务器上。下面分别描述创建 outbound 和 inbound 的项目的详细步骤。

    2.2.1 构建 outbound 场景

    1. 在 WID 中导入 WebSphere Adapter for JDBC 的 rar 文件。可以通过进入 Business Integration perspective 选择File->Import来启动导入向导,选择RAR file 并且指定 rar 文件所在的位置来导入 WebSphere Adapter for JDBC。如图7、8所示。此时WID将会生成一个 connector project。然后将 JDBC 驱动加入到其编译路径(Java Build Path)中,如图9所示。


    图7:导入向导
    图7:导入向导

    图8:导入 RAR file
    图8:导入 RAR file

    图9:在class path 中添加 JDBC 驱动
    图9:在class path中 添加 JDBC 驱动

    2. 切换到 Business Integration 视图,选择New->Enterprise Service Discovery,在出现的向导里选择第一步产生的 Adapter,然后输入数据库的连接参数,选择需要操作的数据库表,确定那种类型的操作(inbound, outbound )以及具体的操作(create, update, delete, retrieve, retrieveAll),生成访问数据库的接口。对于 outbound 操作,就可以通过调用此接口提供的函数来访问数据库。

    a) 新建 Enterprise Service Discovery 项目。切换到 Business Integration 视图,选择 New->Enterprise Service Discovery,点击 Next。


    图10:新建 Enterprise Service Discovery
    图10:新建 Enterprise Service Discovery

    b) 选择第1步中新建项目的Adapter。


    图11:选择第1步中产生的 Adapter
    图11:选择第1步中产生的 Adapter

    c) 设置数据库联接参数。


    图12:设置数据库联接参数
    图12:设置数据库联接参数

    d) 点击 Run Query,选择需要操作的数据表。


    图13:选择数据表
    图13:选择数据表

    e) 选择操作类型,我们选择 outbound 操作,并且选择具体的操作,比如 Create, Update 等。


    图14:选择操作类型
    图14:选择操作类型

    f) 在出现的 artifacts 设置对话框中,新建一个 JDBCTestOutbound 模块,然后设置产生的 artifacts 参数。其中需要注意的是连接属性(connection properties)需要选择使用动态连接属性(use discovered connection properties),并且指定的 J2C Authentication Data Entry 是在 ESB 服务器或者 WPS 服务器上已经存在的 J2C 验证条目,此条目提供了访问数据库的认证,包括用户名和密码。如果 ESB 服务器或者 WPS 服务器上不存在访问指定的数据库的认证条目,则需要新建一个。新建 J2C 认证条目,需要用 Web 浏览方式登陆 ESB 或者 WPS 服务器管理页面,选择 Global Security->J2EE Connector Architecture (J2C) authentication data entries,选择新建并且指定用户名和密码,如图17、18所示。


    图15:新建 JDBCTestOutbound 模块
    图15:新建JDBCTestOutbound模块

    图16:设置产生的 artifacts 参数
    图16:设置产生的artifacts参数

    图17:新建 J2C 认证条目
    图17:新建J2C认证条目

    图18:指定访问数据库的用户名和密码
    图18:指定访问数据库的用户名和密码

    g) 此时,Enterprise Service Discovery 向导结束。WID 为我们生成了一个 JDBCOutboundInterface 的接口,此接口包含访问数据库的指定操作。为了利用这个接口,我们需要新建一个组件 (Component),通过组件来调用这个接口提供的操作来完成具体的数据库访问。首先为这个组件定义好对外提供的接口。


    图19:新建接口
    图19:新建接口

    图20:接口定义
    图20:接口定义

    接口中所使用的数据类型如下所示。









    h) 新建组件并且添加这个接口。


    图21:为组件添加接口
    图21:为组件添加接口

    i) 连接此组件和JDBCOutboundInterface接口。


    图22:连接组件和接口
    图22:连接组件和接口

    j) 利用 WID 生成此组件的实现。此时在实现文件中你可以看到这样一段代码,此代码表示对于 JDBCOutboundInterface 的调用。


            public JDBCOutboundInterface
    locateService_JDBCOutboundInterfacePartner() {
    return (JDBCOutboundInterface) ServiceManager.INSTANCE
    .locateService("JDBCOutboundInterfacePartner");
    }

    然后可以用下面的代码访问数据库,实现创建数据库条目的操作。


            private static final BOFactory factory = (BOFactory)
    ServiceManager.INSTANCE
    .locateService(AdapterConstant.BOFACTORY_PATH);

    /**
    * logger for log4j.
    */
    private static Logger logger = Logger.getLogger(EStockImpl.class);

    /**
    * Comment for <code>j</code>
    */
    JDBCOutboundInterface j = locateService_JDBCOutboundInterfacePartner();


    //load user info from database
    public DataObject loadUserInfo(String userID) throws
    ServiceBusinessException {
    logger.debug("load user info start...");
    logger.debug("user ID: " + userID);

    //create dataobject used in retrieving database
    DataObject dbuserbg = factory.create(
    "http://StockLibrary/DataTypes/db2inst1userbg",
    "Db2inst1UserBG");
    DataObject dbuser = factory.create(
    "http://StockLibrary/DataTypes/db2inst1user",
    "Db2inst1User");

    //create data object returned to invoker.
    DataObject user = factory
    .create("http://StockLibrary/DataTypes", "User");

    //retrieve database with interface generated by adapter
    dbuser.setString("userid", userID);
    dbuserbg.setString("verb", null);
    dbuserbg.setDataObject("Db2inst1User", dbuser);
    try {
    dbuserbg = j.retrieveUser(dbuserbg);
    } catch (Exception e) {
    throw new
    ServiceBusinessException(CodeSystem.EM_NO_USER_FOUND);
    }
    dbuser = dbuserbg.getDataObject("Db2inst1User");
    user.setString("userID", dbuser.getString("userid"));
    user.setString("userType", dbuser.getString("usertype"));
    user.setString("mobilephoneNumber",
    dbuser.getString("mobilephoneNumber"));
    user.setString("preferedLanguage",
    dbuser.getString("preferedLanguage "));

    String userName = dbuser.getString("namegboobject");
    try{
    NameObject newNameObject = NameObject.parse(userName);
    String firstName =
    newNameObject.getName(NameField.NAME_FIELD_ID_FIRST_NAME);
    logger.debug(firstName);
    user.setString("userName", firstName);
    }catch(NameException e){
    //e.printStackTrace();
    logger.error("can't load user name");
    }
    logger.debug("load user info successfully...");
    return user;
    }


            //确认购入股票信息
    public String confirmBuy(DataObject stock, int quantity, String
    userID) throws ServiceBusinessException {
    String retval = CodeSystem.SUCCESS;
    String stockID = stock.getString("stockID");
    DataObject dbstockbg = factory
    .create(
    "http://StockLibrary/DataTypes/db2inst1stockbg",
    "Db2inst1StockBG");
    DataObject dbstock = factory
    .create(
    "http://StockLibrary/DataTypes/db2inst1stock",
    "Db2inst1Stock");
    DataObject dbohbg = factory.create(
    "http://StockLibrary/DataTypes/db2inst1operationhistorybg",
    "Db2inst1OperationhistoryBG");
    DataObject dboh= factory.create(
    "http://StockLibrary/DataTypes/db2inst1operationhistory",
    " Db2inst1Operationhistory");
    try {
    dbstock.setLong("stockid", Long.parseLong(stockID));
    dbstockbg.setString("verb", null);
    dbstockbg.setDataObject("Db2inst1Stock", dbstock);
    dbstockbg = j.retrieveStock(dbstockbg);
    dbstock = dbstockbg.getDataObject("Db2inst1Stock");
    double price = dbstock.getString("price");
    dbohbg.setString("verb", "Create");
    dboh.setString("userID", userID);
    dboh.setString("stockID",stockID);
    dboh.setString("buyingQuantity",quantity);
    dboh.setString("buyingPrice",price);
    dboh.setString("quantity",quantity);
    dbohbg.setDataObject("Db2Operationhistory", dboh);
    j.updateOperationhistory(dbohbg);

    } catch (NumberFormatException e) {
    // TODO Auto-generated catch block
    retval = CodeSystem.EM_GENERAL;
    throw new ServiceBusinessException(CodeSystem.EM_NOETICKET);
    } catch (Exception e) {
    // TODO Auto-generated catch block
    retval = CodeSystem.DB_RESULT_EXCEPTION;
    throw new
    ServiceBusinessException(CodeSystem.DB_RESULT_EXCEPTION);
    }

    return retval;
    }

    k) 为了能够调用实现的这个组件,需要将其以 Web Service 的形式导出,并且选择 soap/http 方式。至此 outbound 类型的 Adapter 项目实现完毕。


    图23:导出为 Web Services
    图23:导出为Web Services

    图24:选择 Web Services传输方式
    图24:选择Web Services传输方式

    2.2.2 构建 inbound 场景

    我们来看一下 inbound 类型的 Adapter 的实现方式。新建 Enterprise Service Discovery 以及设置连接参数、选择数据表的设置方式与 outbound 类型相同。不同的操作步骤从2 e)选择操作类型开始。另外 inbound 需要在数据库中创建一个事件表和 trigger 来辅助事件的转发。下面来看详细步骤。

    e) 创建事件表和 trigger


    CREATE TABLE WBIA_JDBC_EVENTSTORE(
    EVENT_ID INT GENERATED ALWAYS AS IDENTITY
    (START WITH 1, INCREMENT BY 1, NO CACHE ) NOT NULL ,
    OBJECT_KEY INT NOT NULL,
    OBJECT_NAME VARCHAR(40) NOT NULL ,
    OBJECT_FUNCTION VARCHAR(40) NOT NULL,

    CREATE TRIGGER EVENT_CREATE AFTER UPDATE ON STOCK
    REFERENCING NEW AS N FOR EACH ROW MODE DB2SQL
    INSERT INTO wbia_jdbc_eventstore (object_key, object_name,
    object_function,) VALUES (N.stockID, 'Db2inst1StockBG', 'Update');

    f) 选择操作类型,我们选择 inbound 操作,并且选择具体的操作,比如Create, Update等。


    图25:选择操作类型
    图25:选择操作类型

    g) 在出现的 artifacts 设置对话框中,新建一个 JDBCTesInbound 模块,然后设置产生的 artifacts 参数。同 outbound 类型一样,连接属性(connection properties)需要选择使用动态连接属性(use discovered connection properties),但此时 inbound 类型并不需要 J2C Authentication Data Entry。不同的是需要指定事件表和相应的排序字段,以便 Adapter 能够监测这个事件表,从而确定事件的发生。


    图26:设置产生的 artifacts 参数
    图26:设置产生的 artifacts 参数

    h) 此时,Enterprise Service Discovery 向导结束。WID 为我们生成了一个 JDBCInboundInterface 的接口,此接口包含当指定的数据表改变时将要触发的函数。为了利用这个接口,我们需要新建一个组件 (Component),通过组件来利用这个接口提供的操作来对数据库的改变进行反应。首先新建接口,并将接口与组件连接起来。


    图27:新建接口并连接
    图27:新建接口并连接

    然后利用 WID 生成此组件的实现。此时在实现文件中你可以看到这样一段代码,此代码表示当 Operationhistory 的条目发生改变时将要触发的动作。


    		public void updateDb2inst1Stock(
    DataObject updateDb2inst1StockInput) {
    //TODO Needs to be implemented.
    }

    i) 为上面这个函数添加代码如下:


        
    public void updateDb2inst1Stock (DataObject
    updateDb2inst1StockInput) {
    System.out.println("stock info changed and notify user
    start...");
    //get data changed
    DataObject dataObject = updateDb2inst1StockInput
    .getDataObject("Db2inst1Stock");
    System.out.println(updateDb2inst1StockInput
    .getString("verb"));
    System.out.println("updated stock: "
    + dataObject.getString("stockID"));
    String price= dataObject.getString("price");
    if (price < AdapterConstant.LOW_PRICE || price >
    AdapterConstant.HIGH_PRICE) {
    //get user list by stock id
    List userList = getUserListByStock(
    dataObject.getString("stockID"));

    //call service on WPS to notify user
    NotifyFFBP notifyService =
    locateService_NotifyFFBPPartner();
    BOFactory factory = (BOFactory)
    ServiceManager.INSTANCE.locateService(
    "com/ibm/websphere/bo/BOFactory");
    DataObject message =
    factory.create("http://StockLibrary/DataTypes",
    "ShortMessage");
    message.setString("price", price);
    message.setString("stockID", stockID);
    message.setList("userList", userList);

    notifyService.sendSMS(message);
    }
    System.out.println("notify user end...");
    }

    因为 inbound 操作是由数据库发起的,利用数据表的改变去调用相应的函数,因此 inbound 操作不需要导出为 Web services。

    2.2.3 部署项目

    a) 将生成的 inbound 或者 outbound 项目打包为 EAR 。


    图28:导出为 EAR 文件
    图28:导出为 EAR 文件

    b) 使用浏览器登陆ESB或者WPS服务器管理页面,选择 Application->Install new application,选择相应的 EAR 文件,如图24所示。然后点击 Next 或者 Finish 一直到应用程序安装完毕。


    图29:在服务器上部署应用程序
    图29:在服务器上部署应用程序

    c) 将使用的JDBC驱动拷贝到ESB或者WPS安装目录的lib文件下,<installation of ESB or WPS\lib>,然后在安装的应用程序列表中,启动刚刚安装的程序。

    至此,我们已经介绍了如何使用 WID 和 WebSphere Adapter for JDBC开发 inbound 和 outbound 类型的应用程序,并且介绍了如何部署这些程序。





    回页首


    三、 注意事项

    在使用 WebSphere Adapter for JDBC 的过程中,我们遇到了一些比较常见并且容易出错的地方,这可能是由于 WebSphere Adapter for JDBC 正处于开发测试阶段,相信随着 WebSphere Adapter for JDBC 的进一步开发和测试,这样的问题会越来越少。下面我们就一一介绍这些问题,希望能够帮助读者解决在使用 WebSphere Adapter for JDBC 的过程中出现的一些困难。

    3.1 有关JDBC驱动

    使用 JDBC 驱动的建议:使用 db2jcc.jar 中的 JDBC 驱动,不要使用 db2java.zip 中的 JDBC 驱动。

    虽 然 db2jcc.jar 和 db2java.zip 都提供了 DB2 的 JDBC 驱动,但我们在使用 db2java.zip 中的 COM.ibm.db2.jdbc.app.DB2Driver 时发现这个 JDBC 驱动和 WebSphere Adapter for JDBC 或者 ESB 服务器存在着一定的兼容问题。我们使用这个 JDBC 驱动分别开发了 outbound 和 inbound 类型的项目,如下图所示:


    图30:使用 db2java.zip 中的 JDBC 驱动
    图30:使用 db2java.zip 中的 JDBC 驱动

    这些项目能够成功的部署到 WID 内嵌的 ESB 测试环境中,但在将这些项目移植到单独安装的 ESB 服务器时却出现了问题。在启动这些项目时,项目无法启动或者无法调用,并且ESB服务器出现了 No suitable Driver 这种异常,如下图所示:


    图31:ESB服务器的 No suitable driver 异常
    图31:ESB服务器的 No suitable driver 异常

    起初,我们以为是 JDBC 驱动可能存在着冲突的问题,也就是在 ESB 服务器的类路径下存在着两个同样的 JDBC 驱动,因此我们将拷贝到<esb installation\lib>下的 db2java.zip 删除,重启 ESB 服务器,并重新尝试启动或调用这些项目,但项目仍无法启动或调用,这时ESB服务器出现了 ClassNotFound 异常,如下图所示:


    图32:ESB 服务器的 ClassNotFound 异常
    图32:ESB服务器的ClassNotFound异常

    因此我们推断应该是 db2java.zip 与 WebSphere Adapter for JDBC 或者 ESB 服务器的兼容问题,这些问题在使用 db2jcc.jar 中的 JDBC 驱动时得到了解决。

    3.2 有关数据库设计

    数据库字段类型的选择建议:对于表示日期和时间的字段,不要使用 Timestamp, Date 数据类型。

    数 据库中可能会需要保存时间和日期的字段,最方便的做法就是将这些字段的类型设置为 Timestamp, Date。但这样做在使用 WebSphere Adapter 时会出现问题。在生成的 outbound 项目中,我们试图利用 WebSphere Adapter 为我们生成的访问数据库的接口来访问数据库并取出这些时间字段,但令人惊讶的是在取出的时间变量中,我们只得到了日期值,而没有时间信息。通过进一步的测 试和观察发现,问题在于 WebSphere Adapter for JDBC v6.0.0.1 将数据库中 Timestamp, Date 类型转换成了 java 中的 java.sql.Date 类。在 J2SE 的 API 文档中对于 java.sql.Date 中的 getHours 函数有这样一段描述:This method is deprecated and should not be used because SQL Date values do not have a time component. 这个描述说明了 java.sql.Date 类并不包含时间信息,因此在从数据库中取出时间字段转换为 java.sql.Date 时,时间信息已经丢失了。因此在涉及到需要保存时间信息时,在数据库中不要使用 Timestamp, Date 类型。建议使用字符串来保存这些信息,在程序中作转换。

    数据库设计的建议:尽量少的改动数据库。对于数据库中的每张数据表, WebSphere Adapter for JDBC 都将其转换为一种数据类型,这种数据类型的每个字段都与数据表中的字段一一对应。但如果我们改动了数据表中的某个字段,比如更改了这个字段的类型或者名 字,WebSphere Adapter for JDBC 或者 WID 并不会自动将与这个数据表对应的数据类型中的字段改变,你需要手动去修改它。但不幸的是,WID 也存在着一定的问题,它对于数据类型的改变支持的不好。为了能使数据类型的改变生效,需要删除临时文件并且重新编译项目。但这些工作并不能保证数据类型的 改变一定能成功,更糟的情况是你需要重建项目,然后把原来项目的实现一行行的拷贝到新项目中去。

    3.3 关于模糊查询

    因 为 WebSphere Adapter for JDBC 还不成熟完善,因此在使用它时可能会遇到一些限制。其中之一就是对于数据表的复杂查询的限制。WebSphere Adapter for JDBC 只能使用精确的查询语句,也就是字段要么不加限制,要么等于某个值,它不支持〈、〉、?、*等模糊查询。因为需要通过编程来使用 WebSphere Adapter for JDBC 提供的查询功能,而在编程中,只能使用 DataObject 类型的 set 函数来设置查询条件,set 函数并不支持模糊的设置条件,因此 WebSphere Adapter for JDBC 只支持精确查询。





    回页首


    四、 结论

    本文通过我们实现的股票管理与交易系统的场景介绍了如何使用 WebSphere Adapter for JDBC 的 inbound 和 outbound 功能,并且指出在实际的使用过程中所碰到的问题,针对这些问题,提出了相应的解决或者妥协方法,希望能够减少读者在使用 WebSphere Adapter for JDBC 时所付出的努力和代价。



    参考资料

    1. J2EE Connector Architecture, Version 1.5 specification. http:// java.sun.com/j2ee/connector/.
    2. Introduction to the J2EE Connector Architecture. http://www.ibm.com/developerworks/edu/j-dw-javajca-i.html.
    3. Redbook for WebSphere Adapter Development. http://www.redbooks.ibm.com/abstracts/sg246387.html.
    4. Whitepaper for Enterprise Metadata Discovery. http://www.ibm.com/developerworks/java/library/j-emd/.
  • Rational系列产品大全详细介绍

    2008-11-07 17:21:32

    从项目设计到实现,Rational 提供技术和 软件帮助团队在软件开发和交付项目中更有效地协作。现今的焦点都是增长生产力、减少投放市场的时间,以及对推动创新并增加客户价值的新技术的快速反应。 Rational 软件交付平台(Rational Software Delivery Platform) 是一个为软件和基于软件系统的开发提供完整解决方案的集成平台。Rational系列产品大全详细介绍如下表所示:

    系列

    产品名称

    产品说明

    需求分析

    IBM Rational RequisitePro

    主要关注于项目的文档、通信和控制的不断变化的需求

    IBM Rational Software Modeler

    使用统一建模语言(UML)符号可视化模型系统和应用程序

    设计和构建

    IBM Rational Software Architect

    使用一个工具统一架构、设计和开发

    IBM Rational Application Developer for WebSphere Software

     

    IBM Rational Web Developer for WebSphere Software

    利用一个易于使用的 IDE 构建、测试和部署 Web、Web 服务和Java 应用程序,这个 IDE 是为了使用 IBM WebSphere 软件而优化的,而且它还提供了在其他技术平台上进行开发的能力

    IBM Rational Rose

    IBM Rational Rose 使构架设计师和设计人员能够使用统一建模语言 (UML) 进行模型驱动开发。这些用户可以建立软件构架、业务需求、可重用资源、管理级通信的平台独立模型。行业标准的 UML 支持和强大的模式引擎可以创建语义丰富的应用程序构架,该构架可满足业务需求,易于为开发团队理解

    软件质量保证

    IBM Rational Functional Tester

    执行功能测试自动化,以增加复杂 Java、Microsoft Visual Studio?.NET WinForm 和基于 Web 的应用程序中发现的缺陷

    IBM Rational Manual Tester

    编写和执行手动测试,使用 novel 设计和重用功能

    IBM Rational Performance Tester

    基于多用户负载,验证 Web 应用程序性能、可伸缩性和可靠性

    IBM Rational PurifyPlus

    自动化运行时错误侦测、瓶颈问题发现和代码覆盖分析,以提高单位测试和调试的有效性

    IBM Rational Robot

     

    IBM Rational Test RealTime

    执行面向内嵌的和其他实时环境的应用程序的组件测试和运行时分析

    软件配置管理

    IBM Rational ClearCase? family

    利用全面的版本控制、工作空间管理以及构建和版本管理来实现软件资产管理

    IBM Rational ClearQuest? family

    通过开发生命周期来管理工作流和变更请求,缺陷和增强都包括

    过程和项目管理

    IBM Rational Unified Process?

    采用灵活的、可配置的开发过程,以满足团队和技术的需要

    IBM Rational Method Composer

    采用灵活的、可配置的开发过程,以满足团队和技术的需要

    IBM Rational Portfolio Manager

    自动化 IT 管理过程并调整优先级、项目和带有商业目标的人

    IBM Rational SUMMIT? Ascendant

    使用方法库和基于 Web 的用于规划、评估和监控的工具,来规划和管理企业 IT 项目和规划

    IBM Rational Team Unifying Platform

    提供核心基础设施,包括生命周期过程指南、需求管理、版本控制、缺陷和变更跟踪、测试管理,以及项目度量和报告

422/3<123>
Open Toolbar