<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>simon_lin</title>
    <description></description>
    <link>http://simon-lin.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>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/151147" style="color:red;">http://simon-lin.javaeye.com/blog/151147</a>&nbsp;
          发表时间: 2007年12月27日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">我给同事做ＲＯＲ介绍的讲稿，对初学者可能有些用</font>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/151147#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 27 Dec 2007 11:08:04 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/151147</link>
        <guid>http://simon-lin.javaeye.com/blog/151147</guid>
      </item>
      <item>
        <title>做项目以简单实现为主，做标准及组件以规范及易用为先</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/130185" style="color:red;">http://simon-lin.javaeye.com/blog/130185</a>&nbsp;
          发表时间: 2007年10月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          做项目以简单实现为主，做标准及组件以规范及易用为先
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/130185#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 09 Oct 2007 16:57:48 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/130185</link>
        <guid>http://simon-lin.javaeye.com/blog/130185</guid>
      </item>
      <item>
        <title>关于Rails Ajax 乱码，request.xhr--- Ajax提交</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/127769" style="color:red;">http://simon-lin.javaeye.com/blog/127769</a>&nbsp;
          发表时间: 2007年09月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span class="bold">关于Rails Ajax 乱码（转 <font face="Arial">http://www.railscn.com/viewthread.php?tid=2326&amp;extra=page%3D2</font>）</span>
<div class="t_msgfont" id="message11626">当我不用Ajax时，采用下面的方法显示正常<br />
&nbsp; &nbsp;&nbsp; &nbsp; class ApplicationController &lt; ActionController::Base <br />
&nbsp; &nbsp;&nbsp; &nbsp; before_filter :set_charset <br />
&nbsp; &nbsp;&nbsp; &nbsp; def set_charset <br />
&nbsp; &nbsp;&nbsp; &nbsp;&nbsp; &nbsp;&nbsp;&nbsp;@headers[&quot;Content-Type&quot;] = &quot;text/html; charset=GB2312&quot; <br />
&nbsp; &nbsp;&nbsp; &nbsp; end <br />
&nbsp; &nbsp;&nbsp; &nbsp; end <br />
如果我采用Ajax ,中文时显示了，可是Ajax不起作用了<br />
解决方法：<br />
&nbsp;&nbsp;before_filter :set_charset <br />
&nbsp;&nbsp;def set_charset&nbsp; &nbsp; <br />
&nbsp; &nbsp; if request.xhr?&nbsp; &nbsp; <br />
&nbsp; &nbsp;&nbsp; &nbsp;@headers['Content-Type'] = &quot;<font color="#ff0000">text/javascript</font>; charset=GB2312&quot;&nbsp; &nbsp;<br />
&nbsp; &nbsp; else&nbsp; &nbsp;&nbsp; &nbsp;<br />
&nbsp; &nbsp;&nbsp; &nbsp;@headers['Content-Type'] =<font color="#ff0000"> &quot;text/html; </font>charset=GB2312&quot;&nbsp; &nbsp; <br />
&nbsp; &nbsp; end <br />
&nbsp;&nbsp;end<br />
注意红色的字体哦！！</div>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/127769#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 28 Sep 2007 09:00:24 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/127769</link>
        <guid>http://simon-lin.javaeye.com/blog/127769</guid>
      </item>
      <item>
        <title>ROR项目数据表迁移</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/125242" style="color:red;">http://simon-lin.javaeye.com/blog/125242</a>&nbsp;
          发表时间: 2007年09月19日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial">制作：</font></p>
<p><font face="Arial">运行generaters migration XXX_create_XXX生成相关文件.修改如db/migrate/003_create_system_logs.rb文件就好了</font></p>
<p>建立表：<font face="Arial">运行 db:migrate </font></p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/125242#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 19 Sep 2007 11:28:45 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/125242</link>
        <guid>http://simon-lin.javaeye.com/blog/125242</guid>
      </item>
      <item>
        <title>render 方法</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/115621" style="color:red;">http://simon-lin.javaeye.com/blog/115621</a>&nbsp;
          发表时间: 2007年08月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><font face="Arial"><strong>render(:text =&gt; string) 输出字符串：</strong><br />
</font></font></font></font></font></font><font face="Arial"><font face="Arial">render(:text =&gt; cookies[:test_cookies].to_s)<br />
<font face="Arial"><font face="Arial">render(:text =&gt; &quot;字符串&quot;)</font></font></font></font></p>
<p><font face="Arial"><font face="Arial"><strong>render(:action =&gt; action_name)调用action()方法：</strong></font><br />
render(:action =&gt; :index)</font></p>
<p><font face="Arial"><strong>render(:template =&gt; template_name</strong></font><font face="Arial"><strong>)显示模板：</strong><br />
render(:template =&gt; &quot;test/index&quot;)</font></p>
<p><font face="Arial"><font face="Arial"><strong>render(:file =&gt; path)显示指定文件：</strong></font><br />
render(:file =&gt; &quot;D:/ruby/projects/test/app/views/test/index.rhtml&quot;)<br />
<font face="Arial">render(:file =&gt; &quot;test/index&quot;,:use_full_path =&gt; true)</font></font></p>
<p><font face="Arial"><font face="Arial"><font face="Arial"><strong>render(:nothing =&gt; true)返回空值：</strong></font></font><br />
render(:nothing =&gt; true)</font></p>
<p><font face="Arial"><br />
<strong>动态生成模板并显示数据：</strong><br />
render&nbsp; :inline =&gt; &quot;<!--'Hello ' + wor-->&quot;, :locals =&gt; { :word =&gt; &quot;World&quot;},:type =&gt; &quot;rhtml&quot;</font></p>
<p><font face="Arial"><strong>render(:partial =&gt; path)调用局部模板：</strong><br />
render(:partial =&gt; &quot;partial/title&quot;, :object =&gt; @first_item)</font></p>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/115621#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 23 Aug 2007 12:08:55 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/115621</link>
        <guid>http://simon-lin.javaeye.com/blog/115621</guid>
      </item>
      <item>
        <title>request对象的常用方法</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/79091" style="color:red;">http://simon-lin.javaeye.com/blog/79091</a>&nbsp;
          发表时间: 2007年05月12日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          (1)&nbsp;getParameter(String&nbsp;name)&nbsp;一般用它读取表单中参数<br />
(2)&nbsp;getProtocol()&nbsp;获取客户端向服务器端传送数据所依据的协议名称。<br />
(3)getRemoteAddr()&nbsp;获取客户端的IP地址。&nbsp;<br />
(4)getRemoteHost()&nbsp;获取客户端的名字。&nbsp;<br />
(5)getServerName()&nbsp;获取服务器的名字。<br />
(6)getServerPort()&nbsp;获取服务器的端口号。<br />
(7)getHeader()获取客户端的浏览器类型。<br />
<br />
例子：jspTest.jsp<br />
&lt;%@page&nbsp;contentType=&quot;text/html;charset=gb2312&quot;%&gt;<br />
&lt;html&gt;&nbsp;&lt;body&gt;&nbsp;<br />
&lt;h1&gt;&nbsp;Request&nbsp;Information&lt;/h1&gt;&nbsp;<br />
请求的协议是:&lt;%=request.getProtocol()%&gt;&nbsp;<br />
&lt;br&gt;&nbsp;<br />
客户端的名字是:&lt;%=request.getRemoteHost()%&gt;&nbsp;<br />
&lt;br&gt;&nbsp;<br />
客户端的IP地址是:&lt;%=request.getRemoteAddr()%&gt;<br />
&lt;br&gt;<br />
服务器的名字是:&lt;%=request.getServerName()%&gt;&nbsp;<br />
&lt;br&gt;&nbsp;<br />
服务器的服务端口是:&lt;%=request.getServerPort()%&gt;&nbsp;<br />
&lt;br&gt;&nbsp;<br />
你使用的浏览器是：&nbsp;&lt;%=request.getHeader(&quot;User-Agent&quot;)%&gt;&nbsp;<br />
&lt;/body&gt;&nbsp;&lt;/html&gt;&nbsp;<br />
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/79091#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 12 May 2007 14:46:07 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/79091</link>
        <guid>http://simon-lin.javaeye.com/blog/79091</guid>
      </item>
      <item>
        <title>使用Ruby生成图文并茂的Excel </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72849" style="color:red;">http://simon-lin.javaeye.com/blog/72849</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          可以实现插入文字，图像。<br />
