<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>繁华向左，寂寞向右--永远的船长</title>
    <description>永远的船长</description>
    <link>http://captain.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>交规模拟考试题库</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/242631" style="color:red;">http://captain.javaeye.com/blog/242631</a>&nbsp;
          发表时间: 2008年09月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.jsyks.com/sxlx.asp" target="_blank">http://www.jsyks.com/sxlx.asp</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/242631#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 16 Sep 2008 10:47:50 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/242631</link>
        <guid>http://captain.javaeye.com/blog/242631</guid>
      </item>
          <item>
        <title>prototype经典例子</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/237235" style="color:red;">http://captain.javaeye.com/blog/237235</a>&nbsp;
          发表时间: 2008年09月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.cnblogs.com/angelfeather/archive/2008/01/24/1051552.html" target="_blank">http://www.cnblogs.com/angelfeather/archive/2008/01/24/1051552.html</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/237235#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 05 Sep 2008 00:58:31 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/237235</link>
        <guid>http://captain.javaeye.com/blog/237235</guid>
      </item>
          <item>
        <title>firefox代理插件</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/236801" style="color:red;">http://captain.javaeye.com/blog/236801</a>&nbsp;
          发表时间: 2008年09月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="https://addons.mozilla.org/zh-CN/firefox/addon/2864" target="_blank">https://addons.mozilla.org/zh-CN/firefox/addon/2864</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/236801#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 04 Sep 2008 13:02:59 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/236801</link>
        <guid>http://captain.javaeye.com/blog/236801</guid>
      </item>
          <item>
        <title>css下拉菜单收集</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/235756" style="color:red;">http://captain.javaeye.com/blog/235756</a>&nbsp;
          发表时间: 2008年09月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://parandroid.com/css-and-more-than-30-drop-down-menu-resources-js/" target="_blank">http://parandroid.com/css-and-more-than-30-drop-down-menu-resources-js/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/235756#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 02 Sep 2008 15:22:40 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/235756</link>
        <guid>http://captain.javaeye.com/blog/235756</guid>
      </item>
          <item>
        <title> ubuntu下如何取消pppoe启动时自动拔号</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/231448" style="color:red;">http://captain.javaeye.com/blog/231448</a>&nbsp;
          发表时间: 2008年08月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          昨晚用pppoe拨号，今早回公司发现原先的dhcp设置不生效了，解决方案：<br />sudo gedit /etc/network/interfaces<br />auto dsl-provider 改成 #auto dsl-provider<br />此外还将所有跟dsl相关的语句注释，重启，ok。<br /><br />设置静态ip的方法：<br />Ubuntu的网络参数保存在文件 /etc/network/interfaces中，默认设置使用dhcp，内容如下：<br /><br /># The primary network interface<br /><br />auto eth0<br /><br />iface eth0 inet dhcp<br /><br />设置静态ip的方法如下：<br /><br />（1）编辑 /etc/network/interfaces<br /><br />1.1）将dhcp 一行屏蔽<br /><br /># The primary network interface<br /><br />auto eth0<br /><br />#iface eth0 inet dhcp<br /><br />1.2）添加和静态ip有关的参数<br /><br /># The primary network interface<br /><br />iface eth0 inet static<br /><br />address 192.168.0.10<br /><br />netmask 255.255.255.0<br /><br />gateway 192.168.0.1<br /><br />（2）编辑 /etc/resolv.conf，设置dns<br /><br />nameserver 202.96.134.133<br /><br />nameserver 202.106.0.20<br /><br />（3）执行下面两个命令，启用新设置<br /><br />$sudo ifdown eth0<br /><br />$sudo ifup eth0
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/231448#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 22 Aug 2008 10:16:54 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/231448</link>
        <guid>http://captain.javaeye.com/blog/231448</guid>
      </item>
          <item>
        <title>非常酷的jquery插件</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/231387" style="color:red;">http://captain.javaeye.com/blog/231387</a>&nbsp;
          发表时间: 2008年08月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://parandroid.com/37-plug-ins-even-more-outstanding-jquery/" target="_blank">http://parandroid.com/37-plug-ins-even-more-outstanding-jquery/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/231387#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Aug 2008 00:27:40 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/231387</link>
        <guid>http://captain.javaeye.com/blog/231387</guid>
      </item>
          <item>
        <title>持续集成工具hudson</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/231384" style="color:red;">http://captain.javaeye.com/blog/231384</a>&nbsp;
          发表时间: 2008年08月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.blogjava.net/xiaodu/archive/2008/07/08/213298.html" target="_blank">http://www.blogjava.net/xiaodu/archive/2008/07/08/213298.html</a><br /><br /><br />最后项目还是采用了cc，具体配置如下：<br /><pre name="code" class="java">
&lt;cruisecontrol>
    &lt;project name="connectfour">

        &lt;listeners>
            &lt;currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        &lt;/listeners>

        &lt;bootstrappers>
            &lt;antbootstrapper anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml" target="clean" />
        &lt;/bootstrappers>

        &lt;modificationset quietperiod="30">
            &lt;!-- touch any file in connectfour project to trigger a build -->
            &lt;filesystem folder="projects/${project.name}"/>
        &lt;/modificationset>

        &lt;schedule interval="300">
            &lt;ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
        &lt;/schedule>

        &lt;log>
            &lt;merge dir="projects/${project.name}/target/test-results"/>
        &lt;/log>

        &lt;publishers>
            &lt;onsuccess>
                &lt;artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/target/${project.name}.jar"/>
            &lt;/onsuccess>
        &lt;/publishers>

    &lt;/project>
    
        &lt;project name="ezfw">

        &lt;listeners>
            &lt;currentbuildstatuslistener file="logs/${project.name}/status.txt"/>
        &lt;/listeners>

        &lt;bootstrappers>
            &lt;svnbootstrapper localWorkingCopy="projects/${project.name}" />
        &lt;/bootstrappers>

        &lt;modificationset quietperiod="30">
            &lt;!-- touch any file in connectfour project to trigger a build -->
            &lt;filesystem folder="projects/${project.name}"/>
        &lt;/modificationset>

        &lt;schedule interval="3600">
            &lt;ant anthome="apache-ant-1.7.0" buildfile="projects/${project.name}/build.xml"/>
        &lt;/schedule>

        &lt;!--log>
            &lt;merge dir="projects/${project.name}/target/test-results"/>
        &lt;/log-->

        &lt;publishers>
            &lt;onsuccess>
           			&lt;artifactspublisher dest="artifacts/${project.name}" file="projects/${project.name}/dist/${project.name}.war"/>  
            &lt;/onsuccess>
                      &lt;htmlemail mailhost="smtp.aa.com.cn"  
                             returnaddress="fengyu@aa.com.cn"  
                             skipusers="true"  
                             subjectprefix="[admin.Build.Server]"  
                             buildresultsurl="http://10.10.129.74:8080/dashboard"  
                             username="aa"  
                             password="aa"  
                             charset="UTF-8">  
                             &lt;failure address="fengyu8299@gmail.com" />  
                             &lt;success address="fengyu8299@gmail.com" />
                         &lt;/htmlemail>  
        &lt;/publishers>

    &lt;/project>
&lt;/cruisecontrol>
</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/231384#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 22 Aug 2008 00:19:16 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/231384</link>
        <guid>http://captain.javaeye.com/blog/231384</guid>
      </item>
          <item>
        <title>linux Find命令实战</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/231325" style="color:red;">http://captain.javaeye.com/blog/231325</a>&nbsp;
          发表时间: 2008年08月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          删除目录为“/home/captain/workspace/ezfw3.2/src/”下以“bak”结尾的所有文件，含子目录：<br /><pre name="code" class="java">
