<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
  <channel>
    <title>吕国宁|我的备忘录</title>
    <description>现在是一个ROR程序员,初学水平,爱好同大家交流,共同提高技术水平.</description>
    <link>http://lgn21st.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>MacOSX: 安装MySQL和PostgreSQL</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/213813" style="color:red;">http://lgn21st.javaeye.com/blog/213813</a>&nbsp;
          发表时间: 2008年07月11日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          在Leopard上安装MySQL的步骤,选用二进制预编译包安装,而不是从源码编译,因为懒,这样可以节约时间.<br /><br />到<a href="http://dev.mysql.com/downloads/mysql/5.0.html#macosx-dmg" target="_blank">这里</a>下载MySQL的二进制预编译包,dmg格式文件.<br /><br />安装包内包含了两个部分,MySQL的主程序以及启动管理程序,建议两个都安装.<br /><br />添加mysql的命令目录到$PATH搜索路径中<br /><pre name="code" class="ruby">
$ printf "\nexport PATH=/usr/local/mysql/bin:\$PATH" >> ~/.bash_profile
</pre><br /><br />安装MySQL的ruby驱动<br /><pre name="code" class="ruby">
$ sudo -s
# ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-dir=/usr/local/mysql
# exit
</pre><br /><br />修改MySQL的配置文件,添加默认UTF-8支持<br /><pre name="code" class="ruby">
$ sudo cp /usr/local/mysql/support-files/my-small.cnf /etc/my.cnf
$ sudo vim /etc/my.cnf

