SlideShare a Scribd company logo
1 of 184
Download to read offline
RxJava 
Getting Started 
David Wursteisen 16 Octobre 2014
David Wursteisen 
Direction Expertise Innovation 
@dwursteisen
David Wursteisen
Architecture distribuée 
Sync/Async/Concurrence
Architecture distribuée
Architecture distribuée
Architecture distribuée 
The Internet
Architecture distribuée 
The Internet
Synchrone
Synchrone 
Appel bloquant
Asynchrone
Asynchrone 
Appel non 
bloquant
Complexité
Complexité 
future.get();
Complexité 
future1.get(); 
future2.get(); 
future3.get(); 
future4.get(); 
future5.get(); 
future6.get(); 
future7.get();
Complexité 
future1.get(); 
future2.get(); 
future3.get(); 
future4.get(); 
future5.get(); 
future6.get(); 
future7.get(); 
Ordonnancement optimal ?
Complexité 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
} 
});
Complexité 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
} 
}); 
} 
});
Complexité 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
} 
}); 
} 
});
Complexité 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
client.execute(new Callback() { 
@Override 
public void completed(HttpResponse response) { 
} 
}); 
} 
}); 
Callback hell
Concurrence
Concurrence
Concurrence 
Concurrence
Concurrence
Concurrence 
RxJava permet de manipuler des 
évènements d’une manière synchrone 
et/ou asynchrone.
Historique 
Il était une fois...
Historique
Historique
Historique
Historique
Historique 
ReactiveX.io
Observables 
Travailler avec des flux
Flux d’évènements fini 
Évènements Fin du flux
Flux d’évènements en erreur 
Évènements Erreur
Flux d’évènements infini 
Évènements
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...)
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...)
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...) 
1
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...) 
1 2 3
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...) 
1 4400
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...) 
0 
t 
t + 5 secondes
Flux d’évènements 
Observable.never() 
Observable.empty() 
Observable.just(1) 
Observable.from(1, 2, 3) 
Observable.range(1, 4400) 
Observable.timer(5, TimeUnit.SECONDS) 
Observable.create(...) 
A C
Flux d’évènements 
Observable<json> json json json 
λ ϕ φ 
Observable<Integer> 
Observable<Click>
Observer 
Push des données
Observer 
OnNext* (OnCompleted|OnError)?
Observer 
OnNext* (OnCompleted|OnError)?
Observer 
OnNext* (OnCompleted|OnError)?
Observer 
OnNext* (OnCompleted|OnError)?
Observer 
Observable.range(1, 4400)
Observer 
Observable.range(1, 4400).subscribe()
Observer 
Observable.range(1, 4400).subscribe(onNext)
Observer 
Observable.range(1, 4400).subscribe(System.out::println)
Observer 
Observable.range(1, 4400).subscribe(System.out::println, 
onError)
Observer 
Observable.range(1, 4400).subscribe(System.out::println, 
System.err::println)
Observer 
Observable.range(1, 4400).subscribe(System.out::println, 
System.err::println, 
onCompleted)
Observer 
Observable.range(1, 4400).subscribe(System.out::println, 
System.err::println, 
() -> System.out.println(“finished”))
Manipulation d’évènements 
Quand l’écoute ne suffit plus
Manipulation d’évènements 
0 1
Manipulation d’évènements 
0 1 
map
Manipulation d’évènements 
0 1 
map 
A B
Manipulation d’évènements 
1 4
Manipulation d’évènements 
1 4 
filter ( x <= 2 )
Manipulation d’évènements 
1 4 
1 
filter ( x <= 2 )
Manipulation d’évènements 
1 2
Manipulation d’évènements 
1 2 
delay ( 5, SECONDS )
Manipulation d’évènements 
1 2 
delay ( 5, SECONDS ) 
1 
2
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
Observable<Integer>
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
.filter((i) -> i < 3) 
Observable<Integer> 
Observable<Integer>
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
.filter((i) -> i < 3) 
.delay(5, TimeUnit.SECONDS) 
Observable<Integer> 
Observable<Integer> 
Observable<Integer>
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
.filter((i) -> i < 3) 
.delay(5, TimeUnit.SECONDS) 
.map((i) -> Character.toString((char)(i + 'A'))) 
Observable<Integer> 
Observable<Integer> 
Observable<Integer> 
Observable<String>
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
.filter((i) -> i < 3) 
.delay(5, TimeUnit.SECONDS) 
.map((i) -> Character.toString((char)(i + 'A'))) 
.subscribe(System.out::println); 
Observable<Integer> 
Observable<Integer> 
Observable<Integer> 
Observable<String>
Manipulation d’évènements 
Observable.from(0, 1, 2, 3, 4) 
.filter((i) -> i < 3) 
.delay(5, TimeUnit.SECONDS) 
.map((i) -> Character.toString((char)(i + 'A'))) 
.subscribe(System.out::println); 
0, 1, 2, 3, 4 => A, B, C 
Observable<Integer> 
Observable<Integer> 
Observable<Integer> 
Observable<String>
Manipulation d’évènements
Manipulation d’évènements
Manipulation d’évènements
Composition 
Création d’un flux à partir d’un ensemble de flux
Composition
Composition
Composition
Mise en pratique de composition 
Learn from the trenches
Composition
Composition
Composition
Composition
Composition
Composition 
merge
Composition 
merge
Composition
Composition
Composition 
zip
Composition 
zip
Subscription 
Et gestion de l’unsubscribe
Subscription 
Observable.create(new OnSubscribe<T>() { … });
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> s) { 
s.onNext(123); 
s.onCompleted(); 
} 
});
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> s) { 
s.onNext(123); 
s.onCompleted(); 
} 
}); 
Émission synchronne
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> subscriber) { 
// ... 
httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { 
@Override 
public void completed(String content) { 
subscriber.onNext(content); 
subscriber.onCompleted(); 
} 
@Override 
public void failed(Exception e) { 
subscriber.onError(e); 
} 
}); 
} 
});
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> subscriber) { 
// ... 
httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { 
@Override 
public void completed(String content) { 
subscriber.onNext(content); 
subscriber.onCompleted(); 
} 
@Override 
public void failed(Exception e) { 
subscriber.onError(e); 
} 
}); 
} 
});
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> subscriber) { 
// ... 
httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { 
@Override 
public void completed(String content) { 
subscriber.onNext(content); 
subscriber.onCompleted(); 
} 
@Override 
public void failed(Exception e) { 
subscriber.onError(e); 
} 
}); 
} 
});
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> subscriber) { 
// ... 
httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { 
@Override 
public void completed(String content) { 
subscriber.onNext(content); 
subscriber.onCompleted(); 
} 
@Override 
public void failed(Exception e) { 
subscriber.onError(e); 
} 
}); 
} 
}); 
Émission asynchronne
Subscription 
Observable.create(new OnSubscribe<T>() { 
@Override 
public void call(Subscriber<? super T> subscriber) { 
// ... 
httpClient.execute(httpRequest, new FutureCallback<HttpResponse>() { 
@Override 
public void completed(String content) { 
subscriber.onNext(content); 
subscriber.onCompleted(); 
} 
@Override 
public void failed(Exception e) { 
subscriber.onError(e); 
} 
}); 
} 
}); 
Propagation des erreurs
Subscription 
La souscription permet d’uniformiser des API 
différentes par leurs natures (Callback, etc...)
Unsubscribe 
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();
Unsubscribe 
Souscription 
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();
Unsubscribe 
Handler sur la souscription 
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe();
Unsubscribe 
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe(); 
/* ... */ 
subscription.unsubscribe();
Unsubscribe 
Subscription subscription = Observable.interval(1, TimeUnit.SECONDS).subscribe(); 
/* ... */ 
subscription.unsubscribe(); 
Arrêt de la souscription
Schedulers
Schedulers 
observableReadingSynchronously(“strings.txt”) 
.take(10) 
.delay(1, SECONDS) 
.map(parse()) 
.map(n -> “=> ” + n)) 
.subscribe(to_the_view())
Schedulers 
main
Schedulers 
observableReadingSynchronously(“strings.txt”) 
.take(10) 
.delay(1, SECONDS) 
.map(parse()) 
.map(n -> “=> ” + n)) 
.subscribe(to_the_view())
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
main 
IO 
Computation 
UI
Schedulers 
observableReadingSynchronously(“strings.txt”) 
.subscribeOn(scheduler) 
.take(10) 
.delay(1, SECONDS, scheduler) 
.map(parse()) 
.observeOn(scheduler) 
.map(n -> “=> ” + n)) 
.subscribe(to_the_view())
Schedulers 
observableReadingSynchronously(“strings.txt”) 
.subscribeOn(Schedulers.io()) 
.take(10) 
.delay(1, SECONDS, Schedulers.computation()) 
.map(parse()) 
.observeOn(Schedulers.from(uiExecutor())) 
.map(n -> “=> ” + n)) 
.subscribe(to_the_view())
Schedulers 
Computation 
UI
Schedulers 
Computation 
UI
Schedulers 
Computation 
UI
Schedulers 
Computation 
UI
Schedulers 
Computation 
UI
Hot & Cold Observable
Cold Observable 
Observable<Integer> obs = Observable.from(1, 2, 3, 4); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println);
Cold Observable 
Observable<Integer> obs = Observable.from(1, 2, 3, 4); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println);
Cold Observable 
Observable<Integer> obs = Observable.from(1, 2, 3, 4); 
obs.subscribe(System.out::println); 
Subscribe 
obs.subscribe(System.out::println);
Cold Observable 
Observable<Integer> obs = Observable.from(1, 2, 3, 4); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); Subscribe
Cold Observable 
Observable<Integer> obs = Observable.from(1, 2, 3, 4); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
Souscription différente
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
Subscribe 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect(); 
Partage la même souscription
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println); 
obs.connect();
Hot Observable 
ConnectableObservable<Integer> obs = Observable.from(1, 2, 3, 4).publish(); 
obs.connect(); 
Souscription 
obs.subscribe(System.out::println); 
obs.subscribe(System.out::println);
Cold & Hot Observable 
Cold Observable = flux passif 
Hot Observable = flux actif
Back Pressure 
Contrôler la production
Back Pressure 
Production
Back Pressure 
Production 
buffer
Back Pressure 
Production 
Pression arrière
Back Pressure 
Demande de production de n élements 
Production 
Pression arrière
Retour d’expérience
Opérateurs 
Observable.from(1, 2, 3, 4) 
.reduce(new LinkedList<Integer>(), (seed, value) -> { 
seed.add(value); 
return seed; 
}) 
.first() 
.subscribe(System.out::println);
Opérateurs 
Observable.from(1, 2, 3, 4) 
.reduce(new LinkedList<Integer>(), (seed, value) -> { 
seed.add(value); 
return seed; 
}) 
.first() 
.subscribe(System.out::println);
Opérateurs 
Observable.from(1, 2, 3, 4) 
.toList() 
.first() 
.subscribe(System.out::println);
Opérateurs 
Observable.from(1, 2, 3, 4) 
.toList() 
.first() 
.subscribe(System.out::println);
Opérateurs 
Observable.from(1, 2, 3, 4) 
.toList() 
.first() 
.subscribe(System.out::println); 
Différence entre first() / single() / take(1) ?
Gestion des erreurs 
Observable.from(1, 2, 3, 4) 
.toList() 
.single() 
.subscribe(System.out::println);
Gestion des erreurs 
Observable.from(1, 2, 3, 4) 
.toList() 
.single() 
.subscribe(System.out::println); 
Notification des erreurs absentes
Gestion des erreurs 
static { 
RxJavaPlugins.getInstance().registerErrorHandler(new RxJavaErrorHandler() { 
@Override 
public void handleError(Throwable e) { 
e.printStackTrace(); 
} 
}); 
}
Lambda & Java 8 
Observable.from(1, 2, 3, 4) 
.filter(new Func1<Integer, Boolean>() { 
@Override 
public Boolean call(Integer i) { 
return i > 3; 
} 
}) 
.subscribe(new Action1<Integer>() { 
@Override 
public void call(Integer x) { 
System.out.println(x); 
} 
});
Lambda & Java 8 
Observable.from(1, 2, 3, 4) 
.filter(new Func1<Integer, Boolean>() { 
@Override 
public Boolean call(Integer i) { 
return i > 3; 
} 
}) 
.subscribe(new Action1<Integer>() { 
@Override 
public void call(Integer x) { 
System.out.println(x); 
} 
}); 
Bruit
Lambda & Java 8 
Observable.from(1, 2, 3, 4) 
.filter(i -> i > 3) 
.subscribe(System.out::println);
Lambda & Java 8 
Observable.from(1, 2, 3, 4) 
.filter(new Func1<Integer, Boolean>() { 
@Override 
public Boolean call(Integer i) { 
return i > 3; 
} 
}) 
.subscribe(new Action1<Integer>() { 
@Override 
public void call(Integer x) { 
System.out.println(x); 
} 
}); 
Observable.from(1, 2, 3, 4) 
.filter(i -> i > 3) 
.subscribe(System.out::println); 
Retrolambda
Concurrence 
obs1.mergeWith(obs2) 
.take(5) 
.subscribe(System.out::println);
Concurrence 
obs1.mergeWith(obs2) 
.take(5) 
.subscribe(System.out::println);
Concurrence 
obs1.mergeWith(obs2) 
Doit gérer la concurrence 
.take(5) 
.subscribe(System.out::println);
Concurrence 
obs1.mergeWith(obs2) 
.take(5) 
.subscribe(System.out::println);
Concurrence 
obs1.mergeWith(obs2) 
.take(5) 
.subscribe(System.out::println); 
non concurrence
Sync & Async 
Observable<Integer> generator();
Sync & Async 
Observable<Integer> generator(); 
Sync ?
Sync & Async 
Sync ? Async ? 
Observable<Integer> generator();
Sync & Async 
Sync ? Async ? 
Observable<Integer> generator(); 
Computation ?
Sync & Async 
Sync ? Async ? 
Observable<Integer> generator(); 
Computation ? Acteur ?
“Leak” des Observables 
everything is an event
“Leak” des Observables 
ViewPager
“Leak” des Observables 
ViewPager 
Observable 
Preferences
“Leak” des Observables 
ViewPager 
Observable 
Preferences 
Observable 
UserService
Future<RxJava>
Future<RxJava> 
Support RxJava
Reactive Streams
Reactive Streams 
Reactive Streams is an initiative to 
provide a standard for asynchronous 
stream processing with non-blocking 
back pressure on the JVM. 
http://www.reactive-streams.org/
Reactive Streams 
RxJava | Akka Streams | Reactor Composable | Ratpack
Reactive Streams 
RxJava | Akka Streams | Reactor Composable | Ratpack 
> 700 Ko | Java | Android
Reactive Streams 
RxJava | Akka Streams | Reactor Composable | Ratpack 
> 2.5 Mo | Scala | Akka
Reactive Streams 
RxJava | Akka Streams | Reactor Composable | Ratpack 
~1Mo | Java | RingBufferDispatcher
Reactive Streams 
RxJava | Akka Streams | Reactor Composable | Ratpack 
Java 8 | Http
Si il ne fallait retenir qu’une chose
Si il ne fallait retenir qu’une chose 
RxJava est un modèle de programmation pour 
écrire des applications asynchrones 
Frontend | Backend | Crossplatform
Questions ? 
david.wursteisen@soat.fr 
@dwursteisen

