PCS400 GAE

~Google 提供的免费Web应用空间!

概述

GAE ~ Google App. Engine 即, Google 应用引擎;是用于在Google服务器上创建和部署Web应用的免费开发平台,于2008年4月发布beta版本。App Engine应用很容易被创建,维护和扩展,不需要服务器的维护,开发者只需要上传自己的应用就可发布。 GAE帐号可以免费注册,也提供在appspot.com上的免费二级域名,也可通过Google Apps使用自己的域名。一个免费帐号拥有500MB的持久存储,足够CPU配额和每月500万页访问的带宽。

特点

开发环境
GAE可以很容易建立一个web应用程序,运行可靠。 环境包括以下功能:
  • 动态网页服务,完全支持通用网络技术
  • 持久存储,并提供查询,排序和交易
  • 自动扩展和负载平衡
  • 提供认证用户和使用google帐户发送电子邮件的API
  • 一个全功能的本地开发环境,在你的计算机上模拟GAE应用程序
GAE使用Python编程语言,其运行环境包含完整的Python语言和大多数的Python标准库。
沙箱
  • 应用程序在一个安全,提供受限访问底层操作系统的环境中运行。这些限制允许应用程序引擎跨越多个服务器分发Web请求,启动和停止服务器,以满足交通的需求。沙盘将你的应用程序和安全可靠的运行环境,即独立于硬件,操作系统和物理位置的网络服务器隔离开。
  • 受限安全沙箱环境包括:
    • 应用程序只能通过URL fetch、邮件服务和API访问互联网上的其他电脑。 同时,其他电脑只能通过HTTP (HTTPS)标准接口访问本应用程序。
    • 应用程序无法写入文件系统。一个应用程序可以读取本地上传的文件。应用程序必须使用应用程序引擎数据存储接口访问所有数据。
    • 应用程序在响应Web请求时运行相应代码,而且必须在几秒钟内返回响应数据。请求处理不能生成子进程或在响应发出之后执行代码。
纯Python运行环境
  • GAE提供了一个使用的Python编程语言的运行环境。运行环境使用的Python版本是2.5.2 ,包括了Python标准库。当然,调用库方法不能违反沙箱的限制条件。为了方便起见,几个核心功能不支持运行环境的标准库已被禁用。应用程序代码必须是Python,C扩展代码也是不支持的。
  • Python环境提供了丰富的API,如数据存储,谷歌帐户,网址获取和电子邮件服务。 应用程序引擎也提供了一个简单的Python web应用框架称为Webapp,可以方便地开始创建应用。
  • GAE还支持各种Web应用框架,只要框架支持CGI/WSGI 接口;这其中包括:
    • CherryPy 框架

      • 官方网站: http://www.cherrypy.org/

      • 这是个古老的纯Python Web应用框架,关注对象化的发布管理,由于其稳定和简洁,有很多其它框架是直接在 CherryPy 的基础上再次开发而成的;

    • web.py 框架

    • PyLons 框架

    • Django Web应用框架(基于版本0.96.1修订而成)

      • 官方网站: http://www.djangoproject.com/

      • Django 是最流行的Python Web 应用框架之一,Python 的发明人 Giudo 也在公开场合多次表示喜欢Django框架;这是个 all in one 式的框架,支持快速架构起来一个全功能的信息发布站点;
      • 不过GAE中的数据库和模板部分和Django中也有所不同。也可以在应用中使用上传第三方库,只要它们没有用到任何不支持的标准库模块。

数据存储

  • GAE提供了一个强大的分布式数据存储服务,支持查询和事务。GAE的数据存储不像传统的关系数据库,是由数据对象,或“实体”构成 ,他们具有特征。查询可以根据给定的条件特征检索实体或者按照属性值进行排序。属性值可以是任何支持的数据类型。 数据库API的数据模型接口可以定义数据实体的结构。这个数据模型可以表明某属性具有一个在某一特定范围内的值,如果没有给出值也提供一个默认值。 一个应用可以根据需求建立多个数据模型。

实例

GAE 应用建立流程基本是这样的:

  1. 获得GAE帐号
  2. 下载开发包,当前(2008十月中旬)最新版本是1.1.5
  3. 在本地开发调试
  4. 通过开发包提供的Python脚本上传

wekno

笔者拥有一个GEA帐号,在此演示一个 GAE 中的"Hollo World" 应用建立:

环境准备
  • 下载 google_appengine_1.1.5.zip 开发包

  • 解开压缩后,在目录中建立wekno目录 ~ 目录名和在 GAE 中创建的应用名相同

  • 创建相关脚本,在目录中的组织类似

    google_appengine
      +-- ,,, 其它各个SDK 中默认包含的目录
      +-- wekno         我的GAE应用目录
        |-- app.yaml    应用配置文件
        \-- hollo.py    默认页面脚本
    
开发部署:
  • 首先完成应用配置文件:app.yaml

