<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Scott Weinstein on .Net, Linq, PowerShell, WPF, and WCF</title><link>http://weblogs.asp.net/sweinstein/default.aspx</link><description>Scott Weinstein on .Net, Linq, PowerShell, WPF, and WCF</description><dc:language>en</dc:language><generator>CommunityServer 2007 SP1 (Build: 20510.895)</generator><geo:lat>40.755101</geo:lat><geo:long>-73.993373</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by-sa/2.0/</creativeCommons:license><image><link>http://weblogs.asp.net/sweinstein/</link><url>http://farm1.static.flickr.com/153/415763544_e3056a1bc1_o_d.png</url><title>Scott Weinstein</title></image><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://feeds.feedburner.com/ScottWeinstein" type="application/rss+xml" /><feedburner:emailServiceId>ScottWeinstein</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/ScottWeinstein" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.feedburner.com%2FScottWeinstein" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><item><title>From the ReactiveFramework to StreamInsight and Back</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/OwXxHzqzQlw/from-the-reactiveframework-to-streaminsight-and-back.aspx</link><pubDate>Tue, 25 Aug 2009 05:01:05 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7180724</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7180724</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7180724</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/08/25/from-the-reactiveframework-to-streaminsight-and-back.aspx#comments</comments><description>&lt;p&gt;In my last post I showed how to &lt;a href="http://weblogs.asp.net/sweinstein/archive/2009/08/23/routing-streaminsight-output-streams-to-a-ui.aspx" target="_blank"&gt;send StreamInsight output streams to a UI via the ReactiveFramework&lt;/a&gt;. Here’s we’ll do the reverse, by sending an RX stream into a CEP stream. Instead of a partial example, I’ll use an end to end example showing simulated stock ticks, computing the 5 min rolling &lt;a href="http://en.wikipedia.org/wiki/VWAP" target="_blank"&gt;VWAP&lt;/a&gt;, and showing the results on a UI.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;First we’ll generate the ticks:&lt;/p&gt;  &lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;System.Collections.Generic.IObservable&amp;lt;StockTick&amp;gt; stockTicks =
    System.Linq.Observable.Generate(
                new Random() // inital state
                 , rnd =&amp;gt; true // continue
                 , rnd =&amp;gt; new StockTick() // next value
                         {
                             Price = rnd.NextDouble() * 1000,
                             Side = Sides[rnd.Next(Sides.Length - 1)],
                             Size = (long)(rnd.NextDouble() * 1000),
                             Symbol = Symbols[rnd.Next(Symbols.Length - 1)],
                             Timestamp = DateTime.Now
                         }
                         , rnd =&amp;gt; (int)(rnd.NextDouble() * 2000)  // waitInterval
                         , rnd =&amp;gt; rnd  // iterate
                         );&lt;/pre&gt;

&lt;p&gt;And now convert to a CEP stream:&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;var cepInput = stockTicks.ToCEP()
                .ToCepStream(tick =&amp;gt; tick.Timestamp);&lt;/pre&gt;

&lt;p&gt;Where &lt;font face="Cons"&gt;ToCep()&lt;/font&gt; is just the inverse of &lt;font face="con"&gt;ToRx()&lt;/font&gt;, &lt;a href="http://weblogs.asp.net/sweinstein/archive/2009/08/23/routing-streaminsight-output-streams-to-a-ui.aspx" target="_blank"&gt;defined previously&lt;/a&gt;. &lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;public static S.IObservable&amp;lt;T&amp;gt; ToCEP&amp;lt;T&amp;gt;(this RX.IObservable&amp;lt;T&amp;gt; rxSource)
{
    return new CEPAnonymousObservable&amp;lt;T&amp;gt;(
        (S.IObserver&amp;lt;T&amp;gt; cepObserver) =&amp;gt; 
            RX.ObservableExtensions.Subscribe(rxSource, nextVal=&amp;gt; cepObserver.OnNext(nextVal)));
}&lt;/pre&gt;

&lt;p&gt;Computing the rolling 5 min VWAP, (grouped by symbol) takes some effort&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;var alteredDurationStream = cepInput
                            .ToPointEventStream()
                            .AlterEventDuration(tick =&amp;gt; TimeSpan.FromMinutes(5));

var fiveMinVWaps =  from fivemin in
                    alteredDurationStream
                    group fivemin by fivemin.Symbol into fGrp
                    from evwindow in fGrp.Snapshot()
                    select new
                    { 
                       Symbol = fGrp.Key, 
                       TotalAmount = evwindow.Sum(fmin =&amp;gt; fmin.Size * fmin.Price),
                       TotalVolume = evwindow.Sum(fmin =&amp;gt; fmin.Size), 
                    };

var fiveMinVWaps2 = from fivemin in fiveMinVWaps
                    select new VWAPItem()
                    {
                        Symbol = fivemin.Symbol,
                        VWAP = fivemin.TotalAmount / fivemin.TotalVolume,
                        Timestamp = DateTime.Now,
                    };&lt;/pre&gt;

&lt;p&gt;Although this nearly looks like conventional .Net Linq code, it isn’t. Think Linq2SQL. These are expressions, not pure CLR lambdas, so it’s not possible to place a breakpoint, nor are any arbitrary .Net computations allowed. The reason for the additional fiveMinVWaps2 projection is that it’s not possible to compute anything but the Sum or Avg in a SnapShot().&lt;/p&gt;

&lt;p&gt;Now that we have the data, we can convert to back to a RX stream:&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;PropertyInfo tsProp = typeof(VWAPItem).GetProperty(&amp;quot;Timestamp&amp;quot;);
var vwaps = fiveMinVWaps2.ToObservable(tsProp).ToRX();&lt;/pre&gt;

&lt;p&gt;And update an ObservableCollection&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;vwaps.Post(_sc).Subscribe(item =&amp;gt;
{
    var exists = CEPOS1.Where(vw =&amp;gt; vw.Symbol == item.Symbol).FirstOrDefault();
    if (exists == null)
        CEPOS1.Add(item);
    else
        exists.CopyFrom(item);
});&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;Which displays on a UI&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/image_3439C57F.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/sweinstein/image_thumb_686DEEC5.png" width="176" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7180724" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=OwXxHzqzQlw:jwvqoKylsnk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=OwXxHzqzQlw:jwvqoKylsnk:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=OwXxHzqzQlw:jwvqoKylsnk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/OwXxHzqzQlw" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ReactiveFramework/default.aspx">ReactiveFramework</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/RX/default.aspx">RX</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/StreamInsight/default.aspx">StreamInsight</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/08/25/from-the-reactiveframework-to-streaminsight-and-back.aspx</feedburner:origLink></item><item><title>Routing StreamInsight output streams to a UI</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/8wslvWl2zoA/routing-streaminsight-output-streams-to-a-ui.aspx</link><pubDate>Sun, 23 Aug 2009 21:01:48 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7179215</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7179215</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7179215</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/08/23/routing-streaminsight-output-streams-to-a-ui.aspx#comments</comments><description>&lt;p&gt;One compelling feature of StreamInsight is it’s in-process hosting model. In addition to reducing the complexity of server side installs, it’s now possible to have a&amp;#160; CEP engine in the client UI. &lt;/p&gt;  &lt;p&gt;The simplest way of getting CEP streams onto the UI would be the Reactive Framework methods. Something like&lt;/p&gt;  &lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;queryOutputStream
    .ToObservable(...)
    .Post(syncContext)
    .Subscribe(item=&amp;gt; collection.Add(item) );&lt;/pre&gt;