More Related Content

What's hot

Pogram menghitung bangun datar dan ruang dengan java
Pogram menghitung bangun datar dan ruang dengan javaPogram menghitung bangun datar dan ruang dengan java
Pogram menghitung bangun datar dan ruang dengan java
Lendra Susanto
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
Enkhee99
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
Darwin Durand
 

What's hot (13)

Generic asynchronous HTTP utility for android
Generic asynchronous HTTP utility for androidGeneric asynchronous HTTP utility for android
Generic asynchronous HTTP utility for android
 
Pogram menghitung bangun datar dan ruang dengan java
Pogram menghitung bangun datar dan ruang dengan javaPogram menghitung bangun datar dan ruang dengan java
Pogram menghitung bangun datar dan ruang dengan java
 
Taller de string(java)
Taller de string(java)Taller de string(java)
Taller de string(java)
 
C++14 reflections
C++14 reflections C++14 reflections
C++14 reflections
 
Bai tap java
Bai tap javaBai tap java
Bai tap java
 
Алексей Кутумов, C++ без исключений, часть 3
Алексей Кутумов,  C++ без исключений, часть 3Алексей Кутумов,  C++ без исключений, часть 3
Алексей Кутумов, C++ без исключений, часть 3
 
Parse
ParseParse
Parse
 
