#始めに
Windows環境でruby環境を構築する方法を書いています
自分的にベストプラクティスな方法なので異論はたくさんあると思います
#序章
Web上にはrubyの環境構築に関する記事がたくさんあるがどれも
- Mac or LinuxといったUnixOS系向け
- Windows向けは情報が古い、もしくは簡単にできるといるが、その通りにやっても全然うまくいかない
- DBはmysqlかsqliteがほとんど、開発現場でよく使われているOracleに関する記事はほとんどない
で、Windowsで開発する人にとってrubyは
「DBに接続するアプリケーションを作ったり、webアプリを作る環境をつくる」
ことが相当ハードルが高かったりする
(少なくとも、自分はそうだった)
なので、これからWindowsでRubyをやろう、という人向けにできるだけ労力が少なく済む環境構築手順を書いてみようと思う
#JRubyを使う
rubyのインタープリターは色々あるが、私はJRubyを使うことをお勧めする
Web上の記事に頻出する「MRI (Matz' Ruby Implementation) 」を使うと、gemからモジュールを取得するときのCモジュールのコンパイルでひどい目に会う。
(なぜか、この話はWeb上であんまり言及されていません。rubyを使う人はみんなCモジュールを自前でコンパイルできる人たちなのか?)
その点、JRubyはJVM上で動作するので、公式のインタプリたより導入のストレスは感じない
JRubyの欠点はモジュール実行の立ち上がりが遅いことだが、とりあえずrubyに触ってみようと人にとっては大して気にならない欠点だろう
##JRubyの導入手順
###JDKを導入する
まぁ、これはWeb上に腐るほど紹介記事が出ているのでここで書くことは何もない
適当なJDK1.8系をダウンロードしてJDKをイントールすればよい
###JRubyを導入する
JRubyの公式サイトから適当なVersionをダウンロードしてインストールするだけ
###NetBeansを導入する
Javaな人はEclipseでできるのではという人もいるかもしれないが、個人的にお勧めしない
NetBeansを使えばRailsのインストールが世の中にあふれているやり方よりはるかに簡単にできるし、エディタとしても使いやすい
NetBeans 8.0.1にRuby on Railsプラグインをインストールする手順にRailsの導入まで記載してあるので、それに従って作業をすればよい
###JDBCドライバの導入
JRubyのイントール配下/libにOracleのJDBCを配置しておく
OracleのJDBCについはWebを検索すればたくさん出てくると思うので、それを参考にしてダウンロードしておく
##Oracleとの接続について
世間一般ではOCIとかAcitivReroderを使うのが主流なようだが、私はそのいずれも試してみてうまくいかなかった
OCIは前の記事の通りでDLLの読み込みがうまくいかず、AcitivReroderはRailsのバージョンとjdbc‐adapterのバージョンがあっていないようでうまく動かない、下のようなエラーをはいて
Gem::LoadError: Specified 'jdbc' for database adapter, but the gem is not loaded. Add `gem 'activerecord-jdbc-adapter'` to your Gemfile (and ensure its version is at the minimum required by ActiveRecord).
まぁ、そもそもAcitivReroderは規約ベースな設計なのでSQLをバリバリ書いて発行したい私にとっては、扱いにくいというのもあるが
###Sequelを導入する
Web上でRubyのDB接続について色々調べていると、Sequelが自分にとってピッタリなものに見えた
Sequel について (その1)を参考に自前の開発環境に入れてみたが、これが、oracleのthin接続もサポートしており、なかなか使い勝手が良かった
ために疎通用のプログラムを書いてみた
require "sequel"
DB = Sequel.connect('jdbc:oracle:thin:triple/triple@//localhost:1521/triple_pb.co.jp')
##テーブル情報を表示する
DB.fetch("select table_name from user_tables ")
.all do
|x|puts x
end
##特定のテーブルのカラム情報を情報を表示する
DB.fetch("select table_name,COLUMN_NAME from user_tab_columns ")
.where(:table_name =>["WEBPAGE_WORD","WORD_DICTIONAY"])
.order(:col1=>"table_name")
.all do
|x|puts x
end
で、実行すると
{:table_name=>"WORD_DICTIONAY"}
{:table_name=>"WEBPAGE_WORD"}
{:table_name=>"EMP"}
{:table_name=>"PARKINGATTIME"}
{:table_name=>"EMP", :column_name=>"EMP_ID"}
{:table_name=>"EMP", :column_name=>"EMP_NAME"}
{:table_name=>"PARKINGATTIME", :column_name=>"PARKING_AREA_ID"}
{:table_name=>"PARKINGATTIME", :column_name=>"RENBAN"}
-以下略
と正しく出力結果が表示される。
めでたし、めでたし