excel.rb代码如下<br />
<div class="code_title">
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb">
    <li class="alt"><span><span>require&nbsp;'win32ole'&nbsp;&nbsp;</span></span> </li>
    <li class=""><span><span class="keyword">module</span><span>&nbsp;Excel&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;WorkBook&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdge</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeBottom&nbsp;=9&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeLeft&nbsp;&nbsp;=&nbsp;7&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeRight&nbsp;=&nbsp;10&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlEdgeTop&nbsp;&nbsp;=&nbsp;8&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColor</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorBlank&nbsp;=&nbsp;1</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorWhite&nbsp;=2</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorRed&nbsp;=&nbsp;3</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorGreen&nbsp;=10</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorBlue&nbsp;=5</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorYellow&nbsp;=6</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorPurple&nbsp;=&nbsp;7&nbsp;#&nbsp;zi&nbsp;se</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlColorCyan&nbsp;=8&nbsp;#qing&nbsp;se</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorYellow&nbsp;=19</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorCyan&nbsp;=20</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlBgColorPurple&nbsp;=24</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#xlDefaultLineStyle&nbsp;=&nbsp;1&nbsp;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;=[]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(encoding=</span><span class="string">&quot;GB2312&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>&nbsp;=&nbsp;WIN32OLE.</span><span class="keyword">new</span><span>(</span><span class="string">&quot;excel.application&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.visible&nbsp;=&nbsp;FALSE&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@workbook</span><span>&nbsp;=&nbsp;</span><span class="variable">@excel</span><span>.Workbooks.Add()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#@style_id&nbsp;&nbsp;&nbsp;=&nbsp;0</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@encoding</span><span>&nbsp;=&nbsp;encoding&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;create_style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_worksheet(name)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">while</span><span>&nbsp;@</span><span class="variable">@worksheets_name</span><span>.include?(name)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;name&nbsp;+=<span class="string">&quot;1&quot;</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;&lt;&lt;&nbsp;name&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet&nbsp;=&nbsp;<span class="variable">@workbook</span><span>.Worksheets.Add()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet.Activate&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;worksheet.name&nbsp;=&nbsp;name&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;WorkSheet.</span><span class="keyword">new</span><span>(worksheet)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;show&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.visible&nbsp;=&nbsp;TRUE&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;close&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@workbook</span><span>.Close(0)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@excel</span><span>.Quit()&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;create_style&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty=<span class="variable">@workbook</span><span>.Styles.Add('NormalStyle')&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Size&nbsp;=&nbsp;12&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(7).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(8).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(9).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Borders(10).LineStyle=1&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty=<span class="variable">@workbook</span><span>.Styles.Add('TitleStyle')&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Size&nbsp;=&nbsp;16&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.Bold&nbsp;=<span class="keyword">true</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sty.Font.ColorIndex&nbsp;=3&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#sty.Interior.ColorIndex&nbsp;=&nbsp;20</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#worksheet</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;WorkSheet&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IMAGE_ROW_NUM&nbsp;=&nbsp;56&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@worksheets_name</span><span>&nbsp;=[]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(worksheet)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;=&nbsp;1&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>&nbsp;=&nbsp;worksheet&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_space_line(n=1)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;</span><span class="keyword">if</span><span>&nbsp;n&lt;1&gt;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;+=n&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_title(name)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_row.add_cell(name,<span class="keyword">false</span><span>,</span><span class="string">&quot;TitleStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_row()&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@current_row</span><span>&nbsp;=&nbsp;Row.</span><span class="keyword">new</span><span>(</span><span class="variable">@worksheet</span><span>,</span><span class="variable">@row_count</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_count</span><span>&nbsp;+=1&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span><span class="variable">@current_row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;current_row&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span><span class="variable">@current_row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_image(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;</span><span class="keyword">not</span><span>&nbsp;</span><span class="builtin">File</span><span>.exist?(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_row&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;cell_name=current_row.first_cell&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name).Select&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>.Pictures.Insert(image_path)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;add_space_line&nbsp;&nbsp;IMAGE_ROW_NUM&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="comment">#row</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">class</span><span>&nbsp;Row&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;FILL_TYPE&nbsp;=&nbsp;4&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;@<span class="variable">@cell_map</span><span>&nbsp;=[</span><span class="string">&quot;A&quot;</span><span>,</span><span class="string">&quot;B&quot;</span><span>,</span><span class="string">&quot;C&quot;</span><span>,</span><span class="string">&quot;D&quot;</span><span>,</span><span class="string">&quot;E&quot;</span><span>,</span><span class="string">&quot;F&quot;</span><span>,</span><span class="string">&quot;G&quot;</span><span>,</span><span class="string">&quot;H&quot;</span><span>,</span><span class="string">&quot;I&quot;</span><span>,</span><span class="string">&quot;J&quot;</span><span>,</span><span class="string">&quot;K&quot;</span><span>,</span><span class="string">&quot;L&quot;</span><span>,</span><span class="string">&quot;M&quot;</span><span>,</span><span class="string">&quot;N&quot;</span><span>,</span><span class="string">&quot;O&quot;</span><span>,</span><span class="string">&quot;P&quot;</span><span>,</span><span class="string">&quot;Q&quot;</span><span>,</span><span class="string">&quot;R&quot;</span><span>,</span><span class="string">&quot;S&quot;</span><span>,</span><span class="string">&quot;T&quot;</span><span>,</span><span class="string">&quot;U&quot;</span><span>,</span><span class="string">&quot;V&quot;</span><span>,</span><span class="string">&quot;W&quot;</span><span>,</span><span class="string">&quot;X&quot;</span><span>,</span><span class="string">&quot;Y&quot;</span><span>,</span><span class="string">&quot;Z&quot;</span><span>]&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;initialize(worksheet,row_id)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@row_id</span><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;=row_id&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@cell_count</span><span>=0&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@worksheet</span><span>&nbsp;=&nbsp;worksheet&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;curent_cell&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;&nbsp;cell_name(</span><span class="variable">@cell_count</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;first_cell&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;cell_name(0)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;add_cell(value,auto_fit&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,style&nbsp;=&nbsp;</span><span class="string">&quot;NormalStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range&nbsp;=&nbsp;<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name(</span><span class="variable">@cell_count</span><span>))&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Value']&nbsp;=&nbsp;value.to_s;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Style']=style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range.Columns.AutoFit&nbsp;<span class="keyword">if</span><span>&nbsp;auto_fit&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="variable">@cell_count</span><span>&nbsp;+=1&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;cell_name(index)&nbsp; <br />
    </span></span></li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;second&nbsp;=&nbsp;index&nbsp;%&nbsp;26&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;=&nbsp;(index&nbsp;-&nbsp;second)&nbsp;/&nbsp;26&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">if</span><span>&nbsp;first&nbsp;==&nbsp;0&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;@</span><span class="variable">@cell_map</span><span>[second]+</span><span class="variable">@row_id</span><span>.to_s&nbsp;&nbsp;&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;first&nbsp;-=1&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">return</span><span>&nbsp;@</span><span class="variable">@cell_map</span><span>[first]+@</span><span class="variable">@cell_map</span><span>[second]+</span><span class="variable">@row_id</span><span>.to_s&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">def</span><span>&nbsp;set_cell(index,value,auto_fit&nbsp;=&nbsp;</span><span class="keyword">false</span><span>,style&nbsp;=&nbsp;</span><span class="string">&quot;NormalStyle&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range=<span class="variable">@worksheet</span><span>.</span><span class="builtin">Range</span><span>(cell_name(index))&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Value']&nbsp;=&nbsp;value;&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range['Style']=style&nbsp;&nbsp;</span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;range.Columns.AutoFit&nbsp;<span class="keyword">if</span><span>&nbsp;auto_fit&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>&nbsp;&nbsp;&nbsp;&nbsp;<span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span><span class="keyword">end</span><span>&nbsp;&nbsp;</span></span> </li>
