heroku でアイドリングになるのを回避する

アイドリング状態


Dynos and the Dyno Manager | Heroku Dev Center
heroku でのアイドリング状態とは1時間動いていないとなるスリープみたいなもの。
この状態でリクエストが来ると立ち上がりまで20秒位かかるので重いと勘違いされるかも。
アイドリング状態かは以下のコマンドで確認できる。

$ heroku ps
Process  State         Command                             
-------  ------------  ------------------------------------
web.1    idle for 23h  bundle exec thin -p $PORT -e $RACK..

「idle for 23h」は 23時間アイドリング だよ、とのこと。

ぐぐってみるといろいろ回避方法(New Relic, Rails 内のスケジューラ)が載っていたが失敗。cron で ping を叩くのもありみたいだけど、 cron ができるレンタルサーバがないのでやっていない。最終的に成功したのが「pingdom」を利用することだ。

pingdom を利用する


pingdom は Web サイトのモニタリングしてくれるサービスである。無料版では1サイト利用できる。
もし、落ちていたらメールやツイッターで知らせてくれる。
登録は簡単。名前とメールアドレスを入力して届いたメールのパスワードでログインする。
そして、モニタリングするサイトの URL やモニタリング方法などを設定するだけ。簡単!

ちなみに、アクティブな状態は…

$ heroku ps
Process  State      Command                               
-------  ---------  ------------------------------------  
web.1    up for 7h  bundle exec thin start -R config.r..  

「up for 7h」でアクティブであることを確認できる。

within で対象を絞る

requesut spec で検証対象を絞る場合には within メソッドを使用する。
「"hoge"が表示されている」という検証は

page.should have_content("hoge")

とするが、これだとページ全体で検索するのでどこかに"hoge"があればOKになってしまう。
そこで登場するのが within 。セレクターで検証するエリアを決めてその中で検証する。

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  page.should have_content("hoge")
end

これでテーブルの1つ目のtrの1つ目のtdの中に"hoge"があるという検証になる。
セレクターは css でも可能。

within のネストもできる。ただ、ネストしたところのセレクターにはちょっと注意が必要。
例えば…

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  find(:xpath, "//input[@type='checkbox']").set(true)
end

これは within 内のチェックボックスをオンにするというもの。 check メソッドでチェックできるので
この方法はあまり使わないと思うが。
"//input[@type='checkbox']" としているので within の中で探すかと思ったら "//..." なのでページ全体
で検索しに行ってしまった。これではまった…。なので正しくは

within(:xpath, "//table/tbody/tr[1]/td[1]") do
  find(:xpath, ".//input[@type='checkbox']").set(true)
  find(:css, "input[type=checkbox]").set(true) # css セレクタ
end

とすればOK。単なる XPath の知識不足か。
css セレクタを使ったほうがいいかも。親を見る場合は xpath のほうが便利。

複数のリポジトリに push する

heroku には push したくないけど、とりあえず他のマシンでも作業がしたい。
その場合は他のリポジトリに push しておく必要がある。
要は git remote でリモートリポジトリを増やすという意味。

$ git remote add name path

heroku へ push する場合は

$ git push heroku master

としているはず。
他のマシンで git clone した場合は

$ git remote add heroku git@....git

と実行したはず。それと同じで

$ git remote add bb git@.........git

とすれば bb という名前で登録されたということになる。
ちなみに bb は bitbucket を略していたり。
bitbucket はプライベートリポジトリを無料で作れるので重宝しています。
まぁ、 heroku にしかリポジトリがなかったら master でもいいんですけどね。
何個も登録できるのでバックアップに push しておくのもいいでしょう。
同期取るのが面倒だけど。

1発で複数のリポジトリに push する方法もあるようなので調べてみるのもあり。

heroku で ssl を使用する

heroku にはアドオンがたくさんある。

ssl もアドオンで用意されており、 ****.heroku.com の場合のみ
無料で使用できる。

アドオンを使用するにはクレジットカード情報等を登録しておかないといけない。
有料プランもあるので当たり前。

無料の ssl プランは

Piggyback SSL

です。

使用方法は、管理画面から追加するか、

$ heroku addons:add piggyback_ssl

を実行するだけ。

これで ssl 対応になった。
が、 http 通信も可能なのでアドレス直打ちされてしまうと困ってしまう。
アプリでそこは対応しないといけない。

Rails3.1 以降の場合、簡単に強制的に ssl アクセスする方法がある。

config/environments/production.rb

config.force_ssl = true

上記はコメントアウトされているのでそれを解除するだけ。
これで http 通信で来られても強制的に https 通信になる。

rails3 で twitter bootstrap を使えるようにする 2

twitter bootstrap が予定通りアップデートされていたので bundle update して
もう1回 generate したら成功しました。

レイアウトファイルが出来上がったので起動したらこんな感じです。

いい感じですね。
haml になれないと…。

っと assets のログが大量に出ているのでここを参考にして表示させないようにした。
しかし、以下のワーニングは出力され続ける。

WARN Could not determine content-length of response body. Set content-length of the response or set Response#chunked = true

どうやらここによると Ruby のバージョンが 1.9.3 で起こるみたい? たしかに 1.9.2 のときは出てなかった。
ちょっと Ruby 1.9.2 で実行してみよう。

実行したらたしかに出ませんでした。 1.9.2 でやるか。heroku と同じバージョンだし。

rails3 で twitter bootstrap を使えるようにする

何かと話題の twitter bootstrapRails で使えるようにします。
って、まだ実際に使ったときないので初めて使う…。
デザインとか迷ったらとりあえず今っぽい感じに作れそうなのでいい!

以下のプラグインを使います。
twitter-bootstrap-rails

Gemfile に追加

gem 'twitter-bootstrap-rails', :group => :assets

#もともとある group :asset do ... の中に入れてしまうのもあり

bundle install したらインストール

$ rails g bootstrap:install
insert app/assets/javascripts/application.js
insert app/assets/stylesheets/application.css
create app/assets/javascripts/bootstrap.js.coffee
create app/assets/stylesheets/bootstrap.css.less

生成されました。

んじゃ、試しにレイアウトを生成してみますかねと

$ rails g bootstrap:layout application fluid
Bootstrap helpers installs to application_helper...
insert app/helpers/application_helper.rb
create app/views/layouts/application.html.haml
(erb):55:in `block in template': undefined local variable or method `flash' for # (NameError)

あうち。エラーが出た。
issue を見ると haml-rails が悪さをしているみたいで、パッチ作ったよ〜って
ちょうど見ているときに投稿されてたのでそれが取り込まれるのを待つ!
多分、 erb なら問題ないでしょう。 今回は haml でやる!

次回にいろいろつくります。

PostgreSQL をインストール

heroku は PostgreSQL なので ubuntu にもインストールする。

$ sudo add-apt-repository ppa:pitti/postgresql
$ sudo apt-get update
$ sudo apt-get install postgresql libpq-dev

インストール後に postgres というユーザが作られる
このユーザを database.yml に設定する(test, production も同様)

development:
  host: localhost
  adapter: postgresql
  encoding: unicode
  database: app_name_development
  pool: 5
  username: postgres
  password: 

host がないとうまく接続できなかった。

pgadmin で管理したい場合は postgres にパスワードを設定する。

まずはユーザのパスワード

$ sudo passwd postgres

そして PostgreSQL 内のパスワード

$ su - postgres
$ psql template1
$ alter user postgres with password 'password';

psql を抜ける場合は 「\q」 です。

PostgreSQL を再起動

$ sudo /etc/init.d/postgresql restart