<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.lukesmith.net/~d/styles/itemcontent.css"?><rss 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/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>Luke Smith</title>
        <link>http://blog.lukesmith.net/Default.aspx</link>
        <description>Write today. Wrong tomorrow</description>
        <language>en-GB</language>
        <copyright>Luke Smith</copyright>
        <generator>Subtext Version 2.1.2.2</generator>
        <image>
            <title>Luke Smith</title>
            <url>http://blog.lukesmith.net/images/RSS2Image.gif</url>
            <link>http://blog.lukesmith.net/Default.aspx</link>
            <width>77</width>
            <height>60</height>
        </image>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.lukesmith.net/LukeSmith" /><feedburner:info uri="lukesmith" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>51.4484</geo:lat><geo:long>-0.9344</geo:long><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.lukesmith.net/LukeSmith" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://www.live.com/?add=http%3A%2F%2Ffeeds.lukesmith.net%2FLukeSmith" src="http://tkfiles.storage.msn.com/x1piYkpqHC_35nIp1gLE68-wvzLZO8iXl_JMledmJQXP-XTBOLfmQv4zhj4MhcWEJh_GtoBIiAl1Mjh-ndp9k47If7hTaFno0mxW9_i3p_5qQw">Subscribe with Live.com</feedburner:feedFlare><item>
            <title>Write today, wrong tomorrow</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/jEo5jUSs1R4/write-today-wrong-tomorrow.aspx</link>
            <description>&lt;p&gt;My blogs been without a subtitle for as long as I can remember, I just couldn’t think of anything “catchy”. But now I have come up with something that I think fits “Write today. Wrong tomorrow”.&lt;/p&gt;  &lt;p&gt;This refers to the constant learning that occurs in the development world. I’m a huge believer that if you look back at code written 6 months ago and think “wow, that was amazing – I wouldn’t do anything differently” then you haven’t learnt anything new since.&lt;/p&gt;  &lt;p&gt;So take whatever I say on this blog with a pinch of salt, I might not necessarily agree with it in 6 months time – that includes the subtitle ;)&lt;/p&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1796.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/45EsVGuaCRM6xRqE4Daevhv2Jzw/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/45EsVGuaCRM6xRqE4Daevhv2Jzw/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/45EsVGuaCRM6xRqE4Daevhv2Jzw/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/45EsVGuaCRM6xRqE4Daevhv2Jzw/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=jEo5jUSs1R4:g0nI-JgvriQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=jEo5jUSs1R4:g0nI-JgvriQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=jEo5jUSs1R4:g0nI-JgvriQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=jEo5jUSs1R4:g0nI-JgvriQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2010/01/18/write-today-wrong-tomorrow.aspx</guid>
            <pubDate>Mon, 18 Jan 2010 16:47:00 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1796.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2010/01/18/write-today-wrong-tomorrow.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1796.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1796.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2010/01/18/write-today-wrong-tomorrow.aspx</feedburner:origLink></item>
        <item>
            <title>Creating website installer using WiX</title>
            <category>Development</category>
            <category>Installers</category>
            <category>WiX</category>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/SXYlqD8gmo0/creating-website-installer-using-wix.aspx</link>
            <description>&lt;p&gt;I’m currently working on a new project and one of the things I want is an easy deployment process. Rather than wait till I actually want to deploy the site to production to put something in place I’ve decided to build it early and use the same process as part of my CI process. Testing the process early and often will mean any issues will be solved sooner rather than on the day of the release.&lt;/p&gt;
