JRuby + Rails 3 + MySQL (Windows)

Windows上にJRuby + Rails 3 + MySQL環境をつくってみる。

Javaのインストール

JRubyは、JavaVM上で動作するRuby。そんなわけで、JRubyを実行するためには、あらかじめ、Javaをインストールしておく。Windows版のJavaでは、インストーラにしたがえばよい。


インストールがおわったら、

c:\>java -version
java version "1.7.0"
Java(TM) SE Runtime Environment (build 1.7.0-b147)
Java HotSpot(TM) Client VM (build 21.0-b17, mixed mode, sharing)

c:\>javac -version
javac 1.7.0

JRubyのインストール

Home — JRuby.org

Downloads — JRuby.org
からJRubyをダウンロード。jruby-bin-1.6.3.zipを適当なディレクトリに展開する。

jruby-1.6.3\bin
にPATHをとおす。

自分の環境は、PATHがごちゃごちゃしすぎているので、単純なjruby-console.cmdファイルをつくっておく。

@echo off
set JAVA_HOME=C:\Program Files\Java\jdk1.7.0
set PATH=%JAVA_HOME%\bin;%PATH%

set JRUBY_HOME=C:\Application\ProgrammingLanguage\Ruby\JRuby\jruby-bin-1.6.3
set PATH=%JRUBY_HOME%\bin;%PATH%

cd c:\

cmd
C:\>jruby -v
jruby 1.6.3 (ruby-1.8.7-p330) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1
.7.0) [Windows XP-x86-java]

C:\>jruby --1.9 -v
jruby 1.6.3 (ruby-1.9.2-p136) (2011-07-07 965162f) (Java HotSpot(TM) Client VM 1
.7.0) [Windows XP-x86-java]

JRubyはインストール成功

MySQLのインストール

MySQL :: Download MySQL Community Server
からWindows (x86, 32-bit), MSI Installerをダウンロードする。

ダウンロードページのダウンロードボタンを押すと、すぐにダウンロードはできず、ログインやらユーザ登録やらをもとめる入力フォームのある画面に画面遷移するけど、とりあえず、とばして、画面下部のNo thanks, just take me to the downloads!リンクをクリック。

ミラーサイトをからインストーラをダウンロードする。

インストールは、インストーラにしたがえばよい。インストールは、MySQLのインストールとMySQL Server Instance Configuration Wizardの実行の2段階になっている。Configuration Wizardの途中で、データベースの文字コードをどうするか指定する。ここでは、文字コードは、UTF-8を指定しておく。latin1のままだと、そりゃもう文字化けしまくる。

インストーラが正常終了して、MySQLサーバが起動していれば、コマンドラインから

mysql -u root -p --no-beep

とやって、ログインできるはず。

一応、文字コードの設定を確認しておこう。

 mysql> show variables like 'char%';
 +--------------------------+---------------------------------------------------------+
 | Variable_name            | Value                                                   |
 +--------------------------+---------------------------------------------------------+
 | character_set_client     | utf8                                                    |
 | character_set_connection | utf8                                                    |
 | character_set_database   | utf8                                                    |
 | character_set_filesystem | binary                                                  |
 | character_set_results    | utf8                                                    |
 | character_set_server     | utf8                                                    |
 | character_set_system     | utf8                                                    |
 | character_sets_dir       | C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
 +--------------------------+---------------------------------------------------------+
 8 rows in set (0.00 sec)

Rails 3のインストール

インストール前に、一応、環境を確認しておくか。じぶんは、JRuby以外に、複数のRubyの実行環境をインストールして、なんどかはまってしまったので、びくびくしている。All about Ruby on Rails & Data recovery software RVMという複数のRuby環境を利用する便利な仕組みもあるようなのだが、いまは、いいや。

C:\>gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.5.1
  - RUBY VERSION: 1.8.7 (2011-07-07 patchlevel 330) [java]
  - INSTALLATION DIRECTORY: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/lib/ruby/gems/1.8
  - RUBY EXECUTABLE: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/bin/jruby.exe
  - EXECUTABLE DIRECTORY: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/bin

C:\>jruby --1.9 -S gem environment
RubyGems Environment:
  - RUBYGEMS VERSION: 1.5.1
  - RUBY VERSION: 1.9.2 (2011-07-07 patchlevel 330) [java]
  - INSTALLATION DIRECTORY: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/lib/ruby/gems/1.8
  - RUBY EXECUTABLE: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/bin/jruby.exe
  - EXECUTABLE DIRECTORY: C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/bin

