Ubuntu11.10でRuby on Railsを動かすまでの奮闘記

前回(Ubuntu11.10にRVMをインストール - エンジニア3年生のお勉強ノート)はRVMをインストールしました。今回はRubyRailsMySQLをインストールして、アプリケーション開発の一歩手前くらいまで行きましょう!

追記しまくって長くなってしまったので、次回は短くまとめた記事も書こうと思います。

Ruby1.9.2と1.8.7をインストール(※編集部注:後で再インストールになるので読むだけにしてください)

Rubyのバージョンは大きく1.8系と1.9系があってけっこう中身が違うらしいです。ここでは1.8.7と1.9.2の両方をインストールします。
まずは次のコマンドで1.9.2をインストール。

$ rvm install 1.9.2

けっこう時間がかかるので気長に待ちましょう。

Installation of rubygems completed successfully.
ruby-1.9.2-p320 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.9.2-p320 - #importing default gemsets (/home/su10/.rvm/gemsets/)
Install of ruby-1.9.2-p320 - #complete

とかなんとか出たらインストール完了。次は1.8.7をインストール。

$ rvm install 1.8.7
Installation of rubygems completed successfully.
ruby-1.8.7-p358 - adjusting #shebangs for (gem irb erb ri rdoc testrb rake).
ruby-1.8.7-p358 - #importing default gemsets (/home/su10/.rvm/gemsets/)
Install of ruby-1.8.7-p358 - #complete 
Please be aware that you just installed a ruby that requires 2 patches just to be compiled on up to date linux system.
This may have known and unaccounted for security vulnerabilities.
Please consider upgrading to Ruby 1.9.3-194 which will have all of the latest security patches.

と出たらインストール完了。最後の文は「セキュリティに脆弱性があるから最新版のRubyを使うのをおすすめするよ」ってことでしょうかね。こういうのは見なかったことにするのが大人ってやつです。

Railsをインストール

Railsも2系と3系でだいぶ違うらしいですが、今回はバージョン2.3.11をインストールします。

$ gem install rails --version=2.3.11
ERROR:  Loading command: install (LoadError)
    no such file to load -- zlib
ERROR:  While executing gem ... (NameError)
    uninitialized constant Gem::Commands::InstallCommand

なん…だと…!?
ということで「no such file to load -- zlib」でググったらgemでno such file to load -- zlibとかいうエラーが出る - tumblrに書いてました。

実はこのzlibがrubyをインストールする時点で必要なためにこのエラーが出るらしい。

という訳でzlibをまずはubuntuにそれをインストールする。

ということらしいので、zlibをインストール。apt-getだと次のコマンドを実行。自分はUbuntuソフトウェアセンターで「zlib1g-dev」で検索して入れましたテヘペロ>u<

$ sudo apt-get install zlib1g-dev

rvmにzlibを読ませましょう。

$ rvm pkg install zlib

話がそれますが、GoogleIMEで「zl」と打つと矢印(→)が出たので調べたら、上下左右の矢印を一発で入力できるショートカットがあるみたいですね(Google日本語入力に矢印上下左右が一発で入力できるショートカットがあることやJSONPの指定が可能なことが判明 - Togetter)。Emacerなんでよくわかりませんが、vimの移動キーと対応してるような気がします。

「zk連打できのこざくざく」と覚えるといいらしいですw

たけのこ派はたけのこで覚えましょう。

終わったらRubyを再インストール。めんどくさい。さっきインストールしなかった賢い人は「reinstall」の部分を「install」に読み替えてください。

$ rvm reinstall 1.8.7
$ rvm reinstall 1.9.2

今度は大丈夫です。

$ gem install rails -v 2.3.11

一応確認。

$ rails -v
Rails 2.3.11

出たぁ!!!!!!!
88888888888888888888=3

(2012/5/21 追記)
パソコン再起動して

$ rails -v

って打ったら

プログラム 'rails' はまだインストールされていません。  次のように入力することでインストールできます:
sudo apt-get install rails

???…意味不明。.bashrcにも書くべきことは書いたのに。とりあえず

$ gem list

するも

*** LOCAL GEMS ***

gem表示されてないじゃん…これって会社でもなった$GEM_HOMEが空のやつじゃん…。試しに

