Browse Month: May 2010

RVM を使ってみた

Ruby のバージョンには、いくか種類があります。現在、Ruby バージョン 1.8 系、バージョン 1.9 系、をはじめ REE、JRuby、などいくもあります。これからの複数のバージョンを切り替えて使いたい場合には、RVM(Ruby Version Manager)を使うと便利です。

RVM を使うと、簡単に Ruby のバージョンを使い分けることができます。

インストールは、いたってシンプルで gem からインストールします。

$ sudo gem install rvm

rvm をインストールしたら、rvm-install コマンドでホームディレクトリにインストールします。

$ rvm-install

すると、$HOME/.rvm というディレクトリが作れらます。

次に、.zshrc などに、次の設定を追加して反映させます。反映されると、rvm というコマンドが使えるようになります。

if [[ -s /Users/n0ts/.rvm/scripts/rvm ]] ; then source /Users/n0ts/.rvm/scripts/rvm ; fi

あとは、ここに使いたい Ruby をインストールするだけです。RVM で対応している Ruby 一覧を見るには、次のコマンドを実行します。

$ rvm list known

(ruby-)1.8.6(-p399)
(ruby-)1.8.6-head
(ruby-)1.8.7(-p249)
(ruby-)1.8.7-head
(ruby-)1.9.1(-p243)
(ruby-)1.9.1(-p376)
(ruby-)1.9.1-head
(ruby-)1.9.2-preview1

REE や JRuby や IronRuby などにも対応しています。

さっそく複数の Ruby をインストールしてみましょう。

最初に、Ruby バージョン 1.8.7 をインストールします。

$ rvm install 1.8.7

Ruby をコンパイルしてインストールするので、対象時間がかかります。

次に、Ruby バージョン 1.9.1 をインストールします。

$ rvm install 1.9.1

そして、肝心の Ruby を切り替える方法ですが、バージョン 1.8.7 に切り替えたいときは、次のコマンドを実行します。

$ rvm use 1.8.7
Using ruby 1.8.7 p249

$ ruby –version
ruby 1.8.7 (2010-01-10 patchlevel 249) [i686-darwin10.3.0]

$ which ruby
/Users/naoya/.rvm/rubies/ruby-1.8.7-p249/bin/ruby

仕組みは単純で PATH 環境変数を書き換えているだけです。

次にバージョンを 1.9.1 に切り替えてみます。

$ rvm use 1.9.1
Using ruby 1.9.1 p378

$ ruby –version
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]

$ which ruby
/Users/n0ts/.rvm/rubies/ruby-1.9.1-p378/bin/ruby

ちゃんと切り替わっていますね。

また、RVM でインストールした Ruby に対して一括実行することもできます。

$ rvm ruby -v
ruby-1.9.1-p378: ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]
ruby 1.9.1p378 (2010-01-10 revision 26273) [i386-darwin10.3.0]

$ rvm gem install rails

まとめて Rails をインストールすることができます。

Passenger も同様にインストールできますが、Passenger の Apache / Nginx モジュールを作成するときには、次のようにします。

$ rvm install
$ rvm 1.8.7 –passenger
$ rvm 1.8.7
$ gem install passenger
Building native extensions. This could take a while…

$ rvmsudo passenger-install-nginx-module

Phusion Passenger is a trademark of Hongli Lai & Ninh Bui.

あとは、PassengerRoot を、/Users/naoya/.rvm/gems/ruby-1.8.7-p249/gems/passenger-2.2.11/ に設定します。Ruby バージョン 1.9.0 のときも同様の方法でインストールすることができます。

RVM を使うと、手軽に Ruby を切り替えることができるので、便利です。

Ruby バージョン 1.8.7 の RPM を作る

CentOS 5.4 x86_64 の Ruby は、ご存じのとおりバージョン 1.8.5。枯れすぎています、さすがに最近ではバージョン 1.8.5 だと動かないプログラムが増えてきたので、RPM を作ってみました。ちなみに RHEL6 beta の Ruby のバージョンは 1.8.6 なので、CentOS 6 になっても役に立ちそうです。

まず、Fedora になる Ruby 1.8.6 の RPM をダウンロードします。

$ wget http://ftp.jaist.ac.jp/pub/Linux/Fedora/development/source/SRPMS/ruby-1.8.6.399-1.fc14.src.rpm

SRPM をインストールします、なぜか MD5 があわないので無視します。

$ rpm -i –nomd5 ruby-1.8.6.399-1.fc14.src.rpm

ruby.spec ファイルを書き換えます、現時点での Ruby バージョン 1.8.7 のパッチレベルは 249 なので、ダウンロードします。

$ cd rpmbuild/SOURCES

$ wget ftp://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p249.tar.bz2

次に ruby.spec ファイルを、修正します。基本的に適応できないパッチをあてないのと、x86_64 の場合は lib ディレクトリのパスが変わるので変更します。lib ディレクトリのパスは、i386 でも問題がないように %{_lib} を利用しました。

ruby.spec ファイルの差分は、次のような感じです。

あとは、rpmbuild するだけですが、依存しているパッケージがけっこう多いので拙作の auto-rpmbuild.sh を使うと便利です。

$ auto-rpmbuild.sh -ba ~/rpmbuild/SPECS/ruby.spec

最後に、既存の Ruby を上書きしてアップグレード完了です。

$ sudo rpm -Uvh rpmbuild/RPMS/x86_64/ruby-*

$ ruby –version

ruby 1.8.7 (2010-01-10 patchlevel 249) [x86_64-linux]

上書きしたあと、なぜか ruby-libs の古いバージョンが残っているので念のため削除しておきました。

$ sudo rpm -e ruby-libs-1.8.5-5.el5_4.8

作成した Ruby の RPM は、github へアップロードしておきました(ついでに Rubygems バージョン 1.3.7 の RPM を作ってアップロードしておきました)。

今回の RPM の作り方は、次のページを参考にしました。

# CentOS は、パッケージが枯れすぎていてパッケージを作るのがとてもとても面倒だけれど、安定して動いてくれているので重宝しています。

svndump で差分バックアップをとる方法

実は、今まで知らなかったのですが、SVN リポジトリのダンプツールである svndump で、差分バックアップをとることができます。

例えば、CentOS の Subversion は 1.4.2 で試してみます。

まずは、通常の全体バックアップを行います。

$ svndump /var/svn/repository > svn_repository.dump

全体バックアップをとる直前のリビジョンを svn info file:///var/svn/repository で保存しておきます。

あとは、次の日などに前にリビジョンに +1 してリビジョンから、HEAD まで dump することで差分バックアップをすることができます。次の例は、前日がリビジョン 1 までのバックアップだと想定しています。

$ svnadmin dump –incremental -r 2:HEAD

前にとある開発サーバで、SVN リポジトリのバックアップを毎朝全体で行っていましたが、バックアップ量が多すぎてハードディスクがパンクしたことが何度がありました。差分バックアップを使えば、バックアップ量も少なくて済むので便利だと思います。