読者です 読者をやめる 読者になる 読者になる

Jinbocho.rb 第1回に参加してきました。

ということで、4/19(金)19時半〜から、Jinbocho.rb 第1回に参加してきました。
当日、ヒヤっとしながらもなんとか、間に合う時間に職場を出ることができ、会場を提供してくださった神保町の株式会社万葉さんへ急ぎます。


特に受付という受付もないまま、入れてしまい、これでいいのかなと思いながら席について、とりあえずMBAを開きます。
今まで8割方知り合いという身内の勉強会に参加したことはあっても、今回のように知り合い0の勉強会は初。
最初の自己紹介。当然ですが、私以外全員エンジニアの人でした。プログラムを書く仕事をしていない人は私1人w
とりあえずまずは、"Hello World!!"
ということで、とりあえずcdでホーム直下のmrubyディレクトリに移動して、下記コマンドを入力。

$ ./bin/mruby -e "p 'Hello World!!'"

無事表示されました。
オプションの「-e」って何だろう。

Ruby 2.0.0 リファレンスマニュアル Rubyの起動
-e script
コマンドラインからスクリプトを指定します。-eオ プションを付けた時には引数からスクリプトファイル名を取りません。

pはさすがに表示するというコマンドなんだろうと推測。


次はmrubyをカスタマイズしてみよう!ということで
最初に、今の時間を表示するコマンドを入力

$ ./bin/mruby -e 'p Time.now'

今の時間が表示されます。
次にビルドの設定ファイルであるbuild_config.rbを編集。
mruby-timeの行をコメントアウト(行の頭に#を入力)して、上書き保存。

$ vi build_config.rb

すると、再び先ほどのコマンドを入力しても今度はNameErrorが出て時間が表示されません。

$ ./bin/mruby -e 'p Time.now'


最後にmrbgemを作ってみよう!
mrbgemとは何となくですが、mrubyの機能拡張ファイルのようなものなのかなと推察。
まずはホームディレクトリ直下mrubyディレクトリに移動して、mruby-randディレクトリを作成

$ mkdir mruby-rand
$ mkdir mruby-rand/src
$ mkdir mruby-rand/test

そして、rakeファイルを作成。rakeとは?
「Make の Ruby 版のような位置づけなビルドプログラム(DSL)」
であるらしい。

$ vi mruby-rand/mrbgem.rake

MRuby::Gem::Specification.new('mruby-random') do |spec|
spec.license = 'MIT'
spec.authors = 'mruby developers'
end

いよいよC言語でgemを作成。
今あるmruby-randamはメルセンヌツイスタですが、cのrandとsrandをWrappingする方向で作ってみますとのこと。
メルセンヌツイスタとは、ググってみたところ疑似乱数発生装置とのこと。。

cのrandとsrandについて
Glassy Heart first C言語講座 【14章】 乱数
randは0から最大値を定数RAND_MAXまでの値を返す関数
randを実行ごとに初期化するにはsrand関数を使う。

$ vi mruby-rand/src/rand.c

#include "mruby.h"
void
mrb_mruby_random_gem_init(mrb_state *mrb)
{
}
void
mrb_mruby_random_gem_final(mrb_state *mrb)
{
}

まだ中身はありません。
次にビルドの設定ファイルのbuild_config.rbを編集。
mruby-randamをコメントアウトして、mruby-randを足す

$ vi build_config.rb

#mruby-random
#conf.gem "#{root}/mrbgems/mruby-random"
#mruby-rand
conf.gem "#{root}/mruby-rand"

とりあえずビルドが通ることを確認

$ ruby minirake clean
$ ruby minirake all

次にrubyでtestファイルを作成

$ vi mruby-rand/test/rand.rb

assert("rand is afixnum") do
 rand.class == Fixnum
end

assert("rand is a positive value") do
 rand >= 0
end

今度はテストに失敗することを確認

$ ruby minirake all test

rand.cファイルに書き足す

$ vi mruby-rand/src/rand.c

赤字が追加部分

#include "mruby.h"
#include

mrb_value
mrb_f_rand(mrb_state *mrb, mrb_value self)
{
 return mrb_fixnum_value(rand());
}

void
mrb_mruby_rand_gem_init(mrb_state *mrb)
{

struct RClass *krn = mrb->kernel_module;
mrb_define_method(mrb, krn, "rand", mrb_f_rand, ARGS_ANY());

}

void
mrb_mruby_random_gem_final(mrb_state *mrb)
{
}

ビルドして、テスト。

$ ruby minirake clean
$ ruby minirake all
$ ruby minirake all test

今度はOK。
randを試してみます。

$ ./bin/mruby -e "p rand"
$ ./bin/mruby -e "p rand,rand,rand"  

無事に乱数が表示されました。
やったー!
しかし、まだ実行時に乱数が初期化されないため、何度実行しても同じ数字が表示されます。
という訳でrand.cファイルに書き足し。

$ vi mruby-rand/src/rand.c

追加したのは3行目のの行と16行目のrand((unsigned) 〜の行です。
はてなダイアリーって行数表示できないんだな。。

#include "mruby.h"
#include <stdlib.h>
#include <time.h>

mrb_value
mrb_f_rand(mrb_state *mrb, mrb_value self)
{
 return mrb_fixnum_value(rand());
}

void
mrb_mruby_rand_gem_init(mrb_state *mrb)
{
 struct RClass *krn = mrb->kernel_module;
 mrb_define_method(mrb, krn, "rand", mrb_f_rand, ARGS_ANY());
 rand((unsigned) time(NULL));
}

void
mrb_mruby_random_gem_final(mrb_state *mrb)
{
}

ビルドする。(いまいちよくわかっていない(汗)

$ ruby minirake clean
$ ruby minirake all
$ ruby minirake all test

再びrandを試してみます。

$ ./bin/mruby -e "p rand"
$ ./bin/mruby -e "p rand,rand,rand" 
$ ./bin/mruby -e "p rand"
$ ./bin/mruby -e "p rand,rand,rand"   

今度は二回目は違う乱数が表示されます。
やったー!


mruby introduction -- jinbocho.rb #01 // Speaker Deck


知識0の人間が参加するというので、ご迷惑かなーっと隅の方で大人しくぼーっとしていようと思っていたのですが、みなさん親切に接して下さって、ありがとうございました!!


帰宅してから、検索して参考にしたサイト
人間とウェブの未来 - 今日からmrubyをはじめる人へ
mrubyでC言語のGEMを作成する - 涼風コンピュータblog


しかし久しぶりすぎてターミナルコマンドをすっかり忘れていました(汗

ディレクトリ記号 意味
. 自分が今いるカレントディレクトリ
.. 一つ上のディレクトリ
~(チルダ) ホームディレクトリ


viのコマンドを忘れていたのでおさらい(汗

キー操作 機能
i 挿入モードに入り、カーソルの前にテキストを挿入できるようにする
:q ファイルへ保存せず終了
:q! ファイルへ保存せず終了(強制)
:wq ファイルへ上書き保存して終了
x カーソル位置の文字を削除
dd 現在行を削除(切り取り)
p バッファに保存されている内容をカーソル位置に挿入
/ 文字列 ファイル中を終端方向に向かって検索