随笔 - 3  文章 - 0  trackbacks - 0
<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

常用链接

留言簿(1)

随笔档案

文章档案

搜索

  •  

积分与排名

  • 积分 - 1516
  • 排名 - 4258

最新评论

阅读排行榜

评论排行榜

Globus开源网格基础平台简介
http://www.media.edu.cn 2007-10-22 作者:
网格技术出现于20世纪90年代,其核心思想是:“整个因特网就是一台计算机!”Globus Tookit工具包来源于Globus项目,Globus项目是国际上最有影响力的与网格计算相关的项目之一,是由来自世界各地关注网格技术的研究人员和开发人员共同努力的成果。

网格技术出现于20世纪90年代,它的目的是想利用高速互联网把分布于不同地理位置的计算机、数据库、存储器和软件等资源连成整体,就像一台超级计算机一样,为用户提供一体化信息服务,其核心思想是:“整个因特网就是一台计算机!”

由全球网格论坛(GGF)下属Globus项目组成员联合开发的Globus Toolkit标准工具包,已被公认为当前建立网格系统和开发网格软件事实的参考标准。

最近一两年,“网格”这个词持续升温。你如果用Google搜索“网格”,可以看到8万个结果;你会发现除了美国、欧洲对网格的研究投入了巨资,我们国家也通过“863”、自然科学基金等设立了网格专项,对网格有数亿元的投资;你还可以看到,有关网格的活动高潮迭起。

所有这些都说明了网格已经悄然的走进了千家万户,它正被越来越多的人认识和熟悉。在因特网的刺激下,计算机行业正迎接影响深远的第三次发展浪潮。

Globus Toolkit

Globus Tookit工具包来源于Globus项目,Globus项目是国际上最有影响力的与网格计算相关的项目之一,是由来自世界各地关注网格技术的研究人员和开发人员共同努力的成果。Globus Tookit是一个开放源码的网格的基础平台,基于开放结构、开放服务资源和软件库,并支持网格和网格应用,目的是为构建网格应用提供中间件服务和程序库。

Globus Tookit具有较为统一的国际标准,有利于整合现有资源,也易于维护和升级换代。现在,一些重要的公司,包括IBM和微软等都公开宣布支持Globus Toolkit。目前大多数网格项目都是采用基于Globus Tookit所提供的协议及服务建设的。

 

Globus现在的发展势头正可谓与Linux有异曲同工之处。作为免费的操作系统,Linux正以势如破竹之势发展着。从世界范围来看,开放源代码软件(OSS)是软件业发展的大趋势,Linux更是OSS的重头戏,不仅深得IBM、惠普和Sun等国际IT巨头的厚爱,同时也博得了各国政府的支持。

 

Globus与Linux 最大的相似之处在于,它们都是开放源代码软件,推广、使用开源软件已成为众多政府官员、专家、企业与用户的共识。目前,Globus和Linux的都非常注重标准的制定,通过采用统一的标准,使各个公司企业同一个方向上发展,加快他们的普及。所以我们可以形象地将Globus称作网格世界的Linux。

 

随着时代的发展和进步,Globus随着体系结构的变化也经历了几次飞跃,它现在变得越来越完善。

 

Globus Toolkit 2

 

自从1997年起,Globus Toolkit工具包的第二版(GT2)成为了网格计算的事实标准。它着重于可用性和互操作性能力,定义和实现了一些协议、API和服务。

 

当时在世界上有上千个网格应用基于GT2,通过提供授权认证、资源发现和资源访问等共同问题的解决方案,GT2加快了网格应用的构建。GT2通过定义和实现的“标准”协议和服务,真正地实现了可互操作的网格系统。

 

但是,GT2毕竟目的是针对网格的具体实现,所以它并没有一个正式的标准,也没有接受公开的审阅,所以在某种程度上限制了它的发展。随着网格技术的快速发展和全球网格论坛这个标准性的机构出现,使修订Globus Tookit的协议的标准提到了日程上。

 

基于OGSI的Globus

 

2002年2 月,在加拿大多伦多市召开的全球网格论坛GGF会议上,Globus项目组和IBM共同倡议了一个全新的网格标准OGSA。OGSA叫做开放网格服务体系,它把Globus标准与以商用为主的Web Services的标准结合起来,网格服务统一以Services的方式对外界提供。2003年符合OGSA规范的Globus Toolkit 3.0(GT3)发布,这标志着OGSA已经从一种理念、一种体系结构,走到付诸实践的阶段了。

 

GT3提供了一个完整的开放网格服务基础设施(OGSI)实现,它的许多功能重构成与OGSI兼容的服务。GT3将服务发现、程序执行作业的提交、监控和可靠的文件传输,定义成了与OGSI兼容的服务。其它如数据传递、副本定位和授权等服务也尽量构建成与OGSI相兼容。并且GT3定义了一组关于使用Web服务描述语言(WSDL)和扩展标识语言(XML)模式的约定与扩展,以便启用有状态服务。

 

