129
Yuichiro MASUI <[email protected]> AIR+BlazeDS+Ruby ActionScript3+Ruby+J2EE+Javascript.....

AIR+Blaze+Ruby

Embed Size (px)

DESCRIPTION

 

Citation preview

Page 1: AIR+Blaze+Ruby

Yuichiro MASUI <[email protected]>

AIR+BlazeDS+RubyActionScript3+Ruby+J2EE+Javascript.....

Page 2: AIR+Blaze+Ruby

自己紹介

Page 3: AIR+Blaze+Ruby
Page 4: AIR+Blaze+Ruby

masuidrive現在フリーランス10分Railsムービー

アバウトミー / PingKingPukiWiki

3月に起業で渡米

Page 5: AIR+Blaze+Ruby

お題

Page 6: AIR+Blaze+Ruby

ビジネスメッセンジャー

Page 7: AIR+Blaze+Ruby

専用のクライアントログ機能会議室機能

Page 8: AIR+Blaze+Ruby

専用のクライアントはAIRで作る

Page 9: AIR+Blaze+Ruby

Adobe AIR

Page 10: AIR+Blaze+Ruby

インターネットの技術を使ってデスクトップアプリを

作る環境

Page 11: AIR+Blaze+Ruby

ActionScript3+MXMLHTML+Javascript

Ajaxはほとんどそのまま動く

Page 12: AIR+Blaze+Ruby

現在ベータ3日本語処理に難あり

Page 13: AIR+Blaze+Ruby

ブラウザと違いセキュリティ上の制限は無い

Page 14: AIR+Blaze+Ruby

SQLiteを内蔵しているのでビジネスアプリにも向いている

Page 15: AIR+Blaze+Ruby

メッセージングはBlazeDSを使おう

Page 16: AIR+Blaze+Ruby

Adobeがリリースしたオープンソースの

メッセージングサーバ

Page 17: AIR+Blaze+Ruby

元々はLiveCycle Data Serviceとして提供されていた機能からリモーティングと

メッセージングを切り出したもの

Page 18: AIR+Blaze+Ruby

Tomcat6で動く

Page 19: AIR+Blaze+Ruby

リモーティング

Page 20: AIR+Blaze+Ruby

Tomcat上のメソッドを外部のActionScriptから

簡単に呼び出せる

Page 21: AIR+Blaze+Ruby

それってRMI...それってdRuby...

Page 22: AIR+Blaze+Ruby

メッセージング

Page 23: AIR+Blaze+Ruby

クライアント間でメッセージのやり取りができる

Page 24: AIR+Blaze+Ruby

シリアライズしたActionScriptのオブジェクト

をメッセージとして扱う

Page 25: AIR+Blaze+Ruby

簡単なものならコードを書かないでも動く

Page 26: AIR+Blaze+Ruby

でも私、Java分からない...

Page 27: AIR+Blaze+Ruby

秘密兵器 JRuby

Page 28: AIR+Blaze+Ruby

JavaVM上で動くRuby

Page 29: AIR+Blaze+Ruby

多分BlazeDSもJRubyから呼び出せるはず

Page 30: AIR+Blaze+Ruby

Railsと組み合わせてログを管理

Page 31: AIR+Blaze+Ruby

AIR

BlazeDS

AIR

JRuby on Rails

ブラウザ

Page 32: AIR+Blaze+Ruby

言語 UIAIR

(Flash)AIR

(HTML)

BlazeDS

Rails

ActionScript3 MXML

Javascript HTML

Java ー

Ruby HTML

Page 33: AIR+Blaze+Ruby

言語 UIAIR

(Flash)AIR

(HTML)

BlazeDS

Rails

ActionScript3 MXML

Javascript HTML

Java ー

Ruby HTML

Page 34: AIR+Blaze+Ruby

言語 UIAIR

(Flash)AIR

(HTML)

BlazeDS

Rails

ActionScript3 MXML