$ echo $GEM_HOME

HORANE!!くそッ!!なんなんだよ!!
って思って調べたら、どうやらRVMは利用するRubyのバージョンでgemのパスとかを変更してくれるらしい(参考:今日から使える!rvmの簡単な使い方とその仕組み - (゚∀゚)o彡 sasata299's blogの「rvmの仕組み」)。

実は rvm use してバージョンを切り替えると、環境変数の $PATH や $GEM_PATH がそれぞれのバージョンに併せたパスに書き換えられます。そのおかげで、特に意識することなくそれぞれのバージョンの Ruby や gem が利用出来るわけです。

ということは?

$ rvm list
rvm rubies

   ruby-1.8.7-p358 [ i686 ]
   ruby-1.9.2-p320 [ i686 ]

# => - current
# =* - current && default
#  * - default

はい使うRubyが設定されてませんでしたー
使うRubyが設定されてないからそのRubyと一緒に使うgemのパスも通してくれてませんでしたー
このような悲劇が繰り返されないためにもデフォルトで使うRubyを設定しておきましょう。アルミナ解析室 - FC2 BLOG パスワード認証を参考に

$ rvm use 1.8.7@global --default

これでgemsetもまとめてデフォルト設定しました!(意味はわかってないけど)。ここであらためて

$ gem list
*** LOCAL GEMS ***

bundler (1.1.3)
rake (0.9.2.2)
rubygems-bundler (1.0.2)
rvm (1.11.3.3)

Railsがないですね。これは前回Rubyの1.9.2をインストールしてからRailsをインストールしたため、RVMの使うRubyのバージョンが1.9.2になっていた→1.9.2で使うgemとしてのみRailsがインストールされた ということですね。
試しに

$ rvm use 1.9.2
$ gem list | grep "rails"
rails (2.3.11)

ちゃんと入ってますね。ということで1.9.2のgemを1.8.7に全部コピーしてあげましょう。今日から使える!rvmの簡単な使い方とその仕組み - (゚∀゚)o彡 sasata299's blogの「gemをインストールする」を参考に

$ rvm gemset export

$ rvm use 1.8.7

$ rvm gemset import

の3つのコマンドを順番に実行します。やれやれだぜ。

(2012/5/21 追記ここまで)

MySQLをインストール

gem で mysql のインストールに必要な物 - Konbuの技術 && 読書録を参考に、Ubuntuソフトウェアセンターから「libmysqlclient-dev」をインストール。次のコマンドを実行。途中の「--」はなんだかよくわからないけどまぁいいか。

$ gem install mysql -- --with-mysql-config

確認。

$ mysql
プログラム 'mysql' は以下のパッケージで見つかりました:
 * mysql-client-core-5.1
 * mysql-cluster-client-5.1
次の操作を試してください: sudo apt-get install <選択したパッケージ>

え?…

どうやら今入れたのはMySQLアダプタとかいうRailsMySQLをつなぐためのものだったようです。

Rails2.2以降、MySQLのドライバは標準では組み込まれない

Ruby on Railsのインストールと起動 - [Ruby on Rails/Ruby] ぺんたん infoより)とかなんとかで。
気をとり直してMySQLの本体をインストール。例によってUbuntuソフトウェアセンターから「MySQLサーバー」をインストール。途中でMySQLのrootのパスワードを聞かれるので適当に設定しましょう。ローカルだったらなしのほうがいろいろと捗る気もしますが、一応設定します。
インストールできたら確認。

