煮 雪 小 筑

--编程、计算机及网络技术以及有关历史与文化的东西。

Home Contact Syndicate this Site (RSS 2.0) Syndicate this Site (Atom) Login
  10 Posts :: 1 Stories :: 3 Comments :: 0 Trackbacks

News



大雪纷纷,拥炉而坐,煮雪烹茶,雪味淡淡,茶香幽然,手持周易一卷,或读或思,若与三代以上人晤谈,此中有大佳趣,赖何俗人多不识之!

文章 分类

存档

日记 分类


Friday, July 01, 2005 #

因为工作以及个人爱好的关系,我时常思考有关软件工程方面的问题,古人有云:思之思之鬼神通之,在经常反复不断的思考中,我对于软件工程就有了一些个人的看法,现在我将这些想法整理出来,具体怎样,请诸位往下看。
posted @ 10:28 AM

Tuesday, June 28, 2005 #

《UNIX系统结构对软件架构的启示》一文中提出的三层软件架构模式可以进一步描述如下:

该模式可以命名为:核心+服务集+组合器模式。

该模式从内到外由三层组成:

核心位于最内层,其上是服务集,在服务集之上是组合器层。

核心层面向资源,主要负责系统资源管理与调度,其中资源主要是指与计算机软硬件本身相关的资源,而非用户业务流程中抽象出来的资源。

服务集层位于核心层之上,他向核心层请求调度资源,同时向用户和组合器层提供服务,它面向数据处理,是系统功能的主要部分。

组合器层位于核心层和服务集层之外,它直接面向用户,面向业务流程,向用户提供更好的调用、组合系统服务的方法,为系统提供用户界面,他的设立主要是为了方便用户使用及增强系统的可裁剪性、可扩展性。

posted @ 1:26 PM

UNIX系统结构对软件架构的启示

简介:本文关心的是怎样构造一个能适应用户需求变化的软件,本文从对UNIX系统结构的分析出发,分析了UNIX系统用怎样的方式满足了多种多样的用户需求,并在此基础上提出了一种软件架构模式。

众所周知,软件开发中的一个难题是怎样面对用户的多种需求,即(1)、怎样满足多个不同用户的不同需求;即(2)、怎样满足用户不断变化的需求。而有操作系统中,UNIX系统(或类UNIX系统如LINUX)在满足不同用户需求上的可裁剪性即在满足用户不断改变的需求上的可扩展性给我们留下了深刻的印象,我们不禁要问:UNIX系统这种可裁剪性和可扩展性是怎样取得的呢?答案是因为UNIX具有特殊的系统结构。

一、UNIX系统结构分析:

SHELL程序

   |

提供给用户的服务程序(包括多个正文处理程序)

   |

协调用户和核心之间的实用程序

   |

OS核心

如上图所示,UNIX操作系统是一种层次结构。

在这个层次结构中,处于最底层的是UNIX系统的核心(即UNIX操作系统常驻内存的部分),在核心之上是用以协调用户和核心之间的实用程序,UNIX系统结构最底层的两个层次构成了UNIX操作系统的基本部分,这个基本部分能够运行(例如能够成功启动)但不能提供给用户任何服务,严格的说,这样的操作系统对用户来说是毫无用处的,用户需要的是操作系统提供给他的服务,为此,UNIX系统提供了大量的服务程序供用户调用(通过命令行或GUI方式),这些服务程序构成了UNIX系统的第三层即提供给用户的服务程序。UNIX系统的前三层构成了一个实用的操作系统,但这个操作系统虽然提供有许多服务程序供用户使用,但这显然不能满足用户多种需求以及需求的变化(面对庞大的用户群和不断变化的需求,再多的服务程序都不能满足用户的要求),为了更好的满足用户的需求,UNIX系统在服务程序上提供了SHELL程序,使得用户可以按照自己的需求编写脚本程序,以完成特定的任务(最简单的如批量执行命令),这就是UNIX系统的最上一层,即SHELL程序层。

