<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>RafaelF's blog</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/rafaelf/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/rafaelf/feed.xml</link>
    <description>Comments and code on event-driven computing and cloud, among others.</description>
    <lastBuildDate>Wed, 17 Apr 2019 03:24:29 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Moving!</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/moving</link>
      <pubDate>Sat, 27 Apr 2013 13:09:50 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2013/04/27/moving/</guid>
      <description><![CDATA[I'm moving over to https://functionalcat.wordpress.com/
&nbsp;
See you there!]]></description>
      <content:encoded><![CDATA[<p>I'm moving over to <a title="https://functionalcat.wordpress.com/" href="https://functionalcat.wordpress.com/">https://functionalcat.wordpress.com/</a></p>
<p>&nbsp;</p>
<p>See you there!</p>]]></content:encoded>
    </item>
    <item>
      <title>Various implementations of Rx</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/various-implementations-of-rx</link>
      <pubDate>Mon, 18 Mar 2013 13:11:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2013/03/18/various-implementations-of-rx/</guid>
      <description><![CDATA[I'm starting to lose track of the various ports/implementations of Rx out there. So I figured I'd...]]></description>
      <content:encoded><![CDATA[<p>I'm starting to lose track of the various ports/implementations of Rx out there. So I figured I'd list the ones I'm aware of here (and please let me know if you know of others!)</p>
<p>&nbsp;</p>
<ul>
<li><a title="Rx .NET" href="https://rx.codeplex.com/">Rx .NET</a></li>
<li><a title="RxJS" href="https://rx.codeplex.com/">RxJS</a> (JavaScript)</li>
<li><a title="Rx CPP" href="https://rx.codeplex.com">Rx CPP</a></li>
<li><a title="RxJava" href="https://github.com/Netflix/RxJava">RxJava</a></li>
<li><a title="ReactiveCocoa" href="https://github.com/ReactiveCocoa/ReactiveCocoa">Reactive Cocoa</a></li>
<li><a title="RxPython" href="https://github.com/akuendig/RxPython">RxPython</a></li>
<li><a title="Reactive-Dart" href="https://github.com/prujohn/Reactive-Dart">Reactive-Dart</a></li>
<li><a title="Rx.Rb" href="https://github.com/Reactive-Extensions/Rx.rb">Rx.rb</a> (Ruby)</li>
</ul>
<p>&nbsp;</p>
<p>This is pretty cool, because effectively we have a cross-platform lingua franca for event processing. The Rx .NET implementation is serving as&nbsp;the reference implementation, but it won't be long before we see some ports innovating at their own pace.</p>
<p>What do people think?&nbsp;Should there be an implementation-agnostic Rx specification? How far away are we from an Rx Summit and a committee for standardization?</p>
<p>&nbsp;</p>
<p>&nbsp;<strong>UPDATE (3/18/2013 3:34 PM PDT):</strong> Added RxPython<br />&nbsp;<strong>UPDATE (3/18/2013 3:44 PM PDT):</strong> Added Dart, corrected link to Reactive Cocoa<br />&nbsp;<strong>UPDATE (3/18/2013 9:50 PM PDT):</strong> Added&nbsp;Rx.rb&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>Computing event duration using Rx</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/computing-event-duration-using-rx</link>
      <pubDate>Mon, 18 Feb 2013 16:31:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2013/02/18/computing-event-duration-using-rx/</guid>
      <description><![CDATA[If you've looked at IIS logs, you've probably noticed that there are events for when a request is...]]></description>
      <content:encoded><![CDATA[<p>If you've looked at IIS logs, you've probably noticed that there are events for when a request is received and when the response is sent (see a <a href="https://blogs.msdn.com/b/wndp/archive/2007/02/01/event-tracing-in-http-sys-part-3-typical-request.aspx">typical request</a>). It's useful to understand average duration per request if you're examining the health of your system. Alas, there's no "duration" event. Sure, you can parse the file and compute it post-facto, but wouldn't it be nice to compute an activity's duration as it is happening using Rx?</p>
<p>Good news everyone! We can! The trick is reactive coincidence. Head over to<a href="https://channel9.msdn.com/Shows/Going+Deep/Programming-Streams-of-Coincidence-with-Join-and-GroupJoin-for-Rx"> Channel 9</a>. Stay here for examples and code.</p>
<p>Let's abstract out the duration pattern. Assume we have events of the following type:</p>
<p><span style="color: blue; font-family: Consolas; font-size: 9pt;">public<span style="color: black;"> <span style="color: blue;">class<span style="color: black;"> Activity <br /></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">{<br />&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="color: blue;">public<span style="color: black;"> <span style="color: blue;">long<span style="color: black;"> Id {<span style="color: blue;">get<span style="color: black;">; <span style="color: blue;">private<span style="color: black;"> <span style="color: blue;">set<span style="color: black;">;}&nbsp;<br /></span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">public<span style="color: black;"> <span style="color: blue;">int<span style="color: black;"> Payload {<span style="color: blue;">get<span style="color: black;">; <span style="color: blue;">private<span style="color: black;"> <span style="color: blue;">set<span style="color: black;">;}&nbsp;</span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">public<span style="color: black;"> Activity(<span style="color: blue;">long<span style="color: black;"> id)&nbsp;<br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id = id;&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Payload = (<span style="color: blue;">new<span style="color: black;"> Random()).Next(<span style="color: #c81efa;">0<span style="color: black;">,<span style="color: #c81efa;">100<span style="color: black;">);&nbsp;<br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;</span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">public<span style="color: black;"> <span style="color: blue;">override<span style="color: black;"> <span style="color: blue;">string<span style="color: black;"> ToString()&nbsp;<br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">return<span style="color: black;"> String.Format(<span style="color: #dc1414;">"ActivityId = {0}, Payload = {1}"<span style="color: black;">, Id, Payload);&nbsp;<br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;} <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">} </span></p>
<p>And let us generate a couple of observable sequences, one for starts and one for ends:</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">var<span style="color: black;"> starts = Observable&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(<span style="color: #c81efa;">1<span style="color: black;">))&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select(x =&gt; <span style="color: blue;">new<span style="color: black;"> Activity(x+<span style="color: #c81efa;">5<span style="color: black;">))&nbsp;<br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Timestamp()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;">.Publish()</span><span style="color: black; font-family: Consolas; font-size: 9pt;">;&nbsp;</span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">var<span style="color: black;"> ends = Observable&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Timer(TimeSpan.Zero, TimeSpan.FromSeconds(<span style="color: #c81efa;">1<span style="color: black;">))&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select(x =&gt; <span style="color: blue;">new<span style="color: black;"> Activity(x))&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Timestamp()<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Publish();&nbsp;</span>&nbsp;</p>
<p>Notice I'm offsetting the Ids in starts by 5 to simulate a duration of 5 seconds. Since I'm interested in computing duration, I need a handle on when events occurred. The <span style="font-family: Consolas;">Timestamp()</span> operator in Rx returns an observable sequence of type <span style="font-family: Consolas;">Timestamped&lt;T&gt;</span>, in which you have a <span style="font-family: Consolas;">Timestamp</span> property and the original <span style="font-family: Consolas;">T</span> is inside a <span style="font-family: Consolas;">Value</span> property. Neat!</p>
<p>An intuitive way to compute duration is by using a cross product and a where (or, as we data folks commonly call it, a join!):</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">var<span style="color: black;"> crossed = <span style="color: blue;">from<span style="color: black;"> s <span style="color: blue;">in<span style="color: black;"> starts&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> ends&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">where<span style="color: black;"> s.Value.Id.Equals(e.Value.Id)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">select<span style="color: black;"> <span style="color: blue;">new<br /></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Id = s.Value.Id, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;">Duration = e.Timestamp.Subtract(s.Timestamp)&nbsp;<br />&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }; </span></p>
<p>&nbsp;</p>
<p>A join, you say? Then it should be possible to also use the <span style="font-size: 9pt;">Join</span> operator in Rx:</p>
<p><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">var<span style="color: black;"> joined = starts.Join(ends&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, _ =&gt; Observable.Never&lt;Unit&gt;()&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, _ =&gt; Observable.Never&lt;Unit&gt;()&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, (s, e) =&gt; <span style="color: blue;">new<span style="color: black;"> {Start = s, End = e})&nbsp;<br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(t =&gt; t.Start.Value.Id == t.End.Value.Id) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 10pt;">.Select(t =&gt; <span style="color: blue;">new<br /></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id = t.Start.Value.Id&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Duration =&nbsp;t.End.Timestamp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Subtract(t.Start.Timestamp)&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}); </span></p>
<p>What's going on here? The second and third parameter are returning a non-terminating observable sequence. This means we are assuming the duration of events in both sequences is unknown when we evaluate the join, that is, we expect to be able to correlate them for as long as the sequences exist. This is exactly the implication in our crossed expression. However, there is a variation of the duration pattern that also occurs: How much time elapsed between starts and ends (assuming we should see an end within <em>n</em> seconds)? In some cases, we don't want to wait forever for an answer, and would like to know if an end didn't occur within a time bound. Turns out we can use the join operator to express the same condition:</p>
<p><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;<span style="color: blue;">var<span style="color: black;"> boundJoined = starts</span></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">.Join(ends&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; font-family: Consolas; font-size: 10pt;">, _ =&gt; Observable.Timer(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; TimeSpan.FromSeconds(<span style="color: #c81efa;">6<span style="color: black;">))&nbsp;<br />&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, _ =&gt; Observable.Empty&lt;Unit&gt;()&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, (s, e) =&gt; <span style="color: blue;">new<span style="color: black;"> {Start = s, End = e})&nbsp;<br />&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Where(t =&gt; t.Start.Value.Id == t.End.Value.Id)&nbsp;<br />&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.Select(t =&gt; <span style="color: blue;">new<br /></span></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Id = t.Start.Value.Id&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;, Duration = t.End.Timestamp<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Subtract(t.Start.Timestamp)&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 10pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;});</span></p>
<p>The second parameter expresses our assumption that start events are "valid" for 6 seconds, and that end events are finite. So now you have a template for computing duration given a stream of start events and a stream of end events.</p>
<p>Try them out! (don't forget to <span style="font-family: Consolas; font-size: 9pt;">Connect()</span> the <span style="font-family: courier new,courier;">starts</span> and <span style="font-family: courier new,courier;">ends</span> sequences :) ) [<a title="LINQPad share" href="https://share.linqpad.net/fdxfnl.linq">LINQPad share</a>]</p>]]></content:encoded>
    </item>
    <item>
      <title>A few English-to-Rx examples</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/a-few-english-to-rx-examples</link>
      <pubDate>Sun, 27 Jan 2013 17:23:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2013/01/27/a-few-english-to-rx-examples/</guid>
      <description><![CDATA[Thanks to Erik Meijer for teaching me some of these patterns and reviewing the post. Thanks to Mark...]]></description>
      <content:encoded><![CDATA[<p>Thanks to Erik Meijer for teaching me some of these patterns and reviewing the post. Thanks to Mark Simms and Curt Peterson for comments and reviews.</p>
<p>Mark Simms and I have decided to start a new habit: If we find ourselves answering a similar question thrice, we'll blog about it. Without further ado, here are a few "I'd like to compute" statements expressed as Rx queries. They are a subset from a (now old) <a href="https://blogs.msdn.com/b/masimms/archive/2010/09/16/101-ish-linq-samples-for-streaminsight.aspx">post</a>. If you find yourself in the presence of data being pushed to you (instead of you pulling for data), you'll find all the tools you need to process it&nbsp;in .NET. Here's a brief overview of Observable Sequences, and simple patterns that illustrate how we can use Rx to express computations over observable sequences.</p>
<h2>Observable Sequences</h2>
<p>A sequence of data can be pulled or pushed. Pull-based sequences are very familiar to us because of the years of patterns we've been using: (1) Go read a fixed amount of data from a database, (2) Create a list, (3) Iterate over a collection, etc. In .NET, the <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">IEnumerable&lt;T&gt;</span> interface represents a pull-based sequence. With a push-based sequence, one does not usually control access to the data. Instead of <em>iterating</em> over it, we <em>observe</em> it. In .NET, <span style="background-color: white;">the <span style="color: black; font-family: Consolas; font-size: 9pt;">IObservable&lt;T&gt;</span></span> interface represents this notion. Observable sequences are the dual of Enumerable sequences (check out <a href="https://channel9.msdn.com/shows/Going+Deep/E2E-Erik-Meijer-and-Wes-Dyer-Reactive-Framework-Rx-Under-the-Hood-1-of-2/">a great explanation by the Rx team</a>). I'd like to share with you a few common patterns to create observable sequences.</p>
<h3>Creating observable sequences</h3>
<p>Sometimes even when a source can be cast as an enumerable, we may want to iterate over it and observe it <em>as we read it</em>. Notice the use of <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">ReadLineAsync</span> so as to not block processing in what is commonly a slow I/O operation. Also notice how clean it is in&nbsp;C# 5.0 to make the lambda expression in <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">Observable.Create()</span> asynchronous, by just writing <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">async (observer, c)</span> and&nbsp; <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">await</span>&nbsp; in the asynchronous call (More on Rx&nbsp;and .NET 4.5 <a href="https://channel9.msdn.com/Shows/Going+Deep/Bart-De-Smet-Inside-Rx-V2-Beta">here</a>):</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span>public<span style="color: black;"> <span style="color: blue;">static<span style="color: black;"> <span style="color: #2b91af;">IObservable<span style="color: black;">&lt;<span style="color: blue;">string<span style="color: black;">&gt; FromFile(<span style="color: blue;">string<span style="color: black;"> fileName)&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;</span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">{<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<span style="color: black;"> <span style="color: #2b91af;">Observable<span style="color: black;">.Create&lt;<span style="color: blue;">string<span style="color: black;">&gt;(<span style="color: blue;">async<span style="color: black;"> (observer, c) =&gt; <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; using<span style="color: black;"> (<span style="color: blue;">var<span style="color: black;"> sr = <span style="color: blue;">new<span style="color: black;"> <span style="color: #2b91af;">StreamReader<span style="color: black;">(path: fileName)) <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; var<span style="color: black;"> line = <span style="color: blue;">default<span style="color: black;">(<span style="color: blue;">string<span style="color: black;">);&nbsp;<br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; try<br /></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; while<span style="color: black;"> ((line = <span style="color: blue;">await<span style="color: black;"> sr.ReadLineAsync()) != <span style="color: blue;">null<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="color: blue;"><span style="color: black;">&amp;&amp; !c.IsCancellationRequested ) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; observer.OnNext(line); <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; observer.OnCompleted(); <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; catch<span style="color: black;"> (<span style="color: #2b91af;">Exception<span style="color: black;"> e) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; observer.OnError(e); <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }); <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; } </span></p>
<p>&nbsp;<br />Another common need: periodically polling a data source or periodically producing new data. We can use <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">Observable.Timer()</span> and compose on top of the resulting sequence to create a new sequence:</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span></span></span>public<span style="color: black;"> <span style="color: blue;">static<span style="color: black;"> <span style="color: #2b91af;">IObservable<span style="color: black;">&lt;<span style="color: blue;">string<span style="color: black;">&gt; PeriodicProduction(<span style="color: #2b91af;">TimeSpan<span style="color: black;"> startTime, <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: #2b91af;">TimeSpan<span style="color: black;"> period)&nbsp;<br /></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<span style="color: black;"> <span style="color: #2b91af;">Observable<span style="color: black;">.Timer(dueTime: startTime, period: period) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Select(x =&gt; <span style="color: #2b91af;">String<span style="color: black;">.Format(<span style="color: #a31515;">"A new ({0}) string!"<span style="color: black;">, x)); <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; }&nbsp;&nbsp;&nbsp;&nbsp; </span></p>
<p><br />You can imagine the timer-based pattern doing other interesting things, such as polling from a queue.</p>
<h3>Merging observable sequences</h3>
<p>The <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">Merge</span> operator performs a union of observable sequences and produces a new one. The sequences must be union-compatible, i.e., they must be of the same type. A running example: suppose we want to simulate an observable sequence (based on timer) of one or more sensors reporting a particular metric periodically. Let's use the following schema:</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: #000000;">&nbsp;&nbsp;&nbsp; </span>public<span style="color: black;"> <span style="color: blue;">class<span style="color: black;"> <span style="color: #2b91af;">SensorData<br /></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; {<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public<span style="color: black;"> <span style="color: #2b91af;">DateTime<span style="color: black;"> StartTime { <span style="color: blue;">get<span style="color: black;">; <span style="color: blue;">set<span style="color: black;">; } <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public<span style="color: black;"> <span style="color: blue;">int<span style="color: black;"> SensorId { <span style="color: blue;">get<span style="color: black;">; <span style="color: blue;">set<span style="color: black;">; } <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public<span style="color: black;"> <span style="color: blue;">long<span style="color: black;"> Value { <span style="color: blue;">get<span style="color: black;">; <span style="color: blue;">set<span style="color: black;">; } <br /><br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; public<span style="color: black;"> <span style="color: blue;">override<span style="color: black;"> <span style="color: blue;">string<span style="color: black;"> ToString() <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<span style="color: black;"> <span style="color: #2b91af;">String<span style="color: black;">.Format(<span style="color: #a31515;">"StartTime: {0}, SensorId: {1}, Value: {2}"<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black;">, StartTime, SensorId, Value); <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; } <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; } <br /><br /></span>One way to produce the desired sequence is to create a method that returns an observable sequence for a single sensor and merge an array of individual sensor sequences. You can imagine this maps to sensor networks: each sensor produces a sequence, but we really want to query over a sequence of observations from all sensors:<span style="font-size: small; background-color: white;"><span style="color: blue;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="font-size: small;"><br /></span><br /></span></span></span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; public static<span style="color: black;"> <span style="color: #2b91af;">IObservable<span style="color: black;">&lt;<span style="color: #2b91af;">SensorData<span style="color: black;">&gt; CreateSensor(<span style="color: #2b91af;">TimeSpan</span> reportingFrequency<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , <span style="color: blue;">int </span>sensorId)&nbsp;<br /></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return<span style="color: black;"> <span style="color: #2b91af;">Observable<span style="color: black;">.Timer(<span style="color: #2b91af;">TimeSpan<span style="color: black;">.Zero, reportingFrequency) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; .Select(x =&gt; <span style="color: blue;">new<span style="color: black;"> <span style="color: #2b91af;">SensorData<span style="color: black;">() <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;<br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; StartTime = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now <br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , SensorId = sensorId <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , Value = (<span style="color: blue;">new<span style="color: black;"> <span style="color: #2b91af;">Random<span style="color: black;">(<span style="color: #2b91af;">DateTime<span style="color: black;">.Now.Millisecond<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;">&nbsp;+ sensorId)).Next(0, 100) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; }); <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; } <br /><br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp; var<span style="color: black;"> individualSensors = <span style="color: blue;">new<span style="color: black;">[] <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; { <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Helpers<span style="color: black;">.CreateSensor(<span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(1), 1000), <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Helpers<span style="color: black;">.CreateSensor(<span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(1), 1001), <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: #2b91af;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Helpers<span style="color: black;">.CreateSensor(<span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(1), 1002) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp; };<br /><br />&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">var<span style="color: black;"> sensors = individualSensors.Merge();&nbsp;</span></span></span>&nbsp;</p>
<h3>Expressing multiple queries over an observable sequence</h3>
<p><br />We are now almost ready to get dangerous. I would like to express many queries over the same sequence (without evaluating the generating function for each query). The <span style="color: black; font-family: Consolas; font-size: 9pt;">.Publish()</span> method on observables produces a <span style="color: black; font-family: Consolas; font-size: 9pt;">ConnectableObservable</span>, which is a type of <span style="color: black; font-family: Consolas; font-size: 9pt;">Subject </span>(see <a href="https://msdn.microsoft.com/en-us/library/system.reactive.subjects(v=vs.103).aspx">Subjects</a>). A <span style="color: black; font-family: Consolas; font-size: 9pt;">ConnectableObservable</span> is <em>cold</em>, which means it is not producing data until we ask it to via the <span style="color: black; font-family: Consolas; font-size: 9pt;">.Connect()</span> method (then it's <em>hot</em>). This is a very useful construct, since essentially we have a one-to-many pipeline with the generating expression being evaluated only once. Put another way, if you have an observable and run two queries over it, you have two copies of the sequence being generated. If you write two queries over a <span style="color: black; font-family: Consolas; font-size: 9pt;">ConnectableObservable</span>, once you invoke <span style="color: black; font-family: Consolas; font-size: 9pt;">.Connect()</span> on the latter, there is only one copy of the underlying sequence. Sharing is good <span style="font-family: Wingdings;">J</span></p>
<p>Let's put it all together and create an observable sequence of sensor readings and a connectable observable:</p>
<p><span style="color: black; font-family: Consolas;"><span style="color: blue; font-size: 9pt;">&nbsp;&nbsp;&nbsp; var<span style="color: black;"> sensors = individualSensors.Merge().Publish(); </span></span></span></p>
<p>We are now ready to write some queries. We'll do Filters and Windowed aggregates next, and when we're ready to start the data flow, we'll write</p>
<p><span style="color: blue;"><span style="font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp; <span style="color: black;">sensors.Connect();</span></span> </span></p>
<h2>Filters</h2>
<h3><span style="background-color: white;">How do I filter a stream, keeping only specific events?<br /> </span></h3>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q1 = <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> sensors <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where<span style="color: black;"> e.Value &gt; 20 <br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> e; </span></span></span></p>
<h3><span style="background-color: white;">How do I filter on multiple conditions? <br /></span></h3>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q2 = <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> sensors <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where<span style="color: black;"> (e.SensorId == 1001) &amp;&amp; (e.Value &gt; 70) <br /></span></span></span><span style="color: black;"><span style="font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> e;</span></span></span> </span></p>
<h2>Windows and aggregations</h2>
<h3><span style="background-color: white;">How can I calculate the average of all events in the last 5 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q3 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Window(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(5)) <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.Average(_e =&gt; _e.Value) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, Average = a }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I calculate the average of all events in the past 5 seconds, every 2 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q4 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Window(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(5)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , timeShift: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(2)) <br /></span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.Average(_e =&gt; _e.Value) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, Average = a }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I calculate the average of the past 5 events? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q5 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Window(count: 5) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.Average(_e =&gt; _e.Value) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, Average = a }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How do I measure the rate of arriving events every two seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q6 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Window(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(2)) <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.Count() <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, Count = a }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I calculate the average of each group of events in the last 10 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q7 = <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> sensors <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group<span style="color: black;"> e <span style="color: blue;">by<span style="color: black;"> e.SensorId <span style="color: blue;">into<span style="color: black;"> g <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> g.Buffer(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(10)) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , SensorId = g.Key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ,&nbsp;Average = w.Average(_e =&gt; _e.Value)}; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I calculate the average of each group of events in the last 20 seconds, every 10 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q8 = <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> sensors <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group<span style="color: black;"> e <span style="color: blue;">by<span style="color: black;"> e.SensorId <span style="color: blue;">into<span style="color: black;"> g <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> g.Buffer(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(20)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , timeShift: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(10)) <br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;"><span style="color: black;"><span style="color: blue;"><span style="color: black;"><span style="color: #2b91af;"><span style="color: black;">, SensorId = g.Key<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , Average = w.Average(_e =&gt; _e.Value) }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I find the events with the largest value every 10 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp; var<span style="color: black;"> q9 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Window(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(10))&nbsp;<br /></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.Max(e =&gt; e.Value) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, Max = a }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I find the events with the two smallest values in the last 10 seconds, every 5 seconds? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q10 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> sensors.Buffer(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(10)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; , timeShift: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(5)) <br /></span></span></span></span></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> a <span style="color: blue;">in<span style="color: black;"> w.OrderBy(x =&gt; x.Value).Take(2) <br /></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> a; </span></span></span></p>
<p>&nbsp;</p>
<h3><span style="background-color: white;">How can I detect if two events with the same ID value are received within a specific time frame, such as a 5 minute window? </span></h3>
<p>&nbsp;<span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q11 = <span style="color: blue;">from<span style="color: black;"> e <span style="color: blue;">in<span style="color: black;"> sensors <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; group<span style="color: black;"> e <span style="color: blue;">by<span style="color: black;"> e.SensorId <span style="color: blue;">into<span style="color: black;"> g <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> g.Buffer(timeSpan: <span style="color: #2b91af;">TimeSpan<span style="color: black;">.FromSeconds(5)) <br /></span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; where<span style="color: black;"> w.Count &gt; 2 <br /></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; select<span style="color: black;"> <span style="color: blue;">new<span style="color: black;"> { Time = <span style="color: #2b91af;">DateTime<span style="color: black;">.Now, SensorId = g.Key }; </span></span></span></span></span></span></span></p>
<p>&nbsp;</p>
<h2>Final remarks</h2>
<p><br />At this point, assuming we have subscribed an observer to each query, all we need to is <span style="font-family: Consolas; font-size: 9pt;">sensors.Connect()</span> and watch our Rx processing come to life. If you're hacking or prototyping and want a quick way to visualize the output, try the <span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">.DumpLive()</span> method in <a href="https://www.linqpad.net/">LINQPad</a>. Hope these patterns are useful &ndash; and let me know if there are other examples you'd like to see. And remember,<a href="https://blogs.msdn.com/b/streaminsight/archive/2012/06/25/streaminsight-2-1-released.aspx"> StreamInsight 2.1. has a tight integration with Rx</a>. Sometimes you want to process observable sequences, other times you want to work over temporal streams (CTIs).</p>
<p>Bonus: The queries and patterns in a <a href="https://share.linqpad.net/lpxeh4.linq">self-contained LINQPad file</a>.</p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
    <item>
      <title>How to express common windowing patterns using Rx</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/how-to-express-common-windowing-patterns-using-rx</link>
      <pubDate>Thu, 17 Jan 2013 16:47:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2013/01/17/how-to-express-common-windowing-patterns-using-rx/</guid>
      <description><![CDATA[When processing continuous streams, one is usually interested in continuous answers broken into...]]></description>
      <content:encoded><![CDATA[<p>When processing continuous streams, one is usually interested in continuous answers broken into epochs or periods of time. Usually, the computations one formulates feel more like "compute the average speed per road segment every 5 minutes" than "what is the average speed in this road segment given all the data I've seen?" If you've been doing stream processing for a while, this is not news to you. In fact, you're probably thinking of windowed queries.</p>
<p>Earlier work on stream engines exposed me to a very practical definition of a window, in which the function that partitions the underlying stream is parameterized by two attributes: <em>range</em> and <em>slide</em>. Range defines what's in a window, and slide defines when new windows start*. In my experience, people often talk about three types of windows:</p>
<ol>
<li>Tumbling window (range = slide)</li>
<li>Sliding window (range &gt; slide)</li>
<li>Hopping window (range &lt; slide)</li>
</ol>
<p>Additionally, people also distinguish whether windows are defined in terms of counts or in terms of time (Count vs. Temporal window). I'll try to illustrate these types of windows with a picture in Figure 1.</p>
<p style="text-align: center;"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/86/metablogapi/6114.011813_0100_Howtoexpres1.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-86-metablogapi/6114.011813_5F00_0100_5F00_Howtoexpres1.png" alt="" /></p>
<p style="text-align: center;">Figure 1. Windowing examples.</p>
<p>Let the x axis represent time. In Figure 1 (a), you'll see tumbling count-windows with range = slide = 2. Notice a window opens and closes based on event occurrence. For the stream illustrated here, we get three windows, each with two elements in it. Now assume we define windowing in terms of seconds, with slide = range = 2 seconds. In Figure 1 (b), you see tumbling temporal-windows. Notice windows open and close based on time instead of occurrence. Figure 1 (c) illustrates sliding count-windows with range =2 and slide =1, and Figure 1(d) shows hopping count-windows with range = 1 and slide = 2. (Note: The <a href="https://msdn.microsoft.com/en-us/data/gg577609.aspx">Rx team</a> likes to visualize operations using <a href="https://rxwiki.wikidot.com/marble-diagrams">marble diagrams</a>, which I don't use here, but may use later.)</p>
<p>Enough said! Let's look at some Rx code and Count windows. I realize I'm repeating content that exists in many other sources, but if you think of windows the way I do, this may help you get started expressing them using Rx. Consider the observable sequence <span style="font-family: Consolas;">xs</span> in Code Fragment 1. The <span style="font-family: Consolas; font-size: 9pt;">Window</span><em> </em>operator in Rx is one way we can implement both count-based and temporal-based windows of the three types I described. One of its overloads takes two parameters: <span style="font-family: Consolas; font-size: 9pt;">count</span> (range) and <span style="font-family: Consolas; font-size: 9pt;">skip</span> (slide), which we apply in the expression <span style="font-family: Consolas; font-size: 9pt;">q</span> in Code Fragment 1.</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> xs = <span style="color: blue;">new<span style="color: black;"> [] {0,0,1,2,3,2,2,3,4,5,6}.ToObservable(); </span></span></span></span></span></p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> xs.Window(count:2, skip:2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">select<span style="color: black;"> w;</span></span></span></span></span></span></span></span></span> </span></p>
<p style="text-align: center;"><span style="color: black;">Code Fragment 1. Windowing an observable sequence.</span></p>
<p>The expression <span style="font-family: Consolas; font-size: 9pt;">q</span> results in a stream of type <span style="font-family: Consolas; font-size: 9pt;">IObservable&lt;IObservable&lt;int&gt;&gt;</span>, which is a stream of streams -- therefore every window itself is an observable stream to which I can subscribe. OK, I can't resist the temptation. Figure 2 shows the windowing in a marble diagram.</p>
<p style="text-align: center;"><img src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/51/86/metablogapi/5531.011813_0100_Howtoexpres2.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-51-86-metablogapi/5531.011813_5F00_0100_5F00_Howtoexpres2.png" alt="" /></p>
<p style="text-align: center;">Figure 2. Marble diagram for the expression q.</p>
<p>Since each window is an observable, I can subscribe to them. In Code Fragment 2, I show how we can inspect each window and its contents and confirm this is a tumbling window by subscribing to each window. Output 1 shows the console output.</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int<span style="color: black;"> counter = 1;<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">q.Subscribe(w =&gt; <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; { <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">int<span style="color: black;"> i = counter++; <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">w.Subscribe(<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">x =&gt; <span style="color: #2b91af;">Console<span style="color: black;">.WriteLine(<span style="color: #a31515;">"Window: {0}; Value: {1}"<span style="color: black;">, i,x)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">); <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="background-color: white;">});</span>&nbsp;</span>&nbsp;</p>
<p style="text-align: center;"><span style="color: black;">Code Fragment 2. Subscribing to each window. </span></p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 1; Value: 0 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 1; Value: 0 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 2; Value: 1 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 2; Value: 2 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 3; Value: 3 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 3; Value: 2 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 4; Value: 2 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 4; Value: 3 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 5; Value: 4 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 5; Value: 5 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Window: 6; Value: 6 </span></p>
<p style="text-align: center;"><span style="color: black; background-color: white;">Output 1. Console output for the tumbling count-window. </span></p>
<p>&nbsp;</p>
<p><span style="background-color: white;">Usually we want to compute something over the contents of each window, such as an average. You can apply an aggregate function to each window and obtain a stream of results back, as shown in Code Fragment 3. </span>The expression <span style="font-family: Consolas; font-size: 9pt;">q2</span> computes the average of every window and results in a stream of type <span style="font-family: Consolas; font-size: 9pt;">IObservable&lt;double&gt;</span>. As before, we can inspect the stream by subscribing to it and printing out to console (see Output 2).</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: blue;">var<span style="color: black;"> q2 = <span style="color: blue;">from<span style="color: black;"> w <span style="color: blue;">in<span style="color: black;"> xs.Window(2,2)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt; background-color: white;"><span style="color: blue;">from<span style="color: black;"> x <span style="color: blue;">in<span style="color: black;"> w.Average() <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="background-color: white;"><span style="color: blue;">select<span style="color: black;"> x;</span></span></span> </span></p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; <span style="color: black; font-family: Consolas; font-size: 9pt;">q2.Subscribe(w =&gt;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="color: #2b91af;"><span style="background-color: white;">Console</span><span style="color: black;">.WriteLine(</span><span style="background-color: white;"><span style="color: #a31515;">"Average: {0}<span style="color: #a31515;">"</span></span></span><span style="color: black;">, w) <br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span></span><span style="color: black; font-family: Consolas; font-size: 9pt;">); </span></p>
<p style="text-align: center;">Code Fragment 3. Windowed Average.</p>
<p><span style="color: black; font-family: Consolas; font-size: 9pt;"><span style="font-family: Arial;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>Average: 0 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average: 1.5 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average: 2.5 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average: 2.5 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average: 4.5 <br /></span><span style="color: black; font-family: Consolas; font-size: 9pt;">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; Average: 6 </span></p>
<p style="text-align: center;">Output 2. Windowed average over xs.</p>
<p>&nbsp;</p>
<p>Temporal windows you ask? No problem. <span style="font-family: Consolas; font-size: 9pt;">Window</span> has an overload that takes two <span style="font-family: Consolas; font-size: 9pt;">TimeSpan</span> objects, <span style="font-family: Consolas; font-size: 9pt;">timeSpan</span> (range) and <span style="font-family: Consolas; font-size: 9pt;">timeShift </span>(slide). Moreover, if you find the idea of a stream of streams to be a little daunting and you just want a stream of collections (with each collection, <span style="font-family: Consolas; font-size: 9pt;">List&lt;T&gt;</span>, representing a window), you can look at the <span style="font-family: Consolas; font-size: 9pt;">Buffer</span> operator.</p>
<p>I keep encountering these simple patterns over and over again. Hopefully this taxonomy (Tumbling, Sliding, or Hopping on one dimension; Count, and Temporal on another) is useful to you. And as your stream processing needs grow, bear in mind <span style="font-family: Consolas; font-size: 9pt;">Window </span>and <span style="font-family: Consolas; font-size: 9pt;">Buffer</span> do many more wonderful things, such as using one stream to signal closing a window on another **.</p>
<p>---------------------------</p>
<p>&nbsp;* Two nice papers that discuss various Windowing semantics:<br />- Li <em>et al</em>. <a href="https://dl.acm.org/citation.cfm?doid=1066157.1066193">Semantics and evaluation techniques for window aggregates in data streams</a>. SIGMOD 05.<br />- Botan <em>et al.</em> <a href="https://dl.acm.org/citation.cfm?id=1920841.1920874&amp;coll=DL&amp;dl=ACM&amp;CFID=170283063&amp;CFTOKEN=76480291">SECRET: a model for analysis of the execution semantics of stream processing systems</a>. VLDB 2010.<br /><br />** Additional great reads on <span style="font-family: Consolas; font-size: 9pt;">Window</span>, <span style="font-family: Consolas; font-size: 9pt;">Buffer</span>, and Rx:<br />- <a href="https://msdn.microsoft.com/en-us/library/hh212117(v=vs.103).aspx">Window</a> and <a href="https://msdn.microsoft.com/en-us/library/hh229145(v=vs.103).aspx">Buffer</a> on MSDN.<br />- Campbell, Lee. <a href="https://introtorx.com/">Introduction to Rx</a>. (Online book)</p>
<p>&nbsp;</p>
<p>Thanks to Mark Simms, Christian Martinez, and Nina Sarawgi for their suggestions while preparing this post.</p>]]></content:encoded>
    </item>
    <item>
      <title>What I think lurks behind the Big Data meme</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/what-i-think-lurks-behind-the-big-data-meme</link>
      <pubDate>Mon, 29 Oct 2012 20:49:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2012/10/29/what-i-think-lurks-behind-the-big-data-meme/</guid>
      <description><![CDATA[Some buzzwords can be annoying. Regardless of what your opinion is about the Big Data meme, you'd be...]]></description>
      <content:encoded><![CDATA[<p>Some buzzwords can be annoying. Regardless of what your opinion is about the <em>Big Data</em> meme, you'd be hard-pressed to ignore the massive mindshare the term has gained. I think our industry is in danger of getting lost in the rhetoric and chatter, instead of remaining laser-focused on the actual problems that need solving. I'd like to share my personal opinion on what I think deserves our attention, why I think it's important, and how I go about navigating Big Data conversations.</p>
<p>When it comes to Big Data definitions, I really enjoy <a href="https://www.gartner.com/it-glossary/big-data/">Gartner's</a>. It says Big Data "is the term adopted by the market to describe extreme information management and processing issues which exceed the capability of traditional information technology along one or multiple dimensions to support the use of the information assets." This statement is ambiguous enough to allow anybody with a problem they can't solve with what they have can feel they have a Big Data problem. And in my experience, this is mostly what ends up happening. Pain points about availability, resiliency, distribution, latency, and incremental aggregation are somehow bucketed behind Big Data. And then you see people trying to understand how they'll leverage a batch-oriented technique (which scales and distributes very easily) to deal with computations that are better served by a continuous event-processor, a well-tuned database, a non-relational indexed store, or a combination of all of them.</p>
<p>You see, I'm skeptical of the Big Data silver bullet. In fact, when a conversation starts gravitating towards a single-system solution, I feel we're failing to understand the problem(s) a customer may actually be trying to solve.</p>
<p>The way I see it, the term is not helping us have a discussion about the actual business and technology problems enterprises of all sizes are now worrying about. The size, cost, and volume of today's problems are actually making the bulk of enterprise customers face a new design challenge, in which they truly must develop distributed, heterogeneous solutions. To me, this is what truly lurks behind these conversations: businesses of not-so-massive size must now build a new class of systems for which they may be ill-equipped. How many companies can comfortably claim a decade or more of distributed systems know-how?</p>
<p>Try this: Next time you're in a Big Data conversation, substitute "Distributed System" for "Big Data". Chances are by doing so you'll realize these problems are fortunately not new. You'll suddenly recognize that our field has decades of research into this space, ready to be invoked when appropriate. All of the sudden, you'll start weaving through the actual "why is this hard" questions, instead of the "what this could mean" discussions.</p>
<p>With this in mind, also remember economics, of course, play an immensely important role here. It is unlikely that most companies will build their own datacenters. It is unlikely they will develop their own frameworks and implementations of the actor model to encapsulate the necessary primitives to build these new class of systems. It is also unlikely they will find a turnkey solution for their specific problem. It is, however, very likely they will find platforms and ecosystems that provide most of the pieces required to run this new class of businesses. And the last part is where I think the discussions should be focused: what are those pieces? What are the tradeoffs? How do they integrate with existing investments? How do they scale out gracefully? And more importantly, how can a business use those pieces and start on a <em>happy path</em> from day one?</p>
<p>I know distributed systems programming is tough. I know it doesn't sound sexy. But I think that's the hard problem: the current set of business requirements is best served by this class of applications, which most of us are currently ill-equipped to write. To me, that's the real problem we should be tackling, instead of getting lost in the buzz.</p>]]></content:encoded>
    </item>
    <item>
      <title>A simple feedback loop in Rx</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/a-simple-feedback-loop-in-rx</link>
      <pubDate>Sat, 30 Jun 2012 17:45:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2012/06/30/a-simple-feedback-loop-in-rx/</guid>
      <description><![CDATA[Feedback loops are very common and incredibly useful. Unsurprisingly, my colleagues and I keep...]]></description>
      <content:encoded><![CDATA[<p>Feedback loops are very common and incredibly useful. Unsurprisingly, my colleagues and I keep finding these loops in distributed systems. I thought I&rsquo;d blog about a simple pattern to express them in Rx. Many thanks to Valery Mizonov, Erik Meijer, and Colin Meek for a fruitful discussion about this topic.</p>
<p>Consider a data source emitting a strictly monotonic sequence of natural numbers. Assume the data source can also filter out odd or even numbers. We would like to stimulate the data source to flip the filter based on a condition detected by a data consumer. We need a mechanism to enable communication contrary to the stream flow. For this purpose we will use a <a title="BehaviorSubject" href="https://msdn.microsoft.com/en-us/library/hh211949(v=vs.103)">BehaviorSubject</a>.</p>
<p>A <span style="font-family: courier new,courier;">BehaviorSubject</span> is a type of subject that remembers the last event it has received. One can also declare an initial state, such as</p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> BehaviorSubject&lt;<span style="color: #0000ff;">bool</span>&gt; behaviorSubject = <span style="color: #0000ff;">new</span> BehaviorSubject&lt;<span style="color: #0000ff;">bool</span>&gt;(<span style="color: #0000ff;">true</span>);</pre>
<!--CRLF--></div>
</div>
<p>We will use the last state of the subject as the gating logic that decides whether to produce odd or even numbers. Here is a sample observable source implementing this behavior:</p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> var data = from x <span style="color: #0000ff;">in</span> Observable.Interval(TimeSpan.FromSeconds(0.5)).Take(100)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span>            <span style="color: #0000ff;">where</span> (x % 2 == 0) == behaviorSubject.First()</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>            select x;</pre>
<!--CRLF--></div>
</div>
<p>Last, we would like to express the logic that sends an event to the subject as a result of a condition in the consumer. Consider, for example, flipping from odd numbers to even numbers every time the consumer receives 10 events. Here is an example implementation of this logic:</p>
<div id="codeSnippetWrapper" style="margin: 20px 0px 10px; padding: 4px; border: 1px solid silver; width: 97.5%; text-align: left; line-height: 12pt; overflow: auto; font-family: 'Courier New', courier, monospace; font-size: 8pt; cursor: text; direction: ltr; max-height: 200px; background-color: #f4f4f4;">
<div id="codeSnippet" style="padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;">
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum1" style="color: #606060;"> 1:</span> var printer = data</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum2" style="color: #606060;"> 2:</span>     .Do(Console.WriteLine)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum3" style="color: #606060;"> 3:</span>     .Select((_, count) =&gt; count)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: #f4f4f4;"><span id="lnum4" style="color: #606060;"> 4:</span>     .Where(count =&gt; (count + 1) % 10 == 0)</pre>
<!--CRLF-->
<pre style="margin: 0em; padding: 0px; width: 100%; text-align: left; color: black; line-height: 12pt; overflow: visible; font-family: 'Courier New', courier, monospace; font-size: 8pt; direction: ltr; background-color: white;"><span id="lnum5" style="color: #606060;"> 5:</span>     .Do(_ =&gt; behaviorSubject.OnNext(!behaviorSubject.First()));</pre>
<!--CRLF--></div>
</div>
<p>Notice the use of <span style="font-family: courier new,courier;">.Do()</span> to side-effect (or &ldquo;T&rdquo;) console output, <em>and </em>the call to <span style="font-family: courier new,courier;">OnNext()</span>on the <span style="font-family: courier new,courier;">BehaviorSubject</span>.</p>
<p>Two practices to notice: (1) We exclusively use the subject to relay the state change from the consumer to the producer, and (2) we use side-effects to conduct this communication.</p>]]></content:encoded>
    </item>
    <item>
      <title>Sequences and StreamInsight: Initiating a computation</title>
      <link>https://docs.microsoft.com/archive/blogs/rafaelf/sequences-and-streaminsight-initiating-a-computation</link>
      <pubDate>Thu, 22 Mar 2012 14:51:00 GMT</pubDate>
      <dc:creator><![CDATA[Rafael.F]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/rafaelf/2012/03/22/sequences-and-streaminsight-initiating-a-computation/</guid>
      <description><![CDATA[Colin Meek, Alex Raizman, and I recently blogged about the various gestures that initiate a...]]></description>
      <content:encoded><![CDATA[<p>Colin Meek, Alex Raizman, and I recently blogged about the various gestures that initiate a computation in StreamInsight. The discussion is most relevant with Sequence Integration when the StreamInsight engine is hosted in-memory. Check it out:</p>
<p><a href="https://blogs.msdn.com/b/meek/archive/2012/03/21/sequences-and-streaminsight-initiating-a-computation.aspx">https://blogs.msdn.com/b/meek/archive/2012/03/21/sequences-and-streaminsight-initiating-a-computation.aspx</a></p>
<p>&nbsp;</p>
<p>&nbsp;</p>]]></content:encoded>
    </item>
  </channel>
</rss>