nerusi ruby メタプログラミング

Post on 28-May-2015

559 Views

Category:

Documents

1 Downloads

Preview:

Click to see full reader

TRANSCRIPT

家電とRubyの最高にいい関係

CACAnet Fukuoka/近畿大学 山崎重一郎

mrubyボードで p 家電につぶやき機能 p 日本の電力問題にアプローチ p エンドユーザプログラミング

p OSのオーバーヘッドなしてにハードを直接触れる p 家電にhttpアクセス機能がつく

AI搭載家電

http http

mrubyボード

mrubyボード搭載家電

寝室の掃除 終わったなっしー

掃除機のつぶやきビッグデータ

寝室の掃除終わったし

居間を掃除中

キッチンに到着したし

何かにからまったし

寝室のドアが閉まっているし

日本中のルンバのつぶやきを集める

太郎の部屋に入れないし

ねるし

仮想発電所 効果的節電=発電

ねるし

ねるし

ねるし

ねるし

ねるし

今は寝ないで!

近畿大学/福岡CSK 電力需給

フクオカRuby大賞奨励賞

スマートグリッドとは p 目的(電力の同時同量制御) 電力需給バランス調は需要側の協力が重要

p 方法 電力網を情報技術で制御 莫大な投資が必要

スマートグリッドの問題 p でも 電力需要自体はどうやって制御するの?

スマートグリッドなんてなくても

p 最下流の家電が インターネットに情報を上げ リアルタイムに家電を制御できれば それでいいんじゃない?

インターネット

p 利用者に伝えるだけでも効果がある p 充電機能付きにすると逆制御も可能

日本中のエレベータがつぶやけば

2階なら階段使えば

一人かあ

今電力足りてないし

7人かあ

一人かあ

2人かあ

今は寝ないで! 今は寝ないで!

ぎざぎざが大きいほど、発電効率が悪い プラス側だと、消費電力が増加中

仮想発電所

mruby p 組込みデバイス用Ruby p httpアクセスが1行で書ける SimpleHttp.new("157.13.59.2",80){|h|h.get("/robots/1/tweets/1", {})}

p OSが無いので、リアルタイム処理が軽い p センサー、アクチュエータ関連ライブラリ豊富

シリアル通信、I2C、SPI、サーボのPWM制御

ルンバはAPIを公開している GND

Rx Tx

16V

Roomba Serial Command Interface (SCI)

p 移動 前進、後退、回転、...

p 歌う p センサー 崖、壁、ドックを探す、ゴミ検出、モータ異常、...

p 制御関係 電圧、電流、充電状況、温度

3Dプリンタで作成したルンバケース p  mrubyボードenziを搭載し、ルンバをhttp通信可能に p  無線LANでつぶやけるようにした

ECHONET規格家電 p panasonic、東芝、SONY、デンソー、日立、京セラ、シャープ、NEC、富士通、...

洗濯乾燥機API p  蓋が閉じてるか p  洗濯コース

p  水流設定 p  脱水回転設定

p  すすぎ回数 p  乾燥度設定 p  つけおき工程設定

p  ...

洗濯乾燥機API p  蓋が閉じてるか p  洗濯コース

p  水流設定 p  脱水回転設定

p  すすぎ回数 p  乾燥度設定 p  つけおき工程設定

p  ...

ドメイン指向言語(DSL) p RubyはDSLが作りやすい言語

Ruby on Rails Rake

RSpec ...

p メタプログラミングが得意

エンドユーザプログラミング p 設計方針 ドメイン指向言語 学習不用(直感的にだいたいわかる) 心理的バリアを注意深く除去する

学習不用(?) p テンプレートの修正型 p 例を見ると文法がなんとなくわかる p 改造の方法の例もわかる p 自分の意図がちゃんと伝わればいい

まずロボットに名前をつける =インスタンス生成

p デフォルトの提示(変更可能箇所の表示)

p ユーザ定義の例

p 結果 Robotクラスのインスタンスが生成され     「るん太」メソッドで呼び出せる

ロボットの名前 "るんば"

ロボットの名前 "るん太"

るん太 =>Robotクラスのインスタンスが返ってくる

define_methodで ロボットの名前メソッドを動的に生成

実際のプログラム class Robot

attr :name def initialize(name) @name=name end end def ロボットの名前(name) define_method(name) {Robot.new(name)} end

p ベースステーションからの道順を記憶する

リビング

子供部屋

寝室

ダイニング

るん太.部屋を教える "寝室"

(1) リビングにルンバを置く (2) 上記の設定プログラム実行 (3) ルンバの復帰経路の逆順が リビングへの経路

ベースステーション

ロボットに部屋をおぼえさせる

るん太.部屋を教える "リビング"

プログラム ユーザが書く部分

class Robot attr :name, :route def initialize(name) @name=name @route={} end def 部屋を教える(room) puts "#{room}とベースステーションとの道順をおぼえるなっしー" @route[room]=[] #実際には、ここでロボットからの道順を得る end end def ロボットの名前(name) define_method(name) {Robot.new(name)} end

るん太.部屋を教える "リビング"

p 時刻になると掃除を開始する

リビング

子供部屋

寝室

ダイニング

るん太.時 16 do 掃除する "リビング" 掃除する "寝室" end

ベースステーション

ロボットに時刻起動

るん太.時 17 do 掃除する "ダイニング" 掃除する "寝室" 掃除する "子供部屋" 掃除する "リビング" end

ブロックをcallする class Robot attr :name, :route def initialize(name) @name=name @route={} end def 時(time, &b) b.call(time) end end def 掃除する(room) puts "#{room}掃除終わったなっしー" end def ロボットの名前(name) define_method(name) {Robot.new(name)} end

るん太.時 14 do 掃除する "リビング" end

修飾語の文法

るん太.金曜日.時 16 do 掃除する "リビング" 掃除する "寝室" end

p 条件、繰り返しなど るん太.毎日.時 16 do 掃除する "リビング" 掃除する "寝室" end

洗濯機 p 洗濯機の名前をつけて ロボットの名前 "あらいくまもん"

p 設定を教える 洗剤 "粉" 注水 "多め" 浸け置き分 20 洗い.弱め分 3 洗い.普通分 6 ためすすぎ回 2 脱水分 6

浸け置き 終わったモン

当然ですが、 複雑なことをするには複雑な文法になる

p でも、テンプレートは助けになる p 変更できる場所、選択肢はわかる p 辞書は事前に整備できる p 制御構造は、副詞、形容詞、時制に p 仮定法の表現も、物語風に(?)

学習不用な言語にむけて p テンプレートの修正型 p 例を見ると文法がなんとなくわかる p 改造の方法の例もわかる p 自分の意図がちゃんと伝わればいい

エンド・ユーザ・プログラミング

p 人工知能搭載家電の発展 p どうやって家電とお話するか? p Siriみたいな自然言語? p 簡易プログラミング言語の方が気持ちいいんじゃない?

top related