<?xml version="1.0" ?>
<rss version="2.0">
	<channel>
		<title>ViNull Records</title>
		<link>http://www.ViNull.com/</link>
		<description>Personal website of Michael C. Neel</description>
		<copyright>Copyright 2006, Michael C. Neel</copyright>
		<language>en-us</language>
		<pubDate>Tue, 13 May 2008 18:09:06 GMT</pubDate>
		<docs>http://blogs.law.harvard.edu/tech/rss</docs>
		<managingEditor>michael.neel@gmail.com (Michael C. Neel)</managingEditor>
		<generator>ViNull Siding</generator>
		<image>
			<url>http://creativecommons.org/images/public/somerights20.png</url>
			<title>Creative Commons Attribution 2.5 License</title>
			<link>http://creativecommons.org/licenses/by/2.5/</link>
			<height>31</height>
			<width>88</width>
		</image>
		<item>
			<title>Birmingham Software Developers Association, May 14th</title>
			<link>http://www.vinull.com/Post/2008/05/09/birmingham-software-developers-associat.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/05/09/birmingham-software-developers-associat.aspx</guid>
			<pubDate>Fri, 09 May 2008 00:33:46 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/05/09/birmingham-software-developers-associat.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/diamondduste/2408861552/&quot;&gt;&lt;img style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; margin: 0px 10px 10px 0px; border-right-width: 0px&quot; height=&quot;164&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriterbirminghamsoftwaredevelopersassociationm_1219bimage_3.png&quot; width=&quot;244&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt; Next Wednesday I'll be in Birmingham, Alabama speaking on DataSets.&amp;nbsp;&amp;nbsp; Yes, DataSets.&amp;nbsp; I actually have quite a fondness for DataSets and I love getting the chance to show how they can be used for the forces good.&amp;nbsp; If you'll be in the area, details are on the &lt;a href=&quot;http://www.bsda.info/&quot;&gt;BSDA website&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;DataSets: Code Less, Do More&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;: DataSets are Evil. They will hog your CPU, steal your RAM, and rob your home. This is the story surrounding DataSets, but what is fact and what is myth? In this session we will look at DataSets and the tools that go with them to see how they can save you development time while not crashing the server. We'll also dive into DataSets in 2008 with LINQ to DataSets and Unit Testing with DataSets. &lt;/p&gt;</description>
		</item>
		<item>
			<title>Announcing CodeStock 2008</title>
			<link>http://www.vinull.com/Post/2008/05/05/announcing-codestock-2008.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/05/05/announcing-codestock-2008.aspx</guid>
			<pubDate>Mon, 05 May 2008 14:34:19 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/05/05/announcing-codestock-2008.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.codestock.org&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;260&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriterannouncingcodestock2008_94b0image_3.png&quot; width=&quot;208&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt;I'm pleased to announce that planning for Knoxville's first CodeStock is underway!&amp;nbsp; The website, &lt;a href=&quot;http://www.codestock.org/&quot;&gt;http://www.codestock.org/&lt;/a&gt; is up now and includes a pre-registration form.&lt;/p&gt; &lt;p&gt;CodeStock's mission is to bring the best and brightest code experts to East Tennessee for a one day conference open to all developers. This is not a trade show with slick salesman giving prepared demos - this is a gathering of real programmers learning about the latest in technology from each other.&lt;/p&gt; &lt;p&gt;The pre-registration information is being used to help us plan and secure sponsorship for the event.&amp;nbsp; You can help by forwarding this to every developer you know!&amp;nbsp; Signing up on the pre-registration form doesn't lock you into attending, so please sign up even if you're undecided so we can update you as we get closer to the conference.&lt;/p&gt; &lt;p&gt;CodeStock is not limited to only .Net topics, so share this with your Java and Dynamic Language friends as well!&lt;/p&gt; &lt;p&gt;(I've been tied up lately checking out venues and getting the website going, so I've been light on the code posts but never fear I have a SilverLight post I'm working on and will return this blog to code posts very soon!)&lt;/p&gt;</description>
		</item>
		<item>
			<title>SilverLight Interop with Flash/Flex (flashlight?)</title>
			<link>http://www.vinull.com/Post/2008/04/21/silverlight-interop-with-flashflex-flas.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/21/silverlight-interop-with-flashflex-flas.aspx</guid>
			<pubDate>Mon, 21 Apr 2008 18:40:32 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/21/silverlight-interop-with-flashflex-flas.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/two-wrongs/202446349/&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;244&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewritersilverlightinteropwithflashflexflashligh_ce4fimage_3.png&quot; width=&quot;184&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt;While the marketers and academics focus on the battle between silverlight and flash/flex, here in Mike's Mad Scientist Labs we've been focused on making the two work together.&amp;nbsp; Like our founder (Dr. Frankenstein) the implementation is a bit rough, but we can proudly proclaim, &quot;It's Alive!&quot;&lt;/p&gt; &lt;p&gt;Before I get into my lab notes, let's talk about the basic approach and why.&amp;nbsp; Silverlight is awesome, but it's the new kid and developers won't always be able to replace existing flash apps with silverlight, so a migration path is needed.&amp;nbsp; Also, sliverlight isn't going to play FLV - flash's proprietary video codec - anytime soon, and there is a multi-ton of video in this format.&amp;nbsp; If silverlight supported the WPF Frame element, which can render any HTML, things would be better, but as of today Frame isn't supported.&lt;/p&gt; &lt;p&gt;The goal: a silverlight control list a choice of FLV videos, let the user choose one, and play that video in a flash control.&amp;nbsp; To communicate between the controls we'll use javascript. This approach is very similar to &lt;a href=&quot;http://www.wintellect.com/cs/blogs/jprosise/archive/2008/04/12/control-interop-silverlight-style.aspx&quot;&gt;Jeff Prosise's post on silverlight interop&lt;/a&gt;, in which javascript allowed two silverlight controls to communicate.&lt;/p&gt; &lt;p&gt;The code and XAML to the Silverlight control is very simple:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;UserControl&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Class&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;MyVideos.Page&quot;
