OS X 10.8 Mountain Lion にmechanizeをインストールする方法

そろそろMavericksのリリースも近いようですが、とりあえず手持ちのOS X 10.8.4 にgemでmechanizeをインストールしようとしたところ、ちょっと引っかかったので、覚え書きとして書いておきます。

まず普通にgemでインストールしようといたしますと、下記のようなエラーになります。

$ sudo gem install mechanize
Building native extensions.  This could take a while...
ERROR:  Error installing mechanize:
 nokogiri requires Ruby version >= 1.9.2.

nokogiriというのは、mechanizeが使っているパーサーなんですが、最近のnokogiriはバージョン1.9.2以上のrubyが必要みたいです。Mountain Lionに元々入っているrubyは下記のように1.8.7です。

$ which ruby
/usr/bin/ruby
$ /usr/bin/ruby --version
ruby 1.8.7 (2012-02-08 patchlevel 358) [universal-darwin12.0]

というわけで、MacPortsでruby1.9か2.0をインストールします。gemの対象になるrubyは、実行パスで先に来ているrubyのようなので、MacPortsでrubyをインストールして、/opt/local/bin/rubyが/usr/bin/rubyより前に来るようにしておけばいいのですが、MacPortsでそのままインストールするとruby1.9とかruby2.0とかいうコマンド名でインストールされてしまってよくありません。以前はportsでインストールする際に +nosuffix というvariantを指定していたようですが、最近はこのvariantがありません…

$ port variants ruby19
ruby19 has the variants:
   c_api_docs: Generate documentation for Ruby C API
[+]doc: Install rdoc indexes and C API documents
   mactk: Build using Mac OS X Tk Framework
     * conflicts with tk
   tk: Build using MacPorts Tk
     * conflicts with mactk
   universal: Build for multiple architectures

えー、どうすんのー、とおもったら、ruby_selectってのが取り込まれたっぽいです。先にruby19かruby20をインストールして、あとでselectで切り替えられるらしい。まじで。せっかくなのでruby20をインストールしよう。

$ which ruby
/usr/bin/ruby
$ sudo port install ruby20
$ which ruby
/usr/bin/ruby
$ which ruby2.0
/opt/local/bin/ruby2.0

ruby20をインストールすると、上記のように/opt/local/bin/ruby2.0というのがインストールされて、rubyというコマンドは/usr/bin/rubyのままです。そこでselectします。

$ sudo port select ruby
Available versions for ruby:
 none (active)
 ruby20
$ sudo port select ruby ruby20
Selecting 'ruby20' for 'ruby' succeeded. 'ruby20' is now active.
$ sudo port select ruby
Available versions for ruby:
 none
 ruby20 (active)
$ which ruby
/opt/local/bin/ruby

なるほど。これでmechanizeもご機嫌にインストールできますぜ。

$ sudo gem install mechanize
Successfully installed mechanize-2.7.2

やったね! 🙂

参考文献

  1. 「近頃の macports + ruby では +nosuffix variant が廃止されている」, k12uのアレ

さくらのレンタルサーバーにRuby on Rails 2.0.2をインストールする方法

数日前、読者のかたからメールをいただきました。「rubygemsが1.1.1になっており、記事通りにしてもインストールできない」とのことでした。前の記事さくらのレンタルサーバーにRuby on Railsをインストールする方法を書いてから、9箇月たちまして、Ruby on Railsもrubygemsも新しいバージョンがでています。前の記事を書いたときと状況がかわっているので、今のバージョンでのインストールの方法を新たにまとめてみました。

インストールするのは次のものです。

  • rubygems 1.1.1
  • Ruby on Rails 2.0.2

例によって、rubyは標準のものを使用します。最新版は1.8.7が現在preview2 ですが、標準でインストールされているのは1.8.5です。確認しておきます。

% ruby --version
ruby 1.8.5 (2006-08-25) [i386-freebsd6]

railsをいれるまえに、rubygemsをイントールします。2008年5月時点での最新版は1.1.1です。バグも修正されたようで、以前よりインストールが簡単になっています。ふつうに$HOME以下にインストールすればOK。$HOME/src以下にrubygemsのソースコードをもってきます。$HOME/srcがなかったらこの機会に作ってしまおう。

