Ruby1.9スクリプト(Twitterbot)をLinuxデーモン化する方法
にて、Rubyスクリプトをデーモン化して、簡単に自動起動と停止できるようにしました。
ですが、何らかの影響で、Rubyスクリプトが終了してしまった場合にスクリプトが落ちたままになってしまいます。これは精神衛生上非常に良くない。
今回は、daemontoolsを使用して、プロセスが終了しても自動的に立ち上げ直す状態をつくります。

Ruby1.9スクリプト(Twitterbot)をLinuxデーモン化する方法
にて、Rubyスクリプトをデーモン化して、簡単に自動起動と停止できるようにしました。
ですが、何らかの影響で、Rubyスクリプトが終了してしまった場合にスクリプトが落ちたままになってしまいます。これは精神衛生上非常に良くない。
今回は、daemontoolsを使用して、プロセスが終了しても自動的に立ち上げ直す状態をつくります。
Ruby 1.9系からRubyスクリプトをデーモン化するのが1行できるようになりました。
昨日インストールしたRedmineですが、格安VPSで動かすにはちとメモリを使いすぎる。
Ruby Enterprise Editionでpassengerを動かして、45%ものメモリを節約することに成功した。
その一部始終を語ろう。
Redmineはプロジェクト管理ソフトウェアです。
など、企業・個人で有効活用できるツールです。個人で活用することも考えてみます。
必要なgemをインストールしておきましょう。
$ gem install twitter logger $ gem server
これがgemのドキュメントなので複雑なことがやりたくなったら見てください。
コンシューマーキーなどを事前に入手しておく。
XXXXXXXで埋められている部分を自分の上記で入手したKEYに変更してください。
require "rubygems"
require "twitter"
require 'logger'
LOG = Logger.new('tweet.log')
CONSUMER_KEY = 'XXXXXXXXXXXXX'
CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXX'
ACCESS_TOKEN = 'XXXXXXXXXXXXXXXXXXXXXX'
ACCESS_SECRET = 'XXXXXXXXXXXXXXXXXXXXXX'
Twitter.configure do |config|
config.consumer_key = CONSUMER_KEY
config.consumer_secret = CONSUMER_SECRET
config.oauth_token = ACCESS_TOKEN
config.oauth_token_secret = ACCESS_SECRET
end
tweet = ['つぶやきA',
'つぶやきB',
'つぶやきC']
client = Twitter::Client.new
begin
client.update(tweet[rand(tweet.length)])
rescue => ex
LOG.warn ex
sleep 5
retry
end
これをcronなどで定期的に回せば、ランダムでつぶやいてくれます。
その他の参考情報
TwitterのAPIをRubyでいじっていたので、書きました。
CONSUMER_KEYとCONSUMER_SECRETは事前に入手して、スクリプトの最初の部分を書き換えてください。
[Register new app]をクリックしてこんな感じで入力すればすぐに手に入ります。
gem oauthがインストールされていなければ、こんな感じでインストールしてください。
$ gem install oauth
スクリプト
require "rubygems" require "oauth" CONSUMER_KEY = 'XXXXXXXXXXXXXXXXXXXX' CONSUMER_SECRET = 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' consumer = OAuth::Consumer.new(CONSUMER_KEY, CONSUMER_SECRET, :site => "http://twitter.com") request_token = consumer.get_request_token print "このURLにアクセスして出力された番号(PIN)を入力してください。" print request_token.authorize_url # requrest tokenをもとに認証URLを生成 oauth_verifier = gets oauth_verifier.chomp! access_token = request_token.get_access_token(:oauth_verifier => oauth_verifier ) print "ACCESS_TOKEN:" + access_token.token print "ACCESS_SECRET:" + access_token.secret
手元にコピペして、こんな感じで実行すれば、すぐにACCESS_TOKENとACCESS_SECRETが入手できます。
$ ruby -l ./twitter_oauth.rb このURLにアクセスして出力された番号(PIN)を入力してください : http://twitter.com/oauth/authorize?oauth_token=aKHHE9jJS6L6tWZUIegxIxxxxx1ksRUtcyc1RQvU93Y 9111112 ACCESS_TOKEN:68914747-eFfUsIyWHRMxxxxx68254IxBPQQmJIhr4n1NJWikI ACCESS_SECRET:0hcnelvOixxxxx9jYTDVanW9EkDvjMjxzGr3ZixMpbE
これで、サクッとbotをつくったりできますね。
Ruby を知らない人に Ruby の話をして欲しいと言われてないけど、ブログを書きました。(*1)
難しい話は抜きにしたいんだけど、抜きにしちゃうとまったく訳わかんないから簡単に説明する。
今回は Ruby の erb ってのを使って元ネタ同様のことを実現する。
mod_ruby が動くサーバなんて自分でつくらないとないだろうけど、
その辺はどうにかしてもらう。
erubyが導入されていれば、ファイルの1行目に #!/usr/bin/eruby -McKuCutf-8 とする。(*2)
そんなこんなで、どうにかしてもらったら、 <%= と %> で囲めば動きます。
どうにかしてもらったサーバで example.html というファイルの拡張子を example.rhtml すれば良いだけです。
<%= Rubyスクリプト %>
拡張子を変えずに動かすこともできます。 .html ファイルでも Ruby を使いたい場合は .htaccess ファイルに以下のように書けば良いだけ。サーバーによってはこれを禁止してたり、少しやり方が違う場合がありますが、大体動くので、どうにかしてもらった人に言ってください。
AddType application/x-httpd-eruby .rhtml .html
フレームの代わりに Ruby を使うってのがないので、参考になるのはありません。
致し方ないので、フレームの代わりにPHPを使うを参考にしてください。
ついでに Ruby を少しでも使えるようになれば、こんなことができるという一例を紹介します。
Ruby を使えばページフッタの西暦も自動更新します。
Copyright (c) 20010-<%= Time.now.strftime("%Y") %> Weble inc. All Rights Reserved.
Ruby を使えば自分の年齢を自動更新して表示できます。
<%= (Time.now.strftime("%Y%m%d").to_i - 19900605) / 10000 %>歳
Ruby を使えばページ内に部品を読み込むことができます。
<%= require 'footer.html' %>
これを応用すれば以下のようにしてフッタとヘッダを同期できますよ。
<%= require 'header.html' %> <div id="contents"> テキストテキストテキスト </div> <%= require 'footer.html' %>
<%=
require 'open-uri'
open("http://google.com/") do |f|
f.each do |line|
puts line
end
end
%>
<%=
if RUBY_VERSION < '1.9.0'
class Array
def choice
at( rand( size ) )
end
end
end
message = ["メッセージA", "メッセージB", "メッセージC", "メッセージD", "メッセージE"]
message.choice
%>
少し長いですが、2010年12月のカレンダーを出力します。(*3)
<%=
require 'date'
def calendar(year, month)
jpweek = ['日', '月', '火', '水', '木', '金', '土']
date = DateTime::new(year, month, 1)
date = (date >> 1) - 1
days = date.day
one = Date::new(year,month,1)
week = one.wday
day = Array.new(42)
days.times{|i|
day[week + i] = i + 1
}
calendar = '<table><tr>'
jpweek.each{ |i|
calendar << '<th>' + i.to_s + '</th>'
}
calendar << '</tr>'
key = 0
day.each{|i|
if key.to_i % 7 == 0 then
calendar << '<tr>'
end
calendar << '<td>'
if i != nil
calendar << i.to_s
else
calendar << ' '
end
if key.to_i % 7 == 6
calendar << '</tr>'
end
key += 1
}
calendar << '</table>'
return calendar;
end
print calendar(2010, 12)
%>
以上のように結構便利なものがあります。コピーして貼りつけても大体のサーバーで動きますのでどうぞ。
本当はサーバーで動かす前に自分のパソコンでテストした方が良いんですけど、興味のある方はぜひ以下の記事をご覧ください。
できる限り、PHP っぽく Ruby を書いてみました… orz
この記事の原因になった下記の記事もよろしくお願いします。
Rubyに興味を持った方はこちらがおすすめです。ほんとにたのしめる内容です。
![]() |
高橋 征義¥ 2,730
![]() |
追記:この記事をもっと Ruby っぽく書いていただけました。そしていろいろ間違っていたところを指摘していただけました。ありがとうございます。
5分でわかる Ruby を知らない人が Ruby の便利さを学べる記事をかいたよ を勝手に改造 – yayuguのにっき
家に帰って、Rubyラーメン食べて、レポート書くまでがRubyKaigi2010ですよ。
10周年記念。パチパチ。
RDBMSがトランザクションを必要とするケースをMongoDBでは必要としない例を説明。
BUNYANの紹介
トランザクション処理が必至なポイントはMySQLにするなどする。
MongoDBシンプルすぎてスゲー。
セッション見るのやめて、休憩していたらChad Fowler発見した。
情熱プログラマー購入して、サインもらった。
今日から僕も情熱プログラマー。
after Railsはロゴがかっこいい。だいたいgithub
rubyの作法が違う
befor rails は 「もっと、俺ってはスゲー感」
githubウォッチしてレベルアップしろ!
角谷さんトラブルであたふた(笑
禅とオートバイ修理技術―価値の探究 (シリーズ精神とランドスケープ)
伝えきれない感動を味わう。こいつが代わりに伝えてくれる。
情熱プログラマー ソフトウェア開発者の幸せな生き方
アンケートはこちら
RubyKaigi2011は7月に東京で開催。テーマは「最後のRugyKaigi」
テーマの原因はこれ。ごもっとも。
RejectKaigiはTimerConferenceとなります。会場ではドラの代わりにブブゼラが!
1 匿名 巨大SIerでもRuby案件は3件(泣
2 @m_kawato Android Emu Eclipse closs Ruby on Android Ruboto IRB
3 あんどうやすし Google Wave Ruby Robot入門(笑)ruby-wave-robot-apiライブラリ
4 nari シャイ力 Asakusa.rb
5 須藤 るりまサーチ racknga あなたの元に大量のエラーメールが。CleareCode
6 koyohoge PHPer 日本OSS貢献者賞 7 大林一平 RRSE emacsのミニバッファ
8 加藤文彦 RDF.rb
9 永井@九工大 ThreadGroup,ThreadGroup,ThreadGroup
10 @nariki purl PostScript-like
11 ささだこういち Rubyのパフォーマンス
12 John Woodell AppEngine/Jruby Mirah Debious Mirah mirah.org
13 米沢 #TKBB
14 Ayumu AIZAWA 個人スポンサー RubyKaigi2009 780万 半分はスポンサー企業 174万
15 OOPJog @tsuyoshikawa GREE Passion つくばって本当に怖いところですねぇ〜。
17 こしば としあき @bashOC7 Excelのこしばです。 picture
18 うめざきひろき @raa0121 北海道から来た
RubyKaigiにはじめて参加したので、まとめてみる。 Rubyのコミュニティはすばらしい。
だから、掃除のおばちゃん軍団もMatzのうちわもってるんだ。
PからはじまってPで終わるのとかとはだいぶ違う。(数年前だけど)
そして、直前になってチケットが買えなかった僕に手をさしのべてくれた@iwadonありがとう!
来年はもっとRubyな人になって参加したい。なってなくても参加したい。
まずは情熱プログラマーよんで、メタプログラミングRubyしてみるよ。
明日あたりにRails3でるかな。
家に帰ってレポート書くまでがイベントの参加ですよ。
ってことで、2日目のレポート。(1日目は残念ながら不参加)
そもそも着いたのが12時頃。Matzの基調講演がちょうど終わったところ。
会場のネットワークは重すぎるのでIRCぐらいしかできないと思った方が良い。
メタプログラミングRubyを購入。
Paolo Perrotta, 角 従典, Matzにサインをもらう。
Esoteric Programming Languageのお話。
おもしろおかしい内容だけど、人が読める物じゃないコードの書き方をする内容。
数字だけで、Hello worldとか、アンダースコアだけで、Hello worldとか出してた。
testをスピーディにするって話だけど、スピーカーの外人がスピーディーすぎ(wSaikuro … 同じようなことをやっていないかソースを解析するソフト
@t_wada 主導の元、@hon53とRSpecを学ぶ。そのあと外国人とトイプログラミング(ChangeMachine)をした。翻訳駆使しながら、やったけど楽しかった。
ペアプロが長引いたので、途中から参加。
MessagePack-RPCがJSONよりはえー。おもしろそう。ってぐらい。
懇親会の当日券が買えなかったー。
明日も頑張る。
ちなみに帰りは、つくばのお祭りでカオス