<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>差沙</title>
    <description>改头像了，你好！</description>
    <link>http://sshwsfc.javaeye.com</link>
    <language>UTF-8</language>
    <copyright>Copyright 2003-2008, JavaEye.com</copyright>
    <docs>http://blogs.law.harvard.edu/tech/rss</docs>
    <generator>JavaEye - 做最棒的软件开发交流社区</generator>
      <item>
        <title>Google Developer Day 收获</title>
        <author>差沙</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sshwsfc.javaeye.com">差沙</a>&nbsp;
          链接：<a href="http://sshwsfc.javaeye.com/blog/203462" style="color:red;">http://sshwsfc.javaeye.com/blog/203462</a>&nbsp;
          发表时间: 2008年06月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          前些天去参加了Google的开发日活动，由于之后直接就去郊区所以一直没有时间写blog来谈谈感想。首先是google的OpenSocial，进入大厅签到之后转角过去就是个大网站的展台，每个柱子的一面是一个网站，都是OpenSocial的合作网站，有聚友，天际，天涯等。有幸跟聚友的CTO谭晓生先生和天际网的CTO郭应寿先生聊了聊OpenSocial使用中的益处和遇到的问题，感觉OpenSocial目前还是不太成熟，对比FB来说还有一定的差距，比如没有照片处理等等问题。而且我始终有一种感觉，OpenSocial是一个google的标准，但是各大网站在使用OpenSocial的时候几乎都会加上自己的扩展，这样下去，最终OpenSocial统一平台的目标很难实现，因为两个网站的Gidget几乎不能通用，这些问题OpenSocial的合作网站跟Google也在讨论中。另外得到的消息是，OpenSocial可能也会考虑出一套XXml，规范化OpenSocial的使用，并借此加强安全性。<br />稍后的OpenSocial专题topic中了解到了更多有关OpenSocial的信息，主要是Shindig了, 前一天还在跟白衣提议用ss做一个类似Shindig的东西，主要是做一个OpenSocial的实现，当时就想这玩意估计有了，但是没想到是host到apache了，在apache的孵化器中大家可以自己找找。会议的时候逮住了一个google的人问了一堆问题，过后才知道原来是google中国sns的负责人。<br />最大的收获实在是太意外了，在中午休息的时候，走过过道到楼下吃饭，突然发现一个熟悉的身影坐在角落里一个人在玩电脑，我晕是Andy Rubin，Android的老大。居然就坐在那里，而且旁边的人没有人在意他，要知道听android topic的人可不少呀，居然每一个人认出他来的。我叫了朋友确认一下，准备上前打招呼。刚上去打了个招呼，握了个手，又来了一个人，他一下认出Andy，并且跟Andy简短的交谈了一下。我提议先照个相，照相后简短聊下那个人就走了。过后Andy说那个人就是Google中国负责android的老大邸烁博士，我狂晕呀两位老大都让我给碰上了。稍候跟Andy聊了一下Android的发展，随后他掏出一个android的原型机，就是google IO大会上的那种机器。这里要说明的是，不管在模拟器上android的表现如何，在真机上你的体验绝对绝对是不一样的，太COOL了。尤其是第二屏的widget效果，还有那个street view效果，真机拿在手上体验就是不一样呀～～～～ 随后又了解到了一些android目前的发展情况，这里可以告诉大家的是，android是绝对值得期待的～！！！
          <br/>
          <span style="color:red;">
            <a href="http://sshwsfc.javaeye.com/blog/203462#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 15 Jun 2008 13:28:30 +0800</pubDate>
        <link>http://sshwsfc.javaeye.com/blog/203462</link>
        <guid>http://sshwsfc.javaeye.com/blog/203462</guid>
      </item>
      <item>
        <title>django的Model的“造Class”概述</title>
        <author>差沙</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sshwsfc.javaeye.com">差沙</a>&nbsp;
          链接：<a href="http://sshwsfc.javaeye.com/blog/168556" style="color:red;">http://sshwsfc.javaeye.com/blog/168556</a>&nbsp;
          发表时间: 2008年03月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在朋友和同事的极力推荐下最近开始看上了python,其实主要是还是因为python是2007年度语言,怎么的也要与时俱进呀.最近一路看来有些心得,希望能与大家分享,小弟其实也只接触不到一周的python,有说错的地方还望大家指出改正.<br /><br />不打算从py的语法基础说起了,直接说说对django的心得:<br /><br />接触django首先需要了解可能就是他那个model，建立一个model就什么都有了，这对于搞java得人员来说还是挺有吸引力的（当然貌似对于动态语言这都是小儿科），那么让我们先看一个model的例子：<br /><br />偷懒了，直接拿django-admin里面的User出来了<br /><br /><pre name="code" class="python">class User(models.Model): 
    username = models.CharField(_('username'), maxlength=30, unique=True, validator_list=[validators.isAlphaNumeric])) 
    first_name = models.CharField(_('first name'), maxlength=30, blank=True) 
    last_name = models.CharField(_('last name'), maxlength=30, blank=True) 
    email = models.EmailField(_('e-mail address'), blank=True) 
    password = models.CharField(_('password'), maxlength=128)) 
    class Meta: 
        ordering = ('username',)</pre><br /><br />每个属性就是一个库表的字段，定义起来非常简单明了，models里面提供了很多种类的Field类似上面的EmailField。不同的Field有不同的设置，可以看相应的原来来了解相关的设置．<br /><br />在model class内部还有一个class Meta，这个Class的属性制定了这个表的一些存取策略，例如这里的ordering。MetaClass里面的属性可以用model的_meta属性取得。OK，那么这样一个model怎么就能实现对数据库表的灵活操作了呢。让我们来看看吧。<br /><br />首先先分析一下/django/django/db/models/base.py这个文件，其中包含了models.Model这类的定义：<br /><br />看看class定义的第一行吧，第一行就够我琢磨一阵子的了：<br /><br /><pre name="code" class="python">class Model(object):
    __metaclass__ = ModelBase</pre><br /><br />Model采用了new style class定义，关于这个内容大家可以放狗看一下，第一行是一个__metaclass__属性的定义，该属性的值是ModelBase，这是一个类。 __metaclass__的意思是，指定一个class，这个class的实例就是本class，相信您已经晕了。那么就拿这个Model的例子来说明一下，如果没有__metaclass__这个属性，产生一个实例就是正常的流程，有了这个属性流程会有改变：<br /><br />首先调用BaseModel.__new__(cls, name, bases, attrs)这个方法，回返回的值是一个class类型，然后用这个class来创建实例。其实BaseModel就是Model的元类，来制定 Model这个类的最终样子。关于元类的更多信息请看这里<br /><br />那么我们的目光一下转移到BaseModel这个类上，我有种直觉，Meta这个class最后可以用_meta来取就是在这里做的手脚，看一下BaseModel的定义吧，有点长：<br /><br /><pre name="code" class="python">class ModelBase(type):
    "Metaclass for all models"
    def __new__(cls, name, bases, attrs):
        # If this isn't a subclass of Model, don't do anything special.

        if name == 'Model' or not filter(lambda b: issubclass(b, Model), bases):    #1
            return super(ModelBase, cls).__new__(cls, name, bases, attrs)

        # Create the class.

        new_class = type.__new__(cls, name, bases, {'__module__': attrs.pop('__module__')})    #2

        new_class.add_to_class('_meta', Options(attrs.pop('Meta', None)))     #3

        new_class.add_to_class('DoesNotExist', types.ClassType('DoesNotExist', (ObjectDoesNotExist,), {}))

        # Build complete list of parents                                      #4
        for base in bases:
            # TODO: Checking for the presence of '_meta' is hackish.
            if '_meta' in dir(base):
                new_class._meta.parents.append(base)
                new_class._meta.parents.extend(base._meta.parents)

        model_module = sys.modules[new_class.__module__]

        if getattr(new_class._meta, 'app_label', None) is None:
            # Figure out the app_label by looking one level up.
            # For 'django.contrib.sites.models', this would be 'sites'.
            new_class._meta.app_label = model_module.__name__.split('.')[-2]  #5

        # Bail out early if we have already created this class.
        m = get_model(new_class._meta.app_label, name, False)                 #6
        if m is not None:
            return m

        # Add all attributes to the class.
        for obj_name, obj in attrs.items():
            new_class.add_to_class(obj_name, obj)                             #7

        # Add Fields inherited from parents
        for parent in new_class._meta.parents:
            for field in parent._meta.fields:
                # Only add parent fields if they aren't defined for this class.
                try:
                    new_class._meta.get_field(field.name)
                except FieldDoesNotExist:
                    field.contribute_to_class(new_class, field.name)          #8

        new_class._prepare()

        register_models(new_class._meta.app_label, new_class)                 #9
        # Because of the way imports happen (recursively), we may or may not be
        # the first class for this model to register with the framework. There
        # should only be one class for each model, so we must always return the
        # registered version.
        return get_model(new_class._meta.app_label, name, False)              #10</pre><br /><br />简单分析一下这个代码：<br /><br />1. 检查class是否为Model的子类，不是的话，不做任何处理，直接传给父类处理，也就相当于正常的处理了class，注意super在多重继承的时候应该严格使用<br /><br />2. 用type来创建类，创建的就是正常的ModelClass<br /><br />3. 这句很重要，add_to_class是Model里面的class方法，这个方法其实就是传入name和value，给Model添加class属性.看到了，原来神奇的_meta就是这么来的. 提到add_to_class方法，简单看一下它的代码：<br /><br /><pre name="code" class="python">    def add_to_class(cls, name, value):
        if name == 'Admin':
            assert type(value) == types.ClassType, "%r attribute of %s model must be a class, not a %s object" % (name, cls.__name__, type(value))
            value = AdminOptions(**dict([(k, v) for k, v in value.__dict__.items() if not k.startswith('_')]))
        if hasattr(value, 'contribute_to_class'):
            value.contribute_to_class(cls, name)
        else:
            setattr(cls, name, value)
    add_to_class = classmethod(add_to_class)</pre><br /><br />最后一句是制定这个方法是class方法，特点就是方法的第一个参数是本class，其实classmethod就是一个装饰器，在2。4之后可以使用@ 来简写。这里不得不提的是他对Admin的特殊处理，虽然AdminOption不是在admin模块里面的，但是这么做还是跟一个Admin的东东绑定起来了，在java的世界解耦是一件大事，看到下面还有对'contribute_to_class'这个方法的特殊处理，django为啥不弄的解耦点呢。而且同样是包装成Option，一个是在BaseModel里面弄（那个Meta的包装），一个在add_to_class方法里面弄，实在有点不优雅，可能还没了解太多，不知道他的深度用意吧。<br /><br />4. Meta的集成，Option的这个类提供继承方法<br /><br />5. 取得applabel，就是把model的名字分割取到数第二个，我很喜欢-2这样的设定<br /><br />6. get_model方法取得缓存里面的东西。<br /><br />7. 把所有的class attr拿出来搞一遍，一般的属性就setattr弄回去了，要是这个属性有contribute_to_class这个callable属性，那就执行之（Admin的处理完全也可以这样，其实我们常用的objects就是用这个方法弄的）<br /><br />8. 每个Field调用自己的contribute_to_class方法来进行特殊的处理<br /><br />9. 进入缓存，，暂且叫缓存吧，里面的东西大家看看很简单 文件在 /django/django/db/models/loading.py 里面还是有很多内容的<br /><br />10.看注释说的很清楚了，我们一定要在缓存里面拿model。<br /><br /> <br /><br />其中需要指出的是，new_class._prepare() 这个方法，简单列出片段：<br /><br /><pre name="code" class="python">    def _prepare(cls):
        # Creates some methods once self._meta has been populated.
        opts = cls._meta
        opts._prepare(cls)

        ．．．．

        dispatcher.send(signal=signals.class_prepared, sender=cls)</pre><br /><br />中间省略了一些代码，不是我没看懂的就是没意思的，关键要看这个dispatcher呀。这里是监听者模式，dispatcher.send(signal=signals.class_prepared, sender=cls)放松了一个包含特定信号的事件，让监听的人可以做相应的处理。这样的信号还有很多种，我们可以很简单的截获信号，处理相应的内容。也许您还记得，在我们创建db的时候，会提示创建一个超级用户，其实就是用这个方法来弄的。<br /><br />那我为什么要把这个单独拿出来说呢，因为监听这个事件的人不是别人，是"objects"！！！在文件/django/django/db/models/manager.py的开头就有这样的代码：<br /><br /><pre name="code" class="python">def ensure_default_manager(sender):
    cls = sender
    if not hasattr(cls, '_default_manager'):
        # Create the default manager, if needed.
        try:
            cls._meta.get_field('objects')
            raise ValueError, "Model %s must specify a custom Manager, because it has a field named 'objects'" % cls.__name__
        except FieldDoesNotExist:
            pass
        cls.add_to_class('objects', Manager())