虽然OGSI的概念很重要,但是也存在一些自身的缺陷,需要一些新的结构来解决这些问题。所以采用新的结构代替OGSI是有必要的,通过转变可以获得网络服务强有力的支持。

 

基于WSRF的Globus

 

2004年1 月,美国Akamai Technologies、美国The Globus Alliance、惠普、IBM、美国Sonic Software和美国TIBCO Software六公司公布了统一网格计算和Web服务的新标准“WS-Notification”和“WS-Resource Framework”。Web服务资源框架(WSRF)是OGSI的重构和发展,利用新的Web服务标准。

 

WSRF基本保留了OGSI中的所有功能,同时更改了一些语法,并且还在其表示中采用了不同的技术。Web服务通知(WSN)为Web服务提供基于消息发布和预定能力。WSRF和WSN都是建立在已存在的Web服务定义和技术基础上的,帮助实现了网格计算、系统管理和Web服务的统一。

 

2005年1月31日发布的Globus Toolkit 4(GT4),实现了WSRF和WSN标准。GT4提供API来构建有状态的Web服务,其目标是建立分布式异构计算环境。所有知名的GT3协议都被重新设计为可以使用WSRF。并且GT4也在其中增添了一些新的Web服务的组件。    

posted @ 2007-11-03 11:56 y 阅读(197) | 评论 (0)编辑 收藏

讲述MFC规则DLL的创建与使用技巧。
5. MFC规则DLL

  5.1 概述

  MFC规则DLL的概念体现在两方面:

  (1) 它是MFC的
  
  “是MFC的”意味着可以在这种DLL的内部使用MFC;

  (2) 它是规则的
“是规则的”意味着它不同于MFC扩展DLL,在MFC规则DLL的内部虽然可以使用MFC,但是其与应用程序的接口不能是MFC。而MFC扩展DLL与应用程序的接口可以是MFC,可以从MFC扩展DLL中导出一个MFC类的派生类。

  Regular DLL能够被所有支持DLL技术的语言所编写的应用程序调用,当然也包括使用MFC的应用程序。在这种动态连接库中,包含一个从CWinApp继承下来的类,DllMain函数则由MFC自动提供。

  Regular DLL分为两类:

  (1)静态链接到MFC 的规则DLL

  静态链接到MFC的规则DLL与MFC库(包括MFC扩展 DLL)静态链接,将MFC库的代码直接生成在.dll文件中。在调用这种DLL的接口时,MFC使用DLL的资源。因此,在静态链接到MFC 的规则DLL中不需要进行模块状态的切换。

  使用这种方法生成的规则DLL其程序较大,也可能包含重复的代码。

  (2)动态链接到MFC 的规则DLL

  动态链接到MFC 的规则DLL 可以和使用它的可执行文件同时动态链接到 MFC DLL 和任何MFC扩展 DLL。在使用了MFC共享库的时候,默认情况下,MFC使用主应用程序的资源句柄来加载资源模板。这样,当DLL和应用程序中存在相同ID的资源时(即所谓的资源重复问题),系统可能不能获得正确的资源。因此,对于共享MFC DLL的规则DLL,我们必须进行模块切换以使得MFC能够找到正确的资源模板。

  我们可以在Visual C++中设置MFC规则DLL是静态链接到MFC DLL还是动态链接到MFC DLL。如图8,依次选择Visual C++的project -> Settings -> General菜单或选项,在Microsoft Foundation Classes中进行设置。


图8 设置动态/静态链接MFC DLL



    5.2 MFC规则DLL的创建

  我们来一步步讲述使用MFC向导创建MFC规则DLL的过程,首先新建一个project,如图9,选择project的类型为MFC AppWizard(dll)。点击OK进入如图10所示的对话框。


图9 MFC DLL工程的创建


图10所示对话框中的1区选择MFC DLL的类别。

  2区选择是否支持automation(自动化)技术, automation 允许用户在一个应用程序中操纵另外一个应用程序或组件。例如,我们可以在应用程序中利用 Microsoft Word 或Microsoft Excel的工具,而这种使用对用户而言是透明的。自动化技术可以大大简化和加快应用程序的开发。

  3区选择是否支持Windows Sockets,当选择此项目时,应用程序能在 TCP/IP 网络上进行通信。 CWinApp派生类的InitInstance成员函数会初始化通讯端的支持,同时工程中的StdAfx.h文件会自动include <AfxSock.h>头文件。

  添加socket通讯支持后的InitInstance成员函数如下:

