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


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


(次回に続く)


(参考リンク)
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