Skip to main content
Developers
Summit




   Ruby開発者のみなさん、
        mrubyで
楽しく快適な組み込みアプリ開発を
       始めませんか?

15-E-2                                    曽我部 崇
#devsumiX                           株式会社インターネットイニシアティブ
                                   プロダクト本部 アプリケーション開発部

             Developers Summit 2013 Action !
Developers
 Summit
                  自己紹介

• 曽我部 崇(@rev4t)
   – IIJで企業向けルータの開発などに従事

最近の活動場所
• mruby (http://github.com/iij/mruby)
• openstack
   – コントリビュータ始めました(IPv6まわりの修正をし
     た程度..)

                 Developers Summit 2013 Action !   2
Developers
Summit
             SEIL(ザイル)作っています

• ISPのノウハウを結集してIIJが開発した企業向
  けアクセスルータ
• Firmwareは独自開発、Hardwareは国内製造
• 仮想化環境(VMWare, KVM, Hyper-V)対応




                 Developers Summit 2013 Action !   3
Developers
Summit
             SEILのアーキテクチャ

• NetBSDをベースに、ルーティングエンジンや
  コンフィグ管理システム(CLI, WebUI)を組み込
  んでいる

                   コンフィグ管理システム
                 Quagga
                                                Other daemons
             (Routing Engine)
                                   libc
                   NetBSD Kernel
                     Developers Summit 2013 Action !            4
Developers
Summit
                     質問


• 組込ソフトの開発をして
  いる人はどれくらいい
  らっしゃいますか?

             Developers Summit 2013 Action !
Developers
 Summit
              mrubyとの出会い

• 2011年春頃
   – 社内プロジェクトで、SEILに cruby を組み込んだ
• 2011年8月頃
   – 社内の先輩 前橋さん(@tmeb4)にmrubyの存在を教
     えてもらう
   – SEILでも動くか試すべく、関係者にコンタクトを取る
• 2011年12月頃
   – ソースコードを入手し、SEIL上でもmrubyが問題なく動
     作した

                Developers Summit 2013 Action !   6
Developers
   Summit
                       組込ソフト開発者の苦悩
IIJ が提供中のオープンソース ソフト ARMSD                                       よりコード を一部抜粋 …
https://githu b.c om /s eil - sm f/a rms d



  static int                                                             nread = fread(buff, 1, len, fp);
  load_from_file(char *fname, char **bufp)                               if (nread < len && !feof(fp)) {
  {
                                                                               fprintf(stderr, "fread() failed¥n");
       FILE *fp = NULL;
       char *buff = NULL;                                                      nread = -1;
       size_t len;                                                             goto failure;
       int nread = -1;                                                   }
                                                                         *(buff + len) = '¥0';
      fp = fopen(fname, "r");                                       failure:
      if (fp == NULL) {
                                                                         if (buffp)
            fprintf(stderr, "failed to open¥n");
            nread = -1;                                                        *buffp = buff;
            goto failure;                                                if (fp)
      }                                                                        fclose(fp);
      fseek(fp, 0, SEEK_END);
      len = ftell(fp);                                                  return nread;
      fseek(fp, 0, SEEK_SET);
                                                                    }
      buff = malloc(len + 1);
      if (buff == NULL) {
            fprintf(stderr, "malloc failed");
            nread = -1;
            goto failure;
      }

                                                   Developers Summit 2013 Action !                                    7
Developers
 Summit
     C言語でコード書くのは結構大変
油断すると、すぐにバグが入ります   ;-(




• エラー処理のコードが煩雑
• 特に文字列処理が大変
   – 文字列領域の踏み抜き..
   – 確保したメモリの解放忘れでメモリリーク..
   – FDの解放し忘れでFDリーク..
   – etc...



               Developers Summit 2013 Action !   8
Developers
Summit
             軽量Ruby(mruby)とは

• 家電製品などの開発生産性を向上させることを目指し
  て設計されたRuby言語
• 2011-2012年にかけて、経済産業省の「地域イノベー
  ション創出研究開発事業」として、開発が進められた
• 2012年4月に、MITライセンスとしてgithub上に公開
• 特長
  –   Ruby処理系に必要な資源(メモリ)の削減
  –   実行速度の向上
  –   リアルタイム性の向上
  –   直接見えないように変換されたソースコード

                Developers Summit 2013 Action !   9
Developers
Summit
mrubyを使えば開発効率が上がる?


        コンフィグ管理システム                                          文字列処理が多い
     Quagga
                             Other daemons
 (Routing Engine)                                            システムプログラミング
                    libc
        NetBSD Kernel                                        C言語必須



コンフィグ管理システムはrubyで書くと
開発効率が高まりそう
                           Developers Summit 2013 Action !              10
Developers
Summit
                  Small is Beautiful

• mruby(ミニマム)はruby言語の最少セットのみ
  を提供
  – 利用者は、必要なものだけを選んで組み込む
  – 不要なものは入れなくて済むため、コンパクトに
    なる

                                                Apps
   •   mrbgem A       mrbgem A                mrbgem B   mrbgem C
   •   mrbgem B         (IO)                  (Regexp)    (Socket)
   •   mrbgem C               mruby Virtual Machine
   •   …
                     Developers Summit 2013 Action !                 11
Developers
 Summit
      mrubyが動作する最小構成は?

• RX62N(ルネサス 32bitマイコン)
   – EAPL-Trainer mruby
   – 96MHz CPU, 1MB Flash Rom, 128kB RAM
• 32bit ARM7
   – Lego Mindstorms NXT
   – 256kB Flash Rom, 64kB RAM
   – 但し、hash実装などをダイエットしないと64kBの
     RAMでは動かないらしい
                 Developers Summit 2013 Action !   12
Developers
    Summit
                 SEIL/X1 ハードウェア構成

• CPU: Cavium Octeon (SoC)
      – MIPS64アーキテクチャ
•    Memory: 256MB
•    Flash: 16MB
•    USB: 1ポート
•    Ethernet: GbE 3-port


                     Developers Summit 2013 Action !   13
Developers
Summit




IIJの取り組み事例
1. バックボーン遅延測定
「QUILL」
             Developers Summit 2013 Action !   14
Developers
Summit
             事例1: Quillシステム

• IIJバックボーンの遅延等を測定
• 国内外の中継施設にプローブを配備
  – プローブの開発にはrubyを使用




                Developers Summit 2013 Action !   15
Developers
Summit
             Quillプロジェクトの課題

• プローブはすぐにオペレータが対応できない
  場所にも置いてある
  – 従来は汎用PCサーバを使用
  – できる限り壊れてほしくない
  – 交換するときは誰でも簡単にできるようにしたい


             SEIL/X1 を使うことにした
                 Developers Summit 2013 Action !   16
Developers
Summit
             crubyは大きすぎた..

• リリース版のfirmwareに入りきらない
  – 社内専用版を作って、使わない機能はザックリと
    削除
  – 今の所支障はないが、今後firmwareをメンテナン
    スし続けるのは大変


mruby版firmwareへ移行を検討中

                Developers Summit 2013 Action !   17
Developers
Summit




IIJの取り組み事例
2. 柔軟なルータ「SEIL(ザイル)」

             Developers Summit 2013 Action !   18
Developers
Summit
         もっと柔軟なルータが欲しい

• イベントスクリプト機能 開発中
  – SEILの機能をmrubyスクリプトから操作
  – 経路障害、インタフェースのUp/Downなどのイベ
    ントをトリガになる
                                           Action
                 軽量Ruby
                 スクリプト                     •最低限の切り分け作業を自動化
Event                                         • ping, show status route, ...
•インタフェースDown                               •外部サービスとの連係
•CPU負荷上昇                                      • IaaSやPaaSの性能を増減
•通信量の増加                                       • 監視システムへアラートを
•経路の変化                                        送信
•etc.                                      •経路切替

               Developers Summit 2013 Action !                                 19
Developers
Summit
             色々作ってみました(1)

• つぶやくルータ
  – 電力消費量をtweet
  – http://twitter.com/wattmeter2012
  – https://github.com/iij/mruby/tree/iij/app/twitter

                            The Internet



                                           ついったー電力計 @wattmeter2012
                                           2012/02/01 18:27:47 現在の使用電力は 12 W です!
               USB

                     Developers Summit 2013 Action !                          20
Developers
 Summit
              色々作ってみました(2)

• Amazon S3
   – 監視異常をトリガにして、コンテンツをアップロー
     ド
        • https://github.com/iij/mruby-aws-s3
                                                     Amazon
                      The Internet                     S3

                   監視異常




                   Developers Summit 2013 Action !            21
Developers
Summit




IIJの取り組み事例
3. ネットワーク管理サービス
「SACM」
             Developers Summit 2013 Action !   22
Developers
 Summit
                SACMとは

• SACM [Service Adapter Control Manager]
   – 機器の自動接続、一元管理ができるサービス
   – http://www.sacm.jp/




                                      SA=Service Adapter
                Developers Summit 2013 Action !            23
Developers
Summit
             SACM 新サービスの特長

• 「富山の置き薬」タイプのネットワーク接続
  サービス
  – 機能自体に課金
       • ネットワーク機器「SA-W1」は無償で提供
       • IPsec-VPNレシピ、又は無線LANレシピ
  – 必要なネットワークを迅速に構築できる




                Developers Summit 2013 Action !   24
概要




SA-W1
Developers
Summit
      SA-W1にmrubyを搭載しました

• コンフィグ管理システム「レシピフレームワー
  ク」はmrubyを用いて開発されています

                    中間形式の                      内部プログラム向けの
                    設定ファイル                     設定ファイルに変換
    設定
   パラメータ

                                   レシピ
                                 フレームワーク




             Developers Summit 2013 Action !                26
Developers
Summit
      mrubyを使って分かったこと(1)

• 開発効率が上がった
  – 文字列処理やロジックが簡潔に記述できるように
    なった
  – いちいちfirmwareをビルドしなくてもプログラムを
    差し替えできるのは便利




             Developers Summit 2013 Action !   27
Developers
Summit
      mrubyを使って分かったこと(2)

• たくさん地雷を踏みました..
  – mrubyのバグ潰しに結構時間を費やしました ;-)
  – これからmrubyを使う人は割と安心して使える


• 沢山の人がmrubyを使えば、さらにバグが
  減って安定します!


             Developers Summit 2013 Action !   28
Developers
Summit




まとめ


             Developers Summit 2013 Action !   29
Developers
Summit
組込機器の開発プロセスが進化する

• 今までの組み込み機器開発
  – ドライバ、アプリ(ロジック)全てC言語又はアセンブリ
    言語で開発

• これからの方向性
  – 速度やリソースの制約がある箇所だけC言語やアセ
    ンブリ言語で記述
  – その他のロジック部分は、出来る限り開発効率の良
    い言語で開発
  – テスト駆動開発

             Developers Summit 2013 Action !   30
Developers
Summit
             アプリにmrubyを組み込む

• アプリへの組み込みにも向いている
• 例
  – apache に組み込む => mod_mruby
  – iOSアプリに組み込む => MobiRuby
  – 言語内DSL
       • mruby(ミニマム) + 必要なmrbgemだけを組み込むことで、コ
         ンパクトかつ堅牢になる
• 利点
  – アプリ動作ホストのruby環境に依存しない
       • rubyバージョン、gem依存を気にしなくて良い


                 Developers Summit 2013 Action !   31
Developers
Summit
                     mrbgem

• mruby版のGEM
• 2012年12月、本家にコミットされた
• mrubyのビルド時にGEMを組み込むことができる
  – rubyスクリプト、C言語のコードどちらも組み込み可能


mrbgemに対応した以後、mrubyのエコシステムが
急速に進化中
 https://github.com/mruby/mruby/wiki/Related-Projects

                  Developers Summit 2013 Action !   32
Developers
Summit
    ruby+mruby = Internet of Things

• ruby + mrubyで、様々なモノやクラウドをイン
  ターネットを介して結び付けることができる




   照明、家電、冷暖房、
   蓄電池、各種センサ,etc.




                    Developers Summit 2013 Action !   33
Developers
Summit




             It’s your turn.




              Developers Summit 2013 Action !
Developers
Summit
 皆さんもmruby始めてみませんか?

• 組込機器の開発をしている皆さん
  – mrubyが載りそうであれば、開発効率が高められ
    るかどうか試してみませんか?
• サーバ用のソフトを開発している皆さん
  – アプリ内のミニ言語などに使ってみませんか?




             Developers Summit 2013 Action !   35
Developers
 Summit
PR: SEIL mrubyアプリを作りませんか?

• SEIL/x86
   – https://www.seil.jp/community/seilx86
   – 仮想ルータソフトウェア
   – コンフィグ保存が不要であれば、無料で使える


• 今春リリース予定のfirmwareでmrubyスクリプト
  に対応予定
• 今後、アプリコンテストなどを企画する予定です。
  是非ご参加ください!
                 Developers Summit 2013 Action !   36
Developers
Summit
             mrubyのビルド方法(1)

• PC環境(Linux, Mac) でビルドに必要なもの
  – GCC
  – bison
  – git
  – Rake (Ruby版make) または ruby1.8以降




                Developers Summit 2013 Action !   37
Developers
 Summit
              mrubyのビルド方法(2)
$ git clone https://github.com/mruby/mruby
$ cd mruby
$ ./minirake (または、 rake)

• bin/mruby
   – mrubyインタプリタ
• bin/mrbc
   – mrubyコンパイラ
• in/mirb
   – mruby版 irb

                  Developers Summit 2013 Action !   38
Developers
  Summit
               mrubyのビルド方法(3)

hello.rb
class Hello                       ソースコードを直接実行
 def world                        $ bin/mruby hello.rb
  puts "Hello World!"             Hello World!
 end
end                               バイナリファイルを実行
                                  $ bin/mrbc hello.rb
a = Hello.new                     $ bin/mruby –b hello.mrb
a.world                           Hello World!

                   Developers Summit 2013 Action !       39
Developers
Summit
                     mrubyのビルド方法(4)
                                                           irep 148 nregs=4 nlocals=2 pools=0 syms=3
$ bin/mruby –v hello.rb                                    000 OP_LOADNIL                 R2
mruby - Embeddable Ruby Copyright (c) 2010-2013 mruby
                                                           001 OP_LOADNIL                 R3
developers
                                                           002 OP_CLASS R2                :Hello
NODE_SCOPE:
                                                           003 OP_EXEC R2                 I(149)
 local variables:
                                                           004 OP_GETCONST                R2           :Hello
  a
                                                           005 OP_SEND R2                 :new         0
 NODE_BEGIN:
                                                           006 OP_MOVE R1                 R2
  NODE_CLASS:
                                                           007 OP_MOVE R2                 R1
   :Hello
                                                           008 OP_SEND R2                 :world       0
   body:
                                                           009 OP_STOP
    NODE_BEGIN:
     NODE_DEF:
                                                           irep 149 nregs=2 nlocals=1 pools=0 syms=1
       world
                                                           000 OP_TCLASS R1
       NODE_BEGIN:
                                                           001 OP_LAMBDA                  R2           I(+1)
        NODE_CALL:
                                                                          1
         NODE_SELF
                                                           002 OP_METHOD                  R1           :world
         method='puts' (286)
                                                           003 OP_LOADNIL                 R0
         args:
                                                           004 OP_RETURN                  R0
           NODE_STR "Hello World!" len 12
  NODE_ASGN:
                                                           irep 150 nregs=4 nlocals=2 pools=1 syms=1
   lhs:
                                                           000 OP_ENTER 0:0:0:0:0:0:0
    NODE_LVAR a
                                                           001 OP_LOADSELF                R2
   rhs:
                                                           002 OP_STRING                  R3           "Hello
    NODE_CALL:
                                                           World!"
     NODE_CONST Hello
                                                           003 OP_SEND R2                 :puts        1
     method='new' (7)
                                                           004 OP_RETURN                  R2
  NODE_CALL:
   NODE_LVAR a
                                                           Hello World!
   method='world' (330)

                                         Developers Summit 2013 Action !                                        40
Developers
 Summit
        軽量Rubyフォーラムのご紹介

• 2013年2月に発足予定のNPO法人
   – http://forum.mruby.org
   – IIJも加入予定
• このような人・企業は、是非ご参加ください!
   –   自社製品の開発言語として軽量Rubyを採用してみたい
   –   軽量Rubyの今後の開発方針をいち早く知りたい、意見したい
   –   顧客に軽量Rubyを提案することで差別化を図りたい
   –   軽量Ruby(あるいはその周辺ツール)の開発に関与したい
   –   自社で軽量Ruby製品をNPOを通じて宣伝したい
   –   軽量Ruby教育関連事業を企画したい
   –   とにかく軽量Rubyを応援したい


                 Developers Summit 2013 Action !   41
Developers
 Summit
              IIJが作るPaaS = MOGOK

• http://mogok.jp/




                   Developers Summit 2013 Action !
Developers
Summit
      IIJエンジニアセミナー開催!!
 IIJのソフトウェア開発現場に興味を持ったアナタ!
 IIJのエンジニアとお話しませんか?
 「3/9(土)@IIJ本社」にて、エンジニアがIIJの開発
 業務を紹介するセミナーを行います!
 お気軽にご参加ください。
 詳細はコチラ↓
        【セミナー情報】
        http://www.iij.ad.jp/company/recruit/career/re
        cruit/0309seminar.html
        【問い合わせ先】
         saiyo-c@iij.ad.jp
                       Developers Summit 2013 Action !   43