&lt;p&gt;But in the CTP that won’t work. As I discovered a few days ago The IObservable used in StreamInsight is defined in a different namespace and assembly than the IObservable in the System.Reactive. Furthermore the StreamInsight api lacks the base classes and extension methods defined in System.Reactive.&lt;/p&gt;

&lt;p&gt;I didn’t want to go the normal route of creating an implementation of IObserver, on say a ViewModel, route the data through the dispatcher on onto a collection, as while it would have the benefits of simplicity and it would work, it would mean giving up on all the goodness in System.Reactive.&lt;/p&gt;

&lt;p&gt;The first method I tried in an effort to convert a CEP IObservable into an RX IObservable didn’t work, but was instructive nonetheless. &lt;/p&gt;

&lt;p&gt;Using StreamInsight’s own I/O adapter API, I would create an “Eventing” Adapter which would raise an conventional .Net event on an object of my choosing, then using the ReactiveFramework, convert that event to an RX IObservable.&amp;#160; &lt;/p&gt;

&lt;p&gt;But it’s not easy (or possible) to do. Instances of output adapters are created by OutputAdapterFactories, which in turn are created by Factory methods. You can send in a configuration object, but it needs to be XML serializable, so there’s no sending in of Action&amp;lt;&amp;gt; delegates.&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;But it turns out that it’s not hard to convert from a CEP IObservable to an RX IObservable. &lt;/p&gt;

&lt;p&gt;First you need a CEP AnonymousObserver&amp;lt;T&amp;gt; &lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;using S = System;
internal class AnonymousObserver&amp;lt;T&amp;gt; : S.IObserver&amp;lt;T&amp;gt;
{
    private bool isStopped;
    private S.Action _onCompleted;
    private S.Action&amp;lt;S.Exception&amp;gt; _onError;
    private S.Action&amp;lt;T&amp;gt; _onNext;

    public AnonymousObserver(S.Action&amp;lt;T&amp;gt; onNext, S.Action&amp;lt;S.Exception&amp;gt; onError)
        : this(onNext, onError, () =&amp;gt; { })
    {
    }
    public AnonymousObserver(S.Action&amp;lt;T&amp;gt; onNext, S.Action&amp;lt;S.Exception&amp;gt; onError, S.Action onCompleted)
    {
        _onNext = onNext;
        _onError = onError;
        _onCompleted = onCompleted;
    }
    public void OnCompleted()
    {
        if (!isStopped)
        {
            isStopped = true;
            _onCompleted();
        }
    }
    public void OnError(S.Exception exception)
    {
        if (!isStopped)
        {
            isStopped = true;
            _onError(exception);
        }
    }
    public void OnNext(T value)
    {
        if (!isStopped)
            _onNext(value);
    }
}&lt;/pre&gt;

&lt;p&gt;Then an extension method taking a CEP IObservable, returning a RX AnonymousObservable&amp;lt;T&amp;gt;, subscribing to it via the CEP IObserver and on the OnNext, calling the returning RX IObservable’s on OnNext.&lt;/p&gt;

&lt;p&gt;Like so:&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;using RX = System.Collections.Generic;
using S = System;

public static class CEPExtMethods
{
    public static RX.IObservable&amp;lt;T&amp;gt; ToRX&amp;lt;T&amp;gt;(this S.IObservable&amp;lt;T&amp;gt; source)
    {
        return new AnonymousObservable&amp;lt;T&amp;gt;(
            (RX.IObserver&amp;lt;T&amp;gt; rxObserver) =&amp;gt;
                            source.Subscribe(new AnonymousObserver&amp;lt;T&amp;gt;(
                                    nextVal =&amp;gt; rxObserver.OnNext(nextVal),
                                    rxObserver.OnError
                                )));
    }
}&lt;/pre&gt;

&lt;p&gt;To use it:&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;var queryOutputStream = CreateQueryTemplate(input);
var queryOutput = queryOutputStream.ToObservable(typeof(EventTypeCount).GetField(&amp;quot;Time&amp;quot;));
queryOutput.ToRX().Send(_sc).Subscribe(v =&amp;gt; this.CEPOS1.Add(v));&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;And results from the Observable sample on screen &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/image_5FC9CBDB.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/sweinstein/image_thumb_54340E9C.png" width="170" height="243" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7179215" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=8wslvWl2zoA:OvtvKK6SwBc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=8wslvWl2zoA:OvtvKK6SwBc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=8wslvWl2zoA:OvtvKK6SwBc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/8wslvWl2zoA" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ClickOnce/default.aspx">ClickOnce</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ReactiveFramework/default.aspx">ReactiveFramework</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/RX/default.aspx">RX</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/StreamInsight/default.aspx">StreamInsight</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/08/23/routing-streaminsight-output-streams-to-a-ui.aspx</feedburner:origLink></item><item><title>A first look at MS StreamInsight</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/6f4q4hhepv0/a-first-look-at-ms-streaminsight.aspx</link><pubDate>Thu, 20 Aug 2009 12:23:05 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7174974</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7174974</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7174974</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/08/20/a-first-look-at-ms-streaminsight.aspx#comments</comments><description>&lt;p&gt;This morning I was hoping to take a few minutes to modify one of the examples in the StreamInsight CTP and send an output stream to a UI, rather than the text files used in the examples. I thought this would be easy, as the readme states that there’s&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“An alpha version of the StreamInsight libraries for development using the IObservable/IObserver programming paradigm.”&lt;/p&gt;    &lt;p&gt;&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;But it wasn’t. The IObservable used in StreamInsight is defined in a different namespace than the IObservable in the System.Reactive and the StreamInsight api lacks the base classes and extension methods defined in System.Reactive. At this time, the two APIs &lt;strong&gt;do not&lt;/strong&gt; play well with each other.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Some thoughts on how to get around this temporary inconsistency:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Recompile System.Reactive to use StreamInsight’s IObservable/IObserver &lt;/li&gt;    &lt;li&gt;Create a type converter between the two IObservable/IObservers &lt;/li&gt;    &lt;li&gt;Create a StreamInsight output adapter which just raises a .Net event, then use the RX method of converting events to IObservables &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Perhaps tonight.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7174974" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=6f4q4hhepv0:e6Sr97KpMyE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=6f4q4hhepv0:e6Sr97KpMyE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=6f4q4hhepv0:e6Sr97KpMyE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/6f4q4hhepv0" height="1" width="1"/&gt;</description><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/08/20/a-first-look-at-ms-streaminsight.aspx</feedburner:origLink></item><item><title>Exploring the Reactive Framework part II</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/BQJirM6lC-c/exploring-the-reactive-framework-part-ii.aspx</link><pubDate>Wed, 12 Aug 2009 04:15:16 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7167113</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7167113</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7167113</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/08/12/exploring-the-reactive-framework-part-ii.aspx#comments</comments><description>&lt;p&gt;Talk around the water cooler is that it might be possible to use the Reactive Framework for some lightweight CEP.&lt;/p&gt;  &lt;p&gt;I’ll correct some of the (big) mistakes from &lt;a href="http://weblogs.asp.net/sweinstein/archive/2009/07/29/exploring-the-reactive-framework-rx.aspx" target="_blank"&gt;my last post&lt;/a&gt; and build up a “jumping” window extension method for &lt;font face="con"&gt;IObservable&lt;/font&gt;s.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In my last post I build a simple grouping method, but in it I immediately turned the push style of processing into a pull style by using the &lt;font face="Consolas"&gt;GetEnumerator()&lt;/font&gt; method. This is a bad idea for two key reasons, a) it takes the inherit elegance of the RX reduces it to a for loop, and b) it commits a cardinal sin of multi-threading and reserves a thread for a primarily blocking operation.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here’s an improved version&lt;/p&gt;  &lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;public static IObservable&amp;lt;IEnumerable&amp;lt;TSource&amp;gt;&amp;gt; ToWindow&amp;lt;TSource&amp;gt;(
    this IObservable&amp;lt;TSource&amp;gt; source, 
    Func&amp;lt;TSource, IEnumerable&amp;lt;TSource&amp;gt;, bool&amp;gt; grouper)
{
    return RXGrouping.ToWindow(source, val =&amp;gt; val, grouper);
}