Javascript HTML

Java ー

Ruby HTML

まて。全部違わないか?

Page 35: AIR+Blaze+Ruby

なんかむちゃくちゃな組み合わせな気がしてきた

Page 36: AIR+Blaze+Ruby

まずはAIR間で動くメッセンジャーを作ろう

Page 37: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

Page 38: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

Page 39: AIR+Blaze+Ruby

クライアント間のメッセージ交換はXMLだけで作れる

Page 40: AIR+Blaze+Ruby

まずはBlazeDSでメッセージングサーバを

立てる

Page 41: AIR+Blaze+Ruby
Page 42: AIR+Blaze+Ruby

最新のβ版をダウンロードそして展開

Page 43: AIR+Blaze+Ruby

Tomcatも付属しているのですぐに起動可能

tomcat/webapps/blazedsにひな形がある

Page 44: AIR+Blaze+Ruby

$ cp -R tomcat/webapps/blazeds \ tomcat/webapps/instantmessenger

ひな形をコピー後service-config.xml

messaging-config.xmlを書き換える

Page 45: AIR+Blaze+Ruby

<?xml version="1.0" encoding="UTF-8"?><service id="message-service" class="flex.messaging.services.MessageService"> <adapters> <adapter-definition id="actionscript" class="flex.messaging.services.messaging.adapters.ActionScriptAdapter" default="true" /> <adapter-definition id="jms" class="flex.messaging.services.messaging.adapters.JMSAdapter"/> </adapters> <default-channels> <channel ref="my-streaming-amf"/> <channel ref="my-polling-amf"/> </default-channels> <destination id="chat"/></service>

messaging-config.xml

Page 46: AIR+Blaze+Ruby

channelは送信方法

Page 47: AIR+Blaze+Ruby

BlazeDSはクライアントとのやり取りで複数のプロトコル

をサポートしている

Page 48: AIR+Blaze+Ruby

<default-channels> <channel ref="my-streaming-amf"/> <channel ref="my-polling-amf"/></default-channels>

Page 49: AIR+Blaze+Ruby

steamingは専用プロトコルステートレスで高速だけどproxyなどが超えられない

Page 50: AIR+Blaze+Ruby

pollingはcomet方式httpをkeep-aliveでTCPセッションを繋いだまま定期

的にリクエストを送出HTTPなのでProxyも超えら

れる

Page 51: AIR+Blaze+Ruby

どちらを使っているか開発者が意識する必要がない

Page 52: AIR+Blaze+Ruby

destinationは部屋名

Page 53: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

Page 54: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

Page 55: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

steam pollingsteam

chat

Page 56: AIR+Blaze+Ruby

$ ./tomcat/bin/startup.sh

Page 57: AIR+Blaze+Ruby
Page 58: AIR+Blaze+Ruby

これでこのサーバでメッセージ交換ができるようになった

Page 59: AIR+Blaze+Ruby

AIRクライアントを作ろう

Page 60: AIR+Blaze+Ruby

Flex builder3 betaが公開されているのこれを使うFlex SDKでも作れるけど無理はしない方がいい

Page 61: AIR+Blaze+Ruby

ファイル→新規→Flex プロジェクト

Page 62: AIR+Blaze+Ruby

アプリケーションサーバは「なし」

Page 63: AIR+Blaze+Ruby

アプリケーションサーバを指定するとXMLからサーバの

設定を引っ張ってくれる

Page 64: AIR+Blaze+Ruby

クライアントプログラムで変更できるようにしたいので

あえて使わない

Page 65: AIR+Blaze+Ruby

mxmlをデザインモードで開いて

Page 66: AIR+Blaze+Ruby
Page 67: AIR+Blaze+Ruby

UIは適当に出来上がり

Page 68: AIR+Blaze+Ruby

AIRとBlazeDSを繋げる

Page 69: AIR+Blaze+Ruby

Consumer - 受け手Producer - 送り手