gemでインストールする。jrubyには、もともとgemがふくまれている。

C:\>gem -v
1.5.1

gem自体のバージョンはもっとあがっていて、gem自体のアップグレードもgemでできるようなのだけど、とりあえずこのままいこう。

gem自体のupdateをするなら

C:\>jruby -S gem update --system
....
C:\>gem -v

こちらは、古いバージョンの場合らしい。

C:\>jruby -S gem install rubygems-update
....
C:\>jruby -S update_rubygems
....
C:\>gem -v

また、なんどか、Rubyの実行環境 + Railsをインストールした経験では、gemやらgemでインストールするライブラリやらのバージョンのせいで、なぞのエラーがでることがけっこうあった。でも、ここでは、とりあえず気にしないでいこう。なにかあったらそのとき調べるさー。

以下は、Rubyのバージョン、1.9を意識して、1.9でコマンドたたくくせをつけようとして、1.9をつけてるのだけど、あんまり意味なかったみたい。どこで、どうすれば、効くのやら。

追記
JRuby 1.6.7とかだと、.jrubyrcファイルを作業ディレクトリか、ホームディレクトリにおいて、

compat.version = 1.9

と書いておくと、jrubyがデフォルトでruby 1.9互換で起動するようになる。

C:\>jruby --1.9 -S gem install rails
Fetching: activesupport-3.0.9.gem (100%)
Fetching: builder-2.1.2.gem (100%)
Fetching: i18n-0.5.0.gem (100%)
Fetching: activemodel-3.0.9.gem (100%)
Fetching: rack-1.2.3.gem (100%)
Fetching: rack-test-0.5.7.gem (100%)
Fetching: rack-mount-0.6.14.gem (100%)
Fetching: tzinfo-0.3.29.gem (100%)
Fetching: abstract-1.0.0.gem (100%)
Fetching: erubis-2.6.6.gem (100%)
Fetching: actionpack-3.0.9.gem (100%)
Fetching: arel-2.0.10.gem (100%)
Fetching: activerecord-3.0.9.gem (100%)
Fetching: activeresource-3.0.9.gem (100%)
Fetching: mime-types-1.16.gem (100%)
Fetching: polyglot-0.3.2.gem (100%)
Fetching: treetop-1.4.10.gem (100%)
Fetching: mail-2.2.19.gem (100%)
Fetching: actionmailer-3.0.9.gem (100%)
Fetching: thor-0.14.6.gem (100%)
Fetching: rdoc-3.9.2.gem (100%)
Depending on your version of ruby, you may need to install ruby rdoc/ri data:

<= 1.8.6 : unsupported
 = 1.8.7 : gem install rdoc-data; rdoc-data --install
 = 1.9.1 : gem install rdoc-data; rdoc-data --install
>= 1.9.2 : nothing to do! Yay!
Fetching: railties-3.0.9.gem (100%)
Fetching: bundler-1.0.17.gem (100%)
Fetching: rails-3.0.9.gem (100%)
Successfully installed activesupport-3.0.9
Successfully installed builder-2.1.2
Successfully installed i18n-0.5.0
Successfully installed activemodel-3.0.9
Successfully installed rack-1.2.3
Successfully installed rack-test-0.5.7
Successfully installed rack-mount-0.6.14
Successfully installed tzinfo-0.3.29
Successfully installed abstract-1.0.0
Successfully installed erubis-2.6.6
Successfully installed actionpack-3.0.9
Successfully installed arel-2.0.10
Successfully installed activerecord-3.0.9
Successfully installed activeresource-3.0.9
Successfully installed mime-types-1.16
Successfully installed polyglot-0.3.2
Successfully installed treetop-1.4.10
Successfully installed mail-2.2.19
Successfully installed actionmailer-3.0.9
Successfully installed thor-0.14.6
Successfully installed rdoc-3.9.2
Successfully installed railties-3.0.9
Successfully installed bundler-1.0.17
Successfully installed rails-3.0.9
24 gems installed

C:\>gem list

*** LOCAL GEMS ***

