mrubyを使った クラウド連携

Preview:

DESCRIPTION

 

Citation preview

mrubyを使ったクラウド連携

1

たろサ(山本三七男)

2

自己紹介

「スクリプトでハードウェアを簡単に制御する」

をテーマに色々やっています。

3

ServerWifi

ネットワーク上からスクリプトをダウンロード

ロボットが動作

スクリプトを選択

ABC2012Spring

4

GR-SAKURAに対応

MakeFairTokyo2012

サリーダ桜(SaridaSAKURA)

5

MakeFairTokyo2012

さくるあ(SakuLua)発表

6

Android からGR-KURIMIをLuaやmrubyスクリプトで制御

Firmata Lua/mruby

7

FM3にLua移植

SAKURAボードユーザ会で報告

8

GR-SAKURAにmruby移植

SakuRuby

mrubyはLightweight言語

9

10

mrubyはLL言語

Lightweight 言語とは、

日本において、

 スクリプト言語を指す和製英語で、

  取り回しに優れ、

  コードの作成や修正が容易

と見なされるプログラミング言語のことを

指す。

ウィキペディアより

11

mrubyはLL言語

Lightweight 言語とは、

日本ではおおむね以下のようなスクリプト

言語を指す。

AWK、JavaScript、JScript、Lua、Perl、

PHP、Python、Ruby、シェルスクリプト

(bash、csh など)、Tcl、VBScript

ウィキペディアより

12

mrubyは組み込み言語

12

13

組み込み言語とは

C言語と親和性が良く、

  自作開発アプリでの拡張言語として 使用できる言語

代表的なもの

 Lua、mruby、PyMite、squirrel

Cで描かれているプログラム

組み込み言語

言語処理系も全て親プログラムの中で

動いている

14

mrubyとは

まつもとゆきひろさんが開発した「Ruby」を、組込みシステム等の幅広い分野への適用、およびそれらのシステム開発効率の向上を目標に新たに開発されたプログラミング言語

福岡CSKサイトより引用http://www.csk.com/fukuoka/services/mruby/index.html

mrubyのソフトウェア構成

15

mrubyとは

まつもとゆきひろさんが開発した「Ruby」を、組込みシステム等の幅広い分野への適用、およびそれらのシステム開発効率の向上を目標に新たに開発されたプログラミング言語

福岡CSKサイトより引用http://www.csk.com/fukuoka/services/mruby/index.html

mrubyのソフトウェア構成

組み込み言語を、

組み込み機器に

使えるようにした

16

GR-SAKURAにmrubyを移植

16

17

特   徴

SakuRuby

・言語がRuby

・プログラムの変更が容易

・単独でインターネット接続できる

18

何がしたいか

M2M や IoT でいわれている

デバイスがクラウドにつながり

まくる

デバイス

クラウドサーバークラウドサーバー

そんな世の中を見たい!

19

何で、mrubyなの?

19

20

どんな世の中

デバイス開発も、Web

アプリ開発に近い体制

になるのでは?クラウドサーバークラウドサーバー

O S

ライブラリはCなどでしっかり作っている

Node.js / Java / PHP / Ruby

H / W

ライブラリはCなどでしっかり作っている

mruby / js / pymiteリアルタイム

処理

21

どんな世の中

デバイス開発も、Web

アプリ開発に近い体制

になるのでは?クラウドサーバークラウドサーバー

O S

ライブラリはCなどでしっかり作っている

Node.js / Java / PHP / Ruby

H / W

ライブラリはCなどでしっかり作っている

mruby / js / pymiteリアルタイム

処理

22

先ずは作ってみた

SakuRuby

★ファーストステップ

 サーバーと直接通信する仕組みを実装

23

ファーストステップ

23

24

GR-SAKURAの課題

ハード仕様

FlashROM:1Mバイト

RAM:128Kバイト

このRAM容量では、コードを実行バイナリに変換する

ためのメモリが不足

25

GR-SAKURAの課題

PC上でコンパイル

$ mrbc test.rb$ lstest.mrb test.rb

$

mrbcでコンパイルして、mrbファイルをSAKURAに持っていく。

デバイスへ

26

GR-SAKURAの課題

PC上でコンパイル

$ mrbc test.rb$ lstest.mrb test.rb

$

mrbcでコンパイルして、mrbファイルをSAKURAに持っていく。

デバイスへ

クラウド連携として、これをサーバにやってもらう

27

Web-mrbcコンパイラ

公開中、誰でも使えます。

http://www16278ui.sakura.ne.jp/mrbc

Ruby on Railsで書いています

28

クラウド連携

実行プログラムが

スクリプトコードの場合、

Webコンパイラに接続して

自分でコンパイルし、

mrbバイナリを取得して実行

します。

クラウドサーバークラウドサーバー

29

SakuRuby

端末から直接Rubyコードの入力も可能

デモ動画 http://www.youtube.com/watch?v=Iuc2h99D0oM

30

run.rb