</ol>
</div>
</div>
测试程序<br />
<div class="code_title">ruby 代码</div>
<div class="dp-highlighter">
<div class="bar">&nbsp;</div>
<ol class="dp-rb">
    <li class="alt"><span><span>require&nbsp;'excel'&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>excel&nbsp;=&nbsp;Excel::WorkBook.<span class="keyword">new</span><span>&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>worksheet&nbsp;=&nbsp;excel.add_worksheet(<span class="string">&quot;玛雅牛&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>worksheet.add_title('标题')&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row&nbsp;=&nbsp;worksheet.add_row&nbsp;&nbsp;</span> </li>
    <li class=""><span>row.add_cell(<span class="string">&quot;myaniu&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>row.add_cell(0)&nbsp;&nbsp;</span> </li>
    <li class=""><span>row.add_cell(<span class="string">&quot;2006-01-01&nbsp;01:01:01&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>worksheet.add_image(<span class="string">&quot;C:\\AutoTest\\out.bmp&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>row&nbsp;=&nbsp;worksheet.add_row&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row.add_cell(<span class="string">&quot;玛雅牛&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>row.add_cell(0)&nbsp;&nbsp;</span> </li>
    <li class="alt"><span>row.add_cell(<span class="string">&quot;2006-01-01&nbsp;01:01:01&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class=""><span>worksheet.add_image(<span class="string">&quot;C:\\AutoTest\\out.bmp&quot;</span><span>)&nbsp;&nbsp;</span></span> </li>
    <li class="alt"><span>excel.show&nbsp;&nbsp;</span> </li>
</ol>
</div>
<br />
由于当时该程序是具有针对性，没有太考虑通用性，有些地方还是要修改。
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72849#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:51:28 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72849</link>
        <guid>http://simon-lin.javaeye.com/blog/72849</guid>
      </item>
      <item>
        <title>求教ruby语言中的时间转换问题 </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72848" style="color:red;">http://simon-lin.javaeye.com/blog/72848</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">http://www.javaeye.com/topic/56310</font>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72848#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:50:11 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72848</link>
        <guid>http://simon-lin.javaeye.com/blog/72848</guid>
      </item>
      <item>
        <title>ruby文件读取问题 </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72847" style="color:red;">http://simon-lin.javaeye.com/blog/72847</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">http://www.javaeye.com/topic/57848</font>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72847#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:49:40 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72847</link>
        <guid>http://simon-lin.javaeye.com/blog/72847</guid>
      </item>
      <item>
        <title>学习XRuby</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72844" style="color:red;">http://simon-lin.javaeye.com/blog/72844</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <font face="Arial">http://www.javaeye.com/topic/65415</font>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72844#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:44:23 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72844</link>
        <guid>http://simon-lin.javaeye.com/blog/72844</guid>
      </item>
      <item>
        <title>Ruby On Rails，MySQL中文乱码解决 </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72842" style="color:red;">http://simon-lin.javaeye.com/blog/72842</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table width="100%">
    <tbody>
        <tr>
            <td><font size="3">今天小试了下Ruby On Rails。根据Eiffel Qiu的安装步骤（Ruby on Rails实践）进行安装，还算比较顺利。<br />
            但是安装完毕后做例子的时候又出现了中文乱码问题，搜索+试验一通后得到如下的解决方法：<br />
            <br />
            环境：<br />
            &nbsp;&nbsp;&nbsp; Ruby：ruby185-22_rc2.exe<br />
            &nbsp;&nbsp;&nbsp; Mysql：5.0.18<br />
            &nbsp;&nbsp;&nbsp; Mysql图形化管理工具:ems sql manager 2005<br />
            &nbsp;&nbsp;&nbsp; OS：XP SP2</font><br />
            <font size="3">乱码情况一：用户从输入界面输入中文，程序将输入内容保存到mysql中，程序在将内容从mysql取出显示到页面上，中文显示正常。但利用ems sql manager 2005查看时看到的是中文乱码。（我的mysql数据库和表设置的都是utf8格式）<br />
            解决方法：修改database.yml 增加 encoding: utf8 这一数据库连接属性。修改后：<br />
            development:<br />
            &nbsp; &nbsp; adapter: mysql<br />
            &nbsp;&nbsp;&nbsp; database: mybook<br />
            &nbsp;&nbsp;&nbsp; encoding: utf8<br />
            &nbsp;&nbsp;&nbsp; username: root<br />
            &nbsp;&nbsp;&nbsp; password: 123456<br />
            &nbsp;&nbsp;&nbsp; host: localhost<br />
            </font><font size="3">附件一是解决后效果<br />
            <br />
            </font><font size="3">乱码情况二：apps\views\..\*.rhtml中的中文在网页显示时是乱码，例如表格的列标题。<br />
            解决方法：*.rhtml中的中文以utf-8的格式保存，可以用记事本打开*.rhtml文件另存为unicode编码格式。<br />
            </font><font size="3">附件二是解决后效果</font></td>
        </tr>
    </tbody>
</table>
<div style="PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px">
<table class="attach" cellspacing="0" border="1" align="center" width="95%" cellpadding="2">
    <tbody>
        <tr>
            <td class="attachrow" align="center" colspan="2" width="100%" style="BACKGROUND: #d1d7dc"><strong><span class="gen">db.jpg</span></strong></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;描述:</span></td>
            <td class="attachrow" width="75%">&nbsp; </td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件大小:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;154 KB</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;看过的:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;文件被下载或查看 120 次</span></td>
        </tr>
        <tr>
            <td align="center" colspan="2"><br />
            <a href="http://www.javaeye.com/topics/download/d8c521e5-16e7-4079-8605-22d37e804d44" target="_blank"><img src="http://www.javaeye.com/upload/attachment/pic/3999/2cc6b929-be92-47af-bea5-939239323abb-thumb.jpg" border="0" alt="db.jpg" /></a> <br />
            <a href="http://www.javaeye.com/topics/download/d8c521e5-16e7-4079-8605-22d37e804d44?disposition=attachment"><strong>下载</strong></a> <br />
            </td>
        </tr>
    </tbody>
</table>
</div>
<div style="PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px">
<table class="attach" cellspacing="0" border="1" align="center" width="95%" cellpadding="2">
    <tbody>
        <tr>
            <td class="attachrow" align="center" colspan="2" width="100%" style="BACKGROUND: #d1d7dc"><strong><span class="gen">page.jpg</span></strong></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;描述:</span></td>
            <td class="attachrow" width="75%">&nbsp; </td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件大小:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;19 KB</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;看过的:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;文件被下载或查看 44 次</span></td>
        </tr>
        <tr>
            <td align="center" colspan="2"><br />
            <a href="http://www.javaeye.com/topics/download/9d4bc6d2-16d7-4bda-8558-c82fa0e293e5" target="_blank"><img src="http://www.javaeye.com/upload/attachment/pic/4000/80780855-c32e-4ebe-9d19-dd799658051f-thumb.jpg" border="0" alt="page.jpg" /></a> <br />
            <a href="http://www.javaeye.com/topics/download/9d4bc6d2-16d7-4bda-8558-c82fa0e293e5?disposition=attachment"><strong>下载</strong></a> <br />
            </td>
        </tr>
    </tbody>
</table>
</div>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72842#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:43:12 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72842</link>
        <guid>http://simon-lin.javaeye.com/blog/72842</guid>
      </item>
      <item>
        <title>Windows下安装配置RadRails指南 </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72841" style="color:red;">http://simon-lin.javaeye.com/blog/72841</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>RadRails是基于eclipse平台的Ruby on Rails(ROR) IDE. 熟悉eclipse的开发人员很容易使用. 下面简单介绍一下RadRails在WindowsXP下面的安装, 配置. <br />
<br />
<strong>1. 安装RadRails</strong></p>
<p>1.1 安装JRE, 下载页面<a href="http://java.sun.com/javase/downloads/index_jdk5.jsp" target="blank">http://java.sun.com/javase/downloads/index_jdk5.jsp</a> <br />
1.2 安装Ruby One-Click Installer, 下载页面<a href="http://www.ruby-lang.org/en/downloads/" target="blank">http://www.ruby-lang.org/en/downloads/</a> <br />
1.3 安装Rails, Windows CMD(开始--&gt;运行--&gt;cmd) 中运行&quot;gem install rails --include-dependencies&quot; <br />
1.4 安装RadRails, 下载页面<a href="http://radrails.org/page/download" target="blank">http://radrails.org/page/download</a>, 最好下载standalone版本 </p>
<p><strong>2. 配置RadRails</strong></p>
<p>配置RadRails应该是最容易出问题的地方，下面将分类说明Ruby，Rails，Rake的配置方法. 本指南中Ruby安装在&quot;D:\ruby&quot;, 根据情况修改成个人的Ruby安装目录</p>
<p>2.1 配置Ruby</p>
<p>2.1.1配置Interpreters <br />
打开&quot;Windows--&gt;Preferences&quot;, 选择&quot;Ruby--&gt;Installed Interpreters&quot; , 点击&quot;Add&quot;出现的提示框中 <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//any&nbsp;name&nbsp;you&nbsp;like </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Interpreters&nbsp;Name:&nbsp;Ruby&nbsp; &nbsp;&nbsp;</span></li>
    <li class="alt"><span>Location:&nbsp;D:\ruby\bin\ruby.exe &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>2.1.2配置Ri/rdoc <br />
打开&quot;Windows--&gt;Preferences&quot;, 选择&quot;Ruby--&gt;Ri/rdoc&quot; <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//bin目录下面的rdoc文件，没有扩展名，不是rdoc.bat </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>RDoc&nbsp;path:&nbsp;D:\ruby\bin\rdoc &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//bin目录下面的ri文件，没有扩展名，不是ri.bat </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>Ri&nbsp;path:&nbsp;D:\ruby\bin\ri &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p>2.2 配置Rails和Rake <br />
打开&quot;Windows--&gt;Preferences&quot;, 选择&quot;Rails--&gt;Configuration&quot; <br />
</p>
<div class="code_title">代码</div>
<div class="code_div">
<div class="dp-highlighter">
<div class="bar"></div>
<ol class="dp-j">
    <li class="alt"><span><span class="comment">//bin目录下面的rails文件,&nbsp;没有扩展名,&nbsp;不是rails.bat </span><span>&nbsp;&nbsp;</span></span></li>
    <li class=""><span>Rails&nbsp;Path:&nbsp;D:\ruby\bin\rails &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//bin目录下面的rake文件,&nbsp;没有扩展名,&nbsp;不是rake.bat.&nbsp;如果没有rake文件,运行gem&nbsp;update&nbsp;rake(安装)&nbsp;或者&nbsp;gem&nbsp;install&nbsp;rake(升级)&nbsp; </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>Rake&nbsp;Path:&nbsp;D:\ruby\bin\rake &nbsp;&nbsp;</span></li>
    <li class="alt"><span></span><span class="comment">//bin目录下面的mongrel_rails文件,&nbsp;没有扩展名.&nbsp;如果没有,运行gem&nbsp;install&nbsp;mongrel&nbsp;安装 </span><span>&nbsp;&nbsp;</span></li>
    <li class=""><span>Mongrel&nbsp;Path:&nbsp;D:\ruby\bin\mongrel_rails &nbsp;&nbsp;</span></li>
</ol>
</div>
</div>
<script>render_code();</script>
<p>&nbsp;</p>
<p><strong>3. 总结</strong> <br />
安转RadRails很简单,但是配置还是很容易出问题, 特别是几个path, 除了ruby.exe有扩展名以外, 其他的都没有扩展名. 初学者很容易出问题, 再次强调一遍<img src="http://www.javaeye.com/images/forum/smiles/icon_smile.gif" alt="" /> </p>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72841#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:42:43 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72841</link>
        <guid>http://simon-lin.javaeye.com/blog/72841</guid>
      </item>
      <item>
        <title>Windows平台的ruby IDE 点评</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72839" style="color:red;">http://simon-lin.javaeye.com/blog/72839</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table width="100%">
    <tbody>
        <tr>
            <td>
            <p>在MacOS平台几乎没有什么争议性，大家都用TextMate。但是Windows平台可供选择和使用的IDE很多，却各有各的长处和短处。基于我用过的所有ruby IDE点评一下。windows平台的RoR IDE主要分为两类：一类是重量级的全功能IDE，例如Eclipse，Netbeans，IDEA和jedit，运行起来很耗资源，功能比较齐全；另一类是轻量级的IDE，例如Komodo，RoRed，vim，emacs，E，下面一一点评之：</p>
            <p>一、重量级的IDE</p>
            <p>1、radrails － 当前最值得推荐的IDE</p>
            <p>radrails是基于Eclipse的插件，当前版本0.7.2。radrails继承了Eclipse平台的各种功能，尤其是CVS/SVN集成特别好，和其他ruby IDE相对比来说，radrails最主要的优点在于bug很少，功能非常齐全。</p>
            <p>1) 相对于其他大多数RoR IDE各种各样的bug，radrails在0.7.2版本的表现非常的稳定。在我连续几个月使用下来，基本没有什么大的bug。</p>
            <p>2) 功能齐全，其他IDE或多或少功能都有缺失，但radrails功能非常齐全：内置的server管理，generator，rake task，rdoc检索，plugin安装，规则表达式校验，tail log，，console调试窗口，debug，代码格式化，代码和模板高亮，ruby代码和rhtml模板的template自动提示，单元测试支持，代码和测试之间的跳转，代码和模板之间的跳转等等等无所不包。</p>
            <p>3) 中文支持非常好，UTF-8编码支持也非常好。中文字体显示也很漂亮，这一点对我们来说很重要。</p>
            <p>但是radrails也不是没有缺点，radrails的致命缺点是其RDT功能太弱智。</p>
            <p>1) 代码的感知能力很差，连我敲一个def回车都不会自动补齐end。而且也不能够搜索ruby库文件进行语法树分析，所以没有智能提示功能。</p>
            <p>2) 没有像Eclipse的JDT那样的Ctrl+O来快速导航到某个方法的功能，这一点对我开发很重要，否则我就总是需要通过serch &quot;def 方法名&quot;才能快速找到要修改的方法，非常不方便，这是我非常垢病RDT的一个地方，也没有F3快速导航到类定义文件的功能。</p>
            <p>RDT下一个版本0.9.0号称在两周以后就会发布(RDT快两年没有推出新版本了，实在是太迟钝了)，貌似对于脚本语言的AST解析能力大大增强，如果真的是这样，还是很值得期待的，预计RDT0.9.0发布几周之后，radrails就会发布0.8版本。另外值得一提的是radrails得到了SAP的一些赞助和支持。</p>
            <p>2、Netbeans － 最值得期待的IDE</p>
            <p>Netbeans6.0M7提供了Generic Language Support Framework，一个很强大的脚本语言框架，在这个框架基础上提供的ruby和ruby on rails支持表现非凡。可以对ruby语言和库进行良好的语法分析，从而提供智能化的代码提示功能，让ruby程序员也可以享受到敲一个&ldquo;.&rdquo;就能够跳出来详细提示的功能，真正有了写Java程序的安全感。有些优点确实很棒：</p>
            <p>1) 代码感知能力超强，不但系统库的API，你自己项目的所有类API都可以根据上下文提示，有了写Java程序那种安全感了，也不用跳转来去找类定义文件了。</p>
            <p>2) 快捷的打开rails库文件和ruby所有库文件，类似在Eclipse里面打开依赖库的源代码和JDK的源代码的功能，对于学习和熟悉ruby库和rails非常非常有用。</p>
            <p>3) Ctrl+G可以快速定位类定位文件，类似Eclipse的F3的功能。</p>
            <p>目前netbeans这些功能领先所有的其他IDE，非常令人期待。但是netbeans也有些明显的缺点，有些东西用起来行为非常古怪，可能是因为netbeans6.0还是beta版本，bug太多的缘故，而且也不够稳定：</p>
            <p>1) 没有类似Eclipse的Ctrl+Shift+R那样的文件快速定位功能，要自己在项目树里面一层层找，这个实在令人难以忍受。一个大项目动不动几百个文件，不能快速定位，找起来太影响效率。其实netbeans提供了一个Ctrl+Alt+O的快捷定位，但是不起作用，搜索框总是空的，因此怀疑netbeans有这个功能，目前是bug导致出不来。</p>
            <p>2) 没有在文件中快速定位某个方法的功能，这一点和radrails一样令人失望。</p>
            <p>3) 在编辑器里面好多顺手的代码编辑的快捷功能都没有，令人很苦恼，这一点显然不如radrails那么方便。</p>
            <p>4) 对中文的支持不好</p>
            <p>5) 对yml文件没有高亮功能</p>
            <p>6) 依赖JDK6.0，在JDK5.0上面跑很不流畅。</p>
            <p>总得来说，netbeans还是最值得期待的IDE，等到07年底，netbeans6.0正式发布，ruby插件支持更加成熟以后，我想我会转移到netbeans上面来。另外非常重要的一点：Sun公司从JDK6以后，致力于JVM平台化发展道路，大力拓展脚本语言在JVM平台的支持力度，而且Sun给予了JRuby官方支持，所以netbeans平台的脚本框架和RoR支持是有足够的商业推动力的，前景应该是最好的！</p>
            <p>3、IDEA - 观望中</p>
            <p>貌似前段时间有人撰文推荐IDEA作为首选ruby IDE，我觉得他的理由很奇怪，其实IDEA目前不是好的选择：其ruby代码感知能力和智能提示能力明显不如netbeans，其功能齐全程度又明显不如radrails，而且最致命的是IDEA竟然不能对rhtml模板高亮和提示，那就宣布了IDEA的基本不可用，另外yml文件也不能高亮。其插件作者说下一版本会提供rhtml高亮和提示，所以我们对IDEA目前还持观望态度。</p>
            <p>但IDEA也有一些明显优点，例如IDEA就有对ruby类和ruby资源进行快速定位的快捷键Ctrl+Alt+N和Alt+N，这明显优于radrails和netbeans，另外也有在当前文件快速定位方法的快捷键，终于克服了我对radrails的最大怨气。</p>
            <p>4、jedit - 貌似没什么理由去用它了</p>
            <p>作为一个重量级IDE，却定位在轻量级功能上，要安装一大堆插件才能勉强把功能跑起来，没什么理由去用它。</p>
            <p>二、轻量级IDE</p>
            <p>1、E － 最值得期待的轻量级IDE</p>
            <p>E现在确实有很多bug，很多功能缺失，例如：我非常在意的对文件进行快速定位的快捷键和在当前文件中快速定位方法的快捷键，目前E竟然不支持，但是TextMate可是有的；快速删除当前行在TextMate当中是Command+L，但是E貌似没有，诸如此类的功能缺失。所以E和TextMate还是有很大差距的。</p>
            <p>但是E确实在主要方面完全克隆了TextMate，所以这些小功能上面的缺失应该只是时间问题。所以相信给E半年左右的时间，E会成为Windows平台当之无愧的TextMate。</p>
            <p>2、Komodo - 乏善可陈</p>
            <p>Komodo是个定位很传统的脚本IDE，对于ruby没有什么特别好的支持，有最基本的语法高亮和简单的代码提示而已，以及一个简陋的项目树，运行速度还很缓慢，而且还是收费的，实在不值得去用。</p>
            <p>3、RoRed - mini ruby IDE</p>
            <p>如果你真要去用Komodo，那我建议你改用RoRed，一个专门针对ruby on rails开发的简单编辑器，带有ruby语法高亮，项目树，功能简单，可能对某些偏爱UltraEdit/Editplus的人来说用RoRed已经够用了，速度也挺快的。</p>
            <p>4、vim/emacs - 不适合Windows平台的ruby IDE</p>
            <p>vim以及emacs这些源于Unix平台的IDE，我认为不适合在Windows上面用。因为vim/emacs当初被设计成为一个无鼠标支持的编辑环境，全部依靠键盘命令驱动。当你在Windows下面使用的时候，这种习惯会被打破，从而觉得非常影响效率。</p>
            <p>例如在vim里面执行一个generator，Unix上面会在vim窗口中开buffer显示，执行完毕敲一下回车就退出这个buffer了，很方便很快捷。但在Windows平台，竟然会弹出一个DOS窗口，而且把键盘焦点给转移到这个DOS窗口上去了。这就迫使你不得不动用鼠标去选择这个DOS窗口，然后关闭它，再把焦点定位回到vim上面来。这就丧失了vim最大的优势了，反而搞的很麻烦。</p>
            <p>当然你可以用Alt+Tab键来切换窗口，不必动用鼠标。但遗憾的是Windows操作系统的窗口切换能力很差，一旦你的windows开的窗口多了，在窗口之间快捷切换是一件很麻烦的事情，还不如鼠标来得快捷。这一点Windows比MacOS有很大的差距。MacOS上面进行多窗口切换那才叫一个爽字呢！</p>
            <p>最后我认为轻量级IDE在windows平台的市场不会很大，即使E的功能能够完善到TextMate的程度，也不会有radrails那么普及。主要还是和操作系统的支持有关系：</p>
            <p>在MacOS上面，你开一个Textmate窗口，一个浏览器窗口，一个tail log窗口，一个命令窗口启动关闭服务器，一个命令窗口进行console调试，一个命令窗口执行单元测试，还有一个命令窗口连接MySQL数据库看数据。在这些窗口之间仅仅使用快捷键进行来回切换是很方便很快捷的事情。</p>
            <p>但是Windows的窗口切换功能太弱了，一下开了七个窗口，你编程的时候来回切换的工作效率是很低的。所以在Windows上面要提高工作效率就会倾向于radrails这样的IDE，把所有功能都集成进来了，只要一个radrails窗口，一个浏览器窗口足矣了。这样工作效率才高。</p>
            <p>最后值得一提的是，所有这些IDE的rhtml编辑功能还是不如textmate，一旦在html标签里面嵌入代码段，就不能高亮了。而textmate是不会这样的。</p>
            </td>
        </tr>
    </tbody>