abstract (1.0.0)
actionmailer (3.0.9)
actionpack (3.0.9)
activemodel (3.0.9)
activerecord (3.0.9)
activerecord-jdbc-adapter (1.1.3)
activerecord-jdbcmysql-adapter (1.1.3)
activeresource (3.0.9)
activesupport (3.0.9)
arel (2.0.10)
builder (2.1.2)
bundler (1.0.17)
erubis (2.6.6)
i18n (0.5.0)
jdbc-mysql (5.1.13)
mail (2.2.19)
mime-types (1.16)
polyglot (0.3.2)
rack (1.2.3)
rack-mount (0.6.14)
rack-test (0.5.7)
rails (3.0.9)
railties (3.0.9)
rake (0.8.7)
rdoc (3.9.2)
sources (0.0.1)
thor (0.14.6)
treetop (1.4.10)
tzinfo (0.3.29)

C:\>gem which rails
C:/Application/ProgrammingLanguage/Ruby/JRuby/jruby-bin-1.6.3/lib/ruby/gems/1.8/gems/railties-3.0.9/lib/rails.rb

railsをインストールできたようだ。

jruby --1.9 -S とかやっても、1.9にはならないのだな。じぶん、なにかをかん違いしてたか。

rails.vim

vimで作業するつもりなので、rails.vimをいれておこう。ちょっとキーバインドをおぼえれば、ファイルを開くのがとってもかんたんになる。

rails.vim - Ruby on Rails: easy file navigation, enhanced syntax highlighting, and more : vim online

インストールは、vimのインストールディレクトリのruntime配下にコピペするだけ。

プロジェクトの作成と動作確認

参考

Getting Started with Rails — Ruby on Rails Guides
本家のチュートリアルRails 3対応。自分は、Railsの実務経験はないのだけど、Rails 2の本は3冊ぐらい読んでおり、最低限の知識はあったので、このチュートリアルでけっこうわかった。

http://blog.everyleaf.com/27538644
Windows + Ruby + Rails 3 + MySQLの環境をつくっている。

プロジェクトの作成

さっそく、サンプルアプリをつくってみる。Hello, Wolrd!という言葉が好きなので、helloworldプロジェクトを作成する。

C:\>rails new helloworld -d mysql
      create
      create  README
      create  Rakefile
      create  config.ru
      create  .gitignore
      create  Gemfile
      create  app
      create  app/controllers/application_controller.rb
      create  app/helpers/application_helper.rb
      create  app/mailers
      create  app/models
      create  app/views/layouts/application.html.erb
      create  config
      create  config/routes.rb
      create  config/application.rb
      create  config/environment.rb
      create  config/environments
      create  config/environments/development.rb
      create  config/environments/production.rb
      create  config/environments/test.rb
      create  config/initializers
      create  config/initializers/backtrace_silencers.rb
      create  config/initializers/inflections.rb
      create  config/initializers/mime_types.rb
      create  config/initializers/secret_token.rb
      create  config/initializers/session_store.rb
      create  config/locales
      create  config/locales/en.yml
      create  config/boot.rb
      create  config/database.yml
      create  db
      create  db/seeds.rb
      create  doc
      create  doc/README_FOR_APP
      create  lib
      create  lib/tasks
      create  lib/tasks/.gitkeep
      create  log
      create  log/server.log
      create  log/production.log
      create  log/development.log
      create  log/test.log
      create  public
      create  public/404.html
      create  public/422.html
      create  public/500.html
      create  public/favicon.ico
      create  public/index.html
      create  public/robots.txt
      create  public/images
      create  public/images/rails.png
      create  public/stylesheets
      create  public/stylesheets/.gitkeep
      create  public/javascripts
      create  public/javascripts/application.js
      create  public/javascripts/controls.js
      create  public/javascripts/dragdrop.js
      create  public/javascripts/effects.js
      create  public/javascripts/prototype.js
      create  public/javascripts/rails.js
      create  script
      create  script/rails
      create  test
      create  test/fixtures
      create  test/functional
      create  test/integration
      create  test/performance/browsing_test.rb
      create  test/test_helper.rb
      create  test/unit
      create  tmp
      create  tmp/sessions
      create  tmp/sockets
      create  tmp/cache
      create  tmp/pids
      create  vendor/plugins
      create  vendor/plugins/.gitkeep

これも

C:\>rails new helloworld -d mysql

ではなくて

C:\>jruby -S rails new helloworld -d mysql

としたほうがよかったのかな。まあいいや。

プロジェクトを作成したら、ためしに、railsでよくやる基本の動作確認。Webサーバ起動