dispatcher.connect(ensure_default_manager, signal=signals.class_prepared)</pre><br /><br />定义了一个callable，然后监听signals.class_prepared信号，呵呵，连上了吧，只要Class准备好了，就调用这个方法。简单判断有没有_default_manager'属性和meta里面的objects后，开始插入objects。 cls.add_to_class('objects', Manager()) 很熟悉吧，前面讲过不多说了。<br /><br />PS：写到这里不由得感叹，为啥同样是往Class里面加入东东，要搞这么多的花样呢，我以前也写过一个Rails配置加载过程的分析文档，虽然一个简单的加载配置就把所有动态语言玩个遍，但是这也太不规范了吧，可能不这么玩就不算“动态”语言了吧，哈哈。<br /><br />终于Model的Class造好了，相信大家以后造自己的Class也能玩出更多的花样。那么可以开始下一步了。我到老家后再写吧，打算讲讲神奇的objects，也就是Manager，其实就是玩QuerySet。。那里有很多的__xxx__方法，很好很强大
          <br/>
          <span style="color:red;">
            <a href="http://sshwsfc.javaeye.com/blog/168556#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Mar 2008 09:56:59 +0800</pubDate>
        <link>http://sshwsfc.javaeye.com/blog/168556</link>
        <guid>http://sshwsfc.javaeye.com/blog/168556</guid>
      </item>
      <item>
        <title>Ext的组件结构分析,附Ext组件结构图</title>
        <author>差沙</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://sshwsfc.javaeye.com">差沙</a>&nbsp;
          链接：<a href="http://sshwsfc.javaeye.com/blog/133835" style="color:red;">http://sshwsfc.javaeye.com/blog/133835</a>&nbsp;
          发表时间: 2007年10月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          相信大家看了Ext2.0后, 印象最深的应该是Ext的组件模式,很好的规范了组件设计,用Manager的统一管理,也是很好的方式.下面简单分析一下Ext的组件结构.<br />
