2012/04/26

Recent entries from same category

  1. Ruby の Array#<< は Array#push よりも速いか
  2. Ruby の a = a + 1 はなぜ undefined method '+' for nil:NilClass なのか
  3. Re: Ruby 製バッチ処理を省メモリ化した
  4. Crystal と CRuby でHTTPサーバのベンチマーク
  5. pure mruby な JSON パーサ書いた。

ここ数日、mrubyの拡張を書いてた訳ですが。
mattn/mruby-uv - GitHub

interface to libuv for mruby(experimental)

https://github.com/mattn/mruby-uv
mattn/mruby-http - GitHub

interface to http for mruby(experimental)

https://github.com/mattn/mruby-http
これを使って #include <mruby/proc.h>
#include <mruby/data.h>
#include <compile.h>
#include <mrb_uv.h>
#include <mrb_http.h>

#define _(...) #__VA_ARGS__ "\n"

int
main()
{
  int n;
  mrb_state* mrb;
  struct mrb_parser_state* st;
  char* code =
 _(
)_( require 'UV'
)_( require 'HTTP'
)_(
)_( s = UV::TCP.new()
)_( s.bind(UV::ip4_addr('127.0.0.1', 8888))
)_( cl = []
)_( s.listen(5) {|x|
)_(   return if x != 0
)_(   c = s.accept()
)_(   cl << c
)_(   c.read_start {|b|
)_(     r = HTTP::parse_http_request(b)
)_(     c.write("HTTP/1.1 200 OK\r\nHost: example.com\r\n\r\nhello #{r['PATH_INFO']}") {|x|
)_(       c.close()
)_(     }
)_(   }
)_( }
)_( UV::run()
);

  mrb = mrb_open();
  mrb_uv_init(mrb);
  mrb_http_init(mrb);
  st = mrb_parse_string(mrb, code);
  n = mrb_generate_code(mrb, st->tree);
  mrb_pool_close(st->pool);
  mrb_run(mrb, mrb_proc_new(mrb, mrb->irep[n]), mrb_nil_value());
  return 0;
}
こんなのが動く様になりました。これでデバイス上で、しかもrubyによるWebサーバが動く日も遠くなくなりました。便器にJSONRPCを送ってウォシュレットが動く!なんて事も夢では無くなって来ましたね!

mruby はじまったな!
Posted at by | Edit