c4se記:さっちゃんですよ☆

.。oO(さっちゃんですよヾ(〃l _ l)ノ゙☆)

.。oO(此のblogは、主に音樂考察Programming に分類されますよ。ヾ(〃l _ l)ノ゙♬♪♡)

音樂は SoundCloud に公開中です。

考察は現在は主に Scrapbox で公表中です。

Programming は GitHub で開發中です。

mruby で libuv を試せなかったから Vert.x with JRuby をやる

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日目は @ さんです。