相对于其它操作系统,UNIX操作系统的系统核心提供的服务较少,它根本不替用户干任何事情,它只负责系统最核心的工作——系统资源的管理,如进程调度、内存和磁盘的分配,主存和外部设备之间数据的传递并且受理进程所需要的服务,这些工作是每一个操作系统都必须要做而且经常要做的工作,因此,其效率和正确性将直接影响整个系统的性能,为此,UNIX构造一个高效的、健壮的系统核心,而将为用户提供的服务交由协调用户和核心之间关系统的实用程序来完成,这使得UNIX一方面是高效的和稳定的(因为其具有高效稳定的系统核心)另一方面也是可扩展的、可裁剪的和可修改的(对系统的扩展、裁剪和修改只需修改实用程序,这显然要比修改系统核心容易得多)。OS核心+协调用户和核心之间关系的实用程序构成了UNIX操作系统的基本部分。为了提供更多的服务,UNIX提供了大量的服务程序供用户调用,这些实用程序都是精炼的,往往只关心用户需求中很小的一部分。但为并不是UNIX的特色,UNIX与其它操作系统(如DOS和WINDOWS)的最大不同,是它提供了一种机制,这种机制使得用户可以随心所欲的组合操作系统提供的服务程序,以满足用户的特殊需要。为了提供这种机制,UNIX操作系统做了三方面的工作,首先,在操作系统基本部分的功能中,首先将外设与文件作出了相同的处理并提供了输入输出重定向机制,这使得用户可以其它途径(例如一个文本文件)为一个服务程序提供输入(由此,可以实现输入的自动化),即将一个服务程序的输出重定向到其它方向而非标准输出(屏幕)(这使得服务程序的输出能够作为另一个服务程序的输入,也使得一个服务程序的输出能够被程序自动分析)。其次,在系统的第三层,即提供给用户的服务程序中提供了大量的正文处理程序,通过有机的组合使用这些正文处理程序,用户可以对非常复杂的文本文件进行分析,这为分析一个服务程序的输入、输出提供了前提条件。最后,在系统的最外层,UNIX提供给用户一个脚本程序框架,通过编写UNIX SHELL脚本程序,用户可以十分方便的使用系统提供的服务程序,与DOS/WINDOWS提供的批处理相比,UNIX SHELL是真正的脚本程序,它提供了一个程序设计语言所应具备的所有功能,如流程控制、函数与子程序等功能,同时,它是一个解释程序,其执行程序(也是源程序)就是一个拥有执行权限的文本文件,这使得编写、阅读、修改、使用都很容易。而且UNIX将SHELL程序与系统本身提供的服务程序(这些程序大都是二进制程序以保证其执行效率)同等对待,具有相同的调用方式,一个编写好的SHELL程序可以作为UNIX系统提供的服务一样供用户调用,因此,编写SHELL本身就是对UNIX系统的扩展,事实上,在UNIX系统的基本部分中,就存在大量的SHELL程序(如系统的初始化脚本中)。

二、对软件架构的一点启发

仿照UNIX系统结构我们可以构造一种能够满足用户需求变化的软件系统结构——层次结构。UNIX操作系统为这种结构提供了一个成功的范例。

这个层次结构由三层构成:

1、一个小巧、健壮、高效的系统核心。

2、一组提供基本功能的可调用的服务。

3、一种能够组合、灵活调用基本服务的平台。

系统核心必须小巧、健壮、高效,为此,他必然只能关注系统的最基本部分,一般地,它可以只管理和调度系统的核心资源。

对服务(程序),我们要求它功能单一(这能减小其复杂性——将复杂性交由组合平台处理同时增加其正确性,而且还满足模块划分的要求),健壮,高效,接口统一规范明确(具有相同的输入、输出方式),在这一层,可以不考虑用户界面的问题,而将用户界面交由组合平台处理。

最后,作为层次结构的最顶层,组合平台必须具有灵活的分析机制(如正文处理功能)、使用简单、方便编写、阅读、修改、扩展,因此,最好是基于描述,如果可能,可以直接套用UNIX的重定向+正文处理+SHELL脚本程序设计语言模式。

posted @ 1:25 PM

作为一个技术人,我们永远不会停下追赶的脚步,也不敢停下追赶的脚步。