$ mysql -u root -p
Enter password:  # さっき設定したパスワードを入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 40
Server version: 5.1.62-0ubuntu0.11.10.1 (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

rootにパスワードを設定しなかった場合は「mysql」とだけ打っても入れると思います。たぶん。
この後、rootだとなんでもできちゃうので「su10」とか適当なユーザーを作って権限を設定するのですが、続きはまた次回。


(2012/5/21 追記)

MySQLのユーザ作成

MySQLではデフォルトでrootという全ての権限を持つユーザがいますが、rootユーザだけだと心もとないのでもうひとつユーザを作りましょう。以下のコマンドはユーザ名が「su10」、パスワードが「hogehoge」のユーザを作るコマンドです。

mysql> grant all on *.* to su10@localhost identified by "hogehoge";
Query OK, 0 rows affected (0.00 sec)

打つのは1行目の「grant」から「;」までです。2行目のように「Query OK」がでればおk。
これで「他のユーザに権限を付与できる権限」以外の全ての権限を持つユーザsu10が作成できました。「exit」と打ってログアウトし、今作成したユーザでログインしてみます。

$ mysql -u su10 -p
Enter password:  #パスワードを入力
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 35
Server version: 5.1.62-0ubuntu0.11.10.1 (Ubuntu)

Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

無事ログインできました。
続いて全てのデータベースを表示してみましょう。次のコマンドを打ちます。

mysql> show databases;
                                          • +
Database
                                          • +
information_schema
mysql
                                          • +
2 rows in set (0.00 sec) mysql>

mysql」とか「information_schema」とかいうテーブルは自分で作った覚えはありませんが、MySQLのユーザの情報などが入っているらしいです。まずは次のコマンドで操作するデータベース(ここではmysql)を選択しましょう。

mysql> use mysql;

データベース内のテーブルを全て列挙します。

mysql> show tables;
+---------------------------+
| Tables_in_mysql           |
+---------------------------+
| columns_priv              |
| db                        |
| event                     |
| func                      |
| general_log               |
| help_category             |
| help_keyword              |
| help_relation             |
| help_topic                |
| host                      |
| ndb_binlog_index          |
| plugin                    |
| proc                      |
| procs_priv                |
| servers                   |
| slow_log                  |
| tables_priv               |
| time_zone                 |
| time_zone_leap_second     |
| time_zone_name            |
| time_zone_transition      |
| time_zone_transition_type |
| user                      |
+---------------------------+
23 rows in set (0.00 sec)

ここで、「テーブル」というのは表のことです。普段エクセルとかで作る表がそのままテーブルに対応してます。表であるテーブルの集合がデータベースです。
わかりづらいので「user」テーブルの中身を実際に表示してみましょう。次のコマンドを打ちます。

mysql> select Host,User from user;
+----------------+------------------+
| Host           | User             |
+----------------+------------------+
| localhost      | root             |
| su10-FMVMG55RD | root             |
| 127.0.0.1      | root             |
| localhost      | debian-sys-maint |
| localhost      | su10             |
+----------------+------------------+
5 rows in set (0.00 sec)

mysql> 

userテーブルのHostカラム(カラムは縦の列のこと)とUserカラムの2つを選んで表示しました。全部表示したい場合は以下のように打ちます。

mysql> select * from user\G;

最後の\Gはテーブルが横長すぎて表示がおかしくなったり見づらいときにつけます。これをつけることで1行(raw、横のこと)ごとにまとめて表示されるので見やすくなります。


(2012/5/27 追記)

とりあえずRailsアプリケーションを作る

とりあえず作りましょう。次のコマンドを打ちます。

$ rails hoge -d mysql

これでhoge以下のディレクトリにhogeという名前のアプリケーションを動かすためのファイルができました。また、利用するデータベースをMySQLに指定しています。

サーバーを起動する

「もういけんじゃね?」ということでサーバーを起動してみましょう。

$ cd hoge
$ script/server
su10@su10-FMVMG55RD:~/hoge$ script/server
=> Booting WEBrick
=> Rails 2.3.11 application starting on http://0.0.0.0:3000
NOTE: Gem.source_index is deprecated, use Specification. It will be removed on or after 2011-11-01.
Gem.source_index called from /home/su10/.rvm/gems/ruby-1.8.7-p358/gems/rails-2.3.11/lib/rails/gem_dependency.rb:21.
   ・
  ・
  ・

とかなんとかでいっぱい怒られました。RubyGems をダウングレードする方法 - 日々是笑心によるとgemが新しすぎるようなので、ダウングレード。

$ gem update --system 1.7.1
$ gem -v
1.7.1

もう一回チャレンジ。

$ script/server

ログが流れてしまって貼れませんが、「no such file to load -- openssl」とかなんとかのエラー。
rvmからrailsを利用しようとすると'no such file to load -- openssl'のエラー - masa_wの日記を参考に

$ rvm pkg install openssl    # package だと怒られたので pkg
$ rvm remove 1.8.7
$ rvm remove 1.9.2
$ rvm install 1.8.7 -C --with-openssl-dir=$HOME/.rvm/usr
$ rvm install 1.9.2 -C --with-openssl-dir=$HOME/.rvm/usr

またしてもRubyをインストールし直すという苦行に。時間がかかるので気長に待ちましょう。終わったら再チャレンジ。

$ script/server
=> Booting WEBrick
=> Rails 2.3.11 application starting on http://0.0.0.0:3000
NOTE: Gem.source_index is deprecated, use Specification. It will be removed on or after 2011-11-01.
Gem.source_index called from /home/su10/.rvm/gems/ruby-1.8.7-p358/gems/rails-2.3.11/lib/rails/gem_dependency.rb:21.
  ・
  ・
  ・
Gem::SourceIndex#initialize called from /home/su10/.rvm/gems/ruby-1.8.7-p358/gems/rails-2.3.11/lib/rails/vendor_gem_source_index.rb:100.
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2012-05-27 23:24:00] INFO  WEBrick 1.3.1
[2012-05-27 23:24:00] INFO  ruby 1.8.7 (2012-02-08) [i686-linux]
[2012-05-27 23:24:05] INFO  WEBrick::HTTPServer#start: pid=2795 port=3000

