2005年5月30日星期一

Mashups:Web 应用程序新成员

  Mashup 是一种令人兴奋的交互式 Web 应用程序,它利用了从外部数据源检索到的内容来创建全新的创新服务。它们具有第二代 Web 应用程序的特点,也称为 Web 2.0.这篇简介性的文章对 mashup 是什么、目前流行的不同种类的 mashup 以及 mashup 开发人员用于创建自己的应用程序的支持技术进行了探索。另外,您还将看到 mashup 开发人员面临的一些新的技术和社会挑战。

  简介

  一种新型的基于 Web 的数据集成应用程序正在 Internet 上逐渐兴起。通常用术语 mashup 表示,它们的流行萌芽于对交互式用户参与和集成第三方数据的类似于科学怪人方式的重视。我们使用萌芽一词是有一定原因的;mashup Web 站点的特点就表现为它正在 Web 上扎根发芽,它们利用了从组织边界之外的数据源获取的内容和功能。

  mashup 这种隐晦的数据集成定义当然不是非常严格。要深入了解什么是 mashup,就应该了解一下这个单词的起源:它源于流行音乐,mashup 是从两首不同的歌曲(通常属于不同的流派)中混合演唱和乐器的音轨而构成的一首新歌。与那些 “bastard pop” 歌曲类似,mashup 也是内容的一种不常见的创新组合(通常都源自于无关的数据源),这都是人工进行合成的(而不是通过计算机来合成的)。

  那么,mashup 看起来到底是什么样子呢?ChicagoCrime.org 的 Web 站点上有非常直观的例子,它解释了地图 mashup 到底是什么。最初广泛流行起来的 mashup 之一是一个 Web 站点,它将芝加哥警局在线数据库中的犯罪记录与 Google Maps 上的地图复合在一起。用户可以与 mashup 站点进行交互,例如告诉它在图形界面上显示一个包含图钉的地图,图钉展示南加州最近所有入室抢劫案件的详细信息。这种概念和呈现方式非常简单,犯罪和地图数据复合之后提供的可视化的功能非常强大。

  在 Mashup 流派 中,我们探索了流行的 mashup,包括地图 mashup.相关技术 简要介绍了与 mashup 的构建和操作有关的技术前景。技术挑战 和 社会挑战 分别介绍了影响 mashup 的主要技术挑战和社会挑战。

  Mashup 类型

  在本节中,我们将简要介绍对出名的 mashup 类型进行的一些调查。

  地图 mashup

  在这个阶段的信息技术中,人们搜集大量有关事物和行为的数据,二者都常常具有位置注释信息。所有这些包含位置数据的不同数据集均可利用地图通过令人惊奇的图形化方式呈现出来。mashup 蓬勃发展的一种主要动力就是 Google 公开了自己的 Google Maps API.这仿佛打开了一道大门,让 Web 开发人员(包括爱好者、修补程序开发人员和其他一些人)可以在地图中包含所有类型的数据(从原子弹灾难到波士顿的 CowParade 奶牛都可以)。为了不落于人后,Microsoft(Virtual Earth)、Yahoo(Yahoo Maps)和 AOL(MapQuest)也很快相继公开了自己的 API.

  视频和图像 mashup

  图像主机和社交网络站点(例如 Flickr 使用自己的 API 来共享图像)的兴起导致出现了很多有趣的 mashup.由于内容提供者拥有与其保存的图像相关的元数据(例如谁拍的照片,照片的内容是什么,在何时何地拍摄的等等),mashup 的设计者可以将这些照片和其他与元数据相关的信息放到一起。例如,mashup 可以对歌曲或诗词进行分析,从而将相关照片拼接在一起,或者基于相同的照片元数据(标题、时间戳或其他元数据)显示社交网络图。另外一个例子可能以一个 Web 站点(例如 CNN 之类的新闻站点)作为输入,并在新闻中通过照片匹配而将照片中的内容以文字的形式呈现出来。

  搜索和购物 mashup

  搜索和购物 mashup 在 mashup 这个术语出现之前就已经存在很长时间了。在 Web API 出现之前,有相当多的购物工具,例如 BizRate、PriceGrabber、MySimon 和 Google 的 Froogle,都使用了 B2B 技术或屏幕抓取的方式来累计相关的价格数据。为了促进 mashup 和其他有趣的 Web 应用程序的发展,诸如 eBay 和 Amazon 之类的消费网站已经为通过编程访问自己的内容而发布了自己的 API.

  新闻 mashup

  新闻源(例如纽约时报、BBC 或路透社)已从 2002 年起使用 RSS 和 Atom 之类的联合技术来发布各个主题的新闻提要。以联合技术为基础的 mashup 可以聚集一名用户的提要,并将其通过 Web 呈现出来,创建个性化的报纸,从而满足读者独特的兴趣。Diggdot.us 正是这样的一个例子,它合并了 Digg.com、Slashdot.org 和 Del.icio.us 上与技术有关的内容。

  相关技术

  本节概要介绍了可以促进 mashup 发展的技术。

  架构

  mashup 程序从架构上是由 3 个不同的部分组成的,它们在逻辑上和物理上都是相互脱离的(可能由网络和组织边界分隔):API/内容提供者、mashup 站点和客户机的 Web 浏览器。

  API/内容提供者。它们是(有时是未知的)正在进行融合的内容的提供者。在 ChicagoCrime.org mashup 的例子中,提供者是 Google 和芝加哥警察局。为了方便数据的检索,提供者通常会将自己的内容通过 Web 协议对外提供(例如 REST、Web 服务和 RSS/Atom,稍后将加以介绍)。然而,很多有趣的潜在数据源可能并没有方便地对外提供 API.从诸如 Wikipedia、TV Guide 和所有政府和公共领域的 Web 站点上提取内容的 mashup 都是通过一种称为屏幕抓取(screen scraping) 的技术实现的。 在这种情况中,屏幕抓取就意味着使用一种工具从内容提供者那里提取信息的过程,这个工具会尝试对提供者的专为阅读而设计的页面进行分析。

  mashup 站点。即 mashup 所在的地方。非常有趣的是,这不过是因为这里是 mashup 逻辑所在的地方,而不是执行这些逻辑的地方。从一方面来说,mashup 可以直接使用服务器端动态内容生成技术(例如 Java servlets、CGI、PHP 或 ASP)实现为类似传统 Web 应用程序。

  另外,合并内容可以直接在客户机的浏览器中通过客户机端脚本(即 JavaScript)或 applet 生成。这种客户机端的逻辑通常都是直接在 mashup 的 Web 页面中嵌入的代码与这些 Web 页面引用的脚本 API 库或 applet(由内容提供者提供)的组合。mashup 使用的这种方法可以称为胖 Internet 应用程序(RIA),这意味着它们是以交互式用户体验为导向的。(胖 Internet 应用程序具有 “Web 2.0” 的一个特点,Web 2.0 是 WWW 的新一代服务。)客户机端进行数据集成的优点包括:对 mashup 服务器的所产生的负载较轻(数据可以直接从内容提供者那里传送过来)、具有更好无缝用户体验(页面可以请求对内容的一部分进行更新,而不用刷新整个页面)。Google Maps API 的设计就是为了通过浏览器端的 JavaScript 进行访问,这是客户机端技术的一个例子。

  通常,mashup 都使用服务器和客户机端逻辑的组合来实现自己的数据集成。很多 mashup 应用程序都使用了直接由用户提供的数据,(至少)使一个数据集是本地的。另外,对多数据源的数据执行复杂查询(例如 “请显示在 Kevin Bacon 的电影中出演角色的男演员所购买的房产的平均价格”)所需要的计算是不可能在客户机的 Web 浏览器中执行的。

  客户机的 Web 浏览器。这是以图形化的方式呈现应用程序的地方,也是用户交互发生的地方。正如上面介绍的一样,mashup 通常都使用客户机端的逻辑来构建合成内容。

  Ajax

  关于 Ajax 究竟是否是一个缩写词(有人认为它表示 “Asynchronous JavaScript + XML”)还存在争论。不论如何,Ajax 都是一个 Web 应用模型,而不是一种特定的技术。它包括几种关注内容的异步加载和呈现的技术:

  XHTML 和用于确定呈现风格的 CSS

  浏览器为动态显示和交互所提供的文档对象模型(DOM)API

  异步数据交换,通常是 XML 数据

  浏览器端的脚本,主要是 JavaScript

  将这些技术结合在一起使用时,它们的目标是通过与内容服务器交换少量的数据为用户创造平滑、良好的 Web 体验,而不用在用户执行某些操作之后重新加载并重新呈现整个页面。我们可以使用各种 Ajax 工具包和库(例如 Sajax 或 Zimbra)为 mashup 构建 Ajax 引擎,这通常是使用 JavaScript 实现的。Google Maps API 包括一个专用的 Ajax 引擎,它对用户体验的影响着实强大:它的工作方式类似于一个真正的本地应用程序,其中没有滚动条可以操作,也没有移动按钮强制页面重新加载。

  Web 协议:SOAP 和 REST

  SOAP 和 REST 都是与远程服务进行通信所使用的与平台无关的协议。作为面向服务的架构范式的一部分,客户机使用 SOAP 和 REST 与远程服务进行交互,而不用了解它们底层的平台实现:服务的功能完全是由它请求和收到的显影消息描述来实现的。

  SOAP 是 Web 服务范式中的一种基本技术。最初它是 Simple Object Access Protocol 的缩写,现在代表 Services-Oriented Access Protocol(或直接缩写为 SOAP),这是因为它的重点已经从基于对象的系统转向消息交换的交互操作。SOAP 规范中有两个关键组件。第一个组件是使用 XML 消息格式进行平台无关的编码,第二个组件消息结构,包括消息头和消息体。消息头用来交换非特定于应用负载(消息体)的相关信息,例如认证信息。SOAP 消息体封装了应用程序特有的负载。Web 服务的 SOAP API 是由 WSDL 文档来描述的,它们本身都描述了一个服务对外提供哪些操作,它可以接受的消息格式(使用 XML Schema),以及如何对其进行寻址。SOAP 消息通常都是通过 HTTP 协议传送的,不过也可以通过其他方式传送(例如 JMS 或 e-mail)。

  REST 是 Representational State Transfer 的缩写,这是一种只使用 HTTP 和 XML 进行基于 Web 通信的技术。它的简单性和缺少严格配置文件的特性使它与 SOAP 很好地隔离开来,并且吸引了大家广泛的兴趣。与我们在现代变成语言中可以找到的典型基于动词的接口不同(它们构成了各种方法,例如 getEmployee()、addEmployee()、listEmployees() 等)不同,REST 从根本上来说只支持几个操作(即 POST、GET、PUT、DELETE),这些操作适用于所有的消息。REST 强调信息本身,称为资源。例如,一个员工的资源记录是由 URI 标识的,这可以通过一个 GET 方法获得,并使用一个 PUT 操作进行更新,等等。使用这种方法,REST 就与文档文本风格的 SOAP 服务非常类似。

  屏幕抓取

  正如前面介绍的一样,缺乏内容提供者提供的 API 通常会强制要求 mashup 开发人员采取屏幕抓取的方式来提取自己希望集成的信息。抓取(Scraping) 是使用软件工具处理并分析最初为人们阅读而编写的内容,从而从中提取出可以通过编程进行使用和操作的信息的语义数据结构表示。有些 mashup 使用屏幕抓取技术来获取数据,特别是从公用领域提取数据。例如,房地产地图 mashup 就可以在制图供应商提供的地图上显示售价和租价,这些数据可能是从当地的记录办公室抓取来的 “comp” 数据。另外一个抓取数据的 mashup 项目是 XMLTV,这是一组汇聚了各地电视节目清单的工具集。

  屏幕抓取通常被认为是一个不雅的解决方案,这是有一定的原因的。它有两个主要的固有缺点。第一个缺点在于,与使用接口的 API 不同,抓取在内容提供者和内容消费者之间没有明确的联系。抓取者必须围绕一个源内容模型设计自己的工具,并且希望提供者一直采用这种模型来呈现内容。Web 站点倾向于周期性地更新外观,以保持新颖和时髦,对于抓取者来说,这是一项非常头痛的维护任务,因为工具很可能会失效。

  第二个问题是缺少成熟的可重用屏幕抓取工具包软件,通俗地说就称为 scrAPI.此类 API 和工具包的消亡很大程度上是由于每种抓取工具都有极为特定于应用程序的需求。这为开发人员带来了过多的开发工作,他们必须对内容进行反向工程处理、开发数据模型、分析并从提供者站点上汇集原始数据。

  语义 Web 和 RDF

  屏幕抓取不好的一面直接源自于一个事实:为阅读而创建的内容并不太适合机器自动处理。这促进了语义 Web 的诞生,它是现有 Web 的增强版本,在为人们设计的内容中增加了足够多的可供机器阅读的信息。在语义 Web 环境中,信息这个术语与数据有所差异;数据只有在传达了自己的含义(即数据可被理解)之后才会变成信息。语义 Web 的目标是创建 Web 基础设施,使用元数据对数据进行增强,从而使数据变得有意义,最终使数据变得适合进行自动化、集成、推理和重用。

  被称为资源描述框架(RDF)的 W3C 系列规范就是服务于这个目的的技术,它用来建立描述数据的语义结构。XML 本身并不足以实现这种功能;它太过随意,我们可以使用很多方法进行编码来对相同的数据进行描述。RDF-Schema 补充了 RDF 的能力,提供了以机器可读的方式编码概念的功能。一旦可通过一种数据模型描述数据对象,RDF 就提供了通过主语-谓语-对象三元组(主语 S 与对象 O 具有关系 R)在数据对象之间构建关系的能力。数据模型与关系图之间的区别让我们可以进行存在式的构建,这是可以进行搜索和形式化推理的知识的层次化结构。例如,我们可以定义这样一个模型:“肉食动物” 是 “动物” 的一个子类,条件是它 “吃” 其他 “动物”;并创建两个实例:一个实例是印度豹和北极熊,并提供它们的生存环境;另外一个是瞪羚和企鹅,并提供它们的生存环境。假设我们将这些单独的模型实例集成在一起,就可以推论说印度豹可能会以瞪羚为食,但却不会吃企鹅。

  RDF 数据在很多领域中都迅速得到了应用,包括社交网络应用程序(例如 FOAF —— Friend of a Friend)和联合(例如 RSS,接下来就会介绍)。另外,RDF 软件技术和组件都正在成熟到一定规模,尤其是在 RDF 查询语言(例如 RDQL 和 SPARQL)、编程框架和推理引擎(例如 Jena 和 Redland)领域。

  RSS 和 ATOM

  RSS 是一系列基于 XML 的联合格式。在这种情况中,联合(syndication)是指一个发布内容的 Web 站点可以创建 RSS 文档并在 RSS 发布系统中注册自己的文档。支持 RSS 的客户机可以查看新内容,并通过适当的方式连接到这些内容上。RSS 已经被用来联合广泛的内容,从新闻到头条、CVS 或 WIKI 页面的修改日志、项目更新甚至诸如无线电节目之类的视听数据。版本 1.0 基于 RDF,但最新的 2.0 版本不以 RDF 为基础。

  Atom 是一种更新但非常类似的联合协议。它是 Internet Engineering Task Force(IETF)提出的一项草案标准,人们希望通过 Atom 提供比 RSS 更好的元数据维护;提供更好、更为全面的文档,并结合构建通用数据表示的概念。

  这些联合技术对于集成基于事件或更新驱动内容的 mashup 来说都非常有用,例如新闻和 weblog 聚集程序。

  技术挑战

  与其他数据集成领域一样,mashup 开发也充斥着许多亟待解决的技术挑战,随着 mashup 应用程序特性和功能的进一步丰富,这种挑战也变得更加严峻。本节简单介绍了一些挑战,其中有些挑战目前已经能够解决或缓解,而其他问题依然没有解决。

  数据集成挑战:语义和数据的品质

  品质调查显示,当今的企业 IT 首要关注的问题就是是企业虚拟组织中的数据集成。(在这种情况中,我们使用了 虚拟组织(virtual organization) 这个术语表示很多联合业务单元的组合,每个业务单元都包含在自己的管理域中。)与很多发现自己忙于集成传统数据源的企业 IT 管理人员一样(例如,创建可以反映当前业务状况的企业仪表板),mashup 开发人员需要面对类似源自于在异构数据集之间共享语义的挑战。因此,要了解 mashup 开发人员是如何为此作出准备,只需了解企业 IT 所面临的集成挑战。

  例如,我们必须设计数据模型之间的转换系统。在将数据转换成通用的格式时、在映射不完整时(例如,一个数据源可能有一个模型,其中一个地址类型包含了一个国家字段,而另外一个模型中没有这个字段),我们必须进行一些合理的假设。尽管已经面临这些挑战,但是 mashup 开发人员可能并不是源数据模型领域的专家,因为这些模型可能是第三方的产品,这些合理的假设可能并不直观清晰,这更加剧了挑战的严峻性。

  除了缺少数据和映射不完整之外,mashup 设计者可能会发现他们希望集成的数据并不适合进行机器自动化处理;这将带来很多净化工作。例如,执法逮捕记录可能不一致:记录中可能为名字使用了常用的缩写形式(例如,一条记录中使用的是“mkt sqr”,另外一条记录中使用的是“Market Square”),这使得关于等同性的自动推理变得非常困难,即使采用很好的启发式规则也很难实现。语义建模技术,例如 RDF,可以帮助简化对不同数据集之间自动进行推理所面临的问题,这些数据集是内嵌在数据存储介质中的。对于传统的数据源来说,通常需要投入大量人力物力,进行分析和数据净化工作,然后才能将其用于语义建模技术。

  mashup 开发人员可能还必须面对 IT 集成管理人员不需要面对的一些问题,其中一个问题是数据污染。作为应用程序设计的一部分,很多 mashup 都要求公共用户提供输入。wiki 应用程序领域的研究表明,这是一把双刃剑:它可能非常强大,因为可以提供开放的贡献和最佳的数据革新,但这又会导致不一致、不正确或容易产生误导的数据项。后者可能会危及数据的可信度,最终降低 mashup 带来的价值。

  mashup 开发人员需要面对的另外一种集成问题是由于获取数据必须采用屏幕抓取技术而引起的。正如上一节所讨论的一样,分析和获取工具以及数据模型都需要大量与反向工程相关的工作。在最理想的情况下,可以创建这些工具和模型,但依然存在一个问题:源站点如何呈现自己的内容,这可能会破坏集成过程,并导致 mashup 应用程序出错。

  组件挑战

  尽管 Web 开发的 Ajax 模型可以比传统的整个页面刷新技术提供更为丰富而且更加无缝的用户体验,但是也带来了一些难题。作为基础来说,Ajax 要求将浏览器的客户端脚本功能与自己的 DOM 配合使用,实现一种内容交付方法,这完全是由浏览器设计者所设想的。(可能 Ajax 类似于黑客的特性增加了它的吸引力。)然而,这使基于 Ajax 的应用程序具有相同的浏览器兼容问题,这些问题从微软开发 Internet Explorer 以来就一直困扰着 Web 开发人员。例如,Ajax 引擎利用了一个 XMLHttpRequst 对象来与远程服务器异步交换数据。在 Internet Explorer 6 中,这个对象是使用 ActiveX 实现的,而不是使用本地 JavaScript 实现的,这要求必须启用 ActiveX.

  更加基本的一个需求是 Ajax 要求必须在用户的浏览器上启用 JavaScript.这对于大部分人来说可能是一个合理的假设,但是对于某些特定的用户,他们的浏览器或自动化工具可能不支持 JavaScript,也可能没有启用对 JavaScript 的支持。这种工具有 robot、spider 和 为 Internet 和 Intranet 搜索引擎搜集信息的 Web 爬行榜。如果没有功能方面的让步,基于 Ajax 的 mashup 应用程序也可能会发现自己失去了部分用户群,搜索引擎的吸引力也会降低。

  使用 JavaScript 来异步更新页面中的内容还会产生用户界面的问题。由于内容不再需要链接到浏览器地址栏中的 URL 上,用户可能无法体验到正常使用浏览器的 BACK 按钮或书签时的功能。另外,尽管 Ajax 可以通过请求增量内容更新来减少延时,但不好的设计可能会对用户体验造成负面影响,例如当更新粒度非常小时,所更新的数量和负载会占据所有的可用资源。另外,在加载界面或更新内容时,我们还需要关心如何为用户提供支持(例如,使用诸如进度条之类的可视化反馈技术)。

  与任何分布式交叉领域的应用程序一样,mashup 开发人员和内容提供者同样也需要解决一些安全性问题。身份的概念可能会成为一个棘手的主题,传统 Web 主要是为匿名访问而构建的。单点登录是一种令人满意的特性,但在这方面存在多种彼此竞争的技术(从 Microsoft Passport 到 Liberty Alliance),因此可能会导致产生杂乱的身份命名空间,我们必须对之进行集成。内容供应商可能会在自己的 API 中采用身份验证和授权模式(这需要安全身份或安全确认属性的概念)来强制采用涉及付费订阅或敏感数据的业务模型。敏感数据也可能要求一定的机密性(即加密),我们必须要清楚何时将它们与其他资源集成在一起,而不会带来风险。身份对于审计和法规遵从性来说也非常重要。另外,由于数据集成是在服务器和客户端同时发生的,因此从用户到 mashup 服务进行的身份和证书委托也可能会成为一个需求。

  社会挑战

  除了上一节介绍的技术挑战之外,随着 mashup 的进一步普及,也出现了(或即将出现)一些社会问题。

  mashup 开发人员需要面对的一个最严重的社会问题就是:在知识产权的保护和消费者的私密性与公用化以及信息的自由流动之间达成一种平衡。不知情的内容提供者(屏幕抓取的目标)、提供 API 来帮助数据检索的内容提供者都可能需要确定其内容是否正在被他人以未获得自己批准的方式使用。有关 Web 聚合和规则的介绍,请参见 参考资料。

  mashup Web 应用程序仍然处于萌芽阶段,只是有一些开发爱好者在业余时间编写 mashup.这些开发人员可能并没有意识到(或不关心)安全性之类的问题。另外,内容供应者也只是刚刚开始看到为基于机器的内容访问提供 API 的价值所在,而且还有很多人不认为这是一个核心业务关注点。这一切结合在一起,导致目前的软件质量低下,因为诸如测试和品质保证等工作的优先级都要低于概念验证和创新的优先级。为促进软件开发过程的成熟,社区必须作为一个整体协同工作,制定开放标准和可重用的工具包。

  在 mashups 可以从一种炫酷的玩具变成程序的应用程序之前,还需要做大量的工作,形成高度健壮的标准、协议、模型和工具包。为此,主要的软件开发业界先驱、内容提供者和企业家必须认识到 mashup 的价值,它意味着可行的商业模型。API 提供者需要确定是否对自己的内容收取费用,如果需要收取费用,应该怎样收费(例如,通过订阅还是按使用次数收费)。或许他们将提供不同级别的服务品质。有些市场提供者,例如 eBay 或 Amazon,可能会发现免费 API 将提高产品周转。mashup 开发人员可能要寻求一种基于广告的创收模型,或者构建有趣的 mashup 应用程序赢得人们的认同。

  结束语

  mashup 的确是一种相当新颖的 Web 应用程序。源于语义 Web 领域的数据建模技术和松耦合、面向服务、与平台无关的通信协议相结合,最终将提供一种开发可充分利用并整合大量 Web 信息的应用程序所必需的基础设施。随着 mashup 应用程序越来越多地被人们所关注,了解它将对某些社会问题(例如公共使用和知识产权保护之间的问题)和其他应用程序领域(跨组织边界集成数据,例如网格计算和 B2B 的工作流管理)产生怎样影响,这一点非常有趣。

  要深入了解 mashup 的开发,请关注 developerWorks 的系列新教程,它将教您构建自己的 mashup.实际上,这个系列的文章还会向您介绍语义 Web 技术和使其他人创建自己的 mashup 的现有技术。

  来源:http://www.ibm.com/developerworks/cn/xml/x-mashups.html