Page 70: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

steam pollingsteam

chat

Page 71: AIR+Blaze+Ruby

AIR

BlazeDS

AIR AIR

steam pollingsteam

chat

Producer Consumer Consumer

Page 72: AIR+Blaze+Ruby

AIR

BlazeDS

Page 73: AIR+Blaze+Ruby

AIR

channelsteam polling

BlazeDS

Page 74: AIR+Blaze+Ruby

AIR

channelsteamProducer polling

BlazeDS

Page 75: AIR+Blaze+Ruby

AIR

channelsteamProducer polling

distination: chat{ message: “hoge” }

BlazeDS

Page 76: AIR+Blaze+Ruby

AIR

channelsteamProducer polling

distination: chat{ message: “hoge” }

BlazeDS

chat

Page 77: AIR+Blaze+Ruby

private var channels:Array = [];

var streaming_amf:StreamingAMFChannel = new StreamingAMFChannel("my-streaming-amf", "http://127.0.0.1:8400/instantmessenger/messagebroker/streamingamf");channels.push(streaming_amf);

var polling_amf:AMFChannel = new AMFChannel("my-polling-amf", "http://127.0.0.1:8400/instantmessenger/messagebroker/amfpolling");polling_amf.pollingEnabled = true;polling_amf.pollingInterval = 3000;channels.push(polling_amf);

channelssteam polling

Page 78: AIR+Blaze+Ruby

メッセージの接続先/コンテキスト/messagebroker/チャンネル

Page 79: AIR+Blaze+Ruby

var prod:Producer = new Producer();

prod.destination = "chat"; prod.channelSet = new ChannelSet(); for(index in channels) { prod.channelSet.addChannel(channels[index]);}prod.connect();

Producer(chat)

channels

Page 80: AIR+Blaze+Ruby

メッセージを送ってみる

Page 81: AIR+Blaze+Ruby

var message:IMessage = new AsyncMessage();message.body = new Object(); message.body.message = "hoge";

prod.send(message);

Producer(chat)

{ message: “hoge” }

Page 82: AIR+Blaze+Ruby

メッセージはシリアライズできる任意の

オブジェクトを送ることができる

Page 83: AIR+Blaze+Ruby

送信部分は出来上がり

Page 84: AIR+Blaze+Ruby

続いて受信部分

Page 85: AIR+Blaze+Ruby

AIR

BlazeDS

chat

Page 86: AIR+Blaze+Ruby

AIR

channelsteam polling

BlazeDS

chat

Page 87: AIR+Blaze+Ruby

AIR

channelsteamConsumer polling

BlazeDS

chat

Page 88: AIR+Blaze+Ruby

AIR

channelsteamConsumer polling

log.value += message

BlazeDS

chat

ハンドラー登録

Page 89: AIR+Blaze+Ruby

AIR

channelsteamConsumer polling

log.value += message

BlazeDS

chat

ハンドラー登録

{ message: “hoge” }

Page 90: AIR+Blaze+Ruby

AIR

channelsteamConsumer polling

log.value += message

BlazeDS

chat

ハンドラー登録

呼び出し

{ message: “hoge” }

Page 91: AIR+Blaze+Ruby

var cons:Consumer cons = new Consumer(); cons.destination = "chat"; cons.channelSet = new ChannelSet();for(var index:String in channels) { cons.channelSet.addChannel(channels[index]);}cons.addEventListener(MessageEvent.MESSAGE, messageHandler);

Consumer(chat)

channelsmessageHandler

Page 92: AIR+Blaze+Ruby

function messageHandler(e:MessageEvent):void{ log.text += e.message.body.message + "\n"; }

messageHandler

Page 93: AIR+Blaze+Ruby

動かしてみよう

Page 94: AIR+Blaze+Ruby
Page 95: AIR+Blaze+Ruby
Page 96: AIR+Blaze+Ruby
Page 97: AIR+Blaze+Ruby