直接入力プログラムもrubyで書かれている## Multi Lines Rundef lineinput() k=0 while(k>=0) k=Serial.read() end m="" while(true)do k=0 while(k<=0) k = Serial.read() delay(50) end if(k==13 || k==10)then break end if(k==8)then m=m[0,m.length-1] else m=m+k.chr end Serial.print(k.chr) end return mend def multiinput() k=0 begin k=Serial.read() end until (k<0) Serial.println("\r\nInput end with [Ctrl-z]")

m="" while(true)do k=0 begin k = Serial.read() delay(50) end until (k>0) if(k==26)then break end if(k==8)then m=m[0,m.length-1] else m=m + k.chr end Serial.print(k.chr) end return mend

fm=""Serial.print("\r\nFilename>")fm = lineinput()m=""m=multiinput()

Serial.println(" ")Serial.println("OK")

SD.open( 0, fm, 2 )SD.write(0, m, m.length)SD.close(0) Sys.setrun(fm)

31

作ってみた感想

31

32

クラウドの課題

・Rubyの勉強不足

・Ruby on Railsの勉強不足

 Webプログラムの基本的なことが分かっていない。

・1人でやっているのはきつい。

クラウドサーバークラウドサーバー

対 策

Wakayama.rb設立 . . .和歌山でRoRに詳しい人が見つからない → あかんやん

33

デバイスの課題

3Gシールドが高価

3Gシールドがバイナリを通さない

1人でやっているのはきつい。

対 策

安い3Gボードを自作できないかな? そうすると、通信のファームも自分で書ける。

H/Wに興味のあるRubyスト | | Rubyに興味があるH/W屋さんを探す。

34

今後、デバイス-クラウド分散処理系の実装

34

クラスとか、まだ、原案段階です

35

クラウド分散

デバイス側の処理負荷

をクラウドに持っていく

クラウドサーバークラウドサーバー

・CloudManege Class・Channel Classの実装

36

CloudManage Class

 分散処理サーバに登録するプログラムの管理を行うクラス

 initialize( user, passwd )  コンストラクタ   引数  分散サーバへのユーザID、パスワード

 upload( calss_name, file_name )  分散サーバにmrubyのクラスプログラムをファイルから読み込んで送信します。   引数  サーバに登録するクラス名、送信するクラスコードのファイル名   戻り値 登録ができればtrueが戻る。

 uploadb( calss_name, binary )  分散サーバにmrubyのクラスプログラムを送信します。   引数  サーバに登録するクラス名、送信するクラスコード   戻り値 登録ができればtrueが戻る。

 delete( class_name )  分散サーバからmrubyクラスコードを削除します。   引数  サーバに登録したクラス名

   戻り値 削除ができればtrueが戻る。

 list()  分散サーバに登録したクラスを一覧します。   戻り値 クラス名一覧が戻る。

 ready()  分散サーバに接続しているかどうかを調べます。   戻り値 接続していればtrueが戻る。

 dispose()  分散サーバとの接続を切ります。

37

Channel Class

 サーバに対して分散処理を行うクラス 分散処理はチャンネルで管理されます。

 initialize( user, passwd )  コンストラクタ   引数  分散サーバへのユーザID、パスワード

 make( class_name, arg )  サーバ側でクラスのインスタンスを生成します。そして、そのインスタンスに対するチャンネル番号を返します。   引数  クラス名、インスタンス生成時の引数   戻り値 インスタンスのチャンネル番号が戻ります。

 send( channel, method_name, arg )  サーバ側に生成したクラスのメソッドを実行させます。   引数  クラスのチャンネル番号、メソッド名、メソッドの引数   戻り値 処理が開始できればtrueが戻ります。

 recv( channel, method_name )  サーバ側で実行したメソッドの計算結果を受け取ります。  計算結果はオブジェクト配列でもどります。   引数  クラスのチャンネル番号、メソッド名   戻り値 計算結果

 close( channel )  サーバ側で生成したクラスのインスタンスを破棄します。   引数  クラスのチャンネル番号

 ready()  分散サーバに接続しているかどうかを調べます。   戻り値 接続していればtrueが戻る。

 dispose()  分散サーバとの接続を切ります。

38

分散処理イメージ

#チャネルインスタンスの生成channel = Channel.new("userID", "passwd")

#分散クラウドにチャネルを通してFooクラスのインスタンス生成arg = [10,2] #クラス生成時の引数num = channel.make(“Foo”, arg )

#分散クラウドのFoo.method(arg)メソッドを実行するarg = [1,2,3]channel.send( num,“method”, arg )

#分散クラウドからの結果を待つ・・・分散の意味がないですが(^^;res = nilwhile(res == nil)do res = channel.recv( num,“meth”)end#チャネルを閉じるchannel.close( num )channel.dispose()

mrubyプログラム

39

ま と め

興味のある方、募集します。

 ・面白そうなので、一緒にやりたいな ・mrubyの組み込みやりたいな ・デバイスのクラウド分散処理やりたいな

Wakayama.rb 第5回勉強会 2014/1/19(日) 13:00~17:00 和歌山市東部コミュニティセンター

ご清聴ありがとうございました

40

Recommended