Danna y felix 10°
Danna y felix 10°Danna y felix 10°
Danna y felix 10°
 
Ejercicios
EjerciciosEjercicios
Ejercicios
 
Антон Полухин. C++17
Антон Полухин. C++17Антон Полухин. C++17
Антон Полухин. C++17
 
Java лаб13
Java лаб13Java лаб13
Java лаб13
 
EJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOSEJEMPLOS DESARROLLADOS
EJEMPLOS DESARROLLADOS
 
Mejor project
Mejor projectMejor project
Mejor project
 

Viewers also liked

FRENCH hillary clinton stingers
FRENCH   hillary clinton stingersFRENCH   hillary clinton stingers
FRENCH hillary clinton stingers
VogelDenise
 
Lanoye les bonnes feuilles
Lanoye   les bonnes feuillesLanoye   les bonnes feuilles
Lanoye les bonnes feuilles
lesoirbe
 
Ht lemagicienbet
Ht lemagicienbetHt lemagicienbet
Ht lemagicienbet
kelticman
 
Présentation 0604
Présentation 0604Présentation 0604
Présentation 0604
valcned
 
Le paludisme
Le paludismeLe paludisme
Le paludisme
Gustave B
 
Utr. reporting on the activities vf
Utr. reporting on the activities vfUtr. reporting on the activities vf
Utr. reporting on the activities vf
IAU_Past_Conferences
 
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
IAU_Past_Conferences
 
