<?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>tomatomax.net &#187; Ruby</title>
	<atom:link href="http://blog.tomatomax.net/archives/category/program/ruby/feed" rel="self" type="application/rss+xml" />
	<link>http://blog.tomatomax.net</link>
	<description>Every rule has its exception.</description>
	<lastBuildDate>Wed, 07 Jul 2010 08:41:45 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</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.tomatomax.net/archives/category/program/ruby/feed" />
		<item>
		<title>uninitialized constant Class::YAML (NameError)</title>
		<link>http://blog.tomatomax.net/archives/2539</link>
		<comments>http://blog.tomatomax.net/archives/2539#comments</comments>
		<pubDate>Sun, 08 Mar 2009 05:42:58 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/?p=2539</guid>
		<description><![CDATA[自宅サーバのアップデートを行ったのだけれども、そのあといつの間にかBotが止まっていた。いつもはcronで動かしているけど、手動で実行してみると以下のエラー。

/usr/lib/ruby/gems/1.8/gems/t [...]]]></description>
			<content:encoded><![CDATA[<p>自宅サーバのアップデートを行ったのだけれども、そのあといつの間にかBotが止まっていた。いつもはcronで動かしているけど、手動で実行してみると以下のエラー。</p>
<blockquote><p>
/usr/lib/ruby/gems/1.8/gems/twitter4r-0.3.0/lib/twitter/console.rb:23:in `from_config&#8217;: uninitialized constant Class::YAML (NameError)
</p></blockquote>
<p>とりあえずエラーメッセージでぐぐってみると、以下の記事がヒット。<br />
<a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/704e9cb3e41c7448?pli=1"><br />
environment.rb uninitialized constant when starting console </a><br />
この記事に書いてあるとおり、require &#8216;yaml&#8217;を追加することで無事復活。今は反応するようになってます<br />
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2539/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2539" />
	</item>
		<item>
		<title>さくらサーバにWWW::Mechanizeをインストール</title>
		<link>http://blog.tomatomax.net/archives/2534</link>
		<comments>http://blog.tomatomax.net/archives/2534#comments</comments>
		<pubDate>Fri, 06 Mar 2009 13:23:28 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/?p=2534</guid>
		<description><![CDATA[さくらインターネットのサーバでこのブログを運用しているわけですが、せっかくサーバを借りてみたのでRubyスクリプトを動作させたい！
でもWWW::Mechanizeが入ってません＞＜
rubygemも入ってません(こっち [...]]]></description>
			<content:encoded><![CDATA[<p>さくらインターネットのサーバでこのブログを運用しているわけですが、せっかくサーバを借りてみたのでRubyスクリプトを動作させたい！</p>
<p>でもWWW::Mechanizeが入ってません＞＜</p>
<p>rubygemも入ってません(こっちはまあ当然か)</p>
<p><a href="http://d.hatena.ne.jp/ishimarum/20080929/1222689905">さくらのレンタルサーバーに RubyGems をインストールする手順</a>を参考に、rubygemをインストール。ここまでは問題なし。</p>
<p>続けてmechanizeのインストールに取り掛かったのだけれども、こっちは失敗。</p>
<blockquote><p>
%gem18 install nokogiri<br />
Building native extensions.  This could take a while&#8230;<br />
ERROR:  Error installing nokogiri:<br />
        ERROR: Failed to build gem native extension.</p>
<p>/usr/local/bin/ruby18 extconf.rb install nokogiri<br />
checking for #include
<libxml/parser.h>
&#8230; no<br />
libxml2 is missing.  try &#8216;port install libxml2&#8242; or &#8216;yum install libxml2&#8242;<br />
*** extconf.rb failed ***<br />
(略)
</p></blockquote>
<p>libxml2がないそうです。自分のサーバなら、書いてあるようにyumでインストールするところなんだけど、当然できません。なので、ユーザフォルダにlibxml2を展開してみる。<br />
<a href="http://xmlsoft.org/">The XML C parser and toolkit of Gnome</a>からlibxml2をダウンロード。prefixにユーザフォルダを指定してインストールします(UserNameを自分のユーザ名に置き換える)</p>
<blockquote><p>
%./configure &#8211;prefix=/home/UserName<br />
%make<br />
%make install
</p></blockquote>
<p>あとはインストールしたヘッダを読むように指定してmechanizeのインストール</p>
<blockquote><p>
%gem18 install mechanize &#8212; &#8211;with-opt-include=/home/UserName/include/libxml2<br />
Building native extensions.  This could take a while&#8230;<br />
Successfully installed nokogiri-1.2.1<br />
Successfully installed mechanize-0.9.2<br />
2 gems installed<br />
Installing ri documentation for nokogiri-1.2.1&#8230;<br />
Installing ri documentation for mechanize-0.9.2&#8230;<br />
Installing RDoc documentation for nokogiri-1.2.1&#8230;<br />
Installing RDoc documentation for mechanize-0.9.2&#8230;<br />
%
</p></blockquote>
<p>今度は成功。ページも取得できているみたい。<br />
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2534/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2534" />
	</item>
		<item>
		<title>net/imapでGMailのメールを取得</title>
		<link>http://blog.tomatomax.net/archives/2355</link>
		<comments>http://blog.tomatomax.net/archives/2355#comments</comments>
		<pubDate>Sat, 29 Mar 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2355</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>自動でfollowするように、GMailに届いたfollow通知からユーザ名を取り出してみる。IMAPでやってみた版。</p>
<p>参考:<a href="http://youichi-kato.cocolog-nifty.com/blog/2008/03/ruby_gmail_imap_bf37.html" target="_blank">katoy: cocolog: ruby で gmail (imap) にアクセスする練習</a></p>
<pre class="syntax-highlight">
<span class="synPreProc">require</span> <span class="synSpecial">'</span><span class="synConstant">net/imap</span><span class="synSpecial">'</span>

followers = []
username = <span class="synSpecial">&#34;</span><span class="synConstant">hoge</span><span class="synSpecial">&#34;</span>
password = <span class="synSpecial">&#34;</span><span class="synConstant">hogehoge</span><span class="synSpecial">&#34;</span>

port = <span class="synConstant">993</span>
usessl = <span class="synConstant">true</span>

<span class="synStatement">begin</span>
imap = <span class="synIdentifier">Net</span>::<span class="synIdentifier">IMAP</span>.new(<span class="synSpecial">&#34;</span><span class="synConstant">imap.gmail.com</span><span class="synSpecial">&#34;</span>, port, usessl)
p imap.greeting
imap.login(username, password)
imap.examine(<span class="synSpecial">&#34;</span><span class="synConstant">inbox</span><span class="synSpecial">&#34;</span>)
imap.fetch(<span class="synConstant">1</span>..-<span class="synConstant">1</span>, <span class="synSpecial">&#34;</span><span class="synConstant">ENVELOPE</span><span class="synSpecial">&#34;</span>).each <span class="synStatement">do</span> |<span class="synIdentifier">f</span>|
messageNo = f.seqno
subject = f.attr[<span class="synSpecial">&#34;</span><span class="synConstant">ENVELOPE</span><span class="synSpecial">&#34;</span>].subject
to_mailbox = f.attr[<span class="synSpecial">&#34;</span><span class="synConstant">ENVELOPE</span><span class="synSpecial">&#34;</span>].to[<span class="synConstant">0</span>].mailbox
<span class="synStatement">if</span> to_mailbox == <span class="synSpecial">&#34;</span><span class="synConstant">hoge+bot</span><span class="synSpecial">&#34;</span> &#38;&#38; <span class="synComment"># To:がhoge+bot@gmail.comのものを取り出す</span>
<span class="synSpecial">/</span><span class="synConstant">is now following you on Twitter</span><span class="synSpecial">/</span> =~ subject
imap.fetch(messageNo, <span class="synSpecial">&#34;</span><span class="synConstant">RFC822</span><span class="synSpecial">&#34;</span>).each <span class="synStatement">do</span> |<span class="synIdentifier">m</span>|
<span class="synComment"># ユーザ名を得る</span>
<span class="synStatement">if</span> <span class="synSpecial">/</span><span class="synConstant">http:\/\/twitter\.com\/(\w+)</span><span class="synSpecial">/</span> =~ m.attr[<span class="synSpecial">&#34;</span><span class="synConstant">RFC822</span><span class="synSpecial">&#34;</span>]
p <span class="synIdentifier">$1</span>
followers &#60;&#60; <span class="synIdentifier">$1</span>
<span class="synStatement">end</span>
<span class="synStatement">end</span>
<span class="synStatement">end</span>
<span class="synStatement">end</span>
followers.each { |<span class="synIdentifier">u</span>|
follow(u)
}
p <span class="synSpecial">&#34;</span><span class="synConstant">success</span><span class="synSpecial">&#34;</span>
<span class="synStatement">rescue</span>
p <span class="synSpecial">&#34;</span><span class="synConstant">failed</span><span class="synSpecial">&#34;</span>
<span class="synStatement">end</span>
</pre>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2355/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2355" />
	</item>
		<item>
		<title>twitter4r　その２</title>
		<link>http://blog.tomatomax.net/archives/2354</link>
		<comments>http://blog.tomatomax.net/archives/2354#comments</comments>
		<pubDate>Tue, 25 Mar 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2354</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p><a href="http://twitter.com/Hinnyu" target="_blank">例のBot</a>がFollowされるたびに、手動でFollowをする必要があった<span class="footnote"><a href="/maruguu/#f1" name="fn1" title="大変けまらしい勢いでした">*1</a></span>ので、twitter4rのfriend関連の機能を使って、自動Followを実装してみた。</p>
<pre class="syntax-highlight">
<span class="synPreProc">def </span><span class="synIdentifier">follow</span>(friend_name)
config_file = <span class="synIdentifier">File</span>::join(<span class="synIdentifier">File</span>.dirname(<span class="synConstant">__FILE__</span>), <span class="synSpecial">&#34;</span><span class="synConstant">conf_m.yaml</span><span class="synSpecial">&#34;</span>)
twitter = <span class="synIdentifier">Twitter</span>::<span class="synIdentifier">Client</span>.from_config(config_file, <span class="synSpecial">&#34;</span><span class="synConstant">prod</span><span class="synSpecial">&#34;</span>)
fri = twitter.my(<span class="synIdentifier">:friends</span>)
fri.each { |<span class="synIdentifier">user</span>|
<span class="synStatement">return</span> <span class="synStatement">if</span> user.screen_name == friend_name
}
twitter.friend(<span class="synIdentifier">:add</span>, friend_name)
<span class="synPreProc">end</span>
</pre>
<p>ログインしているところは前と同じ。my(:friends)でログインユーザのFollowing一覧を取得して、既に登録している人は弾く。friend(:add, ユーザ名)で指定したユーザをFollowする。</p>
<p>メールサーバを動かしていないので、一定間隔でGMailを見て新規Followerを取得してます。こっちは毎分動かしているわけではないのですぐにFollow返しはできません＞＜</p>
</div>
<div class="footnote">
<p class="footnote"><a href="/maruguu/#fn1" name="f1">*1</a>：大変けまらしい勢いでした</p>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2354/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2354" />
	</item>
		<item>
		<title>twitter/Hinnyu</title>
		<link>http://blog.tomatomax.net/archives/2353</link>
		<comments>http://blog.tomatomax.net/archives/2353#comments</comments>
		<pubDate>Mon, 24 Mar 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2353</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p><a href="http://twitter.com/Hinnyu/" target="_blank">Twitter / Hinnyu</a></p>
<p>Followingの特定の言葉に激しく反応します。手動Botと言われてる人に対抗するために作ってみました。<del datetime="2008-03-26T23:54:20+09:00">現在自動Followを行っていないので登録まで時間がかかります。</del>自動Followのテスト中です。登録まで大体1時間ほどかかります。</p>
<p><del datetime="2008-03-26T00:38:55+09:00">胸板が厚いので</del>Picture書いてくれる人募集中。</p>
<p></p>
<p>以下、実装の詳細とか。</p>
<p><a name="seemore"></a></p>
<p>反応するのは以下の正規表現。</p>
<pre class="syntax-highlight">
reg = <span class="synSpecial">/</span><span class="synConstant">(貧乳|ひんにゅう|ひんぬー|ひんにゅー|ペチャパイ|まな板|胸ぺったん|ベニア板|洗濯板)</span><span class="synSpecial">/</span>
</pre>
<p>語尾のパターンはこんだけ。あんまりパターンがないのでこれも案募集中。</p>
<pre class="syntax-highlight">
message = [<span class="synSpecial">&#34;</span><span class="synConstant">と申されたか！</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">と申されたな！</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">は正義！</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">はステータスだ 希少価値だ</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">と申しましたな！？</span><span class="synSpecial">&#34;</span>, <span class="synSpecial">&#34;</span><span class="synConstant">はいいものだ</span><span class="synSpecial">&#34;</span>]
</pre>
<p>以下の2つには反応しない。</p>
<ul>
<li>マッチする正規表現+&#8221;bot&#8221; (大文字小文字無視)</li>
<li>/^@w+s/</li>
</ul>
<p>2番目のように、今のところBot本体に@投げられても無視します。</p>
<p>あと、同じ発言に何回も反応しないように、最新の発言のidを記録しておいて、それ以上昔の発言は追わないようになってます。</p>
<p>元ネタの手動Botから引き継いだ機能として、一部の人にはまったく違う反応をします。下のコメント欄とかtwitterで@やDMいただければ一部の人に追加する対応もします(Botの名前とは全然関係なくなりますが)。</p>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2353/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2353" />
	</item>
		<item>
		<title>twitter4r</title>
		<link>http://blog.tomatomax.net/archives/2352</link>
		<comments>http://blog.tomatomax.net/archives/2352#comments</comments>
		<pubDate>Mon, 24 Mar 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2352</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>ruby用twitterライブラリ。Botを作るのに使ってみた。</p>
<p>詳細は<a href="http://twitter4r.rubyforge.org/rdoc/" target="_blank">Twitter4R v0.3.0: Open Source Ruby Client Library for the Twitter REST API</a>を参照。</p>
<h4>まとめ</h4>
<ul>
<li>&#8220;gem install twitter4r&#8221;でインストール</li>
<li>YAMLファイルにログインユーザ名、パスワードを記述</li>
<li>Twitter::Client.timeline_forでタイムライン取得。パラメータに:friendを指定するとFollowing込みのタイムラインを取得できる</li>
<li>Twitter::Client.statusで発言する</li>
</ul>
<p><a name="seemore"></a></p>
<h4>インストール</h4>
<pre class="syntax-highlight">
gem <span class="synStatement">install</span> twitter4r
</pre>
<p>公式には上のコマンドになっているけど、うちのマシンでやると&#8221;Bulk updating Gem source index for: <a href="http://gems.rubyforge.org" target="_blank">http://gems.rubyforge.org</a>&#8220;で止まったままになるので直接gemをダウンロードしてきてインストール。jsonが必要なので先にインストール。</p>
<pre class="syntax-highlight">
gem <span class="synStatement">install</span> json<span class="synConstant">-1</span>.<span class="synConstant">1</span>.<span class="synConstant">2</span>.gem
gem <span class="synStatement">install</span> twitter4r<span class="synConstant">-0</span>.<span class="synConstant">3</span>.<span class="synConstant">0</span>.gem
</pre>
<h4>ユーザ認証</h4>
<p>YAMLファイルを作成してそこにユーザ名とパスワードを書く。</p>
<pre class="syntax-highlight">
<span class="synIdentifier">test</span><span class="synSpecial">:</span>
<span class="synIdentifier">login</span><span class="synSpecial">:</span> hoge
<span class="synIdentifier">password</span><span class="synSpecial">:</span> hogehoge
<span class="synIdentifier">prod</span><span class="synSpecial">:</span>
<span class="synIdentifier">login</span><span class="synSpecial">:</span> foo
<span class="synIdentifier">password</span><span class="synSpecial">:</span> bar
</pre>
<p>作成したファイルは以下のように読み込む。同時にtwitterクライアントのインスタンスを取得。</p>
<pre class="syntax-highlight">
twitter = <span class="synIdentifier">Twitter</span>::<span class="synIdentifier">Client</span>.from_config(config_file, <span class="synSpecial">&#34;</span><span class="synConstant">prod</span><span class="synSpecial">&#34;</span>)
</pre>
<p>この例では&#8221;prod&#8221;を指定しているので&#8221;foo&#8221;の方でログインする。</p>
<p>必ずファイルに生パスワード書かないといけないのかどうかがよくわからんかった。irb用のHelperとは書いてあるのだけれども、他にログイン用のメソッドがあるのかな?</p>
<h4>タイムラインの読み込み</h4>
<p>timeline_forでタイムラインを取得。引数に:friendを指定するとログインユーザのFollowingを含めたタイムラインを取得ができる。他には:publicでパブリックタイムライン、:meで自分の発言のタイムラインを取得可能。引数を追加すると発言を絞り込める(id, since等)。当然twitter APIの制限を受けるので1時間に70回しか使えない。</p>
<pre class="syntax-highlight">
twitter.timeline_for(<span class="synIdentifier">:friend</span>).each { |<span class="synIdentifier">friend</span>|
<span class="synStatement">if</span> <span class="synSpecial">/</span><span class="synConstant">@foo</span><span class="synSpecial">/</span> =~ friend.text
twitter.status(<span class="synIdentifier">:post</span>, <span class="synSpecial">&#34;</span><span class="synConstant">@</span><span class="synSpecial">&#34;</span> + friend.user.screen_name + <span class="synSpecial">&#34;</span><span class="synConstant"> </span><span class="synSpecial">&#34;</span> + message)
<span class="synStatement">end</span>
}
</pre>
<p>取得したタイムラインから各ユーザの発言を取り出す時は、friend.textが各ユーザの発言、friend.user.screen_nameがユーザ名になる。</p>
<h4>発言</h4>
<p>statusの引数に:postを指定して第二引数に発言内容を指定する。</p>
<pre class="syntax-highlight">
twitter.status(<span class="synIdentifier">:post</span>, <span class="synSpecial">&#34;</span><span class="synConstant">@</span><span class="synSpecial">&#34;</span> + friend.user.screen_name + <span class="synSpecial">&#34;</span><span class="synConstant"> </span><span class="synSpecial">&#34;</span> + message)
</pre>
<h4>感想</h4>
<p>JavascriptでAPI直叩きのときよりはるかに簡単で使いやすい。Botの基本動作作るのに2時間もかからなかったのは満足。一番時間がかかってたのが&#8221;gem install twitter4r&#8221;だからなぁ。</p>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2352/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2352" />
	</item>
		<item>
		<title>Feed::rememberthemilk</title>
		<link>http://blog.tomatomax.net/archives/2342</link>
		<comments>http://blog.tomatomax.net/archives/2342#comments</comments>
		<pubDate>Sun, 13 Jan 2008 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2342</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>PraggerでRTMのデータを取得するためのプラグインを作ってみた。出力形式はどうするのがいいんだろ。</p>
<p><a href="http://code.google.com/p/pragger-feed-rememberthemilk/" target="_blank">pragger-feed-rememberthemilk &#8211; Google Code</a></p>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2342/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2342" />
	</item>
		<item>
		<title>Praggerさわってみた</title>
		<link>http://blog.tomatomax.net/archives/2331</link>
		<comments>http://blog.tomatomax.net/archives/2331#comments</comments>
		<pubDate>Wed, 12 Dec 2007 15:00:00 +0000</pubDate>
		<dc:creator>maruguu</dc:creator>
				<category><![CDATA[Program]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://blog.tomatomax.net/archives/2331</guid>
		<description><![CDATA[
]]></description>
			<content:encoded><![CDATA[<div class="section">
<p>「はらへった」と検索するとピザが注文されることで有名なPlaggerのruby版。ruby1.8.5以上が必要なのだけれども、aptitudeで落とそうとすると最新が1.8.2になっていたので、結局ソースからビルド。</p>
<p>落としたら後はサクサク……と行きたいところだったのだけれども、各モジュール間のデータの受け渡しの形式が良くわからなくて苦労した。</p>
<p><a name="seemore"></a></p>
<p>下のは2chのヘッドラインRSSから特定のカテゴリのヘッドラインを1行で出力するYAML。</p>
<pre class="syntax-highlight">
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">RSS</span><span class="synSpecial">::</span>load
<span class="synIdentifier">config</span><span class="synSpecial">:</span>
<span class="synIdentifier">url</span><span class="synSpecial">:</span> <span class="synIdentifier">http</span><span class="synSpecial">:</span>//headline.<span class="synConstant">2</span>ch.net/bbynews/news.rss
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">Filter</span><span class="synSpecial">::</span>get_title
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">Filter</span><span class="synSpecial">::</span>grep
<span class="synIdentifier">config</span><span class="synSpecial">:</span>
<span class="synIdentifier">regex</span><span class="synSpecial">:</span> <span class="synConstant">&#34;\[[ビ速二]&#34;</span>
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">Filter</span><span class="synSpecial">::</span>subs
<span class="synIdentifier">config</span><span class="synSpecial">:</span>
<span class="synIdentifier">regex</span><span class="synSpecial">:</span> <span class="synConstant">&#34;\[[ビ速二][＋軍]\] &#34;</span>
<span class="synIdentifier">to</span><span class="synSpecial">:</span> <span class="synConstant">&#34;&#34;</span>
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> concat
<span class="synIdentifier">config</span><span class="synSpecial">:</span>
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> stdin
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">Filter</span><span class="synSpecial">::</span>subs
<span class="synIdentifier">config</span><span class="synSpecial">:</span>
<span class="synIdentifier">regex</span><span class="synSpecial">:</span> <span class="synConstant">&#34;</span><span class="synSpecial">\n</span><span class="synConstant">&#34;</span>
<span class="synIdentifier">to</span><span class="synSpecial">:</span> <span class="synConstant">&#34;&#34;</span>
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> <span class="synIdentifier">Filter</span><span class="synSpecial">::</span>uniq
<span class="synStatement">-</span> <span class="synIdentifier">module</span><span class="synSpecial">:</span> stdout
</pre>
<p>Filter::get_titleとFilter::uniqは一応自作。ほとんど手がかかってないけど。</p>
<pre class="syntax-highlight">
<span class="synPreProc">def </span><span class="synIdentifier">get_title</span>(config,data)
r = []
data.each {|<span class="synIdentifier">i</span>| r.push(<span class="synStatement">eval</span>(<span class="synSpecial">&#34;</span><span class="synConstant">i.title</span><span class="synSpecial">&#34;</span>)) }
<span class="synStatement">return</span> r
<span class="synPreProc">end</span>
</pre>
<pre class="syntax-highlight">
<span class="synPreProc">def </span><span class="synIdentifier">uniq</span>(config, data)
<span class="synStatement">return</span> data.uniq
<span class="synPreProc">end</span>
</pre>
<p>実行方法。</p>
<pre class="syntax-highlight">
$ ./pragger <span class="synSpecial">-c</span> rss2ch.yaml <span class="synStatement">&#60;</span> output1.txt <span class="synStatement">&#62;</span> output2.txt
...
$ cat output2.txt
【米国】ロサンゼルス南部でファストフード店廃止案
【滋賀】医療保険金還付と不審電話相次ぐ
【企業】赤福、年内営業再開は困難　１４日に改善計画書
$
</pre>
<p>標準入出力を使っているのは変えたい。あとはデータ量を抑えたいのでリストの要素数を制限するフィルタを作るか。</p>
</div>
<p><script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 336x280, 作成済み 10/04/25 */
google_ad_slot = "6994973421";
google_ad_width = 336;
google_ad_height = 280;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script>
<script type="text/javascript"><!--
google_ad_client = "pub-0582565723906120";
/* 200x90, 作成済み 10/04/25 */
google_ad_slot = "9492987907";
google_ad_width = 200;
google_ad_height = 90;
//-->
</script>
<script type="text/javascript"
src="http://pagead2.googlesyndication.com/pagead/show_ads.js">
</script></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.tomatomax.net/archives/2331/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
	<xhtml:link rel="alternate" media="handheld" type="text/html" href="http://blog.tomatomax.net/archives/2331" />
	</item>
	</channel>
</rss>