application: wekno
version: 1
runtime: python
api_version: 1

handlers:
- url: /.*
  script: hollo.py

注意:: 
YAML ~ YAML Ain't Markup Language(反标签语言的YAML)
和GNU一样,YAML是一个递归着说“不”的名字。不同的是,GNU对UNIX说不,YAML说不的对象是XML;
官方网站:http://www.yaml.org/
这是一种人性的,数据序列化语言规约,有无数种开发语言的现实;在GAE 中使用的是PyYAML:
访问地址: http://pyyaml.org/wiki/PyYAML
精巧地址: http://bit.ly/CuCpT
GAE 选择YAML 来组织配置文件,以便给将来支持其它语言的开发准备好平滑坚实的地基!
  • 然后完成最简单的应用脚本:hollo.py

   1 # -*- coding: utf-8 -*-
   2 print 'Content-Type: text/plain'
   3 print ''
   4 print 'Hollo, World! this is WeKno!,,,'
   5 print '是也乎?!'
  • 先在本地运行测试一下:
    • 图pcs-400-0 在SDK中运行应用

  • 图pcs-400-1 在本地查看效果

  • 然后上传到GAE空间:
    • 图pcs-400-2 使用脚本上传应用

  • 最后就可以在GAE网站中看到自个儿的应用了:

图pcs-400-3 在GAE空间中查看效果

深入

毕竟到现在为止 GAE 还是beta 版本,GAE中的应用开发,和在普通的主机中自由组织自个儿的应用是不同的,有诸多限制,但是可以自在的使用各种Google 不断公开的各种应用接口:

小结

  • Python 是市值己逾1518亿的Google公司 使用的核心开发语言之一; GAE 是Google 贡献给世界的免费应用空间服务,通过组合Google 的多种服务,将Google 宏伟的硬件平台,通过Python 脚本,开发给普遍人一个轻便的操作渠道,可以帮助任何人,利用 Google 的计算平台发布自个儿的应用; 两者相辅相成,直接激发了Python 这一脚本语言在世界的知名度和发展(毕竟Python 之父Guido 老爹被Google挖来公司了),所以,推荐读者也来体验一下Google 的应用引擎服务,站在巨人的肩膀上自由发挥自个儿的想象力!

PCS401 DHTML

~ 让网页活动起来!

概述

Dynamic HTML ~动态HTML!

  • DHTML 是一种使 HTML 页面具有动态特性的艺术。
  • DHTML 是一种创建动态和交互 WEB 站点的技术集。
  • 对大多数人来说,DHTML 意味着 HTML、样式表和 JavaScript 的组合!

一个DHTML的结构大致可分为:

  • 传统的HTML。
  • DOM(Document Object Model)文档对象模型,是W3C日前极力推广的web技术标准之一,它将网页中的内容抽象成对象,每个对象拥有各自的属性 (Properties)、方法(Method)和事件(Events),这些都可以通过CSSL来进行控制。IE和NS的对象模型都是以W3C的公布的DOM为基准,加上自己的Extended Object(扩展对象)来生成的。
  • CSS(Cascading Styles Sheets) 层叠式样式表。通过CSS样式表,可以自由定义各个网络组件的坐标位置(如静态、动态定位、或绝对坐标、相对坐标系统),及其他新增的标签、行为 (Behaviors)、图层(Layer)、字体和Web页格式等各种不同的设置。
  • CSSL(Clent-Side Scripting Language)客户端脚本语言,主要有JavaScript(JS),VBScript(VBS),JScript。Netscape主要支持 JS,IE主要支持JS,VBS和JScript。有了Script,才可以让CSS设置为“行动”,从而达到整个服务器端与客户端的动态控制。 通过以上技术的综合,令普通的网页可以和访问者友好交互,活动起来.

HTML DOM

HTML Document Object Model ~HTML 文档对象模型:定义了访问和处理 HTML 文档的标准方法;

  • HTML DOM 把 HTML 文档呈现为带有元素、属性和文本的树结构(节点树)。
  • 比如这一简单HTML页面:

    <html>
        <head>
            <title>
                文档标题
            </title>
        </head>
        <body>
            <h1>我的标题</h1>
            <a href="http://wiki.woodpecker.org.cn/moin/ObpLovelyPython">我的链接</a>
        </body>
    </html>
     
  • 图pcs-401-0 在游览器中看到的网页情景

  • 图pcs-401-1 DOM理解后的节点树

根据 DOM,HTML 文档中的每个成分都是一个节点。

DOM 是这样规定的
  • 整个文档是一个文档节点
  • 每个 HTML 标签是一个元素节点
  • 包含在 HTML 元素中的文本是文本节点
  • 每一个 HTML 属性是一个属性节点
  • 注释属于注释节点
