Hello, Ruby!


                  2012/06/23
        NSEG feat. Kosenconf
               @crimsonwoods
About Me
Name: 紅林 隆浩(@crimsonwoods)
Age : 28 (Generation 83)
From: Silent Hill / Tokyo
Job : Freelance Software Engineer
Hobby: Bicycle / Photo / Alcohol etc.
Technology:
 Android / Linux / Windows
 MPU / FPGA
 C / C++ / C# / Java
Kosenconf in Numazu / Photo:@earth2001y(Daichi, OBINATA)
NSEG 勉強会
    feat.
高専カンファレンス
Which Ruby?

    CRuby?
    JRuby?
Which Ruby?


   mruby
About mruby
 Lightweight
 Ruby implementation
         for
Embedded Platform
About mruby
 - Open Source
    (MIT license)
 - ISO Compliant
 - C Language
About mruby
News
http://itpro.nikkeibp.co.jp/article/NEWS/20120420/392541/
http://el.jibun.atmarkit.co.jp/rails/2012/04/rubymruby-2004.html




Github
https://github.com/mruby/mruby
Getting started mruby.
1st step: make
required: make, gcc, bison

$   git clone https://github.com/mruby/mruby.git
$   cd mruby
$   make
$   export PATH=$PATH:$(pwd)/mruby/bin
$   mruby --help
Getting started mruby.
2nd step: run
$ mruby –e ‘p “Hello, mruby!”’
"Hello, mruby!"
$ echo 'p "Hello, mruby!"' > hello.rb
$ mruby –v hello.rb
"Hello, mruby!"
Getting started mruby.
3rd step: compile
$ mrbc hello.rb –ohello.mrb
$ mruby –b hello.mrb
"Hello, mruby!"
Getting started mruby.
もっと難しいコードは?


Rubyistじゃない
ので書けません。
Getting started mruby.
制限いろいろ
 -Bignumありません
 -Threadありません
 -Processありません
 -Fileありません
 -Signalありません
 -他にもいろいろありません
mruby on Android

     mruby
       +
    Android
mruby on Android
Androidからmrubyを使うには
 1. Android用にbuildしたmruby
    をAPKに含める

 2. mrubyをlibraryとして
    Android用にbuildし、JNIを
    通じてlinkする
mruby on Android
mruby into APK
1. assetsにmrubyを配置
2. 実行時にassetsからmrubyを展開
3. Rubyスクリプトをコマンドライン
   or 一時ファイルとして実行
4. 標準入出力をリダイレクトして結
   果を取得
mruby on Android
mruby into APK
mruby on Android
mruby as JNI library
1. mrubyをlibraryとしてbuild
2. JNI用のラッパーコードを書く
3. ラッパーコードをbuildして
   mrubyをlinkする
4. Javaから直接JNI経由でmrubyが
   使える!
mruby on Android
Features: mruby in APK
1. mrubyのビルドだけなのでお手軽
2. mrubyがcrashしてもJVMが死なない
3. mrubyとJVMが分離されているので、
   プロセス単位のメモリ制限に
   引っかかりにくい
4. mrubyをinteractiveに
   実行できない
mruby on Android
Features: mruby as JNI library
1. ビルドが大変
2. mrubyがcrashするとJVMも死ぬ
3. メモリ制限にひっかかりやすくなる
4. JNI書くのめんどくさい
5. mrubyをきめ細かく制御できる
6. RubyとJavaの連携が可能
Java-Ruby bridge
作りました


     Jamruby
 (Java mruby bridge)
Java-Ruby bridge
ソースコード

Github
https://github.com/crimsonwoods/jamruby
https://github.com/jamruby/jamruby

* 将来はjamrubyアカウントに統合する予定
Java-Ruby bridge
できること
 -RiteVM(mrubyのVM)の起動
 -VM標準入出力のリダイレクト
 -RubyからJavaのメソッドコール
 -Javaの例外をRubyの例外に変換
 -mruby APIのJavaラッパー提供
Java-Ruby bridge
今後の予定
 -Javaの機能呼び出し文法簡略化
 -相互型変換のサポート拡張
 -Androidの機能をサポート
 -VM内部のメソッドフックサポート
 -Android以外のプラットフォーム
 サポート
Java-Ruby bridge
課題
-JavaクラスのRubyへのExport
-Javaのメソッドオーバーロード解決
-Rubyの例外ハンドリング
-64bit整数型サポート
                      etc.
Java-Ruby bridge
    準備1: mrubyをNDK-Buildする
$   git clone https://github.com/mruby/mruby.git
$   git clone https://github.com/jamruby/jamruby.git
$   cd mruby
$   git clone https://github.com/jamruby/mruby_ndk-build.git android
$   make
$   cd android/jni
$   ndk-build
$   cd ../../../jamruby


    * 予めAndroid NDKを環境中に配置し、
     ”ndk-build”コマンドが使用可能になっている前提
Java-Ruby bridge
準備2: JamrubyをNDK-Buildする
$ cd jni
$ ndk-build
$ cd ../
$ ls libs/*/*.so
libs/armeabi/libjamruby.so
libs/armeabi-v7a/libjamruby.so
libs/x86/libjamruxy.so
$ cd ../
Java-Ruby bridge
準備3: Jamrubyをbuildする

             jamrubyからImport



             NDK-Buildしたもの
Java-Ruby bridge
準備4: JamrubyAppを取得する

$ git clone https://github.com/jamruby/JamrubyApp.git



  git cloneした後は、EclipseへのImportを行います。
  EclipseでのAndroid Applicationのビルドには、
  Android SDKとADT Pluginが必要になります。

  <下記参照>
  http://developer.android.com/sdk/installing/index.html
  http://developer.android.com/sdk/installing/installing-adt.html
Java-Ruby bridge
本番: JamrubyAppを実行する
Java-Ruby bridge
本番: JAVAの関数を呼び出す
Java-Ruby bridge
競合
-Ruboto (JRuby: Java + Ruby)
-Rhodes (Ruby + HTML/CSS/JS)
-MobiRuby (Ruby + Obj-C|Java)
Fin.
About Jamruby
 URL:     http://jamruby.org/
 Mail:    jamruby(at)jamruby.org
 Twitter: @jamruby_org

  コンテンツはまだ用意できていません。
  ごめんなさい(´;ω;`)

Hello Ruby