# 在对应的节点添加如下信息
[client]
default-character-set = utf8
[mysqld]
character-set-server = utf8
default-table-type = innodb
</pre><br /><br />关于在PostgreSQL,呵呵近期项目正在从MySQL迁移至PostgreSQL上<br />具体安装方法请参考<a href="http://www.robbyonrails.com/articles/2008/01/22/installing-ruby-on-rails-and-postgresql-on-os-x-third-edition" target="_blank">这里</a>,一篇非常棒的安装指导!<br /><br />注意安装PostgreSQL完毕后,需要安装ruby驱动,安装方法就是这篇文章的第一条评论:<br /><pre name="code" class="ruby">
$ sudo env ARCHFLAGS="-arch i386" gem install postgres
</pre><br /><br /><strong>注意:</strong> 请不要使用macports更新ruby到最新版(目前可以更新到1.8.7),我发现使用macports更新ruby后,无论如何都无法让postgres驱动工作,而使用Leopard自带的ruby则很正常,我没有尝试自己下载一份ruby编译安装,不过<a href="http://letrails.cn/" target="_blank">元一</a>好像是这样装的,貌似他没有碰到什么问题,所以我想自己从源码编译而不要通过port安装因该可行.
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/213813#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 11 Jul 2008 10:36:32 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/213813</link>
        <guid>http://lgn21st.javaeye.com/blog/213813</guid>
      </item>
      <item>
        <title>TMC</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/212767" style="color:red;">http://lgn21st.javaeye.com/blog/212767</a>&nbsp;
          发表时间: 2008年07月08日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          参加张江第一双语演讲俱乐部已经有两个多月了,现在开一个blog分类记录下每次活动中的点点滴滴<img src="/images/smiles/icon_smile.gif"/>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/212767#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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 Jul 2008 15:57:11 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/212767</link>
        <guid>http://lgn21st.javaeye.com/blog/212767</guid>
      </item>
      <item>
        <title>关于如何解决上SourceForge.net的办法</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/212204" style="color:red;">http://lgn21st.javaeye.com/blog/212204</a>&nbsp;
          发表时间: 2008年07月07日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          由于某些原因,SourceForge.net不能访问了... :(<br /><br />这里是临时解决方案,来自Python邮件列表上的兄弟.<br /><br />1. 用代理,通过这个地址访问:<br />http://www.mirrorservice.org/sites/download.sourceforge.net/pub/sourceforge/c/cr/<br /><br />2. 用FTP<br />ftp://ftp.jaist.ac.jp/pub/sourceforge/<br />ftp://sourceforge.nchc.org.tw/
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/212204#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 07 Jul 2008 09:55:35 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/212204</link>
        <guid>http://lgn21st.javaeye.com/blog/212204</guid>
      </item>
      <item>
        <title>MacOSX: MacOSX上的MacPorts</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/211963" style="color:red;">http://lgn21st.javaeye.com/blog/211963</a>&nbsp;
          发表时间: 2008年07月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Mac下面除了用虚拟文件夹系统安装应用程序外,还提供了<a href="http://www.macports.org/" target="_blank">macports</a>来帮助你安装其他应用程序,跟<a href="http://lgn21st.javaeye.com/blog/166593" target="_blank">BSD中的ports</a>道理一样,将<a href="http://www.macports.org/" target="_blank">macports</a>的使用方法记录在这里以备查:<br /><br />安装macports<br />到<a href="http://www.macports.org/" target="_blank">这里</a>下载最新的macports的Mac OS X Package(.pkg)安装包,安装过程没有什么特别,就像安装其他应用软件一样,需要注意的是一些系统需求一定要提前安装.<br /><br />将/opt/local/bin和/opt/local/sbin添加到$PATH搜索路径中<br /><br />原本port有个sync的功能,不过这个sync事实上是selfupdate的一部分,所以强烈建议用selfupdate来更新ports索引<br />sudo port selfupdate<br /><br />搜索索引中的软件<br />port search app_name<br /><br />安装新软件<br />sudo port install app_name<br /><br />卸载软件<br />sudo port uninstall app_name<br /><br />查看outdated的软件以及版本<br />port outdated<br /><br />升级outdated的软件<br />sudo port upgrade outdated
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/211963#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 06 Jul 2008 01:45:08 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/211963</link>
        <guid>http://lgn21st.javaeye.com/blog/211963</guid>
      </item>
      <item>
        <title>Rails: 在MacBook上尝试Passenger(mod_rails)</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/211949" style="color:red;">http://lgn21st.javaeye.com/blog/211949</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          自打换了MacBook以后,安装前端web服务器不在像Ubuntu上那么简单,一个apt-get就轻松搞定,不过最新的Leopard自带了Apache,虽然我不喜欢Apache,不过因为是最容易得到且内置,并且一个非常有前途的项目<a href="http://www.modrails.com" target="_blank">Passenger</a>(mod_rails)也开始<a href="http://blog.phusion.nl/2008/04/29/phusion-passenger-mod_rails-version-102-released-and-more/" target="_blank">支持Leopard内建的Apache</a>了,所以决定用这一套组合来作开发.<br /><br />关于Leopard内建的Apache请看<a href="http://lgn21st.javaeye.com/blog/211945" target="_blank">这里</a><br /><br />安装Passenger的步骤非常简单:<br /># 安装gems<br />sudo gem install passenger<br /># 安装apache module并配置<br />sudo passenger-install-apache2-module<br /><br />配置过程中会根据当前系统环境自动生成apache的配置参考信息,根据这个来修改位于/etc/apache2/httpd.conf<br />比如,在配置文件尾部添加入下几行<br />LoadModule passenger_module /Library/Ruby/Gems/1.8/gems/passenger-2.0.1/ext/apache2/mod_passenger.so<br />PassengerRoot /Library/Ruby/Gems/1.8/gems/passenger-2.0.1<br />PassengerRuby /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby<br /><br /># Turned on Name Based VirtualHosts<br />NameVirtualHost *<br /><br />&lt;Directory "/Users/daniel/projects/"><br />    Order allow,deny<br />    Allow from all<br />&lt;/Directory><br /><br />&lt;VirtualHost *:80><br />    ServerName project1.local<br />    DocumentRoot /Users/daniel/projects/project1/trunk/public<br />    RailsEnv development<br />&lt;/VirtualHost><br /><br />修改hosts文件,将project1.local映射为本机地址,添加上面这行<br />127.0.0.1    project1.local<br />Linux: 位置在/etc/hosts<br />Windows: 位置在C:\WINDOWS\system32\drivers\etc\hosts<br /><br /><br />打开浏览器,直接访问地址http://project1.local/即可看到rails应用程序了,不用额外启动mongrel或者其他rails的continer并占用一个console的tab了,并且Apache对静态资源进行缓存,页面速度明显快了不少...<br /><br />重新启动rails应用程序的方法是touch(创建)一个名为'restart.txt'的文本文件在项目的tmp目录下即可<br />touch tmp/restart.txt<br /><br /><br />========== 控制Apache的内存消耗 ==========<br />在Apache的配置文件中添加入下两行,可以有效的控制Apache的内存消耗:<br />RailsMaxPoolSize 3 # Never spawn more than three processes<br />RailsPoolIdleTime 180 # Despawn a process when it has been idle for 180 seconds
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/211949#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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 Jul 2008 23:19:12 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/211949</link>
        <guid>http://lgn21st.javaeye.com/blog/211949</guid>
      </item>
      <item>
        <title>MacOSX: leopard上的Apache</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/211945" style="color:red;">http://lgn21st.javaeye.com/blog/211945</a>&nbsp;
          发表时间: 2008年07月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          换用Apple的MacBook已经一个多月了,记录一些使用经验以备查:<br /><br />软件环境:<br />MB 402(4G Memory) Leopard 10.5.4<br /><br />Leopard已经自带了Apache，只要在System Preferences -> Sharing 选择Web Sharing即可开启内置的Apache.<br /><br />配置文件位置是:<br />/etc/apache2/httpd.conf<br /><br />httpd的文档更目录是:<br />/Library/WebServer/Documents/<br /><br />user_dir模块默认自动开启,访问地址是:<br />http://localhost/~username<br /><br />user_dir的目录路径是:<br />~/Sites<br /><br />restart Apache的命令是:<br />sudo apachectl graceful<br /><br />你可以在这里放一些常用的资源,比如我放了一份ruby,rails,mysql以及其他的documents,方便查找...
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/211945#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Jul 2008 22:59:38 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/211945</link>
        <guid>http://lgn21st.javaeye.com/blog/211945</guid>
      </item>
      <item>
        <title>说说上周六的糗事</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/207627" style="color:red;">http://lgn21st.javaeye.com/blog/207627</a>&nbsp;
          发表时间: 2008年06月24日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          上周六真糗,事情是这样的:<br /><br />约好了跟Eric SUN一起去无锡,他办事,我去看我那刚刚高考结束的表妹...<br /><br />我们提前订好了同一班动车组车票,早上9点一刻发车的.我大概八点出门,心想自己住得地方打车过卢浦大桥,到火车站并不算远,就不想去三站路之外坐地铁了,直接去出租车过去,谁想老天跟我作对似的,上出租车后我只说了句"火车站",司机便七拐八拐的绕起路来,且几乎每到一个路口,都碰上红灯亮起,我那个心焦阿,不停的催促司机,"快一点成么"....<br /><br />到达火车站已经9:30,抬头一看,天啊,这是火车南站,不是上海火车站...跟那个司机理论,确一口咬定说我自己说要来火车南站的...争论无果,我只好付钱下车,想办法转到火车站,改签车票,最后搭上2个小时后的一班火车去无锡...<br /><br />后来别人告诉我,这种情况你要问那个司机要发票,然后投诉他,我突然想到那个司机收钱后,并不主动给我发票,我自己也晕了,竟然没有主动问他要....血的教训阿!
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/207627#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 24 Jun 2008 18:30:24 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/207627</link>
        <guid>http://lgn21st.javaeye.com/blog/207627</guid>
      </item>
      <item>
        <title>Ubuntu Tips: APE转Flac</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/207177" style="color:red;">http://lgn21st.javaeye.com/blog/207177</a>&nbsp;
          发表时间: 2008年06月23日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          Ubuntu的默认播放器Rhythmbox默认不支持APE格式，因为APE格式是有版权的，而Flac格式是开放格式，且并不比APE差，甚至更好。所以在Linux下面，音乐格式首选Flac。但是因为历史原因，下载到的CD歌曲往往是APE格式，下面是如何将APE转成Flac，记录备查。<br /><br />首先安装APE/Flac支持包，google到了mac-3.99-u4_b3-1_i386.deb这个包(见附件)可以支持APE，然后安装转换工具shntool<br /><pre name="code" class="ruby">
sudo dpkg -i mac-3.99-u4_b3-1_i386.deb
sudo apt-get install flac
sudo apt-get install shntool
</pre><br /><br />一般下载到的APE都是一个.ape加一个.cue成对的文件，cue中保存了CD音轨信息。转换方法是下面这条命令：<br /><pre name="code" class="ruby">
shntool split -f image.cue -t '%n.%t' -o flac image.ape
</pre><br />即得到flac格式的音乐文件并按照cue文件信息，分割成每首歌曲一个文件。
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/207177#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 23 Jun 2008 17:35:19 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/207177</link>
        <guid>http://lgn21st.javaeye.com/blog/207177</guid>
      </item>
      <item>
        <title>Rails Tips: CSRF and authenciticy_token</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/200722" style="color:red;">http://lgn21st.javaeye.com/blog/200722</a>&nbsp;
          发表时间: 2008年06月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          从Rails 2开始，默认使用cookie来保存session，于是很多关于安全上的置疑被频繁提及。尤其是cross-site request forgery(CSRF)攻击。<br /><br />在Rails2中预防CSRF其实很容易，首先确保在application.rb中包含protect_from_forgery调用<br /><pre name="code" class="ruby">
class ApplicationController &lt; ActionController::Base
  protect_from_forgery
end
</pre><br />至此，所有用form_for或者form_tag等生成的表单均被隐藏注入一个特别的基于用户session生成的token，在表单被提交时一并将token提交至服务器并接受服务器端的检查。<br /><br />如果你象我一样喜欢自己手写Ajax Post请求代码，但是没有包含这个token的话，服务器端会报'verify_authenticity_token'错误，如何得到这个token呢？我的做法是在页面头部先得到这个token，赋值给一个JS的全局变量，在之后的Ajax代码中就可以直接引用啦，主意，一定要在Ajax调用代码之前作这一步，最保险的位置是在页面第一行。<br /><pre name="code" class="ruby">
&lt;%= javascript_tag "var authenticity_token = '#{form_authenticity_token}';" %>
</pre><br />Ajax代码大概可以这样写<br /><pre name="code" class="ruby">
new Ajax.Request(
  request_path,
  {method:'post',
   parameters:'authenticity_token=' + encodeURIComponent(authenticity_token)});
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/200722#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 06 Jun 2008 00:06:38 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/200722</link>
        <guid>http://lgn21st.javaeye.com/blog/200722</guid>
      </item>
      <item>
        <title>Rails Tips: Rails docs with Jamis template</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/199681" style="color:red;">http://lgn21st.javaeye.com/blog/199681</a>&nbsp;
          发表时间: 2008年06月03日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          我是懒人，文档上能查到的我从来不记，所以需要在自己的电脑上备一份Rails的文档随时备查。<br /><br />我的屏幕分辨率是1280X800,传统的方式生成的rails文档看起来相当别扭，导航索引居然放在上方，对于宽屏查看文档尤其不合适，而Rails<a href="http://api.rubyonrails.com/" target="_blank">官方文档</a>确做得很好。<br /><br />实现很容易，记录步骤以备查：<br />首先到<a href="http://weblog.jamisbuck.org/2005/4/8/rdoc-template" target="_blank">这里</a>下载<a href="http://www.jamisbuck.org/svn/rdoc-templates/jamis.rb" target="_blank">Jamis template</a>模板文件,将模板放到rdoc的模板目录下<br /><pre name="code" class="ruby">
# 我的电脑上位置在 /usr/lib/ruby/1.8/rdoc/generators/template
sudo cp jamis.rb /usr/lib/ruby/1.8/rdoc/generators/template
</pre><br />生成Rails文档<br /><pre name="code" class="ruby">
rails rails_doc -f  # -f 参数可以freeze当前的rails到vender/rails
cd rails_doc
rake doc:rails template=jamis
</pre><br />执行完毕后，doc/api文件夹就是我要的文档
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/199681#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 03 Jun 2008 12:04:52 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/199681</link>
        <guid>http://lgn21st.javaeye.com/blog/199681</guid>
      </item>
      <item>
        <title>Ruby Tips: Tdiy xml</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/199396" style="color:red;">http://lgn21st.javaeye.com/blog/199396</a>&nbsp;
          发表时间: 2008年06月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          最简单的Tidy Xml的方法，记录以备查：<br /><br />举例，我有一个xml文件org.xml：<br /><pre name="code" class="xml">&lt;foo>&lt;bar>foobar&lt;/bar>&lt;/foo></pre><br /><br />我想Tidy并保存为tidy.xml：<br /><pre name="code" class="xml">
&lt;foo>
  &lt;bar>
    foobar
  &lt;/bar>
&lt;/foo>
</pre><br /><br />用REXML::Document来实现:<br /><pre name="code" class="ruby">
require 'rexml/document'

open('tidy.xml', 'w') do |out|
  REXML::Document.new(open('org.xml').read).write(out, 2)
end
</pre>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/199396#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 02 Jun 2008 13:23:46 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/199396</link>
        <guid>http://lgn21st.javaeye.com/blog/199396</guid>
      </item>
      <item>
        <title>关于BDD,RSpec,翻译A NEW LOOK AT TEST-DRIVEN DEVELOPMEN</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/188624" style="color:red;">http://lgn21st.javaeye.com/blog/188624</a>&nbsp;
          发表时间: 2008年05月01日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <strong>缘起:</strong><br />最近开始应用BDD开发实践,刚刚开始我跟很多人一样,找不到北,用不来,在无数地方看到这篇介绍BDD的<a href="http://blog.daveastels.com/files/BDD_Intro.pdf" target="_blank">pdf</a>文档,学习并了解BDD背后的基础知识中,就顺便翻下,我是个懒人...不懂的...难翻的...我统统放着不翻,"specification"这个词,按我自己理解翻译成"规范"有点词不达意,我更倾向于不翻,总之只要能够理解他是什么,我不在乎他应该翻译成什么.<br /><br /><span style="font-size: large;"><strong>A NEW LOOK AT TEST-DRIVEN DEVELOPMENT</span></strong><br /><br />Dave Astels<br />dastels@daveastels.com<br /><br /><strong>The Problem</strong><br />目前测试驱动开发(TDD)正如日中天,很多大公司耗费巨资让他们的程序员学习如何TDD.TDD也是活动聚会的热门话题...就象"敏捷"或其他的热门话题一样.已有很多关于TDD的专业书籍.其中有的甚至获得了Jolt大奖.所以一切看起来真不错,所有人都完理解TDD并从TDD中获得了巨大的好处,是么?<br /><br /><strong>Fat Chance!</strong><br />我接触的很多人中真正懂得TDD的人其实不多.这意味着很多人其实并没有从TDD上得到什么好处,出了什么问题?<br /><br /><strong>The focus on testing</strong><br />好吧...首先人们总是认为测试没什么大不了的.<br /><br />确实,差不多是这样,and you end up with a nice low level regression suite... 但这个过程不会产生一些好的体验.所以为什么不让体验更好一点呢?为什么大家都没有做到让过程体验更好? 让我们从历史开始讲起吧.多年以前,我为Coad Letter写了一篇文章. 文中我给出了一些TDD的背景知识(是从Ron Jeffries哪里获得的):<br /><br />    "XP 的一条基本原则是测试所有可能break的情况,现在,不管怎样,XP的测试实践者演进出了测试驱动开发"<br /><br />回到那个时候,他们讨论编写测试,测试这个词变成了他们的中心词,所以人们才会这样理解测试这个词!当他们说TestCases或者TestSuites,或者Tests时他们其实不是在说其他的东西...虽然不是所有,但是大多数xUnit测试框架都要求测试方法以test命名.新版本的JUnit(版本4)尽量不依赖命名约定或让测试继承TestCase,但是这些关键词均被保留或用annotation来作为测试的关键词.<br /><br />实事是,当TDD完成进化后,我们看到的已经是一个完全不同的东西了... 不是在原来的基础上修订,原来的XP实践者们编写测试去测试一切可能break的东西,到他们先编写测试,进而演化到用一个小测试来描述我们的新功能,然后编码,然后写下一个小测试...周而复始.,,TDD不是我们追求的最终目标...只是过程中的里程碑<br /><br /><strong>Units</strong><br />当然,"unit"这个词成了矛盾的焦点.首先这是一个含糊的词,第二他暗示将代码从结构上分割(例如人们认为他们应该测试独立的method或者class).我们不应当这样理解'unit'...我们应该把他理解成行为的一个切面<br /><br />想像一下'unit testing'引导我们按照代码的结构来分割并安排测试测试.比如按照类的文件一一对应<br /><br />这个不是我们想要的...我们想要从行为上切分...我们希望在一个比典型的'单元测试'更加细粒度的层面上开展测试.就象我之前说到的TDD,我们应当把注意力集中到更小的,可以被分割的行为上...一个方法的一个小的切面,比如"当list是空的时候,调用对象的add()方法,list中应该只有一个东西".方法可以在各种上下文中被调用,通常伴随这明确的参数,返回明确的结果...我甚至想跑题去写一篇题为"为每个测试写一个断言"的blog.<br /><br />所以,这正是要的.一个令人难以致信的好主意...把他封装到包中并改变人们对测试的看法.<br /><br /><strong>The Result</strong><br />为什么有这个问题? 让我们考虑一下人们通常是怎么思考测试的.<br /><br />程序员经常思考"我不准备写所有的测试","这是简单代码,没必要测试","测试在浪费时间",或者"我已经作这件事很多次了(循环/数据 获取/功能 等等)"<br /><br />项目经理经常这么想"等编码完成后我们测试","我们有测试专员",或者"目前我们不能在这个上面浪费时间"<br /><br />所以随着人们多测试的看法,很容易得到一堆关于测试的缺点以及我们不做测试的理由...尤其是在时间已经项目压力下<br /><br /><strong>So if it's not about testing, what's it about</strong><br />这是解决以及在你作了一半之前在去思考你要做什么的问题.你写下一个需求,针对一个小的行为切面,用清晰的,没有岐义,可执行的形式描述.这并不难.这是在写测试么?不,这意味着你在写一个代码要作什么的需求.这意味着你在编写代码之前定义代码的行为.而且不需要占用太多时间.事实上最好的时机就是在你写代码之前作这一步,因为这个时候你有足够的信息可以让你作好这件事.类似于TDD最佳实践,小步前进...一次定义小的行为切面,然后实现它.<br /><br />当你意识到这是在编写行为而不是在编写测试.你的思想已经升华了.你会突然间发现为每个类或着每个方法编写测试这个办法变得可笑.<br /><br /><strong>Sapir-Whorf Hypothesis</strong><br />从Wikipedia上摘抄的背景知识:<br /><br />    (略,请看pdf原文,或者到<a href="http://en.wikipedia.org/wiki/Sapir-Whorf_hypothesis" target="_blank">这里</a>浏览)<br /><br />我的目的是要向你证明你所使用的语言影响了你的思想...如果你想要改变你的想法,理解这一点可以帮助你改变你的语言.<br /><br /><strong>So what to do?</strong><br />首先停止思考术语"测试", Bob Martin很多年前就说"Specification, not Verification".Bob的意思是verification(众所周知的"测试")是关于确认(verifying)你的代码的功能正确,当你specification是指你定义(specifying)你的代码应该有什么样的功能才对.<br /><br />使用一些xUnit工具让这件事情变得困难,因为他是以"测试"为中心的语言.所以我们需要一个新的框架来specifying行为.ThoughtWorks的Dan North正开始着手一项名为jBehave的项目来解决这个问题.而我和其他一些人为Ruby的行为specifying框架rSpec提交代码.我将向你展示更多rSpec的细节.<br /><br /><strong>A Behaviour Specification Framework</strong><br />行为specification看起来应该是什么样子?好吧,第一眼看上去很象从前的xUnit:<br /><ul><li>可以工作</li><li>任何人都熟悉他</li></ul><br /><br />一个最主要的区别是关键词的使用.用继承Context来替换原来的做法,继承TestCase.用'should'替换方法名前缀'test',这样给你带来一个好处,你不必受到命名模式带来的困扰,从而可以选择更合适的名字,替换调作检查用的断言(例如 assertEquals(expected, actual)) 你specify提交条件类似ShouldBeEqual(actual, expected).<br /><br />在Smalltalk和Ruby中,把测试框架嵌入到类库中的做法显得更加自然些(顺便说下,这是Smalltalk的通常做法),你应该写一些类似于范例的东西,比如下面这些<br /><br />  (略...请看pdf原文档,我不会用JE的编辑器编辑表格)<br /><br /><strong>What Now?</strong><br />前面提到过, Dan North的jBehave项目创建一个jUnit替代方案为行为specification,你现在已经可以下载并体验了.<br /><br />如果你使用Ruby,你可以现在就得到我们的rSpec框架并开始使用他.目前rSpec提供了下面这些方法来调用任何的对象...请注意...是任何对象:<br /><br />  (略...我发现pdf中提到的这些用法已经过时了...新版本已经用更加简单清晰的办法了)<br /><br />所有的表达式都是可选的,如参数信息.跟xUnit一样,setup和teardown可以被overriding.他们用同样的方法作同样的事情.<br /><br />所以行为specification看起来象什么?好的,这里是一个我的TDD书中的范例的rSpec版<br /><pre name="code" class="ruby">
require 'spec'
require 'movie'
require 'movie_list'
class EmptyMovieList &lt; Spec::Context
  def setup
    @list = MovieList.new
  end
  def should_have_size_of_0
    @list.size.should_equal 0
  end
  def should_not_include_star_wars
    @list.should_not_include "Star Wars"
  end
end
class OneMovieList &lt; Spec::Context
  def setup
    @list = MovieList.new
    star_wars = Movie.new "Star Wars"
    @list.add star_wars
  end
  def should_have_size_of_1
    @list.size.should_equal 1
  end
  def should_include_star_wars
    @list.should_include "Star Wars"
  end
end
</pre><br /><br /><strong>Guidelines</strong><br />你最关心什么,就用它来命名Context classes,比如EmptyMovieList和MovieList.他们只包含了specification方法直接关联到上下文.<br /><br />用你关注的specification命名举例<br />should_have_size_of_0<br /><br />Context class和表达式方法都应该容易读取,并准确的告诉你发生什么: EmptyMovieList.should_have_size_of_0.<br />想一下多么轻松容易的表达了specification内容<br /><br />你的specification方法应该尽量简单,短小,并关注你正在作的东西.一个表达式...太棒了...他应该是你追求的圣杯.简单既是美/小的,简单的,内聚的,容易理解的类和方法比大的,冗长的,复杂的类或者方法更好.<br /><br /><strong>Summary</strong><br /><ul><li>我用TDD是最大的问题是他倾向于影响我走不同的方向...错误的方向</li><li>我们需要开始思考行为specifications,而不是验证测试</li><li>specifications的价值是让每个让我们考虑清楚每个行为,更少的依赖类测试或者方法测试,并最终得到一个好的,可执行的文档</li><li>在TDD,任何人都不去改变名称的含义(不是我们希望的),我们需要新的名字来命名新的工作方式,Dan North给了我们BDD:Behavior Driven Development.</li></ul><br /><br /><strong>Acknowledgements</strong><br />感谢Steven Baker,Gabriel Bauman和Aslak Hellesoy讨论这篇文章的第一版并开始写ruby的框架,让这个想法变成现实.谢谢Kay Pentecost,他的feedback中的好主意test-avoidance已经包含在这篇文章的草稿版中.
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/188624#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 01 May 2008 14:35:52 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/188624</link>
        <guid>http://lgn21st.javaeye.com/blog/188624</guid>
      </item>
      <item>
        <title>关于rails/mysql的一二事</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/188245" style="color:red;">http://lgn21st.javaeye.com/blog/188245</a>&nbsp;
          发表时间: 2008年04月30日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          有的时候需要导入大量数据到数据库,还需要共享给团队中其他人,rails并没有提供一个最直接的途径来import数据,虽然有个db:fixtures:load但是不够灵活.且导出数据可能还需要自己手写一个<a href="http://lgn21st.javaeye.com/blog/115562" target="_blank">rake task</a><br /><br />我是一个懒人,喜欢最简单的办法,就直接写sql在migration脚本里面,execute执行,至于sql从哪里来?可以字符串拼接,可以从mysql中dump...<br /><br />今天碰到一个问题,因为数据量大,migration script也较大,在另外一个人的mac上碰到"max_allowed_packet"错误,貌似是因为mac下mysql的max_allowed_packet默认设置太小,对比我的Ubuntu下默认设置,修改数值至少不低于32M即可解决<br /><br />另外一个是rails database performance tip<br />Add an index to the foreign key in the child table.<br />当关联关系较多,数据量增长较快时,会有很大的帮助<br />所以,简历子表的外键时,顺手给外键加上index吧
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/188245#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 30 Apr 2008 01:41:36 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/188245</link>
        <guid>http://lgn21st.javaeye.com/blog/188245</guid>
      </item>
      <item>
        <title>今天是个大日子,纪念自己编程一周年兼学用ROR一周年</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/184540" style="color:red;">http://lgn21st.javaeye.com/blog/184540</a>&nbsp;
          发表时间: 2008年04月20日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          缘起:<br />今天是个大日子,对我来说,我清晰的记得2007年4月20日,我如今还清晰的记得这一天,找到了一份非常fashion的工作,作RobyOnRails开发,兼第一天上班报到,Ubuntu7.04发布...有<a href="http://lgn21st.javaeye.com/blog/73197" target="_blank">blog</a>为证.<br /><br />哈哈,因为朋友们都问我,你作软件多久了?我只能害羞的说:"不到一年...".<br />从今天开始,我可以跟人说,"我有一年<strong>以上</strong>的编程经验了".<br /><br />编程改变了我的生活,甚至是一切...让我有了新的选择,作我喜欢作的事情<br />这一年中我最大的感悟是,如果一个能够清晰的知道自己喜欢什么,并有机会作自己喜欢的事情,那么这个人是幸福的...<br /><br />这里我要感谢一年来对我非常关心,支持,帮助的人:<br />我不是一个聪明的人,但我是一个勤奋的人,是你们帮我解决路上一个有一个问题...谢谢你们<br />Ryan, Weston, Jerry, Thomas, YuanYi, Stephen, Forrest...CCTV,ChinaV,其他所有V...
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/184540#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 20 Apr 2008 11:12:33 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/184540</link>
        <guid>http://lgn21st.javaeye.com/blog/184540</guid>
      </item>
      <item>
        <title>貌似现在流行晒历史了?</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/183928" style="color:red;">http://lgn21st.javaeye.com/blog/183928</a>&nbsp;
          发表时间: 2008年04月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>daniel@nicole:~$ history | awk {'print $2'} | sort | uniq -c | sort -k1 -rn | head<br />
&nbsp;&nbsp;&nbsp; 117 cd<br />
&nbsp;&nbsp;&nbsp;&nbsp; 66 rake<br />
&nbsp;&nbsp;&nbsp;&nbsp; 48 ls<br />
&nbsp;&nbsp;&nbsp;&nbsp; 36 c<br />
&nbsp;&nbsp;&nbsp;&nbsp; 33 vim<br />
&nbsp;&nbsp;&nbsp;&nbsp; 32 exit<br />
&nbsp;&nbsp;&nbsp;&nbsp; 21 ./script/spec<br />
&nbsp;&nbsp;&nbsp;&nbsp; 18 ./script/generate<br />
&nbsp;&nbsp;&nbsp;&nbsp; 15 git<br />
&nbsp;&nbsp;&nbsp;&nbsp; 12 l</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/183928#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 18 Apr 2008 02:48:55 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/183928</link>
        <guid>http://lgn21st.javaeye.com/blog/183928</guid>
      </item>
      <item>
        <title>Linux下最好的英文词库</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/179664" style="color:red;">http://lgn21st.javaeye.com/blog/179664</a>&nbsp;
          发表时间: 2008年04月05日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>Linux下好用的英文字典，<a href="http://stardict.sourceforge.net/" target="_blank">StarDict</a>最好，没有什么其他好说 <img title="smile" src="../../images/smiles/icon_smile.gif" border="0" alt="smile" /></p><p>&nbsp;</p><p>但是装什么好用的字典词库进去<a href="http://stardict.sourceforge.net/" target="_blank">StarDict</a>呢，我用<a href="http://stardict.sourceforge.net/" target="_blank">StarDict</a>差不多3~4年了，期间尝试过不少的词库，一直使用并保留到现在的词库就只有《美国传统词典[双解]》《牛津现代英汉双解词典》这两本，好词典不要太多，这两本平时使用足矣</p><p>&nbsp;</p><p>直到最近需要频繁切换到Windows XP下面工作，照顾一下自己的习惯，直接放弃XX的XX词霸。也装个<a href="http://stardict.sourceforge.net/" target="_blank">StarDict</a>的win32版本。突然发现，win32版本集成了一个<a href="http://wordnet.princeton.edu/" target="_blank">WordNet</a>词库，使用下来直让我大呼&quot;超赞！&quot;，原来StarDict 3.01已经集成了wordnet插件，可以把单词，词性，词组，关联词汇等等显示为一个交互式的&rdquo;单词网络&ldquo;，而我今天才知道~！ </p><p>&nbsp;</p><p>这个<a href="http://wordnet.princeton.edu/" target="_blank">wordnet</a>来头不小</p><div class="quote_div">WordNet: Princeton 大学的心理学家，语言学家和计算机工程师联合设计的一种基于认知语言学的英语词典。它不是光把单词以字母顺序排列，而且按照单词的意义组成一个&ldquo;单词的网络&rdquo;。</div><p>&nbsp;</p><p>这个单词网络甚至还能显示出单词之间的&quot;概念距离&quot;，一路沿着网络路径追下去，就会感觉到学习，领会的效果是用其他词典远远不能及的~~~</p><p>&nbsp;</p><p>我想起了我的朋友(前Boss)<a href="http://ryanerwin.com/" target="_blank">欧文</a>曾经跟我说：&quot;当你要学习一门外语，你不能用自己的母语来学习，而是要用这门语言来学习&quot;。身边英语书写流利，口语流利的国人不在少数，但是一个老外中文书写流利，口语流利，那才是真正让人佩服。<a href="http://ryanerwin.com/" target="_blank">欧文</a>用一年时间就做到了，如此现身说法，让我不得不相信，学习一门外语的好办法，就是用这门语言来学习他。而且现在我们有了<a href="http://wordnet.princeton.edu/" target="_blank">wordnet</a>这个超赞的词库帮忙，哈哈~~~</p><p>&nbsp;</p><p>感兴趣的话可以到<a href="http://sourceforge.net/project/showfiles.php?group_id=80679&amp;package_id=248764" target="_blank">这里</a>找到wordnet 3.0的词库下载。</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/179664#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 05 Apr 2008 15:20:54 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/179664</link>
        <guid>http://lgn21st.javaeye.com/blog/179664</guid>
      </item>
      <item>
        <title>修复GRUB引导</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/179455" style="color:red;">http://lgn21st.javaeye.com/blog/179455</a>&nbsp;
          发表时间: 2008年04月04日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>需要开视频会议,我不得零时从Ubuntu切换回去百年难道用一次的WinXP...<br />发现自己的XP系统很混乱...决定重新装一次,不想安装过程中把磁盘mbr扇区给覆盖了<br />修理并不复杂,记录在这里</p><p>&nbsp;</p><p>首先找一个<a href="http://sourceforge.net/projects/grub4dos/" target="_blank">Grub4Dos</a><br />把GrubForDos解压缩到C盘根目录下,取名grub</p><p>用引导盘引导进入dos,到C:\grub目录下执行grub.exe</p><p>可以看到一个grub启动菜单,选择其中的</p><pre name="code" class="ruby">find and boot Linux with menu.lst already installed</pre><p>Grub4Dos会自动找到硬盘中安装过的启动分区,并载入启动菜单...这时熟悉的Ubuntu启动界面又回来了</p><p>进入Ubuntu后打开一个终端执行</p><pre name="code" class="ruby">$sudo grub
# 返回boot分区的位置
grub&gt;find /boot/grub/stage1
# hd0指第一块硬盘,X是linux的主目录&ldquo;/&rdquo;所在分区号
hd0,X
grub&gt;root (hd0,X)
# 安装grub到MBR
grub&gt;setup (hd0)
grub&gt;quit</pre>重新启动,大功告成...<br /><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/179455#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 04 Apr 2008 04:12:01 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/179455</link>
        <guid>http://lgn21st.javaeye.com/blog/179455</guid>
      </item>
      <item>
        <title>Trick: Rails里的number_with_precision</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/174818" style="color:red;">http://lgn21st.javaeye.com/blog/174818</a>&nbsp;
          发表时间: 2008年03月22日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>缘起:</strong> 很早以前碰到一个需求,实现一个四舍五入(round)的全局HelperMethod,并不难,写出来以后就放在哪里了.而Rails直接提供了一个number_to_currency方法可以方便的在rhtml中将数字显示为CurrencyString,问题来了</p><pre name="code" class="ruby">helper.number_to_currency(1234567890.50) # =&gt; $1,234,567,890.50</pre>如果对这个数字31.825执行转换呢?<br /><pre name="code" class="ruby">helper.number_to_currency(31.825) #=&gt; &quot;$31.82&quot;</pre>结果不对呀,应该是&quot;$31.83&quot;才对,继续对数字32.825执行转换<br /><pre name="code" class="ruby">helper.number_to_currency(32.825) #=&gt; &quot;$32.83&quot;</pre><p> 这次结果又是对了,怪不怪?</p><p>&nbsp;</p><p>我当前正在使用的平台是Ubunt 7.10, ruby 1.8.6, rails 2.02</p><div class="ArwC7c ckChnd" id="1gm3"><strong>ActionView::Helpers::NumberHelper#number_to_currency</strong>方法中的round过程其实是通过<strong>ActionView::Helpers::NumberHelper#number_with_precision</strong>方法完成的</div><div class="ArwC7c ckChnd" id="1gm3">方法实现非常简单,仅仅用到了String的格式化输出<br /><pre name="code" class="ruby">&quot;%01.#{precision}f&quot; % number</pre>Rails文档上的example写到<br /><pre name="code" class="ruby">number_with_precision(111.2345) # =&gt; 111.235</pre>可实际执行结果并不是这样<br /><pre name="code" class="ruby">helper.number_with_precision(111.2345) #=&gt; &quot;111.234&quot;</pre></div><div class="ArwC7c ckChnd" id="1gm3">在官方的Rails Trac中也有人提到这个问题,且看来问题由来已久,见<a href="http://dev.rubyonrails.org/ticket/10090" target="_blank">[trick 10090]</a>,<a href="http://dev.rubyonrails.org/ticket/8275" target="_blank">[trick 8275]</a></div><div class="ArwC7c ckChnd" id="1gm3">对问题的看法大概分为两个方面,一方认为文档写错了,修改文档.另一方认为的确是计算结果不对,但不是rails的错,错在ruby的String格式化输出,而深入研究则发现这个问题源自C语言的格式化字符串上:<br /><pre name="code" class="ruby">$ gcc -v
gcc version 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)

