けいぞうのメモ帳

言語設計のお勉強

libvmod_mrubyなるものを作り始めた

概略

 HTTPアクセラレータVarnish Cacheの設定言語VCL。そのVCLにmrubyのコードを呼び出せるようにした。
 今後はRubyVCLの設定をスクリプティングできるようにして、C言語ライクなVCLより柔軟性が高いであろうRubyDSLで設定をいじれるようにしたい。ので、作り始めた。

詳細

requrement

Varnish Cache 4.0.0 or later(開発ではHEADを使っている)
root権限

git clone http://github.com/KeizoBookman/libvmod_mruby.git
cd libvmod_mruby/src
git clone http://github.com/mruby/mruby.git
cd mruby
make
cd ../..
./autogen.sh
./configure
make
make install

そしてdefault.vclなどのVarnishの設定ファイルに以下のように記述します。(Archでは/etc/varnish/default.vcl)

import mruby;

sub vcl_deliver {
 
    set resp.http.mruby = mruby.exec(" 'hello world' ");
}

と設定してVarnish Cacheを起動させ、VarnishCacheの立っているポートにアクセスすると
ヘッダにmrubyと言う名前のものが追加されておりhello worldという値が入っているはずです。
今できるのはこれだけであとはintegerかvoidのRubyスクリプトVCLから呼び出せます。

今後

 今のところ出来ることはほとんどないけど、RubyからVCLを呼び出せるようにするところまではちゃんと実装するつもりです。
masterは一応make出来る状況を維持しておくけれどもちゃんと動く保証はありません。github.com

余談

 ネタ自体は一年位前に人にもらって何度か作ろうとしてたけどやっと実装を始められたのでちょっとワクワクしている。

とあるvim宣教師の手記

vim advent calendar

Vim Advent Calendar 2013 : ATNDの131日目です。
昨日はsupermomonga さんのジャズだって聴ける。そう、Vimならね。 - かなりすごいブログでした。
jazzradio.vimよいですね。
vimテクニックバイブルに対して戦いていた友達に教えて、味のある顔をしてもらおうと思います。

前振り

 諸事情でOS = windows くらいの情報リテラシーの人たちにvim を教える
機会に巡り合いました。「よーし、お兄さん張り切っちゃうぞー!」と
頑張っていたのですが、そこはそこ。
 ちゃんと偉い人に「自重するべし」とくぎを刺され、
vimtutor ja をやってもらったところでお開きとすることに相成りました。
しかし、ゴーストがスライドを書けと囁いたので
vim ネタスライドを書いて自分の熱意をお焚きあげしようと思います。

ちなみにVACをやっているコミュニティvim-jpですが、
活動の一つに
vimrc読書会が毎週土曜日23時から行われております。
またvim plugin 読書会その前の21時からたまに開催されているそうです。
つぎは今週でvital.vimをやるとか。
自分は半年くらいROM専やってますが面白いです。だめじゃん
というわけで以下リンクよりネタスライドをどうぞ
reveal.jsを使ったmdで書きました。

http://keizobookman.github.io/vimLoveTalk/index.html#/

あとがき

 この前、クトゥルフ神話TRPGを初めてやってキャラロストしてきたので
なんとなくこんなタイトルになりました。

mrbgemの話それから標準ライブラリの話

少なかった

 mrubyコードリーディングをする際、mruby周りを調べました。
その時、よくmrbgemなるものがある事をよく耳にしました。
なんじゃろほいと謎に思いながら放置していたのですが、
mruby advent calendar を漁っていた時に
断片的な情報を拾っていって把握したのです。
というか主にこれ
mruby で C 言語の構造体をラップしたオブジェクトを作る正しい方法 - Qiita
しかし、意外にmrbgem周りの説明をした記事が少なかったので
コードリーディングの記事を書く準備のついでつらつらとまとめておきます。
見つけた他の方のまとめ
mrbgemsの使い方 - shercoの日記

Rubyrubygemsに対してmrubyのmrbgems

 名前からしてそんな感じだと思っています。
もともとmrubyは最小の処理系に必要な機能をmrbgemでくっつけていく使い方を
押しているようで、それをbuild_config.rbで指定して
build出来るようになっています。
mrubyのビルド方法 - Qiita

経緯も含めてこちらにありました。詳しいconfigの設定方法も書いてあります。

外部ライブラリ、advent calendarでは外部モジュールとの
言い回しが多用されていました。
mruby では、単純にLibraryとだけ書かれています。
mrbgem自体の実装は、C拡張とRuby拡張、C&Ruby拡張の3つがあります。
書き方としてはRubyで出来ないところはCでやるのが良いとされているようです。
mrbgemsがなければioもrequireも出来なかったり、
逆にあればhttp2やmysql、ロードバランシングとかもできたりとっても楽しい感じです。
#18 mruby-ipvs を実装し卒業論文を書きました - rrreeeyyy.com
人間とウェブの未来 - Trusterd: HTTP/2 Web Server scripting with mruby v0.0.1 リリースしました
しかし、コミッタの皆さんは、Rubyで出来る事すべてをmrubyで実現させるつもりも
なかったりするのでどうなっていくのかは私にはわかりません。なるようになると思います