</table>
<br />
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72839#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:41:15 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72839</link>
        <guid>http://simon-lin.javaeye.com/blog/72839</guid>
      </item>
      <item>
        <title>关于ruby mysql库安装的问题. </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72838" style="color:red;">http://simon-lin.javaeye.com/blog/72838</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>关于ruby mysql库安装的问题. </p>
<p>环境:Win XPSP2,ruby 1.8.6,mysql-ruby-2.7.3.tar.gz <br />
安装时执行下面两个命令: <br />
ruby extconf.rb <br />
ruby extconf.rb --with-mysql-dir=D:/MySQL5 --with-mysql-include=D:/MySQL5/include --with-mysql-lib=D:/MySQL5/lib <br />
皆报错误(mysql安装目录为D:/MySQL5): <br />
checking for main() in libmysql.lib... no <br />
*** extconf.rb failed *** <br />
Could not create Makefile due to some reason, probably lack of <br />
necessary libraries and/or headers. Check the mkmf.log file for more <br />
details. You may need configuration options. <br />
打开mkmf.log文件,里面的内容如下: <br />
have_library: checking for main() in libmysql.lib... -------------------- no </p>
<p>&quot;cl -nologo -Feconftest -I. -ID:/ruby/lib/ruby/1.8/i386-mswin32 -I. -ID:/ruby/lib/ruby/1.8/i386-mswin32 -ID:/MySQL5/include -ID:/MySQL5/include -MD -Zi -O2b2xg- -G6 conftest.c msvcrt-ruby18-static.lib libmysql.lib oldnames.lib user32.lib advapi32.lib ws2_32.lib -link -libpath:&quot;D:/ruby/lib&quot; -libpath:&quot;D:/MySQL5/lib&quot; -stack:0x2000000&quot; <br />
checked program was: <br />
/* begin */ <br />
1: #define WIN32_LEAN_AND_MEAN <br />
2: #include &lt;winsock2.h&gt; <br />
3: #include &lt;windows.h&gt; <br />
4: <br />
5: /*top*/ <br />
6: int main() { return 0; } <br />
7: int t() { void ((*volatile p)()); p = (void ((*)()))main; return 0; } <br />
/* end */ </p>
<p>&quot;cl -nologo -Feconftest -I. -ID:/ruby/lib/ruby/1.8/i386-mswin32 -I. -ID:/ruby/lib/ruby/1.8/i386-mswin32 -ID:/MySQL5/include -ID:/MySQL5/include -MD -Zi -O2b2xg- -G6 conftest.c msvcrt-ruby18-static.lib libmysql.lib oldnames.lib user32.lib advapi32.lib ws2_32.lib -link -libpath:&quot;D:/ruby/lib&quot; -libpath:&quot;D:/MySQL5/lib&quot; -stack:0x2000000&quot; <br />
checked program was: <br />
/* begin */ <br />
1: /*top*/ <br />
2: int main() { return 0; } <br />
3: int t() { main(); return 0; } <br />
/* end */ </p>
<p>有哪位遇到过吗,望!</p>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72838#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:38:00 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72838</link>
        <guid>http://simon-lin.javaeye.com/blog/72838</guid>
      </item>
      <item>
        <title>关于ruby mysql库安装的问题. </title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72837" style="color:red;">http://simon-lin.javaeye.com/blog/72837</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table width="100%">
    <tbody>
        <tr>
            <td>
            <p>安装: <br />
            </p>
            <div class="code_title">代码</div>
            <div class="code_div">
            <div class="dp-highlighter">
            <ol class="dp-j">
                <li class="alt"><span><span>gem&nbsp;i&nbsp;ruport&nbsp;-y&nbsp;&nbsp;</span></span></li>
            </ol>
            </div>
            </div>
            <script>render_code();</script><br />
            官方博客: <br />
            <a href="http://blog.rubyreports.org/" target="blank">http://blog.rubyreports.org/</a> <br />
            附件说明: <br />
            运行pdf_test目录下的centered_pdf_text_box.rb文件，就会生成一个pdf文件.
            <p>&nbsp;</p>
            </td>
        </tr>
    </tbody>
