40
mrubyを使った クラウド連携 1 たろサ (山本三七男)

mrubyを使った クラウド連携

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: mrubyを使った クラウド連携

mrubyを使ったクラウド連携

1

たろサ(山本三七男)

Page 2: mrubyを使った クラウド連携

2

自己紹介

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

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

Page 3: mrubyを使った クラウド連携

3

ServerWifi

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

ロボットが動作

スクリプトを選択

ABC2012Spring

Page 4: mrubyを使った クラウド連携

4

GR-SAKURAに対応

MakeFairTokyo2012

サリーダ桜(SaridaSAKURA)

Page 5: mrubyを使った クラウド連携

5

MakeFairTokyo2012

さくるあ(SakuLua)発表

Page 6: mrubyを使った クラウド連携

6

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

Firmata Lua/mruby

Page 7: mrubyを使った クラウド連携

7

FM3にLua移植

SAKURAボードユーザ会で報告

Page 8: mrubyを使った クラウド連携

8

GR-SAKURAにmruby移植

SakuRuby

Page 9: mrubyを使った クラウド連携

mrubyはLightweight言語

9

Page 10: mrubyを使った クラウド連携

10

mrubyはLL言語

Lightweight 言語とは、

日本において、

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

  取り回しに優れ、

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

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

指す。

ウィキペディアより

Page 11: mrubyを使った クラウド連携

11

mrubyはLL言語

Lightweight 言語とは、

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

言語を指す。

AWK、JavaScript、JScript、Lua、Perl、

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

(bash、csh など)、Tcl、VBScript

ウィキペディアより

Page 12: mrubyを使った クラウド連携

12

mrubyは組み込み言語

12

Page 13: mrubyを使った クラウド連携

13

組み込み言語とは

C言語と親和性が良く、

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

代表的なもの

 Lua、mruby、PyMite、squirrel

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

組み込み言語

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

動いている

Page 14: mrubyを使った クラウド連携

14

mrubyとは

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

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

mrubyのソフトウェア構成

Page 15: mrubyを使った クラウド連携

15

mrubyとは

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

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

mrubyのソフトウェア構成

組み込み言語を、

組み込み機器に

使えるようにした

Page 16: mrubyを使った クラウド連携

16

GR-SAKURAにmrubyを移植

16

Page 17: mrubyを使った クラウド連携

17

特   徴

SakuRuby

・言語がRuby

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

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

Page 18: mrubyを使った クラウド連携

18

何がしたいか

M2M や IoT でいわれている

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

まくる

デバイス

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

そんな世の中を見たい!

Page 19: mrubyを使った クラウド連携

19

何で、mrubyなの?

19

Page 20: mrubyを使った クラウド連携

20

どんな世の中

デバイス開発も、Web

アプリ開発に近い体制

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

O S

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

Node.js / Java / PHP / Ruby

H / W

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

mruby / js / pymiteリアルタイム

処理

Page 21: mrubyを使った クラウド連携

21

どんな世の中

デバイス開発も、Web

アプリ開発に近い体制

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

O S

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

Node.js / Java / PHP / Ruby

H / W

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

mruby / js / pymiteリアルタイム

処理

Page 22: mrubyを使った クラウド連携

22

先ずは作ってみた

SakuRuby

★ファーストステップ

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

Page 23: mrubyを使った クラウド連携

23

ファーストステップ

23

Page 24: mrubyを使った クラウド連携

24

GR-SAKURAの課題

ハード仕様

FlashROM:1Mバイト

RAM:128Kバイト

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

ためのメモリが不足

Page 25: mrubyを使った クラウド連携

25

GR-SAKURAの課題

PC上でコンパイル

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

$

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

デバイスへ

Page 26: mrubyを使った クラウド連携

26

GR-SAKURAの課題

PC上でコンパイル

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

$

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

デバイスへ

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

Page 27: mrubyを使った クラウド連携

27

Web-mrbcコンパイラ

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

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

Ruby on Railsで書いています

Page 28: mrubyを使った クラウド連携

28

クラウド連携

実行プログラムが

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

Webコンパイラに接続して

自分でコンパイルし、

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

します。

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

Page 29: mrubyを使った クラウド連携

29

SakuRuby

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

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

Page 30: mrubyを使った クラウド連携

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)

Page 31: mrubyを使った クラウド連携

31

作ってみた感想

31

Page 32: mrubyを使った クラウド連携

32

クラウドの課題

・Rubyの勉強不足

・Ruby on Railsの勉強不足

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

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

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

対 策

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

Page 33: mrubyを使った クラウド連携

33

デバイスの課題

3Gシールドが高価

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

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

対 策

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

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

Page 34: mrubyを使った クラウド連携

34

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

34

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

Page 35: mrubyを使った クラウド連携

35

クラウド分散

デバイス側の処理負荷

をクラウドに持っていく

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

・CloudManege Class・Channel Classの実装

Page 36: mrubyを使った クラウド連携

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()  分散サーバとの接続を切ります。

Page 37: mrubyを使った クラウド連携

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()  分散サーバとの接続を切ります。

Page 38: mrubyを使った クラウド連携

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プログラム

Page 39: mrubyを使った クラウド連携

39

ま と め

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

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

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

Page 40: mrubyを使った クラウド連携

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

40