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.

B81db221127979fbf254c4ffba7ba286?s=128

Aggelos Biboudis

February 23, 2012
Tweet

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. Παραδείγματα Social media Ροές Μετοχών RSS feeds GPS Διαχείριση Servers

    UI events
  3. 101: Τι είναι Reactive Programming; • Είναι ένα programming paradigm

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

    class ; • Μπορεί να αποθηκευτεί σε μεταβλητές • Μπορεί να περάσει ως παράμετρος • Επιστρέφει ως αποτέλεσμα • Δημιουργείται at runtime • http://en.wikipedia.org/wiki/First-class_ob
  5. 101:Events Form.MouseMove += (sender, args) => { if (args.Location.X==args.Location.Y) RAISE

    another event }; Are they First-Class objects?
  6. 101: Event-based Asynchronous Pattern • MethodNameAsync (param) • MethodNameAsync (param,

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

    BeginOperationName • EndOperationName • Rendezvous techniques –Wait-Till-Completion –Polling στο IsCompleted –delegate
  8. 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 );
  9. Reactive Extensions (Rx) is a library for composing asynchronous and

    event-based programs using observable sequences and LINQ- style query operators.
  10. 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
  11. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

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

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

    -> Rx • Ή το κατεβάζουμε από το MSDN Data Developer Center
  14. Εισαγωγή στο Rx Startup idea: Σαν events αλλά πιο…

  15. Μετασχηματίζοντας το σύγχρονο IEnumerable Mathematical Duality

  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 Cur r ent { get ; } voi d Reset ( ) ; } Τα Properties είναι μέθοδοι
  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 M oveNext ( ) ; T G et Cur r ent ( ) ; voi d Reset ( ) ; } Ιστορικούς Λόγους
  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 { bool M oveNext ( ) ; T G et Cur r ent ( ) ; } Όχι checked exceptions στο .NET / C#
  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 { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; }
  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 { bool M oveNext ( ) t hr ow s Except i on; T G et Cur r ent ( ) ; } Μία ακόμα πληροφορία εξόδου!
  21. Μετασχηματίζοντας το σύγχρονο 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”)
  22. Μετασχηματίζοντας το σύγχρονο 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, τι σημαίνει;
  23. Μετασχηματίζοντας το σύγχρονο 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;
  24. Μετασχηματίζοντας το σύγχρονο 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
  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 Enum erat or< out T> { ( T | voi d | Except i on) M oveNext ( ) ; } Υποθετικό syntax (“and”)
  26. Μετασχηματίζοντας το σύγχρονο 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! Ας το μετονομάσουμε!
  27. Μετασχηματίζοντας το σύγχρονο 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) ; } Έχουμε κάτι που παίρνει τρεις παραμέτρους και πρέπει να κληθεί σε τρεις περιπτώσεις.
  28. Μετασχηματίζοντας το σύγχρονο 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) ; }
  29. Μετασχηματίζοντας το σύγχρονο 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) ; } Πρέπει να αλλαχτεί και αυτό Ας το αφήσουμε ως έχει Πηγή δεδομένων
  30. Μετασχηματίζοντας το σύγχρονο 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) ; }
  31. Μετασχηματίζοντας το σύγχρονο 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) ; }
  32. 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
  33. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
  34. 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) ;
  35. 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) ) ;
  36. Γρήγορο Παράδειγμα 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) ; } }
  37. Διαχωρισμός Publish και Subscribe Publish Subscribe Και τα δύο

  38. 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( ) {… }
  39. Contract • Γραμματική: OnNext* [OnCompleted | OnError] • Εκτέλεση από

    observer μεθόδους 0 1 2 0 1 0 1 2 0 1 2
  40. Demo 0 Generate, Subscribe, Dispose

  41. Operators Startup Idea: Κάνω queries σαν LINQ αλλά είναι πιο…

  42. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

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

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

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

    O bservabl e. Thr ow ( new Except i on( ) ) ;
  46. Never / / Άπει ρο st r eam O bservabl

    e. Never< i nt > ( ) ;
  47. Range / / Επι στρέφει τρει ς τι μές μεταξύ

    0 και 3 O bservabl e. Range( 0, 3) ; 0 1 2
  48. 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( ) ;
  49. Data streams •Τα Observables είναι data streams –Θέλω μόνο όσα

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

    παράγοντας σημαντικός και παραμετροποιήσιμος –.Delay(TimeSpan.FromSeconds(1)) dot s r esul t s
  51. Demo 1 Get me some mouse moves

  52. Demo 2 Δημιουργώ Observable από το event TextChanged Δημιουργώ Observable

    από μία ασύγχρονη κλήση web Tα συνδέω (combination-the Rx sexy way) για να γράφω
  53. 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,
  54. Schedulers Startup Idea: Threads, Cross-Thread Violation, Virtual Time για τεστς…

  55. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στο scheduling •.Rx = Observables + LINQ + Schedulers
  56. Παραμετροποίηση 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? • … ?
  57. Πίσω στην αφαίρεση clock execution context execution policy

  58. 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) ; }
  59. Επίπεδα Αφαίρεσης 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) ;
  60. Επίπεδα Αφαίρεσης 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) ) ;
  61. Επίπεδα Αφαίρεσης 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 ( ) ; } }) ;
  62. Επίπεδα Αφαίρεσης 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) ;
  63. Ενοποιημένο 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
  64. 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
  65. 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
  66. Add a Scheduler to Demo 1 Back to Demo 1

  67. Demo 3 Ιστορικά δεδομένα, χρόνος, custom scheduler

  68. Event processing as in “Complex Event Processing” Startup Ideas: Combinators,

    combinators, combinators!!!
  69. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
  70. Ερώτημα: δίνεται ροή από τιμές μετοχών Ανεύρεση: 10% αύξησης της

    τιμής Παράδειγμα για Event Processing
  71. 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 )
  72. Aggregation MSFT INTC Συνάθροιση με την προηγούμενη μέρα: Buf f

    er( 2, 1) 21.75 22.54 20.98 27.01 27.96 31.21 30.73
  73. 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
  74. Reduce MSFT INTC Εννοποήση των streams: M er ge( )

    27.96 31.21
  75. Done! 27.96 31.21

  76. 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
  77. point events vs. continuous Startup Ideas: Streaming windows

  78. Reactive Extensions Τι είναι το Rx; 1.τύποι που αναπαριστούν ασύγχρονες

    ροές δεδομένων 2.operators για queries σε ασύγχρονες ροές δεδομένων 3.τύποι που μας ανοίγουν τον δρόμο στον συγχρονισμό •.Rx = Observables + LINQ + Schedulers
  79. Διάρκεια events (point events vs. continuous) 0 1 2 0

    1 2 vs
  80. Παράδειγμα με κλικ ποντικιού left right left

  81. Representing Duration begin begin end end Window

  82. Demo 4 Παράγουμε διαφορές σημείων κίνησης ποντικιού, κάνοντας ενέργειες σε

    ένα stream το window του οποίου καθορίζεται από το δεύτερο stream
  83. Θεωρητικές βάσεις 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())
  84. 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
  85. Quiz • var source = Observable.Repeat(1, 3) .Window(2) .SelectMany(c =>

    c); • var source = Observable.Range(1, 3) .SelectMany(c => Observable.Repeat(c,3));
  86. 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)
  87. 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
  88. Some People to thank Erik Meijer Bart De Smet Wes

    Dyer
  89. KEEP HACKING! Thank you!