コマンド一発で mrbgems 込みの mruby を作る
mruby の開発を楽にしようと mrb *1 というツールを作っています。
今回の 0.0.5 では、設定に合わせて mrbgems 込みの mruby を、コマンド一発でビルドできるようになりました。
以下のような YAML 形式で mruby のリポジトリの場所や一緒にビルドする mrbgems や toochain を設定し、mrb build <YAML ファイル名>
とコマンドを実行します。
これだけの手順で mruby が出来上がります。設定ファイルの基本的なパラメーター名や階層は build_config.rb
が元になっていますので、build_config.rb を使ったことがあるのなら比較的楽に作成できると思います。
mruby: github: 'mruby/mruby' build: host: toolchain: gcc gembox: default gem: - github: 'iij/mruby-io' - github: 'iij/mruby-dir'
以下、コマンドの実行結果です。
$ mrb build my-mruby.yaml Cloning into 'mruby'... remote: Counting objects: 32345, done. remote: Compressing objects: 100% (109/109), done. remote: Total 32345 (delta 56), reused 0 (delta 0), pack-reused 32234 Receiving objects: 100% (32345/32345), 9.56 MiB | 1.94 MiB/s, done. Resolving deltas: 100% (19729/19729), done. Checking connectivity... done. Buildding ... Creating build_config.rb ar: creating archive /Users/foo/tmp/mruby/build/host/lib/libmruby_core.a ar: creating archive /Users/foo/tmp/mruby/build/host/lib/libmruby.a
あらかじめ決まった mruby を作成したい時やちょっとだけビルドの手間を省きたい時などに使えるかな、と思います。
次は、rbenv
のように作成した mruby の切り替えができたらなと思っています。
あと設定ファイルのドキュメントも・・・。
*1:インストールは gem install mrb
mruby の拡張モジュールを作る際の準備を楽にするツールを作った
きっかけ
mruby の mrbgems を作りたいと思ったら、mruby のソースコードを取得して、mrbgems の example ををコピーして、モジュール名をリネームして、build_config.rb を編集して、ビルドしなければならないと思います。
一つ一つは容易な作業でも最初にこれらを用意しないといけないのは面倒なので、これらの作業をコマンドでできるようにしてみました。それくらいなら Rake でできるとは思ったのですが、今後拡張していくなら、コマンドラインツールを作った方がいいかなと思い、作りました。
mrbgems のテンプレートを作るなら、既に 人間とウェブの未来 - mrubyの拡張モジュールであるmrbgemのテンプレートを自動で生成するmrbgem作った があるのですが、そのためには mruby を取得して、ビルドして、・・・。
やはり gem install
一発で用意できるのはすごく楽かなと。mruby のビルドには ruby が必要になるので、gem であれば導入が楽になるはず。
インストール
以下のコマンドでインストールできます。
$ gem install mrb
mruby を取得する
最新の mruby をカレントディレクトリに保存する。
$ mrb get
build_config.rb を生成する
カレントディレクトリに build_config.rb を作成する。
$ mrb config
mrbgems のひな形を生成する
foobar のモジュールのひな形を生成する。
mruby/examples/mrbgems/c_extension_example at master · mruby/mruby を参考にしています。
$ mrb gem foobar
今後
まだ最小構成程度の build_config.rb や mrbgems のひな形しか生成できていませんが、build_config.rb に任意の設定を差し込んだし、人間とウェブの未来 - mrubyの拡張モジュールであるmrbgemのテンプレートを自動で生成するmrbgem作った のような高機能のひな形が生成できたらいいなと思います。
あとは、複数の mrbgems を開発していると mruby が増えていくので、それらを管理できたらなと思います。 rbenv みたいな感じで。
mruby-odbc を作った
mruby でそれなりにデータベースにアクセスできるようにしたいなーと思って、作った。
ODBC API っぽさを残しつつ、基本的なインタフェースでデータベースとやり取りができるようにしています。今の所、インタフェースは最低限実装しています。この後は、prepared statement など実装していく予定です。
env = ODBC::Env.new env.set_attr ODBC::Env::ODBC_VERSION, ODBC::Env::VERSION_3 conn = ODBC::Conn.new env conn.connect 'DSN=myodbc' stmt = ODBC::Stmt.new conn stmt.execute 'DROP TABLE IF EXISTS foo' stmt.execute <<END_OF_SQL CREATE TABLE foo ( id int, name text ) END_OF_SQL stmt = ODBC::Stmt.new conn stmt.execute "insert into foo values(1, 'aaa')" stmt.execute "insert into foo values(2, 'bbb')" stmt.execute "insert into foo values(3, 'ccc')" stmt.execute "insert into foo values(4, 'ddd')" stmt.execute "insert into foo values(5, 'eee')" rs = stmt.execute 'SELECT * FROM foo' rs.each do |row| d = [] rs.num_result_cols.times do |i| d << row[i + 1] end puts d.join(',') end conn.close env.close
これで、ODBC API を持つデータベースに mruby でアクセスすることができるようになります。
例えば、SQLite3, MySQL, PostgreSQL などにアクセスできます。
あと、SQL Server にもアクセスできるぽいです。
TOTP(Time-based One-time Password) のサンプルコードを mruby で実装してみた
TOTP(Time-based One-time Password) のサンプルコードが RFC 6238 - TOTP: Time-Based One-Time Password Algorithm にあるのだが、それを mruby で実装してみた。
必要な mrbgems は二つ。iij/mruby-digest
と iij/mruby-pack
。
もう少し実装して、二段階認証に対応しているアプリと連携できるところまでやってみるようかな。
ngx_mruby で Basic 認証を実装する
ngx_mruby で Basic 認証を実装したみた。
使い方は、ユーザー情報はファイルに (user.list) に保存しておいて、そのファイルのパスと realm 、mruby スクリプトを nginx.conf に設定する。
こういう小さな ngx_mruby の機能を組み合わせて構築したい場合、一つの機能を component 化した方がいいんだろうなとは思う。component 化したものが ngx_mruby_mrblib なのかな。これと同じようにというか、既存の mruby と同じく mrblib にしてしまえば良さそう。
設定やスクリプト、nginx のビルドスクリプトは以下のあります。 ユーザー情報は暗号化したり、パスワードをハッシュしているわけではないです (手抜き)
mgem で build_config.rb の生成をスクリプト化する
bovi/mgem というツールがあり、mruby をビルドするための build_config.rb を生成してくれます。これを使って、build_config.rb を生成してみます。
最初に標準以外で追加したいライブラリをセットし、mgem config
を実行して、必要なライブラリを選択するようになっています。スクリプトだと分かりづらいですが、 y
が連続しているが標準ライブラリを選択しているところになります。
使ってみた感想は、
mgem add
で追加したライブラリは設定に反映されたままなので、別の build_config.rb を生成しようとしたい時は不要なライブラリを一つずつをmgem rm
を実行して削除しないといけない。 面倒なら、~/.mgem/GEMS_ACTIVE.lst
を空にしてしまえばいい。- リストにないライブラリは
~/.mgem/mgem-list/
以下に gem ファイルを追加しておく必要がある。 mgem config
に渡しているパラメーターが y .... となっていて分かりづらくていまいち。