&lt;p&gt;I decided to go with an msi installer, so had 2 choices. Either using a Setup Project, that’s included in Visual Studio, or &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt;. &lt;a href="http://wix.sourceforge.net/"&gt;WiX&lt;/a&gt; is far more powerful, and also doesn’t require Visual Studio being installed on the build machine (Setup Projects aren’t supported by MSBuild and so you have to use devenv.exe to build them…urgh).&lt;/p&gt;
&lt;p&gt;WiX is a Windows Installer toolset and you write your installation packages using XML. It’s a Microsoft project and hosted on &lt;a href="http://wix.sourceforge.net/"&gt;sourceforge&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The following uses &lt;a href="http://sourceforge.net/projects/wix/files/"&gt;wix3.0.5419&lt;/a&gt; and requires Visual Studio 2008.&lt;/p&gt;
&lt;h4&gt;Step 1: Download WiX&lt;/h4&gt;
&lt;p&gt;Download WiX from sourceforge. Make sure you also install &lt;a href="http://wix.sourceforge.net/votive.html"&gt;Votive&lt;/a&gt; (included in the WiX installer) which will give you support for creating WiX projects inside Visual Studio with full intellisense.&lt;/p&gt;
&lt;h4&gt;Step 2: Create a new WiX project&lt;/h4&gt;
&lt;p&gt;Simple, just as you would any other Visual Studio project.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_4.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" width="534" height="382" src="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;Step 3: Adding the WixIIsExtension&lt;/h4&gt;
&lt;p&gt;WiX provides a template to work with when creating a new project, which is useful. The first thing we need to do is reference to WiXIIsExtension, which provides us with the tasks needed to create websites and virtual directories from the installer. References are added in the same way as any other project reference, via the Solution Explorer.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_6.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" width="525" height="555" src="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;You then need to add a new xml namespace to the Wix root element in your Product.wxs file. If you don’t do this then I’ve found you cannot make use of the tasks provided by the extension library and will get the error “&lt;em&gt;The Component element contains an unexpected child element 'WebSite'.”&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Add the namespace xmlns:iis=”http://schemas.microsoft.com/wix/IIsExtension”.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_8.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" width="528" height="65" src="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_thumb_3.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;h4&gt;Step 4: Creating the website&lt;/h4&gt;
&lt;p&gt;In the Product.wxs file you can now add a task to create a website in IIS within a Component.&lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_12.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" width="615" height="190" src="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_thumb_5.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;Update the ComponentRef under the Feature Id=”ProductFeature” to point to the Website component, Ctrl+Shift+B and you’ve created an installer that creates a website under IIS.&lt;/p&gt;
&lt;h4&gt;Step 5: Run the installer and view the result&lt;/h4&gt;
&lt;p&gt;Find the installer that is produced in the bin directory and run it. There is no UI for the user to interact with, and a new website is created pointing to C:\Project Files (x86)\WixSampleProject&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;&lt;a rel="lightbox" href="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_14.png"&gt;&lt;img style="BORDER-RIGHT-WIDTH: 0px; DISPLAY: inline; BORDER-TOP-WIDTH: 0px; BORDER-BOTTOM-WIDTH: 0px; BORDER-LEFT-WIDTH: 0px" title="image" border="0" alt="image" width="346" height="253" src="http://blog.lukesmith.net/images/blog_lukesmith_net/WindowsLiveWriter/CreatingaWiXwebsiteinstaller_D7B8/image_thumb_6.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;We’ve not included any files in our installer, for that I use &lt;a href="http://wix.sourceforge.net/manual-wix3/heat.htm"&gt;heat&lt;/a&gt; which I’ll blog about in a future post.&lt;/p&gt;
&lt;p&gt; &lt;/p&gt;
&lt;p&gt;Hope you’ve found this helpful&lt;/p&gt;
&lt;p&gt; &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:7f6063f3-43b6-4a05-8b37-c5ef0802fadf" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/WiX"&gt;WiX&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/msi"&gt;msi&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/installer"&gt;installer&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/website"&gt;website&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1795.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JPLLHXtMlHj1BuKPEtTcVJZqMdk/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JPLLHXtMlHj1BuKPEtTcVJZqMdk/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JPLLHXtMlHj1BuKPEtTcVJZqMdk/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JPLLHXtMlHj1BuKPEtTcVJZqMdk/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=SXYlqD8gmo0:I_BLgQpN6yk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=SXYlqD8gmo0:I_BLgQpN6yk:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=SXYlqD8gmo0:I_BLgQpN6yk:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=SXYlqD8gmo0:I_BLgQpN6yk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2010/01/17/creating-website-installer-using-wix.aspx</guid>
            <pubDate>Sun, 17 Jan 2010 15:47:46 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1795.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2010/01/17/creating-website-installer-using-wix.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1795.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1795.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2010/01/17/creating-website-installer-using-wix.aspx</feedburner:origLink></item>
        <item>
            <title>Reading Geek Night Presentation slides</title>
            <category>Development</category>
            <category>reading geek night</category>
            <category>SOLID Principles</category>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/EcsTMsgi1sU/reading-geek-night-presentation-slides.aspx</link>
            <description>&lt;p&gt;I recently gave a 15minute presentation covering the &lt;a href="http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf"&gt;SOLID Principles&lt;/a&gt; at the &lt;a href="http://readinggeeknight.com/"&gt;Reading Geek Night&lt;/a&gt;, not enough time to go into each principle but hopefully enough that people went away with some understanding of the principles and were encouraged to learn more about them.&lt;/p&gt;