&lt;/span&gt;   &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; xmlns&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;http://schemas.microsoft.com/client/2007&quot;&lt;/span&gt; 
   &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; xmlns&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;x&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&lt;/span&gt; 
   &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; Width&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;400&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; Height&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;300&quot;&amp;gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;ListBox&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; x&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Name&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;lbVideos&quot;&lt;/span&gt;&lt;span style=&quot;color: rgb(255,0,0)&quot;&gt; SelectionChanged&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;lbVideos_SelectionChanged&quot;&amp;gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;        &lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;TextBlock&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;Loading...&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;TextBlock&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;    &lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;ListBox&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;UserControl&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;&lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;partial&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;class&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;Page&lt;/span&gt; : &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;UserControl&lt;/span&gt; {
    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt;&amp;gt; OnPlayHandlers { &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;get&lt;/span&gt;; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;set&lt;/span&gt;; }

    [&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ScriptableMember&lt;/span&gt;]
    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; addOnPlayHandler(&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt; functionName) {
        OnPlayHandlers.Add(functionName);
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; OnPlay(&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt; video) {
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt; h &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; OnPlayHandlers)
            &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;HtmlPage&lt;/span&gt;.Window.Invoke(h, video);
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; Page() {
        InitializeComponent();
        OnPlayHandlers = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;List&lt;/span&gt;&amp;lt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;string&lt;/span&gt;&amp;gt;();

        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;HtmlPage&lt;/span&gt;.RegisterScriptableObject(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Page&quot;&lt;/span&gt;, &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;this&lt;/span&gt;);

        lbVideos.Items.Clear();
        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt;[] items = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt;[] { &lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;hampster.flv&quot;&lt;/span&gt;, 
                                        &lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;smb_flute.flv&quot;&lt;/span&gt;, 
                                        &lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;starwarskid.flv&quot;&lt;/span&gt; };
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt; s &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; items)
            lbVideos.Items.Add(s);
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;private&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; lbVideos_SelectionChanged(&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;object&lt;/span&gt; sender, &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;SelectionChangedEventArgs&lt;/span&gt; e) {
        OnPlay(lbVideos.SelectedItem.ToString().Replace(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Video: &quot;&lt;/span&gt;,&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt;.Empty));
    }
}&lt;/pre&gt;&lt;pre class=&quot;code&quot;&gt;&lt;/pre&gt;
&lt;p&gt;The [&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ScriptableMember&lt;/span&gt;] attribute exposes this method to javascipt, and&amp;nbsp; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;HtmlPage&lt;/span&gt;.RegisterScriptableObject maps the method name, which will end up being &lt;em&gt;SilverlightControl.&lt;/em&gt;Page.addOnPlayHandler.&amp;nbsp; I borrowed the common event handler pattern so it's easy to have multiple javascript methods fire when the user clicks a video - I also didn't want to make any assumptions about the flash control that would play the video.&amp;nbsp; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;HtmlPage&lt;/span&gt;.Window.Invoke is the real magic, which invokes the actual javascript function when a video is clicked.&lt;/p&gt;
&lt;p&gt;The ASPX/HTML is also pretty light:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;ScriptManager&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;ScriptManager1&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;server&quot;/&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;Silverlight&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;ID&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;slMyVideos&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;runat&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;server&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Source&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;~/ClientBin/MyVideos.xap&quot;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Version&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;2.0&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Width&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;400px&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;Height&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;300px&quot;&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;OnPluginLoaded&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;slMyVideos_Loaded&quot;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;Silverlight&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;OBJECT&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;classid&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='clsid:D27CDB6E-AE6D-11cf-96B8-444553540000'
&lt;/span&gt;        &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;WIDTH&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='320'&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;HEIGHT&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='260'&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;id&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='FLVplayer'&amp;gt;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;PARAM&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=movie&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;VALUE&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='flvplayer.swf'&amp;gt;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;PARAM&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=allowScriptAccess&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;VALUE&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=sameDomain&amp;gt;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;PARAM&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=flashvars&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;VALUE&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='file=dummy.flv&amp;amp;autostart=true&amp;amp;enablejs=true'&amp;gt;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;EMBED&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;src&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='flvplayer.swf'&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;NAME&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='FLVplayer'&lt;/span&gt; 
           &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;swliveconnect&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='true'&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;WIDTH&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='320'&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;HEIGHT&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='260'
&lt;/span&gt;           &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;TYPE&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='application/x-shockwave-flash'
&lt;/span&gt;           &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;FLASHVARS&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;='file=dummy.flv&amp;amp;autostart=true&amp;amp;enablejs=true'&amp;gt;
&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;EMBED&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;OBJECT&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;I'm using the &lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;asp&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;:&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;Silverlight&lt;/span&gt; tag included with the &lt;a href=&quot;http://silverlight.net/GetStarted/&quot;&gt;silverlight 2.0 beta 1 tools&lt;/a&gt; to handle generating the object tags for the silverlight control.&amp;nbsp; I wrote out the object and embed tags for the flash player to show exactly what's going on (since I assume most of my reader are not Flash developers), but in a production app I recommend using the open source &lt;a href=&quot;http://code.google.com/p/swfobject/&quot;&gt;SWFObject project&lt;/a&gt; for better cross browser support.&lt;/p&gt;
&lt;p&gt;The critical lines for flash are &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;allowScriptAccess&lt;/span&gt; and &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;swliveconnect&lt;/span&gt; which enable javascript control of the flash.&amp;nbsp; I'm using the open source &lt;a href=&quot;http://www.jeroenwijering.com/?item=JW_FLV_Media_Player&quot;&gt;FLVplayer by Jeroen Wijering&lt;/a&gt;, which requires a flashvar of enablejs=true in addition to the above.&amp;nbsp; The FLVplayer has a rich Javascript API for controlling the play, so the last step is to add some javascript to connect the OnPlay event of the silverlight control to load and play the video in the flash control.&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;script&lt;/span&gt; &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;type&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;text/javascript&quot;&amp;gt;

&lt;/span&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;function&lt;/span&gt; slMyVideos_Loaded() {
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;var&lt;/span&gt; sl = $get(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;'&amp;lt;%= slMyVideos.ClientID %&amp;gt;'&lt;/span&gt;);
        sl.Content.Page.addOnPlayHandler(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;'OnPlay'&lt;/span&gt;);
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;function&lt;/span&gt; getFlashMovieObject(movieName) {
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;if&lt;/span&gt; (document.embeds &amp;amp;&amp;amp; document.embeds[movieName])
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;return&lt;/span&gt; document.embeds[movieName]; 
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;else
&lt;/span&gt;            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;return&lt;/span&gt; $get(movieName);
    }    

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;function&lt;/span&gt; OnPlay(video) {
        flvplayer = getFlashMovieObject(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;'FLVplayer'&lt;/span&gt;);
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;try&lt;/span&gt; {
            flvplayer.loadFile({file: video});
            flvplayer.sendEvent(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;'playitem'&lt;/span&gt;, 0);   
        }
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;catch&lt;/span&gt;(e) {
            alert(e.description);                
        }
    }

&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;script&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;&amp;gt;
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;The slMyVideos_Loaded function is called when the silverlight control has fully loaded (by the &lt;span style=&quot;color: rgb(255,0,0)&quot;&gt;OnPluginLoaded&lt;/span&gt;&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;=&quot;slMyVideos_Loaded&quot;&lt;/span&gt; set in the silverlight tag).&amp;nbsp; The getFlashMovieObject function determines if the browser is using the embed version or the object version of the flash control, and returns the correct reference.&amp;nbsp; The OnPlay function is called by silverlight when the user clicks an item in the list and uses the FLVPlayer's API to load and play the video.&lt;/p&gt;
&lt;p&gt;It is possible to run Javascript right from flash and silverlight to talk directly to one another without the need for this glue code on the page.&amp;nbsp; This would tightly couple the two controls, and isn't my cup of tea, but I can see some instances where that would be a desired behavior. &lt;/p&gt;
&lt;p&gt;Now back to the lab to see what else we can bring to life...&lt;/p&gt;</description>
		</item>
		<item>
			<title>Session, ForEach, and a ShallowCopy walk into a bar...</title>
			<link>http://www.vinull.com/Post/2008/04/14/session-foreach-and-a-shallowcopy-walk-.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/14/session-foreach-and-a-shallowcopy-walk-.aspx</guid>
			<pubDate>Mon, 14 Apr 2008 18:11:37 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/14/session-foreach-and-a-shallowcopy-walk-.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/thomashawk/229516213/&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;164&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewritersessionforeachandashallowcopywalkintoab_c792image_3.png&quot; width=&quot;244&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt;Before we get started, let's play &quot;questions you only hear during an interview.&quot;&amp;nbsp;&amp;nbsp; Are the contestants ready?&amp;nbsp; Good, here is the question:&amp;nbsp; What is the difference between a shallow copy and a deep copy?&amp;nbsp; &lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/system.object.memberwiseclone.aspx&quot;&gt;MSDN on Object.MemberwiseClone&lt;/a&gt;: &quot;Consider an object called X that references objects A and B. Object B, in turn, references object C. A shallow copy of X creates new object X2 that also references objects A and B. In contrast, a deep copy of X creates a new object X2 that references the new objects A2 and B2, which are copies of A and B. B2, in turn, references the new object C2, which is a copy C.&quot; &lt;/p&gt; &lt;p&gt;Clear as mud?&amp;nbsp; Okay, think of it this was - if you made a shallow copy of a directory it would copy only the files in the top level of the directory and create shortcut links to the subfolders.&amp;nbsp; A deep copy would copy the files, all subfolders and their file, and the subfolder's subfolders and files, etc.&amp;nbsp; In C#/.Net world, 99% of the time you are making shallow copies.&lt;/p&gt; &lt;p&gt;It common for me to have an asp.net app that gets data from a webservice, and then applies filters selected by the user.&amp;nbsp; Since the user will change sorting, filters, etc with the same set of data several times, I cache the call to the webservice in Session.&amp;nbsp; (Note: It's okay because I expect only 2-4 user's at a time on these, mostly internal applications - don't do this if you need to scale beyond a small set of users!).&amp;nbsp; It looks something like:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[] Products { 
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;get&lt;/span&gt; {
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;return&lt;/span&gt; Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Products&quot;&lt;/span&gt;] == &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;null&lt;/span&gt; ? 
                &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[0] : 
                (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[])Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Products&quot;&lt;/span&gt;];
        }
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;set&lt;/span&gt; {
            Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Products&quot;&lt;/span&gt;] = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;value&lt;/span&gt;;
        }
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; LoadProducts()
    {
        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowServiceSoap&lt;/span&gt; svc = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowServiceSoap&lt;/span&gt;();
        Products = svc.GetProductsByShowID(
            &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;String&lt;/span&gt;.Empty, 
            &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;Convert&lt;/span&gt;.ToDecimal(ddlShows.SelectedValue));
    }

    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; FilterProducts() {
        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[] products = Products;

        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;if&lt;/span&gt; (cbFilterSizeable.Checked) {
            products = (&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;from&lt;/span&gt; p &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; products 
                        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;where&lt;/span&gt; p.Sizeable.Equals(&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;true&lt;/span&gt;) 
                        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;select&lt;/span&gt; p).ToArray();
        }

        gvProducts.DataSource = products;
        gvProducts.DataBind();
    }&lt;/pre&gt;