% mkdir $HOME/src
% cd $HOME/src
% ftp http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
Requesting http://rubyforge.org/frs/download.php/35283/rubygems-1.1.1.tgz
Redirected to http://rubyforge.rubyuser.de/rubygems/rubygems-1.1.1.tgz
Requesting http://rubyforge.rubyuser.de/rubygems/rubygems-1.1.1.tgz
100% |*************************************|   413 KB   85.21 KB/s    00:00 ETA
423308 bytes retrieved in 00:04 (85.21 KB/s)

tar+gzipを展開して、その中に移動し、早速インストール。標準だと/usr/local/以下にインストールされるようですが、さくらのレンタルサーバーではもちろんそんなところにインストールできないので、$HOME以下にインストールするよう、オプションをつけます。

% tar zxf rubygems-1.1.1.tgz
% cd rubygems-1.1.1
% ruby setup.rb --prefix=$HOME
mkdir -p /home/narak/lib
mkdir -p /home/narak/bin
install -c -m 0644 rubygems.rb /home/narak/lib/rubygems.rb
...
RubyGems installed the following executables:
 /home/narak/bin/gem18

If `gem` was installed by a previous RubyGems installation, you may need
to remove it by hand.

gem18という名前で$HOME/binの下にインストールできたようなので、確認します。その前に$HOME/binがコマンドサーチパスに入っていないひとは、入れておきます。railsは$HOME/lib/ruby/gem/binにはいるので、そっちもついでに追加。$HOME/.cshrcに次のように書いておきます。

set path = (/sbin /bin /usr/sbin /usr/bin ...(中略)... $HOME/bin $HOME/lib/ruby/gem/bin)

ついでに$HOME/.cshrc中で環境変数RUBYLIBとGEM_HOMEも指定しておきます。rubygems.rbがインストールされる場所が変わったので、RUBYLIBもちょっとかわっています。

setenv RUBYLIB $HOME/lib
setenv GEM_HOME $HOME/lib/ruby/gem

できたらsourceして、インストール直後はコマンドサーチパス内にあってもみつからないので、rehashしてからバージョンの確認。

% source $HOME/.cshrc
% rehash
% gem18 --version
1.1.1

できました。つづいてrailsのインストール。 railsは$HOME/lib/ruby/gem/binの下にインストールされます。コマンドドサーチパスにはすでにはいってますね? railsのインストールは簡単。

% gem18 install rails --include-dependencies

できたらrehashしてバージョンの確認。

% rehash
% rails --version
Rails 2.0.2

できた! だいぶ簡単になりましたねー。

参考文献

  1. rubygems
  2. Ruby on Rails
  3. オブジェクト指向スクリプト言語 Ruby
  4. さくらのレンタルサーバにRuby on Railsをインストールする方法, がんちゃんのブログ, 2007

さくらのレンタルサーバーのRuby on Railsを高速化する方法

以前、さくらのレンタルサーバーにRuby on Railsをインストール、動作を確認し、実際に簡単なアプリケーションをうごかしてみました。

  1. さくらにRailsをインストールする方法
  2. その動作確認
  3. サンプルアプリケーション

しかし、これがどうにも遅い! 通常はApacheに加えてfastCGI等を利用して起動の高速化をはかるのですが、さくらの共用サーバーでは利用できません(参考文献[1])。ただのCGIで動かした場合にどれぐらい遅いかというと、参考文献[2]をごらんください。普通の(?)方法でうごかすのと比較すると、ただのCGIはざっと100倍ぐらい遅い。ひどい!

というわけで、多少でもはやくならんもんかと思い色々と試してみました。速度の測定にはhttperfを使ってみました[3]。Mac OS X の場合はMacPortsで簡単にインストール可能です。ほかのプラットフォームでもいろいろあると思いますが、割愛します。

まずは、RailsもRubyも関係ない、静的ファイルの場合を測定してみます。ファイルの内容はあとで出てくるRailsのものとおなじです。

% httperf --server=narak.sakura.ne.jp --port=80 --uri=/test.html --num-conns=100 --num-calls=1
httperf --client=0/1 --server=narak.sakura.ne.jp --port=80 --uri=/test.html --send-buffer=4096
  --recv-buffer=16384 --num-conns=100 --num-calls=1
httperf: warning: open file limit > FD_SETSIZE; limiting max. # of open files to FD_SETSIZE
Maximum connect burst length: 1

Total: connections 100 requests 100 replies 100 test-duration 8.095 s

