二つ目の信号を右

メモ、記録

rmagickをwindows7 (x64) にインストール (2014 Dec.)

サーバ側でちょっとした画像処理をしたいとき(サムネイルの作成など)、Rubyではrmagickを使います。rmagickはrubyの画像処理用の汎用ライブラリで、内部的にはImageMagickのライブラリを利用しています。

Windows7上で、特に64bit版のrubyを用いている場合、rmagickのインストールがかなり厄介だったのでメモしておきます。

Windows上でrmagickをインストールする上で問題になるのは以下の2点です。

  1. C言語の実装を含んでおり、ビルドが必要であること。
  2. 内部でImageMagickのライブラリを呼び出しているが、64bitに対応していないライブラリが存在すること。

ビルドに関しては、ビルドに必要なソフトやコンパイラが全て入っているDEVELOPMENT KITをダウンロード&解凍して、直下にできるbinフォルダと、mingwフォルダの直下にあるbinフォルダにPATHを通しておけばOKです。makeやらgccやらが使えるようになります。

問題は2番目のライブラリの問題です。32bit版のrubyを用いている場合は、32bit版のImageMagickをインストールして、あとは参考リンク(1)の通りに作業を進めれば問題ないはずです。。

しかし、64bit版のRubyを用いている場合は、参考リンク(1)にある手順 1,2,3 (DevkitとImageMagickのインストールとかパス設定とか)を済ませた上で、

(Rubyをインストールしたフォルダ)\lib\ruby\gems\(バージョン)\gems\rmagick-2.13.3\ext\RMagick

にある、extconf.rbを修正して、手動でインストールする必要があります。修正する内容はシンプルで、64bitに対応していないライブラリの読み込みを除外します…!なんと、実際の動作には関係ないので問題無いんです。。

extconf.rb 167行目付近の

$LOCAL_LIBS = '-lCORE_RL_magick_ -lX11'

から -lX11 を削除!

$LOCAL_LIBS = '-lCORE_RL_magick_'

削除した上で、rmagick-2.13.3フォルダ直下のsetup.rbを呼び出す…のですが、ImageMagickのフォルダを渡してあげないとこけてしまうようです。

$ ruby setup.rb -- '--with-opt-dir="(ImageMagickをインストールしたフォルダ)" --with-opt-lib="(ImageMagickをインストールしたフォルダ)\lib" --with-opt-include="(ImageMagickをインストールしたフォルダ)\include" --platform=ruby'

そして、インストール!

$ ruby setup.rb install

これで、

require 'RMagick'

とすると(大文字注意!)、rmagickが使えるようになります。

ちなみに、Herokuでrmagickを使いたい場合は、Gemfileに

gem 'rmagick' , :require=>'RMagick'

とするだけで使用することができます…おのれWindows

参考リンク(1):RMagick を Windows 7 にインストールする方法 - 君の瞳はまるでルビー - Ruby 関連まとめサイト
参考リンク(2):Windows 7 に Ruby 2.0 x64 を その2 ~RMagick が入らない問題と対策~|Ruby と iPhone と UI と

Herokuでデータベースを使う

Herokuでは、各種データベースシステムを無料で使うことができます(ただし、データ数に制限あり)。

RDBMSだとPostgreSQL、KVSだとMongoDBRedisなどが利用可能です。

利用する方法も簡単で、アプリのフォルダをbashで開き、コマンドを入力するだけです。

# PostgreSQLの場合
$ heroku addons:add heroku-postgresql
# Redisの場合
$ heroku addons:add rediscloud 

addonでaddすると、データベースの接続に必要なURLやパスワードなどが付与されます。heroku configすることで確認できます。

$ heroku config
=== hogehoge Config Vars
DATABASE_URL:   postgres://username:password@url:port/dbname
REDISCLOUD_URL: redis://rediscloud:password@url:port


RubyではPostgreSQLもRedisも操作用のモジュールが用意されていて、Rubygemsからインストールできます。Gemfileに以下の2行を追加して、bundlerでインストール…

gem "pg"     # PostgreSQL
gem "redis"  # Redis
$ bundler install

後はデータ数の許す限り自由に使うことができます(PostgreSQLでは10000行以内であれば無料です)。

アプリの作成、デプロイ

インストールも終わったので、
いよいよHerokuでsinatraを使って何かします。
結局、以下の作業が必要でした。

  1. SSHの設定
  2. アプリ用フォルダの作成、Gitの初期化
  3. 設定ファイルの記述
  4. ローカルでテスト
  5. Heroku上にアプリを作成
  6. Herokuにpush

1. SSHの設定

HerokuとはSSHで通信を行うため、公開鍵を登録しておくと便利です。
というか、公開鍵を作っておけば、初回ログイン時に勝手に登録してくれるようです。

Git bashを起動し、まずは鍵を作成…