クリック

Page 98: AIR+Blaze+Ruby

クリック

Page 99: AIR+Blaze+Ruby

直接ではなくBlazeDSを通して通信

Page 100: AIR+Blaze+Ruby

Rubyからもメッセージを送ってみよう

Page 101: AIR+Blaze+Ruby

サーバでProducerを動かせばOK

Page 102: AIR+Blaze+Ruby

でもJavaじゃなくてRubyで

Page 103: AIR+Blaze+Ruby

JRuby

Page 104: AIR+Blaze+Ruby

TomcatにJRubyをインストールする

Page 105: AIR+Blaze+Ruby

Tomcat6へJRubyを導入する方法は下記を参考に

しましたhttp://www.okisoft.co.jp/

esc/ruby/jservlet Servlets in JRuby on Tomcat

Page 106: AIR+Blaze+Ruby

RubyでServletが書けます

Page 107: AIR+Blaze+Ruby

もちろん普通にBlazeDSも呼び出せます

Page 108: AIR+Blaze+Ruby

Rubyからメッセージを投稿Send.rb

Page 109: AIR+Blaze+Ruby

include_class "flex.messaging.MessageBroker"include_class "flex.messaging.util.UUIDUtils"include_class "flex.messaging.messages.AsyncMessage"

必要なクラスを読み込み

Page 110: AIR+Blaze+Ruby

include_class "flex.messaging.MessageBroker"include_class "flex.messaging.util.UUIDUtils"include_class "flex.messaging.messages.AsyncMessage"

class Send < HttpServlet def doPost(req, res) res.content_type = 'text/html; charset="UTF-8"' // ~ ここに処理を追加 ~ wf = res.writer wf.println 'OK' endend

なにもしないSendクラス

Page 111: AIR+Blaze+Ruby

broker = MessageBroker.getMessageBroker(nil)

msg = AsyncMessage.newmsg.setDestination "chat"msg.setClientId UUIDUtils.createUUIDmsg.setMessageId UUIDUtils.createUUIDmsg.setTimestamp Time.now.to_f*1000

message_body = req.get_parameter("message") || ""msg.setBody({'message' => message_body})broker.routeMessageToService(msg, nil)

メッセージ送信部分

Page 112: AIR+Blaze+Ruby
Page 113: AIR+Blaze+Ruby
Page 114: AIR+Blaze+Ruby

メッセージ送信できあがり

Page 115: AIR+Blaze+Ruby

Rubyからでも簡単にBlazeDSが扱える

Page 116: AIR+Blaze+Ruby

クライアントがActionScript3サーバがJ2EEだと

言語の違いが大きすぎる

Page 117: AIR+Blaze+Ruby

AS3と組み合わせるならRubyの方が合ってる

Page 118: AIR+Blaze+Ruby

さて次はログを取る機能を実装

Page 119: AIR+Blaze+Ruby

続きはWebで

Page 120: AIR+Blaze+Ruby

「Adobe Developers Connection」に掲載予定

Page 121: AIR+Blaze+Ruby

BlazeDSの正式版が出てからだから3月になるかも

Page 122: AIR+Blaze+Ruby

今回の資料とソースはblog.masuidrive.jpで

Page 123: AIR+Blaze+Ruby

感想

Page 124: AIR+Blaze+Ruby

既にLCDSとして枯れたコードをベースにして

メッセージングができるのは大変うれしい

Page 125: AIR+Blaze+Ruby

JRubyとの合わせも簡単

Page 126: AIR+Blaze+Ruby

でもそもそもJRubyが....

Page 127: AIR+Blaze+Ruby

AIRにはグラフ系コンポーネントも揃っているので

Page 128: AIR+Blaze+Ruby

ログやノーティファイアを作るのが面白そう

Page 129: AIR+Blaze+Ruby

AjaxもサポートしているのでWebでリアルタイムインタフェースを作るときには

検討価値大