通过 DOM 就可访问 HTML 文档中的每个节点
  • 可通过若干种方法来查找您希望操作的元素:
    • 通过使用 getElementById() 和 getElementsByTagName() 方法
    • 通过使用一个元素节点的 parentNode、firstChild 以及 lastChild 属性
HTML DOM 实例

DHTML CSS

CSS 是种网页表现形式的定义脚本语言,长的很象 JScript; 比如说:

DIV#myfeel{
    visibility:hidden;
}
  • 就是令所有用 <div id="myfeel"> 层来包围的元素,暂时不显示!

通常,在Web页中指定CSS样式表的方式有3种:

  1. 外部CSS样式表(External Styles Sheet)模式,它通过一个独立的CSS样式表文字文件(扩展名通常为 CSS)控制其他Web页。只要在需要指定样式的Web页中,设置一个链接至该CSS样式表文件,而且之后只要改变此CSS样式表内容,就可改变所有链接至该CSS样式表的Web页样式。
  2. 内嵌CSS样式表(Embedded Styles Sheet)模式,它直接在HTML<body>标签前设置一个样式标签,而这个设置会直接影响该Web页的样式设置。
  3. 内部CSS样式表(Internal Styles Sheet)模式,它直接对HTML里的任何单一对象(如文字、图像等)进行样式设置,这种做法其实相当于利用文字的属性检查器。CSS样式表直接定义的样式,只会影响单一选取的内容文字,而不会影响整个Web页的样式设置。

通常这3种方式浏览器的处理顺序为:内部CSS样式表模式、内嵌CSS样式表模式,外部CSS样式表模式,

  • 这也正是CSS 的名称的由来,一层层的逐级解析和处理网页的表现;

DHTML 中的CSS,利用DOM的约定,可以配合CSSL动态的对指定的页面元素进行外观的改变;

DHTML 实例

使用

当前 DHTML 也已经框架化,形成了 Ajax 技术群:

Ajax

Ajax(异步 JavaScript 和 XML)是 Jesse James Garrett 创造的一个术语,它是指一种基于标准的技术/设计模式,用来为服务器部署的应用程序开发比浏览器更好的用户体验。通过使用 Ajax,可以编写 JavaScript 代码来改进 HTML,创建出丰富的交互性用户体验。例如,JavaScript 可以执行本地用户输入验证,为相同的数据提供不同的视图(条形图、表格、饼图等等),或者通过浏览器的 XMLHTTPRequest 对象与应用程序的服务器组件进行异步的交互。

小结

  • DHTML 是种技术解决方案的组合,但是DHTML 更象一种艺术行为,要求开发者使用有限的工具(HTML/CSS/JScrip)充分开动想象力,为自个儿的Web 应用实现象桌面应用那样儿使用感觉的操作和交互体验!
  • 随着 Web2.0 的兴起,Web应用要求单纯化,可扩展化,社会化,这其中 DHTML,或是进一步的--Ajax 的使用是至关重要的,因为统一了前后台数据交互的接口--JSON

  • JSON(JavaScript Object Notation)
    • 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999的一个子集。

    • JSON采用完全独立于语言的文本格式,对其解析和生成,有各种语言的现实,Python 是内置支持的!
    • JSON建构于两种结构:
      • “名称/值”对的集合(A collection of name/value pairs)。不同的语言中,它被理解为对象(object),纪录(record),结构(struct),字典(dictionary),哈希表(hash table),有键列表(keyed list),或者关联数组 (associative array)。
      • 值的有序列表(An ordered list of values)。在大部分语言中,它被理解为数组(array)。
    • JSON 长的非常象 JScript

      {
          "glossary": {
              "title": "example glossary",
                      "GlossDiv": {
                  "title": "S",
                              "GlossList": {
                      "GlossEntry": {
                          "ID": "SGML",
                                              "SortAs": "SGML",
                                              "GlossTerm": "Standard Generalized Markup Language",
                                              "Acronym": "SGML",
                                              "Abbrev": "ISO 8879:1986",
                                              "GlossDef": {
                              "para": "A meta-markup language, used to create markup languages such as DocBook.",
                                                      "GlossSeeAlso": ["GML", "XML"]
                          },
                                              "GlossSee": "markup"
                      }
                  }
              }
          }
      }
      
        

      对应XML 的格式,表达相同的数据内容则是:

      <!DOCTYPE glossary PUBLIC "-//OASIS//DTD DocBook V3.1//EN">
       <glossary><title>example glossary</title>
        <GlossDiv><title>S</title>
         <GlossList>
          <GlossEntry ID="SGML" SortAs="SGML">
           <GlossTerm>Standard Generalized Markup Language</GlossTerm>
           <Acronym>SGML</Acronym>
           <Abbrev>ISO 8879:1986</Abbrev>
           <GlossDef>
            <para>A meta-markup language, used to create markup
      languages such as DocBook.</para>
            <GlossSeeAlso OtherTerm="GML">
            <GlossSeeAlso OtherTerm="XML">
           </GlossDef>
           <GlossSee OtherTerm="markup">
          </GlossEntry>
         </GlossList>
        </GlossDiv>
       </glossary>
      
    • 可以感觉出,使用JSON 在Ajax 应用中进行数据传输时,可以节省多少带宽了吧;-)

