RubyのスクリプトからICMPプロトコルを使用したPingを発行しようと
require 'net/ping' include Net Ping::ICMP.new("hoge.co.jp").ping?
といったコードを書いて、実行するとRubyのプロセス自体が落ちた…。
使ってるRubyのバージョンはmswin32版の1.8.7-p72。
原因はRubyのバグで、レポートも出され、Fixしてる。
Bug #714: Socket bug in Ruby-mswin32 - Ruby 1.8 - Ruby Issue Tracking System
が、mswin32版でこの修正が含まれているのは1.9かららしく、1.8.6、1.8.7には含まれていない…。パッチレベル上げれば良いのかと思い、p160を適用したけどダメ。さらにp160だと何故かRailsが凄く遅くなる…。ハーン何で?
しょうがないので↑のチケットに記載されてたパッチを自分であてることに。
からまず、1.8.7-p72のRubyのソースをGet。
展開したフォルダ内にあるwin32\win32.cの2645行目付近の
... out = WSASocket(af, type, protocol, &(proto_buffers[i]), 0, 0); break; } ...
のコードを
... out = WSASocket(af, type, protocol, &(proto_buffers[i]), 0, 0); break; } if(out==INVALID_SOCKET) out = WSASocket(af, type, protocol, NULL, 0, 0); ...
といった風に2行追加する。修正自体はこれだけ。後は、mswin32版のビルド。
まず、必要となるVisual C++ 2008 Express Editionを↓からGet。
Microsoft Visual Studio Express
インストールし、Visual Studio 2008 コマンドプロンプトを利用して、
↑のVC++の記事を参考にビルド。意外とあっさり終わる。
早速、必要なgemを入れようとするとzlib.dllがロードできなくてエラーが発生する。
指定されたプロシージャが見つかりません。 - Init_zlib
そう、rubygemsの実行に必要なzlibをRubyから利用できるように拡張ライブラリをビルドする必要があると。
↑のBlogを参考にさせてもらって何とか、rubygemsも動作するようになった。
ホット一安心してRailsを動作させようとすると
`gem_original_require': no such file to load -- iconv (LoadError)
はい。続いてはiconv。iconvはバイナリを
http://www.meadowy.org/meadow/dists/snapshot/old/iconv-1.8.win32.zip
から入手。rubyのソースディレクトリのext\iconvに移動し、
ruby extconf.rb --with-iconv-dir="入手したiconv-1.8.win32.zipを展開したフォルダ" nmake nmake install
お次は、openssl。opensslの場合、nmakeするとコンパイルエラーが多発する。そのため、
Ruby-1.8.7_p160 openssl編 その4 - Kazzzの日記
↑を参考に、ruby extconf.rb時に生成されたextconf.hに
#define WIN32_LEAN_AND_MEAN
を追記し、nmakeすることで解消する。
今更ながら、All in oneで提供されてる有難さを実感する。
これでOKかと思い、Railsを起動すると
.../mysql-2.7.3-x86-mswin32/ext/mysql.so: [BUG] Segmentation fault
今度はMySQLのgemですか。てかSegmentation faultじゃ原因が分からん…。
道のりは遠い…。