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 | Pricing

彼らもまた東洋の神秘に見せられていたのです!でも答えは「奥歯」じゃありません。韓流にハマっている妻に付き合っていた意味が、今顕在化したのです…

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

その場合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をインストール

Heroku | Using 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

次にHeroku gemをインストールします。

mycal% sudo gem install heroku

Herokuではsshを使うので、ssh keyが無ければ作っておきます。

% ssh-keygen -t rsa

この辺を参考にします。

Heroku | Using Git

@IT:Linuxでsshの鍵を作成するには

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

以下のようなカレンダーが表示されたら成功です。

image

(次回に続く)

(参考リンク)

sinatra’s heroku-sinatra-app at master - GitHub

Heroku | Heroku Documentation

Heroku & Sinatra

zerosum dirt(nap) - Clone Pastie with Sinatra & DataMapper 0.9

Heroku Garden

git チュートリアル (バージョン 1.5.1 以降用)

$ cheat git



blog comments powered by Disqus
ruby_pack8

100円〜で好評発売中!
M'ELBORNE BOOKS