2005年5月28日星期六

提交表单后PHP不能获取提交内容

  问题:网页上提交表单之后,PHP为什么不能获取提交的内容?然而在老版本的PHP上运行却正常。

  新版的PHP已经废弃了原来的表单内容处理方式,即不再把提交的表单的内容直接复制到一个同名变量中。解决办法有四个:

  1. 修改php.ini,查找 register_globals,将其值修改为 On。这样就可以像原来一样,例如,提交的表单中包括一个名为"username"的变量,那么在php中就可以直接使用$username来访问该变量。但是,除非你要使用一段旧的代码而考虑到兼容性问题,否则不建议使用该方法。

  2. 使用 $HTTP_GET_VARS、$HTTP_POST_VARS数组来访问,例如写成$HTTP_POST_VARS["username"]的形式。不过该方法也不建议采用。

  3. (推荐)使用 $_POST、$_GET等数组来访问,例如写成 $_POST["username"]的形式。建议采用这种方法。

  4. (推荐)使用 import_request_variables 函数。该函数将提交内容导入到变量中。例如 import_request_variables("gp", "rvar_");第一个参数可以选择g,p,c,分别表示导入 GET,POST,COOKIE 变量;第二个参数为导入后的变量前缀。执行上面的语句后即可使用 $rvar_username 来访问提交的 username 变量。使用import_request_variables("gp", "");可以兼容以前的PHP程序。

  Tips: 第三项中提到的预设变量有: $GLOBALS, $_SERVER, $_GET, $_POST, $_COOKIE, $_FILES, $_ENV, $_REQUEST, $_SESSION等。详细信息请参考PHP手册。