Enrique lorente base
Enrique lorente baseEnrique lorente base
Enrique lorente base
sepanic
 
070512 public rebuke (french)
070512   public rebuke (french)070512   public rebuke (french)
070512 public rebuke (french)
VogelDenise
 

Viewers also liked (20)

FRENCH hillary clinton stingers
FRENCH   hillary clinton stingersFRENCH   hillary clinton stingers
FRENCH hillary clinton stingers
 
Automobiles avant - guerre
Automobiles avant - guerreAutomobiles avant - guerre
Automobiles avant - guerre
 
Louvre2
Louvre2Louvre2
Louvre2
 
Lanoye les bonnes feuilles
Lanoye   les bonnes feuillesLanoye   les bonnes feuilles
Lanoye les bonnes feuilles
 
Ht lemagicienbet
Ht lemagicienbetHt lemagicienbet
Ht lemagicienbet
 
Jodete noé x d
Jodete noé x dJodete noé x d
Jodete noé x d
 
Présentation 0604
Présentation 0604Présentation 0604
Présentation 0604
 
Le paludisme
Le paludismeLe paludisme
Le paludisme
 
Lectures
LecturesLectures
Lectures
 
Utr. reporting on the activities vf
Utr. reporting on the activities vfUtr. reporting on the activities vf
Utr. reporting on the activities vf
 
