<?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"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>大貓共和國</title>
	<atom:link href="http://blog.miaout17.net/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.miaout17.net</link>
	<description></description>
	<lastBuildDate>Sat, 30 Apr 2011 02:19:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.2</generator>
		<item>
		<title>Blogtrans 1.0.1版更新</title>
		<link>http://blog.miaout17.net/2011/04/30/blogtrans-1-0-1%e7%89%88%e6%9b%b4%e6%96%b0/</link>
		<comments>http://blog.miaout17.net/2011/04/30/blogtrans-1-0-1%e7%89%88%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Sat, 30 Apr 2011 02:19:20 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Blogtrans]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=252</guid>
		<description><![CDATA[Blogtrans v1.0.1釋出，需要者請至SourceForge下載 * 修正了Blogger XML匯出時，PM變AM的問題 * 先拿掉了其實不能用的Blogger XML匯入功能 Blogtrans開發密辛： 2009/05/23: 來寫Blogger匯入功能好了，先寫個不能動的程式碼，之後再補完 一年多沒動Blogtrans後&#8230;&#8230;. 2011/03/05: 疑？有一年多前寫好的code還沒發佈耶，裡面有自動化測試、對無名的XML容錯、和Blogger匯入功能耶。來合併一下發佈好了… &#8230;&#8230;.. 使用者：這個MT檔有問題耶，我把他匯出Blogger格式再匯入就讀不進來了 &#8230;&#8230;.. 對不起，有問題的大概不是MT檔，是Blogger匯入的功能和作者的腦袋&#8230;..Orz]]></description>
			<content:encoded><![CDATA[<p>Blogtrans v1.0.1釋出，需要者請至<a href="http://sourceforge.net/projects/blogtrans/files/">SourceForge</a>下載</p>
<p>* 修正了Blogger XML匯出時，PM變AM的問題<br />
* 先拿掉了其實不能用的Blogger XML匯入功能</p>
<hr/>
<p>Blogtrans開發密辛：</p>
<p>2009/05/23: 來寫Blogger匯入功能好了，先寫個不能動的程式碼，之後再補完</p>
<p>一年多沒動Blogtrans後&#8230;&#8230;.</p>
<p>2011/03/05: 疑？有一年多前寫好的code還沒發佈耶，裡面有自動化測試、對無名的XML容錯、和<strong>Blogger匯入功能</strong>耶。來合併一下發佈好了…</p>
<p>&#8230;&#8230;..</p>
<p>使用者：這個MT檔有問題耶，我把他匯出Blogger格式再匯入就讀不進來了</p>
<p>&#8230;&#8230;..</p>
<p>對不起，有問題的大概不是MT檔，是Blogger匯入的功能和作者的腦袋&#8230;..Orz</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/04/30/blogtrans-1-0-1%e7%89%88%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Psychedelic: Awesome Syntax Colorizer in Ruby</title>
		<link>http://blog.miaout17.net/2011/03/31/psychedelic-awesome-syntax-colorizer-in-ruby/</link>
		<comments>http://blog.miaout17.net/2011/03/31/psychedelic-awesome-syntax-colorizer-in-ruby/#comments</comments>
		<pubDate>Thu, 31 Mar 2011 16:47:22 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=248</guid>
		<description><![CDATA[忙錄之中弄了這個惡搞，沒空寫blog介紹了，請自己看首頁吧（逃） http://miaout17.github.com/psychedelic/]]></description>
			<content:encoded><![CDATA[<p>忙錄之中弄了這個惡搞，沒空寫blog介紹了，請自己看首頁吧（逃）</p>
<p><a href="http://miaout17.github.com/psychedelic/">http://miaout17.github.com/psychedelic/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/03/31/psychedelic-awesome-syntax-colorizer-in-ruby/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Blogtrans 1.0.0版更新</title>
		<link>http://blog.miaout17.net/2011/03/07/blogtrans-1-0-0%e7%89%88%e6%9b%b4%e6%96%b0/</link>
		<comments>http://blog.miaout17.net/2011/03/07/blogtrans-1-0-0%e7%89%88%e6%9b%b4%e6%96%b0/#comments</comments>
		<pubDate>Mon, 07 Mar 2011 15:10:42 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Blogtrans]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=244</guid>
		<description><![CDATA[這幾天收到幾位網友來信，表示Blogtrans無法匯入無名備份檔的留言。此時李組長眉頭一皺，認為案情非常單純：無名修改了備份檔的規格。 Blogtrans這次的更新如下： 針對無名備份檔格式變化，做了對應修正 不再以日期當版本號，以後將用1.0.0這種格式的版本號 請至sourceforge下載Blogtrans 1.0.0版。 碎碎唸：看著自己三年前用不熟的python寫的程式，真是有砍掉重練的衝動…不過這是經過許多測試的code，能動就繼續用吧…]]></description>
			<content:encoded><![CDATA[<p>這幾天收到幾位網友來信，表示Blogtrans無法匯入無名備份檔的留言。此時李組長眉頭一皺，認為案情非常單純：無名修改了備份檔的規格。</p>
<p>Blogtrans這次的更新如下：</p>
<ul>
<li>針對無名備份檔格式變化，做了對應修正</li>
<li>不再以日期當版本號，以後將用1.0.0這種格式的版本號</li>
</ul>
<p>請<a href="https://sourceforge.net/projects/blogtrans/files/">至sourceforge下載</a>Blogtrans 1.0.0版。</p>
<hr/>
<p>碎碎唸：看著自己三年前用不熟的python寫的程式，真是有砍掉重練的衝動…不過這是經過許多測試的code，能動就繼續用吧…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/03/07/blogtrans-1-0-0%e7%89%88%e6%9b%b4%e6%96%b0/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Lightning Talk: RichRC &amp; Hirb-Unicode</title>
		<link>http://blog.miaout17.net/2011/03/02/lightning-talk-richrc-hirb-unicode/</link>
		<comments>http://blog.miaout17.net/2011/03/02/lightning-talk-richrc-hirb-unicode/#comments</comments>
		<pubDate>Wed, 02 Mar 2011 01:23:02 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[hirb]]></category>
		<category><![CDATA[hirb-unicode]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RichRC]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Tuesday]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=236</guid>
		<description><![CDATA[昨天參加Ruby Tuesday時，中場休息時間得知有個Lightning Talk的機會，於是在台下匆匆忙忙的準備投影片。很高興可以跟大家分享我做的小東西，緊張之下講話有些結巴，還請見諒。 我的投影片已上傳至SlideShare: 早上更新了一下RichRC的預設設定，如果有安裝hirb-unicode的話就會自動載入。現在只要執行 1 gem install richrc wirble hirb hirb-unicode 把需要的gems安裝好，再到rails app目錄下執行 1 richrc 就可以使用具有語法高亮、自動完成、顯示資料表格（並修正Unicode排版問題）的rails console了。 我試著將這些小工具做成使用簡單的懶人包，希望能讓大家（尤其是新手）開發Rails時能夠更順手。 關於細節及進階的客製化可參看： RichRC: 部落格文章、Github源碼 hirb-unicode: 部落格文章、Github源碼 P.S.進階的使用者可以考慮irb的另一個選擇：ripl。ripl內建的功能比irb少，但源碼只有270行左右，其精簡的架構保留了非常高的擴充彈性，目前也已經有語法高亮、多行輸入、rails整合等二十多個插件可以使用。可以參看Godfat的文章：ripl-rc (1) (ripl, an irb replacement)]]></description>
			<content:encoded><![CDATA[<p>昨天參加Ruby Tuesday時，中場休息時間得知有個Lightning Talk的機會，於是在台下匆匆忙忙的準備投影片。很高興可以跟大家分享我做的小東西，緊張之下講話有些結巴，還請見諒。</p>
<p>我的投影片已上傳至SlideShare: </p>
<div style="width:425px" id="__ss_7109049"><object id="__sse7109049" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lightningtalkrichrchirbunicode-110301185138-phpapp02&#038;stripped_title=lightning-talk-richrchirbunicode&#038;userName=miaout17" /><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed name="__sse7109049" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=lightningtalkrichrchirbunicode-110301185138-phpapp02&#038;stripped_title=lightning-talk-richrchirbunicode&#038;userName=miaout17" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object> </div>
<p>早上更新了一下RichRC的預設設定，如果有安裝hirb-unicode的話就會自動載入。現在只要執行</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">gem <span style="color: #c20cb9; font-weight: bold;">install</span> richrc wirble hirb hirb-unicode</pre></td></tr></table></div>

<p>把需要的gems安裝好，再到rails app目錄下執行</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">richrc</pre></td></tr></table></div>

<p>就可以使用具有語法高亮、自動完成、顯示資料表格（並修正Unicode排版問題）的rails console了。</p>
<hr/>
<p>我試著將這些小工具做成使用簡單的懶人包，希望能讓大家（尤其是新手）開發Rails時能夠更順手。</p>
<p>關於細節及進階的客製化可參看：</p>
<ul>
<li>RichRC: <a href="http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/">部落格文章</a>、<a href="https://github.com/miaout17/richrc">Github源碼</a></li>
<li>hirb-unicode: <a href="http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/">部落格文章</a>、<a href="https://github.com/miaout17/hirb-unicode">Github源碼</a></li>
</ul>
<p>P.S.進階的使用者可以考慮irb的另一個選擇：<a href="https://github.com/cldwalker/ripl<br />
https://github.com/cldwalker/ripl">ripl</a>。ripl內建的功能比irb少，但源碼只有270行左右，其精簡的架構保留了非常高的擴充彈性，目前也已經有<a href="https://github.com/janlelis/ripl-color_result">語法高亮</a>、<a href="https://github.com/janlelis/ripl-multi_line">多行輸入</a>、<a href="https://github.com/cldwalker/ripl-rails">rails整合</a>等二十多個插件可以使用。可以參看Godfat的文章：<a href="http://blogger.godfat.org/2011/02/ripl-rc-1-ripl-irb-replacement.html">ripl-rc (1) (ripl, an irb replacement)</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/03/02/lightning-talk-richrc-hirb-unicode/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>hirb-unicode: 解決hirb中全形文字排列的問題</title>
		<link>http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/</link>
		<comments>http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/#comments</comments>
		<pubDate>Tue, 22 Feb 2011 14:31:14 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[hirb]]></category>
		<category><![CDATA[hirb-unicode]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=218</guid>
		<description><![CDATA[hirb是可以改變irb資料輸出方式改變的gem，其最常應用的場合就是將rails中ActiveModel的資料轉為表格。但中文網站的開發者，應該常常會碰到表格排列歪掉的問題。 使用hirb前： （真是幾乎無法閱讀） 使用hirb後： 好多了，但是表格歪掉看起來還是很討厭。 其實表格歪掉是由於hirb無法正確計算全型字元的寬度。於是我就包了hirb-unicode這個plugin，以解決這個問題。使用hirb-unicode後： 安裝hirb-unicode 在shell下執行： 1 $ gem i hirb-unicode 使用hirb-unicode 如果是在irb中使用 1 2 gem 'hirb-unicode' require 'hirb-unicode' 即可自動載入hirb及hirb-unicode，並自動修正unicode排列的問題。 若在bundler的環境下使用（如Rails 3），請在Gemfile中加入 1 gem 'hirb-unicode' 以便載入gem。（或者用RichRC載入也可以喔） 然後在可以在.irbrc中或直接在irb進行require的動作： 1 require 'hirb-unicode' Misc 其實hirb-unicode的源碼不到30行，利用unicode-display_width gem計算長度，再包裝一下切字串的method，其實一下就做完了。原本是想簡單的上個patch到hirb，但作者希望不要增加hirb的dependency，想要將這個功能包成另外的plugin，於是花了很多天往返討論。 Anyway，終於把這個功能包出去了。Happy coding!!]]></description>
			<content:encoded><![CDATA[<p><a href="https://github.com/cldwalker/hirb">hirb</a>是可以改變irb資料輸出方式改變的gem，其最常應用的場合就是將rails中ActiveModel的資料轉為表格。但中文網站的開發者，應該常常會碰到表格排列歪掉的問題。</p>
<p>使用hirb前：<br />
<a href="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb使用前.png"><img src="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb使用前.png" alt="" title="hirb使用前" width="644" height="155" class="alignnone size-full wp-image-222" /></a><br />
（真是幾乎無法閱讀）</p>
<p>使用hirb後：<br />
<a href="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb使用後.png"><img src="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb使用後.png" alt="" title="hirb使用後" width="636" height="172" class="alignnone size-full wp-image-223" /></a><br />
好多了，但是表格歪掉看起來還是很討厭。</p>
<p>其實表格歪掉是由於hirb無法正確計算全型字元的寬度。於是我就包了<a href="https://github.com/gaagaaga/hirb-unicode">hirb-unicode</a>這個plugin，以解決這個問題。使用hirb-unicode後：<br />
<a href="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb-unicode.png"><img src="http://blog.miaout17.net/wp-content/uploads/2011/02/hirb-unicode.png" alt="" title="hirb-unicode" width="627" height="172" class="alignnone size-full wp-image-226" /></a></p>
<h2>安裝hirb-unicode</h2>
<p>在shell下執行：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ gem i hirb-unicode</pre></td></tr></table></div>

<h2>使用hirb-unicode</h2>
<p>如果是在irb中使用</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'hirb-unicode'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hirb-unicode'</span></pre></td></tr></table></div>

<p>即可自動載入hirb及hirb-unicode，並自動修正unicode排列的問題。</p>
<p>若在bundler的環境下使用（如Rails 3），請在Gemfile中加入</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">gem <span style="color:#996600;">'hirb-unicode'</span></pre></td></tr></table></div>

<p>以便載入gem。（或者用RichRC載入也可以喔）</p>
<p>然後在可以在.irbrc中或直接在irb進行require的動作：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hirb-unicode'</span></pre></td></tr></table></div>

<h2>Misc</h2>
<p>其實hirb-unicode的源碼不到30行，利用<a href="https://github.com/janlelis/unicode-display_width">unicode-display_width</a> gem計算長度，再包裝一下切字串的method，其實一下就做完了。原本是想簡單的上個patch到hirb，但作者希望不要增加hirb的dependency，想要將這個功能包成另外的plugin，於是花了很多天往返討論。</p>
<p>Anyway，終於把這個功能包出去了。Happy coding!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/02/22/hirb-unicode-fix-hirb-unicode-width-problem/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RichRC: 在Rails3 console中輕鬆使用hirb及wirble的懶人包</title>
		<link>http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/</link>
		<comments>http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/#comments</comments>
		<pubDate>Sun, 13 Feb 2011 18:05:59 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RichRC]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/?p=184</guid>
		<description><![CDATA[開發rails應用時，或多或少會需要在console下進行一些操作。但內建的console其實功能有限，於是就有人寫了一些gems來擴充的irb功能。如hirb可以將資料表格化，而wirble提供了著色、自動完成等功能。 在rails 2中，要使用這些gems提供的擴充功能，只要簡單地在irb下載入gems就可以了。但rails 3使用了bundler管理gems，必需在Gemfile中先加入要使用的gems才可以使用。但修改Gemfile會造成一些問題：這些gems的設定該commit回版本控制系統嗎？我認為不應該，每位開發者可能有自己的偏好設定。另外，使用者可能是clone其他開發源碼的專案，而無法commit東西回去。然而，當有其他人修改Gemfile時，可能會造成conflict需要處理。 對於這個問題，感謝xdite的文章「在 Rails3 上使用漂亮的 console」，指出了可以在bundler.setup執行前搶先載入額外的gems，避過修改Gemfile的問題。文中的做法每要在一個rails app中執行console時，需要修改development.rb, boot.rb, console/rails其中兩個檔案，還是要費些工夫。對於常常clone project下來survey的人來說，這點可能尤其麻煩。 有沒有可能避過這些修改檔案的問題呢？「懶惰的工程師需要勤奮的發明工具」，為了懶得每次修改檔案，我動手寫了一個客製化Rails 3 console的工具：RichRC。 安裝 在shell下輸入： 1 $ gem install richrc hirb wirble P.S. 雖然RichRC預設載入hirb及wirble，但RichRC其實不相依於hirb及wirble這兩個gems。請參看「客製化」一節。 執行 1 2 $ cd railsapp $ richrc 就這樣，不用修改任何檔案，只要將rails console的指令改為richrc即可。richrc預設會執行下列動作： 載入並啟動wirble 載入並啟動hirb 設定ActiveRecord的log顯示於console中 不用修改任何檔案，三個願望一次滿足。 客製化 雖然本文的標題為「RichRC: 在Rails3中輕鬆使用hirb及wirble的懶人包」，但RichRC其實可以任意客製化Rails 3 console載入時額外運行的程式。 RichRC的原理，其實是在「bundler.setup執行前」及「application載入後」執行特定的程式碼。RichRC會讀取一個設定檔，再依設定檔中的邏輯執行初始化的動作。RichRC啟動時，會試圖依下列順序載入設定檔： 當前目錄下的.richrc 使用者家目錄下的.richrc gem中的預設設定 目前gem中的預設設定就如上一節所述：載入hirb及wirble，並設定ActiveRecord的logger。要執行客製化，可以在在console下執行： 1 $ richrc customize 即可將預設的設定檔複置到./.richrc。接下來就可以修改並加入您想要的gems及設定，前文中有提到，RichRC並不相依於hirb及wirble，如果你不想要這些gems的話，可以將它們拿掉。以下是預設的.richrc： [...]]]></description>
			<content:encoded><![CDATA[<p>開發rails應用時，或多或少會需要在console下進行一些操作。但內建的console其實功能有限，於是就有人寫了一些gems來擴充的irb功能。如<a href="https://github.com/cldwalker/hirb">hirb</a>可以將資料表格化，而<a href="http://pablotron.org/software/wirble/">wirble</a>提供了著色、自動完成等功能。</p>
<p><a href="http://blog.miaout17.net/wp-content/uploads/2011/02/Screenshot-31.png"><img src="http://blog.miaout17.net/wp-content/uploads/2011/02/Screenshot-31.png" alt="" title="Screenshot-3" width="578" height="207" class="alignnone size-full wp-image-191" /></a></p>
<p>在rails 2中，要使用這些gems提供的擴充功能，只要簡單地在irb下載入gems就可以了。但rails 3使用了<a href="http://gembundler.com/">bundler</a>管理gems，必需在Gemfile中先加入要使用的gems才可以使用。但修改Gemfile會造成一些問題：這些gems的設定該commit回版本控制系統嗎？我認為不應該，每位開發者可能有自己的偏好設定。另外，使用者可能是clone其他開發源碼的專案，而無法commit東西回去。然而，當有其他人修改Gemfile時，可能會造成conflict需要處理。</p>
<p>對於這個問題，感謝<a href="http://blog.xdite.net/?p=1839">xdite的文章「在 Rails3 上使用漂亮的 console」</a>，指出了可以在bundler.setup執行前搶先載入額外的gems，避過修改Gemfile的問題。文中的做法每要在一個rails app中執行console時，需要修改development.rb, boot.rb, console/rails其中兩個檔案，還是要費些工夫。對於常常clone project下來survey的人來說，這點可能尤其麻煩。</p>
<p>有沒有可能避過這些修改檔案的問題呢？「懶惰的工程師需要勤奮的發明工具」，為了懶得每次修改檔案，我動手寫了一個客製化Rails 3 console的工具：<a href="https://github.com/miaout17/richrc">RichRC</a>。</p>
<h3>安裝</h3>
<p>在shell下輸入：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ gem <span style="color: #c20cb9; font-weight: bold;">install</span> richrc hirb wirble</pre></td></tr></table></div>

<p>P.S. 雖然RichRC預設載入hirb及wirble，但RichRC其實不相依於hirb及wirble這兩個gems。請參看「客製化」一節。</p>
<h3>執行</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ <span style="color: #7a0874; font-weight: bold;">cd</span> railsapp
$ richrc</pre></td></tr></table></div>

<p>就這樣，不用修改任何檔案，只要將rails console的指令改為richrc即可。richrc預設會執行下列動作：</p>
<ul>
<li>載入並啟動wirble</li>
<li>載入並啟動hirb</li>
<li>設定ActiveRecord的log顯示於console中</li>
</ul>
<p>不用修改任何檔案，三個願望一次滿足。</p>
<h3>客製化</h3>
<p>雖然本文的標題為「RichRC: 在Rails3中輕鬆使用hirb及wirble的懶人包」，但RichRC其實可以任意客製化Rails 3 console載入時額外運行的程式。</p>
<p>RichRC的原理，其實是在「bundler.setup執行前」及「application載入後」執行特定的程式碼。RichRC會讀取一個設定檔，再依設定檔中的邏輯執行初始化的動作。RichRC啟動時，會試圖依下列順序載入設定檔：</p>
<ol>
<li>當前目錄下的.richrc</li>
<li>使用者家目錄下的.richrc</li>
<li>gem中的預設設定</li>
</ol>
<p>目前gem中的預設設定就如上一節所述：載入hirb及wirble，並設定ActiveRecord的logger。要執行客製化，可以在在console下執行：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ richrc customize</pre></td></tr></table></div>

<p>即可將預設的設定檔複置到./.richrc。接下來就可以修改並加入您想要的gems及設定，前文中有提到，RichRC並不相依於hirb及wirble，如果你不想要這些gems的話，可以將它們拿掉。以下是預設的.richrc：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">before<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:setup_bundler</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#008000; font-style:italic;"># You can load extra gems here.</span>
  <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'irb'</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    gem <span style="color:#996600;">'wirble'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'wirble'</span>
    Wirble.<span style="color:#9900CC;">init</span>
    Wirble.<span style="color:#9900CC;">colorize</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">LoadError</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Failed to load wirble&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">begin</span>
    gem <span style="color:#996600;">'hirb'</span>
    <span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'hirb'</span>
    Hirb.<span style="color:#9900CC;">enable</span>
  <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#CC00FF; font-weight:bold;">LoadError</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Failed to load hirb&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
after<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:load_application</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">logger</span> = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>STDOUT<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>注意：只有在before(:setup_bundler)中，才可以載入額外的gems。另外，在after(:load_application)後，rails的環境才被載入完成，才可以去設定ActiveRecord的logger（您亦可在此對rails其他元件做設定）。</p>
<h3>備註</h3>
<p>注意：在.richrc引入與Gemfile中的gems（及他們所相依的gems）衝突的話，可能會造成問題。</p>
<p>RichRC以MIT License開放源碼，<a href="https://github.com/miaout17/richrc">源碼位於github</a>，有問題歡迎回報。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/02/13/richrc-rails3-customization-hirb-wirble/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ruby Tuesday #16: Learning Ruby with RubyWarrior</title>
		<link>http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior/</link>
		<comments>http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior/#comments</comments>
		<pubDate>Wed, 26 Jan 2011 01:54:00 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Tuesday]]></category>
		<category><![CDATA[RubyWarrior]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior/</guid>
		<description><![CDATA[我在Ruby Tuesday #16分享的投影片已經上線。 所有相關的範例源碼都放在github上：https://github.com/gaagaaga/warrior-tuesday 祝武運昌隆 XD]]></description>
			<content:encoded><![CDATA[<p>我在<a href="http://registrano.com/events/ruby-tuesday-16">Ruby Tuesday #16</a>分享的投影片已經上線。</p>
<div style="width:425px" id="__ss_6705121"><object id="__sse6705121" width="425" height="355"><param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=warrior-tuesday-110125194927-phpapp02&amp;stripped_title=learning-ruby-with-rubywarrior&amp;userName=miaout17"><param name="allowFullScreen" value="true"><param name="allowScriptAccess" value="always"><embed name="__sse6705121" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=warrior-tuesday-110125194927-phpapp02&amp;stripped_title=learning-ruby-with-rubywarrior&amp;userName=miaout17" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object></div>
<p><script src="http://b.scorecardresearch.com/beacon.js?c1=7&amp;c2=7400849&amp;c3=1&amp;c4=&amp;c5=&amp;c6="></script></p>
<p>所有相關的範例源碼都放在github上：<a href="https://github.com/gaagaaga/warrior-tuesday">https://github.com/gaagaaga/warrior-tuesday</a></p>
<p>祝武運昌隆 XD</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2011/01/26/ruby-tuesday-16-learning-ruby-with-rubywarrior/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>AlgoCat 開發筆記 (Rails3+MongoDB)</title>
		<link>http://blog.miaout17.net/2010/10/26/algocat-%e9%96%8b%e7%99%bc%e7%ad%86%e8%a8%98-rails3mongodb/</link>
		<comments>http://blog.miaout17.net/2010/10/26/algocat-%e9%96%8b%e7%99%bc%e7%ad%86%e8%a8%98-rails3mongodb/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 11:13:00 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[AlgoCat]]></category>
		<category><![CDATA[flot]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/2010/10/26/algocat-%e9%96%8b%e7%99%bc%e7%ad%86%e8%a8%98-rails3mongodb/</guid>
		<description><![CDATA[大概從三、四個月前起，為了加強自己coding的基本功，我開始參加TopCoder及Codeforces的線上算法解題競賽。到目前為止，成績其實不太理想。在這些比賽的過程中，最能督促自己努力上進的事，莫過於被其他人慘電吧（Ex. 白俄羅斯高中生tourist名列TopCoder Algorithm Rating前五名）TopCoder官網雖然可以簡單的查詢一個人的成績，但無法追踨其他人的競賽狀況，並做出比較。 因為最近在練Rails3 + MongoDB，於是選了這個當作自己練習的題目，專案名稱暫定為&#8221;AlgoCat&#8221;，也就是「演算貓」(Algorithm Cat)。這個名字是想告訴自己「在演算法的世界中，一隻大貓努力向上爬」。AlgoCat的目標為「追踨算法競賽的活動及競賽成績，並標記算法競賽及題庫中，解過及待學習的題目」。 AlgoCat還相當的不完整，可以說還在Pre-Alpha的階段吧。目前AlgoCat提供的功能僅有：查詢TopCoder Algorithm Rating的排行、觀看TopCoder使用者的成績記錄、追踨某些特定的TopCoder使用者並進行比較（以折線圖方式呈現）。 這篇文章其實不是打算announce這個網站，而是將自己的開發筆記整理一下。目前的成果可以在algocat.heroku.com看到。 Environment &#38; Framework Rails 3 MongoDB Mongoid Devise 目前是Deploy在Heroku+MongoHQ上，不排除移到其他地方。這些環境的設定可以參考上一篇。 Fetching Data from TopCoder TopCoder本身提供了XML Feed的介面，用Ruby抓取資料只要簡單地用Net::HTTP和和REXML即可。 由於AlgoCat並不是一開始就抓好TopCoder的所有資料。有些資料是等使用者查詢才向TopCoder抓，並存放在資料庫。這方面的行為應該用Delayed Job之類的方法放在背景處理。AlgoCat在開發初期就有想到這點，但因為早期開發實作方便，還是暫時在前景處理。之後會移到background task去。BTW, Heroku第一隻worker就要收錢&#8230;.之後可能會想些替代方案。 Mongoid 基本上照著官網的教學，應該可以做到大部份的功能。但要用NoSQL的資料庫，只學Object Mapper而不了解資料庫本身，應該會造成最佳化的困難。討論一些我踩到的問題好了： @users = User.asc&#40;:rating&#41;.limit&#40;10&#41; 現在，呼叫多次@users.each，其實會造成多次的query。解決方法官網有寫，只要呼叫cache，或是直接@user=@user.to_a亦可 上面這個算是小問題，只是要熟析Mongoid的細節。但另一個問題是Mongoid缺乏了對MongoDB的一些簡單低階操作。舉例來說，如果db中有一個articles的collection，而每篇文章中有一個以tags為key的array，array中存放了tag的字串。依MongoDB的官方教學，要增加一個tag的query可以這樣下： db.articles.update&#40; &#123; title: &#34;Rails3&#34; &#125;, &#123; $addToSet : &#123; tags: &#34;Web&#34; &#125; &#125; &#41;; 或者這樣亦可 db.articles.update&#40; [...]]]></description>
			<content:encoded><![CDATA[<p>大概從三、四個月前起，為了加強自己coding的基本功，我開始參加<a href="http://www.topcoder.com/tc">TopCoder</a>及<a href="http://www.codeforces.com/">Codeforces</a>的線上算法解題競賽。到目前為止，成績其實不太理想。在這些比賽的過程中，最能督促自己努力上進的事，莫過於被其他人慘電吧（Ex. 白俄羅斯高中生<a href="http://www.topcoder.com/tc?module=MemberProfile&amp;cr=22263204">tourist</a>名列TopCoder Algorithm Rating前五名）TopCoder官網雖然可以簡單的查詢一個人的成績，但無法追踨其他人的競賽狀況，並做出比較。</p>
<p>因為最近在練Rails3 + MongoDB，於是選了這個當作自己練習的題目，專案名稱暫定為&#8221;AlgoCat&#8221;，也就是「演算貓」(Algorithm Cat)。這個名字是想告訴自己「在演算法的世界中，一隻大貓努力向上爬」。AlgoCat的目標為「追踨算法競賽的活動及競賽成績，並標記算法競賽及題庫中，解過及待學習的題目」。</p>
<p>AlgoCat還相當的不完整，可以說還在Pre-Alpha的階段吧。目前AlgoCat提供的功能僅有：查詢TopCoder Algorithm Rating的排行、觀看TopCoder使用者的成績記錄、追踨某些特定的TopCoder使用者並進行比較（以折線圖方式呈現）。</p>
<p>這篇文章其實不是打算announce這個網站，而是將自己的開發筆記整理一下。目前的成果可以在<a href="http://algocat.heroku.com">algocat.heroku.com</a>看到。</p>
<p><b>Environment &amp; Framework </b>
<ul>
<li>Rails 3</li>
<li>MongoDB</li>
<li>Mongoid</li>
<li>Devise</li>
</ul>
<p>目前是Deploy在Heroku+MongoHQ上，不排除移到其他地方。這些環境的設定可以參考<a href="http://gaagaaga.blogspot.com/2010/10/rails3-mongoid-devise-heroku-mongohq.html">上一篇</a>。</p>
<p><b>Fetching Data from TopCoder</b></p>
<p>TopCoder本身提供了XML Feed的<a href="http://www.topcoder.com/wiki/display/tc/Algorithm+Data+Feeds">介面</a>，用Ruby抓取資料只要簡單地用Net::HTTP和和REXML即可。</p>
<p>由於AlgoCat並不是一開始就抓好TopCoder的所有資料。有些資料是等使用者查詢才向TopCoder抓，並存放在資料庫。這方面的行為應該用<a href="http://github.com/tobi/delayed_job">Delayed Job</a>之類的方法放在背景處理。AlgoCat在開發初期就有想到這點，但因為早期開發實作方便，還是暫時在前景處理。之後會移到background task去。BTW, Heroku第一隻worker就要收錢&#8230;.之後可能會想些替代方案。</p>
<p><b>Mongoid</b></p>
<p>基本上照著<a href="http://mongoid.org/docs/installation/">官網的教學</a>，應該可以做到大部份的功能。但要用NoSQL的資料庫，只學Object Mapper而不了解資料庫本身，應該會造成最佳化的困難。討論一些我踩到的問題好了：</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#0066ff; font-weight:bold;">@users</span> = User.<span style="color:#9900CC;">asc</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:rating</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">limit</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>現在，呼叫多次@users.each，其實會造成多次的query。解決方法<a href="http://mongoid.org/docs/extras/">官網有寫</a>，只要呼叫cache，或是直接@user=@user.to_a亦可</p>
<p>上面這個算是小問題，只是要熟析Mongoid的細節。但另一個問題是Mongoid缺乏了對MongoDB的一些簡單低階操作。舉例來說，如果db中有一個articles的collection，而每篇文章中有一個以tags為key的array，array中存放了tag的字串。依MongoDB的官方教學，要增加一個tag的query可以這樣下：</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">db.<span style="color:#9900CC;">articles</span>.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> title: <span style="color:#996600;">&quot;Rails3&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#ff6633; font-weight:bold;">$addToSet</span> : <span style="color:#006600; font-weight:bold;">&#123;</span> tags: <span style="color:#996600;">&quot;Web&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;</pre></div></div>

<p>或者這樣亦可</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">db.<span style="color:#9900CC;">articles</span>.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>title: <span style="color:#996600;">&quot;Rails3&quot;</span>, tags: <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;$ne&quot;</span>: <span style="color:#996600;">&quot;Web&quot;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#125;</span>, <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#996600;">&quot;$push&quot;</span>: <span style="color:#006600; font-weight:bold;">&#123;</span> tags : <span style="color:#996600;">&quot;Web&quot;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#125;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>;</pre></div></div>

<p>這兩者者可以確保「在文章原本沒有該tag的情況下，將tag插入」</p>
<p>但Mongoid的封裝似乎只支援這樣的動作：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">article = Article.<span style="color:#9900CC;">where</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#ff3333; font-weight:bold;">:title</span><span style="color:#006600; font-weight:bold;">=&gt;</span><span style="color:#996600;">&quot;Rails3&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">first</span>
<span style="color:#9966CC; font-weight:bold;">unless</span> article.<span style="color:#9900CC;">tags</span>.<span style="color:#9900CC;">elem</span>? <span style="color:#9966CC; font-weight:bold;">then</span>
  article.<span style="color:#9900CC;">tags</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot;Devise&quot;</span>
  article.<span style="color:#9900CC;">save</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>原本是DB上的一個query，變成一定要將資料拉回app server判斷，再將「所有tags」寫回去，效能應有不小的差距。</p>
<p><b>Rails jquery-ujs</b></p>
<p>Rails內建了一些與JavaScript&amp;AJAX相關的helpers，並以rails.js與prototyle javascript library橋接。如果想用jQuery，又想保留rails的helpers功能的話，可以用<a href="http://github.com/rails/jquery-ujs">jquery-ujs</a>中的rails.js將原本的蓋掉，就可以將原本prototype相關的javascript刪掉，換上jquery。</p>
<p>AlgoCat目前的「追踨使用者」(Watch)功能是用AJAX + jQuery做的。</p>
<p><b>Chart Library</b><br />
要在網頁中繪製圖表，目前應該有三大主流：<br />
1.在Server端繪製圖表，再傳送圖片到Client端<br />
2.萬惡Flash (?)<br />
3.以JavaScript為基礎，操作HTML Canvas之類的方式繪作圖表</p>
<p>其中第一點是傳統的方法，從以前的GnuPlot，到現在可以把資料丟到雲裡給Google畫圖(<a href="http://code.google.com/intl/zh-TW/apis/charttools/index.html">Google Chart API</a>)，但其缺點是比較不容易做圖表的互動操作。我個人不喜歡使用Flash作圖表，覺得多了一層整合上的麻煩，而且有點拖慢網頁的速度，但Flash應是最容易實作圖表互動操作的方式。而隨著瀏覽器對Canvas的支援趨近完整，JavaScript Engine運行的速度越來越快，用JavaScript在Client繪製圖表也成了選擇之一。而且靠JavaScript及DOM，同樣也可以進行與圖表的互動操作。</p>
<p>在開發AlgoCat時，一開始我選擇嘗試googlecharts gem，結果發現目前的版本還滿雷的。首先，我遇到了Linc Chart中，y軸座標值完全不對的問題。後來我發現其實<a href="http://github.com/mattetti/googlecharts/issues#issue/15">這個Issue</a>是同一個問題。試了一下後，決定git clone一份googlecharts下來，git bisect找bug。後來是把這個問題修掉了，但似乎還有其他小問題存在。之後有空應該會整理一下，發patch或pull request吧…</p>
<p>後來考慮到可能要在圖表上做互動，所以還是換回JavaScript-based的<a href="http://code.google.com/p/flot/">flot</a>。Flot是一套以jQuery為基礎的JavaScript Plotting Library。</p>
<p>BTW，因為flot相依於jQuery，所以rails內建的Prototype一定要移掉，不然會相衝。我使用了前段提到的jquery-ujs。</p>
<p><span style="font-weight:bold;">Ongoing work</span><br />
目前最大的問題，應該就是Fetch XML DATA應該要放在背景做吧。然後會補強自動更新的機制、加上Codeforces或Uva題庫功能等…</p>
<p><span style="font-weight:bold;">Source Code?</span><br />
目前還沒有打算open source，而且可能還會大規模的重構，等我整理好code後有可能會open。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2010/10/26/algocat-%e9%96%8b%e7%99%bc%e7%ad%86%e8%a8%98-rails3mongodb/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails3, Mongoid, Devise, Heroku, MongoHQ筆記</title>
		<link>http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq%e7%ad%86%e8%a8%98/</link>
		<comments>http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq%e7%ad%86%e8%a8%98/#comments</comments>
		<pubDate>Tue, 26 Oct 2010 10:45:00 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Devise]]></category>
		<category><![CDATA[Heroku]]></category>
		<category><![CDATA[MongoDB]]></category>
		<category><![CDATA[Mongoid]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq%e7%ad%86%e8%a8%98/</guid>
		<description><![CDATA[最近在看一些NoSQL的東西，於是想以MongoDB進行一些實作的練習。這篇文章是我在練習過程中，環境設定的筆記。 Installing Rails 3 請看我的上一篇文章 Installing MongoDB 我的開發環境是Ubuntu和Windows（在家用Ubuntu、出外用Windows，所以試了兩個環境）。Linux的話，個人建議不要用package system(apt/yum)的MongoDB。首先，絕對不要apt-get install mongodb。我一開始練習MongoDB時，是用apt-get裝的，會抓到一個舊到爆炸(1.4.4)的stable版本，這個版本mongo console client打錯指令還會crash（這是stable版嗎？）。 如果一定要用package的話可以考慮apt-get install mongodb-unstable或apt-get install mongodb-snapshot。但我是直接去官網抓build好的版本，再sudo copy到/usr/bin就好了。 MongoDB Object Mapper: Mongoid Mongo的Ruby Object Mapper有很多種，可以參考官網上的列表。我選用Mongoid的原因有二： Mongoid的官網做的還滿有模有樣的，看樣子應該有認真維護 XD Devise認證機制內建支援Mongoid 安裝照著官方installation文件做就好了： 1 2 gem i mongoid –pre gem i bson_ext 如果是Windows系統的話，mongo gem需要build一些native code，所以推薦裝RubyDevKit，裝完就可以順利的安裝mongo相關gems。 Mongoid使用上非常的簡單，Mongoid蓋掉了ActiveRecord的generators。要快速建出一個能動的環境，在設定好gems後只需要： 1 2 rails g mongoid:config rails g scaffold article title:string content:string 只要mongod開著，這樣就可以動了，不用做data [...]]]></description>
			<content:encoded><![CDATA[<p>最近在看一些NoSQL的東西，於是想以<a href="http://www.mongodb.org/">MongoDB</a>進行一些實作的練習。這篇文章是我在練習過程中，環境設定的筆記。</p>
<h3>Installing Rails 3</h3>
<p>請看我的<a href="http://gaagaaga.blogspot.com/2010/10/rails-3.html">上一篇文章</a></p>
<h3>Installing MongoDB</h3>
<p>我的開發環境是Ubuntu和Windows（在家用Ubuntu、出外用Windows，所以試了兩個環境）。Linux的話，個人建議不要用package system(apt/yum)的MongoDB。首先，絕對不要apt-get install mongodb。我一開始練習MongoDB時，是用apt-get裝的，會抓到一個舊到爆炸(1.4.4)的stable版本，這個版本mongo console client打錯指令還會crash（這是stable版嗎？）。</p>
<p>如果一定要用package的話可以考慮apt-get install mongodb-unstable或apt-get install mongodb-snapshot。但我是直接去官網抓build好的版本，再sudo copy到/usr/bin就好了。</p>
<h3>MongoDB Object Mapper: Mongoid</h3>
<p> Mongo的Ruby Object Mapper有很多種，可以參考官<a href="http://www.mongodb.org/display/DOCS/Object+Mappers+for+Ruby+and+MongoDB">網上的列表</a>。我選用Mongoid的原因有二：</p>
<ul>
<li>Mongoid的官網做的還滿有模有樣的，看樣子應該有認真維護 XD</li>
<li>Devise認證機制內建支援Mongoid</li>
</ul>
<p>安裝照著官方installation文件做就好了：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  gem i mongoid –pre
  gem i bson_ext</pre></td></tr></table></div>

<p>如果是Windows系統的話，mongo gem需要build一些native code，所以推薦裝<a href="https://github.com/oneclick/rubyinstaller/wiki/Development-Kit">RubyDevKit</a>，裝完就可以順利的安裝mongo相關gems。</p>
<p>Mongoid使用上非常的簡單，Mongoid蓋掉了ActiveRecord的generators。要快速建出一個能動的環境，在設定好gems後只需要：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  rails g mongoid:config
  rails g scaffold article title:string content:string</pre></td></tr></table></div>

<p>只要mongod開著，這樣就可以動了，不用做data migration。唯一會踩到的雷可能是用了舊版的mongodb，所以就如前面提到的，請不要apt-get install。</p>
<h3>Authentication: Devise</h3>
<p>Devise是一套不錯的rails認證機制，而且內建對Mongoid的支援<br />
一樣照著官方文件做就能動，整合非常簡單。安裝：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  gem i devise</pre></td></tr></table></div>

<p>整合進app：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  rails generate devise:<span style="color: #c20cb9; font-weight: bold;">install</span>
  rails generate devise User</pre></td></tr></table></div>

<p>接下來只要在view裡把link接一接就好。如果原本就用過devise，基本上用ActiveRecord或Mongoid沒啥差別。要速查link path helpers的話可以用rake routes。</p>
<p>唯一要注意的地方是要記得自己打index，我原本以為Model中的</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  devise <span style="color:#ff3333; font-weight:bold;">:database_authenticatable</span>, <span style="color:#ff3333; font-weight:bold;">:registerable</span> <span style="color:#008000; font-style:italic;">#……</span></pre></td></tr></table></div>

<p>這行，會自動在Mongoid Model上加上index。但rake db:mobgoid:create_indexes後，User collection上還是沒有任何index，所以要自己在Model上加：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  index <span style="color:#ff3333; font-weight:bold;">:email</span>, <span style="color:#ff3333; font-weight:bold;">:unique</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span></pre></td></tr></table></div>

<p>然後再執行一次rake db:mongoid:create_indexes，把index打上去。</p>
<p>另外，有人做了Rails3+Mongoid+Devise的整合包。但Devise和Mongoid的整合實在太簡單了，不彷自己做一遍，也比較容易了解細節。</p>
<h3>Deployment Environment: Heroku &#038; MongoHQ</h3>
<p>Heroku是一個雲端的Rails Hosting Platform，其使用方式應該很多文章介紹過了，這裡就不多廢話。基本上注冊好heroku帳號後，在rails app路徑下：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  heroku create appname
  <span style="color: #c20cb9; font-weight: bold;">git</span> push heroku master</pre></td></tr></table></div>

<p>就可以把app deploy上去。</p>
<p>MongoHQ是一個雲端的MongoDB Hosting服務，提供了免費(16MB Limit)及付費的MongoDB空間。由於Heroku與MongoHQ有合作，並將MongoHQ做成了Heroku的一個addon，所以整合特別簡單。這裡是官方文件，只要下一行指令：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  heroku addons:add mongohq:<span style="color: #c20cb9; font-weight: bold;">free</span></pre></td></tr></table></div>

<p>heroku就會自動向MongoHQ註冊一個資料庫，並設定rails的環境變數。注意官方文件有個地方沒講的很清楚，在config/mongoid.yml中，多加上mongohq的設定：</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
</pre></td><td class="code"><pre class="yaml" style="font-family:monospace;">  production: 
    uri: &lt;%= ENV['MONGOHQ_URL'] %&gt;</pre></td></tr></table></div>

<p>設定好後，MongoID就可以吃到MongoHQ的環境變數，並正確地建立資料庫連線。</p>
<p>順便列一下Heroku合作的資料庫中，免費方案的比較：<br />
* Heroku內建Database: 5MB (Postgre SQL)<br />
* Redis To Go: 5MB (Redis)<br />
* MongoHQ: 16MB (MongoDB)<br />
* Cloudant: 100MB, 500k requrest per month (CouchDB)<br />
開發筆記待續…</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2010/10/26/rails3-mongoid-devise-heroku-mongohq%e7%ad%86%e8%a8%98/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rails 3練習筆記</title>
		<link>http://blog.miaout17.net/2010/10/18/rails-3%e7%b7%b4%e7%bf%92%e7%ad%86%e8%a8%98/</link>
		<comments>http://blog.miaout17.net/2010/10/18/rails-3%e7%b7%b4%e7%bf%92%e7%ad%86%e8%a8%98/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 15:42:00 +0000</pubDate>
		<dc:creator>miaout17</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://blog.miaout17.net/2010/10/18/rails-3%e7%b7%b4%e7%bf%92%e7%ad%86%e8%a8%98/</guid>
		<description><![CDATA[這幾天有空時，把rails 3的東西練了一下。基本上我是照著xdite的這篇練習中，rails部份的七個步驟做一遍。雖然xdite在寫這篇時用的應該還是rails 2.x，但要練的概念應該大同小異吧。我手上的參考書是AWDR2（是的，是第二版），和Beginning Rails 3（買來後發覺有點太淺了，但對於與rails脫節太久的我來說，還是不錯的參考書）。如果要玩rails 3的，要查東西似乎還是先查Rails Guide比較快 &#8212; 因為Rails 3太新了，直接Google很常會搜到舊版本的solution。 以下是我印像較深的問題筆記，內容包括把xdite的練習跑一遍，並試著deploy到Heroku和自己的Linux Server上… 安裝ruby + rails development環境…我使用的OS是Ubuntu。一開始沒看到xdite這篇的說明，很白目的用了apt-get install ruby。結果就踩中了ruby 1.9.1 + rails 3.0.0當機的雷（rails 3現在官方只支援ruby 1.8.7及1.9.2）。我想不只是這個原因，用套件的ruby還會有很多相依性的問題吧。最後我因為想同時試rubby 1.9.2和1.8.7，所以選用了rvm，就算沒有要切版本，感覺用rvm管理ruby也滿乾淨的。 gem install rails不知為何速度超慢，而且console完全沒有回應。改用gem i &#8211;verbose rails，才能確認真的有在跑，沒有當機。 ( 3）論壇的文章要能夠分頁，每一頁 20 筆，每一個論壇要秀出現在論壇裡有多少 post 數量。可用 params 配合 named_scope 在文章列表排序。 一開始我寫好了counter cache，在「看版列表」中成功的使用了counter cache減少select count query。接下來做paginate時，一開始我看別人的範例寫成這樣（省略無關的condition） Article.paginate :per_page => 20, :page => params[:page] 但在server console中發現還是有select [...]]]></description>
			<content:encoded><![CDATA[<p>這幾天有空時，把rails 3的東西練了一下。基本上我是照著<a href="http://blog.xdite.net/?p=1754">xdite的這篇練習</a>中，rails部份的七個步驟做一遍。雖然xdite在寫這篇時用的應該還是rails 2.x，但要練的概念應該大同小異吧。我手上的參考書是AWDR2（是的，是第二版），和Beginning Rails 3（買來後發覺有點太淺了，但對於與rails脫節太久的我來說，還是不錯的參考書）。如果要玩rails 3的，要查東西似乎還是先查<a href="http://guides.rubyonrails.org/">Rails Guide</a>比較快 &#8212; 因為Rails 3太新了，直接Google很常會搜到舊版本的solution。
<div></div>
<div>以下是我印像較深的問題筆記，內容包括把xdite的練習跑一遍，並試著deploy到<a href="http://heroku.com/">Heroku</a>和自己的Linux Server上…
<div>
<div>安裝ruby + rails development環境…我使用的OS是Ubuntu。一開始沒看到<a href="http://blog.xdite.net/?p=1807">xdite這篇的說明</a>，很白目的用了apt-get install ruby。結果就踩中了ruby 1.9.1 + rails 3.0.0當機的雷（rails 3現在官方只支援ruby 1.8.7及1.9.2）。我想不只是這個原因，用套件的ruby還會有很多相依性的問題吧。最後我因為想同時試rubby 1.9.2和1.8.7，所以選用了<a href="http://rvm.beginrescueend.com/">rvm</a>，就算沒有要切版本，感覺用rvm管理ruby也滿乾淨的。</div>
<div></div>
<div>gem install rails不知為何速度超慢，而且console完全沒有回應。改用gem i &#8211;verbose rails，才能確認真的有在跑，沒有當機。</div>
</div>
<blockquote><p>( 3）論壇的文章要能夠分頁，每一頁 20 筆，每一個論壇要秀出現在論壇裡有多少 post 數量。可用 params 配合 named_scope 在文章列表排序。</p></blockquote>
<div>一開始我寫好了counter cache，在「看版列表」中成功的使用了counter cache減少select count query。接下來做paginate時，一開始我看別人的範例寫成這樣（省略無關的condition）</div>
<div></div>
<div>Article.paginate :per_page => 20, :page => params[:page]</div>
<div></div>
<div>但在server console中發現還是有select count的query，trace了一下will_paginate源碼，發現雖然will_paginate沒有正確讀到cached count，但可以在paginate時當參數塞進去：</div>
<div></div>
<div>Article.paginate :per_page => 20, :page => params[:page], :total_entries => @forum.articles_count,</p>
</div>
<div>當然，最後才發現<a href="http://gitrdoc.com/rdoc/mislav/will_paginate/b3b0f593ea9b1da13a64bc825dfe17b6bbc2828b/classes/WillPaginate/Finder/ClassMethods.html#M000138">rdoc根本有寫可以這樣下參數</a> Orz</div>
<blockquote><p>( 4）每篇文章可以上傳附件</p></blockquote>
<p>雖然可以用paperclip plugin，但這功能我選擇試著手刻看看。我在開發過程中有丟上Heroku，然後才想到「啊&#8230;Heroku沒辦法寫入靜態檔案，要的話要用S3」。<br />
<blockquote>( 5）Admin 可以刪改所有文章，建立一個後台做這件事。網址是 http://example.org/admin/。只有身分是 admin 的人可以進後台。admin 的判別方是 column 裡加一個 boolean，判斷是否 admin。這個 attribute 必須用 attr_accessible / attr_protected 保護。</p></blockquote>
<p>Admin namespace我是照<a href="http://icebergist.com/posts/restful-admin-namespaced-controller-using-scaffolding">這篇</a>做的，做了看版管理及文章管理。就一般論壇而言，像「看版管理」這種東西，一般人不會有新增、修改、刪除的權限（版主可能有修改），所以scaffold架出來的東西應該的確比較適合移到admin去，而給使用者的邏輯再手動打造。但我的實作有種不夠DRY的感覺，把view和controller的code複置兩份，感覺不太好。可以想見，其實可以利用繼承、共用函式等方式，將程式碼變的更精簡。這部份有更好的best practice嗎？<br />
<blockquote>( 6）用 Rake 撰寫自動化步驟，生假資料。寫一個 rake 可以達成以下步驟：「砍 db => 建 db => 跑 migration => 生種子資料」，另一個 rake 是生假文章與假論壇。</p></blockquote>
<p>heroku不給直接跑rake db:drop。也就是說不能heroku rake db:drop，但可以heroku db:reset; heroku rake dev:fake。當然，這應該也可以寫成一個local的task。<br />
<blockquote>( 7）在租來的 VPS 上面建置 Ruby on Rails production 環境，使用 Ruby Enterprise 與 mod_rails。使用 capistrano 佈署 application。</p></blockquote>
<p>首先，我選用的VPS是<a href="https://www.linode.com/">linode</a>。之前因為好奇，租過一個月的linode來玩，所以就選擇了這個較熟析的環境。灌了linode提供的Debian image後，接下來照著xdite建議的<a href="http://github.com/jnstq/rails-nginx-passenger-ubuntu">rails-nginx-passenger-ubuntu</a>這篇做。一路上沒碰到什麼問題。
<div>
<div>
<div>
<div>
<div>接下來，聞capistrano之名已久，但不知為何這個ruby上最有名的deploy工具，文件似乎有點少。Anyway，看著AWDR2和一些網上的教學，還是可以做的出來。我一開始照著網路上的一些文件，把deploy時的symbolic link功能做好。但bundle gems的問題我一時找不到best practice…看了這個<a href="http://www.youtube.com/watch?v=1qn5KVGB9Xk">影片</a>，雖然覺得解法好像不夠好，但還是先照著做了。bundle path找不到的問題，除了在run中打absolute path外，也可以在deploy.rb中下</div>
<div>default_environment["PATH"] = &#8220;/opt/ruby/bin:/usr/bin:/bin:/usr/sbin:/sbin&#8221;</p>
</div>
</div>
</div>
</div>
</div>
</div>
<div>去指定path。</div>
<div></div>
<div>最後我的deploy.rb大概致上如<a href="http://gist.github.com/632653">這個gist</a>。但我對capistrano的best practice仍有許多疑問…bundle install要自動化嗎？如果不自動化，在機器很多時要一台一台bundle install？自動化的話，要讓capistrano use_sudo嗎？不sudo的話，gems要裝在vendor/gems嗎？如果這樣做的話，vendor/gems要不要做symbolic link呢？（像我現在每cap deploy一次，就把所有系統沒有的bundle gems裝一次，其實有點慢）。</div>
<div></div>
<div>目前練習到這邊。基本上要跑完這份練習沒有難度，但很多地方會覺得處理的不夠好。Best practice可能需要看書或資料、有人指導、或經驗的累積吧…</div>
<div></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.miaout17.net/2010/10/18/rails-3%e7%b7%b4%e7%bf%92%e7%ad%86%e8%a8%98/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