2005年5月26日星期四

预防夺命杀手-高血压

  人体的血压易受多种因素影响而发生波动,正常生理状态下,血压常会随着人们的饮食、起居、脑力活动、体力活动及情绪变化等有一定的波动,这种波动是有一定范围的,是血压为适应生理需要而进行自我调节的结果,属于正常反应。若血压高出正常范围者,即可称为高血压。高血压是一种以动脉压升高为特征,伴有心、脑、肾等器官异常的全身性疾病。早期表现为血压升高和神经系统功能失调(头痛、头昏、头胀、失眠、心悸、健忘等),后期出现各有关脏器的功能不全。

  这些天公司进行了体检,我才发现自己的血压已经到了高血压的临界值(临界高血压是140/90毫米汞柱),危险啊,健康对于一个人来说才是根本,没有了健康,其他什么东西都是空谈。

  我查看了一些资料,上面说:合理膳食、适量运动、戒烟限酒、心理健康为人类心脏健康的“四大基石”。因此我决定采取以下措施来降低血压:

  合理安排膳食结构,不吃脂肪、高胆固醇食物,限制过量热能,防止超常体重。限制食盐。每天食盐量小于5克,多喝酸牛奶。不吸烟不喝酒。心理健康、生活规律、保持良好的心境和情绪稳定。适当运动,锻炼身体。

  相对其他几项来说,锻炼运动对于我来说比较难以坚持,做为一个知识工作者,平时的运动量就非常少,工作也很忙碌。因此我决定每天早上进行晨练,这样即可以锻炼身体又不影响正常工作,花费的时间也较少。

  战胜高血压是一个漫长的过程,必须有好的心态和积极的行动,必须坚持良好的生活方式和科学地降压方法,要持之以恒,如果我能长期坚持这些的标准,相信一定会有所收获。我的目标就是:把我的血压降低到高压小于110毫米汞柱,低压小于75毫米汞柱。

  参考:高血压有哪些危害

  轻型高血压(低压为90-104mmHg),如果不给予治疗,7-10年后约10%的病人会死亡,50%左右的病人发生左室肥大、视网膜病变、脑血管疾病、心脏以及肾脏功能障碍甚至衰竭。

  中重度高血压(低压大于105mmHg),若不及时治疗,5年之后约有一半左右的病人会发生心血管并发症,年龄越大出现并发症的机会越多。

  低压低于130mmHg时,病情进展较为缓慢,若将血压稳定在理想水平,可延缓心血管并发症的发生。

  低压超过130mmHg且合并有心、脑、肾功能障碍时,若不及时治疗,心、脑、肾等脏器会出现功能衰竭,反过来又会使血压上升,往往在半年内夺去病人的生命。

