<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>歆渊技术博客</title>
    <description>Ableverse - Programming By Nature (http://www.ableverse.org)
Compl Yue Still
</description>
    <link>http://complystill.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>我也谈谈JAVA并发程序设计的现状和前景</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/126761" style="color:red;">http://complystill.javaeye.com/blog/126761</a>&nbsp;
          发表时间: 2007年09月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近我也是在涉及并发Java方面的东西, 说说我的心得.<br /><br />确实到了并发盛行的时期了, 我觉得最重要的原因还是多核处理器及其硬件体系的日趋成熟, 并且成本摊薄到大众价格了.<br /><br />j.u.c 包主要是为了性能来的, 其设计其实不如Java传统的内置同步机制(synchronized块和方法, 以及 Object.wait(); Object.notify())优雅, 但是传统同步机制的最大弊病就是不区分共享同步(一般是并发的读操作) 与 互斥同步 (一般是写操作), 所有同步都只能是完全排他的,只要有并发写的可能性就不得不把全部读操作也互斥同步,从而丧失并发读取的可能性. 这跟大多数应用的并发模式(读远多过于写)存在严重偏离, 以至于硬件新增长出来的并发能力在普通应用中将被大部分折扣掉, 这个是不可能被应用软件开发市场容忍的. 同时传统同步机制也有一些灵活性方面的弊病, 比如 Object.wait(); Object.notify(); 必须在该对象的同步块内执行 (否则会抛IllegalMonitorStateException), 并且一个对象只能wait/notify一个状态. j.u.c 类通过让一个Lock可以建多个Condition去wait/notify增强了灵活性.<br /><br />但是抛开性能和灵活性不管, 如果传统Java同步机制能够实现的话, 它还是更优雅的, 你永远没法写出加锁以后忘记解锁的代码, 因为不匹配的 {} 会产生编译错误. 同时已经有相当多的科研力量, 投入到降低传统同步机制在单线程情况下最小化同步开销的研发工作中, 使得现在的JVM执行同步块时, 如果是单线程情况, 效率非常高. 不过作为代价, 多线程情况下却要比合理想像到的性能更低.<br /><br />Excector、ScheduleExecutorService、Future、BlockingQueue这些其实就是目前构建应用服务器的Building Block, 现在作为标准类库提供, 有利于发展出更优秀的Java框架, 但是主流应用开发是否也会架构于这些相对基层的工具库之上, 我个人还是抱观望态度.<br /><br />j.u.c 库确实比原来的 dl.u.c 库性能会高, 因为 dl.u.c 是构建在Java传统同步机制之上的, 而 j.u.c 是将其移植到了最新 JVM 的并发支持特性之上 (通过 sun.misc.Unsafe 与Hotspot VM打交道, 直接产生宿主CPU支持的原子内存访问指令), 可以认为是从软件实现升级成了硬件实现, 其性能差别可想而知.<br /><br />面向分布式并行计算/并发的应用程序设计方向上, 我在搞一个Apache协议开源的框架, 叫 Hosting Based Interfacing, 目前已经实现了 Java 的服务器端和 Flex/ActionScript3 的客户端. 大家有兴趣不妨看看 <a href="http://hbi.googlecode.com" target="_blank">http://hbi.googlecode.com</a>, 如果有时间精力一起研究发展当然最好了.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/126761#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Tue, 25 Sep 2007 01:37:36 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/126761</link>
        <guid>http://complystill.javaeye.com/blog/126761</guid>
      </item>
          <item>
        <title>实例观察网络模型与关系模型对现实世界的建模差异</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/126681" style="color:red;">http://complystill.javaeye.com/blog/126681</a>&nbsp;
          发表时间: 2007年09月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我感觉受 主流/传统的 Object Orientation 对 领域模型设计 的影响, 以及 SQL 对 关系模型设计 的影响, 目前领域模型基本都设计为 "网络模型" 也就是更倾向于 传统的数据结构. <br /><br />举个例子, 比如要描述一颗螺丝 s1 和一颗螺母 c1, 以及把它们拧在一起的关系. <br /><br />如果按照网络模型(传统数据结构)的思路, 那么就必须同时有一个把螺丝拧进螺母(s1.cap = c1)和一个把螺母拧上螺丝的动作(c1.screw = s1), 显然这跟现实世界的逻辑思维是有差别的.<br /><br />反过来如果按照关系模型的思路, 只要一个建立拧接关系的动作 (new Screwing(s1, c1)), 就跟现实逻辑是恰好符合的.<br /><br />不过在通用OO语言基础上实现关系模型的语义, 还是要费些周折, 不过也不是不可能. <a href="http://www.ableverse.org/articles/orkm.pdf" target="_blank">Object Relation Kin Model</a> 就是一个结合通用OO语言与关系模型的例子.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/126681#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 24 Sep 2007 16:53:37 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/126681</link>
        <guid>http://complystill.javaeye.com/blog/126681</guid>
      </item>
          <item>
        <title>Introducing Hosting Based Interfacing</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/124767" style="color:red;">http://complystill.javaeye.com/blog/124767</a>&nbsp;
          发表时间: 2007年09月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>HBI - Hosting Based Interfacing </strong><br /><br /><br /><strong>What is (not) HBI? </strong><br /><br /><div class="quote_title">引用</div><div class="quote_div">HBI is about interoperability among distributed applications (software components), built with same or different technologies. As the name implies, HBI is an architecture that software components communicate with each others by hosting the execution of logics from peers. HBI is to get rid of synchronous access to remote resources, make all code executed natively and locally (in both concept and practice) whereas asynchronously. So transactional logics can be naturally grouped into atomic units and performed in parallel ways. On optimistic commit failures, transactions are possible to be retried automatically and transparently. At the same time performance drop and pitfalls due to synchronous execution and distributed data cache are get rid of, as well.<br /><br />SQL is essentially semi-HBI: There is an interesting fact that wherever you wrote your SQL code, it is executed in the server environment, and you know your SQL always access local resources like tables, views and stored-procedures etc. SQL transactions naturally consist of arbitrary statements between two COMMITs. Pure SQL transactions are possible to be transparently retried on optimistic commit failures.<br /><br />On the contrary is IBI - Invocation Based Interfacing. Those paradigms try to hide resources behind some mechanisms so that access to resources are wrapped/encapsulated in synchronous ways, regardless they are local or remote. Some define service invocation interfaces, like RMI (including EJB), Web-Service, where remote routines encapsulate their resources and are wrapped like client-local code. Some allow data resources distributed to client environment and wrapped with client-local library code that transparently make data available, handle validity, and manage consistency, like various OODBs, ORM. Transactions can rarely be transparently retried on these infrastructures. </div><br /><br /><br /><br /><strong>What does HBI cost? </strong><br /><br /><div class="quote_title">引用</div><div class="quote_div">Distribution and concurrency/parallel become explicit, asynchronous complexity instead of implicit, synchronous complexity.<br /><br />Synchronous programming habit will be broken, programmers will have to consciously know that some blocks of their code will run asynchronously at environments (domains) other than the local application they are developing. Code relies on the result of some remote manipulations can not be programmed as a subsequent block of that manipulation code, but must be implemented as local task agent objects that the remote peer can send back to indicate the result.<br /><br />Higher security profile. Applications need to enforce sandboxes to host executions of objects from other domains, against malfunctioning peers and hostile attacks. </div><br /><br /><br /><br /><strong>What HBI benefits? </strong><br /><br /><div class="quote_title">引用</div><div class="quote_div">The architecture of large RAM/storage shared by many CPUs/cores is best benefited. Large data sets in a single memory space and local storage are shared as-is to all domains requiring them, manipulations to these resources are hosted by local CPUs/cores having direct access to them. This is the most efficient way for distributed domain resource sharing. <br /><br />As a result, performance is a biggest hit. All data and logics become local and native, and can be greatly optimized with explicit parallel (parallel candidates are expressed by application code as a side effect). No data replicated anymore, large amount of redundant memory and bandwidth saved. <br /><br />Much less pitfalls due to distribution of objects. Neither objects are distributed anymore, nor do they need to be transfered over wire, objects now always identify themselves at where they actually are, no shadow copies or stubs or proxies used to create subtle errors and harden debugging. <br /><br />Server applications are much more stable. Most new client requirements those used to need service API changes in traditional approaches now can be unilaterally achieved by modifying only the client application. <br /><br />Client applications can go much richer without resistance from the server side, do not need to change/restart server applications (i.e. less permissions/efforts required) in order to evolve client applications. <br /><br />Client applications have their own rich domain models that focus on their own functionalities, much better separated from functionalities like persistence and work flows those server applications need to care. Client applications can focus on their own domain model which is regarded by server applications by translating server domain model changes to client behaviors through delivery of task agent life scripts. <br /><br />More effective Object Orientation. No data packet based protocol anymore, all logics become behaviors of either domain objects or agent objects triggered by task agent life script. <br /><br />P2P communications become more natural. Clients are also domains, they are at the same priority of server components in inter-domain communications. <br /><br />Much more realtime-interactive features can be naturally implemented to enhance user experience. Built-in server-push and P2P-push ability well enable it. </div>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/124767#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Mon, 17 Sep 2007 16:21:40 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/124767</link>
        <guid>http://complystill.javaeye.com/blog/124767</guid>
      </item>
          <item>
        <title>回想Apache与Sun就Java TCK之争, 发现就像RedHat要跟SCO要免费UNIX认证</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/111430" style="color:red;">http://complystill.javaeye.com/blog/111430</a>&nbsp;
          发表时间: 2007年08月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一点相关进展:<br />Sun Releases JCK to OpenJDK and its Derivatives:<br /> <a href="http://www.infoq.com/news/2007/08/openjdk-jck" target="_blank">http://www.infoq.com/news/2007/08/openjdk-jck</a><br /><br />Apache你就去打造你的 Harmony 牌子不就完了么, 非看上人家的 Java 牌子, 还要求不受限制的使用, 有点觊觎的感觉.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/111430#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 12 Aug 2007 12:14:59 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/111430</link>
        <guid>http://complystill.javaeye.com/blog/111430</guid>
      </item>
          <item>
        <title>硅谷一公司研发成功脑电波感应芯片, 可以用来控制电脑, 打游戏, 操纵轮椅, 其他设备...</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/110781" style="color:red;">http://complystill.javaeye.com/blog/110781</a>&nbsp;
          发表时间: 2007年08月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.brightcove.com/title.jsp?title=704328501" target="_blank">http://www.brightcove.com/title.jsp?title=704328501</a><br /><br />科幻里的东西已经开始进入现实了 :O
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/110781#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Aug 2007 09:51:58 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/110781</link>
        <guid>http://complystill.javaeye.com/blog/110781</guid>
      </item>
          <item>
        <title>最小权限原则应用于面向对象的软件设计开发</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/109642" style="color:red;">http://complystill.javaeye.com/blog/109642</a>&nbsp;
          发表时间: 2007年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          偶然看到Wiki百科的 <a href="http://en.wikipedia.org/wiki/Lua_(programming_language)" target="_blank">Lua</a> 词条, 注意到它的这个特性:<br /><br /><div class="quote_title">引用</div><div class="quote_div">Lua allows ...; and full lexical scoping allows fine-grained <a href="http://en.wikipedia.org/wiki/Information_hiding" target="_blank">information hiding</a> to enforce <a href="http://en.wikipedia.org/wiki/Principle_of_least_privilege" target="_blank">the principle of least privilege</a>.</div><br /><br />不过比较遗憾的是, 通过这里链接过去的 <a href="http://en.wikipedia.org/wiki/Principle_of_least_privilege" target="_blank">http://en.wikipedia.org/wiki/Principle_of_least_privilege</a> 词条中的描述, 似乎这个 <strong>最小权限原则</strong> 没怎么被用于软件设计开发方法学, 虽然很早就提出来了, 但主要描述的是在系统设计领域的应用.<br /><br />我最近正好在做 HBI 的 编程语言/平台 互操作性架构, 目前在做 Java 和 ActionScript 3.0 的互操作框架. 而发现 AS3 很多有意思的地方. 其中可以在程序开发中用来实现 <strong>最小权限原则</strong> 的就是 AS3 语言中的 namespace 机制. 刚看到这个机制的时候我是眼前一亮的感觉, 因为很早以前就觉得 Java 在语法元素方面缺乏这个层次的 <a href="http://en.wikipedia.org/wiki/Information_hiding" target="_blank">information hiding</a> 能力, 但是一直没机会研究这些其他的语言, 也就没有了解到已经存在的实现, 只是脑子里模模糊糊的有个感觉, 如果xxx那样增强一下会更好. 而在最近出来的 ActionScript 3.0 里, 已经有了明确成熟的实现了.<br /><br />这里很简单的描述一下OO时如果没有足够好 <a href="http://en.wikipedia.org/wiki/Information_hiding" target="_blank">information hiding</a> 的话所带来的后果, 一个非常简单且常见的例子就是在Hibernate中, 你必须在你的持久Java类中定义一个 identity 字段用作 primary key, 并且要暴露一个 public 的 setter 方法, 好让 Hibernate 去给它赋值; 类似的, 对于关联对象你也要自己定义这么一个集合field, 然后暴露 public setter 方法, 只是为了给 Hibernate 方便. 显然所有的人都能看到这些个 public 的方法, 也可以完全没有编译错误的去调用它们, 而只有脑袋里绷住了一根弦儿, 说这个是给 H 用的, 不是给我用的, 才不至于犯傻或者手误去敲错代码, 盛行的带自动提示的Java IDE让这种错误的机率又提高了不少.<br /><br />这个看起来不像是很严重的问题, 但是在大规模的软件开发维护中毕竟小的出错率也能贡献大量的错误, 况且要占用每个程序员大脑中的一根神经, 不能更好的集中到业务逻辑上去. 就像现在很多流行编程语言, 通过扔掉指针, 实现垃圾回收器从而把程序员从释放内存的负担中解放出来一样, 早晚也得把人类程序员从考虑各种 API 的调用顺序, 适用性 以及 Side Effect的负担中解放出来, 有更多精力专注于业务逻辑的正确实现.<br /><br />而这里考虑的 <strong>最小权限原则</strong>, 是其中一个方面. 那么怎么实现呢?<br /><br />说明在 ActionScript 3.0 中如何通过 namespace 实现最小权限原则之前, 简单介绍一下AS3的背景:<br /><br />在 3.0 以前, ActionScript 2.0 和 1.0 一直是 Flash Player 的专有编程语言. 最开始并没有版本, 而 AS2 出来的时候加入了大量的实质性面向对象元素, 所以为了加以区别, 就把以前版本的AS称为 1.0. 其实到目前的 AS 3.0 为止它作为Flash的专有语言的情况也没有改变, 只不过其新主 Adobe 和 Mozilla 联手, 准备以开源的形式发展 AS3. 名义上是两家共同开发 ECMAScript 第4版 的规范以及虚拟机实现, 然后Adobe把它用在Flash里, Mozilla把它用在FireFox的SpiderMonkey里, 所以AS3的规范称自己是 "基于" ECMA 规范. 而实际上 ECMAScript 第4版 现在还只是draft, AS3 却已经投入市场了, 并且 Mozilla 上关于 es4 的wiki内容也全是从Adobe资料导入的. 可见整个局势主要还是由Adobe推动的.<br /><br />另外也必须说一下 AS3 的革命性. 如果你看一段官方推荐风格的 AS3 代码, 就会发现它已经 非常 非常 像 Java. 最早的 ActionScript (1.0) 只是一些最简单的脚本, 那时主要也是给不是程序员的艺术创作人员用的. 到了 AS 2.0, 面向对象被引入了, 但它实质上是动态脚本语言, 虽然已经有了类的概念和<strong>class</strong>关键字, 但对象支持还是基于类似JavaScript的prototype机制, 动态继承. 而到了 AS 3.0, 按照官方的说法, 它同时支持静态类型, 基于类的继承方式, 以及动态类型, 基于prototype的继承方式; 虽然后者是AS 3以前唯一支持的方式, 但是在 AS3 中, 并不推荐使用这种方式, 而是建议全部采用前者的静态类型方式. 涉及到这么做的动机时, 官方资料有提到说这是因为用Flash开发的应用规模越来越大. 而即使是在受支持的动态类型机制下, AS3 也并不是完全兼容 AS2, 在事件模型和语法含义上都有打破兼容性的地方. 这在商业意义上的损失无疑是巨大的, 即使 AS3 应用的执行效率要远远高于以前版本, 兼容性方面的损失恐怕也难以弥补. 另外虽然号称是基于 ECMAScript 4, 但是 AS3 默认支持的是 <strong>strict</strong> dialect 而非 standard es4. <strong>strict dialect</strong> 实质上主要就是 <strong>静态类型+严格语法检查</strong>. 由此可以看出 AS3 已经不是原本的动态类型脚本语言, 而是一种 <strong>动静结合, 静态为主, 动态为辅</strong> 的程序设计语言. 并且其静态语言特性是Adobe鼎力支持的重点.<br /><br />基本了解了 AS3 的历史和现状之后, 我们可以确信, 它目前很多特性并非只能在动态语言中实现, 而是有可能在静态语言中重现的. 至少 namespace 是如此. 那么回到 <strong>最小权限原则</strong> 的话题, 看看它可以怎么实现.<br /><br />在 AS3 中也有 public, private, protected, internal (==default) 这些权限修饰符, 并且各自含义与Java中的同名修饰符完全相同. 但是, 或许有点难以理解, 在 AS3 中它们都是内置的 namespace 而非仅仅是关键字, 编译器通过维护这些内置 namespace 的 可见/适用范围 来实现其语义. 最重要的, namespace 是 AS3 中的一等公民, 也就是说应用程序可以像定义class一样的定义自己的 namespace. 自定义的 namespace 可以放在 public, private, protected, internal 相同的位置用来限定相应语法元素的可访问性, 包括 类, 类成员方法 和 类成员变量.<br /><br />有了这件利器, 要解决前面提到的Hibernate持久类setter方法过度暴露的问题, 就显得非常容易了. 假如我们在 AS3 中实现一个 ORM 的话(虽然目前来说意义还不大, AS 因为没有线程机制, 在很多场合还不适用), 就可以定义一个 orm 专用的 namespace:<br /><br /><pre name="code" class="java">package orm
{
  public namespace ormstub;

  public class ObjectStore
  {
     ...
     public function save(o:Object):void
     {
        var pk:Object = o.getID();
        if(!pk)
        {
          pk = assignID();
          o.ormstub::setID(pk);
        }
        ...
     }
     ...
  }
}</pre><br /><br />然后应用的持久类就可以利用这个 namespace 把只暴露给orm的setter方法向系统其他部分隐藏起来:<br /><br /><pre name="code" class="java">package app
{
  import orm.ormstub;

  public class User
  {
     private var id:Object;

     public function getID():Object
     {
        return this.id;
     }

     ormstub function setID(id:Object):void
     {
        this.id = id;
     }

     ...
  }
}</pre><br /><br />或者更具 AS3 风格的程序可以写成:<br /><br /><pre name="code" class="java">package orm
{
  public namespace ormstub;

  use namespace ormstub;

  public class ObjectStore
  {
     ...
     public function save(o:Object):void
     {
        var pk:Object = o.id;
        if(!pk)
        {
          pk = assignID();
          o.id = pk;
        }
        ...
     }
     ...
  }
}

package app
{
  import orm.ormstub;

  public class User
  {
     private var _id:Object;

     public function get id():Object
     {
        return this._id;
     }

     ormstub function set id(pk:Object):void
     {
        this._id = pk;
     }

     ...
  }
}</pre>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/109642#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 07 Aug 2007 06:34:32 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/109642</link>
        <guid>http://complystill.javaeye.com/blog/109642</guid>
      </item>
          <item>
        <title>通过SSH的交互式Java应用开发和管理</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/100212" style="color:red;">http://complystill.javaeye.com/blog/100212</a>&nbsp;
          发表时间: 2007年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          BSD License, 需要 JDK 6.0 或者 JRE 6.0 + OpenJDK Javac 运行.<br />附件为代码包 (请到 <a href="http://sjsh.dev.java.net" target="_blank">http://sjsh.dev.java.net</a> 下载最新代码包, 此处附件以后不再更新)<br /><br />参照代码包中 demo/src 目录下的示例, 就可以很简单的写成包装自己应用对象的 SSH Server 了<br /><br />启动演示 SSH Shell Server<br /><div class="quote_title">引用</div><div class="quote_div"><br /><br />D:\workspace\SecureJSH>ant demo<br />Buildfile: build.xml<br /><br />build:<br /><br />compile-demo:<br /><br />run-java-demo:<br />     [java] SSH-2.0-SJSHD-1.0: Generating an authorized key for user 'sjsh'...<br />     [java] SSH-2.0-SJSHD-1.0: New authorized private key for user 'sjsh' stored to D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\id_rsa<br />     [java] SSH-2.0-SJSHD-1.0: Updated authorized public keys for user 'sjsh' stored to D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\authorized_keys<br />     [java] SSH-2.0-SJSHD-1.0(@localhost/127.0.0.1:22022): Starting...<br />     [java] SSH-2.0-SJSHD-1.0: Generating Host DSA Key...<br />     [java] SSH-2.0-SJSHD-1.0: Host DSA Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_dsa_key<br />     [java] SSH-2.0-SJSHD-1.0: Host DSA Public Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_dsa_key.pub<br />     [java] SSH-2.0-SJSHD-1.0: Generating Host RSA Key...<br />     [java] SSH-2.0-SJSHD-1.0: Host RSA Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_rsa_key<br />     [java] SSH-2.0-SJSHD-1.0: Host RSA Public Key Stored to: D:\workspace\SecureJSH\SJSH-Demo-Root\etc\ssh\ssh_host_rsa_key.pub<br />     [java] SSH-2.0-SJSHD-1.0(@localhost/127.0.0.1:22022): Started.<br />     [java] Now you can login using an SSH client, with:<br />     [java]  User Name: sjsh<br />     [java]  Private Key: D:\workspace\SecureJSH\SJSH-Demo-Root\home\sjsh\.ssh\id_rsa<br />     [java]<br />     [java] Type in anything to stop:<br /></div><br /><br />然后通过任意SSH客户端连接上去:<br />(注意OpenSSH客户端需要更改 SJSH-Root\home\sjsh\.ssh\id_rsa 的权限属性为 600, 其他客户端不支持PEM格式私钥的需要转换其格式,  PuTTY 带的 PUTTYGEN 工具转换比较好用)<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />Using username "sjsh".<br />Authenticating with public key "imported-openssh-key"<br /><br />This is an interactive Java(TM) shell, type in Java(TM)<br />statements to get them executed.<br /><br />Type in Ctrl^D to logout.<br /><br />Type in ? or help for a list of available commands.<br /><br />Type in &lt;Tab> to complete commands.<br /><br />Use UP/DOWN arrow keys for command history.<br /><br />Here you are in the demo shell.<br /><br />There are two demo built-in commands: 'msg' and 'msgs',<br />and one built-in field: 'msgs', those are added by this demo.<br /><br />Try them out and write your own shell similarly.<br /><br />SecueJSH Java(TM) Compiler Ready.<br /><br />[jsh ]$ ?<br />Built-in commands:<br /><br /> class &lt;class-name> +&lt;class-code><br />   Start defining a new class in current package<br /> def &lt;field-name> [ &lt;type> [&lt;comment> | -] | - ]<br />   Define a field that persists across statements<br /> feedback [ on | off ]<br />   Control display of feedbacks<br /> fields<br />   Show all fields currently defined<br /> import &lt;package-name>.* | static &lt;qualified-class-name>.*<br />   Add an import<br /> imports<br />   Show all imports in current import list<br /> lineNo [ on | off ]<br />   Control display of line numbers<br /> msg &lt;message> | +&lt;multi-line message><br />   Leave a message<br /> msgs<br />   Show all messages in demo shell 'msgs' list<br /> package [ &lt;package-name> ]<br />   Specify current package<br /> preview [ on | off ]<br />   Control display of previews<br /> redef &lt;field-name> [ &lt;type> [&lt;comment> | -] | - ]<br />   Redefine a field that persists across statements<br /> undef &lt;field-name><br />   Undefine an existing field<br /> unimport &lt;existing-import> | *<br />   Remove specified import<br /><br />Type in:   help | ? &lt;cmd-name> [&lt;topic>]<br />for more details of a built-in command.<br /><br />The following built-in methods:<br />  void javap(Class&lt;?> c); void javap(Class&lt;?> c,int depth);<br />  void javap(Object o); void javap(Object o,int depth);<br />can be used to examine the structure of any Java class (of an<br />Java object), where &lt;depth> specifies how many classes up the<br />inheritance hierarchy should be printed, 0 for infinite.<br /><br />Type in:   javap(this);<br />to see all built-in methods and fields listed.<br /><br />[jsh ]$ fields<br />// builtin<br />protected java.util.Map&lt;java.lang.String, java.lang.String> env; //= {USER=sjsh, SSH_CLIENT=127 ...<br />// builtin<br />protected java.io.PrintWriter out; //= java.io.PrintWriter@cfad31<br />// builtin<br />protected java.io.PrintWriter err; //= java.io.PrintWriter@73a5d3<br />// All Messages<br />protected java.util.Vector&lt;java.lang.String> msgs; //= []<br /><br />[jsh ]$ javap(this);<br />public class $JSH$<br /> --- Constructors:<br /> - public $JSH$()<br /> --- Methods:<br /> - public void run()<br /> --- Fields:<br /> - protected java.util.Vector&lt;java.lang.String> msgs<br />extends public abstract class sjsh.jsh.JSHRunner<br />  implements java.lang.Runnable<br /> --- Constructors:<br /> - public JSHRunner()<br /> --- Methods:<br /> - public java.lang.String getEnv(java.lang.String)<br /> - public void javap(java.lang.Object,int)<br /> - public void javap(java.lang.Class&lt;?>)<br /> - public void javap(java.lang.Object)<br /> - public void javap(java.lang.Class&lt;?>,int)<br /> - public void println(java.lang.Object)<br /> - public void println()<br /> - public void print(java.lang.Object)<br /> - public java.io.PrintWriter printf(java.lang.String,java.lang.Object[])<br /> --- Fields:<br /> - protected java.util.Map&lt;java.lang.String, java.lang.String> env<br /> - protected java.io.PrintWriter out<br /> - protected java.io.PrintWriter err<br /><br />[jsh ]$ for(Map.Entry&lt;Object,Object> en : System.getProperties().entrySet())<br />002: printf("%s = %s\n", en.getKey(), en.getValue());<br />java.runtime.name = Java(TM) SE Runtime Environment<br />sun.boot.library.path = C:\Java\jdk1.6.0_02\jre\bin<br />java.vm.version = 1.6.0_02-b05<br />ant.library.dir = D:\apps\apache-ant-1.7.0\lib<br />java.vm.vendor = Sun Microsystems Inc.<br />  .....<br />java.vendor.url.bug = http://java.sun.com/cgi-bin/bugreport.cgi<br />sun.io.unicode.encoding = UnicodeLittle<br />sun.cpu.endian = little<br />sun.desktop = windows<br />sun.cpu.isalist =<br /><br />[jsh ]$<br /></div>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/100212#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Wed, 11 Jul 2007 23:31:01 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/100212</link>
        <guid>http://complystill.javaeye.com/blog/100212</guid>
      </item>
          <item>
        <title>WebOfWeb.net 新版发布了</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/78303" style="color:red;">http://complystill.javaeye.com/blog/78303</a>&nbsp;
          发表时间: 2007年05月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.webofweb.net" target="_blank">http://www.webofweb.net</a> <br /><br />新 Logo, 新页面. 大家去看看.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/78303#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Wed, 09 May 2007 18:12:27 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/78303</link>
        <guid>http://complystill.javaeye.com/blog/78303</guid>
      </item>
          <item>
        <title>The Object-Relation-Kin Model</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/67576" style="color:red;">http://complystill.javaeye.com/blog/67576</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          The Object-Relation-Kin Model<br />Toward Relational Analysis and Design in General Object Oriented<br />Languages<br /><br />Abstract:<br />The relational model is in use by many database systems. Object oriented technology is also widely used in database<br />application development. But “object-relational impedance mismatch” was found between the two approaches.<br />However, in the study behind this paper, the REAL mismatch is revaluated, and the Object-Relational Mapping<br />approach is found being actually mapping between the Network Model and the SQL interface.<br />A new data model - the Object-Relation-Kin model is then derived from the relational model and the entityrelationship<br />model, to better consolidate object technology and the relational model without defective mappings.<br />Ableverse™ TheObjectBase as the DBMS and WebOfWeb as the blueprint project are showing a feasible solution in<br />the Java™ programming language as realworld practices, on the basis of this new data model.<br /><br /><br />全文见:<br /><a href="http://www.ableverse.org/articles/orkm.pdf" target="_blank">http://www.ableverse.org/articles/orkm.pdf</a><br />或<br /><a href="http://www.ableverse.org/articles/orkm.html" target="_blank">http://www.ableverse.org/articles/orkm.html</a><br /><br /><br />Table of Contents:<br />1 . Introduction<br />1 .1. Backgrounds<br />1 .1.1. The Relational Model and the Entity-Relationship Model<br />1 .1.2. Conventional Relational Databases and SQL<br />1 .2. New Situations<br />1 .2.1. Impedance Mismatch Problems and SQL's Limitations<br />1 .2.2. Physical RAM Capacity Increased to Hold Mass Data<br />1 .2.3. Developed Garbage Collection Technologies<br />1 .2.4. More CPUs, More Cores, Sharing a Same Memory Space<br />1 .3. New Ideas<br />1 .3.1. Adding Persistence Ability to Application Object Model<br />1 .3.2. Unique Object Graph<br />1 .3.3. Relational Data Traverse for Embedded DB Access<br />1 .3.4. Hosting Based Interfacing for Distributed DB Access<br />2 . Premised Object Orientation<br />2 .1. Object Oriented Analysis and Design<br />2 .2. The Java Programming Language<br />3 . The Object-Relation-Kin Model<br />3 .1. Data in Object Models: Exposed Properties and Encapsulated Fields<br />3 .2. Multilevel Views of Data<br />3 .3. Information Concerning Entities and Relationships (Level 1)<br />3 .3.1. Entity and Relation Objects<br />3 .3.1.1. Entity Object Inheritance<br />3 .3.1.2. Relation Object Inheritance<br />3 .3.2. Role in Relationship<br />3 .3.3. Properties, Value and Type<br />3 .3.4. Conceptual Information Structure<br />3 .4. Information Structure (Level 2)<br />3 .4.1. Object Identifiers<br />3 .4.2. Data Fields Encapsulated by Objects<br />3 .4.3. Entity and Relation Classes<br />3 .5. Object Graph in Operational Memory (Level 4)<br />3 .5.1. Relation Object Ties Other Objects with Tie Fields<br />3 .5.1.1. Tie Field Name reflects Role<br />3 .5.1.2. Behaviors of Tie Reference Object<br />3 .5.2. Related Objects Reach Each Others through Kin Fields<br />3 .5.2.1. Kin Field and Kin Set Field<br />3 .5.2.2. Source Relation, Self Roles and Target Roles<br />3 .5.2.3. Kin Reference<br />3 .5.3. Derive 3NF Schema from E-R Schema, Direct Kin<br />3 .6. Tabular Object States in Permanent Storage (Level 3)<br />3 .7. Object Swapping and Swap Engine<br />3 .7.1. Update Tables On Transaction Commit<br />3 .7.2. Inflate Objects On Initial Access<br />4 . Persistence System Design with ORK Model<br />4 .1. Database Management System for ORK Model<br />4 .2. Create Domain Model with Persistent Objects<br />4 .2.1. Design Domain Object Topography<br />4 .2.2. Design Object Behaviors (Domain Logics)<br />4 .2.2.1. Concern Persistence Behaviors<br />4 .3. Provide Access to the System<br />4 .3.1. Define and Implement Service Interfaces<br />4 .3.1.1. Create Domain Objects<br />4 .3.1.2. Find Domain Objects<br />4 .3.1.2.1. Query Persistent Objects using SQL<br />4 .3.1.2.2. More Query Mechanisms<br />4 .3.1.3. Delete Domain Objects<br />4 .3.1.4. Invoke Domain Object Methods<br />4 .3.1.4.1. Methods Read Persistent Fields<br />4 .3.1.4.2. Methods Write Persistent Fields<br />4 .3.1.4.3. Methods Update Tie Fields<br />4 .3.2. Host Foreign Task Agents with Domain Model Environment<br />4 .3.2.1. Enable Task Agent Transmission<br />4 .3.2.2. Impose Security Constraints<br />4 .4. Design Data Analytical Applications using SQL<br />5 . Object-Relation-Kin Diagram<br />6 . Software Products for Reference
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/67576#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Apr 2007 12:13:20 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/67576</link>
        <guid>http://complystill.javaeye.com/blog/67576</guid>
      </item>
          <item>
        <title>Object-Relational Mapping The Fake</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/67575" style="color:red;">http://complystill.javaeye.com/blog/67575</a>&nbsp;
          发表时间: 2007年04月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Object-Relational Mapping The Fake<br />Speak of Relational Model In Your Favorite OO Languages<br /><br />Abstract:<br />What is today's Object-Relational Mapping REALLY doing? The answer will be given by this paper is: Mapping the<br />Network Model and SQL interface. In this paper, we shall see why and how this is the truth. And your favorite object<br />oriented programming languages, with sufficient modern features, such as Java™, are quite possible to be effectively<br />consolidates with the power of relational model, without defective mappings.<br />Ableverse™ TheObjectBase as the DBMS and WebOfWeb as the blueprint project are showing a feasible solution in<br />the Java™ programming language as realworld practices, on the basis of a new relational data model called the<br />Object-Relation-Kin model.<br /><br />全文见:<br /><a href="http://www.ableverse.org/articles/fakeorm.pdf" target="_blank">http://www.ableverse.org/articles/fakeorm.pdf</a><br />或<br /><a href="http://www.ableverse.org/articles/fakeorm.html" target="_blank">http://www.ableverse.org/articles/fakeorm.html</a><br /><br />Table of Contents:<br />1 . The Object-Relational Impedance Mismatch<br />2 . The Object-Relational Mapping<br />2 .1. Problems Solved<br />2 .1.1. Perform CRUD on Objects<br />2 .1.2. Query Objects Expressively and Accelerated<br />2 .1.3. Reduce Data Traffic by Cache<br />2 .2. New Problems Created<br />2 .2.1. Multi-Source of Schema/MetaData<br />2 .2.2. Transaction Serializability<br />2 .2.3. Confusing Property Writers<br />2 .2.4. Discomfort for Purists<br />2 .3. Problems Not (Effectively) Solved<br />2 .3.1. Relationship Manipulation<br />2 .3.2. Overall Complexity/Productivity<br />3 . Thank Again, What Is What<br />3 .1. The Network Model Called Object Model<br />3 .2. True Nature of the Relational Model<br />3 .3. How ORM's Usage of SQL Harms Consistency/Isolation<br />4 . Make a Match Instead of Defective Mapping<br />4 .1. A Simple Job Hard To Do<br />4 .2. What versus How<br />4 .3. Implement Concurrency/Transaction Control Based On Objects<br />4 .4. Server Side Object Graph and Hosting Based Interfacing<br />4 .5. SQL Does Query<br />5 . Seeking Fresh Meat
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/67575#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 03 Apr 2007 12:06:49 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/67575</link>
        <guid>http://complystill.javaeye.com/blog/67575</guid>
      </item>
          <item>
        <title>Java语言下一步可能快速演化, Eclipse将疲于跟从, NetBeans 6 值得一些期待</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/56190" style="color:red;">http://complystill.javaeye.com/blog/56190</a>&nbsp;
          发表时间: 2007年02月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          作为Java开发者, 学习了5以后带来的泛型语法之后, 不知道你有没有注意到一个特殊的地方: <br /><br />Class&lt;?> java.lang.Object.getClass();<br /><br />虽然它的签名返回值为 Class&lt;?> , 但是它的规范文档却给出了这样的说明:<br /><br /><div class="quote_title">引用</div><div class="quote_div"><br />Returns ... <br /><br /><strong>The actual result type is Class&lt;? extends |X|> where |X| is the erasure of the static type of the expression on which getClass is called.</strong> For example, no cast is required in this code fragment:<br /><br />Number n = 0; <br />Class&lt;? extends Number> c = n.getClass();<br /></div><br /><br />这确实让开发者更方便, 不过仔细想想, 这本质上却超出了正常的Java语法范畴.<br />为了实现这个特性, 其实是在Java编译器上做了特殊处理. <br />翻一下已经通过OpenJDK项目GPL开源的javac源码, 可以找到对应的编译器代码在<br /><br />com.sun.tools.javac.comp.Attr.visitApply(JCMethodInvocation tree){}<br /><br />方法中的这段程序:<br /><br /><pre name="code" class="java">
// as a special case, x.getClass() has type Class&lt;? extends |X|>
if (allowGenerics &&
    methName == names.getClass && tree.args.isEmpty()) {
    Type qualifier = (tree.meth.tag == JCTree.SELECT)
        ? ((JCFieldAccess) tree.meth).selected.type
        : env.enclClass.sym.type;
    restype = new
        ClassType(restype.getEnclosingType(),
                  List.&lt;Type>of(new WildcardType(types.erasure(qualifier),
                                                   BoundKind.EXTENDS,
                                                   syms.boundClass)),
                  restype.tsym);
}
</pre><br />也不是那么复杂对吧, 十行代码而已. 以此认知, 假如我们想现在就自己实现类似下面的语法:<br /><pre name="code" class="java">
var list = new ArrayList&lt;String>();
list.add("Haha");
</pre><br />只要给每个CompilationUnit增加一个 var 类型定义, 然后类似的替换成变量初始化表达式的结果类型就可以了.<br /><br /><br />整套SUN JAVAC的代码既然已经通过GPL开源, 那么我们就可以毫无顾忌的去做一些修改, 重新发布自己的版本了 - 只要基于GPL就可以. 而最大的意义还不止如此, 因为我们不大会去变动javac的公开接口, 所以我们自己版本的javac将可以和JDK无缝兼容, 最原始的办法是将标准JDK的tools.jar更名为sun-tools.jar, 把我们自己的 javac.jar 更名为 tools.jar 放到 JDK/lib 下面去, 同时在我们jar的MANIFEST.MF里增加一个Class-Path, 引用 sun-tools.jar. 这样不仅让命令行的 javac 完全变成我们的编译工具, 连通过Apache Ant的编译脚本也无需任何改动, 成为我们扩充版本Java语言的完备的编译系统.<br /><br />有人担心Java通过GPL开源以后因为上面的原因会造成太多的变形版本, 从而毁了Java语言, 不过我倒不这么认为. Java始终还是SUN的注册商标, SUN有法律权利要求变形版本不得称为 Java, 如果其它商业实体想利用SUN发布的Java相关内容另立门户, 名称问题其实很致命. 因为Java规范实质上仍旧通过JCP控制在SUN手里, 与JCP规范不完全兼容的语言版本, 是不可能得到SUN的认证从而获得Java冠名权的. 另外GPL提供了强有力的法律保障, 衍生版本的全部修改都可以合法的被SUN归入它维护的Java软件版本中, 这意味着SUN没有失去任何Java控制权, 反而会有越来越多的研究者无偿贡献他们的改进, SUN将有更多免费的, 直接可以吃下的, 经过实践检验的Java语言增值特性可供选择, 并且时机可以自己掌控. 作为Java5泛型语法源头的GJ编译器是一个先例, 以后这样的事情只会更普遍起来.<br /><br />快速演进的Java语法对Eclipse来说将是一场噩梦. Eclipse相对于其它Java IDE的最大优势是从VisualAge 4J编译器演化来的增量编译器, 因为此编译器与IDE无缝紧密的集成, 让Eclipse收到很多其它IDE无法达到的好处. 但是, 成也风云, 败也风云. Eclipse JDT Compiler是Java语言语法稳定性的最大受益者之一, 但是一旦Java语法开始快速增强, JDT 弄不好就要跟着疲于奔命, 从主导Java IDE功能特性的领导者, 变成被动适应Java新语法的跟从者.<br /><br />而对NetBeans来说, 在这方面的形势则颇为有利, Jackpot子项目展示并且有效的推动着SUN Javac向一个增量的, 动态恢复的, IDE友好的Java编译器兼语法元素建模工具前进. 从NB 6开始, 其Java编辑界面已经是基于javac的Compiler API模型, 虽然NetBeans团队对javac的动态特性增强还没有真正合并到SUN javac的代码当中, 但这一步已经是目前工作的方向, 完全合并的目标已经指日可待. 这个目标一旦实现, 最激动人心的结果, 那就是:<br /><br />你可以基于openjdk的GPL javac, 开发并且发布你自己的Java编译器, 增加各种想要的语法元素, 只要仔细考虑一些兼容性问题, 完全可以让那些利用了这些新语法的Java项目代码, 不光是能够顺利通过javac命令行成功编译, NetBeans IDE将能够经过简单的配置, 就可以让一个Java项目引用你发布的javac版本, 通过可移植的Ant脚本, 来编译这些项目. 并且新语法元素, 将直接在NetBeans IDE中得到支持, 包括关键字高亮, 重构, 引用检索 以及更多的高级开发功能特性. 这点将是其它IDE, 特别是用自家编译器的Eclipse非常难于做到的.<br /><br />另外, 通过对开发版本的NB6的试用, 我发现它已经远远超出了当年那个为了效仿Delphi而作的GUI Builder, 很多特性, 比如 重构, 相关内容高亮 等等已经直追Eclipse. 特别是从Update Center可以安装一个免费版本的Jalopy用于Java代码自动格式化, 感觉已经比Eclipse默认的自动格式化插件强了不少. 如果NB6的正式发行版也会包含免费的Jalopy, 感觉会是一大亮点.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/56190#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 27 Feb 2007 12:54:00 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/56190</link>
        <guid>http://complystill.javaeye.com/blog/56190</guid>
      </item>
          <item>
        <title>TOB 6 编程界面重大简化</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/55548" style="color:red;">http://complystill.javaeye.com/blog/55548</a>&nbsp;
          发表时间: 2007年02月25日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          TOB 6 的编程界面最近完成了一次重大简化, 附件是更新后的持久应用样板程序, 用6.0的SUN JDK和1.6.5或更新的Apache Ant就可以编译.<br /><br />简化后的持久类模样从下面代码可见一斑, 特别注意 getAllProducts() 的实现.<br />完整项目源码在附件zip中.<br /><pre name="code" class="java">
package tob.bookstore;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import av.tob.IAm;
import av.tob.Index;
import av.tob.Kin;
import av.tob.KinSet;
import av.tob.Retying;
import av.tob.Swappable;
import av.tob.TheRelation;
import av.tob.Writing;

@Swappable(typeInSwap = "Category")
public class Category extends TheRelation
{

    @Index(unique = false)
    protected static final String NAME_INDEX = "name";

    protected Tie&lt;Category> parent;

    @IAm("parent")
    protected KinSet&lt;Category, Category> subcategories = null;

    @IAm("maincate")
    protected KinSet&lt;Product, Product> products = null;

    protected KinSet&lt;Categorization, Product> moreProducts = null;

    private String name;

    private String description;

    protected Category()
    {
    }

    public Category(Category parentCate, String name, String desc)
    {
        this.parent = (parentCate == null) ? null : new Tie&lt;Category>(
                parentCate);
        this.name = name;
        this.description = desc;
    }

    public Category getParent()
    {
        return parent == null ? null : parent.o;
    }

    @Retying("parent")
    public void changeParent(Category newParent)
    {
        this.parent = (newParent == null) ? null : new Tie&lt;Category>(newParent);
    }

    public KinSet&lt;Category, Category> getSubcategories()
    {
        return this.subcategories;
    }

    public KinSet&lt;Product, Product> getMainProducts()
    {
        return this.products;
    }

    public KinSet&lt;Categorization, Product> getMoreProducts()
    {
        return this.moreProducts;
    }

    private void enlistProducts(List&lt;Product> l)
    {
        for (Kin&lt;?, Product> p : products)
            l.add(p.getO());
        for (Kin&lt;?, Product> p : moreProducts)
            l.add(p.getO());
        for (Kin&lt;?, Category> subcate : subcategories)
            subcate.getO().enlistProducts(l);
    }

    public List&lt;Product> getAllProducts()
    {
        List&lt;Product> all = new ArrayList&lt;Product>(100);
        this.enlistProducts(all);
        return Collections.unmodifiableList(all);
    }

    public String getName()
    {
        return this.name;
    }

    @Writing
    public void setName(String name)
    {
        this.name = name;
    }

    public String getDesciption()
    {
        return this.description;
    }

    @Writing
    public void setDescription(String desc)
    {
        this.description = desc;
    }

}
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/55548#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Sun, 25 Feb 2007 11:55:27 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/55548</link>
        <guid>http://complystill.javaeye.com/blog/55548</guid>
      </item>
          <item>
        <title>新发现 ANTs Data Server 好像很有潜力</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/51841" style="color:red;">http://complystill.javaeye.com/blog/51841</a>&nbsp;
          发表时间: 2007年02月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="www.ants.com" target="_blank">www.ants.com</a><br /><br />号称可以兼容现在主流商业数据库, 而且性能赶超 TIMES TEN.<br />号称从 SQL 到 存储过程, 兼容Oracle, Sybase, SQL Server等, 据说他们的工程师只要两周就可以免费把客户基于其它数据库的现有应用移植过去.<br /><br />下载了一个评估版, 安装配置的时候问: 你这台机器内存大于4G吗? 汗...<br /><br />然后服务一启动, 先把可能占的内存都分配去了(我1G物理内存它申请了8百多M).<br /><br />看资料和网上Review它是为大内存和高并发写了新的数据库内核, 有一个Lock-Free的算法正在申请专利.<br /><br />不过它好像一切连接都要通过ODBC, 它自己的Enterprise Manager也不例外. <br />另外它自己的JDBC驱动也是需要通过ODBC桥接, 有点遗憾.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/51841#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 02 Feb 2007 15:57:45 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/51841</link>
        <guid>http://complystill.javaeye.com/blog/51841</guid>
      </item>
          <item>
        <title>看起来国际通信电缆似乎恢复了</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/51171" style="color:red;">http://complystill.javaeye.com/blog/51171</a>&nbsp;
          发表时间: 2007年01月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          国外网站的访问速度基本恢复到原来水平了, 值得高兴一下<img src="/images/smiles/icon_smile.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/51171#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Mon, 29 Jan 2007 23:42:55 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/51171</link>
        <guid>http://complystill.javaeye.com/blog/51171</guid>
      </item>
          <item>
        <title>TOB持久编程速查小抄</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/50908" style="color:red;">http://complystill.javaeye.com/blog/50908</a>&nbsp;
          发表时间: 2007年01月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          TOB编写持久应用时的例子速查小抄.<br /><br />第二个 zip 附件包含 OpenOffice及MS-Excel 格式的版本, 方便编辑修改.<br /><br />不知道谁有没有兴趣, 为 Hibernate/EJB3/JDO 等等其它持久机制做类似的简述小抄, 我是很希望看看比较的结果. 至少做出来分享也能方便使用它们的新手速查, 附件的可编辑文件可以作为模板. 或者大家想到更多方面的内容需要列出来的也欢迎讨论.<br /><br /><img src="http://complystill.javaeye.com/topics/download/52fb5524-d075-4c2d-b3ed-42a540f2733c?disposition=attachment" />
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/50908#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 28 Jan 2007 18:16:35 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/50908</link>
        <guid>http://complystill.javaeye.com/blog/50908</guid>
      </item>
          <item>
        <title>关于用 HBI 实现 TOB 分布式访问的灵感</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/48200" style="color:red;">http://complystill.javaeye.com/blog/48200</a>&nbsp;
          发表时间: 2007年01月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          对于TOB的分布式访问支持, 原来总是从分布的TOB实例出发考虑方案, 思路一直不够成熟.<br /><br />今天突然获得灵感, 其实完全可以通过最近总结的 HBI (Hosting Based Interfacing) 思路去实现. 原始想法在 <a href="http://www.javaeye.com/topic/34848" target="_blank">http://www.javaeye.com/topic/34848</a> 提出讨论过, 表面上扯得比较远, 不过用在 TOB 的分布式访问上, 就可以得到这样的结果方案:<br /><br />分布式的架构中, TOB 实例运行于一个专门的JVM中, 实现一个 TOB Host 服务器程序, 对它来说是以嵌入方式启动TOB实例, 自己实现线程池, 然后侦听网络端口, 从网络接受 客户端应用 通过网络, 以XML为载体 传递来的命令对象, 并执行这些对象, 对象本身通过应用编写的代码, 决定处理逻辑和结果内容等等.<br /><br />为了能在 TOB Host 上执行应用定义的对象, 随应用程序开发的 命令对象类, 它们编译出来的bytecode代码要部署到 TOB Host 上, 这个过程可以和部署J2EE Web应用类似. 或者更理想的, 也可能在客户端鉴权认证以后, 每连接由客户端提供 ClassLoader 的数据源, 类似 URLClassLoader 通过 HTTP/FTP 的 URL 加载远程代码的方式, 这样很方便开发时重编译后动态替换代码.<br /><br />另外持久模型类也会需要进行部署, TOB本身已经支持重新编译后的动态代码替换, 只需再实现一个代码更新的检测/通知机制.<br /><br />这样一个分布式的 TOB 系统, 就是一个JVM跑数据库实例, 然后多个客户端应用, 各自或者相互依赖的开发好自己的 持久模型类 和 请求命令类, 部署到 TOB Host 上, 之后应用程序执行时不是像传统关系数据库那样发送SQL获得返回结果集, 而是发送 可执行的命令对象 到TOB数据库实例上执行, 然后获得自己写的这些命令对象代码的执行结果.<br /><br />这个架构至少可以有以下好处:<br /><br />1. 设计开发这些 命令对象类 时, 就是认为在访问一个嵌入的TOB实例, 因而其实就是访问/操作一张内存中的 持久对象图, 结构清晰明了, 逻辑不带杂质.<br />2. 超级性能. 因为是在数据库端执行, 性能指标和存储过程是一个层次的, 而且因为是用Java而不是用带各种局限的 PL/SQL 之类的专有编程语言, 仔细编码以后很有可能比SP性能更高.<br />3. Java的丰富类库, 灵活性和健壮性, 全盘保留.<br /><br /><br />其实思路朝这个方向想以后, 再看看 WoW 的架构, 完全可以认为是运行在广大浏览器里的Applet客户端应用, 通过互联网连接去访问服务器上的TOB数据库实例, 它各个部分的代码量统计结果, 完全支持这个观点.<br />美国那边的合作伙伴已经动手开始开发Flash版本的WoW浏览器端界面, 在这个方向上, 以后很有可能会衍生出TOB的Flash客户端库.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/48200#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 17 Jan 2007 22:38:36 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/48200</link>
        <guid>http://complystill.javaeye.com/blog/48200</guid>
      </item>
          <item>
        <title>关于开发框架中的持久对象图</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/47155" style="color:red;">http://complystill.javaeye.com/blog/47155</a>&nbsp;
          发表时间: 2007年01月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          刚看了 zwchen 的 MiniFramework 和 giscat 的 Agile Java Framework, 发现其中一个共同的思想就是通过 Map和List 来实现对象图, 在框架各层之间传递共享. 好像有类似思路和实践的同仁也不少.<br /><br />这确实是比通常的 ORM 更容易实现和掌握的一条途径, 不过同时也损失了 强类型OO 的类型信息, 和 强语法 的 引用语法检查 能力, 在 重构 方面对 迭代式的敏捷过程 有负面影响.<br /><br />TOB (<a href="http://tob.ableverse.org" target="_blank">http://tob.ableverse.org</a>) 是我最近搞的一个关系模型的Java对象数据库. 如果在框架中用 TOB 来作为持久层的话, 可能上面的好处可以兼得, 因为TOB是以OO对象为中心的:<br />当你从 TOB 获得一个 持久对象 的引用时, 必然是已经包含了它的整个持久拓扑结构的, 也就没有必要再由程序去自己构造 Map/List 结构, 持久类写成兼容 JavaBean 规范的话, 应该也可以通过 OGNL 访问.<br />从应用的角度来看, 相当于你可以用SQL查询到已经在内存中构造好的对象拓扑图中的特定节点, 然后再通过持久对象引用遍历到所有和它相关的节点.<br /><br />当然TOB假定系统内存可以放得下数据库管理下的最大的拓扑图, 不过随着64位普及, 内存越来越便宜, 大部分项目的硬件环境应该可以适用.<br /><br />大家有兴趣和时间的请研究研究.<br /><br />我目前正在写tob数据模型的论文, 进度更新在 <a href="http://www.ableverse.org/articles/orkm.html" target="_blank">http://www.ableverse.org/articles/orkm.html</a><br />tob教程也正在写: <a href="http://www.ableverse.org/tutorials/tob/" target="_blank">http://www.ableverse.org/tutorials/tob/</a>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/47155#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 15 Jan 2007 12:02:44 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/47155</link>
        <guid>http://complystill.javaeye.com/blog/47155</guid>
      </item>
          <item>
        <title>献礼2007,TOB 6发布,像普通Java程序一样开发持久应用,免费用于个人用途或指定OS</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/42540" style="color:red;">http://complystill.javaeye.com/blog/42540</a>&nbsp;
          发表时间: 2007年01月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          随着 JDK 6 Mustang 年底前的正式发布, Ableverse 6 TOB 终于可以摆脱 Java 5 时烦琐的 apt 工具处理 Annotation 的限制, 基于新的 JSR 269 标准, Annotation 可以在 javac 的过程中被透明处理. 同时发布的还有升级到 6版本 的其他 Ableverse 6 产品, 包括 Meta Facility, Message Facility.<br /><br />附件为样板程序包, 包括 Bookstore, UserContact 和 复杂的 Family 模型在 TOB 上的实战建模.<br />可以通过 javac, 独立 或者 Eclipse内置的 Apache Ant 编译. 可以在Eclipse中启动可执行类.<br /><br />通过 Annotation 实现元信息与源码耦合过紧? 自己解析XML配置文件又太麻烦?<br />需要可以继承/覆盖的分散元信息结构? 需要国际化的元信息支持?<br /><strong>试试 Ableverse Meta Facility!</strong><br />class文件相同目录结构组织的多个XML文件与Java类/包无缝绑定!<br />一个 XPath 让你获得任何想要的元数据! 包括分布于多个XML文件中的相同路径元信息!<br />自动转换成各种Primitive类型的单值或者数组返回给你!<br />支持按照Java包层次结构或者自定义层次结构组织的元数据的继承和覆盖!<br />像stack trace一样的跟踪信息, 帮你调试元信息和程序代码之间的匹配错误!<br />直接支持国际化! 给不同Locale配置不同元信息只需要XML文件名上加个标识!<br />全部源码供参考! (非开源, 参考以外其他用途受限)<br />产品教程: <a href="http://www.ableverse.org/tutorials/meta/" target="_blank">http://www.ableverse.org/tutorials/meta/</a><br /><br /><br />开发国际化应用, 厌倦了远离代码上下文的 ResourceBundle? 想在资源文本中使用脚本?<br />定义的资源字符串有歧义, 却没有途径澄清? 缺乏有效手段协调程序员与翻译员的沟通?<br />所有的Logging系统都只支持单个配置文件, 无法多个组件灵活共享Logging资源?<br /><strong>试试 Ableverse Message Facility!</strong><br />国际化文本段基于Java代码注释, 编译时自动提取生成XML国际化文本资源!<br />命名的文本参数, 可设默认值, 参数及文本皆可在Java注释中添加说明向翻译人员释疑!<br />XML资源包含定义及使用的Java源文件及行号信息, 轻松定位问题文本!<br />文本资源与Java类/包无缝绑定, 直接实现类/包局部资源或模块(大包)级资源共享!<br />独有文本位置信息显示选项, 直接从用户界面得知问题文字的定义位置!<br />国际化Logging支持, 基于Meta Facility元信息的分布可继承配置方式,应用服务器与若干应用轻松共享Logging资源和配置!<br />全部源码供参考! (非开源, 参考以外其他用途受限)<br />产品教程: <a href="http://www.ableverse.org/tutorials/msg/" target="_blank">http://www.ableverse.org/tutorials/msg/</a><br /><br /><br />要开发超高并发, 严格数据完整性要求的数据库应用? 需要为高性能计算添加持久存储能力?<br />厌倦了 ORM 的烦琐和乏力, 期望用纯Java来开发结构复杂的持久应用?<br />羡慕 RoR ActiveRecord 的开发效率?<br /><strong>试试 Ableverse The Object Base!</strong><br />面向对象的数据库应用开发, 从 分析, 设计 到 编码, 测试, 全程纯Java类模型, 仅需增加业务逻辑!<br />传统关系数据库作为后台存储, 保留已有 备份, 移植, 统计, 分析 等维护工具和应用接口!<br />内存关系对象模型, 应用的Java业务逻辑代码可获得比存储过程更高的性能!<br />底层关系数据库的安全保障, 内存数据库的应用性能!<br />全程自动底层数据库方案维护, 开发调试仅需运行Java持久程序!<br />无需JVM重启, 动态适应持久类代码更新, 按需自动调整底层数据库方案!<br />更有效利用大内存!<br />部分源码供参考! (非开源, 参考以外其他用途受限)<br />产品教程: <a href="http://www.ableverse.org/tutorials/tob/" target="_blank">http://www.ableverse.org/tutorials/tob/</a><br /><br /><br />心动不如行动!<br /><a href="http://java.sun.com/javase/6/download.jsp" target="_blank">http://java.sun.com/javase/6/download.jsp</a>  下载最新 SUN JDK 6<br /><a href="http://www.ableverse.com/download-free.jsp" target="_blank">http://www.ableverse.com/download-free.jsp</a> 下载最新 Ableverse 免费产品包<br /><a href="http://www.ableverse.org/tutorials/" target="_blank">http://www.ableverse.org/tutorials/</a>        阅读产品教程.<br /><br />本帖附件下载最新样板程序, 动手运行体验!
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/42540#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Mon, 01 Jan 2007 08:17:25 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/42540</link>
        <guid>http://complystill.javaeye.com/blog/42540</guid>
      </item>
          <item>
        <title>台湾地震, 海底光缆断了, 郁闷...</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/41104" style="color:red;">http://complystill.javaeye.com/blog/41104</a>&nbsp;
          发表时间: 2006年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          郁闷啊, 不知道什么时候才能恢复中国国际出口的带宽..
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/41104#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Dec 2006 05:11:01 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/41104</link>
        <guid>http://complystill.javaeye.com/blog/41104</guid>
      </item>
          <item>
        <title>ORM其实是在映射网络模型和关系模型,OO的关系模型无需映射,且更简单高效</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/41103" style="color:red;">http://complystill.javaeye.com/blog/41103</a>&nbsp;
          发表时间: 2006年12月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          O-R Mapping 从字面上理解是在 面向对象体系 与 关系数据库 之间进行映射. <br /><br />不过最近为了写 TOB 的 ORK 模型资料, 更进一步研究了 Entity-Relationship 模型以及相关的 网络模型, 关系模型 和 Entity Set 模型. 然后有个惊人的发现:<br /><br />  ORM 所支持的 POJO 模型本质上其实是网络模型, 而 O-R 的 Mapping 其实是在 网络模型 和 关系模型之间进行映射.<br /><br />--有了这个发现, 总算对一直以来对 ORM 和 POJO 模型的一些感性的抵触有了一个理性的认识.<br /><br />认定 ORM 所支持的 POJO 模型为 网络模型, 判断如下:<br /><br />1. 对象之间的关联是通过 单边(Unidirectional)或者对等(Bidirectional)的引用(Reference)或者引用集合(Reference Set)建立起来的. 没有独立的 Relationship 载体.<br />2. 对等(Bidirectional)的引用或引用集合之间也存在不自然的单向性, 其中必有一方为 Owner, 而另一方为 Member. 这是网络模型的特有特征.<br /><br />而关系模型下 实体 之间的关联是通过独立的 关系记录 代表的, 而 关系记录 上也可以有自己的属性, 很多情况下这些 关系属性 非常重要, 使关系模型能够比网络模型更接近现实世界的结构. 比如一辆汽车的组装模型, 用到某种型号的螺母, 而这种螺母的单车用量, 作为 车型 与 螺母型号 两个实体之间的 关系属性 才最为恰当.<br /><br /><br />人们一直认为 关系模型 与 面向对象体系 之间无法完美融合, 也遭遇了多方面的尝试失败, 但是以目前我的研究分析结果来看, 这其中的根本原因是大家还没有认识到这些失败的研究和尝试仅只是在用 面向对象的方法 去实现 网络模型 的持久数据管理系统.<br /><br />目前成熟的面向对象数据库, 比如为 Java 和 .Net 设计的 db4o <a href="http://www.db4o.com" target="_blank">http://www.db4o.com</a> 其实是网络数据库. 通用面向对象程序设计语言 (General Purpose Object Oriented Programming Language), 特别是广泛应用的一些, 像 C++, Java 方面, 始终没有本土的关系模型数据库出现. 而应用程序开发领域广泛采用了这些 通用面向对象程序设计语言, 并且难以割舍.<br /><br />加上 Hibernate 所引领的层出不穷的 ORM 框架产品, 呈现给人一种感觉, 那就是, 面向对象 与 关系模型 水火不容, 只能 Mapping.<br /><br />但是事实上, 众多传统关系数据库产品早已加入了面向对象的思想特性, 称为 Object Relational Database <a href="http://en.wikipedia.org/wiki/Object-relational_database" target="_blank">http://en.wikipedia.org/wiki/Object-relational_database</a>, 像 Oracle 8 以后就是. 更有甚者比如 InterSystems 的 CACHÉ <a href="http://www.intersystems.com/cache/index.html" target="_blank">http://www.intersystems.com/cache/index.html</a>, 自称为 Post-Relational Database, 而其实已经可以通过完全的面向对象的语言来进行数据库开发, 只不过用的是自家(Home Grown)的OO语言.<br /><br />而通用OO语言一直没能融合关系模型的一个根本原因, 是大家总是拒绝向内存对象模型引入 "关系对象" 的概念, 而这是 关系模型 区别于 网络模型 的根本特征之一. <br /><br />不过在传统的以磁盘为主体存储的数据库系统中, "关系对象" 所建立起来的 "关联" 自然而然的完全存在于逻辑上, 这同时也使得对 "关联" 的操作非常简单, 只有3件事: <br /> <br /> 1. 创建关系对象以建立关联<br /> 2. 删除关系对象以解除关联<br /> 3. 指定 JOIN 以引用关联<br /><br />这里的 3, 限定了对关系数据的访问只能是通过 SQL, 一种不可能 OO 的语言.<br /><br />目前的数据库市场仍然还是 以磁盘为主体(Disk Targeted) 的数据库产品的天下, 所以天经地义的, 关系模型与 SQL 之间, 在人们心里存在一个等号.<br /><br />但是随着64位计算的日趋普及, 大内存也成为趋势, 于是现在已经出现了新的可能:<br />  <strong>在内存里建立关系模型的对象数据!</strong><br />而基于日趋成熟的代码生成技术, 用注入的逻辑自动维护内存中关系模型下对象之间的引用关系也变为可能, 创建 和 删除 关系对象 时, 已经完全可以由数据库系统来自动修改它所连接起来的其他 持久对象 的 连接引用(Joint Reference), 从而维护整个内存中关系模型拓扑图的完整.<br /><br />结论是: 对象技术其实不必借助 Mapping 就能实现和利用 关系模型, 现有的 ORM 其实只是在进行 OO语言编写的网络模型 到 关系模型 的映射.<br /><br />面向对象的关系模型已经不是凭空的设想, 而是已经有可以实际应用的数据库产品, 就是我已经开发完成的 Ableverse The Object Base <a href="http://tob.ableverse.org" target="_blank">http://tob.ableverse.org</a>, 它也不仅只是一个研究产品, 从开源的 WoW <a href="http://www.webofweb.net" target="_blank">http://www.webofweb.net</a> 产品表现, 可以看到它的商业质量.<br /><br />不过 TOB 目前公开发行的还是版本 5, 开发时编译步骤还相对复杂.<br />计划元旦以后发布版本 6, 这个版本只需JDK6的javac, 没有任何多余步骤, 只需按平常开发Java程序的方法就可以编写基于TOB的持久应用, 通过Apache Ant, 也可以和流行Java IDE很好的集成.<br /><br />基于TOB的持久应用, 全部源码只需Java类代码, 并且相对于 直接JDBC操作关系数据库, 或通过ORM方式, 数据库性能有几倍到几千倍的提升, 是关系数据库后台存储上的内存数据库性能.
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/41103#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 28 Dec 2006 04:44:24 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/41103</link>
        <guid>http://complystill.javaeye.com/blog/41103</guid>
      </item>
          <item>
        <title>解决侵入的根本方法讨论</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/39346" style="color:red;">http://complystill.javaeye.com/blog/39346</a>&nbsp;
          发表时间: 2006年12月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;</p>
<p><font face="Arial">最近又看到一些关于框架侵入性的讨论, 有些想法, 谨此抛砖引玉.</font></p>
<p><font face="Arial">我觉得软件开发框架之所以跟侵入性纠缠不清, 根本的原因还是框架要支持应用的某种/某些逻辑和功能, 可以说是部分的去实现应用的目标. 但是这些功能如果不能让应用去定制, 其现实应用代价就又很微渺了. 所以框架是需要和应用交流的, 而交流的主要目的是为了定制.</font></p>
<p><font face="Arial">想到这个地方, 我的反应是声明式编程, 让应用通过某种方式表达出自己的定制需求, 这个表达的方式就可以是多种多样的了: 通过遵循约定, 继承特定框架基类, 实现特定框架接口, 标注Annotation, 编写配置文件, 调用框架API, 等等.</font></p>
<p><font face="Arial">而像Java这样的静态语言所能支持的表达方式, 无论怎么看都可以挂上 &quot;侵入性&quot; 的标签, 因为如果框架一旦定了它要求应用采纳的方式, 应用就得跟着它走. 在应用需求表达方式问题上, 框架之间的相容性既没有理论研究, 更没有实践习惯.</font></p>
<p><font face="Arial">这里提到 &quot;框架的侵入性&quot; 好像用的是它最宽泛的涵义, 就是对应用编程行为的影响. 要是这么说任何框架都不可能没有侵入性了, 只是有些让应用开发人员的日子很难过, 有些则好一点. 不过以目前的软件体系局势来看, 绝对的 &quot;侵入性&quot; 问题还没有办法解决, 更现实一点, 似乎只有它对单元化开发和测试的影响比较有可能解决, 眼下讨论才比较有现实意义.</font></p>
<p><font face="Arial">不过对下一代软件框架体系, 我倒是感到有些期望, 随着Annotation的成熟和普及, 对于基于Java的开发来说, 我觉得这个趋势已经临近了. 我的想法是可以运用一下逆向思维, 既然应用与框架的交互无可避免, 那么与其被动的接受框架的 &quot;侵入&quot; 不如由应用自身采取主动行为, 进行 &quot;引入&quot;.</font></p>
<p><font face="Arial">应用的主动引入可以从已有的 声明式编程 出发, 对于比较大的综合应用方向, 比如 Web应用, 以制定通用的应用需求表达规范为手段, 通过公开的规范, 协调应用程序和系统框架之间的交流. 这听起来就是JCP要为JavaEE做的事情, 是的, 以截至到目前的软件体系局势, 这个事情还不得不由人力, 物力, 财力丰厚的商业实体去完成, 它们也必须在这个领域有足够的商业利益吸引也才有动力去做.</font></p>
<p><font face="Arial">但是同样是JCP出来的J2EE规范, Servlet很成功, 而EJB却不是. 并且Servlet很好的解决了它那个年代的Web开发问题, 而软硬件的发展所推动出来的新需求, 新问题又飞快增长, 对新规范的需求不仅是本身增长很快, 它的增长速度也会随着时间增长. JCP已经开始显得笨拙且乏力了.</font></p>
<p><font face="Arial">一个本质性的问题是: 目前的规范是基于少量编程语言API的大部分的自然语言描述. 基于这样的模式, 成本太高, 就算是目前的大型开源社区要开发自己的体系规范也会是难上加难.</font></p>
<p><font face="Arial">在这个方向上, DSL(Domain Specific Language)是个很好的创意, 可以有针对性的简化专门领域的规约方式. 不过, 我觉得还有DSL没有特别关注的一点, 就是同一种语言中声明与实现语法的分离与融汇: <br />
&nbsp; DSL倾向于作为一种声明式的语言, 被设计为独立使用, 它很可能由另一种通用语言进行解释而实现. 它的语法很可能可以直接调用实现语言, 但很难变成编写应用所用语言的一部分. (我很期望它变成应用代码的声明部分)</font></p>
<p><font face="Arial">回到解决侵入性的问题上来, 我设想的方式是目前还没有的, 至少还没有系统化. 那就是可以用一种语法给应用编程语言增加用于声明的语法, 同时这种语法也照顾到给应用声明的需求提供实现的系统编程语言语法, 从而这样的语法可以同时 表达/约束/支持 应用声明和系统实现.</font></p>
<p><font face="Arial">看上去动态语言在这个方向上有最深厚的长远潜力, 不过用于有分析需求的通用工业开发领域, 动态语言要走的路还有点长. </font></p>
<p><font face="Arial">目前基于Java的开发, 利用起Annotation机制会在这个方向上有长足进展, 应用通过引用标注来声明需求, 系统在编译时通过Annotation Processor以及Language Model, 在运行时通过反射, 两者结合起来去理解和实现应用的需求. 而定义和引用Annotation都受到新增的Java语法约束. <br />
不过基于Annotation机制的 应用/系统 交流有时候还是需要一些自然语言描述的规范, 好在这个已经比纯粹描述/理解大篇的约定和接口调用逻辑顺序简易多了. 同时Annotation引用只能放在modifier的位置还是一个过大的约束, 这个还需要Java语言进一步的演进去解决.</font></p>
<p><font face="Arial">总结下来, 系统框架通过 &quot;侵入&quot; 要达到的 应用定制 目的是不可避免的, 而要解决被动的受到 &quot;侵入&quot; 的局面, 我所能想到的最好方法就是去主动 &quot;引入&quot;. 而 &quot;引入&quot; 所能达到的 &quot;主动&quot; 程度取决于其方式方法的灵活程度和负面影响大小. 当应用的特定需求可以通过统一的(声明)方式利用大多不同系统(包括测试时的Mock系统)而实现时, 应用的 &quot;引入&quot; 行为也就达到了一个比较理想的主动程度, 从而可以视为没有被特定系统 &quot;侵入&quot; 了.<br />
</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/39346#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</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>Sat, 16 Dec 2006 20:01:14 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/39346</link>
        <guid>http://complystill.javaeye.com/blog/39346</guid>
      </item>
          <item>
        <title>利用互动协作的思维导图增量持久化敏捷迭代的头脑风暴过程</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/38313" style="color:red;">http://complystill.javaeye.com/blog/38313</a>&nbsp;
          发表时间: 2006年12月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最近写教程了解了一些敏捷相关内容, 想到 WoW <a href="http://www.webofweb.net" target="_blank">http://www.webofweb.net</a> 在敏捷开发过程中可能的应用.<br /><br />因为 WoW 是一个基于思维导图界面的, 允许从互联网范围进行广泛协作的新结构化媒体平台, 而思维导图本身也是头脑风暴的好工具, 但目前基本所有其他MindMapping工具软件都是面向个人的桌面应用, 所以限制了思维导图在团队范围以致社区范围的应用. <br /><br />但是WoW把思维导图提升到了可以基于网络广泛协作的程度, 同时还增加了即时消息讨论功能, 并且保存全部灵念修改历史和即时聊天历史. 这不仅把头脑风暴从一个人的大脑范围拓展到局部团队甚至是跨洋成员之间的协同思考模式, 也把整个风暴过程如实详尽的记录下来, 让灵感和思路有可能跨越时间距离重现和继续下去. <br /><br />同时基于电子媒体的思维导图即可以打印到大张的纸质界面上动笔勾画, 也方便后期维护, 通过建立归档和参考节点等等技巧整理精髓主脉.<br /><br />大家有什么想法?
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/38313#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 10 Dec 2006 18:50:17 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/38313</link>
        <guid>http://complystill.javaeye.com/blog/38313</guid>
      </item>
          <item>
        <title>TOB - BookStore Pattern</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/35878" style="color:red;">http://complystill.javaeye.com/blog/35878</a>&nbsp;
          发表时间: 2006年11月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">如果还没有JDK 5, 从 SUN 网站下载一个安装</font></p>
<p><font face="Arial">如果还没有Eclipse (最新是3.2, 至少要3.1, 以便支持Generics, Annotation), 从 eclipse.org 下载一个. 因为最新的JDK 1.5.0_09 的 javac 编译 TOB 生成的代码也会 crash, 所以只能通过eclipse编译.</font></p>
<p><font face="Arial">从 http://www.ableverse.com/download-free.jsp 下载TOB, 获得 av5base.jar 和 av5tob.jar 以及 freemarker-2.3.4.jar</font></p>
<p><font face="Arial">从 http://www.h2database.com 下载 H2, 获得 h2.jar</font></p>
<p><font face="Arial">将附件 zip 文件导入为一个eclipse项目, 修改项目属性, 改正引用的外部 jar 文件路径.</font></p>
<p><font face="Arial">两个方法来编译这个项目:</font></p>
<p><font face="Arial">1. 设置系统环境变量 JAVA_HOME 指向JDK 5的安装目录(或者修改项目根目录的 run-apt.bat, 在所有语句之前加上 set JAVA_HOME=xxx), 双击执行项目根目录的 run-apt.bat, 完成以后再在Eclipse里选中项目, 选 Project->Clean菜单. </font></p>
<p><font face="Arial">2. 下载Apache Ant 1.7.0 (目前最新是1.7.0RC1)或者更新的版本以支持 apt 任务. 在Eclipse里调出 Run->External Tools 对话框(如果没有出现 av5patterns build.xml 条目, 说明你的eclipse版本比较老, 最好升级一下) 选中 av5patterns build.xml 这个条目, 在右边的Classpath选项卡下修改Ant Home, 然后执行. 或者你自己想办法让项目根目录的 build.xml 在有eclipse jdtCompiler的Ant 1.7.0 环境中执行.</font></p>
<p><font face="Arial">编译好以后可以运行 tob.bookstore.Test 类.</font></p>
<p><font face="Arial">修改 meta\tob.meta 配置不同的数据库参数.</font></p>
<p><font face="Arial">---</font></p>
<p><font face="Arial">更复杂的使用可以参考 WoW 项目 http://wow.dev.java.net</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/35878#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><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><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 24 Nov 2006 19:29:45 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/35878</link>
        <guid>http://complystill.javaeye.com/blog/35878</guid>
      </item>
          <item>
        <title>看来银行的IT是最落后的</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/34903" style="color:red;">http://complystill.javaeye.com/blog/34903</a>&nbsp;
          发表时间: 2006年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://yro.slashdot.org/article.pl?sid=06/11/18/1355233&from=rss" target="_blank">http://yro.slashdot.org/article.pl?sid=06/11/18/1355233&from=rss</a><br /><br />英国 UK Building Society Nationwide 承认有一台便携电脑在其一名雇员的家中被偷, 而这台电脑上包含了超过一千一百万的帐户数据.<br /><br />人们不禁担心: 居然事件发生的三个月以后才被公布? 怎么可能有这样的事? 为什么全部客户的帐户数据竟然可以放在雇员家里的电脑上? 为什么这些数据甚至没有经过加密?<br /><br />个人觉得还是银行的IT技术和系统太老旧了, 远远落后于时代..
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/34903#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/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 19 Nov 2006 03:47:00 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/34903</link>
        <guid>http://complystill.javaeye.com/blog/34903</guid>
      </item>
          <item>
        <title>一个MP3就可以盗取信用卡资料</title>
        <author>歆渊</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://complystill.javaeye.com">歆渊</a>&nbsp;
                    链接：<a href="http://complystill.javaeye.com/blog/34902" style="color:red;">http://complystill.javaeye.com/blog/34902</a>&nbsp;
          发表时间: 2006年11月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><a href="http://www.theregister.co.uk/2006/11/18/mp3_player_atm_hack/">http://www.theregister.co.uk/2006/11/18/mp3_player_atm_hack/</a></p>
<p>英格兰曼彻斯特的一个人把MP3接到公共ATM后面, 录下拨号时的声音, 然后用特殊的软件解码之后就可以获取别人的信用卡数据, 用来伪造真卡... 科技的力量啊!!</p>
          <br/>
          <span style="color:red;">
            <a href="http://complystill.javaeye.com/blog/34902#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/70' target='_blank'><span style="color:red;font-weight:bold;">第二届网络工程师侠客行大会5月24日杭州举行</span></a></li><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></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 19 Nov 2006 03:38:14 +0800</pubDate>
        <link>http://complystill.javaeye.com/blog/34902</link>
        <guid>http://complystill.javaeye.com/blog/34902</guid>
      </item>
      </channel>
</rss>