&lt;p&gt;I highly recommend watching this video of &lt;a href="http://blog.objectmentor.com/"&gt;"UncleBob"&lt;/a&gt; at the Norwegian Developers Conference 2009 on &lt;a href="http://weblogs.asp.net/rosherove/archive/2009/08/19/ndc-video-robert-martin-s-o-l-i-d-principles-of-oo-class-design.aspx"&gt;SOLID Principles of OO class design&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I’ve also uploaded my slides of my presentation to slideshare.&lt;/p&gt;
&lt;div style="TEXT-ALIGN: left; WIDTH: 425px" id="__ss_2684744"&gt;&lt;a style="MARGIN: 12px 0px 3px; DISPLAY: block; FONT: 14px helvetica,arial,sans-serif; TEXT-DECORATION: underline" title="The Solid Principles" href="http://www.slideshare.net/lukesmith/the-solid-principles"&gt;The Solid Principles&lt;/a&gt;&lt;embed height="355" type="application/x-shockwave-flash" width="425" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=thesolidprinciples-091209133525-phpapp02&amp;amp;stripped_title=the-solid-principles" allowscriptaccess="always" allowfullscreen="true" /&gt;
&lt;div style="FONT-FAMILY: tahoma,arial; HEIGHT: 26px; FONT-SIZE: 11px; PADDING-TOP: 2px"&gt;View more &lt;a style="TEXT-DECORATION: underline" href="http://www.slideshare.net/"&gt;presentations&lt;/a&gt; from &lt;a style="TEXT-DECORATION: underline" href="http://www.slideshare.net/lukesmith"&gt;lukesmith&lt;/a&gt;.&lt;/div&gt;
&lt;/div&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1794.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/JEuJnT0q28un8qFti0IT5rq2_9Q/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JEuJnT0q28un8qFti0IT5rq2_9Q/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/JEuJnT0q28un8qFti0IT5rq2_9Q/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/JEuJnT0q28un8qFti0IT5rq2_9Q/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=EcsTMsgi1sU:IFTnrhZzjtY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=EcsTMsgi1sU:IFTnrhZzjtY:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=EcsTMsgi1sU:IFTnrhZzjtY:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=EcsTMsgi1sU:IFTnrhZzjtY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/12/09/reading-geek-night-presentation-slides.aspx</guid>
            <pubDate>Wed, 09 Dec 2009 19:51:41 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1794.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/12/09/reading-geek-night-presentation-slides.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1794.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1794.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/12/09/reading-geek-night-presentation-slides.aspx</feedburner:origLink></item>
        <item>
            <title>Now using github</title>
            <category>Development</category>
            <category>linq2js</category>
            <category>vegeojson</category>
            <category>git</category>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/5fhmw3OTupE/now-using-github.aspx</link>
            <description>&lt;p /&gt;  &lt;p&gt;I've decided to move my open source projects over to &lt;a href="http://github.com/lukesmith"&gt;github&lt;/a&gt;, rather than hosting them on a private subversion server where they aren’t very accessible.&lt;/p&gt;  &lt;p&gt;From what I've seen, and heard, github is a great source control repository, I only hope there is a visual studio addin as good as visualsvn in the pipeline.    &lt;br /&gt;&lt;/p&gt;  &lt;p&gt;Currently my 2 JavaScript libraries have been moved over&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="http://github.com/lukesmith/linq2js"&gt;linq2js&lt;/a&gt; is a JavaScript library providing an api similar to that of linq in the .net framework. It features a near complete method for method implementation of those found on the IEnumerable interface as well as lazy evaluation of queries. &lt;/li&gt;    &lt;li&gt;&lt;a href="http://github.com/lukesmith/vegeojson"&gt;vegeojson&lt;/a&gt; is a helper utility i wrote for drawing shapes on a virtual earth (now bing) map given an object in the &lt;a href="http://geojson.org/"&gt;geojson&lt;/a&gt; format. &lt;/li&gt; &lt;/ul&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1793.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/EssQX-9IPTZCCQMtp6gOy7XA1H8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EssQX-9IPTZCCQMtp6gOy7XA1H8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/EssQX-9IPTZCCQMtp6gOy7XA1H8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/EssQX-9IPTZCCQMtp6gOy7XA1H8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=5fhmw3OTupE:zEw6uI7x-hE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=5fhmw3OTupE:zEw6uI7x-hE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=5fhmw3OTupE:zEw6uI7x-hE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=5fhmw3OTupE:zEw6uI7x-hE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/11/01/now-using-github.aspx</guid>
            <pubDate>Sun, 01 Nov 2009 12:24:15 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1793.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/11/01/now-using-github.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1793.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1793.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/11/01/now-using-github.aspx</feedburner:origLink></item>
        <item>
            <title>aspnet RoleProvider woes with StructureMap and NHibernate</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/FG4Qzq-An0o/aspnet-roleprovider-woes-with-structuremap-and-nhibernate.aspx</link>
            <description>&lt;p&gt;I just fixed a bug that has plagued me for the last 2 nights. NHibernate was throwing completely random exceptions, rolling back transactions with no real consistency other than always happening on requests made after the application had started and almost always within my RoleProvider. I couldn’t figure out what the heck was happening.&lt;/p&gt;  &lt;p&gt;Some of the exceptions:&lt;/p&gt;  &lt;blockquote&gt;   &lt;p&gt;“Could not synchronize database state with session”&lt;/p&gt;    &lt;p&gt;“Rollback failed - System.InvalidOperationException: This SqlTransaction has completed; it is no longer usable.”&lt;/p&gt;    &lt;p&gt;“Commit failed - System.NullReferenceException: Object reference not set to an instance of an object.”&lt;/p&gt;    &lt;p&gt;“Could not synchronize database state with session - NHibernate.ADOException: There was a problem converting an IDataReader to NDataReader”&lt;/p&gt;    &lt;p&gt;“System.ObjectDisposedException: Session was disposed of or closed Object name: 'ISession'.”&lt;/p&gt; &lt;/blockquote&gt;  &lt;p&gt;I’m using &lt;a href="http://structuremap.sourceforge.net/"&gt;StructureMap&lt;/a&gt; to Dependency Inject an NHibernate.ISession into my NHibernateRepositoryBase class, and inject the repository to my Service class. Because you can’t dependency inject into a AspNet RoleProvider I’m using the StructureMap ObjectFactory.GetInstance&amp;lt;T&amp;gt; to get me an instance of my IUserService. I was placing this in the constructor, setting a private field that was then accessed in all the overridden methods I am implementing.&lt;/p&gt;  &lt;p&gt;And this was what got me.&lt;/p&gt;  &lt;p&gt;The reason that the exceptions would happen on any requests made after the application had started was because &lt;a href="http://msdn.microsoft.com/en-us/library/aa479020.aspx"&gt;AspNet Providers&lt;/a&gt; are created once per application and reused throughout the duration of the application. This meant when the instance was created it would have a reference to the NHibernate.ISession for that request, but since the ISession is closed in application_endrequest subsequent requests the RoleProvider was now referencing an ISession that was closed.&lt;/p&gt;  &lt;p&gt;My solution was to remove the ObjectFactory.GetInstance&amp;lt;T&amp;gt; field assignments to within each method that needed the service, that way ensuring that the NHibernate.ISession for the current request would be used.&lt;/p&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1792.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/_mnPOQjsmu8vvgivMPhKDBzu4oc/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_mnPOQjsmu8vvgivMPhKDBzu4oc/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/_mnPOQjsmu8vvgivMPhKDBzu4oc/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/_mnPOQjsmu8vvgivMPhKDBzu4oc/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=FG4Qzq-An0o:CjxpiIBm8n8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=FG4Qzq-An0o:CjxpiIBm8n8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=FG4Qzq-An0o:CjxpiIBm8n8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=FG4Qzq-An0o:CjxpiIBm8n8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/06/24/aspnet-roleprovider-woes-with-structuremap-and-nhibernate.aspx</guid>
            <pubDate>Wed, 24 Jun 2009 22:06:39 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1792.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/06/24/aspnet-roleprovider-woes-with-structuremap-and-nhibernate.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1792.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1792.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/06/24/aspnet-roleprovider-woes-with-structuremap-and-nhibernate.aspx</feedburner:origLink></item>
        <item>
            <title>ASUS Eee PC 1000HE Review</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/MLTZ4KxUrBI/asus-eee-pc-1000he-review.aspx</link>
            <description>&lt;p&gt;I’ve been on the lookout for a netbook for a few months. I’ve been tempted by the &lt;a href="http://www.amazon.co.uk/gp/product/B0019DOEAE?ie=UTF8&amp;amp;tag=lukesmithcouk-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B0019DOEAE"&gt;HP Mini-Note 2133&lt;/a&gt;, &lt;a href="http://www.amazon.co.uk/gp/product/B001O16D6Y?ie=UTF8&amp;amp;tag=lukesmithcouk-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B001O16D6Y"&gt;Dell Mini 9&lt;/a&gt; and &lt;a href="http://www1.euro.dell.com/content/products/productdetails.aspx/laptop-inspiron-10?c=uk&amp;amp;cs=ukdhs1&amp;amp;l=en&amp;amp;s=dhs&amp;amp;ref=homepg"&gt;Dell Mini 10&lt;/a&gt;. Each had things I liked about them but none made me part with my cash.&lt;/p&gt;  &lt;p&gt;The Dell Mini 9 looks great, but after seeing it in the shops and being able to get my hands on it the keyboard was far too small for me. So when the Dell Mini 10 was announced I thought “great, a larger screen and larger keyboard so it should be OK” but unfortunately you can’t upgrade the RAM, so you’re stuck at 1GB, not enough to comfortably run Windows 7.&lt;/p&gt;  &lt;p&gt;In the end I was looking at the &lt;a href="http://www.amazon.co.uk/gp/product/B001J2YZ04?ie=UTF8&amp;amp;tag=lukesmithcouk-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B001J2YZ04"&gt;Asus Eee PC 1000H&lt;/a&gt; which lead my to spot the &lt;a href="http://www.amazon.co.uk/gp/product/B001UE8LAG?ie=UTF8&amp;amp;tag=lukesmithcouk-21&amp;amp;linkCode=as2&amp;amp;camp=1634&amp;amp;creative=19450&amp;amp;creativeASIN=B001UE8LAG"&gt;1000HE&lt;/a&gt;. With a whopping 9.5 hours battery life, 1.66GHz Intel Atom CPU (the 1000H comes with a 1.6GHz), 10” screen, 120GB HDD, built in 1.3MP camera and multi touch trackpad temptation became too much. So I ordered one, along with a new 2GB stick of RAM to replace the standard 1GB.&lt;/p&gt;  &lt;p&gt;First impressions were good, it looks great, it’s not too heavy and the screen is nice and bright. I booted up with the default XP installation to check that everything was working and then proceeded to install the Windows 7 Beta released a few months back.&lt;/p&gt;  &lt;p&gt;Installing Windows 7 was amazingly quick, taking about 30-40 minutes in total (I installed via hosting the ISO image using the &lt;a href="http://www.softwarepatch.com/windows/xpvirtualcd.html"&gt;Microsoft Virtual CD-ROM utility&lt;/a&gt; under XP).&lt;/p&gt;  &lt;p&gt;Windows 7 had no problems finding drivers, except for the LAN driver (you can download the XP driver from the ASUS website that works under Windows 7). Everything “just works”. CPU usage is currently sitting around 20% with Outlook, Live Writer, twhirl and IE8 open.&lt;/p&gt;  &lt;p&gt;The keyboard isn’t full size, but is perfectly big enough even for my large hands. The only issue, as with getting any new keyboard, is the placement of some keys, Home/End/PgUp/PgDn are all function keys, which is annoying. It’s nothing that a few days of use won’t solve, so my fingers memorise the locations.&lt;/p&gt;  &lt;p&gt;The one thing which I wish was present was a nipple. I really hate trackpads to control the mouse cursor. They can’t cost much to include, and theres enough room in the keyboard for one to be put. However I do like the multitouch functionality of the trackpad, especially for vertical scrolling.&lt;/p&gt;  &lt;p&gt;Battery life appears excellent, I seem to be getting about 7 hours out of it with the wireless card turned on.&lt;/p&gt;  &lt;p&gt;My next task was to install some software, Office 2007 and Visual Studio 2008, which because I don’t have an external DVD drive I had to do via sharing the DVD drive on my desktop over the network. VS2008 took about an hour, which tends to be the usual amount of time. However when installing Visual Studio 2008 SP1 I began getting issues with the graphics drivers, the machine became unusable and unresponsive with the graphics flickering and disappearing every few seconds. I left the install to run and it completed after about 2 hours.&lt;/p&gt;  &lt;p&gt;Overall I’m very happy with the device. Netbooks are the perfect device for throwing in your rucksack for use when commuting, which I do alot of, and so the battery life is a real bonus with the Eee PC 1000HE. Windows 7 is perfect for netbooks, hopefully by RTM there will be some more performance boost and the graphics drivers will be improved.&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:defd41ef-da1f-4f96-a3cb-ff9237d0b941" class="wlWriterEditableSmartContent"&gt;Technorati Tags: &lt;a href="http://technorati.com/tags/ASUS+Eee+PC+1000HE" rel="tag"&gt;ASUS Eee PC 1000HE&lt;/a&gt;,&lt;a href="http://technorati.com/tags/netbook" rel="tag"&gt;netbook&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1791.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/99yvlJJmuMSFVcQgHTueq_Ix9VI/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/99yvlJJmuMSFVcQgHTueq_Ix9VI/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/99yvlJJmuMSFVcQgHTueq_Ix9VI/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/99yvlJJmuMSFVcQgHTueq_Ix9VI/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=MLTZ4KxUrBI:8Ckc-BR9o5E:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=MLTZ4KxUrBI:8Ckc-BR9o5E:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=MLTZ4KxUrBI:8Ckc-BR9o5E:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=MLTZ4KxUrBI:8Ckc-BR9o5E:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/03/21/asus-eee-pc-1000he-review.aspx</guid>
            <pubDate>Sat, 21 Mar 2009 17:03:28 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1791.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/03/21/asus-eee-pc-1000he-review.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1791.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1791.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/03/21/asus-eee-pc-1000he-review.aspx</feedburner:origLink></item>
        <item>
            <title>Generating and enforcing that any link and request is lowercase with ASP.NET MVC</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/rodt-UCHrWI/generating-and-enforcing-that-any-link-and-request-is-lowercase-with-aspnet-mvc.aspx</link>
            <description>&lt;em&gt;This post is based off 2 other &lt;/em&gt;&lt;a href="http://goneale.wordpress.com/2008/12/19/lowercase-route-urls-in-aspnet-mvc/"&gt;&lt;em&gt;blog&lt;/em&gt;&lt;/a&gt;&lt;em&gt; &lt;/em&gt;&lt;a href="http://www.makiwa.com/index.php/2008/05/31/lowercase-mvc-route-urls/"&gt;&lt;em&gt;posts&lt;/em&gt;&lt;/a&gt;&lt;em&gt; I found which helped me come up with my solution with some slight modifications on their code.&lt;/em&gt;