&lt;p&gt;This works just fine.&amp;nbsp; In practice, there are many steps in the FilterProducts method and I add some &lt;a href=&quot;http://en.wikipedia.org/wiki/Dependency_injection&quot;&gt;dependency injection&lt;/a&gt; options beyond using a property to access session, but you get the idea.&amp;nbsp; These methods are called from event handlers on the web form.&amp;nbsp; &lt;/p&gt;
&lt;p&gt;Now, I had a request to add an option to filter product videos to only .AVI, which are stored in the ShowProduct.Video list, so I changed FilterProducts like so:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;protected&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;void&lt;/span&gt; FilterProducts() {
        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[] products = Products;

        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;if&lt;/span&gt; (cbFilterSizeable.Checked) {
            products = (&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;from&lt;/span&gt; p &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; products 
                        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;where&lt;/span&gt; p.Sizeable.Equals(&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;true&lt;/span&gt;) 
                        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;select&lt;/span&gt; p).ToArray();
        }

        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;if&lt;/span&gt; (cbFilterAviOnly.Checked) {
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;foreach&lt;/span&gt; (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt; p &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; products)
                p.Videos = (&lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;from&lt;/span&gt; v &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;in&lt;/span&gt; p.Videos
                            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;where&lt;/span&gt; v.FileType.Equals(&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;AVI&quot;&lt;/span&gt;, 
                                &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;StringComparison&lt;/span&gt;.CurrentCultureIgnoreCase)
                            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;select&lt;/span&gt; v).ToArray();
        }

        gvProducts.DataSource = products;
        gvProducts.DataBind();
    }