お!まだなんか言われてるけどサーバー立ち上がったっぽい!
ブラウザを開いてアドレス欄に「http://localhost:3000/」と入れましょう。
「Welcome aboard」とかなんとか出てたら成功です!いやー長かった。あとは書いてある指示に従って、modelやcontrollerを作ったり、routes.rbを書き換えたり、「config/database.yml」を書き換えればおkです。

「config/database.yml」を書き換える

このファイルはアプリケーションとデータベースを繋ぐための設定ファイルらしいです。デフォのSQLiteを使うならいじらなくてもいいらしいですが、MySQLを使うことにしちゃったので書き換えましょう。一旦Ctrl+cでサーバーを落としてから適当なテキストエディタでdatabase.ymlを開きます。

$ emacs config/database.yml
  ・
  ・
  username: root
  password:
  ・
  ・

となっているところを「MySQLのユーザ作成」で作成したユーザ名とパスワードで片っ端から書き換えます。自分の場合は3箇所あったので全部書き換えました。
さっき開いたページの指示に従って、rakeでデータベースを作成。

$ rake db:migrate
WARNING: 'require 'rake/rdoctask'' is deprecated.  Please use 'require 'rdoc/task' (in RDoc 2.4.2+)' instead.
    at /home/su10/.rvm/gems/ruby-1.8.7-p358/gems/rake-0.9.2.2/lib/rake/rdoctask.rb
rake aborted!
Unknown database 'hoge_development'

Tasks: TOP => db:migrate
(See full trace by running task with --trace)

Redmine 「コードレビュープラグイン(Code Review)導入編」 - smallplaceの日記を参考にrakeのバージョンを0.8.7にしても変わらなかったので、gemをさらにダウングレード。

gem update --system 1.3.7

…結局変わらず。rakeも0.9.2.2を何度アンインストールしようとしてもできなかったけど、以下でいけた。

$ rvm use 1.8.7@global
$ gem uninstall rake 0.9.2.2

「@global」って何なんだろうか?調べなければ…。とりあえず

$ rake db:migrate
/home/su10/.rvm/bin/rake: 行 6: /home/su10/.rvm/bin/rake: 引数リストが長すぎます
/home/su10/.rvm/bin/rake: 行 6: /home/su10/.rvm/bin/rake: 成功です

なんだこれ…ググってもわからん…。とりあえずrakeをもう一度アンインストールしてインストールしなおす。

$ rvm 1.8.7
$ gem uninstall rake
$ gem install rake -v 0.8.7
$ rake db:migrate
(in /home/su10/hoge)
rake aborted!
Unknown database 'hoge_development'

なんか結局データベースは自分で作らなきゃいけないらしい。MySQLでデータベースを作る。

mysql> create database hoge_development character set utf8;
$ rake db:migrate
(in /home/su10/hoge)

あ、通った!


これでやっとRuby on Railsでいろいろ作れるようになりましたね。頑張った自分。お疲れ様でした。