2013/01/29


mrubyプチハッカソンに参加してきました

例えば、mattn_jpさんがmruby-uvを作っていらっしゃいます。私がその上にTCPServerClassを構築したい、と思ったときには、現状RubyのコードとしてUV::TCP.newするしか無いように感じますが、これをCから呼び出して、mrubyのTCPServerClassとしてexportしたいな、と。

http://onmessage.ws/wordpress/?p=745
例えば mruby-curl は別の mrbgems である mruby-http の HTTP::Response を返しているが特別 require している訳ではない。mrb_class_get でルートネームスペースのモジュールもしくはクラスが取れるので、さらにそこから mrb_const_get で under なクラスが取れる。 struct RClass* _class_http = mrb_class_get(mrb, "HTTP");
struct RClass* _class_http_parser = mrb_class_ptr(mrb_const_get(mrb, mrb_obj_value(_class_http), mrb_intern(mrb, "Parser")));
これはあくまで mruby が「HTTP::Parser」をどの様に解析しているのかを僕がコードを読んで同じ事をやっているだけなので、正しい(薦められるべき)使い方かどうかは分からない。
これを使って struct RClass* _class_my_parser = mrb_define_class_under(mrb, _class_http, "MyParser", _class_http_parser);
この様にクラス定義すれば HTTP::Parser を継承した HTTP::MyParser を宣言できます。
もちろん、mrbgems として同梱されていない場合は実行時エラーになります。
Posted at by



2013/01/20


以前、mruby-sqlite3 は作ったのでぜひ MySQL もやりたいなーと思いながら手を付けてなかったけどようやく重い腰をあげて書いた。
mattn/mruby-mysql - GitHub
https://github.com/mattn/mruby-mysql
動作は SQLite3 のと同じにしてあるつもりです。
MySQL の拡張は何度か書いた事あったけど、レコードを弄る様な物は随分昔に触ったきりで思い出せないし、API がいろいろ新しくなっててハマった。
最初、MYSQL_ROW を使って全部文字列でやれば良くね?と思ってたけど、結局ちゃんと MYSQL_BIND 使って書いた。

これで残すは PostgreSQL だけですが、実は PostgreSQL 使った拡張は今まで書いた事が無い。
誰か作って下さい。
こういうコードが動きます。
#!mruby

db = MySQL::Database.new('localhost''root''''foo')
begin
  db.execute_batch 'drop table foo'
  db.execute_batch 'drop table bar'
rescue RuntimeError
ensure
  db.execute_batch 'create table foo(id int primary key, text text, f float)'
  db.execute_batch 'create table bar(id int primary key, text text, f float)'
end

db.execute_batch('delete from foo')
db.execute_batch('insert into foo(id, text) values(?, ?)'1'foo')
db.execute_batch('insert into foo(id, text) values(?, ?)'2'bar')
db.transaction
db.execute_batch('insert into foo(text) values(?)''baz')
db.rollback
db.transaction
db.execute_batch('insert into foo(text) values(?)''bazoooo!')
db.commit

db.transaction
(1..100).each_with_index {|x,i|
  db.execute_batch('insert into bar(id, text) values(?,?)', i, x)
}
db.commit

db.execute('select * from bar'do |rowfields|
  puts row
end

#puts db.execute('select id from foo where text = ?', 'foo').next

db.execute_batch('delete from bar')
db.execute_batch('insert into bar(id, text, f) values(1,\'bababa\', NULL)')
db.execute_batch('insert into bar(id, text, f) values(2,\'bababa\', 3.14)')
db.execute('select * from bar'do |rowfields|
  puts row
end
row = db.execute('select * from bar')
puts row.fields
while cols = row.next
  puts cols
end
row.close

db.close
Posted at by




あけましておめでとうございます。本年も宜しくお願い致します。
今年も、皆さんの役にたたないプロジェクトの量産を目指し、一層の努力をして参る所存でございます。

さて、正月あいだ masui さんが mruby のビルドシステムを cruby で書き換えてて、僕も親父のマシンに mingw32 やら msysgit やらを入れて深夜に試してたんですが、昨日今日でだいたい動くようになった感じです。mrbgem.rake には殆ど何も書かなくても良くなりました。
mrbgem.rake には作者とライセンスを明記する部分があったので、これを期に僕の作った mrbgem のライセンスを統一して MIT にしました。
今後これらが業務で使われる方がいらっしゃったとしても心配無用。

masui さんの pull-req には git 管理されたフォルダも自動でビルド対象にする機能が含まれていたんだけど、それに合わせたか bovi さんが mruby 向けの gem コマンド mgem を書いてくれてた。
bovi/mgem - GitHub

A program to manage GEMs in mruby

https://github.com/bovi/mgem
このコマンドを gem install mgem gem コマンドからインストールすると
bovi/mgem-list - GitHub

A list of all GEMs for mruby to be managed by mgem

https://github.com/bovi/mgem-list
mgem-list というプロジェクトで管理されている gem ファイルを元に所定の位置に git clone してくれます。
mgem (Version 0.0.2) is a library manager for mruby

Usage:
  mgem size              How many GEMs are available?
  mgem list [active]     List GEMs
  mgem info *pattern*    Show detail information about a GEM
  mgem add *name*        Activate a GEM
  mgem rm *name*         De-Activate a GEM
  mgem search *pattern*  Search for GEMs
  mgem config            Generate a mruby build config including all active GEMs
  mgem update            Update the list of GEMs

Website:
  https://github.com/bovi/mgem
なかなな便利になったのではないでしょうか。最新版の mruby では build_config.rb に使う gem を明記する必要がありますが、それ用のコマンド(config)も用意されています。
今のところ、この github プロジェクトが rubygems.org の様な中央リポジトリになっているので、自分の作った gem を登録するには bovi さんに pull-request を送ると良いです。

ちなみに現状の mgem-list の中身は、とても mattn 無双でした。
mattn無双



詳しい内容は bovi さんのページで...
The mgem GEM - mruby.sh

How does it work To maintain a list of GEMs I created a repository called mgem-list . This repositor...

http://mruby.sh/201301040627.html
Posted at by