Recommended
PDF
Tm forum application_framework_tam_12.5
PDF
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
PDF
Đề Thi Trắc Nghiệm CCNA Full
DOCX
Báo cáo thực tập Athena - CNTT
PDF
Bài 3 : Các ràng buộc toàn vẹn dữ liệu - SQL server
DOC
Báo cáo thực tập tốt nghiệp bảo trì hệ thống mạng.doc
DOC
Nghiên cứu chuẩn ISO/IEC 9126 trong đánh giá chất lượng phần mềm
PDF
Bài thuyết trình môn công nghệ web
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
PDF
Node-v0.12のTLSを256倍使いこなす方法
PDF
PDF
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
PPTX
PDF
httpbis interim@チューリッヒ レポート
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました
PDF
PDF
PDF
第43回HTML5とか勉強会 SPDY/QUICデモ
PDF
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
PDF
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
PDF
HTTP/2.0がもたらすWebサービスの進化(後半)
PPTX
node-gypを使ったネイティブモジュールの作成
PDF
PDF
PDF
PDF
PDF
いまさら聞けない!?Backbone.js 超入門
PDF
PPTX
More Related Content
PDF
Tm forum application_framework_tam_12.5
PDF
Bài 4: STORED PROCEDURE & GIAO DỊCH - Giáo trình FPT
PDF
Đề Thi Trắc Nghiệm CCNA Full
DOCX
Báo cáo thực tập Athena - CNTT
PDF
Bài 3 : Các ràng buộc toàn vẹn dữ liệu - SQL server
DOC
Báo cáo thực tập tốt nghiệp bảo trì hệ thống mạng.doc
DOC
Nghiên cứu chuẩn ISO/IEC 9126 trong đánh giá chất lượng phần mềm
PDF
Bài thuyết trình môn công nghệ web
Viewers also liked
PPTX
そうだったのか! よくわかる process.nextTick() node.jsのイベントループを理解する
PDF
PDF
Node-v0.12のTLSを256倍使いこなす方法
PDF
PDF
HTTP/2.0 HPAC-03 エンコーディング手法 by tatsuhiro_t
PPTX
PDF
httpbis interim@チューリッヒ レポート
PDF
Node.js で SPDYのベンチマーク体験サイトを作りました
PDF
PDF
PDF
第43回HTML5とか勉強会 SPDY/QUICデモ
PDF
Node の HTTP/2.0 モジュール iij-http2 の実装苦労話
PDF
httpbis interim@シアトル レポート(第2回HTTP/2.0接続試験)
PDF
HTTP/2.0がもたらすWebサービスの進化(後半)
PPTX
node-gypを使ったネイティブモジュールの作成
PDF
PDF
PDF
PDF
PDF
いまさら聞けない!?Backbone.js 超入門
Similar to Stream2の基本
PDF
PPTX
PDF
東京Node学園#3 Domains & Isolates
PDF
PPT
PPTX
PPTX
PDF
Discretized Streams: Fault-Tolerant Streaming Computation at Scaleの解説
PPTX
PPTX
PDF
Reactive Extensionsで非同期処理を簡単に
PDF
【BS14】Blazor WebAssemblyとJavaScriptのインターオペラビリティ
PDF
PDF
PPTX
PDF
PPTX
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
PDF
History & Practices for UniRx UniRxの歴史、或いは開発(中)タイトルの用例と落とし穴の回避法
PDF
Node.jsv0.8からv4.xへのバージョンアップ ~大規模Push通知基盤の運用事例~
PDF
More from shigeki_ohtsu
PDF
PDF
PDF
PDF
PDF
Technical Overview of QUIC
PPTX
httpbis interim とhttp2.0相互接続試験の話
PPTX
Stream2の基本 1. 2. 3. 4. 5. 6. 7. 8. Stream1 の問題
var server = http.createServer(function(req, res) {
setTimeout(function() {
var data = '';
req.on('data', function(chunk) {
data += chunk;
});
req.on('end', function() {
console.log(data);
});
res.writeHead(200);
res.end();
}, 1000);
}).listen(8080);
POSTデータをちゃんと取れる?
9. 10. 11. 12. 13. 14. Readable 返り値
実
装
者
用
_read(n) Streamから呼ばれる。 n は hwm を指す。 N/A
push(chunk) 内部バッファの最後にchunkを加える。 (chunkはBufferか文
字列、ただし objectMode じゃない時)
chunk を null にすると endイベントが発生
true hwm以下
false hwm 以上
消
費
者
用
setEncoding(en
c)
StringDecoderを指定する。内部バッファにはdecodeしたも
のが加えられる。
undefined
read(n) 内部バッファから n バイトデータを読み込む。 n が
undefined の場合は内部データ全部
バッファ
unshift(chunk) 内部バッファの先頭にchunkを加える。
chunk を null にすると endイベントが発生
true hwm以下
false hwm 以上
パ
イ
プ
pipe(dest,
pipOpts)
dest(WritableStream)とつなげて書き込む。 {end: false} のオ
プションで src の end イベントに伴って自動的に dst.end
しない。
複数 dest をつなげることが可能
dest
unpipe(dest) dest との pipe を外す。destが指定されてない場合は全ての
pipe を外す。
src
旧
モ
ー
ド
用
resume() 省略 (このメソッドがされると旧モード互換になる。)
pause() 省略 (このメソッドがされると旧モード互換になる。)
wrap(stream) stream1 のオブジェクトを stream2 に変換するラッパー self
ReadableStream API methods
15. ReadableStream API events
イベント名 説明 引数
readable 内部バッファのデータが消費できる時に発生するイ
ベント。(でも実は発生条件が結構複雑)
N/A
end ソースから読み込むデータの終わりを通知された時
に発生するイベント。実質的には Readable.pull(null)
されたタイミングで発生するものと考えていいだろ
う。(例外有)
データを消費(Readable.read) されていないと発生し
ないので注意。
N/A
error 省略 エラーオブ
ジェクト
data 旧モードでデータを受けるイベント。このリスナが
登録されていると旧モード互換になる。
データバッ
ファ
16. 17. 覚えておこう大切なこと
Readable.read(n) ただし n>0
• ストリーム内部バッファのデータを消費者が読み
込む(消費する)関数
• 消費者が利用する
• n バイトを取得。読み込みデータが空だと nullが
返る。
• n を指定しない場合はストリーム内部の全データ
を取得。通常はこれ。
• n が highWaterMark以上 だとストリームの最大値
が上がるので注意。
• 通常 readable イベントに合わせて実行する。(他
でも使えるけど)
18. 19. 覚えておこう大切なこと
Readable.push(chunk)
• ソースからストリームへデータ(chunk)を送り込む関数。
実装者が利用する。
• pushされた chunk はストリームの内部バッファの最後に
加えられる。
• (おおよそ)push に合わせて readable イベントが発火す
ると考えていいだろう。(例外あり)
• ストリームが満タン(内部バッファの容量が
highWaterMark以上)の時は push は false を返す。(でも
無理やり詰め込める)
• 何も渡すデータが無い時、 _read() が呼ばれたら push(‘’)
をしておきましょう。
• データ送りの終りは push(null) を実行。これがないと end
イベントが発生しないので必ずやろう。
• push() をするとストリームが先読み機能で内部に読み込
めるだけ read(0) を繰り返してきます。無駄な _read() に
20. 21. 22. 一番簡単なサンプル(同期)
var source = *‘a’, ‘b’, ‘c’, null+;
var Readable = require(‘stream’).Readable;
Readable.prototype._read = function() {
this.push(source.shift()); // 同期
};
var rstream = new Readable();
var data = ‘’;
rstream.on(‘readable’, function() ,
var b = rstream.read();
if (b) data += b;
});
rstream.on(‘end’, function() ,
console.log(‘data =‘ + b);
});
消費者
実装者
ソース
23. 24. 25. 26. 注意
var Readable = require(‘readable’).Readable;
Readable.prototype._read = function() {
this.push(‘hoge’);
}
var rstream = new Readable();
var data = ‘’;
rstream.on(‘readable’, function() ,
var b = rstream.read();
if (b) data += b;
});
rstream.on(‘end’, function() ,
console.log(‘data=‘ + data);
});
EOFがない!
無限同期読み込み
27. 28. 29. 課題3
以下の条件でソースのデータが全
部読み込めるようにしましょう
条件 値
テスト
1
n1 > hwm > n2 n1 = 3, hwm =2, n2 = 1
テスト
2
n1 > n2 > hwm n1 = 3, hwm =1, n2 = 2
テスト
3
hwm > n1 > n2 n1 = 2, hwm =3, n2 = 1
テスト
3
hwm > n2 > n1 n1 = 1, hwm =3, n2 = 2
ソース: ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j']
読み込み: 非同期(1秒毎)
読み込み条件
• Readable.read(n1),
• new Readable {highWaterMark: hwm})
• Readable.push(chunk) ただし chunk.length === n2
30. 31. 32. WritableStream API methods
WritableStream 返り値
実
装
者
用
_write(chunk, encoding, cb) ストリームからリソースへデータを書き出す
関数。実装者が利用です。完了したら cb を実
行。
書き込みにエラーがあったら 第一引数をエ
ラーにして cb を実行する。
生
産
者
用
write(chunk, [encoding], [cb]); WritableStream を経由してリソースにデータ
を書き込む。書き込みが完了したら cb が起動
される。
true hwm以下
false hwm 以上
end([chunk], [encoding], [cb]); 書き込み終了を実行する。リソースがすべて
書き込まれたら finish イベントが発火する。
33. WritableStream API events
イベント名 説明 引数
drain WritableStream の内部バッファが空になったことを
示すイベント
N/A
error エラーが発生したイベント エラーオブ
ジェクト
finish end() 後全てのデータの書き込みが完了したことを示
すイベント
N/A
pipe パイプがつながったことを示すイベント source
unpipe パイプが外されたことを示すイベント source
34. 一番簡単なサンプル(同期)
var dest = [];
var Writable = require(‘stream’).Writable;
Writable.prototype._write = function(chunk, encoding, cb) {
dest.push(chunk); // 同期
cb(null);
};
var wstream = new Writable();
var chunk = new Buffer(“abc”);
wstream.write(chunk, function(err) {
if (err) throw err;
console.log(“write finished”);
});
wstream.on (‘finish’, function() ,
console.log(‘dest=‘ + dest);
});
wstream.end();
生産者
実装者
書き込み
先
35. 36. 37. 同期書き込みサンプルの動き
複数書き込み
書き込み先
var dest = [];
wstream._write(chun
k, encoding, cb)
wstream.write(chunk1,
wcb1)
消費者
実装者
内部バッファ
書き込み完了
wstream.write(chunk2,
wcb2)
内部バッファ中で
待機中の書き込み
リクエストを実行
chunk2
38. 同期書き込みサンプルの動き
複数書き込み
書き込み先
var dest = [];
wstream._write(chun
k, encoding, cb)
wstream.write(chunk1,
wcb1)
消費者
実装者
内部バッファ
空
書き込み完了
wstream.write(chunk2,
wcb2)
内部バッファ中で
待機中の書き込み
リクエストを実行
wcb1(err)
wcb2(err)
drain
イベント
39. 40. var dest = [], chunks = ['a', 'b', 'c', 'd', 'e', 'f', 'g'];
var Writable = require('stream').Writable;
Writable.prototype._write = function(chunk, encoding, cb) {
setTimeout(function() {
dest.push(chunk); cb(null);
}, 1000);};
var wstream = new Writable();
var sWrite = func tion( c ) {
wstream.write(c, function(err) {
if (err) throw err;
console.log("write(" + c + ") completed");
});};
for(var i = 0; i < chunks.length; i++) sWrite(chunks[i]);
wstream.on('finish', function() { console.log('dest=' + dest); });
wstream.end();
非同期書き込みサンプル
41. 課題4
オレオレ パイプを作ろう
Readable
stream
hwm = 1
Writable
Stream
hwm = 1
src dst
ランダム
(MAX10秒)で
非同期読み
出し
ランダム
(MAX10秒)で
非同期書き
出し
_read
read/
write
_write
var src = *‘a’, ‘b’, ‘c’, ‘d’, ‘e’, ‘f’, ‘g’+; var dst = [];
42. 43. 44. 45. 46. 47. 48. TransformStream API methods
TransformStream 返り値
実
装
者
用
_transform(chunk, encoding, cb) 変換処理を実装する関数。 write(chunk) さ
れたデータが chunk として渡されるので
chunk を実装者で好きに処理して
push(chunk) する。
終わったら cb() して chunk の処理が終
わったことを伝える。
_flush(cb) ストリームデータのデータ変換の最後に
追加の処理をしたいときに実装する。終
了したら cb() を実行。その直後に finish イ
ベントが発火する。
49. 簡単なサンプル(一文字シフ
ト)var Transform = require('stream').Transform;
Transform.prototype._transform = function(chunk, encoding, cb) {
for(var i = 0; i < chunk.length; i++) chunk[i]++;
this.push(chunk);
cb();
};
Transform.prototype._flush = function(cb) {
this.push(new Buffer('|saigo|'));
cb();
};
var tstream = new Transform();
var data = '';
tstream.on('readable', function() {
var b = tstream.read();
if (b) data += b;
});
tstream.on('end', function() {
console.log('transformed =' + data);
});
tstream.end(new Buffer('abc'));
変換
送り込み
完了通知
50. 51. 52. 53. 54. 55.