<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Running with Code</title>
	<atom:link href="http://robpaveza.net/feed" rel="self" type="application/rss+xml" />
	<link>http://robpaveza.net</link>
	<description>Like with scissors, only more dangerous</description>
	<lastBuildDate>Thu, 22 Mar 2012 21:53:26 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Joining Microsoft</title>
		<link>http://robpaveza.net/joining-microsoft</link>
		<comments>http://robpaveza.net/joining-microsoft#comments</comments>
		<pubDate>Thu, 22 Mar 2012 21:47:26 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Living Life]]></category>
		<category><![CDATA[job]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[program manager]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=184</guid>
		<description><![CDATA[I'm excited to announce that on April 2nd, I will be joining Microsoft as a Program Manager. I'm unsure whether it's OK for me to be saying exactly which team I'll be on just yet, so we'll have to wait and see... With that in mind, retroactively looking backwards on my blog, please note that [...]]]></description>
			<content:encoded><![CDATA[<p>I'm excited to announce that on April 2nd, I will be joining Microsoft as a Program Manager.  I'm unsure whether it's OK for me to be saying exactly which team I'll be on just yet, so we'll have to wait and see...</p>
<p>With that in mind, retroactively looking backwards on my blog, please note that any articles previously written were written as an outsider looking in.  I probably will not be going back and revising any such articles, so <b>you should not treat them as coming from someone who knows the voodoo secrets about things</b>.  You should also not treat them as any kind of opinion made by Microsoft.</p>
<p>I'm unsure what that means for the future of this blog.  Maybe I'll be able to get one of those coveted MSDN blogs.  <img src='http://robpaveza.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />   We shall see....  </p>
<p>I also have a somewhat unusual story about how I managed to join Microsoft.  I may be talking to someone on the <a href="http://www.jobsblog.com/" target="_blank">JobsBlog</a> about it soon - I'll be sure to update things then.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/joining-microsoft/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What&#8217;s up with the fish?</title>
		<link>http://robpaveza.net/whats-up-with-the-fish</link>
		<comments>http://robpaveza.net/whats-up-with-the-fish#comments</comments>
		<pubDate>Sun, 04 Mar 2012 06:59:15 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[microsoft]]></category>
		<category><![CDATA[win8]]></category>
		<category><![CDATA[windows]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=190</guid>
		<description><![CDATA[I guess I see the inverted 8, but - what's up with the fish logo for Windows 8 Consumer Preview?? Oh, I see the 8 blended in the background too...]]></description>
			<content:encoded><![CDATA[<p>I guess I see the inverted 8, but - what's up with the fish logo for Windows 8 Consumer Preview??  </p>
<p><a href="http://robpaveza.net/wp-content/uploads/2012/03/win8-startup-fish.png"><img src="http://robpaveza.net/wp-content/uploads/2012/03/win8-startup-fish.png" alt="" title="win8-startup-fish" width="467" height="544" class="alignnone size-full wp-image-191" /></a></p>
<p>Oh, I see the 8 blended in the background too...  <img src='http://robpaveza.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/whats-up-with-the-fish/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A brief detour: Dry rub for ribs</title>
		<link>http://robpaveza.net/a-brief-detour-dry-rub-for-ribs</link>
		<comments>http://robpaveza.net/a-brief-detour-dry-rub-for-ribs#comments</comments>
		<pubDate>Mon, 20 Feb 2012 06:27:56 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Living Life]]></category>
		<category><![CDATA[cooking]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=182</guid>
		<description><![CDATA[I have to admit: I'm excited. Tomorrow morning, I'll be putting my first ever dry rub on ribs. I've been looking forward to this because I've got a friend whose family is gluten-intolerant, and before he knew it, we always used to enjoy crock pot ribs with some store-bought K.C. Masterpiece honey barbecue sauce. Since [...]]]></description>
			<content:encoded><![CDATA[<p>I have to admit: I'm excited.  Tomorrow morning, I'll be putting my first ever dry rub on ribs.  I've been looking forward to this because I've got a friend whose family is <a href="http://en.wikipedia.org/wiki/Coeliac_disease" target="_blank">gluten-intolerant</a>, and before he knew it, we always used to enjoy crock pot ribs with some store-bought K.C. Masterpiece honey barbecue sauce.  Since they stopped eating gluten, we haven't really enjoyed ribs together.  Not only that issue, but there's also the issue of actually just finding ribs when they're drowned in the sauce within the crock pot.  So, for a while, I've been looking for a somewhat savory rub that I could make gluten-free that would be tasty.  I think I've found it.</p>
<p>Apparently, <a href="http://crockpot365.blogspot.com/2008/11/john-mccains-rib-recipe-in-crockpot.html" target="_blank">John McCain has a fantastic dry rub</a> that he uses.  I'm going to adapt the recipe on that site a little bit: I have more ribs, and I think I can get a little bit more variety (and I'd like to have a little kick).  So here are my ingredients:</p>
<ul>
<li>3 tablespoons kosher salt</li>
<li>3 tablespoons garlic powder</li>
<li>2 tablespoons black pepper</li>
<li>1 tablespoon chili powder (I would have preferred cayenne pepper I think, but we didn't have any) - I'd like it to have just a little more punch than just black pepper would have</li>
<li>1 orange, 2 lemons, and 1 lime, juiced</li>
</ul>
<p>Otherwise, I'll follow the recipe as indicated: apply the rub all over the ribs, and then add the juice.  Cook on low 8-10 hours.</p>
<p>I wanted to mix up the citrus a little.  Citrus is generally interchangeable, but lime is my favorite citrus, and I wasn't willing to completely give up the sweetness of typical barbecue, so I thought the orange might be able to help add that a bit.</p>
<p>I will post some pictures and thoughts once they are cooked.  </p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/a-brief-detour-dry-rub-for-ribs/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Review of Balsamiq Mockups</title>
		<link>http://robpaveza.net/a-review-of-balsamiq-mockups</link>
		<comments>http://robpaveza.net/a-review-of-balsamiq-mockups#comments</comments>
		<pubDate>Sun, 19 Feb 2012 07:01:29 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[mockups]]></category>
		<category><![CDATA[wireframing]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=175</guid>
		<description><![CDATA[Balsamiq was kind enough to provide me with a free license for Mockups a while back on the condition that I reviewed it. I'm embarrassed to say it is WAY longer than I would have expected if I had been the one providing the license. That said, I definitely still owe them the review, so [...]]]></description>
			<content:encoded><![CDATA[<p>Balsamiq was kind enough to provide me with a free license for <a href="http://www.balsamiq.com/products/mockups" target="_blank">Mockups</a> a while back on the condition that I reviewed it.  I'm embarrassed to say it is WAY longer than I would have expected if I had been the one providing the license.  That said, I definitely still owe them the review, so I think I'd better get on it!  (I had originally intended to do a videocast of using Mockups but I'm not particularly good at that sort of thing).</p>
<p>My daily job responsibilities have never been 100% on wireframing or feature design.  Up until I was introduced to Mockups, I had tried out <a href="http://www.axure.com/" target="_blank">Axure RP Pro</a> (I think around version 5), and during my time at Terralever, we used <a href="http://www.omnigroup.com/products/omnigraffle/" target="_blank">Omnigraffle</a> extensively.  I first was introduced to Mockups when we were partnering with MySpace on <a href="http://www.hulu.com/if-i-can-dream" target="_blank">If I Can Dream</a>.  I was impressed initially by the extremely rapid prototyping that we were able to do as a collaborative team.  I had spent probably about 30 hours doing the initial Facebook-based proposal, which was, in fairness, <i>far</i> more extensive than the MySpace integration ended up being (sorry JT).  That said, we were able to put Mockups up on the projector and it was really easy to make some interesting UI components very quickly.</p>
<p>Since then, I've used Mockups at Terralever as well as with my own consulting business.  Generally, I've found that Mockups is ideal when I'm looking for:</p>
<ul>
<li>Very rapid prototyping, to help conceptualize something that I'm actively coding and just need to give myself a fixed visual.</li>
<li>Prototypes that I'm going to deliver in PDF format, because of the automatic internal linking it provides (more later).</li>
<li>Any kind of prototypes that are going to be "internal only."  If I need to perform a "real" usability consultation, I prefer Omnigraffle; I think that what I can find in Omnigraffle generally looks a little more polished.</li>
</ul>
<h2>The Prototyping Experience</h2>
<p>Absolutely exceptional.  To be honest, I think it's the best aspect of Mockups in terms of its speed advantage.  If the components are there in the library, it's incredibly fast to go from nothing to something good.  Let's take a simple example of a common navigation element: the tabs list.  Drag-and-drop from the library onto a fresh canvas, and this is what we're presented with:<br />
<a href="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-entertext.png"><img src="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-entertext.png" alt="" title="tabsbar-entertext" width="296" height="135" class="alignnone size-full wp-image-176" /></a><br />
You can see that there are four items in a comma-delimited list.  What could be more intuitive than that?  Well, I'll type some comma-separated items in and then hit enter:<br />
<a href="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-round2.png"><img src="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-round2.png" alt="" title="tabsbar-round2" width="392" height="118" class="alignnone size-full wp-image-177" /></a><br />
Okay, that's pretty good; but I think I should be able to have the Mockups tab selected.  Lo and behold, the very simple property editor window saves the day:<br />
<a href="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-round3.png"><img src="http://robpaveza.net/wp-content/uploads/2012/02/tabsbar-round3.png" alt="" title="tabsbar-round3" width="754" height="413" class="alignnone size-full wp-image-178" /></a><br />
You can see in this image that Mockups is selected (and it is highlighted in the "Selected" field of the property editor as well).  But what's also very neat about this control (and other similar ones) is the "Links" property set.  See how there's a field for each one of the tabs that I created?  Every one of them can link to another Mockup in the same folder.  When I choose to export them to PDF, those links will be live, and I'll be able to navigate between mockups by clicking on the linking element.  In my opinion, it's one of the coolest interactive features, and it's readily surfaced.  (I suspect that there may be similar features in Omnigraffle but I've never used them if they do exist).</p>
<p>Also very cool for preserving your "sketch" feel is the ability to "Sketchify" (okay, that term isn't in the UI, but it fits) any bitmapped image you drop into the app.  It's actually very good and accurate.  Take a look at this (original images courtesy of Amazon and Google Shopping).:<br />
<a href="http://robpaveza.net/wp-content/uploads/2012/02/sketched-images.png"><img src="http://robpaveza.net/wp-content/uploads/2012/02/sketched-images.png" alt="" title="sketched-images" width="457" height="304" class="alignnone size-full wp-image-179" /></a><br />
This is tremendous for those of us who want to use images to get the point across but are terrible at using Photoshop for anything other than taking someone else's image and using the "Slice" tool.</p>
<p>I've found the locking and ordering mechanism to be very intuitive.  Mockups is also very good about letting you select the element you want with the right-click menu, which lets you select down the visual hierarchy even if the element you're trying to get (for instance, a Web Browser surface) is occluded by something else.</p>
<h2>The Library</h2>
<p>The UI library is adequate.  There have been times where I've longed for the ability to add a control to it, which invariably leads me to creating a "Library" mockup that contains my custom "controls."  The drawback to this model is that you don't get the very nice programmed editing capabilities.  For example, suppose I wanted to wireframe the feature that Facebook uses when you've auto-completed a friend (you know, the highlighted background with an X to the right of the text).  I can make something that looks like it.  However, I don't get the great features of the intrinsic controls: I can't make only the text editable, and I can't make the X hotlink to another wireframe.  There may be a way to develop these kinds of extensions, but I haven't found it.  The lack of extensibility in this sense is a detractor compared to Omnigraffle (compare <a href="http://graffletopia.com/" target="_blank">Graffletopia</a>), but at the same time, it's a good challenge to be able to do more with less.  (I love Graffletopia's diversity in components, but it can also give you a library that is much, much too large).</p>
<p>Still, I think that, while there have been times that I've really wished for some specific controls, it's generally given me what I've needed.  And when it didn't have quite what I needed, I was able to fake it.</p>
<p>That said, there is one thing that stands above the others: the Text Paragraph control:<br />
<a href="http://robpaveza.net/wp-content/uploads/2012/02/paragraph.png"><img src="http://robpaveza.net/wp-content/uploads/2012/02/paragraph.png" alt="" title="paragraph" width="211" height="89" class="alignnone size-full wp-image-180" /></a><br />
You can see inline the italics, hyperlink, and bold format specifiers that can automatically be applied.  I've found this enormously useful and I think the inline links are particularly handy (it's not something you see everywhere).  But without a doubt, the best part is that you can get them while you're typing: no need to stop and use the mouse to select a text range just to get a special format like that.</p>
<h2>How it stacks up</h2>
<p>I realize that as someone who almost exclusively develops on the Microsoft stack, I should probably at least occasionally wireframe in Expression Blend's Sketchflow feature.  I'm mildly ashamed to admit that I've never tried it; I think I'm afraid that if I start working in Sketchflow I'll get the urge to do some real programming, or I'll spend too much time on an animation and not get the actual prototyping done.  So with that in mind, I'm going to compare it to Axure and Omnigraffle, because those are the other two tools I've used.</p>
<p><b>Axure</b>: Mockups, even the first time I saw it, was miles ahead of Axure in appearance.  Noted that it's probably 2 years ago that I tried Axure, but it sometimes felt like I was literally working with the .NET Windows Forms or Web Forms designer controls (the radio buttons stand out in my mind as looking like they were pure Windows-based controls).  I have seen the end-result of some Axure work recently and was a bit impressed (I think they've added some sketchlike appearance support in a recent version).  That said, I get the general impression that Axure's prototypes are meant to look a bit more like the real thing than wireframes that you might generate using Mockups or Omnigraffle.</p>
<p><b>Omnigraffle</b>: Like I noted above, I tend to like Omnigraffle when I'm consulting for a client.  Mockups produces visuals that are very sketch-like in their appearance, and while this is generally a Good Thing, sometimes that rounded edge or drop-shadow that you can include in Omnigraffle makes the product really pop.  Still, Omnigraffle is only available on Mac and iPad, and while I have an iMac, I tend to be developing in Windows.  The reboot required to go into OS X makes it cost-prohibitive to use when I'm going to be the consumer of the wireframes.  Mockups, being an Adobe AIR application, can run on either platform.  As a result, when I need to give myself some visual guidance, I tend to do my rapid prototyping in Mockups.</p>
<p>One note: Since installing Mockups on my new laptop, I was surprised to see that Comic Sans is no longer the default font.  In some ways this saddens me.  I realize that most customers were probably unhappy with that as the default because it made them hesitant to show their mockups to customers.  I thought that it was a bit charming in its own way - another not-so-subtle reminder to "not take this visual too seriously".  Oh well <img src='http://robpaveza.net/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Thanks, Balsamiq, for the Mockups license!  Keep the goodness coming!</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/a-review-of-balsamiq-mockups/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Bridging the gap between Jurassic and the DLR, Part Two</title>
		<link>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-two</link>
		<comments>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-two#comments</comments>
		<pubDate>Thu, 16 Feb 2012 07:31:28 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jurassic]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=166</guid>
		<description><![CDATA[Part Two: A More Complete Object Model Part 1: ObjectInstance derives from DynamicObject Once I started implementing the rest of the object model, things started coming together very well. Let's take a look at the rest of the ObjectInstance implementation: For FunctionInstance: For ArrayInstance, things were a little more interesting. JavaScript doesn't support multidimensional arrays [...]]]></description>
			<content:encoded><![CDATA[<h2>Part Two: A More Complete Object Model</h2>
<ul>
<li><a href="http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-one">Part 1: ObjectInstance derives from DynamicObject</a></li>
</ul>
<p>Once I started implementing the rest of the object model, things started coming together very well.  </p>
<p>Let's take a look at the rest of the ObjectInstance implementation:</p>
<pre class="brush: csharp; title: ; notranslate">
        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            return TryCallMemberFunction(out result, binder.Name, args);
        }

        public override bool TryConvert(ConvertBinder binder, out object result)
        {
            if (binder.ReturnType == typeof(string))
            {
                result = this.ToString();
                return true;
            }
            else
            {
                try
                {
                    result = Jurassic.TypeConverter.ConvertTo(this.engine, this, binder.ReturnType);
                    return true;
                }
                catch
                {
                    result = null;
                    return false;
                }
            }
        }

        public override bool TryDeleteMember(DeleteMemberBinder binder)
        {
            return Delete(binder.Name, false);
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            this.FastSetProperty(binder.Name, value, PropertyAttributes.FullAccess, true);
            return true;
        }

        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = GetNamedPropertyValue(binder.Name, this);
            if (object.ReferenceEquals(null, result))
                return false;

            return true;
        }
</pre>
<p>For FunctionInstance:</p>
<pre class="brush: csharp; title: ; notranslate">
        public override bool TryInvoke(System.Dynamic.InvokeBinder binder, object[] args, out object result)
        {
            try
            {
                result = CallLateBound(this, args);
                return true;
            }
            catch
            {
                result = null;
                return false;
            }
        }
</pre>
<p>For ArrayInstance, things were a little more interesting.  JavaScript doesn't support multidimensional arrays (as in C#, where you can access something via <tt>someArr[1,5]</tt>).  However, it's important to consider the type.  Fortunately, Jurassic provides that as well, fairly easily.</p>
<pre class="brush: csharp; title: ; notranslate">
        public override bool TryGetIndex(GetIndexBinder binder, object[] indexes, out object result)
        {
            Debug.Assert(indexes != null &amp;&amp; indexes.Length &gt; 0);

            result = null;

            if (indexes.Length &gt; 1)
                return false; // multi-dimensional arrays are not supported.

            if (object.ReferenceEquals(null, indexes[0]))
                return false;

            Type indexType = indexes[0].GetType();
            if (indexType.IsEnum)
            {
                indexType = Enum.GetUnderlyingType(indexType);
            }

            if (indexType == typeof(byte) || indexType == typeof(sbyte) || indexType == typeof(short) || indexType == typeof(ushort) || indexType == typeof(int) || indexType == typeof(uint))
            {
                uint index = unchecked((uint)indexes[0]);
                try
                {
                    result = this[index];
                    return true;
                }
                catch
                {
                    result = null;
                    return false;
                }
            }
            else
            {
                string index = indexes[0].ToString();
                try
                {
                    result = this[index];
                    return true;
                }
                catch
                {
                    result = null;
                    return false;
                }
            }
        }

        public override bool TrySetIndex(SetIndexBinder binder, object[] indexes, object value)
        {
            Debug.Assert(indexes != null &amp;&amp; indexes.Length &gt; 0);

            if (indexes.Length &gt; 1)
                return false; // multi-dimensional arrays are not supported.

            if (object.ReferenceEquals(null, indexes[0]))
                return false;

            Type indexType = indexes[0].GetType();
            if (indexType.IsEnum)
            {
                indexType = Enum.GetUnderlyingType(indexType);
            }

            if (indexType == typeof(byte) || indexType == typeof(sbyte) || indexType == typeof(short) || indexType == typeof(ushort) || indexType == typeof(int) || indexType == typeof(uint))
            {
                uint index = unchecked((uint)indexes[0]);
                try
                {
                    this[index] = value;
                    return true;
                }
                catch
                {
                    return false;
                }
            }
            else
            {
                string index = indexes[0].ToString();
                try
                {
                    this[index] = value;
                    return true;
                }
                catch
                {
                    return false;
                }
            }
        }

        public override bool TryDeleteIndex(DeleteIndexBinder binder, object[] indexes)
        {
            Debug.Assert(indexes != null &amp;&amp; indexes.Length &gt; 0);

            if (indexes.Length &gt; 1)
                return false; // multi-dimensional arrays are not supported.

            if (object.ReferenceEquals(null, indexes[0]))
                return false;

            Type indexType = indexes[0].GetType();
            if (indexType.IsEnum)
            {
                indexType = Enum.GetUnderlyingType(indexType);
            }

            if (indexType == typeof(byte) || indexType == typeof(sbyte) || indexType == typeof(short) || indexType == typeof(ushort) || indexType == typeof(int) || indexType == typeof(uint))
            {
                uint index = unchecked((uint)indexes[0]);
                return Delete(index, false);
            }
            else
            {
                string index = indexes[0].ToString();
                return Delete(index, false);
            }
        }
</pre>
<p>I did add one set of precompilation directives so that I could modify ScriptEngine with one little item:</p>
<pre class="brush: csharp; title: ; notranslate">
        public
#if SUPPORT_DYNAMIC
            dynamic
#else
            object
#endif
            GetGlobalValue(string variableName)
        {
            if (variableName == null)
                throw new ArgumentNullException(&quot;variableName&quot;);
            return TypeUtilities.NormalizeValue(this.Global.GetPropertyValue(variableName));
        }
</pre>
<p>With that gem, we're in good shape.  I'll update the test program; let's take a good look:</p>
<pre class="brush: csharp; title: ; notranslate">
    class Program
    {
        static void Main(string[] args)
        {
            ScriptEngine engine = new ScriptEngine();

            engine.SetGlobalFunction(&quot;write&quot;, (Action&lt;string&gt;) ((s) =&gt; { Console.WriteLine(s); }));

            engine.Execute(@&quot;
var a = {
    A: 'A',
    B: 20,
    C: function() { return 'Hello'; }
};

function double(val)
{
    return val * 2;
}

var array = [1, 5, 9, 13, 21];
&quot;);
            dynamic obj = engine.Evaluate&lt;ObjectInstance&gt;(&quot;a&quot;);
            Console.WriteLine(obj.A);
            Console.WriteLine(obj.B);
            Console.WriteLine(obj.C());
            obj.D = &quot;What's that?&quot;;

            Console.WriteLine(&quot;C#: &quot; + obj.D);

            engine.Execute(@&quot;
write('JavaScript: ' + a.D);
&quot;);

            dynamic dbl = engine.GetGlobalValue(&quot;double&quot;);
            Console.WriteLine(dbl(20));
            Console.WriteLine(dbl.call(null, 20));

            dynamic array = engine.GetGlobalValue(&quot;array&quot;);
            Console.WriteLine(array[2]);

            Console.ReadLine();

        }
    }
</pre>
<p>Output is happily correct:</p>
<pre>
A
20
Hello
C#: What's that?
JavaScript: What's that?
40
40
9
</pre>
<p>Particularly neat about this implementation is that the calls automatically recurse.  Note that I use the intrinsic JavaScript <tt>call</tt> method on the Function instance (of <tt>dbl</tt>).  This implementation covers a whole bunch of typical scenarios and use-cases, and I'm happy to see that it has worked out fairly well thus far.</p>
<p>One item I've found is that there's a TypeLoadException when targeting .NET 4.  This has something to do with a new CAS policy in .NET 4.  For now, applying this attribute to the test program as well as the library will resolve the issue, though I don't intend for it to be long-term:</p>
<pre>
[assembly: System.Security.SecurityRules(System.Security.SecurityRuleSet.Level1)]
</pre>
<p>Next time, we'll do some more fit and finish, with precompilation constants and a security review.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-two/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bridging the gap between Jurassic and the DLR, Part One</title>
		<link>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-one</link>
		<comments>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-one#comments</comments>
		<pubDate>Tue, 14 Feb 2012 07:50:04 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[dynamic programming]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[jurassic]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=164</guid>
		<description><![CDATA[Part One: ObjectInstance derives from DynamicObject A while back I posted that I was joining the Jurassic team; Jurassic is an open-source JavaScript engine for .NET. If you've ever gone through the long search for a JavaScript implementation on .NET (other than JScript.NET, of course), there are a bunch of incomplete implementations, and if you're [...]]]></description>
			<content:encoded><![CDATA[<h2>Part One: ObjectInstance derives from DynamicObject</h2>
<p>A while back I posted that I was <a href="http://robpaveza.net/joining-the-jurassic-team">joining the Jurassic team</a>; Jurassic is an <a href="http://jurassic.codeplex.com/" target="_blank">open-source JavaScript engine for .NET</a>.  If you've ever gone through the long search for a JavaScript implementation on .NET (other than JScript.NET, of course), there are a bunch of incomplete implementations, and if you're lucky enough to find the blog about the Microsoft project of JScript running on the DLR (once called Managed JScript), you'll find that it was an implementation that was specifically designed to give design feedback on the DLR itself, and was not planned to be carried forward into production.  Personally I think that's too bad, but I'm happy to see a couple of projects (notably, Jurassic and IronJS) that have stepped up to fill the gap.</p>
<p>I had considered implementing <a href="http://msdn.microsoft.com/en-us/library/system.dynamic.idynamicmetaobjectprovider.aspx" target="_blank">IDynamicMetaObjectProvider</a>, but inheriting from <a href="http://msdn.microsoft.com/en-us/library/system.dynamic.dynamicobject.aspx" target="_blank">DynamicObject</a> seems to be a better design decision all-around.  Since all of the other JavaScript objects inherit from ObjectInstance, it's a simple matter of overriding its virtual methods instead of creating a new implementation of DynamicMetaObject for each class in the hierarchy.</p>
<p>I've created a new library project within the solution as well as a simple testing project to advise on the API as well as to step into my DynamicObject overrides.  Here are some simple components:</p>
<pre class="brush: csharp; title: ; notranslate">
// These are new:
using System.Dynamic;
using System.Diagnostics;

// This is updated
    public class ObjectInstance
        : DynamicObject
#if !SILVERLIGHT
        , System.Runtime.Serialization.IDeserializationCallback
#endif
    {

// The class exists as normal
        public override bool TryGetMember(GetMemberBinder binder, out object result)
        {
            result = GetNamedPropertyValue(binder.Name, this);
            if (result != null)
                return true;

            return false;
        }

        public override bool TryInvokeMember(InvokeMemberBinder binder, object[] args, out object result)
        {
            try
            {
                result = CallMemberFunction(binder.Name, args);
                return true;
            }
            catch
            {
                result = null;
                return false;
            }
        }

        public override bool TrySetMember(SetMemberBinder binder, object value)
        {
            this.AddProperty(binder.Name, value, PropertyAttributes.FullAccess, true);
            return true;
        }

    }
</pre>
<p>This is the source of the test application.  It's very straightforward:</p>
<pre class="brush: csharp; title: ; notranslate">
        static void Main(string[] args)
        {
            ScriptEngine engine = new ScriptEngine();

            engine.SetGlobalFunction(&quot;write&quot;, (Action&lt;string&gt;) ((s) =&gt; { Console.WriteLine(s); }));

            engine.Execute(@&quot;
var a = {
    A: 'A',
    B: 20,
    C: function() { return 'Hello'; }
};
&quot;);
            dynamic obj = engine.Evaluate&lt;ObjectInstance&gt;(&quot;a&quot;);
            Console.WriteLine(obj.A);
            Console.WriteLine(obj.B);
            Console.WriteLine(obj.C());
            obj.D = &quot;What's that?&quot;;

            Console.WriteLine(&quot;C#: &quot; + obj.D);

            engine.Execute(@&quot;
write('JavaScript: ' + a.D);
&quot;);

            Console.ReadLine();

        }
</pre>
<p>We create a global function 'write' which writes a string to the console.  Then we create a global object <tt>a</tt> with properties <tt>A</tt>, <tt>B</tt>, and <tt>C</tt>.  We then use C# to retrieve the value of this object as a <tt>dynamic</tt>.  This is what provides us access to the <tt>DynamicObject</tt>'s overrides intrinsic within C#'s support of the DLR.  We then access each property (which each return a <tt>dynamic</tt>) and, happily because of Jurassic's automatic conversion of primitives to their respective .NET types, when these values are returned as <tt>dynamic</tt>, they can be automatically converted to their appropriate types for their <tt>Console.WriteLine</tt> parameter.  You can see that we invoke <tt>TryGetMember</tt> on <tt>A</tt> and <tt>B</tt>, <tt>TryInvokeMember</tt> on <tt>C</tt>, and <tt>TrySetMember</tt> and then <tt>TryGetMember</tt> on <tt>D</tt>.</p>
<p>OK, it's late, so I'm not going to stick this out anymore right now.  I'm not even sure if the previous paragraph was particularly coherent.  <img src='http://robpaveza.net/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>There's a lot to update: it doesn't support case-insensitive languages (like Visual Basic), it's not particularly good at error checking, and I haven't dealt with any other components yet.  The good news is that it seems like we should be good to go for the rest of the components.  </p>
<p>Next time, we'll look at other classes, like ArrayInstance, FunctionInstance, and more.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/bridging-the-gap-between-jurassic-and-the-dlr-part-one/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>In a disconnected world, robust code is crucial</title>
		<link>http://robpaveza.net/in-a-disconnected-world-robust-code-is-crucial</link>
		<comments>http://robpaveza.net/in-a-disconnected-world-robust-code-is-crucial#comments</comments>
		<pubDate>Tue, 07 Feb 2012 06:15:40 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[architecture]]></category>
		<category><![CDATA[asynchrony]]></category>
		<category><![CDATA[best practices]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[performance]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=148</guid>
		<description><![CDATA[Probably 99.99% of HTML applications and websites are served over HTTP exclusively. (I'm referring here to HTTP as a transport protocol, not HTTP vs.HTTPS, for example, and I realize that HTTP is an application-layer protocol according to OSI; but developers generally treat it as an abstraction for "the network"). As anybody who has done web [...]]]></description>
			<content:encoded><![CDATA[<p>Probably 99.99% of HTML applications and websites are served over <a href="http://en.wikipedia.org/wiki/HTTP" target="_blank">HTTP</a> exclusively.  (I'm referring here to HTTP as a transport protocol, not HTTP vs.HTTPS, for example, and I realize that HTTP is an application-layer protocol according to <a href="http://en.wikipedia.org/wiki/OSI_model" target="_blank">OSI</a>; but developers generally treat it as an abstraction for "the network").  As anybody who has done web programming knows, HTTP is a <em>stateless</em> protocol; that is, it's based on a request-response model, and in general, one request has no knowledge of previous requests.  This has posed some challenges for web developers over the years, and some brilliant abstractions of state on top of the statelessness have been devised.</p>
<p>The hard part now, though, isn't to deal with statelessness.  It's dealing with the <a href="http://en.wikipedia.org/wiki/Request-response" target="_blank">request-and-response</a> model.</p>
<p>All network communication is inherently request-and-response.  There are some applications that utilize full-duplex communications to get around that (think of chat software), but for the most part, that isn't really available behind the firewall.  <a href="http://en.wikipedia.org/wiki/WebSocket" target="_blank">Web sockets</a> are still yet to be standardized (and there are some questions about long-term compatibility with WebSocket-ignorant proxies).  And typically, corporate firewalls say no to outbound connections except on ports 80 or 443.  Some applications (think <a href="http://www.meebo.com/" target="_blank">Meebo</a>) have been able to get around this limitation by cleverly using long-timeout delays on AJAX requests.  The client makes a request to the server, and the server either responds immediately (if an event is in queue) or holds the request for 30-90 seconds to see if an event comes in.  I even did this once myself with good success, although I never took that app into production.  (There was also some question about the total # of clients an ASP.NET server could sustain whilst holding threads in that way).</p>
<p>In many respects, Windows developers haven't had to deal with this.  We could issue <a href="http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.receive.aspx" target="_blank">synchronous requests</a>, and the UI would stand still for a second, and either it would work or it would fail.  But usability concerns over this process, as well as issues with high network latency (imagine pressing the "Submit" button and having to wait 20 seconds while your app freezes - by then, I've force-closed the app) have seen platform providers decree that asynchrony is the only way to go.</p>
<p>HTML isn't the only application provider dealing with this limitation.  Adobe Flash has long had an asynchronous-communication-only model, <a href="http://www.informit.com/articles/article.aspx?p=1759240" target="_blank">Microsoft Silverlight</a> has also carried on this principle; of course, these two applications have lived predominantly in browsers, where a hanging UI probably means interfering with other apps as well as the one making the request.  Interestingly, WinRT - the Windows 8 developer framework - is also going to <a href="http://revoseek.com/information-technology/asynchronous-api-based-element-of-metro-ui-windows-8-winrt/" target="_blank">mandate an asynchronous model</a>, following in the Silverlight-based foodsteps blazed by Windows Phone 7.</p>
<p>So as we trek out into the world of asynchrony, well, we have a whole mess of questions to deal with now:</p>
<ul>
<li>If there's an error, does it show up in the calling method or in the callback method?  Does it even show up?</li>
<li>Does a network (transport-level) error surface differently than an application error?  What if the server returned an HTTP 403 Forbidden response?</li>
<li>What are all of the different <em>kinds</em> of errors that can crop up?  Do I need to handle SocketException or is that going to be abstracted to something more meaningful to my application?</li>
<li>What do I do if a network error comes up?  Do I assume that I'm offline, panic, and quit?  What if my application only makes sense "online"?</li>
<li>Do I surface an error to the customer?  Silently fail?  I might generally fail silently if I'm a background process, but then again, what if it's an important one?  What if the customer thought he was saving his draft while all along it was offline, and then the customer closes the browser?</li>
<li>During the async operation, should I show the user a timeout spinner or something to that effect?</li>
<li>How should I design my async operations?  For example, consider a Save operation.  Should I capture all of my state at once and send it off, and let the user immediately keep working?  Should I make the user wait until saving completes?  Should I even use Save, or automatically save whenever something changes?</li>
<li>If I use auto-save, how do I handle undo?  What if I want to undo between sessions?  Is there a way to go back if the hosting application crashes?  (Worst case scenario: the user accidentally hit Select All, Delete and then the browser crashed after the auto-save).</li>
</ul>
<p>This merely scratches the surface of the kinds of questions we'll need to begin asking ourselves.  It doesn't even deal with the difficulties of programming asynchronously, which C# 5 is going to deal with extraordinarily, but many developers will be unable to take advantage of these updates.  For example, suppose I have a widget on my page that monitors the status of a long-running server-based process.  I need to have JavaScript on my page that monitors that process and updates my widget accordingly.  Should I:</p>
<ul>
<li>Write a <a href="http://en.wikipedia.org/wiki/Singleton_pattern" target="_blank">singleton object</a>?  This might be easier and afford strong member protection, but I can only have one widget, unless I somehow differentiate between them and multiplex, which can become hairy quickly.</li>
<li>Should the monitoring function accept a callback, or should it be event-based, so that multiple subscribers can listen?  (Maybe an event-based model offers some interesting ways to deal with the complexities of a singleton?)</li>
<li>Should the widget manipulate the view directly, or should I write separate code that handles the view based on the state of the object (or objects)?</li>
</ul>
<p>The list goes on.</p>
<p>We're moving faster and faster into an asychronous world.  It is already happening, and we as developers need to be prepared to handle these difficulties.  We also need to understand how to communicate these kinds of questions to our business analysts, our supervisors, and our customers.  We need to be able to equip ourselves to ask the right questions of our customers, so that when it's time to make a decision, we have the information we need.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/in-a-disconnected-world-robust-code-is-crucial/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A Usability Problem</title>
		<link>http://robpaveza.net/a-usability-problem</link>
		<comments>http://robpaveza.net/a-usability-problem#comments</comments>
		<pubDate>Sat, 28 Jan 2012 19:01:02 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[Computing]]></category>
		<category><![CDATA[criticism]]></category>
		<category><![CDATA[design]]></category>
		<category><![CDATA[firefox]]></category>
		<category><![CDATA[ux]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=143</guid>
		<description><![CDATA[I don't use Firefox very often. Generally I'm in Chrome or IE. But, I keep Firefox on my taskbar, because I do enough web development that it's prudent for browser compatibility testing. Every now and then I get this dialog: Note that when I'm not taking a screenshot, that first item has a blue highlight [...]]]></description>
			<content:encoded><![CDATA[<p>I don't use Firefox very often. Generally I'm in Chrome or IE. But, I keep Firefox on my taskbar, because I do enough web development that it's prudent for browser compatibility testing.</p>
<p>Every now and then I get this dialog:<br />
<img class="alignnone size-full wp-image-144" title="ffox-addons" src="http://robpaveza.net/wp-content/uploads/2012/01/ffox-addons.png" alt="Firefox Add-ons Dialog" width="524" height="506" /></p>
<p>Note that when I'm not taking a screenshot, that first item has a blue highlight instead of gray.</p>
<p>What's the problem?  </p>
<p>Well, first of all, it's a popup.  It has its own window, which in my mind, means that Firefox thinks I ought to do something about it.  The only action that appears to be there is the "Find Updates" button; but of course, that doesn't find updates to the plugin I just installed, which is the purpose of the dialog in the first place, isn't it?</p>
<p>No.  In the screenshot, the Java Console 6.0.27 is the newly-installed plugin because I just installed Java (with MonoTouch and MonoDevelop).</p>
<p>Mozilla, this dialog sucks, and has sucked since I saw it back in the early days of Firefox.  Take a lesson from IE, and if you want to show me a notification, put it in a bar.  Make it say, "The 'Java Console' add-on has been newly installed."  Or, "4 new add-ons have been installed; <span style="color: blue; text-decoration: underline;">click here </span> to see this list."  </p>
<p>At the heart of this problem, though, is a <a href="http://www.joelonsoftware.com/articles/Biculturalism.html" target="_blank">cultural difference</a>; I strongly believe that the *nix culture is reflected in this user experience.  It was as if someone said, "OK, well, we'll run <tt>firefox --check-plugin-updates | firefox-ui</tt> and the result was piped to a new window, because it had nowhere better to go.  </p>
<p>That's not to say that command-line piping to the UI is a bad thing (though I believe that it's better to make the programmatic interface between two subsystems, well, programmatic, not text), but if someone had actually spent some time designing the user interaction for the "New plugins installed" use-case, they would not have decided to simply reuse the "Show all installed plugins" UI.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/a-usability-problem/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>A very fast, random text string generator in C#, Part One</title>
		<link>http://robpaveza.net/a-very-fast-random-text-string-generator-in-c-part-one</link>
		<comments>http://robpaveza.net/a-very-fast-random-text-string-generator-in-c-part-one#comments</comments>
		<pubDate>Wed, 18 Jan 2012 06:36:11 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[challenges]]></category>
		<category><![CDATA[math]]></category>
		<category><![CDATA[tools]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=137</guid>
		<description><![CDATA[This is about half of a type I designed a few years ago in response to my boss's assertion that I couldn't improve on the speed of random string generators. This is a pretty handy type to have around when you want to generate a character string of a fixed length. It so happens that [...]]]></description>
			<content:encoded><![CDATA[<p>This is about half of a type I designed a few years ago in response to my boss's assertion that I couldn't improve on the speed of random string generators.  This is a pretty handy type to have around when you want to generate a character string of a fixed length.  It so happens that 6 characters can fit a "base 36" number very well into just over 2<sup>31</sup> bits (it's just a little bit bigger than <tt>int.MaxValue</tt> and so it stores the value as a <tt>uint</tt>).  </p>
<p>What is included below is a first step.  I want to show how to refactor it for improved performance and where certain design scenarios might be better; for example, repeatedly calling the <tt>CreateNew</tt> method results in repeatedly creating new <a href="http://msdn.microsoft.com/en-us/library/system.security.cryptography.rngcryptoserviceprovider.aspx" target="_blank">RNGCryptoServiceProviders</a>.  Although I believe this class is a bit better about seeds as it incorporates hardware-dependent data, it isn't necessarily cryptographically strong.  You can add some strength by passing in a single RNG to each subsequent call, for example.</p>
<p>This sample also only goes one way: from number to string.  Next time, we'll show the reverse operation.</p>
<p>Note: an important inclusion:</p>
<pre class="brush: csharp; title: ; notranslate">using System.Security.Cryptography;</pre>
<pre class="brush: csharp; title: ; notranslate">
    /// &lt;summary&gt;
    /// Represents a number that may be transitioned to a six-digit alphanumeric (base-36) representation.  This type is not CLS-compliant.
    /// &lt;/summary&gt;
    [CLSCompliant(false)]
    public struct AlphaNumericNumber
    {
        private const uint MAX_VALUE = 2176782336; // = RADIX ^ 6
        private const int RADIX = 36; // 10 digits + 26 alphabetics
        private uint m_val;

        /// &lt;summary&gt;
        /// Creates a new &lt;see&gt;AlphaNumericNumber&lt;/see&gt; with the specified value.
        /// &lt;/summary&gt;
        /// &lt;param name=&quot;value&quot;&gt;The value with which to assign the number.&lt;/param&gt;
        public AlphaNumericNumber(uint value)
        {
            if (value &gt; MAX_VALUE)
                value %= MAX_VALUE;
            m_val = value;
        }

        /// &lt;summary&gt;
        /// Creates a new, random &lt;see&gt;AlphaNumericNumber&lt;/see&gt;.
        /// &lt;/summary&gt;
        /// &lt;returns&gt;A randomly-chosen &lt;see&gt;AlphaNumericNumber&lt;/see&gt;.&lt;/returns&gt;
        public static AlphaNumericNumber CreateNew()
        {
            byte[] container = new byte[4];
            using (RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider())
            {
                rng.GetNonZeroBytes(container);
            }

            return new AlphaNumericNumber(BitConverter.ToUInt32(container, 0));
        }

        /// &lt;inheritdoc /&gt;
        public override string ToString()
        {
            char[] result = new char[6];
            uint msd = RADIX * RADIX * RADIX * RADIX * RADIX;

            uint currentDigit = msd;
            uint accumulator = m_val;
            unchecked
            {
                for (int charIndex = 0; charIndex &lt; result.Length; charIndex++)
                {
                    uint currentDigitValue = accumulator / currentDigit;
                    accumulator -= (currentDigitValue * currentDigit);
                    if (currentDigitValue &lt;= 9)
                    {
                        result[charIndex] = (char)('0' + currentDigitValue);
                    }
                    else
                    {
                        currentDigitValue -= 10; // adjust for 'A' equaling 10.
                        result[charIndex] = (char)('A' + currentDigitValue);
                    }

                    currentDigit /= RADIX;
                }
            }

            return new string(result);
        }

        /// &lt;summary&gt;
        /// Gets the value contained by this &lt;see&gt;AlphaNumericNumber&lt;/see&gt;.
        /// &lt;/summary&gt;
        public uint Value
        {
            get { return m_val; }
        }
    }
</pre>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/a-very-fast-random-text-string-generator-in-c-part-one/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Please, don&#8217;t ever use the &#8220;Remove Unused Namespaces&#8221; feature</title>
		<link>http://robpaveza.net/please-dont-ever-use-the-remove-unused-namespaces-feature</link>
		<comments>http://robpaveza.net/please-dont-ever-use-the-remove-unused-namespaces-feature#comments</comments>
		<pubDate>Wed, 11 Jan 2012 02:52:21 +0000</pubDate>
		<dc:creator>Rob Paveza</dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[bad plugins]]></category>
		<category><![CDATA[C#]]></category>
		<category><![CDATA[complaints]]></category>
		<category><![CDATA[maintenance programmer]]></category>
		<category><![CDATA[plugins]]></category>

		<guid isPermaLink="false">http://robpaveza.net/?p=134</guid>
		<description><![CDATA[Seriously, I don't know why this feature exists or who thought it would be a good idea. The time it takes to compile even the most complicated C# file is trivial. On the other hand, when I try to access the .Take() method in System.Linq, or the Encoding class in System.Text, or suddenly I need [...]]]></description>
			<content:encoded><![CDATA[<p>Seriously, I don't know why this feature exists or who thought it would be a good idea.  The time it takes to compile even the most complicated C# file is trivial.  </p>
<p>On the other hand, when I try to access the .Take() method in System.Linq, or the Encoding class in System.Text, or suddenly I need a new List&lt;T&gt; from System.Collections.Generic - if you have used a tool to remove unused namespaces from your C# code file - you have made me wonder why my editor isn't detecting it.</p>
<p>There's a reason that many default namespaces are included with a default C# code file.  Leave them there!  Maintenance programmers will love you forever.</p>
]]></content:encoded>
			<wfw:commentRss>http://robpaveza.net/please-dont-ever-use-the-remove-unused-namespaces-feature/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