# 编译下面C代码
# include &lt;stdio.h&gt;

main()
{
    printf(&quot;%01.2f\n&quot;, 31.825);
    printf(&quot;%01.2f\n&quot;, 32.825);
}

# 我自己编译后输出结果的确是如此:
31.82
32.83</pre>有人提出用BigDecimal替换Float数据类型<br /><pre name="code" class="ruby">&quot;%01.20f&quot; % BigDecimal.new(&quot;31.825&quot;) #=&gt; &quot;31.82&quot;
&quot;%01.20f&quot; % BigDecimal.new(&quot;32.825&quot;) #=&gt; &quot;32.82&quot;</pre></div><div class="ArwC7c ckChnd" id="1gm3">在我的平台上还不如用Float来计算,用Float至少我还有对的时候,但是其他平台上难说,因为String#%方法是C语言实现,具有平台依赖性.</div><div class="ArwC7c ckChnd" id="1gm3">&nbsp;</div><div class="ArwC7c ckChnd" id="1gm3">其实终端控制台Console下的Bash本身也支持printf输出,且计算结果没有任何问题!<br /><pre name="code" class="ruby">$ bash -version
GNU bash, version 3.2.25(1)-release (i486-pc-linux-gnu)
Copyright (C) 2005 Free Software Foundation, Inc.