这是一个忙乱的时代,在这样的时代计划永远赶不上变化,而且这种变化并不以人们的意志为转移,生活就象一辆车,而这辆车没有司机,这是一个缺少英雄的时代,那种一个或几个英雄主宰世界的时代已成为过去。

前天,我们刚上互联网,刚学会使用浏览器,昨天我们还在追逐Email、QQ、MSN、新闻组,今天我们又在追赶Blog、RSS,生活永远在变化,时代永远在前进,技术永远在发展,我们所能做的,只是,追赶。

posted @ 1:24 PM

随着技术的发展,互联网已成为大众的世界,那种进出电脑机房就象科学家进出实验室一样正式和庄重的时代早已成为过去,如今,电脑和网络就象电视机、洗衣机一样成为一种家用电器,融入到大众的生活当中。大众中绝大多数人是懒散的,大众中绝大多数人都不是技术高手,大众中绝大多数人都有表现欲,于是博客应运而生,有句名言说“存在即是合理”其实这是一句经典的误译,因为在汉语中,“合理”暗含“正确”的意思,正确的译法应该是“存在自有其理”——存在自有存在的道理。博客也不例外,博客存在的理由于他的方便性和易用性以及人们对个性空间的需求,这种需求源于人们的表现欲望——每个人都渴望与众不同,尤其在这拥有太多相同的时代。

博客的技术说到底是两种技术的混合物,一种是CSS(层叠样式表)——一种将内容与样式分别出来的技术,使用他你可以将同一内容表现为千万种不同的样式,另一种是CMS(内容管理系统)——内容管理技术,使用他你可以轻松地将内容放置到网上,你只须填写即可,内容的生成是博客的事。总之,博客的精要可以用一句话来概括:内容与表示相分离。

博客的性质可以说是个人主页、论坛的混血:如果只允许博客本人发表,博客是个人主页,如果允许大家发表评论,博客就变成了论坛,  一切都是那样的方便。其实个人主页和论坛以及新闻组等等之间并没有不可越过的鸿沟。

可以预见的是,随着博客的出现,互联网上的信息将大大的增加,今天你如果google任何的信息,你会发现很多都是写到博客上的东东。原因正在于博客让发表变得如此的简单。这是好事也是坏事,好就好在发表很方便,大家可以发表与抄袭的机会很多,坏就坏在看的人会越来越少,如果你缺少很好的推销方法的话,要使别人注意到你发表的作品是很困难的,信息越多引人注意就越难,今后人们的烦恼将不是我找不到什么,而是我不知道需要找什么,所以信息挖掘的技术必然会大大的发展。

 

posted @ 1:22 PM

三、知道这些,我们能够做什么?

现在,你知道RSS是怎么回事了吗?其实当你理解了RSS,你会觉得他非常简单:
知道了这些内容,我们至少可以做两方面的事:
1、按照上面提供的RSS文档格式编写一个XML的文档xxx.xml,将这个文档放到你的网站上,打开你的rss阅读器,将这个xml的URL地址输入RSS订阅的URL栏,然后点击“确定”,你看到了什么?你的RSS阅读器中已经显示出了你所编辑的内容。原来你已经提供了RSS服务,一切就是这样简单,下面的内容就是怎样将你网站的内容制成RSS格式的XML文件了,在这个过程中你会用上一些技术,这不属于本文的范畴。
2、编写一个html文档,<body>和</body>之间写上一个<div id="RSSDIV"></DIV>,然后,写一段javascript程序的函数initrss(),这个函数将从你的网站上接收xml文档(有多种方法,如使用xmldoc技术就行),然后解释这个xml文档,最简单也是最基本的,你须要析出文档名(即item中的title项)和他的链接(即item中的link项), 然后为这个文档名加上超级链接:<a href="item的item的link项">item的title项</a>,将这一字串赋值给一个变量htmlcode,最后,(当然会有最后,不是吗?)将这一段html代码写入DIV中:RSSDIV.innerHTML=htmlcode;,保存这个html文档,用你的IE浏览器打开它,你看到了什么?你已经制成了一个简单的rss阅读器了,就这样简单吗?是的,一切就这样简单。而简单总是美好的。

posted @ 12:41 PM