public static IObservable&amp;lt;IEnumerable&amp;lt;TResult&amp;gt;&amp;gt; ToWindow&amp;lt;TSource, TResult&amp;gt;(
 this IObservable&amp;lt;TSource&amp;gt; source,
 Func&amp;lt;TSource, TResult&amp;gt; selector, 
 Func&amp;lt;TSource, IEnumerable&amp;lt;TResult&amp;gt;, bool&amp;gt; grouper)
{
    List&amp;lt;TResult&amp;gt; res = new List&amp;lt;TResult&amp;gt;();
    return new AnonymousObservable&amp;lt;IEnumerable&amp;lt;TResult&amp;gt;&amp;gt;(
        observer =&amp;gt;
            source.Subscribe(
            nextVal =&amp;gt;
            {
                try
                {
                    if (!grouper(nextVal, res))
                    {
                        observer.OnNext(res);
                        res = new List&amp;lt;TResult&amp;gt;();
                    }
                    res.Add(selector(nextVal));
                }
                catch (Exception exception)
                {
                    observer.OnError(exception);
                    return;
                }
            }
            ,observer.OnError
            ,observer.OnCompleted));
}&lt;/pre&gt;

&lt;p&gt;The mistake in the prior version stemmed in part from thinking that I needed to ask for the next value, but of course the RX will supply the next value when it’s available. &lt;/p&gt;

&lt;p&gt;To use it:&lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;TimeSpan windowDuration = new TimeSpan(0,0,10);
generatedNums
    // add a Timestamp to our raw data
    .Select(val =&amp;gt; new { Timestamp = DateTime.Now, Value = val })
    // create a 5 min &amp;quot;jumping&amp;quot; window
    .ToWindow((lastVal, seq) =&amp;gt; 
            (seq.Count() == 0) || 
            (lastVal.Timestamp - seq.First().Timestamp &amp;lt; windowDuration))
    // create item for display
    .Select(seq =&amp;gt; new { Timestamp = seq.First().Timestamp
                        , Values = seq.Select(a =&amp;gt; a.Value).ToArray()
                        , Average = seq.Average(a =&amp;gt; a.Value) })
    // marshal and add to list
    .Post(sc).Subscribe(wv =&amp;gt; WindowVals.Add(wv));&lt;/pre&gt;

&lt;p&gt;&amp;#160;&lt;/p&gt;

&lt;p&gt;And the results&lt;/p&gt;

&lt;p&gt;&amp;#160;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/image_56B9DED3.png"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/sweinstein/image_thumb_7FC47DCF.png" width="465" height="249" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next we’ll look into creating a &lt;strong&gt;sliding&lt;/strong&gt; window.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7167113" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=BQJirM6lC-c:zGByAMCKQdE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=BQJirM6lC-c:zGByAMCKQdE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=BQJirM6lC-c:zGByAMCKQdE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/BQJirM6lC-c" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CLR/default.aspx">CLR</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/WPF/default.aspx">WPF</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ReactiveFramework/default.aspx">ReactiveFramework</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/08/12/exploring-the-reactive-framework-part-ii.aspx</feedburner:origLink></item><item><title>Exploring the Reactive Framework (RX)</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/FBzzxtxa_mg/exploring-the-reactive-framework-rx.aspx</link><pubDate>Wed, 29 Jul 2009 05:07:18 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7156321</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7156321</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7156321</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/07/29/exploring-the-reactive-framework-rx.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html" target="_blank"&gt;A few days ago&lt;/a&gt;, intentionally or not, a version of the Reactive Framework was &lt;a href="http://weblogs.asp.net/sweinstein/archive/2009/07/23/preview-of-the-reactive-framework-available-via-silverlight-toolkit.aspx" target="_blank"&gt;released into the wild&lt;/a&gt;. Let’s see how we can use the RX for computations on a stream of data. As an example we’ll take a stream of ints and produce the averages in groups of five.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/image_2D20AD5F.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="image" border="0" alt="image" src="http://weblogs.asp.net/blogs/sweinstein/image_thumb_5D4A88D3.png" width="244" height="228" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Here’s the primary stream of numbers, using the static &lt;font face="Consolas"&gt;Generate()&lt;/font&gt;&amp;#160; method&lt;/p&gt;  &lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;Random rnd = new Random();
var generatedNums = Observable.Generate&amp;lt;int,int&amp;gt;(
                    0 // seed
                    , d =&amp;gt; true // condition to continue
                    , d =&amp;gt; d % 12 //generated value 
                    , d =&amp;gt; (int)(rnd.NextDouble() * 300) //delay
                    , d =&amp;gt; d + 1 // modify value for next iter
                    );&lt;/pre&gt;

&lt;p&gt;And to consume the stream by adding the values into an &lt;font face="Consolas"&gt;ObservableCollection&lt;/font&gt; &lt;/p&gt;

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;generatedNums
    .Post(sc) // move onto UI thread
    .Subscribe(num =&amp;gt; Numbers.Add(num) // add numbers to observable collection
    );&lt;/pre&gt;
&lt;font face="Trebuchet MS"&gt;Computing the average, in groups of 5 turns out to be harder, as the Reactive FX doesn’t seem to have a &lt;font face="Consolas"&gt;GroupBy()&lt;/font&gt; method at this time. Here’s what I came up with:&lt;/font&gt; 

&lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;generatedNums
    .Grouper(a =&amp;gt; a, (a,list) =&amp;gt; list.Count() &amp;lt; 5) // group into lists of 5, returning an IObservable&amp;lt;IEnumerable&amp;lt;int&amp;gt;&amp;gt;
    .Select(list =&amp;gt; list.Average()) // take the average of the list, so project IObservable&amp;lt;IEnumerable&amp;lt;int&amp;gt;&amp;gt; to IObservable&amp;lt;int&amp;gt; 
    .Post(sc).Subscribe(mean =&amp;gt; Averages.Add(mean) // move onto UI and add to observable collection
    );&lt;/pre&gt;
