SlideShare a Scribd company logo
1 of 86
With Rx
by crexista
W H O
• name: Kaoru Shibasaki
• Twitter: @crexista
W H O
• name: Kaoru Shibasaki
• Twitter: @crexista
• Work at:
With Rx
W H A T ’ S
W H A T ’ S
• ブラウザのPushステートを使った非同期遷移
• FlashとJSでのExternalInterfaceを使った非同期通信
• 大量のAPI通信と配信サーバ等とのコネクション管理
非同期処理の山
非同期処理をどうやって
Rxでさばいてたかを話します
A G E N D A
1. Why.(なぜ使ったのか)
2. Problem.(注意点は何か)
3. How.(解決策)
4. まとめ
W H Y
1. EventListenerではダメなのか?
2. MVVMフレームワークは?
3. その他
Reason 1. EventListenerではダメな理由
_result1 = null;
_apiLoader.addEventListener(onLoad);
_apiLoader.load(url);
function onLoad(event){
_result1 = event.target.data;
}
一般的なEventListener例 その1
_result1 = null;
_result2 = null;
_apiLoader.addEventListener(onLoad);
_apiLoader.load(url);
function onLoad(event){
_result1 = event.target.data;
_apiLoader.removeEvent(onLoad);
_apiLoader.addEventListener(onNext);
_apiLoader.load(url);
}
function onNext(event) {
_result2 = event.target.data;
_apiLoader.removeEvent(onNext);
}
一般的なEventListener例 その2
APIを順番に2つ
リクエストする場合
_result1 = null;
_result2 = null;
_result3 = null;
_apiLoader1.addEventListener(onLoad1);
_apiLoader2.addEventListener(onLoad2);
_apiLoader1.load(url);
_apiLoader2.load(url);
function onLoad1(event){
_result1 = event.target.data;
_apiLoader.removeEvent(onLoad);
_apiLoader.addEventListener(onNext);
_apiLoader.load(url);
if (_result2 != null) onLast();
}
function onLoad2(event) {
_result2 = event.target.data;
_apiLoader.removeEvent(onNext);
if (_result1 != null) onLast();
}
function onLast() {
//_result1と_result2を使った処理・・・
}
一般的なEventListener例 その3
APIを同時に2つリクエストして
その2つの結果から新たに処理
状 態 が 増 え る
コ ー ル バ ッ ク 関 数 が 値 を 返 さ な い の で
テ ス ト が し づ ら い
var resultSignal =
APILoader.load().map(onLoad).flatMap(nextLoad);
resultSignal.subscribe(onNext, onComplete, onError);
Rxだと・・・
var resultSignal =
APILoader.load().map(onLoad).flatMap(nextLoad);
resultSignal.subscribe(onNext, onComplete, onError);
Rxだと・・・
別クラスのstaticメソッドに出せる
テ ス ト が し や す い
var mockResult = Observable.returnValue(obj);
mock(apiLoader.load).returnValue(mockResult);
var testResult = APILoader.load().map().flatMap();
assertThat(testResult, isEqual(/*期待値*/));
Mockへに切り替えてのテスト
Reason 2. MVVMを採用しない理由
M V V M と は ?
from wikiped
コ ー ド で 書 く と ?
コ ー ド 側V I E W 側
M V V M と は ?
<tag value = “{uvm.name}">
<button click = "{uvm.updateAge}">
class UserViewModel
{
[Bindable]
private var _age
function updateAge
{
_age ++;
}
}
M V V M パ タ ー ン の 欠 点
• 揮発性イベントの扱いが面倒
• ViewとVMの紐付けを動的に変更できない
• Viewロジックが複雑なものに向いてない
カ ス タ マ イ ズ コ ス ト が 高 い
Reason 3. その他
Operatorが多い
• 例) マウスオーバーしてから数秒間マウスアウトしなかった場合APIをリクエストする
mouseOver
.merge(mouseOut)
.throttle(LIMIT_MSEC)
.filter(checkEventType).subscribe(apiRequest)
Rxでのイベントカスタマイズの例
P R O B L E M
P R O B L E M
1. 組み込み非同期処理との組み合わせ
2. PULL型からPUSH型のStreamへの変換時
3. SubscribeとError処理
組 み 込 み 系 と の 相 性
どういうこと?
var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
ここでconnectしたsocketは
requestをdisposeしても
消えない
var request = apiResult.flatMap(function(result)
{
var socket = new Socket();
var obs = Observable.fromEvent(“connect”, socket);
socket.connect();
return obs
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
組 み 込 み ク ラ ス
組み込み系の非同期処理はそのまま使えない!
解決策
カスタムシグナルを作る
Observable.create
使い方
socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
接続完了時の
コールバック
socketRequest = Observable.create(function(observer)
{
var socket = new Socket();
var func = function(event)
{
observer.onNext(event.target);
observer.onComplete();
};
socket.addEventListener(“connect”,func);
socket.connect();
return function()
{
socket.removeEventListener(func);
if (!socket.connected) socket.close();
}
});
接続キャンセル時
コールバック
var request = apiResult.flatMap(function(result)
{
return socketRequest;
})
.map(function(event):void
{
var socket = event.target;
//なんらかの処理
});
P U L L 型 → P U S H 型
HOTとCOLDの話ではないです
(近いけど)
• PULL型のStream
• 非同期でリクエストし、値が取れたら完了
• 例) APIリクエストとか
• PUSH型のStream
• 一度subscribeすると永続的に値が来るStream
• 例) UIとか、メールとか
P U L L 型 → P U S H 型
A P I リ ク エ ス ト の 結 果 を も っ て
P U S H 通 知 サ ー バ に 接 続 し た 例
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
1. APIへのリクエスト結果
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
2. Socketサーバへの
リクエスト
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
3. socketサーバからの
PUSH通知
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData;
}).do(function(data)
{
//描画処理
});
赤字のonDataは
上書きされたが
connectionが
closeされるわけではない
対処法
apiResult.flatMap(function(result)
{
return socketRequest;
})
.flatMap(function(socket)
{
return socket.onData.takeUntil(apiResult);
}).do(function(data)
{
//描画処理
}); takeUntilを使って
apiResultが完了したら
onDataを止める
SubscribeとError処理
1. SubscribeはaddEventListenerとだいたい同じ
2. Subscribeしまくる == eventListener書きまくり
3. eventの結果どこで何が起きるかわからなくなる!
Subscribeについて
悪 い 例
var request =
APILoader.load(urlA).subscribe(function(result)
{
APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
ここの処理はキャンセル
できない
回 避 策
var innerReq;
var request =
APILoader.load(urlA).subscribe(function(result)
{
innerReq =APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
if (innerReq) innerReq.dispose();
request.dispose();
回 避 策
var innerReq;
var request =
APILoader.load(urlA).subscribe(function(result)
{
innerReq =APILoader.load(result).subscribe(function()
{
//なんかの処理
});
})
if (innerReq) innerReq.dispose();
request.dispose();
できるといえばできるが
テストが面倒に・・
良 い 例
APILoader.load(urlA).flatMap(function(result)
{
return APILoader.load(result);
}).subscribe(function()
{
//なんかの処理
});
• 変な書き方をするとメモリリークの原因に
• というか、フラグが増えて管理が大変に
• (副作用を起こすものなので当たり前といえば当たり前だが)
Subscribeについて
• 変な書き方をするとメモリリークの原因に
• というか、フラグが増えて管理が大変に
• (副作用を起こすものなので当たり前といえば当たり前だが)
Subscribeについて
• Rxではエラーが起きるとsubscribeが切れる
• subscribeのonErrorを書き忘れるとハマル
• なのできちんとonErrorかcatchErrorしましょう
Errorについて
• Error処理忘れるな & Subscribeをあまり書くな
• なのできちんとonErrorかcatchErrorしましょう
SubscribeとErrorについて
で も 人 間 な の で 忘 れ る よ ね
SubscribeとErrorについて
フ レ ー ム ワ ー ク
作 り ま し た
フ レ ー ム ワ ー ク の 方 針
• 薄くつくる
• (現状の)レイヤードアーキテクチャに合わせる
• 開発者はsubscribeを「基本」書かない
• Error処理を書き忘れても最終的にcatchするように
ア ー キ テ ク チ ャ
映 像 の 再 生 や 切 断 と
い っ た ア プ リ と し て
の 挙 動 を 決 め る 層
ア プ リ と し て の 挙 動 を
決 め る 際 に 必 要 と な る
ビ ジ ネ ス ロ ジ ッ ク
A P P L I C A T I O N と
U I の つ な ぎ 込 み を す
る 層
フ レ ー ム ワ ー ク の 方 針
• Presenter層でApplicationとUIのつなぎ込む
• 開発者はつなぎ込みだけフレームワークに従う
• あとは好きに書いてくれ
function start():Array
{
return [
[UI.onPlay.map(VideoModule.play), errorHandler],
[MessageModule.comment.map(UI.addComment)],
];
}
フレームワークでの実装例
UIとApplicationをつなぐ
Signal
function start():Array
{
return [
[UI.onPlay.map(VideoModule.play), errorHandler],
[MessageModule.comment.map(UI.addComment)],
];
}
フレームワークでの実装例
このSignalの監視中のエラーの
ハンドラー
function start():Array
{
return [
[UI.onPlay.map(VideoModule.play), errorHandler],
[MessageModule.comment.map(UI.addComment)],
];
}
フレームワークでの実装例
Error処理を変更する必要がない場合は
そのまま
function run():Array
{
var arr = presenter.start();
for (var signals in arr)
{
var signal = signals[0];
var errorHandle = (signals.length==2)?
signals[1]:defaultHandle
signal.catchError(errorHandle)
.subscribe(onNext, onComplete, onError);
}
}
フレームワーク内部での処理
エラーのキャッチ漏れ防止機構
ま と め
ま と め
• 基本クラスを覚える
• Observable, Subject, Dispose, subscribeあたり
• Operatorとしては以下を覚えておくと楽
• map, flatMap, filter, zip, merge, do, return, take, takeUntil
ま と め
• Subscribeの扱いはルールを決めるべし
• SubscribeをなくせばSignalの流れを掴みやすくなる
ま と め
流れ
–
H T T P S : / / G I S T . G I T H U B . C O M / S T A L T Z / 8 6 8 E 7 E 9 B C 2 A 7 B 8 C
1 F 7 5 4
“Everything is a stream”

More Related Content

What's hot

ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングTanUkkii
 
JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会大樹 小倉
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめYuki Ishikawa
 
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0Yoshifumi Kawai
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編mactkg
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしようKouji Matsui
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScriptOsamu Monoe
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しようUnity Technologies Japan K.K.
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何Kouji Matsui
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...なおき きしだ
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1信之 岩永
 
async/await不要論
async/await不要論async/await不要論
async/await不要論bleis tift
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎tetsu6
 
Rxに入門しようとしている
Rxに入門しようとしているRxに入門しようとしている
Rxに入門しようとしているonotchi_
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみたKengo Toda
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)信之 岩永
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ信之 岩永
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるShunji Konishi
 

What's hot (20)

ECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミングECMAScript6による関数型プログラミング
ECMAScript6による関数型プログラミング
 
JavaScript基礎勉強会
JavaScript基礎勉強会JavaScript基礎勉強会
JavaScript基礎勉強会
 
JavaScriptことはじめ
JavaScriptことはじめJavaScriptことはじめ
JavaScriptことはじめ
 
Reactive Extensions v2.0
Reactive Extensions v2.0Reactive Extensions v2.0
Reactive Extensions v2.0
 
JavaScript入門-基礎編
JavaScript入門-基礎編JavaScript入門-基礎編
JavaScript入門-基礎編
 
これからの「async/await」の話をしよう
これからの「async/await」の話をしようこれからの「async/await」の話をしよう
これからの「async/await」の話をしよう
 
モテる JavaScript
モテる JavaScriptモテる JavaScript
モテる JavaScript
 
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
【Unite Tokyo 2018】さては非同期だなオメー!async/await完全に理解しよう
 
async/awaitダークサイド is 何
async/awaitダークサイド is 何async/awaitダークサイド is 何
async/awaitダークサイド is 何
 
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...Java8 コーディングベストプラクティス and NetBeansのメモリログから...
Java8 コーディングベストプラクティス and NetBeansのメモリログから...
 
C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1C# 7.2 with .NET Core 2.1
C# 7.2 with .NET Core 2.1
 
async/await不要論
async/await不要論async/await不要論
async/await不要論
 
JavaScript超入門 基礎
JavaScript超入門 基礎JavaScript超入門 基礎
JavaScript超入門 基礎
 
Rxに入門しようとしている
Rxに入門しようとしているRxに入門しようとしている
Rxに入門しようとしている
 
Introduction pp.js
Introduction pp.jsIntroduction pp.js
Introduction pp.js
 
JVMの中身を可視化してみた
JVMの中身を可視化してみたJVMの中身を可視化してみた
JVMの中身を可視化してみた
 
C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)C# 8.0 Preview in Visual Studio 2019 (16.0)
C# 8.0 Preview in Visual Studio 2019 (16.0)
 
async/await のしくみ
async/await のしくみasync/await のしくみ
async/await のしくみ
 
MlnagoyaRx
MlnagoyaRxMlnagoyaRx
MlnagoyaRx
 
Javascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみるJavascriptのあれやこれやをまとめて説明してみる
Javascriptのあれやこれやをまとめて説明してみる
 

Viewers also liked

歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追うwilfrem
 
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기Kim Hunmin
 
僕はどうしてAngular2をテーマに登壇することになってしまったのか
僕はどうしてAngular2をテーマに登壇することになってしまったのか僕はどうしてAngular2をテーマに登壇することになってしまったのか
僕はどうしてAngular2をテーマに登壇することになってしまったのかTomohiro Noguchi
 
Contributions of the public health administrations to the change of the parti...
Contributions of the public health administrations to the change of the parti...Contributions of the public health administrations to the change of the parti...
Contributions of the public health administrations to the change of the parti...UCT ICO
 
סילבוס 'התהליך'
סילבוס 'התהליך'סילבוס 'התהליך'
סילבוס 'התהליך'Stas Segin
 
อนูพันธุศาสตร์ (Molecular Genetics)
อนูพันธุศาสตร์ (Molecular  Genetics)อนูพันธุศาสตร์ (Molecular  Genetics)
อนูพันธุศาสตร์ (Molecular Genetics)Biobiome
 
Promosi sriayunie
Promosi sriayuniePromosi sriayunie
Promosi sriayunieSri Ayunie
 
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์bpatra
 
Assignment creative teams
Assignment creative teamsAssignment creative teams
Assignment creative teamsAjay Tyagi
 
D2 career development v1
D2 career development v1D2 career development v1
D2 career development v1DS-Egypt
 
Risky business
Risky businessRisky business
Risky businesspesec
 
Maju Galleria Holdings Sdn. Bhd
Maju Galleria Holdings Sdn. BhdMaju Galleria Holdings Sdn. Bhd
Maju Galleria Holdings Sdn. Bhdsaluga
 
Comparative metagenomics: quantifying similarities between environments, CMBI...
Comparative metagenomics: quantifying similarities between environments, CMBI...Comparative metagenomics: quantifying similarities between environments, CMBI...
Comparative metagenomics: quantifying similarities between environments, CMBI...Copenhagenomics
 
Magento Test Automation Framework
Magento Test Automation FrameworkMagento Test Automation Framework
Magento Test Automation Frameworkamakata
 
Xbox 360
Xbox 360Xbox 360
Xbox 360sammyk7
 

Viewers also liked (20)

歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う歌舞伎座tech発表資料 RxJSの中を追う
歌舞伎座tech発表資料 RxJSの中を追う
 
Rx入門
Rx入門Rx入門
Rx入門
 
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
웹 프론트엔드 개발자의 얕고 넓은 Rx 이야기
 
僕はどうしてAngular2をテーマに登壇することになってしまったのか
僕はどうしてAngular2をテーマに登壇することになってしまったのか僕はどうしてAngular2をテーマに登壇することになってしまったのか
僕はどうしてAngular2をテーマに登壇することになってしまったのか
 
それRxJSでできるよ
それRxJSでできるよそれRxJSでできるよ
それRxJSでできるよ
 
Contributions of the public health administrations to the change of the parti...
Contributions of the public health administrations to the change of the parti...Contributions of the public health administrations to the change of the parti...
Contributions of the public health administrations to the change of the parti...
 
סילבוס 'התהליך'
סילבוס 'התהליך'סילבוס 'התהליך'
סילבוס 'התהליך'
 
อนูพันธุศาสตร์ (Molecular Genetics)
อนูพันธุศาสตร์ (Molecular  Genetics)อนูพันธุศาสตร์ (Molecular  Genetics)
อนูพันธุศาสตร์ (Molecular Genetics)
 
Promosi sriayunie
Promosi sriayuniePromosi sriayunie
Promosi sriayunie
 
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
ขั้นตอนการเขียนโปรแกรมคอมพิวเตอร์
 
Assignment creative teams
Assignment creative teamsAssignment creative teams
Assignment creative teams
 
Happiners 201503 영업방향 및 상품전략1
Happiners 201503 영업방향 및 상품전략1Happiners 201503 영업방향 및 상품전략1
Happiners 201503 영업방향 및 상품전략1
 
Reason
ReasonReason
Reason
 
D2 career development v1
D2 career development v1D2 career development v1
D2 career development v1
 
Risky business
Risky businessRisky business
Risky business
 
Maju Galleria Holdings Sdn. Bhd
Maju Galleria Holdings Sdn. BhdMaju Galleria Holdings Sdn. Bhd
Maju Galleria Holdings Sdn. Bhd
 
Comparative metagenomics: quantifying similarities between environments, CMBI...
Comparative metagenomics: quantifying similarities between environments, CMBI...Comparative metagenomics: quantifying similarities between environments, CMBI...
Comparative metagenomics: quantifying similarities between environments, CMBI...
 
Tokio
TokioTokio
Tokio
 
Magento Test Automation Framework
Magento Test Automation FrameworkMagento Test Automation Framework
Magento Test Automation Framework
 
Xbox 360
Xbox 360Xbox 360
Xbox 360
 

Similar to 歌舞伎座Tech Rx会

Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にYoshifumi Kawai
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Masahito Zembutsu
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancementkamiyam .
 
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~normalian
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)Tusyoshi Matsuzaki
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法Hiroki Mizuno
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころAyumi Goto
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化Gosuke Miyashita
 
Mac Rubyではじめる!Macアプリ開発入門
Mac Rubyではじめる!Macアプリ開発入門Mac Rubyではじめる!Macアプリ開発入門
Mac Rubyではじめる!Macアプリ開発入門宏治 高尾
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門miso- soup3
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみたYoshiyasu SAEKI
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんYukari Sakurai
 
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計y_taka_23
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介しくみ製作所
 

Similar to 歌舞伎座Tech Rx会 (20)

Reactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単にReactive Extensionsで非同期処理を簡単に
Reactive Extensionsで非同期処理を簡単に
 
Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~Serf / Consul 入門 ~仕事を楽しくしよう~
Serf / Consul 入門 ~仕事を楽しくしよう~
 
Async Enhancement
Async EnhancementAsync Enhancement
Async Enhancement
 
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
T51 jQueryで学ぶJavaScriptでのフロント開発~ASP.NET MVC3もあるよっ!~
 
ServerSideJavaScript
ServerSideJavaScriptServerSideJavaScript
ServerSideJavaScript
 
HTML5&API総まくり
HTML5&API総まくりHTML5&API総まくり
HTML5&API総まくり
 
Haikara
HaikaraHaikara
Haikara
 
ゆるかわPhp
ゆるかわPhpゆるかわPhp
ゆるかわPhp
 
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE).NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
.NET Web プログラミングにおける非同期 IO のすべて (Build Insider OFFLINE)
 
OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法OCamlでWebアプリケーションを作るn個の方法
OCamlでWebアプリケーションを作るn個の方法
 
Angular js はまりどころ
Angular js はまりどころAngular js はまりどころ
Angular js はまりどころ
 
Rx java x retrofit
Rx java x retrofitRx java x retrofit
Rx java x retrofit
 
イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化イベント駆動プログラミングとI/O多重化
イベント駆動プログラミングとI/O多重化
 
Mac Rubyではじめる!Macアプリ開発入門
Mac Rubyではじめる!Macアプリ開発入門Mac Rubyではじめる!Macアプリ開発入門
Mac Rubyではじめる!Macアプリ開発入門
 
2016/12/17 ASP.NET フロントエンドタスク入門
 2016/12/17 ASP.NET フロントエンドタスク入門 2016/12/17 ASP.NET フロントエンドタスク入門
2016/12/17 ASP.NET フロントエンドタスク入門
 
Apache geode at-s1p
Apache geode at-s1pApache geode at-s1p
Apache geode at-s1p
 
Apache EventMesh を使ってみた
Apache EventMesh を使ってみたApache EventMesh を使ってみた
Apache EventMesh を使ってみた
 
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃんRetrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
Retrofit2 &OkHttp 
でAndroidのHTTP通信が快適だにゃん
 
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
AWS は形式手法の夢を見るか? - モデル検査器 Alloy によるインフラ設計
 
クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介クライアントサイドjavascript簡単紹介
クライアントサイドjavascript簡単紹介
 

歌舞伎座Tech Rx会