2006年6月8日

用ASP.NET 2.0实现AJAX风格的Web开发

提要 在过去的几个月中,基于AJAX技术开发高度交互的Web应用程序的设计模式迅速流行开来。现在,具有高度可配置性的Web应用程序,例如Google Maps和A9,都在综合利用这些技术来创造丰富的客户端用户体验。其实,结合AJAX技术进行Web开发并非最近的研究成果,只不过这些技术一直以来不断得到持续更新和改进。

  本文中我有三个目的。首先,我想提供一个AJAX风格应用程序的高级概述。其次,我想详细地描述ASP.NET 2.0的异步回调机制。最后,我想对构建AJAX风格应用程序的工具和框架的未来改进作一下展望。

  归纳来看,AJAX风格的Web应用程序展示了下列特征:

  · 到Web服务器的异步请求-在用户等待来自于Web服务器的响应时,浏览器用户接口不会被堵塞,而是可以继续响应用户的交互。

  · 高度依赖于用JavaScript编写的基于浏览器的逻辑-W3C DOM的最新改进和标准化为实现动态的客户端UI更新提供了支持。

  · 在浏览器和Web服务器之间的基于XML数据的交换-XMLHttp对象使得与Web服务器进行通讯而不需要重载页面成为可能。

  一个AJAX应用程序和传统型Web应用程序之间的最大差别是,每次用户交互不会导致每一个HTTP请求都被发送到Web服务器;而是,用JavaScript实现的基于浏览器的逻辑掌握着控制权,之后再由该控制决定是局部处理请求还是向服务器作异步调用。一旦到服务器的异步调用结束,客户端逻辑立即适当更新UI的相关部分。这种方式具有下列优点:

  · 用户体验更为丰富。例如,当一个Google地图用户沿一个方向拖动地图时,系统就会在后台向服务器发出一个异步请求,结果是他能够在超出屏幕边界后继续拖动。这样以来,当用户进一步拖动地图时,新的图像已经可用了。这导致一种响应更快的感觉。

  · 既然跨越基于XMLHttp的到服务器的调用状态并没有丢失,那么,AJAX应用程序就可以避免每次都重新生成UI界面。

  · 更多的逻辑位于浏览器端,从而减少了到Web服务器的来回请求的数量,进而全面改进系统的潜力。

  尽管存在这么多的优点,然而AJAX风格的应用程序还是存在一些不足之处。例如,AJAX风格应用程序的开发是比较困难的,因为缺乏相应的框架(一组类似于Windows MFC工具包的UI类)和IDE(调试,可视化设计,等等)支持。另外,基于AJAX进行开发要求一个人必须至少掌握两种语言(DHTML和JavaScript)。而且,AJAX风格应用程序的编码需要更长的时间,因为它需要另外的测试以使其支持多浏览器版本和类型。最后,由于基于JavaScript的源码为终端用户可存取,所以开发过程中的安全分析也变得非常重要。

  幸好,例如Atlas,AJAX.NET和Google Maps API等工具的出现为将来构建AJAX风格的应用程序提供了更好的支持。接下来,我们将讨论一下,对于构建AJAX风格应用程序的支持技术的发展历程以及我们能够从最新发布的工具集Atlas得到怎样的期望。

  让我们首先讨论XMLHttp对象。这个对象最初为微软所引入,以后在其它平台(包括Mozilla和苹果公司的Safari浏览器)上也得到实现。XMLHttp支持到Web服务器的异步请求,这样可以允许客户端基于JavaScript逻辑调用Web服务器而不需要重载整个页面。

  换句话说,在后台与Web服务器的交互而不引起整个页面重载是完全有可能的。

  至于XMLHttp对象的使用则相当直接。为简单起见,让我们仅考虑IE特定的语法。其实,XMLHttp在其它浏览器上的实现语法与这里的讨论也很类似。