For my new project I’m having my URLs all lowercase, as some search engines interpret ‘/Home’ and ‘/home’ as two different locations. So the problem became “how can I enforce all my URLs get rendered as lowercase, and how do I force a request to a URL with an uppercase letter to redirect to the lowercase equivalent?”.

Because I’m using ASP.NET MVC I needed a way to get the Routing engine to render the URL as lowercase when using an ActionLink. Asking the question over on &lt;a href="http://stackoverflow.com/questions/495006/forcing-actionlinks-to-be-rendered-as-lowercase"&gt;stackoverflow&lt;/a&gt; I got a solution that involved creating my own class that inherits from Route, which I’ve called LowercaseRoute, and overrides the GetVirtualPath method. I also created a MapLowercaseRoute extension method on the RouteCollection class that allows me to map a LowercaseRoute easily.

&lt;pre class="brush:csharp"&gt;
public class LowercaseRoute : Route
{
public LowercaseRoute(string url, IRouteHandler routeHandler)
: base(url, routeHandler)
{
}

public LowercaseRoute(string url, RouteValueDictionary defaults, IRouteHandler routeHandler)
: base(url, defaults, routeHandler)
{
}

public LowercaseRoute(string url, RouteValueDictionary defaults, RouteValueDictionary constraints, IRouteHandler routeHandler)
: base(url, defaults, constraints, routeHandler)
{
}

public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
{
var virtualPath = base.GetVirtualPath(requestContext, values);

if (virtualPath != null)
{
virtualPath.VirtualPath = virtualPath.VirtualPath.ToLowerInvariant();
}

return virtualPath;
}
}
&lt;/pre&gt;

