<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>The Runtime.com</title><link>http://theruntime.com/blogs/MainFeed.aspx</link><description>.NET by Subtext</description><generator>Subtext Version 1.9.5.0</generator><item><title>Facebook .NET Programmers Group XNA Session Posted</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/06/25/facebook-.net-programmers-group-xna-session-posted.aspx</link><pubDate>Thu, 25 Jun 2009 01:02:48 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/06/25/facebook-.net-programmers-group-xna-session-posted.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2809.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2809.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/06/25/facebook-.net-programmers-group-xna-session-posted.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2809.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Facebook .NET Programmers Group XNA Session Posted</source><description>&lt;p&gt;&lt;a href="http://www.brianpeek.com/blogimages/Faceb.NETProgrammesGroupXNASessionPosted_28DC/NETPROGRAMMERS2bcropSmall2.jpg"&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="NET PROGRAMMERS2bcropSmall2" border="0" alt="NET PROGRAMMERS2bcropSmall2" align="right" src="http://www.brianpeek.com/blogimages/Faceb.NETProgrammesGroupXNASessionPosted_28DC/NETPROGRAMMERS2bcropSmall2_thumb.jpg" width="160" height="93" /&gt;&lt;/a&gt; The recordings for the session I gave on &lt;a href="http://creators.xna.com/" target="_blank"&gt;XNA Game Studio 3.0&lt;/a&gt; and the XNA Framework to the &lt;a href="http://www.netprogrammers.org/" target="_blank"&gt;Facebook .NET Programmers Group&lt;/a&gt; have now been &lt;a href="http://www.netprogrammers.org/dnportal/Events/tabid/56/Default.aspx" target="_blank"&gt;posted&lt;/a&gt;.  In this session, I give an overview of XNA Game Studio 3.0 and the XNA Framework while building a simple Space Invaders clone named &lt;a href="http://www.c4fbook.com/alienattack" target="_blank"&gt;Alien Attack&lt;/a&gt;.  This game is gone into even greater detail with more features in chapter 1 of our &lt;a href="http://www.amazon.com/dp/0596520743?tag=brianpcom-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=0596520743&amp;amp;adid=19TVZXZSKP8VYN1181MD&amp;amp;" target="_blank"&gt;Coding4Fun book&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;You can find a quick, low-res, streaming version below, or you can download and &lt;a href="http://www.netprogrammers.org/dnlinks/recordings/13/ReplayMeeting.htm" target="_blank"&gt;play the recording at a higher resolution&lt;/a&gt; in &lt;a href="http://office.microsoft.com/en-us/livemeeting/default.aspx" target="_blank"&gt;Microsoft Office Live Meeting&lt;/a&gt;.  I had a great time presenting the topic and hope to speak to the group again in the future!&lt;/p&gt;  &lt;p align="center"&gt;&lt;object width="400" height="302"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=5044730&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=5044730&amp;amp;server=vimeo.com&amp;amp;show_title=1&amp;amp;show_byline=1&amp;amp;show_portrait=0&amp;amp;color=&amp;amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="400" height="302"&gt;&lt;/embed&gt;&lt;/object&gt;    &lt;br /&gt;&lt;a href="http://vimeo.com/5044730"&gt;Meeting #13 - Coding4Fun: Designing a Video Game using XNA Game Studio 3.0&lt;/a&gt; from &lt;a href="http://vimeo.com/user1696553"&gt;Muneeb&lt;/a&gt; on &lt;a href="http://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2809.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Better JavaScript class generation</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/06/24/better-javascript-class-generation.aspx</link><pubDate>Wed, 24 Jun 2009 15:15:32 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/06/24/better-javascript-class-generation.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2808.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2808.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/06/24/better-javascript-class-generation.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2808.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Better JavaScript class generation</source><description>&lt;p&gt;For years, I have been espousing how great Script# is. I often do an advanced MS ASP.NET Ajax client talk and end it with a Script# talk. Mainly because I think that the idea of learning the nuances of JavaScript OO techniques can be a little confusing. It’s really the challenge (All you need to do is search the archives of my blog and you’ll see my own confusion on this topic).&lt;/p&gt;  &lt;p&gt;I think many web developers can wrap their heads around building the functionality, but making something private/public/static can get a little confusing. Especially if you are used to using something like C# or VB to do it.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://new.efficientcoder.net/"&gt;Kevin “ByteMaster” Wolf&lt;/a&gt; and I have been talking about this. As a result of those talks I started playing with an idea of allowing developers create something that feels more like OO… Anyway, I have come up with a very alpha version. &lt;/p&gt;  &lt;h3&gt;A Better OO For JavaScript??&lt;/h3&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; compileClasses({    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;     testClass: {        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;         ctor: &lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// this is a test        &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;         },        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt;: {            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;             privateVar:1,            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             privateMethd:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {                &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt;                 &lt;span style="color: #008000"&gt;// test method            &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt;             }        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt;         },        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum12"&gt;  12:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;:{            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum13"&gt;  13:&lt;/span&gt;             &lt;span style="color: #008000"&gt;// public stuff here            &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum14"&gt;  14:&lt;/span&gt;             publicVar:&lt;span style="color: #006080"&gt;"2"&lt;/span&gt;        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum15"&gt;  15:&lt;/span&gt;         },        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum16"&gt;  16:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;static&lt;/span&gt;:{            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum17"&gt;  17:&lt;/span&gt;             &lt;span style="color: #008000"&gt;//public statics            &lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum18"&gt;  18:&lt;/span&gt;             staticVar:&lt;span style="color: #006080"&gt;"test"&lt;/span&gt;        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum19"&gt;  19:&lt;/span&gt;         }    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum20"&gt;  20:&lt;/span&gt;     },    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum21"&gt;  21:&lt;/span&gt;     testClass2: {        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum22"&gt;  22:&lt;/span&gt;         ctor: testFunc,        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum23"&gt;  23:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;private&lt;/span&gt;: {            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum24"&gt;  24:&lt;/span&gt;             privateVar2:&lt;span style="color: #006080"&gt;"2"&lt;/span&gt;        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum25"&gt;  25:&lt;/span&gt;         },        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum26"&gt;  26:&lt;/span&gt;         &lt;span style="color: #0000ff"&gt;public&lt;/span&gt;:{            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum27"&gt;  27:&lt;/span&gt;             publicMethod:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {                &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum28"&gt;  28:&lt;/span&gt;                 &lt;span style="color: #0000ff"&gt;return&lt;/span&gt; &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;;            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum29"&gt;  29:&lt;/span&gt;             },            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum30"&gt;  30:&lt;/span&gt;             myVar:&lt;span style="color: #006080"&gt;"this is a test"&lt;/span&gt;,            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum31"&gt;  31:&lt;/span&gt;             dispose:&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {            &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum32"&gt;  32:&lt;/span&gt;             }        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum33"&gt;  33:&lt;/span&gt;         },        &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum34"&gt;  34:&lt;/span&gt;         implements:[&lt;span style="color: #006080"&gt;"Sys.IDisposable"&lt;/span&gt;]    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum35"&gt;  35:&lt;/span&gt;     }&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum36"&gt;  36:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Two classes are defined here.. the first one is the testClass. you will see that I’m creating a JSON object that has members called “&lt;em&gt;ctor&lt;/em&gt;” (constructor), “&lt;em&gt;private&lt;/em&gt;” (private members are contained within this object), “&lt;em&gt;public&lt;/em&gt;” (public members are contained within this object),”&lt;em&gt;static&lt;/em&gt;” (static public members are contained within this object), and “&lt;em&gt;implements&lt;/em&gt;” (“array of interfaces that are implemented). I also will handle single inheritance using a member called “&lt;em&gt;inherits&lt;/em&gt;.” &lt;/p&gt;

&lt;p&gt;I think this makes class definition a little more straightforward for those of us who aren’t closure gurus, and it just might replace the pull of Script# on my life.&lt;/p&gt;

&lt;p&gt;Right now this all works with a simple function that uses the MS Ajax Client framework. I’m considering doing this for other frameworks (so if you love some other framework, never fear I’m considering your framework as well).&lt;/p&gt;