二、RSS的文件格式:

从上文可以看出,RSS技术的关键在于RSS格式的XML文件,正是这个XML文件沟通了服务器端和客户机端,S和C端通过这个XML文件进行对话:S端按固定的格式生成XML文档,C端接收这个文档并解释之,然后显示出来。

RSS具有固定的格式,当然,由于历史和版本的原因,RSS的XML文件格式具有好几种,以下是常见的几种:

Example  Of RSS

Figure 1 Sample RSS 1.0 Document
<rdf:RDF xmlns:rdf=http://www.w3.org/1999/02/22-rdf-syntax-ns# 
xmlns=http://purl.org/rss/1.0/
 xmlns:dc="http://purl.org/dc/elements/1.1/" > 
<channel rdf:about="http://skonnard.com/blog/rss.xml"> 
<title>The XML Files</title> 
<link>http://skonnard.com/blog</link> 
<description>by Aaron Skonnard</description> 
<image rdf:resource="http://skonnard.com/blog/images/image.gif" /> 
<items> 
<rdf:Seq> <rdf:li resource=" http://skonnard.com/blog/entry1" /> 
<rdf:li resource=" http://skonnard.com/blog/entry2" /> 
</rdf:Seq> </items> 
</channel> 
<image rdf:about=" http://skonnard.com/blog/images/image.gif"> 
<title>skonnard.com</title> <link>http://skonnard.com/blog</link> 
<url>http://skonnard.com/blog/images/image.gif</url> </image> 
<item rdf:about="http://skonnard.com/blog/entry1">
 <title>1st blog entry</title>
 <link>http://skonnard.com/blog/entry1</link>
 <description>This is my first blog entry.</description>
 <dc:date>2004-01-13T17:16:44.9803903-07:00</dc:date> </item> 
<item rdf:about="http://skonnard.com/blog/entry1"> 
<title>2nd Blog Entry</title> 
<link>http://skonnard.com/blog/entry1</link>
 <description>This is my second blog entry.</description>
 <dc:date>2004-01-13T17:16:45.9803903-07:00</dc:date>
 </item> 
</rdf:RDF> 

Figure 2 Sample RSS 2.0 Document
<rss version="2.0">
 <channel>
 <title>The XML Files</title>
 <link>http://Skonnard.com/blog</link>
 <description>by Aaron Skonnard</description>
 <image> <url>http://skonnard.com/blog/images/image.gif</url> 
<title>skonnard.com</title>
 <link>http://skonnard.com/blog/</link>
 </image> 
<item> 
<title>1st blog entry</title> 
<link>http://skonnard.com/blog/entry1</link> 
<description>This is my first blog entry.</description>
 <pubDate>Wed, 14 Jan 2004 17:16:44 GMT</pubDate> 
</item>
 <item> 
<title>2nd blog entry</title>
 <link>http://skonnard.com/blog/entry1</link> 
<description>This is my second blog entry</description>
 <pubDate>Wed, 14 Jan 2004 17:16:45 GMT</pubDate>
 </item>
 </channel> 
</rss> 

Figure 3 Sample Atom 0.3 Feed
<feed version="0.3" xml:lang="en-us" xmlns="http://purl.org/atom/ns#" >
 <title>The XML Files</title>
 <link>http://skonnard.com/blog/</link>
 <modified>2004-01-13T17:16:45.0004199-07:00</modified> 
<tagline>by Aaron Skonnard</tagline> 
<author>
 <name>Aaron Skonnard</name> 
</author> 
<entry> 
<title>1st blog entry</title> 
<link>http://skonnard.com/blog/entry1</link> 
<created>2004-01-13T17:16:44.9803903-07:00</created>
 <content type="text/html" mode="xml">
 <body xmlns="http://www.w3.org/1999/xhtml"> 
<p>This is my first blog entry</p> </body>
 </content> 
</entry>
 <entry>
 <title>2nd blog entry</title>
 <link>http://skonnard.com/blog/entry2</link>
 <created>2004-01-13T17:16:45.9803903-07:00</created> 
<content type="text/html" mode="xml">
 <body xmlns="http://www.w3.org/1999/xhtml"> 