<br />
Ext的所有组件都是扩展于Ext.Component, 而后子类扩展和集成形成了一个单根的组件树.<br />
Ext中使用组件的方式很不一样,可以看一个例子.<br />
<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="keyword">var</span><span> formPanel = </span><span class="keyword">new</span><span> Ext.form.FormPanel({  </span></span></li>
    <li class=""><span>      items: [{  </span></li>
    <li class="alt"><span>                xtype: 'hidden',  </span></li>
    <li class=""><span>                name: 'domainId'  </span></li>
    <li class="alt"><span>            },{  </span></li>
    <li class=""><span>                fieldLabel: '姓名',  </span></li>
    <li class="alt"><span>                name: 'name',  </span></li>
    <li class=""><span>                allowBlank:<span class="keyword">false</span><span>  </span></span></li>
    <li class="alt"><span>            },{  </span></li>
    <li class=""><span>                fieldLabel: '权限', </span></li>
    <li class="alt"><span>                xtype: 'combo',  <br />
    </span></li>
    <li class="alt"><span>                name: 'auth'  </span></li>
    <li class=""><span>            },{  </span></li>
    <li class="alt"><span>                fieldLabel: '帐号',  </span></li>
    <li class=""><span>                name: 'account'  </span></li>
    <li class="alt"><span>            },{  </span></li>
    <li class=""><span>                fieldLabel: 'Email',  </span></li>
    <li class="alt"><span>                name: 'email',  </span></li>
    <li class=""><span>                vtype:'email'  </span></li>
    <li class="alt"><span>            },{  </span></li>
    <li class=""><span>                fieldLabel: '启用', </span></li>
    <li class="alt"><span>                xtype: 'checkbox',  <br />
    </span></li>
    <li class="alt"><span>                name: 'enabled'  </span></li>
    <li class=""><span>            }  </span></li>
    <li class="alt"><span>        ]  </span></li>
    <li class=""><span>});  </span></li>