&lt;font face="Trebuchet MS"&gt;And the implementation for “&lt;font face="Consolas"&gt;Grouper()&lt;/font&gt;”&lt;/font&gt;&amp;#160; &lt;pre class="brush: csharp; gutter: false; toolbar: false;"&gt;public static IObservable&amp;lt;IEnumerable&amp;lt;TResult&amp;gt;&amp;gt; Grouper&amp;lt;TSource, TResult&amp;gt;(
    this IObservable&amp;lt;TSource&amp;gt; source,
    Func&amp;lt;TSource, TResult&amp;gt; selector
    , Func&amp;lt;TSource, IEnumerable&amp;lt;TResult&amp;gt;, bool&amp;gt; grouper) 
{
    return new AnonymousObservable&amp;lt;IEnumerable&amp;lt;TResult&amp;gt;&amp;gt;(
        observer =&amp;gt;
            source.Subscribe(x =&amp;gt;
        {
            try
            {
                using (var er = source.GetEnumerator())
                    while (er.MoveNext())
                    {
                        bool needsMove = false;
                        var res = new List&amp;lt;TResult&amp;gt;();
                        while (grouper(er.Current, res) &amp;amp;&amp;amp; ((needsMove) ? er.MoveNext() : true))
                        {
                            needsMove = true;
                            res.Add(selector(er.Current));
                        }
                        observer.OnNext(res);
                    }
            }
            catch (Exception exception)
            {
                observer.OnError(exception);
                return;
            }
        },
        new Action&amp;lt;Exception&amp;gt;(observer.OnError),
        new Action(observer.OnCompleted)));
}&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7156321" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FBzzxtxa_mg:2A5R82rInVE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FBzzxtxa_mg:2A5R82rInVE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FBzzxtxa_mg:2A5R82rInVE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/FBzzxtxa_mg" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/WPF/default.aspx">WPF</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ReactiveFramework/default.aspx">ReactiveFramework</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/RX/default.aspx">RX</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/07/29/exploring-the-reactive-framework-rx.aspx</feedburner:origLink></item><item><title>Preview of the Reactive Framework available via Silverlight Toolkit</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/FoJpb7XBfV0/preview-of-the-reactive-framework-available-via-silverlight-toolkit.aspx</link><pubDate>Thu, 23 Jul 2009 21:49:03 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7153650</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>4</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7153650</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7153650</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/07/23/preview-of-the-reactive-framework-available-via-silverlight-toolkit.aspx#comments</comments><description>&lt;p&gt;Via &lt;a href="http://themechanicalbride.blogspot.com/2009/07/introducing-rx-linq-to-events.html"&gt;Jafar Husain&lt;/a&gt; - it appears that there’s a early release of the &lt;a href="http://langnetsymposium.com/2009/talks/23-ErikMeijer-LiveLabsReactiveFramework.html" target="_blank"&gt;Live Labs Reactive Framework&lt;/a&gt; (&amp;amp; with &lt;a href="http://channel9.msdn.com/shows/Going+Deep/Expert-to-Expert-Brian-Beckman-and-Erik-Meijer-Inside-the-NET-Reactive-Framework-Rx/" target="_blank"&gt;Brian Beckman and Erik Meijer&lt;/a&gt;) in the latest &lt;a href="http://www.codeplex.com/Silverlight" target="_blank"&gt;Silverlight Toolkit&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;In addition to some of the standard LINQ operators (&lt;font face="Consolas"&gt;Select, Where, Aggregate&lt;/font&gt;), some new operators look quite promising&amp;#160; - &lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;font face="Consolas"&gt;ForkJoin&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;Merge&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;Delay&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;HoldUntilChanged&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;Latest&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;Merge&lt;/font&gt;&lt;/li&gt;    &lt;li&gt;&lt;font face="Consolas"&gt;Throttle&lt;/font&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;font face="Consolas"&gt;&lt;/font&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7153650" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FoJpb7XBfV0:TXuHf1jGrdQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FoJpb7XBfV0:TXuHf1jGrdQ:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=FoJpb7XBfV0:TXuHf1jGrdQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/FoJpb7XBfV0" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CLR/default.aspx">CLR</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/ReactiveFramework/default.aspx">ReactiveFramework</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/RX/default.aspx">RX</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/07/23/preview-of-the-reactive-framework-available-via-silverlight-toolkit.aspx</feedburner:origLink></item><item><title>When Add(ing)-Type, choose your method signatures wisely</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/1-W-KKkxVLM/when-add-ing-type-choose-your-method-signatures-wisely.aspx</link><pubDate>Fri, 08 May 2009 18:44:18 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7078825</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>2</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7078825</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7078825</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/05/08/when-add-ing-type-choose-your-method-signatures-wisely.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Powershell V2 has some great new features, in particular Add-Type and Remoting features are likely to be quite popular and work together without much issue. That said, there are edge cases which illustrate how the types returned from remoting calls. The following script demonstrates the issue&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;$csCode = @&amp;quot;
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo {
    public static class D
    {
        public static int Add(int a, int b)
        {
            return a + b;
        }
        public static int AddArray(int[] ints)
        {
            return ints.Sum();
        }
        public static int AddEnumerable(IEnumerable&amp;lt;object&amp;gt; ints)
        {
            return ints.Cast&amp;lt;int&amp;gt;().Sum();
        }
        public static int AddEnumerable(IEnumerable&amp;lt;int&amp;gt; ints)
        {
            return ints.Sum();
        }
    }
}
&amp;quot;@

Add-Type -TypeDefinition $csCode -Language CSharpVersion3
$oneRemote = Invoke-Command -ComputerName localhost  -ScriptBlock { return 1 }
$listRemote = Invoke-Command -ComputerName localhost  -ScriptBlock { return (1,2,3) }
$one = &amp;amp;{return 1}
if ($one -eq $oneRemote)
{
    Write-Host &amp;quot;1 == 1&amp;quot;
}

$v =  [Demo.D]::Add($one,$oneRemote)
Write-output &amp;quot;One + OneRemote = $v&amp;quot;  ; $v=$null
$v = [Demo.D]::AddArray(($one,$oneRemote))
Write-output &amp;quot;One + OneRemote via array =  $v&amp;quot; ; $v=$null

$v = [Demo.D]::AddArray($listRemote)
Write-output &amp;quot;One + OneRemote via remote array =  $v&amp;quot; ; $v=$null

$v = [Demo.D]::AddEnumerable((1,2,3,4))
Write-output &amp;quot;One + OneRemote via local IEnumerable =  $v&amp;quot; ; $v=$null

$v = [Demo.D]::AddEnumerable($listRemote)
Write-output &amp;quot;One + OneRemote via remote IEnumerable =  $v&amp;quot;; $v=$null



$oneRemote | Get-Member&lt;/pre&gt;