<p>This is my second blog entry</p> 
</body>
 </content> 
</entry>
 </feed> 

Figure 4 Sample Blogroll (OPML)
<opml> 
<head> 
<title>Aaron's Favorite Blogs</title> 
</head>
 <body> 
<outline type="rss" title="PDC Bloggers" description="PDC Bloggers website" xmlUrl="http://pdcbloggers.net/Feed.rss" htmlUrl="http://PDCBloggers.net" />
 <outline type="rss" title="MSDN Magazine: Current Issue" description="The Microsoft Journal for Developers" xmlUrl="http://msdn.microsoft.com/msdnmag/rss/recent.xml" htmlUrl="http://msdn.microsoft.com/msdnmag/" /> 
<outline type="rss" title="MSDN Just Published" description="Keep current ..." xmlUrl="http://msdn.microsoft.com/rss.xml" htmlUrl="http://msdn.microsoft.com/" /> 
</body> 
</opml> 

Figure 5 Generating an RSS 2.0 Feed in ASP.NET
<%@ Page language="c#" Codebehind="rss.aspx.cs" AutoEventWireup="false" Inherits="SimpleBlog.rss" %>
 <rss version="2.0"> 
<channel> 
<title>My Blog</title>
 <link>http://localhost/simpleblog/default.aspx</link>
 <description>A weblog about nothing...</description> 
<language>en-us</language> 
<asp:Repeater id="Items" runat="server">
 <ItemTemplate> 
<item>
 <title><%#DataBinder.Eval(Container.DataItem, "title")%></title> 
<description>
<%#DataBinder.Eval( Container.DataItem,"description")%>
</description>
 <pubDate><%#DataBinder.Eval(Container.DataItem, "pubdate") %>
</pubDate> 
<link><%# DataBinder.Eval(Container.DataItem, "link") %></link> 
</item> 
</ItemTemplate> 
</asp:Repeater>
 </channel> 
</rss> 

Figure 6 RSS Aggregator Web User Control
<%@ Control Language="c#" AutoEventWireup="true" EnableViewState="false" Debug="true"%> 
<%@ Import namespace="System.Xml" %>
 <%@ OutputCache Duration="1800" VaryByParam="none" %>
 <script runat="server" language="C#"> 