</table>
<div style="PADDING-RIGHT: 10px; BORDER-TOP: gray 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; MARGIN: 15px 0px 0px 10px; PADDING-TOP: 10px">
<table class="attach" cellspacing="0" border="1" align="center" width="95%" cellpadding="2">
    <tbody>
        <tr>
            <td class="attachrow" align="center" colspan="3" width="100%" style="BACKGROUND: #d1d7dc"><strong><span class="gen">pdf_test.zip</span></strong></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;描述:</span></td>
            <td class="attachrow" width="75%">&nbsp;生成pdf的测试 </td>
            <td class="attachrow" rowspan="4" align="center" width="10%"><img src="http://www.javaeye.com/images/forum/icon_clip.gif" border="0" alt="" /><br />
            <a href="http://www.javaeye.com/topics/download/a6f33886-22a5-46c9-a1ad-eb5947517d23"><strong>下载</strong></a> </td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件名:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;pdf_test.zip</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;文件大小:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;19 KB</span></td>
        </tr>
        <tr>
            <td class="attachrow" width="15%"><span class="genmed">&nbsp;下载过的:</span></td>
            <td class="attachrow" width="75%"><span class="genmed">&nbsp;文件被下载或查看 19 次</span></td>
        </tr>
    </tbody>
</table>
</div>
<br />
<br />
<br />
<br />
<br />
<br />
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72837#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:34:39 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72837</link>
        <guid>http://simon-lin.javaeye.com/blog/72837</guid>
      </item>
      <item>
        <title>Ruby on Rails 和 J2EE：两者能否共存？</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72830" style="color:red;">http://simon-lin.javaeye.com/blog/72830</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><font size="4" color="#18188c"><strong>Ruby&nbsp;on&nbsp;Rails&nbsp;和&nbsp;J2EE：两者能否共存？</strong></font></td>
        </tr>
        <tr>
            <td>
            <p>Ruby on Rails 是一个 Web 应用程序框架，它的目标是为应用程序开发提供一条易行道。实际上，框架的支持者们声称 Ruby on Rails 开发人员的生产率最多是使用传统 J2EE 框架的 10 倍。（请阅读&ldquo;Rolling with Ruby on Rails&rdquo;一文，以获得关于这一声明的更多内容；请参阅 <a href="http://www.advjava.com/j2ee/001/311.html#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</a>）。虽然这句话造成了 Rails 和 J2EE 社区相当大的争议，但争论中却很少谈及如何比较 Rails 和 J2EE 架构。本文将使用企业应用程序中常见的开源工具，对 Rails 框架和典型的 J2EE 实现进行比较。</p>
            <p><a name="1"><span class="atitle2">什么是 Ruby on Rails？</span></a><br />
            要想找到用一句话描述 Rails 的简单说明，只需查看项目的 <a href="http://www.rubyonrails.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_new">主页</a> 即可：</p>
            <blockquote xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Rails 是一个用 Ruby 编写的全栈的（full-stack）、开源的 Web 框架，可以使用它来轻松编写实际的应用程序，所需的代码也要比大多数框架花在处理 XML 上的代码少。 </blockquote>
            <p>虽然我不能保证框架确实会提供它所承诺的轻松快乐，但是上面这句话确实很好地总结了 Rails 的品质。全栈包括：Web 服务器、处理 HTTP 请求和响应的框架，以及方便地把数据持久存储到关系数据库的框架。Rails 通过消除复杂的 XML 配置文件，使用 Ruby 语言的动态性质，帮助把静态类型语言中常见的许多重复代码减少到最少，努力使开发工作变得更容易。</p>
            <p><a name="1.1"><span class="atitle3">Rails 和典型的 J2EE Web 堆栈</span></a><br />
            图 1 比较了 Rails 堆栈和典型的 J2EE Web 堆栈（包括 Tomcat servlet 容器、Struts Web 应用程序框架和 Hibernate 持久性框架）。</p>
            <p><a name="figure1"><strong>图 1. Rails 和 J2EE 堆栈的比较 </strong></a><br />
            <img src="http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/stack.jpg" onclick="javascript:window.open(this.src);" onload="javascript:if(this.width&gt;500){this.resized=true;this.style.width=500;}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" resized="true" alt="" style="WIDTH: 500px; CURSOR: pointer" width="599" /> </p>
            <p>可以看到，Rails 堆栈和构成普通的基于 J2EE 的 Web 应用程序的组件之间的基本区别很小。两者都有用来执行应用程序代码的容器；都有帮助分离应用程序的模型、视图和控件的 MVC 框架；以及持久存储数据的机制。</p>
            <p>
            <table cellspacing="0" border="1" align="right" width="45%" cellpadding="5">
                <tbody>
                    <tr>
                        <td background="/developerworks/cn/i/bg-gold.gif">
                        <p><a name="sidebar1"><strong>MVC 框架</strong></a><br />
                        模型-视图-控制器（MVC）是应用时间相当长、应用面相当广的一个设计模式。它源自 Smalltalk；如今，几乎所有的 GUI 框架，包括 Web 和胖客户端，都以该框架为基础。MVC 有三个部分：<em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">模型</em>，负责业务逻辑，包括应用程序状态和将在这个状态上执行的动作；<em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">视图</em>，用来渲染和向用户呈现模型（在 Web 应用程序中，视图一般渲染为 HTML）；<em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">控制器</em>，定义应用程序的行为。有关 MVC 模式的详细解释，请参阅 <a href="http://www.advjava.com/j2ee/001/311.html#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</a>。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p><a name="1.2"><span class="atitle3">前端控制器</span></a><br />
            Struts 的 <code>ActionServlet</code> 和 Rails 的 <code>DispatchServlet</code> 都是前端控制器模式的例子；所以，它们提供了相同的功能。它们接受 HTTP 请求，解析 URL，把请求的处理转发给适当的动作。在 Struts 中，动作是扩展自 <code>Action</code> 的类；对于 Rails，动作是扩展自 <code>ActionController</code> 的类。两个前端控制器之间的主要区别是它们如何决定处理具体请求的动作。</p>
            <p>使用 Struts，开发人员需要把特定请求的映射外部化到 XML 配置文件中的 <code>Action</code> 类。当首次装入 <code>ActionServlet</code> 时，它将解析这个文件，并准备接受请求。根据约定，以 <code>.do</code> 结束的请求被重定向到 <code>ActionServlet</code>，由 ActionServlet 分派到适当的 <code>Action</code>。<a href="http://www.advjava.com/j2ee/001/311.html#figure2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 2</a> 的 XML 是一个典型的映射。它告诉 <code>ActionServlet</code> 把叫作 <code>deleteOrder.do</code> 的请求转发到 <code>controllers.order.DeleteOrderAction</code> 作进一步处理。</p>
            <p>Rails 采用了不同的方式。它没有依赖配置文件把请求映射到某一个动作，而是根据请求的 URL 发现适当的动作。从图 2 可以看到，URL <code>http://localhost/order/delete/4</code> 告诉 Rails 调用 <code>OrderController</code> 实例上的 <code>delete</code> 方法，并将 <code>4</code> 作为可用的实例变量。Rails 足够聪明，知道 <code>/order</code> 将映射到文件 order_controller.rb 中定义的一个控制器类。如果在控制器中定义了 <code>find</code> 方法，那么只要用 <code>find</code> 替代 URL 中的 <code>delete</code>，就可以调用这个方法。</p>
            <p><a name="figure2"><strong>图 2. Rails 和 Struts 中的 URL 映射 </strong></a><br />
            <img src="http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/mappings.jpg" onclick="javascript:window.open(this.src);" onload="javascript:if(this.width&gt;500){this.resized=true;this.style.width=500;}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" resized="true" alt="" style="WIDTH: 500px; CURSOR: pointer" width="600" /> </p>
            <p><a name="1.3"><span class="atitle3">动作和模型</span></a><br />
            在 Rails 和 Struts 中，动作用来充当前端控制器和模型之间的桥梁。开发人员提供动作的现实，从而提供特定于应用程序的请求处理。前端控制器负责接受请求，并把请求传递到特定动作。图 3 演示了 Rails 和 Struts 基本的动作层次结构。</p>
            <p><a name="figure3"><strong>图 3. Rails 和 Struts 的动作层次结构</strong></a><br />
            <img src="http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/actions.jpg" onclick="javascript:window.open(this.src);" onload="javascript:if(this.width&gt;500){this.resized=true;this.style.width=500;}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" resized="true" alt="" style="WIDTH: 500px; CURSOR: pointer" width="600" /> </p>
            <p>
            <table cellspacing="0" border="1" align="right" width="45%" cellpadding="5">
                <tbody>
                    <tr>
                        <td background="/developerworks/cn/i/bg-gold.gif">
                        <p><a name="sidebar2"><strong>动作是模型还是控制器？</strong></a><br />
                        <code>Action</code> 和 <code>ActionController</code> 从技术上讲是 MVC 模式的控制器的一部分，因为它们对客户发起的事件进行响应。但是，在小型应用程序中，开发人员通常在这些类中对域或业务逻辑进行编码，所以在这些情况下，也可以把它们看作是模型的一部分。最佳实践建议：应当把域逻辑从控制器中抽象出来，放置在它自己的特定于域的类中。</p>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>Struts 要求开发人员扩展 <code>Action</code> 并覆盖 <code>execute()</code>，以处理请求。通常，每个 <code>Action</code> 类都提供了非常具体的工作单元。<a href="http://www.advjava.com/j2ee/001/311.html#figure3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 3</a> 演示了三个特定动作：<code>SaveOrderAction</code>、<code>DeleteOrderAction</code> 和 <code>ListOrdersAction</code>。前端控制器将调用 <code>execute()</code> 方法，传递给它许多有用的对象，其中包括 HTTP 请求和响应对象。<code>ActionForm</code> 是一个类，它可以方便地向视图来回传输并验证与表单有关的输入，<code>ActionMapping</code> 包含映射的配置信息，就像 <a href="http://www.advjava.com/j2ee/001/311.html#figure2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 2</a> 的 XML 所描述的那样。</p>
            <p><code>execute()</code> 方法返回 <code>ActionForward</code> 对象，Struts 用这个对象来确定对请求继续进行处理的组件。一般来说，这个组件是一个 JSP 页面，但是 <code>ActionForward</code> 也能指向其他动作。开发人员必须清楚，Struts 创建的是 <code>Action</code> 的单一实例，并允许多个线程调用它的 <code>execute()</code>。这使请求处理变得更快，因为框架处理每个请求时不用频繁地创建新的 <code>Action</code> 实例。但是因为可以在多个线程之间共享单一对象，所以必须遵守适当的线程注意事项，因为其他线程可能会破坏在这个动作中保持状态的实例变量。</p>
            <p>在 Rails 中，必须扩展 <code>ActionController::Base</code>，让模型参与到请求处理中。Rails 没有将 <code>ActionController</code> 的实例池化；相反，它为每个请求创建新的实例。虽然这对性能可能有负面影响，但是它可以让开发变得更容易。开发人员不需要关注 Struts 中存在的线程问题，因此，会话、请求、标题和参数都可以作为 <code>ActionController</code> 的实例成员来进行访问。<code>ActionController</code> 还是一个将特定域逻辑的所有处理组合在一起的合理场所。Struts 的 <code>Action</code> 类是细粒度的，它提供了非常具体的工作单元，而 Rails <code>ActionController</code> 则是粗粒度的，它将具体的工作单元模拟为一些方法。</p>
            <p><a href="http://www.advjava.com/j2ee/001/listing1.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_new">清单 1</a> 和 <a href="http://www.advjava.com/j2ee/001/listing2.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_new">清单 2</a> 分别演示了典型的 Struts 动作和典型的 Rails 动作</p>
            <p>表 1 提供了对两种方法的逻辑流程的比较，并演示了清单 <a href="http://www.advjava.com/j2ee/001/listing1.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_new">1</a> 和清单 <a href="http://www.advjava.com/j2ee/001/listing2.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_new">2</a> 的特定行中发生的事情。研究 <code>DeleteOrderAction</code> 的 <code>execute()</code> 方法和 <code>OrderController</code> 的 <code>delete</code> 方法，可以看出它们基本上是相同的。</p>
            <a name="table1"><strong>表 1. execute() 和 delete 方法比较</strong></a><br />
            <table cellspacing="1" border="1" width="80%" cellpadding="3">
                <tbody>
                    <tr align="center" valign="top">
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">步骤</strong></td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Struts</strong></td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Rails</strong></td>
                    </tr>
                    <tr>
                        <td>框架调用动作</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 03：</strong> <code>execute()</code></td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 07：</strong> <code>delete</code></td>
                    </tr>
                    <tr>
                        <td>从请求中检索到的 ID </td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 06-07：</strong>从请求对象中取出</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 08：</strong>从所有参数的实例哈希中取出</td>
                    </tr>
                    <tr>
                        <td>从数据库删除订单记录</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 09、14-24：</strong>调用 <code>delete()</code> 方法，用 Hibernate 删除记录</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 09：</strong>用 ActiveRecord 删除记录</td>
                    </tr>
                    <tr>
                        <td>重定向到列出剩余订单</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 11：</strong>用 <code>ActionMapping</code> 对象查找将要转发处理的下一个组件。<a href="http://www.advjava.com/j2ee/001/311.html#figure2" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 2</a> 中的 XML 映射显示，<code>success</code> 将映射到 <code>/listOrders</code>，这是另一个 <code>Action</code>，负责查找剩余订单，并以 JSP 的形式呈现它们</td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">行 10：</strong>用将调用的下一动作的哈希来调用 <code>redirect_to</code> 方法；在这种情况下，它只是调用同一控制器的 <code>list</code> 方法</td>
                    </tr>
                </tbody>
            </table>
            <p><a name="2"><span class="atitle2">持久性框架</span></a><br />
            <em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">持久性框架</em> 用来在应用程序层和数据库之间来回移动数据。Hibernate 和 Rails 的持久性框架可以归类为对象/关系映射（ORM）工具，这意味着它们接受数据的对象视图，并将该视图映射到关系数据库内的表中。使用两种框架的目的都是为了减少与关系数据库有关的开发时间。但是，<a href="http://www.advjava.com/j2ee/001/311.html#figure4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">图 4</a> 演示了两者在设计和配置上的一些根本区别。 </p>
            <p><a name="figure4"><strong>图 4. Active Record 和 Hibernate 持久性框架的比较 </strong></a><br />
            <img src="http://www.ibm.com/developerworks/cn/java/wa-rubyonrails/persistence.jpg" onclick="javascript:window.open(this.src);" onload="javascript:if(this.width&gt;500){this.resized=true;this.style.width=500;}" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" resized="true" alt="" style="WIDTH: 500px; CURSOR: pointer" width="600" /> </p>
            <p><a name="2.1"><span class="atitle3">Hibernate</span></a><br />
            Hibernate 基于 Data Mapper 模式，在这种模式中，特定的映射器类 <code>Session</code> 负责在数据库中持久存储和检索数据。Hibernate 可以持久存储任何 Java 对象，只要这个对象符合 JavaBean 规范。XML 映射文件描述了如何将类映射到数据库中具体的表，并描述了类与其他类的关系。</p>
            <p><a href="http://www.advjava.com/j2ee/001/311.html#listing3" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">清单 3</a> 显示了 Hibernate 映射文件的一个实例。<code>class</code> 标签把 <code>Order</code> 对象映射到 <code>ORDERS</code> 表，还有许多子标签用于描述其属性、ID 订单名称，以及同 <code>models.Item</code> 的一对多关系。<a href="http://www.advjava.com/j2ee/001/311.html#listing4" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">清单 4</a> 显示了 <code>Order</code> 类本身。</p>
            <a name="listing3"><strong>清单 3. Order.hbm.xml</strong></a><br />
            <table cellspacing="0" border="1" bgcolor="#cccccc" width="100%" cellpadding="5">
                <tbody>
                    <tr>
                        <td>
                        <pre><code>

