blog.takuyan.com

Ruby & Javascript & Hack

PassengerでNginx1.0.0以外をインストールする

f:id:kattton:20110722231457j:image


[追記:2012/1/19] 特に気にしなくても最新のnginxがインストールされるよう、変更されてようなので、下記手順は不要になったようです。


Ruby on RailsApacheやNginxで簡単に動かすことのできるGem、その名をPassengerといいます。
コイツを使うことでRailsのデプロイがとても簡単になるのですが、その他にもApacheやNginx自体のインストールもできるスグレモノです。
インストール方法だとか、その他の設定方法が知りたい場合は、よそでググってください。


Overview — Phusion Passenger™ (a.k.a. mod_rails / mod_rack)


AmazonEC2を使うようになってからNginxをインストールするときに、よく使っていたのですが、どうしてもNginxのver1.0.0が常にインストールされるのですね。2011年7月22日時点でver1.0.5がでているのに。
Rails界隈にいると「最新は善」みたいな習慣がついていて、新しいバージョンのNginxをインストールしたい衝動に駆られたので、方法を書き残しておきます。


Photo via badwsky

PassengerでNginxの任意のバージョンをインストールする手順


早い話、先にダウンロードしておいて、ソースの場所を示せばよいだけです。
passenger-install-nginx-module -h とやれば、解ると思います。

pwd # => /home/takuyan
mkdir tmp
cd tmp
wget http://nginx.org/download/nginx-1.0.5.tar.gz
tar zxf nginx-1.0.5.tar.gz
passenger-install-nginx-module  --nginx-source-dir=/home/takuyan/tmp/nginx-1.0.5


これ以降やyesとかEnterとか押していれば完了です。
前のバージョンのNginxがあっても上書きしているようです。
ただ、設定ファイル(/conf以下)は、問題なかったです。できる子ですね。


注意点は--nginx-source-dirは相対パス、というか、~(チルダ)つかったらダメです。
それで3回くらい嵌った。


なにはともあれ、これで常に最新のNginxを使えますね。

Amazon S3@Tokyo RegionでPaperclipを使う

f:id:kattton:20110719111354j:image


[追記: 2012/1/19] aws-s3ではなくaws-sdkを使用する仕様に変更されたようなので、ご注意ください。


以前も書きましたが、Ruby on Rails で画像などをアップロードするときにお世話になるGemが「Paperclip」といいます。


結論から先に言うと、Paperclipを修正してAmazon S3@tokyoを使いやすくしたので紹介します。
よって、Paperclipの基本的な使用方法などは説明していませんので、後述のリンクを辿っていただければと思います。

AmazonS3@tokyoを使おうと思ったらエラーがでます


最近、Amazon S3 を使い始めて、東京にもあるということで、「近いほうがいいだろう」という安直な理由で使うことにしたのですが、普通にやろうとするとエラーが続出なんですね。

The bucket you are attempting to access must be addressed using the specified endpoint. Please send all future requests to this endpoint.


それで、いろいろ調べてみたのですが、Amazon S3 の東京リージョンに限らず、デフォルト(US)以外のS3を使うのはちょっと面倒らしいのですね。


AmazonS3(Tokyo region) + Paperclip + Rails3を使ってみた


本体に修正が無いあたり、あまり需要がないのかなぁと思っていたけど、そのままだと自分が困るので、私の都合の良いように修正して、pull request 送ったら、紆余曲折ありつつ、無事にマージされたので使い方をさくっと紹介します。


(Photo via konishiroku_)

なぜエラーがでるの?

(答え)リージョンによってホスト名が異なるから。


詳細は、こちらで解説されてます。


Amazon S3 の標準はUSなのですが、それ以外を使う場合はホスト名がそれぞれ異なります。

  • US Standard * s3.amazonaws.com
  • US-West (Northern California) Region s3-us-west-1.amazonaws.com
  • EU (Ireland) Region s3-eu-west-1.amazonaws.com
  • Asia Pacific (Singapore) Region s3-ap-southeast-1.amazonaws.com
  • Asia Pacific (Tokyo) Region s3-ap-northeast-1.amazonaws.com

(via Github comment)


なので、 :s3_host_name でそれぞれのホスト名を設定します。

:s3_host_name オプションの使い方


:s3_host_name の設定方法は以下の2通り。

  1. モデルで直接指定する
  2. config/s3.yml などに設定する


私は後者をオススメします。


なぜなら、開発環境と本番環境でのバケットの変更がスマートに書けます
直接モデルにも書くことは出来るのですが、ソースが汚くなるので、私は嫌いですね。

config/s3.yml のサンプル