find /home/captain/workspace/ezfw3.2/src/  -name "*.bak" -exec rm {} \;
</pre><br />注意：1 当“*.bak”不要引号时候，仅在当前目录查询；<br />&nbsp;&nbsp;&nbsp;&nbsp; 2 写unix命令，尤其注意参数间的空格。<br /><br />javaeye关于find命令使用的总结:<br />http://fangjieke.javaeye.com/blog/108629<br />http://www.ibm.com/developerworks/cn/aix/library/es-unix-find.html
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/231325#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 21 Aug 2008 20:21:28 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/231325</link>
        <guid>http://captain.javaeye.com/blog/231325</guid>
      </item>
          <item>
        <title>hibernate 高速缓存</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/230829" style="color:red;">http://captain.javaeye.com/blog/230829</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.javayou.com/diary/7141" target="_blank">http://www.javayou.com/diary/7141</a><br /><br />http://www.blogjava.net/xmatthew/archive/2008/08/20/223293.html<br />两种方案<br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 缓存同步策略:缓存同步策略决定了数据对象在缓存中的存取规则,我们必须为每个实体类指定相应的缓存同步策略.Hibernate中提供了4种不同的缓存同步策略:(暂时只记个概念吧)<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.read-only:只读.对于不会发生改变的数据可使用.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2.nonstrict-read-write:如果程序对并发访问下的数据同步要求不严格,且数据更新频率较低,采用本缓存同步策略可获得较好性能.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.read-write:严格的读写缓存.基于时间戳判定机制,实现了"read committed"事务隔离等级.用于对数据同步要求的情况,但不支持分布式缓存,实际应用中使用最多的缓存同步策略.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 4.transactional: 事务型缓存,必须运行在JTA事务环境中.此缓存中,缓存的相关操作被添加到事务中(此缓存类似于一个内存数据库),如事务失败,则缓冲池的数据会一同回滚到事务的开始之前的状态.事务型缓存实现了"Repeatable read"事务隔离等级,有效保证了数据的合法性,适应于对关键数据的缓存,Hibernate内置缓存中,只有JBossCache支持事务型缓存.
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/230829#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Wed, 20 Aug 2008 20:33:49 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/230829</link>
        <guid>http://captain.javaeye.com/blog/230829</guid>
      </item>
          <item>
        <title>网站页面性能分析工具</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/228066" style="color:red;">http://captain.javaeye.com/blog/228066</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          YSlow - 分析网站的页面，并告诉你为了提高网站性能，如何基于某些规则而进行优化。<br />Yahoo发布了一款基于FireFox的插件，名叫YSlow，这个插件可以分析网站的页面，并告诉你为了提高网站性能，如何基于某些规则而进行优化。<br /><br />安装YSlow前，需要在FireFox先安装另外一个流行的WEB开发工具Firebug，安装完YSlow后，就可以利用YSlow来分析网页的HTML代码以及JavaScript代码，并对其进行优化。<br /><br />YSlow可以分析任何网站，并为每一个规则产生一个整体报告，如果页面可以进行优化，则YSlow会列出具体的修改意见。<br /><br />Yahoo发布一款FireFox开发插件<br /><br />YSlow还具有统计分析功能，可以分析总共下载的网页大小、缓存以及Cookies。<br /><br />Yahoo发布一款FireFox开发插件<br /><br />YSlow可以列出页面所有组件，包括组件类型、URL地址、失效日期、压缩状态、装载时间、大小等。还可以查看HTTP响应头的任何部分。<br /><br />Yahoo发布一款FireFox开发插件<br /><br />如果需要了解更多YSlow的特点，可以点这里查看更消息的文档和帮助。<br /><br />雅虎关于网站性能优化的几点建议：<br />http://developer.yahoo.com/performance/rules.html
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/228066#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 14 Aug 2008 16:54:42 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/228066</link>
        <guid>http://captain.javaeye.com/blog/228066</guid>
      </item>
          <item>
        <title>”javascript 尚未实现“错误解决办法</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/228046" style="color:red;">http://captain.javaeye.com/blog/228046</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          被该死的IE给搞惨了，耽误了很多时间，实在不划算。打开页面的时候，FF下一切正常，但是当我用IE6测试的时候，JS总执行不下去了，提示“尚未实现”，无论怎么搞就搞不定。在firebug中也没有看到任何错误提示。打开IE就遇到该死的“尚未实现错误”，根据IE中提示的位置找过去也没有发现任何错误，看来IE的报错定位也不太准确。万般无奈之下，google搜索，终于找到了错误所在的地方。原来错误在于window.onload= myFunc(var1,var2);IE的window.onload函数中不支持参数调用，虽然函数会照样执行，但是却会出现报错，影响后续脚本的继续执行，下面是两种简单而有用的解决办法：<br /><br />&nbsp;&nbsp; 1. 再写一个函数，譬如function loadFunc(){ myFunc(var1,var2) },然后window.onload = loadFunc;<br />&nbsp;&nbsp; 2. 使用匿名函数。onload =function(){myFunc(var1,var2)}<br /><br />足够了，就这两种方法。
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/228046#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 16:10:25 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/228046</link>
        <guid>http://captain.javaeye.com/blog/228046</guid>
      </item>
          <item>
        <title>[js]IE下select元素不支援innerHTML</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/225491" style="color:red;">http://captain.javaeye.com/blog/225491</a>&nbsp;
          发表时间: 2008年08月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在IE的環境下，如果要使用innerHTML給select元素附加option，往往會無效，這是IE 的一個Bug，解決此問題可用下列三種方式代替：<br />function fill_select1() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; for(var i=0; i &lt; 100; i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select1.options[i] = new Option(i,i);<br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />function fill_select2() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; var sOpts = "&lt;SELECT>";&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; for (var i=0;i&lt;100;i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sOpts += '&lt;OPTION VALUE="' + i + '">' + i + '&lt;/OPTION>\n';&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; select2.outerHTML = sOpts&nbsp; + "&lt;/SELECT>";<br />}<br /><br />function fill_select3() {&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; for(var i=0; i &lt; 100; i++) {&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var oOption = document.createElement("OPTION");&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oOption.text="Option:&nbsp; " + i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; oOption.value=i;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.all.select3.add(oOption)&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; }<br />}<br /><br />我本地测试了下，只有第一种方法好使。
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/225491#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 07 Aug 2008 15:01:16 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/225491</link>
        <guid>http://captain.javaeye.com/blog/225491</guid>
      </item>
          <item>
        <title>eclipse启动参数设置</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/224713" style="color:red;">http://captain.javaeye.com/blog/224713</a>&nbsp;
          发表时间: 2008年08月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          -arch [processor architecture]<br />描述：指定所使用的处理器的类别<br />举例：eclipse -arch x86或eclipse -arch sparc<br /><br />-application [id]<br />描述：指定要运行的应用，id为扩展org.eclipse.core.applications扩展点的插件id加扩展id<br />举例：例如有个插件id为edu.sdu.app，扩展id为myapp，则eclipse -application edu.sdu.app.myapp，就会执行你的扩展应用<br /><br />-clean<br />描述：清空插件缓存内容<br />举例：eclipse -clean，有时插件显示不出来是因为Eclipse将插件进行了缓存以加速启动过程，若指定此参数则会清空缓存，从头加载<br /><br />-configuration [cofigfile location]<br />描述：指定配置文件的位置，在启动时使用此目录下的配置文件config.ini来启动<br />举例：eclipse -configuration d:/eclipse/configuration<br /><br />-data [workspace location]<br />描述：指定启动时的Workspace位置<br />举例：例如Workspace位置设在D:/myworkspace，则eclipse -data D:/myworkspace<br /><br />-debug [option file]<br />描述：以Debug状态启动Eclipse，所有的Debug开关在.options文件中指定<br />举例：eclipse -debug d:/eclipse/.options<br /><br />-dev [classpath entry]<br />描述：以开发状态启动Eclipse，这会添加所有指定的路径作为每个插件的Classpath<br />举例：例如eclipse -dev bin，会将产生在bin目录下的所有类加载到类路径中，这在开发插件时非常有用<br /><br />-nosplash<br />描述：指定启动时不显示闪屏<br />举例：eclipse -nosplash<br /><br />-vm [jre path]<br />描述：指定启动时所使用的Java虚拟机<br />举例：例如要使用自己的Java虚拟机，则eclipse -vm D:/j2sdk1.4.2_04/jre/bin/java.exe，这样还有一个好处，就是可以开启一个Console，能够显示控制台信息，当然若使用eclipse -vm D:/j2sdk1.4.2_04/jre/bin/javaw.exe则不会再显示控制台<br /><br />-vmargs [Java VM arguments]<br />描述：指定启动时要使用的Java虚拟机参数<br />举例：例如要指定使用的内存容量，则eclipse -vmargs "-Xms256m -Xmx1024m"<br />注：此参数一定要放在所有参数变量的最后面
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/224713#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 05 Aug 2008 18:58:09 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/224713</link>
        <guid>http://captain.javaeye.com/blog/224713</guid>
      </item>
          <item>
        <title>8个最佳的开源购物系统</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/221912" style="color:red;">http://captain.javaeye.com/blog/221912</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.21andy.com/blog/20080509/1108.html" target="_blank">http://www.21andy.com/blog/20080509/1108.html</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/221912#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 22:23:46 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/221912</link>
        <guid>http://captain.javaeye.com/blog/221912</guid>
      </item>
          <item>
        <title>python入门（step by step）</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/221516" style="color:red;">http://captain.javaeye.com/blog/221516</a>&nbsp;
          发表时间: 2008年07月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/" target="_blank">http://www.woodpecker.org.cn/obp/django/django-stepbystep/newtest/doc/</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/221516#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 30 Jul 2008 14:15:06 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/221516</link>
        <guid>http://captain.javaeye.com/blog/221516</guid>
      </item>
          <item>
        <title>prototype源代码解读</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/218138" style="color:red;">http://captain.javaeye.com/blog/218138</a>&nbsp;
          发表时间: 2008年07月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://blog.csdn.net/zhuangyan2004/archive/2007/04/25/1584962.aspx" target="_blank">http://blog.csdn.net/zhuangyan2004/archive/2007/04/25/1584962.aspx</a><br /><br />http://www.cnblogs.com/laolaowhn/archive/2008/02/23/1078688.html
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/218138#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 22 Jul 2008 15:28:10 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/218138</link>
        <guid>http://captain.javaeye.com/blog/218138</guid>
      </item>
          <item>
        <title>对google个性主页的拖拽效果的js的完整注释</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/216951" style="color:red;">http://captain.javaeye.com/blog/216951</a>&nbsp;
          发表时间: 2008年07月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          //&nbsp; 工具类，使用Util的命名空间，方便管理<br />var&nbsp; Util&nbsp; =&nbsp;&nbsp; new&nbsp; Object();<br />// 获取http header里面的UserAgent，浏览器信息<br />Util.getUserAgent&nbsp; =&nbsp; navigator.userAgent;<br />// 是否是Gecko核心的Browser，比如Mozila、Firefox<br />Util.isGecko&nbsp; =&nbsp; Util.getUserAgent.indexOf( " Gecko " )&nbsp; !=&nbsp;&nbsp; - 1 ;<br />// 是否是Opera<br />Util.isOpera&nbsp; =&nbsp; Util.getUserAgent.indexOf( " Opera " )&nbsp; !=&nbsp;&nbsp; - 1 ;<br />// 获取一个element的offset信息，其实就是相对于Body的padding以内的绝对坐标<br />// 后面一个参数如果是true则获取offsetLeft，false则是offsetTop<br />// 关于offset、style、client等坐标的定义参考dindin的这个帖子：http://www.jroller.com/page/dindin/?anchor=pro_javascript_12<br />Util.getOffset&nbsp; =&nbsp;&nbsp; function&nbsp; (el, isLeft) {<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; retValue&nbsp; =&nbsp;&nbsp; 0 ;<br />&nbsp;&nbsp;&nbsp;&nbsp; while&nbsp; (el&nbsp; !=&nbsp;&nbsp; null ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; retValue&nbsp; +=&nbsp; el[ " offset "&nbsp;&nbsp; +&nbsp; (isLeft&nbsp; ?&nbsp;&nbsp; " Left "&nbsp; :&nbsp; " Top " )];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; el&nbsp; =&nbsp; el.offsetParent;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; retValue;<br />};<br />// 将一个function（参数中的funcName是这个fuction的名字）绑定到一个element上，并且以这个element的上下文运行，其实是一种继承，这个可以google些文章看看<br />Util.bindFunction&nbsp; =&nbsp;&nbsp; function&nbsp; (el, fucName) {<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; function&nbsp; () {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; el[fucName].apply(el, arguments);<br />&nbsp;&nbsp;&nbsp; };<br />};<br />// 重新计算所有的可以拖拽的element的坐标，对同一个column下面的可拖拽图层重新计算它们的高度而得出新的坐标，防止遮叠<br />// 计算出来的坐标记录在pagePosLeft和pagePosTop两个属性里面<br />Util.re_calcOff&nbsp; =&nbsp;&nbsp; function&nbsp; (el) {<br />&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; i&nbsp; =&nbsp;&nbsp; 0 ; i&nbsp; &lt;&nbsp; Util.dragArray.length; i ++ ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; Util.dragArray[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.elm.pagePosLeft&nbsp; =&nbsp; Util.getOffset(ele.elm,&nbsp; true );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.elm.pagePosTop&nbsp; =&nbsp; Util.getOffset(ele.elm,&nbsp; false );<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; nextSib&nbsp; =&nbsp; el.elm.nextSibling;<br />&nbsp;&nbsp;&nbsp;&nbsp; while&nbsp; (nextSib) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nextSib.pagePosTop&nbsp; -=&nbsp; el.elm.offsetHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; nextSib&nbsp; =&nbsp; nextSib.nextSibling;<br />&nbsp;&nbsp;&nbsp; }<br />};<br /><br />// 隐藏Google Ig中间那个table，也就是拖拽的容器，配合show一般就是刷新用，解决一些浏览器的怪癖<br />Util.hide&nbsp; =&nbsp;&nbsp; function&nbsp; () {<br />&nbsp;&nbsp;&nbsp; Util.rootElement.style.display&nbsp; =&nbsp;&nbsp; " none " ;<br />};<br />// 显示Google Ig中间那个table，解释同上<br />Util.show&nbsp; =&nbsp;&nbsp; function&nbsp; () {<br />&nbsp;&nbsp;&nbsp; Util.rootElement.style.display&nbsp; =&nbsp;&nbsp; "" ;<br />};<br /><br />// 移动时显示的占位虚线框<br />ghostElement&nbsp; =&nbsp;&nbsp; null ;<br />// 获取这个虚线框，通过dom动态生成<br />getGhostElement&nbsp; =&nbsp;&nbsp; function&nbsp; () {<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( ! ghostElement) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ghostElement&nbsp; =&nbsp; document.createElement( " DIV " );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ghostElement.className&nbsp; =&nbsp;&nbsp; " modbox " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ghostElement.backgroundColor&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ghostElement.style.border&nbsp; =&nbsp;&nbsp; " 2px dashed #aaa " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ghostElement.innerHTML&nbsp; =&nbsp;&nbsp; " &amp;nbsp; " ;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; ghostElement;<br />};<br /><br />// 初始化可以拖拽的Element的函数，与拖拽无关的我去掉了<br />function&nbsp; draggable(el) {<br />&nbsp;&nbsp;&nbsp;&nbsp; // 公用的开始拖拽的函数<br />&nbsp;&nbsp;&nbsp;&nbsp; this ._dragStart&nbsp; =&nbsp; start_Drag;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 公用的正在拖拽的函数<br />&nbsp;&nbsp;&nbsp;&nbsp; this ._drag&nbsp; =&nbsp; when_Drag;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 公用的拖拽结束的函数<br />&nbsp;&nbsp;&nbsp;&nbsp; this ._dragEnd&nbsp; =&nbsp; end_Drag;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 这个函数主要用来进行拖拽结束后的dom处理<br />&nbsp;&nbsp;&nbsp;&nbsp; this ._afterDrag&nbsp; =&nbsp; after_Drag;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 是否正在被拖动，一开始当然没有被拖动<br />&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 将这个Element的this指针注册在elm这个变量里面，方便在自己的上下文以外调用自己的函数等，很常用的方法<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm&nbsp; =&nbsp; el;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 触发拖拽的Element，在这里就是这个div上显示标题的那个div<br />&nbsp;&nbsp;&nbsp;&nbsp; this .header&nbsp; =&nbsp; document.getElementById(el.id&nbsp; +&nbsp;&nbsp; " _h " );<br />&nbsp;&nbsp;&nbsp;&nbsp; // 对于有iframe的element拖拽不同，这里检测一下并记录<br />&nbsp;&nbsp;&nbsp;&nbsp; this .hasIFrame&nbsp; =&nbsp;&nbsp; this .elm.getElementsByTagName( " IFRAME " ).length&nbsp; >&nbsp;&nbsp; 0 ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 如果找到了header就绑定drag相关的event<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( this .header) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽时的叉子鼠标指针<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .header.style.cursor&nbsp; =&nbsp;&nbsp; " move " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将函数绑定到header和element的this上，参照那个函数的说明<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drag.init( this .header,&nbsp; this .elm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 下面三个语句将写好的三个函数绑定给这个elemnt的三个函数钩子上，也就实现了element从draggable继承可拖拽的函数<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragStart&nbsp; =&nbsp; Util.bindFunction( this ,&nbsp; " _dragStart " );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDrag&nbsp; =&nbsp; Util.bindFunction( this ,&nbsp; " _drag " );<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.onDragEnd&nbsp; =&nbsp; Util.bindFunction( this ,&nbsp; " _dragEnd " );<br />&nbsp;&nbsp;&nbsp; }<br />};<br /><br />// 下面就是draggable里面用到的那4个function<br />// 公用的开始拖拽的函数<br />function&nbsp; start_Drag() {<br />&nbsp;&nbsp;&nbsp;&nbsp; // 重置坐标，实现拖拽以后自己的位置马上会被填充的效果<br />&nbsp;&nbsp;&nbsp; Util.re_calcOff( this );<br />&nbsp;&nbsp;&nbsp;&nbsp; // 记录原先的邻居节点，用来对比是否被移动到新的位置<br />&nbsp;&nbsp;&nbsp;&nbsp; this .origNextSibling&nbsp; =&nbsp;&nbsp; this .elm.nextSibling;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 获取移动的时候那个灰色的虚线框<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _ghostElement&nbsp; =&nbsp; getGhostElement();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的高度<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offH&nbsp; =&nbsp;&nbsp; this .elm.offsetHeight;<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isGecko) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 修正gecko引擎的怪癖吧<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; offH&nbsp; -=&nbsp; parseInt(_ghostElement.style.borderTopWidth)&nbsp; *&nbsp;&nbsp; 2 ;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; // 获取正在移动的这个对象的宽度<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offW&nbsp; =&nbsp;&nbsp; this .elm.offsetWidth;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 获取left和top的坐标<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offLeft&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; true );<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; offTop&nbsp; =&nbsp; Util.getOffset( this .elm,&nbsp; false );<br />&nbsp;&nbsp;&nbsp;&nbsp; // 防止闪烁，现隐藏<br />&nbsp;&nbsp;&nbsp; Util.hide();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 将自己的宽度记录在style属性里面<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.width&nbsp; =&nbsp; offW&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 将那个灰框设定得与正在拖动的对象一样高，比较形象<br />&nbsp;&nbsp;&nbsp; _ghostElement.style.height&nbsp; =&nbsp; offH&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 把灰框放到这个对象原先的位置上<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.parentNode.insertBefore(_ghostElement,&nbsp; this .elm.nextSibling);<br />&nbsp;&nbsp;&nbsp;&nbsp; // 由于要拖动必须将被拖动的对象从原先的盒子模型里面抽出来，所以设定position为absolute，这个可以参考一下css布局方面的知识<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.position&nbsp; =&nbsp;&nbsp; " absolute " ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 设置zIndex，让它处在最前面一层，当然其实zIndex=100是让它很靠前，如果页面里有zIndex>100的，那……<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.zIndex&nbsp; =&nbsp;&nbsp; 100 ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 由于position=absolute了，所以left和top实现绝对坐标定位，这就是先前计算坐标的作用，不让这个模型乱跑，要从开始拖动的地方开始移动<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.left&nbsp; =&nbsp; offLeft&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.top&nbsp; =&nbsp; offTop&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 坐标设定完毕，可以显示了，这样就不会闪烁了<br />&nbsp;&nbsp;&nbsp; Util.show();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 这里本来有个ig_d.G，没搞明白干什么用的，不过没有也可以用，谁知道麻烦告诉我一声，不好意思<br />&nbsp;&nbsp;&nbsp;&nbsp; // 还没有开始拖拽，这里做个记号<br />&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />};<br />// 在拖拽时的相应函数，由于绑定到鼠标的move这个event上，所以会传入鼠标的坐标clientX, clientY<br />function&nbsp; when_Drag(clientX, clientY) {<br />&nbsp;&nbsp;&nbsp;&nbsp; // 刚开始拖拽的时候将图层变透明，并标记为正在被拖拽<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( ! this .isDragging) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.filter&nbsp; =&nbsp;&nbsp; " alpha(opacity=70) " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.opacity&nbsp; =&nbsp;&nbsp; 0.7 ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; this .isDragging&nbsp; =&nbsp;&nbsp; true ;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; // 被拖拽到的新的column（当然也可以是原来那个）<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; found&nbsp; =&nbsp;&nbsp; null ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 最大的距离，可能是防止溢出或者什么bug<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; max_distance&nbsp; =&nbsp;&nbsp; 100000000 ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 遍历所有的可拖拽的element，寻找离当前鼠标坐标最近的那个可拖拽元素，以便后面插入<br />&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; i&nbsp; =&nbsp;&nbsp; 0 ; i&nbsp; &lt;&nbsp; Util.dragArray.length; i ++ ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; Util.dragArray[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 利用勾股定理计算鼠标到遍历到的这个元素的距离<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; distance&nbsp; =&nbsp; Math.sqrt(Math.pow(clientX&nbsp; -&nbsp; ele.elm.pagePosLeft,&nbsp; 2 )&nbsp; +&nbsp; Math.pow(clientY&nbsp; -&nbsp; ele.elm.pagePosTop,&nbsp; 2 ));<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 自己已经浮动了，所以不计算自己的<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele&nbsp; ==&nbsp;&nbsp; this ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果计算失败继续循环<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(distance)) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果更小，记录下这个距离，并将它作为found<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (distance&nbsp; &lt;&nbsp; max_distance) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; max_distance&nbsp; =&nbsp; distance;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found&nbsp; =&nbsp; ele;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; // 准备让灰框落脚<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _ghostElement&nbsp; =&nbsp; getGhostElement();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 如果找到了另外的落脚点<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (found&nbsp; !=&nbsp;&nbsp; null&nbsp;&nbsp; &amp;&amp;&nbsp; _ghostElement.nextSibling&nbsp; !=&nbsp; found.elm) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 找到落脚点就先把灰框插进去，这就是我们看到的那个灰框停靠的特效，有点像吸附的感觉，哈哈<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; found.elm.parentNode.insertBefore(_ghostElement, found.elm);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isOpera) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Opera的现实问题，要隐藏/显示后才能刷新出变化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.body.style.display&nbsp; =&nbsp;&nbsp; " none " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.body.style.display&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />};<br />// 拖拽完毕<br />function&nbsp; end_Drag() {<br />&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽完毕后执行后面的钩子，执行after_Drag()，如果布局发生了变动了就记录到远程服务器，保存你拖拽后新的布局顺序<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( this ._afterDrag()) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // remote call to save the change<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; true ;<br />};<br />// 拖拽后的执行钩子<br />function&nbsp; after_Drag() {<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; returnValue&nbsp; =&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 防止闪烁<br />&nbsp;&nbsp;&nbsp; Util.hide();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 把拖拽时的position=absolute和相关的那些style都消除<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.position&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.width&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.zIndex&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.filter&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp; this .elm.style.opacity&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 获取灰框<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; getGhostElement();<br />&nbsp;&nbsp;&nbsp;&nbsp; // 如果现在的邻居不是原来的邻居了<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele.nextSibling&nbsp; !=&nbsp;&nbsp; this .origNextSibling) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 把被拖拽的这个节点插到灰框的前面<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ele.parentNode.insertBefore( this .elm, ele.nextSibling);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 标明被拖拽了新的地方<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; returnValue&nbsp; =&nbsp;&nbsp; true ;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; // 移除灰框，这是这个灰框的生命周期应该就结束了<br />&nbsp;&nbsp;&nbsp; ele.parentNode.removeChild(ele);<br />&nbsp;&nbsp;&nbsp;&nbsp; // 修改完毕，显示<br />&nbsp;&nbsp;&nbsp; Util.show();<br />&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (Util.isOpera) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Opera的现实问题，要隐藏/显示后才能刷新出变化<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.body.style.display&nbsp; =&nbsp;&nbsp; " none " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.body.style.display&nbsp; =&nbsp;&nbsp; "" ;<br />&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; returnValue;<br />};<br />// 可拖拽Element的原形，用来将event绑定到各个钩子，这部分市比较通用的，netvibes也是基本完全相同的实现<br />// 这部分推荐看dindin的这个，也会帮助理解，http://www.jroller.com/page/dindin/?anchor=pro_javascript_12<br />var&nbsp; Drag&nbsp; =&nbsp; {<br />&nbsp;&nbsp;&nbsp;&nbsp; // 对这个element的引用，一次只能拖拽一个Element<br />&nbsp;&nbsp;&nbsp; obj: null , <br />&nbsp;&nbsp;&nbsp;&nbsp; // element是被拖拽的对象的引用，elementHeader就是鼠标可以拖拽的区域<br />&nbsp;&nbsp;&nbsp; init: function&nbsp; (elementHeader, element) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将start绑定到onmousedown事件，按下鼠标触发start<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elementHeader.onmousedown&nbsp; =&nbsp; Drag.start;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将element存到header的obj里面，方便header拖拽的时候引用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; elementHeader.obj&nbsp; =&nbsp; element;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 初始化绝对的坐标，因为不是position=absolute所以不会起什么作用，但是防止后面onDrag的时候parse出错了<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(parseInt(element.style.left))) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.left&nbsp; =&nbsp;&nbsp; " 0px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (isNaN(parseInt(element.style.top))) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.top&nbsp; =&nbsp;&nbsp; " 0px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 挂上空Function，初始化这几个成员，在Drag.init被调用后才帮定到实际的函数，可以参照draggable里面的内容<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragStart&nbsp; =&nbsp;&nbsp; new&nbsp; Function();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragEnd&nbsp; =&nbsp;&nbsp; new&nbsp; Function();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDrag&nbsp; =&nbsp;&nbsp; new&nbsp; Function();<br />&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp; // 开始拖拽的绑定，绑定到鼠标的移动的event上<br />&nbsp;&nbsp;&nbsp; start: function&nbsp; (event) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; element&nbsp; =&nbsp; Drag.obj&nbsp; =&nbsp;&nbsp; this .obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 看看是不是左键点击<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (event.which&nbsp; !=&nbsp;&nbsp; 1 ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 除了左键都不起作用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; true ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参照这个函数的解释，挂上开始拖拽的钩子<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDragStart();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 记录鼠标坐标<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseX&nbsp; =&nbsp; event.clientX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseY&nbsp; =&nbsp; event.clientY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 将Global的event绑定到被拖动的element上面来<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmouseup&nbsp; =&nbsp; Drag.end;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmousemove&nbsp; =&nbsp; Drag.drag;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp; }, <br />&nbsp;&nbsp;&nbsp;&nbsp; // Element正在被拖动的函数<br />&nbsp;&nbsp;&nbsp; drag: function&nbsp; (event) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 看看是不是左键点击<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (event.which&nbsp; ==&nbsp;&nbsp; 0 ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 除了左键都不起作用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; Drag.end();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 正在被拖动的Element<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; element&nbsp; =&nbsp; Drag.obj;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 鼠标坐标<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _clientX&nbsp; =&nbsp; event.clientY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _clientY&nbsp; =&nbsp; event.clientX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果鼠标没动就什么都不作<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (element.lastMouseX&nbsp; ==&nbsp; _clientY&nbsp; &amp;&amp;&nbsp; element.lastMouseY&nbsp; ==&nbsp; _clientX) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 刚才Element的坐标<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _lastX&nbsp; =&nbsp; parseInt(element.style.top);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _lastY&nbsp; =&nbsp; parseInt(element.style.left);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 新的坐标<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; newX, newY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 计算新的坐标：原先的坐标+鼠标移动的值差<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newX&nbsp; =&nbsp; _lastY&nbsp; +&nbsp; _clientY&nbsp; -&nbsp; element.lastMouseX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; newY&nbsp; =&nbsp; _lastX&nbsp; +&nbsp; _clientX&nbsp; -&nbsp; element.lastMouseY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 修改element的显示坐标<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.left&nbsp; =&nbsp; newX&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.style.top&nbsp; =&nbsp; newY&nbsp; +&nbsp;&nbsp; " px " ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 记录element现在的坐标供下一次移动使用<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseX&nbsp; =&nbsp; _clientY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.lastMouseY&nbsp; =&nbsp; _clientX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 参照这个函数的解释，挂接上Drag时的钩子<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; element.onDrag(newX, newY);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp;&nbsp; false ;<br />&nbsp;&nbsp;&nbsp; },<br />&nbsp;&nbsp;&nbsp;&nbsp; // Element正在被释放的函数，停止拖拽<br />&nbsp;&nbsp;&nbsp; end: function&nbsp; (event) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; event&nbsp; =&nbsp; Drag.fixE(event);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 解除对Global的event的绑定<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmousemove&nbsp; =&nbsp;&nbsp; null ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; document.onmouseup&nbsp; =&nbsp;&nbsp; null ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 先记录下onDragEnd的钩子，好移除obj<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; _onDragEndFuc&nbsp; =&nbsp; Drag.obj.onDragEnd();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 拖拽完毕，obj清空<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Drag.obj&nbsp; =&nbsp;&nbsp; null ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; _onDragEndFuc;<br />&nbsp;&nbsp;&nbsp; }, <br />&nbsp;&nbsp;&nbsp;&nbsp; // 解决不同浏览器的event模型不同的问题<br />&nbsp;&nbsp;&nbsp; fixE: function&nbsp; (ig_) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_&nbsp; =&nbsp; window.event;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.layerX&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.layerX&nbsp; =&nbsp; ig_.offsetX;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.layerY&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.layerY&nbsp; =&nbsp; ig_.offsetY;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; ( typeof&nbsp; ig_.which&nbsp; ==&nbsp;&nbsp; " undefined " ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ig_.which&nbsp; =&nbsp; ig_.button;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return&nbsp; ig_;<br />&nbsp;&nbsp;&nbsp; }<br />};<br /><br /><br /><br />// 下面是初始化的函数了，看看上面这些东西怎么被调用<br />var&nbsp; _IG_initDrag&nbsp; =&nbsp;&nbsp; function&nbsp; (el) {<br />&nbsp;&nbsp;&nbsp;&nbsp; // column那个容器，在google里面就是那个table布局的tbody，netvibes用的&lt;div><br />&nbsp;&nbsp;&nbsp; Util.rootElement&nbsp; =&nbsp; el;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 这个tbody的行<br />&nbsp;&nbsp;&nbsp; Util._rows&nbsp; =&nbsp; Util.rootElement.tBodies[ 0 ].rows[ 0 ];<br />&nbsp;&nbsp;&nbsp;&nbsp; // 列，google是3列，其实也可以更多<br />&nbsp;&nbsp;&nbsp; Util.column&nbsp; =&nbsp; Util._rows.cells;<br />&nbsp;&nbsp;&nbsp;&nbsp; // 用来存取可拖拽的对象<br />&nbsp;&nbsp;&nbsp; Util.dragArray&nbsp; =&nbsp;&nbsp; new&nbsp; Array();<br />&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; counter&nbsp; =&nbsp;&nbsp; 0 ;<br />&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; i&nbsp; =&nbsp;&nbsp; 0 ; i&nbsp; &lt;&nbsp; Util.column.length; i ++ ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 搜索所有的column<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele&nbsp; =&nbsp; Util.column[i];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; for&nbsp; ( var&nbsp; j&nbsp; =&nbsp;&nbsp; 0 ; j&nbsp; &lt;&nbsp; ele.childNodes.length; j ++ ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 搜索每一column里面的所有element<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var&nbsp; ele1&nbsp; =&nbsp; ele.childNodes[j];<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 如果是div就把它初始化为一个draggable对象<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if&nbsp; (ele1.tagName&nbsp; ==&nbsp;&nbsp; " DIV " ) {<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Util.dragArray[counter]&nbsp; =&nbsp;&nbsp; new&nbsp; draggable(ele1);<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; counter ++ ;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />&nbsp;&nbsp;&nbsp; }<br />};<br /><br />// google的页面里可以拖动的部分的id是"t_1"<br />// 挂载到onload，载入完毕执行。不过实际上google没有用onload。<br />// 而是写在页面最下面，异曲同工吧，也许直接写在页面是种怪癖，或者也有可能是兼容性考虑。<br /><br />// 请将下面两条被注释掉的代码加，到你自己下载的一个google ig页面里面，把里面的所有其余script删除，挂上这个js也可以拖拽了，哈哈<br />// _table=document.getElementById("t_1");<br />// window.onload = _IG_initDrag(_table);<br /><br />// 其实看懂这些代码对学习javascript很有益，希望对大家能有帮助
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/216951#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 21 Jul 2008 15:36:13 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/216951</link>
        <guid>http://captain.javaeye.com/blog/216951</guid>
      </item>
          <item>
        <title>动态语言与闭包</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/214672" style="color:red;">http://captain.javaeye.com/blog/214672</a>&nbsp;
          发表时间: 2008年07月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          oracle三面结束了，砸了。<br />过程很让人反思，什么才是我的核心技能，我的核心竞争力在哪？<br />回忆了下面试过程，一个问题值得思考：什么是闭包，用ruby写个闭包的例子<br />http://www.ibm.com/developerworks/cn/linux/l-cn-closure/?ca=drs-tp2708
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/214672#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 14 Jul 2008 19:19:46 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/214672</link>
        <guid>http://captain.javaeye.com/blog/214672</guid>
      </item>
          <item>
        <title>浅析Ruby on Rails部署方案 </title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/213460" style="color:red;">http://captain.javaeye.com/blog/213460</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://docs.google.com/View?docid=ddcvzh74_28f9xppqfh" target="_blank">http://docs.google.com/View?docid=ddcvzh74_28f9xppqfh</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/213460#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 10 Jul 2008 14:15:53 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/213460</link>
        <guid>http://captain.javaeye.com/blog/213460</guid>
      </item>
          <item>
        <title>Hibernate中n＋1问题</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/213452" style="color:red;">http://captain.javaeye.com/blog/213452</a>&nbsp;
          发表时间: 2008年07月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Session的缓存中存放的是相互关联的对象图。默认情况下，当Hibernate从数据库中加载Customer对象时，会同时加载所有关联的 Order对象。以Customer和Order类为例，假定ORDERS表的CUSTOMER_ID外键允许为null，图1列出了CUSTOMERS 表和ORDERS表中的记录。<br /><br /><br /><br />以下Session的find()方法用于到数据库中检索所有的Customer对象：<br /><br />List customerLists=session.find("from Customer as c");<br /><br />运行以上find()方法时，Hibernate将先查询CUSTOMERS表中所有的记录，然后根据每条记录的ID，到ORDERS表中查询有参照关系的记录，Hibernate将依次执行以下select语句：<br /><br />select * from CUSTOMERS;<br />select * from ORDERS where CUSTOMER_ID=1;<br />select * from ORDERS where CUSTOMER_ID=2;<br />select * from ORDERS where CUSTOMER_ID=3;<br />select * from ORDERS where CUSTOMER_ID=4;<br /><br />通过以上5条select语句，Hibernate最后加载了4个Customer对象和5个Order对象，在内存中形成了一幅关联的对象图，参见图2。<br /><br /><br /><br />Hibernate在检索与Customer关联的Order对象时，使用了默认的立即检索策略。这种检索策略存在两大不足：<br /><br />（1） select语句的数目太多，需要频繁的访问数据库，会影响检索性能。如果需要查询n个Customer对象，那么必须执行n+1次select查询语句。这就是经典的n+1次select查询问题。这种检索策略没有利用SQL的连接查询功能，例如以上5条select语句完全可以通过以下1条select语句来完成：<br /><br />select * from CUSTOMERS left outer join ORDERS<br />on CUSTOMERS.ID=ORDERS.CUSTOMER_ID<br /><br />以上select语句使用了SQL的左外连接查询功能，能够在一条select语句中查询出CUSTOMERS表的所有记录，以及匹配的ORDERS表的记录。<br /><br />（2）在应用逻辑只需要访问Customer对象，而不需要访问Order对象的场合，加载Order对象完全是多余的操作，这些多余的Order对象白白浪费了许多内存空间。<br />为了解决以上问题，Hibernate提供了其他两种检索策略：延迟检索策略和迫切左外连接检索策略。延迟检索策略能避免多余加载应用程序不需要访问的关联对象，迫切左外连接检索策略则充分利用了SQL的外连接查询功能，能够减少select语句的数目。
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/213452#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Thu, 10 Jul 2008 13:58:59 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/213452</link>
        <guid>http://captain.javaeye.com/blog/213452</guid>
      </item>
          <item>
        <title>ajax应用中如何处理后退按钮</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/209785" style="color:red;">http://captain.javaeye.com/blog/209785</a>&nbsp;
          发表时间: 2008年06月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html?CMP=OTC-FP2116136014" target="_blank">http://www.onjava.com/pub/a/onjava/2005/10/26/ajax-handling-bookmarks-and-back-button.html?CMP=OTC-FP2116136014</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/209785#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 30 Jun 2008 15:12:19 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/209785</link>
        <guid>http://captain.javaeye.com/blog/209785</guid>
      </item>
          <item>
        <title>数据库设计范式</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/209502" style="color:red;">http://captain.javaeye.com/blog/209502</a>&nbsp;
          发表时间: 2008年06月29日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          数据库设计范式<br /> <br />关系数据库设计之时是要遵守一定的规则的。尤其是数据库设计范式 现简单介绍1NF（第一范式），2NF（第二范式），3NF（第三范式）和BCNF，另有第四范式和第五范式留到以后再介绍。 在你设计数据库之时，若能符合这几个范式，你就是数据库设计的高手。<br />第一范式（1NF）：在关系模式R中的每一个具体关系r中，如果每个属性值 都是不可再分的最小数据单位，则称R是第一范式的关系。例：如职工号，姓名，电话号码组成一个表（一个人可能有一个办公室电话 和一个家里电话号码） 规范成为1NF有三种方法： <br />一是重复存储职工号和姓名。这样，关键字只能是电话号码。 <br />二是职工号为关键字，电话号码分为单位电话和住宅电话两个属性 <br />三是职工号为关键字，但强制每条记录只能有一个电话号码。 <br />以上三个方法，第一种方法最不可取，按实际情况选取后两种情况。<br /><br />第二范式（2NF）：如果关系模式R（U，F）中的所有非主属性都完全依赖于任意一个候选关键字，则称关系R 是属于第二范式的。 <br />例：选课关系 SCI（SNO，CNO，GRADE，CREDIT）其中SNO为学号， CNO为课程号，GRADEGE 为成绩，CREDIT 为学分。 由以上条件，关键字为组合关键字（SNO，CNO） <br />在应用中使用以上关系模式有以下问题： <br />a.数据冗余，假设同一门课由40个学生选修，学分就 重复40次。 <br />b.更新异常，若调整了某课程的学分，相应的元组CREDIT值都要更新，有可能会出现同一门课学分不同。 <br />c.插入异常，如计划开新课，由于没人选修，没有学号关键字，只能等有人选修才能把课程和学分存入。 <br />d.删除异常，若学生已经结业，从当前数据库删除选修记录。某些门课程新生尚未选修，则此门课程及学分记录无法保存。 <br />原因：非关键字属性CREDIT仅函数依赖于CNO，也就是CREDIT部分依赖组合关键字（SNO，CNO）而不是完全依赖。 <br />解决方法：分成两个关系模式 SC1（SNO，CNO，GRADE），C2（CNO，CREDIT）。新关系包括两个关系模式，它们之间通过SC1中的外关键字CNO相联系，需要时再进行自然联接，恢复了原来的关系<br /><br />第三范式（3NF）：如果关系模式R（U，F）中的所有非主属性对任何候选关键字都不存在传递信赖，则称关系R是属于第三范式的。 <br />例：如S1（SNO，SNAME，DNO，DNAME，LOCATION） 各属性分别代表学号， <br />姓名，所在系，系名称，系地址。 <br />关键字SNO决定各个属性。由于是单个关键字，没有部分依赖的问题，肯定是2NF。但这关系肯定有大量的冗余，有关学生所在的几个属性DNO，DNAME，LOCATION将重复存储，插入，删除和修改时也将产生类似以上例的情况。 <br />原因：关系中存在传递依赖造成的。即SNO -> DNO。 而DNO -> SNO却不存在，DNO -> LOCATION, 因此关键辽 SNO 对 LOCATION 函数决定是通过传递依赖 SNO -> LOCATION 实现的。也就是说，SNO不直接决定非主属性LOCATION。 <br />解决目地：每个关系模式中不能留有传递依赖。 <br />解决方法：分为两个关系 S（SNO，SNAME，DNO），D（DNO，DNAME，LOCATION） <br />注意：关系S中不能没有外关键字DNO。否则两个关系之间失去联系。<br /><br />BCNF：如果关系模式R（U，F）的所有属性（包括主属性和非主属性）都不传递依赖于R的任何候选关键字，那么称关系R是属于BCNF的。或是关系模式R，如果每个决定因素都包含关键字（而不是被关键字所包含），则RCNF的关系模式。 <br />例：配件管理关系模式 WPE（WNO，PNO，ENO，QNT）分别表仓库号，配件号，职工号，数量。有以下条件 <br />a.一个仓库有多个职工。 <br />b.一个职工仅在一个仓库工作。 <br />c.每个仓库里一种型号的配件由专人负责，但一个人可以管理几种配件。 <br />d.同一种型号的配件可以分放在几个仓库中。 <br />分析：由以上得 PNO 不能确定QNT，由组合属性（WNO，PNO）来决定，存在函数依赖（WNO，PNO） -> ENO。由于每个仓库里的一种配件由专人负责，而一个人可以管理几种配件，所以有组合属性（WNO，PNO）才能确定负责人，有（WNO，PNO）-> ENO。因为 一个职工仅在一个仓库工作，有ENO -> WNO。由于每个仓库里的一种配件由专人负责，而一个职工仅在一个仓库工作，有 （ENO，PNO）-> QNT。 <br />找一下候选关键字，因为（WNO，PNO） -> QNT，（WNO，PNO）-> ENO ，因此 （WNO，PNO）可以决定整个元组，是一个候选关键字。根据ENO->WNO，（ENO，PNO）->QNT，故（ENO，PNO）也能决定整个元组，为另一个候选关键字。属性ENO，WNO，PNO 均为主属性，只有一个非主属性QNT。它对任何一个候选关键字都是完全函数依赖的，并且是直接依赖，所以该关系模式是3NF。 <br />分析一下主属性。因为ENO->WNO，主属性ENO是WNO的决定因素，但是它本身不是关键字，只是组合关键字的一部分。这就造成主属性WNO对另外一个候选关键字（ENO，PNO）的部 分依赖，因为（ENO，PNO）-> ENO但反过来不成立，而P->WNO，故（ENO，PNO）-> WNO 也是传递依赖。 <br />虽然没有非主属性对候选关键辽的传递依赖，但存在主属性对候选关键字的传递依赖，同样也会带来麻烦。如一个新职工分配到仓库工作，但暂时处于实习阶段，没有独立负责对某些配件的管理任务。由于缺少关键字的一部分PNO而无法插入到该关系中去。又如某个人改成不管配件了去负责安全，则在删除配件的同时该职工也会被删除。 <br />解决办法：分成管理EP（ENO，PNO，QNT），关键字是（ENO，PNO）工作EW（ENO，WNO）其关键字是ENO <br />缺点：分解后函数依赖的保持性较差。如此例中，由于分解,函数依赖（WNO，PNO）-> ENO 丢失了, 因而对原来的语义有所破坏。没有体现出每个仓库里一种部件由专人负责。有可能出现 一部件由两个人或两个以上的人来同时管理。因此，分解之后的关系模式降低了部分完整性约束。<br /><br />一个关系分解成多个关系，要使得分解有意义，起码的要求是分解后不丢失原来的信息。这些信息不仅包括数据本身，而且包括由函数依赖所表示的数据之间的相互制约。进行分解的目标是达到更高一级的规范化程度，但是分解的同时必须考虑两个问题：无损联接性和保持函数依赖。有时往往不可能做到既有无损联接性，又完全保持函数依赖。需要根据需要进行权衡。<br /><br />1NF直到BCNF的四种范式之间有如下关系： <br />BCNF包含了3NF包含2NF包含1NF<br /><br />小结： <br />目地：规范化目的是使结构更合理，消除存储异常，使数据冗余尽量小，便于插入、删除和更新 <br />原则：遵从概念单一化 "一事一地"原则，即一个关系模式描述一个实体或实体间的一种联系。规范的实质就是概念的单一化。 <br />方法：将关系模式投影分解成两个或两个以上的关系模式。 <br />要求：分解后的关系模式集合应当与原关系模式"等价"，即经过自然联接可以恢复原关系而不丢失信息，并保持属性间合理的联系。<br /><br />注意：一个关系模式结这分解可以得到不同关系模式集合，也就是说分解方法不是唯一的。最小冗余的要求必须以分解后的数据库能够表达原来数据库所有信息为前提来实现。其根本目标是节省存储空间，避免数据不一致性，提高对关系的操作效率，同时满足应用需求。实际上，并不一定要求全部模式都达到BCNF不可。有时故意保留部分冗余可能更方便数据查询。尤其对于那些更新频度不高，查询频度极高的数据库系统更是如此。<br /><br />在关系数据库中，除了函数依赖之外还有多值依赖，联接依赖的问题，从而提出了第四范式，第五范式等更高一级的规范化要求。在此，以后再谈。<br /><br />各位朋友，你看过后有何感想，其实，任何一本数据库基础理论的书都会讲这些东西，考虑到很多网友是半途出家，来做数据库。特找一本书大抄特抄一把，各位有什么问题，也别问我了，自已去找一本关系数据库理论的书去看吧，说不定，对各位大有帮助。说是说以上是基础理论的东西，请大家想想，你在做数据库设计的时候有没有考虑过遵过以上几个范式呢，有没有在数据库设计做得不好之时，想一想，对比以上所讲，到底是违反了第几个范式呢？ <br />我见过的数据库设计，很少有人做到很符合以上几个范式的，一般说来，第一范式大家都可以遵守，完全遵守第二第三范式的人很少了，遵守的人一定就是设计数据库的高手了，BCNF的范式出现机会较少，而且会破坏完整性，你可以在做设计之时不考虑它，当然在ORACLE中可通过触发器解决其缺点。以后我们共同做设计之时，也希望大家遵守以上几个范式。
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/209502#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 29 Jun 2008 19:28:48 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/209502</link>
        <guid>http://captain.javaeye.com/blog/209502</guid>
      </item>
          <item>
        <title> Tomcat5不保留SESSION.ser的具体配置</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/207013" style="color:red;">http://captain.javaeye.com/blog/207013</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在项目中遇到一奇怪的现象，重启服务器，想强制session失效，但发现session值依然存在，怀疑是session.ser在作怪。 <br />默认情况下，Tomcat5 下发布的web应用程序，如果涉及session的操作，在Tomcat5关闭或undeploy的时候，将会在 work 目录下相应的路径下创建 SESSION.ser 文件存储该webapp的 session 数据。在 session 超时时间内 Tomcat 重启或re-deploy，将会加载该文件中的数据，恢复用户原来的 session 运行环境。<br /><br />&nbsp;&nbsp;&nbsp; 在一些安全敏感的应用中，这可能会带来一些隐患。Tomcat 发行版本的 server.xml 里并没有一个直接的选项来禁止保留session 数据。但根据 Tomcat5配置参考文档 中的说明，Tomcat 还提供了另一种的 session 管理机制。具体配置选项请参考该文档。具体操作如下：<br /><br />&nbsp;&nbsp;&nbsp; 创建一个与 webapps 同名的 xml 文件，比如 webapp 的 Context Path 为 test， 那么文件名即为 test.xml。文件内容如下：<br /><br />&nbsp;&nbsp;&nbsp; &lt;Context path="/test" docBase="test" debug="0" privileged="true"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Manager className="org.apache.catalina.session.PersistentManager" saveOnRestart="false"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;Store className="org.apache.catalina.session.FileStore" /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; &lt;/Manager><br />&nbsp;&nbsp;&nbsp; &lt;/Context><br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; 很明显，saveOnRestart 参数值为false即不保留session。该 Manager 还有很多属性，具体参见文档。注意，虽然是不保存文件，但子元素&lt;Store> 必不可少。<br />&nbsp;&nbsp;&nbsp; 将文件放到 Tomcat5安装目录/conf/Catalina/localhost/ 路径下，重启后生效。<br /><br />&nbsp;&nbsp;&nbsp; 如果 Tomcat5 是集成于 Jboss 中(Jboss3.2.5+ 集成Tomcat5.0.x)&nbsp; ，那么配置稍有不同，将 test.xml 更名为context.xml，放置到 webapp 的 WEB-INF 目录下即可。<br />&nbsp;&nbsp;&nbsp; <br />&nbsp;&nbsp;&nbsp; Tomcat 5 以下的版本，就我所知，Tomcat 4.1.x 与 Tomcat5 配置类似，具体请参考相关版本的文档。
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/207013#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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, 23 Jun 2008 10:22:21 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/207013</link>
        <guid>http://captain.javaeye.com/blog/207013</guid>
      </item>
          <item>
        <title>转：cygwin使用方法</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/205234" style="color:red;">http://captain.javaeye.com/blog/205234</a>&nbsp;
          发表时间: 2008年06月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于自己的项目需要使用Linux内核，所以自己在windows下安装了一个Linux虚拟机！自己实在忍受不了这种速度，随想用cygwin进行替代，毕竟我只是使用Linux内核的部分命令就好。今天下午进行了实验，效果不错，从网上找到了这篇文章，做为cygwin的入门文章！写的不错，enjoy it！<br /><br />原文如下：<br /><br />By EnterBD[BCT]<br />QQ:4791821<br />E-Mail:Taynni@Gmail.com<br />欢迎转载和指出错误,但请保留以上信息,谢谢.<br /><br />0:简介<br />1:下载和安装<br />2:使用<br /><br />简介<br />Cygwin是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来<br /><br />实现,这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在Windows下,大家可以想<br /><br />一下,你在运行Windows的同时,也可以使用VI,BASH,TAR,SED等UNIX下的工具,不是很好吗?这个VM<br /><br />虚拟机有很相同的原理,但是VM是虚拟多个,而Cygwin是同时使用Windows和UNIX,很爽吧,这样<br /><br />对于那些在Windows和Unix下移植的程序来说是比较简单的事情了.<br /><br />一:下载和安装<br /><br />其下载安装程序在Http://www.cygwin.com,下载安装程序以后,运行,然后会要你选择是通过什么方<br /><br />式进行下载安装所需要的文件,有三种方式,Http.Ftp.本地,我建议你首先通过Http和Ftp把安装所需要的<br /><br />文件全部下回来以后选择本地安装比较好,在线安装比较慢,会是一个很长的等待,虽然所需要的文件<br /><br />不大,但是全部安装的话会是4G大小,还是有选择性的安装吧,在安装界面,有Prev(老版本),Curr(当前版本)<br />Exp(最新版本测试版本),苹果这里建议你选择Curr,然后你单击View按钮,这样你可以在可以使用的安装<br /><br />文件之间进行选择性的安装,如果你真的想全部安装的话,那么左键点击一下最上面的All,然后看到<br /><br />INSTALL,这样选择了全部,进行全部安装便可以了,安装完以后,会在桌面产生一个图标,双击这个图标,<br /><br />呵呵,你便可以使用Cygwin了.关于安装的具体参数方法,网络上有比较详细的介绍,我就不罗嗦了.<br /><br />PS:下载方面我建议如下:你可以下载以下几个版本的Cygwin:<br /><br />原始站: http://sources.redhat.com/cygwin/; <br />印地安那大学的免安裝光盘cygwin, 叫做 XLiveCD:http://xlivecd.indiana.edu/ , <br />USA, Indiana ftp://ftp.ussg.indiana.edu/pub/xlivecd/xlivecd-20041201.iso <br />Mirrors: <br />Belgium, Geel ftp://sin.khk.be/mirror/xlivecd/xlivecd-20041201.iso <br />Germany, Bochum ftp://linux.rz.ruhr-uni-bochum.de/xlivecd/xlivecd-20041201.iso <br />Germany, Bochum http://linux.rz.ruhr-uni-bochum.de/download/xlivecd/xlivecd-20041201.iso <br />Sweden, Ume? http://ftp.acc.umu.se/mirror/xlivecd/xlivecd-20041201.iso <br />USA, Wisconsin ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso <br />USA, Georgia ftp://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso <br />USA, Georgia http://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso <br />苹果提示:USA, Wisconsin ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso<br />这个下载速度快 <br />Shelley Yen 的cygnuwin : ftp://ftp.tceb.edu.tw/pub/free_software/cygnuwin/ <br />ftp://ftp.tcc.edu.tw/iso/cygwin/cyg+gnu.iso(cygwin 与 gnuwin 的合成版本)<br />老古开发网:ftp://ic.laogu.com/down/cygwin.rar<br />http://soft.laogu.com/down/cygwin.rar (均为05年3月版本)<br /><br />苹果提示:这个站点是高人站点,比较NB,呵呵,喜欢单片机的朋友有福气,超级多 的下载资料等着你,包含*NIX下的东西...<br /><br />其他的镜像站点:http://cygwin.com/mirrors.html<br /><br />苹果自己也下载了最新版本的Cygwin，但是偶没有空间，真的需要的话，请哪位好心人提供空间<br /><br />偶可以上传上去，联系请加偶的QQ:4791821，或者给偶发邮件:Taynni@gmail.com注明一下就可以了. <br /><br />二:使用<br /><br />使用上的方便性很是不错，启动Cygwin以后，会在Windows下得到一个Bash Shell，由于Cygwin是以<br /><br />Windows下的服务运行的，所以很多情况下和在Linux下有很大的不同，这点上，苹果建议你多理解下这个<br /><br />工作环境。我们开始使用Cygwin吧，比如PS，相当于Windows下的TM(任务管理器)，呵呵，直接Ps的话<br /><br />那么得到的会是Cygwin下的Shell的进程如下<br />Taynni-417@ENTERBD-417 ~<br />$ ps<br />PID PPID PGID WINPID TTY UID STIME COMMAND<br />2212 1 2212 2212 con 1003 01:54:29 /usr/bin/bas<br />3384 2212 3384 3232 con 1003 01:59:24 /usr/bin/ps<br /><br />如果这个时候你需要在Cygwin下显示Windows下的进程你可以在PS后面加上参数-aW，<br /><br />PS的相关用法:<br /><br />Quote <br />Usage ps [-aefl] [-u uid]<br />-f = show process uids, ppids<br />-l = show process uids, ppids, pgids, winpids<br />-u uid = list processes owned by uid<br />-a, -e = show processes of all users<br />-s = show process summary<br />-W = show windows as well as cygwin processes<br />很容易看懂吧，呵呵<br /><br />有点不一样的地方，我想大家一定想知道在Cygwin下怎么访问Windows下的内容了，<br /><br />呵呵，首先使用DF命令直接查看下本地驱动器，呵呵，很容易了吧，显示的内容<br /><br />如下:<br /><br />Quote <br />Taynni-417@ENTERBD-417 ~<br />$ df<br />Filesystem 1k-blocks Used Available Use% Mounted on<br />e:\cygwin\bin 10231384 4844432 5386952 48% /usr/bin<br />e:\cygwin\lib 10231384 4844432 5386952 48% /usr/lib<br />e:\cygwin 10231384 4844432 5386952 48% /<br />c: 5106676 1240312 3866364 25% /cygdrive/c<br />d: 10239408 6560328 3679080 65% /cygdrive/d<br />e: 10231384 4844432 5386952 48% /cygdrive/e<br />f: 6333252 4065564 2267688 65% /cygdrive/f<br />g: 7150972 4672724 2478248 66% /cygdrive/g<br />如上便是我的硬盘的全部了，在后面的/cygdrive/c便是C盘了，然后/cygdrive/d便是D盘了<br /><br />这样的话，想进D盘便可以这样进，呵呵<br /><br />Quote <br />Taynni-417@ENTERBD-417 ~<br />$ cd /cygdrive/d<br /><br />Taynni-417@ENTERBD-417 /cygdrive/d<br />$ ls -l<br />ls: pagefile.sys: Permission denied<br />total 0<br />drwxr-xr-x 9 Taynni-4 None 0 Aug 31 20:56 Book<br />drwxr-xr-x 2 Taynni-4 None 0 Aug 23 05:24 Ftproot<br />drwxr-xr-x 30 Taynni-4 None 0 May 10 23:38 HACKER<br />drwxr-xr-x 11 Taynni-4 None 0 Feb 1 2005 JIAOXUE<br />drwxr-xr-x 8 Taynni-4 None 0 Jan 3 2005 Local Settings<br />dr-xr-xr-x 24 Taynni-4 None 0 Oct 16 2004 My Documents<br />drwxr-xr-x 12 Taynni-4 None 0 May 14 16:48 Mywww<br />drwxr-xr-x 2 Taynni-4 None 0 Jun 29 2004 Recycled<br />drwxr-xr-x 3 Taynni-4 None 0 Aug 22 04:44 SECBOOK<br />drwxr-xr-x 6 Taynni-4 None 0 Feb 28 2005 TaynniCHX<br />drwxr-xr-x 15 Taynni-4 None 0 Mar 30 01:04 TaynniGZ<br />drwxr-xr-x 12 Taynni-4 None 0 May 11 01:30 TaynniH<br />drwxr-xr-x 15 Taynni-4 None 0 Mar 12 04:27 TaynniYM<br />drwxr-xr-x 6 Taynni-4 None 0 Dec 13 2004 Taynniwww<br />drwxr-xr-x 8 Taynni-4 None 0 Aug 31 20:55 Word<br /><br />Taynni-417@ENTERBD-417 /cygdrive/d<br />$<br /><br />在Cygwin下还可以运行Windows下的程序，如下:<br />Taynni-417@ENTERBD-417 ~<br />$ cmd.exe<br />Microsoft Windows XP [Version 5.1.2600]<br />(C) Copyright 1985-2001 Microsoft Corp.<br /><br />e:\cygwin\home\Taynni-417>d:<br /><br />D:\>cd hacker<br /><br />D:\HACKER>cd tools<br /><br />D:\HACKER\Tools>cd pstools<br /><br />D:\HACKER\Tools\Pstools>ls<br />pdh.dll pskill.exe pspasswd.exe<br />Psinfo.exe psexec.exe pslist.exe psservice.exe<br />Pstools.chm psfile.exe psloggedon.exe psshutdown.exe<br />README.TXT psgetsid.exe psloglist.exe pssuspend.exe<br /><br />D:\HACKER\Tools\Pstools>exit<br /><br />Taynni-417@ENTERBD-417 ~<br />$<br />很明显的，直接输入CMD.EXE便可以得到一个本机CMDSHELL，这样你想运行什么程序都可以了<br /><br />退出到Cygwin的Bash shell需要使用exit命令，很方便吧，呵呵<br /><br />在Cygwin下还可以进行编译程序，比如C和perl，当然，你也可以借助ActivePy，这个东西也很不错<br /><br />也是一个仿真器，在Windows下模拟perl的解释器.<br /><br />对于一个系统而言，没有相应的系统工具是不可能的，在Cygwin下拥有的UNIX工具基本上够你使用<br /><br />了。当然，这需要你安装完整的Cygwin包，我的机子上就安装了完整的，比较大，如果硬盘允许，苹果建<br /><br />议你完整安装!像grep，cut，sed，strings，strace，md5sum，diff，patch，ssh，xxd，等等工具<br /><br />你都可以进行安装和使用，如果你真的不知道应该怎么用这些工具，其实苹果很多也不会，只要去接触<br /><br />你就会了！！！没有不会使用的东西，只有你愿意不愿意去使用而已！说笑了,言归正传，请使用<br /><br />所要使用的命令 --help获取帮助，如下所示:比如我不知道md5sum做什么用的<br /><br />（这个命令是用于效验文件md5值的，主要是为了文件的完整性和安全性）<br /><br />Quote <br />Taynni-417@ENTERBD-417 ~<br />$ md5sum --help<br />Usage: md5sum [OPTION] [FILE]...<br />or: md5sum [OPTION] --check [FILE]<br />Print or check MD5 (128-bit) checksums.<br />With no FILE, or when FILE is -, read standard input.<br /><br />-b, --binary read files in binary mode (default on DOS/Windows)<br />-c, --check check MD5 sums against given list<br />-t, --text read files in text mode (default)<br /><br />The following two options are useful only when verifying checksums:<br />--status don't output anything, status code shows success<br />-w, --warn warn about improperly formated checksum lines<br /><br />--help display this help and exit<br />--version output version information and exit<br /><br />The sums are computed as described in RFC 1321. When checking, the input<br />should be a former output of this program. The default mode is to print<br />a line with checksum, a character indicating type (`*' for binary, ` ' for<br />text), and name for each FILE.<br /><br />Taynni-417@ENTERBD-417 ~<br />$<br />基本使用上应该没有多大的问题了，文章因为我偷懒，也是不知道该怎么写才可以帮助大家<br /><br />我很苦恼的是，并没有人给我意见，所以先写这么点吧，如果你有问题的话，请加我的qq或者<br /><br />给我邮件，大家可以讨论，不是么？<br /><br />下面给出一些关于Cygwin的资料:<br />1:http://www.isi.edu/nsnam/ns/ns-cygwin.html<br />2:http://pigtail.net/LRP/printsrv/cygwin-sshd.html<br />3:http://kde-cygwin.sourceforge.net/<br />4:http://x.cygwin.com/<br />5:http://chinyi.ncit.edu.tw/~peterju/cygwin.html<br />6:http://cygnome.sourceforge.net/<br />http://xlivecd.indiana.edu/
          <br/><br/>
          <span style="color:red;">
            <a href="http://captain.javaeye.com/blog/205234#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</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;">Windows7在微软WinHEC 2008上揭开神秘面纱</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>Wed, 18 Jun 2008 16:52:25 +0800</pubDate>
        <link>http://captain.javaeye.com/blog/205234</link>
        <guid>http://captain.javaeye.com/blog/205234</guid>
      </item>
          <item>
        <title>转：oracle ocp 指南</title>
        <author>captain</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://captain.javaeye.com">captain</a>&nbsp;
                    链接：<a href="http://captain.javaeye.com/blog/204926" style="color:red;">http://captain.javaeye.com/blog/204926</a>&nbsp;
          发表时间: 2008年06月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1.1&nbsp; 概述<br />OCP是oracle公司推出的一项认证计划，全称为：oracle Certified Professional。由于oracle数据库在全球高端数据库领域占有的份额以及oracle数据库本身的复杂性致使这份认证的含金量颇高。<br />但是需要先纠正一个概念，很多认证机构将OCP吹嘘成高薪的充分条件，似乎只要通过了OCP就会拿到一份有优厚待遇的工作，其实并不是这样，特别是在目前中国IT行业的大背景下，很少国内企业会雇佣专门的数据库管理员来管理数据库，往往需要同时兼作数据库设计、数据库管理和数据库开发，而考取多门的OCP认证在精力和财力上对于个人来说都是难以接受的，所以有些人在取得了一门OCP认证之后反而会有一种失落感，好像是付出了努力，却并不能立刻感觉到在自己的职业生涯里有明显的变化。端正思想吧，因为考取OCP并不是一项艰难的任务，所以也不要把自己的全部理想押在OCP上面。<br />虽然OCP不是万金油，但是如果对于数据库相关的工作感兴趣，那么考取OCP仍然是当今数一数二的选择。理由在于，参加OCP考试会强迫自己系统而深入地学习oracle，而同时得到的OCP证书以及oracle的知识又在任何时候都会是自己能力的一个砝码。<br />1.2 OCP考试分类（Certification Path）<br /><br />下面列出OCP认证的详细分类，对于类似于Oracle8 OCP这样已经取消的OCP认证，本文不再进行介绍。<br />本文第一版是从2003年8月份开始编写的，随着oracle公司对于OCP认证考试的发展逐渐更新到现在的版本，所以有一部分内容，特别是Oracle8i的内容，可能已经不再适合现在的认证体系，但是由于oracle数据库本身的技术特点和认证要求都没有太大改变，所以本文介绍的学习经验仍然是值得借鉴的。<br />2004年底oracle公司宣布不再对Oracle8i数据库提供技术支持，于是Oracle8i的OCP认证考试也从此退出历史舞台。目前OCP考试只包含Oracle9i和oracle10g的版本，但是本文仍然保留了Oracle8i的部分。Oracle8i的退休声明可以参看以下页面：http://www.oracle.com/education/ ... le8idba_retire.html<br /> <br />（1）Database Administrator。<br />Oracle8i Certified Professional，下文简称为8iOCP。<br />Oracle9i Upgrade from Oracle8i OCP，下文简称为8ito9i。<br />Oracle9i Certified Associate，下文简称为9iOCA。<br />Oracle9i Certified Professional，下文简称为9iOCP。<br />Oracle9i Certified Master，下文简称为9iOCM。<br />oracle10g Certified Associate，下文简称为10gOCA<br />oracle10g Certified Professional，下文简称为10gOCP<br />oracle10g Certified Master，下文简称为10gOCM (目前官方页面还没有详细介绍)<br />oracle10g Upgrade from Oracle8i OCP，下文简称为8ito10g。<br />oracle10g Upgrade from Oracle9i OCP，下文简称为9ito10g。<br /> <br />（2）Web Application Server Administrator。<br />Oracle9i Application Server Certified Associate。<br /> <br />（3）Application Developer。<br />oracle Forms Developer Certified Professional，Release 6/6i。<br />Oracle9i PL/SQL Developer Certified Associate。<br />Oracle9i Forms Developer OCP Upgrade Path。<br />Oracle9i Forms Developer Certified Professional。<br />下面详细介绍每一项认证需要通过的考试科目，由于篇幅所限，本文只论及和数据库管理（Database Administrator）相关的考试内容，同时也不涉及当前在内地还没有举办的9iOCM认证。<br />首先说明一点，在考试中出现的题目有计分题（Scored Question）和非计分题（Unscored Question）之分，所以在考试中碰到的题目总数可能大于下表中列出的“总题数”（一般相差只会在1-3题之间），对于考生来说，是无法知道哪些题目是计分题哪些题目是非计分题的，所以要在规定的考试时长（考试时长不会变）之内保证尽可能多的题目正确，在最后计分的时候，非计分题将不会计算在内。<br /> <br />（1）Oracle8i Certified Professional考试概况如表1-1所示。<br />表1-1&nbsp; Oracle8i Certified Professional考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-001<br />Introduction to oracle： SQL and PL/SQL<br />57<br />39<br />68%<br />2.0<br />1Z0-023<br />Oracle8i：Architecture and Administration<br />65<br />42<br />65%<br />1.5<br />1Z0-024<br />Oracle8i：Performance Tuning<br />57<br />38<br />67%<br />1.5<br />1Z0-025<br />Oracle8i：Backup and Recovery<br />60<br />42<br />70%<br />1.5<br />1Z0-026<br />Oracle8i：Network Administration<br />59<br />41<br />69%<br />1.5<br /> <br />（2）Oracle9i Upgrade from Oracle8i OCP考试概况如表1-2所示。<br />表1-2 Oracle9i Upgrade from Oracle8i OCP考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-030<br />Oracle9i Database：New Features for Administrators<br />53<br />37<br />70%<br />1.5<br />　<br />　<br />　<br />　<br />　<br />　<br /> <br />（3）Oracle9i Certified Associate考试概况如表1-3所示。<br />表1-3 Oracle9i Certified Associate考试概况<br />考试号<br />考试内容<br />题数<br />题数<br /> 分数<br />时长<br />1Z0-007<br /> Introduction to Oracle9i： SQL<br />57<br />40<br />70%<br />2.0<br />1Z0-031<br />Oracle9i Database： Fundamentals I<br />60<br />44<br />73%<br />1.5<br /> <br />（4）Oracle9i Certified Professional考试概况如表1-4所示。<br />表1-4&nbsp; Oracle9i Certified Professional考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-032<br />Oracle9i Database： Fundamentals II<br />63<br />49<br />77%<br />1.5<br />1Z0-033<br />Oracle9i Database： Performance Tuning<br />65<br />46<br />70%<br />1.5<br />注：必须先通过9iOCA考试才可以参加9iOCP考试。<br /> <br />（5）oracle10g Upgrade from Oracle8i OCP考试概况如表1-5所示。<br />表1-5 oracle10g Upgrade from Oracle8i OCP考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-045<br />oracle Database 10g New Features for Oracle8i OCPs<br />n/a<br />n/a<br />n/a<br />n/a<br /> <br />（6）oracle10g Upgrade from Oracle9i OCP考试概况如表1-6所示。<br />表1-6 oracle10g Upgrade from Oracle9i OCP考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-040<br />oracle Database 10g New Features for Administrators<br />61<br />37<br />60%<br />2.0<br /> <br />（7）oracle10g Certified Associate考试概况如表1-7所示。<br />表1-7 oracle10g Certified Associate考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-042<br />oracle Database 10g: Administration I<br />75<br />49<br />65%<br />2.0<br /> <br />（8）oracle10g Certified Professional考试概况如表1-8所示。<br />表1-8 oracle10g Certified Professional考试概况<br />考试号<br />考试内容<br />题数<br />通过<br /> 分数<br />时长<br />1Z0-043<br />oracle Database 10g: Administration II<br />n/a<br />n/a<br />n/a<br />n/a<br />注：n/a表示该项考试还未正式推出。<br /> <br />最新认证信息请到以下网址查看：<br />http://www.oracle.com/education/certification/<br />http://www.oracle.com/education/ ... x.html?content.html<br />1.3&nbsp; 考试前<br /><br />1.3.1&nbsp; 选择8i还是9i<br />这部分在2003年甚至是2004年仍然是有很大意义的，但是由于Oracle8i OCP的退休，我们已经没有选择的余地了。目前oracle10g还不成熟，同样它的认证也没有完全推出，所以对于大家来说，唯一的选择就是考Oracle9i认证。但是由于近期oracle公司对于9i认证资格的规定有所修改，所以下一节的“是否参加培训，参加什么培训”反而成为了一个比较重要的问题，这部分在下一节细说。<br />很多人在决心获取OCP认证之后，都会有疑惑，到底是应该选择8i的认证还是9i的认证。就此问题解释如下：<br />（1）目前国内大部分企业使用的oracle数据库还是8i的版本（包括8。1。6和8。1。7），而8i中对于9i的新特性是没有实现的，所以如果只参加9i的考试则可能会导致在实际应用中碰到无法解决的问题，比如8i的Standby Database和9i升级后的Data Guard在实际应用中就有不少的区别。<br />（2）&nbsp;&nbsp; 如果想获得9i的认证，则必须在oracle指定的培训中心参加至少一门9i考试科目的培训（instructor-led inclass），可以在001、007、030、031、032、033中任选一门。此门培训的oracle官方报价根据课程不同而不同，大概在US$2500左右（oracle同时提供一种online的培训，价格要便宜一半也就是US$1250，简称是ILO，也就是instructor-led online course，但是这种培训目前在国内还没有进行，下面将有稍微详细的介绍），国内的人民币报价却是每门课都相等的：9685元。而参加8i的考试则没有此项规定，获取8iOCP证书之后再参加8ito9i的考试同样也不需要参加培训。现在来计算一下两种考试的费用：<br />8i和9i每门的考试费用是一样的，为人民币1211元，获取了OTN20的8折优惠之后是人民币968。8元，为方便计算认为是969元（如何获取OTN20的优惠将在后文介绍）。<br />8iOCP需要参加5门考试（001或者007、023、024、025、026），这样是969×5＝4845，如果再参加一门8ito9i的升级考试（030），一共需要花费4845＋969＝5814。<br />9iOCP需要参加4门考试（007或者001、031、032、033），姑且不论是否是oracle学员，是否会享受的6折优惠，单只是必须参加的一门培训，费用就已经远远超过了前一种途径所需花费的全部费用。<br />（3）8i考试在近期内不会取消，按照oracle的惯例即使是公布了取消日期也会有6个月的缓冲提供给已经参加了8i考试的考生以完成全部8i的考试。所以大可不必担心考到一半8iOCP认证就被取消了。<br />由于以上几点原因，建议先参加8iOCP的考试，获取证书之后再升级到9iOCP。目前，由于oracle10g产品的推出，oracle在官方网站上已经宣布8iOCP的考试会在2004年12月31日宣布退役，所以选取此种方法的考生应该加紧时间学习备考了。<br />1.3.2&nbsp; 决定是否需要参加培训以及参加什么培训<br />对于初次接触oracle的人，可能会想参加一些培训来让自己对oracle数据库有一个大体的认识。如果选择了资深的培训机构，比如www.itpub.net举办的定期培训，毫无疑问对于通过考试有很大的作用，在培训中可以很快的理解和建立oracle系统的整体构架概念，同时对于oracle的一些专用名词也可以正确理解。但是要知道培训的内容也是可以通过自学来得到的，如果自己的英文水平可以达到一定的程度（其实这也是必须的，因为最终的考试是完全英文的），同时对自己的自学能力有信心，那么节省一笔培训费用又何乐而不为呢？<br />目前oracle公司在中国推出了名为“网上图书馆”的项目，这对于为了考取9iOCP而想参加培训的人又多了一项选择。这是一个在线培训计划，下面我们简单地介绍一下这个“网上图书馆”项目。<br />由于直接考取9iOCP必须要参加至少一门oracle的官方培训，而这门培训的价钱在前面已经提及，确实不菲，所以导致很多考生在私人负担考试费用的情况下都选择了考8iOCP然后升级到9i的方法。针对这种现象，oracle推出了自己的POL在线图书馆项目。<br />从2004年10月1日开始，oracle公司规定：已经通过了OCP的考生只有在oracle大学或其授权培训中心参加了全套（9iOCP四门课程或10g OCP两门课程）的面授培训,并经过核对确认后,查证属实,才可在通过考试后获得OCP的全球认证证书。这样，如果要直接拿到9i OCP证书，就必须花费：<br />9i四门课程的培训费：￥38,740元。再加上考试费用，总共需要：￥43,584元。<br />这样的费用已经大大超过了私人能够承担的预期费用，当然如果是单位付钱那又另当别论。所以现在，POL对于个人来说应该是最好的选择。<br />所谓在线图书馆，其实就是oracle将培训的模式从面授教学改为了远程教学。当考生交取一定的费用之后，就可以得到一个帐号和密码，通过这个帐号登录到oracle的指定页面，就可以通过看录像的方式学习9i考试的四门课。同时这个费用中还包括了4张考试券，原版教材，以及2天的面授课堂培训。总共的费用目前是RMB12100元。参加了POL在线图书馆之后再参加OCP考试就不需要再参加任何9i的面授培训了。<br />需要注意的是，从你交费那天开始算起，有6个月的时间限制可以在线观看录像，也就是规定了你只有6个月的时间去学习，同时考试券也是有1年的时间限制。录像教学是通过中文进行的，通过PowerPoint和语音来达到和面授教学差不多的效果。<br />POL在线图书馆的Demo站点可以通过以下链接进入：<br />http://www.oracle.com/education/ ... ou_online_home.html<br />我们来评价一下这个POL网上图书馆：<br />a价钱比较适中，1万多就包括了所有的教材费用，考试费用，培训费用，对于想一次性通过9iOCP的考生还是具有一定的吸引力的。<br />b)培训效果也很不错，包含了所有的面授培训内容并且有大量的例子加深印象。<br />c)6个月的学习时间可能稍嫌短了一些。<br />d)最不好的一点，只适合个人拥有宽带上网条件的考生，实地测试的结果，在北京512K ADSL的速度仍然是不太理想的，从点击到课程开始几乎需要5分钟的时间，但是可能只是我个人的案例，作为大家的参考。<br />上面介绍的POL项目只有在中国国内才有效，而在国外，比如美加地区，oracle也有Online Library这样的在线图书馆项目，但是跟国内不同的是，这是一种真正意义上的图书馆，交纳一定的年费（US$250）就可以浏览培训内容，但是却不能替代必须参加的那一门OCP9i的培训课程。<br />对于国外的学员，介绍oracle提供的另外一种在线培训课程，这就是上面提到过的ILO（instructor-led online course），参加任意一门ILO也可以满足取得9iOCP证书必须参加一门培训这样的要求。所谓ILO是针对IL（instructor-led inclass）而言的，这两种培训的区别在于IL是去课堂真实地面对面听培训教师讲课，而ILO则是通过internet在oracle站点上下载教材（pdf格式的student guide），在计算机上看培训教师讲课的实时演示内容（通常是Powerpoint的页面），并且同时通过电话来听培训教师的讲课内容，也可以通过实时通信，类似于聊天软件这样的形式来作一定的沟通，比如不明白的问题可以提问等等。最主要的是ILO相比IL在价格方面有很大的优势，只需要IL培训价格的一半。这对于很多自费的学员来说应该是个不错的选择。其它的方面ILO和IL没什么区别，都是培训相同的天数（比如说5天），每天都有从几点到几点开始讲课，中间也都有课间休息。<br />至于ILO的效果，自然是见仁见智了，虽然价格便宜，又免除了要去课堂的路途中的车马劳顿，但是可能会有些人不适应这样的课程，因为相比起国内的POL，这种课程限制了多次听讲，因为讲课是实时的，课上完了，就相当于电话打完了，除非作电话的全程录音，否则没有办法再次收听。另外ILO的教材是电子版的pdf文件，而不是纸质的，相比起来查询当然是电子版的方便，但是大部分人在阅读的时候仍然倾向于纸质的教材。<br /> <br />1.3.3&nbsp; 查询自己所在城市的考点以及培训机构<br />通过Prometric网站（Prometric是IT领域中全世界最大的认证考试提供机构）可以查询自己所在城市的考点，而通常每个考点也会有相应的培训提供。网址如下：<br />http：//www.prometric.com.cn/aptcquery.asp?page_id=84<br />具体操作是：在“选择考场所在地”中选择你所在或者就近的城市，在“选择与厂商相关的信息”选择“[无]”，然后点击“查询”。就可以得到相关考场的信息了。再点击某个考场前面的“+”号，就可以得到这个考场的具体地址、联系方式等（如图1-4所示）。<br />1.3.4&nbsp; 注册OTN以获得8折的考试优惠<br />目前oracle公司已经取消了原有使用OTN20 可得到的八折优惠，在任何考试中心考都没有折扣。建议在考试报名之前先致电oracle培训中心详细询问近期有无考试费打折的优惠，因为OCP考试打折的活动是不定期推出的。比如目前上海和北京的考生可以去oracle公司考，有六折优惠，时间仅限于2004/05/27 下午和2004/05/31 下午。<br />最新打折信息可以参看下面链接：http://www.itpub.net/showthread.php?s=&amp;threadid=226348<br />以下为原先oracle公司实行的OTN打折信息，本文章暂时保留这个章节。<br />只需要在OTN网站免费注册一个帐号，就可以在参加考试的时候得到8折的优惠，这是oracle公司提供的一项长期优惠政策。<br />具体的操作步骤可以参照以下所述：<br />（1）在OTN（http：//otn.Oracle.com/）注册一个免费的账号，建议注册的时候用自己的真实姓名的拼音，这样显得正规，并且和以后证书上的姓名也相符。<br />（2）注册完毕应该会自动登录了，如果没有，输入自己的帐号密码，点击signin。<br />（3）进入OTN首页，在页面左边的Resources栏中点击“oracle University”链接。<br />（4）进入新页面后，点击页面上方的“Get Certified”动画logo，进入另一个页面，将此页面打印出来，注意此页面上会有你的用户名（如图1-5所示）。<br />（5）然后在汇款的时候，只需要汇80%的款项，1211×0.8=968.8。<br />（6）在考试当天将上述打印件带去，以证明你确实是OTN用户。如果忘记了，也在可以在考场当场打印。有些考场可能并不需要打印件，只需要在报名的时候说自己是OTN20就可以了。<br />1.4&nbsp; 考试中<br /><br />1.4.1&nbsp; 决定考试的顺序<br />考试本身对顺序没有要求，只要通过所有的科目就可以获得证书，对个人而言，顺序也是没有定规的，因为每个人的条件和基础不同，不能一概而论，这里可以说明一个大致原则，具体的由个人自己决定。<br />1.&nbsp; 8iOCP<br />（1）对于没有oracle经验和初步接触或一直利用开发工具开发而对oracle没有系统了解的人而言，建议前两门为001和023，因为001是DBA必须掌握的SQL基础，一个熟练的DBA必须能够熟练地书写SQL脚本或语句对数据库的性能情况等进行查询和更改调整，所以001是首先需要掌握的，而023是对oracle的结构和机制等的基本描述，对以后的024，025，026的知识掌握都是基础。<br />（2）对于有相当oracle经验的人而言，仍然建议将023放在前面，毕竟在工作中积累的经验和系统地学习还是存在着不小的差距，特别是对一些oracle专用名