</ol>
</div>
如此这样就能实现一个包含了很多元素的表单, items里面定义了表单要显示的输入框等组件,但是items里面仅仅是简单的json对象,怎么能显示出来各种不同的表单元素呢?<br />
<br />
我们注意到items的每一个元素几乎都有一个xtype属性,这个xtype属性就是描述组件类的关键.<br />
<br />
其实Ext里面的组件(Panel, Form Datepicker等等), 在定义完Class之后, 都会把自己注册到Ext.ComponentMgr里面. 简单看一个box的组件, 在BoxComponent.js文件的最后一行可以看到:<br />
<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<ol class="dp-c" start="1">
    <li class="alt"><span><span>Ext.reg('box', Ext.BoxComponent);  </span></span></li>
</ol>
</div>
<br />
而在, ComponentMgr.js文件里<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span>        </span><span class="comment">// private</span><span>  </span></span></li>
    <li class=""><span>        registerType : <span class="keyword">function</span><span>(xtype, cls){  </span></span></li>
    <li class="alt"><span>            types[xtype] = cls;  </span></li>
    <li class=""><span>            cls.xtype = xtype;  </span></li>
    <li class="alt"><span>        },  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span>        <span class="comment">// private</span><span>  </span></span></li>
    <li class=""><span>        create : <span class="keyword">function</span><span>(config, defaultType){  </span></span></li>
    <li class="alt"><span>            <span class="keyword">return</span><span> </span><span class="keyword">new</span><span> types[config.xtype || defaultType](config);  </span></span></li>
    <li class=""><span>        }  </span></li>
    <li class="alt"><span>    };  </span></li>
    <li class=""><span>}();  </span></li>
    <li class="alt"><span>  </span></li>
    <li class=""><span><span class="comment">// this will be called a lot internally,</span><span>  </span></span></li>
    <li class="alt"><span><span class="comment">// shorthand to keep the bytes down</span><span>  </span></span></li>
    <li class=""><span>Ext.reg = Ext.ComponentMgr.registerType;  </span></li>