Connection rate: 12.4 conn/s (80.9 ms/conn, <=1 concurrent connections)
Connection time [ms]: min 77.5 avg 80.9 max 88.4 median 80.5 stddev 2.2
Connection time [ms]: connect 27.0
Connection length [replies/conn]: 1.000

Request rate: 12.4 req/s (80.9 ms/req)
Request size [B]: 78.0

Reply rate [replies/s]: min 12.2 avg 12.2 max 12.2 stddev 0.0 (1 samples)
Reply time [ms]: response 27.3 transfer 26.6
Reply size [B]: header 231.0 content 5512.0 footer 0.0 (total 5743.0)
Reply status: 1xx=0 2xx=100 3xx=0 4xx=0 5xx=0

CPU time [s]: user 1.83 system 6.17 (user 22.7% system 76.2% total 98.9%)
Net I/O: 70.2 KB/s (0.6*10^6 bps)

Errors: total 0 client-timo 0 socket-timo 0 connrefused 0 connreset 0
Errors: fd-unavail 0 addrunavail 0 ftab-full 0 other 0

httperfは指定のサイトの指定のページにある回数アクセスして、速度を測定します。今回は100回にしてみました。結果が色々出てますが、とりあえず

Request rate: 12.4 req/s (80.9 ms/req)

ここだけみることにします。これは1リクエストあたり80.9msかかり、1秒間に12.4リクエストの処理が可能ということです。Railsの処理時間をいくらみじかくしても、これより速くなることはないという値です。

ではつぎに、サンプルのtodoリストの速度を測定してみます。

Request rate: 0.5 req/s (1851.1 ms/req)

うーん、100倍は遅くありませんが、静的ファイルの場合と比較すると25倍ぐらい遅いですね。これをベースに、どれぐらい高速化できるか検討します。

まずは実行環境です。実は上記todoリストはdevelopment環境で稼働していました。これをproduction環境に変更します。production環境の方が速い。らしいです。変更の仕方は、

  1. config/database.ymlでproduction環境にもデータベースの設定を書く。
  2. config/environment.rb で「ENV['RAILS_ENV'] ||= 'production'」の行のコメントを外す。

です。これでプロダクション環境になります。ではさっそく、速度を測ってみよう!

Request rate: 0.6 req/s (1675.0 ms/req)

ビミョーに速くなりました!

さらに、今回の例はセッションを使っていないので、セッションを無効にしてみます。無効にする方法はapp/controllers/application.rbを下記のように変更します。

class ApplicationController < ActionController::Base
  # Pick a unique cookie name to distinguish our session data from others'
  # session :session_key => '_Todo_session_id'
  session :disabled => true
end

このときの速度は下記の通り。

Request rate: 0.6 req/s (1752.7 ms/req)

うーん、あまりはやくならない。ていうかむしろすこし遅くなったような。セッションはDBに保存するので、DBが遅い場合はセッションを無効にすると劇的に改善することがあるようです。しかし、さくらのようにデータベースがMySQLで別のサーバになっている場合は効果があまりない。残念。

