SlideShare a Scribd company logo
1 of 52
Download to read offline
Sails WorkShop (4) 
立命館大学 経営学部3回生  
井口智勝
SailsWorkShop 
の目的 
<for All> 
Watnowにリアルタイム通信技術を導入する 
<for One> 
取り敢えず、書けるようになること。(スピード重視) 
ある程度、体系的な知識化もしていく。
Sails WorkShop 
Menu 
1回目:Sailsって何?CRUDappを作ろう! 
2回目:Policiesの使い方 ~sessionや認証~ 
3回目:appをリアルタイム化しよう! 
4回目:Sails✕Marionette 
5回目:細かい部分の共有など...
※今日は結構 
コアにせまります。
2014/12/1(Mon) 
今日のアウトライン 
Sails✕Marionetteでどう変わるか? 
今回使うMarionetteアプリの説明 
Sails✕Marionetteアプリを作ろう! 
4回のWorkShopで触れなかった重要部分
Sails✕Marionetteで 
どう変わるか? 
httpリクエスト 
Sails 
サーバーブラウザ 
htmlとか全て送信 
役割重い
Sails✕Marionetteで 
どう変わるか? 
Sails 
サーバーMarionette 
ブラウザ 
非同期通信 
JSON 
{ user: ‘iguchi’, age: ’21'} 
役割軽い!Json返すだけのサーバー
Sails✕Marionetteで 
どう変わるか? 
Sailsサーバーは常にres.jsonでOK! 
viewフォルダ必要なくなる。 
assetsフォルダもいらない。 
リクエストされるURLは決まっているので、blueprintsは全 
てfalseでよい。(というかセキュリティ上切るべき。仕組み 
がわかっているなら、利用することでコード量を減らせる。今 
回はrestだけ使います。)
2014/12/15(Mon) 
今日のアウトライン 
Sails✕Marionetteでどう変わるか? 
今回使うSailsChatアプリの説明 
Sails✕Marionetteアプリを作ろう! 
4回のWorkShopで触れなかった重要部分
今回使う 
SailsChatアプリの説明 
https://github.com/igtm/ 
SailsChatFront 
https://github.com/igtm/SailsChatBack 
両者をgrunt sailsliftで立ち上げてみる 
と、、、? 
オリジナルアプリです!!
2014/12/15(Mon) 
今日のアウトライン 
Sails✕Marionetteでどう変わるか? 
今回使うMarionetteアプリの説明 
Sails✕Marionetteアプリを作ろう! 
4回のWorkShopで触れなかった重要部分
Sails✕Marionette 
でappを作ろう! 
https://github.com/igtm/SailsChatFront 
https://github.com/igtm/SailsChatBack
環境設定
front-backの分離に 
必要な環境設定 
sails.io.jsをmarionetteのvenderに入 
れ,init.jsで定義。使うときは、各ファイルで定 
義する 
sails.io.jsのL615を、sailsがある場所に変 
更。 
config/cors.js allRoutes: true
アプリの大枠説明
ページ遷移 
LoginPage TopPage 
Room1 
Room2 
Room3
ModelとController 
Marionette Sails 
User 
Chat 
User 
Chat 
(永続化する 
なら必要) 
User 
Controller 
Chat 
Controller 
Room 
Controller 
多 
多 
Room 
多1 
Room 
(roomを作成削 
除するようなら 
必要)
Controllerの役割 
User 
Controller 
Chat 
Controller 
Room 
Controller 
Userの作成、ログイン 
Chatの送信 
Roomの入室、退室管理
Socketによる、データの 
リアルタイム受け渡し部分
UserModel
UserModel 
marionette Sails 
io.socket.get() 
io.socekt.on(‘user’) 
User.subscribe() 
OK!変更があったら通知するね 
[create,destroy] 
User.publishCreate() 
switch(msg.verb) 
- created 
- destroyed 
subscribe 
私はこういうものです。 
新しいユーザーが 
ログインしたよ! 
了解!通知出します! 
User.publishDestroy() 
ユーザーが 
ログアウトしたよ!
UserModel 
左上(フロント側) 
views/page/LoginItemV.js: L40 
modelのsubscribeメソッド(自作)で 
io.socket.postしてサーバーに購読させる。
UserModel 
右上(サーバー側) 
UserController.jsのsubscribe 
L17: 他人のpublishCreateを購読するwatch 
L18: 他人の変更(UserModelの 
autosubscribeに記載)を購読する。
UserModel 
右下(サーバー側) 
UserController.jsのsubscribe 
L20: createしたと発行
UserModel 
左下(フロント側) 
modules/socket_manager.js 
L16: userに変更があったら呼び出し 
L19: verbごとに処理を分岐
RoomModel
RoomModel 
クライアントサーバー 
io.socket.post() 
io.socekt.on(‘room’) 
Room.subscribe() 
Room.publishAdd() 
switch(msg.verb) 
- addedTo 
- removedFrom 
- messaged 
enter 
私はこういうものです。OK!変更があったら通知するね 
[add:users, remove:users,message] 
新しいユーザーが 
入室したよ! 
了解!通知出します! 
Room.message() 
ユーザーが 
投稿したよ!
RoomModel 
左上(フロント側) 
TopItemV.js L43 
room/:room_id/users/:idにpost
RoomModel 
右上(サーバー側) 
RoomController.js L10 enter 
L13: room_idで購読。購読する動作は 
RoomModelのautosubscribeに記載
RoomModel 
右下(サーバー側) 
addToとremoveFromは後で説明 
messageは ChatController: L15
RoomModel 
左下(フロント側) 
modules.socket_manager 
L17: roomに変更があったら呼び出し 
L28: verbごとに処理を分岐
取り敢えずここまで理解し 
ていればOK!
細かい説明
ModelのAssociations 
難易度:★★★★★★★★★★★★★ 
大袈裟(笑)
ModelのAssociations 
リレーショナル・データベースのジョイントテー 
ブルのようなものを作る機能
ModelのAssociations 
仮想属性を設定 
相手が1ならmodel: ‘Model名’ 
相手が多ならcollection: ‘Model名’ 
via: ‘相手の仮想属性名’ 
多対多なら片方に優先設定 dominant: true
ModelのAssociations 
modelを結合してデータを得るには? 
populate(‘仮想属性’)でmodelを引っ張って 
きてくれる。
Blueprintsの 
addとremove 
難易度:★★★★★
Blueprintsの 
add toとremove from 
post /model/:id/collection名 
で指定実体modelのcollectionにidを追加 
delete /model/:id/collection名 
で指定実体modelのcollectionにidを削除
post /model/:id/collection名/:id 
勝手に:idを追加してくれて、 
publishAddまでしてくれる
豆知識
購読の階層 
Subsequent calls to 
subscribe are 
cumulative 
add:users 
今回は特に無しcreate 
remove:users 
destroy 
message 
UserModel 
ログイン時room入室時 
ChatModel 
Chat投稿時 
RoomModel
共有化できるモジュール
Socekt_manager 
Socketの変更を受信して、各種命令を出すオ 
リジナルmodule 
msg.verbで振り分けて、処理。 
Page_managerは現在どのページにいるかな 
どを取得するオリジナルプラグイン
Finished!! 
お疲れ様でした!
2014/12/15(Mon) 
今日のアウトライン 
Sails✕Marionetteでどう変わるか? 
今回使うMarionetteアプリの説明 
Sails✕Marionetteアプリを作ろう! 
4回のWorkShopで触れなかった重要部分
非同期I/O処理 
出典:使いたくなる理由2:非同期I/O処理のnode.jsがサーバーリソースを抑える
非同期I/O通信 
a() 
b() 
c() 
I/O処理に関して上記関数が順番に実行される保証は 
ない。
非同期I/O通信 
a(b(c())) 
コールバックとして書くことで順番が担保される。 
⇒コールバック地獄にならないように注意。
URL一覧 
https://github.com/igtm/ 
SailsChatFront 
https://github.com/igtm/ 
SailsChatBack 
https://github.com/balderdashy/ 
sailsChat

More Related Content

Similar to Sails workshop4

ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
Tak Inamori
 
麦乃大学2回 MODX x MicrosoftWebMatrix
麦乃大学2回 MODX x MicrosoftWebMatrix麦乃大学2回 MODX x MicrosoftWebMatrix
麦乃大学2回 MODX x MicrosoftWebMatrix
Kei Mikage
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組みモバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
MorioImai
 

Similar to Sails workshop4 (20)

Movable Type for AWS Hands-on
Movable Type for AWS Hands-onMovable Type for AWS Hands-on
Movable Type for AWS Hands-on
 
Mobylet20100613
Mobylet20100613Mobylet20100613
Mobylet20100613
 
App controllerとwindows azure packで作る大規模プライベートクラウド
App controllerとwindows azure packで作る大規模プライベートクラウドApp controllerとwindows azure packで作る大規模プライベートクラウド
App controllerとwindows azure packで作る大規模プライベートクラウド
 
ABC2012Spring 20120324
ABC2012Spring 20120324ABC2012Spring 20120324
ABC2012Spring 20120324
 
Lt 110205
Lt 110205Lt 110205
Lt 110205
 
麦乃大学2回 MODX x MicrosoftWebMatrix
麦乃大学2回 MODX x MicrosoftWebMatrix麦乃大学2回 MODX x MicrosoftWebMatrix
麦乃大学2回 MODX x MicrosoftWebMatrix
 
やはりお前らのMVCは間違っている
やはりお前らのMVCは間違っているやはりお前らのMVCは間違っている
やはりお前らのMVCは間違っている
 
JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門JavaScript使いのためのTypeScript実践入門
JavaScript使いのためのTypeScript実践入門
 
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
Fundamentals of Swift & Redux (ReduxとSwiftの組み合わせ)
 
作られては消えていく泡のように儚いクラスタの運用話
作られては消えていく泡のように儚いクラスタの運用話作られては消えていく泡のように儚いクラスタの運用話
作られては消えていく泡のように儚いクラスタの運用話
 
ぼく(たち)のかんがえた最新のJS開発環境 #scripty04
 ぼく(たち)のかんがえた最新のJS開発環境 #scripty04 ぼく(たち)のかんがえた最新のJS開発環境 #scripty04
ぼく(たち)のかんがえた最新のJS開発環境 #scripty04
 
今日から始める LotusScript - Domino クラスライブラリの使い方
今日から始める LotusScript - Domino クラスライブラリの使い方今日から始める LotusScript - Domino クラスライブラリの使い方
今日から始める LotusScript - Domino クラスライブラリの使い方
 
Openshift 20191128
Openshift 20191128Openshift 20191128
Openshift 20191128
 
Openshift 20191108
Openshift 20191108Openshift 20191108
Openshift 20191108
 
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組みモバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
モバイルゲームの「大規模な開発」かつ「高頻度の更新」を実現するための開発環境整備の取り組み
 
今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)
今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)
今日から始める LotusScript - Domino クラスライブラリの使い方(Version 1.1)
 
Enterprise Redmine
Enterprise RedmineEnterprise Redmine
Enterprise Redmine
 
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
JINS MEME DEVELOPER HANDS-ON (Monaca / Apache Cordova編)
 
Net commonsアドオンモジュールセミナー第4回小ネタ集
Net commonsアドオンモジュールセミナー第4回小ネタ集Net commonsアドオンモジュールセミナー第4回小ネタ集
Net commonsアドオンモジュールセミナー第4回小ネタ集
 
小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える小さく早い改善がスマホのサービス開発を変える
小さく早い改善がスマホのサービス開発を変える
 

Sails workshop4