...
01 &lt;hibernate-mapping&gt;
02    &lt;class name=&quot;models.Order&quot; table=&quot;ORDERS&quot;
03        dynamic-update=&quot;true&quot; dynamic-insert=&quot;false&quot;
04        discriminator-value=&quot;null&quot;&gt;
05
06 	&lt;id name=&quot;id&quot; column=&quot;id&quot; type=&quot;java.lang.Long&quot; 
07             unsaved-value=&quot;null&quot;&gt;
08             &lt;generator class=&quot;identity&quot;/&gt;
09         &lt;/id&gt;
10 
11         &lt;set name=&quot;items&quot; lazy=&quot;false&quot; inverse=&quot;false&quot;
12            cascade=&quot;none&quot; sort=&quot;unsorted&quot;&gt;
13             &lt;key column=&quot;id&quot;/&gt;
14             &lt;one-to-many class=&quot;models.Item&quot;/&gt;
15         &lt;/set&gt;
16 
17         &lt;property name=&quot;name&quot; type=&quot;java.lang.String&quot;
18             update=&quot;true&quot; insert=&quot;true&quot;
19             access=&quot;property&quot; column=&quot;name&quot;/&gt;
20     &lt;/class&gt;
21 &lt;/hibernate-mapping&gt;
</code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <a name="listing4"><strong>清单 4. Order.java</strong></a><br />
            <table cellspacing="0" border="1" bgcolor="#cccccc" width="100%" cellpadding="5">
                <tbody>
                    <tr>
                        <td>
                        <pre><code>

01 public class Order {
02    private Set items;
03     private String name;
04     private Long id;
05 
06     public Long getId() { return id;}
07 
08     public void setId(Long id) { this.id = id;}
09 	
10     public Set getItems() { return items;}
11 	
12     public void setItems(Set items) { this.items = items; }
13 	
14     public String getName() { return name; }
15 
16     public void setName(String name) { this.name = name; }
17 }
</code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p><a name="2.2"><span class="atitle3">Active Record</span></a><br />
            </p>
            <p>
            <table cellspacing="0" border="1" align="right" width="45%" cellpadding="5">
                <tbody>
                    <tr>
                        <td background="/developerworks/cn/i/bg-gold.gif">
                        <p><a name="sidebar3"><strong>反射和元编程</strong></a><br />
                        Wikipedia 中（请参阅 <a href="http://www.advjava.com/j2ee/001/311.html#resources" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资料</a>）简要地把 <em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">反射</em> 定义为&ldquo;程序在运行的时候检查和修改其高级结构的能力&rdquo;。在那里，还将 <em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">元编程</em> 定义为&ldquo;编写那些能够编写和操作其他其他程序（或它们自己），将其他程序作为自己的数据的程序，或者编写那些完成其他程序在运行时所做的部分工作的程序。&rdquo;</p>
                        <p>以下代码将实现反射：</p>
                        <table cellspacing="0" border="1" bgcolor="#cccccc" width="100%" cellpadding="5">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>
01 obj = &quot;some_string&quot;
02 if obj.respond_to?('length'):
03   puts &quot;obj length = #{obj.length}&quot; 
03 end
&gt;&gt; obj length = 5
</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        <p>这个代码将实现元编程：</p>
                        <table cellspacing="0" border="1" bgcolor="#cccccc" width="100%" cellpadding="5">
                            <tbody>
                                <tr>
                                    <td>
                                    <pre><code>