Next up is to ensure that any request to the site is enforced to be lowercased, and perform a 301 redirect if not. For this I’ve created a HttpModule, EnforceLowecaseRequestHttpModule, which I then register in the web.config. I could have put this directly into the global.asax file but I wanted to make it easily reusable on future projects.

&lt;pre class="brush:csharp"&gt;
public class EnforceLowercaseRequestHttpModule : IHttpModule
{
public void Dispose()
{
}

public void Init(HttpApplication context)
{
context.BeginRequest += context_BeginRequest;
}

private void context_BeginRequest(object sender, EventArgs e)
{
HttpApplication application = (HttpApplication)sender;

// If upper case letters are found in the URL, redirect to lower case URL (keep querystring the same).
string requestedUrl = ((application.Context.Request.Url.Scheme + "://" + application.Context.Request.Url.Authority + application.Context.Request.Url.AbsolutePath));

if (Regex.IsMatch(requestedUrl, @"[A-Z]") == true)
{
string lowercaseUrl = requestedUrl.ToLower();
lowercaseUrl += HttpContext.Current.Request.Url.Query;

application.Context.Response.Clear();
application.Context.Response.Status = "301 Moved Permanently";
application.Context.Response.AddHeader("Location", lowercaseUrl);
application.Context.Response.End();
}
}
}
&lt;/pre&gt;
&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:e48706f6-baf5-43c5-92b7-fa080c345d41" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/lowercase+urls"&gt;lowercase urls&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/asp.net+mvc"&gt;asp.net mvc&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/httpmodule"&gt;httpmodule&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/Routing"&gt;Routing&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1790.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/v_GhCRITXLZdNIsgYBktsHOFmd0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v_GhCRITXLZdNIsgYBktsHOFmd0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/v_GhCRITXLZdNIsgYBktsHOFmd0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/v_GhCRITXLZdNIsgYBktsHOFmd0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=rodt-UCHrWI:zMHmaLJT7p8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=rodt-UCHrWI:zMHmaLJT7p8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=rodt-UCHrWI:zMHmaLJT7p8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=rodt-UCHrWI:zMHmaLJT7p8:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/02/01/generating-and-enforcing-that-any-link-and-request-is-lowercase-with-aspnet-mvc.aspx</guid>
            <pubDate>Sun, 01 Feb 2009 18:02:02 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1790.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/02/01/generating-and-enforcing-that-any-link-and-request-is-lowercase-with-aspnet-mvc.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1790.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1790.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/02/01/generating-and-enforcing-that-any-link-and-request-is-lowercase-with-aspnet-mvc.aspx</feedburner:origLink></item>
        <item>
            <title>JavaScript variable generation for ASP.NET MVC</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/DNzej0JSci0/javascript-generator-for-aspnet-mvc.aspx</link>
            <description>&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/01/27/asp-net-mvc-1-0-release-candidate-now-available.aspx"&gt;RC1&lt;/a&gt; of the &lt;a href="http://www.asp.net/mvc/"&gt;ASP.NET MVC framework&lt;/a&gt; adds a new ActionResult, JavaScriptResult. This class takes a string and returns a response with the string with the required ContentType.