2005年5月16日星期一

Windows2003中不允许的父路径问题

  今天解决了一个问题。

问题:

Active Server Pages 错误 ''ASP 0131''

不允许的父路径

/Main/default.asp,行 2

包含文件 ''../public/ucode.asp'' 不能用 ''..'' 表示父目录。

解决方法:

类似 ../ 父路径的问题.IIS6 为提高安全性,默认设置是禁止使用父路径,所以你的程序会出错,解决方法也很简单,在IIS6的站点属性中选择“使用父路径”即可。

IIS6==>站点属性==>主目录==>配置==>选项==>启用父路径

这样就可以了, 告诉你个详细的方法,在IIS6里点帮助(F1),然后搜索“父路径”,里面有详细的设置方式。

2005年5月13日星期五

在HTML文件引入其它HTML文件的几种方法

在论坛中常常有网友问到,可以在一个html的文件当中读取另一个html文件的内容吗?答案是确定的,而且方法不只一种,在以前我只会使用iframe来引用,后来发现了另外的几种方法,那今天就总结这几种方法让大家参考一下。

1.IFrame引入,看看下面的代码

--------------------------------------------------------------------------------
<IFRAME NAME="content_frame" width=100% height=30 marginwidth=0 marginheight=0 SRC="import.htm" ></IFRAME>
--------------------------------------------------------------------------------

