<?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>ものぐさ備忘録 &#187; Ruby on Rails</title>
	<atom:link href="http://www.ginriki.net/wd/category/ruby/ruby-on-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ginriki.net/wd</link>
	<description>ソフトウェア関係の話を中心とした備忘録的日記</description>
	<lastBuildDate>Sun, 11 Jul 2010 15:48:08 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>NetBeansからRuby on Rails(RoR)のリモートデバッグ</title>
		<link>http://www.ginriki.net/wd/2010/07/12/172/</link>
		<comments>http://www.ginriki.net/wd/2010/07/12/172/#comments</comments>
		<pubDate>Sun, 11 Jul 2010 15:39:07 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[NetBeans]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[debugger]]></category>
		<category><![CDATA[RoR]]></category>

		<guid isPermaLink="false">http://www.ginriki.net/wd/?p=172</guid>
		<description><![CDATA[NetBeansには、rubyのデバッガフロントエンドが同梱されています。
今回は、それを使ってRuby on Rails(以下RoR)のリモートデバッグをするためのメモです。
個人的には、RoRが動いてるマシンにssh [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://ja.netbeans.org/">NetBeans</a>には、rubyのデバッガフロントエンドが同梱されています。<br />
今回は、それを使ってRuby on Rails(以下RoR)のリモートデバッグをするためのメモです。</p>
<p>個人的には、RoRが動いてるマシンにsshでログインした後、emacsと<a href="http://www.freedom.ne.jp/toki/ruby.html">rubydb3x.el</a>を使う方がメリットがある<sup>1</sup>と思いますが、emacsの場合デバッガ用GUIはありません。GUIに慣れてる人はNetBeansの方が楽なので、そういう人向けにまとめます。</p>
<p>なお、NetBeansをインストールしたローカルマシンで、RoRも動かす場合のデバッグ方法は、<a href="http://wiki.netbeans.org/RubyDebugging">NetBeansのwiki</a>を参照してください。</p>
<p>まあ、ローカルマシン上でデバッグする場合も、リモートマシンと接続してデバッグする場合もやり方はほとんど変わりません。</p>
<p>どちらの場合も、デバッギプロセス（と同じプロセス上で動くruby-debug-ide)がTCP(デフォルトだと1234)をListenし、Netbeansからそこに接続してデバッグを開始します。Netbeansから接続するデバッギプロセスがlocalhostにいるか、リモート先のホストにいるかの違いしかないです。<br />
接続後、Netbeansからruby-debug-ideへbreakpointをしかける場所などを指示します。</p>
<p>デバッグ方法そのものは、ローカル・リモートともに一緒ですが、リモートのホストに対してローカルのNetBeansを接続してデバッグするには、リモート先のホストで以下の作業が必要です。</p>
<ol>
<li>rubyインストール (解説略)</li>
<li>RubyGemsインストール (解説略)</li>
<li>RoRインストール・プロジェクト作成 (解説略)</li>
<li>ruby-debug-ideインストール</li>
<li>リモート先のRoRプロジェクトのソースコードを、ローカルにも展開</li>
<li>ruby-debug-ide付きでRoRプロジェクトのWebサーバ起動</li>
</ol>
<p>4, 5, 6の手順は、あまりネット上で見かけないので順に解説します。</p>
<h3>ruby-debug-ideインストール</h3>
<p>Linuxだと、gemで簡単にインストールできます。(gcc, ruby-develをインストールしておけば。)<br />
Fedora8だと以下で終わりでした。</p>
<pre>
$ gem install ruby-debug
$ gem install ruby-debug-ide
</pre>
<p>Windows（のmswin版ruby）の場合、コンパイル環境の用意が面倒なので、コンパイル済みgemをダウンロードした上でインストールします。<sup>2</sup></p>
<pre>&gt; gem install -l linecache-0.43-mswin32.gem
&gt; gem install -l ruby-debug-base-0.10.3-mswin32.gem
&gt; del ruby-debug-base-0.10.3-mswin32.gem
&gt; gem install ruby-debug
&gt; gem install ruby-debug-ide -v 0.4.6</pre>
<p>コンパイル済みgem (linecache, ruby-debug-base)は以下２つのリンク先から<br />
それぞれダウンロードしてください。</p>
<ul>
<li><a href="http://rubyforge.org/frs/?group_id=5040&#038;release_id=22842">linecache</a></li>
<li><a href="http://rubyforge.org/frs/?group_id=1900&#038;release_id=28306">ruby-debug-base</a></li>
</ul>
<h3>リモート先のRoRプロジェクトのソースコードを、ローカルにも展開</h3>
<p>ローカルにもソースコードを置かないと、breakpointで止まった時にNetbeansにソースコードが読み込まれません。<br />
注意点としては、リモートと同じフルパス上にソースコードを置く必要がある点です。リモート先で、/var/www/railsprjにRoRのプロジェクトコードが置いてあるなら、ローカルでも/var/www/railsprjにプロジェクトコードを置く必要があります。<sup>3</sup></p>
<p>この辺の挙動理解には、<a href=http://wiki.netbeans.org/RubyDebugging#Checking_debugger_engine_functionality">NetBeans wikiのChecking debugger engine functionality</a>とか、<a href="http://debug-commons.rubyforge.org/protocol-spec.html">ruby-debug-ide protocol</a>とかを参考にして、実際にruby-debug-ideとtelnetで会話するといいです。</p>
<h3>ruby-debug-ide付きでRuby on RailsプロジェクトのWebサーバ起動</h3>
<p>以下な感じでRoR Webサーバ起動します。(-dも付けると、NetBeansとの通信時の処理が良く見えます。)</p>
<pre>
$ rdebug-ide --stop script/server -h 0.0.0.0
Fast Debugger (ruby-debug-ide 0.4.6) listens on 0.0.0.0:1234
</pre>
<h3>NetBeansからruby-debug-ideに接続</h3>
<p>NetBeans IDEのメニュー -> デバッグ -> 接続をクリックし、ダイアログにリモート先ホスト名とポート番号(1234)を指定して接続します。<br />
&#8211;stopを指定してあるので、RoRの処理先頭でstopするはずです。<br />
あとは、IDEからbreakpoint指定するなり、なんなり自由に操作します。<br />
watch変数として、paramsを追加しておくといい感じです。</p>
<ol class="footnotes"><li id="footnote_0_172" class="footnote">sshのポート(TCP 22)が開いてることは普通にありますが、デバッガ・デバッギ通信用のポートがfirewallで遮断されることは良くあります。</li><li id="footnote_1_172" class="footnote">最近だと、Visual C++は無料で手に入りますがmswin版rubyをコンパイルしたVisual C++と同じバージョンをインストールする必要しないと「MSC version unmatch」エラーが出てめんどくさいです。<a href="http://rubyforge.org/tracker/index.php?func=detail&#038;aid=16774&#038;group_id=1900&#038;atid=7436">http://rubyforge.org/tracker/index.php?func=detail&#038;aid=16774&#038;group_id=1900&#038;atid=7436</a></li><li id="footnote_2_172" class="footnote">WindowsとLinuxだとフルパスを一致させることが不可能なので、例えば、Windows上のNetBeansからLinux上のRoRがデバッグができないという点でかなりアレな仕様です。誰もやってないなら修正パッチ作るかな。</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2010/07/12/172/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>autoloadで自動読み込みされないファイルをユーザアクセス毎に再読み込みする</title>
		<link>http://www.ginriki.net/wd/2009/12/31/102/</link>
		<comments>http://www.ginriki.net/wd/2009/12/31/102/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 15:35:07 +0000</pubDate>
		<dc:creator>ginriki</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://www.ginriki.net/wd/?p=102</guid>
		<description><![CDATA[今回はRuby on Railsについてメモ。
autoloadで自動読み込みされないファイル1をcontrollerの中などでrequireを使って読み込んだ場合、そのファイルはdevelopmentモード時でもユーザ [...]]]></description>
			<content:encoded><![CDATA[<p>今回はRuby on Railsについてメモ。</p>
<p>autoloadで自動読み込みされないファイル<sup>1</sup>をcontrollerの中などでrequireを使って読み込んだ場合、そのファイルはdevelopmentモード時でもユーザアクセス毎に再読み込みされません。そのため、ファイルを編集してもwebサーバを再起動しないと変更が反映されないので、デバッグがやりづらくて困ってました。</p>
<p>解決策がないかと思って、ググってみたところ、以下のページに解決策が書いてありました。<br />
<a href="http://www.pistolfly.jp/weblog/2007/06/require-dependency.html">http://www.pistolfly.jp/weblog/2007/06/require-dependency.html</a></p>
<p>requireじゃなくて、require_dependencyでファイル読み込みすれば良いということでした。<br />
require_dependencyの挙動については、上のリンク先を参照してください。<br />
この辺り(autoload周辺)って、Ruby on Rails公式なドキュメントが見当たらないですねえ。・・・実装を読めってことか。</p>
<p>以下、問題のコード例と解決方法。(ruby 1.8.5, rails 2.3.3, WEBrick 1.3.1で実験しました。)</p>
<p>ファイル読み込みの対象となるファイルを用意します。</p>
<p>&#060;rails_project&#062;/lib/hoge_fuga.rb</p>
<div class="igBar"><span id="lruby-4"><a href="#" onclick="javascript:showPlainTxt('ruby-4'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-4">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">class</span> Hoge</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> hoge</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#996600;">"abc"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>上のファイルを読み込むcontrollerを用意します。<br />
このとき、requireの代わりにrequire_dependencyでファイルを読み込みます。</p>
<p>&#060;rails_project&#062;/app/controllers/test_controller.rb</p>
<div class="igBar"><span id="lruby-5"><a href="#" onclick="javascript:showPlainTxt('ruby-5'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-5">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#008000; font-style:italic;">#require 'hoge_fuga'</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">require_dependency 'hoge_fuga'</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp;</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">class</span> TestController &lt;ApplicationController</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> hoge</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; a = Hoge.<span style="color:#9900CC;">new</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; render<span style="color:#006600; font-weight:bold;">&#40;</span>:text =&gt; a.<span style="color:#9900CC;">hoge</span><span style="color:#006600; font-weight:bold;">&#41;</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>んで、Webサーバを起動。</p>
<pre>
$ cd &#060;rails_project&#062;
$ ruby script/server
</pre>
<p>で、ブラウザからtest/hogeにアクセスすると、ブラウザ上にabcが出力されます。<br />
この状況で、&#060;rails_project&#062;/lib/hoge_fuga.rbを以下のように書き換えてみます。</p>
<div class="igBar"><span id="lruby-6"><a href="#" onclick="javascript:showPlainTxt('ruby-6'); return false;">PLAIN TEXT</a></span></div>
<div class="syntax_hilite"><span class="langName">RUBY:</span>
<div id="ruby-6">
<div class="ruby">
<ol>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">class</span> Hoge</div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">def</span> hoge</div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; &nbsp; <span style="color:#0000FF; font-weight:bold;">return</span> <span style="color:#996600;">"123"</span></div>
</li>
<li style="font-weight: bold;color:#26536A;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;">&nbsp; <span style="color:#9966CC; font-weight:bold;">end</span></div>
</li>
<li style="font-family: 'Courier New', Courier, monospace; color: black; font-weight: normal; font-style: normal;color:#3A6A8B;">
<div style="font-family: 'Courier New', Courier, monospace; font-weight: normal;"><span style="color:#9966CC; font-weight:bold;">end</span> </div>
</li>
</ol>
</div>
</div>
</div>
<p></p>
<p>変更を保存した後、ブラウザからtest/hogeにアクセスすると、ブラウザ上に123が出力されます。<br />
確かに、Webサーバを再起動しなくても、&#060;rails_project&#062;/lib/hoge_fuga.rbが再読み込みされてますね。</p>
<p>これでデバッグがしやすくなるなあ。</p>
<ol class="footnotes"><li id="footnote_0_102" class="footnote">Railsの場合、クラス定義と定義が記述されたファイルの名前が対応づいてないとautoloadで自動読み込みされません（たぶん）。例えば、FooBarというクラスの定義はfoo_bar.rbというファイルの中で行われてないとautoloadにされません。</li></ol>]]></content:encoded>
			<wfw:commentRss>http://www.ginriki.net/wd/2009/12/31/102/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