So now theres a built in (very simple) ActionResult for returning JavaScript what about generating the JavaScript string on the server to return?

One thing I do alot is to recreate service side enums on the client in JavaScript, so rather than checking values I can use names, which improves the readability of the javascript. However this requires both the server and the client to be kept in sync, which can be a pain.

To resolve this issue I’ve created a JavaScriptGenerator class which handles serialization of objects and Enum types as variables and generates the JavaScriptResult, as well as a helper method to take a controller name and action name and insert the required &amp;lt;script .. /&amp;gt; tag into the markup.

Note I’ve created my own JavaScriptHelper class, similar to HtmlHelper, that I extend with extension methods the are javascript specific. I’ve also got a bunch of other extension methods for registering variables in the html itself as well as adding the &amp;lt;script /&amp;gt; tag for a specified filename.

&lt;pre class="brush:csharp"&gt;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web.Mvc;
using System.Web.Script.Serialization;

namespace LukeSmith.Web.Mvc.JavaScript
{
    public class JavaScriptGenerator
    {
        private StringBuilder builder;

        /// &lt;summary&gt;
        /// Initializes a new instance of the &lt;see cref="JavaScriptGenerator" /&gt; class.
        /// &lt;/summary&gt;
        public JavaScriptGenerator()
        {
            builder = new StringBuilder();
        }

        /// &lt;summary&gt;
        /// Generates a javascript variable from enum.
        /// &lt;/summary&gt;
        /// &lt;param name="name" /&gt;The name to give the javascript variable.
        /// &lt;param name="enumType" /&gt;Type of the enum.
        /// &lt;returns&gt;
        /// Current instance of the &lt;see cref="JavaScriptGenerator" /&gt;.
        /// &lt;/returns&gt;
        /// &lt;exception cref="InvalidOperationExceptions" /&gt;
        public JavaScriptGenerator GenerateVariableFromEnum(string name, Type enumType)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            if (enumType.IsEnum)
            {
                Array values = Enum.GetValues(enumType);
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                Dictionary&lt;string object=""&gt; dictionary =new Dictionary&lt;/string&gt;&lt;string ,object=""&gt;();

                foreach (var value in values)
                {
                    string enumName = Enum.GetName(enumType, value);

                    dictionary.Add(enumName, value);
                }

                builder.Append(string.Format("var {0} = {1};", name, serializer.Serialize(dictionary)));
            }
            else
            {
                throw new InvalidOperationException("Cannot generate JavaScript code when enumType is not an Enum.");
            }

            return this;
        }

        /// &lt;summary&gt;
        /// Generates a javascript variable from an object.
        /// &lt;/summary&gt;
        /// &lt;param name="name" /&gt;The name to give the javascript variable.
        /// &lt;param name="value" /&gt;The value.
        /// &lt;returns&gt;
        /// Current instance of the &lt;see cref="JavaScriptGenerator" /&gt;.
        /// &lt;/returns&gt;
        public JavaScriptGenerator GenerateVariableFromObject(string name, object value)
        {
            List&lt;javascriptconverter&gt; converters = new List&lt;/javascriptconverter&gt;&lt;javascriptconverter&gt;();

            return this.GenerateVariableFromObject(name, value, converters);
        }

        /// &lt;summary&gt;
        /// Generates a javascript variable from an object.
        /// &lt;/summary&gt;
        /// &lt;param name="name" /&gt;The name to give the javascript variable.
        /// &lt;param name="value" /&gt;The value.
        /// &lt;param name="converter" /&gt;The &lt;see cref="JavaScriptConverter" /&gt; to use to convert the &lt;paramref name="value" /&gt;.
        /// &lt;returns&gt;
        /// Current instance of the &lt;see cref="JavaScriptGenerator" /&gt;.
        /// &lt;/returns&gt;
        public JavaScriptGenerator GenerateVariableFromObject(string name, object value, JavaScriptConverter converter)
        {
            List&lt;/javascriptconverter&gt;&lt;javascriptconverter&gt; converters = new List&lt;/javascriptconverter&gt;&lt;javascriptconverter&gt;();
            converters.Add(converter);

            return this.GenerateVariableFromObject(name, value, converters);
        }

        /// &lt;summary&gt;
        /// Generates a javascript variable from an object.
        /// &lt;/summary&gt;
        /// &lt;param name="name" /&gt;The name to give the javascript variable.
        /// &lt;param name="value" /&gt;The value.
        /// &lt;param name="converters" /&gt;An &lt;see cref="IEnumerable" /&gt; of &lt;see cref="JavaScriptConverter" /&gt; to use to convert the &lt;paramref name="value" /&gt;.
        /// &lt;returns&gt;
        /// Current instance of the &lt;see cref="JavaScriptGenerator" /&gt;.
        /// &lt;/returns&gt;
        public JavaScriptGenerator GenerateVariableFromObject(string name, object value, IEnumerable&lt;/javascriptconverter&gt;&lt;javascriptconverter&gt; converters)
        {
            if (string.IsNullOrEmpty(name))
            {
                throw new ArgumentNullException("name");
            }

            JavaScriptSerializer serializer = new JavaScriptSerializer();
            serializer.RegisterConverters(converters);

            builder.Append(string.Format("var {0} = {1};", name, serializer.Serialize(value)));

            return this;
        }