你会看到一个外部引入的文件,但会发现有一个类似外框的东西将其包围,可使用

--------------------------------------------------------------------------------
<iframe name="content_frame" marginwidth=0 marginheight=0 width=100% height=30 src="import.htm" frameborder=0></iframe>
--------------------------------------------------------------------------------

但你会发现还会有点问题,就是背景色不同,你只要在引入的文件import.htm中使用相同的背景色也可以,但如果你使用的是IE5.5的话,可以看看这篇关于透明色的文章 如果想引入的文件过长时不出现滚动条的话在import.htm中的body中加入scroll=no

2.<object>方式

--------------------------------------------------------------------------------
<object style="border:0px" type="text/x-scriptlet" data="import.htm" width=100% height=30></object>
--------------------------------------------------------------------------------

3.Behavior的download方式

--------------------------------------------------------------------------------
<span id=showImport></span>
<IE:Download ID="oDownload" STYLE="behavior:url(#default#download)" />
<script>
function onDownloadDone(downDate){
showImport.innerHTML=downDate
}
oDownload.startDownload('import.htm',onDownloadDone)
</script>
--------------------------------------------------------------------------------

2005年5月12日星期四

VB代码撰写约定

  这是一家公司软件部规定的VB组代码撰写暂行约定。对于VB项目的协同开发有一定的帮助和指导。