&lt;p&gt;The output from the above is&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;&lt;font size="1" face="con"&gt;1 == 1 
      &lt;br /&gt;One + OneRemote = 2 

      &lt;br /&gt;One + OneRemote via array =&amp;#160; 2 

      &lt;br /&gt;One + OneRemote via remote array =&amp;#160; 6 

      &lt;br /&gt;One + OneRemote via local IEnumerable =&amp;#160; 10 # so far as expected&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="1" face="con"&gt;&amp;#160; &lt;br /&gt;&lt;/font&gt;&lt;font color="#ff0000" size="1" face="con"&gt;Exception calling &amp;quot;AddEnumerable&amp;quot; with &amp;quot;1&amp;quot; argument(s): &amp;quot;Specified cast is not valid.&amp;quot; 
      &lt;br /&gt;At typeDemo.ps1:49 char:29 

      &lt;br /&gt;+ $v = [Demo.D]::AddEnumerable &amp;lt;&amp;lt;&amp;lt;&amp;lt; ($listRemote) 

      &lt;br /&gt;&lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="1" face="con"&gt;&amp;#160;&amp;#160; TypeName: System.Int32 &lt;/font&gt;&lt;/p&gt;

  &lt;p&gt;&lt;font size="1" face="con"&gt;Name&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; MemberType&amp;#160;&amp;#160; Definition&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;----&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; ----------&amp;#160;&amp;#160; ----------&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;CompareTo&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Int32 CompareTo(Object value)

      &lt;br /&gt;Equals&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Boolean Equals(Object obj), System.Boolean Equals(Int32 obj)&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;GetHashCode&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Int32 GetHashCode()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;GetType&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.Type GetType()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;GetTypeCode&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.TypeCode GetTypeCode()&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;ToString&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; Method&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; System.String ToString()

      &lt;br /&gt;&lt;/font&gt;&lt;strong&gt;&lt;font size="1" face="con"&gt;PSComputerName&amp;#160;&amp;#160;&amp;#160;&amp;#160; NoteProperty System.String PSComputerName=localhost&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;PSShowComputerName NoteProperty System.Boolean PSShowComputerName=True&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;br /&gt;RunspaceId&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; NoteProperty System.Guid RunspaceId=e0dc5c05-c87d-41ad-afe0-16bc1b711f08&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160;&amp;#160; &lt;/font&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;What’s happening under the covers is that the PowerShell reporting infrastructure is returning a PSObject. By inspecting the type via Get-Member you can see that it has some extra NoteProperties. To PowerShell and .Net methods that expect integers and arrays of integers, the object looks and behaves like it should. But if your Add-Types use a more LINQ style approach, which expects an IEnumerable&amp;lt;T&amp;gt;, the PowerShell type system doesn’t properly convert the adapted type to its native underlying type and runtime exceptions are the result.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7078825" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=1-W-KKkxVLM:Yeh6ftdUOeo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=1-W-KKkxVLM:Yeh6ftdUOeo:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=1-W-KKkxVLM:Yeh6ftdUOeo:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/1-W-KKkxVLM" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CLR/default.aspx">CLR</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/05/08/when-add-ing-type-choose-your-method-signatures-wisely.aspx</feedburner:origLink></item><item><title>Some interesting sessions at the Microsoft Enterprise Developer and Solutions Conference</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/Ogu7PuKG08s/some-interesting-sessions-at-the-microsoft-enterprise-developer-and-solutions-conference.aspx</link><pubDate>Mon, 04 May 2009 17:13:55 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7071948</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7071948</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7071948</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/05/04/some-interesting-sessions-at-the-microsoft-enterprise-developer-and-solutions-conference.aspx#comments</comments><description>&lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;There are some interesting &lt;a href="http://entdevcon.telligent.com/sessions/" target="_blank"&gt;sessions at the 2009 EntDevCon&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Three of particular interest to me are are&lt;/p&gt;  &lt;p&gt;1. “Coral8 Engine Integrated with Microsoft Windows HPC Server 2008”&amp;#160; at 11 on Tuesday. &lt;/p&gt;  &lt;p&gt;I had a chance to see some of the early bits, and for anyone interesting in streaming data with high computations needs, this promises to be well worth your time. In a future post I’ll talk about how this technology can be used.&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;Additionally, some co-workers at &lt;a href="http://www.lab49.com/" target="_blank"&gt;Lab49&lt;/a&gt; will be presenting on Wednesday:&lt;/p&gt;  &lt;p&gt;2. &lt;a href="http://blog.lab49.com/archives/author/marcja" target="_blank"&gt;Marc Jacobs&lt;/a&gt; and Citi on “Agile Development using Low-Fidelity Prototypes, Expression Blend and SketchFlow:A Case Study” &lt;/p&gt;  &lt;p&gt;3. &lt;a href="http://blog.lab49.com/archives/author/dsimon" target="_blank"&gt;Daniel Simon&lt;/a&gt; on “Patterns and practices:composite development for WPF and Silverlight using Composite Application Guidance (a.k.a. Prism 2.0)”&lt;/p&gt;  &lt;p&gt;&amp;#160;&lt;/p&gt;  &lt;p&gt;And if I have time, I might have a few hours at the Lab49 booth, stop by to say hi.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7071948" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=Ogu7PuKG08s:lMxLrsqemP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=Ogu7PuKG08s:lMxLrsqemP0:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=Ogu7PuKG08s:lMxLrsqemP0:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/Ogu7PuKG08s" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/WPF/default.aspx">WPF</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/HPC/default.aspx">HPC</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/05/04/some-interesting-sessions-at-the-microsoft-enterprise-developer-and-solutions-conference.aspx</feedburner:origLink></item><item><title>CPU Monitoring and Alerting via Performance counters, Coral8, and PowerShell</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/gmNHql6p83I/cpu-monitoring-and-alerting-via-performance-counters-coral8-and-powershell.aspx</link><pubDate>Wed, 22 Apr 2009 03:58:09 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7055155</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7055155</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7055155</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/21/cpu-monitoring-and-alerting-via-performance-counters-coral8-and-powershell.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://blogs.msdn.com/powershell/default.aspx" target="_blank"&gt;The PowerShell team&lt;/a&gt; has a short post on using &lt;a href="http://blogs.msdn.com/powershell/archive/2009/04/21/v2-quick-tip-monitoring-performance-counters-with-powershell.aspx" target="_blank"&gt;V2 cmdlets to Monitor performance counters.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Building on that, and the prior work with the PoShAdapter, here’s a sample with Coral8 and PowerShell to alert you via SMS when the rolling 30 seconds average CPU hits a threshold.&lt;/p&gt;  &lt;pre class="brush: plain; gutter: false; toolbar: false; auto-links: false; smart-tabs: false;"&gt;create VARIABLE float CPUThreashold  = 70; 
create OUTPUT STREAM fakeout SCHEMA (x string);
CREATE SCHEMA CPUSchema (cpu FLOAT);
create INPUT STREAM inCPU SCHEMA CPUSchema;
create OUTPUT STREAM highCPU SCHEMA CPUSchema;
create local STREAM avgCPU SCHEMA CPUSchema;

ATTACH OUTPUT ADAPTER smsAdapter TYPE PoShAdapter TO STREAM highCPU
PROPERTIES
    BEGINBLOCK  = [[ 
    Add-Type -AssemblyName System.Security   
    Add-Type -Path &amp;quot;C:\Program Files\Coral8\Server\bin\GmailHelper.dll&amp;quot; 
    $pass = &amp;quot;..&amp;quot;
    ]],
PROCESSBlock     = [[
 foreach ($cpuSpike in $input)
 {
  $m = &amp;quot;CPU spike at {0:0.00}&amp;quot; -f $cpuSpike['cpu']
  [RC.Gmail.GmailMessage]::SendFromGmail(&amp;quot;user&amp;quot;, $pass,&amp;quot;6465555555@tmomail.net&amp;quot;, 
   &amp;quot;Via Powershell/Coral8&amp;quot;,$m)
 }
]];

ATTACH OUTPUT ADAPTER CPUAdapter TYPE PoShAdapter TO STREAM fakeout
PROPERTIES
    RESULTSSTREAM = &amp;quot;ccl://localhost:6789/Stream/Default/MonitorCPU/inCPU&amp;quot;,
    INPUTBLOCK    = [[
Get-Counter '\Processor(*)\% Processor Time'    |
    select -expand CounterSamples               |
        ? { $_.InstanceName -eq &amp;quot;_total&amp;quot; }      | 
            % { ,,($_.CookedValue,0) } # 
]];

INSERT into avgCPU
select avg(cpu)  
from inCPU 
keep 30 SECONDS 
OUTPUT EVERY 30 SECONDS;

INSERT into highCPU 
select cpu 
from avgCPU 
WHERE cpu &amp;gt; CPUThreashold;&lt;/pre&gt;