&lt;p&gt;I created a codeplex project which contains a single release that contains a simple ASP.NET project (could have been a simple html page too).. Don’t fret I expect the code to be a ton cleaner in the next version (I’m reading the MEAP version of John Resig’s &lt;a href="http://www.manning.com/resig/"&gt;Secrets of the JavaScript Ninja&lt;/a&gt; (and am learning a ton!)&lt;/p&gt;

&lt;p&gt;Here’s the link: &lt;a href="http://JsClassDef.codeplex.com"&gt;JsClassDef Project&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let me know what you think.. does it stink? is it cool? I know it ain’t Resig-like, but both Kevin and I think the simplified structure is nice and not un-JavaScript-like&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2808.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Status of Wii MotionPlus Support for WiimoteLib</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/06/19/status-of-wii-motionplus-support-for-wiimotelib.aspx</link><pubDate>Fri, 19 Jun 2009 11:43:59 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/06/19/status-of-wii-motionplus-support-for-wiimotelib.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2807.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2807.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/06/19/status-of-wii-motionplus-support-for-wiimotelib.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2807.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Status of Wii MotionPlus Support for WiimoteLib</source><description>&lt;p&gt;&lt;a href="http://www.amazon.com/dp/B001TOQ8NO/tag=brianpcom-20" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="wii-motionplus" border="0" alt="wii-motionplus" align="right" src="http://www.brianpeek.com/blogimages/StatusofWiiMotionPlusSupportforWiimoteLi_BA5C/wiimotionplus.jpg" width="165" height="124" /&gt;&lt;/a&gt; Ok, I get about 10 emails a day on this, so I figure a status update is in order.&lt;/p&gt;  &lt;p&gt;The &lt;a href="http://www.amazon.com/dp/B001TOQ8NO/tag=brianpcom-20" target="_blank"&gt;Wii MotionPlus&lt;/a&gt; extension for the Wiimote was released last week.  Since then, I and others have been working to figure out how the device works.  Unfortunately, it does &lt;strong&gt;NOT&lt;/strong&gt; work as every other extension controller has worked up until this point, mostly due to the fact that the Wii MotionPlus accessory has an expansion port of its own so all of the other extension controllers can plug into it.&lt;/p&gt;  &lt;p&gt;In the past few days, some progress has been made thanks to the folks over at &lt;a href="http://wiibrew.org/wiki/Wiimote/Extension_Controllers" target="_blank"&gt;wiibrew.org&lt;/a&gt;, although functionality is nowhere near complete.  For example, it’s currently impossible to have the Wiimote notify you when the Wii MotionPlus is inserted into the bottom of the Wiimote, like all of the other extension controllers do.&lt;/p&gt;  &lt;p&gt;I have been working with the information at &lt;a href="http://wiibrew.org/wiki/Wiimote/Extension_Controllers" target="_blank"&gt;wiibrew.org&lt;/a&gt; and am trying to get things working reliably with my library so that developers can actually get some degree of functionality out of it.&lt;/p&gt;  &lt;p&gt;So, all that said, expect to see a new (likely beta) version of WiimoteLib “soon” that has some bare-bones Wii MotionPlus functionality included.  It won’t be perfect, complete, or bug free, but it will allow you to tinker with the device a bit.  I will update my blog when the new version is available.  Thanks!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2807.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Using the Ajax control toolbox with jQuery (and ASP.NET MVC)</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/06/09/using-the-ajax-control-toolbox-with-asp.net-mvc-and-jquery.aspx</link><pubDate>Tue, 09 Jun 2009 20:19:30 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/06/09/using-the-ajax-control-toolbox-with-asp.net-mvc-and-jquery.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2806.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2806.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/06/09/using-the-ajax-control-toolbox-with-asp.net-mvc-and-jquery.aspx#comment</comments><slash:comments>5</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2806.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Using the Ajax control toolbox with jQuery (and ASP.NET MVC)</source><description>&lt;p&gt;[Here’s a preview of something I’m going to show Thursday night at the Tampa MVC group.]&lt;/p&gt;  &lt;p&gt;You may have thought that by jumping on ASP.NET MVC that you have to leave behind all the cool Ajax Control Toolbox controls.. or more than likely you realize that it’s possible to use them, but one has to be a “JavaScript Rocket Scientist” to use them..&lt;/p&gt;  &lt;p&gt;It’s really not, but you do need a couple things to use them.. First of all go &lt;a href="http://weblogs.asp.net/bleroy/archive/2009/05/04/creating-jquery-plug-ins-from-microsoftajax-components.aspx"&gt;&lt;strong&gt;here (Bertrand Le Roy’s blog)&lt;/strong&gt;&lt;/a&gt; and pick up the jQuery plugin that let’s you instantiate MS Ajax Behaviors. Next go &lt;strong&gt;&lt;a href="http://ajaxcontroltoolkit.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=27326"&gt;here to the Ajax Control Toolbox project and get both the ScriptFilesOnly project and the Source code&lt;/a&gt;&lt;/strong&gt; as with MVC you won’t need anything but the JS files since the source/DLLs are for WebForms-related controls, but the Source code contains the debug version of the JS files which we’ll need (By the way, 6 months from now that link to the Ajax Control Toolbox will be old so you’ll probably want to get the latest release, and not the release I pointed at).&lt;/p&gt;  &lt;p&gt;Now let’s look at how you would wire up the DropShadow behavior (aka the DropShadow Extender). First of all, we need to figure out the references. Thanks to Visual Studio 2008, this is easy. Using the text editor/view of your choice, open up the DropShadowBehavior.Debug.js from the Source project (not the ScriptOnly zip); this is located under the zip file at .\AjaxControlToolkitSource\AjaxControlToolkit\DropShadow. When you open up the file you will see the following at the top of the file:&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;   &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;     &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference name="MicrosoftAjax.debug.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference name="MicrosoftAjaxTimer.debug.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference name="MicrosoftAjaxWebForms.debug.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference path="../ExtenderBase/BaseScripts.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference path="../Common/Common.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &lt;span style="color: #008000"&gt;/// &amp;lt;reference path="../RoundedCorners/RoundedCornersBehavior.js" /&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; /// &amp;lt;reference path=&lt;span style="color: #006080"&gt;"../Compat/Timer/Timer.js"&lt;/span&gt; /&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The first 3 items are all the standard MS Ajax client library, so we’ll need to reference those. Now we need to look at the last 4 items. If you open up the files from the ScriptOnly zip file, you aren’t going to find these exact named files; to find the right file look at the end of the file name to find the actual file you need to reference. You’ll also need to reference jQuery and Bertrand Le Roy plugins. Here’s what the references look like:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/MicrosoftAjax.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/jquery-1.3.2.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/JqueryPlugin/jquery.MicrosoftAjax.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;  &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/MicrosoftAjaxTimer.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/MicrosoftAjaxWebForms.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;    &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/AjaxCT/AjaxControlToolkit.ExtenderBase.BaseScripts.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/AjaxCT/AjaxControlToolkit.Common.Common.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/AjaxCT/AjaxControlToolkit.RoundedCorners.RoundedCornersBehavior.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum10"&gt;  10:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/AjaxCT/AjaxControlToolkit.Compat.Timer.Timer.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum11"&gt;  11:&lt;/span&gt; &amp;lt;script src=&lt;span style="color: #006080"&gt;"Scripts/AjaxCT/AjaxControlToolkit.DropShadow.DropShadowBehavior.js"&lt;/span&gt; type=&lt;span style="color: #006080"&gt;"text/javascript"&lt;/span&gt;&amp;gt;&amp;lt;/script&amp;gt;&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;Here’s how we can then make every div with a “box” class to have a drop shadow:&lt;/p&gt;

&lt;div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: 'Courier New', courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper"&gt;
  &lt;div style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"&gt;
    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum1"&gt;   1:&lt;/span&gt; $().ready(&lt;span style="color: #0000ff"&gt;function&lt;/span&gt;() {&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum2"&gt;   2:&lt;/span&gt;     $(&lt;span style="color: #006080"&gt;".box"&lt;/span&gt;).create(AjaxControlToolkit.DropShadowBehavior,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum3"&gt;   3:&lt;/span&gt;             { &lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum4"&gt;   4:&lt;/span&gt;                 Opacity: 0.3,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum5"&gt;   5:&lt;/span&gt;                 Rounded: &lt;span style="color: #0000ff"&gt;false&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum6"&gt;   6:&lt;/span&gt;                 TrackPosition: &lt;span style="color: #0000ff"&gt;true&lt;/span&gt;,&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum7"&gt;   7:&lt;/span&gt;                 Width: 5&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum8"&gt;   8:&lt;/span&gt;             });&lt;/pre&gt;
&lt;!--CRLF--&gt;

    &lt;pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: white; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: 'Courier New', courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px"&gt;&lt;span style="color: #606060" id="lnum9"&gt;   9:&lt;/span&gt; });&lt;/pre&gt;
&lt;!--CRLF--&gt;&lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;See that JSON string (lines 3-8). If you look at those settings closely and compare them to the Ajax Control Toolbox documentation web site, you’ll see that these are the same settings that the extender uses which should make everything easy.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2806.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Tampa ux&amp;hellip; Meeting tomorrow night (Wed. June 10th, 2009).. 7:30pm</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/06/09/tampa-uxhellip-meeting-tomorrow-night-wed.-june-10th-2009.-730pm.aspx</link><pubDate>Tue, 09 Jun 2009 07:20:10 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/06/09/tampa-uxhellip-meeting-tomorrow-night-wed.-june-10th-2009.-730pm.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2805.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2805.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/06/09/tampa-uxhellip-meeting-tomorrow-night-wed.-june-10th-2009.-730pm.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2805.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Tampa ux&amp;hellip; Meeting tomorrow night (Wed. June 10th, 2009).. 7:30pm</source><description>&lt;p&gt;We are meeting at Buffalo Wild Wings across the street from our normal location tomorrow night. If you have had any complaints or suggestions about how we run Tampa UX, you need to be there. It’s an important meeting. We have some ideas that we want to run by you guys and see what you guys think.. We can’t do this without you!&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2805.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>The Coding4Fun Show – Ep 1 with Andy Beaulieu</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/06/08/the-coding4fun-show--ep-1-with-andy-beaulieu.aspx</link><pubDate>Mon, 08 Jun 2009 20:22:56 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/06/08/the-coding4fun-show--ep-1-with-andy-beaulieu.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2804.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2804.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/06/08/the-coding4fun-show--ep-1-with-andy-beaulieu.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2804.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">The Coding4Fun Show – Ep 1 with Andy Beaulieu</source><description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="logo" border="0" alt="logo" align="right" src="http://www.brianpeek.com/blogimages/TheCoding4FunShowEp1withAndyBeaulieu_13943/logo.png" width="98" height="114" /&gt; The very first episode of my new &lt;a href="http://channel9.msdn.com/shows/Coding4FunTV/"&gt;Coding4Fun Show&lt;/a&gt; is now up on &lt;a href="http://channel9.msdn.com/"&gt;Channel 9&lt;/a&gt;.  This is a show I plan on doing monthly, interviewing developers creating fun and interesting projects, and showcasing what they’re doing.&lt;/p&gt;  &lt;p&gt;In this first episode, I interview &lt;a href="http://www.andybeaulieu.com/"&gt;Andy Beaulieu&lt;/a&gt; and we discuss his &lt;a href="http://physicshelper.codeplex.com/"&gt;Physics Helper for Silverlight, Blend, and Farseer&lt;/a&gt;.  You’ll learn a bit about how he made the library, and how you can use it in your own applications for some pretty cool effects.  You should see the video below if you have &lt;a href="http://www.silverlight.net/"&gt;Silverlight&lt;/a&gt; installed, otherwise head over to the &lt;a href="http://channel9.msdn.com/shows/Coding4FunTV/The-Coding4Fun-Show-Physics-Helper-for-Silverlight-by-Andy-Beaulieu/"&gt;episode on Channel 9&lt;/a&gt; to watch and download in a variety of formats for offline viewing.&lt;/p&gt; &lt;object data="data:application/x-silverlight-2," type="application/x-silverlight-2" width="320" height="240"&gt; &lt;param name="source" value="http://channel9.msdn.com/App_Themes/default/vp09_04_23.xap" /&gt; &lt;param name="initParams" value="m=http://mschnlnine.vo.llnwd.net/d1/ch9/1/9/5/2/7/4/C4FShowE1Beaulieu_2MB_ch9.wmv,autostart=false,autohide=true,showembed=true, thumbnail=http://mschnlnine.vo.llnwd.net/d1/ch9/1/9/5/2/7/4/C4FShowE1Beaulieu_large_ch9.png, postid=472591" /&gt; &lt;param name="background" value="#00FFFFFF" /&gt; &lt;a href="http://go.microsoft.com/fwlink/?LinkID=124807" style="text-decoration: none;"&gt; &lt;img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none" /&gt; &lt;/a&gt; &lt;/object&gt;  &lt;br /&gt;&lt;a href="http://channel9.msdn.com/shows/Coding4FunTV/The-Coding4Fun-Show-Physics-Helper-for-Silverlight-by-Andy-Beaulieu/" target="_blank"&gt;The Coding4Fun Show: Physics Helper for Silverlight by Andy Beaulieu&lt;/a&gt;   &lt;p&gt;Have a look and let me know what you think.  It’s my first time trying this out, so I’d love to hear your feedback.  Thanks!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2804.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>clientscript as the view controller</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/06/01/clientscript-as-the-view-controller.aspx</link><pubDate>Mon, 01 Jun 2009 12:34:29 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/06/01/clientscript-as-the-view-controller.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2803.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2803.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/06/01/clientscript-as-the-view-controller.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2803.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">clientscript as the view controller</source><description>&lt;p&gt;I’m finalizing my demos for next week’s talk at the &lt;a href="http://www.tampadev.org/"&gt;Tampa ASP.NET MVC user group&lt;/a&gt;. I’m also in the midst of a deploy to our test servers of among other things a page that is an experimental architecture for me and my team. I was talking with my boss (Perry for those of you who attend Tampa UX). He had to do a little touch up on my quickly thrown together UI. He told me after playing with it that he really liked how it performs and even how it works. He thinks it’s a pretty good UX.&lt;/p&gt;  &lt;p&gt;It’s actually very similar to DT Mini Mint (the app I’ll show at &lt;a href="http://www.tampadev.org/"&gt;Tampa ASP.NET MVC user group&lt;/a&gt; next week). &lt;/p&gt;  &lt;p&gt;The idea behind it is that the initial page is pushed out by the server and then additional data is retrieved on the fly via services (or JSON views in MVC) using JavaScript; additional functions like updates, deletes, adds, and more complex operations use the same mechanism.. so the page never refreshes once it has been rendered the first time (no, I’m not using any kind of partial view in any of my examples.. not that I couldn’t, but I don’t have that much to render in either app). &lt;/p&gt;  &lt;p&gt;I jokingly referred to “Jay’s Dream Architecture” on Twitter, but was never really able to fully quantify what I was talking about. I likened it to MVC where the model was the service, and the controller was the JavaScript code..&lt;/p&gt;  &lt;p&gt;After &lt;a href="http://devlicious.com/blogs/christopher_bennage/default.aspx"&gt;Christopher Bennage&lt;/a&gt; came to Tampa UX last month, we came up with a term (that I’m sure already existed): JavaScript View Controller (or JC). I loved annoying Christopher by saying I was going to attribute the MVCJC pattern to him (it seems he really loves the over use of letters in Pattern names &amp;lt;smile /&amp;gt;). So remember he came up with the name for this pattern…&lt;/p&gt;  &lt;p&gt;I’m finding more and more that I am building key pages (not all pages) that have everything they need to get started but then user interactions that would normally cause a Postback or a Ajax Postback (for an UpdatePanel), etc. I’m replacing with a client-side Ajax call to a service (for WebForms) or a client-side Ajax call to a controller action (for ASP.NET MVC). The end result is a fairly responsive UI that gives me options.&lt;/p&gt;  &lt;p&gt;Back to my discussion with my boss today.. One of the things we realized is that side effect of this is there is an occasion where I have in memory the all the data in memory for render a client side paged grid (we’re talking at most 1000 rows of data… more like no more than 700 rows.. probably much smaller than that). We realized with this architecture and the rows in memory we could easily let the user filter the results client-side via textbox that updates the grid after filtering by the value in the test box.. without any hops back to the server)..&lt;/p&gt;  &lt;p&gt;A similar thing for my ASP.NET MVC talk in 2 weeks is that I’m going to be replacing a standard select with an autocomplete text box that uses the original select’s options array as the source for the autocomplete suggestions text (you’ll be able to type something new and that new item will be dynamically added to the DB on save). The idea is that the client browser has pieces of data already and doesn’t need to retrieve it. There are also Jquery cache plugins that can help with this (something I won’t be showing)..&lt;/p&gt;  &lt;p&gt;Bottom line is that the client is a for real place where we can write code and make the user’s experience better (I know I’ve not been one to totally go gaga in this arena in the past, but I’m starting to warm to it.. I think Jquery is the big reason why, too.. it’s very mature and really makes it easy to write complex interactions without writing tons of code..)&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2803.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Facebook .NET Programmers Group Session on XNA 3.0</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/05/29/facebook-.net-programmers-group-session-on-xna-3.0.aspx</link><pubDate>Fri, 29 May 2009 03:46:22 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/05/29/facebook-.net-programmers-group-session-on-xna-3.0.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2802.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2802.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/05/29/facebook-.net-programmers-group-session-on-xna-3.0.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2802.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Facebook .NET Programmers Group Session on XNA 3.0</source><description>&lt;p&gt;&lt;img style="border-right-width: 0px; margin: 0px 0px 0px 10px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="image" border="0" alt="image" align="right" src="http://www.brianpeek.com/blogimages/Facebook.NETProgrammersGroupSessiononX.0_500B/image.png" width="121" height="62" /&gt; I will be giving a session on Tuesday, June 2nd at 6pm EST to the &lt;a href="http://www.facebook.com/home.php#/group.php?gid=2204912892"&gt;Facebook .NET Programmers group&lt;/a&gt; on XNA 3.0.  This is an online session and everyone is welcome to attend.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Topic&lt;/strong&gt;: Building a Video Game with XNA Game Studio 3.0     &lt;br /&gt;&lt;strong&gt;Abstract: &lt;/strong&gt;This session will demonstrate how to build a very simple 2D game (a Space Invaders clone) using XNA Game Studio 3.0. Attendees will learn how to effectively use the content pipeline, import 2D sprites into XNA, manage input from the keyboard, mouse, Xbox 360 controller and Zune, manage game state, and debug the resulting game. The sample code will be built on a PC and run on the PC, Xbox 360, and Zune platforms when complete.     &lt;br /&gt;&lt;strong&gt;Date: &lt;/strong&gt;June 2nd, 2009     &lt;br /&gt;&lt;strong&gt;Time:&lt;/strong&gt; 6PM Eastern | 10PM GMT/UTC - Get local event time in your city: &lt;a href="http://tinyurl.com/l9hq65"&gt;http://tinyurl.com/l9hq65&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;Add to Outlook&lt;/strong&gt;: &lt;a href="http://tinyurl.com/mpp5of"&gt;http://tinyurl.com/mpp5of&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;RSVP and Event Details:&lt;/strong&gt; &lt;a href="http://www.facebook.com/event.php?eid=49178981206"&gt;http://www.facebook.com/event.php?eid=49178981206&lt;/a&gt;     &lt;br /&gt;&lt;strong&gt;Live Meeting Link to join meeting:&lt;/strong&gt; &lt;a href="http://tinyurl.com/ago484"&gt;http://tinyurl.com/ago484&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;I’ll also be giving away a copy or two of our &lt;a href="http://www.amazon.com/dp/0596520743?tag=brianpcom-20&amp;amp;camp=213381&amp;amp;creative=390973&amp;amp;linkCode=as4&amp;amp;creativeASIN=0596520743&amp;amp;adid=0F8Y0560VYFSSH9NKQZZ&amp;amp;"&gt;Coding4Fun book&lt;/a&gt;.  Hope to “see” you all there!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2802.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Setting Focus to Control in an IFRAME using JQuery</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/28/setting-focus-to-control-in-an-iframe-using-jquery.aspx</link><pubDate>Thu, 28 May 2009 03:58:54 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/05/28/setting-focus-to-control-in-an-iframe-using-jquery.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2801.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2801.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/28/setting-focus-to-control-in-an-iframe-using-jquery.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2801.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Setting Focus to Control in an IFRAME using JQuery</source><description>Had a gnarly problem this afternoon, while trying to set focus to a control in an IFRAME.  &lt;br /&gt;
&lt;br /&gt;
Using JQuery, I had created the IFRAME with the JQuery plugin &lt;a href="http://jquery.com/demo/thickbox/"&gt;ThickBox&lt;/a&gt;. ThickBox provides functionality that can simulate a modal dialog using an IFRAME, loading a page from a URL into the IFRAME (&lt;a href="http://jquery.com/demo/thickbox/#examples"&gt;check out the demo here&lt;/a&gt; - scroll down to "Inline Content"). The page loaded inside the IFRAME contained code to set the focus which was actually being called, but &lt;strong&gt;after&lt;/strong&gt; the page loaded something else was stealing the focus.  &lt;br /&gt;
&lt;br /&gt;
I began to look at the javascript code in the parent that created the IFRAME.  &lt;br /&gt;
&lt;br /&gt;
&lt;a href="http://alexking.org/blog/2006/01/17/iframe-element-focus"&gt;I discovered to set the focus to a control in an IFRAME that has already been loaded, you need to set the focus to the IFRAME first (thanks Alex King).&lt;/a&gt; &lt;a href="http://simple.procoding.net/2008/03/21/how-to-access-iframe-in-jquery/"&gt;I also benefited from "How to access IFRAME in JQuery" over at ProCoding (thanks Taras Ilnytskyy).&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Here's the code to set focus to a control in an IFRAME using JQuery (called from the parent window, after the IFRAME has been loaded and shown):
&lt;pre class="javascript"&gt;	&lt;br /&gt;	//get the IFRAME element - note no hashes in the name, we're using browser functionality &lt;br /&gt;	var iframeRef = document.getElementById("IFRAMEID"); &lt;br /&gt;	//focus the IFRAME element &lt;br /&gt;	$(iframeRef).focus(); &lt;br /&gt;	//use JQuery to find the control in the IFRAME and set focus &lt;br /&gt;	$(iframeRef).contents().find("#CONTROLID").focus(); &lt;/pre&gt;
I hope this helps someone! &lt;br /&gt;
&lt;br /&gt;
&lt;span style="font-style: italic; font-weight: bold; color: rgb(255, 0, 0);"&gt;UPDATE: Fixed formatting.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/jquery"&gt;jquery&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/javascript"&gt;javascript&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/web"&gt;web&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/iframe"&gt;iframe&lt;/a&gt;&lt;/em&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2801.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>Firefox vs Flock</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/25/firefox-vs-flock.aspx</link><pubDate>Mon, 25 May 2009 07:54:26 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/05/25/firefox-vs-flock.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2799.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2799.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/25/firefox-vs-flock.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2799.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Firefox vs Flock</source><description>I've blogged &lt;a href="http://theruntime.com/blogs/thomasswilliams/archive/2007/11/25/flock-the-social-web-browser.aspx"&gt;previously&lt;/a&gt; about how I use the &lt;a href="http://flock.com/"&gt;Flock web  browser&lt;/a&gt;, but recently decided to try my luck at the latest release of &lt;a href="http://theruntime.com/blogs/thomasswilliams/archive/2009/05/14/5-firefox-add-ons-i-cant-live-without.aspx"&gt; Firefox&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Flock had several features that enticed me to adopt it in late 2007:  social media sidebar integrated with Facebook, blog post editor, in-built image  uploader which connected to Flickr and Picasa, media bar, and one-click access  to services I constantly used (like Delicious).&lt;br /&gt;&lt;br /&gt;My biggest gripe with  Flock was that the user interface was not customisable enough. Also, the browser had more features than I'd ever  need.&lt;br /&gt;&lt;br /&gt;Buying a widescreen  monitor with very limited vertical space was the straw that finally made me  switch from Flock to Firefox, permanently. Here's a comparison between the  two (the red highlights represent the menu &amp;amp; toolbar space used):&lt;br /&gt;&lt;img style="max-width: 800px;" src="http://lh3.ggpht.com/_Ln7LRKt4zEw/ShpY2BI8ZOI/AAAAAAAABM4/t4qtLGZ1taA/s800/firefox-vs-flock.jpg" /&gt;&lt;br /&gt;I use a couple of Firefox add-ons to reduce the vertical space  used (that's the other thing...Firefox has an unbelievable collection of add-ons):&lt;br /&gt;&lt;ul style="list-style-type: none;"&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/3895"&gt;Personal Menu&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1272"&gt;Status Buttons&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/5890"&gt;Tree Style Tabs&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Flock was good to me. Now, I just need the screen space, and don't need a lot of its features.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;Tags: &lt;a class="performancingtags" href="http://technorati.com/tag/flock" rel="tag"&gt;flock&lt;/a&gt;, &lt;a class="performancingtags" href="http://technorati.com/tag/browser" rel="tag"&gt;browser&lt;/a&gt;, &lt;a class="performancingtags" href="http://technorati.com/tag/firefox" rel="tag"&gt;firefox&lt;/a&gt;&lt;/em&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2799.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>IDENTITY vs. ROWGUID, Part II</title><link>http://theruntime.com/blogs/devprime/archive/2009/05/21/identity-vs.-rowguid-part-ii.aspx</link><pubDate>Thu, 21 May 2009 14:30:33 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2009/05/21/identity-vs.-rowguid-part-ii.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2797.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2797.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2009/05/21/identity-vs.-rowguid-part-ii.aspx#comment</comments><slash:comments>5</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2797.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">IDENTITY vs. ROWGUID, Part II</source><description>&lt;p&gt;So wow, this was the week of nonstop GUID ID discussion (in many different forms). Given that, I thought it'd be appropriate to expand on my &lt;a href="http://theruntime.com/blogs/devprime/archive/2009/05/19/identity-vs.-rowguid.aspx"&gt;last post&lt;/a&gt;. Surprisingly, the discussions have been angst and rant-free, which is a good thing. I've often wondered why professional engineers stoop to zealous and rancorous name-calling in dogmatic flames rather than objectively looking at all sides of an issue like the scientists we're supposed to be, so it's nice to engage in something that doesn't sound like jihad run amok. &lt;/p&gt;
&lt;p&gt;This brings us to a central point in the debate, which falls into that fulcrum point between KISS/YAGNI and purposeful programming. One of the arguments often leveled against RAD development or the so-called "Mort" programmers, is they thrash about until they find something, anything, that appears to work and go with it, never taking into account the harm the approach might entail; the idea being that developers ought to program with a sufficient understanding of the stakes, and code with intent and purpose, not out of incident. We then have to balance that notion against the concept of YAGNI, which means not to over-evaluate nor over-engineer a situation and go with the best yet simplest solution available. However, I'm finding that a lot of people hide behind YAGNI, and use it as a crude bludgeoning tool for bashing and ignoring what they can't comprehend – which is the wrong approach to take. With that in mind, I'd like to point out once more that the purpose of my posts here isn't to say "Thou shalt never use GUIDs as IDs", but rather that I'm presenting issues that are crucial in order to make informed decisions. More importantly, I'm presenting arguments for both sides and allowing you (the reader) to come to your own conclusions based on your particular scenario, which is far more objective and constructive than saying "always do this" or "never do that". &lt;/p&gt;
&lt;p&gt;One of the points I raised about using nonsequential GUIDs for keys is the index fragmentation. I soon realized that a lot of people didn't fully comprehend what this really meant, so this post is really a primer on index fragmentation and why you should or shouldn't care. &lt;/p&gt;
&lt;p&gt;First, if your tables are very small, this doesn't pose much of a problem, if any at all. In fact, if your tables are small enough (for example, 10 rows or less) an index can be completely ignored for queries, as the query optimizer can favor a table scan over an index scan, since with so few records, a table scan can reach a desirable record faster than (or on par with) going via index on average. &lt;/p&gt;
&lt;p&gt;Second, the problems you encounter with index fragmentation grow proportionally with table size and frequency of access. In other words, the more data there is, and the more concurrent reads/writes taking place, the more you will get noticeably slammed by index fragmentation. What this means is that to a certain degree, you can live with index fragmentation if you feel you absolutely have to, depending largely on the nature (size and use) of the table. Don't relegate this decision for later consideration! It's not a trivial matter to change the key and index structure of a table post production deployment. This could impact your entire architecture. &lt;/p&gt;
&lt;p&gt;Before showing you what's really at stake with index fragmentation, it's important to understand the indexes themselves. And I find that with most developers I talk to today, the understanding of databases is very limited because they see it as some abstract physical storage black box not unlike a relationally structured file system (I can hear the anguished screams of terror DBAs are giving off right now). &lt;/p&gt;
&lt;p&gt;First, SQL Server has two kinds of indexes: clustered and non-clustered. They are both implemented as B-Trees, meaning that you have a tree structure of nodes (for fast searching). In both cases, the indexed values are stored in order (from min to max, or alphabetically). The main difference between clustered and non-clustered indexes is that clustered indexes incorporate the actual storage of the data, whereas non-clustered indexes are separate lookups pointing to the data. OK, for a better idea of this notion, think of clustered indexes like a directory, encyclopedia, or phone book – the contents of the book itself are stored in order by a name or key. A non-clustered index is more like an index in a chemistry textbook: the index entries are in ordered, but it is separate from the content (found way in the back in some appendix), and each index entry points back to a specific fragment of actual content, which is in turn written out completely independent of the order of the index. Otherwise, both are pretty similar in terms of physical storage in the DB file. There are other nuances (such as whether or not unique keys are present), but those are somewhat inconsequential to this particular matter. &lt;/p&gt;
&lt;p&gt;SQL Server is designed around pages of data, each containing 8Kb. As long as data is contained within a single page, things are fast. But when SQL Server has to switch pages, you get a performance hit, particularly when said page isn't contained in the same block (extent) and/or isn't cached and physical IO has to occur. Just like everything else in the DB, your indexes are written on pages. Now let's say that (in a really simplified view) your index, containing simple integer IDs for this example, looks like this: &lt;/p&gt;
&lt;p&gt;&lt;img alt="original index" src="http://theruntime.com/blogs/images/theruntime_com/blogs/devprime/403/r_db_index_a.png" /&gt;&lt;/p&gt;
&lt;p&gt;Notice that each page is full and everything is sequential and contiguous. This is what a good index is supposed to look like. The index Value here is the ID itself. Now let's pretend I have to insert a row where the index value (the key in this case) is 6. This entry has to be written into a page that already has data, and worse, is already full. Now SQL Server has to do a page split and relocation – which is very expensive for a write. Your index would now look like this: &lt;/p&gt;
&lt;p&gt;&lt;img alt="original index" src="http://theruntime.com/blogs/images/theruntime_com/blogs/devprime/403/r_db_index_b.png" /&gt;&lt;/p&gt;
&lt;p&gt;Notice that for entry 6 to be inserted in order, the rest of that page had to be split off, and relocated to a new page – which also happens to be at the end, so the page itself is also out of order. This affects query performance in a number of ways because the pages aren't contiguous (the scan has to bounce around), and caching will be difficult depending on the spacing between the pages (which is why this problem grows worse as the table gets larger). For severely fragmented indexes, which is what happens with random/pseudo-random/hashed values (like non-sequential GUIDs), page switching on queries will be very noticeable. &lt;/p&gt;
&lt;p&gt;Also, notice that you now have partially-filled pages. Page 1 and Page 3 have holes with no data. This sharply increases the size of the data file for large, fragmented indexes. So in addition to GUIDs being physically larger values than the INT IDs, you get substantial data bloat with page fragmentation. &lt;/p&gt;
&lt;p&gt;You can avoid a lot of these problems simply by using sequential GUID keys (for example, by using the NEWSEQUENTIALID() function) if you don't care much for INT IDs. Though the size of the data will increase, obviously, storage is cheap and a lot of people simply won't care, although you still have to take performance into account. However, this isn't really possible when using client-side generated IDs, barring some complex infrastructure. &lt;/p&gt;
&lt;p&gt;So what makes me curious is why people want to use client-side generated IDs to begin with. This is genuine curiosity because it's possible the solution is solving problems that no longer exist or might be better served with a different solution. One of the reasons for client-generated unique IDs used to be that you couldn't always depend on the server to hand you the correct the identity value for parent-child relationships inserted in batch. For example, @@IDENTITY could hand you the wrong ID value since it grabbed the last ID produced by the session, which could have been the result of an insert trigger write to a different table, rather than the identity insert of the present command statement (as an example). However, there are more elegant ways around this today, particularly with the SCOPE_IDENTITY() function. Of course, that's all SQL Server specific, so YMMV depending on your particular scenario. &lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2797.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>IDENTITY vs. ROWGUID</title><link>http://theruntime.com/blogs/devprime/archive/2009/05/19/identity-vs.-rowguid.aspx</link><pubDate>Tue, 19 May 2009 09:38:43 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2009/05/19/identity-vs.-rowguid.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2796.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2796.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2009/05/19/identity-vs.-rowguid.aspx#comment</comments><slash:comments>10</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2796.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">IDENTITY vs. ROWGUID</source><description>&lt;p&gt;I had the pleasure of once again talking with Dan Simmons from MS at a TechEd mix session. He probably thinks I'm a pain in the butt with all my EF requests, but I do enjoy our conversations. Anyway, after the session, we were discussing data architectural decisions with some of the attendees when primary keys came up. At some point, the issue took a turn towards the old INT ID vs. GUID discussion. Ironically, I had the same discussion with someone else this week, so I figured it would make a good post.&lt;/p&gt;
&lt;p&gt;INT ID vs. GUID is one of those long-standing arguments that for whatever reason rival SProcs vs. No-SProcs in terms of passionate opposition. People either love GUIDs or hate them. But the fact of the matter is that a lot of people simply have a hard time understanding the details enough to make an informed decision.&lt;/p&gt;
&lt;p&gt;My first reaction is to say that GUID keys are there for a reason. That reason, as far as I can tell from back in the day was replication. In fact, on some of the tooling, you'll see uniqueidentifier identities referred to as replication identities. At this point, Dan quickly pointed out that GUIDs aren't guaranteed to be unique (at least across machines in this scenario), and that's a very good point to stress. In the old documentaion, you would see scenarios where people dumped data from disperate systems into a central BI database for analysis. The problem then becomes one of overlapping IDs. Enter GUID ID. But really, that only mitigates the problem to a certain degree since you still have to code for the occassional identifier collision.&lt;/p&gt;
&lt;p&gt;GUIDs as IDs have two main drawbacks:&lt;/p&gt;
&lt;p&gt;1) The size. They are four times the size of a normal INT. That may not seem like a lot for today's storage hardware, but on a table of 4 million rows, that's 12MB of difference. Multiply that by several tables and/or more rows, and you get the idea. Now, many tables may not get that big and you don't necessarily have to worry about it much.&lt;/p&gt;
&lt;p&gt;2) (another reminder that Dan brought up) GUIDs do not index well, particularly if you are talking about clustered indexes (the default for primary keys in SQL server tooling). In this scenario, because they aren't sequential, GUIDs tend to fragment the index horribly. This both wastes space and can make index updates and relocation computationally expensive. In 2005, SQL Server introduced a new function - NEWSEQUENTIALID() - to help alleviate this problem. However, most people don't use it, and you still have to contend with the size issue.&lt;/p&gt;
&lt;p&gt;I've seen people also argue that the set of operators for GUIDs are more limited than the set for INTs, but I don't think this argument carries a lot of weight. After all, you shouldn't be using arithematic operators on primary keys anyway. Comparison operators are perfectly valid for both though. However, if you don't have sequential IDs, then comparisons for ranking and sampling (for example, for paging) become a lot trickier.&lt;/p&gt;
&lt;p&gt;At the end of the day, there's nothing particularly evil about using GUIDs for identifiers. However, I think people need to fit the solution to a specific problem and carefully weigh the pros and cons. Personally, I'd go with INT identifiers natrually unless there was a compelling reason to use GUIDs. And expected data size isn't one of those reasons. If you need more than 4 billion records, you can always upgrade to BIGINT.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2796.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>Install the Surface SDK SP1 Workstation Edition on x64</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/05/14/install-the-surface-sdk-sp1-workstation-edition-on-x64.aspx</link><pubDate>Thu, 14 May 2009 04:28:50 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/05/14/install-the-surface-sdk-sp1-workstation-edition-on-x64.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2795.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2795.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/05/14/install-the-surface-sdk-sp1-workstation-edition-on-x64.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2795.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Install the Surface SDK SP1 Workstation Edition on x64</source><description>&lt;p&gt;&lt;a href="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/image_thumb.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 0px 0px 10px; display: inline; border-top: 0px; border-right: 0px" title="image_thumb" border="0" alt="image_thumb" align="right" src="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/image_thumb_thumb.png" width="205" height="91" /&gt;&lt;/a&gt;The Surface SDK &lt;strong&gt;SP1&lt;/strong&gt; Workstation Edition was released this week and while it will install (but is still unsupported) on Windows 7, it will not install on a 64-bit machine.  The installer has changed a bit, so &lt;a href="http://www.brianpeek.com/blog/archive/2009/03/10/install-the-surface-sdk-on-windows-7-and-or-x64.aspx" target="_blank"&gt;my previous instructions&lt;/a&gt; will not work with this installer, but I have managed to get the new package to install and run.  And here’s how…&lt;/p&gt;  &lt;p&gt;As before, this is a totally unsupported setup, so if official support from Microsoft is required, this is not for you.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Please note&lt;/strong&gt; that you will still need to meet the other hardware and software requirements of the SDK.&lt;/p&gt;  &lt;p&gt;To perform the actions in this guide you will need to install &lt;a href="http://msdn.microsoft.com/en-us/library/aa370557%28VS.85%29.aspx"&gt;Orca&lt;/a&gt;, a tool for editing MSI files, included with the Windows SDK.  Unfortunately, this utility isn’t available separately and will require you to download the full SDK to get it.  You can download the &lt;a href="http://msdn.microsoft.com/en-us/windows/bb980924.aspx"&gt;Windows Vista or Windows 7 SDK here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;1) Extract the MSI to its individual files&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This can be done with the following command performed in an elevated cmd window:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;msiexec /a SurfaceSDKWE.msi /qb TARGETDIR=c:\surface&lt;/strong&gt; (or some other TARGETDIR of your choosing)&lt;/p&gt;  &lt;p&gt;When complete, you will have a new directory at TARGETDIR filled with a smaller MSI and all the files contained within the original MSI.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;2) Remove the platform check from the MSI&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Open the newly extracted &lt;strong&gt;SurfaceSDKWE.msi&lt;/strong&gt; file in Orca.  Select &lt;strong&gt;LaunchCondition&lt;/strong&gt; from the left pane.  In the right pane, select the row labeled &lt;strong&gt;Installed OR NOT VersionNT64&lt;/strong&gt;, right-click, and select &lt;strong&gt;Drop Row&lt;/strong&gt;.  This will remove the check for a 64-bit OS.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/514200955227AM_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="5-14-2009 5-52-27 AM" border="0" alt="5-14-2009 5-52-27 AM" src="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/514200955227AM_thumb_3.png" width="589" height="400" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;After the rows are dropped, save the MSI using the standard &lt;strong&gt;File –&amp;gt; Save&lt;/strong&gt; menu option.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;3) Patch the setupcustomaction.exe file&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;This executable is called during the SDK installation process.  Because the installer will launch as a 64-bit application, so will this executable, which will force it to write some registry values into the wrong location.  Therefore we have to patch this file using the &lt;strong&gt;corflags.exe&lt;/strong&gt; utility included in Visual Studio and the .NET SDK.  &lt;/p&gt;  &lt;p&gt;If you have the full Visual Studio installed, simply open an &lt;strong&gt;&lt;em&gt;elevated&lt;/em&gt;&lt;/strong&gt; &lt;strong&gt;Visual Studio Command Prompt&lt;/strong&gt; from the Start Menu and the path to &lt;strong&gt;corflags.exe&lt;/strong&gt; will automatically be loaded.  Otherwise, you should find this in the &lt;em&gt;C:\Program Files\Microsoft SDKs\Windows\v6.1\Bin&lt;/em&gt; directory and you can set your PATH environment variable appropriately.&lt;/p&gt;  &lt;p&gt;With the path to &lt;strong&gt;corflags.exe&lt;/strong&gt; in your PATH environment variable, change to the following directory:&lt;/p&gt;  &lt;p&gt;&lt;em&gt;&amp;lt;TARGETDIR from above&amp;gt;\Microsoft Surface\v1.0&lt;/em&gt;&lt;/p&gt;  &lt;p&gt;Inside this directory, run the following command:&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;corflags setupcustomaction.exe /32bit+ /force&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;You will get a warning that the file is strong named signed.  You can safely ignore this.&lt;/p&gt;  &lt;p&gt;&lt;a href="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/AdministratorVisualStudio2008CommandPrompt2_3.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Administrator Visual Studio 2008 Command Prompt (2)" border="0" alt="Administrator Visual Studio 2008 Command Prompt (2)" src="http://www.brianpeek.com/blogimages/InstalltheSurfaceSDKSP1WorkstationEditio_4BC4/AdministratorVisualStudio2008CommandPrompt2_thumb_3.png" width="640" height="161" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;4) Install the SDK&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;Now that the MSI and setupcustomaction.exe have been patched, run the extracted and patched &lt;strong&gt;SurfaceSDKWE.msi&lt;/strong&gt; file from the TARGETDIR location, not the original MSI file.  As long as you have the other prerequisites installed, the SDK will install without issue.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;5) Patch the executables / Build and fix the samples&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;These steps are identical to last time, so I will just link to the original blog post &lt;a href="http://www.brianpeek.com/blog/archive/2009/03/10/install-the-surface-sdk-on-windows-7-and-or-x64.aspx#patch"&gt;here&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;And there we have it.  A patched and working Surface SDK SP1 running under Vista/Windows 7 x64.  As always, run this at your own risk, but let me know how it works out for you if you give it a try.&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2795.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>5 Firefox Add-Ons I Can't Live Without</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/14/5-firefox-add-ons-i-cant-live-without.aspx</link><pubDate>Thu, 14 May 2009 01:31:11 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/05/14/5-firefox-add-ons-i-cant-live-without.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2794.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2794.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/05/14/5-firefox-add-ons-i-cant-live-without.aspx#comment</comments><slash:comments>4</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2794.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">5 Firefox Add-Ons I Can't Live Without</source><description>&lt;p&gt;Inspired by &lt;a href="http://www.ghacks.net/2009/05/13/5-essential-firefox-extensions/"&gt;Martin over at gHacks&lt;/a&gt;, here's my list of Firefox browser add-ons that I consider essential:&lt;/p&gt;
&lt;ol style=""&gt;
    &lt;li style="padding-bottom: 10px;"&gt;&lt;img height="21" width="32" border="0" alt="" src="http://lh4.ggpht.com/_Ln7LRKt4zEw/SguAxgWOq-I/AAAAAAAABK4/knmDMckisXA/s800/mouse-gestures-32x32.png" style="float: left; padding-right: 4px;" /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/39"&gt;Mouse Gestures Redox&lt;/a&gt;&lt;span style="display: block;"&gt;Navigate back and forward, close windows, and more with just the mouse. I turn on "mouse trails" to make it easier to see what I'm doing.&lt;/span&gt;&lt;/li&gt;
    &lt;li style="padding-bottom: 10px;"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/6639"&gt;Easy DragToGo&lt;/a&gt;&lt;span style="display: block;"&gt;Drag a link to open it in a new background or foreground tab.&lt;/span&gt;&lt;/li&gt;
    &lt;li style="padding-bottom: 10px;"&gt;&lt;img height="32" width="32" border="0" alt="" src="http://lh6.ggpht.com/_Ln7LRKt4zEw/SguAxeudaSI/AAAAAAAABKw/rk9w-z2HH-U/s800/adblock-plus-32x32.png" style="float: left; padding-right: 4px;" /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1865"&gt;Adblock Plus&lt;/a&gt;&lt;span style="display: block;"&gt;Blocks ads, and is very configurable. Having a little "block" link I can click next to images and flash is extremely handy.&lt;/span&gt;&lt;/li&gt;
    &lt;li style="padding-bottom: 10px;"&gt;&lt;img height="32" width="32" border="0" alt="" src="http://lh5.ggpht.com/_Ln7LRKt4zEw/SguAxeHw39I/AAAAAAAABK0/v1MmzQP29U4/s800/firebug-32x32.png" style="float: left; padding-right: 4px;" /&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/1843"&gt;Firebug&lt;/a&gt;&lt;span style="display: block;"&gt;Indispensable for web development, especially the ability to edit, "live", any part of a page. Also has some of its own add-ons available.&lt;/span&gt;&lt;/li&gt;
    &lt;li style="padding-bottom: 10px;"&gt;&lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8182"&gt;SingletonFox&lt;/a&gt;, &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/8004"&gt;ChromaTabs Plus&lt;/a&gt;&lt;span style="display: block;"&gt;OK, that's two items at number 5, but I couldn't decide which one was more useful - making sure only a single instance of Firefox is open, or slight tab coloring depending on the site to make for easy identification of tabs.&lt;/span&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;These are fairly stock-standard add-ons, particularly numbers 1-3 which I've been using in some form or another since 2002 and MyIE. In addition, they're all very unintrusive - between the 6 add-ons, only 1 toolbar button is added (I like to keep my toolbars, menus and status bar lean).&lt;/p&gt;