一、变量和对象

    程序中的变量遵循匈牙利表示法,即“前缀+变量含义”,变量的含义为一个或多个英文单词,每个单词的第一个字母大写,不要用汉语拼音代替。变量前缀为三个小写字母示意其类型,所需添加的前缀遵循微软在MSDN中的建议。列表如下:

 

    基本数据类型

变量类型

前缀

示例

Boolean

bln

blnFound

Byte

byt

bytRasterData

Collection object

col

colWidgets

Currency

cur

curRevenue

Date (Time)

dtm

dtmStart

Double

dbl

dblTolerance

Error

err

errOrderNum

Integer

int

intQuantity

Long

lng

lngDistance

Object

obj

objCurrent

Single

sng

sngAverage

String

str

strFName

User-defined type

udt

udtEmployee

Variant

vnt

vntCheckSum

   

    控件或窗体、模块对象

控件类型

前缀

示例

3D Panel

pnl

pnlGroup

ADO Data

ado

adoBiblio

Animated button

ani

aniMailBox

Check box

chk

chkReadOnly

Combo box, drop-down list box

cbo

cboEnglish

Command button

cmd

cmdExit

Common dialog

dlg

dlgFileOpen

Communications

com

comFax

Control (在过程中使用的类型未明的控件变量)

ctr

ctrCurrent

Data

dat

datBiblio

Data-bound combo box

dbcbo

dbcboLanguage

Data-bound grid

