コマンド一発で 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 でそれなりにデータベースにアクセスできるようにしたいなーと思って、作った。

qtkmz/mruby-odbc

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 にもアクセスできるぽいです。

Linux の Microsoft ODBC Driver 11 for SQL Server へようこそ.aspx)

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-digestiij/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 が連続しているが標準ライブラリを選択しているところになります。

使ってみた感想は、

  1. mgem add で追加したライブラリは設定に反映されたままなので、別の build_config.rb を生成しようとしたい時は不要なライブラリを一つずつを mgem rm を実行して削除しないといけない。 面倒なら、~/.mgem/GEMS_ACTIVE.lst を空にしてしまえばいい。
  2. リストにないライブラリは ~/.mgem/mgem-list/ 以下に gem ファイルを追加しておく必要がある。
  3. mgem config に渡しているパラメーターが y .... となっていて分かりづらくていまいち。