BOOL CRegularDllSocketApp::InitInstance()
{
 if (!AfxSocketInit())
 {
  AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
  return FALSE;
 }
 return TRUE;
}

  4区选择是否由MFC向导自动在源代码中添加注释,一般我们选择“Yes,please”。


图10 MFC DLL的创建选项

posted @ 2007-08-16 16:15 y 阅读(189) | 评论 (0)编辑 收藏

Because SQL is a declarative language, you can write the same query in many forms, each getting the same result but with vastly different execution plans and performance.

In this example, we select all books that do not have any sales.  Note that this is a non-correlated sub-query, but it could be re-written in several ways.

select
   book_key
from
   book
where
   book_key NOT IN (select book_key from sales);
 

There are serious problems with subqueries that may return NULL values. It is a good idea to discourage the use of the NOT IN clause (which invokes a sub-query) and to prefer NOT EXISTS (which invokes a correlated sub-query), since the query returns no rows if any rows returned by the sub-query contain null values.

select
   book_key
from
   book
where
   NOT EXISTS (select book_key from sales);

Subqueries can often be re-written to use a standard outer join, resulting in faster performance.  As we may know, an outer join uses the plus sign (+) operator to tell the database to return all non-matching rows with NULL values.  Hence we combine the outer join with a NULL test in the WHERE clause to reproduce the result set without using a sub-query.

select
   b.book_key
from
   book  b,
   sales s
where
   b.book_key = s.book_key(+)
and
   s.book_key IS NULL;

This execution plan will also be faster by eliminating the sub-query.

posted @ 2007-08-14 15:06 y 阅读(198) | 评论 (0)编辑 收藏

What is a subquery?

A subquery is a query within a query. In Oracle, you can create subqueries within your SQL statements. These subqueries can reside in the WHERE clause, the FROM clause, or the SELECT clause.


WHERE clause

Most often, the subquery will be found in the WHERE clause. These subqueries are also called nested subqueries.

For example:

select * from all_tables tabs
where tabs.table_name in (select cols.table_name
 from all_tab_columns cols
 where cols.column_name = 'SUPPLIER_ID');

Limitations: Oracle allows up to 255 levels of subqueries in the WHERE clause.


FROM clause

A subquery can also be found in the FROM clause. These are called inline views.

For example:

select suppliers.name, subquery1.total_amt
from suppliers,
   (select supplier_id, Sum(orders.amount) as total_amt
   from orders
   group by supplier_id) subquery1,
where subquery1.supplier_id = suppliers.supplier_id;

In this example, we've created a subquery in the FROM clause as follows:

(select supplier_id, Sum(orders.amount) as total_amt
 from orders
 group by supplier_id) subquery1

This subquery has been aliased with the name subquery1. This will be the name used to reference this subquery or any of its fields.

Limitations: Oracle allows an unlimited number of subqueries in the FROM clause.


SELECT clause

A subquery can also be found in the SELECT clause.

For example:

select tbls.owner, tbls.table_name,
  (select count(column_name) as total_columns
   from all_tab_columns cols
   where cols.owner = tbls.owner
   and cols.table_name = tbls.table_name) subquery2
from all_tables tbls;

In this example, we've created a subquery in the SELECT clause as follows:

(select count(column_name) as total_columns
 from all_tab_columns cols
 where cols.owner = tbls.owner
 and cols.table_name = tbls.table_name) subquery2

The subquery has been aliased with the name subquery2. This will be the name used to reference this subquery or any of its fields.

The trick to placing a subquery in the select clause is that the subquery must return a single value. This is why an aggregate function such as SUM, COUNT, MIN, or MAX is commonly used in the subquery

posted @ 2007-08-14 12:19 y 阅读(199) | 评论 (0)编辑 收藏
    只有注册用户登录后才能阅读该文。阅读全文
posted @ 2007-08-13 18:06 y 阅读(43) | 评论 (0)编辑 收藏
    只有注册用户登录后才能阅读该文。阅读全文
posted @ 2007-08-13 17:32 y 阅读(47) | 评论 (0)编辑 收藏
    只有注册用户登录后才能阅读该文。阅读全文
posted @ 2007-08-11 08:56 y 阅读(48) | 评论 (0)编辑 收藏
给个通俗的解释吧.
例表a
aid adate
1 a1
2 a2
3 a3
表b
bid bdate
1 b1
2 b2
4 b4
两个表a,b相连接,要取出id相同的字段
select * from a inner join b on a.aid = b.bid这是仅取出匹配的数据.
此时的取出的是:
1 a1 b1
2 a2 b2
那么left join 指:
select * from a left join b on a.aid = b.bid
首先取出a表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
3 a3 空字符
同样的也有right join
指的是首先取出b表中所有数据,然后再加上与a,b匹配的的数据
此时的取出的是:
1 a1 b1
2 a2 b2
4 空字符 b4
posted @ 2007-07-10 12:01 y 阅读(184) | 评论 (0)编辑 收藏
 声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

        接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

       接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。

      接口更关注“能实现什么功能”,而不管“怎么实现的”。

