<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2italianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" version="2.0">

<channel>
	<title>System.Exit</title>
	
	<link>http://jugyo.org/blog</link>
	<description>jugyo が書いてます。</description>
	<lastBuildDate>Sat, 11 Jul 2009 13:12:32 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<creativeCommons:license>http://creativecommons.org/licenses/by/2.0/</creativeCommons:license><image><link>http://jugyo.org/blog</link><url>http://jugyo.org/images/me_middle.jpg</url><title>System.exit();</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/coople/blog" type="application/rss+xml" /><item>
		<title>本を捨てる</title>
		<link>http://jugyo.org/blog/3491</link>
		<comments>http://jugyo.org/blog/3491#comments</comments>
		<pubDate>Sat, 11 Jul 2009 13:12:32 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[生活]]></category>
		<category><![CDATA[本]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3491</guid>
		<description>読まない本は捨てることにしました。
3分の1くらいは減るかな。</description>
			<content:encoded><![CDATA[<p><a href="http://picasaweb.google.com/lh/photo/4312LXZfFO_1ryFffdxFnA?authkey=Gv1sRgCMTN2JShuv72Wg&#038;feat=embedwebsite"><img src="http://lh6.ggpht.com/_PLE6Nhnsrug/SlhhXCu5vDI/AAAAAAAAAP8/Yuj_6qxoHxk/s400/2009-07-11%2018.53.13.jpg" /></a></p>
<p>読まない本は捨てることにしました。<br />
3分の1くらいは減るかな。</p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3491/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ブラウザベースの Termtter クライアントができました！</title>
		<link>http://jugyo.org/blog/3478</link>
		<comments>http://jugyo.org/blog/3478#comments</comments>
		<pubDate>Wed, 17 Jun 2009 14:48:38 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Termtter]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3478</guid>
		<description>ブラウザベースの Termtter クライアントを作りました。
昨日作った http_server プラグインの一機能として実装しました。
http_server プラグインをロードすると HTTP サーバーが起動してそれに対して外部からコマンドを実行したりできるわけですが、Ajax でその機能を呼び出すことで動作するクライアントを HTML と JavaScript で実装しました。
つまり、ブラウザが Termtter クライアントになります。
スクリーンショット
Uploaded with plasq&amp;#8217;s Skitch!
見てわかる通り、Termtter そのものにかなり似せて作ってあるのでそんなに違和感なく使えると思います :)
必要なもの

mime-types
rubytter &gt;= 0.8.0

使い方
http_server プラグインをロードして、ブラウザで http://localhost:5678/ にアクセスします。
課題
認証機能を実装すればサーバーで Termtter を動かしておいて外からブラウザでアクセスするという使い方ができるようになります。
で、iPhone のブラウザから使えたら便利かなーと思ってます。
コマンドを並列でバシバシ実行できてしまう今の作りが良いのか悪いのかよくわかりません。
Termtter がブラウザから使えることで誰がハッピーになるのかは良くわからないのですが、勢いで作ってしまいました。</description>
			<content:encoded><![CDATA[<p>ブラウザベースの Termtter クライアントを作りました。<br />
<a href="http://jugyo.org/blog/3463">昨日作った</a> http_server プラグインの一機能として実装しました。<br />
http_server プラグインをロードすると HTTP サーバーが起動してそれに対して外部からコマンドを実行したりできるわけですが、Ajax でその機能を呼び出すことで動作するクライアントを HTML と JavaScript で実装しました。<br />
つまり、ブラウザが Termtter クライアントになります。</p>
<h3>スクリーンショット</h3>
<div class="thumbnail"><a href="http://skitch.com/jugyo/bwxp9/termtter"><img src="http://img.skitch.com/20090617-cx7re3sw2ejq496t91p9i86fwg.preview.jpg" alt="Termtter" /></a><br /><span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080">Uploaded with <a href="http://plasq.com/">plasq</a>&#8217;s <a href="http://skitch.com">Skitch</a>!</span></div>
<p>見てわかる通り、Termtter そのものにかなり似せて作ってあるのでそんなに違和感なく使えると思います :)</p>
<h3>必要なもの</h3>
<ul>
<li>mime-types</li>
<li>rubytter >= 0.8.0</li>
</ul>
<h3>使い方</h3>
<p>http_server プラグインをロードして、ブラウザで <a href="http://localhost:5678/">http://localhost:5678/</a> にアクセスします。</p>
<h3>課題</h3>
<p>認証機能を実装すればサーバーで Termtter を動かしておいて外からブラウザでアクセスするという使い方ができるようになります。<br />
で、iPhone のブラウザから使えたら便利かなーと思ってます。</p>
<p>コマンドを並列でバシバシ実行できてしまう今の作りが良いのか悪いのかよくわかりません。</p>
<p>Termtter がブラウザから使えることで誰がハッピーになるのかは良くわからないのですが、勢いで作ってしまいました。</p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3478/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Termtter に HTTP サーバー機能を提供するプラグインを作りました！</title>
		<link>http://jugyo.org/blog/3463</link>
		<comments>http://jugyo.org/blog/3463#comments</comments>
		<pubDate>Mon, 15 Jun 2009 15:01:22 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Termtter]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3463</guid>
		<description>Termtter に HTTP サーバー機能を提供するプラグインを作りました！
HTTP 経由でコマンドを実行することができます。
こんな風にしてブラウザからメッセージをポストすることもできます。
Uploaded with plasq&amp;#8217;s Skitch!
便利ですね！
使い方
プラグインの読み込み
設定ファイル（~/.termtter/config）に以下の太字部分を追記。
Termtter::Client.init do &amp;#124;t&amp;#124;
...
  t.plug 'http_server'
...
end
もしくは Termtter のプロンプト上で以下を実行。
&amp;#62; plug 'http_server'
デフォルトのポートは 5678 です。
ポートを変えたい場合、例えば設定ファイルに config.plugins.http_server.port = 3000 と書くと 3000 番ポートを使用します。
コマンドの実行
リクエストされたパスの「/」を除いた部分がコマンドとして実行されます。
「update test」というコマンドを実行したい場合は「/update test」というリクエストを投げます。
パスは当然 URI としてエスケープしてやる必要があります。
なので以下のようになります。
http://localhost:5678/update%20test</description>
			<content:encoded><![CDATA[<p>Termtter に HTTP サーバー機能を提供するプラグインを作りました！<br />
HTTP 経由でコマンドを実行することができます。</p>
<p>こんな風にしてブラウザからメッセージをポストすることもできます。</p>
<div class="thumbnail"><a href="http://skitch.com/jugyo/bwf75/picture-16"><img src="http://img.skitch.com/20090615-mh77ymj6sgjrkx6ehy6e87mmmh.preview.jpg" alt="Picture 16" /></a><br /><span style="font-family: Lucida Grande, Trebuchet, sans-serif, Helvetica, Arial; font-size: 10px; color: #808080">Uploaded with <a href="http://plasq.com/">plasq</a>&#8217;s <a href="http://skitch.com">Skitch</a>!</span></div>
<p>便利ですね！</p>
<h3>使い方</h3>
<h4>プラグインの読み込み</h4>
<p>設定ファイル（~/.termtter/config）に以下の太字部分を追記。</p>
<pre><code>Termtter::Client.init do |t|
...
  <strong>t.plug 'http_server'</strong>
...
end</code></pre>
<p>もしくは Termtter のプロンプト上で以下を実行。</p>
<pre><code>&gt; plug 'http_server'</code></pre>
<p>デフォルトのポートは 5678 です。<br />
ポートを変えたい場合、例えば設定ファイルに <tt>config.plugins.http_server.port = 3000</tt> と書くと 3000 番ポートを使用します。</p>
<h4>コマンドの実行</h4>
<p>リクエストされたパスの「/」を除いた部分がコマンドとして実行されます。<br />
「update test」というコマンドを実行したい場合は「/update test」というリクエストを投げます。<br />
パスは当然 URI としてエスケープしてやる必要があります。<br />
なので以下のようになります。</p>
<pre>http://localhost:5678/update%20test</pre>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3463/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Termtter Tシャツできました！</title>
		<link>http://jugyo.org/blog/3456</link>
		<comments>http://jugyo.org/blog/3456#comments</comments>
		<pubDate>Wed, 10 Jun 2009 15:01:36 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Termtter]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3456</guid>
		<description>ついにできました！
Termtter Tシャツが！


こちらから買えます。
jugyoさんのTシャツ ID:8061
ちなみに Tシャツが売れても僕には一銭も入ってきませんw
また、Termtter の開発をやりたいかたはこちらからどうぞ。
http://github.com/jugyo/termtter/</description>
			<content:encoded><![CDATA[<p>ついにできました！<br />
Termtter Tシャツが！</p>
<p><a class="tt-flickr" href="http://www.flickr.com/photos/22883452@N04/3614201784"><img class="tt-flickr" src="http://farm3.static.flickr.com/2454/3614201784_65a02c749c.jpg" width="500" height="375" alt="DSCF6444.JPG" /></a></p>
<p><a class="tt-flickr" href="http://www.flickr.com/photos/22883452@N04/3614201376"><img class="tt-flickr" src="http://farm3.static.flickr.com/2451/3614201376_60efe6df58.jpg" width="500" height="375" alt="DSCF6447.JPG" /></a></p>
<p>こちらから買えます。</p>
<p><a href="http://tmix.jp/cart/detail?item_id=8061">jugyoさんのTシャツ ID:8061</a></p>
<p>ちなみに Tシャツが売れても僕には一銭も入ってきませんw</p>
<p>また、Termtter の<strong>開発</strong>をやりたいかたはこちらからどうぞ。</p>
<p><a href="http://github.com/jugyo/termtter/">http://github.com/jugyo/termtter/</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3456/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>近況</title>
		<link>http://jugyo.org/blog/3448</link>
		<comments>http://jugyo.org/blog/3448#comments</comments>
		<pubDate>Thu, 21 May 2009 15:33:55 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[プログラミング]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3448</guid>
		<description>最近、自宅ではひたすらプログラミングしてます。
時間さえあればプログラミングしてるのでブログを書く習慣がなくなりつつあります。
そういえば「More Joel on Software」を読みましたけど、相変わらず面白かったです。
ところで最近こんなの作りました。
Gitki
https://github.com/jugyo/gitki/tree
git を使って更新する wiki です。
ブラウザからは更新できません。
デモ: http://gitki.oyguj.org/
ifchanged
https://github.com/jugyo/ifchanged/tree
引数に渡したファイルが更新されたときに「何か」を実行するためのコマンドです。
% ifchanged ./**/*.html --do 'open %'
みたいにして使います。
g
https://github.com/jugyo/g/tree
ruby の組み込み関数の「p」のような動きをするメソッド「g」を提供するライブラリです。
オブジェクトを inspec した結果を growl で表示します。</description>
			<content:encoded><![CDATA[<p>最近、自宅ではひたすらプログラミングしてます。<br />
時間さえあればプログラミングしてるのでブログを書く習慣がなくなりつつあります。</p>
<p>そういえば「More Joel on Software」を読みましたけど、相変わらず面白かったです。</p>
<p>ところで最近こんなの作りました。</p>
<h3>Gitki</h3>
<p><a href="https://github.com/jugyo/gitki/tree">https://github.com/jugyo/gitki/tree</a></p>
<p>git を使って更新する wiki です。<br />
ブラウザからは更新できません。<br />
デモ: <a href="http://gitki.oyguj.org/">http://gitki.oyguj.org/</a></p>
<h3>ifchanged</h3>
<p><a href="https://github.com/jugyo/ifchanged/tree">https://github.com/jugyo/ifchanged/tree</a></p>
<p>引数に渡したファイルが更新されたときに「何か」を実行するためのコマンドです。</p>
<pre><code>% ifchanged ./**/*.html --do 'open %'</code></pre>
<p>みたいにして使います。</p>
<h3>g</h3>
<p><a href="https://github.com/jugyo/g/tree">https://github.com/jugyo/g/tree</a></p>
<p>ruby の組み込み関数の「p」のような動きをするメソッド「g」を提供するライブラリです。<br />
オブジェクトを inspec した結果を growl で表示します。</p>
<p><img src="http://img.skitch.com/20090521-duh1ir579p5g86t7c66w5xqaki.jpg" alt="Picture 13.png"/></p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3448/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sequel を試す</title>
		<link>http://jugyo.org/blog/3442</link>
		<comments>http://jugyo.org/blog/3442#comments</comments>
		<pubDate>Fri, 01 May 2009 14:10:55 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sequel]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3442</guid>
		<description>インストール
sudo gem install sequel
使ってみる
初期化処理を行い、テーブルを作成し、データをいくつか投入してみます。
require 'rubygems'
require 'sequel'

# initialize
DB = Sequel.sqlite('test.db')

# create database
DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end

# insert data
items = DB[:items]
items &amp;#60;&amp;#60; {:name =&gt; 'foo', :price =&amp;#62; 100}
items &amp;#60;&amp;#60; {:name =&gt; 'bar', :price =&amp;#62; 200}
まあ、何やってるかだいたいわかりますよね。
Sequel コンソール
以下のようにしてコンソールを立ち上げることができます。
sequel sqlite://test.db
諸々の初期化処理を行った状態で irb が起動してるんだと思います。
こういうツールが用意されてるっていいですね！
データの取得
上記で作成したデータをいろんなやり方で取得してみます。
Sequel コンソールで実行しました。
# count
&amp;#62; DB[:items].count
=&amp;#62; 2

# select all
&amp;#62; DB[:items].all
=&amp;#62; [{:price=&amp;#62;100.0, :name=&amp;#62;&amp;#34;foo&amp;#34;, :id=&amp;#62;1}, {:price=&amp;#62;200.0, [...]</description>
			<content:encoded><![CDATA[<h3>インストール</h3>
<pre><code>sudo gem install sequel</code></pre>
<h3>使ってみる</h3>
<p>初期化処理を行い、テーブルを作成し、データをいくつか投入してみます。</p>
<pre><code>require 'rubygems'
require 'sequel'

# initialize
DB = Sequel.sqlite('test.db')

# create database
DB.create_table :items do
  primary_key :id
  String :name
  Float :price
end

# insert data
items = DB[:items]
items &lt;&lt; {:name => 'foo', :price =&gt; 100}
items &lt;&lt; {:name => 'bar', :price =&gt; 200}</code></pre>
<p>まあ、何やってるかだいたいわかりますよね。</p>
<h3>Sequel コンソール</h3>
<p>以下のようにしてコンソールを立ち上げることができます。</p>
<pre><code>sequel sqlite://test.db</code></pre>
<p>諸々の初期化処理を行った状態で irb が起動してるんだと思います。<br />
こういうツールが用意されてるっていいですね！</p>
<h3>データの取得</h3>
<p>上記で作成したデータをいろんなやり方で取得してみます。<br />
Sequel コンソールで実行しました。</p>
<pre><code># count
&gt; DB[:items].count
=&gt; 2

# select all
&gt; DB[:items].all
=&gt; [{:price=&gt;100.0, :name=&gt;&quot;foo&quot;, :id=&gt;1}, {:price=&gt;200.0, :name=&gt;&quot;bar&quot;, :id=&gt;2}]

# select first
&gt; DB[:items].first
=&gt; {:price=&gt;100.0, :name=&gt;&quot;foo&quot;, :id=&gt;1}

# select id = 2
&gt; DB[:items][:id =&gt; 2]
=&gt; {:price=&gt;200.0, :name=&gt;&quot;bar&quot;, :id=&gt;2}

# select price = 200
&gt; DB[:items].filter(:price =&gt; 200).all
=&gt; [{:price=&gt;200.0, :name=&gt;&quot;bar&quot;, :id=&gt;2}]

# select price &gt; 100
&gt; DB[:items].filter{|i| i.price &gt; 100}.all
=&gt; [{:price=&gt;200.0, :name=&gt;&quot;bar&quot;, :id=&gt;2}]

# select price &lt; 100
&gt; DB[:items].filter(&#x27;price &lt; ?&#x27;, 200).all
=&gt; [{:price=&gt;100.0, :name=&gt;&quot;foo&quot;, :id=&gt;1}]

# select by sql
&gt; DB[&#x27;select * from items&#x27;].all
=&gt; [{:price=&gt;100.0, :name=&gt;&quot;foo&quot;, :id=&gt;1}, {:price=&gt;200.0, :name=&gt;&quot;bar&quot;, :id=&gt;2}]</code></pre>
<p>なんとなくイメージはつかめましたか？</p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3442/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>TermColor に機能追加</title>
		<link>http://jugyo.org/blog/3436</link>
		<comments>http://jugyo.org/blog/3436#comments</comments>
		<pubDate>Fri, 01 May 2009 13:24:24 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[TermColor]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3436</guid>
		<description>TermColor にちょっとした機能を追加しました。
機能追加ってほどでもないんだけど。
以下を実行すると、
ruby -rubygems -e 'require "termcolor"; TermColor.test'
以下が出力されます。

つまり、カラーコードが確認できます。
便利ですね！
関連エントリ
TermColor &amp;#8211; コンソールへの出力を HTML っぽく色付け♪
TermColor
http://github.com/jugyo/termcolor</description>
			<content:encoded><![CDATA[<p>TermColor にちょっとした機能を追加しました。<br />
機能追加ってほどでもないんだけど。</p>
<p>以下を実行すると、</p>
<pre><code>ruby -rubygems -e 'require "termcolor"; TermColor.test'</code></pre>
<p>以下が出力されます。</p>
<p><img src="http://gyazo.com/729e6cf622e5e4c20344e5ae0b5441f0.png" alt="http://gyazo.com/729e6cf622e5e4c20344e5ae0b5441f0.png" /></p>
<p>つまり、カラーコードが確認できます。<br />
便利ですね！</p>
<p><strong>関連エントリ</strong><br />
<a href="http://jugyo.org/blog/3195">TermColor &#8211; コンソールへの出力を HTML っぽく色付け♪</a></p>
<p><strong>TermColor</strong><br />
<a href="http://github.com/jugyo/termcolor">http://github.com/jugyo/termcolor</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3436/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Termtter の設定ファイルの書式を少し変えました（HEAD）</title>
		<link>http://jugyo.org/blog/3425</link>
		<comments>http://jugyo.org/blog/3425#comments</comments>
		<pubDate>Sun, 26 Apr 2009 14:45:42 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Termtter]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3425</guid>
		<description>Termtter の設定ファイルの書式を少し変えました（古いままでも一応動くはずです）。
新しい書式は以下のようになります。
config.user_name = 'jugyo'
config.password = 'xxxxxxxx'

Termtter::Client.init do &amp;#124;t&amp;#124;
  t.plug 'log'
  t.plug 'confirm'
  t.plug 'growl'
  t.plug 'stdout'
  t.plug 'standard_commands'
  t.plug 'auto_reload'
end
プラグインを読み込むやりかたが変わっています。
今までみたいに plugin メソッドでプラグインを読み込むのではなく、Termtter::Client.init に渡すブロックの中で、Termtter::Client （引数に渡ってくる t は Termtter::Client そのもの）の plug メソッドを呼んでプラグインを読み込む形になります。
この変更は次のバージョンに反映されると思います。
なんでこうしたかというと、config を読み込んで ライブラリ等の初期化を行った後にプラグインを読みむようにしたかったからです。</description>
			<content:encoded><![CDATA[<p>Termtter の設定ファイルの書式を少し変えました（古いままでも一応動くはずです）。<br />
新しい書式は以下のようになります。</p>
<pre><code>config.user_name = 'jugyo'
config.password = 'xxxxxxxx'

Termtter::Client.init do |t|
  t.plug 'log'
  t.plug 'confirm'
  t.plug 'growl'
  t.plug 'stdout'
  t.plug 'standard_commands'
  t.plug 'auto_reload'
end</code></pre>
<p>プラグインを読み込むやりかたが変わっています。<br />
今までみたいに plugin メソッドでプラグインを読み込むのではなく、Termtter::Client.init に渡すブロックの中で、Termtter::Client （引数に渡ってくる t は Termtter::Client そのもの）の plug メソッドを呼んでプラグインを読み込む形になります。<br />
この変更は次のバージョンに反映されると思います。</p>
<p>なんでこうしたかというと、config を読み込んで ライブラリ等の初期化を行った後にプラグインを読みむようにしたかったからです。</p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sinatra が Google App Engine で動くまで</title>
		<link>http://jugyo.org/blog/3388</link>
		<comments>http://jugyo.org/blog/3388#comments</comments>
		<pubDate>Mon, 20 Apr 2009 14:51:03 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[JRuby]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3388</guid>
		<description>（注: Google App Engine を GAE と略すことがあります。）
Sinatra を Google App Engine で動かしてみました。
Github にすぐに動かせるものを置いておいたので、手っ取り早く試したい人はここからソースを取ってきて動かしてみるといいと思います。
appengine-java-sdk は別途必要です。
http://github.com/jugyo/sinatra_on_gae/tree/master
詳細は同梱されている README を参照してくだい。
以下は、ちゃんと手順を追って試してみたい人向けの解説です。
SDK のダウンロード
SDK をマシンに入れておく必要があります。
以下から appengine-java-sdk-1.2.0.zip というのをダウンロードして適当な場所に解凍してください。
http://code.google.com/appengine/downloads.html
PATH の設定
SDK の bin ディレクトリを PATH に追加しておきます。
コマンドを実行するときにフルパスを指定するのが面倒なので。
例:
export PATH=$PATH:~/src/jruby/appengine-java-sdk-1.2.0/bin
アプリケーションのフォルダを作成
フォルダをいくつか作ります。
cd sinatra_on_gae
mkdir WEB-INF
mkdir WEB-INF/gems WEB-INF/lib
ライブラリのインストール
必要なライブラリを gem でインストールします。
その際、-i オプションでディレクトリを指定します。
さらに、rdoc や ri はいらないので &amp;#8211;no-rdoc &amp;#8211;no-ri オプションも付けておきます。
gem install -i WEB-INF/gems sinatra --no-rdoc --no-ri
以下のファイルは不要なので削除しておきます。
rm -rf WEB-INF/gems/bin WEB-INF/gems/cache/*
jar ファイルの用意
WEB-INF/lib に以下の jar ファイルを置きます。
appengine-api-1.0-sdk-1.2.0.jar
jruby-core.jar
ruby-stdlib.jar
jruby-rack-0.9.4.jar
appengine-api-1.0-sdk-1.2.0.jar は SDK [...]</description>
			<content:encoded><![CDATA[<p>（注: Google App Engine を GAE と略すことがあります。）</p>
<p>Sinatra を Google App Engine で動かしてみました。</p>
<p>Github にすぐに動かせるものを置いておいたので、手っ取り早く試したい人はここからソースを取ってきて動かしてみるといいと思います。<br />
appengine-java-sdk は別途必要です。</p>
<p><a href="http://github.com/jugyo/sinatra_on_gae/tree/master">http://github.com/jugyo/sinatra_on_gae/tree/master</a></p>
<p>詳細は同梱されている README を参照してくだい。</p>
<p>以下は、ちゃんと手順を追って試してみたい人向けの解説です。</p>
<h3>SDK のダウンロード</h3>
<p>SDK をマシンに入れておく必要があります。<br />
以下から <strong>appengine-java-sdk-1.2.0.zip</strong> というのをダウンロードして適当な場所に解凍してください。</p>
<p><a href="http://code.google.com/appengine/downloads.html">http://code.google.com/appengine/downloads.html</a></p>
<h3>PATH の設定</h3>
<p>SDK の bin ディレクトリを PATH に追加しておきます。<br />
コマンドを実行するときにフルパスを指定するのが面倒なので。</p>
<p>例:</p>
<pre><code>export PATH=$PATH:~/src/jruby/appengine-java-sdk-1.2.0/bin</code></pre>
<h3>アプリケーションのフォルダを作成</h3>
<p>フォルダをいくつか作ります。</p>
<pre><code>cd sinatra_on_gae
mkdir WEB-INF
mkdir WEB-INF/gems WEB-INF/lib</code></pre>
<h3>ライブラリのインストール</h3>
<p>必要なライブラリを gem でインストールします。<br />
その際、-i オプションでディレクトリを指定します。<br />
さらに、rdoc や ri はいらないので &#8211;no-rdoc &#8211;no-ri オプションも付けておきます。</p>
<pre><code>gem install -i WEB-INF/gems sinatra --no-rdoc --no-ri</code></pre>
<p>以下のファイルは不要なので削除しておきます。</p>
<pre><code>rm -rf WEB-INF/gems/bin WEB-INF/gems/cache/*</code></pre>
<h3>jar ファイルの用意</h3>
<p>WEB-INF/lib に以下の jar ファイルを置きます。</p>
<p><a href="http://jugyo.org/sinatra_on_gae/appengine-api-1.0-sdk-1.2.0.jar">appengine-api-1.0-sdk-1.2.0.jar</a><br />
<a href="http://jugyo.org/sinatra_on_gae/jruby-core.jar">jruby-core.jar</a><br />
<a href="http://jugyo.org/sinatra_on_gae/ruby-stdlib.jar">ruby-stdlib.jar</a><br />
<a href="http://jugyo.org/sinatra_on_gae/jruby-rack-0.9.4.jar">jruby-rack-0.9.4.jar</a></p>
<p>appengine-api-1.0-sdk-1.2.0.jar は SDK に含まれているライブラリで、 jruby-core.jar と ruby-stdlib.jar は、Github から取ってきた JRuby をビルドして必要なものだけ抜き出したものです。<br />
jruby-rack-0.9.4.jar も Github から取ってきてビルドしました。</p>
<h3>Sinatra アプリケーションを作成</h3>
<p>Sinatra 上で動かすアプリケーションを作ります。</p>
<p><strong>WEB-INF/app.rb</strong></p>
<pre><code>require 'rubygems'
require 'sinatra'

get '/' do
  'Hello World!!'
end</code></pre>
<p>やっぱり Sinatra はシンプルでいいですね〜。</p>
<h3>appengine-web.xml の作成</h3>
<p>GAE アプリケーションとしての設定を appengine-web.xml というファイルに書きます。</p>
<p><strong>WEB-INF/appengine-web.xml</strong></p>
<pre><code>&lt;appengine-web-app xmlns=&quot;http://appengine.google.com/ns/1.0&quot;&gt;
    &lt;application&gt;sinatra_on_gae&lt;/application&gt;
    &lt;version&gt;1&lt;/version&gt;
    &lt;static-files /&gt;
    &lt;resource-files /&gt;
    &lt;sessions-enabled&gt;false&lt;/sessions-enabled&gt;
    &lt;system-properties&gt;
      &lt;property name=&quot;jruby.management.enabled&quot; value=&quot;false&quot; /&gt;
      &lt;property name=&quot;os.arch&quot; value=&quot;&quot; /&gt;
      &lt;property name=&quot;jruby.compile.mode&quot; value=&quot;JIT&quot;/&gt; &lt;!-- JIT|FORCE|OFF --&gt;
      &lt;property name=&quot;jruby.compile.fastest&quot; value=&quot;true&quot;/&gt;
      &lt;property name=&quot;jruby.compile.frameless&quot; value=&quot;true&quot;/&gt;
      &lt;property name=&quot;jruby.compile.positionless&quot; value=&quot;true&quot;/&gt;
      &lt;property name=&quot;jruby.compile.threadless&quot; value=&quot;false&quot;/&gt;
      &lt;property name=&quot;jruby.compile.fastops&quot; value=&quot;false&quot;/&gt;
      &lt;property name=&quot;jruby.compile.fastcase&quot; value=&quot;false&quot;/&gt;
      &lt;property name=&quot;jruby.compile.chainsize&quot; value=&quot;500&quot;/&gt;
      &lt;property name=&quot;jruby.compile.lazyHandles&quot; value=&quot;false&quot;/&gt;
      &lt;property name=&quot;jruby.compile.peephole&quot; value=&quot;true&quot;/&gt;
   &lt;/system-properties&gt;
&lt;/appengine-web-app&gt;</code></pre>
<h3>web.xml の作成</h3>
<p>Web アプリケーションの設定を web.xml に記述します。</p>
<p><strong>WEB-INF/web.xml</strong></p>
<pre><code>&lt;!DOCTYPE web-app PUBLIC
  &quot;-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN&quot;
  &quot;http://java.sun.com/dtd/web-app_2_3.dtd&quot;&gt;
&lt;web-app&gt;

  &lt;context-param&gt;
    &lt;param-name&gt;public.root&lt;/param-name&gt;
    &lt;param-value&gt;/&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;context-param&gt;
    &lt;param-name&gt;rackup&lt;/param-name&gt;
    &lt;param-value&gt;require &#x27;rubygems&#x27;
require &#x27;sinatra&#x27;

root_dir = File.dirname(__FILE__)

#set :environment, :production
set :environment, :development
set :root,        root_dir
set :app_file,    File.join(root_dir, &#x27;app.rb&#x27;)
disable :run

require &#x27;app&#x27;

run Sinatra::Application
&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;context-param&gt;
    &lt;param-name&gt;jruby.min.runtimes&lt;/param-name&gt;
    &lt;param-value&gt;1&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;context-param&gt;
    &lt;param-name&gt;jruby.max.runtimes&lt;/param-name&gt;
    &lt;param-value&gt;1&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;context-param&gt;
    &lt;param-name&gt;jruby.init.serial&lt;/param-name&gt;
    &lt;param-value&gt;true&lt;/param-value&gt;
  &lt;/context-param&gt;

  &lt;filter&gt;
    &lt;filter-name&gt;RackFilter&lt;/filter-name&gt;
    &lt;filter-class&gt;org.jruby.rack.RackFilter&lt;/filter-class&gt;
  &lt;/filter&gt;
  &lt;filter-mapping&gt;
    &lt;filter-name&gt;RackFilter&lt;/filter-name&gt;
    &lt;url-pattern&gt;/*&lt;/url-pattern&gt;
  &lt;/filter-mapping&gt;

  &lt;listener&gt;
    &lt;listener-class&gt;org.jruby.rack.RackServletContextListener&lt;/listener-class&gt;
  &lt;/listener&gt;

&lt;/web-app&gt;</code></pre>
<h3></h3>
<p>sinatra のソースをちょっとだけ修正する必要があります。<br />
WEB-INF/gems/gems/sinatra-0.9.1.1/lib/sinatra.rb の8行目です</p>
<pre><code>use_in_file_templates!</code></pre>
<p>↓</p>
<pre><code>#use_in_file_templates!</code></pre>
<p>use_in_file_templates! というのはおそらく、ファイルの中にテンプレートを書いておける機能にまつわるメソッドだと思います。<br />
ま、いらないと思います。</p>
<h3>GAE のアプリとして起動する</h3>
<p>さて、以上でアプリケーションを動かす準備が整いました。<br />
以下のようにして起動するとこができます。</p>
<pre><code>dev_appserver.sh .</code></pre>
<p>ちなみに、起動の際には WEB-INF ディレクトリが置かれているディレクトリを指定する必要があります。</p>
<h3>普通の Ruby で起動する</h3>
<p>普通の Ruby でも当然動きます。</p>
<pre><code>GEM_HOME=WEB-INF/gems ruby ./WEB-INF/app.rb</code></pre>
<h3>デプロイ</h3>
<p>appengine-web.xml の application と version を適切に設定した上で以下を実行するとデプロイできます。</p>
<pre><code>appcfg.sh update .</code></pre>
<p>当然、Google App Engine のアカウントを持っていてかつ Java が使えるようなっている必要があります。</p>
<h3>デモ</h3>
<p>以下で実際に動かしてます（一週間くらいは動かしておくつもりです。Hello World!! しか出ませんけどね！）。</p>
<p><a href="http://jugyo-test.appspot.com/">http://jugyo-test.appspot.com/</a></p>
<p><strong>参考:</strong><br />
<a href="http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html">http://blog.bigcurl.de/2009/04/running-sinatra-apps-on-google.html</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3388/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Hamlr が Google App Engine で動くまで</title>
		<link>http://jugyo.org/blog/3386</link>
		<comments>http://jugyo.org/blog/3386#comments</comments>
		<pubDate>Sat, 18 Apr 2009 16:27:54 +0000</pubDate>
		<dc:creator>jugyo</dc:creator>
				<category><![CDATA[Uncategorized]]></category>
		<category><![CDATA[Google App Engine]]></category>
		<category><![CDATA[Haml]]></category>
		<category><![CDATA[Hamlr]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Sinatra]]></category>

		<guid isPermaLink="false">http://jugyo.org/blog/?p=3386</guid>
		<description>あとで書く。
関連:
Sinatra が Google App Engine で動くまで</description>
			<content:encoded><![CDATA[<p>あとで書く。</p>
<p>関連:<br />
<a href="http://jugyo.org/blog/3388">Sinatra が Google App Engine で動くまで</a></p>
]]></content:encoded>
			<wfw:commentRss>http://jugyo.org/blog/3386/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