PCS402 XML

~ 让电脑理解网页的技术

XML的来源

XML源自标准通用标记语言(Standard Generalized Markup Language,SGML),SGML是一种通用的文档结构描述的符号化语言,主要是用来定义文献模型的逻辑和物理结构,但是由于其过于复杂和臃肿,只能够在大型企业和学术界使用,无法得到大规模应用。随后,于90年代提出的HTML技术得到了很大的发展,但由于HTML是面向表现的标记语言,而且结构固定,难以扩展,缺乏必要的语义信息,不适合用于信息交互。为了克服HTML和SGML的弊端,1996年W3C专家组对SGML进行裁剪,形成SGML的精简子集,这就是现在我们所知的XML。

XML概念

XML全称EXtensible Markup Language,是一种用于描述数据文档中数据的组织和安排的结构的一种规范。 xml.org通过以下陈述定义XML:

  • XML is a family of technologies/一系列技术族
  • XML is a method for putting structured data in a text file/一种用普通文本存放结构化数据的方法
  • XML is license-free, platform-independent and well-supported/自由许可证,平台独立,支持性好
  • XML looks a bit like HTML, but isn't HTML/看起来像HTML,但不是HTML
  • XML is new, but not that new/新的,但不是完全新的东西
  • XML is verbose, but that is not a problem/很详细,注重细节,但这不是问题
  • XML is text, but isn't meant to be read/是文本,但并不意味着可读

XML也具有如下特性:

  • Extensibility/可扩展性:XML让使用者根据需要自行定义标签。
  • Structure/结构化:XML能够描述各种复杂的文档结构。
  • Validation/验证:XML可以根据DTD/XML Schema对文件进行结构确认。

XML和HTML

如上所述,XML看起来像HTML,但决不是HTML,通过下面这个例子比较下两者的不同。 假如现在要表示出一PC的硬件配置信息,分别用HTML和XML表示为:

HTML表示
<html>
  <body>
       <p>2200 MHz Pentium Iv
with 256K internal cache, 512K external cache, 256MB standard RAM, 1024MB max. RAM</p>
      </body>
</html>
XML表示
<pcinfo>
  <processor>
     <type>Pentium Iv</type>
     <speed>2200</speed>
     <intcache>256</intcache>
  </processor>
  <extcache>512</exctache>
  <ram>
     <standard>256</standard>
     <max>1024</max>
  </ram>
</pcinfo>

可以看到用HTML表示的那些数据仅仅是些字符串,没有什么语义信息,而XML除了具体有数据值还有标签,即该数据值表示的语义信息。进一步的,我们可以看出:HTML是侧重于表示数据,即数据看起来象什么;XML是描述数据,即数据是什么。XML的优势在于它对于同一内容可以有多种表示形式,内容也独立于应用,其数据可以像数据库一样查询和操作。注意:XML的标签里包含的是纯信息,单独查看XML文件的内容并没有任何意义,需要应用程序根据特定需求读取,处理,显示,即需要应用程序赋予它语义信息。但是,XML并不取代HTML,因为它们的设计目标不同,XML用于描述信息,而HTML用于显示信息。这是本质区别。

XML语法介绍

下面的例子中描述了通讯录信息的XML表示形式:

< ? xml version=“1.0” encoding=”GB2312” standalone=”no”?>
<!DOCTYPE 联系人 SYSTEM”fclml.dtd”>
<?xml—stylesheet type=”text/css” href=“mystyle.css”?>
    <联系人>
         <姓名 曾用名=“张山”>张三</姓名>
         <用户号>001</用户号>
         <单位>扬州大学</单位>
         <EMAIL>zhang@aaa.com</EMAIL>
         <电话> (0514)2345678 </电话>
         <地址>
             <街道>江阳中路36号</街道>
             <城市>扬州市</城市>
             <省份>江苏</省份>
         </地址>
    </联系人>

可以看到,这个XML文档中依次有以下几个组成部分组成:

XML声明

XML文档以XML声明作为开始,它向解析器提供了关于文档的基本信息,必须出现在文件最前端。

<? xml version=“1.0” encoding=”GB2312” standalone=”no”?>
       版本号              编码方式           是否为独立文档,值为no表示引用外部DTD文档

处理指令(PI)

处理指令(Process Instruction)是指示外部处理或应用程序的命令或宏。 格式为:<?target instruction?>target是一个在应用程序阅读XML时访问的外部应用程序,目的是执行某些计算;instruction是指要提供给外部应用应用程序的命令。如前面的例子中,使用PI链接文档,组成样式表。

<?xml—stylesheet type=”text/css” href=“mystyle.css”?>