Renaissance3
Renaissance3Renaissance3
Renaissance3
 
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
Alex. bd unesco oecd draft guidelines for quality provision in cross-border h...
 
Présentation Michel Agnola 4e table ronde
Présentation Michel Agnola 4e table rondePrésentation Michel Agnola 4e table ronde
Présentation Michel Agnola 4e table ronde
 
Webquest transito
Webquest transitoWebquest transito
Webquest transito
 
Insolites
InsolitesInsolites
Insolites
 
Durban p2 k.f. seddoh
Durban p2 k.f. seddohDurban p2 k.f. seddoh
Durban p2 k.f. seddoh
 
Revue Education & Formation - e-304-01 - Pratiques parentales d’éducation et ...
Revue Education & Formation - e-304-01 - Pratiques parentales d’éducation et ...Revue Education & Formation - e-304-01 - Pratiques parentales d’éducation et ...
Revue Education & Formation - e-304-01 - Pratiques parentales d’éducation et ...
 
Enrique lorente base
Enrique lorente baseEnrique lorente base
Enrique lorente base
 
Cbse x chapt 16 20
Cbse x chapt 16 20Cbse x chapt 16 20
Cbse x chapt 16 20
 
070512 public rebuke (french)
070512   public rebuke (french)070512   public rebuke (french)
070512 public rebuke (french)
 

More from SOAT

20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
SOAT
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVC
SOAT
 

More from SOAT (20)

Back from Microsoft //Build 2018
Back from Microsoft //Build 2018Back from Microsoft //Build 2018
Back from Microsoft //Build 2018
 
L'entreprise libérée
L'entreprise libéréeL'entreprise libérée
L'entreprise libérée
 
Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entreprise
 
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
 
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand
 
Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido
 
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotDans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
 
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
 
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014Nio sur Netty par Mouhcine Moulou - 3 avril 2014
Nio sur Netty par Mouhcine Moulou - 3 avril 2014
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
 
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
 
ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)
 
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 Xamarin et le développement natif d’applications Android, iOS et Windows en C# Xamarin et le développement natif d’applications Android, iOS et Windows en C#
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatA la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVC
 

RxJava, Getting Started - David Wursteisen - 16 Octobre 2014