Ruby.Sinatra.Git.Heroku #=> "Happy Web Development!"
Ruby
10年前にRubyといえば7月の誕生石のことか、5.5ポイント活字のことでした。でも今はGoogleを30頁めくっても、妻に誕生石をプレゼントすることはできません。宝石店のSEO対策は日本人の作った言語セットの前では無力なのです。
この点PerlのLarryさんは巧妙にやりました。Pearlは今も6月の誕生石の地位を守っています。ここにLarryの奥さんは6月生まれであり、Matzの奥さんは7月生まれでないとの仮説が成り立ちます。
Sinatra
なぜWebフレームワークの名前をSinatraとしたのか皆目検討も付きません。シナトラハットがトレードマークですから、そうなんでしょうがそれにしても…Railsとは違うMyWayを行くという意味でしょうか。それとも裏社会との繋がりを暗示しているのでしょうか。まさか「支那虎」ですか?
ー名は体を表すー といいますが、これほどに体をイメージし辛い名も滅多にありません。改名を強く望みます。Googleで「Sinatra」と打って、このWebフレームワークがトップに来た日がその命日にならないことを祈りつつ。
Git
Gitは「ぎっと」と発音します。意味はこうです。
git {名} : まぬけ、ばか、あほ、役立たず、無能な人
Linusさんにそう言われれば返す言葉は何もありません。でも消沈する必要はありません。「git」とググられて、わたしやあなたの名前はもう出てこないのですから。これはGoogleBombではなくGooglePieceなのです。ですから誰か早く、ヴァージョン管理システム「ass hole」を作って我が国の首相を救ってください!
Heroku
Herokuは「Her-OH-koo」と発音します。Google App Engineほどつまらない名前はないですが、その意味に辿り着けないというのもまたつまらないものです。でも、わたしはその答えにおそらく辿り着けました。ヒントはプライスリストです。
彼らもまた東洋の神秘に見せられていたのです!でも答えは「奥歯」じゃありません。韓流にハマっている妻に付き合っていた意味が、今顕在化したのです…
Herokuはハングルで「하옥」と書きます。意味は「下獄」つまり、「罪人を牢屋に入れること」です。つまりHerokuユーザは、知らずのうちに罪人とされていたのです!わたしも気が付くのが遅すぎました。暫く刑に服そうと思います。「チェオクの剣」でも見ながら…
Sinatraを使って無機能Webカレンダーを作ります。それをGitでHerokuにデプロイします。OSX+Terminal+TextMateを前提に書きます。
あなたも罪人になってみませんか?
Ruby+Sinatra
Sinatraをインストールします。現時点でRuby1.9には完全には対応していません。
% sudo gem install sinatra
mycalフォルダにmycal.rbファイルを作ります。
% mkdir mycal
% cd mycal/
mycal% mate mycal.rb
mycal.rbを編集します。
require "rubygems"
require "sinatra"
get '/' do
@year = Time.now.year
@ycal = `cal #{@year}`
erb :index
end
__END__
@@index
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>mycal</title>
</head>
<body id="mycal">
<pre><%= @ycal %></pre>
</body>
</html>
`(バッククオート)でシェルコマンドcalを呼んでいます。__END__以降にerbテンプレートを書きます。@@indexがラベルです。
calが使えない環境の場合、ふなばただよしさんのcal.rbが使えます。
その場合cal.rbをrequireして@ycal = `cal…を以下に変えます。
require 'cal'
cal = Cal.new
cal.opt_y(mon ? false : true)
@ycal = cal.print(year, mon)
mycal.rbを実行します。
mycal% ruby mycal.rb
Webサーバが起動するので、ブラウザでhttp://localhost:4567/にアクセスします。カレンダーが表示されます。
サーバを起動したまま、mycal.rbに以下を追加します。
get '/:year' do |year|
@year = year.to_i
@ycal = `cal #{@year}`
erb :year
end
__END__以下を次のように変えます。
__END__
@@layout
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>mycal</title>
</head>
<body id="mycal">
<pre><%= yield %></pre>
</body>
</html>
@@index
<%= @ycal %>
@@year
<%= @ycal %>
つまり <pre></pre> 内にyieldを置いてlayoutと実体を分けます。
ブラウザでhttp://localhost:4567/1999にアクセスします。1999年のカレンダーが表示されます。
mycal.rbに以下を追加します。
get '/:year/:mon' do |*ym|
@year, @mon = ym.map { |x| x.to_i }
@mcal = `cal #{@mon} #{@year}`
erb :mon
end
__END__
@@mon
<%= @mcal %>
ブラウザでhttp://localhost:4567/1999/12にアクセスします。1999年12月のカレンダーが表示されます。
helpersを使って`cal…を一ヶ所にまとめます。
get '/' do
@year = Time.now.year
@ycal = cal(@year)
erb :index
end
get '/:year' do |year|
@year = year.to_i
@ycal = cal(@year)
erb :year
end
get '/:year/:mon' do |ym|
@year, @mon = ym.map { |x| x.to_i }
@mcal = cal(@year, @mon)
erb :mon
end
helpers do
def cal(*date)
year, mon = date
`cal #{mon} #{year}`
end
end
年カレンダーの月にリンクを張ります。
helpers do
MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
def cal(*date)
year, mon = date
cal = `cal #{mon} #{year}`
cal.gsub(/((#{MONTHS.join('|')})\w*)/) do
%Q{<a href="/#{year}/#{MONTHS.index($2)+1}">#{$1}</a>}
end
end
end
gsubで月の文字列にマッチさせます。ブラウザでhttp://localhost:4567/にアクセスします。Aprilのリンクをクリックして。4月のカレンダーが表示されるか確かめます。
ロードの度にTerminalに以下の警告が表れています。
./mycal.rb:23: warning: already initialized constant MONTHS
MONTHS定義をconfigureに移して対処します。
configure do
MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
end
configureブロックのコードは最初に一度起動されるだけです。ctrl+cでWebサーバを停止し、ruby mycal.rbで再起動して有効にします。
layoutをバナーとメインに分けます。バナーにはタイトルと前年・翌年のリンクを置きます。
__END__
@@layout
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>mycal</title>
</head>
<div id="banner">
<h1><a id='title' href='/'>Web Calendar</a></h1>
<div id="year_pred"><a href="/<%= @year-1 %>">Previous Year</a></div>
<div id="year_next"><a href="/<%= @year+1 %>">Next Year</a></div>
</div>
<div id="main">
<pre><%= yield %></pre>
</div>
</html>
ブラウザでhttp://localhost:4567/にアクセスしてPrevious Year/Next Yearを適当にクリックします。タイトルをクリックして本年に戻るか確認します。
Git
そろそろGitでHerokuにデプロイしてみます。
念のためmycal.rbの全体を載せます。
require "rubygems"
require "sinatra"
get '/' do
@year = Time.now.year
@ycal = cal(@year)
erb :index
end
get '/:year' do |year|
@year = year.to_i
@ycal = cal(@year)
erb :year
end
get '/:year/:mon' do |ym|
@year, @mon = ym.map { |x| x.to_i }
@mcal = cal(@year, @mon)
erb :mon
end
configure do
MONTHS = %w(Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec)
end
helpers do
def cal(*date)
year, mon = date
cal = `cal #{mon} #{year}`
cal.gsub(/((#{MONTHS.join('|')})\w*)/) do
%Q{<a href="/#{year}/#{MONTHS.index($2)+1}">#{$1}</a>}
end
end
end
__END__
@@layout
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
<html>
<head>
<meta http-equiv="Content-type" content="text/html; charset=utf-8">
<title>mycal</title>
</head>
<body id="mycal">
<div id="banner">
<h1><a id='title' href='/'>Web Calendar</a></h1>
<div id="year_pred"><a href="/<%= @year-1 %>">Previous Year</a></div>
<div id="year_next"><a href="/<%= @year+1 %>">Next Year</a></div>
</div>
<div id="main">
<pre><%= yield %></pre>
</div>
</body>
</html>
@@index
<%= @ycal %>
@@year
<%= @ycal %>
@@mon
<%= @mcal %>
Gitのインストールはこの辺を参考にします。
hikariworks::blog » MacPortsでgitをインストール
Webサーバを止めてGitをセットアップします。
mycal% git init
.gitフォルダができます。
以下の内容のconfig.ruを作ります。
require 'mycal'
run Sinatra::Application
mycal% echo "require 'mycal' ; run Sinatra::Application" > config.ru
Gitにファイルを追加します。
mycal% git add .
コミットします。
mycal% git commit -m "first commit"
Heroku
Herokuにアカウントが無ければ作ります。
次にHeroku gemをインストールします。
mycal% sudo gem install heroku
Herokuではsshを使うので、ssh keyが無ければ作っておきます。
% ssh-keygen -t rsa
この辺を参考にします。
Herokuにレポジトリを作ります。
mycal% heroku create
任意のレポ名が割り当てられます。レポ名.heroku.comがurlになります。heroku create myappとして、レポ名を指定できます(mycalは取得されています)。heroku rename newnameでリネイムできます。
初回だけemailとpasswordを聞かれます。初回だけkeyのアップロードの要否が聞かれます。
そしてHerokuにコードをpushします。
mycal% git push heroku master
次回以降masterは不要です。
これでデプロイできました。アプリケーションにアクセスしましょう。
mycal% heroku open
以下のようなカレンダーが表示されたら成功です。
(次回に続く)
(参考リンク)
sinatra’s heroku-sinatra-app at master - GitHub
zerosum dirt(nap) - Clone Pastie with Sinatra & DataMapper 0.9
blog comments powered by Disqus