        /// &lt;summary&gt;
        /// Generates the &lt;see cref="JavaScriptResult" /&gt;.
        /// &lt;/summary&gt;
        /// &lt;returns /&gt;
        public JavaScriptResult Generate()
        {
            return new JavaScriptResult() { Script = this.ToString() };
        }

        /// &lt;summary&gt;
        /// Returns a &lt;see cref="T:System.String" /&gt; that represents the current &lt;see cref="T:System.Object" /&gt;.
        /// &lt;/summary&gt;
        /// &lt;returns&gt;
        /// A &lt;see cref="T:System.String" /&gt; that represents the current &lt;see cref="T:System.Object" /&gt;.
        /// &lt;/returns&gt;
        public override string ToString()
        {
            return builder.ToString();
        }
    }
}
&lt;/javascriptconverter&gt;&lt;/string&gt;&lt;/pre&gt;

And the code for the helper method
 
&lt;pre class="brush:csharp"&gt;
public static string ScriptInclude(this JavaScriptHelper javaScriptHelper, string actionName, string controllerName)
        {
            UrlHelper helper = new UrlHelper(javaScriptHelper.ViewContext.RequestContext);
            string url = helper.Action(actionName, controllerName);

            return string.Format("&lt;script type="\&amp;quot;text/javascript\&amp;quot;" src="\&amp;quot;{0}\&amp;quot;"&gt;&lt;/script&gt;{1}", url, Environment.NewLine);
        }
&lt;/pre&gt;

&lt;div id="scid:0767317B-992E-4b12-91E0-4F059A8CECA8:058ce707-037a-4e5c-a774-76a1a87494e6" class="wlWriterEditableSmartContent" style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px"&gt;Technorati Tags: &lt;a rel="tag" href="http://technorati.com/tags/asp.net+mvc"&gt;asp.net mvc&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/JavaScript"&gt;JavaScript&lt;/a&gt;,&lt;a rel="tag" href="http://technorati.com/tags/JavaScriptResult"&gt;JavaScriptResult&lt;/a&gt;&lt;/div&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1789.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/ug8pLAQr3RYimml4IcMMGJ6V-88/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ug8pLAQr3RYimml4IcMMGJ6V-88/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/ug8pLAQr3RYimml4IcMMGJ6V-88/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/ug8pLAQr3RYimml4IcMMGJ6V-88/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=DNzej0JSci0:1CKI1pAa3EU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=DNzej0JSci0:1CKI1pAa3EU:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=DNzej0JSci0:1CKI1pAa3EU:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=DNzej0JSci0:1CKI1pAa3EU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2009/01/31/javascript-generator-for-aspnet-mvc.aspx</guid>
            <pubDate>Sat, 31 Jan 2009 14:01:28 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1789.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2009/01/31/javascript-generator-for-aspnet-mvc.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1789.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1789.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2009/01/31/javascript-generator-for-aspnet-mvc.aspx</feedburner:origLink></item>
        <item>
            <title>ASP.NET MVC</title>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/GZQLXY6x7pU/aspnet-mvc.aspx</link>
            <description>&lt;p&gt;WebForms are the existing technology in ASP.NET for web applications, which have been around since the beginning of ASP.NET. However, despite being mature and having a large developer base they aren’t ‘all that’. It’s been said that WebForms are “web development for VB Developers”, in that the drag ‘n’ drop and double clicking to add an event handler for a button eases the migration from Windows Development to the web. The problem with this is that WebForms brings a state-based system (via ViewState) to the web, that is fundamentally stateless. Added onto this the complex page-life cycle of the WebForms model and the lack of separating of concerns, WebForms isn’t really suitable for building maintainable and testable web applications.&lt;/p&gt;  &lt;p&gt;ASP.NET MVC is built on the ASP.NET framework, so existing WebForms developers can make use of the existing classes and framework knowledge they possess (Forms/Windows Authentication, Membership Roles, Session/Profile state, Health Monitoring etc…). ASP.NET MVC projects also have the added benefit that they can include traditional WebForms pages and User Controls (though I wouldn’t recommend mixing the two if you can help it), so the transition can be made without throwing all your existing pages away.&lt;/p&gt;  &lt;p&gt;By default ASP.NET ships with the WebForms syntax View Engine, however third party view engines can easily be used with a few additions to the web.config file and global.asax. The best ViewEngine I’ve seen is &lt;a href="http://sparkviewengine.com/"&gt;SparkViewEngine&lt;/a&gt;. This engine allows ‘&lt;em&gt;the html to dominate the flow and the code to fit seamlessly&lt;/em&gt;’, losing the horrible &amp;lt;% %&amp;gt; tags which can make the default viewengine unreadable.&lt;/p&gt;  &lt;p&gt;Overall I’m very impressed with the MVC framework, and how easy it is to pick up. The time its taken to learn has been minimal and hasn’t affected the time it’s taken to use it on my current project. I can see the benefits it will bring in the future, including having greater confidence of releases (due to unit testing) and the maintainability that the MVC pattern enforces via the separation of concerns.&lt;/p&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1788.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/XSJ1ppp5oXPQT3oxKjdx78iHyJ8/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XSJ1ppp5oXPQT3oxKjdx78iHyJ8/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/XSJ1ppp5oXPQT3oxKjdx78iHyJ8/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/XSJ1ppp5oXPQT3oxKjdx78iHyJ8/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=GZQLXY6x7pU:2lciFZdYPaQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=GZQLXY6x7pU:2lciFZdYPaQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=GZQLXY6x7pU:2lciFZdYPaQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=GZQLXY6x7pU:2lciFZdYPaQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2008/12/13/aspnet-mvc.aspx</guid>
            <pubDate>Sat, 13 Dec 2008 00:12:58 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1788.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2008/12/13/aspnet-mvc.aspx#feedback</comments>
            <slash:comments>1</slash:comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1788.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1788.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2008/12/13/aspnet-mvc.aspx</feedburner:origLink></item>
        <item>
            <title>Linq2JS &amp;#8211; A JavaScript library for writing Linq-like expressions</title>
            <category>linq2js</category>
            <link>http://feeds.lukesmith.net/~r/LukeSmith/~3/oOR9Voi2Sxc/linq2js-a-javascript-library-for-writing-linq-like-expressions.aspx</link>
            <description>It all started when I was having to convert some C# to JavaScript, so was needing quite a bit of collection manipulation. It’s frustrating going back to lots of for loops when you’ve been blessed with LINQ for a year. So after 20 hours of solid coding one weekend (the first implementation was written in 10 hours with the second 10 tidying things up) I created Linq2JS. I’m very happy with how its turned out, however some things are still lacking (building an expression tree to improve the performance). Over the past 2 weeks I’ve been documenting, writing unit tests and fixing bugs that the unit tests have uncovered (note to self: unit tests should be done first) and finally released the first fully tested version (1.2). The whole thing comes in at under 20KB minified, so it’s not huge even though there's nearly 2000 lines of code in the un-minified version. I’ve setup a &lt;a href="http://linq2js.com"&gt;wiki&lt;/a&gt;, where I will be hosting documentation for any future projects I do, and have made a start documenting all the functionality of &lt;a href="http://linq2js.com"&gt;Linq2JS&lt;/a&gt;.