C:\>cd helloworld
C:\helloworld>jruby --1.9 -S script\rails server
....
この辺の文字をはてなの日記にはりつけると日記が文字化けるのでやめておく。
....

おっと、起動失敗。日記が文字化けするからはりつけなかったけど、エラーメッセージを見る限り、mysql関連の設定が必要なようだ。必要なライブラリをgemでインストールして、さらにDBの接続設定も必要。

さてさてさて、どうすればよいのだろう。

JRubyなので、Javaの仕組みで、つまりJDBCでアクセスできるようになっていると前になにかの記事で読んだことがある。

ライブラリを求めて、activerecord-jdbcmysql-adapter | RubyGems.org | your community gem hostから、さらにhttp://jruby-extras.rubyforge.org/ActiveRecord-JDBC/へいくとサンプルが書いてある。

こいつも、gemでインストールだ。

C:\helloworld>jruby --1.9 -S gem install activerecord-jdbc-adapter
Fetching: activerecord-jdbc-adapter-1.1.3.gem (100%)
Successfully installed activerecord-jdbc-adapter-1.1.3
1 gem installed

C:\helloworld>jruby --1.9 -S gem install activerecord-jdbcmysql-adapter
Fetching: jdbc-mysql-5.1.13.gem (100%)
Fetching: activerecord-jdbcmysql-adapter-1.1.3.gem (100%)
Successfully installed jdbc-mysql-5.1.13
Successfully installed activerecord-jdbcmysql-adapter-1.1.3
2 gems installed

Railsではこいつをどうやって利用するのかかも検索して、それらしい説明をしてくれているページを探す。。。。



設定ファイルの編集
helloworld/Gemfile
依存ライブラリの設定

RubyというかRails 3というかGem Bundler – Manage your Ruby gemsの設定ファイルらしい。ここに依存ライブラリを書いておけばよいようだ。
RubyとRubyGemのしくみさえわすれていて、なんのことかピンとこなくて、どはまりした。それは、別の日記に書くとしよう。

MySQLに接続するためのライブラリを指定しておく。
Rubyでは、MySQLに接続するためのライブラリ自体が何種類かあるようだ。search | RubyGems.org | your community gem host うーん。。。。JavaJDBCのような統一されたインタフェースがないのだろうか。。。。自分のようなRubyの経験が浅いものにとっては、混乱のもとになってしまう。
ここでは、gemでインストールしたJDBCドライバをつかえるように指定する。

....
#gem 'mysql2', '~> 0.2.6'
gem 'activerecord-jdbc-adapter'
gem 'activerecord-jdbcmysql-adapter'
gem 'jdbc-mysql',:require=>false
....

上では、gemでインストールしてから、Gemfileを修正しているけれども、Rails 3には、bundle installという便利コマンドがあるらしい。Gemfileに書いてあるものをbundle installでインストールしてくれるらしい。

helloworld/config/database.yml
DB接続の設定

自分の環境に合わせて修正する。

....
test:
  adapter: jdbcmysql
  encoding: utf8
  reconnect: false
  database: helloworld_test
  pool: 5
  username: ユーザ
  password: パスワード
  host: localhost
....
C:\helloworld>jruby --1.9 -S script\rails server
=> Booting WEBrick
=> Rails 3.0.9 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-08-15 17:06:52] INFO  WEBrick 1.3.1
[2011-08-15 17:06:53] INFO  ruby 1.9.2 (2011-07-07) [java]
[2011-08-15 17:06:53] INFO  WEBrick::HTTPServer#start: pid=388 port=3000

rails serverだけだと、--1.9を指定しても、1.8.7で起動した。
script\rails serverとしたら、1.9.2で起動した。なぜ?

http://localhost:3000/
ブラウザでおなじみの画面が開けた。

さてさてさて、これで、開発できるのか?

scaffoldで自動生成

ひとまず、DBをつくっておこう。

C:\helloworld>rake db:create
(in C:/helloworld)
mysql> show databases;
+------------------------+
| Database               |
+------------------------+
| information_schema     |
| helloworld_development |
| mysql                  |
| performance_schema     |
| test                   |
+------------------------+
5 rows in set (0.06 sec)

config/database.ymlにあるデータベース名でつくってくれるらしい。

すくなくとも、rakeからはMySQLにつながったようだ。

rakeも、Railsとは、もともと別の、Rubyのライブラリで、Antみたいに作業を自動化するためのライブラリらしい。