01 class SomeClass
02 end
03 newMethod = %q{def msg() puts &quot;A message!&quot; end}
04 SomeClass.class_eval(newMethod)
05 aClass = SomeClass.new
06 aClass.msg
&gt;&gt; A message!
</code></pre>
                                    </td>
                                </tr>
                            </tbody>
                        </table>
                        </td>
                    </tr>
                </tbody>
            </table>
            </p>
            <p>Rails 的 ORM 框架叫作 <em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Active Record</em>，它基于同名的设计模式。Martin Fowler 将 Active Record 描述为&ldquo;包装数据库表或视图中数据行的对象，封装数据库访问，在数据上添加域逻辑&rdquo;。在 Rails 中，每个域对象都将扩展提供 CRUD 操作的 <code>ActiveRecord::Base</code>。</p>
            <p>与 Hibernate 一样，Active Record 不需要映射文件；实际上，使用 Active Record 的开发人员不需要对 getter 或 setter、甚至类的属性进行编码。通过一些漂亮的词汇分析，Active Record 能够判断出，<code>Order</code> 类将映射到数据库中的 <code>ORDERS</code> 表。使用 Ruby 反射和元编程的组合，表的列可以变成对象的属性。访问器和调整器也添加了进来。</p>
            <p><a href="http://www.advjava.com/j2ee/001/311.html#listing5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">清单 5</a> 显示了 <code>Order</code> 类的完成后的代码。在 <code>Order</code> 类体中有一行代码定义了它与 <code>Item</code> 对象的关系。<code>has_many</code> 是一个静态方法调用，符号 <code>:items</code> 是它的参数。ActiveRecord 用 <code>:items</code> 发现 <code>Item</code> 域对象，然后将这个 <code>Item</code> 对象映射回数据库中的 <code>ITEMS</code> 表。</p>
            <a name="listing5"><strong>清单 5. order.rb</strong></a><br />
            <table cellspacing="0" border="1" bgcolor="#cccccc" width="40%" cellpadding="5">
                <tbody>
                    <tr>
                        <td>
                        <pre><code>