&lt;/pre&gt;
&lt;p&gt;If you see the error, and understand why it happens, congratulations!&amp;nbsp; If you are like me you noticed that when this runs, and the user filters AVI only, all works as expected.&amp;nbsp; When they remove the filter however, the non-AVI files do not return.&amp;nbsp; More confusing is that if they filtered Sizeable products only, and the removed the filter, the missing product did return!&amp;nbsp; What's going on?&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;        &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[] products = Products;
&lt;/pre&gt;
&lt;p&gt;This made a shallow copy of the array in Session.&amp;nbsp; Each ShowProduct was copied, &lt;strong&gt;but the Videos array was a reference.&lt;/strong&gt;&amp;nbsp; When I changed the Videos array in the shallow copy, it changed the object in Session because both Session and my copy pointed at the same location in memory.&lt;/p&gt;
&lt;p&gt;I searched around for a bit to find a way to solve my problem; i.e. how to make a deep copy in C#/.Net.&amp;nbsp; There is a method System.FantasyFramework.DeepCopy that will take any object type and return a deep copy of that object back, but I can't get my Visual Studio to find the dll for System.FantasyFramework in the GAC.&amp;nbsp; Many people have this issue as well, and resort to implementing &lt;a href=&quot;http://msdn2.microsoft.com/en-us/library/system.icloneable.aspx&quot;&gt;ICloneable&lt;/a&gt; on their object so that the object deep copies itself instead of shallow copies or write an extension method to deep copy the Array class.&amp;nbsp; I however opted for the quick fix below:&lt;/p&gt;&lt;pre class=&quot;code&quot;&gt;    &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;public&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[] Products { 
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;get&lt;/span&gt; {
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;if&lt;/span&gt; (Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;ShowProducts&quot;&lt;/span&gt;] == &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;null&lt;/span&gt;)
                &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;null&lt;/span&gt;;

            &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;Object&lt;/span&gt; result = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;null&lt;/span&gt;;
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;using&lt;/span&gt; (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;MemoryStream&lt;/span&gt; ms = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;MemoryStream&lt;/span&gt;()) {
                &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;BinaryFormatter&lt;/span&gt; bf = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;new&lt;/span&gt; &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;BinaryFormatter&lt;/span&gt;();
                bf.Serialize(ms, Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;ShowProducts&quot;&lt;/span&gt;]);
                ms.Seek(0, &lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;SeekOrigin&lt;/span&gt;.Begin);
                result = bf.Deserialize(ms);
                ms.Close();
            }
            
            &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;return&lt;/span&gt; (&lt;span style=&quot;color: rgb(43,145,175)&quot;&gt;ShowProduct&lt;/span&gt;[])result;

        }
        &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;set&lt;/span&gt; {
            Session[&lt;span style=&quot;color: rgb(163,21,21)&quot;&gt;&quot;Products&quot;&lt;/span&gt;] = &lt;span style=&quot;color: rgb(0,0,255)&quot;&gt;value&lt;/span&gt;;
        }
    }