private void Page_Load(object sender, System.EventArgs e)
 { StringBuilder sb = new StringBuilder(); 
XmlDocument doc = new XmlDocument(); 
doc.Load(Server.MapPath("blogroll.opml")); 
int numToDisp = int.Parse(doc.SelectSingleNode( "/opml/@numberToDisplay").InnerText);
 XmlNodeList rss = doc.SelectNodes(//outline/@xmlUrl);
 foreach (XmlNode r in rss) 
{ 
XmlDocument blogdoc = new XmlDocument();
 blogdoc.Load(r.Value);
 XmlNodeList items = blogdoc.SelectNodes("//item"); 
for (int i=0; i<items.Count && i<numToDisp; i++) 
{ 
string author=""; 
XmlNode authorNode = items[i].SelectSingleNode( "*[local-name()='author' or local-name()='creator']"); 
if (authorNode != null) author = authorNode.InnerText;
 sb.Append(String.Format( "&#149;&nbsp;<a href={0}>{1} ({2})</a><br/>", items[i].SelectSingleNode("link").InnerText, items[i].SelectSingleNode("title").InnerText, author)); 
} 
} 
EntriesHTML.Text = sb.ToString(); 
}
 </script> 
<style> 
<!-- styles omitted for brevity --> ... </style>
 <div class="title">UNUG Blogs</div> 
<asp:Literal id="EntriesHTML" runat="server">
</asp:Literal> 

以上RSS格式的主要区别在于1.0版RSS和2.0版RSS的区别:
RSS 1.0 和 2.0 格式所包含的核心信息相同,但其结构不一样。我提供了一个 RSS 1.0 文档及一个同等的 RSS 2.0用于对照。
你会注意到顶行右边开始的根元素的差异,RSS 1.0 的根元素是 rdf:RDF,而 RSS 2.0 的根元素是 rss。rss 还包含一个强制版本属性用以表示所用的RSS的准确格式(可能的值包括:0.91, 0.94 等)。另一个主要差别是 RSS 1.0 文档有名字空间限定,RSS 2.0 的文档就没有。不管怎样,包含在两个文档中的信息本质上是一样的。
  两个版本都包含 channel 元素,而 channel 元素又包含三个必须的元素:title、description 和 link,其代码如下: 

        
  除了这些必须的元素外,RSS 1.0 还定义了三个附加元素:image、items 和 textinput,其中,image 和 textinput 是可选的。另一方面,RSS 2.0 提供了 16 个附加元素,其中也包括 image、items 和 textinput,此外还有 language、copyright、managingEditor、pubDate 和 category。RSS 1.0 允许通过定义在单独的 XML 名字空间中的可扩展元素来创建这种类型的元数据。
  这两种格式在结构上的主要区别必须要看其 item、image 和 textinput 节点的表示形式。RSS 1.0 中,channel 元素包含对 item、image 和 textinput 节点的引用,这些节点存在于 channel 节点本身之外。这样在 channel 和 所引用的节点之间建立了一种 RDF 关联。如 Figure 1 所示,channel 元素与一个 image 元素以及两个 item 元素关联。RSS 2.0 中,item 元素只是在 channel 元素中连续排放(如 Figure 2 所示)。item 元素包含实际的新闻项信息。item 的结构在两个版本中是相同的。item 元素通常包含 title、link 和 description 元素,如下代码所示:


  在 RSS 1.0 中,title 和 link 是必须的,description 是可选的。而在 RSS 2.0 中,title 或 description 必须提供其中的一个;其它均可选。这些只是定义在 RSS 1.0 中的 item 元素。RSS 2.0 提供几个其它可选元素,其中有 author、category、comments、enclosure、guid、pubDate 和 source。RSS 1.0 获取这样的元数据是通过定义在单独的 XML 名字空间中称为 RSS 模块的可扩展元素来实现的。例如,在 1中,item 的日期是用 Dublic Core 模块的 元素表示的。

posted @ 12:36 PM

一、基本概念:

“忽如一夜春风来,千树万树梨花开”,近来RSS的概念已然流行开来,那么,什么才是RSS呢?怎样才能实现RSS的功能呢?以下是手艺人对RSS的理解。

RSS的概念:

以下是某知名网站对RSS的标准描述:
RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容),通常被用于新闻和其他按顺序排列的网站,例如Blog。一段项目的介绍可能包含新闻的全部介绍等。或者仅仅是额外的内容或者简短的介绍。这些项目的链接通常都能链接到全部的内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。说得更加简单一点,RSS就是一种用来分发和汇集网页内容的XML格式!

注意最后一句,明白了吗?RSS实质就是一个特殊格式的XML文件

RSS的过程:
1、服务器提供RSS服务,实际上就是生成一个RSS格式的XML文件。
2、RSS阅读器接收这个RSS格式的XML文件并解释他的内容,然后将他显示出来。其显示的内容相当于一个目录表,这个目录表中包含有到原文的超级链接。
3、用户点击RSS文件中的链接,浏览器显示出全文。

如果你用过RSS,你会发现他实际上不过是一个导航的目录表而已,你订阅了一个RSS,其实质就是从网站上接收了一个RSS格式的XML文件,然后,你的RSS阅读器就解释这个XML文件,然后(总是有然后)显示出来,当然,在这个过程中,阅读器也许会将其转换为HTML格式文件(如Maxsthon就是这样处理的。)说到底,XML不过是一种保存数据的方式,对数据含义的解释和使用最终都是应用软件的事。

 

posted @ 12:27 PM

博客动力其他都好,就是太慢,还有,就是经常出问题,偶刚才还想将老博客中的内容转到这里来,但老博客打不开了,唉,只有等了。
posted @ 12:23 PM

一次次的兴奋,一次次的失望,在博客兴起以后,我深深地被吸引,于是开了N个博客,但最终都让我失望,不是太慢,就是功能太差,还有就是几天以后再访问已经没有我所需要的东西,真令人失望。

希望这一次不再让我失望,上帝保佑,阿门!

posted @ 7:32 AM