01 class Order &lt; ActiveRecord::Base
02	has_many :items
03 end
</code></pre>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p>像 <a href="http://www.advjava.com/j2ee/001/311.html#listing5" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">清单 5</a> 那样编码的 <code>Order</code> 类在运行时提供了一些类和实例方法。表 2 提供了可在 <code>Order</code> 上使用的操作和属性的部分列表： </p>
            <a name="table2"><strong>表 2. 在 Order 上可用的属性和操作</strong></a><br />
            <table cellspacing="1" border="1" width="80%" cellpadding="3">
                <tbody>
                    <tr align="center" valign="top">
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">类方法</strong></td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">实例方法</strong></td>
                        <td><strong xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">属性</strong></td>
                    </tr>
                    <tr valign="top">
                        <td>
                        <ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <li><code>find(*args)</code> </li>
                            <li><code>find_by_sql(sql)</code> </li>
                            <li><code>exists?(id)</code> </li>
                            <li><code>create(attributes)</code> </li>
                            <li><code>update(id, attributes)</code> </li>
                            <li><code>update_all(updates, conditions</code> </li>
                            <li><code>delete(id)</code> </li>
                            <li><code>delete_all(conditions)</code> </li>
                            <li>... </li>
                        </ul>
                        </td>
                        <td>
                        <ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <li><code>add_items</code> </li>
                            <li><code>build_to_items</code> </li>
                            <li><code>create_in_items</code> </li>
                            <li><code>find_all_in_items</code> </li>
                            <li><code>find_in_items</code> </li>
                            <li><code>has_items?</code> </li>
                            <li><code>items</code> </li>
                            <li><code>items=</code> </li>
                            <li><code>items_count</code> </li>
                            <li><code>remove_items</code> </li>
                        </ul>
                        </td>
                        <td>
                        <ul xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
                            <li><code>id</code> </li>
                            <li><code>name</code> </li>
                        </ul>
                        </td>
                    </tr>
                </tbody>
            </table>
            <p><a name="3"><span class="atitle2">结束语</span></a><br />
            虽然 Ruby on Rails 是一个非常新、令人兴奋的框架，并且在 Web 社区中已经引起了人们相当的兴趣，但是它的核心架构仍然遵循在 J2EE 中发现的基本模式。开发把两个框架分开的 Web 应用程序是一种合理的方法。Rails 更喜欢清楚的代码而不是配置文件，而 Ruby 语言的动态性质在运行时生成了大部分<em xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">管道</em> 代码。大多数 Rails 框架都是作为独立项目创建的，而且应用程序开发能够从一组同类组件受益。相比之下，典型的 J2EE 堆栈倾向于构建在通常独立开发的最好的组件之上，常常用 XML 进行配置并将组件组合在一起。</p>
            <p>那么，是否应该考虑对下一个 Web 应用程序使用 Rails 呢？嗯，为什么不呢？它是编写得很好的组件堆栈，它们彼此之间工作得很好，并且基于行业接受的企业模式。Ruby 语言支持快速开发，并通过生产大多数应用程序管道来添加到框架。熟悉 Java 世界中的 MVC 和 ORM 框架的人们在用 Rails 表达自己的思想时没有任何困难。</p>
            <p>与 J2EE 一起分发会不会有利于 Rails？绝对不要。J2EE 是一个已经设置好的标准，有许多固定的实现，而且，最重要的是，它是一个经过验证的技术。我建议您下载一份 Rails 的副本，并开始自己钻研它。许多可用的教程都是介绍性的，这些教程可以让您立即开始使用 Rails。再次声明，我并不能保证您会通过使用 Rails 得到快乐，但是我敢打赌您会感到满意。</p>
            <p><a name="resources"><span class="atitle2">参考资料 </span></a></p>
            <ul>
                <li>您可以参阅本文在 developerWorks 全球站点上的 <a href="http://www-128.ibm.com/developerworks/web/library/wa-rubyonrails/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" target="_blank">英文原文</a>。<br />
                <br />
                </li>
                <li>请参阅 <a href="http://www.rubyonrails.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Ruby on Rails Web site</a>。<br />
                <br />
                </li>
                <li>从 <a href="http://www.ruby-lang.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">ruby-lang.org</a> 得到关于 Ruby 的您需要了解的最新信息。<br />
                <br />
                </li>
                <li>发现更多关于 <a href="http://struts.apache.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Struts</a> 和 <a href="http://jakarta.apache.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Jakarta project</a> 的信息。<br />
                <br />
                </li>
                <li>学习更多关于 <a href="http://www.hibernate.org/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Hibernate</a> 的知识。<br />
                <br />
                </li>
                <li>从 Curt Hibbs 撰写的&ldquo;<a href="http://www.onlamp.com/pub/a/onlamp/2005/01/20/rails.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Rolling with Ruby on Rails</a>&rdquo;（ONLamp.com，2005 年 1 月）得到一份关于创建 Rails 应用程序的好的介绍。<br />
                <br />
                </li>
                <li>在 Sun 的 <a href="http://java.sun.com/reference/blueprints/index.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Blueprints</a> 目录中寻找 <a href="http://java.sun.com/blueprints/patterns/MVC-detailed.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Model-View-Controller</a> 和 <a href="http://java.sun.com/blueprints/corej2eepatterns/Patterns/FrontController.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Front Controller</a> 模式的简要解释说明。<br />
                <br />
                </li>
                <li>在 <a href="http://www.martinfowler.com/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Martin Fowler's Web site</a> 上了解对 <a href="http://www.martinfowler.com/eaaCatalog/activeRecord.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Active Record</a> 和 <a href="http://www.martinfowler.com/eaaCatalog/dataMapper.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Data Mapper</a> 模式精简后的解释。<br />
                <br />
                </li>
                <li>掌握 <a href="http://www.ibm.com/developerworks/web/library/l-rubyrails/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Fast-track your Web apps with Ruby on Rails</a>，这样就可以用这个基于 Ruby 的框架和它的模型-视图-控制器设计模式来迅速构建和定制应用程序（developerWorks，2005 年 6 月）。<br />
                <br />
                </li>
                <li>从 <a href="http://www.ibm.com/developerworks/web/library/l-ruby1.html" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Programming in the Ruby language</a>（developerWorks, 2001 年 7 月）开始研究 Ruby 和它的变量、引用、数组、对象和方法。<br />
                <br />
                </li>
                <li>在 <a href="http://www.advjava.com/developerworks/cn/java/j-struts/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Struts，MVC 的一种开放源码实现</a> 中研究 Struts 如何帮助控制 Web 项目中的变化，并提高您的专长（developerWorks，2001 年 2 月）。<br />
                <br />
                </li>
                <li>在 <a href="http://www.ibm.com/developerworks/web/library/j-hibern/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Object-relation mapping without the container</a> 中，学习结合使用 Hibernate 和 Spring，为企业应用程序构建事务性的持久存储层（developerWorks，2004 年 4 月）。<br />
                <br />
                </li>
                <li>请参 Wikipedia 的关于 <a href="http://en.wikipedia.org/wiki/Reflection_%28computer_science%29" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">reflection</a> 和 <a href="http://en.wikipedia.org/wiki/Metaprogramming_%28programming%29" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">metaprogramming</a> 定义。<br />
                <br />
                </li>
                <li>请参阅 developerWorks <a href="http://www.ibm.com/developerworks/web/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Web Architecture</a> 专区，获得介绍各种基于 Web 的解决方案的文章。<br />
                <br />
                </li>
                <li>通过参与 <a href="http://www.ibm.com/developerworks/blogs/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">developerWorks blogs</a> 加入 developerWorks 社区。<br />
                </li>
            </ul>
            </td>
        </tr>
    </tbody>
</table>
          <br/>
          <span style="color:red;">
            <a href="http://simon-lin.javaeye.com/blog/72830#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 20 Apr 2007 13:07:26 +0800</pubDate>
        <link>http://simon-lin.javaeye.com/blog/72830</link>
        <guid>http://simon-lin.javaeye.com/blog/72830</guid>
      </item>
      <item>
        <title>XSLT相关</title>
        <author>simon_lin</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://simon-lin.javaeye.com">simon_lin</a>&nbsp;
          链接：<a href="http://simon-lin.javaeye.com/blog/72829" style="color:red;">http://simon-lin.javaeye.com/blog/72829</a>&nbsp;
          发表时间: 2007年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <table cellspacing="0" border="0" width="100%" cellpadding="5">
    <tbody>
        <tr>
            <td><font size="4" color="#18188c"><strong></strong></font></td>
        </tr>
        <tr>
            <td>中国的文学界提出过这样的概念：作者意图，文本意图，读者意图。......作为一个规范，也是如此。这里只是奉上我的&ldquo;读者意图&rdquo;，如有和&ldquo;作者意图&rdquo; 或&ldquo;文本意图&rdquo;相冲突的，诚肯大家指正。本人只是当作为一个提高英语翻译水平的锻炼，再者，本人有一个习惯，就是E文虽然看得懂，可就是看了就忘，可能是本人的记忆介质还只是中文的缘故吧，这里也算是帮助自已尽量记住一些东西吧： <br />
            <br />
            Abstract <br />
            This specification defines the syntax and semantics of XSLT, which is a language for transforming XML documents into other XML documents. <br />
            摘要 <br />
            本规范定义了XSLT的语法和语义，XSLT是一种用于将一个XML文档转换成另一个XML文档的语言。 <br />
            <br />
            XSLT is designed for use as part of XSL, which is a stylesheet language for XML. In addition to XSLT, XSL includes an XML vocabulary for specifying formatting. XSL specifies the styling of an XML document by using XSLT to describe how the document is transformed into another XML document that uses the formatting vocabulary. <br />
            XSLT被设计成可供XSL使用的一部分，它作为XML的一种样式单语言。除XSLT外，XSL还包含了一套XML形式的格式化词汇表。XSL使用 XSLT来描述一个文档如何转化为另一个目标文档，该目标文档使用XSL所提供的格式化词汇表来描述其格式，这样XSL就能指定一个XML文档所具有的格式。 <br />
            <br />
            XSLT is also designed to be used independently of XSL. However, XSLT is not intended as a completely general-purpose XML transformation language. Rather it is designed primarily for the kinds of transformations that are needed when XSLT is used as part of XSL. <br />
            XSLT还设计成可独立于XSL而被使用。然而，XSLT并不打算设计成作为一个具有完全通用意图的XML转换语言。确切的说，它最初只是设计成处理XSL所需要的那一类转换，作为XSL的一部分而被使用。 <br />
            <br />
            1 Introduction <br />
            XSLT namespace：&ldquo;XSLT命名空间&rdquo; <br />
            Thus this specification is a definition of the syntax and semantics of the XSLT namespace。 A transformation in the XSLT language is expressed as a well-formed XML document [XML] conforming to the Namespaces in XML Recommendation [XML Names], which may include both elements that are defined by XSLT and elements that are not defined by XSLT. XSLT-defined elements are distinguished by belonging to a specific XML namespace (see [2.1 XSLT Namespace]), which is referred to in this specification as the XSLT namespace. Thus this specification is a definition of the syntax and semantics of the XSLT namespace. <br />
            本文档定义了&ldquo;XSLT命名空间&rdquo;的语法和语义。XSLT语言中的转换被表述成结构良好的XML文档，所以遵循XML标准中的命名空间，有可能同时既包含 XSLT中定义的元素和XSLT中没有定义的。XSLT中定义的元素可以很容易地区分出来，因为它们都属于一个特定的XML命名空间（参见 [2.1 XSLT Namespace]），在本规范中被称作XSLT命名空间。因些本规范是一个XSLT命名空间的语法和语义的定义。 <br />
            <br />
            A transformation expressed in XSLT describes rules for transforming a source tree into a result tree.The transformation is achieved by associating patterns with templates. A pattern is matched against elements in the source tree. A template is instantiated to create part of the result tree. The result tree is separate from the source tree. The structure of the result tree can be completely different from the structure of the source tree. In constructing the result tree, elements from the source tree can be filtered and reordered, and arbitrary structure can be added. <br />
            用XSLT表述的转换描述的是从&ldquo;源树&rdquo;到&ldquo;结果树&rdquo;的转换规则。通过将模式（patterns）与模板（templates）相结合来达到转换的目的。模式（pattern）用于匹配&ldquo;源树&rdquo;中的元素。实例化的模板（template）用于构造出&ldquo;结果树&rdquo;的某个部分。&ldquo;结果树&rdquo;与&ldquo;源树&rdquo;是相分离的。 &ldquo;结果树&rdquo;的结构可以完全不同&ldquo;源树&rdquo;的结构。在构造&ldquo;结果树&rdquo;的过程中，来自于&ldquo;源树&rdquo;的元素可以被任意地过滤、重组，以及添加任何的结构。 <br />
            <br />
            A transformation expressed in XSLT is called a stylesheet. This is because, in the case when XSLT is transforming into the XSL formatting vocabulary, the transformation functions as a stylesheet. <br />
            用XSLT表述的转换被称作样式单（stylesheet）。这是因为，当XSLT用作&ldquo;转化为XSL格式&rdquo;意义的词汇时，转化起到了样式单（stylesheet）的作用。 <br />
            <br />
            This document does not specify how an XSLT stylesheet is associated with an XML document. It is recommended that XSL processors support the mechanism described in [XML Stylesheet]. When this or any other mechanism yields a sequence of more than one XSLT stylesheet to be applied simultaneously to a XML document, then the effect should be the same as applying a single stylesheet that imports each member of the sequence in order (see [2.6.2 Stylesheet Import]). <br />
            本文档并不说明一个XSLT样式单是如何与一个XML文档相联系的。它只是建议性的规定一个XSL处理器（XSL processors）必须支持[XML Stylesheet]中所描述的机制。 <br />
            <br />
            A stylesheet contains a set of template rules. A template rule has two parts: a pattern which is matched against nodes in the source tree and a template which can be instantiated to form part of the result tree. This allows a stylesheet to be applicable to a wide class of documents that have similar source tree structures. <br />
            一个样式单通常包含一套模板规则（构成一集合）。每个模板规则由两部分构成：模式，用于匹配&ldquo;源树&rdquo;中的结点；模板，可以被实例化，实例化的结果是生成 &ldquo;结果树中的某个部分&rdquo;。（用于构造出&ldquo;结果树&rdquo;的某个部分）。这会使得一个样式单能够广泛适用于一类具有相似&ldquo;源树结构&rdquo;的文档。 <br />
            <br />
            A template is instantiated for a particular source element to create part of the result tree. A template can contain elements that specify literal result element structure. A template can also contain elements from the XSLT namespace that are instructions for creating result tree fragments. When a template is instantiated, each instruction is executed and replaced by the result tree fragment that it creates. <br />
            一个模板（会因）对应于特定的&ldquo;源树中的某个元素&rdquo;而被实例化，实例化的结果是生成&ldquo;结果树中的某个部分&rdquo;。（用来构造&ldquo;结果树&rdquo;的某个部分）。一个模板中的某些元素可以用于精确地（逐字地）指定&ldquo;结果元素&rdquo;的结构，而模板中来自于XSLT命名空间的某些元素还可以是用于创建&ldquo;结果树片断&rdquo;的指令。当一个模板被实例化时，每条指令会执行并被它所创建的&ldquo;结果树片断&rdquo;所替代。 <br />
            <br />
            Instructions can select and process descendant source elements. Processing a descendant element creates a result tree fragment by finding the applicable template rule and instantiating its template. Note that elements are only processed when they have been selected by the execution of an instruction. The result tree is constructed by finding the template rule for the root node and instantiating its template. <br />
            指令可用于选择并处理&ldquo;子孙源树节点&rdquo;。通过寻找可用的模板规则并实例化它的模板来处理一个&ldquo;子孙元素&rdquo;，结果会产生一个&ldquo;结果树片断&rdquo;。注意，只有当元素被执行的指令所选中时才会被处理。&ldquo;结果树&rdquo;是通过为根节点寻找模板规则并实例化其模板来构建出来的。 <br />
            <br />
            In the process of finding the applicable template rule, more than one template rule may have a pattern that matches a given element. However, only one template rule will be applied. The method for deciding which template rule to apply is described in [5.5 Conflict Resolution for Template Rules]. <br />
            在寻找可用模板规则的过程中，可能会有多于一个的模板规则其模式能匹配到给定的一个元素。然而，只有一个模板规则会被应用。决定哪个模板规则会被应用的方法在[5.5 Conflict Resolution for Template Rules]中会被描述。 <br />
            <br />
            A single template by itself has considerable power: it can create structures of arbitrary complexity; it can pull string values out of arbitrary locations in the source tree; it can generate structures that are repeated according to the occurrence of elements in the source tree. For simple transformations where the structure of the result tree is independent of the structure of the source tree, a stylesheet can often consist of only a single template, which functions as a template for the complete result tree. Transformations on XML documents that represent data are often of this kind (see [D.2 Data Example]). XSLT allows a simplified syntax for such stylesheets (see [2.3 Literal Result Element as Stylesheet]). <br />
            （一个单独的）单单一个模板本身就具有惊人的能力：它通够创建任意复杂的结构；它能够提取出&ldquo;源树&rdquo;中任意位置的字符串值；它能够根据&ldquo;源树&rdquo;中某元素的多次出现来相应地重复产生某个结构。对某些简单的转换如&ldquo;结果树&rdquo;的结构独立于&ldquo;源树&rdquo;的结构，样式单通常仅由一个单独的模板所构成，起到匹配整个&ldquo;结果树&rdquo;模板的作用。对单独描述数据的XML文档所应用的转换通常是属于这类的。XSLT为这类样式单提供了简化的语法（详见 [2.3 Literal Result Element as Stylesheet]） <br />
            <br />
            When a template is instantiated, it is always instantiated with respect to a current node and a current node list. The current node is always a member of the current node list. Many operations in XSLT are relative to the current node. Only a few instructions change the current node list or the current node (see [5 Template Rules] and [8 Repetition]); during the instantiation of one of these instructions, the current node list changes to a new list of nodes and each member of this new list becomes the current node in turn; after the instantiation of the instruction is complete, the current node and current node list revert to what they were before the instruction was instantiated. <br />
            当一个模板被实例化时，它通常是相对于一个当前节点和一个当前节点list而被实例化。而该当前节点通常是当前节点list的一个成员。XSLT的很多操作是相对于当前节点的。只有少数指令会改变当前节点list或当前节点（参见see [5 Template Rules] and [8 Repetition]）；当这些指令中的某个被实例化时，当前节点list会变成新的节点list并且该新list的每个成员会轮流变成当前节点（在这些指令之一的实例化过程中，当前节点列表会更新为新的节点列表，此新列表中的每个成员又会轮流变成当前节点。）；在这些指令的实例化完成后，当前节点和当前节点list会恢复到指令被实例化前他们的情形。 <br />
            <br />
            XSLT makes use of the expression language defined by [XPath] for selecting elements for processing, for conditional processing and for generating text. <br />
            XSLT使用Xpath所定义的表达式语言来选择要处理的节点，进行条件处理和产生文本。 <br />
            <br />
            XSLT provides two &quot;hooks&quot; for extending the language, one hook for extending the set of instruction elements used in templates and one hook for extending the set of functions used in XPath expressions. These hooks are both based on XML namespaces. This version of XSLT does not define a mechanism for implementing the hooks. See [14 Extensions]. <br />
            XSLT提供了两种用于扩展的&ldquo;hook&rdquo;，一种是用来扩展在模板中使用的指令集（set of instruction elements）；另一种是用来扩展在XPath表达式中使用的函数集。两种&ldquo;hook&rdquo;都是基于XML命名空间的。该版本的XSLT没有定义实现hook的机制，见 [14 Extensions]。 <br />
            <br />