$ printf &quot;%01.2f\n&quot; 31.825
31.83
$ printf &quot;%01.2f\n&quot; 32.825
32.83</pre></div><div class="ArwC7c ckChnd" id="1gm3">&nbsp;</div><div class="ArwC7c ckChnd" id="1gm3">我必须在rails中处理一些严肃的计算任务,必须严格按照正确的四舍五入计算方法处理并显示结果,比如实时显示税率计算结果等</div><div class="ArwC7c ckChnd" id="1gm3">有人提出是因为Float本身精度限制<br /><pre name="code" class="ruby">&quot;%01.20f&quot; % 31.825 #=&gt; &quot;31.82499999999999928946&quot;</pre>只要计算过程中给初始数字加权一个tiny数即可绕过Float的精度问题,为了尽量不影响精度,这个tiny数我取0.1的(precision^precision)次方<br /><pre name="code" class="ruby">def number_with_precision(number, precision=2)
  &quot;%01.#{precision}f&quot; % (number + 0.1 ** (precision ** precision))
end

number_with_precision(31.825) #=&gt; &quot;31.83&quot;
</pre>的确是个办法,但是有一点小问题,如果我想要6位精度,那么<br /><pre name="code" class="ruby">number_with_precision(31.0000005,6) #=&gt; &quot;31.000000&quot;</pre>加权计算的tiny数太小了,不足以影响Float精度,但是太大初始数可能会不对,如何聪明的判断加权的tiny数是刚好呢?<br />
<br />目前我用了这样的一个算法:<br /><pre name="code" class="ruby">def number_with_precision(number, precision=3)
  &quot;%01.#{precision}f&quot; % ((Float(number)*(10**precision)).round.to_f/10**precision)
