<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>ror 研究小屋</title>
    <description></description>
    <link>http://ewan.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>http://www.laoxiong.cn/?p=407</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/251596" style="color:red;">http://ewan.javaeye.com/blog/251596</a>&nbsp;
          发表时间: 2008年10月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <a href="http://www.laoxiong.cn/?p=407" target="_blank">http://www.laoxiong.cn/?p=407</a>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/251596#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 11 Oct 2008 13:27:38 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/251596</link>
        <guid>http://ewan.javaeye.com/blog/251596</guid>
      </item>
          <item>
        <title>rorchina红魔怎么了</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/251371" style="color:red;">http://ewan.javaeye.com/blog/251371</a>&nbsp;
          发表时间: 2008年10月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          rorchina红魔怎么了?怎么打不开呢?
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/251371#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 10 Oct 2008 16:50:38 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/251371</link>
        <guid>http://ewan.javaeye.com/blog/251371</guid>
      </item>
          <item>
        <title>安装ruby的数据库适配器</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/230709" style="color:red;">http://ewan.javaeye.com/blog/230709</a>&nbsp;
          发表时间: 2008年08月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          源码安装数据库mysql之后启动项目报错：Can't connect to local MySQL server through socket '/var/run/mysqld/mysqld.sock'<br />浪费了一上午找错才发现必须安装数据库适配器：<br /><br />下载mysql-ruby-2.7.3.tar.gz：<br />http://www.tmtm.org/en/mysql/ruby/<br />tar xzvf mysql-ruby-2.7.3.tar.gz<br />cd mysql-ruby-2.7.3<br />ruby extconf.rb --with-mysql-dir=/user/local/share/mysql<br />make &amp;&amp; make install<br />注意--with-mysql-dir应该指向MySQL数据库的安装路径，如果数据库服务器和Web服务器不在同一台机器上，那么Web服务器上也必须安装MySQL软件，因为ruby的C版本MySQL适配器需要在编译的时候联接MySQL的系统库。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/230709#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 20 Aug 2008 15:04:27 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/230709</link>
        <guid>http://ewan.javaeye.com/blog/230709</guid>
      </item>
          <item>
        <title>ruby中MD5和SHA1加密方法</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/227992" style="color:red;">http://ewan.javaeye.com/blog/227992</a>&nbsp;
          发表时间: 2008年08月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          MD5加密方式:<br />require 'md5'<br />puts MD5.hexdigest('')<br /><br />SHA1加密方式:<br />require 'digest/sha1'<br />puts Digest::SHA1.hexdigest('')
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/227992#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 14 Aug 2008 13:55:08 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/227992</link>
        <guid>http://ewan.javaeye.com/blog/227992</guid>
      </item>
          <item>
        <title>ruby/rails中的中文处理</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/227579" style="color:red;">http://ewan.javaeye.com/blog/227579</a>&nbsp;
          发表时间: 2008年08月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <span style="font-size: large"><div style="text-align: center"><strong>ruby/rails中的中文处理</strong></div></span><br /><br />原文:<a href="http://www.aitic.net/bbs/thread-383-1-1.html" target="_blank">http://www.aitic.net/bbs/thread-383-1-1.html</a><br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 由于当前的ruby并不支持unicode, 所以中文相关的处理在ruby中一直比较模糊,基本上是各自尝试的路子, 我也列出一些帮助自己整理思路<br />utf8和unicode的关系<br />utf其实是(Unicode Translation Format), 也就是unicode在传输时候的编码,有utf8和utf16等多种编码, 其实uf8是一个对中文字很不友好的编码, 为什么呢,因为在utf8中,一个中文是占用3个字节,而一个英文ascii字符却只占用1个字节, 这样一方面使得中文体积膨胀较厉害,另外一方面也不能简单的通过计算字节数来推算字符数. utf16就比较正常,每个字符占用两个字节.但是目前utf16已经后面的utf32应用较少, utf8 是比较公认的编码<br />utf8 还是 gb2312/gbk<br />我个人选择utf8,因为我觉得gb2312/gbk不是通用编码,如果使用可能还会有其他问题(比如多语言支持)<br />转换编码<br />我们需要require 'iconv' 库, 然后执行<br />Iconv.conv("utf8","GBK","....") #把字符由GBK转换为UTF8<br />当源字符集中含有非法编码的时候,我们需要告诉iconv忽略, 否则iconv会报错停止<br />Iconv.conv("utf8//IGNORE","GBK//IGNORE","....")<br />utf8 的中文操作:<br />计算字符数:<br />在默认的ruby环境下面, 需要执行<br /><br />require 'jcode'<br />$KCODE='u' # 或者$KCODE='UTF8' 两者是等价的<br /><br />计算字符数:<br />使用jsize或者jlength<br />"你好".size # 6<br />"你好".jsize # 2<br /><br />截取字符操作<br />"你好"[0,1] #乱码<br />"你好".scan(/./)[0,1].join # "你"<br /><br />当然还有另外一个办法:<br />利用utf16编码每个字都是2个字节(头还有两个字节)的特点,我们可以先把字符转换为utf16,然后按照[0,n*2+2]的方法截取前n个字符 (试验成功.求证中)<br />Iconv.conv("UTF8","UTF16",Iconv.conv("UTF16","UTF8","你好a中b文")[0,8]) #你好a
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/227579#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 13 Aug 2008 16:35:24 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/227579</link>
        <guid>http://ewan.javaeye.com/blog/227579</guid>
      </item>
          <item>
        <title>pike数据类型--float</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/214952" style="color:red;">http://ewan.javaeye.com/blog/214952</a>&nbsp;
          发表时间: 2008年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          尽管多数程序只用到整数,但对于三角运算,转化率,和其他需要用到小数的地方是不切实际的.为了这个目的,你可以使用浮点数.浮点数正常的是32为数,它可以表达非常小和非常大的数,但是只能精确到9为小数.写浮点型常量,可以用下面的格式:<br />格式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 数值<br />-?[0-9]+\.[0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1415926&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 3.1415926<br />-?[0-9]+e-?[0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -5e3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; -5000.0<br />-?[0-9]+\.[0-9]+e-?[0-9]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1.0223-2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0.01022<br />当然你可以添加任意的小数来增加精确度.通常九位后的小数是被忽落不计的,但是在一些领域,需要更高的精度.指数格式,e 代表 "乘以10的几次冥",1.0e9就是"1.0乘以10的9次冥".FIXME: float and int is not compatible and no implicit cast like in C++<br />浮点数可以用所有的算术和比较运算.另外,还有下面一些操作:<br />sin,asin,cos,acos,tan,atan三角函数:<br /><br />float log(float x)<br />&nbsp;&nbsp;&nbsp; 求x的对数<br />float exp(float x)<br />&nbsp;&nbsp;&nbsp;&nbsp; e的x次冥<br />float pow(float|int x, float|int y)<br />&nbsp;&nbsp;&nbsp;&nbsp; x的y次冥<br />float sqrt(float x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; x的平方根<br />float floor(float x)<br />&nbsp;&nbsp;&nbsp;&nbsp; 小于x的最大整数,需要注意的是返回的是浮点数<br />float ceit(float x)<br />&nbsp;&nbsp;&nbsp;&nbsp; 大于x最小整数,返回的是浮点数<br />float round(float x)<br />&nbsp;&nbsp;&nbsp;&nbsp; x四舍五入的整数,放回的是浮点数
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/214952#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Jul 2008 14:04:03 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/214952</link>
        <guid>http://ewan.javaeye.com/blog/214952</guid>
      </item>
          <item>
        <title>pike数据类型--int</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/214916" style="color:red;">http://ewan.javaeye.com/blog/214916</a>&nbsp;
          发表时间: 2008年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          整数是短整型或整型数字.它们是正常的32为整型,范围是-2147483648 到 2147483647.(注意在一些机子上,整数可能会超过32位.) pike编译的时候用的是没有32位限制的大整数雷,因此,整数可以是任意的长度.既然是整数,就不允许有小数的出现.一个整数常量可以有几种写法:<br />形式&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 例子&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 介绍<br />-?[1-9][0-9]*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 78&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十进制数<br />-?0[0-7]*&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 八进制数<br />-?0[xX][0-9a-fA-F]+&nbsp;&nbsp;&nbsp; 0x4e&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 十六进制数<br />-?0[bB][01]+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 0b1001110&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 二进制数<br />-?'\\?.'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 'N'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 字符的ASCII<br /><br />上面所有的描述都是数字78.每个八进制符号中的每个阿拉伯数字是见8进1,十六进制数每个符号中的阿拉伯数字是见16进1.十六进制数用字母a,b,c,d,e,f分表代表数字10,11,12,13,14,15.二进制数中的每个阿拉伯数字是见2进1,只用到数字1,0.ASCII中两个单引号之间的字母代表值.按这种方法,在ASCII表中,N正好代表78.一些特殊字符,比如换行符不能用单个的符号代替.<div class="quote_title">引用</div><div class="quote_div">The special generation sequence for those characters, listed under strings, must be used instead. Specifically this applies to the single quote character itself, which has to be written as '\''.</div><br />&nbsp;&nbsp;&nbsp; 整数可以用所有的算术,位,比较运算.另外需要注意一些方法:<br />int intp(mixed x) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 判断x是否为整数,是返回1,否则返回0<br />int random(int x)<br />&nbsp;&nbsp;&nbsp;&nbsp; 随机得到一个大于等于0,小于x的整数.<br />int reverse(int x)<br />&nbsp;&nbsp;&nbsp;&nbsp; This function reverses the order of the bits in x and returns the new number. It is not very useful.<br />int sqrt(int x)<br />&nbsp;&nbsp;&nbsp;&nbsp; 得到x的平发根,值一般是四舍五入的.
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/214916#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Jul 2008 12:37:02 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/214916</link>
        <guid>http://ewan.javaeye.com/blog/214916</guid>
      </item>
          <item>
        <title>pike数据类型(一)</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/214833" style="color:red;">http://ewan.javaeye.com/blog/214833</a>&nbsp;
          发表时间: 2008年07月15日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          本人英语水平比较差劲,下面不知道怎么翻译恰当的地方,暂时应用原文,日后翻译!如果有感兴趣的朋友,可以留下你的翻译.<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 这个章节主要是详细的介绍pike中几种数据存储方式.我们已经看到过很多例子,但是我们并不知道它们是如何工作的.这个章节我们会介绍每个不同类型的操作和方法.在pike中有两类数据类型:基本数据类型和指针类型(暂且怎么翻译,以后有合适的教法再修改).它们的不同之处是:<br /><br /><div class="quote_title">引用</div><div class="quote_div">The difference is that basic types are copied when assigned to a variable. With pointer types, merely the pointer is copied, that way you get two variables pointing to the same thing.</div><br /><span style="font-size: small;"><strong>基本类型</strong><br /></span><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 基本类型是:整型,浮点型,字符串.<br /><div class="quote_title">引用</div><div class="quote_div">For you who are accustomed to C or C++, it may seem odd that a string is a basic type as opposed to an array of char, but it is surprisingly easy to get used to.</div><br /><span style="font-size: small;"><strong>指针类型</strong><br /></span><br />&nbsp;&nbsp;&nbsp; <br />基本类型,就像它们的名字一样是非常基础的.它们是根本,大多数的指针类型,不过是另外的方式存储基本类型.指针类型包括:数组,mapping,multiset,program,object,和function.它们是指针型,即它们在内存中指向一些内容.<div class="quote_title">引用</div><div class="quote_div">This "something" is freed when there are no more pointers to it. Assigning a variable with a value of a pointer type will not copy this "something" instead it will only generate a new reference to it. Special care sometimes has to be taken when giving one of these types as arguments to a function; the function can in fact modify the "something". If this effect is not wanted you have to explicitly copy the value. More about this will be explained later in this chapter.</div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/214833#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 15 Jul 2008 11:13:38 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/214833</link>
        <guid>http://ewan.javaeye.com/blog/214833</guid>
      </item>
          <item>
        <title>pike数据类型-- mapping </title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/214018" style="color:red;">http://ewan.javaeye.com/blog/214018</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><br />
<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
mappings只是特殊的数组(array).mapping比较慢,并且消耗内存也比较大,因此,mappiing不能完全取代数组.特殊的是,不止整数,所有类型都可以做索引.我们可以想象mapping是这样:<br />
   mapping中每一个元素都是key-value对.具有很方便的查找功能,这种功能可以很快的找到任何一个key所对应的value.现在,假如我们把mapping叫做m,m[i]会很快的找到key为i的value.假如key没有找到,会返回0.假如我们对已有的key赋值,他会覆盖原来的值.如果被赋值的key不存在,则一对新的key-value会添加到mapping中,   定义一个常量的mapping是很简单的:<br />
&nbsp;&nbsp;&nbsp;&nbsp;
([]) &nbsp; &nbsp;  //空mapping<br />
&nbsp;&nbsp;&nbsp;&nbsp;
([1:2])&nbsp;&nbsp;&nbsp;  //<br />
&nbsp;&nbsp; &nbsp;
([&quot;one&quot;:1,&quot;two&quot;,2])&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;
([1:({2.0})],&quot;&quot;:([]))&nbsp;&nbsp;&nbsp; //<br />
&nbsp;&nbsp;&nbsp;&nbsp;
和数组相比,mapping可以可以是任意类型的值.最大的不同是key也可以是任意类型.另外需要注意的是key-value对没有一定的顺序.你不能指定第十四对key-value,因为没法区别那对是第十四.因此,不能对mapping做排序操作.下面是mapping的一些重要操作:<br />
m[index]<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
     可以重新赋值,增加值.<br />
+,-,|,&amp;,^<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 和数组一样,这些操作符,也可以使用,不同的是,mapping作用于key.在一些特殊情况,当value从两个mapping值取得时候,它会选择操作符右边的值.这样它使用起来比+=方便多了.看一些例子:<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   ([1:3,3:1]) +&nbsp; ([2:5, 3:7])  =&gt;  ([1:3,2:5,3:7])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   ([1:3,3:1]) -&nbsp; ([2:5, 3:7]) =&gt;   ([1:3])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   ([1:3,3:1]) | ([2:5, 3:7]) =&gt;   ([1:3,2:5,3:7])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   ([1:3,3:1]) &amp; ([2:5, 3:7]) =&gt; ([3:7])<br />
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
   ([1:3,3:1]) ^ ([2:5, 3:7]) =&gt; ([1:3,2:5])<br />
a==b<br />
&nbsp;&nbsp;&nbsp;&nbsp;
   相同是返回1,否则返回0<br />
a!=b<br />
&nbsp;&nbsp;&nbsp;&nbsp;
   不等时返回1,否则返回1<br />
array indices(mapping m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;
   返回m的所有包含有所有key的数组<br />
mixed m_delete(mapping m,mixed ind)<br />
&nbsp;&nbsp;&nbsp;&nbsp;
    移除key为ind的key-value对,返回ind对应的value<br />
int mappingp(mixed m)<br />
&nbsp;&nbsp;&nbsp;&nbsp;
    判断m是否为mapping类型,是返回1,否则返回0<br />
mapping mkmapping(array ind,array val)<br />
&nbsp;&nbsp;&nbsp;&nbsp;
    把数组ind和val构造一个mapping, ([ind[0]:val[0],ind[1]:val[1],...,ind[i],val[i]])</p>
<p>mapping replace(mapping m,mixed from, mixed to)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 把m中所有value为from的全部替换成to,并且生成新的mapping</p>
<p>mixed search(mapping m,mixed val)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 返回第一对值为val的key</p>
<p>int sizeof(mapping m)</p>
<p>&nbsp;&nbsp;&nbsp; 返回mapping的key-value的对数</p>
<p>array values(mapping m)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 同indices,不同的是放回的是所有value的数组.如果同一个mapping连续操作indices和values,两者之间没有任何操作,得到的数组顺序是相同的.它们可以作为mkmapping的两个参数,重新组成mapping m.</p>
<p>int zefo_type(mixed t)</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp; 当在mapping中找不到某个key的时候,会返回0.但是,问题是假如0在mapping中也是value的时候怎么办.这个方法就是告诉你两者间的区别.zero_type(m[ind])返回1,说明这个ind不存在与mapping m中,如果存在,则返回1以外的其他数字.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp; 下面是原文:</p>
<div class="quote_title">引用</div>
<div class="quote_div"><span style="font-size: small;">Mappings are are really just more generic arrays. However, they are slower and use more memory than arrays, so they cannot replace arrays completely. What makes mappings special is that they can be indexed on other things than integers. We can imagine that a mapping looks like this:<br />
<br />
<br />
<br />
Each index-value pair is floating around freely inside the mapping. There is exactly one value for each index. We also have a (magical) lookup function. This lookup function can find any index in the mapping very quickly. Now, if the mapping is called m and we index it like this: m [ i ] the lookup function will quickly find the index i in the mapping and return the corresponding value. If the index is not found, zero is returned instead. If we on the other hand assign an index in the mapping the value will instead be overwritten with the new value. If the index is not found when assigning, a new index-value pair will be added to the mapping. Writing a constant mapping is easy:<br />
<br />
<br />
<br />
<br />
<br />
([ ])       // Empty mapping<br />
<br />
([ 1:2 ])   // Mapping with one index-value pair, the 1 is the index<br />
<br />
([ &quot;one&quot;:1, &quot;two&quot;:2 ]) // Mapping which maps words to numbers<br />
<br />
([ 1:({2.0}), &quot;&quot;:([]), ]) // Mapping with lots of different types<br />
<br />
<br />
<br />
<br />
<br />
As with arrays, mappings can contain any type. The main difference is that the index can be any type too. Also note that the index-value pairs in a mapping are not stored in a specific order. You can not refer to the fourteenth key-index pair, since there is no way of telling which one is the fourteenth. Because of this, you cannot use the range operator on mappings.<br />
<br />
<br />
<br />
The following operators and functions are important:<br />
<br />
<br />
<br />
indexing ( m [ ind ] ) <br />
<br />
As discussed above, indexing is used to retrieve, store and add values to the mapping. <br />
<br />
addition, subtraction, union, intersection and xor <br />
<br />
All these operators works exactly as on arrays, with the difference that they operate on the indices. In those cases when the value can come from either mapping, it will be taken from the right side of the operator. This makes it easier to add new values to a mapping with +=. Some examples:<br />
<br />
([1:3, 3:1]) + ([2:5, 3:7]) returns ([1:3, 2:5, 3:7 ])<br />
<br />
([1:3, 3:1]) - ([2:5, 3:7]) returns ([1:3])<br />
<br />
([1:3, 3:1]) | ([2:5, 3:7]) returns ([1:3, 2:5, 3:7 ])<br />
<br />
([1:3, 3:1]) &amp; ([2:5, 3:7]) returns ([3:7])<br />
<br />
([1:3, 3:1]) ^ ([2:5, 3:7]) returns ([1:3, 2:5])<br />
<br />
<br />
<br />
same ( a == b ) <br />
<br />
Returns 1 if a is the same mapping as b, 0 otherwise. <br />
<br />
not same ( a != b ) <br />
<br />
Returns 0 if a is the same mapping as b, 1 otherwise. <br />
<br />
array indices(mapping m) <br />
<br />
Indices returns an array containing all the indices in the mapping m. <br />
<br />
mixed m_delete(mapping m, mixed ind) <br />
<br />
This function removes the index-value pair with the index ind from the mapping m. It will return the value that was removed. <br />
<br />
int mappingp(mixed m) <br />
<br />
This function returns 1 if m is a mapping, 0 otherwise. <br />
<br />
mapping mkmapping(array ind, array val) <br />
<br />
This function constructs a mapping from the two arrays ind and val. Element 0 in ind and element 0 in val becomes one index-value pair. Element 1 in ind and element 1 in val becomes another index-value pair, and so on.. <br />
<br />
mapping replace(mapping m, mixed from, mixed to) <br />
<br />
This function creates a copy of the mapping m with all values equal to from replaced by to. <br />
<br />
mixed search(mapping m, mixed val) <br />
<br />
This function returns the index of the 'first' index-value pair which has the value val. <br />
<br />
int sizeof(mapping m) <br />
<br />
Sizeof returns how many index-value pairs there are in the mapping. <br />
<br />
array values(mapping m) <br />
<br />
This function does the same as indices, but returns an array with all the values instead. If indices and values are called on the same mapping after each other, without any other mapping operations in between, the returned arrays will be in the same order. They can in turn be used as arguments to mkmapping to rebuild the mapping m again. <br />
<br />
int zero_type(mixed t) <br />
<br />
When indexing a mapping and the index is not found, zero is returned. However, problems can arise if you have also stored zeroes in the mapping. This function allows you to see the difference between the two cases. If zero_type(m [ ind ]) returns 1, it means that the value was not present in the mapping. If the value was present in the mapping, zero_type will return something else than 1.</span>
<br />
 <span style="font-size: x-large;"><br />
<br />
</span>
<br />
</div>
<p>
<br />
<br />
<br />
<br />
<br /></p>
<p>&nbsp;</p>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/214018#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 17:42:52 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/214018</link>
        <guid>http://ewan.javaeye.com/blog/214018</guid>
      </item>
          <item>
        <title>火箭队阵容</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/210688" style="color:red;">http://ewan.javaeye.com/blog/210688</a>&nbsp;
          发表时间: 2008年07月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们一次次的火箭队充满希望,可他缺一次次的让我们失望.可作为火箭的伪球迷,还是发些牢骚吧.<br />&nbsp;&nbsp;&nbsp; 以下是我心目中火箭的理想阵容:<br />&nbsp;&nbsp;&nbsp; 方案一:<br />&nbsp;&nbsp;&nbsp; C:姚明, (多西,穆大叔)<br />&nbsp;&nbsp;&nbsp; PF:斯科拉,(兰德理)<br />&nbsp;&nbsp;&nbsp; SF:阿泰斯特(巴蒂尔+海耶斯),(格林,诺瓦克)<br />&nbsp;&nbsp;&nbsp; SG:麦蒂,(米勒(海德+弗朗西斯))<br />&nbsp;&nbsp;&nbsp; PG:迈克.康利(鲍比.杰克逊),(布鲁克斯,阿尔斯通) <br /><br />&nbsp;&nbsp;&nbsp;&nbsp; 方案二: <br />&nbsp;&nbsp;&nbsp; C:姚明, (多西,穆大叔)<br />&nbsp;&nbsp;&nbsp; PF:斯科拉,(兰德理,海耶斯)<br />&nbsp;&nbsp;&nbsp; SF:巴蒂尔,(格林,诺瓦克)<br />&nbsp;&nbsp;&nbsp; SG:米勒(海德+弗朗西斯))<br />&nbsp;&nbsp;&nbsp; PG:麦蒂(布鲁克斯,阿尔斯通,鲍比.杰克逊)
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/210688#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Wed, 02 Jul 2008 16:29:56 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/210688</link>
        <guid>http://ewan.javaeye.com/blog/210688</guid>
      </item>
          <item>
        <title>ubuntu的时间同步</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/210099" style="color:red;">http://ewan.javaeye.com/blog/210099</a>&nbsp;
          发表时间: 2008年07月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          ubuntu的时间同步<br /><br /><br />和时间服务器同步：<br /><pre name="code" class="java">sudo ntpdate s1a.time.edu.cn</pre><br />将同步后的准确时间写入BIOS：<br /><pre name="code" class="java">sudo hwclock --systohc</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/210099#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 01 Jul 2008 11:57:53 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/210099</link>
        <guid>http://ewan.javaeye.com/blog/210099</guid>
      </item>
          <item>
        <title>rails2.0下的file_column和imagick</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/191898" style="color:red;">http://ewan.javaeye.com/blog/191898</a>&nbsp;
          发表时间: 2008年05月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于rails2.0下的file_column 和rmagick 整合会遇到两个问题：1后缀是大写的会报错，大致是找不到文件的错误，2报nil.relative_url_root的错误。<br />&nbsp;&nbsp; 对于这两个问题，在javeeye上已经有解决方法，但是没有整理到一块，在此，为了本人和大家的方便，我就要引用大篇别人的文章了。<br /><br /> 关于整合，airport同学在<a href="http://airport.javaeye.com/blog/33216" target="_blank">http://airport.javaeye.com/blog/33216</a>讲的已经很详细了，为了自己的方便，我就全部复制过来了。<br /><div class="quote_title">引用</div><div class="quote_div">在网站制作过程中，图片上传以及图片的大小调整是经常会用到的一个功能！<br /><br />Rails结合几个plug-in可以说很智能的做到了这一点<br /><br />做了一个简单的例子，系统在Windows平台上运行<br /><br />1.上网下载file-column-0.3.1.tar.gz 和rmagick-win32-1.13.0_IM-6.2.9-3.zip （我当前的最新版本，到下述站点下载 http://rubyforge.org/projects/rmagick/ Linux下版本是RMagick-1.14.1.tar.gz）<br /><br />2.安装rmagick，执行zip包里面的exe文件，同时把安装路径放到path环境变量里面去，否则可能会报CORE_RL_magick_.dll找不到的错误<br /><br />3.安装file-column到app的vendor目录里，直接copy过去就行<br /><br />引用<br />以下的文件配置基本上按照官方提供的sample来进行，算是用中文整合一下，谈不上原创<br /><br />4.建立一个存放路径的model，在数据库中建立Entry数据库<br />并生成相应的scaffold：<br />ruby script/generate scaffold Entry upload<br /><br />4.修改model，并限制只能图片上传<br />Java代码 复制代码<br /><br />&nbsp;&nbsp; 1. class Entry &lt; ActiveRecord::Base&nbsp; <br />&nbsp;&nbsp; 2.&nbsp;&nbsp; validates_format_of :image,&nbsp; <br />&nbsp;&nbsp; 3.&nbsp;&nbsp;&nbsp;&nbsp; :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,&nbsp; <br />&nbsp;&nbsp; 4.&nbsp;&nbsp;&nbsp;&nbsp; :message => "你只能上传JPG或则GIF的图片文件"&nbsp; <br />&nbsp;&nbsp; 5.&nbsp;&nbsp; file_column :image, :magick => {&nbsp;&nbsp; <br />&nbsp;&nbsp; 6.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :versions => { "thumb" => "50x50", "medium" => "640x480>" }&nbsp; <br />&nbsp;&nbsp; 7.&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp; <br />&nbsp;&nbsp; 8. end&nbsp; <br /><br />class Entry &lt; ActiveRecord::Base<br />&nbsp; validates_format_of :image,<br />&nbsp;&nbsp;&nbsp; :with=>/^.*(.jpg|.JPG|.gif|.GIF)$/,<br />&nbsp;&nbsp;&nbsp; :message => "你只能上传JPG或则GIF的图片文件"<br />&nbsp; file_column :image, :magick => { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :versions => { "thumb" => "50x50", "medium" => "640x480>" }<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }<br />end<br /><br /><br /><br />5.修改_form.rhtml<br />Java代码 复制代码<br /><br />&nbsp;&nbsp; 1. &lt;%= error_messages_for 'entry' %>&nbsp; <br />&nbsp;&nbsp; 2.&nbsp;&nbsp; <br />&nbsp;&nbsp; 3. &lt;!--[form:entry]-->&nbsp; <br />&nbsp;&nbsp; 4. &lt;p>&lt;label for="entry_image">Image&lt;/label>&lt;br/>&nbsp; <br />&nbsp;&nbsp; 5. &lt;%= file_column_field 'entry', 'image'&nbsp; %>&lt;/p>&nbsp; <br />&nbsp;&nbsp; 6. &lt;!--[eoform:entry]-->&nbsp; <br /><br />&lt;%= error_messages_for 'entry' %><br /><br />&lt;!--[form:entry]--><br />&lt;p>&lt;label for="entry_image">Image&lt;/label>&lt;br/><br />&lt;%= file_column_field 'entry', 'image'&nbsp; %>&lt;/p><br />&lt;!--[eoform:entry]--><br /><br /><br /><br />6.修改new.rhtml<br />Java代码 复制代码<br /><br />&nbsp;&nbsp; 1. &lt;h1>New entry&lt;/h1>&nbsp; <br />&nbsp;&nbsp; 2.&nbsp;&nbsp; <br />&nbsp;&nbsp; 3. &lt;%= start_form_tag 'create',:multipart => true%>&nbsp; <br />&nbsp;&nbsp; 4.&nbsp;&nbsp; &lt;%= render :partial => 'form' %>&nbsp; <br />&nbsp;&nbsp; 5.&nbsp;&nbsp; &lt;%= submit_tag "Create" %>&nbsp; <br />&nbsp;&nbsp; 6. &lt;%= end_form_tag %>&nbsp; <br />&nbsp;&nbsp; 7.&nbsp;&nbsp; <br />&nbsp;&nbsp; 8. &lt;%= link_to 'Back', :action => 'list' %>&nbsp; <br /><br />&lt;h1>New entry&lt;/h1><br /><br />&lt;%= start_form_tag 'create',:multipart => true%><br />&nbsp; &lt;%= render :partial => 'form' %><br />&nbsp; &lt;%= submit_tag "Create" %><br />&lt;%= end_form_tag %><br /><br />&lt;%= link_to 'Back', :action => 'list' %><br /><br /><br /><br />7.修改show.rhtml<br />Java代码 复制代码<br /><br />&nbsp;&nbsp; 1. &lt;% for column in Entry.content_columns %>&nbsp; <br />&nbsp;&nbsp; 2. &lt;p>&nbsp; <br />&nbsp;&nbsp; 3.&nbsp;&nbsp; &lt;b>&lt;%= column.human_name %>:&lt;/b> &lt;%=h @entry.send(column.name) %>&nbsp; <br />&nbsp;&nbsp; 4.&nbsp;&nbsp; &lt;br>&nbsp; <br />&nbsp;&nbsp; 5.&nbsp;&nbsp; 原始大小：&nbsp; <br />&nbsp;&nbsp; 6.&nbsp;&nbsp; &lt;%= image_tag url_for_file_column 'entry', 'image' %>&nbsp; <br />&nbsp;&nbsp; 7.&nbsp;&nbsp; &lt;br>&nbsp; <br />&nbsp;&nbsp; 8.&nbsp;&nbsp; thumb:&nbsp; <br />&nbsp;&nbsp; 9.&nbsp;&nbsp; &lt;%= image_tag url_for_file_column 'entry', 'image' ,'thumb'%>&nbsp; <br />&nbsp; 10.&nbsp;&nbsp; &lt;br>&nbsp; <br />&nbsp; 11.&nbsp;&nbsp; medium:&nbsp; <br />&nbsp; 12.&nbsp;&nbsp; &lt;%= image_tag url_for_file_column 'entry', 'image' ,'medium'%>&nbsp; <br />&nbsp; 13. &lt;/p>&nbsp; <br />&nbsp; 14. &lt;% end %>&nbsp; <br />&nbsp; 15.&nbsp;&nbsp; <br />&nbsp; 16. &lt;%= link_to 'Edit', :action => 'edit', :id => @entry %> |&nbsp; <br />&nbsp; 17. &lt;%= link_to 'Back', :action => 'list' %>&nbsp; </div><br /><br /> 在rails2.0中会遇到错误： nil.relative_url_root&nbsp; <br /> kenrome同学已经提到<a href="http://www.javaeye.com/topic/174617" target="_blank">http://www.javaeye.com/topic/174617</a>，同时，distortion同学已给了给出了解决方法，再次引用：<br /><div class="quote_title">引用</div><div class="quote_div">nil.relative_url_root的异常是由file_column_helper中的url_for_file_column方法抛出来的, 是因为在url_for_file_column方法中还使用"@request"访问Request,只要删了'@',使用Rails 2.0的request代替@request就可以了</div><br /><br /><br />如果遇到大写错误，有koska同学给出了解决方法：<a href="http://bbx.javaeye.com/blog/52266" target="_blank">http://bbx.javaeye.com/blog/52266</a><br /><div class="quote_title">引用</div><div class="quote_div">解决办法：<br /><br />vendor\plugins\file-column-0.3.1\lib下file_column.rb文件<br /><br />里的<br /><br />#FileUtils.mv(local_file_path, new_local_file_path) unless new_local_file_path == local_file_path<br />FileUtils.mv(local_file_path, new_local_file_path) unless new_local_file_path.downcase == local_file_path.downcase </div>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/191898#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 11 May 2008 11:15:00 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/191898</link>
        <guid>http://ewan.javaeye.com/blog/191898</guid>
      </item>
          <item>
        <title>mysql 中的下划线“_”</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/191049" style="color:red;">http://ewan.javaeye.com/blog/191049</a>&nbsp;
          发表时间: 2008年05月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          奇怪的问题：<br /><pre name="code" class="sql">select * from users where name like '%_%;'</pre><br />这条搜索语句在masql中会把所有的用户搜索出来。<br />我现在想把name中带"_"的检索出来，不知道怎么办了！<br /><br />现在终于 解决了： <pre name="code" class="sql">select * from users where name like '%\_%;'</pre>
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/191049#comments" style="color:red;">已有 <strong>2</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 08 May 2008 14:10:15 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/191049</link>
        <guid>http://ewan.javaeye.com/blog/191049</guid>
      </item>
          <item>
        <title>分页插件will_paginate(提供下载包)</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/154713" style="color:red;">http://ewan.javaeye.com/blog/154713</a>&nbsp;
          发表时间: 2008年01月10日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          分页插件(will_paginate)是非常好用的,但是安装的时候没有安装svn客户端,会出现安装不了的情况,所以提供了附件供不方便安装的朋友下载 <br />1:安装:&nbsp;&nbsp; <br /><pre name="code" class="ruby">ruby script/plugin install svn://errtheblog.com/svn/plugins/will_paginate  </pre>或者下载附件解压到:vendor/plugins中即可.<br />2:使用<br />controller<br /><pre name="code" class="ruby"> @posts = Post.paginate :page => params[:page]||1, :per_page => 50  </pre><br /><br />view<br /><pre name="code" class="ruby">&lt;%= will_paginate @posts, :prev_label   => '上一页',
      :next_label   => '下一页' %></pre><br /><br />好了,大功告成,享受will_paginate的乐趣吧!
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/154713#comments" style="color:red;">已有 <strong>11</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 10 Jan 2008 13:35:01 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/154713</link>
        <guid>http://ewan.javaeye.com/blog/154713</guid>
      </item>
          <item>
        <title>rails插件列表</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/154041" style="color:red;">http://ewan.javaeye.com/blog/154041</a>&nbsp;
          发表时间: 2008年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          rails的插件列表<br /><br /><a href="http://agilewebdevelopment.com/plugins/list" target="_blank">http://agilewebdevelopment.com/plugins/list</a><br /><br />竟然有900多个插件!<br /><br />下面是我用过的两个:<br /><strong><span style="color: red">FileColumn</span></strong><br />作用:文件上传,和rmagic综合试用<br />网页：<a href="http://www.kanthak.net/opensource/file_column/" target="_blank">http://www.kanthak.net/opensource/file_column/</a><br /><br /><br /><strong><span style="color: red">Acts as attachment</span> </strong><br />作用:文件上传<br />网页:<a href="http://technoweenie.stikipad.com/plugins/show/Acts+as+Attachment" target="_blank">http://technoweenie.stikipad.com/plugins/show/Acts+as+Attachment</a><br /><br />有时间把其它的翻译一下,看是干什么用的,以后就方便了!如果有路过的用过其它插件,就补充一下吧!
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/154041#comments" style="color:red;">已有 <strong>3</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jan 2008 15:43:04 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/154041</link>
        <guid>http://ewan.javaeye.com/blog/154041</guid>
      </item>
          <item>
        <title>ruport中文乱码</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/153979" style="color:red;">http://ewan.javaeye.com/blog/153979</a>&nbsp;
          发表时间: 2008年01月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="ruby">
def index
   table  = Ruport::Data::Table.new :data => [["dd","男",3], [3,4,5]],
               :column_names => %w[姓名 性别 年龄]
   puts table.to_csv  #-------1

   send_data table.to_csv,
      :type         => "application/csv",
      :disposition  => "inline",
      :filename     => "report.csv"
end
</pre><br /><br />&nbsp; 在第四行打印的时候是中文,但是最后到处的文件就是乱码!
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/153979#comments" style="color:red;">已有 <strong>4</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 08 Jan 2008 13:41:21 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/153979</link>
        <guid>http://ewan.javaeye.com/blog/153979</guid>
      </item>
          <item>
        <title>ruport应用</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/153712" style="color:red;">http://ewan.javaeye.com/blog/153712</a>&nbsp;
          发表时间: 2008年01月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          1, install: <br />gem install ruport -y <br />gem install ruport-util -y <br /><br /><br />2, require <br />在 environment.rb 中,写入: require "ruport" <br /><br />3, Loading acts_as_reportable <br />在model中: 例如 <br /><div class="quote_title">引用</div><div class="quote_div">class Report &lt; ActiveRecord::Base <br />&nbsp;&nbsp;&nbsp; acts_as_reportable <br />end</div> <br />4, code <br />在controller中: <br /><div class="quote_title">引用</div><div class="quote_div">def index <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; table = Report.report_table(:all, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :only => %w[host_os rubygems_version user_key], <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :conditions => "user_key is not null and user_key &lt;> ''") <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; send_data table.to_csv, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :type => "application/csv", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :disposition => "inline", <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :filename => "report.csv" <br />end</div><br /><br />end
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/153712#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 07 Jan 2008 17:16:11 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/153712</link>
        <guid>http://ewan.javaeye.com/blog/153712</guid>
      </item>
          <item>
        <title>30岁以前不要去在乎的29件事</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/148366" style="color:red;">http://ewan.javaeye.com/blog/148366</a>&nbsp;
          发表时间: 2007年12月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          几天看了一篇文章,觉得对自己有用!<br />&nbsp; 原文:http://tec.artec.cn/?p=165<br /><br />　1、放弃<br /><br />　　把握的反面就是放弃，选择了一个机会，就等于放弃了其他所有的可能。当新的机会摆在面前的时候，敢于放弃已经获得的一切，这不是功亏一篑，这不是半途而废，这是为了谋求更大的发展空间；或者什么都不为，只因为喜欢这样做，因为，年轻就是最大的机会。人，只有在三十岁之前才会有这个胆量，有这个别资本，有这个资格。<br /><br />　　2、失恋<br /><br />　　不是不在乎，是在乎不起。三十岁前最怕失去的不是已经拥有的东西，而是梦想。爱情如果只是一个过程，那么正是这个年龄应当经历的，如果要承担结果，三十岁以后，可能会更有能力，更有资格。其实，三十岁之前我们要做的事情很多，稍纵即逝，过久地沉溺在已经乾涸的爱河的河床中，与这个年龄的生命节奏不合。<br /><br /><br />　　3、离婚<br /><br />　　不是不在乎，是一切还来得及。一位三十八岁的女友与老公结婚十五年，冷战十三年，终于分手。她说：「如果说后来不愿意离婚是为了孩子，那他第一次提出离婚我没有同意，现在想来真不知道为什么。如果那个时候早分手，我的生活绝不会是今天这个样子。现在再重新开始，总觉得一切都晚了。<br /><br />　　4、漂泊<br /><br />　　漂泊不是一种不幸，而是一种资格。趁著没有家室拖累，趁著身体健康，此时不飘何时飘？当然，漂泊的不一定是身体，也许只是幻想和梦境。新世纪的时尚领袖是飘一代，渴望漂泊的人惟一不飘的是那颗心。<br /><br />　　5、失业<br /><br />　　三十岁以前就尝到失业的滋味当然是一件不幸的事，但不一定是坏事。三十岁之前就过早地固定在一个职业上终此一生也许才是最大的不幸。失业也许让你想起埋藏很久而尘封的梦想，也许会唤醒连你自己都从未知道的潜能。也许你本来就没什么梦想，这时候也会逼著你去做梦。<br /><br />　　6、时尚<br /><br />　　不要追赶时尚。按说青年人应该是最时尚的，但是独立思考和个性生活更重要。在这个物质社会，其实对时尚的追求早已经成为对金钱的追求。今天，时尚是物欲和世俗的同义语。<br /><br />　　7、格调<br /><br />　　这是小资的东西，「小资」这个词在今天又二度流行，追求格调就是他们的专利。小资们说，有格调要满足四大要件：智慧、素养、自信和金钱。格调就是把「高尚」理解成穿著、气质、爱好的品味和室内装潢。也就是大老粗只会表现谈吐的庸俗，「小资」们已经有能力庸俗他们的心灵了。主流观念倒不是非要另类，另类已经成为年轻人观念的主流了，在今天，老土倒显得另类。关键是当今社会是一个创造观念的时代，而不是一个固守陈旧观念的时代。<br /><br />　　8、评价<br /><br />　　我们最不应该做出的牺牲就是因为别人的评价而改变自我，因为那些对你指手画脚的人自己也不知道他们遵从的规则是什么。千万不要只遵从规矩做事，规矩还在创造之中，要根据自己的判断做每一件事，虽然这样会麻烦一点。<br /><br />　　9、幼稚<br /><br />　　不要怕人说我们幼稚，这正说明你还年轻，还充满活力。「成熟」是个吓人的词儿，也是个害人的词儿。成熟和幼稚是对一个人最大而无当、最不负责任、最没用的概括。那些庸人，绝不会有人说他们幼稚。不信，到哪天你被生活压得老气横秋，暮气沉沉的时候，人们一定会说你成熟了，你就会知道「成熟」是个什么东西。<br /><br />　　10、不适应<br /><br />　　在一首摇滚里有这么一句：「这个城市改变了我，这个城市不需要我。」不要盲目地适应你生存的环境，因为很可能这环境自身已经不适应这个社会的发展了。<br /><br />　　11、失败<br /><br />　　我的老师曾经跟我说，一个人起码要在感情上失恋一次，在事业上失败一次，在选择上失误一次，才能长大。不要说失败是成功之母那样的老话，失败来得越早越好，要是三十岁，四十岁之后再经历失败，有些事，很可能就来不及了。<br /><br />　　12、错误<br /><br />　　这是年轻人的专利。<br /><br />　　13、浅薄<br /><br />　　如果每看一次《泰坦尼克号》就流一次眼泪，每看一次《大话西游》就笑得直不起腰，就会有人笑你浅薄。其实那只能说明你的神经依旧非常敏锐，对哪怕非常微弱的刺激都会迅速做出适应的反应；等你的感觉迟钝了，人们就会说你深沉了。<br /><br />　　14、明星<br /><br />　　不是不必在乎，是不能在乎。明星在商品社会是一种消费品，花了钱，听了歌，看了电影，明星们的表现再好，不过是物超所值而己，也不值得崇拜呀？就像你在地摊上花五十块钱买的裙子，别人都猜是八百块钱买的，物超所值了吧？你就崇拜上这身裙子了？<br /><br />　　15、代价<br /><br />　　不是不计代价，而是要明白做任何事都要付出代价。对我们这个年龄的人来说，这绝不是一句废话。否则，要到三十岁的时候才会明白自己曾经付出了多少代价，却不明白为什么付出，更不明白自己得到了多少，得到什么。<br /><br />　　16、孤独<br /><br />　　这是为自由付出的代价。<br /><br />　　17、失意<br /><br />　　包括感情上的，事业上的，也许仅仅是今天花了冤枉钱没买到可心的东西，朋友家高朋满座自己却插不上一句话。过分在乎失意的感受不是拿命运的捉弄来捉弄自己，就是拿别人的错误来惩罚自己。<br /><br />　　18、缺陷<br /><br />　　也许你个子矮，也许你长得不好看，也许你的嗓音像唐老鸭、、、那么你的优势就是你不会被自己表面的浅薄的亮点所耽搁，少花一些时间，少走一些弯，直接发现你内在的优势，直接挖掘自己深层的潜能。<br /><br />　　19、误会<br /><br />　　如果出于恶意，那么解释也没有用；如果出于善意，就不需要解释。专门说到「误会」倒不是因为一个人在三十岁之前被人误会的时候更多，而是这个年龄的人想不开的时候更多。<br /><br />　　20、谣言<br /><br />　　这是一种传染病，沈默是最好的疫苗。除非你能找出传染源，否则解释恰恰会成为病毒传播最理想的条件。<br /><br />　　21、疯狂<br /><br />　　这是年轻人最好的心理调适，只能说明你精力旺盛，身心健康。说你「疯狂」是某些生活压抑、心力交瘁的中老年人恶意的评价，他们就像一部年久修的机器，最需要调适，但只能微调，一次大修就会让他们完诞。<br /><br />　　22、稳定<br /><br />　　三十岁之前就在乎稳定的生活，那只有两种可能，要么就是中了彩票，要么就是未老先衰。<br /><br />　　23、压力<br /><br />　　中年人能够承受多大压力检验的是他的韧性；年轻人能承受多大压力，焕发的是他的潜能。<br /><br />　　24、出国<br /><br />　　也许是个机会，也许是个陷阱。除非从考大学的那一刻你就抱著这个目标，否则，对待出国的态度应该像对待爱情一样，努力争取，成败随缘。<br /><br />　　25、薪水<br /><br />　　只是给人打工，薪水再高也高不到哪儿去。所以在三十岁之前，机会远比金钱重要，事业远比金钱重要，将来远比金钱重要。对大多数人来说，三十岁之前干事业的首要目标绝不是挣钱，而是挣未来。<br /><br />　　26、存款<br /><br />　　这倒不一定是因为我们钱少，年轻人现在谁都知道钱是有生命的。机会这么多，条件这么好，可以拿钱去按揭，做今天的事，花明天的钱；也可以拿钱去投资，拿钱去「充电」。钱只有在它流通的过程中才是钱，否则只<br /><br />　　是一叠世界上质量最好的废纸。<br /><br />　　27、房子<br /><br />　　除非你买房子是为了升值，要嘛就是你结婚了。我有个同学，家在外地，大学毕业之后，单位没有宿舍，家里就给他买了一套房子。他曾经有过去北京工作的机会，但是他觉得刚买了房子就离开这座城市说不过去，就放弃了。到现在他工作稳定，但一事无成。唯一的成就就是结婚了，并且有了孩子，因为他觉得不该让这房子永远空著，所以房子变成了家。房子是都市生活的寓言，这个寓言不应该过早的和我们相关。<br /><br />　　28、年龄<br /><br />　　女孩子一过二十五就开始隐瞒自己的年龄，其实大可不必。现在青年期都延迟到四十五岁了，二十五又算得了什么呢？<br /><br />　　29、在乎<br /><br />　　这是一种拿不起、放不下的心态，它的反面不是放弃，而是天马行空，自由自在，永远保持革命乐观主义的精神。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/148366#comments" style="color:red;">已有 <strong>5</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 14 Dec 2007 15:31:50 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/148366</link>
        <guid>http://ewan.javaeye.com/blog/148366</guid>
      </item>
          <item>
        <title>Rails应用优化指南 (3)</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/145956" style="color:red;">http://ewan.javaeye.com/blog/145956</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          优化GC <br /><br />　　了解了如何通过优化Ruby代码来提升我们的Rails应用性能，现在让我们更深入一些，来看看Ruby的内存管理和垃圾回收机制。<br /><br />　　首先，由于Ruby最初的设计目标是成为像Perl那样的批处理语言，因此它的内存管理机制并没有针对Rails这样的需要长期运行的服务端程序进行最优化，有些地方甚至是背道而驰：<br /><br />Ruby的内存管理策略是尽量减少内存占用; <br />标记和清除算法十分简单; <br />使用malloc来分配连续的内存块(Ruby heap); <br />复杂的数据结构; <br />C扩展十分容易编写，但是当前的C接口很难实现generational GC(关于generational GC请参看[4])。<br />　　其次，Ruby的垃圾回收机制对于Rails也不是最优的，由于Ruby的AST(抽象语法树)存储在堆上，并且在每次GC时都会被扫描一遍，而这恰恰是Rails中最大的一块非垃圾区，也就是说，GC对于Rails做的大部分工作都是在做无用功。<br /><br />　　并且，Ruby的清除算法依赖于堆的大小，而不是当前非垃圾区的大小，但是堆的增长存在一定限制，只有当进行GC后，当前的freelist ＜ FREE_MIN，堆才会增加，gc.c中定义的增加值为4096，这对于Rails来说明显太小了，堆应该至少能够容纳20万个对象。<br /><br />　　要提高Ruby GC的性能，可以在Rails dispatcher中添加如下语句：<br /><br /># excerpt from dispatch. Fcgi<br />RailsFCGIHandler.process! nil, 50 <br /> <br /><br /><br />　　这句话将禁止Ruby GC运行，在处理50个请求后再启用GC，但是这个方法存在一个问题，它没法区分小请求和大请求，这有可能会导致：<br /><br />堆变的过大 <br />小页面的性能受损 <br />如果运行GC之后仍然没有足够的内存，Ruby还是会释放堆上的block<br />　　除了控制GC的运行时机，我们还可以通过修改GC的参数来提升性能，但需要先给GC打补丁，下载最新的Railsbench，打上rubygc.patch补丁，然后重新编译并安装Ruby，就可以通过以下参数对GC进行调整了：<br /><br />RUBY_HEAP_MIN_SLOTS, 初始堆大小，默认10000 <br />RUBY HEAP FREE MIN，GC后可用的heap slot的最小值，默认4096 <br />RUBY GC MALLOC LIMIT，允许不触发GC而分配的C数据结构的最大值(字节为单位)，默认8,000,000<br />　　我们的推荐值为：<br /><br />　　RUBY_HEAP_MIN_SLOTS = 600000<br /><br />　　RUBY_GC_MALLOC_LIMIT = 60000000<br /><br />　　RUBY_HEAP_FREE_MIN = 100000<br /><br />　　如果你进行基准测试的话，就会发现性能提高不少。<br /><br />　　优化模板<br /><br />　　好了，最后我们再讲讲模板优化，对于许多在编译时就知道结果的helper方法，完全没有必要在每次处理请求时都进行解析，比如：<br /><br /> ＜%= end_form_tag %＞ ===＞ ＜/form＞ <br /><br /><br />　　这纯粹就是浪费时间，还有我们前面提到的link_to，因此，如果我们可以在敲代码时确定这个helper的输出，那么最好直接写出结果。<br /><br />　　另外，还可以使用Ryan Davis的ParseTree和ruby2ruby来获取ActionView的render方法的AST，并进行模板终极优化：<br /><br />展开所有helper方法 <br />去除不会调用到的代码 <br />去除不会用到的变量(以及partials) <br />合并hash <br />替换常量 <br />替换结果已确定的方法调用 <br />替换符号<br />　　然后使用eval将新的AST编译入优化后的render方法。<br /><br />　　参考：<br /><br />　　[1] https://railsexpress.de/blog/files/slides/railsconf2006.pdf<br /><br />　　[2] http://railsexpress.de/blog/articles/2006/05/29/simpler-piggy-backing<br /><br />　　[3] http://www.letrails.cn/archives/18<br /><br />　　[4] http://en.wikipedia.org/wiki/Garbage_collection_(computer_science)
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/145956#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 18:03:20 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/145956</link>
        <guid>http://ewan.javaeye.com/blog/145956</guid>
      </item>
          <item>
        <title>Rails应用优化指南 (2)</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/145954" style="color:red;">http://ewan.javaeye.com/blog/145954</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          优化ActionController <br /><br />　　使用components会对ActionController的性能造成较大的影响，我的建议是没有特别的理由，不要使用components，因为调用render_component会引发一个新的请求处理循环。大部分情况下，component都可以使用helper 或者partials代替。<br /><br />　　优化ActionView<br /><br />　　对于每一个请求，Rails都会创建一个controller和view实例，并会将controller的action中创建的实例变量通过 instance_variable_get和instance_variable_set传递给view，因此不要在action中创建view中用不到的实例变量。<br /><br />　　优化helper<br /><br />　　首先是pluralize，可以看一下pluralize的实现，如果不给出最后一个参数，它会创建一个Inflector实例，因此不要写pluralize(n, ‘post’)，应该写成pluralize(n, ‘post’, ‘posts’)。<br /><br />　　其次是link_to与url_for，由于需要查找路由策略，因此link_to与url_for可以说是最慢的helper方法，没有特别的需要，不要使用这两个函数。<br /><br /> ＜a href=“/recipe/edit/＜%=#{recipe.id}%＞”class=“edit_link”＞<br />look here for something interesting<br />＜/a＞ <br /><br />　　会比下面这段同样结果的代码快许多：<br /><br /> ＜%= link to “look here for something interesting” ,{ :controller =＞ “recipe”, :action =＞ edit, :id =＞ @recipe.id },{ :class =＞ “ edit link” } %＞。 <br /><br /><br />　　优化ActiveRecord<br /><br />　　访问AR对象的关联对象相对而言会比较慢，可以使用:include提前获取关联对象<br /><br />class Article<br />&nbsp; belongs to :author<br />end<br />article.find ( :all, :include =＞ :author) <br /><br /><br />　　或者使用piggy backing指定要获取的关联对象的某些字段，关于piggy backing的介绍请参看[2]<br /><br />class Article<br />&nbsp; piggy back :author name, :from =＞ :author, :attributes =＞ [:name]<br />end<br />article = Article . find ( :all, :piggy =＞ :author)<br />puts article .author name <br /><br /><br />　　另外需要注意的是，从数据库中获取的字段值一般来说都是String类型，因此每次访问可能都需要进行类型转换，如果你在一个请求处理过程中需要进行多次转换，那么最好对转换后的值进行缓存。<br /><br />　　还有，根据我对一个应用的分析，大约有30%的时间花在了字符处理上，另外30%时间花在了垃圾收集，还有10%用于URL识别，因此在数据库中缓存格式化后的字段可以大大减小字符处理的开销。<br /><br />　　优化Ruby代码<br /><br />　　前面，我们的优化策略主要是针对Rails框架本身进行，现在我们将精力集中到Ruby语言本身上来。<br /><br />　　首先，Ruby语言中的各种元素由于算法的不同，访问时间也各不相等，比如局部变量采用数组索引，在解析时进行顶问，因此访问代价总是O(1)，而实例变量和和方法调用由于使用Hash访问，因此只能保持理论上的O(1)访问，也就是没有冲突的情况下，同时调用方法时如果不能在子类找到这个方法，则还需要沿继承树向上回溯查找。<br /><br />　　因此，应该尽量避免不必要的多态继承，同时应该尽量使用局部变量，比如下面这段代码的效率就不如修改后的高：<br /><br />def submit to remote(name, value, options = {})<br />options[ :with ] ||= ’Form.serialize( this .form)’<br />options[:html ] ||= {}<br />options[:html ][ :type ] = ’button’<br />options[:html ][ :onclick ] = ”#{remote function(options)}; return false ; ”<br />options[:html ][ :name] = name<br />options[:html ][ :value] = value<br />tag(”input” , options[:html ], false )<br />end <br /><br /><br />　　修改后：<br /><br />def submit to remote(name, value, options = {})<br />&nbsp; options[ :with ] ||= ’Form.serialize( this .form)’<br />&nbsp; html = (options[:html ] ||= {})<br />&nbsp; html[:type ] = ’button’<br />&nbsp; html[:onclick ] = ”#{remote function(options)}; return false ; ”<br />&nbsp; html[:name] = name<br />&nbsp; html[:value] = value<br />&nbsp; tag(”input” , html, false )<br />end <br /><br /><br />　　其次，对于经常用到的数据，应该进行缓存，避免每次用到时再进行计算，比如：<br /><br /> def capital_letters<br />&nbsp; ( ”A” .. ”Z” ). to a<br />end <br /><br /><br />　　写成下面这样会更好：<br /><br />def capital letters<br />　@capital letters ||= ( “A” .. “Z” ). to a<br />end <br /> <br /><br /><br />　　当然对于上面这种情况，如果所有类需要的数据都相同，那么完全可以将它定义成class级变量：<br /><br />@@capital letters = (“A” .. “Z” ). to a<br />&nbsp; def capital letters<br />&nbsp; @@capital letters<br />end <br /><br /><br />　　当然，除了效率也要注意优美，下面这段代码就不够优美：<br /><br />def actions<br />　unless @actions<br />　# do something complicated and costly to determine action’s value<br />&nbsp;&nbsp;&nbsp; @actions = expr<br />&nbsp; end<br />&nbsp; @actions<br />end <br /> <br /><br /><br />　　改成这样会更好一些：<br /><br />def actions<br />&nbsp; @actions ||=<br />&nbsp; begin<br />&nbsp;&nbsp;&nbsp; # do something complicated and costly to determine action’s value<br />&nbsp;&nbsp;&nbsp; expr<br /> end<br />end <br /><br /><br />　　另外，使用常量对效率也有一定提升。<br /><br />def validate_find_options (options)<br />&nbsp; options.assert valid keys( :conditions , :include , :joins , :limit , :offset ,<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :order , :select , :readonly, :group, :from )<br />end <br /> <br /><br /><br />　　上面这段代码进行如下修改会更好一些:<br /><br />VALID FIND OPTIONS = [<br />:conditions , :include , :joins ,:limit ,:offset ,:order , :select ,:readonly,:group,:from ]<br />def validate find options (options)<br />&nbsp; options.assert valid keys(VALID FIND OPTIONS)<br />end <br /> <br /><br /><br />　　同时，应该尽可能的使用局部变量。<br /><br />sql ＜＜ ” GROUP BY #{options[:group]} ” if options[:group]&nbsp; <br /><br /><br />　　上面这种方式明显不如以下两种：<br /><br />if opts = options[:group]<br />&nbsp; sql ＜＜ ” GROUP BY #{opts} ”<br />end<br />opts = options[:group] and sql ＜＜ ” GROUP BY #{opts} ” <br /> <br /><br /><br />　　当然，能够写成这样是最好的：<br /><br /> sql ＜＜ ” GROUP BY #{opts} ” if opts = options[:group] <br /><br /><br />　　但是目前版本的Ruby还不支持这样做。<br /><br />　　另外，还有一些小技巧：<br /><br /> logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger <br /><br /><br />　　这段代码的问题在于，不管logger.level是否为DEBUG，hash.keys.sort.join(’ ’) 都会被执行，因此，应该写成这样:<br /><br />logger.debug ”args: #{hash.keys.sort.join ( ’ ’ )}” if logger &amp;&amp; logger.debug?&nbsp; <br /><br /><br />　　还有就是关于ObjectSpace.each_object的，在production模式最好不要使用这个方法。<br /><br />ObjectSpace.each object(Class) {|c| f(c) }&nbsp; <br /><br /><br />　　事实上这跟下面的代码是相等的：<br /><br />ObjectSpace.each object {|o| o.is a?(Class) &amp;&amp; f(o) }&nbsp; <br /><br /><br />　　它会对堆上的每一个对象都进行检查，这会对性能造成极大损耗。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/145954#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 17:56:48 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/145954</link>
        <guid>http://ewan.javaeye.com/blog/145954</guid>
      </item>
          <item>
        <title>Rails应用优化指南(1)</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/145952" style="color:red;">http://ewan.javaeye.com/blog/145952</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Rails应用优化指南 <br /><br />　　如果你是一名Rails开发者，那么随着你的项目变得越来越庞大，你是否觉得你的Rails应用的响应速度变得越来越缓慢呢?来自Stefan Kaes的这篇关于Rails应用性能优化的文章或许能够帮你摆脱困境，虽说年代有些久远(RailsCONF 06上的一篇演讲稿[1])，但是其中的一些思想以及实践方法还是值得我们学习的。<br /><br />　　首先，在开始优化你的应用之前，我们需要先明确以下几点：<br /><br />没有相应的测试用例作为基础，就开始盲目的优化是非常愚蠢的; <br />如果你的应用是因为设计不合理而导致性能低下，那么我建议你最好花点时间重构你的代码，而不是进行局部的优化，因为这只会使问题越来越多; <br />在优化之前，最好先为自己树立一个目标，这样可以防止因为过度优化而浪费时间，达到预先设定的目标后就应该停下来了; <br />没有必要对每一个页面都进行优化，只需要关注那些最经常被访问的页面就可以了; <br />在开发期间，进行持续的性能测量，这样有助于你在优化时定位性能瓶颈。<br />　　其次，一旦优化完成，我们需要确定一组性能参数来衡量我们的优化效果，常用的参数包括以下这几个：<br /><br />延迟，即响应一个请求需要多少时间; <br />吞吐量，即每秒最多可以处理多少个请求; <br />系统利用率，在大量请求需要处理的时候，你的系统在满负荷运转吗?(比如CPU占用率达到100%了吗); <br />资源开销，在每个请求上所花费的资源开销。<br />　　确定了要测量的性能参数，我们还需要一个自动化的基准(benchmark)测试工具来帮我们完成应用性能的测量，以及对多次测量的结果进行比对，我们可以通过以下工具来获得应用的各项性能指标：<br /><br />Rails日志文件(debug_level ＞= Logger::DEBUG); <br />Rails日志分析工具(需要将日志输出到syslog)(RailsLogVisualizer就是一款不错的Rails日志分析工具; <br />Rails自带的基准测试脚本(script/benchmarker); <br />数据库提供的性能分析器; <br />Apache Bench(ab或者ab2); <br />httperf; <br />railsbench。<br />　　我推荐Railsbench，不同于其他工具，它测量的是Rails应用的原生性能(Raw performance)。由于去除了网络延迟等中间因素的干扰，Railsbench让你可以将精力集中到Rails应用本身，从而让你的优化变得更有针对性且高效(译者注：关于Railsbench的使用参看[3])。<br /><br />　　除了基准测试工具外，你也可以选择单纯的性能测试工具：<br /><br />Ruby profiler; <br />Zen profiler; <br />rubyprof; <br />Rails profiler script; <br />Ruby Performance Validator(商业软件，仅支持windows)。<br />　　不过事实上，Railsbench已经内置了性能测试工具，所以单独使用这些工具的必要性不大。<br /><br />　　介绍完工具，下面就正式开始我们的优化之旅吧!<br /><br />　　根据我的经验，Rails应用的性能问题一般集中在以下几个方面：<br /><br />很慢的helper方法; <br />复杂的路由; <br />过多的联合(associations); <br />过多的数据库访问; <br />缓慢的session存取。<br />　　不过，数据库的性能基本可以不用考虑，因为相比于构造ActiveRecord对象的开销，连接数据库本身的开销几乎可以忽略不计。<br /><br />　　在真正开始之前，还是有一点需要提前说明，优化策略事实上大部分情况下都不具备通用性，因为软硬件差异，用户使用习惯等等原因，可能会造成同一条优化策略在不同系统中得到完全不同的效果。不过也不必担心，这篇文章里讲的都是一些具有普遍适用性的策略。尽管如此，我还是建议你在应用这些策略时进行一下对比测试，因为很有可能它们对你的系统的作用有限，或者干脆不起作用，就像我们在开头说的，不要盲目优化。<br /><br />　　优化Session<br /><br />　　如果你的系统需要为每个访问者保存单独的Session信息(比如购物网站)，那么session的存取速度将是影响系统性能的关键因素，目前可用的session存取策略有：<br /><br />内存，快，相当快!但是如果你的应用挂了，或者由于其它什么原因需要重启，那么所有的session信息都会丢失，并且这种方式仅仅只能在单APP Server的应用中使用; <br />文件系统，很容易使用，每个session对应一个文件，并且可以通过NFS或者NAS轻松进行容量扩展，但是速度较慢; <br />数据库/ActiveRecordStore，使用简单(Rails的默认策略)，但是很慢; <br />数据库/SQLSessionStore，与上面一种方式类似，但是使用原始SQL取代了ActiveRecord，性能有一定提升，关于SQLSessionStore与ActiveRecordStore的对比可以参看[1]; <br />memcached，比SQLSessionStore稍微快一些，可扩展性较好，但是较难获取统计信息，关于memcached与SQLSessionStore的对比，参看[1]; <br />DrbStore，在memcached不支持的一些平台上，可以选择DrbStore，但是性能比memcached要差一些，并且不支持session自动清除。<br />　　优化Cache<br /><br />　　Rails默认支持以下几种Cache方式：<br /><br />Pages，很快，整个页面都被保存在文件系统，Web Server可以直接绕过APP Server完成请求应答，但是存在一些固有缺陷，比如无法应付需要用户登录的应用; <br />Actions，访问速度仅次于Pages，缓存controller的action执行结果，同时由于可以调用到controller的过滤器，因此可以很好的防止未授权用户访问; <br />Fragment，缓存请求结果的一部分，也可以感知用户是否登录。<br />　　Action Cache事实上是Fragment Cache的一种特殊情况，跟session一样cache也有以下集中存取策略可供选择：<br /><br />内存，最快的方式，如果你的程序只需要在一个APP Server上运行，那么这无疑是最好的方式; <br />文件系统，一般快，但可以使用正则表达式来刷新过期页面; <br />DrbStore，同文件系统相比，刷新过期页面更为快一些; <br />memcached，比DrbStore更快且易于扩展，但不支持使用正则刷新过期页面。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/145952#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 17:54:50 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/145952</link>
        <guid>http://ewan.javaeye.com/blog/145952</guid>
      </item>
          <item>
        <title>session的存取策略比较</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/145944" style="color:red;">http://ewan.javaeye.com/blog/145944</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>Session</strong><br />　如果你的系统需要为每个访问者保存单独的Session信息(比如购物网站)，那么session的存取速度将是影响系统性能的关键因素，目前可用的session存取策略有：<br /><br />内存，快，相当快!但是如果你的应用挂了，或者由于其它什么原因需要重启，那么所有的session信息都会丢失，并且这种方式仅仅只能在单APP Server的应用中使用; <br />文件系统，很容易使用，每个session对应一个文件，并且可以通过NFS或者NAS轻松进行容量扩展，但是速度较慢; <br />数据库/ActiveRecordStore，使用简单(Rails的默认策略)，但是很慢; <br />数据库/SQLSessionStore，与上面一种方式类似，但是使用原始SQL取代了ActiveRecord，性能有一定提升，关于SQLSessionStore与ActiveRecordStore的对比可以参看[1]; <br />memcached，比SQLSessionStore稍微快一些，可扩展性较好，但是较难获取统计信息，关于memcached与SQLSessionStore的对比，参看[1]; <br />DrbStore，在memcached不支持的一些平台上，可以选择DrbStore，但是性能比memcached要差一些，并且不支持session自动清除。
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/145944#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 17:42:06 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/145944</link>
        <guid>http://ewan.javaeye.com/blog/145944</guid>
      </item>
          <item>
        <title>ajax on rails</title>
        <author>mengwade</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://ewan.javaeye.com">mengwade</a>&nbsp;
                    链接：<a href="http://ewan.javaeye.com/blog/145924" style="color:red;">http://ewan.javaeye.com/blog/145924</a>&nbsp;
          发表时间: 2007年12月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          从今天开始，一周一篇ajax on rails 的读书笔记
          <br/><br/>
          <span style="color:red;">
            <a href="http://ewan.javaeye.com/blog/145924#comments" style="color:red;">已有 <strong>0</strong> 人发表留言，猛击-&gt;&gt;<strong>这里</strong>&lt;&lt;-参与讨论</a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">Windows7在微软WinHEC 2008上揭开神秘面纱</span></a></li><li><a href='/adverts/138' target='_blank'><span style="color:red;font-weight:bold;">加入阿里巴巴，发展潜力无限</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 04 Dec 2007 16:59:48 +0800</pubDate>
        <link>http://ewan.javaeye.com/blog/145924</link>
        <guid>http://ewan.javaeye.com/blog/145924</guid>
      </item>
      </channel>
</rss>