$ ssh-keygen -t rsa

そしてHerokuにログイン…
鍵を登録していないとメールアドレスとパスワードを聞かれます。

$ heroku login

Found existing publick key~などと表示された後、公開鍵が登録されます。
登録してくれない場合は下記のリンクを参考にしてください。

参考:ID-Blogger: HerokuでSSH公開鍵(public key)を登録する方法(と削除して再登録する方法)

2. アプリ用フォルダの作成、Gitの初期化

Herokuでは作ったアプリをGitを使ってデプロイします。
そこで、作ったアプリを保管するためのフォルダをつくり、git initしておく必要があります。
新しくフォルダを作り、初期化します…

$ git init

3. 設定ファイルの記述

Sinatraで何かするにあたって、以下のファイルを作成し、設定内容を記述しておきます。

  • Gemfile

bundlerに○○をインストールしろ、require時はこういう名前だ、などなどを指示するファイルです。Sinatraの利用には最低限以下の項目を書いておく必要があります。

source :rubyforge
gem "sinatra"
  • app.rb

アプリの本体です。今回はテストなので適当。

#!/usr/bin/ruby
require 'sinatra'
get '/' do
"hogeda_ug"
end
  • config.ru

SinatraRackというHTTP送受信モジュールを用いて作成されているので、rackupというコマンド経由で起動しておくと、Sinatraの起動前に通信の設定とかができる模様。config.ruはrackupのコマンドを実行する際の設定ファイルです。

require 'rack'
require './app'
run Sinatra::Application
  • Procfile

Herokuではforemanを使ってプロセスを管理しているので、Procfileに起動時のコマンドを記述する必要があるようです。

web: bundle exec rackup config.ru -p $PORT

4. ローカルでテスト

まず、bundler installで必要なライブラリをインストールしておきます。
で、起動なんですが、何かforemanが重いので、rackupで直接起動…

$ bundler install
$ bundle exec rackup config.ru -p 5000

WEBrick::HTTPServer#start という感じでサーバが起動します。
http://127.0.0.1:5000/にアクセスしてみるとhogeda_ugと出ます。OK!

動作確認が取れたので、git add、git commitしておきます。

$ git add .
$ git commit -m "hogeda_ug"

5. Heroku上にアプリを作成

Herokuにpushする前に、アプリを作成しておきます。
createの後の引数は最終的にアドレスの一部になります…

$ heroku create hogedaug

うまくいくと、hogedaugの作成が完了した旨と、remoteにherokuを追加した旨が通知されます。

6. Herokuにpush

push!!!

$ git push heroku master

pushが終わると、bundlerでのinstallが始まります。そして、しばらくすると…

launching... done,

と表示され、アプリのデプロイが完了します!

デプロイしたアプリには、
https://(createで指定したアプリ名).herokuapp.com/

でアクセスできます。

Herokuで何かするときに必要なもの

Herokuで何かするときには、Herokuのアカウントと最低限、以下の2つは用意する必要があります。

両方ともサイトからインストーラをダウンロードしてインストールするだけです。簡単!

HerokuはRubyで動いているので、toolbeltをインストールする時にRubyもインストールされます。が、少しバージョンが古いので、新しいバージョン(Ruby 2.0.0-p598 (x64))を公式サイトからダウンロードしてインストールしました(これもインストーラがあるので簡単です)。このとき、rubyをPATHに追加するか聞かれるので、チェックしておきます。

Rubyで何か作るときにほとんど必須なのがRubygemsなので、次にこれをインストールします(Herokuで公開するWebアプリを作るためには必須です)。

Rubygemsrubyを使ってコマンドラインからインストールします。Rubygemsを展開したフォルダを開き、右クリックメニューから「Git Bash」を開きます。Rubygemsをインストールする前に、今までインストールしたものの確認がてら、以下のコマンドを入力…

$ git --version
git version 1.9.4.msysgit.2
$ heroku --version
heroku/toolbelt/3.16.0 (i386-mingw32) ruby/1.9.3
$ ruby -v
ruby 2.0.0p598 (2014-11-13) [x64-mingw32]

大丈夫そうなので、Rubygemsをインストールします…

$ ruby setup.rb

ここも大丈夫そうだったので、確認

$ gem -v
2.4.4

最後に、Rubygems経由でbundlerというプログラムをインストールします。bundlerはバージョン問題やライブラリの依存関係を解決した上で必要なライブラリをインストールしてくれる便利なプログラムです(HerokuでRubyのアプリを作るならば必須)。

$ gem install bundler

確認

$ bundler -v
Bundler version 1.7.6

これで、準備完了!作成にとりかかることができます。

こっそりと

herokusinatraを使ってWebアプリをあれこれする時のメモをとっておきたくなったので、こっそりと始めます…
梅田地下街シームレス検索 http://www.umeda-ug.net