http://rake.rubyforge.org/

Railsの、なんでもRubyでやっちゃう姿勢は、ある種の爽快感を感じないでもないけど、やっぱり勉強することが盛りだくさんになるなあ。

どうも、集中力が続かず、ふらふらとしてしまうな。DBに接続できたので、scaffoldで、MVC関連のソースコードとかテーブル定義とか生成してみる。

PersonモデルにPersonテーブルをつくってみる。

C:\helloworld>rails generate scaffold Person name:string age:integer
      invoke  active_record
      create    db/migrate/20110815090448_create_people.rb
      create    app/models/person.rb
      invoke    test_unit
      create      test/unit/person_test.rb
      create      test/fixtures/people.yml
       route  resources :people
      invoke  scaffold_controller
      create    app/controllers/people_controller.rb
      invoke    erb
      create      app/views/people
      create      app/views/people/index.html.erb
      create      app/views/people/edit.html.erb
      create      app/views/people/show.html.erb
      create      app/views/people/new.html.erb
      create      app/views/people/_form.html.erb
      invoke    test_unit
      create      test/functional/people_controller_test.rb
      invoke    helper
      create      app/helpers/people_helper.rb
      invoke      test_unit
      create        test/unit/helpers/people_helper_test.rb
      invoke  stylesheets
      create    public/stylesheets/scaffold.css

Personについて、app/models/person.rbや、MVCソースコードが一括で生成された。

Model
app/controllers/people_controller.rb
View
app/views/people/*.html.erb
Controller
app/controllers/people_controller.rb

テストコードやテストデータまで生成されてるし。

テーブル定義
db/migrate/20110815090448_create_people.rb

もある。

テーブル定義をDBに反映する。

C:\helloworld>rake db:migrate
(in C:/helloworld)
==  CreatePeople: migrating ===================================================
-- create_table(:people)
   -> 0.1550s
   -> 0 rows
==  CreatePeople: migrated (0.1550s) ==========================================

mysqlクライアントから確認。

mysql> use helloworld_development
Database changed
mysql> show tables;
+----------------------------------+
| Tables_in_helloworld_development |
+----------------------------------+
| people                           |
| schema_migrations                |
+----------------------------------+
2 rows in set (0.02 sec)

mysql> desc people;
+------------+--------------+------+-----+---------+----------------+
| Field      | Type         | Null | Key | Default | Extra          |
+------------+--------------+------+-----+---------+----------------+
| id         | int(11)      | NO   | PRI | NULL    | auto_increment |
| name       | varchar(255) | YES  |     | NULL    |                |
| age        | int(11)      | YES  |     | NULL    |                |
| created_at | datetime     | YES  |     | NULL    |                |
| updated_at | datetime     | YES  |     | NULL    |                |
+------------+--------------+------+-----+---------+----------------+
5 rows in set (0.03 sec)

ちゃんと、できているようだ。

動作確認

ふたたびWebサーバ起動

C:\helloworld>jruby --1.9 -S script\rails server
=> Booting WEBrick
=> Rails 3.0.9 application starting in development on http://0.0.0.0:3000
=> Call with -d to detach
=> Ctrl-C to shutdown server
[2011-08-15 18:14:12] INFO  WEBrick 1.3.1
[2011-08-15 18:14:12] INFO  ruby 1.9.2 (2011-07-07) [java]
[2011-08-15 18:14:12] INFO  WEBrick::HTTPServer#start: pid=3424 port=3000

ブラウザからhttp://localhost:3000/peopleを開く

開けた。

ブラウザからデータを登録してみると、登録もOK!

うまくうごいたようだ。

mysqlクライアントで中身も確認してみる。

mysql> set names sjis;
Query OK, 0 rows affected (0.00 sec)

mysql> select * from people;
+----+------------+------+---------------------+---------------------+
| id | name       | age  | created_at          | updated_at          |
+----+------------+------+---------------------+---------------------+
|  1 | こんにちは          |   10 | 2011-08-15 09:22:49 | 2011-08-15 09:23:30 |
|  2 | 世界          |   20 | 2011-08-15 09:23:13 | 2011-08-15 09:23:13 |
+----+------------+------+---------------------+---------------------+
2 rows in set (0.05 sec)

できてるてきてる。

これで、最低限の開発環境はできた。
開発環境というより勉強環境か。

つぎは、実際の運用環境をおさえたいな