posted @ 2007-07-06 15:58 y 阅读(177) | 评论 (0)编辑 收藏
声明方法的存在而不去实现它的类被叫做抽象类(abstract class),它用于要创建一个体现某些基本行为的类,并为该类声明方法,但不能在该类中实现该类的情况。不能创建abstract 类的实例。然而可以创建一个变量,其类型是一个抽象类,并让它指向具体子类的一个实例。不能有抽象构造函数或抽象静态方法。Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。

        接口(interface)是抽象类的变体。在接口中,所有方法都是抽象的。多继承性可通过实现这样的接口而获得。接口中的所有方法都是抽象的,没有一个有程序体。接口只可以定义static final成员变量。接口的实现与子类相似,除了该实现类不能从接口定义中继承行为。当类实现特殊接口时,它定义(即将程序体给予)所有这种接口的方法。然后,它可以在实现了该接口的类的任何对象上调用接口的方法。由于有抽象类,它允许使用接口名作为引用变量的类型。通常的动态联编将生效。引用可以转换到接口类型或从接口类型转换,instanceof 运算符可以用来决定某对象的类是否实现了接口。

       接口可以继承接口。抽象类可以实现(implements)接口,抽象类是可以继承实体类,但前提是实体类必须有明确的构造函数。

      接口更关注“能实现什么功能”,而不管“怎么实现的”。

相同及联系
  A. 两者都是抽象类,都不能实例化。
  B. interface实现类及abstrct class的子类都必须要实现已经声明的抽象方法。

2. 不同
  A. interface需要实现,要用implements,而abstract class需要继承,要用extends。
  B. 一个类可以实现多个interface,但一个类只能继承一个abstract class。
  C. interface强调特定功能的实现,而abstract class强调所属关系。 
  D. 尽管interface实现类及abstrct class的子类都必须要实现相应的抽象方法,但实现的形式不同。interface中的每一个方法都是抽象方法,都只是声明的(declaration, 没有方法体),实现类必须要实现。而abstract class的子类可以有选择地实现。这个选择有两点含义:
    一是Abastract class中并非所有的方法都是抽象的,只有那些冠有abstract的方法才是抽象的,子类必须实现。那些没有abstract的方法,在Abstrct class中必须定义方法体。
    二是abstract class的子类在继承它时,对非抽象方法既可以直接继承,也可以覆盖;而对抽象方法,可以选择实现,也可以通过再次声明其方法为抽象的方式,无需实现,留给其子类来实现,但此类必须也声明为抽象类。既是抽象类,当然也不能实例化。
  E. abstract class是interface与Class的中介。
  interface是完全抽象的,只能声明方法,而且只能声明pulic的方法,不能声明private及protected的方法,不能定义方法体,也不能声明实例变量。然而,interface却可以声明常量变量,并且在JDK中不难找出这种例子。但将常量变量放在interface中违背了其作为接口的作用而存在的宗旨,也混淆了interface与类的不同价值。如果的确需要,可以将其放在相应的abstract class或Class中。
  abstract class在interface及Class中起到了承上启下的作用。一方面,abstract class是抽象的,可以声明抽象方法,以规范子类必须实现的功能;另一方面,它又可以定义缺省的方法体,供子类直接使用或覆盖。另外,它还可以定义自己的实例变量,以供子类通过继承来使用。

3. interface的应用场合
  A. 类与类之前需要特定的接口进行协调,而不在乎其如何实现。
  B. 作为能够实现特定功能的标识存在,也可以是什么接口方法都没有的纯粹标识。
  C. 需要将一组类视为单一的类,而调用者只通过接口来与这组类发生联系。
  D. 需要实现特定的多项功能,而这些功能之间可能完全没有任何联系。

4. abstract class的应用场合
  一句话,在既需要统一的接口,又需要实例变量或缺省的方法的情况下,就可以使用它。最常见的有:
  A. 定义了一组接口,但又不想强迫每个实现类都必须实现所有的接口。可以用abstract class定义一组方法体,甚至可以是空方法体,然后由子类选择自己所感兴趣的方法来覆盖。
  B. 某些场合下,只靠纯粹的接口不能满足类与类之间的协调,还必需类中表示状态的变量来区别不同的关系。abstract的中介作用可以很好地满足这一点。
  C. 规范了一组相互协调的方法,其中一些方法是共同的,与状态无关的,可以共享的,无需子类分别实现;而另一些方法却需要各个子类根据自己特定的状态来实现特定的功能。

posted @ 2007-07-06 15:53 y 阅读(234) | 评论 (0)编辑 收藏
仅列出标题