rescue
  number
end

number_with_precision(31.825, 2) #=&gt; &quot;31.83&quot;
number_with_precision(32.825, 2) #=&gt; &quot;32.83&quot;
number_with_precision(32.0000005, 6) #=&gt; &quot;31.000001&quot;</pre></div><div class="ArwC7c ckChnd" id="1gm3">这个方法实现比较繁琐,先改变初始数小数点位置,后移precision个位置,然后用round四舍五入掉小数点后一位,在改变小数点尾数到初始状态,最后结果再用String格式化输出,保证小数点后精度的有效位.不知还有没有比较方便简洁一点的方法?</div>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/174818#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sat, 22 Mar 2008 14:50:09 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/174818</link>
        <guid>http://lgn21st.javaeye.com/blog/174818</guid>
      </item>
      <item>
        <title>通过IRC跟其他人交流,(用FireFox的irc插件)</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/174454" style="color:red;">http://lgn21st.javaeye.com/blog/174454</a>&nbsp;
          发表时间: 2008年03月21日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p><strong>&nbsp;缘起:</strong> 第一次用irc可以追溯到自己初学Linux那个时候,我记得大概是2005年,那个时候在Linux下面可真不容易哟,我第一个真正投入精力学习的Linux发行版是Debian <span class="myp111"><span>SID</span></span>,用过Debian的人都知道,这个发行版的发行速度非常慢,软件仓库中的软件版本非常低,sid是debian的unstable版本,他的repository主要存放版本较新的,或者未经测试的软件.而这正应对我喜欢尝鲜,喜欢新版本的特点,unstable的版本问题当然就多,而Linux在国内也没有发展到非常广泛的社区支持,所以为了与人沟通,了解学习更多的Linux知识,我认识了IRC.</p><p>&nbsp;</p><p><strong>IRC介绍: </strong>IRC聊天是网上聊天的一种方式,它是INTERNET RELAY CHAT的缩写,意思是国际互联网络中继交谈,通过特殊的协议(RFC1459 IRC协议),大家连到一台或者多台IRC服务器上进行聊天.它的特点是速度快(正常情况下一秒钟内你就可以看到对方的&quot;讲话&quot;),功能多(功能实在是太多了,后边慢慢在看吧.),所以通过IRC聊天是全世界网友的最佳选择.</p><p>&nbsp;</p><p>简单的说,就是网上已经提供了免费的聊天服务器,并为各种IM软件开发了统一且开源的通许协议,大家只要用支持irc协议的客户端,登录irc服务器,开聊!说的再简单一点就是一个国际通用的QQ群服务器,没有限制,没有广告,对任何人都开放且友好,你可以建立自己的频道,邀请其他人加入,也可以加入其他人已经建立好的频道,大家一起交流.就拿我最常去的irc服务器freenode来说,目前已经有<span>18741个频道了.我工作中用的Ubuntu,RubyOnRails等等在freenode上均有官方频道,方便用户跟开发者直接交流,帮助开发者改善产品质量,这绝对是一个绝佳的交流,学习途径,如果同国外的技术人员沟通,你还能提高自己的英语水平,一箭n雕,何乐而不为呢?</span></p><p>&nbsp;</p><p>OK,废话不说了,开始说如何用irc,我先后用过xchat,pidgin这些聊天软件,但是现在我最喜欢的irc客户端是ChatZilla,地址是:<a href="https://addons.mozilla.org/en-US/firefox/addon/16" target="_blank">https://addons.mozilla.org/en-US/firefox/addon/16</a></p><p>在我正在用的FireFox 3.0 Beta 4中也工作正常.最简入门途径:</p><p>&nbsp;</p><p>1) 安装FireFox插件.</p><p>2) FireFox浏览器 -&gt; Tools -&gt; ChatZilla 打开ChatZilla.</p><p>3) 看到服务器列表了么?</p><div class="quote_title"> 写道</div><div class="quote_div">[INFO]	Available networks are [dalnet, efnet, freenode, hispano, hybridnet, ircnet, moznet, quakenet, serenia, slashnet, undernet, webbnet].</div>&nbsp;freenode就在其中,加入它吧,命令是<pre name="code" class="ruby">/attach freenode</pre><p>&nbsp;</p><p>4) 注册自己的nickname(昵称)</p><p>首先要尝试用一个nickname,比如我自己想用的nickname是daniel_lv </p><pre name="code" class="ruby"># 修改自己当前的nickname的命令是:/nick your_nick_name
/nick daniel_lv</pre><p>如果没有人用过这个nickname,服务器会提示你现在是<strong>YOU are now known as daniel_lv</strong>.建议这个时候通过nickname服务器把自己的nick名字注册,这样以后就不会被人使用了,注册原理是为这个nickname绑定一个密码,以后在登录,通过nickname+密码验证后,证明你就是这个nickname的用户.绑定nickname的办法</p><pre name="code" class="ruby">/msg nickserv register your_password</pre><p>服务器如果提示<strong>Your nickname is now registered with the password [your_password].</strong>那么恭喜你啦,你的nickname注册成功了,建议这个时候把你的邮箱跟nickname绑定,万一哪天你要是忘记了密码~~~</p><pre name="code" class="ruby">/msg nickserv set email your_email_address</pre>&nbsp;如果这个时候服务器提示<strong>Your email address has been set to [your_email_address].</strong>那么我只有继续恭喜你啦.好了,现在建议你尝试离开并重新登录一次,作一次nickname验证,离开的命令是<pre name="code" class="ruby">/quit</pre>&nbsp;再次进入ChatZilla,连接到freenode后,如果连接用的nickname不是你刚刚注册好的,那么简单的使用nick服务改一下nickname,如果已经是在用你自己的nickname,那么就验证一下就好了.步骤是<pre name="code" class="ruby"># 如果nickname不是你注册好的,修改当前nickname
/nick your_nick_name</pre>&nbsp;这个时候服务器可能提示你:<strong>This nickname is owned by someone else, If this is your nickname, type /msg NickServ IDENTIFY &lt;password&gt;</strong>, 说这个nickname已经被注册,如果你是这个nickname的持有人,那么请你验证一下,不被验证有什么风险呢?可能现在另外一个人也用这个nickname,那么你可能会被服务器踢出来哦 <img title="smile" src="../../../images/smiles/icon_smile.gif" border="0" alt="smile" /><pre name="code" class="ruby">/msg nickserv identify your_password</pre>&nbsp;好了,现在你已经完成了nickname的注册,剩下的事情就是加入聊天频道,开聊啦!<p>&nbsp;</p><p>5) 加入聊天频道,比如我想跟全世界的rails开发人员共同探讨rails技术话题,那么我可以加入#rubyonrails频道,如果我想为rails作贡献,我可以加入#rails-contrib频道,或者你对什么技术方面有兴趣,你总能找到一群同你一样感兴趣的人,大家共同交流.加入的办法是:</p><pre name="code" class="ruby"># 加入rubyonrails频道
/join #rubyonrails