&lt;/pre&gt;
&lt;p&gt;When accessed, the property loads the shallow copy from Session, then Serializes it to memory, then load it's back and returns the result.&amp;nbsp; This &quot;washes&quot; away any references and makes a full deep copy of the array.&amp;nbsp; (You do remember the part about not needing this to scale right?&amp;nbsp; Cool, do don't this on your public website's homepage).&amp;nbsp; This is also a case where good TDD practices have benefits beyond making it easier to write unit tests.&lt;/p&gt;
&lt;p&gt;As for the end of the bar joke, I'm afraid I don't have a punch-line yet.&amp;nbsp; I think it will have something to do with Session drinking only water, while ForEach and ShallowCopy see who can do the most shots of tequila - until Session falls over drunk.&lt;/p&gt;</description>
		</item>
		<item>
			<title>It's Tasty, It's Healthy, It's DevLicio.us!</title>
			<link>http://www.vinull.com/Post/2008/04/10/its-tasty-its-healthy-its-devlicious.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/10/its-tasty-its-healthy-its-devlicious.aspx</guid>
			<pubDate>Thu, 10 Apr 2008 16:10:51 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/10/its-tasty-its-healthy-its-devlicious.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.vinull.com//Assets/Images/windowslivewriteritstastyitshealthyitsdevlicio.us_ab45image_2.png&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;164&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriteritstastyitshealthyitsdevlicio.us_ab45image_thumb.png&quot; width=&quot;244&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt; I'm now a syndicated blogger!&amp;nbsp; Over &lt;a href=&quot;http://twitter.com/vinull&quot;&gt;twitter&lt;/a&gt; yesterday &lt;a href=&quot;http://devlicio.us/blogs/brendantompkins/default.aspx&quot;&gt;Brendan Tompkins&lt;/a&gt; announced they were looking for bloggers to join &lt;a href=&quot;http://devlicio.us&quot;&gt;devlicio.us&lt;/a&gt; - a sister blog to &lt;a href=&quot;http://codebetter.com&quot;&gt;codebetter.com&lt;/a&gt;.&amp;nbsp; Since this &lt;a href=&quot;http://twitter.com/ViNull/statuses/785803018&quot;&gt;sounded perfect to me&lt;/a&gt; I asked to join, and now I &lt;a href=&quot;http://devlicio.us/blogs/vinull/default.aspx&quot;&gt;have a blog on DevLicio.us&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;If you haven't already, I highly recommend subscribing to codebetter.com and devlicio.us - so many great .net bloggers all in one spot!&lt;/p&gt;</description>
		</item>
		<item>
			<title>Speaking in Maryland this weekend</title>
			<link>http://www.vinull.com/Post/2008/04/09/speaking-in-maryland-this-weekend.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/09/speaking-in-maryland-this-weekend.aspx</guid>
			<pubDate>Wed, 09 Apr 2008 15:10:40 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/09/speaking-in-maryland-this-weekend.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.vinull.com//Assets/Images/windowslivewriterspeakinginmarylandthisweekend_9d29image_2.png&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;150&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriterspeakinginmarylandthisweekend_9d29image_thumb.png&quot; width=&quot;150&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt; I've just been confirmed as a last minute addition to the &lt;a href=&quot;http://www.cmap-online.org/CodeCamp/Default.aspx&quot;&gt;Central Maryland Spring Code Camp '08&lt;/a&gt;.&amp;nbsp; I'll be speaking on WPF with my &lt;a href=&quot;http://vinull.com/Post/2008/03/31/presentation-from-zero-to-xaml.aspx&quot;&gt;From Zero to XAML&lt;/a&gt; presentation, and also leading a lunch talk on &lt;a href=&quot;http://vinull.com/Post/2008/03/31/presentation-welcome-to-the-church-of-a.aspx&quot;&gt;Agile&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;I didn't find out about this conference until Monday, when I saw a &lt;a href=&quot;http://community.irritatedvowel.com/blogs/pete_browns_blog/archive/2008/04/05/CMAP-Code-Camp-Next-Week.aspx&quot;&gt;post on Pete Brown's blog&lt;/a&gt;.&amp;nbsp; &lt;a href=&quot;http://www.dotnetjunkies.com/WebLog/csteen/default.aspx&quot;&gt;Christopher Steen&lt;/a&gt; is doing an awesome job organizing the conference and was able to let me slip in last minute.&amp;nbsp; This also let me justify (read: my excuse) to buy myself a nice new toy: the &lt;a href=&quot;http://www.amazon.com/gp/offer-listing/B000EXS1BS?tag=affiliategrou4-20&amp;amp;camp=0&amp;amp;creative=0&amp;amp;linkCode=am1&amp;amp;creativeASIN=B000EXS1BS&amp;amp;adid=1MSDDW25JQF6DZ931KMJ&amp;amp;&quot;&gt;Garmin n&#252;vi 360&lt;/a&gt;!&lt;/p&gt;</description>
		</item>
		<item>
			<title>Designed for transport</title>
			<link>http://www.vinull.com/Post/2008/04/08/designed-for-transport.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/08/designed-for-transport.aspx</guid>
			<pubDate>Tue, 08 Apr 2008 13:24:09 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/08/designed-for-transport.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;Most, if not all of the food packaging at our local grocery store was designed for transport.&lt;/p&gt; &lt;p&gt;Chip bags include large volumes of air so the chips aren't crushed in shipping.&amp;nbsp;&amp;nbsp; Juice boxes are bundled in groups of ten to make moving them from box to shelf faster.&amp;nbsp; Coffee beans are sealed in an air tight bag with a one-way valve to allow gas to escape so that beans can be bagged immediately after roasting.&lt;/p&gt; &lt;p&gt;Some food itself was designed for transport.&amp;nbsp; Beef jerky and pocket pies exist because we needed food on the go.&amp;nbsp; &lt;/p&gt; &lt;p&gt;Not all of this is good, however.&amp;nbsp; The need for transport has led to chemical preservatives being used - formaldehyde in our frozen vegetables, arsenic in our chicken, sodium nitrate in our lunch meant.&amp;nbsp; Trans fats were invented to be solid at higher temperatures and last longer on the shelf; making them easier to transport, but one of the worst things we can put in our bodies.&lt;/p&gt; &lt;p&gt;In software, we design for transport as well.&amp;nbsp; Data may be moved from relational databases to hierarchal XML documents to strongly typed objects before touching the glass of the user's screen.&amp;nbsp; We have many tools to aid the transport and preserve the information, but we must use them with an eye on the end user.&amp;nbsp; We cannot allow the tools to add unwanted flavors to the data, to force it's shape, or make it toxic.&lt;/p&gt; &lt;p&gt;Food scientists have decades in which to slowly kill the customer though chemicals designed for transport - software developers don't have such a cushion.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Can you handle power?</title>
			<link>http://www.vinull.com/Post/2008/04/07/can-you-handle-power.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/07/can-you-handle-power.aspx</guid>
			<pubDate>Mon, 07 Apr 2008 16:54:18 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/07/can-you-handle-power.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;As a developer, can you handle power?&lt;/p&gt; &lt;p&gt;Are you able to cope with choice?&lt;/p&gt; &lt;p&gt;If tasked with a project, right now, can you list 3 or more ways to implement the project that would all be the same to the eyes of the user?&lt;/p&gt; &lt;p&gt;Can use use tools to quickly generate a solution?&lt;/p&gt; &lt;p&gt;Can you do the same without those tools?&lt;/p&gt; &lt;p&gt;A developer today has more choice, more power, more tools, more frameworks, and more patterns than ever before.&amp;nbsp; It's hard not to put on blinders and focus only on a small part, to seek to understand just a corner of the programmer's world - be an expert in your area.&amp;nbsp; It generally pays better too, for a little while.&lt;/p&gt; &lt;p&gt;Then technology advances, reverts, reinvents, and casts the expert aside as obsolete.&lt;/p&gt; &lt;p&gt;Specialization is for insects.&lt;/p&gt;</description>
		</item>
		<item>
			<title>I think I'm MAIN.NET...</title>
			<link>http://www.vinull.com/Post/2008/04/04/i-think-im-mainnet.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/04/04/i-think-im-mainnet.aspx</guid>
			<pubDate>Fri, 04 Apr 2008 15:00:31 GMT</pubDate>
			<category>Bits and Bytes</category>
			<comments>http://www.vinull.com/Post/2008/04/04/i-think-im-mainnet.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://flickr.com/photos/cliph/470777279/&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px; border-left: 0px; border-bottom: 0px&quot; height=&quot;215&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriterithinkimmain.net_9a9fimage_3.png&quot; width=&quot;260&quot; align=&quot;left&quot; border=&quot;0&quot; /&gt;&lt;/a&gt; Over the past year, an &amp;quot;ALT.NET movement&amp;quot; has sprung up.&amp;#160; They have a &lt;a href=&quot;http://altnetpedia.com/OverviewWhatIsIt.ashx&quot;&gt;wiki&lt;/a&gt; &lt;a href=&quot;http://www.altnetconf.com&quot;&gt;meetings&lt;/a&gt;.&amp;#160; When it started out, it &lt;a href=&quot;http://laribee.com/blog/2007/04/10/altnet/&quot;&gt;sounded like a good idea&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;For those that aren't hip (read: not on twitter), ALT.NET has been a lightning rod in the community.&amp;#160; The simple idea was &amp;quot;Alternatives in .NET&amp;quot; (not &lt;strong&gt;to&lt;/strong&gt; .NET as one might assume from the name) - using the best tool for the job, wether it came from Microsoft or not.&amp;#160; That means if NUnit was a better testing tool than MSUnit, ALT.NET would encourage NUnit.&lt;/p&gt;  &lt;p&gt;A nice ideal, but in reality one man's &amp;quot;best&amp;quot; is another man's steaming pile of dung.&amp;#160; Seriously, if developers could agree on the &amp;quot;best&amp;quot; of anything we wouldn't have 78 (by my last count) different tools all aimed at mapping a database to objects.&amp;#160; So in practice, ALT.NET got into the name-calling, ego-bashing, and flame wars Internet forums do so well at.&amp;#160; I still like the idea though, and didn't mind following along the ALT.NET crowd... that is until they started going to extremes.&lt;/p&gt;  &lt;p&gt;I like meat (stay with me here).&amp;#160; I recognize that McDonald's may not be the best quality meat, and may even be harmful to me.&amp;#160; I'm interested in hearing about alternatives to McDonald's - but when talking to someone about this, the terms &amp;quot;vegetarian&amp;quot; and &amp;quot;vegan&amp;quot; come up.&amp;#160; The logic seems to be because I agree McDonald's meat is bad, I must leave all meat.&lt;/p&gt;  &lt;p&gt;Another example; when I was young I read C.S. Lewis' &lt;em&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Mere_Christianity&quot;&gt;Mere Christianity&lt;/a&gt;&lt;/em&gt;.&amp;#160; He argued there is a God because we all share a common view of morality, and that this was something we knew and didn't need to be taught.&amp;#160; I dug this, it made sense to me, so I agreed.&amp;#160; The he argued that since we agreed on this God fellow, and Jesus was his son, we believe in his existence too.&lt;/p&gt;  &lt;p&gt;Both of the cases show a &amp;quot;logic leap&amp;quot; in which we went from point A to point C and I don't recall stopping for lunch at point B during the trip.&amp;#160; ALT.NET just arrived at point C for me with &lt;a href=&quot;http://codebetter.com/blogs/david_laribee/archive/2008/04/03/early-tool-theory.aspx&quot;&gt;David Laribee's latest post on tools&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;In the post, he makes the case for the &amp;quot;Developer Vegan&amp;quot; or what I'll now call &amp;quot;Degan&amp;quot; to drop back to the command line as the ultimate in process mastery.&amp;#160; Now, there have been &lt;a href=&quot;http://www.charlespetzold.com/etc/DoesVisualStudioRotTheMind.html&quot;&gt;rants against the IDE before&lt;/a&gt; and while I do agree there are dangers and problems in using the IDE, I strongly disagree the answer is to toss the IDE aside.&lt;/p&gt;  &lt;p&gt;I'm going to make this simple - Time is Money - a tool that saves time is better than a tool that costs time.&amp;#160; If I can product an application in less total time (total time being time to launch and support) with Visual Studio than Vi, Visual Studio is the better tool.&amp;#160; As a manager, if I train new hires in less time on Visual Studio than Vi, Visual Studio is the better tool.&amp;#160; If my build process is &amp;quot;right click, select build&amp;quot; I save time by not having to train every developer on the build system, nor waste time configuring each workstation to be able to build the project.&lt;/p&gt;  &lt;p&gt;Rather than attempt to ignore the reality of time and money, I would like to see suggestions and improvements made to the IDE.&amp;#160; Address the weak points - if NUint is going to save time once setup, then ease the setup and integration - VS2008 supports a very flexible framework for plugins and extensions.&amp;#160; Just because your audience is other developers does not allow you to exempt yourself from Agile goals and providing a solid user experience.&lt;/p&gt;  &lt;p&gt;Bottom line, if ALT.NET is heading down this Degan path it is dooming itself to obscurity.&lt;/p&gt;  &lt;p&gt;PS. I really dig vi, and have it on all my machines - I just don't require other developers use vi in order to work on my code.&lt;/p&gt;</description>
		</item>
		<item>
			<title>Back home after my tour of the South</title>
			<link>http://www.vinull.com/Post/2008/03/31/back-home-after-my-tour-of-the-south.aspx</link>
			<guid isPermaLink="false">http://www.vinull.com/Post/2008/03/31/back-home-after-my-tour-of-the-south.aspx</guid>
			<pubDate>Mon, 31 Mar 2008 22:28:58 GMT</pubDate>
			<category>Bits and Bytes</category><category>Life, The Universe, &amp; Photographs</category>
			<comments>http://www.vinull.com/Post/2008/03/31/back-home-after-my-tour-of-the-south.aspx#comments</comments>
			<author>michael.neel@gmail.com (Mike)</author>
			<description>&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/juanpg/446710336/&quot;&gt;&lt;img style=&quot;border-right: 0px; border-top: 0px; margin: 0px 10px 10px 0px; border-left: 0px; border-bottom: 0px&quot; height=&quot;184&quot; alt=&quot;image&quot; src=&quot;http://www.vinull.com//Assets/Images/windowslivewriterbackhomeaftermytourofthesouth_103e8image_3.png&quot; width=&quot;244&quot; align=&quot;left&quot; border=&quot;0&quot;&gt;&lt;/a&gt; I'm back at home now after logging 20 hours on the road, driving from Knoxville to Little Rock to Atlanta and back to Knoxville.&amp;nbsp; I hit two conferences last week, and had a great time.&lt;/p&gt; &lt;p&gt;I'm going to spend some time (I really mean it this time!) and upload some of the video I recorded from the sessions at the conferences.&amp;nbsp; The &quot;&lt;a href=&quot;http://vinull.com/Post/2008/03/31/presentation-welcome-to-the-church-of-a.aspx&quot;&gt;Agile&lt;/a&gt;&quot; talk led to a great discussion in Atlanta, and my &lt;a href=&quot;http://vinull.com/Post/2008/03/31/presentation-from-zero-to-xaml.aspx&quot;&gt;WPF&lt;/a&gt; session went about as smooth as it possible could.&amp;nbsp;&amp;nbsp; I'm also going to play around with making screencast versions of some of my sessions - so look for that as well.&lt;/p&gt; &lt;p&gt;Visiting these conferences reminds me that we'll be planning our own Knoxville &quot;Day of .Net&quot; conference very soon.&amp;nbsp; While I wouldn't call myself a veteran speaker, I have a pretty good idea of what has been working, and what doesn't at a conference.&amp;nbsp; It's no small task, but I feel the &lt;a href=&quot;http://etnug.org/&quot;&gt;ETNUG&lt;/a&gt; is ready to pull off a great conference this year!&lt;/p&gt;</description>
		</item>
		
	</channel>
</rss>
