iPad,iPhone App 複数のサーバー接続先の設定と切 …...iPhone QR コードを読み込んで ユーザーIDが設定できます。ローカルに帳票保存時のサーバー接続先切り替え
Webはどんどん進化している -...
Transcript of Webはどんどん進化している -...
![Page 1: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/1.jpg)
2014年2月1日Copyright (C)2014 T. Osaka All rights reserved.
Webはどんどん進化している
クロスドメインアクセス node.js リアルタイム双方向通信 WebRTC
![Page 2: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/2.jpg)
Webの進化は、いかにサーバーとやり取りするかにある。
第1世代:GET&POSTを用いたHTTP/1.1通信(はじまり)第2世代:JavaScriptのXMLHttpRequestによる非同期な通信(Web2.0) WebAPI ページ・リロード クロスドメイン第3世代:HTML5による新しいWeb(これから) WebStorage、IndexedDB WebSocket Socket.ioによるリアルタイムな双方向通信 SPDY HTTP/2.0
2014年2月1日
Webの進化
Copyright (C)2014 T. Osaka All rights reserved.
2
![Page 3: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/3.jpg)
ブラウザー サーバー
2014年2月1日
環境の変化
Copyright (C)2014 T. Osaka All rights reserved.
ネットワーク
3
![Page 4: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/4.jpg)
マッシュアップは、複数の異なるサービスを組み合わせて新しいサービスを創り出す技術。GoogleMapをはじめ、幅広い分野で、手軽に利用できるサービスが提供されている。
2014年2月1日
マッシュアップ再考
Copyright (C)2014 T. Osaka All rights reserved.
マッシュアップが流行ったころ、マッシュアップを利用すると、企業内情報を集約したダッシュボードを作ることも可能と言われたが、その後・・・
4
出典:http://www.kobelcosys.co.jp/column/itwords/45/
![Page 5: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/5.jpg)
2009年生まれ「V8」Javascriptエンジンの上で動くJavascript言語ネットワーク通信ライブラリをベースに、
各種ライブラリが充実しているC10K問題でクローズアップされた
シングルスレッド、イベント駆動型、非同期
特徴(1)使いやすい(2)高速(3)拡張性(スケーラビリティ)が高い
2014年2月1日
node.js
Copyright (C)2014 T. Osaka All rights reserved.
5
![Page 6: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/6.jpg)
node.jsが早い理由イベントループは、実行する処理をキューにいったん格納し、順にイベントハンドラを実行。ノンブロッキングI/Oを使い、イベントの完了を待たずに次イベントハンドラを実行させる。イベントハンドラ完了結果は、登録したコールバック関数により受け取る。
2014年2月1日
node.jsの仕組み
Copyright (C)2014 T. Osaka All rights reserved.
6
出典:http://www.atmarkit.co.jp/ait/articles/1103/23/news101_2.html
![Page 7: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/7.jpg)
レンタルビデオ屋で例えると
スレッド・モデル・お客様が持ってきた空パッケージを受け付け、バーコードにより、在庫を確認し、あれば、倉庫からビデオパッケージを持ってきて、・レンタル料を受け取り、貸し出しをする。混んで来たら、レジと店員を増やす。イベントループ・モデル・お客様は空パッケージを受付窓口に置き、引換券を受け取る。倉庫から対応するビデオパッケージを持ってきて、・支払窓口で、番号を呼び、レンタル料を受け取り、貸し出しをする。混んで来たら、一生懸命走り回る。
2014年2月1日
node.jsの動き
Copyright (C)2014 T. Osaka All rights reserved.
7
出典:日経コンピュータ2011.12.22号
![Page 8: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/8.jpg)
非同期コードvar fs = require('fs');fs.readFile('./filetest.js', 'utf8', function(err, text) {//イベントハンドラの実行とコールバック処理 console.log("非同期\n"+text);});
同期っぽいコードvar fs = require('fs');var text = fs.readFileSync('./filetest.js', 'utf8');console.log("同期\n"+text);
2014年2月1日
node.jsのコードサンプル ファイル読込
Copyright (C)2014 T. Osaka All rights reserved.
8
![Page 9: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/9.jpg)
var express = require('express');var http = require('http');var path = require('path');var app = express();
app.configure(function(){app.set('port', process.env.PORT || 3000);app.use(express.favicon());app.use(express.logger('dev'));app.use(express.bodyParser());app.use(express.methodOverride());app.use(express.static(path.join(__dirname, 'public')));
});
http.createServer(app).listen(app.get('port'), function(){console.log("Express server listening on port " + app.get('port'));
});
これだけのコードで、/public以下に置いたHTMLコンテンツが表示できるHTTPサーバーとなる。
2014年2月1日
node.jsのコードサンプル HTTPサーバー
Copyright (C)2014 T. Osaka All rights reserved.
9
![Page 10: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/10.jpg)
var express = require('express');var http = require('http');var path = require('path');var app = express();
app.configure(function(){app.set('port', process.env.PORT || 3000);app.use(express.favicon());app.use(express.logger('dev'));app.use(express.bodyParser());app.use(express.methodOverride());app.use(express.static(path.join(__dirname, 'public')));
});app.post('/httpserv', function(req, res) { if(req.param('mode')=="testJson1"){ // /httpserv?mode=testJson1 res.writeHead(200, {'Content-Type': 'text/javascript; charset="UTF-8"'}); var sdata="var data="+'{"name":"山田太郎","sex":"男","age":"20"}'; res.end(sdata); }});http.createServer(app).listen(app.get('port'), function(){
console.log("Express server listening on port " + app.get('port'));});
2014年2月1日
node.jsのコードサンプル HTTPサーバー
Copyright (C)2014 T. Osaka All rights reserved.
このようにGET、POSTメソッドに対応できる
10
![Page 11: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/11.jpg)
2014年2月1日
JSON 配列
Copyright (C)2014 T. Osaka All rights reserved.
var person={"users":[
{"name":"山田","age":24,"language":["XHTML","CSS"]
},{
"name":"田中","age":25,"language":["PHP","Java"]
},{
"name":"中山","age":26,"language":["JS","jQuery"]
}]};
var s="";for(var i=0;i<person.users.length;i++){ if(person.users[i].name=="山田") s+=person.users[i].name+" "+person.users[i].age +" "+person.users[i].language+"\n";}
alert(s);山田 24 XHTML,CSS
alert(JSON.stringify(person.users[0]));{"name":"山田","age":24,"language":["XHTML","CSS"]}
11
![Page 12: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/12.jpg)
2014年2月1日
JSON 連想配列
Copyright (C)2014 T. Osaka All rights reserved.
var seiza={"牡羊座":{"date":"3/21-4/19","image":"ohitsuji.gif","yomi":"おひつじざ"},"牡牛座":{"date":"4/20-5/20","image":"oushi.gif","yomi":"おうしざ"},"双子座":{"date":"5/21-6/21","image":"futago.gif","yomi":"ふたござ"},"蟹座":{"date":"6/22-7/22","image":"kani.gif","yomi":"かにざ"},"獅子座":{"date":"7/23-8/22","image":"shishi.gif","yomi":"ししざ"},"乙女座":{"date":"8/23-9/22","image":"otome.gif","yomi":"おとめざ"},"天秤座":{"date":"9/23-10/23","image":"tenbin.gif","yomi":"てんびんざ"},"蠍座":{"date":"10/24-11/21","image":"sasori.gif","yomi":"さそりざ"},"射手座":{"date":"11/22-12/21","image":"ite.gif","yomi":"いてざ"},"山羊座":{"date":"12/22-1/19","image":"yagi.gif","yomi":"やぎざ"},"水瓶座":{"date":"1/20-2/18","image":"mizugame.gif","yomi":"みずがめざ"},"魚座":{"date":"2/19-3/20","image":"uo.gif","yomi":"うおざ"}
};
var a="牡羊座";alert(a+" "+seiza[a].date+" "+seiza[a].image);牡羊座 3/21-4/19 ohitsuji.gif
12
![Page 13: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/13.jpg)
2014年2月1日
JSON JSONオブジェクトの生成
Copyright (C)2014 T. Osaka All rights reserved.
JSONオブジェクトの生成 var comment=new Object();
comment.message = "メッセージ";comment.date = new Date();
alert(JSON.stringify(comment));{"message":"メッセージ","date":"2014-02-01T09:00:00.000Z"}
文字列からJSONオブジェクトの生成 var json = '{"message":"メッセージ","date":"2014年2月1日","age":27}'; var comment = JSON.parse(json); alert(JSON.stringify(comment));
{"message":"メッセージ","date":"2014年2月1日","age":27}
JSONは、noSQL DBの必須要件
13
![Page 14: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/14.jpg)
2014年2月1日
クロスドメインへのアクセス
Copyright (C)2014 T. Osaka All rights reserved.
ブラウザーで異なるドメインへのアクセスは禁止されている。では、どのようにしていろいろなクロスサイトへのアクセスが実現できるのか?その必要性は?
14
出典:http://msdn.microsoft.com/ja-jp/library/cc972657(v=vs.95).aspx
![Page 15: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/15.jpg)
ReverseProxy Server(node-http-proxy)
Apache ServerNode Http
Server
HttpProxy
PhantomJS
Network
WebsocketServer
Socket.ioServer
MongoDB
Browser
80
3001 30028011 8002
2014年2月1日
node.jsを中心したデモ環境
Copyright (C)2014 T. Osaka All rights reserved.
15
![Page 16: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/16.jpg)
2014年2月1日
リアルタイム双方向通信
Copyright (C)2014 T. Osaka All rights reserved.
これからのWebでは、リアルタイム双方向通信が熱い。
Websocketは、HTML5の規格で、HTML5対応ブラウザー上で、socket.ioは、ライブラリを組み込み、各種デバイス、各種ブラウザー上で、それぞれリアルタイム双方向通信ができる。
16
![Page 17: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/17.jpg)
2014年2月1日
WebSocket ブラウザー側
Copyright (C)2014 T. Osaka All rights reserved.
<script type="text/javascript">var ws = new WebSocket("ws://localhost:3001"); // socketのopen
ws.onopen = function(v) { // コネクション接続console.log("connection is opened.");
}
ws.onclose = function() { // コネクション切断時console.log("connection is closed.");
};
ws.onmessage = function (data) { // メッセージ受信getMessage(data.data);
}
function sendMessage(msg) { // メッセージ送信ws.send("{message:"+msg+"}");
}</script>
17
![Page 18: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/18.jpg)
2014年2月1日
WebSocket サーバー側
Copyright (C)2014 T. Osaka All rights reserved.
var WebSocketServer = require('ws').Server;var server = http.createServer(function(req, res) { ・・・・ }var wss = new WebSocketServer({server:server});var connections = [];//websocketの接続wss.on('connection', function (ws) {
connections.push(ws);//WebSocket接続情報の保存//受信メッセージのブロードキャスト
ws.on('message', function (data) {data=JSON.parse(data);broadcast(JSON.stringify(data.message));
});//切断イベント
ws.on('close', function () {connections = connections.filter(function (conn, i) {
return (conn === ws) ? false : true;});
});});//メッセージのブロードキャストfunction broadcast(message) {
connections.forEach(function (con, i) {con.send(message);
});};
18
![Page 19: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/19.jpg)
2014年2月1日
Socket.io ブラウザー側
Copyright (C)2014 T. Osaka All rights reserved.
<script type="text/javascript" src="/socket.io/socket.io.js"></script><script type="text/javascript">var socket = io.connect("http://localhost:3000"); // socketのopen
//サーバーから受け取るイベントsocket.on("connect", function () { // コネクション接続
console.log("connection is opened.");})
socket.on("disconnect", function (client) { // コネクション切断console.log("connection is closed.");
});
socket.on("message", function (data) { // メッセージ受信getMessage(data.message);
});
function sendMessage(msg) {socket.emit("message", {message:msg});
}</script>
19
![Page 20: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/20.jpg)
2014年2月1日
Socket.io サーバー側
Copyright (C)2014 T. Osaka All rights reserved.
var socketio = require("socket.io");var server = http.createServer(function(req, res) { ・・・・ }var io = socketio.listen(server);var member={};
//socket.ioの接続io.sockets.on("connection", function (socket) {
if(!member[socket.id])member[socket.id]=socket.id;//socket.id情報の保存
//受信メッセージのブロードキャストsocket.on("message", function (data) {
socket.broadcast.emit("message", {message:data.message});});
//切断イベントsocket.on("disconnect", function () {
console.log("user disconnected "+socket.id);delete member[socket.id];
});});
20
![Page 21: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/21.jpg)
var server = require('http').createServer(function(req, res){ res.writeHead(200, {'Content-Type': 'text/html'}); res.end('server connected');});server.listen(3010);var io = require('socket.io').listen(server);//RedisStoreを読み込みますvar RedisStore = require('socket.io/lib/stores/redis');//redisサーバーの接続先情報を定義しますopts = {host:'10.0.0.200', port:6379};//storeをRedisStoreにし、redisPub, redisSub, redisClientをredisサーバーに向けますio.set('store', new RedisStore({redisPub:opts, redisSub:opts, redisClient:opts}));io.sockets.on('connection', function (socket) { socket.emit('info', { msg: 'welcome' }); socket.on('msg', function (msg) { io.sockets.emit('msg', {msg: msg}); }); socket.on('disconnect', function(){ socket.emit('info', {msg: 'bye'}); });});
2014年2月1日
node.jsによるメッセージング Socket.io Redis
Copyright (C)2014 T. Osaka All rights reserved.
Socket.IOにはRedisStoreというredisに接続情報を保存するオプションがあり、分散されたnodeサーバーが同じredisサーバーを参照して、各nodeの接続情報を共有することができる。出典:Node.jsってなんじゃ?(redisでSocket.IOをスケール) http://memocra.blogspot.jp/2012/11/nodejsredissocketio.html
21
![Page 22: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/22.jpg)
Socket.io API
Redis API
Browser
Redis
Browser
Browser
Socket.io API
Redis API
Browser
Browser
Browser
Socket.io API
Redis API
Browser
Browser
Browser
send
broadast
broadcast
broadcast
publish
subscribe
subsribe
Server A
Server B
Server C
2014年2月1日
redisによるメッセージング
Copyright (C)2014 T. Osaka All rights reserved.
22
![Page 23: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/23.jpg)
Socket.io API
Redis API
Browser
Redis
Browser
Browser
Socket.io API
Redis API
Browser
Browser
Browser
Socket.io API
Redis API
Browser
Browser
Browser
publish
subscribe
subsribe
NginX
send
broadcast
Server A-1
Server A-2
Server A-3
2014年2月1日
redisによるメッセージング
Copyright (C)2014 T. Osaka All rights reserved.
23
![Page 24: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/24.jpg)
2014年2月1日
WebRTC
Copyright (C)2014 T. Osaka All rights reserved.
WebRTC (Web Real-Time Communication)とは、W3Cが提唱するリアルタイムコミュニケーション用のAPIの定義で、プラグイン無しでウェブブラウザ間のボイスチャット、ビデオチャット、ファイル共有ができる。
WebRTC: Wikipediaより引用
24
出典:http://tjun.org/blog/2013/12/webrtc_p2p/
![Page 25: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/25.jpg)
2014年2月1日
WebRTCの主なAPIとできること
Copyright (C)2014 T. Osaka All rights reserved.
getUserMediaマイク・カメラから入力された音声・映像データをWebブラウザーへ取り込むRTCPeerConnectionブラウザー間で音声・映像データを送受信するRTCDataChannelブラウザー間でバイナリーデータを送受信する
テキストチャット、ファイル共有、スクリーン共有、ゲーム、センサーデータフィード、音声・ビデオチャットなどサーバー・ストレージの排除によって、より効率的で高速、安全なWebブラウザー間データ通信
25
![Page 26: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/26.jpg)
2014年2月1日
WebRTCのP2P接続の仕組み
Copyright (C)2014 T. Osaka All rights reserved.
26
出典:http://yosssi.github.io/jscafe15/#/
![Page 27: Webはどんどん進化している - osaka3tSocket.IOにはRedisStoreというredisに接続情報を保存するオプシ ョンがあり、分散されたnodeサーバーが同じredisサーバーを参照](https://reader034.fdocuments.us/reader034/viewer/2022043023/5f3f0224b62a8d339674d904/html5/thumbnails/27.jpg)
ブラウザー サーバー
2014年2月1日
結論 Webはどんどん進化している
Copyright (C)2014 T. Osaka All rights reserved.
ネットワーク
27