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 | 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
zerosum dirt(nap) - Clone Pastie with Sinatra & DataMapper 0.9