Ruby
Rails

Windows環境でのRubyの環境構築は時間コストがかかりすぎる

始めに

Windows環境でRubyで
・DBにアクセスする
・Webアプリケーションを作る
といったまともにアプリケーションを作れる環境を構築するには、JavaやC#(※1)に比べて時間がかかりすぎるというお話。

※1いや、C#やJavaはともかく、F#やGroovyといったマイナーな言語よりも面倒くさいです

開発環境

  • windows10
  • ruby2.4.0
  • jdk1.8
  • ecliplse Neon Release (4.6.0)
  • oracle12c

Ruby on Railsがどうやってもインストールできない

Ruby on RailsあたりでWebApiモジュールを作ろうと思いRailsを導入しようとしたが・・・

C:\DevKit>gem install rails
Building native extensions.  This could take a while...
ERROR:  Error installing rails:
        ERROR: Failed to build gem native extension.

    current directory: C:/Ruby24/lib/ruby/gems/2.4.0/gems/nio4r-2.1.0/ext/nio4r
C:/Ruby24/bin/ruby.exe -r ./siteconf20170720-6112-ak25be.rb extconf.rb
checking for unistd.h... *** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers.  Check the mkmf.log file for more details.  You may
need configuration options.

がどうしても解消できない。
Ecliplseを使ってWebモジュールがサクッと動かせる開発に慣れてしまうと、こういう環境周りでうまくいかないことに相当なフラストレーションを感じてしまう。
Webで調べてもたいていはUnix系のOSかMacOsの記事ばかりで、
Windows系のサイトの情報は極論すれば
gem install railsすれば簡単に出来る
というものばかりで役に立ちませんでした。
そういうのもフラストレーションがたまる一因だ
というか、今のご時世、環境構築するためにCモジュールをWindows上でコンパイルさせるフレームワークってどうよと思うのだが。

Oracleへのアクセス

ruby-oci8-2.2.4-x64-mingw32.gemをインストールし、oracleに接続するプログラムを書いてみた

Oracle.rb
require 'oci8'
sid = "//localhost:1521/triple_pb.co.jp"

sql = 'select table_name from user_tables'

oracle = OCI8.new("triple","triple",sid);

oracle.exec(sql) do |row|
    puts row.join(',')
end

で結果は

C:/Ruby24/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require': OCI.DLL: 193(%1 �͗L���� Win32 �A�v���P�[�V�����ł͂���܂���B  ) (LoadError)
    from C:/Ruby24/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:55:in `require'
    from C:/Ruby24/lib/ruby/gems/2.4.0/gems/ruby-oci8-2.2.4.1-x86-mingw32/lib/oci8.rb:107:in `<top (required)>'
    from C:/Ruby24/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:133:in `require'
    from C:/Ruby24/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:133:in `rescue in require'
    from C:/Ruby24/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:40:in `require'
    from C:/Users/takayoshi/workspace/MyRuby/OracleTest.rb:1:in `<main>'

OCI.DLLが読み込めないらしきエラーが発生している。
JDBCのthinでDBに接続するのが当たり前だった私からすると、clientの設定に依存する形でしかDBアクセスにできないとなると、率直に言って不便すぎる
ちなみに、JRubyでthinで接続してDBアクセスするプログラムを書いてみた

OracleTest.rb
require 'java'

java_import 'oracle.jdbc.OracleDriver'
java_import 'java.sql.DriverManager'

sid = "jdbc:oracle:thin:@//localhost:1521/triple_pb.co.jp"   

oradriver = OracleDriver.new
DriverManager.registerDriver oradriver
conn = DriverManager.get_connection(sid,'triple', 'triple')
sql = 'select table_name from user_tables'
conn.auto_commit = false
stmt = conn.prepare_statement(sql);
rowset = stmt.executeQuery()

while (rowset.next()) do
  puts rowset.getString(1)
end

こっちは
WORD_DICTIONAY
WEBPAGE_WORD
EMP
PARKINGATTIME

出力されと正常にDBにアクセスできる
ただ、上記のプログラミングだとPreparedSteatmentやResultSetを生で使わないといけないJavaライクな書き方になってしまうので、Rubyを使う意味がまったくなくなってしまう。
これだったら、Groovyでプログラムを書くほうがまだましだ

おわりに

Web上だと
「Rubyを使って簡単にWebアプリ開発」
というページがあふれているが、個人的には
「どこが簡単?環境構築が面倒くさすぎる」
というのが正直なところ
JavaのEclipse、C#のVisualStudio並の統合開発環境がないと
「簡単に開発できる」
なんて言ってはいけないと思う