Upgrade to Pro — share decks privately, control downloads, hide ads and more …

All about Rx (in Greek)

All about Rx (in Greek)

Presentation given at 49th dotNetZone.gr community event about Reactive Extensions framework for reactive programming.

Aggelos Biboudis

February 23, 2012
Tweet

More Decks by Aggelos Biboudis

Other Decks in Programming

Transcript

  1. All About Rx Άγγελος Μπιμπούδης http://www.di.uoa.gr/~biboudis *This slidedeck is based

    on msdn, channel9, reactive extensions forum and more. It follows the RX HOL and can be used as a quick reference for Rx
  2. 101: Τι είναι Reactive Programming; • Είναι ένα programming paradigm

    • Ροή δεδομένων και διάδοση της αλλαγής α = β + γ • http://en.wikipedia.org/wiki/Reactive_programming
  3. 101: Τι θεωρείται First-Class • Πότε ένα αντικείμενο είναι first-

    class ; • Μπορεί να αποθηκευτεί σε μεταβλητές • Μπορεί να περάσει ως παράμετρος • Επιστρέφει ως αποτέλεσμα • Δημιουργείται at runtime • http://en.wikipedia.org/wiki/First-class_ob
  4. 101: Event-based Asynchronous Pattern • MethodNameAsync (param) • MethodNameAsync (param,

    object userState) • MethodNameCompleted • MethodNameAsyncCancel • CancelAsync
  5. 101: Asynchronous Programming Model • IAsyncResult με απαραίτητες πληροφορίες •

    BeginOperationName • EndOperationName • Rendezvous techniques –Wait-Till-Completion –Polling στο IsCompleted –delegate
  6. 101: Asynchronous Programming Model FileStream fs = File.OpenRead(“….”); Byte[] bs

    = new byte[1042]; Fs.BeginRead(bs,0,bs.Length, new AsyncCallback(iar => { int bytesRead = fs.Endread(iar); DO ANOTHER ASYNC }), null );
  7. Reactive Extensions (Rx) is a library for composing asynchronous and

    event-based programs using observable sequences and LINQ- style query operators.
  8. Unified Programmability • EBAP (*Async, *Completed) • APM (IAsyncResult, Begin

    / End) • Task<T> • Windows 7 Sensor and Location API • SQL StreamInsight temporal event streams • F# first-class events • Asynchronous workflows
  9. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
  10. Πλατφόρμες (v1.0.10621 SP1) • .NET Framework 3.5 SP1 • .NET

    Framework 4 • Silverlight 4 • Silverlight 5 • Windows Phone 7 • Windows Phone 7.1 • JavaScript!
  11. Πού μπορώ να το κατεβάσω • Δεξί κλικ->Manage NuGet Packages

    -> Rx • Ή το κατεβάζουμε από το MSDN Data Developer Center
  12. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T Cur r ent { get ; } voi d Reset ( ) ; } Τα Properties είναι μέθοδοι
  13. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T G et Cur r ent ( ) ; voi d Reset ( ) ; } Ιστορικούς Λόγους
  14. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) ; T G et Cur r ent ( ) ; } Όχι checked exceptions στο .NET / C#
  15. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; }
  16. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; } Μία ακόμα πληροφορία εξόδου!
  17. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( bool | Except i on) M oveNext ( ) ; T G et Cur r ent ( ) ; } Άρα πόσες τιμές; Υποθετικό syntax (“or”)
  18. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( t rue | f al se | Except i on) M oveNext ( ) ; T G et Cur r ent ( ) ; } Αν λάβουμε true, τι σημαίνει;
  19. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( T | f al se | Except i on) M oveNext ( ) ; } Αν λαμβάναμε false;
  20. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { I Enum erat or< T> G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> : I D i sposabl e { ( T | voi d | Except i on) M oveNext ( ) ; } Κάθε enumerator είναι disposable
  21. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> { ( T | voi d | Except i on) M oveNext ( ) ; } Υποθετικό syntax (“and”)
  22. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat or< out T> { ( T | voi d | Except i on) M oveNext ( ) ; } void Ανάστροφο Variance! Ας το μετονομάσουμε!
  23. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat orD ual < i n T> { voi d O nNext ( T | voi d | Except i on) ; } Έχουμε κάτι που παίρνει τρεις παραμέτρους και πρέπει να κληθεί σε τρεις περιπτώσεις.
  24. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I Enum erat orD ual < i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
  25. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl e< out T> { ( I Enum erat or< T> & I D i sposabl e) G et Enum erat or( ) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; } Πρέπει να αλλαχτεί και αυτό Ας το αφήσουμε ως έχει Πηγή δεδομένων
  26. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I Enum

    erabl eD ual < out T> { I D i sposabl e SetO bserver( I O bserver< T> observer) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
  27. Μετασχηματίζοντας το σύγχρονο IEnumerable i nt erf ace I O

    bservabl e< out T> { I D i sposabl e Subscri be( I O bserver< T> observer) ; } i nt erf ace I O bserver< i n T> { voi d O nNext ( T val ue) ; voi d O nCom pl et ed( ) ; voi d O nEr r or( Except i on except i on) ; }
  28. Rx ecosystem • IObserver<T> • IObservable<T> • ISubject<T1, T2> •

    Factory Methods • Extension Methods • Scheduling and Concurrency • GoF fan boys • Language geeks • Concurrency και Multithreading nerds • Testing maniacs
  29. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
  30. Reactive Programming με Events • Declare event Act i on<

    i nt > E; • Publish E( 42) ; • Subscribe E + = x = > Consol e. W ri t eLi ne( x) ;
  31. Reactive Programming με Rx • Declare I Subj ect <

    i nt > S = new Subj ect < i nt > ( ) ; • Publish S. O nNext ( 42) ; • Subscribe S. Subscri be( x = > Consol e. W ri t eLi ne( x) ) ;
  32. Γρήγορο Παράδειγμα cl ass Pr ogram { event Act i

    on< i nt > E; st at i c voi d M ai n( ) { var p = new Pr ogram ( ) ; p. E + = x = > Consol e. W ri t eLi ne( x) ; p. E( 1) ; p. E( 2) ; p. E( 3) ; } } cl ass Pr ogram { I Subj ect < i nt > S = new Subj ect< i nt > ( ) ; st at i c voi d M ai n( ) { var p = new Pr ogram ( ) ; p. S. Subscri be( x = > Consol e. W ri t eLi ne( x) ) ; p. S. O nN ext ( 1) ; p. S. O nN ext ( 2) ; p. S. O nN ext ( 3) ; } }
  33. First-Class “Events” / / αποθήκευση I O bservabl e< st

    ri ng> t ext Changed = … ; / / ω ς παράμετρος voi d Pr ocessRequest s( I O bservabl e< st ri ng> i nput ) {… } / / ω ς επι στρεφόμενη τι μή I O bservabl e< i nt > Q ueryServer( ) {… }
  34. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
  35. Empty / / St r eam που σταματάει άμεσα (

    O nCom pl et ed) O bservabl e. Em pt y< i nt > ( ) ;
  36. Return / / Επι στρέφει τι μή 1 ( O

    nNext , O nCom pl et ed) O bservabl e. Ret ur n( 1) ; 1
  37. Throw / / Πετάει σφάλμα ( O nEr r or)

    O bservabl e. Thr ow ( new Except i on( ) ) ;
  38. Range / / Επι στρέφει τρει ς τι μές μεταξύ

    0 και 3 O bservabl e. Range( 0, 3) ; 0 1 2
  39. ToEnumerable / ToObservable / / Μ ετατροπή enum erabl e

    σε observabl e Enum erabl e. Range( 0, 3) . ToO bservabl e( ) ; 0 1 2 / / M ετατροπή observabl e σε enum erabl e O bservabl e. Range( 0, 3) . ToEnum erabl e( ) ;
  40. Data streams •Τα Observables είναι data streams –Θέλω μόνο όσα

    είναι πράσινα άρα όσα OnNext έχουν μέσα πράσινο άρα –.Where(dot=>dot.isGreen) dot s r esul t s
  41. Asynchronous streams • Τα Observables είναι asynchronous –Ο χρόνος είναι

    παράγοντας σημαντικός και παραμετροποιήσιμος –.Delay(TimeSpan.FromSeconds(1)) dot s r esul t s
  42. Demo 2 Δημιουργώ Observable από το event TextChanged Δημιουργώ Observable

    από μία ασύγχρονη κλήση web Tα συνδέω (combination-the Rx sexy way) για να γράφω
  43. Operators Creating an observable sequence Create, Generate, Defer, Range Converting

    .NET events or asynchronous patterns to observable sequences, or between enumerators and observable sequences. FromAsyncPattern, FromEvent, FromEventPattern, ToObservable, ToEnumerable Combining multiple observable sequences into a single sequence. Amb, Concat, StartWith, Merge, Repeat, Zip Functional Let, Prune, Publish, Replay Mathemathical operators on sequences Aggregate, Count, Min, Max, Sum Time-based operations Delay, Interval, TimeInterval, Timestamp, Timeout Handling Exceptions Catch, Finally, Retry, OnErrorResumeNext Miscellaneous operators Do, Run, Remotable Filtering and selecting Take, TakeUntil/TakeWhile, Select,
  44. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
  45. Παραμετροποίηση scheduling O bservabl e. Ti m er( Ti m

    eSpan. Fr om Seconds( 5) ) Ποιόν; • System.Threading.Timer? • System.Timers.Timer? • System.Windows.Forms.Timer? • System.Windows.Threading.Timer? • Sleep on the current thread? • … ?
  46. Scheduler Interface i nt erf ace I Schedul er {

    D at eTi m eO f f set Now { get ; } I D i sposabl e Schedul e( Act i on w ork) ; I D i sposabl e Schedul e( Ti m eSpan dueTi m e, Act i on w ork) ; I D i sposabl e Schedul e( D at eTi m eO f f set dueTi m e, Act i on w ork) ; }
  47. Επίπεδα Αφαίρεσης Operators var xs = O bservabl e. Range(

    1, 10, Schedul er. Thr eadPool ) ; var q = f r om x i n xs w her e x % 2 = = 0 sel ect - x; q. Subscri be( Consol e. W ri t eLi ne) ;
  48. Επίπεδα Αφαίρεσης Operators Observables var xs = new RangeO bservabl

    e< i nt > ( 1, 10, Schedul er. Thr eadPool ) ; var q = new Sel ect O bservabl e< i nt > ( new W her eO bservabl e< i nt > ( xs, x = > x % 2 = = 0) , x = > - x) ; q. Subscri be( new Lam bdaO bserver< i nt > ( Consol e. W ri t eLi ne) ) ;
  49. Επίπεδα Αφαίρεσης Operators Observables Schedulers var n = 0; Schedul

    er. Thr eadPool . Schedul e( sel f = > { i f ( n < 10) { i f ( ( n + 1) % 2 = = 0) Consol e. W ri t eLi ne( - ( n + 1) ) ; n+ + ; sel f ( ) ; } }) ;
  50. Επίπεδα Αφαίρεσης Operators Observables Schedulers Native Concurrency var n =

    0; Act i on< obj ect > w ork = nul l ; w ork = _ = > { i f ( n < 10) { i f ( ( n + 1) % 2 = = 0) Consol e. W ri t eLi ne( - ( n + 1) ) ; n+ + ; Thr eadPool . Q ueueUserW orkI t em (nul l , w ork) ; } }; Thr eadPool . Q ueueUserW orkI t em (nul l , w ork) ;
  51. Ενοποιημένο Interface Name Execution Context Execution Policy Clock ThreadPool Thread

    Pool ASAP Machine Time Dispatcher UI Thread Priority FIFO Machine Time EventLoop Dedicated Thread FIFO Machine Time Immediate Current Thread Immediate Machine Time Remote Another Process FIFO Remote Machine Time
  52. Schedulers για testing Name Execution Context Execution Policy Clock ThreadPool

    Thread Pool ASAP Machine Time Dispatcher UI Thread Priority FIFO Machine Time EventLoop Dedicated Thread FIFO Machine Time Immediate Current Thread Immediate Machine Time Remote Another Process FIFO Remote Machine Time Test Current Thread FIFO Virtual Time
  53. var schedul er = new TestSchedul er(); D i cti

    onary< i nt, i nt> num bersExpected = new D i cti onary< i nt, i nt> (); D i cti onary< i nt, bool > num bersFrom B l oom = new D i cti onary< i nt, bool > (); var generator = O bservabl e. G enerate< Tupl e< R andom , i nt> , i nt> (… , schedul er). D o(val ue = > { i nt count; i f (num bers. TryG etVal ue(val ue, out count)) num bers[val ue]+ + ; el se num bers. A dd(val ue, 0); }). B l oom (100); generator . Subscri be(val ue = > num bersFrom B l oom [val ue. I tem 1]= val ue. I tem 2); schedul er . Start(); foreach (i nt num i n num bers. Val ues) { A ssert. I sTrue(num bersFrom B l oom [num ]= = (num bers[num ]> 0)); } Testing an operator with virtual clock
  54. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
  55. Windowing MSFT 27.01 INTC 21.75 MSFT 27.96 MSFT 31.21 INTC

    22.54 INTC 20.98 MSFT 30.73 Oμαδ/ση με το όνομα: G r oupBy( t = > t . Sym bol )
  56. Filtering MSFT INTC Αύξηση στην τιμή > 10%: W her

    e( w = > Pri ceI ncr ease( w ) > . 1) 21.75 22.54 22.54 20.98 27.01 27.96 27.96 31.21 31.21 30.73
  57. f r om t i ck i n st ockTi

    cks gr oup t i ck by t i ck. Sym bol i nt o sym bol St r eam f r om w i ndow i n sym bol St r eam . Buf f er( 2, 1) l et i ncr ease = Pri ceI ncr ease( w i ndow ) w her e i ncr ease > . 1 sel ect new { sym bol = sym bol St r eam . Key, i ncr ease }; LINQ: Event Processing source group aggregate apply filter reduce
  58. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
  59. Demo 4 Παράγουμε διαφορές σημείων κίνησης ποντικιού, κάνοντας ενέργειες σε

    ένα stream το window του οποίου καθορίζεται από το δεύτερο stream
  60. Θεωρητικές βάσεις Lambda Expressions (Anonymous functions ) & • Higher-order-functions

    (Where(Func<>), Select(), Zip()) • Continuation (Subscribe(Action<T>, Action<Exception>, Action)) • Continuation passing style (Observable.Create()) • Tail recursion vs. looping (Scheduler.Schedule(Action<Action<>>)) • Coroutines (Observable.Iterate()) • Monads (IEnumerable & IObservable return is EnumerableEx.Return() & bind is SelectMany())
  61. Ideas • Programming THE phone • Programming the cloud •

    Kinect streams –Joins over movements • Sensor Streams • Stream of pulses and reasoning in real time • Operators for financial applications
  62. Quiz • var source = Observable.Repeat(1, 3) .Window(2) .SelectMany(c =>

    c); • var source = Observable.Range(1, 3) .SelectMany(c => Observable.Repeat(c,3));
  63. Blogs http://community.bartdesmet.net/blogs/bart/Default.aspx (Bart De Smet) http://enumeratethis.com/ (James Miles) http://davesexton.com/blog/ (Dave

    Sexton) http://leecampbell.blogspot.com/ (Lee Campbell) http://codebetter.com/matthewpodwysocki/ (Matthew Podwysocki) http://blogs.msdn.com/b/rxteam/ (Rx Team blog) http://blogs.msdn.com/b/wesdyer/ (Wes Dyer) http://blogs.msdn.com/b/jeffva/ (Jeffrey van Gogh) http://bvanderveen.com/ (Benjamin van der Veen) http://channel9.msdn.com/search?term=rx (Channel 9 / Rx)
  64. Projects http://rxx.codeplex.com/ (Rxx) https:// github.com/richardszalay/raix/tree/master/source/raix/src/raix/reactive http://www.reactiveui.net/ (ReactiveUI) http://rxcontrib.codeplex.com/ (Rx Contrib)

    http://rxpowertoys.codeplex.com/ (Rx PowerToys) http://rxkoans.codeplex.com/ (Rx Koans) http://reactiveremoting.codeplex.com/ (Reactive Remoting) http://stateobserver.codeplex.com/ (Fluent State Observer) http://rxwiki.wikidot.com/101samples