dbgrd

dbgrdQueryResult

Data-bound list box

dblst

dblstJobType

Data combo

dbc

dbcAuthor

Data grid

dgd

dgdTitles

Data list

dbl

dblPublisher

Data repeater

drp

drpLocation

Date picker

dtp

dtpPublished

Directory list box

dir

dirSource

Drive list box

drv

drvTarget

File list box

fil

filSource

Flat scroll bar

fsb

fsbMove

Form

frm

frmEntry

Frame

fra

fraLanguage

Gauge

gau

gauStatus

Graph

gra

graRevenue

Grid

grd

grdPrices

Hierarchical flexgrid

flex

flexOrders

Horizontal scroll bar

hsb

hsbVolume

Image

img

imgIcon

Image combo

imgcbo

imgcboProduct

ImageList

ils

ilsAllIcons

Label

lbl

lblHelpMessage

Lightweight check box

lwchk

lwchkArchive

Lightweight combo box

lwcbo

lwcboGerman

Lightweight command button

lwcmd

lwcmdRemove

Lightweight frame

lwfra

lwfraSaveOptions

Lightweight horizontal scroll bar

lwhsb

lwhsbVolume

Lightweight list box

lwlst

lwlstCostCenters

Lightweight option button

lwopt

lwoptIncomeLevel

Lightweight text box

lwtxt

lwoptStreet

Lightweight vertical scroll bar

lwvsb

lwvsbYear

Line

lin

linVertical

List box

lst

lstPolicyCodes

ListView

lvw

lvwHeadings

MAPI message

mpm

mpmSentMessage

MAPI session

mps

mpsSession

MCI

mci

mciVideo

Menu

mnu

mnuFileOpen

Month view

mvw

mvwPeriod

MS Chart

ch

chSalesbyRegion

MS Flex grid

msg

msgClients

MS Tab

mst

mstFirst

OLE container

ole

oleWorksheet

Option button

opt

optGender

Picture box

pic

picVGA

Picture clip

clp

clpToolbar

ProgressBar

prg

prgLoadFile

Remote Data

rd

rdTitles

RichTextBox

rtf

rtfReport

Shape

shp

shpCircle

Slider

sld

sldScale

Spin

spn

spnPages

StatusBar

sta

staDateTime

SysInfo

sys

sysMonitor

TabStrip

tab

tabOptions

Text box

txt

txtLastName

Timer

tmr

tmrAlarm

Toolbar

tlb

tlbActions

TreeView

tre

treOrganization

UpDown

upd

updDirection

Vertical scroll bar

vsb

vsbRate

 

    数据库对象

数据库对象

前缀

示例

Container

con

conReports

Database

db

dbAccounts

DBEngine

dbe

dbeJet

Document

doc

docSalesReport

Field

fld

fldAddress

Group

grp

grpFinance

Index

ix

idxAge

Parameter

prm

prmJobCode

QueryDef

qry

qrySalesByRegion

Recordset

rec

recForecast

Relation

rel

relEmployeeDept

TableDef

tbd

tbdCustomers

User

usr

usrNew

Workspace

wsp

wspMine

 

    除此之外,还要对于一些不同的级别的变量加额外的前缀,举例如下:

级别

前缀

示例

全局变量

g

gstrUserName

模块级变量

m

mblnCalcInProgress

过程级变量

None

dblVelocity

 

    对于用户使用type关键字定义的数据类型,在三个字母的前缀前再加u。例如:一个用户定义的叫Client类型的变量,其前缀为ucli。

 

    关于变量使用方面,建议如下:

1、变量要先声明再使用(在窗体代码的第一行加上Option Explicit,来禁止未声明变量的调用,或者在菜单Tools->Options->Editor中选中Require Variable Declaration项。)

2、尽量使用Long型的变量来代替Integer类型,这样做可以减少一些数据溢出的错误,而且,在Win32平台上,CPU处理32位的数据比16位的数据速度更快。

3、尽量少用Variant变量,尽可能地给出每一个变量明确的类型

4、尽量不在API声明中使用As Any,如果遇到其默认的参数为As Any的情况,则针对每一个所需的参数类型声明该API函数,例如ReadFile函数默认的声明为:

Public Declare Function ReadFile Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

小组成员须将其改为:

Public Declare Function ReadFileByt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Byte, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

Public Declare Function ReadFileInt Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Integer, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

Public Declare Function ReadFileLng Lib "kernel32" Alias "ReadFile" (ByVal hFile As Long, lpBuffer As Long, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, lpOverlapped As OVERLAPPED) As Long

 

5、不要将类型转换的工作交给VB自动去做,而使用以下类型转换函数

CBool(expression)

CByte(expression)

CCur(expression)

CDate(expression)

CDbl(expression)

CDec(expression)

CInt(expression)

CLng(expression)

CSng(expression)

CStr(expression)

CVar(expression)

 

二、窗体布局

    窗体内各个控件的布局,建议如下:

    1、所有与窗体上、下、左、右四条边界相邻的控件与窗体的边缘相距120缇

    2、各个控件之间的间距为:相关控件60缇,非相关控件120缇

    3、按钮控件大小建议为高300缇,长1200缇,这也是操作系统默认按钮的大小

    4、各个控件的字体建议为宋体五号字

 