</ol>
</div>
<br />
其实是执行了<span>registerType 这个方法,方法很简单, 把xtype这个名字和对应的cls放到</span><span>types里面,  而后看到</span><span>create 我们应该会明白了, 以后想创建组件的时候,就调用 </span><span>create({xtype: 'box'}) 就OK了<br />
<br />
那么我们看看items里面的元素是怎么创建的吧, form的继承树中有一个Ext.Container类, 恩,就在这个类里呢:<br />
<br />
<div class="code_title">js 代码</div>
<div class="dp-highlighter">
<div class="bar"> </div>
<ol class="dp-c" start="1">
    <li class="alt"><span><span class="comment">// private</span><span>  </span></span></li>
    <li class=""><span>lookupComponent : <span class="keyword">function</span><span>(comp){  </span></span></li>
    <li class="alt"><span>    <span class="keyword">if</span><span>(</span><span class="keyword">typeof</span><span> comp == 'string'){  </span></span></li>
    <li class=""><span>        <span class="keyword">return</span><span> Ext.ComponentMgr.get(comp);  </span></span></li>
    <li class="alt"><span>    }<span class="keyword">else</span><span> </span><span class="keyword">if</span><span>(!comp.events){  </span></span></li>
    <li class=""><span>        <span class="keyword">return</span><span> </span><span class="keyword">this</span><span>.createComponent(comp);  </span></span></li>
    <li class="alt"><span>    }  </span></li>
    <li class=""><span>    <span class="keyword">return</span><span> comp;  </span></span></li>
    <li class="alt"><span>},  </span></li>
    <li class=""><span>  </span></li>
    <li class="alt"><span><span class="comment">// private</span><span>  </span></span></li>
    <li class=""><span>createComponent : <span class="keyword">function</span><span>(config){  </span></span></li>
    <li class="alt"><span>    <span class="keyword">return</span><span> Ext.ComponentMgr.create(config, </span><span class="keyword">this</span><span>.defaultType);  </span></span></li>
    <li class=""><span>},  </span></li>
</ol>
</div>
<br />
恩,基本就是这样了, 希望对大家理解Ext有所帮助<br />
<br />
/************************************************/<br />
附件是我弄的一个Ext的组件结构图, 还附有各个组件的说明, 希望大家喜欢, 大家快下呀....<br />
</span>
          <br/>
          <span style="color:red;">
            <a href="http://sshwsfc.javaeye.com/blog/133835#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/106' target='_blank'><span style="color:blue;font-weight:bold;">JavaEye问答大赛开始了！ 从6月23日 至 7月6日，奖品丰厚 ！</span></a></li><li><a href='/adverts/92' target='_blank'><span style="color:red;font-weight:bold;">快来参加7月17日在成都举行的SOA中国技术论坛</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 20 Oct 2007 18:20:06 +0800</pubDate>
        <link>http://sshwsfc.javaeye.com/blog/133835</link>
        <guid>http://sshwsfc.javaeye.com/blog/133835</guid>
      </item>
  </channel>
</rss>