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

<channel>
	<title>ハセテツラボ &#187; Ruby</title>
	<atom:link href="http://tt-house.com/tag/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://tt-house.com</link>
	<description>生涯一開発屋</description>
	<lastBuildDate>Fri, 03 Sep 2010 14:01:41 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>RubyonRailsでOAuth経由でTwitterのタイムラインを取得する</title>
		<link>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html</link>
		<comments>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html#comments</comments>
		<pubDate>Fri, 18 Jun 2010 03:56:23 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=301</guid>
		<description><![CDATA[OAuthを使えるようになっておけば今後いろいろなマッシュアップに便利だろうと思い、試してみました。RoRで書いたのは、最近ご無沙汰過ぎてあまりに覚えてなかったのでリハビリを兼ねたわけです。 class TwitterAuth require &#8216;oauth&#8217; def self.consumer OAuth::Consumer.new( [Consumer key], [Consumer secret], :site =&#62; &#8220;http://api.twitter.com&#8221; ) end def self.request_token(_token, _secret) OAuth::RequestToken.new( consumer, _token, _secret ) end def self.access_token(_token, _secret) OAuth::AccessToken.new( consumer, _token, _secret ) end end まずは上記のクラスを作成。OAuth関連の処理はこっちにやらせます。で、次がコントローラー。 require &#8216;rubytter&#8217; class AuthController &#60; ApplicationController def index request_token = TwitterAuth.consumer.get_request_token(:oauth_callback =&#62; &#8220;http://#{request.host_with_port}/auth/callback&#8221;) session[:request_token] = request_token redirect_to request_token.authorize_url [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F06%252Frubyonrails-oauth-twitter.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RubyonRails%E3%81%A7OAuth%E7%B5%8C%E7%94%B1%E3%81%A7Twitter%E3%81%AE%E3%82%BF%E3%82%A4%E3%83%A0%E3%83%A9%E3%82%A4%E3%83%B3%E3%82%92%E5%8F%96%E5%BE%97%E3%81%99%E3%82%8B%22%20%7D);"></div>
<p>OAuthを使えるようになっておけば今後いろいろなマッシュアップに便利だろうと思い、試してみました。RoRで書いたのは、最近ご無沙汰過ぎてあまりに覚えてなかったのでリハビリを兼ねたわけです。</p>
<blockquote><p>class TwitterAuth<br />
require &#8216;oauth&#8217;</p>
<p style="padding-left: 30px;">def self.consumer</p>
<p style="padding-left: 60px;">OAuth::Consumer.new(<br />
[Consumer key],<br />
[Consumer secret],<br />
:site =&gt; &#8220;http://api.twitter.com&#8221;<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def self.request_token(_token, _secret)</p>
<p style="padding-left: 60px;">OAuth::RequestToken.new(<br />
consumer,<br />
_token,<br />
_secret<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def self.access_token(_token, _secret)</p>
<p style="padding-left: 60px;">OAuth::AccessToken.new(<br />
consumer,<br />
_token,<br />
_secret<br />
)</p>
<p style="padding-left: 30px;">end</p>
<p>end</p></blockquote>
<p>まずは上記のクラスを作成。OAuth関連の処理はこっちにやらせます。で、次がコントローラー。</p>
<blockquote><p>require &#8216;rubytter&#8217;</p>
<p>class AuthController &lt; ApplicationController</p>
<p style="padding-left: 30px;">def index</p>
<p style="padding-left: 60px;">request_token = TwitterAuth.consumer.get_request_token(:oauth_callback =&gt; &#8220;http://#{request.host_with_port}/auth/callback&#8221;)<br />
session[:request_token] = request_token<br />
redirect_to request_token.authorize_url</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def callback</p>
<p style="padding-left: 60px;">_token = session[:request_token]<br />
request_token = TwitterAuth.request_token(_token.token, _token.secret)<br />
access_token = request_token.get_access_token(<br />
{},<br />
:oauth_token =&gt; params[:oauth_token],<br />
:oauth_verifier =&gt; params[:oauth_verifier]<br />
)<br />
session[:request_token]=nil<br />
_account = {<br />
:user_id =&gt; access_token.params[:user_id],<br />
:token =&gt; access_token.token,<br />
:secret =&gt; access_token.secret<br />
}<br />
session[:account] = _account<br />
redirect_to :action =&gt; &#8220;timeline&#8221;</p>
<p style="padding-left: 30px;">end</p>
<p style="padding-left: 30px;">def timeline</p>
<p style="padding-left: 60px;">_account = session[:account]<br />
token = TwitterAuth.access_token(_account[:token] , _account[:secret])<br />
_twitter = OAuthRubytter.new(token)<br />
@user_timeline = _twitter.user_timeline(_account[:user_id],:count =&gt; 100)</p>
<p style="padding-left: 30px;">end</p>
<p>end</p></blockquote>
<p>def timelineが自分のタイムラインを取ってくるところで、「:count=&gt;100」と指定しているのは「新着100件取ってきて」っていうことです。ここを指定しないでおくと規定値では２０件取得してくれます。def callbackでセッションに入れたuser_id、token、secretをデータベース等に保存しておけば次回以降はこれらだけで認証とツイートの取得ができます（というか認証自体はtokenとsecretだけでOK）。</p>
<p><a title="アプリケーション登録申請" href="http://twitter.com/apps/new" target="_blank">Twitterのアプリケーション登録申請</a>で登録する際、コールバックURLを指定しないとWebアプリケーションとして登録されません。「開発中だからURLなんて決まってないよ」っていうケースでも、適当なURLを登録しておいてください。どうせ実際のコールバックURLはRubyのスクリプトで指定しなおしています。ハセテツはここに気が付かず、そこそこの時間を浪費しました。</p>
<p>で、タイムラインを表示するviewは</p>
<blockquote><p>&lt;ul&gt;<br />
&lt;% for item in @user_timeline do -%&gt;<br />
&lt;li&gt;&lt;%= item.text %&gt;&lt;/li&gt;<br />
&lt;% end -%&gt;<br />
&lt;/ul&gt;</p></blockquote>
<p>こんな感じです。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/06/rubyonrails-oauth-twitter.html/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>PHPとRubyとPythonのパフォーマンスを比較してみました</title>
		<link>http://tt-house.com/2010/05/php-ruby-python-2.html</link>
		<comments>http://tt-house.com/2010/05/php-ruby-python-2.html#comments</comments>
		<pubDate>Tue, 11 May 2010 02:44:50 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=286</guid>
		<description><![CDATA[同じような処理をさせた場合、PHP、Ruby、Pythonでどの言語が一番早いのか。非常に気になるところでありますが、試したことがありませんでした。今回試してみたところ、意外な結果が出たのです。]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F05%252Fphp-ruby-python-2.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22PHP%E3%81%A8Ruby%E3%81%A8Python%E3%81%AE%E3%83%91%E3%83%95%E3%82%A9%E3%83%BC%E3%83%9E%E3%83%B3%E3%82%B9%E3%82%92%E6%AF%94%E8%BC%83%E3%81%97%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"></div>
<p><a title="RubyとPythonについて考えてみました" href="http://tt-house.com/2010/04/think-about-ruby-python.html" target="_blank">前回のエントリ</a>が結局フレームワークの話になってしまったため、新しいエントリを書きました。</p>
<p>同じような処理をさせた場合、どの言語が一番早いのか。非常に気になるところでありますが、試したことがありませんでした。今回試してみたところ、意外な結果が出たのです。</p>
<p>下の方に書いたそれぞれのプログラムを実行した結果の、プログラム内部で計測したミリ秒を比較してます。</p>
<table class="post">
<tbody>
<tr>
<th>PHP</th>
<th>Ruby</th>
<th>Python</th>
</tr>
<tr>
<td>2.80秒</td>
<td>0.36秒</td>
<td>0.93秒</td>
</tr>
</tbody>
</table>
<p>3回計測した平均です。同じ処理をさせるプログラムを書いたつもりですが、本当にフェアなものになっているのか正直自信がありません。そもそもPHPはWebアプリを主な目的としているとのことなので、こういう処理は得意としていないのかもしれない。</p>
<p>また、それぞれのプログラムのループ内2行目、文字列連結の部分をコメントアウトして実行してみると、これまた意外な結果が出ました。</p>
<table class="post">
<tbody>
<tr>
<th>PHP</th>
<th>Ruby</th>
<th>Python</th>
</tr>
<tr>
<td>0.07秒</td>
<td>0.06秒</td>
<td>0.39秒</td>
</tr>
</tbody>
</table>
<p>PHPは文字列連結が苦手なんだろうか。暗黙的な型変換にコストがかかるのだろうか、等々考えてしまいます。それとも秒を求める部分がネックなんですかね。その辺は今後追っていきます。</p>
<p>ただ、これまでPythonの方がRubyより早い、と思っていたために自分の無知さに猛烈に恥ずかしい思いをしています。</p>
<p>実際にMySQLと連携するバッチを書いたときにはRubyの方が遅かったり、Railsアプリがもっさりだったり、「速い」という印象がまったくありませんでした。が、それはある特定の面しかみていない上での思い込みだったのかもしれません。</p>
<p>これはRailsが遅いのか、もしくはMySQL/Rubyが遅いのか。当時の書き方がマズかったのか。今後、いろんなケースでこういった比較をしてみようかと。</p>
<p>今回の検証がすべてではないし、これが答えだとも思っていません。また、そういう意図を含んだエントリではありません。今回の検証だって、特定の面しか見ていません。が、あまりに意外な結果だったため、自戒の念を含めてブログに書きました。</p>
<p>「こう書くともっとフェアだよ」「こういうテストの方がいいんじゃない」等、アドバイスいただけるとうれしいです。</p>
<p>フレームワークまで含めた検証した方が現実的なのだろうか。。。</p>
<hr /><strong>PHP</strong></p>
<blockquote><p>#!/usr/bin/php<br />
&lt;?<br />
function microtime_float()<br />
{</p>
<p style="padding-left: 30px;">list($usec, $sec) = explode(&#8221; &#8220;, microtime());<br />
return ((float)$usec + (float)$sec);</p>
<p>}<br />
$_start = microtime_float();<br />
$_sec = date(&#8216;s&#8217;);</p>
<p>for($i=1;$i&lt;100000;$i++)<br />
{</p>
<p style="padding-left: 30px;">$_val = (mt_rand(0, 100) + $i) / $i;<br />
$_str = $_val.date(&#8216;s&#8217;);</p>
<p>}</p>
<p>echo microtime_float() &#8211; $_start;<br />
?&gt;</p></blockquote>
<p><strong>Ruby</strong></p>
<blockquote><p>#! /usr/local/bin/ruby</p>
<p>i=1<br />
_start = Time.now</p>
<p>99999.times do</p>
<p style="padding-left: 30px;">_val = rand(100) / i<br />
_str = _val.to_s + Time.now.sec.to_s<br />
i += 1</p>
<p>end</p>
<p>p (Time.now &#8211; _start).to_f</p></blockquote>
<p><strong>Python</strong></p>
<blockquote><p>#!/usr/bin/python<br />
# -*- coding: utf-8 -*-<br />
import datetime<br />
import random</p>
<p>_start = datetime.datetime.now()</p>
<p>for i in range(1, 100000):</p>
<p style="padding-left: 30px;">_val = random.randint(0, 100) / i<br />
_str = str(_val) + str(datetime.datetime.now().second)</p>
<p>print datetime.datetime.now() &#8211; _start</p></blockquote>
<hr />検証環境</p>
<p>CPU:Xeon 1.86GHz<br />
メモリ:2GB<br />
OS: CentOS5.4 32bit<br />
PHP:5.2.11<br />
Ruby:1.8.7<br />
Python:2.5.2</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/05/php-ruby-python-2.html/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>RubyとPythonについて考えてみました</title>
		<link>http://tt-house.com/2010/04/think-about-ruby-python.html</link>
		<comments>http://tt-house.com/2010/04/think-about-ruby-python.html#comments</comments>
		<pubDate>Tue, 27 Apr 2010 05:28:06 +0000</pubDate>
		<dc:creator>ハセテツ</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://tt-house.com/?p=278</guid>
		<description><![CDATA[ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。

ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。

まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2010%252F04%252Fthink-about-ruby-python.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A8Python%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E8%80%83%E3%81%88%E3%81%A6%E3%81%BF%E3%81%BE%E3%81%97%E3%81%9F%22%20%7D);"></div>
<p>ハセテツは複数の言語を状況に応じて使い分けてきましたが、最近のWeb系開発はPython（+Django）がメインになってきています。</p>
<p>ちょっと前までRuby（+Rails）だったのですが、いろいろと考えるところもあり、乗り換えました。その乗り換えた理由をまとめてみようと思います。</p>
<p>まとめてみたら「やっぱりRailsじゃね？」となるかもしれません。ｗ</p>
<p>Ruby（+Rails）</p>
<ul>
<li>Rails便利すぎる。</li>
<li>コントローラとモデルが別々のファイルになってくれるのはソースが追いやすい。</li>
<li>Railsを通さない画像やCSSはpublicフォルダに置けばよいのはわかりやすい。</li>
<li>urlディスパッチャーがいまいち使いにくい。（知らないだけかも）</li>
<li>APサーバはmongrel一択？</li>
<li>VirtualHost使おうとするとApache+Passenger（mod_rails）だが、これが重い。（チューニングで速くなるのかも）</li>
<li>というか、Railsがそもそも重い。</li>
<li>ちゅーか、Rubyが重い、遅い。</li>
<li>PassengerはWindowsじゃ動かない。</li>
<li>mongrelもPassengerより激速軽快かというと、そうでもない。</li>
<li>gem便利すぎ。</li>
<li>ワンライナで書く人が多くて、Perlとおなじ匂いがする。</li>
</ul>
<p>ハセテツが使っていたRubyは1.8で、速くなったといわれる1.9には触れていないのでもしかすると古いのかもしれません。でも、Railsって1.9には対応してないですよね？（本日現在）</p>
<p>Python（+Django）</p>
<ul>
<li>Django便利すぎる。</li>
<li>日本語の書籍、情報が少なすぎる。（ハマるとキツい）</li>
<li>modelが一枚のファイルなので、大量のmodelがあると可読性が激しくダウン。</li>
<li>viewファイルをフォルダで分けたくても、アプリケーションフォルダ直下以外にviewファイル置くなら「sys.path.append」しないといけない。（違う？）</li>
<li>urlディスパッチャーのカスタマイズが超便利。</li>
<li>mod_pythonが使えるので、Windows環境だろうがLinux環境だろうが気にせずVirtualHostが使える。</li>
<li>速い。</li>
<li>日本語大変。Shift_JIS怖い。</li>
<li>easy_installでパッケージのインストールは楽だが、管理が悪夢。</li>
</ul>
<p>メリットとデメリットが入り乱れました。見難くてすいません。</p>
<p>結局フルスタックのフレームワークということで、DjangoとRailｓに関しては一長一短だと思います。個人的にはRailsの方が良くできてたかなぁと。</p>
<p>最終的に、「RubyonRailsは重い」というオチになってしまうのです。Rubyも、Railsも、です。ただ、これはRuby1.9が実は劇的に速くなっていて、1.9に対応したRailsがリリースされたらすべて解決されるのかもしれません。</p>
<p>それでも、いまのところPythonの軽快さ、シンプルさに満足しています。あと、GAEでPythonが動くのもいいですよね。</p>
<p>「Googleが導入した言語」というのがハセテツ的に琴線に触れたのかもしれません。</p>
<p>ミーハーですいません。ｗ</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2010/04/think-about-ruby-python.html/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>RubyonRailsでページングする方法</title>
		<link>http://tt-house.com/2009/09/pagenate_on_rubyonrails.html</link>
		<comments>http://tt-house.com/2009/09/pagenate_on_rubyonrails.html#comments</comments>
		<pubDate>Mon, 28 Sep 2009 13:38:56 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=113</guid>
		<description><![CDATA[will_paginateを利用します。とってもらくちんです。 require ...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F09%252Fpagenate_on_rubyonrails.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RubyonRails%E3%81%A7%E3%83%9A%E3%83%BC%E3%82%B8%E3%83%B3%E3%82%B0%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>will_paginateを利用します。とってもらくちんです。</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>require &#8216;will_paginate&#8217;</p>
<p>def hoge<br />&nbsp; @items = Item.pagenate(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; :conditions =&gt; ["hoge= ?", hoge],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:page =&gt; params[:page],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:per_page =&gt; 30)<br />end</p>
</blockquote>
<p dir="ltr">コントローラ側は以上。30レコードでページングします。find_by_sqlみたいな使い方も可能です。</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p dir="ltr">&nbsp; @items = Item.paginate_by_sql(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;["select * from hoge where hoge = ?", hoge],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:page =&gt; params[:page],<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;:per_page =&gt; 30)</p>
</blockquote>
<p dir="ltr">たいして変わりません。View側も通常のActiveRecordとの違いは</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p dir="ltr">&lt;%= will_paginate @items, :prev_label =&gt; &#8216;&lt; 前&#8217;, :next_label =&gt; &#8216;次 &gt;&#8217; %&gt;</p>
</blockquote>
<p dir="ltr">こういうタグを記述しておけば勝手にページングアンカーが表示されるようになるくらいです。</p>
<p dir="ltr">:prev_labelは指定しなくてもOKです。デフォルトの文字列が表示されます。</p>
<p dir="ltr">&nbsp;</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/09/pagenate_on_rubyonrails.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyonRailsでform_tagのselect_tagを使う</title>
		<link>http://tt-house.com/2009/08/rubyonrailsform_tagselect_tag.html</link>
		<comments>http://tt-house.com/2009/08/rubyonrailsform_tagselect_tag.html#comments</comments>
		<pubDate>Tue, 25 Aug 2009 12:55:19 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=110</guid>
		<description><![CDATA[#コントローラ側@target_year_options = [2007, 2...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F08%252Frubyonrailsform_tagselect_tag.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RubyonRails%E3%81%A7form_tag%E3%81%AEselect_tag%E3%82%92%E4%BD%BF%E3%81%86%22%20%7D);"></div>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>#コントローラ側<br />@target_year_options = [2007, 2008, 2009]</p>
<p>#ビュー側<br />&lt;%= select_tag(&#8220;target_year&#8221;, options_for_select(@target_year_options, Time.now.year)) %&gt;</p>
</blockquote>
<p>引数は「名前、option（要素配列、selectedの値）」ですね。selectedの値は省略可能です。</p>
<p>ビュー側に</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>&lt;%= select_tag(&#8220;target_month&#8221;, options_for_select(['01','02','03','04','05','06','07','08','09','10','11','12'], Time.now.month )) %&gt;</p>
</blockquote>
<p>って感じで直接配列を書き込むことも可能。</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>&lt;%= select_tag(&#8220;target_month&#8221;, options_for_select([['一月',1],['二月',2],['三月',3],['四月',4]], Time.now.month )) %&gt;</p>
</blockquote>
<p>これで表示は漢字、valueが数字、っていうやり方もできます。</p>
<p>こういうことも書き溜めておかないと、必要なときになってググるはめになるんですよね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/08/rubyonrailsform_tagselect_tag.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rubyで文字列エンコードの変換</title>
		<link>http://tt-house.com/2009/08/encoding-on-ruby.html</link>
		<comments>http://tt-house.com/2009/08/encoding-on-ruby.html#comments</comments>
		<pubDate>Thu, 13 Aug 2009 15:43:23 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=107</guid>
		<description><![CDATA[もう全部UTF8にしたいです。 require 'kconv' StrUTF8&#038;...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F08%252Fencoding-on-ruby.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A7%E6%96%87%E5%AD%97%E5%88%97%E3%82%A8%E3%83%B3%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E5%A4%89%E6%8F%9B%22%20%7D);"></div>
<p>もう全部UTF8にしたいです。</p>
<blockquote style="margin-right: 0px;" dir="ltr"><p>require &#8216;kconv&#8217;</p>
<p>StrUTF8   = 文字列.toutf8<br />
StrShiftJIS = 文字列.tosjis<br />
StrEUC   = 文字列.toeuc</p></blockquote>
<p dir="ltr">見たとおり、上からUTF8に変換、Shift_JISに変換、EUCに変換、です。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/08/encoding-on-ruby.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyonRailsでLike演算子を使ったあいまい検索をする方法</title>
		<link>http://tt-house.com/2009/07/rubyonrails-like-query.html</link>
		<comments>http://tt-house.com/2009/07/rubyonrails-like-query.html#comments</comments>
		<pubDate>Tue, 07 Jul 2009 10:38:22 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[SQL]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=104</guid>
		<description><![CDATA[:conditionsにクエリ文字列ごりごり書くなら別に気にしなくてもいいのです...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F07%252Frubyonrails-like-query.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RubyonRails%E3%81%A7Like%E6%BC%94%E7%AE%97%E5%AD%90%E3%82%92%E4%BD%BF%E3%81%A3%E3%81%9F%E3%81%82%E3%81%84%E3%81%BE%E3%81%84%E6%A4%9C%E7%B4%A2%E3%82%92%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>:conditionsにクエリ文字列ごりごり書くなら別に気にしなくてもいいのですが、まぁたいていはインジェクション対策も兼ねてプレースホルダーを使うか、シンボルを使うかのどちらかでは無いでしょうか。</p>
<p>ハセテツは前者です。PHPでもPEARを使っていたので、プレースホルダーを使っていました。</p>
<p>で、Rails（ActiveRecord）でプレースホルダーを利用している状況でLike演算子を使ったあいまい検索はどうしたらよいものか、と意外にシンプルな部分で躓いたりします。キーワード検索機能を実装しない限り、Like演算子って使わないですよね。</p>
<blockquote style="margin-right: 0px;" dir="ltr"><p>:conditions =&gt; ["hoge like ?", "%#{hogeParam}%"]</p></blockquote>
<p>上記の書き方であいまい検索ができました。手抜きではあるのですが、これでhogeParamが空白文字列であっても検索はできます。nilだったらどうしようもないですけどね。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/07/rubyonrails-like-query.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Rubyで書くか、PHPで書くか、それが問題だ</title>
		<link>http://tt-house.com/2009/07/ruby-or-php.html</link>
		<comments>http://tt-house.com/2009/07/ruby-or-php.html#comments</comments>
		<pubDate>Mon, 06 Jul 2009 17:31:40 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=103</guid>
		<description><![CDATA[はっきりいって、やっぱりRubyは遅いです。Railsじゃなくて、Rubyが遅い...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F07%252Fruby-or-php.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A7%E6%9B%B8%E3%81%8F%E3%81%8B%E3%80%81PHP%E3%81%A7%E6%9B%B8%E3%81%8F%E3%81%8B%E3%80%81%E3%81%9D%E3%82%8C%E3%81%8C%E5%95%8F%E9%A1%8C%E3%81%A0%22%20%7D);"></div>
<p>はっきりいって、やっぱりRubyは遅いです。Railsじゃなくて、Rubyが遅いです。Rubyでループしまくってデータをインポートするバッチを書いたら、C#で同じ処理をさせたときの倍近くかかりました。（正確に計測していないので倍は言いすぎだと思うが、体感できるぐらい遅かった。今度PHPで同じコードを書いてみよう）</p>
<p>いわれてみれば書いてて気持ちいいし、Railsはらくちんです。しかし、ここまで遅いとは思っていなかった。ただ、遅いといってもフツーのWebアプリを開発する分にはそれほど大差は出ないのかもしれません。それでもやっぱりループ処理は遅いなぁ。イテレータのおかげでらくちんではあるのですが。</p>
<p>ORマッパーは、便利ですがやはり不安を常に感じてしまいます。ループ処理するときにはORマッパー任せにしないでfind_by_sqlで自分でSQLを書いちゃいます。そうしないと、100回のループで100件の問い合わせをされちゃいます。ここは外部結合使ってごっそり取ってきて欲しかった。まぁ、MySQLは外部結合するよりクエリ連打した方が早いからいいのかな。</p>
<p>ただし、ルーテイングは便利です。コントローラとアクションの管理がラクなので、あとからソースを追うときに非常にラクです。さらに、MVCの管理がすっきりしてます。</p>
<p>「それだけならCakePHPでもいいじゃないか」といわれそうですが、CakePHPはRubyonRailsより遅いというベンチを誰かのブログで拝見しました。いやー、アレ以上遅いのはさすがにパスかな。symfonyも同様みたいです。</p>
<p>小規模サイトで開発メンバーの入れ替わりがあるなら、フレームワークは必須でしょう。中規模以上になってもハードウェアに予算投入で解決できるならそれほど問題にはならないと思います。</p>
<p>予算が限られ、自社内コンテンツみたいに開発メンバーが限定されるのであれば、ピュアなPHPとSmarty、URLをきれいにしたければ（GETにだらだらつけたくなければ）mod_rewriteを使えばよいかと。</p>
<p>自社内コンテンツであっても、メンテナンスなどを考えるとフレームワークを導入した方がいい気もするのですが、サイトの成長計画と相談ですかねぇ。</p>
<p>あ、言語の話じゃなくてフレームワークの話になってきちゃった。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/07/ruby-or-php.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyonRailsでクッキーの処理をモジュールで共通化する方法</title>
		<link>http://tt-house.com/2009/06/rubyonrails-include-cookies.html</link>
		<comments>http://tt-house.com/2009/06/rubyonrails-include-cookies.html#comments</comments>
		<pubDate>Thu, 18 Jun 2009 12:53:37 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[RubyOnRails]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=102</guid>
		<description><![CDATA[猛烈にはまったので、これは書き残しておかないと後々後悔すると思った次第であります...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F06%252Frubyonrails-include-cookies.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22RubyonRails%E3%81%A7%E3%82%AF%E3%83%83%E3%82%AD%E3%83%BC%E3%81%AE%E5%87%A6%E7%90%86%E3%82%92%E3%83%A2%E3%82%B8%E3%83%A5%E3%83%BC%E3%83%AB%E3%81%A7%E5%85%B1%E9%80%9A%E5%8C%96%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95%22%20%7D);"></div>
<p>猛烈にはまったので、これは書き残しておかないと後々後悔すると思った次第であります。もしかするとハセテツがやり方を知らないだけで意外と簡単なのかもしれません。もし「いやいや、あんたが知らないだけでこうやるとラクチンだよ」という情報お持ちの方がいたら教えていただけると非常にありがたいです。</p>
<p>Railsでクッキーを扱う際、コントローラに書けば特に問題はありません。ただ、メソッドをモデルやモジュール側に書いて置くと、コールしたときに怒られます。これはApplicationControllerを継承していないからのようです。といって、他のコントローラの中にメソッドを書いておいてそれをコールしても怒られます。クッキーは「自分のトコで処理しろや」ということなのでしょうか。</p>
<p>かといって、クッキーのチェックなどなどをすべてのコントローラに書くのはDRYに反しているのでは、と悩んでおったのです。</p>
<blockquote style="margin-right: 0px;" dir="ltr"><p>module HogeModule<br />
 <br />
  def self.included(base)<br />
  base.class_eval{</p>
<p>    def set_cookies</p>
<p>      cookies[:key] = {:value =&gt; &#8220;hogehoge&#8221;, :path =&gt; &#8220;/&#8221;, :expires =&gt; Time.now + 45 }<br />
      end</p>
<p>    }<br />
  end</p>
<p>end</p></blockquote>
<p>上記のようなモジュールを用意します。これは、このモジュールがコントローラからインクルードされるとset_cookiesというメソッドがインクルードした方のコントローラ側に展開され、selfとして扱えるということです。つまり、コントローラ自身のメソッドになる、という感じです（多分）。</p>
<p>あとはコントローラからset_cookiesをコールするだけです。エラーはでず、クッキーも書き込まれます。</p>
<p>base.class_evalの中に:before_filterを書いておけば、インクルードされるたびにフィルターも実行されます。ハセテツはbefore_filterでクッキーのチェックを行い、メソッドで書き込みを行うように書きました。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/06/rubyonrails-include-cookies.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>RubyでPOST送信して結果を受け取る</title>
		<link>http://tt-house.com/2009/06/ruby-post-data.html</link>
		<comments>http://tt-house.com/2009/06/ruby-post-data.html#comments</comments>
		<pubDate>Wed, 17 Jun 2009 11:55:46 +0000</pubDate>
		<dc:creator></dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://www.tt-house.com//wp/?p=101</guid>
		<description><![CDATA[RubyでHTTP経由でのXMLの受信と解析でGETする方法は書きましたが、PO...]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Ftt-house.com%252F2009%252F06%252Fruby-post-data.html%22%2C%20%22style%22%3A%20%22big%22%2C%20%22title%22%3A%20%22Ruby%E3%81%A7POST%E9%80%81%E4%BF%A1%E3%81%97%E3%81%A6%E7%B5%90%E6%9E%9C%E3%82%92%E5%8F%97%E3%81%91%E5%8F%96%E3%82%8B%22%20%7D);"></div>
<p><a href="http://www.tt-house.com/2009/05/rubyhttpxml.html">RubyでHTTP経由でのXMLの受信と解析</a>でGETする方法は書きましたが、POSTまでは書いていませんでした。今回はRubyでPOSTする方法です。GETで猛烈に長いクエリをつければPOSTできなくても同じことが実現できますが、まぁそこは気にせず。</p>
<blockquote style="MARGIN-RIGHT: 0px" dir="ltr">
<p>require &#8216;net/http&#8217;<br />Net::HTTP.version_1_2<br />http = Net::HTTP.new(ホスト名, 80)<br />response = http.post( &#8216;/hoge.php&#8217;, &#8216;a=hoge&amp;b=hogehoge&#8217; )<br />p response.body</p>
</blockquote>
<p>これだけ。ホスト名にはhttpは付けません。ポート番号は省略しても大丈夫です。Content-Type等は必要に応じて。newするときの第三引数です。「application/x-www-form-urlencoded」でいいのかな？ハセテツはつけてませんが、きちんとPOSTできてます。あー、相手がUTF8じゃない場合とかは文字コードの指定が必要かも。</p>
<p>responseの中身を見ればHTTPステータスコードとかも入っていると思います。その辺は割愛。</p>
<p>次はファイルのアップロードのやり方なんかも調べてみましょう。使うかどうかは微妙な気もしますが。</p>

]]></content:encoded>
			<wfw:commentRss>http://tt-house.com/2009/06/ruby-post-data.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