request = new ActiveXObject("Microsoft.XMLHTTP");
if (request){ request.onreadystatechange = CallbackHandler;
 request.open("GET", URL, true);
 request.send();
}
function CallbackHandler(){
 if ((request.readyState == 4) && (request.status == 200){
  string response = request.responseXML;
  //更新UI的相关部分
 }
}


  在上面的代码片断中,第一步实现实例化Microsoft.XMLHttp类。第二步设置我们刚刚创建的XMLHttp实例的属性,其中包括当XMLHttp请求完成时将得到控制的回调函数的地址。因为我们在向服务器作异步调用(通过把open方法的第三个参数设置为true来实现),所以我们需要回调函数的地址。在回调函数实现过程中,我们作额外的检查以确保完成请求。

  你从上面的示例代码中可以看出,以独立方式使用XMLHttp对象是相当简单的。然而,把XMLHttp集成到HttpPage生命周期的其它部分中是比较困难的-例如,如何确保服务器端的方法调用能够存取页面中其它控件的状态呢?为了正确初始化这些控件的状态,服务器端的回调处理需要经历一个与回调过程类似的HttpPage生命周期。直接使用XMLHttp对象的其它挑战是,作为开发者,我们需要考虑不同的浏览器类型。幸好,ASP.NET 2.0提供了一个可重用的模式-它能够使得存取回调功能非常容易。注意,随同ASP.NET 2.0一同发行了若干控件,包括GridView,TreeView等,都综合利用了回调机制。

  让我们先看一下服务器端实现原理。首先,在服务器端要定义一个新的接口IcallBackEventHandler。任何ASPX页面(或打算支持客户端回调的控件)都需要实现这个ICallBackEventHandler接口。ICallBackEventHandler接口定义了一个称为RaiseCallbackEvent的方法。这个方法使用一个字符串类型的参数并且返回一个字符串。

  在客户端,为了初始化回调功能,需要调用一个特殊的JavaScript函数。你可以通过调用ClientScriptManager.GetCallbackEventReference来获得一个到这个特殊的JavaScript函数的引用。到GetCallbackEventReference的调用将产生一个回调引用。当调用此回调函数时,你只需要传递一个字符串类型的参数。这是与服务器端的RaiseCallbackEvent签名一致的。这就是你在客户端建立回调机制所需做的一切。其它的把客户端回调函数钩(hook up)到服务器端的IcallBackEventHandler接口的RaiseCallbackEvent方法的实现则是由框架来完成的。前面提到的初始化回调机制的特殊JavaScript函数使用了另外两个参数(__CALLBACKPARAM和__CALLBACKID)作为回馈数据,它们分别代表传递到调用者的字符串参数和控件的ID。在服务器端,ASP.NET检测其它两个参数的存在并且会把请求路由到适当的控件,这将导致调用目标控件上的RaiseCallbackEvent方法。为了解决前面提到的页面上的控件的初始化问题,ASP.NET运行时刻在服务一次回调时提供了一个简化版本的HttpPage生命周期。这一周期包括浏览页面初始化的某个具体阶段,观察状态加载,页面加载和回调函数事件处理等。一旦回调函数事件被控件所处理,HttpPage生命周期的其它阶段就会被跳过。

  为了帮助更好地理解ASP.NET 2.0的回调机制,发行包中包括了一个简单的进度条控件,它依靠回调来决定服务器确定的一项任务的状态。下面的列表1显示了该ProgressBar控件的代码。为了支持客户端回调函数,这个控件实现了ICallbackEventHandler接口。为了演示之目的,RaiseCallbackEvent方法实现简单地查找存储在会话中的一个计数器,每次给计数器加1,并且把新值返回到客户端。最后,列表2显示了负责初始化该回调函数的JavaScript代码。它使用了this.Page.ClientScript.GetCallbackEventReference来获得一个到需要初始化回调的函数的安全引用。

  列表1:ProgressBar.cs

public class ProgressBar : System.Web.UI.Control, System.Web.UI.ICallbackEventHandler{
private int PercentCompleted{
 get
 {
  if System.Web.HttpContext.Current.Session["PercentComplete"] == null) {
   System.Web.HttpContext.Current.Session["PercentComplete"] = 1;
 } 
 else {
  System.Web.HttpContext.Current.Session["PercentComplete"] =(int)System.Web.HttpContext.Current.Session["PercentComplete"] + 1;
 }
 return (int)System.Web.HttpContext.Current.Session["PercentComplete"];
}
set
{
 System.Web.HttpContext.Current.Session["PercentComplete"] = 1;
}
}
public string RaiseCallbackEvent(string eventArguments) {
 int percent = this.PercentCompleted;
 if (percent > 100)
 {
  this.PercentCompleted = 1;
  return "completed";
 }
 else
 {
  return percent.ToString() + "%";
 }
}
protected override void OnPreRender(EventArgs e) {
 this.Page.ClientScript.RegisterClientScriptBlock(typeof(ProgressBar),
"ProgressBar", this.GetClientSideScript(), true);
 base.OnPreRender(e);
}
protected override void Render(HtmlTextWriter writer) {
 System.Text.StringBuilder sb = new StringBuilder();
 sb.Append(@"<table id=""ProgressBarContainer"" bgcolor=""LightSteelBlue""
 border=""0"" width=""400"" style=""DISPLAY:none; POSITION: absolute;
 Z-INDEX: 10"">");
 sb.Append(@"<tr><td colspan=""3"" style=""padding:3px 2px 2px 10px"">");
 sb.Append(@"<font face=""Verdana, Arial, Helvetica, sans-serif"" size=""2"">");
 sb.Append(@"<span id=""ProgressBarLabel"">Uploading...</span>");
 sb.Append(@"</font></td></tr><tr><td>");
 sb.Append(@"<font size=""1""> </font></td><td bgcolor=""#999999""
 width=""100%"">");
 sb.Append(@"<table id=""ProgressBar"" border=""0"" width=""0""
 cellspacing=""0"">");
 sb.Append(@"<tr><td style=""background-image:url(progressbar.gif)"">
 <font size=""1""> </font></td>");
 sb.Append(@"</tr></table></td>");
 sb.Append(@"<td><font size=""1""> </font></td></tr>");
 sb.Append(@"<tr height=""5px""><td colspan=""3""></td></tr>");
 sb.Append(@"</table>");
 writer.Write(sb.ToString());
 base.Render(writer);
}
private string GetClientSideScript() {
 System.Reflection.Assembly dll =
 System.Reflection.Assembly.GetExecutingAssembly();
 StreamReader reader;
 reader = new StreamReader(dll.GetManifestResourceStream("ProgressBar.txt"));
 StringBuilder js = new StringBuilder(reader.ReadToEnd());
 string fp = this.Page.ClientScript.GetCallbackEventReference(this, "", "UpdateProgressBar", "");
 js.Replace("##InitiateCallBack##", fp);
 reader.Close();
 return js.ToString();
}
}

  列表2:ProgressBar.js

<script language="javascript">
var isCompleted=false;
//这个函数初始化到服务器端的回调
function DrawProgressBar(){
 ##InitiateCallBack##;
 if (!isCompleted) {
  window.setTimeout('DrawProgressBar()',200);
 }
 else
 {
  isCompleted=false;
  document.getElementById("ProgressBarContainer").style.display = 'none';
 }
}
//当thecallback完成时,下列函数被调用
function UpdateProgressBar(percent){
 if (percent == 'completed'){
  isCompleted=true;
 }
 else{
  document.getElementById("ProgressBar").width = percent;
 }
}

  通过使用在ASP.NET 2.0提供的客户端回调函数,实现进度条控件是比较直接的,因为在控件和客户端之间传递的数据仅是一个简单的字符串。然而,一旦我们把其它数据类型也添加到其中,我们就遇到在JavaScript和.NET类型系统之间不匹配的问题。遗憾的是,ASP.NET 2.0中的回调函数实现对此并无多大帮助。任何想使用多种数据类型(简单类型和复杂类型)的应用程序,都要实现一种自己的定制模式。

  幸好,这种限制能够通过使用一个AJAX.NET开源库来加以克服,AJAX.NET实现了一种基于代理的方式来调用服务器端函数。AJAX.NET定义了一种称为AJAXMethod的定制属性。当一个服务器端方法用AJAXMethod加以修饰时,一个基于JavaScript的客户端代理将被HttpHandler(它是AJAX.NET库的一部分)自动生成。不同于ASP.NET 2.0,它支持单个参数的字符串类型以便用于回调实现。AJAX.NET支持整数,字符串,双精度数,DateTime,DataSet等多种类型。

  Bertrand Le Roy建议使用AJAX.NET来处理JavaScript和.NET类型系统之间的差别。他创建了一种称为EcmaScriptObject的服务器端控件-它基于.NET技术重新创建了JavaScript类型系统。其想法是,用.NET重新生成一种客户端对象图。当转换发生在服务器端时,这种方法显得更有意义。

  即使我们有了一种类型安全的方法来调用回调函数,但是,我们还面临其它的挑战。JavaScript担当起了把AJAX应用程序的各个部分组合到一起的"胶水"的作用。当然,相应地,对JavaScript的依赖性也进一步增加。遗憾的是,尽管JavaScript是一种强有力且通用的语言,但是它并没有实现面向对象的原则。这意味着,要实现代码重用可能更为困难。当然,可以使用一些技巧来使JavaScript看上去更象传统的面向对象语言。不过即使如此,要实现托管语言中的例如事件和代理等特征仍然相当困难。

  其它困难还包括:缺乏一个可重用框架来进一步提高JavaScript的开发效率。如果有一种基于JavaScript的能够隐蔽不同执行环境区别的UI框架或许更好些。另外,如果能够创建一组类,它们可以用一种安全的方式(相对于手工编码SOAP包并使用XMLHttp来传递它们)来调用Web服务,也会相当不错。

  最近来自微软的Atlas工程许诺要重点解决这类问题。这是一种极大程度地简化AJAX风格开发的伟大尝试。Atlas提供了一种新的JavaScript框架(注意,下面是基于微软的一次初步宣布,以后有可能发生改变)-UI开发工具包。这其中包括:支持诸如拖放和数据绑定等特征的常用控件;调用Web服务的SOAP栈;隐蔽浏览器差别的浏览器兼容层;包括例如本地缓冲等内容的客户端构建模块。另外,ASP.NET团队还计划为ASP.NET开发其它构建模块,例如配置管理,成员管理等,以便把它们用作Web服务端点,从而实现可以直接从JavaScript中对Web服务进行存取-例如可以容易地从客户端存取个人信息。最后,Atlas工程还计划扩展JavaScript语法以便包括接口、生命周期管理和multicast事件。

  据说,接下来的几个月将是令AJAX开发者激动的日子。因此,我非常希望本文能够激起您对AJAX的兴趣,并在你以后构建下一代Web应用程序时优先考虑使用这一技术。

posted @ 2006-06-08 22:50 一个春天 阅读(500) 评论(1) 编辑

Web2.0时代,RSS你会用了吗?

如见Web2.0被吵的如火如荼,同时也有很多的评论褒贬不一。有人说Web2.0就是“一帮人在看皇帝的新装而已”。也有人说Web2.0将是一场变革。无论这些争论有没有价值,但我相信,存在就有它的必然性。也许Web2.0更像是一种商业模式,一个观念的变革而非技术。
     不管怎样,它来了,你准备好了吗?
     说到Web2.0,就会提到Blog、TAG、SNS、RSS、wiki这些软件应用和xml、ajax等这些新理论和技术实现。
RSS毋容置疑就是其重要的应用之一。

     那么什么是RSS?它到底有什么用呢?

     RSS是站点与站点之间共享内容的一种简易方式(也称为“聚合内容”),通常被用于新闻和其他按顺序排列的网站,例如Blog网站。网站提供RSS输出,有利于让用户发现网站内容的更新。网站用户可以在客户端借助于类似新闻资讯阅读器等支持RSS的新闻聚合工具软件,在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。
     RSS是基于XML的一种形式。并且所有的RSS文件都要遵守万维网联盟(W3C)站点发布的XML 1.0规范。具体格式可以查一下RSS 2.0规范,这里就不再重复粘贴了。

下面是我总结的几种RSS的技术实现代码:

1.在线生成RSS聚合页

(1)创建Rss.aspx
<%@ Page language="c#" Codebehind="Rss.aspx.cs" AutoEventWireup="false" Inherits="LiTianPing.Rss" %>
只留下这一行,其余的都删掉。

(2)后台代码;Rss.aspx.cs

  private void Page_Load(object sender, System.EventArgs e)
  {    
   Response.ContentType="text/xml";
   Response.Write(GetRSS());
  }

  /// <summary>
  /// 取得聚合文章
  /// </summary>
  /// <returns></returns>
  public string GetRSS()
  {
   News t=new News();//自己的业务类
   DataSet ds=t.GetListByClass(1);//根据类别得到数据
   
   StringBuilder strCode=new StringBuilder();
   strCode.Append("<?xml version=\"1.0\" encoding=\"utf-8\" standalone=\"yes\" ?>");
   strCode.Append("<rss version='2.0' xmlns:dc=\"http://purl.org/dc/elements/1.1/\"");
   strCode.Append(" xmlns:trackback=\"http://madskills.com/public/xml/rss/module/trackback/\" ");
   strCode.Append(" xmlns:wfw=\"http://wellformedweb.org/CommentAPI/\" xmlns:slash=\"http://purl.org/rss/1.0/modules/slash/\">");
   strCode.Append("<channel>");
   strCode.Append("<title>李天平RSSDemo</title>");
   strCode.Append("<link>http://"+Request.ServerVariables["SERVER_NAME"]+"</link> ");
   strCode.Append("<description>天道酬勤</description> ");  
   strCode.Append("<copyright>Copyright 2005</copyright> ");      
   
   foreach(DataRow row in ds.Tables[0].Rows)
   {
    string Id=row["Id"].ToString();
    string title=row["title"].ToString();
    string description=row["description"].ToString();
    string pubdate=row["pubdate"].ToString();
    string ClassId=row["ClassId"].ToString();
    //string author=row["author"].ToString();

    strCode.Append("<item>");
    strCode.Append("<title>"+title+"</title>");
    strCode.Append("<link>http://"+Request.ServerVariables["SERVER_NAME"]+"/NewsShow.aspx?ID="+Id+"</link>");
    strCode.Append("<subject>"+description+"</subject>");
    strCode.Append("<description><![CDATA["+description+"]]></description>");    
    strCode.Append("<PubDate>"+pubdate+"</PubDate>");
    strCode.Append("<category>"+ClassId+"</category>");
    strCode.Append("</item>");    
   }
   strCode.Append("</channel>");
   strCode.Append("</rss>");  
   return strCode.ToString();
  }

 (3) XmlTextWriter实现方式2;Rss.aspx.cs

  string xmlDoc="rss.xml"; 
 private void Page_Load(object sender, System.EventArgs e)
  {    
   xmlDoc=Server.MapPath(".")+xmlDoc;   
   GetRSS2();
   XmlDocument doc= new XmlDocument();
   doc.Load(xmlDoc);
   Response.ContentType = "text/xml";
   doc.Save(Response.Output);
  }
  /// <summary>
  /// 取得聚合文章
  /// </summary>
  /// <returns></returns>
  public void GetRSS2()
  {
   News t=new News();
   DataSet ds=t.GetListByClass(1);
   
   XmlTextWriter writer = new XmlTextWriter(xmlDoc,Encoding.UTF8);
   writer.Formatting = Formatting.Indented;
   writer.WriteStartDocument(true);
   writer.WriteComment("RSS页的实现");
   writer.WriteStartElement("rss");
   writer.WriteAttributeString("version","2.0");      
   writer.WriteStartElement("channel");   
   writer.WriteStartElement("title");
   writer.WriteString("李天平RSSDemo");
   writer.WriteEndElement();
   writer.WriteStartElement("link");   
   writer.WriteString("http://"+Request.ServerVariables["SERVER_NAME"]);
   writer.WriteEndElement();   
   writer.WriteStartElement("description");
   writer.WriteString("天道酬勤");
   writer.WriteEndElement();
   writer.WriteStartElement("copyright");
   writer.WriteString("Copyright 2005");
   writer.WriteEndElement();
   writer.WriteStartElement("language");
   writer.WriteString("zh-cn");
   writer.WriteEndElement();  
      
   foreach(DataRow row in ds.Tables[0].Rows)
   {
    string Id=row["Id"].ToString();
    string title=row["title"].ToString();
    string description=row["description"].ToString();
    string pubdate=row["pubdate"].ToString();
    string ClassId=row["ClassId"].ToString();
    //string author=row["author"].ToString();

    writer.WriteStartElement("item");
    writer.WriteStartElement("title");
    writer.WriteString(title);
    writer.WriteEndElement();
    writer.WriteStartElement("link");
    writer.WriteString("http://"+Request.ServerVariables["SERVER_NAME"]+"/NewsShow.aspx?ID="+Id) ;
    writer.WriteEndElement();
    writer.WriteStartElement("description");
    writer.WriteCData(description);
    writer.WriteEndElement();
    writer.WriteStartElement("pubDate");
    writer.WriteString(pubdate);
    writer.WriteEndElement();
    writer.WriteStartElement("category");
    writer.WriteString(ClassId);
    writer.WriteEndElement();
    writer.WriteEndElement();  
   }
   writer.WriteEndElement();
   writer.WriteEndElement();
   writer.Flush();
   writer.Close();
 
  }
2.在线RSS阅读获取。

页面代码:
  <P style="FONT-SIZE: 11px">
   Feed种子:<asp:TextBox id="FeedUrl" runat="server" Width="440px"></asp:TextBox><BR>
   显示条数:<asp:TextBox id="Num" runat="server" Width="48px"></asp:TextBox></P>
  <P style="FONT-SIZE: 11px">
   <asp:Button id="GetFeed" runat="server" Text="获得RSS"></asp:Button><BR>
   <BR>
   <asp:Label id="RssFeed" runat="server"></asp:Label></P>

后台代码:
  /// <summary>
  /// 获得要显示的Feed种子数据
  /// </summary>
  /// <param name="RssUrl"></param>
  /// <param name="showNewsCount"></param>
  /// <returns></returns>
  public string LoadRSS(string RssUrl, int showNewsCount)
  {
   string strRssList = "";
   string strMsg;
   try
   {      
    XmlDocument objXMLDoc = new XmlDocument();   
    objXMLDoc.Load(RssUrl);  
    XmlNodeList objItems = objXMLDoc.GetElementsByTagName("item");    
  
    if(showNewsCount > 30)
     showNewsCount = 10;  
    if(showNewsCount < 1)
     showNewsCount = objItems.Count;
  
    string title="";
    string link=""; 
    int i;

    if(objXMLDoc.HasChildNodes == true)
    {
     i = 1;
        foreach(XmlNode objNode in objItems)
     {
      if(i<=showNewsCount)
      {
       if(objNode.HasChildNodes == true)
       {
        XmlNodeList objItemsChild = objNode.ChildNodes;
        foreach(XmlNode objNodeChild in objItemsChild)
        {
         switch(objNodeChild.Name)
         {
          case "title":
           title = objNodeChild.InnerText;
           break;
          case "link":
           link = objNodeChild.InnerText;
           break;          
         }         
        }
        i = i+1;
        strRssList += "<a href=" + link +" target=_blank>" + title + "</a><br>"; 
       }      
      }
     }       
    }
    strMsg = strRssList;
   }
   catch
   {
    strMsg = "RSS Feed 源数据出错!";
   }
   return strMsg;
  }

  //获取按钮,获取指定RSS
  private void GetFeed_Click(object sender, System.EventArgs e)
  {
   if(FeedUrl.Text == "")//RSS地址
   {
    RssFeed.Text = "信息源不能为空,您可刷新重试或联系管理员!";
    return ;
   }  
   RssFeed.Text = LoadRSS(FeedUrl.Text,Convert.ToInt32(Num.Text)); //获取指定数目 
  }

3.无刷新动态更新的在线RSS阅读获取

<%@ Page language="c#" Codebehind="XmlHttp.aspx.cs" AutoEventWireup="false" Inherits="LiTianPing.XmlHttp" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" >
<HTML>
 <HEAD>
  <title>XmlHttp</title>
  <meta name="GENERATOR" Content="Microsoft Visual Studio .NET 7.1">
  <meta name="CODE_LANGUAGE" Content="C#">
  <meta name="vs_defaultClientScript" content="JavaScript">
  <meta name="vs_targetSchema" content="http://schemas.microsoft.com/intellisense/ie5">
  <style>td { font-size: 9pt}
  </style>
  <script>
  <!-- 
  var oDiv
  var xh    
  function getXML()
  {   
   xh =new ActiveXObject("Microsoft.XMLHTTP");
   oDiv = document.getElementById("rssitem");
   oDiv.style.display= "";
   try
   {
    //如果是本地改成下面语句直接读取
    //xh.open("GET","/Rss.aspx",false);    
    xh.open("GET","Http://ltp.cnblogs.com/Rss.aspx",false);
    xh.send(null);
    loadData(xh,oDiv);
   }
   catch(e)
   {
    error(oDiv);
   }
  }
  function loadData(xh,oDiv)
  {
   if (xh.readyState == 4)
   {
    xml = xh.responsexml;
    var i;
    var nodes = xml.selectNodes("/rss/channel/item");
    var bloglink = xml.selectSingleNode("/rss/channel/link").text;
    oDiv.innerHTML = "";
    var html;    
    for(i=0;i<nodes.length;i++)
    {    
        
      html += "<div >";
      html += "    <div >";
      html += "        <a class=font1 href='" +nodes[i].selectSingleNode("link").text + "' target='_blank'>" + nodes[i].selectSingleNode("title").text +"</a><BR><BR>";
      html += "    </div>";
      html += "    <div >";
      html += "        " +nodes[i].selectSingleNode("description").text;
      html += "    </div>"           
      //html += "    </div>";
      html += "</div><hr>";

    }
    oDiv.innerHTML = html;
   }
   else
   {
    error(oDiv);
   }
  }

  function error(oDiv)
  {
   oDiv.innerHTML = "载入失败";
  }
  -->
  </script>
 </HEAD>
 <body MS_POSITIONING="GridLayout" onload="window.setTimeout('getXML()',200);">
  <form id="Form1" method="post" runat="server">
   <div align=center>
   <table cellpadding="0" cellspacing="0" border="0" width="80%">
    <tr>
     <td>
      <div id="rssitem" style="WIDTH:80%">数据载入中...</div>
     </td>
    </tr>
   </table>
   </div>
  </form>
 </body>
</HTML> (作者:李天平    转载请注明)



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=723682

posted @ 2006-06-08 22:47 一个春天 阅读(230) 评论(2) 编辑

web2.0开源代码

来源:http://blog.donews.com/yanhui/archive/2006/05/17/873226.aspx

如今web2.0在互联网上发展迅速(这里提到的web2.0不包括blog,wiki),但出于利益的考虑,很多都考虑商业化运作和商业化发布,鲜少有web2.0的开源项目,而国内就更少了(都忙于模仿和商业运作去了),此外这类开源项目都是基于PHP平台,只有国内才做了一些ASP平台的。这里介绍几个,如果这里还有些你知道的未列出,请补充
Diggclone-开源digg类程序
官方:http://www.talkingpixels.org/diggclone/index.php
演示:同digg.com类似
Aroundme-开源社会化网络程序官方:https://savannah.nongnu.org/projects/aroundme/
演示:http://www.barnraiser.org/demos/
(社会化网络程序通常都是收费的,相信这个是目前唯一免费的social netwokr项目啦)
Lilina–开源RSS聚合器
官方:http://lilina.sourceforge.net/
演示:http://www.chedong.com/
Gregarius–开源RSS聚合程序
演示:http://rss.gregarius.net/
官方:http://gregarius.net/
插件:http://plugins.gregarius.net/
风格:http://themes.gregarius.net/
论坛:http://forums.gregarius.net/
帮助:http://wiki.gregarius.net/
Sa.bros.us-开源网络书签(PHP)
官方:https://sourceforge.net/projects/sabrosus/
汉化演示:http://www.sluke.cn/demo/monousuario/
Freedmarks -开源网络书签(ASP)(国内)
官方:http://www.purewhite.cn/
演示:http://www.freedmarks.com/
Scuttle -开源网络书签(PHP)
官方:http://sourceforge.net/projects/scuttle
演示:http://scuttle.org/
Yogurt-开源社会化网络门户
官方:http://yogurt.sourceforge.net/
来源:http://www.goldtimes.net/news/view.asp?ID=669&cataid=2
摘自网上,我测试的时候有几个暂时打不开.

 

 

http://blog.vasky.net/trackback.asp?tbID=38



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=743397

posted @ 2006-06-08 22:42 一个春天 阅读(1834) 评论(0) 编辑

Web 2.0 编程思想:16条法则

原文:Thinking in Web 2.0: Sixteen Ways
作者:Dion Hinchcliffe

1、在你开始之前,先定一个简单的目标。无论你是一个Web 2.0应用的创建者还是用户,请清晰的构思你的目标。就像“我需要保存一个书签”或者“我准备帮助人们创建可编辑的、共享的页面”这样的目标,让你保持最基础的需求。很多Web 2.0应用的最初吸引之处就是它的简单,避免并隐藏了那些多余的复杂性。站在创建者的立场,可以想象Google的几乎没有内容的主页,还有del.icio.us的简单的线条。从最终用户的角度来看,与之齐名的就是Diggdot.us所提供的初始化页面。你能够并且希望加入更多功能,但是先做好最开始的。在一个时候只做一个特性,完成一个目标。这听起来很太过于单纯化了,但它将使你更加专注,而且你也会明白我的意思。

2、链接是最基础的思想。这就是我们称之为Web的一个理由。链接是把Web中各种实体连接起来的最基本的元素。你的信息、你的关系、你的导航,甚至是能够被写成URL的任何内容。这里有一个链接应该遵循的规则(其实你也不必严格的遵守):

1. Web上的任何东西都是可以被URI或者是URL所连接的。
2. 把所有的链接都保存为他的原始出处,这样可以让你与任何人、在任何地方、任何时候都能分享它。
3. 第二条中任何时候的前提是链接必须是持久的,它不会在没有任何缘由的情况下被改变或者是消失。
4. 链接应该是人类可读的、稳定的、并且能够自我诠释的。

3、数据应该属于创建它的人。是的,你听我的。任何用户创建的、贡献的或分享的都是他们自己的,除非他们很明显的放弃这个权力来让你自由处置。他们贡献到Web上的任何信息都应该是可编辑的、能被删除的、并且能够取消共享,无论在任何时候,只要用户愿意。这也包含了那些间接的数据,像他们所关心的记录、日志、浏览历史、网站访问信息,或者是任何可以被跟踪的信息。所有的网站必须清晰简单的陈诉那些信息是用户创建的,并且提供他们停止创建的方法,甚至是清除的方法。

4、数据优先,体验与功能其次。无论它是文本、图片、音频还是视频,Web最终还是把这些解析为数据。换句话说,你无法脱离数据去呈现内容。所有这些数据都通过那些易于发现的URL来定位(参见第2条)。通过另一种形式来看待这些,Web最终是名词优先,动词其次,虽然最近正在向动词偏移。来看看名词的例子:日历的条目、家庭照片、股票价格。还有一些动词的例子:定一个约会、共享一张图片、买一份股票。

5、做好积极分享一切的准备。尽可能的分享一切,你所拥有的所有数据,你所提供的所有服务。鼓励不遵循原有意图的使用,提倡贡献,不要那些需要分享的内容坚持设置为私有的。在分享与发现之后,提供易于使用的浏览方式是显而易见的需求。为什么呢:话说回来,你会从别人的共享之中受益匪浅。注意:这里没有许可让你去侵犯版权保护的法律,你不能够去分享你刻录的DVD或者是拥有商业版权音乐,因为你已经同意不会去分享这些东西。但是你可以发现并分享那些完全开放的媒体内容。一个小小的建议,你可以学习一下Creative Commons license(共创协议).

6、Web是一个平台;要让它成长。当然,我们还有很多其他的平台(Windows、Linux、Mac),但是那些已经不是重点了。换句话说,Web是无法脱离的平台,不会中断的平台,你可以通过各种方式去扩展的平台。你在Web上提供的数据与服务将会成为Web一部分,最终你会在Web平台的某一处扮演你的角色。扮演好你的角色并照顾好后来者。

7、理解与信奉“阶梯性”。现在的Web越来越大,几乎蔓延到了全世界的所有国家,并且已经拥有了10亿用户。我的观点是Web的各个组成部分存在着细微的区别和不同,就像不同地方的用户那样。例如Web的设计部分:易用性永远优先于速度、可靠性、重用性与可集成性。你也应该提供同样的体验给你的用户。它已经被一次又一次的被人们在文档中强调,忠诚的用户很快会成为专业的用户,他们期待更快的速度还有更多。退一步支持他们。同样,也有很多很多的用户会进入这个阶梯的底端,如你所期待的那样。他们可能不会说你的语言,不熟悉你的文化,甚至不知道是如何到这里的。所以你需要向他们表达清楚。

8、任何东西都是可编辑的。或者是它应该被编织的更好。要确定的是,只有很少的东西是不能被编辑的,剩下的都可以,这是一个可写的Web。这并不意味着原始内容的丢失,而通常被理解为用户能够很容易的对内容加以评论,或者评注内容是在那里发现的。如果你对此应用的好,他们能够比你所想象的做的更多(把内容串起来并且给予原始内容来创建自己的,等等)。

9、Web上的身份是神圣的。不幸的是,这并不意味着你能够得到更多的隐私(这完全是上个世纪的想法)。但对身份的验证是必要的,你应该感谢那些只需一个邮件地址就能确定你身份的服务。这意味只要你对你的用户承诺了,你就必须保证他们的隐私安全。必要的时候,在这个世界的某处你还得为你的用户挺身而出,向当地的权威挑战。如果你没有打算那样做,你就得把实际情况告诉你的用户。另一方面,如果身份是必须的,不要试图伪装它,不然在某一天我们将会在Web上放弃我们的最后一点点隐私的权利。

10、了解流行的标准并且使用他们。从一个消费者或者是创作者的立场来看,数据将会以不同的格式与任何一个人交换。同时这样的数据也会反过来促进标准的完善与采纳。这通常意味像RSS、 OPML、XHTML、Simple XML、JSON等简单标准的流行,而避免SOAP、XSD,还有RDF、ATOM也一样,使用它们会给我的内心带来痛苦。请你也为你所钟爱的标准投上一票来支持它们。

11、遵循无意使用的规律。如果你把非常有趣的数据和服务用广泛使用的格式开放和共享出去,你将会得到你所应得的,其他人也将会基于你的那一块Web平台来构建。或许还会从别人那里得到更多,所以为这个做一下准备比较好。我已记不清有多少次我看到一个播客(podcasting)服务因为流行过渡而导致服务垮掉,就是因为他们被 Slashdot和del.icio.us给收录了。这一点要知道:网络上的大量化意味着如果一个内容非常有趣,即使是一个很小的角落也会得到惊人的访问量。鼓励使用这种方式,它还是非常有价值的,前提是你要有所准备。

12、粒化你的数据与服务。我们应该在很早以前就明白这些,大规模集成的数据仅仅适用于无需管理的下载与批量操作。分解你的数据,让他们独立成可描述的URL地址,对你的服务也一样。反过来说,你不要创建一些巨大的、复杂的、像圣诞树那样的数据结构和服务。保持简单,要非常的简单。让这些分离的片断能够容易的被重组和发现。

13、提供用户能够单独受益的数据和服务。渐渐依赖于这种社会化参与是存在风险的,你需要让你的用户有一点点动机来贡献时间、热情和信息,除非他们能够直接受益。社会化分享比个体行为的利益大很多,除非你能够激发用户的个人动机,否这你将无法享受这份厚礼。

14、让用户组织并过滤信息。不一定是必须的,但却是非常重要的。让用户以他们自己的方式来标注和组织数据,因为你自己是永远无法及时的处理他们的。用户会按照他们自己理解的最佳方式来处理并构建。要保证你的Web服务能够按照用户所需所想的方式来工作。这也是标签(tagging)和通俗分类(folksonomies )的方式如此成功的主要因素。

15、提供丰富的用户体验。Web一直都在和本地的应用程序进行着激烈的竞争。为什么?因为本地程序还是感觉上好一些,速度也快一些。但是这不会长久的(确信在5年或者15年后,这种竞争就不存在了)。是的,我在谈论Rich Internet Applications, Ajax, 还有那些不可思议的交互应用。他们让Web成为了一个真正的“无平台”的平台,如果你知道我是怎么想的。

16、信奉并支持快速改进和反馈。这个通常意味着加快步伐,但也意味着使用轻量级的工具、技术和不要做出那些适得其反的痛苦决定(例如使用一个被层层环绕的Ajax框架来代替可以通过混合来实现的,或者用C++来构建所有的东西,其实使用Ruby会更好一些)。这同时也意味着需要一个非常快速的方式来处理错误报告,修复Bug,释放新版本。从一个用户的角度来看,报告你所发现的任何问题,还有那些你经常抱怨的地方,甚至那些都不是一个Bug。

当然,Web 2.0是一个极其广泛和深奥的话题,没有一个人能够列举出它的所有重点和特征。如果你对此充满了兴趣,请花一点时间来补充我没有提到的地方。我想这就是Web 2.0的参与性吧!

原作者的这个标题借鉴了Bruce Eckel的两本畅销书的名字:《Thinking in C++》和《Thinking in Java》,《C++编程思想》与《Java编程思想》,在此说明一下为什么要这样翻译这个题目:)

indigo 翻译整理



Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=775656

posted @ 2006-06-08 22:37 一个春天 阅读(140) 评论(0) 编辑

Web2.0简介

Web2.0是以Flickr、43Things.com等网站为代表,以Blog、TAG、SNS、RSS、wiki等社会软件的应用为核心,依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。”

Blog——博客/网志:Blog的全名应该是Web log,后来缩写为Blog。Blog是一个易于使用的网站,您可以在其中迅速发布想法、与他人交流以及从事其他活动。所有这一切都是免费的。

RSS——站点摘要:RSS是站点用来和其他站点之间共享内容的一种简易方式(也叫聚合内容)的技术。最初源自浏览器“新闻频道”的技术,现在通常被用于新闻和其他按顺序排列的网站,例如Blog。

WIKI——百科全书:Wiki--一种多人协作的写作工具。Wiki站点可以有多人(甚至任何访问者)维护,每个人都可以发表自己的意见,或者对共同的主题进行扩展或者探讨。

Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。

网摘:“网摘”又名“网页书签”,起源于一家叫做Del.icio.us的美国网站自2003年开始提供的一项叫做“社会化书签”(Social Bookmarks)的网络服务,网友们称之为“美味书签”(Delicious在英文中的意思就是“美味的;有趣的”)。

SNS——社会网络:Social Network Sofwaret,社会性网络软件,依据六度理论,以认识朋友的朋友为基础,扩展自己的人脉。

P2P——对等联网:P2P是peer-to-peer的缩写,peer在英语里有“(地位、能力等)同等者”、“同事”和“伙伴”等意义。这样一来,P2P也就可以理解为“伙伴对伙伴”、“点对点”的意思,或称为对等联网。目前人们认为其在加强网络上人的交流、文件交换、分布计算等方面大有前途。

IM——即时通讯:即时通讯(Instant Messenger,简称IM)软件可以说是目前我国上网用户使用率最高的软件。聊天一直是网民们上网的主要活动之一,网上聊天的主要工具已经从初期的聊天室、论坛变为以MSN、QQ为代表的即时通讯软件。

RSS为Really Simple Syndication(简易供稿)的缩写,是某一站点用来和其它站点之间共享内容的一种简易方式,也叫聚合内容。网络用户可以在客户端借助于支持RSS的新闻聚合工具软件(例如SharpReader NewzCrawler、FeedDemon RSSReader),在不打开网站内容页面的情况下阅读支持RSS输出的网站内容。可见,网站提供RSS输出,有利于让用户发现网站内容的更新。在高速高质高效成为主流呼声的互联网时代,RSS无疑推动了网上信息的传播,提出了另一种看世界的方式。

RSS,原意是把网站内容如标题、链接、部分内文甚至全文转换为可延伸标示语言(XML:eXtensible Markup Language)的格式,以向其它网站供稿,使用者可以用一般的浏览器观看,也可以用特殊的“阅读器”软件来阅读。

-----------------------------------------------------------------------------------------------

历史很重要。对一个技术的学习也应当从历史出发,通过其在时间形成历史的流变,得以知晓现状,甚至能够预知未来。

那Web1.0是什么呢?

他们说,记得静态HTML的WWW时代么?

(那个时代的WWW应用、人们的Web体验、对社会的影响如何?)

那么动态HTML和静态HTML下的Web相比,是多少版本?1.5?对了,他们是真这么叫的。

(在效果和影响上,与1.0相比,扩展和加深多少?)

要呈现的数据存储在数据库中,通过Web服务端的程序,应用户的请求,取出数据,加上事先设计的模板,动态的生成Html代码,发送到用户的浏览器那里。

他是1.0系列,应为用户在浏览器中所见和Web1.0一样,它有0.5的升级,因为数据不是事先制作并发布,而是动态生成,和用户的需要交互生成。

那好,再加0.5,到Web2.0,变化是在哪里呢?

(看到了正在崛起的和改变的,会继续朝着什么方向改变互联网和社会呢?)

更新:关于各个版本的差别,看看亚马逊的例子。

事情没有那么幸运,Web2.0并不是一个具体的事物,而是一个阶段,是促成这个阶段的各种技术和相关的产品服务的一个称呼。所以,我们无法说,Web2.0是什么,但是可以说,那些是Web2.0。

WikiPedia的Web2.0条目下列出了这些条件:

*CSS和语义相关的XHTML标记

*AJAX技术

*SyndicationofdatainRSS/ATOM

*AggregationofRSS/ATOMdata

*简洁而有意义的URLs

*支持发布为weblog

*RESTian(preferred)或者XMLWebserviceAPIs

*一些社会性网络元素

必须具备的要素有:

*网站应该能够让用户把数据在网站系统内外倒腾。

*用户在网站系统内拥有自己的数据

*完全基于Web,所有的功能都能透过浏览器完成。

(以上内容引用自英文版维基百科)

虽然这只是一家之言,不过,对于其中谈到的几个要素,大家还是公认的。

-基于RSS/ATOM/RDF/FOAF等XML数据的同步、聚合和迁移。

数据不再和页面和网站混粘在一起,它独立了,它跟着用户走。这是Web2.0的很重要特征。这也是为什么Blog是Web2.0的代表的原因。在网志上,常主角的是相互独立的一则则的网志。

独立,然后有物理表现。现在,就能让他们活跃起来。透过对XML数据的处理,这些内容能被自由的组合,被各种应用程序,不论是Web程序还是桌面程序等呈现和处理。

当然,最重要的是背后的人。

-社会性因素。

内容跟着人走,内容又能够被用户自由的组合,也就是说,用户能够自由的借助内容媒介,创建起一个个的社群,发生各种社会性的(网络)行为。

此外还有标签以及建立在开放标签系统之上的Folksonomy。

-第三个公认的因素是开放API,

这个技术性稍强些,得另花时间研习,可以先看看例子:amazon、flickr、googlemap等。

从Web应用的产品/服务生产者角度来说,该如何创建Web2.0的产品呢?

重要的是要抓住这么几点,一个是微内容(这里有定义),一个是用户个体。除了这两个最基本的之外,还可以考虑社群内的分享以及提供API。



微内容:英文是microcontent。用户所生产的任何数据都算是微内容,比如一则网志,评论,图片,收藏的书签,喜好的音乐列表、想要做的事情,想要去的地方、新的朋友等等。这些微内容,充斥着我们的生活、工作和学习,它的数量、重要性,还有我们对它的依赖,并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。

对微内容的重新发现和利用,是互联网所开创的平等、民主、自由风气的自然衍生,也是互联网相关技术消减信息管理成本之后的一个成果。

我们每天都生产众多的微内容,也消费着同样多的微内容。对于Web2.0来说,如何帮助用户管理、维护、存储、分享、转移微内容,就成了关键。

用户个体。对于Web1.0的典型产品/服务来说,用户没有具体的面貌、个性,它只是一个模糊的群体的代名词而已。但是对于Web2.0的产品和服务来说,用户是个实实在在的人。Web2.0所服务的,是具体的人,而不是一个如同幽灵般的概念。并且,这个人的具体性,会因为服务本身而不断地充实起来。

如何为这个具体的个体服务,是Web2.0设计的起点。

因此,一类可以被称作Web2.0的产品/服务将是这样:

服务于用户个体的微内容的收集、创建、发布、管理、分享、合作、维护等的平台。

其他的呢?恐怕就设计到好些人提到的,微内容的XML表现;微内容的聚合;微内容的迁移;社会性关系的维护;界面的易用性等等。

以及是否就是开源、参与、个人价值、草根、合作等等?

Web2.0是许多方面起头并进又相互牵连的一个新的阶段的到来。因此,不同的人,有着不同的看法。那么,对于Web开发人员来说,Web2.0意味着什么呢?

他们说Web2.0阶段,Web是一个平台,或者说,Web正在变得可编程,可以执行的Web应用。野心家们设想这个它的终极目标是WebOS。

Web1.0时候,Web只是一个针对人的阅读的发布平台,Web由一个个的超文本链接而成。现在的趋势发生了变化,Web不仅仅是Html文档的天下,它成了交互的场所。

Web2.0Conference网站的横幅引用JeffBezos的话说“Web1.0ismakingtheinternetforpeople,web2.0ismakingtheinternetbetterforcomputers”。

具体来讲,他们说Web成为一个开发环境,借助Web服务提供的编程接口,网站成了软件构件。

这些,就是WebService的目标吧,信息孤岛通过这些WebService的对话,能够被自由构建成适合不同应用的建筑来。

一些例子:del.icio.us、flickr、a9、amazon、yahoo、google、msn等提供的编程接口衍生出的各种应用。

为什么要开放APIs,这涉及到集市中的商业方面的技术策略。当然,还有更深层的原因,那是什么呢?

这种交互不仅体现在不同的网站服务之间,同时还体现在用户和Web之间在浏览器上的交互。这也是为什么在美味书签的收藏中Web2.0和AJAX如此相关的一个原因。

在Web页面上使用桌面程序有的那些便利,真的是很享受的事情。这恐怕也是Web可编程的一个方面,Web页面不再是标记和内容混合那样的简单,它就是一个可以编程的地方(是这样理解吧?)

有人反对说,AJAX的使用对搜索引擎不友好,只有Web1.0的站长才关心这个事情吧,在Web2.0时候,站长应该关心的是用户参与的便利、用户的自由度,至于搜索,有RSS/ATOM/RDF等,更本用不着操心,Google不是已经顺应这个趋势,让大家主动提交了么?

可编程的第三个方面,是否在于Web应用和桌面应用之间的无缝连接趋势的出现?类似这里说的“从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展”

编程的一个重要目的是对数据的操作,因此,对于网站来说,除了WebService接口之外,最近为简便方式就是将内容以RSS/RDF/ATOM格式,或者有意义的XHTML格式输出,同时实现内容和表现的分离。

[Web2.0是个历史学的概念,而非是个技术性的概念,它是对Web发展历史断代的成果。对这个概念的梳理,能帮助我更好的把握互联网正在发生的技术与文化。]

---------------------------------------------------------------
中文网志圈谈论的Web2.0内容摘要:

-“Web2.0是用来研究现象、发现规律的东西,不是用来招商引资、搭台唱戏的东西。当越来越多的互联网应用采取与用户互动的方式,越来越多的内容是由用户产生,越来越多的用户参与到互联网创造的过程中的时候,其实它代表了一种新的思潮。在这种思潮之下,一些新的技术开始出现,一些古老技术重新焕发了生机。随便你怎么表述这样一种现象,但现象本身是实实在在存在的,不管是叫它Web2.0,还是社会化互联网。”[Keso:老冒给Web2.0浇了一桶冷水]

-“我觉得最有价值的一个是,web应用的数据格式开始逐渐出现了交换“标准”...这些标准...更加容易被机器自动化处理...能帮助人更好地过滤和定制化信息。其次,更多的服务将以webservice的形式来提供,...这使得web服务可以被互相集成,从而诞生更多新的服务...人的重要性被提高了。过去web更多注重在信息提供,而现在的越来越多的应用更加关注人,也就是所谓“社会性”。此外web的可用性改进正在被越来越重视...”[老冒:朝web2.0泼点冷水]

-“我认为Webx.x是人们为了区别不同时代Web的发展而使用的,而这些概念也是经过归纳出来的结果。抓住对方向,如Wikipedia中所提到的朝向互动及社会网络的方向发展,不论应用何种技术,只要能达到目的都是很好的。甚至作为一般的使用者,都可以不去理会Webx.x的讨论,因为我们都已经在使用这些技术或网站了。”[图书馆观点:Web2.0]

-“RSS逐渐成为在线内容提供服务的标准发行平台。Blog以及user-generated内容的兴起。MyYahoo提供的RSS整合型服务。同时提出了值得密切关注的一些发展中领域,其中包括搜索技术,个性化,User-Generated内容(包括blog,评论,图像和声音),音乐,短视频和Accessibility(易访问性)”[Owen:MaryMeeker新作-关于DigitalWorld的发展报告的摘取]

-“我们谈论的Web2.0带给我们的是一种可读写的网络,这种可读写的网络表现于用户是一种双通道的交流模式,也就是说网页与用户之间的互动关系由传统的“Push”模式演变成双向交流的“Two-WayCommunication”的模式。而对于Web服务的开发者来说,Web2.0带来的理念是服务的亲和力,可操作性,用户体验以及可用性。”[Owen:BaCKpACK-体验可读写的Web服务]

-“web2.0是一种可以被分发的信息概述,web文档被格式化成了web数据。我们不会再看到不同旧地信息,现在我们所注意到是一种聚合、再混合内容的工具。”[songzhen:也说Web2.0的翻译]

-“从这些应用中可以看到:如果基于传统的HTML,同样的功能实现将变得非常复杂和不稳定,数据的再生产和交换成本是很高的。所以:RSS这个标准最终要的贡献就是使得互联网的大部分网站变得可编程:类似的例子还有Blog中的:TrackBackPing等机制,这些机制都是依赖XML/RPC实现的。当初为Lucene设计一个RSS/XML的接口也是为了这个初衷,它使得全文检索服务可以轻松的嵌入到各种应用中,通过关键词将各种内容之间实现更丰富的关联(WellReferenced)。”[车东:RSS,简单协议使得互联网可编程]

-“聚合的可能性以及如何更好地聚合(通常来说,更好的聚合应该基于个人知识管理和人际关系管理)很显然应该成为新一代或者说web2.0架构的核心之一。还有,你会重新发现,恰好是分散带动了聚合,聚合促进了分散,通过聚合的思维,互联网的网络状变得越来越丰富和密集,web2.0就变得越来越有趣味,它将web1.0时代的硕大节点即门户网站不断消解,去努力创造一个更加和谐的自然网络图谱。”[Horse:rss,聚合的无数可能]

-“新的web2.0网站都依赖于用户参与、用户主导、用户建设”。[Horse:Web2.0这个词]

-Keso:Web1.0与Web2.0的区别

-“表面上看,Bloglines取代了门户,成为一个新的中心,但这里有一个重大的区别。门户是只读的,它带有某种锁定的性质。你可以离开门户,但你无法带走门户的内容。Bloglines则完全不同,你觉得它好用,就会继续使用,有一天你不再喜欢Bloglines,你完全可以导出你的OPML,到另一个RSS订阅网站,或者干脆用客户端软件浏览同样的内容。所以,像Bloglines这样的网站,是可写的,你可以导入,也可以导出。就像你对信息拥有选择权,对服务提供商也同样拥有选择权,没有人可以锁定你,主动权在你自己手上。”[Keso:再说信息选择权]

-“Flickr、del.icio.us、Bloglines等Web2.0服务,通过开放API获得了很多有趣、有用的想法,并借助外部的力量,让用户获得了更好的体验。更多大公司也加入到开放API的潮流中,Google、Yahoo!、Amazon、Skype。Google桌面搜索今年3月才开放API,很快就产生了大量的创造,大大扩充了可搜索的文件格式。”[Keso:开放API]

-“归纳:web1.0天天谈门户,web2.0谈个人化;web1.0谈内容,web2.0谈应用;web1.0商业模式,web2.0谈服务;web1.0谈密闭、大而全,web2.0大家谈开放、谈联合;web1.0网站中心化,web2.0谈个人中心化;web1.0一对一,web2.0谈社会性网络;web1.0不知道你是狗,web2.0你去年夏天干了什么我一清二楚甚至想要干什么呢。。。”[van_wuchanghua:发现了N.HOOLYWOOD,我还知道你今年夏天要干什么]

-“我认为Web2.0有下面几个方面的特性:个性化的传播方式.读与写并存的表达方式.社会化的联合方式.标准化的创作方式.便捷化的体验方式.高密度的媒体方式.”[飞戈:Web2.0与未来的网络]

-“用RAILS写的网站带有典型的读写网络的特征:RAILS创建的三个架构中的ACTIVERECORD这个模块中,如果你读读它最重要的基类ActiveRecord::Base,你会发现有CREAT,EDIT,SAVE,DESTROY这些方法已经天然包含在内了,这让实现一个数据库的CRUDS行为变得如此简单。由于这些类的方法直接和网页的名称映射到一起,这使得网页本身就像一个可以编缉的数据库的数据项。”[Blogdriver:RUBYONRAILS,wEB2.0世界新生的创造力]

-“Greasemonkey一定名列前茅。这个通过UserScript就能修改任何网页输出效果的插件极大的提高了用户阅读的自主性,一推出就引起了轰动,同时也引来了不少争议。”[Webleon:platypus,完全可写的互联网]

-“Web1.0到Web2.0的转变,具体的说,从模式上是单纯的“读”向“写”、“共同建设”发展;从基本构成单元上,是由“网页”向“发表/记录的信息”发展;从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展;运行机制上,由“ClientServer”向“WebServices”转变;作者由程序员等专业人士向全部普通用户发展;应用上由初级的“滑稽”的应用向全面大量应用发展。”[Don:Web2.0概念阐释]

Web2.0阶段的一个重要特征是开放,和Web初期的开放有很大不同,有以下几种突出的表现:

内容方面。

-内容的创作共用授权。它的广谱和可选择性,让它具有了足够的生命力。CC先是在网志圈中广泛采用,后来许多商业公司也纷纷采用CC方式(比如BBC);先是文本世界采用,后来逐渐推广到了多媒体世界,比如音频、视频、Flash动画等等。一场自由的文化(freeculture)运动在各个方面悄然铺开。

-内容来源方面的开放。和早期的Web阶段相比,由于使用相关设备的成本降低,利用相关技术的门槛减低,人们可以自由生产并发布各种内容,比如文本信息,比如语音记录,比如视频录制等。信息的生产和传播不再仅仅是商业资本或者技术精英的特权。在Web的新阶段,原来在商业、技术与大众之间的信息生产和传播的落差被削平。消除信息垄断和去中心化已经成为可能。不仅如此,信息的生产和消费的模式也发生了变化,从原来的生产/消费的对立,变成了参与式的信息集市。

Web主体方面。

-商业网站也渐渐采取了开放的、参与的模式。除了内容上的CC授权出现之外。原来并不外露的内容,也随着blog、podcasting等的兴盛而对外开放。一些网站还在技术层面开放,比如开放源代码,比如开放APIs(编程接口),让自己成为一个平台,让用户可以参与衍生产品的创造,用户本身也是产品的生产者。不仅是内容、技术层面,在鼓励用户的参与上,也有相应的开放出现,比如一些新闻网站的RSS源的输出、引用通告(trackback)功能的采纳、blogthis便利的提供,无一不是让用户参与到内容生产、传播的各个环节。

-个人信息层面的开放。有开放,才有交流,才有社会行为和形态产生。个人内容的开放是与一类Web2.0服务的兴起有关。它涵盖了内容(文本、声音、影像、视频)、关系、行为等等。
参考资料:By Grasse!个人见解!没有抄袭!希望可以帮助你!

posted @ 2006-06-08 22:33 一个春天 阅读(463) 评论(0) 编辑

解读Web 2.0流行词

什么是web 2.0?

  到目前为止,关于Web2.0并没有清晰的定义。业内普遍的一种说法是,微内容是Web2.0的一个关键词。其中,微内容包括个人所形成的任何数据:比如一则网志、一个评论、一幅图片、收藏的书签、喜好的音乐列表、想结交的朋友等等。这些微内容,充斥在了人们的生活、工作和学习的方方面面。而Web2.0重点要解决的正是对这些微内容的重新发现和利用。于是,我们看到了这样的现象,只要是和微内容相关的技术和架构,都是以Web2.0为名义的。

  就目前的发展情况而言,Web2.0是以 Flickr、Craigslist、Linkedin、Tribes、Ryze、 Friendster、Del.icio.us、43Things.com等网站为代表,以Blog、TAG、SNS、RSS、wiki等应用为核心,依据六度分隔、xml、ajax等新理论和技术实现的互联网新一代模式。

  什么是博客(Blog)?

  BLOG也就是WEB LOG的缩写简单来说就是网络日记。一种极其简易便捷的网络个人出版形式,使得任何一位网民都可以在几分钟之内拥有自己的个人网站,自由挥写。但是,越简单越难定义,人们对于博客的理解千姿百态,:博客代表着“新闻媒体3.0”:旧媒体→新媒体→互媒体(硅谷最著名的IT专栏作家丹·吉尔摩);博客是继E-mail、BBS、ICQ(IM)之后的第四种网络交流方式;博客就是一个人未经编辑的声音(戴夫·温纳);博客是互联网上独立的思想泡泡(JamesSnell);博客是媒体的开放源代码运动(方兴东);博客是“个人出版2.0”(孙坚华);博客是用文字进行对话的网上咖啡屋(《博客手册》)……著名IT记者和专栏作家保罗·安得鲁斯认为,博客以及其他网络新闻的崛起,在一定程度上是因为媒体巨头在公信力方面的快速衰落,他们要努力推翻传统媒体的“守门人”:“新一类新闻记者正在兴起,他们以直接来自新闻源的‘原始素材’为基础。这些记者正在进行新的试水……是对体制官僚化的媒体的报复性破坏……博客改变了‘新闻’从个人传播到公众的信息流动的本性……只要一摁‘张贴’键,任何人都可以出版自己的作品,这将改变传统媒体出版模式。”

  什么是播客?

  播客,即英文的Podcast或Podcasting,这个词来源自苹果电脑的"iPod"与"广播"(broadcast)的合成词,其指的是一种在互联网上发布文件并允许用户订阅feed以自动接收新文件的方法,或用此方法来制作的电台节目。这种新方法在2004年下半年开始在互联网上流行以用于发布音频文件。

  播客与其他音频内容传送的区别在于其订阅模式,它使用RSS 2.0文件格式传送信息。该技术允许个人进行创建与发布,这种新的传播方式使得人人可以说出他们想说的话。

  什么是Tag?

  Tag(中文叫做“标签”) 是一种新的组织和管理在线信息的方式。它不同于传统的、针对文件本身的关键字检索,而是一种模糊化、智能化的分类。 Tag是一种更为灵活、有趣的分类方式,您可以为每篇日志、每个帖子或者每张图片等添加一个或多个Tag(标签),你可以看到网站上所有和您使用了相同Tag的内容,由此和他人产生更多的联系。Tag体现了群体的力量,使得内容之间的相关性和用户之间的交互性大大增强。

  什么是RSS?

  RSS就是一种简单的信息发布和传递方式,使得一个网站可以方便地调用其他提供RSS订阅服务的网站的内容,从而形成“新闻聚合”,让网站发布的内容在更大的范围内传播。

  如果从RSS阅读者的角度来看,RSS获取信息的模式与加入邮件列表获取信息有一定的相似之处,也就是可以不必登录各个提供信息的网站而通过客户端浏览方式(称为“RSS阅读器”)或者在线RSS阅读方式这些内容。

  什么是Wiki?

  Wiki一词来源于夏威夷语的 "wee kee wee kee" ,原本是“快点”的意思。在这里Wiki指一种超文本系统。这种超文本系统支持面向社群的协作式写作,同时也包括一组支持这种写作的辅助工具。我们可以在Web的基础上对Wiki文本进行浏览、创建、更改,而且创建、更改、发布的代价远比HTML文本为小;同时Wiki系统还支持面向社群的协作式写作,为协作式写作提供必要帮助;最后,Wiki的写作者自然构成了一个社群,Wiki系统为这个社群提供简单的交流工具。与其它超文本系统相比,wiki有使用方便及开放的特点,所以wiki系统可以帮助我们在一个社群内共享某领域的知识。

  什么是AJAX?

  Ajax并不是一种技术。它实际上是几种已经在各自领域大行其道技术的强强结合。Ajax混合了:

  *基于XHTML/CSS

  * 由DOM(Document Object Model)实现动态显示与交互

  * 通过XML和XSLT进行数据交换及处理

  * 使用JavaScript整合上述技术

  直观一点的说Ajax能够实现不刷新浏览器窗口(当然更不用安装额外的插件)而满足用户的操作,现在一些看上去很Cool的网站,很多是用这项技术实现的,其中包括:orkut、Gmail、Google Group、Google Suggest、Google Maps、Flickr、A9.com等。

  什么是SNS?

  SNS:Social Network Sofwaret,社会性网络软件,依据六度理论,以认识朋友的朋友为基础,扩展自己的人脉。并且无限扩张自己的人脉,在需要的时候,可以随时获取一点,得到该人脉的帮助。

  六度关系理论:美国著名社会心理学家米尔格伦(Stanley Milgram)于20世纪60年代最先提出,在人际脉络中,要结识任何一位陌生的朋友,这中间最多只要通过六个朋友就能达到目的。就是说你想认识一个人,托朋友找朋友找认识他的人,之间不会超过六个人。

  在经济高速发展的今天,人际关系的作用愈发明显,人脉资源对于一个人的成功非常重要。目前很多职业人士在人际资源方面其实都比较匮乏,因此SNS这种新兴的网络社交方式一出现,迅速流行欧美国家,已经成为精英阶层拓展人际关系的主要方式之一。

posted @ 2006-06-08 22:29 一个春天 阅读(101) 评论(0) 编辑

什么是RSS?

讨论与Blog相关的技术,不可不谈的就是RSS,这个缩写在英文中可以有几个源头,并被不同的技术团体做不同的解释。既可以是“Rich Site Summary”,或“RDF Site Summary”,也可以是“Really Simple Syndication”。为什么有这么多含义呢?这还要从RSS的一段今天也没有理清的关系说起。

  今天肯定有人还记得IE 4刚刚推出来的时候有一个有趣的功能,那就是新闻频道。这个新闻频道的功能与Netscape推出的新闻频道是很相似的(当时Netscape还是市场上领先的浏览器)。为此Netscape 定义了一套描述新闻频道的语言,这就是RSS,只不过Netscape自当时起每况愈下,所以最终也没有发布一个正式的RSS规范(只发布了一个0.9版本)。而微软也在当时推出了支持自己IE的CDF(Channel Definition Format)数据规格,与RSS非常接近。微软试图用新闻频道的功能把“推”(Push)技术变成一个应用主流,并与Netscape抗衡。不过出乎预测的是,“推”技术自始至终没有找到合适的商业模型,而且伴随着其他各类网络特性的出现,也日益无法显现自身的优势。新闻频道在浏览器中的地位最终日暮西山,最后也在IE的后续版本中消失了。

  新闻频道的确进入了低谷,但是RSS并没有被业界人士所抛弃。过去两年,Blog从一个专业群体开始,逐步成为了网络上最热门的新话题。而RSS成为了描述Blog主题和更新信息的最基本方法。于是RSS这项技术被著名Blogger/Geek戴夫·温那(Dave Winner)的公司UserLand所接手,继续开发新的版本,以适应新的网络应用需要。新的网络应用就是Blog,因为戴夫·温那的努力,RSS升级到了0.91版,然后达到了0.92版,随后在各种Blog工具中得到了应用,并被众多的专业新闻站点所支持。在广泛的应用过程中,众多的专业人士认识到需要组织起来,把RSS发展成为一个通用的规范,并进一步标准化。一个联合小组根据W3C新一代的语义网技术RDF对RSS进行了重新定义,发布了RSS 1.0,并把RSS定义为“RDF Site Summary”。这项工作并没有与戴夫·温那进行有效的沟通,而戴夫则坚持在自己设想的方向上进一步开发RSS的后续版本,也并不承认RSS 1.0的有效性。RSS由此开始分化形成了RSS 0.9x/2.0和RSS 1.0两个阵营,也由此引起了在专业人群中的广泛争论。

  因为争论的存在,一直到今天,RSS 1.0还没有成为标准化组织的真正标准。而戴夫·温那却在2002年9月独自把RSS升级到了2.0版本,其中的定义完全是全新的模式,并没有任何RSS 1.0的影子。这引发了网络上进一步争议,究竟让一个越来越普及的数据格式成为一个开放的标准,还是被一家公司所定义和控制,成为了争议的焦点。戴夫·温那并没有为自己辩解,他的观点是RSS还需要进一步发展,需要专业人士更明确的定义,不过恐怕这种轻描淡写不能消除人们对RSS“被一家商业公司独占”的担心。

  前面的铺垫对用户来说也许没有什么太大的意义,可能更多人关心如何在自己的Blog增加RSS输出,这样可以让很多新闻聚合工具(例如CNBlog刚刚推荐的NewzCrawler)很容易找到你并自动获得你在Blog中的更新内容。

  它是什么:站点用来和其他站点之间共享内容的简易方式(也叫聚合内容)。 RSS使肵ML作为彼此共享内容的标准方式。

  它代表什么:Really Simple Syndication (或RDF Site Summary,RDF站点摘要)

  例如:一些免费的软件能够让你阅读那些RSS使能的站点,比如 NewsIsFree 和 Amphetadesk。

  它有什么用处:让别人容易的发现你已经更新了你的站点,让人们很容易的追踪他们阅读的所有weblogs。

posted @ 2006-06-08 22:27 一个春天 阅读(111) 评论(0) 编辑

Web 2.0学习指南

历史很重要。对一个技术的学习也应当从历史出发,通过其在时间形成历史的流变,得以知晓现状,甚至能够预知未来。

  那Web 1.0是什么呢?

  他们说,记得静态HTML的WWW时代么?

  (那个时代的WWW应用、人们的Web体验、对社会的影响如何?)

  那么动态HTML和静态HTML下的Web相比,是多少版本?1.5?对了,他们是真这么叫的。

  (在效果和影响上,与1.0相比,扩展和加深多少?)

  要呈现的数据存储在数据库中,通过Web服务端的程序,应用户的请求,取出数据,加上事先设计的模板,动态的生成Html代码,发送到用户的浏览器那里。

  他是1.0系列,应为用户在浏览器中所见和Web 1.0一样,它有0.5的升级,因为数据不是事先制作并发布,而是动态生成,和用户的需要交互生成。

  那好,在加0.5,到Web 2.0,变化是在哪里呢?

  (看到了正在崛起的和改变的,会继续朝着什么方向改变互联网和社会呢?)

  更新:关于各个版本的差别,看看亚马逊的例子。

  事情没有那么幸运,Web 2.0并不是一个具体的事物,而是一个阶段,是促成这个阶段的各种技术和相关的产品服务的一个称呼。所以,我们无法说,Web 2.0是什么,但是可以说,那些是Web 2.0。

  WikiPedia的Web 2.0条目下列出了这些条件:

  * CSS 和语义相关的 XHTML 标记

  * AJAX 技术

  * Syndication of data in RSS/ATOM

  * Aggregation of RSS/ATOM data

  * 简洁而有意义的 URLs

  * 支持发布为 weblog

  * RESTian (preferred) 或者 XML Webservice APIs

  * 一些社会性网络元素

  必须具备的要素有:

  * 网站应该能够让用户把数据在网站系统内外倒腾。

  * 用户在网站系统内拥有自己的数据

  * 完全基于Web,所有的功能都能透过浏览器完成。

  (以上内容引用自英文版维基百科)

  虽然这只是一家之言,不过,对于其中谈到的几个要素,大家还是公认的。

  - 基于RSS/ATOM/RDF/FOAF等XML数据的同步、聚合和迁移。

  数据不再和页面和网站混粘在一起,它独立了,它跟着用户走。这是Web 2.0的很重要特征。这也是为什么Blog是Web 2.0的代表的原因。在网志上,常主角的是相互独立的一则则的网志。

  独立,然后有物理表现。现在,就能让他们活跃起来。透过对XML数据的处理,这些内容能被自由的组合,被各种应用程序,不论是Web程序还是桌面程序等呈现和处理。

  当然,最重要的是背后的人。

  - 社会性因素。

  内容跟着人走,内容又能够被用户自由的组合,也就是说,用户能够自由的借助内容媒介,创建起一个个的社群,发生各种社会性的(网络)行为。

  此外还有标签以及建立在开放标签系统之上的Folksonomy。

  - 第三个公认的因素是开放API,这个技术性稍强些,得另花时间研习,可以先看看例子:amazon、flickr、google map等。

  从Web应用的产品/服务生产者角度来说,该如何创建Web 2.0的产品呢?

  重要的是要抓住这么几点,一个是微内容(这里有定义),一个是用户个体。除了这两个最基本的之外,还可以考虑社群内的分享以及提供API。

  微内容:英文是microcontent。用户所生产的任何数据都算是微内容,比如一则网志,评论,图片,收藏的书签,喜好的音乐列表、想要做的事情,想要去的地方、新的朋友等等。这些微内容,充斥着我们的生活、工作和学习,它的数量、重要性,还有我们对它的依赖,并不亚于那些道貌岸然、西装革履的正统文章、论文、书籍。

  对微内容的重新发现和利用,是互联网所开创的平等、民主、自由风气的自然衍生,也是互联网相关技术消减信息管理成本之后的一个成果。

  我们每天都生产众多的微内容,也消费着同样多的微内容。对于Web 2.0来说,如何帮助用户管理、维护、存储、分享、转移微内容,就成了关键。

  用户个体。对于Web 1.0的典型产品/服务来说,用户没有具体的面貌、个性,它只是一个模糊的群体的代名词而已。但是对于Web2.0的产品和服务来说,用户是个实实在在的人。Web 2.0所服务的,是具体的人,而不是一个如同幽灵般的概念。并且,这个人的具体性,会因为服务本身而不断地充实起来。

  如何为这个具体的个体服务,是Web 2.0设计的起点。

  因此,一类可以被称作Web 2.0的产品/服务将是这样:

  服务于用户个体的微内容的收集、创建、发布、管理、分享、合作、维护等的平台。

  其他的呢?恐怕就设计到好些人提到的,微内容的XML表现;微内容的聚合;微内容的迁移;社会性关系的维护;界面的易用性等等。

  以及是否就是开源、参与、个人价值、草根、合作等等?

  Web2.0是许多方面起头并进又相互牵连的一个新的阶段的到来。因此,不同的人,有着不同的看法。那么,对于Web开发人员来说,Web2.0意味着什么呢?

  他们说Web2.0阶段,Web是一个平台,或者说,Web正在变得可编程,可以执行的Web应用。野心家们设想这个它的终极目标是Web OS。

  Web 1.0时候,Web只是一个针对人的阅读的发布平台,Web由一个个的超文本链接而成。现在的趋势发生了变化,Web不仅仅是Html文档的天下,它成了交互的场所。

  Web 2.0 Conference网站的横幅引用Jeff Bezos的话说“Web 1.0 is making the internet for people,web 2.0 is making the internet better for computers”。

  具体来讲,他们说Web成为一个开发环境,借助Web服务提供的编程接口,网站成了软件构件。

  这些,就是Web Service的目标吧,信息孤岛通过这些Web Service的对话,能够被自由构建成适合不同应用的建筑来。

  一些例子:del.icio.us、flickr、a9、amazon、yahoo、google、msn等提供的编程接口衍生出的各种应用。

  为什么要开放APIs,这涉及到集市中的商业方面的技术策略。当然,还有更深层的原因,那是什么呢?

  这种交互不仅体现在不同的网站服务之间,同时还体现在用户和Web之间在浏览器上的交互。这也是为什么在美味书签的收藏中Web2.0和AJAX如此相关的一个原因。

  在Web页面上使用桌面程序有的那些便利,真的是很享受的事情。这恐怕也是Web可编程的一个方面,Web页面不再是标记和内容混合那样的简单,它就是一个可以编程的地方(是这样理解吧?)

  有人反对说,AJAX的使用对搜索引擎不友好,只有Web 1.0的站长才关心这个事情吧,在Web 2.0时候,站长应该关心的是用户参与的便利、用户的自由度,至于搜索,有RSS/ATOM/RDF等,更本用不着操心,Google不是已经顺应这个趋势,让大家主动提交了么?

  可编程的第三个方面,是否在于Web应用和桌面应用之间的无缝连接趋势的出现?类似这里说的“从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展”

  编程的一个重要目的是对数据的操作,因此,对于网站来说,除了Web Service接口之外,最近为简便方式就是将内容以RSS/RDF/ATOM格式,或者有意义的XHTML格式输出,同时实现内容和表现的分离。

  [Web 2.0是个历史学的概念,而非是个技术性的概念,它是对Web发展历史断代的成果。对这个概念的梳理,能帮助我更好的把握互联网正在发生的技术与文化。]

  中文网志圈谈论的Web 2.0内容摘要:

  - “Web 2.0是用来研究现象、发现规律的东西,不是用来招商引资、搭台唱戏的东西。当越来越多的互联网应用采取与用户互动的方式,越来越多的内容是由用户产生,越来越多的用户参与到互联网创造的过程中的时候,其实它代表了一种新的思潮。在这种思潮之下,一些新的技术开始出现,一些古老技术重新焕发了生机。随便你怎么表述这样一种现象,但现象本身是实实在在存在的,不管是叫它Web 2.0,还是社会化互联网。”[Keso:老冒给Web 2.0浇了一桶冷水]

  - “我觉得最有价值的一个是, web应用的数据格式开始逐渐出现了交换“标准”...这些标准...更加容易被机器自动化处理...能帮助人更好地过滤和定制化信息。其次,更多的服务将以web service的形式来提供,...这使得web 服务可以被互相集成, 从而诞生更多新的服务...人的重要性被提高了。过去web更多注重在信息提供, 而现在的越来越多的应用更加关注人,也就是所谓“社会性”。此外web的可用性改进正在被越来越重视...”[老冒:朝web 2.0泼点冷水]

  - “我认为Web x.x是人们为了区别不同时代Web的发展而使用的,而这些概念也是经过归纳出来的结果。抓住对方向,如Wikipedia中所提到的朝向互动及社会网络的方向发展,不论应用何种技术,只要能达到目的都是很好的。甚至作为一般的使用者,都可以不去理会Web x.x的讨论,因为我们都已经在使用这些技术或网站了。”[图书馆观点:Web 2.0]

  - “RSS逐渐成为在线内容提供服务的标准发行平台。Blog以及user-generated内容的兴起。My Yahoo提供的RSS整合型服务。同时提出了值得密切关注的一些发展中领域,其中包括搜索技术,个性化,User-Generated内容(包括 blog,评论,图像和声音),音乐,短视频和Accessibility(易访问性)”[Owen:Mary Meeker新作 - 关于Digital World的发展报告的摘取]

  - “我们谈论的Web2.0带给我们的是一种可读写的网络,这种可读写的网络表现于用户是一种双通道的交流模式,也就是说网页与用户之间的互动关系由传统的“Push”模式演变成双向交流的“Two- Way Communication”的模式。而对于Web服务的开发者来说,Web2.0带来的理念是服务的亲和力,可操作性,用户体验以及可用性。”[Owen:BaCKpACK-体验可读写的Web服务]

  - “web 2.0是一种可以被分发的信息概述,web文档被格式化成了web数据。我们不会再看到不同旧地信息,现在我们所注意到是一种聚合、再混合内容的工具。”[songzhen:也说Web 2.0的翻译]

  - “从这些应用中可以看到:如果基于传统的HTML,同样的功能实现将变得非常复杂和不稳定,数据的再生产和交换成本是很高的。所以:RSS这个标准最终要的贡献就是使得互联网的大部分网站变得可编程:类似的例子还有Blog中的:TrackBack Ping等机制,这些机制都是依赖XML/RPC实现的。当初为Lucene设计一个RSS/XML的接口也是为了这个初衷,它使得全文检索服务可以轻松的嵌入到各种应用中,通过关键词将各种内容之间实现更丰富的关联(Well Referenced)。”[车东:RSS,简单协议使得互联网可编程]

  - “聚合的可能性以及如何更好地聚合(通常来说,更好的聚合应该基于个人知识管理和人际关系管理)很显然应该成为新一代或者说web2.0架构的核心之一。还有,你会重新发现,恰好是分散带动了聚合,聚合促进了分散,通过聚合的思维,互联网的网络状变得越来越丰富和密集,web2.0就变得越来越有趣味,它将web1.0时代的硕大节点即门户网站不断消解,去努力创造一个更加和谐的自然网络图谱。”[Horse:rss,聚合的无数可能]

  - “新的web2.0网站都依赖于用户参与、用户主导、用户建设”。[Horse:Web 2.0这个词]

  - Keso:Web 1.0与Web 2.0的区别

  - “表面上看,Bloglines取代了门户,成为一个新的中心,但这里有一个重大的区别。门户是只读的,它带有某种锁定的性质。你可以离开门户,但你无法带走门户的内容。Bloglines则完全不同,你觉得它好用,就会继续使用,有一天你不再喜欢Bloglines,你完全可以导出你的OPML,到另一个 RSS订阅网站,或者干脆用客户端软件浏览同样的内容。所以,像Bloglines这样的网站,是可写的,你可以导入,也可以导出。就像你对信息拥有选择权,对服务提供商也同样拥有选择权,没有人可以锁定你,主动权在你自己手上。”[Keso:再说信息选择权]

  - “Flickr、del.icio.us、Bloglines等Web 2.0服务,通过开放API获得了很多有趣、有用的想法,并借助外部的力量,让用户获得了更好的体验。更多大公司也加入到开放API的潮流中,Google、Yahoo!、Amazon、Skype。Google桌面搜索今年3月才开放API,很快就产生了大量的创造,大大扩充了可搜索的文件格式。”[Keso:开放API]

  - “归纳:web1.0天天谈门户,web2.0谈个人化;web1.0谈内容,web2.0谈应用;web1.0商业模式,web2.0谈服务;web1.0谈密闭、大而全,web2.0大家谈开放、谈联合;web1.0网站中心化,web2.0谈个人中心化;web1.0一对一,web2.0谈社会性网络;web1.0不知道你是狗,web2.0你去年夏天干了什么我一清二楚甚至想要干什么呢。。。”[van_wuchanghua:发现了N.HOOLYWOOD,我还知道你今年夏天要干什么]

  - “我认为Web2.0有下面几个方面的特性: 个性化的传播方式. 读与写并存的表达方式. 社会化的联合方式.标准化的创作方式. 便捷化的体验方式. 高密度的媒体方式.”[飞戈:Web2.0与未来的网络]

  - “用RAILS写的网站带有典型的读写网络的特征:RAILS创建的三个架构中的ACTIVE RECORD这个模块中,如果你读读它最重要的基类 ActiveRecord::Base,你会发现有CREAT,EDIT,SAVE,DESTROY这些方法已经天然包含在内了,这让实现一个数据库的CRUDS行为变得如此简单。由于这些类的方法直接和网页的名称映射到一起,这使得网页本身就像一个可以编缉的数据库的数据项。”[Blogdriver:RUBY ON RAILS,wEB2.0世界新生的创造力]

  - “Greasemonkey一定名列前茅。这个通过User Script就能修改任何网页输出效果的插件极大的提高了用户阅读的自主性,一推出就引起了轰动,同时也引来了不少争议。”[Webleon:platypus,完全可写的互联网]

  - “Web1.0到Web2.0的转变,具体的说,从模式上是单纯的“读”向“写”、“共同建设”发展;从基本构成单元上,是由“网页”向“发表/记录的信息”发展;从工具上,是由互联网浏览器向各类浏览器、rss阅读器等内容发展;运行机制上,由“Client Server”向“Web Services”转变;作者由程序员等专业人士向全部普通用户发展;应用上由初级的“滑稽”的应用向全面大量应用发展。 ”[Don:Web 2.0概念阐释]

  Web 2.0阶段的一个重要特征是开放,和Web初期的开放有很大不同,有以下几种突出的表现:

  内容方面。

  - 内容的创作共用授权。它的广谱和可选择性,让它具有了足够的生命力。CC先是在网志圈中广泛采用,后来许多商业公司也纷纷采用CC方式(比如BBC);先是文本世界采用,后来逐渐推广到了多媒体世界,比如音频、视频、Flash动画等等。一场自由的文化(free culture)运动在各个方面悄然铺开。

  - 内容来源方面的开放。和早期的Web阶段相比,由于使用相关设备的成本降低,利用相关技术的门槛减低,人们可以自由生产并发布各种内容,比如文本信息,比如语音记录,比如视频录制等。信息的生产和传播不再仅仅是商业资本或者技术精英的特权。在Web的新阶段,原来在商业、技术与大众之间的信息生产和传播的落差被削平。消除信息垄断和去中心化已经成为可能。不仅如此,信息的生产和消费的模式也发生了变化,从原来的生产/消费的对立,变成了参与式的信息集市。

  Web主体方面。

  - 商业网站也渐渐采取了开放的、参与的模式。除了内容上的CC授权出现之外。原来并不外露的内容,也随着blog、podcasting等的兴盛而对外开放。一些网站还在技术层面开放,比如开放源代码,比如开放APIs(编程接口),让自己成为一个平台,让用户可以参与衍生产品的创造,用户本身也是产品的生产者。不仅是内容、技术层面,在鼓励用户的参与上,也有相应的开放出现,比如一些新闻网站的RSS源的输出、引用通告(trackback)功能的采纳、blogthis便利的提供,无一不是让用户参与到内容生产、传播的各个环节。

  - 个人信息层面的开放。有开放,才有交流,才有社会行为和形态产生。个人内容的开放是与一类Web 2.0服务的兴起有关。它涵盖了内容(文本、声音、影像、视频)、关系、行为等等。

posted @ 2006-06-08 22:22 一个春天 阅读(119) 评论(0) 编辑

什么是Web 2.0

2005-11-22 10:50 来源:互联网周刊 作者:Tim O'Reilly  
2001年秋天互联网公司(dot-com)泡沫的破灭标志着互联网的一个转折点。许多人断定互联网被过分炒作,事实上网络泡沫和相继而来的股市大衰退看起来像是所有技术革命的共同特征。股市大衰退通常标志着蒸蒸日上的技术已经开始占领中央舞台。假冒者被驱逐,而真正成功的故事展示了它们的力量,同时人们开始理解了是什么将一个故事同另外一个区分开来。

  “Web 2.0”的概念开始于一个会议中,展开于O'Reilly公司和MediaLive国际公司之间的头脑风暴部分。所谓互联网先驱和O'Reilly公司副总裁的戴尔·多尔蒂(Dale Dougherty)注意到,同所谓的“崩溃”迥然不同,互联网比其他任何时候都更重要,令人激动的新应用程序和网站正在以令人惊讶的规律性涌现出来。更重要的是,那些幸免于当初网络泡沫的公司,看起来有一些共同之处。那么会不会是互联网公司那场泡沫的破灭标志了互联网的一种转折,以至于呼吁“Web 2.0”的行动有了意义?我们都认同这种观点,Web 2.0会议由此诞生。

  在那个会议之后的一年半的时间里,“Web 2.0”一词已经深入人心,从Google上可以搜索到950万以上的链接。但是,至今关于Web 2.0的含义仍存在极大的分歧,一些人将Web 2.0贬低为毫无疑义的一个行销炒作口号,而其他一些人则将之理解为一种新的传统理念。

  本文就是来尝试澄清Web 2.0本来意义。
  
  在我们当初的头脑风暴中,我们已经用一些例子,公式化地表达了我们对Web 2.0的理解:
Web 1.0 Web 2.0
DoubleClick Google AdSense
Ofoto Flickr
Akamai BitTorrent
mp3.com Napster
大英百科全书在线(Britannica Online) 维基百科全书(Wikipedia)
个人网站 博客(blogging)
evite upcoming.org和EVDB
域名投机 搜索引擎优化
页面浏览数 每次点击成本
屏幕抓取(screen scraping) 网络服务(web services)
发布 参与
内容管理系统 维基
目录(分类) 标签(“分众分类”,folksonomy)
粘性 聚合


  这个列表还会不断继续下去。但是到底是什么,使得我们认定一个应用程序或一种方式为作所谓“Web 1.0”,而把另外一个叫做“Web 2.0”呢?(这个问题尤为紧迫,因为Web 2.0的观念已经传播的如此广泛,以至于很多公司正在将这个词加到他们的行销炒作中,但却没有真正理解其含义。同时这个问题也尤为困难,因为许多嗜好口号的创业公司显然不是Web 2.0,而一些我们认为是Web 2.0的应用程序,例如Napster和BitTorrent,甚至不是真正适当的网络程序!)我们首先来探讨一些原则,这些原则是通过Web 1.0的一些成功案例,以及一些最为有趣的新型应用程序来体现的。
  

  1. 互联网作为平台

  正如许多重要的理念一样,Web 2.0没有一个明确的界限,而是一个重力核心。不妨将Web 2.0视作一组原则和实践,由此来把距离核心或远或近的网站组成为一个类似太阳系的网络系统,这些网站或多或少地体现着Web 2.0的原则。

  图1为Web 2.0的“模拟图”,该图是在名为“O'Reilly的朋友”(Friend Of O’reilly, FOO)的会议的一个研讨会上产生的。这个图基本上仍处于演化阶段,但已经描绘出了 从Web 2.0核心理念中衍生出的许多概念。

  例如,在2004年10月的第一次Web 2.0的会议上,约翰·巴特利(John Battelle)和我在我们各自的开场白中列举了一组初步的原则。

  这些原则中的第一条就是“互联网作为平台”。这也曾是Web 1.0的宠儿网景公司(Netscape)的战斗口号,而网景在同微软的大战中陨落了。此外,我们早先的Web 1.0的楷模中的两个,DoubleClick和Akamai公司,皆是将网络当作平台的先驱。人们往往不认为这是一种网络服务,但事实上,广告服务是第一个被广泛应用的网络服务,同时也是第一个被广泛应用的混合处理(mashup),如果用另一个近来流行的词来说的话。每个旗帜广告(banner ad)都是用来在两个网站之前无缝合作,向位于另外一台计算机上的读者传递一个整合好的页面。

  Akamai也将网络看作平台,并且在一个更深入的层次上,来搭建一个透明的缓存和内容分发网络,以便降低宽带的拥塞程度。

  虽然如此,这些先驱提供了有益的对比,因为后来者遇到同样问题的时候,可以将先驱们的解决方案进一步延伸,从而对新平台本质的理解也更为深刻了。DoubleClick和Akamai都是Web 2.0的先驱,同时我们也可以看到,可以通过引入更多Web 2.0的设计模式,来实现更多的应用。

  让我们对这三个案例中的每一个都作一番深究,来探讨其间的一些本质性的差别。

  Netscape 对 Google

  如果Netscape可以称为Web 1.0的旗手,那么Google几乎可以肯定是Web 2.0的旗手,只要看看他们的首次公开上市(IPO)是如何地揭示了各自的时代就清楚了。所以我们就从这两个公司和其定位的差别入手。

  Netscape以传统的软件摹本来勾勒其所谓“互联网作为平台”:他们的旗舰产品是互联网浏览器,一个桌面应用程序。同时,他们的战略是利用他们在浏览器市场的统治地位,来为其昂贵的服务器产品建立起市场。从理论上讲,在浏览器中控制显示内容和程序的标准,赋予了Netscape一种市场支配力,如同微软公司在个人计算机市场上所享受的一样。很像当初“自行的马车”(horseless carriage)将汽车描绘为一种熟知事物的延伸,Netscape曾推销一种网络桌面(webtop)来替代传统的桌面(desktop),并且计划借助信息更新,以及由购买了Netscape服务器的信息提供者来推送的各种小程序,来开发推广这种网络桌面。

  最终,浏览器和网络服务器都变成了“日用品”,同时价值链条也向上移动到了在互联网平台上传递的服务。

  作为对比,Google则以天生的网络应用程序的角色问世,它从不出售或者打包其程序,而是以服务的方式来传递。客户们直接或间接地为其所使用的服务向Google付费。原有软件工业缺陷荡然无存。没有了定期的软件发布,只需要持续的改善。没有了许可证或销售,只需要使用。没有了为了让用户在其设备上运行软件而不得不进行的平台迁移,只需要搭建宏大的、由众多个人计算机组成的、可伸缩的网络,其上运行开源操作系统,及其及自行研制的应用程序和工具,而公司之外的任何人则永远无法接触到这些东西。

  在其底层,Google需要一种Netscape从未需要过的能力:数据库管理。Google远远不只是一个软件工具的集合,它是一个专业化的数据库。没有这些数据,那些工具将毫无用武之地;没有这些软件,数据也将无可控制。软件许可证制度和对应用程序接口(API)的控制——上一个时代的法宝——已经毫不相关了,因为Google的软件只需要执行而从不需要分发,也因为如果不具备收集和管理数据的能力,软件本身就没有什么用处了。事实上,软件的价值是同它所协助管理的数据的规模和活性成正比的。

  Google的服务不是一个简单的服务器,虽然其服务是通过大规模的互联网服务器集合来传递的;其服务也不是一个浏览器,虽然这种服务是被用户在浏览器中体验到的。Google的旗舰产品——搜索服务,甚至不托管它让用户来搜寻的内容。很像一个电话通话过程,不仅发生在通话的两端,而且发生在中间的网络上。作为用户和其在线体验的一个中介,Google作用于浏览器、搜索引擎和最终的内容服务器之间的空间中。

  虽然Netscape和Google都可以被描述为软件公司,但显然Netscape可以归到Lotus,Microsoft,Oracle,SAP,以及其他发源于上个世纪八十年代软件革命的那些公司所组成的软件世界。而Google的同伴们,则是像eBay,Amazon,Napster,及至DoubleClick和Akamai这样的互联网公司。

  DoubleClick对Overture和AdSense

  同Google类似,DoubleClick是一个名副其实的互联网时代的孩子。它把软件作为一种服务,在数据管理方面具有核心竞争力,并且正如上文所述,它是一个早在连网络服务的名字还不曾有的时候,就已然开始其服务的先驱。然而,DoubleClick最终还是被其商业模式局限住了。它所贯彻的是九十年代的互联网观念。这种观念围绕着出版,而不是参与;围绕着广告客户,而不是消费者,来进行操纵;围绕着规模,认为互联网会被如MediaMetrix等网络广告评测公司尺度下的所谓顶级网站所统治。

  结果是,DoubleClick得意地在其网站上引用道:“超过2000种的成功应用”。而相对比的是,Yahoo!公司的搜索市场(从前的Overture)和Google的AdSense产品,已经在为几十万的广告客户服务。

  Overture和Google的成功源自于对克里斯·安德森(Chris Anderson)提到的所谓“长尾”的领悟,即众多小网站集体的力量提供了互联网的大多数内容。DoubleClick的产品要求一种签订正式的销售合同,并将其市场局限于很少的几千个大型网站。Overture和Google则领会到如何将广告放置到几乎所有网页上。更进一步地,它们回避了发行商和广告代理们所喜爱的广告形式,例如旗帜广告和弹出式广告,而采用了干扰最小的、上下文敏感的、对用户友好的文字广告形式。

  Web 2.0的经验是:有效利用消费者的自助服务和算法上的数据管理,以便能够将触角延伸至整个互联网,延伸至各个边缘而不仅仅是中心,延伸至长尾而不仅仅是头部。

  毫不奇怪,其他Web 2.0的成功故事也显示着同样的轨迹。eBay扮演着一个自动的中间媒介的角色,使个体之间发生的几个美元的偶然性的交易成为可能。Napster(虽然已经出于法律原因而关闭)将其网络建立在一个集中的歌曲数据库之上,但是它让每一个下载者都成为一台服务器,从而使其网络逐渐扩大。

  Akamai 对 BitTorrent

  同DoubleClick类似,Akamai的业务重点面向网络的头部,而不是尾部;面向中心,而不是边缘。虽然它服务于那些处于网络边缘的个体的利益,为他们访问位于互联网中心的高需求的网站铺平了道路,但它的收入仍然来自从那些位于中心的网站。

  BitTorrent,像P2P风潮中的其他倡导者一样,采用了一种激进的方式来达到互联网去中心化(internet decentralization)的目的。每个客户端同时也是一个服务器;文件被分割成许多片段,从而可以由网络上的多个地方提供,透明地利用了网络的下载者来为其他下载者提供带宽和数据。事实上,文件越流行下载得越快,因为有更多的用户在为这个文件提供带宽和各个片段。

  BitTorrent由此显示出Web 2.0的一个关键原则:用户越多,服务越好。一边是Akamai必须增加服务器来改善服务,另一边是BitTorrent用户将各自的资源贡献给大家。可以说,有一种隐性的“参与体系”内置在合作准则中。在这种参与体系中,服务主要扮演着一个智能代理的作用,将网络上的各个边缘连接起来,同时充分利用了用户自身的力量。

  2. 利用集体智慧

  在诞生于Web 1.0时代并且存活了下来,而且要继续领导Web 2.0时代的那些巨人的成功故事的背后,有一个核心原则,就是他们借助了网络的力量来利用集体智慧:

  --超级链接是互联网的基础。当用户添加新的内容和新的网站的时候,将被限定在一种特定的网络结构中,这种网络结构是由其他用户发现内容并建立链接的。如同大脑中的神经突触,随着彼此的联系通过复制和强化变得越来越强,而作为所有网络用户的所有活动的直接结果,互联的网络将有机地成长。

  --Yahoo!是第首例伟大的成功故事,诞生于一个分类目录,或者说是链接目录,一个对数万甚至数百万网络用户的最精彩作品的汇总。虽然后来Yahoo!进入了创建五花八门的内容的业务,但其作为一个门户来收集网络用户们集体作品的角色,依然是其价值核心。

  --Google在搜索方面的突破在于PageRank技术,该技术令其迅速成为搜索市场上毫无争议的领导者。PageRank是一种利用了网络的链接结构,而不是仅仅是使用文档的属性,来实现更好的搜索效果的方法。

  --eBay的产品是其全部用户的集体活动,就向网络自身一样,eBay随着用户的活动而有机地成长,而且该公司的角色是作为一个特定环境的促成者,而用户的行动就发生在这种环境之中。更重要的是,eBay的竞争优势几乎都来自于关键性的大量的买家和卖家双方,而这正是这一点使得后面许多竞争者的产品的吸引力显著减低。

  --Amazon销售同Barnesandnoble.com等竞争者相同的产品,同时这些公司从卖方获得的是同样的产品描述、封面图片和目录。所不同的是,Amazon已然缔造出了一门关于激发用户参与的科学。Amazon拥有比其竞争者高出一个数量级以上的用户评价,以及更多的邀请来让用户以五花八门的方式,在近乎所有的页面上进行参与,而更为重要的是,他们利用用户的活动来产生更好的搜索结果。Barnesandnoble.com的搜索结果很可能指向该公司自己的产品,或者是赞助商的结果,而Amazon则始终以所谓“最流行的”打头,这是一种实时计算,不仅基于销售,而且基于其他一些被Amazon内部人士称为围绕着产品“流动”(flow)的因素。由于拥有高出对手一个数量级的用户参与,Amazon销售额超出竞争对手也就不足为奇了。

  现在,具备了这种洞察力,并且可能会将之延伸开来的那些创新型的公司,正在互联网上留下他们的印迹。

维基百科全书(Wikipedia)是一种在线百科全书,其实现基于一种看似不可能的观念。该观念认为一个条目可以被任何互联网用户所添加,同时可以被其他任何人编辑。无疑,这是对信任的一种极端的实验,将埃里克·雷蒙德(Eric Raymond)的格言(源自开放源码软件的背景之下):“有足够的眼球,所有的程序缺陷都是肤浅的”(with enough eyeballs, all bugs are shallow)运用到了内容的创建之中。维基百科全书已然高居世界网站百强之列,并且许多人认为它不久就将位列十强。这在内容创建方面是一种深远的变革。

  像del.icio.us(美味书签)和Flickr这样的网站,其公司已经在近期获得了广泛的关注,并且已经在一种被人们成为“分众分类”(folksonomy,有别于传统分类法)的概念上成为先行者。“分众分类”是一种使用用户自由选择的关键词对网站进行协作分类的方式,而这些关键词一般称为标签(tags)。标签化运用了像大脑本身所使用的那种多重的、重叠的关联,而不是死板的分类。举一个经典的例子,在Flickr网站上,一幅小狗照片可能被加上“小狗”和“可爱”这样的标签,从而允许系统依照用户行为所产生的自然的方式来进行检索。

  协作式垃圾信息过滤产品,例如Cloudmark,就聚集了电子邮件用户们对于“一封邮件是或者不是垃圾邮件”的众多相互独立的决策,从而胜过了依赖于分析邮件本身的那些系统。

  伟大的互联网成功者并不主动地到处推销其产品,这几乎成为公理。他们采用“病毒式营销”(viral marketing)的方式,也就是说,一些推介会直接从一个用户传播到另外一个用户。如何一个网站或产品依赖广告来进行宣传,你几乎可以断定它不是Web 2.0。

  即便许多互联网基础设施本身,包括在大多数网络服务器中用到的Linux,Apache,MySQL,以及Perl,PHP或Python代码,也都依靠开放源码的对等生产(peer-production)的方式。其中包含了一种集体的、网络赋予的智慧。在SourceForge.net网站上列有至少10万种开放源码软件项目。任何人都可以添加一个项目,任何人都可以下载并使用项目代码。

  同时,由于作为用户使用的结果,新的项目从边缘迁移到中心。一个对软件的有机的接受过程几乎完全依靠病毒式营销。同时,作为用户应用的结果,新的项目从边缘迁移到中心,这是一种几乎完全依靠病毒式营销的,有机的软件采用过程,。

  经验是:源于用户贡献的网络效应,是在Web 2.0时代中统治市场的关键。
平台总是打败应用程序
在过去每次同对手的竞争中,微软都成功地打用了平台这张牌,打败了即便是最占主导地位的应用程序。Windows平台让微软以Excel取代了Lotus 1-2-3,以Word取代了WordPerfect,,以Internet Explorer取代了Netscape浏览器。
不过这次,冲突不是在平台和应用程序之间,而是在两种平台之间。每个平台皆有一种截然不同的商业模式:一方面,一个独立软件商具有广泛的用户基础并且将应用程序接口和操作系统紧密集成,从而对程序设计模式予以控制;另一方面,是一个没有所有者的系统,由一组协议、开放标准和对合作的共识来连结到一起。
Windows系统代表了由软件程序接口来进行专有控制的高峰。Netscape曾尝试用微软当初对付其对手所使用的手段,来同微软进行争夺,但是失败了。然而拥有互联网开放标准的Apache却已经繁荣了起来。此番上演的战局,已经不再是实力悬殊的平台对决孤立的软件了,而是变成了平台对决平台。问题在于,哪个平台,或者更深远地来说哪个体系,以及哪个商业模式,最能适应未来的机遇。
Windows对于早期的PC时代的问题是一种卓越的解决方案。它统一了程序开发者的竞技场,解决了很多困扰这个领域的问题。但这种由单一供方控制的一刀切的方法,已经不再是适宜的解决方案,而成为了一种问题。面向交流的系统需要协同性,互联网作为一个平台当然也是如此。除非供方可以控制每一例交互的两个终端,这种通过软件的程序接口来锁定用户的可能性微乎其微。
任何企图通过控制平台来推销应用程序的Web 2.0提供商,从定义上讲,已经丧失了这个平台的优越性。
这并不是说锁定和竞争优势的机会不复存在了,而是说我们相信这种机会不是通过控制软件程序接口和协议来取得的。新的游戏规则正在浮现。那些能够理解这些新的游戏规则,而不是企图回到PC软件时代旧有规则的公司,才有可能在Web 2.0时代获得成功。

  博客和大众智慧

  Web 2.0时代一项最受追捧的特性就是博客的兴起。个人主页从互联网早期就已经存在了,而个人日记和每日发表观点的专栏就更渊源久远了,那么到底有什么让人大惊小怪的呢?

  归根底地,博客只是一种日记形式个人网页。但正如里奇·斯格仁塔(Rich Skrenta)指出的,博客的按时间顺序来排列的结构“看起来像是一个微不足道的变化,但却推动着一个迥然不同的分发、广告和价值链。”

  其中一大变化就是一项称为RSS的技术。RSS是自早期计算机高手们认识到CGI(公共网关接口)可用来创建以数据库为基础的网站以来,在互联网根本结构方面最重要的进步。RSS使人们不仅仅链接到一个网页,而且可以订阅这个网页,从而每当该页面产生了变化时都会得到通知。斯格仁塔将之称为“增量的互联网”(incremental web)。其他人则称之为“鲜活的互联网”(live web)。

  当然,现在所谓“动态网站”(即具有动态产生的内容的、由数据库驱动的网站)取代了十年前的静态网站。而动态网站的活力不仅在于网页,而且在链接方面。一个指向网络博客的链接实际上是指向一个不断更新的网页,包括指向其中任何一篇文章的“固定链接”(permalinks),以及每一次更新的通知。因此,一个RSS是比书签或者指向一个单独网页的链接要强大得多。

  RSS同时也意味着网页浏览器不再只是限于浏览网页的工具。尽管诸如Bloglines之类的RSS聚合器(RSS aggregators)是基于网络的,但其他的则是桌面程序,此外还有一些则可以用在便携设备上来接受定期更新的内容。

  RSS现在不仅用于推送新的博客文章的通知,还可以用于其他各种各样的数据更新,包括股票报价、天气情况、以及图片。这类应用实际上是对RSS本源的一种回归:RSS诞生于1997年,是如下两种技术的汇合:一种是戴夫·温纳(Dave Winer)的“真正简单的聚合”(Really Simple Syndication)技术,用于通知博客的更新情况;另一种是Netscape公司提供的“丰富站点摘要”(Rich Site Summary)技术,该技术允许用户用定期更新的数据流来定制Netscape主页。后来Netscape公司失去了兴趣,这种技术便由温纳的一个博客先驱公司Userland承接下来。不过,在现在的应用程序实现中,我可以看出两者共同的作用。

  但是,RSS只是令博客区别于同普通网页的一部分原因。汤姆·科特斯(Tom Coates)这样评论固定链接的重要性:

  “现在它可能看上去像是一项普普通通的功能,但它却有效地将博客从一个易于发布(ease-of-publishing)的现象,进一步转变为互相交叉的社区的一种对话式的参与。这是首次使得对其他人的网站上的很特定的帖子表态和谈论变得如此地容易。讨论出现了,聊天也出现。同时,其结果是出现了友谊或者友谊更加坚定了。固定链接是第一次也是最为成功的一次在博客之间搭建桥梁的尝试。”

  在许多方面,RSS同固定链接的结合,为HTPP(互联网协议)增添了NNTP(新闻组的网络新闻协议)的许多特性。所谓“博客圈”(blogosphere),可以将其视作一种同互联网早期的、以对话方式来灌水的新闻组和公告牌相比来说,新型的对等(peer-to-peer)意义上的等价现象。人们不仅可以相互订阅网站并方便地链接到一个页面上的特定评论,而且通过一种称为引用通告(trackbacks)的机制,可以得知其他任何人链接到了他们的页面,并且可以用相互链接或者添加评论的方式来做出回应。

  有趣的是,这种双向链接(two-way links)曾是象Xanadu之类的早期超文本系统的目标。超文本纯粹论者已然将引用通告颂扬为向双向链接迈进了一步。但需要注意的是,引用通告不是一个真正的双向链接,确切地讲是一种(潜在地)实现了双向链接效果的对称式单向链接。其间的区别看起来可能很细微,但实际上却是巨大的。诸如Friendster, Orkut和LinkedIn那样的社交网络系统(social networking systems),需要接受方做出确认以便建立某种连接,从而缺少像互联网架构本身那样的可伸缩性。正如照片共享服务Flickr网站的创始人之一卡特里纳·费克(Caterina Fake)所指出的,注意力仅在碰巧时才礼尚往来。(Flickr因此允许用户设置观察列表,即任何用户都可以通过RSS来订阅其他所有用户的照片流。注意的对象将会被通知,但并不一定要认可这种连接。)

  如果Web 2.0的一个本质是利用集体智慧,来将互联网调试为一种所谓的全球的大脑,那么博客圈就是前脑中喋喋不休的呓语,那种我们整个头脑中都能听到的声音。这可能并不反映出大脑的往往是无意识的深层结构,但却是一种有意识的思考的等价物。作为一种有意识的思考和注意力的反映,博客圈已经开始具有强有力的影响。

  首先,因为搜索引擎使用链接结构来辅助预测有用的页面,作为最多产和最及时的链接者,博客们在修整搜索引擎结果方面充当着一种不成比例的角色。其次,因为博客社区是如此多地自相引用,关注其他博客的博客们开阔了他们的视野和能力。此外,评论家们所批判的“回音室”(echo chamber)也是一种放大器。

  如果只是一种放大器,那么撰写博客将会变得无趣。但是像维基百科全书一样,博客将集体智慧用作一种过滤器。被詹姆士·苏瑞奥维奇(James Suriowecki)称为“大众智慧”(the wisdom of crowds)的规律起了作用,并且就像PageRank技术所产生的结果胜过分析任何单一文档一样,博客圈的集体关注会筛选出有价值的东西。

  虽然主流媒体可能将个别的博客视为竞争者,但真正使其紧张的将是同作为一个整体的博客圈的竞争。这不仅是网站之间的竞争,而且是一种商业模式之间的竞争。Web 2.0的世界也正是丹·吉尔默(Dan Gillmor)的所谓“个人媒体”(We,the media)的世界。在这个世界中,是所谓“原本的听众”,而不是密实里的少数几个人,来决定着什么是重要的。

  3. 数据是下一个Intel Inside

  现在每一个重要的互联网应用程序都由一个专门的数据库驱动:Google的网络爬虫, Yahoo!的目录(和网络爬虫),Amazon的产品数据库,eBay的产品数据库和销售商,MapQuest的地图数据库,Napster的分布式歌曲库。正如哈尔·瓦里安(Hal Varian)在去年的私人对话中谈到的,“SQL是新的HTML”。数据库管理是Web 2.0公司的核心竞争力,其重要性使得我们有时候称这些程序为“讯件”(infoware)而不仅仅是软件。

  该事实也引出了一个关键问题:谁拥有数据?

  在互联网时代,我们可能已经见到了这样一些案例,其中对数据库的掌控导致了对市场的支配和巨大的经济回报。当初由美国政府的法令授权给Network Solutions公司(后被Verisign公司收购)的对域名注册的垄断,曾经是互联网上的第一个摇钱树。虽然我们在争论通过控制软件的API来形成商业优势在互联网时代会变得困难得多,但是对关键数据资源的控制则不同,特别是当要创建这些数据资源非常昂贵,或者经由网络效应容易增加回报的时候。

  注意一下由MapQuest, maps.yahoo.com,maps.msn.com,或者maps.google.com等网站提供的每张地图下面的版权声明,你会发现这样一行字“地图版权NavTeq,TeleAtlas”,或者如果使用的是新的卫星图像服务,则会看到“图像版权Digital Globe”的字样。这些公司对其数据库进行了大量的投资。(仅NavTeq一家,就公布投资7.5亿美元用于创建其街道地址和路线数据库。Digital Globe则投资5亿美元来启动其自有卫星,来对政府提供的图像进行改进。)NavTeq竟然已做了很多模仿Intel的耳熟能详的Intel Inside标识的事:例如带有导航系统的汽车就带有“NavTeq Onboard”的印记。数据是许多此类程序事实上的Intel Inside,是一些系统的唯一的信息源组件,这些系统的软件体系多数是开放源码的,也有商业化的。

  当前竞争火热的网络地图(web mapping)领域显示着,对拥有软件核心数据的重要性的疏忽大意,将最终削弱其竞争地位。MapQuest在1995年率先进入地图领域,随后是Yahoo!,再后来是Microsoft,而最近Google也决定挺进这一市场,他们可以轻松地通过对同一数据的授权来提供一个具有竞争力的程序。

  然而,作为对比的是Amazon.com的竞争地位。像Barnesandnoble.com这样的竞争者一样,其原始数据库来自于ISBN注册商.R. Bowker。但是同MapQuest不同,Amazon大力增强其数据,增加出版商提供的数据,例如封面图片,目录,索引,和样张材料。更重要的是,他们利用了其用户来评注数据,以至于十年之后,是Amazon而不是Bowker,成为图书文献信息的主要来源,一个学者、图书管理员和消费者的参考书目来源。Amazon还引入了其专有的标识符,即ASIN,该标识符在ISBN存在时与之对应,而当产品不带有ISBN时,就创建出一个等价的命名空间。Amazon从而有效地“吸收和拓展了”其数据提供商。

  设想如果MapQuest也已做了同样的事情,利用他们的用户来评注地图和路线,添加新的价值层面。那么对仅仅通过授权使用基础数据来进入这一市场的其他竞争者,将造成远远大得多的困难。

  近期Google地图的引入,为应用程序销售商和其数据提供商之间的竞争,提供了一个活生生的实验室。Google的轻量型编程模型已经引发了不计其数的增值服务的出现,这些服务以数据混合的方式,将Google的地图同其他可以通过互联网访问的数据源相结合。保罗·拉特马赫(Paul Rademacher)的housingmaps.com是这种混合的一个上佳范例,其网站将Google的地图同Craigslist的公寓出租,以及住宅购买数据相结合,来创建一种交互式的房屋搜索工具。

  目前,这些混合大多是由程序高手们实现的创新性的实验产品。但是企业行动将紧随其后。并且,人们已经可以从至少一类开发者中发现这一点。Google已经将数据源提供者的角色从Navteq那里夺走,并且将自己定位为一个令人喜爱的中介者。在以后几年里,我们将会看到数据提供商和程序销售商之间的斗争,因为两大阵营都认识到了,特定的数据类别在作为搭建Web 2.0程序的积木时是多么的重要。

  这场竞赛已经涉及到拥有特定类别的核心数据:位置、身份、公共事件日历、产品标识和命名空间等。在许多情况下,在那些创建数据需要巨额成本的地方,也可能存在一种如同Intel Inside方式一样凭借单一数据源来所有作为的机遇。其他情况下,胜者将是那些通过用户聚合来达到临界规模,并且将聚合的数据融入系统服务中的公司。

  比如,在身份标识领域,PayPal,Amazon的一键式,以及拥有数百万用户的交流系统,都有可能成为创建整个网络范围的身份标识数据库的正当竞争者。(关于此,Google最近使用手机号码作为Gmail账号标识的尝试,可能就是朝借鉴和拓展电话系统所迈出的一步。)同时,像Sxip这样的创业公司,正在探索联合身份标识的可能性,以寻求一种“分布一键式”,从而提供一个无缝的Web 2.0标识子系统。在日历领域,EVDB则是通过维基式参与体系来搭建世界上最大的共享日历的一种尝试。虽然评判者尚在观望着任何一个特定创业公司或方式的成功是否,但很显然,这些领域的标准和解决方案,有效地将某些数据转变为“互联网操作系统”(internet operating system)的可靠的子系统,并将促成下一代的应用程序。

  关于数据,必须注意一个进一步的方面,那就是用户关心其隐私和对自己的数据的权限。在许多早期的网络程序中,版权只被松散地执行。例如,Amazon宣称对任何提交到其网站的评论的所有权,但却缺少强制性,人们可以将同样的评论转贴到其他任何地方。然而,随着很多公司开始认识到,对数据的掌控有可能成为他们首要的竞争优势来源,我们将会看到在此类控制方面强度更大的尝试。

  正如专有软件的增长而导致自由软件运动一样,在下一个10年中我们会看到专有数据库的增长将导致自由数据运动。在像维基百科全书这样的开放数据项目、创作共用(Creative Commons)、以及像Greasemonkey(让用户决定如何在其计算机上显示数据)这样的软件项目中,我们可以看到这种对抗势头的前兆。

参与的体系
一些系统被设计为鼓励参与。在丹·布莱克林(Dan Bricklin)的论文“共用的丰饶”(The Cornucopia of the Commons)中,他指出有三种创建大型数据库的方式。第一种,已经由Yahoo!来体现了,就是付费给人们来实现。第二种,由开放源码社区的经验启发而来,就是让志愿者来完成同样的任务。开放目录项目(Open Directory Project),一个Yahoo的开放源码竞争者,就是该方式的产物。但是Napster体现了第三种方式。因为Napster将其默认设置为自动为任何已经下载的音乐服务,任何用户都自动地帮助建立共享数据库的价值。同样的方式已经被其他所有P2P文件共享服务所采用。Web 2.0时代的一个关键经验在于:用户增加价值。但是只有很小一部分用户会有意来为你的程序增加价值,而不怕麻烦。因而,Web 2.0公司均进行了这样的默认设置,即作为程序通常使用方式的副产品,来聚合用户数据并创造价值。正如上面所指出的,他们在搭建那种用户越多则效果越好的系统。
米切尔·卡普尔(Mitch Kapor)曾经指出“体系是策略”。参与是Napster的本质,其根本体系的一部分。
同更经常被引用的所谓“吸引志愿精神”的原因相比,这种体系结构上的洞察力可能更能抓住对开放源码软件成功的本质。互联网、万维网(World Wide Web)、以及像Linux、Apache和Perl这样的开放源码软件项目的体系结构,均是这样一种设计,使得作为一种自动产生的副产品,谋求其自身利益的用户们创建着集体的价值。这些项目中的任何一个都有一个很小的核心、一种设计良好的扩展机制、和一种让任何人来添加任何合乎规定的组件的方式,不断增长着被Perl语言的创始人拉里·沃尔(Larry Wall)称为“洋葱头”(the onion)的外部层面。换句话说,这些技术通过他们本来的设计方式,体现着网络的效应。


  4. 软件发布周期的终结

  如上文在对Google和Netscape的比较中谈到的,互联网时代软件的代表性特征就是它应该被作为服务来交付。这种事实导致这类公司的商业模式上很多根本性的变化。

  1. 运营必须成为一种核心竞争力。Google或者Yahoo!在产品开发方面的专门技术,必须同日常运营方面的专门技术相匹配。从软件作为制造品到软件作为服务的变化是如此地根本,以至于软件将不再能完成任务,除非每日加以维护。Google必须持续抓取互联网并更新其索引,持续滤掉链接垃圾和其他影响其结果的东西,持续并且动态地响应数千万异步的用户查询,并同步地将这些查询同上下文相关的广告相匹配。

  所以,Google的系统管理、网络、和负载均衡技术,可能比其搜索算法更被严加看管,也就不足为奇了。Google在自动化这些步骤上的成功是其同竞争者相比更有成本优势的一个关键方面。

  同样也不足为奇的是,像Perl、Python、PHP、和当前的Ruby这样的脚本语言在Web 2.0公司中扮演着重要角色。Sun公司的第一个网管哈桑·施罗德(Hassan Schroeder)曾对Perl有一个著名的形容:“互联网的管道胶带”(the duct tape of the internet)。事实上,动态语言(常常被称为脚本语言,并被软件制品时代的软件工程师所贬低),是系统和网络管理员,以及创建可经常更新的动态系统的程序开发者们所喜爱的工具。

  2. 用户必须被作为共同开发者来对待,这是从对开放源码开发实践的一种反思中得出的(即便所涉及的软件不太可能以开放源码授权方式来发行)。开放源码的格言“早发布并常发布”(release early and release often)事实上已经演变成一种更为极端的定位“永远的测试版”(the perpetual beta)。其中产品在开放状态下开发,新的功能以每月、每周、甚至每天的速度被加入进来。Gmail、Google Maps、Flickr、del.icio.us,和其他类似的服务,可能会在某个阶段打着测试版的标识多年。

  故此,实时地监测用户行为,来考察哪些新特性被使用了,以及如何被使用的,将成为另外一种必须的核心竞争力。一位工作于一个主要在线服务网络商的开发者评论道:“我们每天在网站的某些部分提供两到三个新的特性,而且如果用户不采用它们,我们就将其撤掉。如果用户喜欢它们,我们就将其推广到整个网站。”

  Flickr的总开发师卡尔·亨德森(Cal Henderson),近来透露了他们是如何在短至每半个小时就部署一个新版本的。显而易见,这是同传统方式有天壤之别的开发模式。虽然不是所有的网络程序都以像Flickr这样的极端方式来开发,但几乎所有网络程序都有一个同任何PC或者客户-服务器时代截然不同的开发周期。正因如此,ZDnet杂志才论断Microsoft不会打败Google:“Microsoft的商业模式依赖于每个人在每两到三年都升级他们的计算环境。Google的模式则依靠任何人每天在其计算环境中自行探索新东西。”

  虽然Microsoft已经体现了从竞争中学习并最终做得最好的强大能力,但是毫无疑问这一次的竞争要求Microsoft(可以扩展到任何现存的软件公司)来成为一种在深入层面上显著有别的公司。天生的Web 2.0公司在享受自然而然的优势,因为它们不需要去摆脱陈旧的模式(及其相应的商业模式和营收来源)。

  5. 轻量型编程模型

  一旦网络服务的观念深入人心,大型公司将以复杂的网络服务堆栈来加入到纷争之中。这种网络服务堆栈被设计用来为分布式程序建立更可靠性的编程环境。

  但是,就像互联网成功正是因为它推翻了许多超文本理论一样,RSS以完美的设计来取代简单的实用主义,已经因其简单性而成为大概是应用最广泛的网络服务,而那些复杂的企业网络服务尚未能实现广泛的应用。

  类似地,Amazon.com的网络服务有两种形式:一种坚持SOAP(Simple Object Access Protocol,简单对象访问协议)网络服务堆栈的形式主义;另一种则简单地在HTTP协议之外提供XML数据,这在轻量型方式中有时被称为REST(Representational State Transfer,代表性状态传输)。虽然商业价值更高的B2B连接(例如那些在Amazon和一些像ToysRUs这样的零售伙伴之间的连接)使用SOAP堆栈,但是根据Amazon的报道,95%的使用来自于轻量型REST服务。

  同样的对简易性的要求,可以从其他“朴实的”网络服务中见到。Google近来的Google地图的推出就是一个例子。Google地图的简单AJAX(Javascript和XML的结合)接口迅速被程序高手们破译,被随即进一步将其数据混合到新的服务之中。

  地图相关网络服务已经存在了一段时间,例如像ESRI那样的GIS(地理信息系统),以及从MapQuest和Microsoft的MapPoint。但是Google地图以其简洁性而让世界兴奋起来。虽然从前销售商所支持的网络服务都要求各方之间的正式约定,但Google地图的实现方式使数据可以被捕获,于是程序高手们很快就发现了创造性地重用这些数据的方法。

  这里有几条重要的经验:

  1. 支持允许松散结合系统的轻量型的编程模型。由企业开发的网络服务堆栈的复杂设计是用来促成紧密结合的。虽然这在许多情况下是必须是,但是许多最重要的应用程序可以事实上保持松散结合,甚至是脆弱的结合。Web 2.0的理念同传统的IT的理念迥然不同。

  2. 考虑聚合(syndication)而不是协调(coordination)。简单的网络服务,例如RSS和基于REST的网络服务,是用来向外聚合数据,但并不控制其达到连接的另外一端时发生的事情。这种想法是互联网本身的基础,一种对所谓端到端原则的反映。

  3. 可编程性和可混合性设计。像最初的互联网一样,RSS和AJAX这样的系统,都有此共同点:重用的障碍非常低。许多有用的软件事实上是开放源码的,而即便它不是,也没有许多东西来保护其知识产权。互联网浏览器的“查看源文件”选项,使得许多用户可以复制其他任何用户的网页;RSS被设计得使用户能够在需要的时候查看所需要的内容,而不是按照信息提供者的要求;最成功的网络服务,是那些最容易采纳未被服务创建者想到的新的方向。同更普遍的“保留所有权利”(all rights reserved)相比,随着创作共用约定而普及的“保留部分权利”(Some Rights Reserved)一词成为一个有益的指路牌。

  装配中的创新

  轻量型商业模型是对轻量型编程和轻量型结合的一种自然产物。Web 2.0的理念善于重用。一种像housingmaps.com这样的新服务,是通过将两个现存服务抓取到一起来简单地创建起来的。Housingmaps.com还没有商业模式(目前为止),但对于许多小规模的服务,Google的AdSense(或Amazon的associates fees计划,或者两者都是)为同类服务提供了营收模式。

  这些案例为Web 2.0的另外一个关键原则提供了启发,我们将之称为“装配中的创新”。当商品组件充裕时,你可以通过以新颖的或者有效的方式来装配这些组件来创建价值。很像PC革命为硬件商品装配提供了许多创新的机会,其中像Dell这样的公司创造了这种装配的科学,并从而打败了那些商业模式上要求产品开发方面的创新的公司,我们相信Web 2.0为各个公司提供了,通过在利用和整合由其他人提供的服务方面逐渐完善,来赢得竞争的机会。

  6. 软件超越单一设备

  另外一个值得一提的Web 2.0特性是Web 2.0已经不再局限于PC平台这样一个事实。在对Microsoft的告别建议中,长期的Microsoft开发者戴夫·斯塔兹(Dave Stutz)指出:“超越单一设备而编写的有用软件将在未来很长一段时间里获得更高的利润”。

  当然,任何的网络程序都可被视为超越单一设备的软件。毕竟,即便是最简单的互联网程序也涉及至少两台计算机:一个负责网络服务器,而另一个负责浏览器。而且就如我们已经探讨过的,在将网络作为平台的开发中,把这个概念拓展到由多台计算机提供的服务而组成的合成应用程序中。

  但是如同Web 2.0的许多领域一样,在那些领域中“2.0版的事物”(2.0-ness)并不是全新的,而是对互联网平台真正潜能的一种更完美的实现,软件超越单一设备这一说法赋予我们为新平台设计程序和服务的关键性的洞察力。

  迄今为止,iTunes是这一原则的最佳范例。该程序无缝地从掌上设备延伸到巨大的互联网后台,其中PC扮演着一个本地缓存和控制站点的角色。之前已经有许多将互联网的内容带到便携设备的尝试,但是iPod/iTunes组合却是这类应用中第一个从开始就被设计用于跨越多种设备的。TiVo则是另外一个不错的例子。

  iTunes和TiVo也体现了Web 2.0的其他一些核心原则。它们本身都不是网络程序,但都利用了互联网平台的力量,使网络成为其体系中无缝连接的、几乎不可察觉的一部分。数据管理显然是它们所提供的价值的核心。它们也是服务,而非打包的程序(虽然对于iTunes来说,它可以被用作一个打包的程序来仅仅管理用户本地的数据)。不仅如此,TiVo和iTunes都展示了一些集体智慧的方兴未艾的应用。虽然对于每个情况,其实验都是同网络IP入口的周旋。iTunes中只有有限的参与体系,虽然近来增加的播客(podcasting)将这一规则规律性了不少。

  这正是我们希望看到伟大变革的Web 2.0领域中的一个,随着越来越多的设备正连接到这个新的平台中来。当我们的电话和汽车虽不消费数据但却报告数据时,可能会出现什么样的程序呢?实时的交通监测、快闪暴走族(flash mobs)、以及公民媒体,只不过是新平台的能力的几个早期警示。

一篇Web 2.0的投资论文
风险投资家保罗·科德罗斯基(Paul Kedrosky )写道:“关键在于去寻找一种你共识相左的,具有可操作性的投资”。有趣的是,我们注意到Web 2.0的每个方面都涉及到同共识的分歧:每个人都在强调保持数据隐私的重要性,而Flickr/Napster等等,却使其公开化。这并非只是为了分歧而分歧(比如追求宠物食在线),而是在可以从中创建出一些东西的地方发生分歧。Flickr缔造了社区,Napster创造了收藏的广度。
另外一种看待这种现象的方式,就是成功的公司都放弃了一些昂贵但被认为重要的东西,以便免费获得一些有价值的曾经昂贵过的东西。例如,维基百科全书放弃了集中的编审控制,以作为对速度和广度的回报。Napster放弃了“目录册”的想法(列出所有销售商正在销售的歌曲),并因此获得了广度。Amazon放弃了用于一个实体店面的想法,却从而服务于整个世界。Google放弃了大宗用户(开始的时候),却得到了80%的,其要求从前未被满足的用户。下面的说法很有一些合气道(借力打力)的精神:“你知道,你是对的——整个世界的人都绝对可以更新这篇文章。而且你猜怎么着,这对你是个坏消息”。
——内森·托克英顿(Nat Torkington)


  7. 丰富的用户体验

  最早可以追溯到1992年魏裴(Pei Wei)开发的Viola浏览器,互联网就被用来在网页浏览器中传送“小程序”(applet)和其他一些活动内容。1995年Java的引入就是围绕着这样的小程序的传送。JavaScript和后来的DHTML都被作为轻量型方式引入,来为客户端提供可编程性和丰富的用户体验。几年以前,Macromedia缔造出“丰富的互联网应用程序”(Rich Internet Applications)一词(该词也被Flash的竞争者开放源码的Laszlo系统使用),以便凸显Flash不仅可传送多媒体内容,而且可以是GUI(图形用户界面)方式的应用程序体验。

  然而,互联网传递整个应用程序的潜能在Google引入Gmail之前,一直没有成为主流,紧接着就是Google地图程序,一些基于互联网的带有丰富用户界面以及PC程序等同的交互性的应用程序。在网络设计公司Adaptive Path的耶希•詹姆斯•加莱特(Jesse James Garrett)的一个讨论会论文中,Google所使用的这组技术被命名为AJAX。他写道:

  Ajax不是一项技术。它其实是几项技术,每项技术自身都很繁荣,它们以强有力的全新方式结合起来。Ajax涵盖:
-- 运用XHTML和CSS实现基于各种标准的展示。
-- 运用文档对象模型(Document Object Model)实现动态显示和交互。
-- 运用XML和XSLT实现数据交换和操作。
-- 运用XMLHttpRequest实现异步数据检索。
-- JavaScript将所有这些绑定到一起。

  AJAX也是Web 2.0程序的一个关键组件,例如现在归属Yahoo!的Flickr,37signals的程序basecamp和backpack,以及其他Google程序,例如Gmail和Orkut。我们正在步入一个史无前例的用户界面创新阶段,因为互联网开发者们终于可以创建,像本地基于PC的应用程序一样丰富的网络程序了。

  有趣的是,许多现在正被探索的功能已经存在了很多年了。90年代后期,Microsoft和Netscape,都对现在终于被认识到的那些功能有所洞察,但是它们对于所要采用的标准的争斗,使得实现跨浏览器的应用程序变得困难。仅在当初Microsoft确定无疑地赢得了浏览器之战的时候,而且那时事实上只需要针对一个浏览器标准,编写这种程序才成为可能。同时,虽然Firefox在浏览器市场中重新引入了竞争,但至少在目前我们还没有看到对互联网标准的破坏性的争夺以至于我们倒退到90年代。

  在接下来的几年中,我们会看到许多新的网络程序,不仅确实是新颖的程序,而且是对PC程序丰富的网络再现。到目前为止,每个平台的变革也都为改变那些在旧平台中占主导地位的程序的领导地位创造了机会。

  Gmail已经在电子邮件中提供了一些有意思的创新,将互联网的力量(随处可访问、深层的数据库能力、可搜索性)与在易用性方面同PC界面接近的用户界面相结合。同时, PC平台上的其他邮件程序,正在从另一端通过增添IM和呈现能力,来蚕食着这一领域。我们离集成通信客户端有多少远呢?这些集成通信客户端应是整合了电子邮件、即时通信和手机,并且应使用VoIP以便向网络程序的丰富功能中添加语音能力。这种竞赛已经开始。

  我们也很容易看到Web 2.0是如何重新打造地址簿的。一个Web 2.0风格的地址薄将把PC或电话上的本地地址簿,仅仅当作一种你显式要求系统记忆的联系人的缓存。同时,一个基于互联网的Gmail风格的异步代理,将保存发送或者接收的每个消息,每个电子邮件地址和每个使用过的电话号码,并且创造出社交网络的启发性算法,来决定当一个答案不能在本地缓存中找到时,应该提供哪个作为替代。在缺少答案的情况下,该系统会查询更广阔的社交网络。

  一个Web 2.0的字处理程序将会支持维基风格的协作编辑,而不仅仅是处理独立的文档。但是该程序也会支持我们期望在基于PC的字处理器中得到的那种丰富格式。Writely是这种程序的一个优秀范例,虽然它尚未引起广泛关注。

  此外,Web 2.0革命不会局限于PC程序。例如,在CRM这样的企业级应用程序中,Salesforce.com展示了网络是如何被用来以服务的方式来传递软件的。

  对新的进入者来说,竞争机会在于充分开发Web 2.0的潜能。成功的公司将创建可以向其用户学习的程序,利用可供参与的体系来建立一种决定性的优势,不仅在软件的界面方面,而且在共享数据的丰富程度方面。


  Web 2.0公司的核心竞争力
  
  在探索上述七大原则的过程中,我们已经强调了Web 2.0的一些主要特性。我们探讨的每一个例子都体现着这些原则中的一个或多个,但是可能不满足其他的原则。因此,让我们通过总结我们认为是Web 2.0公司核心竞争力的一些方面,来结束本文。

-- 服务,而不是打包的软件,具有高成本效益的可伸缩性。
-- 控制独特的、难以再造的数据源,并且用户越多内容越丰富。
-- 把用户作为共同开发者来信任。
-- 利用集体智慧。
-- 通过客户的自服务来发挥长尾的力量。
-- 软件超越单一设备。
-- 轻量型用户界面、开发模式、和商业模式。

  今后一个公司要宣称是“Web 2.0”,就要将其特性同上述列表相测试。越符合就越名副其实。不过要记住,在某一个领域的卓越表现,可能会比对七大原则中的每个都浅尝则止,要更为有效。

Web 2.0的设计模式
在“模式语言”(A Pattern Language)一书中,克里斯多夫•亚历山大(Christopher Alexander)为精炼描述对于体系结构问题的解决方案,开了一种格式上的处方。他写道:“每个模式都描述着一种在我们的环境中一遍又一遍地出现的问题,并因此描述了对该问题的核心解决方案。以此方式你可以使用该方案上百万次,而从不需要重复作同样的事情。”
1. 长尾
小型网站构成了互联网内容的大部分内容;细分市场构成了互联网的大部分可能的应用程序。所以,利用客户的自服务和算法上的数据管理来延伸到整个互联网,到达边缘而不仅仅是中心,到达长尾而不仅仅是头部。
2. 数据是下一个Intel Inside
应用程序越来越多地由数据驱动。因此:为获得竞争优势,应设法拥有一个独特的,难于再造的数据资源。
3. 用户增添价值
对互联网程序来说,竞争优势的关键在于,用户多大程度上会在你提供的数据中,添加他们自己的数据。因而,不要将你的“参与的体系”局限于软件开发。要让你的用户们隐式和显式地为你的程序增添价值。
4. 默认的网络效应
只有很小一部分用户会不嫌麻烦地为你的程序增添价值。因此:要将默认设置得使聚合用户的数据,成为用户使用程序的副产品。
5. 一些权力保留
知识产权保护限制了重用也阻碍了实验。因而,在好处来自于集体智慧而不是私有约束的时候,应确认采用的门槛要低。遵循现存准则,并以尽可能少的限制来授权。设计程序使之具备可编程性和可混合性。
6. 永远的测试版
当设备和程序连接到互联网时,程序已经不是软件作品了,它们是正在展开的服务。因此,不要将各种新特性都打包到集大成的发布版本中,而应作为普通用户体验的一部分来经常添加这些特性。吸引你的用户来充当实时的测试者,并且记录这些服务以便了解人们是如何使用这些新特性的。
7. 合作,而非控制
Web 2.0的程序是建立在合作性的数据服务网络之上的。因此:提供网络服务界面和内容聚合,并重用其他人的数据服务。支持允许松散结合系统的轻量型编程模型。
8. 软件超越单一设备
PC不再是互联网应用程序的唯一访问设备,而且局限于单一设备的程序的价值小于那些相连接的程序。因此:从一开始就设计你的应用程序,使其集成跨越手持设备,PC机,和互联网服务器的多种服务。


  奥莱理媒体公司(O'Reilly Media Inc.) 主席兼CEO 提姆·奥莱理(Tim O'Reilly)授权刊登,  美国密西根大学资深软件分析师玄伟剑提供全文翻译。 节略版请参见1121期杂志

posted @ 2006-06-08 21:30 一个春天 阅读(139) 评论(0) 编辑

2005年4月4日

biztalk中调用.NET类

原来以为只有Web Services,或者COM+的东西,在Biztalk中才能使用,其实不然,连一般的.NET类Biztalk也能使用。估计用这种方法效率会高一点。
以下是从网上找到的关于调用方法的描述:
http://dallas.sark.com/SarkBlog/mholdorf/archive/2004/09/30/405.aspx

http://blogs.msdn.com/darrenj/archive/2004/09/29/235719.aspx

http://dallas.sark.com/SarkBlog/mholdorf/archive/2004/10/05/416.aspx

下面根据上面的文章,来个Walkthrough:
1.新增解决方案NetCompTest.sln
2.在解决方案下新增项目,项目类型"C#项目/类库",项目名NetComp
3.NetComp项目下的Class1.cs代码如下:
using System;

namespace NETComp
{
 /// <summary>
 /// Class1 的摘要说明。
 /// </summary>
 [Serializable]
 public class NetCompClass
 {
  public NetCompClass()
  {
   //
   // TODO: 在此处添加构造函数逻辑
   //
  }

  public string SayHello(string personName)
  {
   return "你好!" + personName;
  }
 }
}
4.AssemblyInfo.cs中加入[assembly: AssemblyKeyFile("E:\\BiztalkTest\\biztalktest.snk")],其中E:\\BiztalkTest\\biztalktest.snk为事先用sn命令生成好的密匙文件
5.生成项目NetComp.然后使用命令gacutil -i dll文件名(包括路径)发布到GAC
(tobe continue)

posted @ 2005-04-04 13:11 一个春天 阅读(720) 评论(4) 编辑