# 加入ruby-contrib频道
/join #ruby-contrib

# 列频道目录,小心哦,现在有1万8千多个频道,列目录一次时间不短哦
/list
</pre><p>&nbsp;</p><p>6) 开聊,具体一些irc的使用的技巧啊,细节啊,呵呵,边聊边学啦~~~</p><p>&nbsp;</p><p>最后祝大家聊的开心,技术更加精进! </p><p>&nbsp;</p><p>&nbsp;</p><p>---------- 参考 ----------</p><p><a href="http://www.fuping.net/home/chat/panda.htm" target="_blank">http://www.fuping.net/home/chat/panda.htm</a></p><p><a href="http://zh.gentoo-wiki.com/TIP_Irssi" target="_blank">http://zh.gentoo-wiki.com/TIP_Irssi</a></p><p><a href="http://forums.gentoo.org/viewtopic-t-594818.html?sid=33ac49920fde21eeafbff392c19fe1c7" target="_blank">http://forums.gentoo.org/viewtopic-t-594818.html?sid=33ac49920fde21eeafbff392c19fe1c7</a> </p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/174454#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Fri, 21 Mar 2008 12:37:00 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/174454</link>
        <guid>http://lgn21st.javaeye.com/blog/174454</guid>
      </item>
      <item>
        <title>Trick: Ruby的二维数组</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/173550" style="color:red;">http://lgn21st.javaeye.com/blog/173550</a>&nbsp;
          发表时间: 2008年03月18日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>&nbsp;缘起:</p><p>&nbsp;昨天跟一个学习ruby的网友聊天，刚好二维数组，对方抛给我一个问题，是这样的：<br /><br />&nbsp;创建一个含有3个元素的二维数组,并填充所有数组元素为'0'</p><pre name="code" class="ruby">arr = Array.new(3, Array.new(3,0))</pre>&nbsp;然后改写一个二维数组中一个元素的数值<br /><pre name="code" class="ruby">arr[1][1] = 1</pre>&nbsp;打印数组<br /><pre name="code" class="ruby">p arr</pre><p>&nbsp;得到的结果是</p><pre name="code" class="ruby">[[0, 1, 0], [0, 1, 0], [0, 1, 0]]</pre>&nbsp;也就是说二维数组中每个sub array都被赋值<br /><p><br />&nbsp;但是如果采用数组字面量方式创建爱昵一个二维数组</p><pre name="code" class="ruby">arr = [[0, 0, 0], [0, 0, 0], [0, 0, 0]]</pre>&nbsp;重复上面的步骤,改写一个元素的值<br /><pre name="code" class="ruby">arr[1][1] = 1