&lt;p&gt;Any browser add-ons that &lt;u&gt;you&lt;/u&gt; couldn't live without?&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/firefox"&gt;firefox&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/browser"&gt;browser&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/addon"&gt;addon&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2794.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>TUX: Wednesday May 13th, 2009 with Christopher Bennage</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/05/12/tux-wednesday-may-12th-2009-with-christopher-bennage.aspx</link><pubDate>Tue, 12 May 2009 07:50:03 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/05/12/tux-wednesday-may-12th-2009-with-christopher-bennage.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2793.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2793.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/05/12/tux-wednesday-may-12th-2009-with-christopher-bennage.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2793.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">TUX: Wednesday May 13th, 2009 with Christopher Bennage</source><description>&lt;p&gt;Just a quick reminder that at Tampa UX tomorrow night we’ll have Christopher Bennage presenting. Shawn Cady will also be continuing his What is UX series. Doors open at 6:30pm with the speaking starting at 7pm.&lt;/p&gt;  &lt;p&gt;Check out the &lt;a href="http://www.tampaux.org/meetings.html"&gt;web site for more detail&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2793.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>.NET’s Most Influential People in 2009</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/05/06/dotnets-most-influential-people-in-2009.aspx</link><pubDate>Wed, 06 May 2009 12:09:22 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/05/06/dotnets-most-influential-people-in-2009.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2792.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2792.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/05/06/dotnets-most-influential-people-in-2009.aspx#comment</comments><slash:comments>9</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2792.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">.NET’s Most Influential People in 2009</source><description>&lt;p&gt;[5/7/09 Small update to add a requested link]&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;My family subscribes to Time Magazine ©. This past week we received their annual 100  “The World’s Top Influential People” issue. One of the things I like is that there are always people in these lists that you never heard of. Some are kind of lame in my opinions and then there are those exceptions who you look at the article and say “cool!” The on thing I noticed was there weren’t any developers on the list…&lt;/p&gt;
&lt;p&gt;I have been thinking about who I would throw in a list of DotNet influentials. Now the catch is that I’m avoiding any of the very visible MS employees. So in other words no Phill Haack (he’d be on my big list though), no ScottGu, no Scott Hanselman, no Nikhil Kothari (although that one hurts), and no Brad Abrams… I’m also not putting folks like Jesse Liberty or Tim Heuer (again very painful… I met Jesse and he would definitely be in my top tier list..) Ok, so you get the picture.. .NET Influentials that aren’t known for the their MS contributions.. &lt;/p&gt;
&lt;p&gt;Here’s my 5 (I’m trying to pick less common guys for my list)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1) Miguel de Icaza &lt;/strong&gt;&lt;br /&gt;
If you know who ScottGu is and you don’t know Miguel then shame on you! Seriously! Miguel is the guy who heads the mono project at Novell (that would be .NET on Linux, Mac, Sun Solaris, etc…) He’s more than important and wicked smart. I sat next to him at Mix and I swear my IQ jumps 5 points just from being near him (and keeping my mouth shut).. &amp;lt;grin /&amp;gt; Again, seriously very smart guy who does stuff that validates your choices as a VB/C# developers. (I suspect that Miguel might have been a bit obvious, but I can’t not mention him.. too important.. if you see him at a conference you should know who he is on sight… and I know that is not something that is not always true)&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2) Bill Reiss, Chris Bennage, and Rob Eisenberg &lt;/strong&gt;&lt;br /&gt;
If you want Silverlight to succeed as a platform then IMO the next installation point is games.. I installed WIndows XP on my son’s (crappy) PC because he wanted to play games and SL doesn’t run on Windows 98 (his old OS).. People install runtimes to play games.. Bill, Chris, and Rob set up a web site for Silverlight Games (&lt;a href="http://www.silverlightarcade.com"&gt;silverlightarcade.com&lt;/a&gt;).. Bill is also the lead developer behind &lt;a href="http://silversprite.codeplex.com/"&gt;SilverSprite&lt;/a&gt; an XNA to Silverlight compatibility library for 2d XNA games.. (Rob and Chris are members of the team).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3) John Resig – JQuery Lead and JavaScript Guru&lt;/strong&gt;&lt;br /&gt;
You may think this is a bit of a cheat, since John isn’t a .NET developer, but trust me his contribution to Ajax/Web 2.0 is HUGE. If you code in this space I really don’t need to say much more than this. JQuery is a deceptively simple solution to the problem of developing fancy ClientScript solutions. It is LINQ for JavaScript/DOM Scripting.. &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;4) Rob Conery – the SubSonic guy&lt;/strong&gt;&lt;br /&gt;
Ok, I know Rob is a bit of a cheat, but I’m not really interested in his ASP.NET MVC Contributions. I’ve recently reconnected with the SubSonic3 project. And let me tell you, it’s going to be huge. I think it’s better than both Entity Framework and Linq To SQL.. RIGHT NOW. All those years at CodeBetter.com I heard the ALT.NET guys talking about using the Repository pattern and I thought dang another layer… what’s wrong with these guys.. they overcomplicate everything (being transparent here…) So SubSonic has that pattern basically built in, and IT ROCKS! I love it.. I get it.. SubSonic was the project that converted me to ORM (I am a classic Stored Proc lover), and now to the repository pattern. Those wanted to improve the general quality of software should look at Rob’s example.. he’s projects make it easy to do.. AND then there’s his ASP/NET MVC contributions (did you hear Hanselman in his Nerd Dinner takl at MIX09 refer to the repository as a “Rob Conery Repository.” Rob’s the guy who built the html helper (whether you like or hate them).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;5) Daniel Cazzulino – Moq and T4 Editor&lt;/strong&gt;&lt;br /&gt;
Ok, I’m not entirely sure of Daniel’s involvement on the last one. I know he is huge in the Moq space. I know that Moq is my mocking library of choice (although I have that license of TypeMock I need to play with some more… and, yes, I do test and I do mock/double/isolate/etc.) Daniel always seems to have his head around something new (several years ago I saw him demo a project that he wrote while XML was alive that did XML Schema Validation… he’s definitely a mover and a shaker)..&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Honorable mentions&lt;/strong&gt;&lt;br /&gt;
I had trouble picking that last one.. Here’s the list of others that I thought about for that last spot.. Rory Becker (&lt;a href="javascript:void(0);/*1241701865956*/"&gt;DxCore Community Plugins&lt;/a&gt; project.. I use CodeRush, so his work greatly affects me), Chad Myers (mainly for his work in the ALT.NET space and his ability to hold back his own zeal and be a really reasonable/truly evangelistic voice… he’s also involved with the BUFU MVC project), Billy Hollis (‘cause we like Billy around here at the runtime… ), Dave Hayden (of CodeBetter and numerous other fames), and Sean Chambers (whose blog and projects really do a good job of helping the recreational agilist).&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;The obvious ones not mentioned&lt;/strong&gt;&lt;br /&gt;
There are a couple obvious names that didn’t get mentioned mainly because I don’t use their projects or just because the individual aren’t any less known than the MS guys I mentioned at the top of the article. Names like Ayende, Roy Osherove, Karl Franklin, Richard Campbell, Dino Esposito, Juval Loewy, and Rocky Lhotka just to name a few..&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Did I miss anyone?&lt;/strong&gt;&lt;br /&gt;
This was my list. you got your own you want to contribute.. Fire up your blog software and create a reply to this post on your blog.. we’ll compile a big list later on.. make sure there is a link back… if we get enough responses I’ll create a new post with links back to everyone’s blog (if someone with more readers than me posts then we’ll post the follow up on their blog)&lt;/p&gt;
&lt;p&gt;So who do you think are the top 5 .NET Influencers for you, personally..&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2792.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Drools on Windows (Part 3 of 22) - Object Interop</title><link>http://theruntime.com/blogs/danastevens/archive/2009/05/05/drools-on-windows-part-3-of-22---object-interop.aspx</link><pubDate>Tue, 05 May 2009 17:13:13 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/danastevens/archive/2009/05/05/drools-on-windows-part-3-of-22---object-interop.aspx</guid><wfw:comment>http://theruntime.com/blogs/danastevens/comments/2789.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/danastevens/comments/commentRss/2789.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/danastevens/archive/2009/05/05/drools-on-windows-part-3-of-22---object-interop.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://theruntime.com/blogs/danastevens/services/trackbacks/2789.aspx</trackback:ping><source url="http://theruntime.com/blogs/danastevens/rss.aspx">Drools on Windows (Part 3 of 22) - Object Interop</source><description>&lt;p&gt;In order to use the (amazingly cool) Drools rules engine in a .NET world, you've got to figure out how to pass your .NET business object over there to the land of Java.  There are a couple of ways to do this.  I wanted a straightforward way that didn't rely on any 3rd party tools.  Here's the gist of what we're trying to accomplish:&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;Instantiate a .NET object; populate with values.&lt;/li&gt;
    &lt;li&gt;Serialize the object and send it to a queue.&lt;/li&gt;
    &lt;li&gt;Java application monitors the queue; picks up the message text.&lt;/li&gt;
    &lt;li&gt;Java app unmarshals (i.e. deserializes) the text into a Java object.&lt;/li&gt;
    &lt;li&gt;Java app fires the rules, previously loaded, which may or may not modify the Java object's properties.&lt;/li&gt;
    &lt;li&gt;Java app marshals (i.e. serializes) the resulting object, and sends it to a queue.&lt;/li&gt;
    &lt;li&gt;.NET queue monitor picks up the message, deserializes it into a .NET object.&lt;/li&gt;
    &lt;li&gt;Excellent!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;To achieve this type of scenario just takes a bit of setup with the objects you intend to pass back and forth.  Here's one way how to do that setup.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;A.  Create your .NET object.&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Create a class library in .NET.  Here's an example of something we can tinker with for the duration of this blog series.  Compile it into a dll.&lt;/p&gt;