标签

XML的标签是对文档内容进行描述的元数据,形式上是用一对尖括号括起来的,有开始标签(例如<姓名>)和结束标签(例如</姓名>),这些标签可以由用户自己创建。

元素

元素是开始标签、结束标签以及位于二者之间的所有内容。 如:<person>John</person>,其中“person”被称为元素名或标签名。以下四点需要注意:

  • 元素可以包含子元素,即可以嵌套。
  • 元素是区分大小写,如<Name>…</name>开始标签和结束标签是不匹配的。

  • 元素不能交叉重叠,如<p><b>…</p></b>是不对的。

  • 一些特殊字符不得出现在元素中,若一定需要表示特殊字符,可以使用转义序列,如下:

字符

名称

转义序列

>

Gt

&gt;

<

Lt

&lt;

Quot

&quot;

Apos

&apos;

&

Amp

&amp;

元素的命名要遵循以下规则:

  • 元素名可以包含字母,数字和其它符号
  • 名字不能用数字或标点符号开头
  • 元素名不能用xml (或XML,或 Xml等等)开头
  • 元素名不能包含空格

XML文档必须包含在一个单一元素中,这个单一元素称为根元素,它包含文档中所有文本和所有其它元素。在上面的示例中,XML文档包含在一个单一元素<联系人>中。不包含单一根元素的文档不管该文档可能包含什么信息,XML解析器都会拒绝它。

在XML文档中,是不能省去任何结束标签的。

如果一个元素根本不包含标签,则称为空元素;在XML文档的空元素中,可以把结束斜杠放在开始标签中。下面两个图像元素对于XML解析器来说是等价的:<img src="../img/c.gif"></img>和<img src="../img/c.gif" />

属性

它是一个元素的开始标记中的名称-值对。 如<姓名 曾用名=“张山”>张三</姓名>,曾用名=“张山” 是 <姓名> 元素的属性。一个元素可以带任意数量的属性,且元素的属性不能嵌套,一个元素不能有两个相同属性名的属性,其属性值必须用引号括住。

注释

XML的注释是以<!--开头 ,以-->结束,描述文档的功能,类似于程序设计语言的注释。但是它不能出现在前言之前,不能包在标签之中,但可以包住标签,也不能使用“--”字符串,更不能嵌套使用。

命名空间

XML是一种用来定义我们自己的语言而定义数据的工具。在定义自己语言的过程中,总是可能面对在Internet上定义标签或元素陷入命名冲突。XML命名空间 (Namespaces)在1999年1月14日成为W3C的推荐标准,它的主要目的在于解决XML元素或属性名称的冲突问题。XML使用URI(Uniform Resource Identifier)的引用作为Namespace,只要将URI加到元素或属性名称的前面,就能使名称具有惟一性。如:

<description>
    <{http://www.w3.org/TR/xhtml1}head>
        <{http://www.w3.org/TR/xhtml1}title>Book
        </ {http://www.w3.org/TR/xhtml1}title>
    </{http://www.w3.org/TR/xhtml1}head>   
</description>

可以写成:

<description xmlns:ht=" http://www.w3.org/TR/xhtml1” >
      <ht:head>
      <ht:title>Book</ht:title>
      </ht:head>   
</description>

命名空间的声明由xmlns:prefix组成。声明固定为xmlns,之后用':'隔开,prefix不能包含xml的字样。名称空间定义中的字符串仅仅是字符串,上例中,也可以定义xmlns:addr=“yzu",这也是有效的。默认的命名空间采用xmlns=“someuri”来表示没有prefix的元素使用此命名空间。

<library xmlns=”http://www.w3c.org”>
      <book>xml bible</book>
      <author name=“abcd”>……</author>    
</library>

如果没有默认的命名空间,没有prefix的元素不属于任何命名空间。 命名空间的作用域仅限于命名空间声明的元素以及子孙元素。

   <library>
       <bk:book xmlns:bk=“http://www.w3.org”>
            <bk:title>…</bk:title>   
    </bk:book>   
    <bk:description>…</bk:description>    # 这个是错误的,因为bk已经超出作用域了
</library>

DTD和XML Schema

文档类型定义(Document Type Definition),简称DTD。DTD定义可以在普通XML文档中出现的元素、这些元素出现的次序、它们可以如何相互嵌套以及 XML文档结构的其它详细信息。DTD是最初的XML规范的一部分,但是DTD语法不同于的XML语法。 DTD的一般写法是:<!DOCTYPE 根元素名[…[内容声明]…]> 元素和属性是两个主要声明:

<! ELEMENT element_name content_spec >
            元素名称      元素內容的类型
<! ATTLIST element_name attribute_name type default >
          所属元素的名称    属性的名称    类型  指默认值

DTD的局限有以下几点:

  • DTD本身不是XML格式,无法使用标准的编程方式进行DTD维护
  • DTD不支持命名空间
  • DTD仅支持有限的数据类型,在大多数应用环境下表示能力不足
  • 无法重复使用先前声明的元素或属性
  • 不易描述元素出现次数

由于DTD的局限性,进一步提出了XML Schema。XML Schema是W3C的推荐标准,于2001年5月正式发布,经过数年的大规模讨论和开发,最终成为全球公认的XML环境下的首选建模工具,已经基本取代了DTD的地位。 XML Schema正式定义XML实例文件(instance document)的结构,即验证XML实例文件是否合法;也定义了出现在XML文件中的元素和属性的数据类型及结构。 XML Schema预定义的元素和属性在名称空间(http://www.w3.org/2001/XMLSchema 精巧地址:http://bit.ly/1cK2ff)中定义,主要包括以下一些基本元素:

  • Schema:XML Schema的根元素
  • SimpleType:定义数据类型

  • ComplexType:声明XML元素的结构

  • Element:声明XML子元素
  • Attribute:声明XML元素属性

XML Schema中定义的数据类型称为简单类型,它很好地规范了XML文档的文本内容的形式和语义。而且因为XML Schema本身是XML文档,其定义的数据类型可以直接在XML文档中使用。 XML Schema中的简单类型可以分为三种:原子类型、列表类型和联合类型。 XML Schema内置了40多种简单类型,常见的有:string(字符串)、Boolean(布尔类型)、URI reference(URI引用)、float(浮点数字)、double(双精度浮点数)、ID(身份号)、decimal(十进制数字)、 ENTITY(实体)和TimeDutation(时间数据)等。

工具和资源

XML开发环境
XML文档

小结

  • IBM从60年代就开始发展的 GML,到 1986年标准化成SGML(ISO 8879),虽然好用,但是太复杂; 随着互联网的发展,在1989 由CERN(Conseil Europeen pour la Recherche Nucleaire)简化成 HTML,随着Internet 的发展,HTML快速发展到4.0,但是有失控的趋势,而且面对爆炸式的网页增长,根本没有什么好办法来让电脑理解网页内容,从而更加聪明的帮助入门寻找可用的资料; 所以 1996年合理简化SGML提出XML,1998年,成为W3C标准(XML1.0); 但是,人们发现XML配套的技术和软件平台太少,网络中不断增长的还是对于电脑来讲一片混沌的HTML页面,于是在 2000年底,XML向HTML妥协,基于HTML4.0.1 发布了 XHMTL1.0,将HTML改进成吻合XML规范的格式,从部分方面解决了电脑理解网页的问题. 嗯嗯嗯,这个围绕着网页的故事还在继续,而XML,已经跨出了网页的领域,在数据挖掘,分布式计算,语义网研究等等方面不断的快速成长着,就行者来看,XML可以简单理解成:
    1. 结构化数据的容器标准;
    2. 数据处理的结构化标准;
    再简单的说,XML就是当前最方便和通用的数据交换格式! 凡是程序间/系统间/网站间的数据交互,优先考虑使用XML准没错!

PCS403 思维导图

~千言万语不及一张图

概述

"使用思维导图是波音公司的质量提高项目的有效组成部分之一. 这帮助我们公司节省了一千万美元!"

  • --Mike Stanley , 波音公司
    • 美国波音公司在设计波音747飞机的时候就使用了思维导图. 据波音公司的人讲, 如果使用普通的方法, 设计波音747这样一个大型的项目要花费6年的时间. 但是, 通过使用思维导图, 他们的工程师只使用了6个月的时间就完成了波音747的设计! 并节省了一千万美元. 思维导图的威力惊人吧?!

"我们的课程建立在思维导图的基础上. 这帮助我们获得了有史以来最高的毕业分数. 思维导图教学必然是未来的教学工具. "

  • ——Jean Luc Kastner,高级经理, 惠普公司
  • 什么是思维导图?为什么思维图谱这么神奇?
    • 人的记忆能力实质上就是向大脑储存信息, 以及进行反馈的能力. 人的大脑主要有神经细胞构成, 每个神经细胞的边缘又都有若干向外突出的部分, 被称作树突和轴突. 在轴突的末端有个膨大的突起, 叫做突触小体. 每个神经元的突触小体跟另一个神经元的树突或轴突接触. 这种结构叫做" 突触 ". 神经元通过" 突触 "跟其他神经元发生联系, 并且接受许许多多其它的神经元的信息. 神经元传递和接受信息的功能, 正是大脑具有记忆的生理基础. 每个神经元上有多少个突触呢? 有人估计, 在人们大脑皮层每个神经元上平均有三万个突触. 那么, 人脑有多少神经元呢? 大约有140亿个. 这140亿个神经细胞之间的突触联系的, 用天文数字也难以表达. 这样的结构特点, 就使大脑成为一个庞大的信息储存库. 一个人脑的网络系统远比当今英特网还复杂. 科学家认为, 一个人大脑储存信息的容量, 相当于十亿册书的内容, 一个人的大脑即使每一秒钟输入十个信息, 这样持续一辈子, 也还有余地容纳别的信息. 这说明:我们大脑的记忆容量是无限的, 有很大的记忆能力, 而且我们的记忆天然是立体网状的, 不是日常各种记录媒体那样平面的线性的!
    • 爱因斯坦曾这样描述他的思考问题时的情景:“我思考问题时,不是用语言进行思考,而是用活动的跳跃的形象进行思考,当这种思考完成以后,我要花很大力气把他们转化成语言。”显然,正是左右脑协同工作,使人类具有感知力、创造力。
    • 思维导图是表达发射性思维的有效的图形思维工具. 思维导图运用图文并重的技巧, 把各级主题的关系用相互隶属与相关的层级图表现出来, 把主题关键词与图像、颜色等建立记忆链接, 思维导图充分运用左右脑的机能, 利用记忆、阅读、思维的规律, 协助人们在科学与艺术、逻辑与想象之间平衡发展;
    • "思维导图" 是图形化的对思维过程的导向和记录. 思维导图促进思维的发现, 并能记录这个发散过程.
    使用思维导图的好处
    1. 使用大脑所有皮层技巧,利用了色彩、线条、关键词、图像等,因此可以大大加强回忆的可能性。
    2. 通过动手绘制思维导图可以激发大脑的各个层次,使大脑处于警醒状态,在记忆的时候更加有技巧。
    3. 整个思维导图就是一个大的图像,是整个信息资讯的整体架构,使大脑希望回到它们中间去,因而又一次激发自发回忆的可能性。
    4. 它们的设计极为简单,而且结构清晰,层次分明,便于对信息的组织和管理,因而可以帮助记忆。
    5. 使用助记的思维导图会激发大脑准备好记忆,因而,每用一次,大脑基本的记忆技巧水平就会提高一次。
    6. 反映了人们创造力思维过程,使得我们的思维过程可视化和可操作化,因此也就同时加强了创造性思维技巧。
    7. 因为在制作思维导图时,要求我们把关键性的内容记下来,因此可以促使我们在学习和倾听的阶段都保持着较高水平的回忆。
    8. 关键词和图像的应用,促使人们使用个人所有的联想能力,思维导图本身的形状加强了大脑物理印迹和网络开发能力,因此就增加了回忆的可能性。
    9. 因为使用了左脑和右脑的所有技巧,提供了一个“十拿九稳”的记忆方法,增大了个人的信心,动机和普遍的心理作用。

在CDay -1日 故事中,笔者就针对中文问题的解决,记录成了一个思维导图:

使用

思维导图的使用,可以直接利用纸和笔:

  • 摘取自: [原创]泡泡茶的《启动记忆》《掌握记忆》章节总结 [栖息谷·管理人网络社区]

但是一般人的手绘能力并不强,只是使用文字来进行导图记要:

而且,在网络中分享传播手绘的导图比较麻烦;所以,这里推荐一个轻巧实用的思维导图工具:

FreeMind

Freemind是一款简单易用的开源思维图谱(MindMap)软件, 或称树编辑器. 通过它可以创建可折叠的树形结构, 节点可以是纯文本, 也可以添加颜色, 图标, 节点也可以具有云的形状及其它的图形. 方便的折叠功能和强大的搜索功能使FreeMind成为一款颇有价值的知识库工具, 同时也能够通过键盘进行控制.

使用FreeMind

FreeMind可以应用于以下方面:

  • 跟踪项目, 包括子任务, 子任务的状态以及时间纪录;
  • 项目工作区, 包括必要的链接, 如文件, 可知性文件, 信息来源及信息;
  • 互联网搜索工作区, 使用Google及其它资源;
  • 保留中小尺寸的备忘录, 包括一些链接以扩展内容. 这些备忘录也可以称作知识库;
  • 散文写作及头脑风暴, 使用颜色区分哪些散文打开的, 哪些已完成, 哪些未开始. 节点可以显示散文的大小;
  • 保存小型的结构化的数据库, 可以动态改变, 非常灵活. 虽然查询功能有限, 但是可以任你喜欢, 保存任何信息, 如联系人, 名片, 医疗记录等;
  • 网络收藏夹或书签, 可以任意设置颜色和字体.

FreeMind特性

  • 完全支持节点中HTML链接, 链接可以是网站地址或者本地文件;
  • 从早期版本开始, FreeMind就支持折叠功能, 这是它的核心特性;

  • 快速的点击导航, 包括折叠/打开, 链接点击导航. 拖动图谱的背景就可移动图谱, 也可使用鼠标滚轮移动;
  • 取消操作功能;
  • 即托即放功能, 包括节点拷贝或节电样式拷贝;多个节点的拖放功能;从外部拖放文本或文件列表;
  • 拷贝和粘贴功能, 粘贴HTML中的链接和文件列表, 或者拷贝纯文本和RTF(MS Wordpad, MS Word, MS Outlook消息);
  • 图谱输出到HTML格式;
  • 查找功能, 通过"find next"一个接一个显示查找到的纪录;
  • 能够使用和编辑多行节点;
  • 能够使用内置的图标,颜色,不同的字体装饰节点;
  • 低成本低风险地转移到其它的思维图谱工具,因为FreeMind通过XML格式存储信息.

最大的特点是使用方便, 能够以xml的格式输出. 推荐下载使用0.8rc2的版本, 这个非常流畅. 另外, FreeMind使用Java编写, 支持使用Jython编写扩展插件. 由于文件格式是xml, 因此便于扩展, 比如:存放更多的扩展属性信息.

FreeMind实例

Google 的发展思路;

  • google-mindmap

知识点图谱

小结

  • 借重工具,我们可以利用思维导图来记录思维过程,协助厘清概念关系,展示设计思想,浓缩复杂知识体系以便加速记忆,,,

    思维导图可以用来作什么,并没有强行约定,但是图形化的思维导图已被证明是极其有效的提高沟通和记忆的好工具!大家得空应该体验一下子 ;-)

PCS404 代码重构浅说

~ 重构是必要的浪费

概述

Refactoring ~ 修改内部结构(设计)而不影响外部行为

  • 对代码和软件的重构,对于用户是没有意义的,所以是种浪费;
  • 但是,对程序员,代码和软件的重构,是绝对必要的!因为可以:
    • 加深对程序的理解
    • 使程序更加容易被理解
    • 找到隐藏的BUG
    • 提高开发速度
    • 不知不觉中完成对软件的设计增进
    • 从而神奇的提高代码的可维护性/复用性/健壮性...

使用

首先推荐本专门的好书:

重构--改善既有代码的设计

其实在前面的 CDay/KDay 故事中,针对同一功能的实现,先后使用不同的思路和代码在保持对外接口不变的情况下,反复使用更精简/明了/易读的代码重新实现,这本身就是重构!

   1 import os
   2 export = ""
   3 for root, dirs, files in os.walk('/media/cdrom0'):
   4   export+="\n %s;%s;%s" % (root,dirs,files)
   5 open('mycd2.cdc', 'w').write(export)

演变成:

   1 import os
   2 export = []
   3 for root, dirs, files in os.walk('/media/cdrom0'):
   4     export.append("\n %s;%s;%s" % (root,dirs,files))
   5 open('mycd2.cdc', 'w').write(''.join(export))

又变成:

   1 import os
   2 def cdWalker(cdrom,cdcfile):
   3     export = ""
   4     for root, dirs, files in os.walk(cdrom):
   5         export+="\n %s;%s;%s" % (root,dirs,files)
   6     open(cdcfile, 'w').write(export)
   7 cdWalker('/media/cdrom0','cd1.cdc')

就是根据经验或是直觉,将具有"坏味道"的代码使用更舒服的代码不断改进!

注意:: 
所谓代码的"坏味道",就是程序员们在多年各种开发活动中总结出来的,
令代码的扩展和维护趋向混乱和不可控的态势,,,
具体的参考 "重构--改善既有代码的设计" 一书中详细介绍的几十种"坏味道"及其应对方法;)

问题

什么时候应该进行重构?
  • 这个问题随着我们的经验积累,答案会增殖的!
  • 所以,可以从反向进行解答:什么时候不应该进行重构?

    1. 现有的程序无法运行,此时应该是重写程序,而不是重构
    2. 程序到了最后的交付期限
重构活动中的难题
  • 当前可以确认的,无法轻快的当场进行重构的难题有以下方面:
    • 关系数据库与面向对象编程的问题:在对象模型和数据库模型之间插入一个分隔层,这就可以隔离两个模型各自的变化.升级某一模型时无需同时升级上述的分隔层即可.这样的分隔层会增加系统复杂度.但是能增加灵活度.
    • 修改接口的问题:修改已发布的接口,因为已发布的接口会供外部人员(其它公司)使用,因此,修改接口会导致引用接口的其它程序不修改程序就无法运行.修改接口的最好的办法是增加一个新的接口,让旧接口调用新接口.这样原来的程序就不用修改了.对于接口的另一个建议是心尽量不要发布接口.

探讨

由于重构法则在长期探索中形成了各种模式,进而已经被包含在一些高级IDE环境中!

对于Python

进一步的,请参考 维基百科:软件重构

小结

  • 重构是最简单易行的提升代码品质的手段,不过,其实施和管理方式是属于 XP~极限编程思想,不是我们日常学校里念叨的"瀑布式开发流程";重构,要求的是就地,随时进行的勇气和技巧以及热情! 只要我们非常看重我们自个儿写出来的代码,期望这些代码可以长久的反复的,稳健的运行/使用/分享下去;那么就开始重构吧!