気を取り直して今回の最後の手段。必要のないモジュールをロードしないようにします。具体的には、config/environment.rbの下記の行のコメントアウトをとります(行頭の#を削除して行を有効にします)。

  # Skip frameworks you're not going to use (only works if using vendor/rails)
  config.frameworks -= [ :action_web_service, :action_mailer ]

このときの速度は下記の通り。

Request rate: 0.9 req/s (1103.7 ms/req)

おおっ、だいぶはやくなった! 静的ファイルと比較して25倍から13倍によくなりました! というわけでみなさんもお試しあれ。焼石に水という気もしますが...

参考文献

  1. Movable Type 3.34 アップグレード, blog kazuking, 2007
  2. 優しいRailsの育て方, 2006
  3. Welcome to the httperf homepage, HP Labs, 2005

さくらのレンタルサーバでRuby on Railsをうごかしてみた…らかなり遅いかも…

その1
その2
さくらのレンタルサーバにRuby on Railsをインストールして、
動作確認をするところまでやりました。今回は簡単なアプリケーションを作って、どれぐらいの速度で
うごくのか確かめてみたいと思います。題材は「ToDoリスト」です。

その2の続きで、$HOME/Railsの下にTodoというアプリケーションを作ります。

% cd ~/Rails
% rails Todo

mySQLで「todos」という名前のテーブルを作っておきます。sqlサーバー、ユーザー名、パスワード、DB名はそれぞれ自分のものにかえてください。

% mysql --host=mysqlhoge.db.sakura.ne.jp --user=xxxx --password=yyyy xxxx
...
mysql> create table todos (
  -> id int primary key not null auto_increment,
  -> desctiption varchar(100) not null,
  -> done tinyint not null default 0);
Query OK, 0 rows affected (0.03 sec)

mysql> desc todos;
+-------------+--------------+------+-----+---------+----------------+
| Field       | Type         | Null | Key | Default | Extra          |
+-------------+--------------+------+-----+---------+----------------+
| id          | int(11)      |      | PRI | NULL    | auto_increment |
| desctiption | varchar(100) |      |     |         |                |
| done        | tinyint(4)   |      |     | 0       |                |
+-------------+--------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

テーブルが出来たら、各種設定です。

  1. config/environment.rbの設定
  2. public/.htaccessの設定
  3. tmpとlogのパーミッション
  4. config/database.ymlの設定

(1)(2)(3)はその2に詳しいので、そちらをご参照の上、設定してください。(4)は、DBの設定です。
development:とtest:とproduction:の3セクションがありますが、今回はdevelopment:を下記のように
設定します。

development:
adapter: mysql
database: xxxx
username: xxxx
password: yyyy
host: mysqlxx.db.sakura.ne.jp

次にアプリケーションのモデルとコントローラーを生成します。

% cd ~/Rails/Todo
% ruby script/generate model Todo
% ruby script/generate controller todo

詳しい説明は省きますが ^^;; app/controllers/todo_controller.rb を以下のようなかんじにします。

% cat app/controllers/todo_controller.rb
class TodoController < ApplicationController
 model :todo
 def index
   redirect_to :action => :list
 end
 def list
   @items = Todo.find_all
   @newitem = Todo.new
 end
 def edit
  @edititem = Todo.find(params[:id])
 end
 def update
  item = Todo.find(params[:id])
  item.update_attributes(params[:todo])
  if item.save
        redirect_to(:action => "list")
  else
        render_text "Couldn't update an item"
  end
 end
 def add_item
  item = Todo.new(params[:todo])
  if item.save
        redirect_to(:action => "list")
  else
        render_text "Couldn't add new item"
  end
 end
end

app/views/todo/edit.rhtmlを下記のように。

% cat app/views/todo/edit.rhtml
<html>
  <head>
    <title>Edit an item - My todo list</title>
  </head>
 
  <body>
  Edit the item:<br>
  <% form_for :todo, @edititem, :url => { :action => :update , :id => @edititem } do |f| %>
    <%= f.check_box :done %>
    <%= f.text_field :description %>
    <%= submit_tag 'Update' %>
  <% end %>
  </body>
</html>

app/views/todo/list.rhtmlを下記のように。

% cat app/views/todo/list.rhtml
<html>
  <head>
    <title>My todo list</title>
  </head>
 
  <body>
    <% @items.each do |i| %>
    <%= check_box_tag("i", i.done, (i.done == 1)) %>
    <%= i.description %>
    <%= link_to("Edit", :action => "edit", :id => i.id) %>
    <br />
    <% end %>
  <hr>                                                   
  <% form_for :todo, @newitem, :url => { :action => :add_item } do |f| %>
    New item:
    <%= f.text_field :description %>
    <%= submit_tag 'Add item' %>
  <% end %>
  </body>
</html>

config/routes.rbに下の2行を追加。

map.connect '', :controller => "todo"
map.connect 'list', :controller => "todo", :action => 'list'

webで見られるところから、publicにシンボリックリンクを張る。

% ln -s /home/xxxx/Rails/Todo/public ~/www/todo

そんなこんなで完成。「My todo list」でうごいています。みてみるとわかりますが、かなり遅い。リロードに3秒ぐらいかかりますね。さくらのレンタルサーバーはfcgiが使えなくって、cgiなのが原因みたい。ちょっとこの遅さではツカエナイカモ…

参考文献

  1. テスト
  2. さくらのレンタルサーバーにRuby on Railsをインストールする方法
  3. さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2
  4. Rail’s wiki

さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2

前回、さくらのレンタルサーバにRuby on Railsをインストールする方法でrubygemsとRuby on Railsのインストールができたので、こんどは試しに動かしてみます。

まずはRailsのアプリケーションのディレクトリを作成。場所はどこでもいいですが、webでみられないところにしてください。さくらのレンタルサーバーでいうと ~/www 以外ですね。のちほど、公開用のディレクトリだけ、~/www以下からシンボリックリンクを張ります。ここでは~/Rails以下にRailsのアプリケーションをまとめておくことにして、今回のテスト用のアプリケーション「test」(そのまま!)をその下におきます。

% cd
% mkdir Rails
% cd Rails
% rails test
      create  
      create  app/controllers
...(略)...
      create  log/development.log
      create  log/test.log
% ls -l
total 2
drwxr-xr-x  14 narak  users  512 Aug 22 13:03 test/
% cd test
% ls -l
total 34
-rw-r--r--  1 narak  users  8001 Aug 22 13:03 README
-rw-r--r--  1 narak  users   307 Aug 22 13:03 Rakefile
drwxr-xr-x  6 narak  users   512 Aug 22 13:03 app/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 components/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 config/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 db/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 doc/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 lib/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 log/
drwxr-xr-x  5 narak  users   512 Aug 22 13:03 public/
drwxr-xr-x  4 narak  users   512 Aug 22 13:03 script/
drwxr-xr-x  7 narak  users   512 Aug 22 13:03 test/
drwxr-xr-x  6 narak  users   512 Aug 22 13:03 tmp/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 vendor/

できた。できたら、いくつか設定を変更します。

まずはディレクトリとファイルのパーミッション関係。test/log と test/tmp はwebサーバー経由で起動されたrubyに書き込み権限がないといけません。したがって、o+wにしちゃう。-Rオプションを忘れずに。

% chmod -R o+w log tmp
% ls -l
total 34
-rw-r--r--  1 narak  users  8001 Aug 22 13:03 README
-rw-r--r--  1 narak  users   307 Aug 22 13:03 Rakefile
drwxr-xr-x  6 narak  users   512 Aug 22 13:03 app/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 components/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 config/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 db/
drwxr-xr-x  2 narak  users   512 Aug 22 13:03 doc/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 lib/
drwxr-xrwx  2 narak  users   512 Aug 22 13:03 log/
drwxr-xr-x  5 narak  users   512 Aug 22 13:03 public/
drwxr-xr-x  4 narak  users   512 Aug 22 13:03 script/
drwxr-xr-x  7 narak  users   512 Aug 22 13:03 test/
drwxr-xrwx  6 narak  users   512 Aug 22 13:03 tmp/
drwxr-xr-x  3 narak  users   512 Aug 22 13:03 vendor/

次は環境ファイルの設定。場所はtest/configの下の「environment.rb」です。ロードパスを追加するのと、環境変数GEM_HOMEの設定を追加。diffをとるとこんなかんじ。3行追加ですからviで編集するか、下のようなpatchをあてるか、どうにかしてください。もちろん「/home/narak」のところはご自分のホームディレクトリに変更してくださいね。

% diff -u config/environment.rb.org config/environment.rb
--- config/environment.rb.org   Wed Aug 22 13:20:58 2007
+++ config/environment.rb       Wed Aug 22 13:20:47 2007
@@ -1,4 +1,8 @@
 # Be sure to restart your web server when you modify this file.
+$LOAD_PATH.push("/home/narak/lib/ruby/site_ruby/1.8")
+$LOAD_PATH.push("/home/narak/lib/ruby")
+
+ENV['GEM_HOME'] ||= '/home/narak/lib/ruby/gem'
 
 # Uncomment below to force Rails into production mode when 
 # you don't control web/app server and can't set it the proper way

上記は、要するにインストールのところで~/.cshrcに設定した環境変数「RUBYLIB」と「GEM_HOME」ですね。Railsのアプリケーションがwebサーバ経由で動くときは、当然ユーザとは違うuidでうごきますから、
~/.cshrcで環境変数設定しても全然関係ない。だからこのconfig/environment.rbにかかなくちゃいけないってわけ。実は前の記事を書いたあと、すぐこの記事を書こうと思ったのだが、これでハマって時間がかかってしまった。
だいぶコードを読んだので、おかげさまでrubygemsに詳しくなりました ^^; GEM_HOMEめー。

config/environment.rbが終わったら次はpublic/.htaccessです。このpublicディレクトリが公開用のディレクトリになります。さくらのレンタルサーバーではOptionsは無効なので、これをコメントアウト
しておかないとエラーになっちゃいます。AddHandlerもいらないのでコメントアウト。

% diff -u public/.htaccess.org public/.htaccess
--- public/.htaccess.org        Wed Aug 22 13:35:07 2007
+++ public/.htaccess    Wed Aug 22 13:34:26 2007
@@ -1,7 +1,7 @@
 # General Apache options
-AddHandler fastcgi-script .fcgi
-AddHandler cgi-script .cgi
-Options +FollowSymLinks +ExecCGI
+#AddHandler fastcgi-script .fcgi
+#AddHandler cgi-script .cgi
+#Options +FollowSymLinks +ExecCGI
 
 # If you don't want Rails to look in certain directories,
 # use the following rewrite rules so that Apache won't rewrite certain requests

さー、これでいよいよ準備が整いました。webからみられる場所からtest/publicに向けてシンボリックリンクを張ります。今回は~/wwwの直下に「test」という名前でシンボリックリンクを作りました。こんなかんじ。

% ln -s $HOME/Rails/test/public $HOME/www/test

これで、http://narak.sakura.ne.jp/test/にアクセスすると下のような「Welcome aboard」画面が出ます。

welcome-aboard2.jpg

図1. Welcome abord

続いて「About your application’s environment」をクリックしてみます。

for-security-purpose.jpg

図2. About your application’s environment

図2のように「For security purposes, this information is only available to local requests.」と出ればRailsは正常動作しています。とりあえずパチパチ!

トラブルシューティング

上記の図1、図2のようにならなかった場合ですが、まず図1の画面が出ず、図3のように
「Internal Server Error」が出る場合。これはpublic/.htaccessにエラーがあると思われます。
ちゃんと「Options」をコメントアウトしたかどうかチェックしましょう。

internal-server-error.jpg

図3. Internal Server Error

次に図1の画面は出るのだが、図2のところで「Application error Rails application failed to start properly”」と出る場合(図4)。この場合は、config/environment.rbでENV[‘GEM_HOME’]がセットされていないと思われます。ちゃんとENV[‘GEM_HOME’](と$LOAD_PATH)の行を追加したかチェックしましょう。

application-error.jpg

図4. Application error

というわけで、いちおう動作できました。次回はデータベースの設定をして、簡単なアプリケーションでも作ってみましょう。さくらのレンタルサーバでRuby on Railsをうごかしてみたら…ヘ続く。

参考文献

  1. Ruby on Rails
  2. RubyGems Manuals
  3. Application Error – Rails application failed to start properly, Hoopla!, 2006
  4. RubyOnRails(さくらサーバ編)
  5. さくらのレンタルサーバにRuby on Railsをインストールする方法(その1), がんちゃんのブログ, 2007

さくらのレンタルサーバにRuby on Railsをインストールする方法


2008.5.10追記

rubygemsもRailsも新しいバージョンが出ており、インストールの手順が多少かわりましたので、それにもとづいた記事をかいております。アップデート版さくらのレンタルサーバーにRuby on Rails 2.0.2をインストールする方法をご覧ください。


6月にあった人工知能学会の全国大会でもまつもとさんが招待講演をしたりして、なにげにもりあがっているRuby on Railsですが、わたしもさくらのレンタルサーバでRuby on Railsしてみようとおもい、インストールしてみました。そのための手順をまとめておきます。インストールに当たっては参考文献[1]と[2]を参考にしました。

まずはrubyがはいっていることの確認。

% ruby --version
ruby 1.8.5 (2006-08-25) [i386-freebsd6]

もんだいありませんね。rubyを新規にインストールしているひとが多いようですが、rubyをインストールし直す必要は「ありません」。既に入っているものを利用可能です。ただし「environment.rb」というファイルに環境変数「GEM_HOME」を設定する必要があります。詳しくは

続編「さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2」をあわせてごらんください。

次にrubygemsをインストールします。rubygemsはrubyのパッケージ管理システムみたいなやつです。むしろgemsはrailsのインストール手段として有名になってきたらしい。なるほど。で、インストール方法ですが、標準のインストール先は/usr/localのようですが、もちろんさくらのレンタルサーバーではそんなところには入れられないので、$HOME(=/home/hogehoge)に入れることにします。$HOME/lib/ruby/gemと$HOME/binにはいります。ディレクトリがない場合は作っておきます。

% mkdir ~/bin
% mkdir ~/lib
% mkdir ~/lib/ruby
% mkdir ~/lib/ruby/gem

/usr/localじゃなくて$HOMEを見るように環境変数を設定しておきます。~/.cshrcに以下の行を追加。

setenv RUBYLIB $HOME/lib/ruby/site_ruby/1.8:$HOME/lib/ruby
setenv GEM_HOME $HOME/lib/ruby/gem

.cshrcをセーブしたら% source ~/.cshrcなどとして環境変数をセットしておきます。

rubygemsをダウンロードして展開します。2007年8月現在の最新版は0.9.4です。展開先は~/srcの下あたりがいいでしょう。なかったらこの際だから作っておきましょう。

% mkdir ~/src
% cd ~/src
% ftp http://rubyforge.org/frs/download.php/20989/rubygems-0.9.4.tgz
% tar xvzf rubygems-0.9.4.tgz

gemsをインストールします。setup.rbを実行するとconfig, setup, installの順で勝手に実行されるのですが、下で述べる理由で今回は1ステップづつ手で実行します。まずはconfigです。インストール先は$HOMEなのでその旨指定します。

% cd rubygems-0.9.4
% ruby setup.rb config --prefix=$HOME

このあとはsetupしてinstallするのですが、このままだとうまくいきません。あまり追求していませんが、おそらくrubygemsのバグでgemsが入るlibのパスが、configのprefixで指定したやつにならないのね。しょうがないので修正します。configsするとできる「.config」というファイルをviかなんかで以下のように修正するか、sedでもかけるか、patchするかなんかして修正してください。6行ほど修正。

% diff -u .config.org .config
--- .config.org Sun Aug 19 19:50:15 2007
+++ .config     Sun Aug 19 19:51:40 2007
@@ -5,12 +5,12 @@
 mandir=$prefix/man
 sysconfdir=$prefix/etc
 localstatedir=$prefix/var
-libruby=/usr/local/lib/ruby
-librubyver=/usr/local/lib/ruby/1.8
-librubyverarch=/usr/local/lib/ruby/1.8/i386-freebsd6
-siteruby=/usr/local/lib/ruby/site_ruby
-siterubyver=/usr/local/lib/ruby/site_ruby/1.8
-siterubyverarch=/usr/local/lib/ruby/site_ruby/1.8/i386-freebsd6
+libruby=$libdir/ruby
+librubyver=$libdir/ruby/1.8
+librubyverarch=$libdir/ruby/1.8/i386-freebsd6
+siteruby=$libdir/ruby/site_ruby
+siterubyver=$libdir/ruby/site_ruby/1.8
+siterubyverarch=$libdir/ruby/site_ruby/1.8/i386-freebsd6
 rbdir=$siterubyver
 sodir=$siterubyverarch
 rubypath=/usr/local/bin/ruby18

「.config」を修正したら、setupしてinstallです。

% ruby setup.rb setup
% ruby setup.rb install

これでgemsがインストールできたはず。出来たら確認しよう。出来たばかりだとコマンドがコマンドサーチパス内にはいっててもみつからないので、実行前にrehashします。

% rehash
% gem -v
0.9.4

オッケーですね。ではいよいよRailsをインストールしましょう。以下のようにします。

% gem install rails --include-dependencies

1回めはパッケージの情報がとれなかったみたいで失敗しました。2回めはオッケー。–include-dependenciesオプションをつけると、Railsのために必要なパッケージもインストールしてくれます。成功したら$HOME/lib/ruby/gem/bin/のしたにrailsとrakeというコマンドが入っています。$HOME/binあたりへシンボリックリンクを張ってもいいけど、面倒なのでまるごとコマンドサーチパスに入れておきます。~/.cshrcを編集して$pathに$HOME/lib/ruby/gem/bin を追加。

set path = (/sbin…(略)…/usr/X11R6/bin $HOME/bin $HOME/lib/ruby/gem/bin)

出来たらsourceしてrehashしてrailsの確認。

% source ~/.cshrc
% rehash
% rails -v
Rails 1.2.3

できたー。けっこう簡単。かな?

続編「さくらのレンタルサーバーにRuby on Railsをインストールする方法 その2」では、Railsの動作確認をします。つづく。

参考文献

  1. [Ruby]さくらにrubygems0.9.4インストール, qw/Perる PHP 日誌/, 2007
  2. [Ruby]さくらにRailsインストール, qw/Perる PHP 日誌/, 2007
  3. シリーズ パッケージマネジメント, rubyist magazine, 2006
  4. ruby on rails