<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>wiisola</title>
    <description>以上三名，今日毕业</description>
    <link>http://wiisola.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>RHEL AS 3在虚拟机中的网络设置</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/223779" style="color:red;">http://wiisola.javaeye.com/blog/223779</a>&nbsp;
          发表时间: 2008年08月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为工作原因，在VMWARE下装了RHEL AS 3，在配置网络上遇到了点小小的问题，记下来以便以后参考。<br /><br />在公司一个人只分配一个帐号对应一个IP，因此网络连接方式不能选择桥接，选NAT，主机中IP自动分配，redhat中选DHCP。在激活虚拟网卡时，出错如：Determining IP information for eth0... failed; no link present. Check cable?于是GOOGLE，网上说VMWARE提供的虚拟网卡的驱动有问题，用下面方法可以解决。<br /><br />编辑/etc/sysconfig/network-scripts/ifcfg-eth0和/etc/sysconfig/networking/devices/ifcfg-eth0文件，在每个文件中追加：（修改一个，另一个也会改变，但并不是软连接什么的，不清楚什么原因。。）<br /><pre name="code" class="java">check_link_down() {
  return 1;
}</pre><br />接下来激活虚拟网卡eth0，service network restart就好了。<br /><br />PS：Redhat（or Fedora）毕竟和Ubuntu有点区别，进终端管他用户是不是sudoer，直接su -，呵呵。。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/223779#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>Mon, 04 Aug 2008 10:43:30 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/223779</link>
        <guid>http://wiisola.javaeye.com/blog/223779</guid>
      </item>
      <item>
        <title>Get Busy</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/222165" style="color:red;">http://wiisola.javaeye.com/blog/222165</a>&nbsp;
          发表时间: 2008年07月31日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          终于要开始忙了（已经白吃了一个月的饭了的说= =），估计以后每晚回去后的猎人生活是要大大缩减了...周末的联机也不好说了= = 由于是本地出差...所以很遗憾，只有那么点的出差补贴，真是羡慕老金啊，又是去上海，又有那么多的外地出差补贴，还能做开发，唉...话说那160块的午饭补贴还要我有发票，只能晚上回去苏果拖个两箱牛奶去了...那什么，项目完全摸不着头绪，还有2个月，正好一个项目快结束，说句不符合我一向风格的话：fight on...orz...
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/222165#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>Thu, 31 Jul 2008 13:12:47 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/222165</link>
        <guid>http://wiisola.javaeye.com/blog/222165</guid>
      </item>
      <item>
        <title>ubuntu以管理员权限打开文件(夹)</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/216090" style="color:red;">http://wiisola.javaeye.com/blog/216090</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          果然我还是不太适应shell阿，很多需要管理员权限的操作我还是比较依赖于图形界面的，之前有个懒人包解决了很多问题，现在不用了，有个普遍的办法解决这个问题。<br /><br />在终端里<br /><div class="quote_title">引用</div><div class="quote_div">vi ~/.gnome2/nautilus-scripts/Open\ as\ Administrator</div> <br />添加下面几行<br /><div class="quote_title">引用</div><div class="quote_div">for uri in $NAUTILUS_SCRIPT_SELECTED_URIS; do<br />gksudo "gnome-open $uri" &<br />done</div><br />保存退出，进终端<br /><div class="quote_title">引用</div><div class="quote_div">chmod +x ~/.gnome2/nautilus-scripts/Open\as\Administrator </div><br />现在只要右键点击文件(夹)，然后选择脚本 => Open as Administrator，就能以 root 权限打开文件(夹)。<br /><br />不过话又说回来，有现成的就不用考虑自己动手了，所以前面的都是废话（orz），基本只要一句，索列爹意~：<br /><div class="quote_title">引用</div><div class="quote_div">sudo apt-get install nautilus-gksu</div>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/216090#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, 18 Jul 2008 12:45:29 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/216090</link>
        <guid>http://wiisola.javaeye.com/blog/216090</guid>
      </item>
      <item>
        <title>ubuntu 8.04 rails安装问题</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/216059" style="color:red;">http://wiisola.javaeye.com/blog/216059</a>&nbsp;
          发表时间: 2008年07月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在8.04下用gem装好rails，rails -v无效，说我没装。<br />因为不习惯2.0的所以暂时还是装1.2.6的，于是想去网上直接下deb包安装。<br />装好以后发现rails -v依然无效，但是rails可用，后来系统一更新居然升到了2.0.2,真是麻烦阿<br />立马卸了，突然想到gem list里rails的确是安装了，于是有个最简单的办法，建个软连接<br /><div class="quote_title">引用</div><div class="quote_div">sudo ln -s /var/lib/gems/1.8/bin/rails /usr/bin/rails</div><br />rails -v, 显示1.2.6, OK了。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/216059#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, 18 Jul 2008 11:21:30 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/216059</link>
        <guid>http://wiisola.javaeye.com/blog/216059</guid>
      </item>
      <item>
        <title>解决ubuntu视频播放的“蓝色“问题</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/215703" style="color:red;">http://wiisola.javaeye.com/blog/215703</a>&nbsp;
          发表时间: 2008年07月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文：<a href="http://forum.ubuntu.org.cn/post-430009.html" target="_blank">http://forum.ubuntu.org.cn/post-430009.html</a><br /><br />问题描述<br /><br />当装好compiz-fusion后使用默认的设置进行视频播放时，compiz-fusion的一切特效都无法应用到动态的视频播放区域，确认取而代之的是一个蓝色的背景。<br /><br />解决方法<br /><br />针对每一种播放器进行具体设置，使其实现compiz-fusion特效。<br /><br />具体步骤<br /><br />*Totem+GStreamer播放方式<br />o 打开终端输入 "gstreamer-properties". 回车.<br />o 点击 Video 标签.<br />o 在默认视频插件上选择 "X Window System (No Xv)".<br />o 测试，关闭<br /><br />* VLC播放器<br />o 打开VLC，设置，选项<br />o 展开视频，展开输出模块<br />o 选择输出模块，高级选项<br />o 选择 X11 video output<br />o 保存退出<br /><br />* MPlayer播放器<br />o 打开 Mplayer<br />o 右键点击窗口选择 Preferences<br />o 点击Video 标签 and 在 Available Drivers 下选择 "X11 (XImage/Shm)"<br />o 保存，退出<br />+ 经过测试发现这样设置后无法缩放视频，也不能全屏播放.<br /><br />* GXine播放器<br />o 打开 Gxine<br />o 点击文件, 配置，首选项<br />o 选择用户级别为“已知世界的主人”（"Master Of The Known Universe"）<br />o 选择视频标签.<br />o 选择视频驱动为 "xshm".<br />o 保存，退出<br /><br />*Totem-xine播放方式<br />大多数人应该都用的这种播放方式吧，只需要将Gxine的配置文件内容:~/.gxine/config覆盖到Totem的配置文件:~/.gnome2/totem_config就可以了.如果没有Gxine现装一个然后先配好Gxine再覆盖配置文件。<br /><br />总结<br /><br />经过上面的一番设置我们的视频就可以实现一切特效了，但是显卡不太好的同学可能回出现CPU占用100%的情况，而且画面缩放的越大CPU占用越大。我的笔记本就是这种情况，不过基本能流畅播放。还有一点是在视频播放是转动立方体CPU占用率反到会降低不少。<br /><br />gstreamer-properties 修改后最大化时CPU占用很大。<br />Mplayer最大化后的CPU占用也变的很大，gstreamer-properties这里改回 “X Window System (X11/XShm,Xv)”<br />后Mplayer的CPU占用就恢复了。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/215703#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>Thu, 17 Jul 2008 11:20:17 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/215703</link>
        <guid>http://wiisola.javaeye.com/blog/215703</guid>
      </item>
      <item>
        <title>10句耍狠用的句子</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/215360" style="color:red;">http://wiisola.javaeye.com/blog/215360</a>&nbsp;
          发表时间: 2008年07月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          原文：<a href="http://bbs.dict.cn/viewtopic.php?t=15167&sid=5b0765d9d5e67d1da081f682bb449d66" target="_blank">http://bbs.dict.cn/viewtopic.php?t=15167&sid=5b0765d9d5e67d1da081f682bb449d66</a><br /><br /><br />1. Just wait and see. I won't let you get away with that. <br />咱们走着瞧。我不会让你得逞的。 <br /><br />2. You'll be sorry. <br />你会后悔的。 <br /><br />3. You're gonna get what's coming to you. <br />你会得到报应的。 <br /><br />4. If you're looking for a fight, you don't have to look far. <br />如果你想找人打架的话，不用找太远。 <br /><br />5. Watch your mouth. Do you know who you're talking to? <br />说话客气一点。你知道你在跟谁说话吗？ <br /><br />6. I'll get even with you sooner or later. <br />跟你的这笔账我迟早会要回来的。 <br /><br />7. Listen, you've picked the wrong person to quarrel with. <br />听着，你找错吵架的对象了。 <br /><br />8. You'd better take that back. <br />你最好收回那句话。 <br /><br />9. You want to take it outside? Anytime! <br />你想到外头解决（干架）吗？随時奉陪！ <br /><br />10. Don't mess with me! / Don't get fresh with me! <br />不要惹我！/ 给我放尊重一点！
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/215360#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>Wed, 16 Jul 2008 12:30:36 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/215360</link>
        <guid>http://wiisola.javaeye.com/blog/215360</guid>
      </item>
      <item>
        <title>以上三名，今日毕业</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/206618" style="color:red;">http://wiisola.javaeye.com/blog/206618</a>&nbsp;
          发表时间: 2008年06月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          借用現视研2的台词```久我山光纪、田中总一郎、斑目晴信```以上三名，今日毕业。。。所谓的”三“在这里是没有什么意义的囧```话说岛国的毕业时间是在冬季么```还下着雪呢```<br /><br />穿着魔法师套装，第一次进了那个新建的传说中的体育馆。惊讶里面居然还开着冷气，那么大的空间````话说我觉得毕业典礼在体育馆似乎气氛不如大礼堂```在等待开始的过程中发生了意料之中的事```虽然我也知道我一直以来上午胃里化学反应都比较剧烈``不过这次果然中奖了```和某次4级一样啊囧```不过话说我也体验了一次穿学士服XX（和谐词汇请根据上下文猜测），真是太享受了，为什么会感觉品味都提高了呢orz...（我不是变态哦，我真的不是变态哦~~）<br /><br />接下来的就很无聊了（还是XX比较享受的说），话说任何我们学校的领导都会提到一句“风景秀丽的龙王山“，我靠~~~秀丽个P啊~~~，这么囧的一句话怎么说的出口啊~~~接下来颁证书相当于走个过场了，跟无聊的领导握个手，再让领导把传说的穗子从右边拨到左边，就算毕业了```（咱还一直以为在左边算毕业呢```昨天拍的照都在左边了```）结果毕业证打开一看还是个空壳```囧```MS毕业证里面的纸过2天发，据说是为了防止明天的四六级作弊```好阴险啊```虽然我也不可能去作弊的说```<br /><br />颁奖过程中听到吴奇隆的祝你一路顺风，突然有种非常伤感的情绪（那什么```歌词的情境很合拍```虽然中间有穿插不伦不类的校歌的说```），毕业了，4年前我们走到一起，4年以后我们分道扬镳，各自向着自己的梦想前进，不知为什么，突然想到高中某位打篮球被T到重要部位造成局部功能障碍的同学```那什么```咱没有笑你的意思```希望你也坚强的活下去，朝着自己的梦想进发- -b
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/206618#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>Sat, 21 Jun 2008 11:27:37 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/206618</link>
        <guid>http://wiisola.javaeye.com/blog/206618</guid>
      </item>
      <item>
        <title>ubuntu 8.04 中文字体配置</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/190391" style="color:red;">http://wiisola.javaeye.com/blog/190391</a>&nbsp;
          发表时间: 2008年05月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          升级了8.04以后真是问题不断，compiz-fusion一用就白屏，字体有问题，剩余空间也不够了。。。唉，实在解决不了以后就重新装好了。。。好在字体问题能解决，不用正面面对难看的宋体和很多方框框了。。。JRE的字体设置问题没解决，结果netbeans的字体都是方框。。。以后全用英文的得了。。<br /><br />大部分内容取自ubuntu 7.10，红色部分内容是因为8.04改变了字体设置，将原来的设置文件分为4个。另外最后的下载渲染我没有试过有可能失败 - -。<br /><br /><br />&ldquo;Microsoft YaHei & Lucida Grande&ldquo;效果还是不错的，我注意了一下，似乎有种方正黑也很满好看的，可以考虑使用。  <br />首先从<a href="http://www.box.net/shared/lvh50qodvn" target="_blank">http://www.box.net/shared/lvh50qodvn</a>下载相关字体文件，解压后得到Lucida Grande和msyh两个字体文件，将这两个文件放到/usr/share/fonts/truetype目录下。然后执行一下命令：  <br /><div class="quote_title">引用</div><div class="quote_div">sudo fc-cache -fv</div><br />接着编辑字体配置文件 /etc/fonts/language-selector.conf (如果 /etc/fonts 目录下没有这个文件，可以在 /usr/share/language-selector/fontconfig 目录下找到相应的版本)，<span style="color: red">8.04以后找到/etc/fonts/conf.d/69-language-selector-zh-cn.conf文件，在3个字体名称段落最前面添加下面一行：</span>  <br /><pre name="code" class="html">&lt;string>Microsoft YaHei&lt;/string></pre><br /><br />编辑 /etc/apt/sources.list文件，添加源：  <br /><div class="quote_title">引用</div><div class="quote_div">deb http://www.telemail.fi/mlind/ubuntu gutsy fonts</div>  <br />执行一下命令导入key，并进行更新：  <br /><div class="quote_title">引用</div><div class="quote_div">gpg --keyserver subkeys.pgp.net --recv-keys 937215FF  <br />gpg --export --armor 937215FF | sudo apt-key add -  <br />sudo apt-get update && sudo apt-get dist-upgrade </div><br />（这将添加字体的cleartype渲染功能）  <br /><br />最后调整字体选项，非等宽字体选择Lucida Grande，9号，等宽字体选择DejaVu Sans Mono，9号。&ldquo;字体渲染选择&ldquo;次像素平滑&rdquo;。  <br />如果选择其中某个字体出现很多小方块的乱码，请输入以下命令（以simsun.ttc为例）设定权限：<br /><div class="quote_title">引用</div><div class="quote_div">sudo chmod a+r /usr/share/fonts/truetype/simsun.ttc</div>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/190391#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, 06 May 2008 22:14:41 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/190391</link>
        <guid>http://wiisola.javaeye.com/blog/190391</guid>
      </item>
      <item>
        <title>七种敏捷开发的方法</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/182327" style="color:red;">http://wiisola.javaeye.com/blog/182327</a>&nbsp;
          发表时间: 2008年04月13日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          文章转自：<a href="http://developer.51cto.com/art/200803/67844.htm" target="_blank">http://developer.51cto.com/art/200803/67844.htm</a><br /><br /><br />敏捷开发包括一系列的方法，主流的有如下七种：<br /><br /><strong>XP</strong><br /><br />XP（极限编程）的思想源自 Kent Beck和Ward Cunningham在软件项目中的合作经历。XP注重的核心是沟通、简明、反馈和勇气。因为知道计划永远赶不上变化，XP无需开发人员在软件开始初期做 出很多的文档。XP提倡测试先行，为了将以后出现bug的几率降到最低。<br /><br /><strong>SCRUM</strong><br /><br />SCRUM是一种迭代的增量化过程，用于产品开发或工作管理。它是一种可以集合各种开发实践的经验化过程框架。SCRUM中发布产品的重要性高于一切。<br /><br />该方法由Ken Schwaber和 Jeff Sutherland 提出，旨在寻求充分发挥面向对象和构件技术的开发方法，是对迭代式面向对象方法的改进。<br /><br /><strong>Crystal Methods</strong><br /><br />Crystal Methods（水晶方法族）由Alistair Cockburn在20实际90年代末提出。之所以是个系列，是因为他相信不同类型的项目需要不同的方法。虽然水晶系列不如XP那样的产出效率，但会有更多的人能够接受并遵循它。<br /><br /><strong>FDD</strong><br /><br />FDD （Feature-Driven Development，特性驱动开发）由Peter Coad、Jeff de Luca 、Eric Lefebvre共同开发，是一套针对中小型软件开发项目的开发模式。此外，FDD是一个模型驱动的快速迭代开发过程，它强调的是简化、实用、 易于被开发团队接受，适用于需求经常变动的项目。<br /><br /><strong>ASD</strong><br /><br />ASD（Adaptive Software Development，自适应软件开发）由Jim Highsmith在1999年正式提出。ASD强调开发方法的适应性（Adaptive），这一思想来源于复杂系统的混沌理论。ASD不象其他方法那样 有很多具体的实践做法，它更侧重为ASD的重要性提供最根本的基础，并从更高的组织和管理层次来阐述开发方法为什么要具备适应性。<br /><br /><strong>DSDM</strong><br /><br />DSDM（动态系统开发方法）是众多敏捷开发方法中的一种，它倡导以业务为核心，快速而有效地进行系统开发。实践证明DSDM是成功的敏捷开发方法之一。在英国，由于其在各种规模的软件组织中的成功，它已成为应用最为广泛的快速应用开发方法。<br /><br />DSDM不但遵循了敏捷方法的原理，而且也适合那些成熟的传统开发方法有坚实基础的软件组织。<br /><br /><strong>轻量型RUP</strong><br /><br />RUP其实是个过程的框架，它可以包容许多不同类型的过程，<br />Craig Larman 极力主张以敏捷型方式来使用RUP。他的观点是:目前如此众多的努力以推进敏捷型方法，只不过是在接受能被视为RUP 的主流OO开发方法而已。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/182327#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>Sun, 13 Apr 2008 15:53:04 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/182327</link>
        <guid>http://wiisola.javaeye.com/blog/182327</guid>
      </item>
      <item>
        <title>#012_重构用户名 PART3</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/180847" style="color:red;">http://wiisola.javaeye.com/blog/180847</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="ruby">require File.dirname(__FILE__) + '/../test_helper'      
     
class UserTest &lt; Test::Unit::TestCase      
  fixtures :users      
     
  def test_full_name_without_middle_initial      
    user = User.new(:first_name => 'John', :last_name => 'Doe')      
    assert_equal 'John Doe', user.full_name      
  end      
     
  def test_full_name_with_middle_initial      
    user = User.new(:first_name => 'John', :middle_initial => 'H', :last_name => 'Doe')      
    assert_equal 'John H. Doe', user.full_name      
  end      
     
  def test_full_name_with_blank_middle_initial      
    user = User.new(:first_name => 'John', :middle_initial => '', :last_name => 'Doe')      
    assert_equal 'John Doe', user.full_name      
  end      
end</pre><br />这是011中的单元测试代码，是不是很复杂冗长，好吧，让我们来重构一下<br /><pre name="code" class="ruby"># user_test.rb
def test_full_name
  assert_equal 'John Doe', full_name('John', nil, 'Doe'), "nil middle initial"
  assert_equal 'John H. Doe', full_name('John', 'H', 'Doe'), "H middle initial"
  assert_equal 'John Doe', full_name('John', '', 'Doe'), "blank middle initial"
end

def full_name(first, middle, last)
  User.new(:first_name => first, :middle_initial => middle, :last_name => last).full_name
end</pre><br />代码是清晰多了，但有人提出来testing one assertion per test<br />详见：<a href="http://blog.jayfields.com/2007/06/testing-one-assertion-per-test.html" target="_blank">http://blog.jayfields.com/2007/06/testing-one-assertion-per-test.html</a>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/180847#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>Wed, 09 Apr 2008 14:56:01 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/180847</link>
        <guid>http://wiisola.javaeye.com/blog/180847</guid>
      </item>
      <item>
        <title>#011_重构用户名 PART2</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/180820" style="color:red;">http://wiisola.javaeye.com/blog/180820</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          接着010里面的例子，让我们先写User类的单元测试吧<br /><pre name="code" class="ruby">require File.dirname(__FILE__) + '/../test_helper'

class UserTest &lt; Test::Unit::TestCase
  fixtures :users
  
  def test_full_name_without_middle_initial
    user = User.new(:first_name => 'John', :last_name => 'Doe')
    assert_equal 'John Doe', user.full_name
  end
  
  def test_full_name_with_middle_initial
    user = User.new(:first_name => 'John', :middle_initial => 'H', :last_name => 'Doe')
    assert_equal 'John H. Doe', user.full_name  
  end
  
  def test_full_name_with_blank_middle_initial
    user = User.new(:first_name => 'John', :middle_initial => '', :last_name => 'Doe')
    assert_equal 'John Doe', user.full_name
  end
end</pre><br />运行测试，很遗憾，第3个测试用例没能通过。<br /><pre name="code" class="ruby">class User &lt; ActiveRecord::Base      
  def full_name      
    name = first_name + " "   
    name += "#{middle_initial}. " unless middle_initial.nil?      
    name += last_name      
    name      
  end      
end</pre><br />虽然很好改，但我们决定继续重构一下<br /><pre name="code" class="ruby">class User &lt; ActiveRecord::Base
  def full_name
    [first_name, middle_initial_with_period, last_name].compact.join(' ')
  end
  
  def middle_initial_with_period
    "#{middle_initial}." unless middle_initial.blank?
  end
end</pre><br />因为加上了blank?这个方法，因此测试通过。<br />另外一个考虑是first_name与last_name是否为空，其实我真不是很懂。。<br /><pre name="code" class="ruby">[first_name, middle_initial_with_period, last_name].reject{ |i| i.blank? }.compact.join(' ')
[first_name, middle_initial_with_period, last_name].reject(&:blank?) * ' '</pre>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/180820#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, 09 Apr 2008 14:34:07 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/180820</link>
        <guid>http://wiisola.javaeye.com/blog/180820</guid>
      </item>
      <item>
        <title>#010_重构用户名 PART1</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/180808" style="color:red;">http://wiisola.javaeye.com/blog/180808</a>&nbsp;
          发表时间: 2008年04月09日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有这么几行视图代码，用来显示英文全名<br /><pre name="code" class="html">Name:   
&lt;%= @user.first_name %>   
&lt;%= "#{@user.middle_initial}." unless @user.middle_initial.nil? %>   
&lt;%= @user.last_name %>  </pre><br />当我们希望在多个页面内都显示这个全名，是否每次都要写这么4行代码呢？<br />想想我们的DRY原则，放弃这种不优雅的做法吧<br /><pre name="code" class="ruby">class User &lt; ActiveRecord::Base   
  def full_name   
    name = first_name + " "
    name += "#{middle_initial}. " unless middle_initial.nil?   
    name += last_name   
    name   
  end   
end </pre><br />在需要显示的视图中这样写<br /><pre name="code" class="html">Name:   
&lt;%= @user.full_name %> </pre><br />是不是很DRY呢？
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/180808#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>Wed, 09 Apr 2008 13:50:45 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/180808</link>
        <guid>http://wiisola.javaeye.com/blog/180808</guid>
      </item>
      <item>
        <title>#009_过滤日志中的敏感数据</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/180450" style="color:red;">http://wiisola.javaeye.com/blog/180450</a>&nbsp;
          发表时间: 2008年04月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          当我们注册用户的时候，在日志中会自动保存一些敏感的字段，比如password等。<br /><pre name="code" class="ruby">Processing LoginController#save (for 127.0.0.1 at 2008-04-08 13:53:22) [POST]
  Session ID: b40f205b38bd05382dc8ef2f362f5d5b
  Parameters: {"user"=>{"password_confirmation"=>"aaaaaa111", "login_name"=>"sora", "display_name"=>"Sora", "password"=>"aaaaaa111"}, "commit"=>"注册", "action"=>"save", "controller"=>"login"}
  User Columns (0.054099)   SHOW FIELDS FROM users
  SQL (0.002521)   SELECT count(*) AS count_all FROM users 
  SQL (0.000291)   BEGIN
  SQL (0.125573)   INSERT INTO users (`content_type`, `pic_name`, `salt`, `hashed_password`, `topics_count`, `personality`, `im`, `login_name`, `note`, `comments_count`, `display_name`, `data`, `email`) VALUES(NULL, NULL, '-6162285980.0824992721363479', 'afac1194f166bcb791bdabb32139edbf25c179ab', 0, NULL, NULL, 'sora', NULL, 0, 'Sora', NULL, NULL)
  SQL (0.049647)   COMMIT
Redirected to http://localhost:3000/
Completed in 0.35052 (2 reqs/sec) | DB: 0.23213 (66%) | 302 Found [http://localhost/login/save]</pre><br />这是一个安全问题，我们可以看到password以明文的形式存在。如何解决呢？很简单<br /><pre name="code" class="ruby">class ApplicationController &lt; ActionController::Base   
  filter_parameter_logging "password"   
end</pre><br />这样，其中的字段就会变成"password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"。<br /><br />在这里，本来插入数据库字段中的password也是会暴露的，但是我这里用了hashed_password字段，显示的是不可逆密文，而password字段实际上是一个虚拟字段，因此不会插入数据库。<br /><br />事实上，即使插入数据库语句中有明文password，我们也不用怕，因为在production环境中，SQL语句不会被保存进日志文件。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/180450#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, 08 Apr 2008 14:06:05 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/180450</link>
        <guid>http://wiisola.javaeye.com/blog/180450</guid>
      </item>
      <item>
        <title>#008_layouts和content_for</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/180078" style="color:red;">http://wiisola.javaeye.com/blog/180078</a>&nbsp;
          发表时间: 2008年04月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          如果我们希望在不同页面使用不同的样式，我们可以使用layouts + content_for，如第8行：<br /><pre name="code" class="html">&lt;!-- layouts/application.rhtml -->
&lt;!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"  
  "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">   
&lt;html>   
  &lt;head>   
    &lt;title>Todo List&lt;/title>   
    &lt;%= stylesheet_link_tag 'application' %>   
    &lt;%= yield :head %>   
  &lt;/head>   
  &lt;body>   
    &lt;div id="container">   
      &lt;h1>Todo List&lt;/h1>   
      &lt;%= yield %>   
    &lt;/div>   
  &lt;/body>   
&lt;/html></pre><br />在视图中使用content_for标签，即可实现在该不同视图根据需要调用不同样式的功能。<br /><pre name="code" class="html">&lt;!-- projects/index.rhtml -->
&lt;% content_for :head do %>   
  &lt;%= stylesheet_link_tag 'projects' %>   
&lt;% end %>

&lt;h2>Projects&lt;/h2>   
&lt;ul>   
  &lt;% for project in @projects %>   
    &lt;li>&lt;%= project.name %>&lt;/li>   
  &lt;% end %>
&lt;/ul></pre><br />话说Ryan还和大家讨论在一个视图中连接多个CSS是否合适，当然，这是合理的，也能给我们的开发带来更多的灵活。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/180078#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>Mon, 07 Apr 2008 13:37:57 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/180078</link>
        <guid>http://wiisola.javaeye.com/blog/180078</guid>
      </item>
      <item>
        <title>#007_关于layouts</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/179832" style="color:red;">http://wiisola.javaeye.com/blog/179832</a>&nbsp;
          发表时间: 2008年04月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          一般说来，layouts有5种：global layouts, controller layouts, shared layouts, dynamic layouts, action layouts.<br /><br />假设有这样一个视图<br /><pre name="code" class="html">&lt;!-- views/projects/index.rhtml -->
&lt;h2>Projects&lt;/h2>
&lt;ul>
&lt;% for project in @projects %>
  &lt;li>&lt;%= project.name %>&lt;/li>
&lt;% end %>
&lt;/ul></pre><br /><br /><strong>1. global layouts</strong><br /><pre name="code" class="html">&lt;!-- views/layouts/application.rhtml -->
&lt;h1>Global Layouts&lt;/h1>
&lt;%= yield %></pre><br />所有的controller都继承于application，因此application.rhtml会作为global layouts最先解析。<br /><br /><strong>2. controller layouts</strong><br /><pre name="code" class="html">&lt;!-- views/layouts/projects.rhtml -->
&lt;h1>Controller Layouts&lt;/h1>
&lt;%= yield %></pre><br />该layouts只作用于projects_controller<br /><br /><strong>3. shared layouts</strong><br />首先建立views/layouts/admin.rhtml，然后在controller中声明即可，可在多个controller中共享。<br /><pre name="code" class="ruby">class ProjectsController &lt; ApplicationController   
  layout "admin"  
  
  def index    
    @projects = Project.find(:all)   
  end   
end</pre><br /><strong>4. dynamic layouts</strong><br />我们可以根据需要为不同的用户选择不同的layouts，比如区别admin和user。同样可以用于博客主题的替换。<br /><pre name="code" class="ruby">class ProjectsController &lt;　ApplicationController   
  layout :user_layout   
  
  def index   
    @projects = Project.find(:all)   
  end   
  
  protected  
  
  def user_layout   
    if current_user.admin?   
      "admin"  
    else  
      "application"  
    end   
  end   
end</pre><br /><strong>5. action layouts</strong><br />在action中指定layouts即可。<br /><pre name="code" class="ruby">class ProjectsController &lt;　ApplicationController   
  def index   
    @projects = Project.find(:all)   
    render :layout => 'projects'  
  end    
end</pre><br />另外我们可以直接指定不使用任何layouts<br /><pre name="code" class="ruby">class ProjectsController &lt;　ApplicationController   
  def index   
    @projects = Project.find(:all)   
    render :layout => false 
  end    
end</pre><br /><br />这5种layouts的优先级为最里面的最高，也就是说action > dynamic > shared > controller > global.
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/179832#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>Sun, 06 Apr 2008 14:13:50 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/179832</link>
        <guid>http://wiisola.javaeye.com/blog/179832</guid>
      </item>
      <item>
        <title>#006_用to_proc标记缩写代码块</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/179675" style="color:red;">http://wiisola.javaeye.com/blog/179675</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我们经常需要将一个代码块传递给迭代器，并在代码块中调用另一个方法。Rails提供了一条实现这一功能的捷径，于是下面两句代码等价：<br /><pre name="code" class="ruby">groups = posts.group_by { |post| post.author_id }
groups = posts.group_by(&:author_id)</pre><br />让我们看下这一切是如何工作的:<br /><pre name="code" class="ruby">class Symbol   
  # Turns the symbol into a simple proc, which is especially useful for enumerations. Examples:   
  #   
  #   # The same as people.collect { |p| p.name }   
  #   people.collect(&:name)   
  #   
  #   # The same as people.select { |p| p.manager? }.collect { |p| p.salary }   
  #   people.select(&:manager?).collect(&:salary)   
  def to_proc   
    Proc.new { |*args| args.shift.__send__(self, *args) }   
  end   
end  </pre><br />&符号用在symbol前面实际上是调用了to_proc方法，而to_proc里返回一个Proc对象，内部为调用symbol指定的方法。举例如下：<br /><pre name="code" class="ruby">projects = Project.find(:all)
projects.collect { |p| p.name }
# => ["Rails Projects", "Housework"]
projects.collect(&:name)
# => ["Rails Projects", "Housework"]
projects.collect(&:name).collect(&:downcase)
# => ["rails projects", "housework"]
projects.all?(&:valid?)
# => true
projects.any?(&:valid?)
# => true</pre>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/179675#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>Sat, 05 Apr 2008 16:27:48 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/179675</link>
        <guid>http://wiisola.javaeye.com/blog/179675</guid>
      </item>
      <item>
        <title>与高手共事</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/179672" style="color:red;">http://wiisola.javaeye.com/blog/179672</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          版权声明：转载时请以超链接形式标明文章原始出处和作者信息及本声明<br /><a href="http://dreamhead.blogbus.com/logs/13258146.html" target="_blank">http://dreamhead.blogbus.com/logs/13258146.html</a><br /><br /><br /><br />大多数人都愿意与高手共事，因为他们指望着从高手身上可以学到很多东西。在ThoughtWorks，因为要pair，所以，我们可以有更多的机会与高手近距离一起工作。<br /><br />如果真的有机会和高手一起工作，有时，你会发现，从具体做的事来说，这些高手做的事并不像想象的那么高深，甚至可以说很简单，简单到换了谁都能做。于是，心中的高手形象逐渐开始动摇，难道令N多人景仰的高手就是这个样子。<br /><br />不知道你有没有想过这样一个问题，同样的事，如果没有高手的参与，换你来做，结果会怎样呢？<br /><br />老大给我讲了一个他当年和Ward Cunningham在一起工作的故事。每天做的工作就是日常的测试驱动开发，写测试、写代码，所有的一切都是异常简单，下午从不会耽误喝咖啡的时间，到点也就正常下班。一个月后，要做的事情做完了，没有觉得有什么特别之处。不过，回想了一个月前对于这个项目的看法，老大突然发现，这一个月里原来做了许多事情：一个月前，他还觉得这是一项不可能完成的工作。<br /><br />我最近的一个项目里，和我一起工作的是有我们中国区的CTO。这个项目的前期是一个类似于可行性论证的工作，项目最初，他为整个项目的结构订下了一个基调，让整个项目的结构显得特别清晰，准确的说，应该是很简单，简单到让人觉得理所当然。单从工作的具体内容来看，他并没有在这个项目里面做太多的事情，但从另外一个层面来说，正是他做的前期所做的工作，让后面的工作变得容易了许多。<br /><br />这么一说，是不是有一种高手形象顿失的感觉。其实，高手通常不会觉得自己是高手。多年积累下的，只是良好的工作习惯而已。他们知道，自己是普通人，自己不能应付过于复杂的东西，于是，把自己要做的事分解成一些非常简单的小事。只要把这些微不足道的小事做好了，所谓的大事便也做成了。<br /><br />我很喜欢读的书中，有几本书出自贝尔实验室，比如《程序设计实践》、《Unix编程环境》、《C程序设计语言》等等，每一本都是那么轻薄。这些书里面的内容读起来都是那么轻松，每一步做的事都让人觉得太过简单，但回过头来，可能你才发现，原来一些貌似很复杂的工作已经完成了。<br /><br />曾有一段时间，我一直觉得自己掌握的东西不够复杂，为此，我总是惴惴不安。后来发现，但凡我学过的东西本质上都很简单，于是我想，到底怎么才能让自己复杂起来。读过那几本书之后，我释然了：做事本就该是做简单的事。如果你觉得复杂，多半是走错了路。<br /><br />与高手共事，技术之外的东西，也许更值得学习。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/179672#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, 05 Apr 2008 16:00:09 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/179672</link>
        <guid>http://wiisola.javaeye.com/blog/179672</guid>
      </item>
      <item>
        <title>诡异的文件系统OnTrackDM6</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/179661" style="color:red;">http://wiisola.javaeye.com/blog/179661</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          移动硬盘有10G因为之前装系统荒废了，于是决定把数据备份出去，重格一下。首先进计算机管理看，我的移动硬盘居然有345G（其实只有60G），看来是出问题了，在这里没法删那个250G的分区。于是进PQMagic，果然，移动硬盘显示状态为BAD，于是删分区格式化应用，结果重启进PQ却中途失败。。接下来再进windows后移动硬盘能识别出来，但无法再对分区进行操作了。<br /><br />试了很多办法不行，于是挂到本本上，用效率源没有查到坏道，本来也没什么辙，突然发现D版番茄上有个什么DISK MANAGER，不管了，总之试一下，居然轻松帮我格成了FAT32。进win再格成NTFS，本以为一切OK了，谁知道ubuntu居然不认它。<br /><br /><div class="quote_title">引用</div><div class="quote_div">$sudo fdisk -l<br />/dev/sdb1   *           1        1653      833111+  54  OnTrackDM6</div><br />OnTrackDM6？这是什么文件系统？网上搜了一圈，搜到这么个东西<br /><div class="quote_title">引用</div><div class="quote_div">Adapt your bootloader and add the option hd&lt;x>=remap63 for your kernel where x is your disk.<br />Now reboot your system and the partition is visibale.<br />Mount this partition as read-only and copy your data from it.</div><br />看来这是为恢复数据用的，对我没什么用，其中第一句也完全不明白什么意思，囧。突然想到gparted还没试过，于是sudo apt-get install gparted。用gparted看了，果然sdb1是未创建，这下好办了，马上创建个分区，虽然没NTFS不过无所谓，分了个FAT32的，然后进win下重格为NTFS，一切OK。<br /><div class="quote_title">引用</div><div class="quote_div">$sudo fdisk -l<br />/dev/sdb1   *           1        1653      833111+  54  HPFS/NTFS</div><br /><br />PS：突然发现JaveEye似乎又改了一小部分，也就是把文章发表的时间显示改了，只有昨天，前天，再远就显示绝对时间了。虽然并不觉得这种改变有什么意义，还是衷心希望JaveEye能改版成功。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/179661#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, 05 Apr 2008 15:09:38 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/179661</link>
        <guid>http://wiisola.javaeye.com/blog/179661</guid>
      </item>
      <item>
        <title>#005_使用with_scope</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/178805" style="color:red;">http://wiisola.javaeye.com/blog/178805</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          接着004中的例子，004中我们希望找出所有未完成的任务，好吧，我承认，我半途而废的事实在是太多了，也许有几百个上千个，谁知道呢，一张A4纸肯定打不下，也许我应该先列出前20条，一条一条解决以后再去考虑后面的？<br /><br />事实就是这样，我要列出找到的前20条，并且距现在最近的事排在前面最先解决，更加以前的事就算忘了对现在的我也没什么影响。于是按照前面的方法，我们会这样说<br /><pre name="code" class="ruby">Task.find_all_by_complete(false, :limit => 20)</pre><br />进一步的，我们照004中的办法把find移入model，并且使用了with_scope，我们仍然能往find_incomplete里传入hash参数，这真是了不得。<br /><pre name="code" class="ruby"># model/task.rb   
belongs_to :project   
  
def self.find_incomplete(options = {})   
  with_scope :find => options do  
    find_all_by_complete(false, :order => 'created_at DESC')   
  end       
end    

# task_controller.rb  
def index   
  @tasks = Task.find_incomplete :limit => 20  
end     

# project_controller.rb 
def show
  @project = Project.find(params[:id])
  @tasks = @project.tasks.find_incomplete :limit => 20  
end</pre><br />非常好，这样我们便能DRY and more powerful了。这时候上司过来了，狠狠的训了我们一顿，说什么要是谁还留着一个礼拜之前的工作没完成，今天晚上就通宵加班。我很清楚的记得我确实留着几个上个礼拜的任务，也许我应该按时间顺序排出来看看到底是哪些没完成，我可不想加班，我想应该别人也不想。<br /><pre name="code" class="ruby">def index   
  @tasks = Task.find_incomplete(:limit => 20, :order => 'created_at')
end  </pre><br />遗憾的是，系统没能告诉我我应该去完成哪些该死的任务。之后看了hideto前辈的文章，我知道了，我们不能在调用find_incomplete时指定: order条件来覆盖该方法定义时默认的:order条件，那能不能改进一下我们的find_incomplete方法来解决这个问题呢? <br />很简单，我们可以将额外的参数merge进来: <br /><pre name="code" class="ruby"># model/task.rb
def self.find_incomplete(options = {})
  find_all_by_complete(false, {:order => 'created_at DESC'}.merge(options))
end</pre><br />或者使用ActiveSupport对Hash的扩展方法reverse_merge: <br /><pre name="code" class="ruby"># model/task.rb
def self.find_incomplete(options = {})
  find_all_by_complete(false, options.reverse_merge(:order => 'created_at DESC'))
end</pre><br />好吧，找到了任务就拼命去完成吧。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/178805#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, 02 Apr 2008 13:45:09 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/178805</link>
        <guid>http://wiisola.javaeye.com/blog/178805</guid>
      </item>
      <item>
        <title>#004_将查询移入模型类</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/178786" style="color:red;">http://wiisola.javaeye.com/blog/178786</a>&nbsp;
          发表时间: 2008年04月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          根据DHH提出的DRY原则，我们将一个公用的find方法移入model类（比如本例中的查找所有未完成的任务），然后就可以在controller中多次重用，也包括通过表间关联来查找。<br /><pre name="code" class="ruby"># tasks_controller.rb
def index
  @tasks = Task.find_incomplete
end

# models/task.rb
def self.find_incomplete
  find_all_by_complete(false, :order => 'created_at DESC')
end

# projects_controller.rb
def show
  @project = Project.find(params[:id])
  @tasks = @project.tasks.find_incomplete
end</pre>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/178786#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>Wed, 02 Apr 2008 13:07:32 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/178786</link>
        <guid>http://wiisola.javaeye.com/blog/178786</guid>
      </item>
      <item>
        <title>#003_通过表间关联来查找</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/178479" style="color:red;">http://wiisola.javaeye.com/blog/178479</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Rails不要求在迁移任务中建立外键约束，在迁移任务中创建project_id字段后在Project和Task模型中加上相应的声明。<br /><pre name="code" class="ruby"># project.rb
has_many :tasks

# task.rb
belongs_to :project

# projects_controller.rb
def show
  @project = Project.find(params[:id])
  @tasks = Task.find(:all, :conditions => [ 'project_id = ? AND complete = ?', @project.id, false ])
end</pre><br />于是，projects_controller.rb中show action的第2行代码可以改写一下<pre name="code" class="ruby">@tasks = @project.tasks.find_all_by_complete(false)</pre>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/178479#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, 01 Apr 2008 16:30:58 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/178479</link>
        <guid>http://wiisola.javaeye.com/blog/178479</guid>
      </item>
      <item>
        <title>#002_动态find_by方法</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/178464" style="color:red;">http://wiisola.javaeye.com/blog/178464</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <pre name="code" class="ruby">@tasks = Task.find(:all, :conditions => [ 'complete = ?', false ])
@task = Task.find(:first, :conditions => [ 'complete = ?', false ], :order => 'created_at DESC')</pre><br />以动态的find_by和find_all_by方法缩短查询语句，以下代码等效。<br /><pre name="code" class="ruby">@tasks = Task.find_all_by_complete(false)
@task = Task.find_by_complete(false, :order => 'created_at DESC')</pre><br /><br />另外<br />1.对于:conditons后面有2个参数的情况,下面的代码等效。<br /><pre name="code" class="ruby">Task.find(:all, :conditions => [ 'complete = ? AND category_id = ?', false, 1 ])
Task.find_all_by_complete_and_category_id(false, 1)</pre><br />2.动态查询支持nil, array以及range作为参数。看源代码有下面一段：<br /><pre name="code" class="ruby">def attribute_condition(argument)   
  case argument   
    when nil   then "IS ?"  
    when Array then "IN (?)"  
    when Range then "BETWEEN ? AND ?"  
    else            "= ?"  
  end  
end </pre><br />于是，如果想要查询上海或者北京，18到30岁的用户，可以这么写<br /><pre name="code" class="ruby">User.find_all_by_city_and_age([ 'Shanghai', 'Beijing' ], 18..30)</pre><br />3.动态查询仍然可以使用:conditions参数，额外的条件会使用with_scope来约束。<br /><pre name="code" class="ruby">Book.find_by_title('title', :conditions => ['price > ?', price]) </pre>
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/178464#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>Tue, 01 Apr 2008 15:59:31 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/178464</link>
        <guid>http://wiisola.javaeye.com/blog/178464</guid>
      </item>
      <item>
        <title>#001_实例变量做查询缓存</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/178435" style="color:red;">http://wiisola.javaeye.com/blog/178435</a>&nbsp;
          发表时间: 2008年04月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          看了Kevin Yang对初学者的建议，终于决定开始学习Railscasts了，目前一共有99个例子，暂且希望能每天坚持学习至少一个，并以文字的形式表述出来。 <br /><br /><pre name="code" class="ruby">User.find(session[:user_id])</pre><br />以上代码每次都会向数据库发起一条查询请求，为了提高性能，只需要多加一个或标记，就可以在已赋值的情况下不再发起查询请求。 <br /><pre name="code" class="ruby">@current_user ||= User.find(session[:user_id])</pre><br /><br />不过，论坛中的某位高人说了： <br /><div class="quote_title">hideto 写道</div><div class="quote_div">看起来不错，但是实际上有问题: <br />实例变量的作用域是一次请求，即一次请求结束后@current_user这个实例变量就没了，下次请求时会照样调用User.find(session[:user_id]) <br />即每次请求都会查询数据库。 <br /><br />所以这个视频中作者Ryan Bates在script/console中反复调用@current_user ||= User.find(session[:user_id])然后log中显示只查询数据库一次， <br />这是完全没有意义的！还好后来作者在后面的网页评论中作出了自我批评，但是想不通后面紧跟着一位&ldquo;chineseGuy&rdquo;在这里溜须拍马个不亦乐乎， <br />估计他根本没看懂这部视频，幸庆的是这位国人没有在留言时把自己的名字写成&ldquo;chineseGay&rdquo;。 <br /><br />而最重要的是，Rails目前已经内建支持查询缓存，见ActiveRecord源码包里的query_cache.rb。 <br />这样，即使一次请求里调用current_user方法多次，查询缓存仍然会让你只接触数据库一次。 <br /><br />另外，我推荐这种@current_user获取方式:http://hideto.javaeye.com/blog/100820 <br />其中logged_in?、require_login、editable?等辅助方法也很有用</div><br /><br />所以，其实该例是没有意义的..囧
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/178435#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, 01 Apr 2008 15:05:54 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/178435</link>
        <guid>http://wiisola.javaeye.com/blog/178435</guid>
      </item>
      <item>
        <title>这就是对蔑视神存在的人的惩罚吗</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/177808" style="color:red;">http://wiisola.javaeye.com/blog/177808</a>&nbsp;
          发表时间: 2008年03月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          因为刚把蛋蛋的坑填了，所以。。标题很囧。<br /><br />都怪之前在linux下用虚拟XP开迅雷启动了很多FF的OST下载，后来就直接进Win下了，结果昨天进win的时候经历了一次碎片还原，今天下好的好几个RAR包都部分CRC校验错误，只能重下。<br /><br />下次绝不在虚拟机中胡乱对宿主机的硬盘进行数据写入了，特别还是在linux的虚拟XP下对NTFS进行操作。。。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/177808#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>Sun, 30 Mar 2008 17:44:22 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/177808</link>
        <guid>http://wiisola.javaeye.com/blog/177808</guid>
      </item>
      <item>
        <title>[转载] Ruby、Rails、Agile的启示</title>
        <author>wiisola</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://wiisola.javaeye.com">wiisola</a>&nbsp;
          链接：<a href="http://wiisola.javaeye.com/blog/177232" style="color:red;">http://wiisola.javaeye.com/blog/177232</a>&nbsp;
          发表时间: 2008年03月28日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          转自：http://vipnews.csdn.net/newscontent.aspx?pointid=2008_03_03_170600555 <br /><br />文/杨祥吉<br /><br /><br />　本文作者以使用Ruby和Rails进行创业为经验背景，结合具体的项目，尝试以客观公正的方式来评价Ruby、Rails和Agile。下面的文字，我们将以名词解释和实践的方式看看这些词汇带来的价值：<br /><br /><strong>Agile</strong><br /><br />敏捷开发是一个高频度的热词。 实施敏捷开发的好处很多， 技术公司都在研究。NibiruTech从诞生便是一只遵循敏捷方法论的团队。 目前我们采用的敏捷技术，请看后面的名词解释。<br /><br /><strong>测试先行</strong><br /><br />所有的项目，都是以TDD的方式开发，要求先编写测试代码，然后再编写功能代码，使得这个测试被通过。新程序员入职最先接触到的就是TDD的 知识和各种培训。我们大量采用了Autotest这种工具，使得测试代码在开发过程中持续运行。甚至为了更方便查看，每个成员都配备了第二个显示器，其主 要用途就是为了显示测试运行结果。<br /><br /><strong>结对开发</strong><br /><br />结对开发已经成为我们的主要培养新人的方法。结对编程是指两人共用一台电脑，一路讨论编码。结对编程是一种乐趣，使得双人任何一人会感受到巨 大的乐趣。结对编程是共同分享技术挑战和难题，共同享受编码的乐趣。这会显著降低程序员的工作枯燥程度，提高技术水平。结对已经成为我们主要的培训方式。<br /><br /><strong>短周期迭代</strong><br /><br />敏捷开发中讲究短周期的迭代，尽量缩短项目Release的时间。NibiruTech做到每天自动部署到测试服务器上，方便远程的客户直接在互联网上查看当天的产品进度，并及时提交反馈。<br /><br /><strong>每日晨会</strong><br /><br />每日晨会上，大家回答“昨天做了什么工作？”、“今天计划做什么工作”。早上项目组的人到齐后，第一件事就是站成一个圆圈，依次讨论昨天的工 作和今天的计划。期间也有很多关于项目的整体需求，技术难点的讨论。由于大家都是站立开会，会议鼓励简短，高效的发言，显著提高了项目组的内部沟通和信 任，每日晨会的帮助很大。<br /><br />从我们的实践经验来看，执行力无疑是实施过程中很重要的因素。任何流程的形成都需要很大的决心和长期的努力。我们的经验是，一项一项地进行实 施。实施过程中不断进行调整和反省，当TDD成为一种习惯后，便开始晨会，几个星期后，晨会也成为团队习惯了，就能进行下一步。需要团队中有人强力地坚持 推行敏捷思路，而且要慢慢推进，一项一项地推进。<br /><br /><strong>Ruby</strong><br /><br />Ruby是一种有趣的语言。Ruby语言的创始人Matt从小就对计算机语言有天生的兴趣，强烈到无法自己。他前后编写了10种语言，没有任何一种release过，全部失败，直到第11种语言，被称为Ruby。<br /><br />Ruby是一种解释型的方便快捷的面向对象脚本语言，它是日本的Yukihiro Matsumoto(人们都叫他Matz)于1993年2月24日首次发布的。<br /><br />Ruby精心地设计了它的面向对象特性，使之完整并且开放允许改进。比如：Ruby有在运行时可以向类里，甚至能够向实例里添加方法的能力。所以，如果有需要，某个类的一个实例可以表现得和同一个类的其他实例不一样。<br /><br />Ruby是一种完整的纯面向对象语言(OOL)。这就是说所有的数据在Ruby里面都是对象，不是像Python或Perl那样，而是像Smalltalk那样的纯面向对象（没有什么例外）。比如：在Ruby里面，数字1是类Fixnum的一个实例。<br /><br />Ruby精心地设计了它的面向对象特性，使之完整并且开放允许改进。比如：Ruby有在运行时可以向类里，甚至能够向实例里添加方法的能力。所以，如果有需要，某个类的一个实例可以表现得和同一个类的其他实例不一样。<br /><br />假如你希望Procduct类的find方法在参数为1 的时候，直接返回某个事先设定的对象。借助Mocha这个Ruby gem，你可以用近乎人类自然语言的方式说：<br /><br /><pre name="code" class="ruby">product = Product.new
Product.expects(:find).with(1).returns(product)</pre><br />这就是Ruby 强大而又灵活的地方。<br /><br />Ruby一个思想是，语言应该尽量给编程者最大的自由度，当然需要程序员明白自己在做什么的情况下。<br /><br /><pre name="code" class="ruby">Class A
  Private
  Def private_method
   #….
  end
end</pre><br />声明了为Private的方法，在其他语言中是不能被其他类中调用。而在Ruby中，假如你确信你需要这样做，你可以：<br /><br /><pre name="code" class="ruby">a = A.new
a.send(“private_method”)</pre><br />因为Ruby认为一旦程序员知道自己想做什么，就应该让他去做,即使违反了常规。<br /><br />从来没有见到过任何一门语言可以如此轻松的对已有的核心API进行修改和增强。<br /><br />例如Rails的作者在写Rails的时候，就对Ruby的Hash需要进行增强。<br /><br /><pre name="code" class="ruby">module ActiveSupport 
  module CoreExtensions     
    module Hash 
      module ReverseMerge
        def reverse_merge(other_hash)
          other_hash.merge(self)
        end
      end
    end
  end
end</pre><br />而后只需要：<br /><br /><pre name="code" class="ruby">class Hash #:nodoc:
  include ActiveSupport::CoreExtensions::Hash::ReverseMerge
end</pre><br />便成功地为Hash这个类添加了revers_merge这个方法。<br /><br />上述例子，只是Ruby语言强大灵活的一些简单例子。可以说，正是因为Ruby语言，才使得Rails成为现实。很难想象其他任何一门语言能够让一个独立的程序员完成一个如此出色的Web框架。Rails使用的越多，越是感受到Ruby和Rails同样出色。<br /><br /><strong>Rails</strong><br /><br />作为computer world评选出的2007年最值得研究技术，Ruby On Rails从一出生就是媒体的宠儿。这一切源自其独特的思维，抛弃原有技术落后遗产，轻装上阵的便捷。<br /><br />许多人都看过下面这幅图片，图片的左边是使用Java Web框架，所需要用到的技术书籍。右边是使用Ruby on Rails，需要用到的技术书籍，只有两本，简洁清新，优雅愉快。作为一个使用Ruby On Rails的先行者，我想指出上面的图只是从技术复杂程度上进行了对比。事实上，Java作为重型武器，有许多轻型武器暂时无法取代的地位。只是从技术的 复杂度讲，Ror确实简单优雅许多。<br /><br /><strong>DRY 原则</strong><br /><br />这些设计规则中的一个就是来自于Dave Thomas的Pragmatic Programmer一书中的“DRY重用原则（Don"t Repeat Yourself）”DRY原则意味着创建到应用程序中的信息和逻辑应该被局部化或隔离。它应该尽可能少的存储在更少地方，副本应该保持在绝对最低限度。 这种原则有助于组织开发者的思路和保持好的开发速度，而且使得的代码可以被更轻松修改。这种更轻松的修改所带来的好处不仅仅体现着维护模式中，在最初的开 发中同样也会体现出来。Ruby通过使编程更轻松，而鼓励这种行为。<br /><br /><strong>convention over configuration</strong><br /><br />Rails强调convention over configura-tion。这意味着这个框架的用户不用去做太多的设置工作，或者不用花费太多的时间来处理一些个别的组件。举个例子来说，Rails 假定在代码中的类名称和数据库中的表名称之间存在关联。如果你坚持这个标准约定，你代码将显得更具有逻辑性和更平稳；否则，你将不得不做一些额外的工作。 当默认约定与你的实际情况发生冲突时，感谢Ruby难以置信的灵活性和宽容，你可以轻易改变任何Rails的行为，使得其完全按照你的思维运行。<br /><br />Ruby on Rails这样的技术的出现，使得实现一个独特的互联网创意的代价急剧降低，从而加剧了创业的门槛，使得任何领域内充满了大量的创业者。竞争的加剧使得创新不断涌现，互联网急剧的改变着整个人类社会的发展。<br /><br />最近数年中，Facebook、Myspace、youtube等网站的创新，及其大量的追随者，极大的方便了人们的生活，工作和学习。可以说，任何受过良好教育的人，已经无法离开互联网了。网络游戏、网络媒体、电子商务、软件外包，因为互联网才得以出现。<br /><br />互联网时代，使得个人成为英雄的机会大大增加。DHH，作为一名26岁的丹麦年轻程序员，不满意大公司傲慢的web框架，从自己的工作项目中，抽取了一个实用小巧的framework，这个小小的开源项目，成就了2005年技术领域的创新，DHH一个人改变了世界。<br /><br />Ruby on Rails在2004年发布了它的第一个公众版。现在它已经不是一个蹒跚学步的孩子。在2005年，David Heinemeier Hansson因为这个软件程序获得了“年度最佳黑客”奖项。在2006年，Rails赢得了2006年度Jolt大奖的最佳Web开发工具，2007年 Rails被评选为年度最值得研究技术。<br /><br />当前人们对Ruby这门编程语言吵得不可开交了，尤其是对Rails这个Web应用开发框架更是吵得一塌糊涂。有人说它是编程的未来，前途光明；有人说它是旁门左道，危险暗淡。<br /><br />我是在1年前开始用Ruby来创作http://www.englishquad.com，边学边用的过程充满了艰辛。当技术转型完成后，一切变得如此美好，以至于一直想更好地使用RoR为更多的企业服务。<br /><br />通过和更多的使用RoR企业交流，已经可以根据好几个项目的经验做分析了，到目前为之，分析结果力挺Ruby。每次我问使用过RoR的人： “你觉得用Ruby比用Java或C#生产力有显著提高吗？”我听到的无一例外都是一句有力的肯定：“是的！”这已足够让我开始断言：如果你的项目合适， 就应该给Ruby个机会。<br /><br />也有观点认为，尽管Ruby和Rails是出众的平台，但可能无法成为主流。完全理解这个观点，优秀高产的平台可能成不了当前主流企业应用的首选。如果对你而言，重要的是只采用主流平台，那么你还得静观其变。不过，不囿于主流而获成功的案例也非常多。<br /><br />还有许多项目，开发的生产率并不是首要的，取而代之的是政治及其他沟通上的因素。那样的话，RoR的优势就被大大削减了。<br /><br />总的来说，通过数年的RoR创业和对其他伙伴的关注，我对在注重速度、响应性以及生产力的严肃工作中使用RoR持越来越肯定的态度，并愿意将我们的经验分享出来。<br /><br /><strong>源自真实应用</strong><br /><br />Rails来源于真实世界中的应用程序。Rails并不是最初的目标产物，当时是为了开发一个叫做Basecamp的Web应用程序。在 DHH和其他人开发这个应用程序的时候，他们多次发现，Web开发是一件令人痛苦的事情，而且耗时、具有反复性和注重细节。这给了Ruby on Rails一个诞生的机会。<br /><br />在编写这个高度浓缩的Ruby编码的过程中，DHH开始从界面的本质进行提炼，于是就诞生了Ruby on Rails。因此说它源于真实世界的需求，源于使用中的代码，源于开发者的每日体验。这与其他技术框架的学术和研究气质非常不同。<br /><br />这正是RoR社区中的一个特点。在RoR社区中，很难看到“学术”性质的东西，也很难看到所谓的“流派”，只有非常真实代码和思想。 Rails技术领域的最高技术会议RailsConf，也鼓励展示领域内的项目创新。没有大公司的搅局，纯粹程序员的文化氛围，一切都显得简单到极致。<br /><br /><strong>Ruby 和Rails的关系</strong><br /><br />　　在世界范围内，Rails以不可抵挡之势席卷Web开发领域，带来了全新的开发理念和难以置信的开发效率。 对于一些初学者而言，也许不能理解Ruby On Rails其实是指一个Web框架，这个Web框架是用Ruby这种语言来开发的。<br /><br />Ruby是目前各种主流语言中最优美，最简练的一种语言。正是因为DHH选择了Ruby作为Rails的语言，使得Rails这套框架轻便而 又强大无比。Ruby语言的动态特性，通过Rails这个成功的项目，得到了主流开发社区的认同。在笔者自己的开发项目中，越来越多的项目证明，正是因为 Ruby使得Rails成为可能。Ruby社区中的许多理念，走在了软件开发的前沿。<br /><br />所以，Ruby成就了Rails，Rails让Ruby成为明星。它们都是非常出色的技术，我们热爱这两种技术。<br /><br /><strong>Ruby 和Rails的一些应用</strong><br /><br />笔者创办NibiruTech前，曾是www.englishquad.com 创始团队之一。参与将一个在线语言学习平台的想法，通过学习和使用Rails，变为实在的产品，并进入运营阶段。国内的新锐Web 2.0网站财帮子，http://www.caibangzi.com，从今年4月开始上线，短短几个月时间，就能在高峰时期达到每小时数十万的PV。在与财帮子创始人交流之中，大家都同意如果不是选择Ruby On Rails这项技术，开发成本将成倍增加，而开发周期还将显著增长。其他典型的RoR站点包括：<br /><br />JavaEye   http://www.javaeye.com<br />iease我易   http://search.iease.com.cn<br />51dir   http://www.51dir.com<br />发生网   http://www.8sheng.com<br />友播网   http://www.yobo.com<br />乐道   http://www.likenote.com<br />著名的国外Twitter就是用Ruby On Rails开发的：http://www.twitter.com。<br />最近势头很盛，与Youbute一争高下的hulu.com，也盛传是Ruby on Rails的杰作：http://www.hulu.com。<br /><br /><strong>Ruby和Rails的企业级应用真实案例</strong><br /><br />　　目前Rails在Web 2.0中的应用获得足够的眼球，最新的创业，不少都基于Rails技术框架，然而事实上，在Web 2.0之外，Rails仍然大有希望在企业级应用，甚至金融领域大有作为。在Rails以前，很多技术的特点是“用复杂的技术来解决复杂的问题”，以复杂 性对抗复杂性，人的感受成为一种痛苦。Rails提倡简化开发流程，引入多种思想，成功地将开发变成一种乐趣，并为企业带来实实在在的价值。<br /><br />E公司是北美一家小型金融服务公司。过去，大量使用的技术为微软技术。当E公司在.NET架构上越陷越深的时候，发现很多东西过度依赖微软的 技术框架，成本代价非常大，而且由于测试技术的不全面，使得维护成本很高。企业存在时间超过10年，多数核心业务组件是用微软的技术。但随着业务的发展， 微软技术平台上的诸多问题逐渐暴露。首先是高昂的许可费用，缓慢的技术服务，以及商业技术平台特有的不开放特性，使得业务系统革新面临巨大挑战客户决定使 用最便于测试的语言，Ruby来进行核心业务的重写。<br /><br />Ruby天生对TDD理念的支持，使得任何Ruby项目都能非常好的进行TDD测试和开发。结合Ruby令人称奇的高级语言特性，使得技术转 型进展非常顺利，成为全世界少有的使用Ruby和Rails来取代旧技术，并在金融领域成功运作的案例。这充分证明了Ruby和Rails在企业级应用市 场上的潜力。<br /><br />从2006年Rails崛起之时，公司决定尝试使用Ruby和Rails来改进已有系统。经过两年的努力，公司已经将外围项目升级到了 Ruby和Rails技术平台，技术人员也成功实现了技术转型。在新的Ruby 和Rails平台上，得益于新技术，开发人员的工作效率，代码的质量同以前相比，有巨大提升。更不用提任何使用Ruby 和Rails的程序员，生活质量都明显提高了。<br /><br />在尝到甜头后，E公司坚定了技术转型的决心。然而，在北美，懂得Ruby On Rails的技术人才稀缺。通过与NibiruTech合作，E公司成功地解决了开发人员稀缺的问题，在双方共同努力下，开始对核心业务进行升级。E公司 信用卡业务，去年的交易额是40亿美元，交易系统是由多种技术混合而成的技术平台。其中一个用Delphi完成的基础组建，使用了10年，代码已经十分陈 旧，几乎没有任何测试代码覆盖，任何改动都充满风险。通过与NibiruTech合作，我们成功地将这个组件用Ruby重写，代码量减小到原有的10%， 并且包含重度的测试覆盖，为核心业务的升级做好了准备。这个案例充分说明了Ruby这种语言强大之处，为企业带来的不仅仅是成本的节约，更是技术架构换代 升级后的各种好处，使得企业在技术方面充满竞争力。<br /><br />RoR开发，不仅是快速高效，更重要的是优雅简洁，与任何其他的技术相比，这个方面的优势可谓巨大。IT巨头们也没有忽视RoR的崛起。 Sun是现在RoR的主要支持者之一，Netbeans默认支持RoR的开发。整个J2EE社区渴望将Ruby和Rails嫁接在一起，让RoR可以继承 Java的巨大遗产，而Java则可方便使用Ruby和Rails的各种创新，为整个企业界的开发带来了一股新鲜的风气。<br /><br /><strong>文化对Ruby 和Rails的影响</strong><br /><br />　　任何一个出色的群体，都会在某些方面有个性的特征，被称作文化。Ruby On Rails这个群体，目前尽管得到了广泛的关注，炙手可热，但仍然属于小众。这个群体的创造力是非常强的。这个群体的开源氛围也很好。<br /><br />Mac文化，笔者从来没有见过任何一个计算机群体拥有如此高的创造力和文化魅力。可以说，Mac世界的人对Apple文化就是一种宗教般的狂 热。笔者使用PC时间长达10年，今年转变为Mac用户后，终于体会到了Mac的华丽和易用性。笔者问身边许多使用Mac的朋友，下一台电脑，你会选择 PC，还是Mac？100%的回答是会继续选择Mac。简短几个月，笔者在Mac下面进行工作、学习的经验，已经让我很难在回到Windows了（必要的 时候会使用Windows虚拟机）。<br /><br />看看主流的Rails社区，清一色的Mac用户。Mac的很多文化，在Rails诞生之日，变顺利集成下来。Mac和Rails都优雅，简 单，与众不同，在各自的领域中，都是最具有艺术气息的产品和技术。使用这些产品和技术，使得工作也变得简单和优雅起来，让程序员觉得自己不仅仅是工程师， 也是艺术家。<br /><br /><strong>Ruby On Rails的常用武器</strong><br /><br />测试工具<br /><br />　　我们实际工作中， 严重依赖以下测试工具：<br /><br />● Autotest：开始编码了？ 第一件事是打开Autotest，结束编码了，最后一件事是关闭Autotest。编码的过程中， 应该一直让autotest开着，它会一直检测你的代码改动，自动持续运行测试，是最好的TDD工具。<br />● Rspec : 抛弃Rails原有的测试框架吧，这个更优秀。<br />● Mocha: 可以让你轻易实现Mock功能，非常好用，语法如英文般自然。<br />● Selenium: 项目稳定后，可以用来做交付测试，自动启动浏览器，完全模拟人的鼠标键盘点击，进行测试。<br />● Cruise Control：持续集成，在源代码服务器端验证运行测试代码，确保不会出现“it works for me”，文件漏提交，以及开发环境不同带来的bug等问题。<br /><br />学习和使用RoR，却不用TDD方式，实在是非常大的损失。以我自己的经验来看，国内遵循TDD方式开发的团队，是非常稀少的，原因是TDD 的学习需要对已有的软件开发思维进行巨大的调整。过去是写好了代码后，为了应付检查，匆忙补上测试代码。如果项目紧张的话，领导也会体谅没有时间写测试代 码。而遵循TDD之后，是任何时候都在编写重构测试代码，并且是先写好测试代码，然后在去实现这个测试，其中的乐趣巨大，当项目进入中期后，面对几千行代 码，几百个测试用例是最有信心的保障。<br /><br />许多非TDD信徒怀疑，采用TDD后，工作量成倍增加，从而导致开发速度降低。事实上， 在我们的实际工作中，由于采用了RoR，以及其他的非常棒的测试框架和技术，使得我们的测试成为工作最有力的保障，使得我们开发的速度急剧提高，大部分情 况下，我们从事Web开发，却不开启浏览器，当所有的测试用例都通过的时候，我们是非常有信心保证，所有的页面都是正确可用的。DHH在演讲中声称，在 ROR框架中，不写测试的人应该受到惩罚。以笔者自己学习和工作经验来看，走向TDD是技术生涯中最大，也是最有乐趣的一次转变。整个 NibiruTech的人都有这样的体会，没有测试代码，我们不知道如何写程序。<br /><br /><strong>操作系统</strong><br /><br />操作系统的问题上，Rails社区有强烈的Mac感情倾向。无疑Rails、Ruby和Mac是天生的搭档，使用这三者会使得工作充满乐趣。 作为一名专业的计算机工程师，使用Unix系统总是一种回家的感觉。Mac同属Unix分支，系统安全性非常出色，加上苹果公司公认的艺术般的UI设计， 使得Mac成为专业工程师最有力的操作系统之一。<br /><br />笔者从Windows过渡到Mac的过程也并非一帆风顺。最初的两个星期，对于Mac完全是陌生，过去使用Windows严重依赖快捷键， Mac的键盘布局与Windows不同（后来认为更合理），导致工作效率很低。由于各种Windows常见的软件不容易找到，于是就安装了虚拟机的 Windows版本。逐渐熟悉了Mac的各种系统界面后，现在对Mac非常习惯，已经融入到了Mac世界中。对我而言，Mac有3点好处：<br /><br />１、血统纯正的Unix系统<br />２、非常安全，非常稳定，完全不用担心备份操作系统，不担心木马病毒<br />３、华丽的界面，使用艺术品一样的享受<br /><br />以上三点，是Windows无法提供。当然，Windows作为统治者，有很多软件方面的广泛支持，难免需要用到的时候。这种情况下，请出虚拟机，启动Windows，完成必要的工作，然后离开。<br /><br />从事Ruby On Rails开发，Mac无疑是最佳选择。如果无法使用Mac，那么Ubuntu也比Windows要好一些。作为专业计算机工程师，一直使用Linux， 软件都手动编译，将会成为提高对计算机理解的一条捷径。Google公司最新的Andriod系统，证实了对Linux的投资，迟早会让使用者站着一个更 好的新技术位置。<br /><br />禁止使用Windows已经成为NibiruTech的公司核心文化。每一个成员，都需要在Unix/Linux系统下，完成工作任务。再也 不用担心烦人的病毒和间谍软件，Window上太多分散人注意力的地方，使用Linux后，公司员工的生产效率一点也不比Windows低，而且避免了各 种法律问题。<br /><br />按照优先级向技术团队推荐OS ：<br /><br />● Mac OS X<br />● Linux/Ubuntu<br />● Windows<br /><br /><strong>IDE</strong><br /><br />　　在NibiruTech内部，我们鼓励使用不同的IDE来开发程序。<br /><br />IDE这个问题上，纯粹的优劣之争已经没有太大价值。任何一个主流的IDE都经过大量用户的检验，功能设计上都已经比较成熟，效率也都很高。 由于NibiruTech是一个重度TDD团队，出现需要调试的机会非常少。Ruby又是一种动态语言，IDE能做的事情不是太多。所以选择IDE重要的 是看你是否已经熟悉其中的某种，快捷键直接影响了编码的效率。<br /><br />● TextMate<br />● Eclipse(RadRails)<br />● Netbeans<br />● Emacs<br /><br />任何让你得心应手的IDE就是你最好的IDE。<br /><br /><strong>Ruby和Rails学习建议</strong><br /><br />Ruby On Rails同主流的技术相比，文档方面稍微欠缺一些，官方的支持少一点。Agile Web这本书是这个领域的Bibile，每个开发人员都应该仔细看看。Ruby语言与其他主流语言还是有比较大的不同，建议多看看screencast和开源项目。<br /><br />给初学者的建议是最简单的平台：<br /><br />● 使用windows + instantrails + radrails；<br />● 先把Agile书•¬一遍；<br />● 动手将Depot做一遍；<br />● 把Railscast和peepcode看一遍，能懂多少算多少；<br />● 可以动手完成一个实际的项目；<br />● 放弃Windows，做一个真正的Hacker，迁移到Mac或ubuntu；<br />● 重新配置Ruby和Rails环境，如果没有unix的经验，会非常受挫折，做好准备。<br /><br />学习Ruby On Rails，可以在中小项目里直接应用Rails从而获得高速的开发速度，也能借鉴RoR社区中的许多前沿设计理念，帮助改善Java项目的架构。<br /><br />Rails的入门有个特点，通过观看官方视频，花上15分钟写一行代码，就能实现第一个完整的CRUD系统。而别的技术派别，学习代价非常巨 大。当然RoR入门的第一个难点是配置环境。如果在Windows下，下载一个InstantRails、看看说明，就可以零配置完成第一个 HelloWorld。<br /><br /><strong>给企业的建议：</strong><br /><br />● 听说过使用Ruby 和Rails而后悔的企业吗；<br />● Ruby和Rails在技术上拥有明显的快速开发的优势；<br />● 能带来的好处不仅仅是成本下降，更重要的是产品质量的显著提升；<br />● 开发难度显著降低，企业反馈速度明显加快，业务得到更大的支持；<br />● 避免招聘一个Rails高手来带领企业技术转型。要从已有的技术队伍中培养人，摸索锻炼出学习型的人才。Rails以简单优雅征服世界，学习成本明显低于其他技术； <br />● 寻找专业的Ruby 服务公司，将本企业18个月的学期缩短为6个月。<br /><br /><strong>结束语</strong><br /><br />本文是写给程序员杂志，为SD 2.0大会写的文章之一。我们所创办的NibiruTech公司，遵循简洁的技术路线，将程序当作艺术，将程序员当作艺术家，为了这样的理念，我们愉快地工作在一起。<br /><br />“上帝赐予我一份Rails程序员的工作吧！”<br /><br />“用Rails来工作，就像是在玩RPG游戏一样有趣，欲罢不能”<br /><br />Ruby 和Rails是我见过最为优雅，最为高贵的语言和框架。当然，没有任何东西可以满足所有人的热爱。 只是在Ruby 和Rails领域，我所见到过真正研究过Ruby和Rails的程序员，都不能自已地爱上了这种技术，在NibiruTech中有一半的人是爱好的程度让 其不得不放弃已有工作职位，寻求一份Ruby On Rails的技术职位。应用Ruby和Rails、遵循Agile和TDD，使得程序开发的职位，犹如世界上最幸福的工作一般，在NibiruTech工 作的人，都有强烈的“征服技术”的感觉。<br /><br />对于真正的程序员，如果你想与众不同，不妨尝试一下Ruby On Rails，每天工作之余，花时间想想，如果用RoR来做，会不会不同？<br /><br />对于企业决策者，如果犹豫不决是否该尝试RoR，那么建议你给自己一次犯错的机会。彷徨犹豫不会让答案更加清晰，只会延误时机，增加选择中的焦虑。采取行动，让自己犯错，才是得到最佳答案的途径。
          <br/>
          <span style="color:red;">
            <a href="http://wiisola.javaeye.com/blog/177232#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 Mar 2008 13:32:44 +0800</pubDate>
        <link>http://wiisola.javaeye.com/blog/177232</link>
        <guid>http://wiisola.javaeye.com/blog/177232</guid>
      </item>
  </channel>
</rss>