&lt;style type="text/css"&gt;&lt;![CDATA[





.csharpcode, .csharpcode pre
{
	font-size: small;
	color: black;
	font-family: Consolas, "Courier New", Courier, Monospace;
	background-color: #ffffff;
	/*white-space: pre;*/
}

.csharpcode pre { margin: 0em; }

.csharpcode .rem { color: #008000; }

.csharpcode .kwrd { color: #0000ff; }

.csharpcode .str { color: #006080; }

.csharpcode .op { color: #0000c0; }

.csharpcode .preproc { color: #cc6633; }

.csharpcode .asp { background-color: #ffff00; }

.csharpcode .html { color: #800000; }

.csharpcode .attr { color: #ff0000; }

.csharpcode .alt 
{
	background-color: #f4f4f4;
	width: 800px;
	margin: 0em;
}

.csharpcode .lnum { color: #606060; }]]&gt;&lt;/style&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Collections.Generic;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Linq;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Text;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Xml.Serialization;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;&lt;span class="kwrd"&gt;namespace&lt;/span&gt; ZenDoodle.Common.Messaging.Models&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;{&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;    [XmlRoot(Namespace = &lt;span class="str"&gt;"http://zendoodle.com/messaging/XML-Schema/2009"&lt;/span&gt;,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;             ElementName = &lt;span class="str"&gt;"Customer"&lt;/span&gt;)]&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Customer&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;    {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Name { get; set; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Address { get; set; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; City { get; set; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; State { get; set; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; PostalCode { get; set; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; CustomerType TypeOfCustomer { get; set; }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; List&amp;lt;&lt;span class="kwrd"&gt;string&lt;/span&gt;&amp;gt; Messages { get; set; }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt; &lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;        &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; CustomerType&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;        {&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;            Bronze,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;            Silver,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;            Gold,&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;            Platinum,&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;            Adamantium&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;        }&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;    }&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  30:  &lt;/span&gt;}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;u&gt;&lt;strong&gt;B.  Get your Xsd on.&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;
&lt;p&gt;Use the &lt;a target="_blank" href="http://msdn.microsoft.com/en-us/library/x6c1kb0s.aspx"&gt;Microsoft-provided xsd.exe utility&lt;/a&gt; to create your Xsd file. Or hey, roll your own if that's your thing. Whatever.&lt;/p&gt;
&lt;p&gt;Sample command:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bin\x64\xsd.exe" C:\Zen\Zendoodle.dll /o:C:\Zen\Schemas&lt;/font&gt;&lt;/p&gt;
&lt;div class="csharpcode"&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   1:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;?&lt;/span&gt;&lt;span class="html"&gt;xml&lt;/span&gt; &lt;span class="attr"&gt;version&lt;/span&gt;&lt;span class="kwrd"&gt;="1.0"&lt;/span&gt; &lt;span class="attr"&gt;encoding&lt;/span&gt;&lt;span class="kwrd"&gt;="utf-8"&lt;/span&gt;?&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   2:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:schema&lt;/span&gt; &lt;span class="attr"&gt;xmlns:tns&lt;/span&gt;&lt;span class="kwrd"&gt;="http://zendoodle.com/messaging/XML-Schema/2009"&lt;/span&gt; &lt;span class="attr"&gt;elementFormDefault&lt;/span&gt;&lt;span class="kwrd"&gt;="qualified"&lt;/span&gt; &lt;/pre&gt;
&lt;pre&gt;&lt;span class="attr"&gt;targetNamespace&lt;/span&gt;&lt;span class="kwrd"&gt;="http://zendoodle.com/messaging/XML-Schema/2009"&lt;/span&gt; &lt;span class="attr"&gt;xmlns:xs&lt;/span&gt;&lt;span class="kwrd"&gt;="http://www.w3.org/2001/XMLSchema"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   3:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Customer"&lt;/span&gt; &lt;span class="attr"&gt;nillable&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="tns:Customer"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   4:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:complexType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Customer"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   5:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:sequence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   6:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Name"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   7:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Address"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;   8:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="City"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;   9:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="State"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  10:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="PostalCode"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  11:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="TypeOfCustomer"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="tns:CustomerType"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  12:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="1"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="Messages"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="tns:ArrayOfString"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  13:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:sequence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  14:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:complexType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  15:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:simpleType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="CustomerType"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  16:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:restriction&lt;/span&gt; &lt;span class="attr"&gt;base&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  17:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Bronze"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  18:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Silver"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  19:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Gold"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  20:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Platinum"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  21:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:enumeration&lt;/span&gt; &lt;span class="attr"&gt;value&lt;/span&gt;&lt;span class="kwrd"&gt;="Adamantium"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  22:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:restriction&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  23:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:simpleType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  24:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:complexType&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="ArrayOfString"&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  25:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:sequence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  26:  &lt;/span&gt;      &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;xs:element&lt;/span&gt; &lt;span class="attr"&gt;minOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="0"&lt;/span&gt; &lt;span class="attr"&gt;maxOccurs&lt;/span&gt;&lt;span class="kwrd"&gt;="unbounded"&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="string"&lt;/span&gt; &lt;span class="attr"&gt;nillable&lt;/span&gt;&lt;span class="kwrd"&gt;="true"&lt;/span&gt; &lt;span class="attr"&gt;type&lt;/span&gt;&lt;span class="kwrd"&gt;="xs:string"&lt;/span&gt; &lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  27:  &lt;/span&gt;    &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:sequence&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre&gt;&lt;span class="lnum"&gt;  28:  &lt;/span&gt;  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:complexType&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre class="alt"&gt;&lt;span class="lnum"&gt;  29:  &lt;/span&gt;&lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;xs:schema&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;C.  From Xsd to .java - Into the Breach!&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The Java utility for working with schemas is xjc.exe.  Actually, as with all things Java, there are at least 835,234 different ways of doing this.  This is just how I do it.  YMMV.&lt;/p&gt;
&lt;p&gt;Sample command:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;"C:\Program Files (x86)\Java\jdk1.6.0_12\bin\xjc.exe" -verbose C:\Zen\Schemas\schema0.xsd -p com.zendoodle.customer&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;This will generate .java source code classes.  Which is great, &lt;strong&gt;&lt;font size="3"&gt;but you must make one modification!&lt;/font&gt;&lt;/strong&gt; And that is to identify the XmlRootElement by name.  I've highlighted the two lines of code that you have to add below in &lt;strong&gt;&lt;font color="#ff0000"&gt;bold red&lt;/font&gt;&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;font face=""&gt;//&lt;br /&gt;
// This file was generated by the JavaTM Architecture for XML Binding(JAXB) Reference Implementation, vJAXB 2.1.3 in JDK 1.6 &lt;br /&gt;
// See &amp;lt;a href="http://java.sun.com/xml/jaxb"&amp;gt;http://java.sun.com/xml/jaxb&amp;lt;/a&amp;gt; &lt;br /&gt;
// Any modifications to this file will be lost upon recompilation of the source schema. &lt;br /&gt;
// Generated on: 2009.05.04 at 08:59:01 PM EDT &lt;br /&gt;
//&lt;/font&gt;&lt;/p&gt;
&lt;font face=""&gt;
&lt;p&gt;&lt;br /&gt;
package com.zendoodle.customer;&lt;/p&gt;
&lt;p&gt;import javax.xml.bind.annotation.XmlAccessType;&lt;br /&gt;
import javax.xml.bind.annotation.XmlAccessorType;&lt;br /&gt;
import javax.xml.bind.annotation.XmlElement;&lt;br /&gt;
import javax.xml.bind.annotation.XmlType;&lt;br /&gt;
&lt;font color="#ff0000"&gt;&lt;strong&gt;import javax.xml.bind.annotation.XmlRootElement;&lt;/strong&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;/**&lt;br /&gt;
 * &amp;lt;p&amp;gt;Java class for Customer complex type.&lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;p&amp;gt;The following schema fragment specifies the expected content contained within this class.&lt;br /&gt;
 * &lt;br /&gt;
 * &amp;lt;pre&amp;gt;&lt;br /&gt;
 * &amp;amp;lt;complexType name="Customer"&amp;gt;&lt;br /&gt;
 *   &amp;amp;lt;complexContent&amp;gt;&lt;br /&gt;
 *     &amp;amp;lt;restriction base="{http://www.w3.org/2001/XMLSchema}anyType"&amp;gt;&lt;br /&gt;
 *       &amp;amp;lt;sequence&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="Name" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="Address" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="City" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="State" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="PostalCode" type="{http://www.w3.org/2001/XMLSchema}string" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="TypeOfCustomer" type="{http://zendoodle.com/messaging/XML-Schema/2009}CustomerType"/&amp;gt;&lt;br /&gt;
 *         &amp;amp;lt;element name="Messages" type="{http://zendoodle.com/messaging/XML-Schema/2009}ArrayOfString" minOccurs="0"/&amp;gt;&lt;br /&gt;
 *       &amp;amp;lt;/sequence&amp;gt;&lt;br /&gt;
 *     &amp;amp;lt;/restriction&amp;gt;&lt;br /&gt;
 *   &amp;amp;lt;/complexContent&amp;gt;&lt;br /&gt;
 * &amp;amp;lt;/complexType&amp;gt;&lt;br /&gt;
 * &amp;lt;/pre&amp;gt;&lt;br /&gt;
 * &lt;br /&gt;
 * &lt;br /&gt;
 */&lt;br /&gt;
&lt;strong&gt;&lt;font color="#ff0000"&gt;@XmlRootElement(name="Customer")&lt;br /&gt;
&lt;/font&gt;&lt;/strong&gt;@XmlAccessorType(XmlAccessType.FIELD)&lt;br /&gt;
@XmlType(name = "Customer", propOrder = {&lt;br /&gt;
    "name",&lt;br /&gt;
    "address",&lt;br /&gt;
    "city",&lt;br /&gt;
    "state",&lt;br /&gt;
    "postalCode",&lt;br /&gt;
    "typeOfCustomer",&lt;br /&gt;
    "messages"&lt;br /&gt;
})&lt;br /&gt;
public class Customer {&lt;/p&gt;
&lt;p&gt;    @XmlElement(name = "Name")&lt;br /&gt;
    protected String name;&lt;br /&gt;
    @XmlElement(name = "Address")&lt;br /&gt;
    protected String address;&lt;br /&gt;
    @XmlElement(name = "City")&lt;br /&gt;
    protected String city;&lt;br /&gt;
    @XmlElement(name = "State")&lt;br /&gt;
    protected String state;&lt;br /&gt;
    @XmlElement(name = "PostalCode")&lt;br /&gt;
    protected String postalCode;&lt;br /&gt;
    @XmlElement(name = "TypeOfCustomer", required = true)&lt;br /&gt;
    protected CustomerType typeOfCustomer;&lt;br /&gt;
    @XmlElement(name = "Messages")&lt;br /&gt;
    protected ArrayOfString messages;&lt;/p&gt;
&lt;p&gt;    /**&lt;br /&gt;
     * Gets the value of the name property.&lt;br /&gt;
     * &lt;br /&gt;
     * @return&lt;br /&gt;
     *     possible object is&lt;br /&gt;
     *     {@link String }&lt;br /&gt;
     *     &lt;br /&gt;
     */&lt;br /&gt;
    public String getName() {&lt;br /&gt;
        return name;&lt;br /&gt;
    }&lt;/p&gt;
&lt;p&gt;    /**&lt;br /&gt;
     * Sets the value of the name property.&lt;br /&gt;
     * &lt;br /&gt;
     * @param value&lt;br /&gt;
     *     allowed object is&lt;br /&gt;
     *     {@link String }&lt;br /&gt;
     *     &lt;br /&gt;
     */&lt;br /&gt;
    public void setName(String value) {&lt;br /&gt;
        this.name = value;&lt;br /&gt;
    }&lt;br /&gt;
&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;u&gt;D.  Compile/JAR.&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Last thing you have to do for the setup is to compile the .java classes into .class files, and then pack them into a .jar file.  This is so that your set of .class files can be easily referenced.  Include the .jar file in the Build Path of the Java application.&lt;/p&gt;
&lt;p&gt;Sample command:&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;"C:\Program Files (x86)\Java\jdk1.6.0_12\bin\javac.exe" com\zendoodle\customer\*.java&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;"C:\Program Files (x86)\Java\jdk1.6.0_12\bin\jar.exe" cfv customer.jar com\zendoodle\customer\*.class&lt;/font&gt;&lt;/p&gt;
&lt;p&gt;&lt;font face="Courier New"&gt;Pause&lt;/font&gt;&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; After that, you should be able to move objects with their data back and forth between .NET and Java.  And for crying out oud, if you're ever going to do this more than once, automate it!  &lt;/p&gt;
&lt;p&gt;Next time we'll take a look at the queue, and how all the pieces will fit together.  If you love weird and nifty stuff, see you then!&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;/font&gt;&lt;img src="http://theruntime.com/blogs/danastevens/aggbug/2789.aspx" width="1" height="1" /&gt;</description><dc:creator>Dana Stevens</dc:creator></item><item><title>Windows Virtual PC and the Microsoft Device Emulator</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/05/02/windows-virtual-pc-and-the-microsoft-device-emulator.aspx</link><pubDate>Sat, 02 May 2009 01:39:58 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/05/02/windows-virtual-pc-and-the-microsoft-device-emulator.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2788.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2788.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/05/02/windows-virtual-pc-and-the-microsoft-device-emulator.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2788.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">Windows Virtual PC and the Microsoft Device Emulator</source><description>&lt;p&gt;&lt;a href="http://www.microsoft.com/windows/windows-7/" target="_blank"&gt;Windows 7&lt;/a&gt; (as of RC1) now supports a pretty spiffy new feature known as &lt;i&gt;Virtual Windows XP&lt;/i&gt; or &lt;i&gt;Windows XP Mode&lt;/i&gt; based on what article you read.  At its core, it is a new version of the &lt;a href="http://www.microsoft.com/windows/virtual-pc/default.aspx" target="_blank"&gt;Virtual PC&lt;/a&gt; product, now named Windows Virtual PC, installed closer to the OS, combined with a Windows XP hard disk image which allow you to run legacy applications under Windows XP on your Windows 7 machine in a pretty seamless way.&lt;/p&gt;
&lt;p&gt;If you install the Windows Virtual PC add-on to Windows 7, you must first uninstall Virtual PC 2007.  By doing that, you remove the special network driver that is also required to use the Microsoft Device Emulator on the network.  The device emulator is typically used for Smart Device development.&lt;/p&gt;
&lt;p&gt;So the puzzle:  The Device Emulator doesn’t work with the new Windows Virtual PC driver, and you can’t install the old version of Virtual PC 2007 and expect the new Windows Virtual PC to keep working.  What to do?&lt;/p&gt;
&lt;p&gt;The answer is to extract the Virtual PC 2007 network service drivers out of the MSI package and manually install them in Windows 7.  So far this has provided the expected result for me:  Windows Virtual PC runs happily, and the Device Emulator now connects to the network.  So how do we do this?  Thanks for asking.  Here is a step-by-step guide to make this go.  Note that this is very much a “works on my machine” experience.  If it burns your house down, don’t hold me responsible.  Note that you should have a valid and complete backup before attempting this on your machine just in case…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Download the &lt;a href="http://www.microsoft.com/downloads/details.aspx?familyid=28C97D22-6EB8-4A09-A7F7-F6C7A1F000B5&amp;amp;displaylang=en" target="_blank"&gt;Virtual PC 2007 SP1&lt;/a&gt; installer executable &lt;/li&gt;
&lt;li&gt;Rename the installer from &lt;b&gt;setup.exe&lt;/b&gt; to something else, such as &lt;b&gt;vpc.exe&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;Open a &lt;b&gt;cmd&lt;/b&gt; prompt, navigate to the setup executable, and run (assuming you renamed the file to vpc.exe):       
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;vpc&lt;/b&gt;&lt;b&gt;.exe /c&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This will extract the executable to an MSI file at located in the &lt;b&gt;%temp%&lt;/b&gt; directory &lt;/li&gt;
&lt;li&gt;Change to the temp directory by running:      
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;cd %temp%&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;In this directory, extract the MSI by running:      
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;msiexec /a Virtual_PC_2007_Install.msi /qb TARGETDIR=c:\vpc&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;Of course, feel free to replace that directory with one of your choosing &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;This will extract the MSI file to &lt;b&gt;c:\vpc&lt;/b&gt; (or the one you entered) &lt;/li&gt;
&lt;li&gt;Open the &lt;b&gt;Network and Sharing Center&lt;/b&gt; and select &lt;b&gt;Change adapter settings&lt;/b&gt;       &lt;br /&gt;&lt;a href="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/adapter.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="adapter" alt="adapter" src="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/adapter_thumb.png" border="0" width="558" height="404" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Right-click the network adapter you have connected to the internet and select &lt;b&gt;Properties&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;Click the &lt;b&gt;Install…&lt;/b&gt; button       &lt;br /&gt;&lt;a href="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/install.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="install" alt="install" src="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/install_thumb.png" border="0" width="381" height="478" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Make sure &lt;b&gt;Service &lt;/b&gt;is selected and click &lt;b&gt;Add…&lt;/b&gt;       &lt;br /&gt;&lt;a href="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/type.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="type" alt="type" src="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/type_thumb.png" border="0" width="320" height="291" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;Click &lt;b&gt;Have Disk…&lt;/b&gt;       &lt;br /&gt;&lt;a href="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/disk.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="disk" alt="disk" src="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/disk_thumb.png" border="0" width="455" height="339" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;li&gt;For x86 machines, navigate to:      
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;C:\vpc\Program Files\Microsoft Virtual PC\Utility\VMNetSrv\&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;For x64 machines, navigate to:      
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;C:\vpc\Program Files\Microsoft Virtual PC\Utility\VMNetSrv\x64&lt;/b&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Select &lt;b&gt;Virtual Machine Network Services&lt;/b&gt; and click &lt;b&gt;OK&lt;/b&gt;       &lt;br /&gt;&lt;a href="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/vmns.png"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="vmns" alt="vmns" src="/blogimages/VirtualWindowsXPVirtualPC2007SP1NetworkD_48F3/vmns_thumb.png" border="0" width="455" height="339" /&gt;&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At this point the driver will be installed and attached to that network adapter.  If you have the need to attach this to multiple adapters, simply repeat the steps above to install the service on each adapter required.&lt;/p&gt;
&lt;p&gt;Once the driver is installed, you can then link the Device Emulator to the chosen adapter and connect to the network as always, as well as connect to the network in the new version of Virtual PC.&lt;/p&gt;
&lt;p&gt;Let me know how it works for you!&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2788.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Ever wanted to turn off Windows Beep?</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/22/ever-wanted-to-turn-off-windows-beep.aspx</link><pubDate>Wed, 22 Apr 2009 02:14:26 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/04/22/ever-wanted-to-turn-off-windows-beep.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2785.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2785.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/22/ever-wanted-to-turn-off-windows-beep.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2785.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Ever wanted to turn off Windows Beep?</source><description>&lt;p&gt;The other day my PC started beeping at me. Every "Are you sure?" message box was accompanied by a "beep". I don't know how or why this started...I only wanted to make it go away.&lt;/p&gt;
&lt;p&gt;First check, Control Panel -&amp;gt; Sounds. I confirmed that I had my sound scheme set to "No Sounds", but the beep stubbornly refused to budge.&lt;/p&gt;
&lt;p&gt;Next, Google. Did you know there's a "Beep" driver? Neither did I! The &lt;a href="http://www.howtogeek.com/howto/windows/turn-off-the-annoying-windows-xp-system-beeps/"&gt;HowToGeek has a nice article on disabling this driver on XP&lt;/a&gt;, only issue is you have to be admin.&lt;/p&gt;
&lt;p&gt;I rolled up my sleeves, ran an elevated command prompt using &lt;a href="http://blogs.msdn.com/aaron_margosis/archive/2004/07/24/193721.aspx"&gt;MakeMeAdmin&lt;/a&gt;, then ran System Properties from the command prompt using "sysdm.cpl", and finally followed all the instructions in HowToGeek's article to stop the driver, disable the driver, and disable startup of the driver.&lt;/p&gt;
&lt;p&gt;Now, I'm beep free - fan-beeping-tastic!&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/windows"&gt;windows&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/annoyances"&gt;annoyances&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/beep"&gt;beep&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2785.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>The two ways one writes JavaScript code..</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/04/21/the-two-ways-one-writes-javascript-code.aspx</link><pubDate>Tue, 21 Apr 2009 09:44:54 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/04/21/the-two-ways-one-writes-javascript-code.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2784.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2784.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/04/21/the-two-ways-one-writes-javascript-code.aspx#comment</comments><slash:comments>4</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2784.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">The two ways one writes JavaScript code..</source><description>&lt;p&gt;I think sometimes in the past I have been guilty in my presentation on JavaScript (JS) of not defining for myself who my audience is. Actually I know that I’ve done a poor job of this. You see there are 2 ways to write JavaScript code. Something that I knew, but recently realized the importance of.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;OO Baby&lt;/strong&gt;    &lt;br /&gt;If you are building your own controls then you are all about building things in an OO manner because it helps you in the areas on manageability. You may or may not be testing your components with automated/unit test tools and quality is everything.. as well as browser compatibility. When doing this one of the major struggles in your world will probably be in the area of memory leaks (I’ve joined the coalition to kill IE6). &lt;/p&gt;  &lt;p&gt;To be honest this is probably not you, but if you’ve come to one of my deep JS talks… this is my target (and my cardinal sin… sorry)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;The way you probably use JS&lt;/strong&gt;    &lt;br /&gt;Ok, the most common use of JS and the way that I think most people use it is to do minimal coding to wire up some validation or to wire up some interaction or even to include some Web 2.0 control (aka “Ajax Control”). Your mantra is “I want to get in and out quickly so that I don’t have to touch JS more than I need to…" We usually don’t take the time to test this stuff because it feels more declarative and that seems trustworthy (although you could test it)&lt;/p&gt;  &lt;p&gt;This is exactly why jQuery is so popular. Not only does encourage this type of thinking (and even embraces it), but the re-usable plugins take on this same sort of thinking (the show/hide methods come to mind). That and the sheer fluency of the library makes it easy to use. The selectors are really a variation of the same selectors that CSS uses so you are re-using knowledge that should already be in your head as a web-developer/designer.. &lt;/p&gt;  &lt;p&gt;Anyway, while JS OO is cool.. most of us work the other way (and even those of us who use JS OO do most of our JS coding using the latter method)&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2784.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Old Passwords Still Working?!</title><link>http://theruntime.com/blogs/devprime/archive/2009/04/16/old-passwords-still-working.aspx</link><pubDate>Thu, 16 Apr 2009 14:42:32 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/devprime/archive/2009/04/16/old-passwords-still-working.aspx</guid><wfw:comment>http://theruntime.com/blogs/devprime/comments/2783.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/devprime/comments/commentRss/2783.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/devprime/archive/2009/04/16/old-passwords-still-working.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/devprime/services/trackbacks/2783.aspx</trackback:ping><source url="http://theruntime.com/blogs/devprime/rss.aspx">Old Passwords Still Working?!</source><description>&lt;p&gt;I've had to respond to this topic a number of times now, so I figured I would just write it up here for future reference.&lt;/p&gt;
&lt;p&gt;If you are using Active Directory, and you administratively change a principle's password, sometimes you find that the old password still works (at least for a little while). Most often, you'll see this if you are using PrincipleContext or a Membership Provider that uses A.D. under the covers, because when you call their methods to change password, they do an administrative password change using LDAP.&lt;/p&gt;
&lt;p&gt;This is actual an old feature of NTLM authentication. The concept being (if I remember correctly) that after an administrative password change, you could still have cached credentials, shares, etc. using the old password. Therefore, NTLM still accepted the old password for some specified amount of time after the password change. The same "feature" is no longer available under Kerberos from what I understand.&lt;/p&gt;
&lt;p&gt;So first, you might be asking, "What's all this about NTLM and Kerberos? I'm using Active Directory and/or LDAP". True, but AD is just a giant database of network resource info (including users and groups) and LDAP is simply one protocol to query/change that data. The information by itself doesn't actually "do" anything. To perform authentication, Windows uses information from AD, but uses one of two protocols: NTLM or Kerberos. NTLM is a hashed credential challenge-response based protocol, and Kerberos is a (non-Microsoft) based protocol using 3rd party symmetric credential encryption and verfication via tickets. If you didn't get all that, don't worry. The point is that they work differently. NTLM is the old Windows NT networking library (including authentication), and Kerberos is the shiney new authentication library. But Windows still maintains both because not all environments or even all versions of Windows are capable of using strictly Kerberos. In fact, by default, Windows uses a pseudo-protocol called Negotiate, which tries to use Kerberos, and if that fails, falls back on NTLM.&lt;/p&gt;
&lt;p&gt;So one way to prevent the old password being valid after a password change is stop using NTLM for authentication. And that's easier said than done. If you are using PrincipleContext, nothing you do will prevent the code from using Negotiate (which ends up using NTLM when Kerberos comes back with an error). Even changing the ContextOptions won't do it.&lt;/p&gt;
&lt;p&gt;The PrincipleContext class authenticates by establishing a secure LDAP connection and then calling Bind() on that connection. It provides the given credentials (user name and password) to the Bind operation. But no matter what you change on the PrincipleContext, it will almost always use Negotiate (barring some scenarios, like looking for local users, which simply queries the local SAM database). Therefore, you have to stop using PrincipleContext.ValidateCredentials. Instead, you can do what it does under the covers, and Bind to an LDAP connection manually. It's quick and only takes a few lines of code. Basically, you create a new LdapConnection and set the NetworkCredentials (just an object that holds user name and password). Next, (and this is the important part), set the AuthType to Kerberos. Finally, call the Bind() method. If the credentials are invalid, you'll get an exception to that effect. This is exactly what PrincipleContext.ValidateCredentials does (if you are trying to validate based on Active Directory), but this way, you get to control the protocol being used. Also, don't forget that LdapConnection is a Disposable object, so make sure to call Dispose() when you're done, or instantiate it inside a Using block.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/devprime/aggbug/2783.aspx" width="1" height="1" /&gt;</description><dc:creator>DevPrime</dc:creator></item><item><title>What is UX (User Experience)?</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/04/09/what-is-ux-user-experience.aspx</link><pubDate>Thu, 09 Apr 2009 10:54:39 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/04/09/what-is-ux-user-experience.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2782.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2782.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/04/09/what-is-ux-user-experience.aspx#comment</comments><slash:comments>1</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2782.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">What is UX (User Experience)?</source><description>&lt;p&gt;(and should I be afraid to talk at a user group that has UX as its focus)..&lt;/p&gt;  &lt;p&gt;UX or User Experience or User Experience Design is a pretty hot topic right now… well in some circles. In other circles its a feared topic. Oftentimes when I ask someone to speak at my group Tampa UX, I get a response like “Isn’t that just for designers? I’m a developer, you don’t really want me there.” I usually end up coaching the speaker on what they should and should not do. Along the way I find that I have to explain what I’m about to explain here.&lt;/p&gt;  &lt;p&gt;There are 7 pieces to the puzzle that we think of at Tampa UX as the foundations of what we are about: &lt;strong&gt;Usable, Useful, Desirable, Valuable, Findable, Accessible, and Credible&lt;/strong&gt;.&lt;/p&gt;  &lt;p&gt;We felt that it was pretty important which is why we have an ongoing series by Shawn Cady covering each of these topics.&lt;/p&gt;  &lt;p&gt;Some things to notice on that list.. Do you see the word “UI” there? Do you see the word “Design?” “Desirable” is actually the concept that heads in the direction of what we think of as classic design. One could also argue that there are facets of “Usable” could be described as “Design” as well, but be careful there, developers can make things “Usable” as well. Something else that can make something “Usable” is good training manuals or trainers.. it’s not always IT that makes our systems have good UX.&lt;/p&gt;  &lt;p&gt;To me there are also some terms there that scream classic developer mindsets: “Useful” is the one that jumps at me. In fact at Hydrogen Media (you can search for them yourself) we had the classic Designers vs. Developers mindset (and I’m ashamed to have taken part in those debates). Designers will say “if its ugly no one will be drawn to it and use it in the first place".” Developers always say “if it’s just pretty pictures with no substance, no one will use it more than once.” As I look back on those times (10 years ago), I can now see that the answer lies in the fact that both are equally important, and there are these other things that just jump out at us.&lt;/p&gt;  &lt;p&gt;For instance, “Accessible” talks about how easily it is to access features and it also has implications in the new accessibility Laws for handicap impaired persons using applications on the Internet. “Credible” talks about whether someone believes your product is something they can trust. “Valuable” talks about the fact that your system gives a value that is not easily attainable elsewhere (it has a “value” for the user… and they can weigh that value in their minds in terms of money). The difference “Valuable” and “Desirable” is that desirable talks about features or a system that is something that the user wants.. (it’s not about needs.. “the system does more than I need…” “it goes over the top in what it offers..”)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Giving a UX Talk&lt;/strong&gt;    &lt;br /&gt;“So what kind of developer talks do you have at Tampa UX? I mean could I speak on forwarding WCF requests over SMTP?” The short answer to that is “NOOO!!” At Tampa UX we try to balance everything. We are actually in a rhythm where we have a light developer talk and a light designer talk. Ultimately our goal is to not bore one half of the audience during each talk. We would like to get to a place where we view every topic in light of the above list, but that’s just not always possible. In our group the technologies we seem to be focused on are Ajax With ASP.NET and Silverlight (although we have had the occasional XNA talk as well as we are looking at bringing in some WPF speakers as well). Believe it or not Silverlight and WPF (and Blend) are extremely hot with some designers right now..&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2782.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>The Story Of WordPerfect: Almost Perfect</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/09/the-story-of-wordperfect-almost-perfect.aspx</link><pubDate>Thu, 09 Apr 2009 04:51:44 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/04/09/the-story-of-wordperfect-almost-perfect.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2781.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2781.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/09/the-story-of-wordperfect-almost-perfect.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2781.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">The Story Of WordPerfect: Almost Perfect</source><description>&lt;p&gt;&lt;a href="http://www.codinghorror.com/blog/archives/001252.html"&gt;Jeff Atwood&lt;/a&gt; blogged about the free online book &lt;a href="http://www.wordplace.com/ap/index.shtml"&gt;Almost Perfect&lt;/a&gt; earlier this week. Author Pete Peterson was part of WordPerfect for 12 years and opens a window into development process, marketing, competition, and highs and lows of the company, from a small starter to a big corporation.&lt;/p&gt;
&lt;p&gt;I think the broader themes in this book are still applicable today - the enthusiastic team learning on its feet, finding creative ways to compete, dealing with customers and incorporating feedback, handling "feature creep" and release schedules, and the culture of an organisation (in this case, run by programmers). Pete doesn't come across as a particularly sympathetic guy, but tells an interesting tale and gives an insight into the IT culture of the mid 80's to the early 90's.&lt;/p&gt;
&lt;p&gt;I was never a WordPerfect user but remember seeing it in shops and magazines; amazingly, WordPerfect was available on almost every operating system under the sun - DOS, AmigaOS, Windows, OS/2, Apple IIe, Apple IIGS, Apricot, Tandy, even Atari (with the enormous differences in architecture and capabilities, that almost equates to &lt;span style="font-style: italic;"&gt;x&lt;/span&gt; number of different products, aside from all the different versions!)&lt;/p&gt;
&lt;p&gt;I'm glad Jeff posted about &lt;a href="http://www.wordplace.com/ap/index.shtml"&gt;Almost Perfect&lt;/a&gt;. It's well worth the read.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/book"&gt;book&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/review"&gt;review&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2781.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>TAMPA UX: Re-MIX this Wednesday (April 8th)</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/04/06/tampa-ux-re-mix-this-wednesday-april-8th.aspx</link><pubDate>Mon, 06 Apr 2009 11:49:46 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/04/06/tampa-ux-re-mix-this-wednesday-april-8th.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2780.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2780.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/04/06/tampa-ux-re-mix-this-wednesday-april-8th.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2780.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">TAMPA UX: Re-MIX this Wednesday (April 8th)</source><description>&lt;p&gt;The flurry of activity from last month is over (March Madness??). Those of us who went to MIX09 have finally recovered, but we’re all still taking in the information that was presented. Look for MIX09 to have a deep impact on TUX.&lt;/p&gt;  &lt;p&gt;Anyway, this week we’re going to go over the highlights of MIX. Shawn Cady, Jay Kimble, Nikita Polyakov, Bill Reiss, and Diane Leeper will each present a piece of it.&lt;/p&gt;  &lt;p&gt;Here’s the hot topics of MIX09: Windows Mobile 6.5, Blend3, SketchView, Silverlight3, Super Preview, IE8. We’ll try to cover them all in one form or another.&lt;/p&gt;  &lt;p&gt;As usual, we’ll have pizza and giveaways. The doors open at 6:30pm and things get started at 7:00pm.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2780.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>OT: I’m 10% (or so) April Fool</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/03/ot-im-10-or-so-april-fool.aspx</link><pubDate>Fri, 03 Apr 2009 01:09:53 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/04/03/ot-im-10-or-so-april-fool.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2779.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2779.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/04/03/ot-im-10-or-so-april-fool.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2779.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">OT: I’m 10% (or so) April Fool</source><description>&lt;p&gt;OK, I’ll admit I got got by a couple of the April Fool’s pranks around on Wednesday. &lt;a href="http://dubiousquality.blogspot.com/2009/04/startling-discovery.html"&gt;I was duped by Bill Harris at newly-subscribed Dubious Quality blog with his corker post on asthma and gravity&lt;/a&gt;. &lt;a href="http://feedproxy.google.com/~r/TheRuntime/~3/B6X0ya6LhYw/theruntime.com-is-no-morehellip-hello-alt.net.aspx"&gt;I was suckered by TheRuntime’s own Jay Kimble who had me worried when he blogged about closing this site&lt;/a&gt;. I only raised an eyebrow at the phoney &lt;a href="http://www.saveie6.com"&gt;SaveIE6&lt;/a&gt; campaign...at least I think it’s phoney...&lt;/p&gt;
&lt;p&gt;I feel like about 10% of an April Fool. I’d better pay more attention next year :-)&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/april+fool"&gt;april fool&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/funny"&gt;funny&lt;/a&gt;&lt;em&gt;&lt;/em&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2779.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>Multi-blog Obsession</title><link>http://theruntime.com/blogs/jacob/archive/2009/04/02/multi-blog-obsession.aspx</link><pubDate>Thu, 02 Apr 2009 15:26:02 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jacob/archive/2009/04/02/multi-blog-obsession.aspx</guid><wfw:comment>http://theruntime.com/blogs/jacob/comments/2778.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jacob/comments/commentRss/2778.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jacob/archive/2009/04/02/multi-blog-obsession.aspx#comment</comments><slash:comments>11</slash:comments><trackback:ping>http://theruntime.com/blogs/jacob/services/trackbacks/2778.aspx</trackback:ping><source url="http://theruntime.com/blogs/jacob/rss.aspx">Multi-blog Obsession</source><description>&lt;p&gt;&lt;img style="BORDER-BOTTOM: 0px; BORDER-LEFT: 0px; MARGIN: 0px 8px 0px 0px; DISPLAY: inline; BORDER-TOP: 0px; BORDER-RIGHT: 0px" title="TwoBlogs" border="0" alt="TwoBlogs" align="left" width="300" height="400" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jacob/WindowsLiveWriter/MultiblogObsession_D687/TwoBlogs_02b3aec3-d13a-45f2-85b5-52cc4290b4d5.png" /&gt;The multi-blog data provider for BlogEngine.Net has been taking up a lot of my brain space lately—to the point that I’m able to announce that it is installed and working “in the wild” on a hosted site (though not in anything like a heavy-load situation). I now have a copy of both &lt;a href="http://scruffylookingcatherder.com/"&gt;my dev site&lt;/a&gt; and &lt;a href="http://rabidpaladin.com/"&gt;my personal site&lt;/a&gt; up and running from the same directory (and the same database). Frankly, I didn’t think it’d be as easy as it was. This success prompted me to create a 2.0 release (that is now up on &lt;a href="http://blogenginesqlserver.codeplex.com/"&gt;the CodePlex site&lt;/a&gt;).&lt;/p&gt;
&lt;h3&gt;Getting Static&lt;/h3&gt;
&lt;p&gt;My main fear was with the heavy use of static variables in BlogEngine.Net. You see, BE.Net loads all the data into memory using static List variables. I found this out when I went looking for the best way to store a BlogId (so that it didn’t have to parse against an Url every time a request came through).&lt;/p&gt;
&lt;p&gt;While there are pros and cons to keeping your entire blog in memory (pro: speed and ease, con: memory bloat and a large delay on any request that triggers a data load), my concern was how an application would react when it had to serve two sets of data. Fortunately, it seems that even when two sites share an application pool on IIS, they still keep their static spaces separate. I’m not sure what I was going to do if it &lt;strong&gt;didn’t&lt;/strong&gt; but I was spared the tragedy.&lt;/p&gt;
&lt;h3&gt;Configuration&lt;/h3&gt;
&lt;p&gt;Installing the blog provider mainly involves copying the binary into the /bin directory and then updating the web.config to point to the right driver. There are three providers in your web.config that are affected.&lt;/p&gt;
&lt;h5&gt;Blog Provider&lt;/h5&gt;
&lt;p&gt;The blog provider handles the blog data. Settings, posts, categories and suchlike. Add the provider and update the “defaultProvider” tag and you’re ready to go.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;BlogEngine&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;blogProvider&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;defaultProvider&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;SQLBlogProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;      &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;name&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;SQLBlogProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BlogEngine.SQLServer.SqlBlogProvider, BlogEngine.SQLServer&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;connectionStringName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BE&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;blogProvider&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;BlogEngine&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h5&gt;Membership Provider&lt;/h5&gt;
&lt;p&gt;The membership provider handles user authentication and management (stuff like changing passwords and such). Technically, you don’t need to change this, but if you &lt;strong&gt;don’t&lt;/strong&gt; the users will be the same across blogs (not a problem if you aren’t multi-blogging). I frankly haven’t tested if a mixed-configuration actually works but it &lt;em&gt;should&lt;/em&gt;. Again, add the provider and update the “defaultProvider” tag and you’re ready to go.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;membership&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;defaultProvider&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;LinqMembershipProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;clear&lt;/span&gt;&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;name&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;LinqMembershipProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BlogEngine.SQLServer.LinqMembershipProvider, BlogEngine.SQLServer&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;passwordFormat&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;Hashed&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;connectionStringName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BE&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;membership&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h5&gt;Role Provider&lt;/h5&gt;
&lt;p&gt;The role provider handles authorization and what users are assigned to which roles. Again, you don’t technically have to change this if you don’t need it. Also again, it’s simply a matter of adding the provider and changing the “defaultProvider” tag.&lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;roleManager&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;defaultProvider&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;LinqRoleProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;enabled&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;cacheRolesInCookie&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;cookieName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;.BLOGENGINEROLES&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;clear&lt;/span&gt;&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;    &amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;name&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;LinqRoleProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BlogEngine.SQLServer.LinqRoleProvider, BlogEngine.SQLServer&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;connectionStringName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BE&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;  &amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;providers&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;/&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;roleManager&lt;/span&gt;&lt;span style="COLOR: blue"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;h3&gt;Multiple-blog Configuration&lt;/h3&gt;
&lt;p&gt;To set stuff up for multiple blogs, you’ll need to run a script or two in your database and add a tag to all the providers. There are two script files (included in both the binary and source files), one for setting up the initial database changes (DatabaseSchemaChanges.sql—mostly adds tables) and another for adding the base values for a new blog (AddNewBlog.sql).&lt;/p&gt;
&lt;p&gt;I &lt;em&gt;wanted&lt;/em&gt; to make this easier by having the driver do the updates for you. That may still happen in the future, but since BlogEngine.Net itself requires manually running a script if you want to use the database provider I decided not to sweat it too hard. Presumably, anyone running in a database has to be running scripts manually anyway so this isn’t going to be a show stopper.&lt;/p&gt;
&lt;p&gt;The provider will run just fine after running either script, even if you aren’t using multiple blogs. In other words, just because the database changed doesn’t mean that the single-blog installation is hosed. The exception to this is the “be_Settings” table. If you’re going to run for a while with a single-blog after running the first script, you’ll want to add a default to the BlogId column so it doesn’t choke when you insert and update settings.&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="DefaultBlogId" border="0" alt="DefaultBlogId" width="493" height="385" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jacob/WindowsLiveWriter/MultiblogObsession_D687/DefaultBlogId_42ea3ec2-c80e-4daf-b0ca-a7ed95ba53ec.png" /&gt; &lt;/p&gt;
&lt;p&gt;Both scripts are “templated” so you can change key factors (a table prefix on the first and a couple of blog values in the second). Filling in the template is a matter of hitting ctrl-shift-M in Query Analyzer or SQL Server Management Studio. That’ll bring up a prompt for what values you want those template variables to have.&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="TemplatePrompt" border="0" alt="TemplatePrompt" width="440" height="309" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jacob/WindowsLiveWriter/MultiblogObsession_D687/TemplatePrompt_6b4e2a1d-0aed-4264-91ac-aa0c352d902c.png" /&gt; &lt;/p&gt;
&lt;p&gt;The final thing to setup is to add a multiblog attribute on the providers. That’ll make your providers look something like this.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;&amp;lt;&lt;/span&gt;&lt;span style="COLOR: #a31515"&gt;add&lt;/span&gt;&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;name&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;SQLBlogProvider&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;type&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BlogEngine.SQLServer.SqlBlogProvider, BlogEngine.SQLServer&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;connectionStringName&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;BE&lt;/span&gt;"&lt;span style="COLOR: blue"&gt; &lt;/span&gt;&lt;span style="COLOR: red"&gt;multiblog&lt;/span&gt;&lt;span style="COLOR: blue"&gt;=&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;true&lt;/span&gt;"&lt;span style="COLOR: blue"&gt;/&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;The provider selects the blog it wants to deliver based on three configured values.&lt;/p&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;strong&gt;Host&lt;/strong&gt; is the base address. The provider matches the Host value against the &lt;em&gt;end of &lt;/em&gt;the host (so &lt;em&gt;rabidpaladin.com&lt;/em&gt; will match “rabidpaladin.com”, “www.rabidpaladin.com” and “blog.rabidpaladin.com”).&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Path&lt;/strong&gt; is the rest of the Url. The provider matches the Path value against the &lt;em&gt;start of&lt;/em&gt; the requested path.&lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Port&lt;/strong&gt; is the port (if any) in the Url. Honestly, I threw this one in there as much for my testing as for any real-world use I expect it to see.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Tags&lt;/h3&gt;
&lt;p&gt;One thing I added (at the provider level) is that when a post comes in without any tags, the provider takes a moment to scan for tags in the post body. This is a feature I did the initial work for in Subtext so porting it over was a matter of a couple minutes. Any time a post is inserted into the database, the provider checks if it has tags yet. If no tags are present, it will scan the content for appropriate anchor markup (like those produced for Technorati tags). That means that on import, my posts all had their tags correctly populated—saving me a lot of extra work (or face losing tags on imported posts). That I was able to avoid the brain-damaged tag handling of BlogEngine.Net is just a bonus (they lower-case tags on creation and then re-capitalize them when serving them up).&lt;/p&gt;
&lt;h3&gt;Other Stuff&lt;/h3&gt;
&lt;p&gt;As I said, this should get you set up. Since I used this blog provider from the start on both my blogs, I can verify that the import tool works just fine in a multi-blog configuration. As far as BlogEngine.Net is aware, it’s doing the same stuff it always has. Indeed, the only change I made from BlogEngine.Net’s standard v1.4.5 release was in UrlRewrite.cs to allow links produced by Subtext to still work (so I don’t throw errors on old links).&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;div style="FONT-FAMILY: courier new; BACKGROUND: white; COLOR: black; FONT-SIZE: 10pt"&gt;
&lt;pre style="MARGIN: 0px"&gt;&lt;span style="COLOR: blue"&gt;else&lt;/span&gt; &lt;span style="COLOR: blue"&gt;if&lt;/span&gt; (url.Contains(&lt;span style="COLOR: #a31515"&gt;"/POST/"&lt;/span&gt;) || url.Contains(&lt;span style="COLOR: #a31515"&gt;"/ARCHIVE/"&lt;/span&gt;))&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;I submitted a patch at one time to have this hit the base source code but apparently it wasn’t deemed worthy.&lt;/p&gt;
&lt;p&gt;Also, I found that running the provider in IIS7 is a bit tricky. Since BlogEngine.Net loads extensions from the database on application start you’ll get errors if you are configured for “Integrated” mode. That’s because “Integrated” mode (quite properly) fires the application start event before the HttpContext.Request is populated (which is what I’m using to determine what blog is being requested). Setting the application pool to “Classic” mode will solve this “problem”.&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: block; FLOAT: none; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; MARGIN-LEFT: auto; BORDER-LEFT-WIDTH: 0px; MARGIN-RIGHT: auto" title="IIS7ClassicMode" border="0" alt="IIS7ClassicMode" width="316" height="283" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jacob/WindowsLiveWriter/MultiblogObsession_D687/IIS7ClassicMode_166ef5da-8f28-408c-993b-143992d7f463.png" /&gt;&lt;/p&gt;
&lt;h3&gt;Looking Forward&lt;/h3&gt;
&lt;p&gt;My blogs are still running Subtext at their base addresses. I’m still not quite ready to take the plunge on BlogEngine.Net.  I &lt;em&gt;am&lt;/em&gt;, however, undoubtedly one step closer.&lt;/p&gt;
&lt;div style="PADDING-BOTTOM: 0px; MARGIN: 0px; PADDING-LEFT: 0px; PADDING-RIGHT: 0px; DISPLAY: inline; FLOAT: none; PADDING-TOP: 0px" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:0ee52ca4-3275-480e-ac65-dbb0a56fd9c1" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/Linq+to+SQL"&gt;Linq to SQL&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Linq"&gt;Linq&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/C%23"&gt;C#&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Programming"&gt;Programming&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/BlogEngine.Net"&gt;BlogEngine.Net&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Data"&gt;Data&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/SQL+Server"&gt;SQL Server&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Blogging"&gt;Blogging&lt;/a&gt;&lt;/div&gt;&lt;img src="http://theruntime.com/blogs/jacob/aggbug/2778.aspx" width="1" height="1" /&gt;</description><dc:creator>Jacob</dc:creator></item><item><title>Theruntime.com is no more&amp;hellip; Hello ALT.NET&amp;hellip; NOT!</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/04/01/theruntime.com-is-no-morehellip-hello-alt.net.aspx</link><pubDate>Wed, 01 Apr 2009 05:35:17 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/04/01/theruntime.com-is-no-morehellip-hello-alt.net.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2777.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2777.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/04/01/theruntime.com-is-no-morehellip-hello-alt.net.aspx#comment</comments><slash:comments>4</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2777.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Theruntime.com is no more&amp;hellip; Hello ALT.NET&amp;hellip; NOT!</source><description>&lt;p&gt;At MIX09, i got an opportunity to really sit down with a number of the folks in the ALT.NET community, most notably &lt;a href="http://devlicio.us/blogs/christopher_bennage/"&gt;Christopher Bennage&lt;/a&gt; and &lt;a href="http://devlicio.us/blogs/rob_eisenberg/"&gt;Rob Eisenberg&lt;/a&gt; of &lt;a href="http://www.bluespire.com/"&gt;Bluespire Consulting&lt;/a&gt;. They walked me through a few scenarios and showed me some code and how they do things.&lt;/p&gt;  &lt;p&gt;It all is started to making sense. i have been quietly plugging/pushing ALT.NET methodologies/tools over the last 2 weeks at work… The final straw happened yesterday where i was espousing refactoring our current architecture to a new architecture using SOLID principles and BDD to help us get there when a blog entry from this very site was used against my arguments. After a careful re-read I decided that something had to be done about the content. The ideas herein are dangerous (especially in my own blog), and could mislead a young programmer away from certain forms of architecture that are absolutely essential. Since i control TRT, i’ll be shutting it down in the next week (i’ll give everyone over here a chance to relocate). As for me, i’ll possibly go back to CodeBetter.com since i am now a much better match for them (and i still have an account over there i think… will have to ask Brendan if it’s ok) if not i have friends at Los Techies, so i’m sure i’ll find a blog home for my new improved ALT.NET blog).&lt;/p&gt;  &lt;p&gt;[Wow, I managed to fool both Dana and Dave… No worries, TRT crew.. we’re still here (and will continue to be who we are); this was all just a joke…]&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2777.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>TwitterDrive</title><link>http://theruntime.com/blogs/brianpeek/archive/2009/04/01/twitterdrive.aspx</link><pubDate>Wed, 01 Apr 2009 01:01:00 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/brianpeek/archive/2009/04/01/twitterdrive.aspx</guid><wfw:comment>http://theruntime.com/blogs/brianpeek/comments/2776.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/brianpeek/comments/commentRss/2776.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/brianpeek/archive/2009/04/01/twitterdrive.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/brianpeek/services/trackbacks/2776.aspx</trackback:ping><source url="http://theruntime.com/blogs/brianpeek/rss.aspx">TwitterDrive</source><description>&lt;p&gt;&lt;img style="border-bottom: 0px; border-left: 0px; margin: 0px 10px 0px 0px; display: inline; border-top: 0px; border-right: 0px" title="tDrive" border="0" alt="tDrive" align="left" src="http://www.brianpeek.com/blogimages/TwitterDrive_272B/tDrive.jpg" width="79" height="45" /&gt;Welcome to the revolution in cloud storage…TwitterDrive!&lt;/p&gt;  &lt;p&gt;Learn more at &lt;a href="http://blogs.msdn.com/coding4fun/" target="_blank"&gt;Coding4Fun&lt;/a&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;ul&gt;     &lt;ul&gt;       &lt;li&gt;&lt;a title="http://blogs.msdn.com/coding4fun/archive/2009/04/01/9525377.aspx" href="http://blogs.msdn.com/coding4fun/archive/2009/04/01/9525555.aspx" target="_blank"&gt;Author Interview&lt;/a&gt; &lt;/li&gt;        &lt;li&gt;&lt;a title="http://blogs.msdn.com/coding4fun/archive/2009/04/01/9525377.aspx" href="http://blogs.msdn.com/coding4fun/archive/2009/04/01/9525376.aspx" target="_blank"&gt;Technical Article&lt;/a&gt; &lt;/li&gt;     &lt;/ul&gt;   &lt;/ul&gt; &lt;/ul&gt;  &lt;p&gt;:)&lt;/p&gt;
Cross Posted from &lt;a href="http://www.brianpeek.com/"&gt;www.brianpeek.com&lt;/a&gt;.&lt;img src="http://theruntime.com/blogs/brianpeek/aggbug/2776.aspx" width="1" height="1" /&gt;</description><dc:creator>Brian Peek</dc:creator></item><item><title>Review Quantum Whale editor..</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/03/28/review-quantum-whale-editor.aspx</link><pubDate>Sat, 28 Mar 2009 18:14:13 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/03/28/review-quantum-whale-editor.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2775.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2775.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/03/28/review-quantum-whale-editor.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2775.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Review Quantum Whale editor..</source><description>&lt;p&gt;[this honestly was unsolicited.. I can’t believe I missed this gem amongst the upgrade notices that I periodically get..]&lt;/p&gt;  &lt;p&gt;Several years ago, I somehow was given a license to &lt;a href="http://www.qwhale.net/products/editor/"&gt;Quantum Whale’s Editor.Net&lt;/a&gt;. It was part of one a “freebie” program that a tools catalog that I used. Since that time I have been getting a free updates. Today on a whim I decided to take a look at the product (it only took me 4 years I think).&lt;/p&gt;  &lt;p&gt;All I can say is wow! I knew it was an editor component (and now so do you), but I figured .Net 1.1 with VB and/or C#.. maybe JavaScript, but it must be limiting (why did I never look twice). NOT! Here’s the advertised list: C, C#, Delphi, VB, Java, Xml, Html… it also does SQL and JavaScript (two languages that I saw off the top of my head). The editor itself looks and acts just like Visual Studio, and it includes a sample that looks a lot like VS’ editor (and has full intellisense and not just for VB/C#), and it didn’t seem like that much code in the one sample I pulled up (complete Windows Form code was around 1000).&lt;/p&gt;  &lt;p&gt;The punch line for me was that it comes with full source! And it’s not that expensive ($300). I know there are open source editors out there, but you need to extract the code from them and then you have to figure out wiring them up… this has it all done for you..&lt;/p&gt;  &lt;p&gt;I’ve studied the SharpDevelop editor code BTW, and this seems a lot more straightforward. Anyway, check it out yourself.. pretty cool.&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2775.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Multiple Blog Data</title><link>http://theruntime.com/blogs/jacob/archive/2009/03/27/multiple-blog-data.aspx</link><pubDate>Fri, 27 Mar 2009 15:00:13 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jacob/archive/2009/03/27/multiple-blog-data.aspx</guid><wfw:comment>http://theruntime.com/blogs/jacob/comments/2774.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jacob/comments/commentRss/2774.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jacob/archive/2009/03/27/multiple-blog-data.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jacob/services/trackbacks/2774.aspx</trackback:ping><source url="http://theruntime.com/blogs/jacob/rss.aspx">Multiple Blog Data</source><description>&lt;p&gt;&lt;img title="PartialSchema" style="border-right: 0px; border-top: 0px; display: inline; margin: 0px 0px 8px; border-left: 0px; border-bottom: 0px" height="225" alt="PartialSchema" src="http://theruntime.com/blogs/images/theruntime_com/blogs/jacob/WindowsLiveWriter/MultipleBlogs_D331/PartialSchema_02e2f25f-cec8-4d99-ad7f-14c152f695f2.png" width="250" align="right" border="0" /&gt; So I have a working &lt;a href="http://theruntime.com/blogs/jacob/archive/2009/03/04/gratuitous-use-of-linq.aspx"&gt;LINQ to SQL provider&lt;/a&gt; for &lt;a href="http://www.dotnetblogengine.net/"&gt;BlogEngine.Net&lt;/a&gt;. Now what? Given a little spare time, how about I see if I can’t use it to support running multiple blogs from the same installation? More importantly, see if I can use it to support running multiple blogs from the same database?&lt;/p&gt;  &lt;p&gt;Doing just that turns out not to be all that difficult.&lt;/p&gt;  &lt;h3&gt;Scheming&lt;/h3&gt;  &lt;p&gt;The current architecture for BlogEngine.Net’s data already has a bit more cohesion than it technically needs. All the objects have their own individual Ids and those Ids are used to relate objects to each other (though there is one exception). Since every object already has its own Id (usually a &lt;a href="http://en.wikipedia.org/wiki/Guid"&gt;Guid&lt;/a&gt;), splitting objects into separate blogs isn’t the chore it might otherwise have been.&lt;/p&gt;  &lt;p&gt;There are two options when it comes to dividing items up into multiple blogs. First, each object can have a column added to its table to indicate which blog it is associated with. Second, you can create a cross-reference table that associates a blog Id with the object Id for the blog.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Columns&lt;/strong&gt;     &lt;br /&gt;My initial impulse in most cases would be to add a BlogId column to the tables where it is needed. The reason is simple: objects belonging to the blog are in a true parent-child relationship and that relationship is generally best expressed as a field on the child indicating its parent. The relationship can (and really should) be enforced with a foreign key constraint on the column to ensure that the relationship is intact.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Cross-references&lt;/strong&gt;     &lt;br /&gt;Having cross-reference tables is a bit more problematic and carries with it some maintenance and performance concerns. Not only does it force a join when you want to read the objects for a specific blog, but it means that insert, update, and delete commands now have to involve two tables instead of just one. One advantage of cross-reference tables is that they’re easier to extract back out if you need to devolve your data. Additionally, foreign key constraint integrity is triggered when the cross-reference entry is created instead of on your blog objects themselves—making your touch a bit lighter if you have other actors in the system.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Complicating Things&lt;/strong&gt;  &lt;br /&gt;No decision is best for every occasion, and when it came time to design how I wanted multiple blogs to work, I was really reluctant to mess with the native tables of BlogEngine.Net. I’m not sure if my hesitation is a matter of respect for a project I’m not involved in or if I’m just being unreasonably squeamish, but I eventually chose to go the cross-reference route. My main reasoning is that I wanted my intrusions to remain light and easily devolved.&lt;/p&gt;  &lt;h3&gt;I ♥ Linq&lt;/h3&gt;  &lt;p&gt;Now, normally, adding a super-structure on top of an existing infrastructure is a real pain. Editing all your SQL statements manually becomes an exercise in precision string manipulation and if you’re working through stored procedures… ugh. Linq made this really easy.&lt;/p&gt;  &lt;p&gt;Here’s an example from the FillProfiles method of the blog provider.&lt;/p&gt;  &lt;p&gt;&lt;/p&gt;  &lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;   &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;var&lt;/span&gt; profileData = &lt;span style="color: blue"&gt;from&lt;/span&gt; p &lt;span style="color: blue"&gt;in&lt;/span&gt; context.Profiles&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;                  &lt;span style="color: blue"&gt;select&lt;/span&gt; p;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;if&lt;/span&gt; (isMultiBlog)&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;{&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;    profileData = &lt;span style="color: blue"&gt;from&lt;/span&gt; p &lt;span style="color: blue"&gt;in&lt;/span&gt; profileData&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;                  &lt;span style="color: blue"&gt;join&lt;/span&gt; bp &lt;span style="color: blue"&gt;in&lt;/span&gt; context.BlogProfiles &lt;span style="color: blue"&gt;on&lt;/span&gt; p.ProfileID &lt;span style="color: blue"&gt;equals&lt;/span&gt; bp.ProfileId&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;                  &lt;span style="color: blue"&gt;where&lt;/span&gt; bp.BlogId == &lt;span style="color: #2b91af"&gt;Utils&lt;/span&gt;.GetBlogId()&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;                  &lt;span style="color: blue"&gt;select&lt;/span&gt; p;&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;}&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;The initial select is good for the general case. It pulls all the objects from the Profiles table. Adding a filter when we have multiple blogs is added in the if clause. Note that the second select references the first (“from p in profileData”). Linq knows that the second “from” is a refinement of the first and puts them together logically. Since Linq defers execution of the query until it’s actually used, the query sent to the server includes the full constraint (i.e. filtering happens on the database). Here’s the statement that’s actually sent.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;

&lt;div style="font-size: 10pt; background: white; color: black; font-family: courier new"&gt;
  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;SELECT &lt;/span&gt;[t0].[ProfileID], [t0].[UserName], [t0].[SettingName], [t0].[SettingValue]&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;FROM &lt;/span&gt;[dbo].[be_Profiles] &lt;span style="color: blue"&gt;AS &lt;/span&gt;[t0]&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;INNER JOIN &lt;/span&gt;[dbo].[be_BlogProfiles] &lt;span style="color: blue"&gt;AS &lt;/span&gt;[t1] &lt;span style="color: blue"&gt;ON &lt;/span&gt;[t0].[ProfileID] = [t1].[ProfileId]&lt;/pre&gt;

  &lt;pre style="margin: 0px"&gt;&lt;span style="color: blue"&gt;WHERE &lt;/span&gt;[t1].[BlogId] = @p0&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;

&lt;p&gt;This method ensures that you only take the hit of the join if you are in a multi-blog setup. And without pulling everything to the client.&lt;/p&gt;

&lt;h3&gt;Settings&lt;/h3&gt;

&lt;p&gt;I had some fun with the Settings table because it is an exception to BlogEngine.Net’s Id rigor. It has interesting impact on the Linq situation, but I think I’ll give it its own (short) post later.&lt;/p&gt;

&lt;h3&gt;Beta Available&lt;/h3&gt;

&lt;p&gt;So I tested this in my own home-grown environment and it seems to work as expected. In consequence, I’ve created a &lt;a href="http://blogenginesqlserver.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=25365"&gt;new release&lt;/a&gt; at the &lt;a href="http://blogenginesqlserver.codeplex.com/"&gt;project homepage&lt;/a&gt;. I’m calling it a beta, though it barely warrants the label. I worry that it has only been tested in a single environment. If you’re a hearty soul and a BE.Net user, please give it a go. I’ll be spending some time getting it set up and tested in an actual public setting with my personal blogs here shortly. As always, I welcome feedback either at codeplex or comments or via email.&lt;/p&gt;

&lt;div class="wlWriterEditableSmartContent" id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:2f744ee4-cd07-4e64-8528-d1e6b8b12017" style="padding-right: 0px; display: inline; padding-left: 0px; float: none; padding-bottom: 0px; margin: 0px; padding-top: 0px"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/Linq+to+SQL" rel="tag"&gt;Linq to SQL&lt;/a&gt;,&lt;a href="http://technorati.com/tags/LINQ" rel="tag"&gt;LINQ&lt;/a&gt;,&lt;a href="http://technorati.com/tags/C%23" rel="tag"&gt;C#&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Programming" rel="tag"&gt;Programming&lt;/a&gt;,&lt;a href="http://technorati.com/tags/BlogEngine.Net" rel="tag"&gt;BlogEngine.Net&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Data" rel="tag"&gt;Data&lt;/a&gt;,&lt;a href="http://technorati.com/tags/SQL+Server" rel="tag"&gt;SQL Server&lt;/a&gt;,&lt;a href="http://technorati.com/tags/Blogging" rel="tag"&gt;Blogging&lt;/a&gt;&lt;/div&gt;&lt;img src="http://theruntime.com/blogs/jacob/aggbug/2774.aspx" width="1" height="1" /&gt;</description><dc:creator>Jacob</dc:creator></item><item><title>MiX09 personal note..</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/03/20/mix09-personal-note.aspx</link><pubDate>Fri, 20 Mar 2009 12:00:38 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/03/20/mix09-personal-note.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2771.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2771.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/03/20/mix09-personal-note.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2771.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">MiX09 personal note..</source><description>&lt;p&gt;I feel a need to talk about something probably because my intense Introvert side is totally exhausted from the parties i have been in recently (or rather socially exhausted). &lt;/p&gt;  &lt;p&gt;So, there is a joke that someone around me keeps saying to me just to give me a hard time. He keeps implying that there are those on the internet whom i’ve so offended with some of my stances that i am hated.. The exchange usually is something along the lines “you know that really hate me..” the first time my  response was with great alarm and then i am trying to figure out how to make people not hate me anymore. Anyway, if I say something to you like “I run Camp Evil” or that “i know i’m evil…” It’s just a joke.. Don’t be offended and laugh.. it’s said with sarcasm, because there are more important things in life than software development.&lt;/p&gt;  &lt;p&gt;For instance i got to meet ScottGu yesterday (i kept myself from hugging him, but it was hard). Mostly we talked about how being a new parent is going for him… yep i didn’t ask a single tech questions.. life is more important… we have to enjoy it and we have to not take things so darn serious at times (Ok, preaching to myself here, so I’ll stop now)&lt;/p&gt;  &lt;p&gt;[ps. btw, i’m not evil… but Jacob Proffitt is.. so turn your anger away from me and direct it at him.. &amp;lt;grin /&amp;gt;]&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2771.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>why we do love ScottGu..</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/03/19/why-we-do-love-scottgu.aspx</link><pubDate>Thu, 19 Mar 2009 09:45:46 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/03/19/why-we-do-love-scottgu.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2770.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2770.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/03/19/why-we-do-love-scottgu.aspx#comment</comments><slash:comments>2</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2770.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">why we do love ScottGu..</source><description>&lt;p&gt;i’ve been thinking about something.. After the MIX09 keynote yesterday, i have been pondering my own general love/like of ScottGu (aka Scott Guthrie aka “The Gu”). What is it about this guy really. i actually tweeted as he arrived on stage after a hilarious video that “ScottGu arrived like the rock star he is!” What is it that evokes this kind of emotion from me? &lt;/p&gt;  &lt;p&gt;i think it’s how unassuming he really is. i mean the guy doesn’t strike you like say Scott Hanselman (ScottHa) does. If you ever meet ScottHa you will instantly recognize that he is one of the smartest guys in the room when talking tech.. Now to ScottHa’s credit it’s not really his ego or arrogance (cause I don’t really see those things that much)… it’s just that he says stuff and you end up thinking… wow! I didn’t know that or didn’t think of that.. &lt;/p&gt;  &lt;p&gt;With “The Gu” i think i finally pinpointed it yesterday. i got to finally meet Phil Haack and someone asked him about ScottGu. He said that ScottGu seemingly is able to outwork everyone around him. Phil talked about reading check in notes something that Phil admitted that he doesn’t have that much time to read all of… i think ScottGu is the new “BillG.” Someone unassuming, but visionary. Someone who is one of us.. very smart (by no means would i want to convey that I think he’s not smart… he is… he just comes off so humble about it).. but more importantly someone motivated to outwork everyone around himself. Not sure if this is accurate, but i do know i would give an organ to the man if i knew he was sick.. and i’m just like you (probably), i’ve never met him (have had a few conversations in email with him)&lt;/p&gt;  &lt;p&gt;He is the face of why I’m able to do the cool things i do for a living… i still don’t really understand my geek-love for him though..&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2770.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>MIX09 Keynote with ScottGu and Bill buxton (live)</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/03/18/mix09-keynote-with-scottgu-and-bill-buxton-live.aspx</link><pubDate>Wed, 18 Mar 2009 10:03:03 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/03/18/mix09-keynote-with-scottgu-and-bill-buxton-live.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2769.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2769.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/03/18/mix09-keynote-with-scottgu-and-bill-buxton-live.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2769.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">MIX09 Keynote with ScottGu and Bill buxton (live)</source><description>&lt;p&gt;It’s starting! Bill Buxton is now on the stage… WOW! great speaker!&lt;/p&gt;  &lt;p&gt;Industrial designers are related to design today. Time for innovation in design. Most of these guys he mentions are during the great depression. Today is the time for design. Industrial design is experience design.&lt;/p&gt;  &lt;p&gt;We need to refocus.. on experience. You don’t aspire to have a thing. You aspire to use it. Where is the adrenaline in that object? That is what you want to evoke. &lt;/p&gt;  &lt;p&gt;You can sketch. (Asks us to draw his phone and then its interface). Design is about rapid iterations/concepts (Draw phone, draw interface, draw the user experience).&lt;/p&gt;  &lt;p&gt;How do you do it?    &lt;br /&gt;Find a balance with multiples (you need to be able to have 5 equally valid solutions) and a budget. &lt;/p&gt;  &lt;p&gt;Timing?    &lt;br /&gt;Has a picture with ([ ] Touch Here/ [ ] Not Here), then he touches wrong place, gets an error, goes back touches “here” gets a thanks message. We’re talking about the nature of transitions. &lt;/p&gt;  &lt;p&gt;In design you throw away 99.9% of your work. We need different tools for moving along the path of ideation (refining/rejecting designs).&lt;/p&gt;  &lt;p&gt;Demo    &lt;br /&gt;He’s showing Win 7 on HP Touchsmart… didn’t work… he made a joke… He’s awesome you should watch this! Well worth it! All of MS is working toward enabling people to get the best experence. (BTW blogging from Win7… I love it!)&lt;/p&gt;  &lt;p&gt;Seneca “Luck is what happens with preparation meets opportunity.”&lt;/p&gt;  &lt;p&gt;Bill is off the stage..now it’s ScottGu time! Awesome intro video! I sense Hanselman hand in this…&lt;/p&gt;  &lt;p&gt;He’s arriving like the rock star he is!&lt;/p&gt;  &lt;p&gt;He’s focusing on the how of what Bill just talked about. (Web, media, and RIA)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Expression Web 3&lt;/strong&gt;     &lt;br /&gt;Focuses on standard based web sites. ASP.NET/PHP, secure FTP, CSS Diagnostics, and Super Preview where we can check a page works in ALL browsers. SuperPreview lets you go side by side (with FF3 and comp), then overlaid. Superview is now overlaying comp and Safari 3 on MAC (from the cloud). He is now isolating elements in IE6. He can select the element. He’s fixing IE6, and did.. nice.. (Superpreview standalone will be available for free today)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MVC 1.0&lt;/strong&gt;     &lt;br /&gt;Full control over HTML markup, SEO friendly URL routings, and TDD workflow.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;ASPNET 4 and VS2010&lt;/strong&gt;     &lt;br /&gt;ASPNET 4 – Better controls over viewstate, ids, data, distributed caching (velocity), and the new ajax stuff. VS 2010 has code focused features (editor improvements), JScript/Ajax/JQuery improvements, SharePoint debugging, and publishing/deployment. Allows for multple web.configs per state…deployment will cause DB Deployment as well as file deployments. &lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Web Server Extensions&lt;/strong&gt;     &lt;br /&gt;8 new extensions (DB manager, deployment that integrates with VS, webDAV, app request for forward proxy…)&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Web App Gallery&lt;/strong&gt;     &lt;br /&gt;Third party apps easily installed with Web Platform Installer.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;MS Web Platform Installer Demo&lt;/strong&gt;     &lt;br /&gt;Really cool. Makes it easy to integrate/install stuff on the box. &lt;a href="http://microssoft.com/web/gallery"&gt;http://microssoft.com/web/gallery&lt;/a&gt; takes you to the new Web App Gallery. Web PI (Platform Installer) integrates with this and will auto install dependencies (like PHP or IIS, etc). You can set up where it installs… and what web site (like on another post)… then app settings in a nice to use dialog. BTW it will also install My SQL DB I think… wow!&lt;/p&gt;  &lt;p&gt;Woohoo! SL3!&lt;/p&gt;  &lt;p&gt;Lot’s of stats… Silverlight is growing! New Virtual Earth SDK for use with Silverlight. Bringing in the company that laid off a bunch of Flash developers to show off SL success… Netflix (sorry couldn’t resist). Netflix needed to get their video streams on a Mac… 20% of their users, so Silverlight let them work on these browsers.DRM made installer experience suck… SL took away that badness… very cool! They are playing with their adaptive streaming making the video player tries to get better quality, but are really doing a better and better job of avoiding re-buffering. They can actually deploy new version every 2 weeks (as opposed to the yearly deploy).&lt;/p&gt;  &lt;p&gt;SL3 will take advantage of gpu (i think)&lt;/p&gt;  &lt;p&gt; [Copying rest from my tweet feed]&lt;/p&gt;  &lt;p&gt;Sl3 Blend3 supports a sketchflow mode like what Bill Buxton challenged us to do..Blend 3 looks like it night be a good prototyping tool..Sketchflow has a free player so client can see and add feedback! then it created design docs! Prototyping just got a lot easier!&lt;/p&gt;  &lt;p&gt;Watching psd import.. they are actually seeing every layer of the img and you can edit it with blend.. r u kidding me??!! this rocks! He’s easily dropping items into what was the psd which is now a master page (each lyr is a region that can have content dropped in). seo advances is that there are now links that trigger elements in sl file.. so you can use targets like you do with html today. Databinding maintains state and will push changes back to server. &lt;/p&gt;  &lt;p&gt;It can now be run outside of the browser on mac as well as windows.. Out of browser will auto update and fires events that tell you whether you are connected..&lt;/p&gt;  &lt;p&gt;Sl3 how big? Sl3 is smaller than Sl2! (40k less)&lt;/p&gt;  &lt;p&gt;Sl3 it will be available for release later this year..   &lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2769.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item><item><title>Enhancing Visualisation of Common Elements Across Groups Using Color in Reporting Services 2005, Part 2</title><link>http://theruntime.com/blogs/thomasswilliams/archive/2009/03/18/enhancing-visualisation-of-common-elements-across-groups-using-color-in-again.aspx</link><pubDate>Wed, 18 Mar 2009 10:56:52 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/thomasswilliams/archive/2009/03/18/enhancing-visualisation-of-common-elements-across-groups-using-color-in-again.aspx</guid><wfw:comment>http://theruntime.com/blogs/thomasswilliams/comments/2768.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/thomasswilliams/comments/commentRss/2768.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/thomasswilliams/archive/2009/03/18/enhancing-visualisation-of-common-elements-across-groups-using-color-in-again.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/thomasswilliams/services/trackbacks/2768.aspx</trackback:ping><source url="http://theruntime.com/blogs/thomasswilliams/rss.aspx">Enhancing Visualisation of Common Elements Across Groups Using Color in Reporting Services 2005, Part 2</source><description>&lt;p&gt;As I discussed &lt;a href="http://theruntime.com/blogs/thomasswilliams/archive/2009/03/10/enhancing-visualisation-of-common-elements-across-groups-using-color-in.aspx"&gt;last week in part 1 of this article&lt;/a&gt;, color can be used to highlight common elements across groups. As promised, here's the necessary code to achieve this effect in Reporting Services 2005 (&lt;a href="http://thomasswilliams.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24491"&gt;or you can download the finished report here&lt;/a&gt;):&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1. Create a new report, and add a query.&lt;/strong&gt; I've used AdventureWorks and a simple query that returns employees and years of service:&lt;/p&gt;
&lt;div style="BORDER-RIGHT: #ececec 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ececec 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #ececec 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #ececec 1px solid; BACKGROUND-COLOR: #fcfcfc"&gt;
&lt;pre style="BACKGROUND: #fcfcfc; COLOR: #000000"&gt;&lt;span style="COLOR: #808080"&gt;--get employees by Department, with years of service from AdventureWorks&lt;/span&gt;
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;SELECT&lt;/span&gt;  &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;TOP&lt;/span&gt; 50 D.[Name] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;AS&lt;/span&gt; [DepartmentName], 
        EMP.[EmployeeId], &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;C&lt;/span&gt;.[FirstName] + &lt;span style="COLOR: #0000ff"&gt;' '&lt;/span&gt; + &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;C&lt;/span&gt;.[LastName] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;AS&lt;/span&gt; [EmployeeName], 
        &lt;span style="COLOR: #808080"&gt;--just an example: really simple, bogus calculation for years of service &lt;/span&gt;
        &lt;span style="COLOR: #808080"&gt;--from start date till now &lt;/span&gt;
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;DATEDIFF&lt;/span&gt;(&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;year&lt;/span&gt;, EMP.[HireDate], &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;GETDATE&lt;/span&gt;()) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;AS&lt;/span&gt; [YearsOfService] 
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;FROM&lt;/span&gt;    &lt;span style="COLOR: #808080"&gt;--Employees &lt;/span&gt;
        HumanResources.[Employee] EMP &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;WITH&lt;/span&gt; (&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;NOLOCK&lt;/span&gt;) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;INNER&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;JOIN&lt;/span&gt; 
            &lt;span style="COLOR: #808080"&gt;--Person details (name) &lt;/span&gt;
            Person.[Contact] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;C&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;WITH&lt;/span&gt; (&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;NOLOCK&lt;/span&gt;) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ON&lt;/span&gt; 
                EMP.[ContactID] = &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;C&lt;/span&gt;.[ContactID] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;INNER&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;JOIN&lt;/span&gt; 
            &lt;span style="COLOR: #808080"&gt;--current/last Department &lt;/span&gt;
            HumanResources.[EmployeeDepartmentHistory] EDH &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;WITH&lt;/span&gt; (&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;NOLOCK&lt;/span&gt;) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ON&lt;/span&gt; 
                EMP.[EmployeeId] = EDH.[EmployeeId] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;AND&lt;/span&gt; 
                EDH.[EndDate] &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;IS&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;NULL&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;INNER&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;JOIN&lt;/span&gt; 
            &lt;span style="COLOR: #808080"&gt;--Department details &lt;/span&gt;
            HumanResources.[Department] D &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;WITH&lt;/span&gt; (&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;NOLOCK&lt;/span&gt;) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ON&lt;/span&gt; 
                EDH.[DepartmentID] = D.[DepartmentID] 
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ORDER&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;BY&lt;/span&gt; D.[Name], EMP.[EmployeeId]&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;2. Create a table in the report.&lt;/strong&gt; For my AdventureWorks sample, I've listed the employee's name and years of service by department groups.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;3. Add the code for assigning a random color based on a passed value.&lt;/strong&gt; This goes under "Properties", "Code". The code is fairly self-explanatory; it creates an empty dictionary called &lt;code&gt;m_dic_KeyAndColors&lt;/code&gt; and each time &lt;code&gt;GetBackgroundColor&lt;/code&gt; is called, checks if the passed item is already in the dictionary. If the passed item is in the dictionary, the color associated with it is returned. If not, new random color is assigned and added to the dictionary before being returned:&lt;/p&gt;
&lt;div style="BORDER-RIGHT: #ececec 1px solid; PADDING-RIGHT: 5px; BORDER-TOP: #ececec 1px solid; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; BORDER-LEFT: #ececec 1px solid; PADDING-TOP: 5px; BORDER-BOTTOM: #ececec 1px solid; BACKGROUND-COLOR: #fcfcfc"&gt;
&lt;pre style="BACKGROUND: #fcfcfc; COLOR: #000000"&gt;&lt;span style="COLOR: #808080"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' Dictionary of passed string and matching colors, populated as it is used&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Private&lt;/span&gt; m_dic_KeyAndColors &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;New&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;System&lt;/span&gt;.Collections.Generic.Dictionary(Of &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt;, &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt;)

&lt;span style="COLOR: #808080"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' New random object, based on code at http://www.developerfusion.co.uk/show/3940/ &lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Private&lt;/span&gt; objRandom &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;New&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;System&lt;/span&gt;.Random(CType(&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;System&lt;/span&gt;.DateTime.&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Now&lt;/span&gt;.Ticks Mod &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;System&lt;/span&gt;.Int32.MaxValue, &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt;))

&lt;span style="COLOR: #808080"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' Returns a set color based on the passed string.&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Public&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Function&lt;/span&gt; GetBackgroundColor(&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ByVal&lt;/span&gt; s &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt;) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt; 

    Try

        &lt;span style="COLOR: #808080"&gt;' does the dictionary have an entry with the passed string and matching color?&lt;/span&gt;
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; m_dic_KeyAndColors.ContainsKey(s) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt;
            &lt;span style="COLOR: #808080"&gt;' return the pre-stored color&lt;/span&gt;
            &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Return&lt;/span&gt; m_dic_KeyAndColors(s)
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Else&lt;/span&gt;
            &lt;span style="COLOR: #808080"&gt;' get a new random color by calling "GetRandomBackgroundColor", add it and the &lt;/span&gt;
            &lt;span style="COLOR: #808080"&gt;' passed string to the dictionary, and return the color&lt;/span&gt;
            m_dic_KeyAndColors.Add(s, GetRandomBackgroundColor())
            &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Return&lt;/span&gt; m_dic_KeyAndColors(s)
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;End&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt;
    Catch ex &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; Exception
        &lt;span style="COLOR: #808080"&gt;' return neutral color&lt;/span&gt;
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Return&lt;/span&gt; &lt;span style="COLOR: #0000ff"&gt;"#ececed"&lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;End&lt;/span&gt; Try

&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;End&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Function&lt;/span&gt;

&lt;span style="COLOR: #808080"&gt;''' &amp;lt;summary&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' Return a random web color where 2 of R, G or B are fixed by the passed&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' "Highest" and "Lowest" hues, and a random value between the two is generated&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' for the remaining. Which values get assigned to R, G and B is also randomised.&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' For .NET-centric explanation of colors, see Dave Lean's blog post at  &lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' http://blogs.msdn.com/davidlean/archive/2009/02/17/sql-reporting-how-to-conditional-color-2-4-functions-for-tables-charts.aspx &lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;/summary&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;param name="Highest"&amp;gt;Highest hue value (0-255), set to light color with low saturation by default&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;param name="Lowest"&amp;gt;Lowest hue value (0-255), set to light color with low saturation by default&amp;lt;/param&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;returns&amp;gt;Hex color string in he format "#RRGGBB"&amp;lt;/returns&amp;gt;&lt;/span&gt;
&lt;span style="COLOR: #808080"&gt;''' &amp;lt;remarks&amp;gt;Adapted from http://www.perlmonks.org/?node_id=305209 &amp;lt;/remarks&amp;gt;&lt;/span&gt;
&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Public&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Function&lt;/span&gt; GetRandomBackgroundColor(Optional &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ByVal&lt;/span&gt; Highest &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = 215, Optional &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;ByVal&lt;/span&gt; Lowest &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = 153) &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt;

    &lt;span style="COLOR: #808080"&gt;' sanity check: ensure "highest" and "lowest" are between 0-255 &lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; Highest &amp;gt; 255 &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt; Highest = 255
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; Highest &amp;lt; 0 &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt; Highest = 0
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; Lowest &amp;gt; 255 &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt; Lowest = 255
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; Lowest &amp;lt; 0 &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt; Lowest = 0
    &lt;span style="COLOR: #808080"&gt;' sanity check: is "highest" higher than "lowest"&lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt; Highest &amp;lt; Lowest &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Then&lt;/span&gt;
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Dim&lt;/span&gt; temp &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt;
        temp = Lowest
        Lowest = Highest
        Highest = temp
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;End&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;If&lt;/span&gt;

    &lt;span style="COLOR: #808080"&gt;' get a random number in the middle of highest and lowest &lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Dim&lt;/span&gt; Middle &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = objRandom.[&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Next&lt;/span&gt;](Lowest, Highest + 1)

    &lt;span style="COLOR: #808080"&gt;' create an array with the 3 values - Highest, Lowest and Middle &lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Dim&lt;/span&gt; a() &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;New&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt;() {Highest, Lowest, Middle}

    &lt;span style="COLOR: #808080"&gt;' randomise the order of the 3 values with Fisher-Yates shuffle &lt;/span&gt;
    &lt;span style="COLOR: #808080"&gt;' see also http://www.codinghorror.com/blog/archives/001015.html &lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;For&lt;/span&gt; i &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = 2 &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;To&lt;/span&gt; 0 Step -1
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Dim&lt;/span&gt; n &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = objRandom.[&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Next&lt;/span&gt;](i + 1)
        &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Dim&lt;/span&gt; temp &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;As&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Integer&lt;/span&gt; = a(i)
        a(i) = a(n)
        a(n) = temp
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Next&lt;/span&gt;

    &lt;span style="COLOR: #808080"&gt;' return a web color string using hex/"X2" formatting&lt;/span&gt;
    &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Return&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;String&lt;/span&gt;.&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Format&lt;/span&gt;(&lt;span style="COLOR: #0000ff"&gt;"#{0:X2}{1:X2}{2:X2}"&lt;/span&gt;, a(0), a(1), a(2))

&lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;End&lt;/span&gt; &lt;span style="FONT-WEIGHT: bold; COLOR: #000084"&gt;Function&lt;/span&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;4. In the background color expression for the table cell to be colored, call "=Code.GetBackgroundColor([YourFieldValue])".&lt;/strong&gt; In my example, the background color expression is &lt;code&gt;"=Code.GetBackgroundColor(Fields!YearsOfService.Value)"&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Here's the end result, &lt;a href="http://thomasswilliams.codeplex.com/Release/ProjectReleases.aspx?ReleaseId=24491"&gt;downloadable from CodePlex&lt;/a&gt;:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://picasaweb.google.co.uk/lh/photo/0e-wwR9nP9_wH0mJRNQT6A?feat=embedwebsite"&gt;&lt;img border="0" alt="" src="http://lh5.ggpht.com/_Ln7LRKt4zEw/SbXVQ_A83PI/AAAAAAAABCU/y_IlM-vLw7Y/s400/color-sample-end-result.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="PADDING-RIGHT: 5px; PADDING-LEFT: 5px; PADDING-BOTTOM: 5px; MARGIN: 5px 20px; PADDING-TOP: 5px; BACKGROUND-COLOR: #ffffce"&gt;&lt;strong&gt;Aside: Why Did I Randomly Generate the Colors?&lt;/strong&gt;&lt;br /&gt;
Initially I had an array of pastel colors that I'd already selected. That was until I came across &lt;a href="http://blogs.msdn.com/davidlean/archive/2009/01/30/sql-reporting-how-to-color-coding-based-on-data-values-for-tables-charts-1-n.aspx"&gt;Dave Lean's series on generating random colors for reports&lt;/a&gt; which explains how to generate random colors and convert decimal to hex. Suitably inspired, I looked around and found a useful snippet to generate light random colors only at &lt;a href="http://www.perlmonks.org/?node_id=305209"&gt;this PERL forum posting&lt;/a&gt; (which forms the basis for my &lt;code&gt;GetRandomBackgroundColor&lt;/code&gt; function).&lt;/p&gt;
&lt;h2&gt;Optional Steps&lt;/h2&gt;
&lt;p&gt;Repeating text can be turned off so that the color "groups" the data together.&lt;/p&gt;
&lt;h2&gt;Limitations&lt;/h2&gt;
&lt;ul&gt;
    &lt;li&gt;Color should not be used as the sole indicator to make distinctions for important data, as there's a percentage of the population who have trouble telling colors apart (color blindness or color deficiency). You can find more information &lt;a href="http://www.toledo-bend.com/colorblind/ishihara.html"&gt;here&lt;/a&gt;. &lt;/li&gt;
    &lt;li&gt;This technique only makes sense on a small scale and I would not use it on large amounts of data. For large amounts of data, groups and sub-groups identify relationships in data better than color alone. Also, with many distinct items, you run the risk of having very similar colors that makes highlighting by color less effective. &lt;/li&gt;
    &lt;li&gt;This technique has only been tested in Visual Studio 2005. &lt;/li&gt;
    &lt;li&gt;As you can see from the finished result, this is not a heatmap. Each item is assigned a new totally random color. &lt;/li&gt;
    &lt;li&gt;Every time the report is run, different random colors will be generated.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;Tags: &lt;a rel="tag" href="http://technorati.com/tag/reporting+services"&gt;reporting services&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/visual"&gt;visual&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/group"&gt;group&lt;/a&gt;, &lt;a rel="tag" href="http://technorati.com/tag/color"&gt;color&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/thomasswilliams/aggbug/2768.aspx" width="1" height="1" /&gt;</description><dc:creator>Thomas Williams</dc:creator></item><item><title>Web state backup/restore..</title><link>http://theruntime.com/blogs/jaykimble/archive/2009/03/17/web-state-backuprestore.aspx</link><pubDate>Tue, 17 Mar 2009 08:35:32 GMT</pubDate><guid isPermaLink="true">http://theruntime.com/blogs/jaykimble/archive/2009/03/17/web-state-backuprestore.aspx</guid><wfw:comment>http://theruntime.com/blogs/jaykimble/comments/2767.aspx</wfw:comment><wfw:commentRss>http://theruntime.com/blogs/jaykimble/comments/commentRss/2767.aspx</wfw:commentRss><comments>http://theruntime.com/blogs/jaykimble/archive/2009/03/17/web-state-backuprestore.aspx#comment</comments><slash:comments>0</slash:comments><trackback:ping>http://theruntime.com/blogs/jaykimble/services/trackbacks/2767.aspx</trackback:ping><source url="http://theruntime.com/blogs/jaykimble/rss.aspx">Web state backup/restore..</source><description>&lt;p&gt;This is an item that i just thought of that is on my wish list of tools to find. i’m sure that if you maintain a web site of any size you have a service that emails you errors or logs them into a database or there is a combination log with an emailed report.&lt;/p&gt;  &lt;p&gt;At my day job we have something like this. We have a couple issues where we have no idea what they are. Mainly because data can change a lot in this particular area, but we’re not 100% sure that this is the case.&lt;/p&gt;  &lt;p&gt;The other thing is that errors can very much be affected by the state of the user (session, cookies, form vars, browser state, etc). i know that not all this can happen, but i’ve started contemplating what a system would look like that backed up as much of this as is possible and allowed a developer to come back in later and restore that error state to (maybe) see the error in it’s original context.&lt;/p&gt;  &lt;p&gt;PS..   &lt;br /&gt;Expect some MIX09 blogging content from me tomorrow because I’ll be there!&lt;/p&gt;&lt;img src="http://theruntime.com/blogs/jaykimble/aggbug/2767.aspx" width="1" height="1" /&gt;</description><dc:creator>Jay Kimble</dc:creator></item></channel></rss>