Ruby Advent Calendar 2013 17日目です。昨日はRuby - socketライブラリを使ってwebサーバーを作ってみる - Qiita [キータ]でした。おおうっ! blocking I/Oだ。
もうすぐRuby 2.1も有るな。
最近node.jsばかり触ってゐるので、node.jsの核心であるlibuv https://github.com/joyent/libuv をmrubyから使ってみる。RubyにはEventMachineが有るが、node.jsはreactor patternと云ふよりlibuvなので、此っちをやってみる。reactor patternならRx (Reactive eXtentions) 系も有るしな……。
mruby Advent Calendar 2013も有るが、Rubyの話しと云ふ事で許して欲しい。
準備
Windowsで面倒なので、cmdから以下のcommandでDebianに入る。
Vagrantには"debian-wheezy"と云ふ名のboxが既に追加されてゐるものとする (vagrant box add debian-wheezy URL_OR_PATH
)。実際は少しVagrantfileを編集した。
mkdir mruby cd mruby vagrant init debian-wheezy vagrant up vagrant ssh
次にDebianに必要なsoftwareを入れる。
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install git build-essential bison
sudo gem update
sudo gem i rake
Puppetが入ってゐるのでRubyは入ってゐ。2.0を入れたければ此う。
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv vi .profile exec $SHELL -l git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build sudo apt-get libssl-dev sudo rbenv install 2.0.0-p353 rbenv shell 2.0.0-p353 gem update
libuvを入れる。
cd /vagrant git clone https://github.com/joyent/libuv cd libuv mkdir -p build git clone https://git.chromium.org/external/gyp.git build/gyp ./gyp_uv.py -f make make -C out sudo cp incdule/*.h /usr/include sudo cp out/Debug/libuv.a /usr/lib
mrubyをbuildする。
cd /vagrant gem i mgem mgem update mgem add mruby-uv git clone https://github.com/mruby/mruby.git cd mruby mruby config mruby config default > build_config.rb rake
>rakeがうまくいかない!<
mrubyのversionを変えたりlibuvのversionを変えたりしたが、うまくいかない。私が間違ってゐるのか、bugなのか、判明できない……。
最新のmruby → mrbcはcompileできるがmrubyとmirbをconpileできない。
versionを戻したmruby → mrubyはOK。mruby-uvがcompileできない。
因みにmrubyを諦めてRubyのlibuv gemでも、うまく行かなかった。libuv.soをcompileできなかったり、できるversionに戻すとlibuv gemが落ちる。
ふぎぎ。
追記 20131218
mruby-uvがlibuvの最新版に追隨してゐなかったやうだ。GCCに於けるbuild pathを知らずに時間を浪費してゐたから、sourceまで目が回らなかった。
cf. mrubyをHerokuで動かす - Qiita [キータ] http://qiita.com/take_cheeze/items/a2deaca5c150e1a489a7
できた曉には、fs moduleを試してnode.jsとの比較をする予定だった。此れならVert.x http://vertx.io でもやっとくんだった。
Vert.xの準備
>やる!<
vagrant destroy vagrant up
してVMを作り直す。必要なsoftwareを入れる。
sudo apt-get update sudo apt-get upgrade sudo apt-get install openjdk-7-jre
vert.x-2.0.2-final.tar.gzを落として解凍する。build済みのVert.xが入ってゐる。
PATHを通す。
vertx version
# -> 2.0.2-final (built 2013-10-08 10:55:59)
動く。
require 'vertx' Vertx::HttpServer.new.request_handler do |req| file = req.uri == '/' ? 'index.html' : req.uri.sub(/^\//, '') # req.response.send_file "webroot/#{file}" req.response.end "webroot/#{file}" end.listen 8080
とやって、
vertx run app.rb &
とやると、JRuby用のmoduleが自動でdownloadされて、動く。
すごい(かなり。
JavaScript版は、何もdownloadを開始せずに動いた。Rhinoか。
var vertx = require('vertx'); vertx.createHttpServer().requestHandler(function (req) { req.response.end('Hello World!'); }).listen(8080, 'localhost');
同じことをnode.jsでやれば、
var http = require('http'); http.createServer(function (req, res) { res.writeHead(200, {'Content-Type': 'text/plain'}); res.end('Hello World!'); }).listen(8080, 'localhost');
此の程度では変わらないな。
Vert.xは、各言語用に専用のbindingが作られてゐる。Ruby用のdocumentは以下。
cf. Vert.x http://vertx.io/core_manual_ruby.html
ほんとうに試しただけだった。
19日目は @yancya さんです。