&lt;p&gt;Yields: &lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/sms005_2665CC81.jpg"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="sms 005" border="0" alt="sms 005" src="http://weblogs.asp.net/blogs/sweinstein/sms005_thumb_2FC191B5.jpg" width="244" height="180" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;*I lowered the threshold for testing
  &lt;br /&gt;** Yes, I should check my voice mail&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7055155" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=gmNHql6p83I:7Pi9Qoko-hg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=gmNHql6p83I:7Pi9Qoko-hg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=gmNHql6p83I:7Pi9Qoko-hg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/gmNHql6p83I" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/21/cpu-monitoring-and-alerting-via-performance-counters-coral8-and-powershell.aspx</feedburner:origLink></item><item><title>CEP, Citi, and Coral8</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/YXqkZ4MFvvc/cep-citi-and-coral8.aspx</link><pubDate>Tue, 21 Apr 2009 03:36:16 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7051817</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>0</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7051817</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7051817</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/20/cep-citi-and-coral8.aspx#comments</comments><description>&lt;p&gt;The system I helped build at my previous job gets a nice write-up in Wall Street &amp;amp; Technology:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.wallstreetandtech.com/electronic-trading/showArticle.jhtml?articleID=216600047&amp;amp;pgno=1" target="_blank"&gt;Citi Taps CEP for Analyzing Equity Data&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’m sure &lt;a href="http://magmasystems.blogspot.com/" target="_blank"&gt;Marc&lt;/a&gt;, &lt;a href="http://hannohinsch.com/" target="_blank"&gt;Hanno&lt;/a&gt; and the rest of the team are pleased. &lt;/p&gt;  &lt;p&gt;Congrats guys!&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7051817" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=YXqkZ4MFvvc:C9tqmeoJRLc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=YXqkZ4MFvvc:C9tqmeoJRLc:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=YXqkZ4MFvvc:C9tqmeoJRLc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/YXqkZ4MFvvc" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/20/cep-citi-and-coral8.aspx</feedburner:origLink></item><item><title>Using Coral8 and PowerShell to receive eventing data</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/kYSyKe0OnSM/using-coral8-and-powershell-to-listen-for-wmi-events.aspx</link><pubDate>Mon, 20 Apr 2009 02:54:31 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7050360</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7050360</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7050360</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/19/using-coral8-and-powershell-to-listen-for-wmi-events.aspx#comments</comments><description>&lt;p&gt;I’ve updated the PowerShell Coral8 adapter so it can be used to receive input. Rather than demonstrate input from a database or an RSS stream, both of which can are supported by the native Coral8 adapters, I have a demo with WMI events. In this case allowing us to monitor process creation across a network.&lt;/p&gt;  &lt;p&gt;Using the same general template as &lt;a href="http://weblogs.asp.net/sweinstein/archive/2009/04/16/stream-transforms-in-coral8-via-net.aspx" target="_blank"&gt;before&lt;/a&gt; we have the following two script blocks&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;BeginBlock&lt;/strong&gt;&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;$computers = &amp;amp;{$args} localhost ccs01 ccs02