三、代码

  1、程序的启动对象

  程序一率从Main()函数开始执行(选择菜单View->Project Explorer,在工程窗口内右键点击当前项目,选择菜单“… Properties”->General,在Startup Object下拉框中选择sub main)

  2、代码缩进与间距

  每个单位的代码缩进为一个TAB,非相关代码留一行空白的间隔,例如:

  Private Function GetMax(Byref lngArray() As Long) As Long

  GetMax=0

  Dim lngMax As Long

  Dim lngCount as long

  For lngCount =0 to Ubound(lngArray)

  If lngArray (lngCount)>lngMax Then

  lngMax=lngArray(lngCount)

  End If

  Next

  End Function

  3、注译

  程序的注译越详尽,越仔细越好。以下提及的,必须加注译。

  程序中声明的每一个变量,能加上注译最好,至少用来运算或者保存关键数据的变量必须加上注译。

  对于每一段逻辑上实现某个基本功能的几句代码,最好在其上一行加上简单注译。

  对于每一个自定义的函数,不管大小都必须加上注译,而且注译的格式如下:

  '******************************************************

  '

  '函数所实现的功能

  '函数的参数1的含义:XXXXX

  '函数的参数2的含义:XXXXX

  '……

  '函数返回值所代表的错误信息:XXXXX(函数尽可能声明为Function,不要声明为Sub,

  '函数的返回值为0表示执行成功,为其它值表示执行失败)

  '

  '******************************************************

  Public(Private) Function ForExample(……………………) As Long

  '…………………………………………

  End Function

  4、错误处理(未定)

  在Main()函数或主窗体Load过程中添加如下代码:

  '******************************************************

  '

  '打开错误日志文件,在Form_Unload()中关闭

  '

  '******************************************************

  Dim strExePath As String

  If Right(App.Path, 1) = "" Then

  strExePath = App.Path

  Else

  strExePath = App.Path & ""

  End If

  intErrLogFileHandle = FreeFile()

  Open strExePath + "Err.log" For Append Shared As intErrLogFileHandle

  在主窗体退出函数中添加如下代码:

  '******************************************************

  '

  '关闭错误日志文件

  '

  '******************************************************

  Close #intErrLogFileHandle

  在某个Module中添加:

  '******************************************************

  '

  '写入错误日志

  '

  '******************************************************

  Public Sub WriteErrLogFile(ByVal strSub As String, ByVal strErr As String)

  Print #intErrLogFileHandle, Date, Time, strSub, strErr

  End Sub

  在每个过程或自定义的函数中,使用如下的系统错误捕获机制:

  Public Function ForExample(…………) As Long

  On Error Goto FuncError

  ForExample=True

  ………………………

  ………………………

  Exit Function

  FuncError:

  ForExample=False

  WriteErrLogFile " ForExample ", "错误号:" & Err.Number & ",错误源:" & Err.Source & ",错误描述:" & Err.Description

  MsgBox  "……… ", vbCritical

  '在此作内存资源回收工作

  End Function

海外网站资源索引

    一些海外英文资源的链接,包括主机评论,低价主机,免费主机,免费空间,博客工具,广告联盟,搜索优化,目录索引,站长讨论,站长资源等。本网址链接为本人几个月来辛苦收集的原创资源,每个都手工校验过,请勿滥用里面的资源。

主机评论 HostReview

Web Hosting Stuff - Hosting Companies Ranked & Reviewed
WebHostingTalk Forums - Web Hosting Forum

低价主机 CheapHosting

1&1 Internet Inc. - Web Hosting Services and Domain Name Registration
DeltaWebHosting - Cheap Web Hosting Services - Home
Go Beyond. Exceed. Surpass Hosting
Hostinginsiders.com - FREE domain name included
RiotHost.com - Ultimate Web Deals
Robotical World Hosting - Escape from Reality
Startlogic.com - The Best Webhosting You Will Ever Get!
Vega Host - Affordable Web Hosting, Domain Name Registration & Web Design Services
www.3ix.org - 3iX provides reliable, low cost web hosting

免费主机 FreeHosting

Doteasy - 100MB Free Web Hosting, Free Email, Domain Names for Business and Individuals
Free Web Hosting - FreeWeb-Hosting.com
Free Webspace and Free Web Hosting Services
FreeWebHostingTalk
Microworld Dotcom - Network Solutions for Global Success
netrulon.com - Free Web Hosting
The Zack Network Web Hosting Services
Wagoo - 199MB Free Web Hosting, Free Email, Domain Names for Business, Free phpBB Forum

免费空间 FreeHomepage

Free Web Hosting
Free websites and webpages, photo albums, chatrooms and more by FreeWebs
Free Webspace and Free Web Hosting Services

博客工具 BLOG

Movable Type
Word Press

广告联盟 AffiliateProgram

Affiliate Programs Directory - Lists over 840 Affiliate Programs!
goClick.com - Targeted, High-Quality, Pay-Per-Click Advertising
Webmaster money resources - affiliate programs reviewed.

搜索优化 SEO

Search Engine Optimization, Google Optimization - SEO Chat
SEOZip - SEO Answers in a ZIP....

目录索引 WebDirectory

01Webdirectory.com - Best of Web Directory
General Internet Directories - SearchEngineOne
Jayde.com - The B2B Search Engine
Strongest Links - Directory list
Web Directory - Ajdee.com directory
Web Directory - PureDirectory.com
Web Directory by HotVsNot.Com
Web Directory Directory

站长讨论 WebmasterForum

Webmaster-Talk.com Webmaster Forum - Web Design, PHP, SEO, Hosting, Graphics and more
WebmasterWorld News and Discussion for the Independent Web Professional

站长资源 WebmasterResource

Web Site Development Resources Directory
Webmaster Resources - Free Web Tools