p arr</pre>&nbsp;得到的答案是<pre name="code" class="ruby">[[0, 0, 0], [0, 1, 0], [0, 0, 0]]</pre><p>&nbsp;</p><p>&nbsp;第二种方法得到的值是我想要的,也是符合我心里预期的.但是我确并不能理解第一种方式问题在哪里.</p><p>&nbsp;用ruby的equals测试</p><pre name="code" class="ruby">&gt;&gt; Array.new(3, Array.new(3,0)) == [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
=&gt; true
&gt;&gt; Array.new(3, Array.new(3,0)) === [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
=&gt; true</pre><p>&nbsp;结果也表示两种方式返回的对象值相同</p><p>&nbsp;</p><p><a href="http://www.shanghaionrails.com/" target="_blank">Shanghaionrails</a>上的sishen帮助我解释了这个问题,感谢sishen同学,代码如下</p><pre name="code" class="ruby">Array.new(3, Array.new(3,0)).each{|i|p i.object_id}
-616182288
-616182288
-616182288

[[0, 0, 0], [0, 0, 0], [0, 0, 0]].each{|i|p i.object_id}
-616198918
-616198928
-616198938</pre>即按照第一种方式创建的二维数组,内部sub array其实是指向内存中的同一个对象.一般用数组,总是习惯上直接&nbsp;&nbsp; 用字面常量方式赋值来创建,一直没有注意到这个问题,以后处理二维/n维数组时要小心啦.<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/173550#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Tue, 18 Mar 2008 22:59:57 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/173550</link>
        <guid>http://lgn21st.javaeye.com/blog/173550</guid>
      </item>
      <item>
        <title>转贴: 算法描述中的'Pseudocode Conventions'</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/172828" style="color:red;">http://lgn21st.javaeye.com/blog/172828</a>&nbsp;
          发表时间: 2008年03月17日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          研究一个算法问题时,需要用到Pseudocode,google到一篇介绍Pseudocode非常棒的博文<br />原始出处: <a href="http://bigwhite.blogbus.com/logs/2443206.html" target="_blank">http://bigwhite.blogbus.com/logs/2443206.html</a><p>&nbsp;</p><h2>算法描述中的'Pseudocode Conventions'</h2><p>Pseudocode，即伪码，它常常用来描述一个算法，目的是能使被描述的算法能够容易的以任何一种计算机程序语言实现。
'Pseudocode
Conventions'可以理解为'伪码约定'，既然是'约定'那就并非强制性的标准。但是在专业的有关算法的文献和资料中，其相关内容多符合这些
'Pseudocode
Conventions'。如果你是一个想学习和钻研算法的人，那么建议你熟悉这些'Conventions'，俗话说：'磨刀不误砍柴工'吗！</p><p>&nbsp;</p><p>'Pseudocode
Conventions'应该说也是有多种多样的，但是随着这么多年的积累和进化，渐渐的一些'Conventions'退出了人们的视线，此时你在一些
重要的图书典籍上能看到的大概就是被人们广泛接受的一种'Convention'了。这里介绍一种比较常用的'Pseudocode
Convention'，这种'Convention'在MIT Press出版的'<a href="http://mitpress.mit.edu/algorithms/" target="_blank">Introduction to Algorithms 2nd</a>'中被广泛采用，在国内的一些算法书籍中也是'屡见不鲜'。</p><p>&nbsp;</p><p>介绍'Pseudocode Conventions'其实与介绍一种程序设计语言的语法相似，看多了就会产生厌烦，这里先给出一个例子，让大家有个感性认识，找到一种新鲜感。^_^</p><p>这个例子源于'Introduction to Algorithms'一书中的那个著名的'Insertion-Sort'：<br />Insertion-Sort(A) △ A[1..n]<br />&nbsp;&nbsp;&nbsp; for j &lt;- 2 to length[A]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do key &lt;- A[j]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; △ Insert A[j] into the sorted sequence A[1..j-1].<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i &lt;- j-1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while i &gt; 0 and A[i] &gt; key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; do A[i+1] &lt;- A[i]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; i &lt;- i-1<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; A[i+1] &lt;- key</p><p>&nbsp;</p><p>对应上面的例子，下面是对该'Convention'的一些阐述条款：</p><p>&nbsp;</p><p>1、每个指令占据一行，指令结束或者说行尾无任何符号。<br />2、利用'缩进(Indentation)'表示程序的块结构(Block Structure)。<br />3、符号'△'表示该行其后面的内容为注释。<br />4、'i &lt;- j'为赋值语句，表示将j的值赋给i；而'i &lt;- j &lt;- e'这样的多重赋值形式则等价于'i &lt;- e', 'j &lt;- e'。<br />5、变量无需声明；一般情况下变量局限于某一特定的Procedure，除非有显式说明我们才使用全局变量。<br />6、数组A通过A[index]方式访问到数组内元素的值。<br />7、条件判断语句格式如下：<br />if (Condition1) <br />&nbsp;&nbsp;&nbsp; then [ Block 1 ]<br />&nbsp;&nbsp;&nbsp; else if (Condition2) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; then [ Block 2 ]<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else [ Block 3 ]&nbsp; </p><p>8、支持三种循环语句：while、for、repeat ... until。'for t &lt;- 0 to n'表示 t范围为[0, n)。<br />9、
复合数据用对象(Object)来表示。对象由属性(Attribute)和域(Field)构成。域的存取是由域名后接由方括号括住的对象名表示，如上
面李子中的length[A]，数组A被看成为一个Object，其域有length，表示数组中元素的个数，即length[A]。用于表示一个数组或
对象的变量被看作是指向表示数组或对象的数据的一个指针。对于某个对象x的所有域f，赋值y&lt;-x就使f[y]=f[x]，换言之，在赋值y&amp;
lt;-x后，x和y指向同一个对象。有时一个指针不指向任何对象，这时我们赋给它NIL。<br />10、参数传递方式为'值传递'方式，被调用的过程拥有自己的参数拷贝，被调用过程对参数的修改是不能被调用者看到的。当传递一个对象时，只是拷贝指向该对象的指针，而不拷贝其各个域。<br />11、布尔运算符'and'和'or'都是'short circuiting'的。如计算表达式'x and y'，如果x为FALSE，那么整个表达式就为FALSE，我们不再计算y了。</p><p>&nbsp;</p><p>OK，罗列了11项，照比C这类的高级语言，这种'语法'显然简单的多，更易理解。以后要做的就是尽量在进行算法描述的时候使用这种'Pseudocode Convention'，毕竟熟才能生巧！</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/172828#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Mon, 17 Mar 2008 09:18:27 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/172828</link>
        <guid>http://lgn21st.javaeye.com/blog/172828</guid>
      </item>
      <item>
        <title>Rails技巧: Handling nil in method calls</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/172292" style="color:red;">http://lgn21st.javaeye.com/blog/172292</a>&nbsp;
          发表时间: 2008年03月16日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>缘起:<br /><a href="http://rc.org.cn/?uid/321" target="_blank">Martin</a>在<a href="http://www.ruby-lang.org.cn/forums/index.php">ruby-lang.org.cn</a>发起了一个栏目&quot;<a href="http://www.ruby-lang.org.cn/forums/forum-76-1.html" target="_blank">每日一题</a>&quot;,非常有趣,第一期的两道题目中的第二题描述如下:</p><p>我们在项目中经常遇到去关联对象的属性，而关联对象又经常为空，则需要做nil?的判断。譬如</p><pre name="code" class="ruby">class Coment&lt;AR
  belongs_to :user
end

class User&lt;AR
  has_many :comments
end</pre>&nbsp;我们在使用的时候一般如下：<br /><pre name="code" class="ruby">unless @comment.user.nil?
   puts @comment.user.login
end</pre><p>&nbsp;想个方法简化他，去掉这冗余的nil?判断</p><p>&nbsp;</p><p>恰好我前日看到一篇<a href="http://www.pgrs.net/2008/2/17/handling-nil-in-method-calls" target="_blank">Blog</a>专门讨论这个问题,并给出一个非常不错的办法,避免每次关联对象调用时,先要判断对象是否为nil这么一个步骤,非常的DRY. </p><p>&nbsp;</p><p>具体做法是利用ruby的openclass,并非常巧妙的利用了method-messing机制.自定义一个nil_or方法并插入到ruby的Class类中,让Class的对象有了自我检测的能力,如果方法调用接收者的那个对象是nil,则创建一个新的Class实例nil返回,反之则返回对象的方法调用结果.</p><p>&nbsp;</p><pre name="code" class="ruby">module ObjectExtension
  def nil_or
    return self unless self.nil?
    Class.new do
      def method_missing(sym, *args); nil; end
    end.new
  end  
end

class Object
  include ObjectExtension
end</pre><p>还用题目中的模型为例,用法是这样: </p><pre name="code" class="ruby">@comment.user.nil_or.login</pre>即如果Comment的实例@comment的父对象user实例不存在,这个方法调用将直接返回nil,如果存在,则返回父对象user的login方法调用的结果.<p>&nbsp;</p><p>&nbsp;</p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/172292#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 16 Mar 2008 10:23:53 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/172292</link>
        <guid>http://lgn21st.javaeye.com/blog/172292</guid>
      </item>
      <item>
        <title>ActiveScaffold.com.cn上线,祝贺曹维远兄</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/171336" style="color:red;">http://lgn21st.javaeye.com/blog/171336</a>&nbsp;
          发表时间: 2008年03月14日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>记得第一次接触<a href="http://activescaffold.com/" target="_blank">ActiveScaffold</a>的时候刚好就是去年这个时候,当时作一个小项目,需要将svn repository中的所有条目都列举出来,于是不经意间找到了这个插件,限于当时的水平,以及对rails有限的了解,只用了这么一次就放下了.不过,是宝石总会发光的.<br /><br />第二次接触<a href="http://activescaffold.com/" target="_blank">ActiveScaffold</a>,正是在<a href="http://groups.google.com/group/shanghaionrails?hl=en" target="_blank">shanghaionrails</a>第二次活动,听<a href="http://activescaffold.com.cn/team/" target="_blank">Forrest</a>(曹兄)讲解这个,记得开始之时我心中存有诸多疑惑,但随着<a href="http://activescaffold.com.cn/team/" target="_blank">Forrest</a>慢慢道出AS的精髓,已经完全覆盖了我心中的每个问题,那种感觉是真真正正的挠到了我的痒处,让我完全按奈不住想要跃跃欲试,于是第三天上班,我就开始尝试将AS引入正在进行的项目中,初步估算,如果过程平滑,那么将至少缩减40%以上的代码量,且能提高产品质量不止一个档次,不过事后沮丧的发现,项目使用的rails版本太低,而AS已经今非昔比,已经展翅高飞在更高一级的rails之上了~~~<br /><br />还记得那次去Jon的studio,跟<a href="http://activescaffold.com.cn/team/" target="_blank">Forrest</a>一起讨论rails的话题,心中不免赞叹, He is <strong>awesome</strong> guy!<br /><br />听闻Forrest的<a href="http://activescaffold.com.cn/" target="_blank">ActiveScaffold.com.cn</a>上线,我不得不表一下,且恭喜<a href="http://activescaffold.com.cn/team/" target="_blank">Forrest</a>啦!</p><p>&nbsp;</p><div class="quote_div">近100个表，1000多个页面，无数次迭代。在刚刚上线的这个项目中，我们完成了一个B/S的ERP系统。它<br />具备了字段级别的权限设置，和各种表单、图表和报表，而只花费了6个人月。这要归功于这帮家伙开发的Rails插件──活动脚手架（ActiveScaffold），使我们的开发非常DRY。希望通过我们的分享，可以有更多的中文Rails开发者受益。<br /><br />活动脚手架参考了Rails自带的脚手架（Scaffold）功能，提供了一个更丰富的通用模式，除了CRUD，还有排序、搜索、分页等等许多功能。这里是一个功能列表。<br /><br />需要更直观的了解？请看我们在Shanghai On Rails上做介绍演示时用的PPT，或者Demo页面。<br />......<br /></div>&nbsp;<p>详情请移步<a href="http://activescaffold.com.cn/" target="_blank">ActiveScaffold.com.cn</a></p><p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/171336#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/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</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, 14 Mar 2008 11:36:44 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/171336</link>
        <guid>http://lgn21st.javaeye.com/blog/171336</guid>
      </item>
      <item>
        <title>郁闷了今天,基础太重要了!</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/168883" style="color:red;">http://lgn21st.javaeye.com/blog/168883</a>&nbsp;
          发表时间: 2008年03月06日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          今天着实郁闷了一回,一个这么大的bug,愣是没有发现,直到新的核心功能上线一周以后才发现,这里我需要吼出来发泄一下:<br /><br /><strong>郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!郁闷啊,基础太重要了!</strong><br /><br />事情其实很简单,一个ruby的collection,对其进行each迭带的时候,不要尝试在其each block的迭带中不要作对collection内的元素进行条件判断,然后根据条件添加新的元素或者删除旧的又或者合并collection中的元素,这么作是不能保证得到完整的筛选结果的!.这么基础性的问题,我居然也会犯错,着实不该原谅,基础啊基础!
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/168883#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Thu, 06 Mar 2008 21:41:22 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/168883</link>
        <guid>http://lgn21st.javaeye.com/blog/168883</guid>
      </item>
      <item>
        <title>FreeBSD 7.0之初体验,部署rails应用</title>
        <author>lgn21st</author>
        <description>
          <![CDATA[
          <br/>
          作者: <a href="http://lgn21st.javaeye.com">lgn21st</a>&nbsp;
          链接：<a href="http://lgn21st.javaeye.com/blog/166593" style="color:red;">http://lgn21st.javaeye.com/blog/166593</a>&nbsp;
          发表时间: 2008年03月02日
          <br/><br/>
          声明：本文系JavaEye网站发布的原创博客文章，未经作者书面许可，严禁任何网站转载本文，否则必将追究法律责任！
          <br/><br/>
          <p>用Linux作开发时间不短,虽然水平并不高,不过也略有心得.很早就知道FreeBSD,也经常听闻FreeBSD的种种好处,恰逢7.0刚刚Release,所以我也来体验一下.<br />
<br />
已经非常适应Ubuntu的DEB包管理系统,用起来非常爽,即便重灌新机器,在保证网络通畅的情况下,很短的时间用apt-get就可以搭建完整的应用平台,让rails,java,php,django等等全跑起来,整个过程可谓非常平滑.<br />
<br />
说实话,我个人对BSD的体验远远不及Ubuntu来得那么平滑,顺利,这里我记下BSD的初体验:<br />
<br />
FreeBSD是在虚拟机中安装,Host是Ubuntu 7.10,虚拟机是VirtualBox.首先是为BSD创建VM Client,这里我在Host上添加了一个tap设备作为虚拟网卡提供给VM Client使用,并为在虚拟网卡和Host的物理网卡之间创建路由,好处是可以让Hout跟VM Client双向通讯(如ssh,scp等等),VM Client通过Host的物理网卡透明访问Internet.(tap配置过程略,不在讨论范围)<br />
<br />
用FreeBSD的BootOnly CD镜像文件安装最小系统,文件非常小,大概只有34MB左右.安装过程中根据自己实际局域网情况配置网络,采用ftp被动模式通过ftp: //ftp.cn.freebsd.org安装最小化系统,不安装额外软件包,除了启用ssh服务和选则时区外,不起用其他所有服务,重启.至此得到一个最小BSD系统(完整安装过程略,可以google到大把图文过程)<br />
<br />
第一次以root用户登录,输入密码后第一件事是创建一个普通用户,用于执行一般任务</p>
<pre name="code" class="ruby"># adduser</pre>
<p>回答一系列问题后,一个新用户建立完毕,这里我建立一个新用户'daniel'.并使用FreeBSD的csh shell.<br />
<br />
剩下的就是安装/配置应用程序和服务.FreeBSD提供两种方式安装软件,package和ports,其中package的原理跟 Ubuntu差不多,都是利用命令远程安装预编译的二进制包,而FreeBSD最有特色的就是他的ports系统,这里我重点说ports,因为在FreeBSD上,ports才是王道.怎么理解ports呢?如果站在Ubuntu的角度来看,ports是一个FreeBSD软件仓库的本地镜像,只不过这个镜像只保存了所有的软件的信息和编译用的配置文件,以及软件包依赖信息,如果要安装哪个软件,执行特定的命令,系统会自动到网上抓软件源码和依赖包的源码,用本地配置文件进行编译,安装.<br />
<br />
首先是建立这个软件仓库镜像,即ports collection,这里用从FreeBSD 6.0开始引入的portsnap方式建立本地ports,svsup/csup已经不被推荐使用了.创建本地ports的第一步是先配置&quot;去哪里得到软件仓库的镜像&quot;,因为访问FreeBSD的官方网站速度实在太慢(我用的是天杀的有线通,sigh~~),修改/etc/postsnap.conf,修改SERVERNAME指向的地址,这里首选安装源是台湾的源,其次是大陆的镜像,据说大陆镜像源里面软件不全,不过我这里访问台湾源速度比较快.</p>
<pre name="code" class="ruby">SERVERNAME=portsnap.tw.freebsd.org</pre>
<p>如果是第一次使用portsnap,需要创建/usr/ports,方法是</p>
<pre name="code" class="ruby"># portsnap fetch extract</pre>
<p>大概需要下载50M左右的数据,创建成功以后则则只需不定期执行更新ports就可以了</p>
<pre name="code" class="ruby"># portsnap fetch update</pre>
<p>&nbsp;</p>
<p>这里有个加速ports安装速度的技巧,安装ports时默认的做法是用fetch去访问官方网站并抓软件,首先官方网站太远,速度很慢.其次是fetch抓package效率不高,可以通过设置安装源到比较近的镜像站点,并换用比较快的wget替换比较慢的fetch或用支持多线程的axel提高下载/安装速度(小心用axel开太多线程而被封).</p>
<p>&nbsp;</p>
<p>修改安装源,检查/etc目录下是否有make.conf这个文件,如果没有可以从/usr/share/examples/etc/make.conf拷贝一份到/etc下面,修改/etc/make.conf,在尾部添加下面几行</p>
<pre name="code" class="ruby">MASTER_SITE_BACKUP?= \
ftp://freebsd.csie.nctu.edu.tw/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR} \
ftp://ftp.cn.freebsd.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/ \
ftp://ftp.freebsdchina.org/pub/FreeBSD/ports/distfiles/${DIST_SUBDIR}/
MASTER_SITE_OVERRIDE?= ${MASTER_SITE_BACKUP} </pre>
<p>&nbsp;</p>
<p>修改完毕安装源后开始安装程序,首先要安装的程序是&quot;sudo&quot;,是为了方便让普通用户可以通过ssh登录BSD后可以用root用户身份执行命令,后面的安装过程均通过普通用户完成,尽量不使用root用户.</p>
<pre name="code" class="ruby"># cd /usr/ports/security/sudo
# make install clean</pre>
<p>&nbsp;</p>
<p>在BSD上用ports安装软件全部遵循这一模式,进入到/usr/ports/somepackage,执行&quot;make install clean&quot;然后就可以去喝杯茶,BSD会帮你搞定一切.</p>
<p>&nbsp;</p>
<p>装完软件有个小技巧,每个软件安装完毕后执行一次rehash命令(csh shell,如果是sh shell则用hash -r),用以刷新环境变量,这时新安装的软件马上被加载到系统命令路径,软件就马上可用了.</p>
<p>&nbsp;</p>
<p>用visudo配置sudo用户权限,添加一个普通用户可以执行sudo的能力,这里我加入'daniel'这个用户,而且我比较懒,设置为执行sudo不需要密码验证用户,添加一行</p>
<pre name="code" class="ruby">daniel ALL=(ALL) NOPASSWD: ALL</pre>
<p>好的,现在可以通过Host的终端ssh到BSD服务器了,以后所有操作均通过ssh远程执行</p>
<pre name="code" class="ruby">$ ssh daniel@vm_clent_ip_address</pre>
<p>&nbsp;</p>
<p>现在我们需要安装wget,为了加速其他的ports的安装</p>
<pre name="code" class="ruby">% cd /usr/ports/ftp/wget
% sudo make install clean </pre>
<p>安装完毕,rehash,配置用wget来作为安装ports的下载工具,编辑/etc/make.conf,添加下面两行</p>
<pre name="code" class="ruby">FETCH_CMD=wget -c -t 1
DISABLE_SIZE=yes</pre>
<p>如果安装了/usr/ports/ftp/axel,那么配置跟wget差不多</p>
<pre name="code" class="ruby">FETCH_CMD=axel -a
DISABLE_SIZE=yes</pre>
<p>&nbsp;</p>
<p>===== 安装 &amp; 部署rails应用 =====</p>
<p>安装ruby + rubegems + 相关依赖包</p>
<pre name="code" class="ruby">% cd /usr/ports/devel/ruby-gems
% sudo make install clean
% rehash
% sudo gem install rails
% rehash
</pre>
<p>安装mongerl,mongrel_cluster</p>
<pre name="code" class="ruby">% sudo gem install mongrel mongrel_cluster</pre>
<p>安装Sqlite3数据库 + sqlite3-ruby驱动:</p>
<pre name="code" class="ruby">% cd /usr/ports/databases/rubygem-sqlite3/
% sudo make install clean
</pre>
<p>安装MySQL:</p>
<pre name="code" class="ruby">% /usr/ports/databases/mysql51-server
% sudo make install clean
% sudo mysql_install_db
% sudo chown -R mysql:mysql /var/db/mysql/
% sudo /usr/local/bin/mysqld_safe -user=mysql &amp;
% sudo su
# echo 'mysql_enable=&quot;YES&quot;' &gt;&gt; /etc/rc.conf
# exit
% sudo cp /usr/local/share/mysql/my-medium.cnf /var/db/mysql/my.cnf</pre>
<p>scaffold测试</p>
<pre name="code" class="ruby">% rails demo
% cd demo
% ./script/generate scaffold book title:string author:string
% rake db:migrate
% ./script/server 
</pre>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>顺便说说FreeBSD的package方式安装软件吧,这个包管理系统跟Ubuntu的apt-get是最接近的.都是直接下载,安装预编译的二进制软件,因为预编译的二进制软件一般采用比较保守的配置选项,所以在效能上比不上ports本机自动下载源码并在本机编译出来的软件.同样,用package安装软件也有将源服务器设置为比较近的镜像服务器来加速的办法.</p>
<p>&nbsp;</p>
<p>首先查看当前的shell是哪个版本,FreeBSD提供了几种默认的shell,一般是sh或者csh/tcsh,查看方法是</p>
<pre name="code" class="ruby">% echo $SHELL</pre>
<p>如果是sh shell,编辑~/.cshrc,在尾部插入</p>
<pre name="code" class="ruby">setenv PACKAGEROOT &quot;ftp://ftp.freebsdchina.org&quot;</pre>
<p>如果是sh shell,编辑~/.shrc,在尾部插入</p>
<pre name="code" class="ruby">export PACKAGEROOT=&quot;ftp://ftp.freebsdchina.org&quot; </pre>
<p>安装package的一般方法是</p>
<pre name="code" class="ruby">% pkg_add -v -r packagename</pre>
<p>&nbsp;</p>
<p>说说FreeBSD有点不爽的地方,更新portsnap太慢,尤其是在第一次,国内暂时找不到稳定高速的源服务器,环顾一周,人们大多选则台湾,日本的源服务器.抱怨源不够快,不够多,跟新慢的比比皆是.按说portsnap比cvsup要快多了,但是首次下载量也要50MB以上,解压缩后将近 300~400MB,算上跨国际网络传输,情况就更加糟糕了,FreeBSD将ports的配置信息完整的保存在本机上,对比Debian/Ubuntu的做法,只将源服务器的软件库索引保存在本地,一台新灌的机器,稍加配置,一组apt-get命令就齐活了,第一次更新本地索引大概只4~5MB左右,国内电信,网通,铁通,教育网已有不少稳定快速的源服务器.源里面的软件经过精心维护/测试,二进制包下载安装快速,安全补丁跟新及时,缺点是没有本地编译带来的性能优势,但维护容易.如果不是在大规模计算密集型的场景中,要榨干硬件每一点资源,硬件负载还有那么多一丁点富裕的情况下,我更加偏向选用这种基于DEB包管理的系统.使用FreeBSD过程中,可以亲身体验了一回那种一切皆从源码编译的快感,耗费的时间确相当可观,人生苦短,多享受生活吧.我更认同了一次编译,众人分享的二进制包管理模式.</p>
<p>&nbsp;</p>
<p>========== 后记 ==========<br />
VirtualBox对FreeBSD的支持还存在写bug</p>
<p>总是随机出</p>
<p>sigreturn: eflags = 0x80203</p>
<p>sigreturn: eflags = 0x80247</p>
<p>sigreturn: eflags = 0x80282 </p>
<p>console被锁死了,只能通过另外一个终端ssh上去BSD,杀死进程或者执行reboot重启</p>
<p>这个bug已经在VirtualBox网站上被确认了,希望VirtualBox被SUN收购后能做的更好</p>
<p>&nbsp;</p>
          <br/>
          <span style="color:red;">
            <a href="http://lgn21st.javaeye.com/blog/166593#comments" style="color:red;">本文的讨论也很精彩，浏览讨论>></a>
          </span>
          <br/><br/><br/>
          <span style="color:#E28822;">JavaEye推荐</span>
          <br/>
          <ul class='adverts'><li><a href='/adverts/115' target='_blank'><span style="color:red;font-weight:bold;">JavaEye图灵杯第2届问答大赛开始了！8月4日至8月17日，奖品丰厚！</span></a></li><li><a href='/adverts/41' target='_blank'><span style="color:red;font-weight:bold;">北京: 千橡集团暨校内网诚聘软件研发工程师</span></a></li><li><a href='/adverts/42' target='_blank'><span style="color:red;font-weight:bold;">搜狐网站诚聘Java、PHP和C++工程师</span></a></li></ul>
          <br/><br/><br/>
          ]]>
        </description>
        <pubDate>Sun, 02 Mar 2008 02:45:23 +0800</pubDate>
        <link>http://lgn21st.javaeye.com/blog/166593</link>
        <guid>http://lgn21st.javaeye.com/blog/166593</guid>
      </item>
  </channel>
</rss>