$jobs = $computers | % `
 {
   Register-WmiEvent -Class Win32_ProcessStartTrace -ComputerName $_ ` 
   -Action  { `
            $res = @{}
            $res['ProcessName'] = $args[1].NewEvent.ProcessName
            $res['ComputerName'] = $args[0].scope.Path.Server
            return $res
        }
    }&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;InputBlock&lt;/strong&gt;&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;while ($true) 
{
    Start-Sleep -Milliseconds 100
    foreach ($p in (Receive-Job $jobs))
    {
        # Input adapter doesn't support hashtables yet
        ,,($p['ProcessName'],$p['ComputerName']) 
    }
}&lt;/pre&gt;

&lt;p&gt;And the payoff&lt;/p&gt;

&lt;p&gt;&lt;a href="http://weblogs.asp.net/blogs/sweinstein/image_4B3AD90D.png"&gt;&lt;img title="image" style="border-top-width: 0px; display: inline; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px" height="492" alt="image" src="http://weblogs.asp.net/blogs/sweinstein/image_thumb_41E1A48A.png" width="347" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7050360" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=kYSyKe0OnSM:kDiBOW2EsJE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=kYSyKe0OnSM:kDiBOW2EsJE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=kYSyKe0OnSM:kDiBOW2EsJE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/kYSyKe0OnSM" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/19/using-coral8-and-powershell-to-listen-for-wmi-events.aspx</feedburner:origLink></item><item><title>Stream transforms in Coral8 via .Net</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/z8OHSO9hZ_o/stream-transforms-in-coral8-via-net.aspx</link><pubDate>Fri, 17 Apr 2009 03:55:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7048601</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7048601</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7048601</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/16/stream-transforms-in-coral8-via-net.aspx#comments</comments><description>&lt;P&gt;In the first post on &lt;A href="http://weblogs.asp.net/sweinstein/archive/2009/04/12/in-process-powershell-adapter-for-coral8.aspx" target=_blank mce_href="http://weblogs.asp.net/sweinstein/archive/2009/04/12/in-process-powershell-adapter-for-coral8.aspx"&gt;integrating PowerShell and Coral8&lt;/A&gt; I showed how to create a message sink. In C#ish pseudocode we did the following:&lt;/P&gt;
&lt;P&gt;OutputStream&amp;lt;T&amp;gt;&amp;nbsp; =&amp;gt;&amp;nbsp; Action&amp;lt;T&amp;gt;&lt;/P&gt;
&lt;P&gt;where the Action&amp;lt;T&amp;gt; was a PowerShell block to send a message via GMail.&lt;/P&gt;
&lt;P&gt;Today the goal is to do a transform, something along the following&lt;/P&gt;
&lt;P&gt;OutputStream&amp;lt;T&amp;gt;&amp;nbsp; =&amp;gt;&amp;nbsp; Func&amp;lt;T,T2&amp;gt; =&amp;gt; InputStream&amp;lt;T2&amp;gt;&lt;/P&gt;
&lt;P&gt;In this example, T will be a pair of stock symbols, T2 will be a pair stock symbols along with the correlation of their log normal closing prices for the past 10 days. &lt;/P&gt;
&lt;P&gt;let’s get started.&lt;/P&gt;&lt;STRONG&gt;Coral8&lt;/STRONG&gt; &lt;PRE class="brush: plain; gutter: false; toolbar: false; auto-links: false; smart-tabs: false;"&gt;CREATE SCHEMA           StockPairSchema( SecA STRING,SecB STRING );
CREATE SCHEMA           StockPairCorrelationSchema INHERITS from StockPairSchema (CORR  FLOAT) ;
CREATE OUTPUT   STREAM  StockPairs          SCHEMA StockPairSchema;
CREATE INPUT    STREAM  StockCorrelations   SCHEMA StockPairCorrelationSchema;
ATTACH OUTPUT ADAPTER PairstoCorrelationsFunc TYPE PoShAdapter TO STREAM StockPairs
PROPERTIES
RESULTSSTREAM = "ccl://localhost:6789/Stream/Default/TestC8/StockCorrelations",&lt;/PRE&gt;
&lt;P&gt;The &lt;STRONG&gt;process block&lt;/STRONG&gt; is very simple:&lt;/P&gt;&lt;PRE class="brush: csharp; gutter: false; toolbar: false; auto-links: false; smart-tabs: false;"&gt;foreach ($t in $input)
{
    $a = Get-LogReturns $t["SecA"]
    $b = Get-LogReturns $t["SecB"]
    $c = [Demo.Stats]::Correlate($a, $b)
    ,,($t["SecA"],$t["SecB"],$c) #// double commas so the values are not flattened
}&lt;/PRE&gt;
&lt;P&gt;The block path defines the Get-LogReturns and Correlate function, so naturally it’s a bit longer. &lt;BR&gt;&lt;STRONG&gt;Get-LogReturns:&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class="brush: plain; gutter: false; toolbar: false; auto-links: false; smart-tabs: false;"&gt;$wc = New-Object Net.WebClient    
function Get-LogReturns ($sec)
{
    $qry = "http://ichart.finance.yahoo.com/table.csv?s=$sec"
    $secAData = ConvertFrom-Csv $wc.DownloadString($qry) | select  -First 10 | % { $_.'Adj Close' }
    for ($i=0; $i -lt $secAData.Count-1; $i++) { [Math]::Log( $secAData[$i] / $secAData[$i+1] )  }
}&lt;/PRE&gt;
&lt;P&gt;&lt;STRONG&gt;[Demo.Stats]::Correlate&lt;/STRONG&gt;&lt;/P&gt;&lt;PRE class="brush: csharp; gutter: false; toolbar: false; auto-links: false; smart-tabs: false;"&gt;$csCode = @"
using System;
using System.Collections.Generic;
using System.Linq;
namespace Demo 
{
    public static class Stats
    {
        private static IEnumerable&amp;lt;TResult&amp;gt; Zip&amp;lt;TFirst, TSecond, TResult&amp;gt;(IList&amp;lt;TFirst&amp;gt; first, 
				IList&amp;lt;TSecond&amp;gt; second, 
				Func&amp;lt;TFirst, TSecond, TResult&amp;gt; func)
        {
            for (int ii = 0; ii &amp;lt; Math.Min(first.Count(),second.Count()); ii++)
                yield return func(first[ii],second[ii]);
        }
        public static double Correlate(object[] s1,object[] s2)
        {
            return Correlate(s1.Cast&amp;lt;double&amp;gt;(), s2.Cast&amp;lt;double&amp;gt;());
        }
        public static double Correlate(IEnumerable&amp;lt;double&amp;gt; s1,IEnumerable&amp;lt;double&amp;gt; s2)
        {
            var sum1 = s1.Sum();
            var sum2 = s2.Sum();
            var sumSq1 = s1.Select(v=&amp;gt; v*v).Sum();
            var sumSq2 = s2.Select(v=&amp;gt; v*v).Sum();
            var pSum = Zip(s1.ToList(),s2.ToList(), ( a, b) =&amp;gt; a*b).Sum();
            var len = s1.Count();
            var num = pSum - ((sum1 * sum2) / len);
            var denom = Math.Sqrt(((sumSq1 - (sum1 * sum1) / len) * (sumSq2 - (sum2 * sum2) / len)));
            return (denom == 0.0) ? 0 : num / denom;
        }
    }
}
"@
Add-Type -TypeDefinition $csCode -Language CSharpVersion3 -PassThru &lt;/PRE&gt;
&lt;P&gt;And in case you missed it, the correlate function isn't&amp;nbsp;in PowerShell at all, but rather coded up via in-line C# code, compiled at the startup of the adaptor, and running in the Coral8 server process.&lt;/P&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7048601" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=z8OHSO9hZ_o:SaC4Ntd6jww:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=z8OHSO9hZ_o:SaC4Ntd6jww:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=z8OHSO9hZ_o:SaC4Ntd6jww:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/z8OHSO9hZ_o" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CLR/default.aspx">CLR</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/16/stream-transforms-in-coral8-via-net.aspx</feedburner:origLink></item><item><title>Automatic properties in PowerShell… and how you can almost have them for your custom types</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/WWbTLpAeFYg/automatic-properties-in-powershell-and-how-you-can-almost-have-them-for-your-custom-types.aspx</link><pubDate>Tue, 14 Apr 2009 03:37:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7045681</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7045681</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7045681</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/13/automatic-properties-in-powershell-and-how-you-can-almost-have-them-for-your-custom-types.aspx#comments</comments><description>&lt;p&gt;For certain types, PowerShell has automatic properties, by this I mean PowerShell is able to inspect the object and then expose properties where normally you would need to use a string indexer.&lt;/p&gt;  &lt;p&gt;Like so:&lt;/p&gt;  &lt;pre class="brush: plain; gutter: false; toolbar: false;"&gt;$xbooks = [xml]&amp;quot;&amp;lt;Books&amp;gt;&amp;lt;Book&amp;gt;&amp;lt;Title&amp;gt;PowerShell in Action&amp;lt;/Title&amp;gt;&amp;lt;/Book&amp;gt;&amp;lt;/Books&amp;gt;&amp;quot; 
$xbooks.Books.Book.Title&lt;/pre&gt;

&lt;p&gt;Similar functionality is available for COM, WMI, ADO.Net, and AD types. It’s one of the core features of PowerShell, and its simplicity and elegance makes even diehard UNIX types sit up and take notice.&lt;/p&gt;

&lt;p&gt;But if you’re writing your own cmdlet, navigation provider, or are hosting PowerShell, and you wish to provide an adapter for your own type – you will quickly find that adapters and rest of the infrastructure for automatic properties are internal classes and unavailable to you.&lt;/p&gt;

&lt;p&gt;The best option you have is something along the following:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public PSObject CreateCustomPSObject(MyType mytype )
{
    PSObject pso = new PSObject(mytype);
    foreach (string name in MyColumnNames)     
    { 
        string getter = String.Format(&amp;quot;$this[\&amp;quot;{0}\&amp;quot;]&amp;quot;, name); 
        string setter = String.Format(&amp;quot;$this[\&amp;quot;{0}\&amp;quot;] = $value&amp;quot;, name); 
        pso.Properties.Add(new PSScriptProperty(name,                                        InvokeCommand.NewScriptBlock(getter),                                InvokeCommand.NewScriptBlock(setter))); 
    
    } 
    return pso; 
}
WriteItemObject(CreateCustomPSObject(mytype));&lt;/pre&gt;

&lt;p&gt;This will work, but the output from &lt;font size="2" face="con"&gt;get-member&lt;/font&gt; won’t be as clean as it is for a DataRow or other adapted types. Even worse, this option isn’t available at all for hosted scenarios as there no instance of CommandInvocationIntrinsics available from a Runspace or Pipleline. &lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7045681" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=WWbTLpAeFYg:XY55sA2G0eU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=WWbTLpAeFYg:XY55sA2G0eU:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=WWbTLpAeFYg:XY55sA2G0eU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/WWbTLpAeFYg" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/13/automatic-properties-in-powershell-and-how-you-can-almost-have-them-for-your-custom-types.aspx</feedburner:origLink></item><item><title>In-process PowerShell adapter for Coral8</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/bUn2SFv-E7Q/in-process-powershell-adapter-for-coral8.aspx</link><pubDate>Sun, 12 Apr 2009 19:40:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:7044722</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=7044722</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=7044722</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/04/12/in-process-powershell-adapter-for-coral8.aspx#comments</comments><description>&lt;p&gt;A few days ago a thought crept into my head; wouldn’t it be nice if I could have a Coral8 in-process adapter to run PowerShell code? If it worked it could potentially be a “universal” adapter, limiting the need for custom one-off adapters.&lt;/p&gt;  &lt;p&gt;Coral8, out-of-the-box, supports two different types of adapters. In-process adapters which must be written in C (enough said?), and out-of-process adapters which can be written in the language of your choice, but then have startup sequence, configuration, and deployment work associated with them.&lt;/p&gt;  &lt;p&gt;Using the PoShAdapter I’ve been developing, let’s take a look at the adapter as a message sink. In this case a&amp;#160; “sent to Gmail” adapter.&lt;/p&gt;  &lt;pre class="brush: plain; gutter: false; toolbar: false;"&gt;CREATE SCHEMA TSchema ( toAddr STRING , subject string, message as string); 
CREATE OUTPUT STREAM outGmail SCHEMA TSchema; 
ATTACH OUTPUT ADAPTER PoShAdapter TYPE PoShAdapter  TO STREAM outGmail  PROPERTIES          
BEGINBLOCK  = [[   
    Add-Type -AssemblyName System.Security     
    Add-Type -Path &amp;quot;C:\Program Files\Coral8\Server\bin\GmailHelper.dll&amp;quot;   
    $encPassword = &amp;quot;AQQbRXQr…kg==&amp;quot;   
    $password =[Text.Encoding]::UTF8.GetString([Security.Cryptography.ProtectedData]::UnProtect([System.Convert]::FromBase64String($encPassword),$null,&amp;quot;CurrentUser&amp;quot;))
]],
PROCESS     = [[             
    foreach ($t in $input)             
    {                  
        [RC.Gmail.GmailMessage]::SendFromGmail(&amp;quot;from.user&amp;quot;, $password,
                       $t[&amp;quot;toAddr&amp;quot;], $t[&amp;quot;subject&amp;quot;], $t[“message”])
    }
    ]];&lt;/pre&gt;

&lt;p&gt;The posh adapter, like PowerShell scripts and functions have &lt;strong&gt;begin,&lt;/strong&gt; &lt;strong&gt;process,&lt;/strong&gt; and &lt;strong&gt;end&lt;/strong&gt; blocks. &lt;/p&gt;

&lt;p&gt;In the &lt;strong&gt;beginblock&lt;/strong&gt; we load the assemblies for System.Security and GmailHelper, as well as decrypt the gmail password. &lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;process&lt;/strong&gt; block will have as its &lt;strong&gt;$input&lt;/strong&gt; set to a collection of the Coral8 tuples, so it simply loops through them sends out an email for each one. Because we the Runspace is kept for the lifetime of the adapter, context from the beginblock is available in the process block. &lt;/p&gt;

&lt;p&gt;In later posts I’ll explore using the PoShAdapter to transform data (as in a select or map operator), and look into the possibility of using the adapter to listen for WMI or other system events.&lt;/p&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=7044722" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=bUn2SFv-E7Q:P64aPY9SID8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=bUn2SFv-E7Q:P64aPY9SID8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=bUn2SFv-E7Q:P64aPY9SID8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/bUn2SFv-E7Q" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CLR/default.aspx">CLR</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/PowerShell/default.aspx">PowerShell</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/Coral8/default.aspx">Coral8</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/CEP/default.aspx">CEP</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/04/12/in-process-powershell-adapter-for-coral8.aspx</feedburner:origLink></item><item><title>Adding var args support to office integration functions with dynamic lambda expressions</title><link>http://feedproxy.google.com/~r/ScottWeinstein/~3/ZKFrab4Kgk8/adding-var-args-support-to-office-integration-functions-with-dynamic-lambda-expressions.aspx</link><pubDate>Wed, 11 Mar 2009 00:00:00 GMT</pubDate><guid isPermaLink="false">c06e2b9d-981a-45b4-a55f-ab0d8bbfdc1c:6952838</guid><dc:creator>Scott Weinstein</dc:creator><slash:comments>1</slash:comments><wfw:commentRss>http://weblogs.asp.net/sweinstein/rsscomments.aspx?PostID=6952838</wfw:commentRss><wfw:comment>http://weblogs.asp.net/sweinstein/commentapi.aspx?PostID=6952838</wfw:comment><comments>http://weblogs.asp.net/sweinstein/archive/2009/03/10/adding-var-args-support-to-office-integration-functions-with-dynamic-lambda-expressions.aspx#comments</comments><description>&lt;p&gt;Anyone who’s ever done office integration has come across a method definition like so:&lt;/p&gt;  &lt;pre class="brush: c#;nogutter;nocontrols;name="&gt;object Run(object Macro, object Arg1, object Arg2, …, object Arg30);&lt;/pre&gt;

&lt;p&gt;if you're working in VB it’s not such an issue, and rumor has it that it’s that C# 4 will also solve the problem of code such as:&lt;/p&gt;

&lt;pre class="brush: c#;nogutter;nocontrols;name="&gt;Run(“…”, Type.Missing, Type.Missing,/*28 more times*/ …, Type.Missing);&lt;/pre&gt;

&lt;p&gt;But for everyone else, you can avoid the extra typing with an extension method and dynamic lambda expressions. For example with:&lt;/p&gt;

&lt;pre class="brush: c#;nogutter;nocontrols;name="&gt;    public static class OfficeHelpers
    {
        private static MemberInfo missingMemberInfo = typeof(Type).GetMembers().Where(mi =&amp;gt; mi.Name == &amp;quot;Missing&amp;quot;).Single();
        private static MethodInfo runMethodInfo = typeof(_Application).GetMethod(&amp;quot;Run&amp;quot;);
        private static ParameterExpression macroNameParamExp = Expression.Parameter(typeof(string), &amp;quot;macroName&amp;quot;);
        private static ParameterExpression argsParamExp = Expression.Parameter(typeof(object[]), &amp;quot;args&amp;quot;);

        public static object Run(this Application App, string macroName, params object[] args)
        {
            var argsExprs = GenerateArgs(runMethodInfo, macroName, args);
            var callExpr = Expression.Call(Expression.Constant(App), runMethodInfo, argsExprs);
            var paramExprs = new ParameterExpression[] { macroNameParamExp, argsParamExp };
            var lambda = Expression.Lambda&lt;func&gt;&lt;string  , object[], object&gt;&amp;gt;(callExpr, paramExprs);
            return lambda.Compile().Invoke(macroName, args);
        }

        private static IEnumerable&amp;lt;Expression&amp;gt; GenerateArgs(MethodInfo runfuncMI, string macroName, object[] args)
        {
            yield return macroNameParamExp;
            for (int ii = 0; ii &amp;lt; args.Length; ii++)
                yield return BinaryExpression.ArrayIndex(argsParamExp, Expression.Constant(ii, typeof(int)));
            for (int ii = 0; ii &amp;lt; runfuncMI.GetParameters().Length - args.Length - 1; ii++)
                yield return Expression.MakeMemberAccess(null, missingMemberInfo);
        }&lt;/pre&gt;

&lt;p&gt;a call to &lt;/p&gt;

&lt;pre class="brush: c#;nogutter;nocontrols;name="&gt;OfficeHelpers.Run(&amp;quot;…&amp;quot;, arg1,arg2,arg3);&lt;/pre&gt;

&lt;p&gt;will generate and execute an expression like so:&lt;/p&gt;

&lt;pre class="brush: c#;nogutter;nocontrols;name="&gt;(macroName, args) =&amp;gt; RunFuncTest(macroName, args[0], args[1], args[2], Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing, Type.Missing)&lt;/pre&gt;&lt;img src="http://weblogs.asp.net/aggbug.aspx?PostID=6952838" width="1" height="1"&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=ZKFrab4Kgk8:MseyrHdiXHM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=ZKFrab4Kgk8:MseyrHdiXHM:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/ScottWeinstein?a=ZKFrab4Kgk8:MseyrHdiXHM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/ScottWeinstein?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/ScottWeinstein/~4/ZKFrab4Kgk8" height="1" width="1"/&gt;</description><category domain="http://weblogs.asp.net/sweinstein/archive/tags/.NET/default.aspx">.NET</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/General+Software+Development/default.aspx">General Software Development</category><category domain="http://weblogs.asp.net/sweinstein/archive/tags/LINQ/default.aspx">LINQ</category><feedburner:origLink>http://weblogs.asp.net/sweinstein/archive/2009/03/10/adding-var-args-support-to-office-integration-functions-with-dynamic-lambda-expressions.aspx</feedburner:origLink></item></channel></rss>