例えば、開発データは東京リージョンに、本番データは別(s3-us-west-1.amazonaws.com)に、という場合、以下のようにする。

# config/s3.yml
development:
  bucket: sample-dev
  access_key_id: アクセスキー
  secret_access_key: シークレットキー
  s3_host_name: s3-ap-northeast-1.amazonaws.com
production:
  bucket: sample-production
  access_key_id: アクセスキー
  secret_access_key: シークレットキー
  s3_host_name: s3-us-west-1.amazonaws.com


参考:AWS セキュリティセンター (AWS Security Center) | アマゾン ウェブ サービス(AWS 日本語)

その場合のモデルはこうなる
# app/models/figure.rb
class Figure < ActiveRecord::Base
  has_attached_file :image, 
    :styles => { :medium => "300x300>", :thumb => "100x100>" }, 
    :storage => :s3,
    :s3_credentials => "#{Rails.root}/config/s3.yml",
    :path => ":attachment/:id/:style/:filename" 
end

すっきりしましたね。

config/initializers/aws.rb を追加する


[追記:2012/1/19] 現時点において下記のコードは不要です。


残念ながら現状、次のプログラムを追加する必要があります。面倒ですね。今度なんとかしましょう。

#config/initializers/aws.rb
AWS::S3::DEFAULT_HOST.replace "s3-ap-northeast-1.amazonaws.com"


参考:PaperclipからAmazon S3のTokyo Regionを使うには。 - このブログは証明できない。


ともあれ、これで以前よりも簡単にS3@tokyoを使えるようになるはずです。

新しいバージョンじゃないと使えません


(追記)既に本体に取り込まれているので、下記の作業は不要です。


2011/7/19の時点で、paperclipは2.3.15ですが、:s3_host_nameオプションは、それには含まれていないので、Gemfileを以下のようにするか、次のバージョンがでるまで待つとよいでしょう。

#Gemfile
gem 'paperclip', :git => "git://github.com/thoughtbot/paperclip.git"
gem 'aws-s3'

コミュニティに参加しよう


今回、初めてPull Request送ったのですが、これからは、ドンドンやるべきだなぁと思いました。


私だって始めたばかりのひよっこですが、もっといろいろ出来ることがあるなぁと感じましたし、実際できましたし。
Railsだって、もはやDHHが作っているわけではないし(3.1は南米産という噂だし)、こういったオープンソースのコミュニティに積極的に関わるというのは、とても良い経験になると思います。

HamlでRailsの404ページを作ろうずえ

f:id:kattton:20110528175134j:image


RailsやっててHaml&Sassフリークの皆さんであれば、404ページだってなんだってHamlで書きたいはず。
むしろHTMLで書くことが苦痛で仕方がないはずですね。ええもちろん私にも拷問です。生でHTMLを書く人の気がしれません。


ただ、500だけは仕方ないのでHTMLで書くしかしようがないかなぁと思ってます。
500.html.haml とか書いて、しくじったら無限ループの出来上がりですからね。なにそれ怖い。


ということでroutingからviewまでサンプルを作ってみました。
takuyan/custom404 · GitHub


トップページでは猫が表示されるが存在しないページを表示すると犬が表示されるという、そんな謎アプリです。
カッとなって作りました。後悔はしていません。1時間はかからなかったかな。こういう無駄な努力を大事にしていきたいです。


是非、 git clone して bundle install して rails server して localhost:3000 にアクセスしてみましょう。

要点はここだけ

routes.rb
Custom404::Application.routes.draw do
  root :to => "main#index"
  match "*path" => "main#error", :as => :unknown 
end


あとは普通にHaml書いてSassで装飾すれば終わりです。


f:id:kattton:20110528181945j:image
#haml


ビックリするほど糞つまらないですね。本当にありがとうございました。

ダミー画像はこちらを使用

Vimのプラグイン管理ならpathogenよりVundleが楽だった

f:id:kattton:20110517063315j:image


vimのプラグイン管理なんですが、pathogenでも面倒に感じていたので、この度、Vundleに移行しました。

Pathogenってなに


vim神のひとりであるTim Pope先生の作品。
詳細は以下のブログが詳しいです。

感想
  • git submodule add 云々が面倒
  • git submodule rm みたいな、サブモジュール削除が面倒
  • .vim/* の管理が面倒
  • バージョンの固定とか不要(少なくとも私は)


そんな感じだったので、もっと楽ちんなものを探しておりました。

Vundleってなに


もはや趣味の域に達しつつあるExplore GitHubにてVundleを発見。
詳細は以下のブログが詳しいです。

おわりに


複数PCで作業をするので、このVundleでVimの管理がとても管理が楽になりました。
一応、私のvimrcも載せておきます。