特徴

 またmrbgemsの特徴として、処理系と静的リンクをすることがあります。
先に書いたちょろっと書いた"必要な機能をmrbgemでくっつけていく使い方"です。
この辺がRubygemsとの違いですね。(requre で動的にリンクする)
mattn/mruby-require · GitHub があるにはあるのですが
これも外部モジュール、つまりmrbgemです。

build_config.rbに

conf.gem  => "mruby-*" 

のように書き加えるとmakeの際に含まれます。

conf.gem :github => "誰かさん/mruby-*"
conf.gem :git => "git@URL"

のように指定するとDLからしてくれる素敵機能もあります。
この辺の機能のためにmrbgemsは名前に

mruby-*

であることが強いられているらしい。

 また、mrubyの開発はガンガン行こうぜ!が基本なので
処理系内部の変更によって動かなくなっているmrbgemsが割と存在しています。
matsumotoryさんがLinux系でこけるものをコメントアウトしたもののCI。
mrbgem_test_ci/.travis_build_config.rb at master · matsumoto-r/mrbgem_test_ci · GitHub
ほかにこけるのがあるかは観測してみないと分からない。

標準ライブラリの話

 mrubyはRubyとしての最小の処理系です。けれど普通にmakeするときに
用意されているmrbgemsが存在しています。標準ライブラリと言えばよいのかな。
mruby/mrbgems/* にあります。

default.gembox
full-core.gembox
mruby-array-ext/
mruby-bin-mirb/
mruby-bin-mruby/
mruby-bin-mruby-config/
mruby-bin-strip/
mruby-enum-ext/
mruby-enumerator/
mruby-eval/
mruby-exit/
mruby-fiber/
mruby-hash-ext/
mruby-math/
mruby-numeric-ext/
mruby-object-ext/
mruby-objectspace/
mruby-print/
mruby-proc-ext/
mruby-random/
mruby-range-ext/
mruby-sprintf/
mruby-string-ext/
mruby-string-utf8/
mruby-struct/
mruby-symbol-ext/
mruby-time/
mruby-toplevel-ext/

default.gembox というのがbuidl_config.rbで指定されていてその時
これら "mruby-*" をbuild時にリンクするようです。
gemboxってのはmrbgemを纏めて指定する仕組みで、
依存関係の解消なんかに使われるようです。
これとは別に
mruby/mrblib/*

array.rb
class.rb
compar.rb
enum.rb
error.rb
hash.rb
init_mrblib.c
kernel.rb
mrblib.rake
numeric.rb
print.rb
range.rb
string.rb

といった感じでメソッドが定義されていました。
== や collect, include? などです。
使えるメソッドが知りたかったらこれらのファイルを覗くとよいでしょう。

まとめ

mrbgemsはmrubyを使うときに要になるものだと思います。
PHPパーサがなかったりXMLパーサがなかったり、
適当に考えて思いつくものはmattn_jp さんが実装していたり
これも漁っていると楽しいのです。


 コードリーディングするときはファイル構造を知るのがいいって
ソースコードを読むための技術
が言ってた。
mrbgemについて書きながら思ったのは
minirakeやRakefile,makefileにbuild_config.rbのことをちゃんと
知ってからmrubyコードリーディングするのも一つの近道な気がする。
ドキュメントまだないから言っていることがあっているのか不安

mrubyを読む準備

mrubyコードリーディングが楽しいので準備から考えたこと、調べたことを纏めていきたいと思います。
まず、準備とmrubyの周囲についてを纏めてみました。

きっかけ

 大学が春休みになった("14/3/1時点~)。あと、OSSだった。
プログラミングできないのがつらいから出来る人のコードを読みたかった。
こういう記事を書いたら後戻りできなくなるかなと思った。(続けるために)

呟く

するとね


教えてくださった方々、ありがとうございます。
取っ掛かりが手に入ったので、やらねば損だと思った次第です。

始める

教えてもらった参考URL
mruby Complete
mrubyを読む - Code Reading Wiki
あと、Rubyそのもののリーディング記事も役に立ちます。
Rubyソースコード完全解説

目標

rubyにおけるgemに相当するmrubyのmrubgemを作れるようになる。
mrubyにpull-reqest を飛ばせるようになったら最高である。

 

ソースコードはここ

mruby/mruby · GitHub
githubで管理されています。
リリースがmruby v1.0.0 が存在していますが開発がガンガン行こうぜと進んでいるので
変化がすさまじいです。重要なデータ構造が変わったり(互換性あり)、Enumが実装されたり。
その辺のcommit logを書いている方もいます。
mruby master changesを始めます - mruby-master-changes
iijさんが不具合の修正のみをまとめた安定版リリースをしていたりするのでそっちをみたりするのも楽しい。
Releases · iij/mruby · GitHub

mruby周りのあれやこれや

名前の話

 mrubyは組み込み用のrubyです。なんでMの頭文字が付いてるかは
GithubWikiに書いてあります。
曰く
Embeddableのm
mimimal implementationのm
まつもとゆきひろ(Matz)のm
また、mrubyの初期コミッターになぜかまつもとさんがたくさんいるから(2人+Matz)
イニシャルにMが付く人であればmrubyv1.0.0の時点で
団体を除くほぼ全員にMが付いています、すごい。

luaとの話

 世の中にはLuaというOOPかつ軽量なスクリプトな言語が既に存在しています。
大雑把に言えば、mrubyとluaやっていることが一緒です。
それなのになんで?みたいな話も説明している方がいます。
Getting started with mruby - Matt Aimonetti
Wht not Lua?と分かりやすい問いかけです。
Luaのポジションを目指すのではなく、DSLを簡単に書けるRubyがあれば開発が楽しく
素早く出来てうれしい!みたいなことが書いてあります。

 Twitterを見ている感じだと、メモリ等の制約が緩い組み込み環境が今後10年くらいで増えていくから
そのような場でC/C++に固執したりシンプルすぎるLuaでキリキリするよりRubyでふんわりできたらいいな。
みたいなニュアンスを感じました。
また、Webアプリケーションの開発に一部mrubyを使い、requirement にRubyを必要とせず
Rubyを使う使い方もあると思います。
ちなみにライセンスはMITLです。気楽にWebアプリと纏めて配布できます。
mrubyの推進団体もあるようです。
特定非営利法人軽量Rubyフォーラム
正直、どういうものなのか自分はよくわかっていない。

情報源

主にTwitterです。各コミッターのTwitterやmrubyで検索掛けて眺めたり、コミッターのブログを見たり。
まだ、ドキュメント的なものが存在していないようです。githubを眺めていれば分かる
去年のmruby advent calendar も大変参考になります。
mruby Advent Calendar 2013 - Qiita
mrbgemはgithubのmrbgem-list に一覧があります。動かないものも割と存在しているそうです。

雑感

mrubyは公開されておよそ2年、Rubyでいうところの"97年くらいの状況でしょう。
まだまだ始まったばかりといった風で見ていてとても楽しいです。
mrubyはコードも綺麗で、その目的から量も少なめなのでOSSの勉強にもってこいだと思います。
さらにはCの書き方とRubyの仕様も知れて一石二鳥といったところ、素敵。

 情報収集と方法のまとめと個人の主観がごっちゃになった記事になってしまった。
 次はmruby/include/mruby.h とmruby/include/mruby/value.h を読んだ話を書ければいいな。

NeoBundleLazy の設定をしてみた

 golang , scala など、vim の標準にまだ syntax がない言語を触り始めました。
もちろんvim でやるために syntax などをNeoBundle してもってきていますが、
だんだんと vim が重くなってきてvim を開くのにワンテンポ遅れるようになりました。
 これはいけないと neobundle.vim の機能に遅延ロードなるものがあったような気がしたのでちょちょいといじって使ってみます。その備忘録。

NeoBundleLazy

 調べてみますと、NeoBundleLazy をすれば特定条件でのみ読み込み するようにできるらしいです。ちょっとやっていましょう。

NeoBundleLazy 'mattn/emmet-vim',{
                          \"autoload" : {"filetypes" :[ "html" ]}
                          \}

  NeoBundleLazy 'vim-jp/cpp-vim',{
                           \"autoload" : {"filetypes" :[ "cpp" ]}
                           \}

  NeoBundleLazy 'derekwyatt/vim-scala',{
                          \"autoload" : {"filetypes" :["scala"]}
                          \}

  NeoBundleLazy 'jnwhiteh/vim-golang',{
                          \ "autoload" : {"filetypes" : ["go"]}
                          \}

とりあえず、自分の使っているプラグインで使うタイミングが限られるやつだけをNeoBundleLazyしました。体感的に少し開くのが早くなったような気がします。

vim --startuptime を使えば比較できるのでしょうが、ちょっとめんどくさいのでまた今度、結果だけ貼っつけます。
正直、 vim --startuptime したファイルの読み方がよくわからんとです。
一番遅くなる原因は calendar.vim なんだけどね! 

参考

NeoBundle バンドルの更新とファイルタイプ別バンドル読み込み - 断章10100

neobundle.vim でプラグインの遅延読み込み - C++でゲームプログラミング

:help NeoBundleLazy

NeoBundleどんだけ便利なんだと思いつつ、Shougo氏の githubにある vimrc を見てみると他にも使いようがあるみたいでなかなか奥が深いです NeoBundle.vim
というか Neo 系vim プラグイン