<?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/"
		xmlns:xhtml="http://www.w3.org/1999/xhtml"
>

<channel>
	<title>ディスコ探偵冬景色 &#187; Ruby</title>
	<atom:link href="http://blog.udzura.jp/categories/tech/ruby/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.udzura.jp</link>
	<description>a coding class hero is something to be...</description>
	<lastBuildDate>Thu, 29 Jul 2010 05:48:23 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.5</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/categories/tech/ruby/feed/" />
		<item>
		<title>検証したいRailsプラグインのメモ</title>
		<link>http://blog.udzura.jp/2010/07/29/rails-plugins-to-test/</link>
		<comments>http://blog.udzura.jp/2010/07/29/rails-plugins-to-test/#comments</comments>
		<pubDate>Thu, 29 Jul 2010 05:46:34 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=556</guid>
		<description><![CDATA[Resque
Github謹製、Redisと連携するやつ。非同期ジョブ実行をサポートする。

GitHub製Resqueを使用したRubyでのバックグラウンド処理(バッチ処理) 
defunkt&#8217;s resque at master

ジョブ監視のWebUIがついてくる。Sinatraベースで、カスタマイズも楽そう。

New Resque Web UI

また、cron風の定期実行ジョブを仕掛けるプラグインもあるようだ。

bvandenbos&#8217;s resque-scheduler at master
resque-scheduler (resqueでcronみたいなことをする)

個人的に、webブラウザから簡単にジョブを登録したり監視したりする要件があるので、割と揃ってる感じが気になる。ぜひ試してみたいです。
DataFabric

mperham&#8217;s data_fabric at master
Getting started with data_fabric


DataFabric provides flexible database connection switching for ActiveRecord.

具体的にはshardingとreplicationを実現してくれる。一昔前はacts_as_readonlyableがメジャーだったのだが、最近はメンテナンスされていないようで、2.3.x系では動作が怪しいらしい（リンク先に貴重なパッチ情報があります）。
とはいってもこちらのDataFabricも、、最終更新が今年とは言え、1月だったりする。。。それでも、2.3系で動きやすいのがどっちかといえばDataFabricに軍配が上がるだろう。gemでインストールできるようだし。
なんにしても、実際動かしてみないことにはよくわからないので、こちらも検証記事でも書こうかなと思う。
]]></description>
			<content:encoded><![CDATA[<h3>Resque</h3>
<p>Github謹製、Redisと連携するやつ。非同期ジョブ実行をサポートする。</p>
<ul>
<li><a href="http://blog.madoro.org/mn/17">GitHub製Resqueを使用したRubyでのバックグラウンド処理(バッチ処理) </a></li>
<li><a href="http://github.com/defunkt/resque">defunkt&#8217;s resque at master</a></li>
</ul>
<p>ジョブ監視のWebUIがついてくる。Sinatraベースで、カスタマイズも楽そう。</p>
<ul>
<li><a href="http://github.com/blog/543-new-resque-web-ui">New Resque Web UI</a></li>
</ul>
<p>また、cron風の定期実行ジョブを仕掛けるプラグインもあるようだ。</p>
<ul>
<li><a href="http://github.com/bvandenbos/resque-scheduler">bvandenbos&#8217;s resque-scheduler at master</a></li>
<li><a href="http://blog.madoro.org/mn/56">resque-scheduler (resqueでcronみたいなことをする)</a></li>
</ul>
<p>個人的に、webブラウザから簡単にジョブを登録したり監視したりする要件があるので、割と揃ってる感じが気になる。ぜひ試してみたいです。</p>
<h3>DataFabric</h3>
<ul>
<li><a href="http://github.com/mperham/data_fabric">mperham&#8217;s data_fabric at master</a></li>
<li><a href="http://blog.agoragames.com/2010/01/29/getting-started-with-data_fabric/">Getting started with data_fabric</a></li>
</ul>
<blockquote><p>
DataFabric provides flexible database connection switching for ActiveRecord.
</p></blockquote>
<p>具体的にはshardingとreplicationを実現してくれる。一昔前はacts_as_readonlyableがメジャーだったのだが、最近はメンテナンスされていないようで、<a href="http://dontstopmusic.no-ip.org/diary/20091203.html">2.3.x系では動作が怪しいらしい</a>（リンク先に貴重なパッチ情報があります）。</p>
<p>とはいってもこちらのDataFabricも、、最終更新が今年とは言え、1月だったりする。。。それでも、2.3系で動きやすいのがどっちかといえばDataFabricに軍配が上がるだろう。gemでインストールできるようだし。</p>
<p>なんにしても、実際動かしてみないことにはよくわからないので、こちらも検証記事でも書こうかなと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/29/rails-plugins-to-test/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/29/rails-plugins-to-test/" />
	</item>
		<item>
		<title>Radiant CMSのExtensionを作る – タグ追加篇</title>
		<link>http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/</link>
		<comments>http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/#comments</comments>
		<pubDate>Wed, 28 Jul 2010 05:50:07 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=550</guid>
		<description><![CDATA[目次

前回（モデルと管理画面追加）
今回（タグの追加）

タグ追加の参考サイト

http://wiki.github.com/radiant/radiant/adding-custom-radius-tags
http://github.com/radiant/radiant/blob/master/app/models/standard_tags.rb

後者は、Radiant内で実際に使われているタグ定義、要はソースの一部。これが一番参考になる。チラチラ見ながら読み進めていただきたい。

タグ用のDSLの概要
vendor/extensions/cash_memo/app/models/cash_item_tags.rb というものを作ってみよう。models以下に作成することが多いようだ。

1
2
3
4
5
6
module CashItemTags
  include Radiant::Taggable
&#160;
  class TagError &#60; StandardError; end
...
end

タグを作成するためには、以下の流れでモジュール内に宣言していく。

desc メソッド: 説明を書く。%{}とかで囲って書いてる場合が多い。また、Textile記法を用いたりできる。
tag メソッド: 実際の挙動をブロック内に記述する。メソッドの引数はタグ名。また、ブロック内には「tag」という変数を投げ込める

この「tag」オブジェクトは、正体は「Radius::TagBinding」というクラスのようだ。以下のようなメソッドが使える。

Radius::TagBinding#expand: そのタグで囲ったテキストを、その場で展開する。
Radius::TagBinding#attr: そのタグで指定した、「name=&#8221;value&#8221;」みたいな属性をパースし、ハッシュの形で

1
tag.attr&#91;&#34;name&#34;&#93;

のようにアクセスできるようにする。
Radius::TagBinding#locals: そのタグと、そのタグの子要素となるタグ内で共通に使用できる変数をセット/アクセスする。tag.local自体はOpenStructを継承したオブジェクトのようで、

1
2
tag.locals.hoges = Hoge.all
tag.locals.hoges.first

のように使える。

これは、実際のコードをみて行った方がわかりやすいかな。。。
ということで拙作のタグの一部を。。「CashItem」モデルは、前回からの続きということで。

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
26
27
28
29
30
31
32
33
34
35
36
37
  # 何もしない、ネームスペースの定義だけのタグは、とりあえず「tag.expand」としておこう
  tag 'cash_items' do &#124;tag&#124;
    tag.expand
  end
&#160;
  tag 'cash_items:each' do &#124;tag&#124;
    begin
      # localsにモデルをセット
     [...]]]></description>
			<content:encoded><![CDATA[<h3>目次</h3>
<ul>
<li><a href="http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/">前回（モデルと管理画面追加）</a></li>
<li>今回（タグの追加）</li>
</ul>
<h3>タグ追加の参考サイト</h3>
<ul>
<li><a href="http://wiki.github.com/radiant/radiant/adding-custom-radius-tags">http://wiki.github.com/radiant/radiant/adding-custom-radius-tags</a></li>
<li><a href="http://github.com/radiant/radiant/blob/master/app/models/standard_tags.rb">http://github.com/radiant/radiant/blob/master/app/models/standard_tags.rb</a></li>
</ul>
<p>後者は、<strong>Radiant内で実際に使われているタグ定義</strong>、要はソースの一部。これが一番参考になる。チラチラ見ながら読み進めていただきたい。</p>
<p><span id="more-550"></span></p>
<h3>タグ用のDSLの概要</h3>
<p>vendor/extensions/cash_memo/app/models/cash_item_tags.rb というものを作ってみよう。models以下に作成することが多いようだ。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> CashItemTags
  <span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#6666ff; font-weight:bold;">Radiant::Taggable</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">class</span> TagError <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#CC00FF; font-weight:bold;">StandardError</span>; <span style="color:#9966CC; font-weight:bold;">end</span>
...
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>タグを作成するためには、以下の流れでモジュール内に宣言していく。</p>
<ul>
<li><strong><tt>desc</tt> メソッド</strong>: 説明を書く。%{}とかで囲って書いてる場合が多い。また、Textile記法を用いたりできる。</li>
<li><strong><tt>tag</tt> メソッド</strong>: 実際の挙動をブロック内に記述する。メソッドの引数はタグ名。また、ブロック内には「tag」という変数を投げ込める</li>
</ul>
<p>この「tag」オブジェクトは、正体は「<tt>Radius::TagBinding</tt>」というクラスのようだ。以下のようなメソッドが使える。</p>
<ul>
<li><strong><tt>Radius::TagBinding#expand</tt></strong>: そのタグで囲ったテキストを、その場で展開する。</li>
<li><strong><tt>Radius::TagBinding#attr</tt></strong>: そのタグで指定した、「name=&#8221;value&#8221;」みたいな属性をパースし、ハッシュの形で

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">tag.<span style="color:#9900CC;">attr</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;name&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span></pre></td></tr></table></div>

<p>のようにアクセスできるようにする。</li>
<li><strong><tt>Radius::TagBinding#locals</tt></strong>: そのタグと、<strong>そのタグの子要素となるタグ内で共通に使用できる</strong>変数をセット/アクセスする。tag.local自体はOpenStructを継承したオブジェクトのようで、

<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;">tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">hoges</span> = Hoge.<span style="color:#9900CC;">all</span>
tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">hoges</span>.<span style="color:#9900CC;">first</span></pre></td></tr></table></div>

<p>のように使える。</li>
</ul>
<h3>これは、実際のコードをみて行った方がわかりやすいかな。。。</h3>
<p>ということで拙作のタグの一部を。。「CashItem」モデルは、<a href="http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/">前回から</a>の続きということで。</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
26
27
28
29
30
31
32
33
34
35
36
37
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#008000; font-style:italic;"># 何もしない、ネームスペースの定義だけのタグは、とりあえず「tag.expand」としておこう</span>
  tag <span style="color:#996600;">'cash_items'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>tag<span style="color:#006600; font-weight:bold;">|</span>
    tag.<span style="color:#9900CC;">expand</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  tag <span style="color:#996600;">'cash_items:each'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>tag<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#9966CC; font-weight:bold;">begin</span>
      <span style="color:#008000; font-style:italic;"># localsにモデルをセット</span>
      <span style="color:#008000; font-style:italic;"># ここでセットすると、 cash_items:each:* のネームスペースの子要素内で参照できる、ということ</span>
      tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">items</span> = CashItem.<span style="color:#9900CC;">all</span>
      ret = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
      iterated_items = tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">items</span>
      <span style="color:#008000; font-style:italic;"># モデルの個数だけ、 r:cash_items:each タグでくくった要素を繰り返し出力する</span>
      iterated_items.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>item<span style="color:#006600; font-weight:bold;">|</span>
        tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">item</span> = item
        ret <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> tag.<span style="color:#9900CC;">expand</span> 
      <span style="color:#9966CC; font-weight:bold;">end</span>
      ret
    <span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e
      <span style="color:#996600;">&quot;タグに誤りがあるようです：#{e.class}, #{e.message}&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># 名前だけ</span>
  tag <span style="color:#996600;">'cash_items:each:item'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>tag<span style="color:#006600; font-weight:bold;">|</span>
    tag.<span style="color:#9900CC;">expand</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># cash_items:each 内で、各モデルの各属性に参照する</span>
  tag <span style="color:#996600;">'cash_items:each:item:name'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>tag<span style="color:#006600; font-weight:bold;">|</span>
    tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">item</span>.<span style="color:#9900CC;">name</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#008000; font-style:italic;"># tag.attr はこんな感じで使える</span>
  tag <span style="color:#996600;">'cash_items:each:item:paid_at'</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>tag<span style="color:#006600; font-weight:bold;">|</span>
    tag.<span style="color:#9900CC;">locals</span>.<span style="color:#9900CC;">item</span>.<span style="color:#9900CC;">paid_at</span>.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#40;</span>tag.<span style="color:#9900CC;">attr</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;format&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#996600;">&quot;%Y/%m/%d(%a) %H:%M:%S&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">strip</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#008000; font-style:italic;"># 以下、各属性へのアクセッサーを宣言……</span></pre></td></tr></table></div>

<p>タグの有効化は、 vendor/extensions/cash_memo/cash_memo_extension.rb に以下の要領で追記。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">    Page.<span style="color:#9900CC;">class_eval</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
      <span style="color:#9966CC; font-weight:bold;">include</span> CashItemTags
    <span style="color:#006600; font-weight:bold;">&#125;</span></pre></td></tr></table></div>

<p>で、ある程度小遣い帳の項目を登録したら、CMS管理画面側で、こんな感じで記事を登録（Textile filter）。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:cash_items:each<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
h3. <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:item:name</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 * 使用金額：<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:item:amount</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 * 購入者：<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:item:user_name</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
 * 購入日時：<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:item:paid_at</span> <span style="color: #000066;">format</span>=<span style="color: #ff0000;">&quot;%Y年%m月%d日 (%H:%M)&quot;</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
&nbsp;
bq. <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;r:item:note</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/r:cash_items:each<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>すると。。。。無事、こういう風に展開される。</p>
<p><a href="http://blog.udzura.jp/wp-content/uploads/2010/07/ext03.png"><img src="http://blog.udzura.jp/wp-content/uploads/2010/07/ext03-300x262.png" alt="ext03" title="ext03" width="300" height="262" class="alignnone size-medium wp-image-552" /></a></p>
<p>あとは、cash_item:each タグに属性を設定し、順番なり抽出条件なりを変えたりとか、いろいろできる。とにかく standard_tag の書き方が一番参考になるので、作るつもりの人はみておいた方がいいだろう。</p>
<h3>まとめ</h3>
<ul>
<li>Radiant Extensionとは言いながら、実際の作り方、コードの感じはほぼまったく素のRailsに近い。</li>
<li>Tagの記述DSLは多少コツがいるが、十分に柔軟。</li>
<li>Radiantは、CMSというか、Railsの上にさらに覆い被さるウェブサイトフレームワークといった感じがする。Extension次第でかなり柔軟なサイト構築が出来そう。</li>
</ul>
<p>ということで、日本語化も無事されつつあるということで、もっと色々Extensionが増えるといいですね～。</p>
<p>今回作ったExtension、今後の課題は：</p>
<ul>
<li>Spec全然書いてない。</li>
<li>例外処理が非常に甘いと思う。</li>
</ul>
<h3>ソースコード is here</h3>
<ul>
<li><a href="http://github.com/udzura/radiant-cash_memo-extension">http://github.com/udzura/radiant-cash_memo-extension</a></li>
</ul>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">git clone git:<span style="color: #000000; font-weight: bold;">//</span>github.com<span style="color: #000000; font-weight: bold;">/</span>udzura<span style="color: #000000; font-weight: bold;">/</span>radiant-cash_memo-extension.git vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo</pre></td></tr></table></div>

<p>で、他のRadiantにもインストールできるでしょう。動作保障はしません。。コードの参考までに、です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/" />
	</item>
		<item>
		<title>Radiant CMSのExtensionを作る &#8211; モデル追加湯けむり旅情篇</title>
		<link>http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/</link>
		<comments>http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/#comments</comments>
		<pubDate>Tue, 27 Jul 2010 10:45:06 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=541</guid>
		<description><![CDATA[目次

今回（モデルと管理画面追加）
次回（タグの追加）

セットアップ
radiantはgemで入れる。2010年7月現在、バージョン0.9.1が入るはず。

1
sudo gem install radiant

0.9.1は比較的安定している模様なので、今回はこれをベースに開発する。
今回は「お小遣い帳をCMSに追加する」エクステンションを開発する。

で、

http://wiki.github.com/radiant/radiant/how-to-create-an-extension

のとおり（おおむね）の手順で、必要なモデル「小遣い帳の項目」を作成する。
Radiant自身と、Extensionの雛形を作る。

1
2
3
4
5
6
7
8
9
10
11
radiant -d mysql cash-book
&#160;
mysql&#62; create database cash_book_development
default charset utf8
default collate utf8_general_ci
;
#=&#62;Query OK, 1 row affected (0.02 sec)
&#160;
cd cash-book/
rake db:bootstrap
ruby script/generate extension cash-memo

ここで、Radiant自身はscaffoldジェネレータを用意してくれない……ので、別のRailsアプリを一旦作成し、そっちのscaffoldで雛形を作成、コピーして使用する。

1
2
3
4
5
6
7
8
9
10
11
12
13
cd ..
rails cash-book-tmp
cd cash-book-tmp/
ruby script/generate scaffold Admin::CashItem \
  name:string paid_at:datetime \
  user_id:integer amount:integer \
  note:text
cp -rv app/views/admin ../cash-book/vendor/extensions/cash_memo/app/views/
cp -rv app/controllers/admin ../cash-book/vendor/extensions/cash_memo/app/controllers/
cp -rv app/models/admin ../cash-book/vendor/extensions/cash_memo/app/models/
cp -rv db/migrate/* ../cash-book/vendor/extensions/cash_memo/db/migrate/
mv -v [...]]]></description>
			<content:encoded><![CDATA[<h3>目次</h3>
<ul>
<li>今回（モデルと管理画面追加）</li>
<li><a href="http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/">次回（タグの追加）</a></li>
</ul>
<h3>セットアップ</h3>
<p>radiantはgemで入れる。2010年7月現在、バージョン0.9.1が入るはず。</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;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> radiant</pre></td></tr></table></div>

<p>0.9.1は比較的安定している模様なので、今回はこれをベースに開発する。</p>
<p>今回は<strong>「お小遣い帳をCMSに追加する」</strong>エクステンションを開発する。</p>
<p><span id="more-541"></span><br />
で、</p>
<ul>
<li><a href="http://wiki.github.com/radiant/radiant/how-to-create-an-extension">http://wiki.github.com/radiant/radiant/how-to-create-an-extension</a></li>
</ul>
<p>のとおり（おおむね）の手順で、必要なモデル「小遣い帳の項目」を作成する。</p>
<p>Radiant自身と、Extensionの雛形を作る。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">radiant <span style="color: #660033;">-d</span> mysql cash-book
&nbsp;
mysql<span style="color: #000000; font-weight: bold;">&gt;</span> create database cash_book_development
default charset utf8
default collate utf8_general_ci
;
<span style="color: #666666; font-style: italic;">#=&gt;Query OK, 1 row affected (0.02 sec)</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> cash-book<span style="color: #000000; font-weight: bold;">/</span>
rake db:bootstrap
ruby script<span style="color: #000000; font-weight: bold;">/</span>generate extension cash-memo</pre></td></tr></table></div>

<p>ここで、Radiant自身はscaffoldジェネレータを用意してくれない……ので、別のRailsアプリを一旦作成し、そっちのscaffoldで雛形を作成、コピーして使用する。</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
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">cd</span> ..
rails cash-book-tmp
<span style="color: #7a0874; font-weight: bold;">cd</span> cash-book-tmp<span style="color: #000000; font-weight: bold;">/</span>
ruby script<span style="color: #000000; font-weight: bold;">/</span>generate scaffold Admin::CashItem \
  name:string paid_at:datetime \
  user_id:integer amount:integer \
  note:text
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-rv</span> app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>admin ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>views<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-rv</span> app<span style="color: #000000; font-weight: bold;">/</span>controllers<span style="color: #000000; font-weight: bold;">/</span>admin ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>controllers<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-rv</span> app<span style="color: #000000; font-weight: bold;">/</span>models<span style="color: #000000; font-weight: bold;">/</span>admin ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>models<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-rv</span> db<span style="color: #000000; font-weight: bold;">/</span>migrate<span style="color: #000000; font-weight: bold;">/*</span> ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>db<span style="color: #000000; font-weight: bold;">/</span>migrate<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #660033;">-v</span> ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>models<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span>cash_item.rb ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>models<span style="color: #000000; font-weight: bold;">/</span>
<span style="color: #c20cb9; font-weight: bold;">rmdir</span> ..<span style="color: #000000; font-weight: bold;">/</span>cash-book<span style="color: #000000; font-weight: bold;">/</span>vendor<span style="color: #000000; font-weight: bold;">/</span>extensions<span style="color: #000000; font-weight: bold;">/</span>cash_memo<span style="color: #000000; font-weight: bold;">/</span>app<span style="color: #000000; font-weight: bold;">/</span>models<span style="color: #000000; font-weight: bold;">/</span>admin<span style="color: #000000; font-weight: bold;">/</span></pre></td></tr></table></div>

<h4>詰まったところ</h4>
<ul>
<li>ここで、間違えて application_controller.rb までコピーしてしまうと、Radiant自体が起動しなくなる。。。</li>
</ul>
<h3>動くように改修</h3>
<p>さて、Railsは、Scaffoldで作成された各種スクリプトについて、ネームスペース付きの場合はそのままでは使用できない。。。以下の要件で、何ヶ所か修正する。sedでもGUIテキストエディタでもいいけど、一括変換で問題ないだろう。</p>
<ul>
<li><strong>View</strong>: <code>cash_item</code>と名の付くものを<code>admin_cash_item</code>に変更する。path名、変数名など。また、form_forの中など、モデルをそのままpathに変換している箇所は、

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">admin_cash_item_path<span style="color:#006600; font-weight:bold;">&#40;</span>@admin_cash_item<span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>のようにしないと動作しない。</li>
<li><strong>Controller</strong>: クラス名を変更、あとはViewと同じ要領で変更。特に、createやupdateでのリダイレクト先指定などが引っかかる。また、params[:cash_item]は変更してはいけないことを留意する</li>
<li><strong>Model</strong>:

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">belongs_to <span style="color:#ff3333; font-weight:bold;">:user</span></pre></td></tr></table></div>

<p>を宣言。ふつうにRadiantで使用しているモデルに対して、has_many/belongs_toを宣言できる。</li>
<li><strong>Migration file</strong>: ファイル名を「*_create_cash_items.rb」に、クラス名を「CreateCashItems」に、テーブル名を「:cash_items」にする</li>
</ul>
<p>完成したscaffoldファイルは、<a href="http://github.com/udzura/radiant-cash_memo-extension/tree/master/app/">一応githubにアップしてある</a>。まあ、エラーが出るたびに潰していくのがいいと思う。</p>
<p>また、 vendor/extensions/cash_memo/config/routes.rb を以下のように作成。define_routesは消える予定なので使わない。警告が出ます。</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;"><span style="color:#6666ff; font-weight:bold;">ActionController::Routing::Routes</span>.<span style="color:#9900CC;">draw</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>map<span style="color:#006600; font-weight:bold;">|</span>
  map.<span style="color:#9900CC;">namespace</span> <span style="color:#ff3333; font-weight:bold;">:admin</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>admin<span style="color:#006600; font-weight:bold;">|</span>
    admin.<span style="color:#9900CC;">resources</span> <span style="color:#ff3333; font-weight:bold;">:cash_items</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>また、管理画面にタブを作成するため、 vendor/extensions/cash_memo/cash_memo_extension.rb 内の activate メソッドに以下の記述を追加する。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">  def activate
    tab <span style="color: #ff0000;">'Content'</span> <span style="color: #000000; font-weight: bold;">do</span>
      add_item <span style="color: #ff0000;">&quot;小遣い帳&quot;</span>, <span style="color: #ff0000;">&quot;/admin/cash_items&quot;</span>, :after =<span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">&quot;Pages&quot;</span>
    end
  end</pre></td></tr></table></div>

<p>これで、</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;">rake radiant:extensions:cash_memo:migrate</pre></td></tr></table></div>

<p>テーブルが追加されたのを確認して</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;">ruby script<span style="color: #000000; font-weight: bold;">/</span>server <span style="color: #660033;">-e</span> development</pre></td></tr></table></div>

<p><a href="http://blog.udzura.jp/wp-content/uploads/2010/07/ext01.png"><img src="http://blog.udzura.jp/wp-content/uploads/2010/07/ext01-300x195.png" alt="ext01" title="ext01" width="300" height="195" class="alignnone size-medium wp-image-542" /></a></p>
<p><a href="http://blog.udzura.jp/wp-content/uploads/2010/07/ext02.png"><img src="http://blog.udzura.jp/wp-content/uploads/2010/07/ext02-300x199.png" alt="ext02" title="ext02" width="300" height="199" class="alignnone size-medium wp-image-543" /></a></p>
<p>これで、小遣い帳の項目をRadiantに記録できるようになった。</p>
<p>今回、Userはプルダウンから選べる方がいいに決まっているので、scaffoldを以下のように修正している。</p>
<h4>vendor/extensions/cash_memo/cash_memo_extension.rb に追記</h4>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#9966CC; font-weight:bold;">def</span> activate
<span style="color:#006600; font-weight:bold;">+</span>    User.<span style="color:#9900CC;">class_eval</span> <span style="color:#006600; font-weight:bold;">&#123;</span>
<span style="color:#006600; font-weight:bold;">+</span>      has_many <span style="color:#ff3333; font-weight:bold;">:cash_items</span>
<span style="color:#006600; font-weight:bold;">+</span>      <span style="color:#9966CC; font-weight:bold;">def</span> to_option
<span style="color:#006600; font-weight:bold;">+</span>        <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">name</span>, <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">id</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#006600; font-weight:bold;">+</span>      <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">+</span>      
<span style="color:#006600; font-weight:bold;">+</span>      <span style="color:#9966CC; font-weight:bold;">def</span> User.<span style="color:#9900CC;">all_as_options</span>
<span style="color:#006600; font-weight:bold;">+</span>        User.<span style="color:#9900CC;">all</span>.<span style="color:#9900CC;">map</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&amp;</span>:to_option<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">+</span>      <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">+</span>    <span style="color:#006600; font-weight:bold;">&#125;</span>
...</pre></td></tr></table></div>

<h4>vendor/extensions/cash_memo/app/views/admin/cash_items/(edit|new).html.erb に追記</h4>

<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;"><span style="color:#006600; font-weight:bold;">&lt;%</span> form_for<span style="color:#006600; font-weight:bold;">&#40;</span>@admin_cash_item, <span style="color:#ff3333; font-weight:bold;">:url</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> ...<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>f<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
...
-     <span style="color:#006600; font-weight:bold;">&lt;%</span>= f.<span style="color:#9900CC;">text_field</span> <span style="color:#ff3333; font-weight:bold;">:user_id</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
+     <span style="color:#006600; font-weight:bold;">&lt;%</span>= f.<span style="color:#CC0066; font-weight:bold;">select</span> <span style="color:#ff3333; font-weight:bold;">:user_id</span>, User.<span style="color:#9900CC;">all_as_options</span> <span style="color:#006600; font-weight:bold;">%&gt;</span>
...</pre></td></tr></table></div>

<p>管理画面がいまいちと思うなら、Railsと同様にViewを編集して見栄えよくすることも出来る。</p>
<h3>次回</h3>
<p>モデルの追加と管理画面だけなのに、長くなってしまった、、、<a href="http://blog.udzura.jp/2010/07/28/how-to-create-radiant-extension-tags/">次回は、タグを追加し、小遣い帳の記録をページに表示するところ</a>をやります。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/27/howto-create-radiant-extension/" />
	</item>
		<item>
		<title>returning は死んだ。 Object#tap を使おう</title>
		<link>http://blog.udzura.jp/2010/07/26/returning-is-dead-use-tap/</link>
		<comments>http://blog.udzura.jp/2010/07/26/returning-is-dead-use-tap/#comments</comments>
		<pubDate>Mon, 26 Jul 2010 04:19:56 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=537</guid>
		<description><![CDATA[標記のとおり、死ぬみたいです。

http://github.com/rails/rails/commit/b0b9bf320409b66c6c6b680371aca590297cd4cc


crankharder
I&#8217;m curious to know what the rational is behind this?
rohit
You can now use tap.

正論過ぎて返す言葉もありませんね。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
require &#34;rubygems&#34;
require &#34;active_support&#34;
&#160;
a1 = returning &#91;&#93; do &#124;ary&#124;
  ary &#60;&#60; 'hoge'
  ary &#60;&#60; 'fuga'
end
&#160;
a2 = &#91;&#93;.tap do &#124;ary&#124;
  ary &#60;&#60; 'hoge'
  ary &#60;&#60; 'fuga'
end
&#160;
require &#34;spec&#34;
a1.should == a2
#=&#62; true

確かに、タイピング量的にも、tapの方が少なくなりますね。でも、1.8.6みたいにtapのバックポートが無い場合とか、あとreturningを使いまくってる場合は…。
そもそもtapもreturningも4行ぐらいで実装できるので、以下のような config/initializers/returning_strikes_back.rb を作成すれば互換性を確保できるんじゃあないでしょうか。あまり薦めませんが。。

1
2
3
4
5
6
7
8
9
10
module ReturningStrikesBack
  def returning&#40;value&#41;
    yield&#40;value&#41;
 [...]]]></description>
			<content:encoded><![CDATA[<p>標記のとおり、死ぬみたいです。</p>
<ul>
<li><a href="http://github.com/rails/rails/commit/b0b9bf320409b66c6c6b680371aca590297cd4cc">http://github.com/rails/rails/commit/b0b9bf320409b66c6c6b680371aca590297cd4cc</a></li>
</ul>
<blockquote>
<h5>crankharder</h5>
<p>I&#8217;m curious to know what the rational is behind this?</p>
<h5>rohit</h5>
<p>You can now use tap.
</p></blockquote>
<p>正論過ぎて返す言葉もありませんね。</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
</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;">&quot;rubygems&quot;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;active_support&quot;</span>
&nbsp;
a1 = returning <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>ary<span style="color:#006600; font-weight:bold;">|</span>
  ary <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">'hoge'</span>
  ary <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">'fuga'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
a2 = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">tap</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>ary<span style="color:#006600; font-weight:bold;">|</span>
  ary <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">'hoge'</span>
  ary <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">'fuga'</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">&quot;spec&quot;</span>
a1.<span style="color:#9900CC;">should</span> == a2
<span style="color:#008000; font-style:italic;">#=&gt; true</span></pre></td></tr></table></div>

<p>確かに、タイピング量的にも、tapの方が少なくなりますね。でも、1.8.6みたいにtapのバックポートが無い場合とか、あとreturningを使いまくってる場合は…。</p>
<p>そもそもtapもreturningも4行ぐらいで実装できるので、以下のような<code> config/initializers/returning_strikes_back.rb </code>を作成すれば互換性を確保できるんじゃあないでしょうか。あまり薦めませんが。。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">module</span> ReturningStrikesBack
  <span style="color:#9966CC; font-weight:bold;">def</span> returning<span style="color:#006600; font-weight:bold;">&#40;</span>value<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">yield</span><span style="color:#006600; font-weight:bold;">&#40;</span>value<span style="color:#006600; font-weight:bold;">&#41;</span>
    value
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC00FF; font-weight:bold;">Object</span>
  <span style="color:#9966CC; font-weight:bold;">include</span> ReturningStrikesBack
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/26/returning-is-dead-use-tap/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/26/returning-is-dead-use-tap/" />
	</item>
		<item>
		<title>Nginx+Passengerで、 / と /hoge に別々のRails appをデプロイする</title>
		<link>http://blog.udzura.jp/2010/07/08/deploying-apps-on-root-and-root_hoge-each/</link>
		<comments>http://blog.udzura.jp/2010/07/08/deploying-apps-on-root-and-root_hoge-each/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 05:10:18 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=491</guid>
		<description><![CDATA[単純に /hoge と /fuga に別々のアプリケーションをdeployするのなら、話は単純で、以下のチュートリアルのとおりなんですが。

3.2. Deploying to a sub URI

問題は passenger_base_uri に「/」を指定できないこと。
方針としては、「/」のアプリケーションと「/hoge」のアプリケーションは別々のポートで配備して、かつ「/」をデプロイした側から、リバースプロキシで「/hoge」に飛ばしてあげる、という感じです。Pound辺りと組み合わせてもいいんですが、Nginxだけで完結できます。


1
2
# base_uri対応の前準備(例)
ln -s /var/www/rails-apps/hoge/public /var/www/passenger/hoge


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
26
27
28
29
30
31
32
33
34
35
http &#123;
#....
    passenger_root /usr/lib/ruby/gems/1.8/gems/passenger-2.2.15;
    passenger_ruby /usr/bin/ruby1.8;
    server &#123; # for &#34;/&#34; setting
        listen 8080;
        server_name dev.local.udzura.jp;
  [...]]]></description>
			<content:encoded><![CDATA[<p>単純に /hoge と /fuga に別々のアプリケーションをdeployするのなら、話は単純で、以下のチュートリアルのとおりなんですが。</p>
<ul>
<li><a href="http://www.modrails.com/documentation/Users%20guide%20Nginx.html#deploying_rails_to_sub_uri">3.2. Deploying to a sub URI</a></li>
</ul>
<p>問題は <code>passenger_base_uri</code> に「/」を指定できないこと。</p>
<p>方針としては、「/」のアプリケーションと「/hoge」のアプリケーションは別々のポートで配備して、かつ「/」をデプロイした側から、リバースプロキシで「/hoge」に飛ばしてあげる、という感じです。<a href="http://www.apsis.ch/pound/">Pound</a>辺りと組み合わせてもいいんですが、Nginxだけで完結できます。</p>
<p><span id="more-491"></span></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;"><span style="color: #666666; font-style: italic;"># base_uri対応の前準備(例)</span>
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-s</span> <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>rails-apps<span style="color: #000000; font-weight: bold;">/</span>hoge<span style="color: #000000; font-weight: bold;">/</span>public <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>passenger<span style="color: #000000; font-weight: bold;">/</span>hoge</pre></td></tr></table></div>


<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
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">http <span style="color: #7a0874; font-weight: bold;">&#123;</span>
<span style="color: #666666; font-style: italic;">#....</span>
    passenger_root <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>ruby<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span><span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span>passenger-2.2.15;
    passenger_ruby <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby1.8;
    server <span style="color: #7a0874; font-weight: bold;">&#123;</span> <span style="color: #666666; font-style: italic;"># for &quot;/&quot; setting</span>
        listen <span style="color: #000000;">8080</span>;
        server_name dev.local.udzura.jp;
        passenger_enabled on;
        rails_env production;
        root <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>rails-apps<span style="color: #000000; font-weight: bold;">/</span>root-app<span style="color: #000000; font-weight: bold;">/</span>public;
        error_page  <span style="color: #000000;">404</span>              <span style="color: #000000; font-weight: bold;">/</span>404.html;
        error_page  <span style="color: #000000;">500</span> <span style="color: #000000;">502</span> <span style="color: #000000;">503</span> <span style="color: #000000;">504</span>  <span style="color: #000000; font-weight: bold;">/</span>error.html;
        location <span style="color: #000000; font-weight: bold;">/</span>hoge <span style="color: #7a0874; font-weight: bold;">&#123;</span>
            proxy_set_header X-Real-IP  <span style="color: #007800;">$remote_addr</span>;
            proxy_set_header Host <span style="color: #007800;">$host</span>:<span style="color: #007800;">$server_port</span>;
            <span style="color: #666666; font-style: italic;"># その他、継承したいヘッダーを追加</span>
            proxy_pass http:<span style="color: #000000; font-weight: bold;">//</span>127.0.0.1:<span style="color: #000000;">8081</span><span style="color: #000000; font-weight: bold;">/</span>hoge;
        <span style="color: #7a0874; font-weight: bold;">&#125;</span>
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
    server <span style="color: #7a0874; font-weight: bold;">&#123;</span> <span style="color: #666666; font-style: italic;"># for &quot;/hoge&quot; setting</span>
        listen <span style="color: #000000;">8081</span>;
        server_name dev.local.udzura.jp;
        <span style="color: #666666; font-style: italic;"># 8081番ポートへの直接アクセスを禁止</span>
        allow 127.0.0.1;
        deny  all;
        passenger_enabled on;
        rails_env production;
        root <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>passenger;
        passenger_base_uri <span style="color: #000000; font-weight: bold;">/</span>hoge;
        error_page  <span style="color: #000000;">404</span>              <span style="color: #000000; font-weight: bold;">/</span>hoge<span style="color: #000000; font-weight: bold;">/</span>404.html;
        error_page  <span style="color: #000000;">500</span> <span style="color: #000000;">502</span> <span style="color: #000000;">503</span> <span style="color: #000000;">504</span>  <span style="color: #000000; font-weight: bold;">/</span>hoge<span style="color: #000000; font-weight: bold;">/</span>500.html;
    <span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #666666; font-style: italic;">#....</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></td></tr></table></div>

<p>これで、「/」と「/hoge」とでは別のアプリケーションを参照してくれます。</p>
<h3>参考</h3>
<ul>
<li><a href="http://wiki.nginx.org/NginxHttpProxyModule">NginxHttpProxyModule</a></li>
<li><a href="http://www.modrails.com/documentation/Users%20guide%20Nginx.html#_configuring_phusion_passenger">Configuring Phusion Passenger</a></li>
<li><a href="http://wiki.nginx.org/NginxHttpCoreModule#Variables">使用可能な変数</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/08/deploying-apps-on-root-and-root_hoge-each/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/08/deploying-apps-on-root-and-root_hoge-each/" />
	</item>
		<item>
		<title>Ubuntuに、passenger-install-nginx-moduleした</title>
		<link>http://blog.udzura.jp/2010/07/06/passenger-install-nginx-module-on-ubuntu/</link>
		<comments>http://blog.udzura.jp/2010/07/06/passenger-install-nginx-module-on-ubuntu/#comments</comments>
		<pubDate>Tue, 06 Jul 2010 03:26:33 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[nginx]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=485</guid>
		<description><![CDATA[Ubuntuは、aptitudeでNginxが入るんだけど、Passenger対応しているわけではない。ビルド時に指定しないとPassengerのモジュールが組み込まれないから。
以下は、passenger対応させた上でinitスクリプトの登録までする手順。

１．ビルド＋インストール
gem経由でpassengerを入れる

1
sudo gem install passenger

passenger-install-nginx-moduleする。依存するパッケージは、apacheの時と比べて多くない。C++コンパイラぐらい。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
sudo passenger-install-nginx-module
&#160;
... # 以下が依存関係。通らないときは頑張って入れること
 * GNU C++ compiler... found at /usr/bin/g++
 * Ruby development headers... found
 * OpenSSL support for Ruby... found
 * RubyGems... found
 * Rake... found at /usr/bin/rake
 * rack... found
 * OpenSSL development headers... found
 * Zlib development headers... found
...
&#160;
Enter your choice &#40;1 or 2&#41; or press Ctrl-C to [...]]]></description>
			<content:encoded><![CDATA[<p>Ubuntuは、aptitudeでNginxが入るんだけど、Passenger対応しているわけではない。ビルド時に指定しないとPassengerのモジュールが組み込まれないから。</p>
<p>以下は、passenger対応させた上でinitスクリプトの登録までする手順。</p>
<p><span id="more-485"></span></p>
<h3>１．ビルド＋インストール</h3>
<p>gem経由でpassengerを入れる</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;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> passenger</pre></td></tr></table></div>

<p>passenger-install-nginx-moduleする。依存するパッケージは、apacheの時と比べて多くない。C++コンパイラぐらい。</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
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> passenger-install-nginx-module
&nbsp;
... <span style="color: #666666; font-style: italic;"># 以下が依存関係。通らないときは頑張って入れること</span>
 <span style="color: #000000; font-weight: bold;">*</span> GNU C++ compiler... found at <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span><span style="color: #c20cb9; font-weight: bold;">g++</span>
 <span style="color: #000000; font-weight: bold;">*</span> Ruby development headers... found
 <span style="color: #000000; font-weight: bold;">*</span> OpenSSL support <span style="color: #000000; font-weight: bold;">for</span> Ruby... found
 <span style="color: #000000; font-weight: bold;">*</span> RubyGems... found
 <span style="color: #000000; font-weight: bold;">*</span> Rake... found at <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>rake
 <span style="color: #000000; font-weight: bold;">*</span> rack... found
 <span style="color: #000000; font-weight: bold;">*</span> OpenSSL development headers... found
 <span style="color: #000000; font-weight: bold;">*</span> Zlib development headers... found
...
&nbsp;
Enter your choice <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000;">1</span> or <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> or press Ctrl-C to abort: <span style="color: #666666; font-style: italic;">#=&gt; 1</span>
...
&nbsp;
Please specify a prefix directory <span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #7a0874; font-weight: bold;">&#93;</span>: <span style="color: #666666; font-style: italic;">#=&gt; デフォルトのままでいいでしょう</span>
...
&nbsp;
<span style="color: #660033;">--------------------------------------------</span>
&nbsp;
Nginx with Passenger support was successfully installed.
...</pre></td></tr></table></div>

<h3>２．コンフィギュアー</h3>
<p>以下を設定する。</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;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #7a0874; font-weight: bold;">&#40;</span>gedit<span style="color: #000000; font-weight: bold;">|</span><span style="color: #c20cb9; font-weight: bold;">vi</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>conf<span style="color: #000000; font-weight: bold;">/</span>nginx.conf</pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="ini" style="font-family:monospace;">...
# init script的に必要なのでpid fileを指定
pid /var/run/nginx.pid<span style="color: #666666; font-style: italic;">;</span>
&nbsp;
# passenger_root 等は最初から設定済みになっている
...
# 
server <span style="">&#123;</span>
  listen <span style="">8080</span><span style="color: #666666; font-style: italic;">;</span>
  server_name dev.local.udzura.jp<span style="color: #666666; font-style: italic;">;</span>
  # publicを指定してね
  root /var/www/dev-app/public<span style="color: #666666; font-style: italic;">;</span>
  passenger_enabled on<span style="color: #666666; font-style: italic;">;</span>
  # 必要であれば
  rails_env development<span style="color: #666666; font-style: italic;">;</span>
  #rails_env production<span style="color: #666666; font-style: italic;">;</span>
  ...
  # tips: error_page とかも指定しとくとそれっぽい
<span style="">&#125;</span></pre></div></div>

<h3>３．イニット・スクリプトの作成</h3>
<ul>
<li><a href="http://wiki.nginx.org/Nginx-init-ubuntu">Ubuntu Nginx Init Script Nginx-init-ubuntu </a></li>
</ul>
<p>以上のサイトをコピペし、 <code>/etc/init.d/nginx-passenger</code> に保存しましょう。</p>
<p>変更箇所：</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">...
<span style="color: #007800;">DAEMON</span>=<span style="color: #000000; font-weight: bold;">/</span>opt<span style="color: #000000; font-weight: bold;">/</span>nginx<span style="color: #000000; font-weight: bold;">/</span>sbin<span style="color: #000000; font-weight: bold;">/</span>nginx
...
<span style="color: #007800;">NGINX_CONF_FILE</span>=<span style="color: #ff0000;">&quot;/opt/nginx/conf/nginx.conf&quot;</span>
...
<span style="color: #666666; font-style: italic;"># 万一、あなたがaptで入れたgemのバージョンをアップデートして、</span>
<span style="color: #666666; font-style: italic;"># そのせいで「gemが見つからない」とか言われてRailsが起動しない場合は、</span>
<span style="color: #666666; font-style: italic;"># 以下の魔法の一行で解決する可能性があります。</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">GEM_HOME</span>=<span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>gems<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">1.8</span>
...</pre></div></div>

<p>そして、</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;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">chmod</span> a+x <span style="color: #000000; font-weight: bold;">/</span>etc<span style="color: #000000; font-weight: bold;">/</span>init.d<span style="color: #000000; font-weight: bold;">/</span>nginx-passenger
<span style="color: #c20cb9; font-weight: bold;">sudo</span> update-rc.d <span style="color: #660033;">-f</span> nginx-passenger defaults</pre></td></tr></table></div>

<p>あと、ディレクトリ構成がDebianっぽくないので、そこは好みで自分で設定しましょう。</p>
<p>以上です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/06/passenger-install-nginx-module-on-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/06/passenger-install-nginx-module-on-ubuntu/" />
	</item>
		<item>
		<title>[Ruby]timeoutを使うときは、明示的にTimeout::Errorを捕捉しなければならない</title>
		<link>http://blog.udzura.jp/2010/07/01/ruby-timeout-tips/</link>
		<comments>http://blog.udzura.jp/2010/07/01/ruby-timeout-tips/#comments</comments>
		<pubDate>Thu, 01 Jul 2010 06:47:17 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=480</guid>
		<description><![CDATA[
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
require 'timeout'
require 'net/http'
&#160;
begin
  #raise RuntimeError
  timeout&#40;0.5&#41; do
    Net::HTTP.get&#40;&#34;twitter.com&#34;, &#34;/hyper/heavy/page&#34;, 80&#41;
  end
rescue =&#62; e
  puts &#34;generic exception!&#34;
  puts e.class, e.message
rescue Timeout::Error =&#62; e
  puts &#34;timeout!&#34;
  puts e.class, e.message
end

コメントそのまま

timeout!
Timeout::Error
execution expired


コメントを外すと

generic exception!
RuntimeError
RuntimeError


参考

http://www.ruby-lang.org/ja/man/html/TimeoutError.html（親クラスがInterruptな件）
http://blog.goo.ne.jp/j_adversaria/e/0ad829ee8a1b313c73c5320987f98326

]]></description>
			<content:encoded><![CDATA[
<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
</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;">'timeout'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'net/http'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">begin</span>
  <span style="color:#008000; font-style:italic;">#raise RuntimeError</span>
  timeout<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">0.5</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;">Net::HTTP</span>.<span style="color:#9900CC;">get</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;twitter.com&quot;</span>, <span style="color:#996600;">&quot;/hyper/heavy/page&quot;</span>, <span style="color:#006666;">80</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;generic exception!&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> e.<span style="color:#9966CC; font-weight:bold;">class</span>, e.<span style="color:#9900CC;">message</span>
<span style="color:#9966CC; font-weight:bold;">rescue</span> <span style="color:#6666ff; font-weight:bold;">Timeout::Error</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> e
  <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;timeout!&quot;</span>
  <span style="color:#CC0066; font-weight:bold;">puts</span> e.<span style="color:#9966CC; font-weight:bold;">class</span>, e.<span style="color:#9900CC;">message</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h3>コメントそのまま</h3>
<blockquote><pre>
timeout!
Timeout::Error
execution expired
</pre>
</blockquote>
<h3>コメントを外すと</h3>
<blockquote><pre>
generic exception!
RuntimeError
RuntimeError
</pre>
</blockquote>
<h3>参考</h3>
<ul>
<li><a href="http://www.ruby-lang.org/ja/man/html/TimeoutError.html">http://www.ruby-lang.org/ja/man/html/TimeoutError.html</a>（親クラスが<strong>Interrupt</strong>な件）</li>
<li><a href="http://blog.goo.ne.jp/j_adversaria/e/0ad829ee8a1b313c73c5320987f98326">http://blog.goo.ne.jp/j_adversaria/e/0ad829ee8a1b313c73c5320987f98326</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/07/01/ruby-timeout-tips/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/07/01/ruby-timeout-tips/" />
	</item>
		<item>
		<title>[Rails]url_forで後ろに何か「#」で始まる奴をつける</title>
		<link>http://blog.udzura.jp/2010/06/18/rails-anchor-with-url_for/</link>
		<comments>http://blog.udzura.jp/2010/06/18/rails-anchor-with-url_for/#comments</comments>
		<pubDate>Fri, 18 Jun 2010 03:53:54 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=454</guid>
		<description><![CDATA[http://udzura.jp/index.html#hoge みたいな後ろの「#hoge」を、url_forで追加する。
:anchor と言うオプションをつける。

http://api.rubyonrails.org/classes/ActionController/Base.html#M000455


1
2
p url_for :controller =&#62; 'udzura', :action =&#62; 'bird', :format =&#62; 'html', :anchor =&#62; 'para2'
#=&#62; '/udzura/bird.html#para2'

あの「#anchor」には「フラグメント識別子」と言う立派な名前があるのだが、まったく普及してなくて通じないのでこの名前には実質意味が無い。「アンカー」って言うとアンカータグみたいだし。。。むずかしいよ。。。
あと、:anchorに限らず他のurl_for向けオプション（:hostとか）に使われているパラメータ名も、普通のQUERY_STRINGなURLパラメータ名に使わない方がいいんじゃないかと思ったよ。何かすごい不自由な日本語になった。要するに params[:anchor] みたいなことが起こらない方がいいと思う。
]]></description>
			<content:encoded><![CDATA[<p>http://udzura.jp/index.html#hoge みたいな後ろの「#hoge」を、url_forで追加する。</p>
<p><code>:anchor</code> と言うオプションをつける。</p>
<ul>
<li><a href="http://api.rubyonrails.org/classes/ActionController/Base.html#M000455">http://api.rubyonrails.org/classes/ActionController/Base.html#M000455</a></li>
</ul>

<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;"><span style="color:#CC0066; font-weight:bold;">p</span> url_for <span style="color:#ff3333; font-weight:bold;">:controller</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'udzura'</span>, <span style="color:#ff3333; font-weight:bold;">:action</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'bird'</span>, <span style="color:#ff3333; font-weight:bold;">:format</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'html'</span>, <span style="color:#ff3333; font-weight:bold;">:anchor</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'para2'</span>
<span style="color:#008000; font-style:italic;">#=&gt; '/udzura/bird.html#para2'</span></pre></td></tr></table></div>

<p>あの「#anchor」には「フラグメント識別子」と言う立派な名前があるのだが、まったく普及してなくて通じないのでこの名前には実質意味が無い。「アンカー」って言うとアンカータグみたいだし。。。むずかしいよ。。。</p>
<p>あと、<code>:anchor</code>に限らず他のurl_for向けオプション（<code>:host</code>とか）に使われているパラメータ名も、普通のQUERY_STRINGなURLパラメータ名に使わない方がいいんじゃないかと思ったよ。何かすごい不自由な日本語になった。要するに <code>params[:anchor]</code> みたいなことが起こらない方がいいと思う。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/06/18/rails-anchor-with-url_for/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/06/18/rails-anchor-with-url_for/" />
	</item>
		<item>
		<title>sax-machineを使ってみた / RESTでXMLなAPIを簡単利用</title>
		<link>http://blog.udzura.jp/2010/05/27/usage-of-sax-machine-against-rest-xml-api/</link>
		<comments>http://blog.udzura.jp/2010/05/27/usage-of-sax-machine-against-rest-xml-api/#comments</comments>
		<pubDate>Thu, 27 May 2010 13:17:04 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=407</guid>
		<description><![CDATA[最初に結論
XMLで結果を吐き出すREST APIをRubyで用いたいなら、かなり役立つんじゃないかと思います。
sax-machineって？
XMLを、例えば普通にNokogiriなんかでパースすると、

1
2
api = Nokogiri::XML.parse&#40;open&#40;URI.encode &#34;http://ws.audioscrobbler.com/2.0/?method=track.search&#38;track=夏&#38;api_key=#{API_KEY}&#38;limit=5&#34;&#41;&#41;
puts api.search&#40;&#34;/lfm/results/trackmatches/track[1]/name&#34;&#41;.inner_text

みたいなすごいことになるので、せめて

1
puts api.tracks&#91;0&#93;.name

みたいには書けないか？　そんな夢を簡単に叶えるのが sax-machine ライブラリです。

準備
gemを入れる。Nokogiriに依存するので、環境によってはまずlibxml2-dev(el)とlibxslt-dev(el)も入れないといけません。

1
2
sudo aptitude install libxml2-dev libxslt-dev # e.g. Ubuntu/Debian
sudo gem install sax-machine

今回はLast.fm APIで試すので、Last.fmにユーザ登録し、API KEYを取得する。API Accountへ。
コード

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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
require 'rubygems'
require 'sax-machine'
require 'open-uri'
&#160;
module Lastfm
  class Track
    include SAXMachine
    element :name
    element :artist
    element :url
    element :streamable
  [...]]]></description>
			<content:encoded><![CDATA[<h3>最初に結論</h3>
<p>XMLで結果を吐き出すREST APIをRubyで用いたいなら、かなり役立つんじゃないかと思います。</p>
<h3>sax-machineって？</h3>
<p>XMLを、例えば普通にNokogiriなんかでパースすると、</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;">api = <span style="color:#6666ff; font-weight:bold;">Nokogiri::XML</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">URI</span>.<span style="color:#9900CC;">encode</span> <span style="color:#996600;">&quot;http://ws.audioscrobbler.com/2.0/?method=track.search&amp;track=夏&amp;api_key=#{API_KEY}&amp;limit=5&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> api.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;/lfm/results/trackmatches/track[1]/name&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">inner_text</span></pre></td></tr></table></div>

<p>みたいなすごいことになるので、せめて</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;">puts</span> api.<span style="color:#9900CC;">tracks</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">name</span></pre></td></tr></table></div>

<p>みたいには書けないか？　そんな夢を簡単に叶えるのが <a href="http://github.com/pauldix/sax-machine">sax-machine</a> ライブラリです。</p>
<p><span id="more-407"></span></p>
<h3>準備</h3>
<p>gemを入れる。Nokogiriに依存するので、環境によってはまずlibxml2-dev(el)とlibxslt-dev(el)も入れないといけません。</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;"><span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> <span style="color: #c20cb9; font-weight: bold;">install</span> libxml2-dev libxslt-dev <span style="color: #666666; font-style: italic;"># e.g. Ubuntu/Debian</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> gem <span style="color: #c20cb9; font-weight: bold;">install</span> sax-machine</pre></td></tr></table></div>

<p>今回はLast.fm APIで試すので、Last.fmにユーザ登録し、API KEYを取得する。<a href="http://www.lastfm.jp/api/account">API Account</a>へ。</p>
<h3>コード</h3>

<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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
</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;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'sax-machine'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'open-uri'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">module</span> Lastfm
  <span style="color:#9966CC; font-weight:bold;">class</span> Track
    <span style="color:#9966CC; font-weight:bold;">include</span> SAXMachine
    element <span style="color:#ff3333; font-weight:bold;">:name</span>
    element <span style="color:#ff3333; font-weight:bold;">:artist</span>
    element <span style="color:#ff3333; font-weight:bold;">:url</span>
    element <span style="color:#ff3333; font-weight:bold;">:streamable</span>
    element <span style="color:#ff3333; font-weight:bold;">:listeners</span>
    <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;small&quot;</span>, <span style="color:#996600;">&quot;medium&quot;</span>, <span style="color:#996600;">&quot;large&quot;</span>, <span style="color:#996600;">&quot;extralarge&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>size<span style="color:#006600; font-weight:bold;">|</span>
      element <span style="color:#ff3333; font-weight:bold;">:image</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;image_#{size}&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:with</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:size <span style="color:#006600; font-weight:bold;">=&gt;</span> size<span style="color:#006600; font-weight:bold;">&#125;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">class</span> TrackInfo
    <span style="color:#9966CC; font-weight:bold;">include</span> SAXMachine
    element <span style="color:#996600;">&quot;opensearch:Query&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:value</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:searchTerms</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:query</span>
    element <span style="color:#996600;">&quot;opensearch:Query&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:value</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:role</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:query</span>
    element <span style="color:#996600;">&quot;opensearch:totalResults&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:total_results</span>
    element <span style="color:#996600;">&quot;opensearch:startIndex&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:start</span>
    element <span style="color:#996600;">&quot;opensearch:itemsPerPage&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:per_page</span>
    elements <span style="color:#ff3333; font-weight:bold;">:track</span>, <span style="color:#ff3333; font-weight:bold;">:as</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:tracks</span>, <span style="color:#ff3333; font-weight:bold;">:class</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> Track
&nbsp;
    <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0000FF; font-weight:bold;">self</span>
      API_KEY  = <span style="color:#996600;">&quot;YOUR_API_KEY&quot;</span>
      PER_PAGE = <span style="color:#006666;">5</span>
      <span style="color:#9966CC; font-weight:bold;">def</span> search<span style="color:#006600; font-weight:bold;">&#40;</span>query, options=<span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#008000; font-style:italic;"># 検索インタフェース</span>
        page = <span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:page</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#006666;">1</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_i</span>
        per_page = <span style="color:#006600; font-weight:bold;">&#40;</span>options<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:per_page</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> PER_PAGE<span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_i</span>
        url = <span style="color:#CC00FF; font-weight:bold;">URI</span>.<span style="color:#9900CC;">encode</span><span style="color:#006600; font-weight:bold;">&#40;</span> <span style="color:#996600;">&quot;http://ws.audioscrobbler.com/2.0/?&quot;</span> <span style="color:#006600; font-weight:bold;">+</span>
          <span style="color:#996600;">&quot;method=track.search&amp;&quot;</span> <span style="color:#006600; font-weight:bold;">+</span> 
          <span style="color:#996600;">&quot;track=#{query}&amp;&quot;</span> <span style="color:#006600; font-weight:bold;">+</span> 
          <span style="color:#996600;">&quot;api_key=#{API_KEY}&amp;&quot;</span> <span style="color:#006600; font-weight:bold;">+</span>
          <span style="color:#996600;">&quot;limit=#{per_page}&amp;&quot;</span> <span style="color:#006600; font-weight:bold;">+</span>
          <span style="color:#996600;">&quot;page=#{page}&quot;</span> <span style="color:#006600; font-weight:bold;">&#41;</span>
        parse<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span>url<span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
lastfm = <span style="color:#6666ff; font-weight:bold;">Lastfm::TrackInfo</span>.<span style="color:#9900CC;">search</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;夏&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#008000; font-style:italic;">#=&gt; #&lt;Lastfm::TrackInfo:0x7f8d664d97e8&gt;</span>
lastfm.<span style="color:#9900CC;">total_results</span>
<span style="color:#008000; font-style:italic;">#=&gt; 380</span>
lastfm.<span style="color:#9900CC;">tracks</span>.<span style="color:#9900CC;">count</span>
<span style="color:#008000; font-style:italic;">#=&gt; 5</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> lastfm.<span style="color:#9900CC;">tracks</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">name</span>
<span style="color:#008000; font-style:italic;"># 夏・コイ</span>
<span style="color:#CC0066; font-weight:bold;">puts</span> lastfm.<span style="color:#9900CC;">tracks</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">artist</span>
<span style="color:#008000; font-style:italic;"># いきものがかり</span></pre></td></tr></table></div>

<p><a href="http://www.lastfm.jp/api/show?service=286">Last.fmのAPI解説ページ</a>からたどれる実際のXMLと、比較するといいと思います。</p>
<h3>sax-machineでやれること</h3>
<ul>
<li>要素の中身を取得する。</li>
<li>要素の中身を別名をつけて取得する。</li>
<li>要素の属性を取得する。それも、別々に取れる。</li>
<li>特定の属性を持った要素の中身を取得する。</li>
<li>複数の要素を取得する。</li>
<li>入れ子された要素については、新たな、SAXMachineをincludeしたクラスに変換できる。</li>
<li>不要な要素は無視できる。</li>
</ul>
<p>なお、複数要素取得については、</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hoge</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fuga</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>も、</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;xml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;hoge</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;fuga</span> <span style="color: #000000; font-weight: bold;">/&gt;</span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
    <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>......<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/item<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
  <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/list<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/xml<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p>も、同じように <strong><code>elements :item, :as => :items</code></strong> で取得可能です。SAXだから階層の深さが関係ない（、ということのはず）です。</p>
<p>あと、要素の中身をIntegerにするとかDateTimeにするとかはできません。。</p>
<p>かなり使いでがいいです。まだRuby向けライブラリができてないような、REST/XMLベースのAPIを使う際には、試してみてはいかがでしょう？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/05/27/usage-of-sax-machine-against-rest-xml-api/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/05/27/usage-of-sax-machine-against-rest-xml-api/" />
	</item>
		<item>
		<title>PHPユーザ層とRubyユーザ層の違い</title>
		<link>http://blog.udzura.jp/2010/05/26/difference-between-php-users-and-ruby-users/</link>
		<comments>http://blog.udzura.jp/2010/05/26/difference-between-php-users-and-ruby-users/#comments</comments>
		<pubDate>Wed, 26 May 2010 02:52:49 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=402</guid>
		<description><![CDATA[※タイトルは釣りです！
この間会社の人たちと話していて、PHPにはWordPressやSugarCRM、あと思いつく限りPukiWiki、EcCube、OpenPNE、Moodle、そしてたくさんのCMSなどなど、優れた「アプリケーション」が沢山あるのに、Rubyにはそれらのカウンターパートがあまり無いよね、という話題になった（Railsブーム立ち上がりの時は雨後の筍のように出現したが、でも現在では、まともにメンテナンスされているのはTypo(ブログ)、Radiant CMS(CMS)、Redmine(BTS)ぐらいじゃないか？）。
勝手に思いついたのは、言語の特性に根ざした言語ユーザの行動の違いで、

PHP

言語仕様自体をハックし辛い
→ 言語自体の改善より、それを使って何ができるか？　に目が向く
→ 実用的アプリケーションが増える


Ruby

言語自体を拡張したりハックするのがすごく楽しい
→ 言語自体を便利にするライブラリ、フレームワークが増える
→ 実用アプリケーションにまでリソースが回ってない？



あと感じてるのは、偏見とか僕の観測範囲の偏りとかもあるかもしれないが、「デザイン出身だけどプログラムも書く ＝ PHPで書く」みたいな流れが存在するような気がして仕方ない。だって、上に挙げたPHPアプリケーションはいずれもリッチなデザインとUIを持っているわけで。。
個人的には、一緒にJavaScriptやActionScriptをやるような人だったら、Rubyのブロックの使い方はlambdaやクロージャの使い方の参考になる（僕とかはRubyやり始めるまでクロージャを理解しきれていなかった）と思うので、Rubyをやった方がメリットがあるんじゃないかなーと思う。大体、これだけWebフレームワーク全盛の時代で、どの言語ならWebアプリケーションが書きやすいとかもはや存在しないでしょう。
あと、リッチなUIを持ったRuby製アプリケーションが沢山出てほしいな、とも思うので、デザイン畑の人たちにRubyがもっと広まってほしいと思います。
落ちは無いし何か炎上しそう……。
]]></description>
			<content:encoded><![CDATA[<p>※タイトルは釣りです！</p>
<p>この間会社の人たちと話していて、PHPには<a href="http://ja.wordpress.org/">WordPress</a>や<a href="http://www.sugarcrm.com/crm/">SugarCRM</a>、あと思いつく限り<a href="http://pukiwiki.sourceforge.jp/">PukiWiki</a>、<a href="http://www.ec-cube.net/download/index.php">EcCube</a>、<a href="http://www.openpne.jp/">OpenPNE</a>、<a href="http://moodle.org/">Moodle</a>、そしてたくさんのCMSなどなど、優れた「アプリケーション」が沢山あるのに、Rubyにはそれらのカウンターパートがあまり無いよね、という話題になった（Railsブーム立ち上がりの時は雨後の筍のように出現したが、でも現在では、まともにメンテナンスされているのは<a href="http://typosphere.org/">Typo(ブログ)</a>、<a href="http://radiantcms.org/">Radiant CMS(CMS)</a>、<a href="http://www.redmine.org/">Redmine(BTS)</a>ぐらいじゃないか？）。</p>
<p>勝手に思いついたのは、言語の特性に根ざした言語ユーザの行動の違いで、</p>
<ul>
<li>PHP
<ul>
<li>言語仕様自体をハックし辛い</li>
<li>→ 言語自体の改善より、それを使って何ができるか？　に目が向く</li>
<li>→ 実用的アプリケーションが増える</li>
</ul>
</li>
<li>Ruby
<ul>
<li>言語自体を拡張したりハックするのがすごく楽しい</li>
<li>→ 言語自体を便利にするライブラリ、フレームワークが増える</li>
<li>→ 実用アプリケーションにまでリソースが回ってない？</li>
</ul>
</li>
</ul>
<p>あと感じてるのは、偏見とか僕の観測範囲の偏りとかもあるかもしれないが、「デザイン出身だけどプログラムも書く ＝ PHPで書く」みたいな流れが存在するような気がして仕方ない。だって、上に挙げたPHPアプリケーションはいずれもリッチなデザインとUIを持っているわけで。。</p>
<p>個人的には、一緒にJavaScriptやActionScriptをやるような人だったら、Rubyのブロックの使い方はlambdaやクロージャの使い方の参考になる（僕とかはRubyやり始めるまでクロージャを理解しきれていなかった）と思うので、Rubyをやった方がメリットがあるんじゃないかなーと思う。大体、これだけWebフレームワーク全盛の時代で、どの言語ならWebアプリケーションが書きやすいとかもはや存在しないでしょう。</p>
<p>あと、リッチなUIを持ったRuby製アプリケーションが沢山出てほしいな、とも思うので、デザイン畑の人たちにRubyがもっと広まってほしいと思います。</p>
<p>落ちは無いし何か炎上しそう……。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/05/26/difference-between-php-users-and-ruby-users/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/05/26/difference-between-php-users-and-ruby-users/" />
	</item>
		<item>
		<title>Last.fmとTwitterを連携させてみた / &#8220;bolbotsbot&#8221; 紹介</title>
		<link>http://blog.udzura.jp/2010/05/25/about-bolbotsbot/</link>
		<comments>http://blog.udzura.jp/2010/05/25/about-bolbotsbot/#comments</comments>
		<pubDate>Tue, 25 May 2010 09:14:41 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[＜音楽＞]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=394</guid>
		<description><![CDATA[技術と全然関係ない話から始めるが、筆者うづらはUSローファイとカンタベリ系プログレが好きで、その両方のテイストを持った稀有な日本のバンド「箱庭の室内楽 (ex. bolbots)」を応援している。
なので、彼らの曲をLast.fmから引っ張って勝手にTwitterにポストするBot Programを作成しました。
使用したライブラリ

Twitter/OAuth

OAuthに必要な各種情報の取得は、「TwitterのbotをOAuthに対応させる」を参考にしました。
Twitter with OAuthのサンプルは普通に公式から。


Scrobbler

Scrobbler by John Nunemaker
APIが洗練されていて非常にいいライブラリだと思う。



ソース


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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#!/usr/bin/env ruby
# -*- coding: utf-8 -*-
require 'rubygems'
require 'optparse'
require 'yaml'
require 'securerandom'
require 'scrobbler'
require 'oauth'
require 'twitter'
&#160;
class Array
  def random_pick
    self&#91;SecureRandom.random_number&#40;self.size&#41;&#93;
  end
end
&#160;
class BolbotsBot
  class &#60;&#60; self
    def post
      self.new.post
    end
  end
&#160;
  def [...]]]></description>
			<content:encoded><![CDATA[<p>技術と全然関係ない話から始めるが、筆者うづらはUSローファイとカンタベリ系プログレが好きで、その両方のテイストを持った稀有な日本のバンド「<a href="http://hakoniwano.com/">箱庭の室内楽 (ex. bolbots)</a>」を応援している。</p>
<p>なので、彼らの曲をLast.fmから引っ張って勝手にTwitterにポストするBot Programを作成しました。</p>
<h3>使用したライブラリ</h3>
<ul>
<li>Twitter/OAuth
<ul>
<li>OAuthに必要な各種情報の取得は、「<a href="http://d.hatena.ne.jp/shibason/20090802/1249204953" target="_blank">TwitterのbotをOAuthに対応させる</a>」を参考にしました。</li>
<li>Twitter with OAuthのサンプルは<a href="http://twitter.rubyforge.org/">普通に公式から。</a></li>
</ul>
</li>
<li>Scrobbler
<ul>
<li><a href="http://scrobbler.rubyforge.org/">Scrobbler by John Nunemaker</a></li>
<li>APIが洗練されていて非常にいいライブラリだと思う。</li>
</ul>
</li>
</ul>
<h3>ソース</h3>
<p><span id="more-394"></span></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
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
<span style="color:#008000; font-style:italic;"># -*- coding: utf-8 -*-</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'optparse'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'yaml'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'securerandom'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'scrobbler'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'oauth'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'twitter'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#CC0066; font-weight:bold;">Array</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> random_pick
    <span style="color:#0000FF; font-weight:bold;">self</span><span style="color:#006600; font-weight:bold;">&#91;</span>SecureRandom.<span style="color:#9900CC;">random_number</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">size</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> BolbotsBot
  <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#0000FF; font-weight:bold;">self</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> post
      <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">new</span>.<span style="color:#9900CC;">post</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize
    <span style="color:#0066ff; font-weight:bold;">@conf_file</span> = <span style="color:#0000FF; font-weight:bold;">nil</span>
    opt = OptionParser.<span style="color:#9900CC;">new</span>
    opt.<span style="color:#9900CC;">on</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'-c CONF'</span>, <span style="color:#996600;">'--config=CONF'</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>v<span style="color:#006600; font-weight:bold;">|</span> <span style="color:#0066ff; font-weight:bold;">@conf_file</span> = v <span style="color:#006600; font-weight:bold;">&#125;</span>
    opt.<span style="color:#9900CC;">parse</span>!<span style="color:#006600; font-weight:bold;">&#40;</span>ARGV<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@CONF</span> = <span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">load_file</span><span style="color:#006600; font-weight:bold;">&#40;</span>@conf_file <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span>$<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">&quot;config.yml&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> post
    client.<span style="color:#9900CC;">update</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;今日の一曲: #{track.name} - #{track.artist} #{track.url}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;ポスト成功: #{track.name} - #{track.artist}&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
private
  <span style="color:#9966CC; font-weight:bold;">def</span> client
    <span style="color:#0066ff; font-weight:bold;">@client</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#6666ff; font-weight:bold;">Twitter::Base</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>oauth<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> oauth
    <span style="color:#9966CC; font-weight:bold;">unless</span> <span style="color:#0066ff; font-weight:bold;">@oauth</span>
      <span style="color:#0066ff; font-weight:bold;">@oauth</span> = <span style="color:#6666ff; font-weight:bold;">Twitter::OAuth</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>@CONF<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:consumer_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#0066ff; font-weight:bold;">@CONF</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:consumer_secret</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#0066ff; font-weight:bold;">@oauth</span>.<span style="color:#9900CC;">authorize_from_access</span><span style="color:#006600; font-weight:bold;">&#40;</span>@CONF<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_token</span><span style="color:#006600; font-weight:bold;">&#93;</span>, <span style="color:#0066ff; font-weight:bold;">@CONF</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:access_secret</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#0066ff; font-weight:bold;">@oauth</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> track
    <span style="color:#0066ff; font-weight:bold;">@track</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#6666ff; font-weight:bold;">Scrobbler::Artist</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>artists.<span style="color:#9900CC;">random_pick</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">top_tracks</span>.<span style="color:#9900CC;">random_pick</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> artists
    <span style="color:#0066ff; font-weight:bold;">@CONF</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:artists</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span> == $<span style="color:#006666;">0</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&amp;&amp;</span> BolbotsBot.<span style="color:#9900CC;">post</span></pre></td></tr></table></div>

<p>ライブラリの力で意外と60行で済んだ。</p>
<p>設定ファイルは、例えば以下のようにして、「config.yml」と言う名前でプログラムと同じフォルダに置くか、「-c」オプションで指定する。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code"><pre class="yaml" style="font-family:monospace;">:consumer_token:  &quot;hogehoge&quot;
:consumer_secret: &quot;fugafuga&quot;
:access_token:    &quot;foo-bar&quot;
:access_secret:   &quot;buzbuz&quot;
:artists:
  - &quot;bolbots&quot;
  - &quot;箱庭の室内楽&quot;</pre></td></tr></table></div>

<h3>Usage</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">chmod</span> a+x bolbotsbot.rb
.<span style="color: #000000; font-weight: bold;">/</span>bolbotsbot.rb <span style="color: #660033;">-c</span> bolbots.yml
<span style="color: #666666; font-style: italic;">#=&gt; ポスト成功: Deadwinter - Bolbots</span></pre></td></tr></table></div>

<script type="text/javascript" src="http://tweetpaste.thingamaweb.com/js/141540/"></script><noscript><iframe name="tp141540" id="tp141540" width="500" height="200" frameborder="0" src="http://tweetpaste.thingamaweb.com/embed/141540/" style="overflow: hidden; display: block; width: 500px; height: 200px;"><p><a href="http://tweetpaste.thingamaweb.com/embed/141540/" target="_blank">View __udzura__&rsquo;s tweet</a></p></iframe></noscript>
<p>ちなみに、設定ファイルの書式で分かると思うけれど、例えば以下のような sogabe.yml ファイルを作って指定すれば曽我部恵一ボットになります。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="yaml" style="font-family:monospace;">:consumer_token:  &quot;hogehoge&quot;
:consumer_secret: &quot;fugafuga&quot;
:access_token:    &quot;foo-bar&quot;
:access_secret:   &quot;buzbuz&quot;
:artists:
  - &quot;曽我部恵一&quot;
  - &quot;曽我部恵一BAND&quot;
  - &quot;サニーデイ・サービス&quot;</pre></td></tr></table></div>

<p>皆さんも自分勝手なBotを作るといいと思うよ。</p>
<h3>免責事項</h3>
<ul>
<li>テスト書いてない</li>
<li>例外処理書いてない</li>
</ul>
<h3>ToDo（思いつき）</h3>
<ul>
<li>Scrobblerライブラリをもっと紹介してみる</li>
<li>bolbotsbot_spec.rbを作成すればちょうどいいRSpecの教材にならないかな。無理かな</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/05/25/about-bolbotsbot/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/05/25/about-bolbotsbot/" />
	</item>
		<item>
		<title>Ruby+heroku.comを利用して、コストと手間をなるべくかけずにサイトを作る: draft</title>
		<link>http://blog.udzura.jp/2010/05/10/how-long-way-to-go-with-smallest-cost__draft/</link>
		<comments>http://blog.udzura.jp/2010/05/10/how-long-way-to-go-with-smallest-cost__draft/#comments</comments>
		<pubDate>Mon, 10 May 2010 10:14:50 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=390</guid>
		<description><![CDATA[目標
小規模サイト（中小企業のコーポレートサイトを想定）をほとんどタダみたいなコストで、なるべく手間をかけずに作れないか？
方法論
前提
Rubyを使いたい。
ホスティング
heroku.comを利用する。

Pros

No Cost(&#8221;Blossom&#8221; Planならば)
Ruby使用可能
デプロイが楽 &#8211; git
最低限のプランとはいえ、クラウドなので可用性は保証される
独自ドメインも使える（「年」額で500円とかなので、ここは買ってしまうのがいいだろう）




Cons

Rubyしか使えない
バックエンドはほとんど手をかけられない
&#8220;Blossom&#8221;で使えるDB容量はわずか「5MB」

月15ドルで20GBにアップグレードできるけど、その額を払うならVPSを使いたくなる。。


レイテンシは時々気になる程度



CMS
Ruby on Rails製の二つのアプリケーションが選択肢になる。

Radiant CMS

多機能CMS
割とカスタマイズできる
日本語化はそこそこ（それも、0.9.0限定）
CMSで使うタグの追加程度なら楽にできそう
エクステンション豊富
0.9.0はまだ安定感にかける（特にエクステンションの対応状況）




Typo

ブログ
実はテーマが豊富
まだ試していないけど、機能的に充分じゃないか？



まとめ
5MBの制約があるので、あまりに大規模だったりあまりに画像を使用するサイトは無理だと思う。でも、普通にコーポレートサイトなら出来るんじゃない？　って思ったりもする。5MBつっても素材とかは入らないわけだから。。
GAEとかの方が楽だったりするんかいなー。。。とも思うけど。RadiantやTypoはある程度ハックする前提で。
次回からは、実際に構築してみる。と言うか、その前にTypoを試したりRadiantを試した感想とかを書く。
]]></description>
			<content:encoded><![CDATA[<h3>目標</h3>
<p>小規模サイト（中小企業のコーポレートサイトを想定）をほとんどタダみたいなコストで、なるべく手間をかけずに作れないか？</p>
<h3>方法論</h3>
<h3>前提</h3>
<p>Rubyを使いたい。</p>
<h4>ホスティング</h4>
<p><a href="http://heroku.com/">heroku.com</a>を利用する。</p>
<ul>
<li>Pros
<ul>
<li>No Cost(&#8221;Blossom&#8221; Planならば)</li>
<li>Ruby使用可能</li>
<li>デプロイが楽 &#8211; git</li>
<li>最低限のプランとはいえ、クラウドなので可用性は保証される</li>
<li>独自ドメインも使える（「年」額で500円とかなので、ここは買ってしまうのがいいだろう）</li>
</ul>
</li>
</ul>
<ul>
<li>Cons
<ul>
<li>Rubyしか使えない</li>
<li>バックエンドはほとんど手をかけられない</li>
<li>&#8220;Blossom&#8221;で使えるDB容量はわずか「5MB」
<ul>
<li>月15ドルで20GBにアップグレードできるけど、その額を払うならVPSを使いたくなる。。</li>
</ul>
</li>
<li>レイテンシは時々気になる程度</li>
</ul>
</li>
</ul>
<h4>CMS</h4>
<p>Ruby on Rails製の二つのアプリケーションが選択肢になる。</p>
<ul>
<li><a href="http://radiantcms.org/">Radiant CMS</a>
<ul>
<li>多機能CMS</li>
<li>割とカスタマイズできる</li>
<li>日本語化はそこそこ（それも、0.9.0限定）</li>
<li>CMSで使うタグの追加程度なら楽にできそう</li>
<li>エクステンション豊富</li>
<li>0.9.0はまだ安定感にかける（特にエクステンションの対応状況）</li>
</ul>
</li>
</ul>
<ul>
<li><a href="http://typosphere.org/">Typo</a>
<ul>
<li>ブログ</li>
<li><a href="http://typogarden.org/">実はテーマが豊富</a></li>
<li>まだ試していないけど、機能的に充分じゃないか？</li>
</ul>
</li>
</ul>
<h3>まとめ</h3>
<p>5MBの制約があるので、あまりに大規模だったりあまりに画像を使用するサイトは無理だと思う。でも、普通にコーポレートサイトなら出来るんじゃない？　って思ったりもする。5MBつっても素材とかは入らないわけだから。。</p>
<p>GAEとかの方が楽だったりするんかいなー。。。とも思うけど。RadiantやTypoはある程度ハックする前提で。</p>
<p>次回からは、実際に構築してみる。と言うか、その前にTypoを試したりRadiantを試した感想とかを書く。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/05/10/how-long-way-to-go-with-smallest-cost__draft/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/05/10/how-long-way-to-go-with-smallest-cost__draft/" />
	</item>
		<item>
		<title>Ubuntu 10.04(64bit)では何か知らんけどRubyODBCでエラーが出る</title>
		<link>http://blog.udzura.jp/2010/05/07/ubuntu-10-04-64bit-error-on-ruby-odbc/</link>
		<comments>http://blog.udzura.jp/2010/05/07/ubuntu-10-04-64bit-error-on-ruby-odbc/#comments</comments>
		<pubDate>Fri, 07 May 2010 03:27:01 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[DataBase]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=385</guid>
		<description><![CDATA[INTERN (0) [RubyODBC]Cannot allocate SQLHENV
とか言って接続できません。すげー困ってました。
The only thing that worked was 0.9995-1 from the archives.  I&#8217;m not sure  if it has ever been done but the best way to fix this regression might  be to use the older version.

https://bugs.launchpad.net/ubuntu/+source/libodbc-ruby/+bug/447523


LaunchPadではこう言っていて、僕もまったくその通りに思うので微妙なんですけど、hardy（！）のlibodbc-ruby1.8(0.9995-1)を入れることで解決しました。
（※ 一応、Ruby-ODBCの公式から0.9995を落としてコンパイルしても、同じエラーが出ました。。）

http://packages.ubuntu.com/hardy/libodbc-ruby1.8


1
2
wget http://kr.archive.ubuntu.com/ubuntu/pool/universe/libo/libodbc-ruby/libodbc-ruby1.8_0.9995-1_amd64.deb
sudo dpkg -i libodbc-ruby1.8_0.9995-1_amd64.deb

aptitudeで入れるunixodbc(-dev)や、gemのdbi、dbd-odbcには関係のないバグのようなので、その辺は普通に入れていいと思います。
あと、selectできることを確認しただけだったりするので。。。複雑なことをしようとするとやっぱり落ちるかも。
＊　＊　＊
そうそう、Ruby Enterprise Editionなら何の問題なく、最新版で接続できた、なんて情報が上記LaunchPadにはあります。僕は試してないですけど（環境が出来上がってる状態で、Ruby自体を切り替えるのは大変……）。
]]></description>
			<content:encoded><![CDATA[<blockquote><p><code>INTERN (0) [RubyODBC]Cannot allocate SQLHENV</code></p></blockquote>
<p>とか言って接続できません。すげー困ってました。</p>
<blockquote><p>The only thing that worked was 0.9995-1 from the archives.  I&#8217;m not sure  if it has ever been done but the best way to fix this regression might  be to use the older version.</p>
<ul>
<li><a href="https://bugs.launchpad.net/ubuntu/+source/libodbc-ruby/+bug/447523">https://bugs.launchpad.net/ubuntu/+source/libodbc-ruby/+bug/447523</a></li>
</ul>
</blockquote>
<p>LaunchPadではこう言っていて、僕もまったくその通りに思うので微妙なんですけど、hardy（！）のlibodbc-ruby1.8(0.9995-1)を入れることで解決しました。</p>
<p>（※ 一応、Ruby-ODBCの公式から0.9995を落としてコンパイルしても、同じエラーが出ました。。）</p>
<ul>
<li><a href="http://packages.ubuntu.com/hardy/libodbc-ruby1.8">http://packages.ubuntu.com/hardy/libodbc-ruby1.8</a></li>
</ul>

<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: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>kr.archive.ubuntu.com<span style="color: #000000; font-weight: bold;">/</span>ubuntu<span style="color: #000000; font-weight: bold;">/</span>pool<span style="color: #000000; font-weight: bold;">/</span>universe<span style="color: #000000; font-weight: bold;">/</span>libo<span style="color: #000000; font-weight: bold;">/</span>libodbc-ruby<span style="color: #000000; font-weight: bold;">/</span>libodbc-ruby1.8_0.9995-<span style="color: #000000;">1</span>_amd64.deb
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">dpkg</span> <span style="color: #660033;">-i</span> libodbc-ruby1.8_0.9995-<span style="color: #000000;">1</span>_amd64.deb</pre></td></tr></table></div>

<p>aptitudeで入れるunixodbc(-dev)や、gemのdbi、dbd-odbcには関係のないバグのようなので、その辺は普通に入れていいと思います。</p>
<p>あと、selectできることを確認しただけだったりするので。。。複雑なことをしようとするとやっぱり落ちるかも。</p>
<h3>＊　＊　＊</h3>
<p>そうそう、<a href="http://www.rubyenterpriseedition.com/">Ruby Enterprise Edition</a>なら何の問題なく、最新版で接続できた、なんて情報が上記LaunchPadにはあります。僕は試してないですけど（環境が出来上がってる状態で、Ruby自体を切り替えるのは大変……）。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/05/07/ubuntu-10-04-64bit-error-on-ruby-odbc/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/05/07/ubuntu-10-04-64bit-error-on-ruby-odbc/" />
	</item>
		<item>
		<title>Capistrano力を上げよう</title>
		<link>http://blog.udzura.jp/2010/04/07/enhance-your-capistrano-skill/</link>
		<comments>http://blog.udzura.jp/2010/04/07/enhance-your-capistrano-skill/#comments</comments>
		<pubDate>Wed, 07 Apr 2010 08:01:11 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=350</guid>
		<description><![CDATA[標記の力を高められるかもしれないいくつかのTipsを。
なお、あまりRailsと関係ないデプロイでも使えるTips多めです。CapstranoはRailsとの連携以外でも強力なデプロイツール。もっともっと評価されてもいいですね。

Capistrano::CLI.ui.ask でデフォルト値を設定する

1
2
3
4
set :user do
  default_user = `whoami`.chomp
  Capistrano::CLI.ui.ask&#40;&#34;[cap] SSH User: &#34;&#41; &#123;&#124;q&#124; q.default = default_user&#125;
end

Capistrano::CLI.ui.ask では、デフォルトではHighLineのaskを呼び出します。なので、そこで使用できるオプションがすべて使えます。
公式Rdocがわかりやすいです。
Capistrano::CLI.ui.ask でバリデーションする 

1
2
3
Capistrano::CLI.ui.ask&#40;&#34;Choose your environment: &#34;&#41; do &#124;q&#124;
  q.in = &#91;&#34;development&#34;, &#34;test&#34;, &#34;production&#34;&#93;
end

ハッシュの key を入力させて、変数代入時にはvalueに変換する 

1
2
3
4
5
6
7
8
envs = &#123;
  &#34;1&#34; =&#62; 'development', &#34;2&#34; =&#62; 'test', &#34;3&#34; =&#62; 'production'
&#125;
set :env do
  str = &#34;[cap] Choose environment #{envs.keys.sort.map{&#124;v&#124; [...]]]></description>
			<content:encoded><![CDATA[<p>標記の力を高められるかもしれないいくつかのTipsを。</p>
<p>なお、あまりRailsと関係ないデプロイでも使えるTips多めです。CapstranoはRailsとの連携以外でも強力なデプロイツール。もっともっと評価されてもいいですね。</p>
<p><span id="more-350"></span></p>
<h3><code>Capistrano::CLI.ui.ask</code> でデフォルト値を設定する</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">set <span style="color:#ff3333; font-weight:bold;">:user</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  default_user = <span style="color:#996600;">`whoami`</span>.<span style="color:#CC0066; font-weight:bold;">chomp</span>
  <span style="color:#6666ff; font-weight:bold;">Capistrano::CLI</span>.<span style="color:#9900CC;">ui</span>.<span style="color:#9900CC;">ask</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;[cap] SSH User: &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>q<span style="color:#006600; font-weight:bold;">|</span> q.<span style="color:#9900CC;">default</span> = default_user<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p><code>Capistrano::CLI.ui.ask</code> では、デフォルトではHighLineのaskを呼び出します。なので、そこで使用できるオプションがすべて使えます。<br />
<a href="http://highline.rubyforge.org/doc/">公式Rdocがわかりやすいです。</a></p>
<h3><code>Capistrano::CLI.ui.ask</code> でバリデーションする </h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">Capistrano::CLI</span>.<span style="color:#9900CC;">ui</span>.<span style="color:#9900CC;">ask</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Choose your environment: &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>q<span style="color:#006600; font-weight:bold;">|</span>
  q.<span style="color:#9966CC; font-weight:bold;">in</span> = <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;development&quot;</span>, <span style="color:#996600;">&quot;test&quot;</span>, <span style="color:#996600;">&quot;production&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<h3>ハッシュの key を入力させて、変数代入時にはvalueに変換する </h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">envs = <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#996600;">&quot;1&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'development'</span>, <span style="color:#996600;">&quot;2&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'test'</span>, <span style="color:#996600;">&quot;3&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'production'</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
set <span style="color:#ff3333; font-weight:bold;">:env</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  str = <span style="color:#996600;">&quot;[cap] Choose environment #{envs.keys.sort.map{|v| v.to_s + ') ' + envs[v] }.join(', ')} : &quot;</span>
  converter = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>a<span style="color:#006600; font-weight:bold;">|</span> envs<span style="color:#006600; font-weight:bold;">&#91;</span>a<span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> a <span style="color:#006600; font-weight:bold;">&#125;</span>
  <span style="color:#6666ff; font-weight:bold;">Capistrano::CLI</span>.<span style="color:#9900CC;">ui</span>.<span style="color:#9900CC;">ask</span><span style="color:#006600; font-weight:bold;">&#40;</span>str, converter<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>


<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="bash" style="font-family:monospace;">$ cap deploy
<span style="color: #7a0874; font-weight: bold;">&#91;</span>cap<span style="color: #7a0874; font-weight: bold;">&#93;</span> Choose environment 
  ... <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> development, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">test</span>, <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> production :</pre></td></tr></table></div>

<p><code>Capistrano::CLI.ui.ask(str, converter)</code></p>
<ul>
<li>`converter` にInteger、Stringなどクラスを指定するとキャストします。</li>
<li>procを指定すると、そのprocを適用してくれます。 <a href="http://highline.rubyforge.org/doc/classes/HighLine/Question.html#M000038">参照</a></li>
</ul>
<h3>デフォルト値の表示方法のデフォルト値が &#8220;|default|&#8221; な感じなのでちょっと分かり辛い、何とかしたい</h3>
<p>モンキーパッチしましょう。</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;"><span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#6666ff; font-weight:bold;">HighLine::Question</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> append_default<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@question</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> <span style="color:#996600;">&quot;(default: #{@default.inspect} ) &quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>本来のコードと少し違いますが、まあ困りません。困った方は <code>#{GEM_PATH}/gems/highline-#{v}/lib/highline/question.rb</code> の451行目辺りをご参照ください。 </p>
<h4>適用前</h4>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>cap<span style="color: #7a0874; font-weight: bold;">&#93;</span> Choose environment 
  ... <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> development, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">test</span>, <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> production : <span style="color: #000000; font-weight: bold;">|</span><span style="color: #000000;">1</span><span style="color: #000000; font-weight: bold;">|</span></pre></div></div>

<h4>適用後</h4>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span>cap<span style="color: #7a0874; font-weight: bold;">&#93;</span> Choose environment 
  ... <span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> development, <span style="color: #000000;">2</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">test</span>, <span style="color: #000000;">3</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> production : <span style="color: #7a0874; font-weight: bold;">&#40;</span>default: <span style="color: #ff0000;">&quot;1&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<h3>C-cで中断したい、それも綺麗に</h3>
<p>普通にC-cすると、非常に長大なバックトレースが出力されてしまう。。。<br />
SIGINTをtrapすればいいと思った。なお、 Interrupt はうまくrescueできなかった。</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC00FF; font-weight:bold;">Signal</span>.<span style="color:#CC0066; font-weight:bold;">trap</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:INT</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  abort <span style="color:#996600;">&quot;<span style="color:#000099;">\n</span>[cap] Inturrupted...&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>これをdeploy.rbの頭の方にでも入れる。abortメッセージの頭に改行コードを入れた方が見やすくなります。</p>
<h3>beforeでProcを呼ぶ</h3>
<p>用途が分かり辛いかもしれませんが、例えば変数設定の箇所などをまとめて一つのタスクにして、いろんなタスクで使いまわしたい。できればbeforeとかのフックで呼びたい。<br />
でも一つのタスクにしてしまうと、 <code>cap -T</code> で見えてしまいますね。</p>
<p>本来、プライベートタスクとかは作れませんが、lambda（Procオブジェクト）にすることで同じような使いまわしが可能です。</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
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">namespace <span style="color:#ff3333; font-weight:bold;">:hoge</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  configure = <span style="color:#CC0066; font-weight:bold;">lambda</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    set <span style="color:#ff3333; font-weight:bold;">:user</span>, <span style="color:#996600;">&quot;udzura&quot;</span>
    server <span style="color:#996600;">&quot;hoge.udzura.com&quot;</span>, <span style="color:#ff3333; font-weight:bold;">:app</span>
    <span style="color:#008000; font-style:italic;"># ......</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  before <span style="color:#996600;">&quot;hoge:deploy&quot;</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>configure
  before <span style="color:#996600;">&quot;hoge:deploy:cron&quot;</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>configure
  before <span style="color:#996600;">&quot;hoge:deploy:backend&quot;</span>, <span style="color:#006600; font-weight:bold;">&amp;</span>configure
&nbsp;
  namespace <span style="color:#ff3333; font-weight:bold;">:deploy</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    desc <span style="color:#996600;">&quot;あとは通常どおりのタスク記述、共通の変数が使える&quot;</span>
    task <span style="color:#ff3333; font-weight:bold;">:default</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      ...
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>&#038;記法便利ですね。</p>
<p>実は結構限定的にしか使えませんが（タスクのチェインができないとか）、使いこなせばdeploy.rbがすっきりすると思います。</p>
<h3>sudoやrunコマンドの表示を少しでも綺麗に</h3>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">cmd = <span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;EOC&quot;</span>
  mkdir <span style="color:#006600; font-weight:bold;">-</span><span style="color:#CC0066; font-weight:bold;">p</span> \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>hoge \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>fuga \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>piyo<span style="color:#006600; font-weight:bold;">/</span>poyo \
    <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>www<span style="color:#006600; font-weight:bold;">/</span>foo
EOC
sudo cmd</pre></td></tr></table></div>

<p>こういうことをしたい日が、皆さんにもきっと来ると思うんです。　でもこれをやると、deploy.rbは見やすいんですけど、capしたときのログがひどく見づらくなります。</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">*</span> executing <span style="color: #ff0000;">&quot;sudo -p 'sudo password: '         mkdir -p           /usr/local/hoge      
       /usr/local/fuga           /usr/local/piyo/poyo           /var/www/foo&quot;</span></pre></div></div>

<p>スペースを詰めればかなりマシになります。なので:</p>

<div class="wp_syntax"><table><tr><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code"><pre class="ruby" style="font-family:monospace;">cmd = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&lt;&lt;-</span><span style="color:#996600;">&quot;EOC&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#CC0066; font-weight:bold;">split</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot; &quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  mkdir <span style="color:#006600; font-weight:bold;">-</span><span style="color:#CC0066; font-weight:bold;">p</span> \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>hoge \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>fuga \
    <span style="color:#006600; font-weight:bold;">/</span>usr<span style="color:#006600; font-weight:bold;">/</span>local<span style="color:#006600; font-weight:bold;">/</span>piyo<span style="color:#006600; font-weight:bold;">/</span>poyo \
    <span style="color:#006600; font-weight:bold;">/</span>var<span style="color:#006600; font-weight:bold;">/</span>www<span style="color:#006600; font-weight:bold;">/</span>foo
EOC
sudo cmd</pre></td></tr></table></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #000000; font-weight: bold;">*</span> executing <span style="color: #ff0000;">&quot;sudo -p 'sudo password: ' mkdir -p /usr/local/hoge
  /usr/local/fuga /usr/local/piyo/poyo /var/www/foo&quot;</span></pre></div></div>

<p>Capstranoの機能っていうかRuby自体な感じですが、まあ「書き方さえ知っていれば」レベルのコロンブスの卵です。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/04/07/enhance-your-capistrano-skill/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/04/07/enhance-your-capistrano-skill/" />
	</item>
		<item>
		<title>Ruby &#8211; Structの宣言方法</title>
		<link>http://blog.udzura.jp/2010/03/26/ruby-struct-definition/</link>
		<comments>http://blog.udzura.jp/2010/03/26/ruby-struct-definition/#comments</comments>
		<pubDate>Fri, 26 Mar 2010 01:59:51 +0000</pubDate>
		<dc:creator>udzura</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.udzura.jp/?p=344</guid>
		<description><![CDATA[Rubyでは構造体風の振る舞いをするStructクラスがあるのは有名な話。タプル的なものを使わなければいけない際、Hashだと hoge[:name] = "hoge" のように書かなければいけないところを、 hoge.name = "hoge" と書けてタイプ数が減り、便利。 
リファレンスマニュアルには以下のような形で、新しい構造体クラスを作る、とある。

1
HogeTuple = Struct.new&#40;:name, :value&#41;

でも、僕はこう書かないと落ち着かない……。

1
2
class HogeTuple &#60; Struct.new&#40;:name, :value&#41;
end

2行（あるいは「;」を含む記法）になってしまうし、何より無名のサブクラスが一つ余計に生成されてしまう（実際、 HogeTuple.ancestors で分かる）ので富豪的な感じがあるが、でも class って宣言が無いと非常にそわそわするんだけど、、、こう書くの僕だけ？
あと、HogeTupleにさらに独自のメソッドを付け加えたい際は、下の書き方のほうがコードがすっきりする、と言うメリットもある（と、最初は考えてた）。
でも

Structs inside out(C-f &#8220;Custom Behavior&#8221;)

上記記事では、

1
2
3
4
5
class HogeTuple &#60; Struct.new&#40;:name, :value&#41;
  def inspect
    &#34;&#60;#{self.class} name: #{self.name.inspect} value: #{self.value.inspect}&#62;&#34;
  end
end

みたいなのはobsoleteであると主張していて、Struct.newにブロックを伴う書き方がいいようだ。

1
2
3
4
5
HogeTuple = Struct.new&#40;:name, :value&#41; do
  def inspect
    &#34;&#60;#{self.class} name: #{self.name.inspect} [...]]]></description>
			<content:encoded><![CDATA[<p>Rubyでは構造体風の振る舞いをするStructクラスがあるのは有名な話。タプル的なものを使わなければいけない際、Hashだと <code>hoge[:name] = "hoge"</code> のように書かなければいけないところを、 <code>hoge.name = "hoge"</code> と書けてタイプ数が減り、便利。 </p>
<p><a href="http://www.ruby-lang.org/ja/man/html/Struct.html">リファレンスマニュアル</a>には以下のような形で、新しい構造体クラスを作る、とある。</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;">HogeTuple = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:value</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></td></tr></table></div>

<p>でも、僕はこう書かないと落ち着かない……。</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;"><span style="color:#9966CC; font-weight:bold;">class</span> HogeTuple <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:value</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>2行（あるいは「;」を含む記法）になってしまうし、何より無名のサブクラスが一つ余計に生成されてしまう（実際、 <code>HogeTuple.ancestors</code> で分かる）ので富豪的な感じがあるが、でも <code>class</code> って宣言が無いと非常にそわそわするんだけど、、、こう書くの僕だけ？</p>
<p>あと、HogeTupleにさらに独自のメソッドを付け加えたい際は、下の書き方のほうがコードがすっきりする、と言うメリットもある（と、最初は考えてた）。</p>
<h3>でも</h3>
<ul>
<li><a href="http://blog.rubybestpractices.com/posts/rklemme/017-Struct.html">Structs inside out</a>(C-f &#8220;Custom Behavior&#8221;)</li>
</ul>
<p>上記記事では、</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;"><span style="color:#9966CC; font-weight:bold;">class</span> HogeTuple <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:value</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> inspect
    <span style="color:#996600;">&quot;&lt;#{self.class} name: #{self.name.inspect} value: #{self.value.inspect}&gt;&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p>みたいなのはobsoleteであると主張していて、Struct.newにブロックを伴う書き方がいいようだ。</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;">HogeTuple = <span style="color:#CC00FF; font-weight:bold;">Struct</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:name</span>, <span style="color:#ff3333; font-weight:bold;">:value</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> inspect
    <span style="color:#996600;">&quot;&lt;#{self.class} name: #{self.name.inspect} value: #{self.value.inspect}&gt;&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></td></tr></table></div>

<p><del>何が言いたいかというと、「俺もそわそわする！」　と言う方は一緒に流行らせましょう。</del>ということでこの行削除。ここまでは言えない。。</p>
<p>確かにancestorsに無名の謎クラスが入ってしまうのも気持ち悪い感じはある。でも、僕は<code>class</code> って書いてないとそわそわする。もはや好みの問題？</p>
<h3>あと</h3>
<p>「StructをどうしてもStrutsと綴ってしまう」と言うコミュニティを作りましょう。Javaほとんど書けない僕ですらこうなのだから、みんなきっと間違えるだろうと思う(勘違い)。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.udzura.jp/2010/03/26/ruby-struct-definition/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.udzura.jp/2010/03/26/ruby-struct-definition/" />
	</item>
	</channel>
</rss>
