<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	>

<channel>
	<title>知易行难</title>
	<atom:link href="http://blog.ashchan.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.ashchan.com</link>
	<description>in love with rails</description>
	<pubDate>Mon, 30 Jun 2008 08:57:31 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<item>
		<title>Tags on Git</title>
		<link>http://blog.ashchan.com/archive/2008/06/30/tags-on-git/</link>
		<comments>http://blog.ashchan.com/archive/2008/06/30/tags-on-git/#comments</comments>
		<pubDate>Mon, 30 Jun 2008 08:48:53 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[git]]></category>

		<category><![CDATA[github]]></category>

		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/06/30/tags-on-git/</guid>
		<description><![CDATA[Tags of SVN are just copies of trunk. Tags of Git, on the other hand, are much more powerful. Here I&#8217;ll show you how to add/delete git tags locally and remotely.

I&#8217;ll take google&#95;map&#95;example for example. The google&#95;map&#95;example is an open project on github that shows sample codes from the book Beginning Google Maps Applications with [...]]]></description>
			<content:encoded><![CDATA[<p>Tags of SVN are just copies of trunk. Tags of <a href="http://git.or.cz">Git</a>, on the other hand, are much more powerful. Here I&#8217;ll show you how to add/delete git tags locally and remotely.</p>

<p>I&#8217;ll take <a href="http://github.com/ashchan/google_maps_example/tree/master">google&#95;map&#95;example</a> for example. The google&#95;map&#95;example is an open project on <a href="http://github.com">github</a> that shows sample codes from the book <a href="http://www.amazon.com/Beginning-Google-Maps-Applications-Rails/dp/1590597877">Beginning Google Maps Applications with Rails and Ajax: From Novice to 
Professional</a>. The codes will be changed slightly to use Rails 2.1.</p>

<p>Say I&#8217;ve keyed in the codes from chapter 1, now I&#8217;d like to tag the last commit. This is can be done in this way:</p>

<pre><code>phantom:~/codex/maps (master) james$ git tag -a -m "tagged chap_1" chap_1
phantom:~/codex/maps (master) james$ git tag -l
chap_1
</code></pre>

<p>A local tag named &#8220;chap_1&#8243; has been created. Keep in mind it&#8217;s merely a LOCAL tag, which means you have to push it to the remote repository to let other guys see it.</p>

<p>Here&#8217;s the tricky thing, git push won&#8217;t push the tag to the remote, git push &#8211;all won&#8217;t neither! Use this instead:</p>

<pre><code>phantom:~/codex/maps (master) james$ git push --tags
updating 'refs/tags/chap_1'
  from 0000000000000000000000000000000000000000
  to   63db0052a27914db5f1a9fe6e1321309e8111f82
Generating pack...
Done counting 1 objects.
Deltifying 1 objects...
 100% (1/1) done
Writing 1 objects...
 100% (1/1) done
Total 1 (delta 0), reused 0 (delta 0)
</code></pre>

<p>Let&#8217;s go to the github project page to check if the tag has been pushed. Visit <a href="http://github.com/ashchan/google_maps_example/tree/master">http://github.com/ashchan/google&#95;maps&#95;example/tree/master</a>, hover mouse to &#8220;all tags&#8221;. Cheers, it&#8217;s there!</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/06/git-tag.png" alt="Git tag" /></p>

<p>Later I decide to remove this tag. Piece of cake, just use the git tag -d command:</p>

<pre><code>phantom:~/codex/maps (master) james$ git tag -d chap_1
Deleted tag 'chap_1'
phantom:~/codex/maps (master) james$ git tag -l
</code></pre>

<p>Note when I use git tag -l it shows no local tags.</p>

<p>It&#8217;s a little bit complicated to use the push command to remove the remote tag:</p>

<pre><code>phantom:~/codex/maps (master) james$ git push origin :refs/tags/chap_1
deleting 'refs/tags/chap_1'
Everything up-to-date
</code></pre>

<p>I googled a lot and couldn&#8217;t find any documents showing this example. Almost all people know that <strong>git push remotename :refs/heads/branchname</strong> would delete a remote branch, so it&#8217;s not very hard for me to figure out how to delete a remote tag :p</p>

<p>I&#8217;m new to git but I&#8217;ve been planning to migrate most projects to git. Hope this helps.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/06/30/tags-on-git/feed/</wfw:commentRss>
		</item>
		<item>
		<title>专业与否仅一步之差</title>
		<link>http://blog.ashchan.com/archive/2008/06/25/professional-book/</link>
		<comments>http://blog.ashchan.com/archive/2008/06/25/professional-book/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 13:31:03 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Photos]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/06/25/professional-book/</guid>
		<description><![CDATA[这是一本讲述 rails 和 google maps 开发的书。



很遗憾，我买了一本中文版的。暂且不说翻译质量如何，让我们来看看封面吧：



专业不专业，往往仅一步之差。

BTW，这个译本是机械出的。
]]></description>
			<content:encoded><![CDATA[<p>这是一本讲述 rails 和 google maps 开发的书。</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/06/google-maps-book.png" alt="Google Maps Book" /></p>

<p>很遗憾，我买了一本中文版的。暂且不说翻译质量如何，让我们来看看封面吧：</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/06/google-maps-book.jpg" alt="Google Maps Book" /></p>

<p>专业不专业，往往仅一步之差。</p>

<p>BTW，这个译本是机械出的。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/06/25/professional-book/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Meta on Rails plugin for meta tags</title>
		<link>http://blog.ashchan.com/archive/2008/06/25/meta-on-rails-plugin-for-meta-tags/</link>
		<comments>http://blog.ashchan.com/archive/2008/06/25/meta-on-rails-plugin-for-meta-tags/#comments</comments>
		<pubDate>Wed, 25 Jun 2008 11:28:50 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[Web Development]]></category>

		<category><![CDATA[plugin]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/06/25/meta-on-rails-plugin-for-meta-tags/</guid>
		<description><![CDATA[Meta on Rails is a very simple rails plugin to help you customize your pages&#8217; meta tags a little bit easier.

How to Install

Meta on Rails is hosted on github. For Rails 2.1 or later, install in this way:

./script/plugin install git://github.com/ashchan/meta_on_rails.git


For Rails 2.0.2 or older, need to clone the public git url:

git clone git://github.com/ashchan/meta_on_rails.git vendor/plugins/meta_on_rails


Usage

Add the [...]]]></description>
			<content:encoded><![CDATA[<p>Meta on Rails is a very simple rails plugin to help you customize your pages&#8217; meta tags a little bit easier.</p>

<h2>How to Install</h2>

<p><a href="http://github.com/ashchan/meta_on_rails/tree/master">Meta on Rails</a> is hosted on <a href="http://github.com/">github</a>. For Rails 2.1 or later, install in this way:</p>

<pre><code>./script/plugin install git://github.com/ashchan/meta_on_rails.git
</code></pre>

<p>For Rails 2.0.2 or older, need to clone the public git url:</p>

<pre><code>git clone git://github.com/ashchan/meta_on_rails.git vendor/plugins/meta_on_rails
</code></pre>

<h2>Usage</h2>

<p>Add the following code to the layout (e.g. app/views/layout/application.html.erb), and be sure to put it in the head tag:</p>

<pre><code>&lt;head&gt;
&lt;%= display_meta(:keywords =&gt; "default,keywords", :description =&gt; "default description") %&gt;
&lt;/head&gt;
</code></pre>

<p>Values passed to the display_meta method becomes the site-wide default values. In the above example, these two meta tags will be generated on all pages if they&#8217;re not overridden on the views:</p>

<pre><code>&lt;meta name="description" content="default description" /&gt;
&lt;meta name="keywords" content="default,keywords" /&gt;
</code></pre>

<p>Then add this code to the view to set meta tags on that page:</p>

<pre><code>&lt;% set_meta(:keywords =&gt; 'my,keyword', :generator =&gt; 'a bad &lt;script /&gt; generator') %&gt;
</code></pre>

<p>The output html will be like this (note that html tags are tripped):</p>

<pre><code>&lt;meta name="generator" content="a bad  generator" /&gt;
&lt;meta name="description" content="default description" /&gt;
&lt;meta name="keywords" content="my,keyword" /&gt;
</code></pre>

<p>Dead simple, right?</p>

<h2>Feedback</h2>

<p>Feel free to leave a message if you have any suggestion or find bugs.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/06/25/meta-on-rails-plugin-for-meta-tags/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Freelancing 并不等于 Free</title>
		<link>http://blog.ashchan.com/archive/2008/06/24/freelancing-doesnt-mean-free/</link>
		<comments>http://blog.ashchan.com/archive/2008/06/24/freelancing-doesnt-mean-free/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 12:43:52 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[talk]]></category>

		<category><![CDATA[freelance]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/06/24/freelancing-doesnt-mean-free/</guid>
		<description><![CDATA[告别全职工作已有数月了，四月份正式开始 freelancing 至今也已经有两个月 。切身感受到 Freelancing 并不意味着完全 free，因为:


不够牛，所以没有高回报的项目;
什么活都有进度压力，有时（确切得说是大部分时间）会比全职上班更辛苦;
活多了会忙不过来，项目青黄不接时会没有饭吃;


放弃上班却正是因为 freelance 的 free 这一点。不用看老板脸色，不用朝九晚五，可以去看周二半价电影，可以自己选择要做的东西，可以在工作时间看书看碟。当然，享受这一切的前提是，要有够用的奶粉钱可以赚。

计划对 ashchan.com 再进行一次修改，使用 haml 作为 view template engine，并把外观简单化。

本人主要接 Rails 和 Ruby 相关的活。如果你有项目需要 outsourcing ，或者你有项目要寻求技术合作并且希望合作地在杭州，可以与我联系。
]]></description>
			<content:encoded><![CDATA[<p>告别全职工作已有数月了，四月份正式开始 <a href="http://www.getafreelancer.com/affiliates/ashchan/">freelancing</a> 至今也已经有两个月 。切身感受到 Freelancing 并不意味着完全 free，因为:</p>

<ul>
<li>不够牛，所以没有高回报的项目;</li>
<li>什么活都有进度压力，有时（确切得说是大部分时间）会比全职上班更辛苦;</li>
<li>活多了会忙不过来，项目青黄不接时会没有饭吃;</li>
</ul>

<p>放弃上班却正是因为 freelance 的 free 这一点。不用看老板脸色，不用朝九晚五，可以去看周二半价电影，可以自己选择要做的东西，可以在工作时间看书看碟。当然，享受这一切的前提是，要有够用的奶粉钱可以赚。</p>

<p>计划对 <a href="http://ashchan.com/">ashchan.com</a> 再进行一次修改，使用 haml 作为 view template engine，并把外观简单化。</p>

<p>本人主要接 Rails 和 Ruby 相关的活。如果你有项目需要 outsourcing ，或者你有项目要寻求技术合作并且希望合作地在杭州，可以与我<a href="http://ashchan.com/about">联系</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/06/24/freelancing-doesnt-mean-free/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Mechanize的内存问题</title>
		<link>http://blog.ashchan.com/archive/2008/06/05/mechanize-memory-issue/</link>
		<comments>http://blog.ashchan.com/archive/2008/06/05/mechanize-memory-issue/#comments</comments>
		<pubDate>Thu, 05 Jun 2008 06:45:10 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[mechanize]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/06/05/mechanize-memory-issue/</guid>
		<description><![CDATA[用Mechanize来写爬虫是非常轻松的一件事。简单的事情不一定会完美，比方说:

agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
10000.times do
    page = agent.get("http://some.site")
    puts (page/"div#title").text
end


暂且假设http://some.site不会封禁你的访问，同时每一次agent.get都返回了正确的页面（网络无问题）。这一万次页面访问有问题吗？

有！问题在于Mechanize实在很强大，它模拟自然的浏览器行为，所以默认它会去保留访问历史纪录，并且这个纪录貌似没有加以大小限制！运行这段ruby代码，很快内存使用会上升至 1G 以上。

把历史纪录的大小设为一个合理的值，在这种情况下设为1比较合适：

agent.max_history = 1


再运行这段代码，内存使用在20～30M间波动，非常稳定。
]]></description>
			<content:encoded><![CDATA[<p>用<a href="http://rubyforge.org/projects/mechanize/">Mechanize</a>来写爬虫是非常轻松的一件事。简单的事情不一定会完美，比方说:</p>

<pre><code>agent = WWW::Mechanize.new
agent.user_agent_alias = 'Windows IE 6'
10000.times do
    page = agent.get("http://some.site")
    puts (page/"div#title").text
end
</code></pre>

<p>暂且假设http://some.site不会封禁你的访问，同时每一次agent.get都返回了正确的页面（网络无问题）。这一万次页面访问有问题吗？</p>

<p>有！问题在于Mechanize实在很强大，它模拟自然的浏览器行为，所以默认它会去保留访问历史纪录，并且这个纪录貌似没有加以大小限制！运行这段ruby代码，很快内存使用会上升至 1G 以上。</p>

<p>把历史纪录的大小设为一个合理的值，在这种情况下设为1比较合适：</p>

<pre><code>agent.max_history = 1
</code></pre>

<p>再运行这段代码，内存使用在20～30M间波动，非常稳定。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/06/05/mechanize-memory-issue/feed/</wfw:commentRss>
		</item>
		<item>
		<title>第二届网络工程师侠客行大会</title>
		<link>http://blog.ashchan.com/archive/2008/05/26/2nd-china-internet-developer-conference/</link>
		<comments>http://blog.ashchan.com/archive/2008/05/26/2nd-china-internet-developer-conference/#comments</comments>
		<pubDate>Mon, 26 May 2008 10:26:41 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Photos]]></category>

		<category><![CDATA[Web Development]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/05/26/2nd-china-internet-developer-conference/</guid>
		<description><![CDATA[24号的第二届网络工程师侠客行大会，去的人还真不少。要看流水账的移步DBA Notes的侠客行会议归来。

收获肯定是不小的，不管是知识上还是物质上。会后私下找Flickr的大侠问在大陆被封这档子事，大侠说他们一直在努力，嘿嘿。

阿里发的环袋子很不错，美观大方，六一后上超市可以派上用场了。靓照在此：




]]></description>
			<content:encoded><![CDATA[<p>24号的<a href="http://info.china.alibaba.com/html/wx/index.html">第二届网络工程师侠客行大会</a>，去的人还真不少。要看流水账的移步DBA Notes的<a href="http://www.dbanotes.net/mylife/after_the_alibaba_meeting.html">侠客行会议归来</a>。</p>

<p>收获肯定是不小的，不管是知识上还是物质上。会后私下找Flickr的大侠问在大陆被封这档子事，大侠说他们一直在努力，嘿嘿。</p>

<p>阿里发的环袋子很不错，美观大方，六一后上超市可以派上用场了。靓照在此：</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/05/bag-1.jpg" alt="Bag 1" /></p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/05/bag-2.jpg" alt="Bag 2" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/05/26/2nd-china-internet-developer-conference/feed/</wfw:commentRss>
		</item>
		<item>
		<title>iPhone上跑Ruby</title>
		<link>http://blog.ashchan.com/archive/2008/05/05/ruby-on-iphone/</link>
		<comments>http://blog.ashchan.com/archive/2008/05/05/ruby-on-iphone/#comments</comments>
		<pubDate>Mon, 05 May 2008 13:55:50 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[leopard]]></category>

		<category><![CDATA[osx]]></category>

		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/05/05/ruby-on-iphone/</guid>
		<description><![CDATA[Ruby可以在iPhone上跑吗？答案当然是肯定的。最多只要五分钟，就可以搞定(其实对于大部分破解的iPhone来说前三步应该已经操作过)：


安装Installer.app
添加Community Sources
安装BSD Subsystem (System 分类下)
安装Term-vt100 (System 分类下)
安装Ruby (Development 分类下)


安装完Ruby，接到提示:

Please add /opt/iphone/bin to your $PATH


那就乖乖听话，把它加进去吧。运行Terminal(即上面安装的Term-vt100)，敲入：

cd ~
echo "PATH=$PATH:/opt/iphone/bin" &#62;&#62; .profile


为了使它生效，需要重启一下Ternimal:

killall Terminal


再运行Terminal，显示$PATH看加入了没有。如果有了，运行一个简单的命令测试一下：

echo $PATH
ruby -e "puts 'hello iphone'"


结果如下：



BTW，执行ruby -v看了一下，结果为：

ruby 1.8.6 (2007-03-13 patchlevel 0) [arm-darwin]


而我的Leopard 10.5.2下为：

ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]


好玩！
]]></description>
			<content:encoded><![CDATA[<p>Ruby可以在iPhone上跑吗？答案当然是肯定的。最多只要五分钟，就可以搞定(其实对于大部分破解的iPhone来说前三步应该已经操作过)：</p>

<ul>
<li>安装Installer.app</li>
<li>添加Community Sources</li>
<li>安装BSD Subsystem (System 分类下)</li>
<li>安装Term-vt100 (System 分类下)</li>
<li>安装Ruby (Development 分类下)</li>
</ul>

<p>安装完Ruby，接到提示:</p>

<pre><code>Please add /opt/iphone/bin to your $PATH
</code></pre>

<p>那就乖乖听话，把它加进去吧。运行Terminal(即上面安装的Term-vt100)，敲入：</p>

<pre><code>cd ~
echo "PATH=$PATH:/opt/iphone/bin" &gt;&gt; .profile
</code></pre>

<p>为了使它生效，需要重启一下Ternimal:</p>

<pre><code>killall Terminal
</code></pre>

<p>再运行Terminal，显示$PATH看加入了没有。如果有了，运行一个简单的命令测试一下：</p>

<pre><code>echo $PATH
ruby -e "puts 'hello iphone'"
</code></pre>

<p>结果如下：</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/05/ruby-on-iphone.jpg" alt="Ruby on Iphone" /></p>

<p>BTW，执行ruby -v看了一下，结果为：</p>

<pre><code>ruby 1.8.6 (2007-03-13 patchlevel 0) [arm-darwin]
</code></pre>

<p>而我的Leopard 10.5.2下为：</p>

<pre><code>ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]
</code></pre>

<p>好玩！</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/05/05/ruby-on-iphone/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Leopard上试玩mod_rails</title>
		<link>http://blog.ashchan.com/archive/2008/04/26/mod_rails-on-mac-os-x-leopard/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/26/mod_rails-on-mac-os-x-leopard/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 04:18:10 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Mac &amp; Apple]]></category>

		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[Web Development]]></category>

		<category><![CDATA[apache]]></category>

		<category><![CDATA[leopard]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[osx]]></category>

		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/26/mod_rails-on-mac-os-x-leopard/</guid>
		<description><![CDATA[Setup mod&#95;rails Passenger Mac OS X Leopard是mod&#95;rails官方网站上的Passenger users guide中推荐的在OS X上安装mod_rails的教程文章。文章描述的很详细，安装过程主要花在编译安装apache上（Leopard自带的apache支持passenger-install-apache2-module有问题）。我照着步骤操作后，以development模式放了一个测试站点，运行后站点跑了起来，但样式和图片无法显示。显然是权限有问题。

解决方法：在站点的配置中加入对所在目录的访问权限。比方说虚拟站点的apache设置为：

&#60;VirtualHost *&#62;
  ServerName test.ashchan.com
  DocumentRoot /Users/james/codex/ashchan.com/public
  RailsEnv development
&#60;/VirtualHost&#62;


则加入以下配置即可：

&#60;Directory "/Users/james/codex/ashchan.com/public"&#62;
   Options FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
&#60;/Directory&#62;


站点起来时（第一次访问）感觉速度比较慢，不知道production模式下会快多少。相比mongrel cluster等每次需要重启的麻烦，mod_rails直接上传部署并自动扩展的方式非常吸引人，相信不用多久便会非常流行。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://benr75.com/articles/2008/04/12/setup-mod_rails-phusion-mac-os-x-leopard">Setup mod&#95;rails Passenger Mac OS X Leopard</a>是<a href="http://www.modrails.com">mod&#95;rails</a>官方网站上的<a href="http://www.modrails.com/documentation/Users%20guide.html">Passenger users guide</a>中推荐的在OS X上安装mod_rails的教程文章。文章描述的很详细，安装过程主要花在编译安装apache上（Leopard自带的apache支持passenger-install-apache2-module有问题）。我照着步骤操作后，以development模式放了一个测试站点，运行后站点跑了起来，但样式和图片无法显示。显然是权限有问题。</p>

<p>解决方法：在站点的配置中加入对所在目录的访问权限。比方说虚拟站点的apache设置为：</p>

<pre><code>&lt;VirtualHost *&gt;
  ServerName test.ashchan.com
  DocumentRoot /Users/james/codex/ashchan.com/public
  RailsEnv development
&lt;/VirtualHost&gt;
</code></pre>

<p>则加入以下配置即可：</p>

<pre><code>&lt;Directory "/Users/james/codex/ashchan.com/public"&gt;
   Options FollowSymLinks
   AllowOverride None
   Order allow,deny
   Allow from all
&lt;/Directory&gt;
</code></pre>

<p>站点起来时（第一次访问）感觉速度比较慢，不知道production模式下会快多少。相比mongrel cluster等每次需要重启的麻烦，mod_rails直接上传部署并自动扩展的方式非常吸引人，相信不用多久便会非常流行。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/26/mod_rails-on-mac-os-x-leopard/feed/</wfw:commentRss>
		</item>
		<item>
		<title>ubuntu 8.04 on parallels</title>
		<link>http://blog.ashchan.com/archive/2008/04/25/ubuntu-804-on-parallels/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/25/ubuntu-804-on-parallels/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 00:12:10 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[firefox]]></category>

		<category><![CDATA[linux]]></category>

		<category><![CDATA[mac]]></category>

		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/25/ubuntu-804-on-parallels/</guid>
		<description><![CDATA[这两天Linux界的大事莫过于Ubuntu 8.04的发布。

一大早起来抓了个desktop的ISO下来，开始在Parallels Desktop下捣腾。简单的几步选择后，开始安装。下楼吃了点早饭，吃完上来已经安装妥。

Ubuntu 8.04上的Firefox 3 beta 5貌似比Mac下的要跑的流暢些，可能是什么插件都没装的缘故吧（要知道我Mac下的Firefox使用了几个不兼容的插件）。



不过有个小小遗憾，那就是Parallels Tools无法安装.

小用一下，相当满意。Ubuntu一如既往，更快，更高，更强。
]]></description>
			<content:encoded><![CDATA[<p>这两天Linux界的大事莫过于<a href="http://www.ubuntu.com/news/ubuntu-8.04-lts-desktop">Ubuntu 8.04</a>的发布。</p>

<p>一大早起来抓了个desktop的ISO下来，开始在Parallels Desktop下捣腾。简单的几步选择后，开始安装。下楼吃了点早饭，吃完上来已经安装妥。</p>

<p>Ubuntu 8.04上的Firefox 3 beta 5貌似比Mac下的要跑的流暢些，可能是什么插件都没装的缘故吧（要知道我Mac下的Firefox使用了几个<a href="http://blog.ashchan.com/archive/2008/03/12/firefox-3-beta-with-add-ons/">不兼容的插件</a>）。</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/04/ubuntu-804.jpg" alt="Ubuntu 804" /></p>

<p>不过有个小小遗憾，那就是Parallels Tools无法安装.</p>

<p>小用一下，相当满意。Ubuntu一如既往，更快，更高，更强。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/25/ubuntu-804-on-parallels/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Rails中使用Stone</title>
		<link>http://blog.ashchan.com/archive/2008/04/21/rails-with-stone/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/21/rails-with-stone/#comments</comments>
		<pubDate>Mon, 21 Apr 2008 01:19:18 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<category><![CDATA[database]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[ruby]]></category>

		<category><![CDATA[stone]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/21/rails-with-stone/</guid>
		<description><![CDATA[Stone是一个数据持久化Ruby库。它把数据保持至文件中(ymal格式)，特点是快速易用，因而特别适用于小规模的应用。

要在Rails中使用Stone是非常简单的。我们来创建一个简单的Todo应用：

首先安装Stone:

sudo gem install stone


创建Rails应用:

rails todo


在 config/initializers 中新建一个文件，命名为 stone.rb，文件内容如下:

require 'stone'
Stone.start(Dir.pwd, Dir.glob(File.join(Dir.pwd,"app/models/*")), :rails)


接下去，去掉 ActiveRecord 的使用。在 config/environment.rb 中加入:

config.frameworks -= [ :active_record ]


准备工作完成了。现在使用Stone的stone-gen命令来生成一个model:

stone-gen model Todo title:string


生成后，可以发现 app/models 目录下自动创建了一个 todo.rb 文件，其内容如下:

class Todo
    include Stone::Resource

    field :title, String
end


好了，model有了，我们偷偷懒，用scaffold来创建一个controller(因为我们已经有了model，所以加上&#8211;skip-migration参数):

script/generate scaffold Todo --skip-migration


自动生成的controller和view还跑不起来，因为Stone的model方法跟ActiveRecord有所区别，需要调整一下。我们先来改各个view:

在new.html.erb中的表单中，加入:

&#60;p&#62;&#60;label&#62;Title:&#60;/label&#62;&#60;%= f.text_field :title %&#62;&#60;/p&#62;


在show.html.erb最上边，加入:

&#60;%= h @todo.title %&#62;


其他view先不管了。接下去修改todos&#95;controller:

将index中的:

@todos = Todo.find(all)


修改为:

@todos = Todo.all()


将show中的:

@todo = Todo.find(params[:id])


修改为:

@todo = Todo[params[:id]]


好了，用script/server把应用跑起来，测试一下。访问http://localhost:3000/todos/new，创建一个新的todo:



创建成功后，访问http://localhost:3000/todos/1，显示也正确:



不错，果然是非常易用。那么Stone把数据存到哪去了呢？答案是在app/datastore下。在这个目录下可以找到一个todo子目录，里边有刚创建的todo对象的数据文件1.yml，文件内容为：

--- [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://stone.rubyforge.org/" title="Stone: Dead-Simple Data Persistence">Stone</a>是一个数据持久化Ruby库。它把数据保持至文件中(ymal格式)，特点是快速易用，因而特别适用于小规模的应用。</p>

<p>要在Rails中使用Stone是非常简单的。我们来创建一个简单的Todo应用：</p>

<p>首先安装Stone:</p>

<pre><code>sudo gem install stone
</code></pre>

<p>创建Rails应用:</p>

<pre><code>rails todo
</code></pre>

<p>在 config/initializers 中新建一个文件，命名为 stone.rb，文件内容如下:</p>

<pre><code>require 'stone'
Stone.start(Dir.pwd, Dir.glob(File.join(Dir.pwd,"app/models/*")), :rails)
</code></pre>

<p>接下去，去掉 ActiveRecord 的使用。在 config/environment.rb 中加入:</p>

<pre><code>config.frameworks -= [ :active_record ]
</code></pre>

<p>准备工作完成了。现在使用Stone的stone-gen命令来生成一个model:</p>

<pre><code>stone-gen model Todo title:string
</code></pre>

<p>生成后，可以发现 app/models 目录下自动创建了一个 todo.rb 文件，其内容如下:</p>

<pre><code>class Todo
    include Stone::Resource

    field :title, String
end
</code></pre>

<p>好了，model有了，我们偷偷懒，用scaffold来创建一个controller(因为我们已经有了model，所以加上&#8211;skip-migration参数):</p>

<pre><code>script/generate scaffold Todo --skip-migration
</code></pre>

<p>自动生成的controller和view还跑不起来，因为Stone的model方法跟ActiveRecord有所区别，需要调整一下。我们先来改各个view:</p>

<p>在new.html.erb中的表单中，加入:</p>

<pre><code>&lt;p&gt;&lt;label&gt;Title:&lt;/label&gt;&lt;%= f.text_field :title %&gt;&lt;/p&gt;
</code></pre>

<p>在show.html.erb最上边，加入:</p>

<pre><code>&lt;%= h @todo.title %&gt;
</code></pre>

<p>其他view先不管了。接下去修改todos&#95;controller:</p>

<p>将index中的:</p>

<pre><code>@todos = Todo.find(all)
</code></pre>

<p>修改为:</p>

<pre><code>@todos = Todo.all()
</code></pre>

<p>将show中的:</p>

<pre><code>@todo = Todo.find(params[:id])
</code></pre>

<p>修改为:</p>

<pre><code>@todo = Todo[params[:id]]
</code></pre>

<p>好了，用script/server把应用跑起来，测试一下。访问http://localhost:3000/todos/new，创建一个新的todo:</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/04/stone-new.gif" alt="Stone new" /></p>

<p>创建成功后，访问http://localhost:3000/todos/1，显示也正确:</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/04/stone-show.gif" alt="Stone Show" /></p>

<p>不错，果然是非常易用。那么Stone把数据存到哪去了呢？答案是在app/datastore下。在这个目录下可以找到一个todo子目录，里边有刚创建的todo对象的数据文件1.yml，文件内容为：</p>

<pre><code>--- !ruby/object:Todo 
errors: !ruby/object:Validatable::Errors 
  errors: {}

id: 1
title: "tada #1"
</code></pre>

<p>结论：Stone很好很强大，待这个库发展更成熟一些后，可以在规模较小又不计划使用MySql或其他数据库的应用上使用。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/21/rails-with-stone/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Technorati停止对WordPress 2.5之前版本进行收录</title>
		<link>http://blog.ashchan.com/archive/2008/04/10/vulnerabe-wordpress-blogs-not-indexed-by-technorati/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/10/vulnerabe-wordpress-blogs-not-indexed-by-technorati/#comments</comments>
		<pubDate>Thu, 10 Apr 2008 13:50:57 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Tech General]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/10/vulnerabe-wordpress-blogs-not-indexed-by-technorati/</guid>
		<description><![CDATA[由于WordPress 2.5之前的版本存在安全隐患(被利用的话，在博客的页面上，会被偷偷地插进隐藏的垃圾链接)，Technorati将停止对存在隐患的老版本WordPress博客进行收录。

要知道整件事的来龙去脉，可以看这篇Technorati官方博客文章。
]]></description>
			<content:encoded><![CDATA[<p>由于<a href="http://www.wordpress.com">WordPress</a> 2.5之前的版本存在安全隐患(被利用的话，在博客的页面上，会被偷偷地插进隐藏的垃圾链接)，<a href="http://technorati.com">Technorati</a>将停止对存在隐患的老版本WordPress博客进行收录。</p>

<p>要知道整件事的来龙去脉，可以看这篇<a href="http://technorati.com/weblog/2008/04/424.html">Technorati官方博客文章</a>。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/10/vulnerabe-wordpress-blogs-not-indexed-by-technorati/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Firefox 3 Beta 5中的复活节彩蛋</title>
		<link>http://blog.ashchan.com/archive/2008/04/09/easter-egg-in-firefox-3-beta-5/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/09/easter-egg-in-firefox-3-beta-5/#comments</comments>
		<pubDate>Wed, 09 Apr 2008 00:00:59 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Tech General]]></category>

		<category><![CDATA[firefox]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/09/easter-egg-in-firefox-3-beta-5/</guid>
		<description><![CDATA[在Firefox 3 Beta 5的地址栏里输入&#8221;about:robots&#8221;，会出来一个可爱的机器人。



页面上描述了机器人的行为准则，当然这并不是机器人三定律(Three Laws of Robotic)，lol。

底下有个&#8221;Try Again&#8221;按钮，好奇地点了一下，按钮变成了&#8221;Please do not press this button again.&#8221;，更加好奇了，再点了一下，呜呼，这个按钮不见了。

BTW，说起机器人，动画片WALL·E相当值得期待啊。

Firefox 3 Beta 5 Easter Egg via Lifehacker
]]></description>
			<content:encoded><![CDATA[<p>在Firefox 3 Beta 5的地址栏里输入&#8221;about:robots&#8221;，会出来一个可爱的机器人。</p>

<p><img src="http://blog.ashchan.com/wp-content/uploads/2008/04/firefox-easter-egg.png" alt="Firefox Easter Egg" /></p>

<p>页面上描述了机器人的行为准则，当然这并不是机器人三定律(Three Laws of Robotic)，lol。</p>

<p>底下有个&#8221;Try Again&#8221;按钮，好奇地点了一下，按钮变成了&#8221;Please do not press this button again.&#8221;，更加好奇了，再点了一下，呜呼，这个按钮不见了。</p>

<p>BTW，说起机器人，动画片<a href="http://www.imdb.com/title/tt0910970/">WALL·E</a>相当值得期待啊。</p>

<p><a href="http://lifehacker.com/377515/firefox-3-beta-5-easter-egg">Firefox 3 Beta 5 Easter Egg</a> via <a href="http://lifehacker.com/">Lifehacker</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/09/easter-egg-in-firefox-3-beta-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>CSS 裸奔节</title>
		<link>http://blog.ashchan.com/archive/2008/04/05/css-naked-day/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/05/css-naked-day/#comments</comments>
		<pubDate>Sat, 05 Apr 2008 03:18:01 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Web Development]]></category>

		<category><![CDATA[css]]></category>

		<category><![CDATA[wordpress]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/05/css-naked-day/</guid>
		<description><![CDATA[第三届CSS裸奔节来了，今年（CSS Naked Day &#8216;08）的时间定在4月9日。

活动目的

CSS裸奔节的目的是推动Web标准。简洁为美。使用正确的(x)html，语义标记，良好的层次结构。暂时把页面设计抛弃，直接展示&#60;body&#62;吧。

如何参与

到这里填表报名，报名后一个小时内，你的网站会在官方列表中出现。

到了4月9日，将你网站上的CSS移除，抛掉页面设计。

你也可以在那天把以下HTML内容放置于网站顶部：

&#60;h3&#62;What happened to the design?&#60;/h3&#62;
&#60;p&#62;To know more about why styles are disabled on this website visit the
&#60;a href="http://naked.dustindiaz.com" title="Web Standards Naked Day Host Website"&#62;
Annual CSS Naked Day&#60;/a&#62; website for more information.&#60;/p&#62;


注：加上这些标注仅仅是为了向你网站的访问者说明情况，并不是为了带来流量或赚钱。CSS裸奔官方网站上没有任何广告，以后也不会放置广告。

活动日期

很多人非常关心CSS裸奔节的活动时间。今年定于4月9日，理由如下：


活动日期应该定于周二、周三或周四，这几天网站流量比较高
时间应该在4月份的第一周前后
不应该是4月1日（要不谁信呢，呵呵）
在活动通告发出至活动日期，至少有五天时间


如何裸奔

下面这个PHP函数可以用来裸奔：

&#60;?php
function is_naked_day($d) {
  $start = date('U', mktime(-12, 0, 0, 04, $d, date('Y')));
  $end = date('U', mktime(36, 0, 0, 04, $d, [...]]]></description>
			<content:encoded><![CDATA[<p>第三届<a href="http://naked.dustindiaz.com/" title="CSS Naked Day">CSS裸奔节</a>来了，今年（CSS Naked Day &#8216;08）的时间定在4月9日。</p>

<h2>活动目的</h2>

<p>CSS裸奔节的目的是推动Web标准。简洁为美。使用正确的(x)html，语义标记，良好的层次结构。暂时把页面设计抛弃，直接展示&lt;body&gt;吧。</p>

<h2>如何参与</h2>

<p>到<a href="http://naked.dustindiaz.com/#signup">这里填表报名</a>，报名后一个小时内，你的网站会在官方列表中出现。</p>

<p>到了4月9日，将你网站上的CSS移除，抛掉页面设计。</p>

<p>你也可以在那天把以下HTML内容放置于网站顶部：</p>

<pre><code>&lt;h3&gt;What happened to the design?&lt;/h3&gt;
&lt;p&gt;To know more about why styles are disabled on this website visit the
&lt;a href="http://naked.dustindiaz.com" title="Web Standards Naked Day Host Website"&gt;
Annual CSS Naked Day&lt;/a&gt; website for more information.&lt;/p&gt;
</code></pre>

<p>注：加上这些标注仅仅是为了向你网站的访问者说明情况，并不是为了带来流量或赚钱。CSS裸奔官方网站上没有任何广告，以后也不会放置广告。</p>

<h2>活动日期</h2>

<p>很多人非常关心CSS裸奔节的活动时间。今年定于4月9日，理由如下：</p>

<ul>
<li>活动日期应该定于周二、周三或周四，这几天网站流量比较高</li>
<li>时间应该在4月份的第一周前后</li>
<li>不应该是4月1日（要不谁信呢，呵呵）</li>
<li>在活动通告发出至活动日期，至少有五天时间</li>
</ul>

<h2>如何裸奔</h2>

<p>下面这个PHP函数可以用来裸奔：</p>

<pre><code>&lt;?php
function is_naked_day($d) {
  $start = date('U', mktime(-12, 0, 0, 04, $d, date('Y')));
  $end = date('U', mktime(36, 0, 0, 04, $d, date('Y')));
  $z = date('Z') * -1;
  $now = time() + $z; 
  if ( $now &gt;= $start &amp;&amp; $now &lt;= $end ) {
    return true;
  }
  return false;
}
?&gt;
</code></pre>

<p>可以这样使用该函数：</p>

<pre><code>&lt;head&gt;
...
&lt;?php
if ( is_naked_day(9) ) {
  echo '&lt;!-- naked day has no styles --&gt;';
} else {
  echo '&lt;link rel="stylesheet" type="text/css" href="styles.css" /&gt;';
}
?&gt;
...
&lt;/head&gt;
</code></pre>

<h2>工具、插件</h2>

<ul>
<li><a href="http://code.google.com/p/php-naked-day-api/">PHP Naked Day Timer Class</a> (作者<a href="http://www.jaaulde.com/">Jim Auldridge</a>)</li>
<li><a href="http://www.ajalapus.com/downloads/css-naked-day/">Wordpress Naked Day Plugin</a> (作者<a href="http://www.ajalapus.com/">Aja&#8217;s</a>)</li>
<li><a href="http://tore.darell.no/posts/ready_to_take_my_clothes_off">Rails Helper</a> (作者<a href="http://tore.darell.no/">Tore Darell</a>)</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/05/css-naked-day/feed/</wfw:commentRss>
		</item>
		<item>
		<title>you are dust, and to dust you shall return</title>
		<link>http://blog.ashchan.com/archive/2008/04/04/you-are-dust-and-to-dust-you-shall-return/</link>
		<comments>http://blog.ashchan.com/archive/2008/04/04/you-are-dust-and-to-dust-you-shall-return/#comments</comments>
		<pubDate>Fri, 04 Apr 2008 08:48:47 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/04/04/you-are-dust-and-to-dust-you-shall-return/</guid>
		<description><![CDATA[
  you are dust, and to dust you shall return.


My grandfather, a godly Christian, passed away peacefully and without pain last week at the age of 90. God rest his soul.
]]></description>
			<content:encoded><![CDATA[<blockquote>
  <p>you are dust, and to dust you shall return.</p>
</blockquote>

<p>My grandfather, a godly Christian, passed away peacefully and without pain last week at the age of 90. God rest his soul.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/04/04/you-are-dust-and-to-dust-you-shall-return/feed/</wfw:commentRss>
		</item>
		<item>
		<title>保护Rails应用的svn目录</title>
		<link>http://blog.ashchan.com/archive/2008/03/29/protect-rails-apps-svn-folder/</link>
		<comments>http://blog.ashchan.com/archive/2008/03/29/protect-rails-apps-svn-folder/#comments</comments>
		<pubDate>Sat, 29 Mar 2008 10:19:39 +0000</pubDate>
		<dc:creator>ashchan</dc:creator>
		
		<category><![CDATA[Ruby &amp; Rails]]></category>

		<category><![CDATA[nginx]]></category>

		<category><![CDATA[rails]]></category>

		<category><![CDATA[subversion]]></category>

		<category><![CDATA[svn]]></category>

		<guid isPermaLink="false">http://blog.ashchan.com/archive/2008/03/29/protect-rails-apps-svn-folder/</guid>
		<description><![CDATA[Rails开发者喜欢用Capistrano来自动化部署网站应用（什么，你不用？），即使不使用自动化部署，很多人也会使用svn co直接将代码取到网站应用目录。这给网站信息泄漏提供了方便。使用下面的地址，就能访问到这样的网站的svn信息：


http://somesite.com/.svn/entries
http://somesite.com/.svn/javascripts/entries


这可不大妙，因为这个文件里包含了你的svn库的地址、用户名和当前目录内容等很多信息。最好通过服务器配置来禁止对.svn目录的访问。在nginx下，可以在server配置下加入这一条：

location ~ /\.svn {
    deny    all;
}


另一种方式是在config/deploy.rb中加入以下设置，使用svn export来导出代码：

set :deploy_via, :export


不过很多时候为了手工维护站点的需要，我更倾向于用svn co(svn checkout)。
]]></description>
			<content:encoded><![CDATA[<p>Rails开发者喜欢用<a href="http://www.capify.org/">Capistrano</a>来自动化部署网站应用（什么，你不用？），即使不使用自动化部署，很多人也会使用svn co直接将代码取到网站应用目录。这给网站信息泄漏提供了方便。使用下面的地址，就能访问到这样的网站的svn信息：</p>

<ul>
<li>http://somesite.com/.svn/entries</li>
<li>http://somesite.com/.svn/javascripts/entries</li>
</ul>

<p>这可不大妙，因为这个文件里包含了你的svn库的地址、用户名和当前目录内容等很多信息。最好通过服务器配置来禁止对.svn目录的访问。在nginx下，可以在server配置下加入这一条：</p>

<pre><code>location ~ /\.svn {
    deny    all;
}
</code></pre>

<p>另一种方式是在config/deploy.rb中加入以下设置，使用svn export来导出代码：</p>

<pre><code>set :deploy_via, :export
</code></pre>

<p>不过很多时候为了手工维护站点的需要，我更倾向于用svn co(svn checkout)。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.ashchan.com/archive/2008/03/29/protect-rails-apps-svn-folder/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