&lt;h3&gt; &lt;/h3&gt;
&lt;h3&gt;Example&lt;/h3&gt;
A brief example of using Linq2JS
&lt;pre class="brush:js"&gt;var animals = [];
animals.push({ type: AnimalType.Dog, name: "Rover", age: 13, children: [] });
animals.push({ type: AnimalType.Cat, name: "Fluffy", age: 1, children: [] });
animals.push({ type: AnimalType.Dog, name: "Rex", age: 12, children: ["Rover"] });
animals.push({ type: AnimalType.Fish, name: "Goldie", age: 3, children: ["Scales", "Goldie"] });
animals.push({ type: AnimalType.Cat, name: "Fudge", age: 20, children: ["Digby", "Kitty"] });
animals.push({ type: AnimalType.Cat, name: "Digby", age: 2, children: [] });
animals.push({ type: AnimalType.Cat, name: "Kitty", age: 4, children: [] });
animals.push({ type: AnimalType.Dog, name: "Rover", age: 3, children: [] });
animals.push({ type: AnimalType.Fish, name: "Scales", age: 2, children: [] });
animals.push({ type: AnimalType.Fish, name: "Goldie", age: 1, children: [] });

var source = new Enumerable(animals);  // or = $e(animals)

var result = source.where(function(item) {
    return item.age &amp;gt; 9;
}).select(function(item) {
    return item.name + " is " + item.age + " years old";
}).execute();
&lt;/pre&gt;&lt;img src="http://blog.lukesmith.net/aggbug/1787.aspx" width="1" height="1" /&gt;
&lt;p&gt;&lt;a href="http://feedads.g.doubleclick.net/~a/w_UsOEQHYpuCN7xk3MfgjazUQe0/0/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w_UsOEQHYpuCN7xk3MfgjazUQe0/0/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;br/&gt;
&lt;a href="http://feedads.g.doubleclick.net/~a/w_UsOEQHYpuCN7xk3MfgjazUQe0/1/da"&gt;&lt;img src="http://feedads.g.doubleclick.net/~a/w_UsOEQHYpuCN7xk3MfgjazUQe0/1/di" border="0" ismap="true"&gt;&lt;/img&gt;&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=oOR9Voi2Sxc:KzhbZeJ4gLQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=oOR9Voi2Sxc:KzhbZeJ4gLQ:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?i=oOR9Voi2Sxc:KzhbZeJ4gLQ:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.lukesmith.net/~ff/LukeSmith?a=oOR9Voi2Sxc:KzhbZeJ4gLQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/LukeSmith?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;</description>
            <dc:creator>Luke Smith</dc:creator>
            <guid isPermaLink="false">http://blog.lukesmith.net/archive/2008/12/13/linq2js-a-javascript-library-for-writing-linq-like-expressions.aspx</guid>
            <pubDate>Sat, 13 Dec 2008 00:12:17 GMT</pubDate>
            <wfw:comment>http://blog.lukesmith.net/comments/1787.aspx</wfw:comment>
            <comments>http://blog.lukesmith.net/archive/2008/12/13/linq2js-a-javascript-library-for-writing-linq-like-expressions.aspx#feedback</comments>
            <wfw:commentRss>http://blog.lukesmith.net/comments/commentRss/1787.aspx</wfw:commentRss>
            <trackback:ping>http://blog.lukesmith.net/services/trackbacks/1787.aspx</trackback:ping>
        <feedburner:origLink>http://blog.lukesmith.net/archive/2008/12/13/linq2js-a-javascript-library-for-writing-linq-like-expressions.aspx</feedburner:origLink></item>
    </channel>
</rss>
