<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns: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:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
    <channel>
        <title>CodeClimber</title>
        <link>http://codeclimber.net.nz/Default.aspx</link>
        <description>Climbing the Cliffs of C#</description>
        <language>en-NZ</language>
        <copyright>Simone Chiaretta</copyright>
        <generator>Subtext Version 2.5.1.0</generator>
        <image><link>http://www.codeclimber.net.nz/</link><url>http://www.codeclimber.net.nz/Skins/CodeClimber/Images/codeclimber_50.gif</url><title>CodeClimber</title></image>
        <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Codeclimber" /><feedburner:info uri="codeclimber" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>45.49481143093878</geo:lat><geo:long>9.219868183135986</geo:long><creativeCommons:license>http://creativecommons.org/licenses/by/3.0/</creativeCommons:license><item>
            <title>Orchard Harvest Conference in Europe: 13-14 June in Amsterdam</title>
            <category>ASP.NET MVC</category>
            <category>Web 2.0</category>
            <category>ASP.NET</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/fkl_L5txTaQ/Orchard-Harvest-Conference-in-Europe-13-14-June-in-Amsterdam.aspx</link>
            <description>&lt;p&gt;In the same week of the Umbarco &lt;a href="http://umbraco.com/cg13"&gt;CodeGarden&lt;/a&gt; in Copenhagen, the Orchard CMS project is having its first pan-European Orchard Harvest Conference 2013. June 13 - 14th, 2013 (Thursday - Friday).&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://euro2013.orchardharvest.org"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="harvest-banner-en" border="0" alt="harvest-banner-en" src="http://codeclimber.net.nz/images/codeclimber_net_nz/WindowsLiveWriter/OrchardCMSUserConferenceinEurope1314June_E52A/harvest-banner-en_3.gif" width="500" height="62" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;The event will be held in Amsterdam, Netherlands at the wonderful &lt;a href="http://tobacco.nl/engels/index.html"&gt;Tobacco Theater&lt;/a&gt;. We are very excited about this event and look forward to welcoming members of the Orchard Project open source community from across Europe as well as from around the globe.   &lt;br /&gt;For more information about the event:   &lt;br /&gt;&lt;a href="http://euro2013.orchardharvest.org/"&gt;Orchard Harvest - European Conference 2013&lt;/a&gt; &lt;/p&gt;   &lt;ul&gt;   &lt;li&gt;&lt;a href="http://euro2013.orchardharvest.org/#agenda"&gt;Agenda&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://euro2013.orchardharvest.org/#sessions"&gt;Sessions&lt;/a&gt;&lt;/li&gt;    &lt;li&gt;&lt;a href="http://euro2013.orchardharvest.org/#speakers"&gt;Speakers&lt;/a&gt;&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Orchard Harvest sessions are focusing on best practices, conversations with core contributors, module development, Web design, as well as several success stories with high volume Web sites and yes – social activities!&lt;/p&gt;  &lt;p&gt;You can register on &lt;a href="http://orchardharvest-belgium.eventbrite.com"&gt;eventbrite.&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Orchard is a free, open source, community-focused Content Management System built on the ASP.NET MVC platform already powering sites of many major brands and organizations. Originally created by Microsoft, it is now maintained by the Outercurve Foundation, a non-profit and IP-neutral open source software foundation.&lt;/p&gt;  &lt;p&gt;If you haven’t tried Orchard already and would like to join its growing community of users, the current version 1.6 release may be downloaded at: &lt;a href="http://www.outercurve.org/LinkClick.aspx?link=http%3a%2f%2fwww.orchardproject.net%2fdownload&amp;amp;tabid=87&amp;amp;mid=429"&gt;http://www.orchardproject.net/download&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Orchard also allows you to build custom modules. It is designed for extensibility with tools that allow developers and customizers to provide additional functionality through modules and themes. An ecosystem of add-ons is forming around Orchard, with over 500 modules and themes available on the gallery, and over 4,000,000 total downloads.&lt;/p&gt;  &lt;p&gt;The critical mass of community support that’s forming behind the project has empowered contributors to build extensive new functionality. Version 1.7, which is due in June, introduces a streamlined media manager that integrates slideshows and the ability to easily upload and manage digital content. It will also feature a significant new &lt;a href="http://www.outercurve.org/LinkClick.aspx?link=http%3a%2f%2fwww.davidhayden.me%2fblog%2forchard-workflow-module&amp;amp;tabid=87&amp;amp;mid=429"&gt;workflow module&lt;/a&gt; to manage publishing tasks that is graphical editor, which is also extensible.&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:9993d4b6-75ef-40b9-a911-6baa5514b818" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/Orchard/default.aspx" rel="tag"&gt;Orchard&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/CMS/default.aspx" rel="tag"&gt;CMS&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/1000.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=fkl_L5txTaQ:uDN3vkq4Mcs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=fkl_L5txTaQ:uDN3vkq4Mcs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=fkl_L5txTaQ:uDN3vkq4Mcs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=fkl_L5txTaQ:uDN3vkq4Mcs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=fkl_L5txTaQ:uDN3vkq4Mcs:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=fkl_L5txTaQ:uDN3vkq4Mcs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=fkl_L5txTaQ:uDN3vkq4Mcs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=fkl_L5txTaQ:uDN3vkq4Mcs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/fkl_L5txTaQ" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2013/05/29/Orchard-Harvest-Conference-in-Europe-13-14-June-in-Amsterdam.aspx</guid>
            <pubDate>Wed, 29 May 2013 14:27:45 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2013/05/29/Orchard-Harvest-Conference-in-Europe-13-14-June-in-Amsterdam.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/1000.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2013/05/29/Orchard-Harvest-Conference-in-Europe-13-14-June-in-Amsterdam.aspx</feedburner:origLink></item>
        <item>
            <title>Finally moved my blog to Azure Web Sites</title>
            <category>Subtext</category>
            <category>Blogging about Blogging</category>
            <category>ASP.NET</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/s5ywH8ODaFM/Finally-moved-my-blog-to-Azure-Web-Sites.aspx</link>
            <description>&lt;p&gt;Over the last few years I had to move my blog through different hosting providers, and when in March my last hosting, &lt;a href="http://www.epicwinhosting.com/"&gt;EpicWin Hosting&lt;/a&gt;, closed business with only one month of notice I decided that I had enough of small hosting providers run by people I know, so I decided to finally make the big step and move to Azure.&lt;/p&gt;  &lt;p&gt;Unfortunately this happened during a moment in which my life is going through some big changes, and I didn’t have time and brain-power to put all my efforts into the migration, so you might have noticed that my blog was down between end of March (when the hosting closed) till last week.&lt;/p&gt;  &lt;p&gt;The down was due to a strange problem with database access permissions on my SQL Server on Azure. Well… strange for me that used Azure for the first time, maybe it’s how SQL Server on Azure it’s supposed to work.&lt;/p&gt;  &lt;p&gt;Another issue I had was with the mapping of domains to web sites, keeping both example.com and www.example.com pointing to same web site.&lt;/p&gt;  &lt;h3 /&gt;  &lt;h3&gt;The SQL Server user permissions problem&lt;/h3&gt;  &lt;p&gt;The migration from the on-premise database to azure SQL Server went very smoothly: I installed the &lt;a href="http://sqlazuremw.codeplex.com/"&gt;SQL Database Migration Wizard&lt;/a&gt; on my VM, setup firewall rules on Windows Azure, ran the wizard and all tables and data were moved to the newly created DB on Azure. For a step by step procedure, I recommend reading &lt;a href="http://timheuer.com/blog/archive/2012/02/20/migrating-existing-sql-server-to-sql-azure.aspx"&gt;Migrating a SQL Server database to SQL Azure&lt;/a&gt; by &lt;a href="http://timheuer.com/blog"&gt;Tim Heuer&lt;/a&gt;: it’s from last year, and many steps are not necessary any more, but it’s a good overview of the process.&lt;/p&gt;  &lt;p&gt;The problem started when I tried accessing my blog: I was getting an user access error from the database, despite having configured the connection string correctly, and being able to access the database both via the online DB manager, and from my local Management Studio.&lt;/p&gt;  &lt;p&gt;After some attempts, emails with some Azure MVPs, and lots of frustration I quitted the challenge and let the blog down for a few weeks. I went back to try and solve the problem last week, and finally solved the problem.&lt;/p&gt;  &lt;p&gt;I had put in the connection string the username of the administrator account of the my server on Azure, which I though would have had access to all the DBs in the server, like the &lt;strong&gt;sa&lt;/strong&gt; user does on a normal SQL Server. Unfortunately that was not the case: I had to create another server login, and a new user inside my database and grant him dbo rights. More information on SQL Azure user management can be found on MSDN: &lt;a href="http://msdn.microsoft.com/en-us/library/windowsazure/ee336235.aspx"&gt;Managing Databases and Logins in Windows Azure SQL Database&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;After that, the blog started running without any issue: no change in Subtext code or SPs. If it hadn’t been for that silly problem with the DB user, migration from on-premise to Azure WebSites would have been completed in less than 2hrs.&lt;/p&gt;  &lt;h3&gt;Mapping custom domains to windows azure web sites&lt;/h3&gt;  &lt;p&gt;Mapping a custom domain to an Azure website is pretty easy: just create a CNAME that points to mysite.azurewebsites.net and everything works fine.&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;www.example.com 21600 IN CNAME mysite.azurewebsites.net&lt;/strong&gt;&lt;/p&gt;  &lt;p&gt;But if you also want to configure the non-www things become more complicate, because you cannot just create a CNAME, but need to create an A record for your domain, and the azure management site wants to verify that you are the owner of the domain before letting you configure the custom domain name. Here is the procedure for setting up an A record:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;first you need to create the CNAME that is used for verification, which has be to awverify followed by the domain you want to configure as A record. In the case of the non-www domain, it has to be:     &lt;br /&gt;&lt;strong&gt;awverify.example.com 21600 IN CNAME awverify.mysite.azurewebsites.net&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;After the DNS has propagated (you can check with &lt;a href="http://www.digwebinterface.com/"&gt;http://www.digwebinterface.com/&lt;/a&gt;) you can go on and create the A record:       &lt;br /&gt;&lt;strong&gt;example.com 19473 IN A your.azure.IP.address&lt;/strong&gt;&lt;/li&gt;    &lt;li&gt;Then of course add the domain inside the custom domain section of your azure web site.&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Before wrapping up, two notes that might confuse you at first:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;your website has to be running as shared or reserved (free mode doesn't allow domain names, at least not during beta)&lt;/li&gt;    &lt;li&gt;If you were used to the &lt;strong&gt;*.example.com&lt;/strong&gt; notation to configure any hostname to point to the same IP address, remember that this won't work on as the azure portal checks for the specific CNAMEs&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;More information on how to manage custom domains on Azure web sites can be found again on the Azure documentation portal: &lt;a href="http://www.windowsazure.com/en-us/develop/net/common-tasks/custom-dns-web-site/"&gt;Configuring a custom domain name for a Windows Azure web site&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;Traffic and SEO problem after 2 months of down time&lt;/h3&gt;  &lt;p&gt;Unfortunately, the almost 2 months of down time, apart from the non blogging, also meant that my site disappeared from Google search results.&lt;/p&gt;  &lt;p&gt;Here is the traffic profile of my blog, before and after the period of unavailability.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Traffic blog 2013" border="0" alt="Traffic blog 2013" src="http://codeclimber.net.nz/images/codeclimber_net_nz/WindowsLiveWriter/MovedmyblogtoAzureWebSites_928D/traffic-down_3.jpg" width="502" height="100" /&gt; &lt;/p&gt;  &lt;p&gt;From more than 1500 pages a day, it went down to 200-300 pages a day, all coming from referrals on stackoverflow or forums, but with very little search results from Google. Let’s see how long it takes to go back to previous figures.&lt;/p&gt;  &lt;h3&gt;Performance and logging&lt;/h3&gt;  &lt;p&gt;Now I have to monitor the performance of the web site on Azure, and try to understand where all those peaks in CPU time and HTTP Errors come from.&lt;/p&gt;  &lt;p align="center"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="azure-counters" border="0" alt="azure-counters" src="http://codeclimber.net.nz/images/codeclimber_net_nz/WindowsLiveWriter/MovedmyblogtoAzureWebSites_928D/azure-counters_3.jpg" width="502" height="134" /&gt; &lt;/p&gt;  &lt;h3&gt;Migrating to Azure Web Sites is easy&lt;/h3&gt;  &lt;p&gt;Despite the small issue with user access, I have to say that the migration to Azure Web Sites was kind of easy: it’s just like running on a normal hosting. Also no problem with the Lucene indexes, which are usually the most critical part of a Subtext installation on shared hosting environments.&lt;/p&gt;  &lt;p&gt;A small request to all my readers: if you have more experience than me with Azure, could you please comment with some tips on how to monitor performance and errors on Azure better? Same if you have some tips on how to get back to being indexed by Google.&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:69a67147-37fb-412a-b4c0-af68e4f4546c" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/azure/default.aspx" rel="tag"&gt;azure&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/websites/default.aspx" rel="tag"&gt;websites&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/subtext/default.aspx" rel="tag"&gt;subtext&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/user+access/default.aspx" rel="tag"&gt;user access&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/Azure+SQL+Server/default.aspx" rel="tag"&gt;Azure SQL Server&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/999.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=s5ywH8ODaFM:Q3pzyJ9QaY8:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=s5ywH8ODaFM:Q3pzyJ9QaY8:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=s5ywH8ODaFM:Q3pzyJ9QaY8:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=s5ywH8ODaFM:Q3pzyJ9QaY8:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=s5ywH8ODaFM:Q3pzyJ9QaY8:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=s5ywH8ODaFM:Q3pzyJ9QaY8:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=s5ywH8ODaFM:Q3pzyJ9QaY8:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=s5ywH8ODaFM:Q3pzyJ9QaY8:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/s5ywH8ODaFM" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2013/05/28/Finally-moved-my-blog-to-Azure-Web-Sites.aspx</guid>
            <pubDate>Tue, 28 May 2013 09:45:46 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2013/05/28/Finally-moved-my-blog-to-Azure-Web-Sites.aspx#feedback</comments>
            <slash:comments>5</slash:comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/999.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2013/05/28/Finally-moved-my-blog-to-Azure-Web-Sites.aspx</feedburner:origLink></item>
        <item>
            <title>Deploying a MongoDB powered Node.js app on Windows Azure: my slides</title>
            <category>Community Life</category>
            <category>Javascript</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/_Uv9sqIuTyY/Deploying-a-MongoDB-powered-Node-js-app-on-Windows-Azure.aspx</link>
            <description>&lt;p&gt;A few days ago I attended the &lt;a href="http://www.meetup.com/Belgian-node-js-User-Group/events/88799952/"&gt;second event&lt;/a&gt; of the newly born &lt;a href="http://www.meetup.com/Belgian-node-js-User-Group/"&gt;Belgian Node.js User Group&lt;/a&gt;. The event was about deploying and testing node.js applications and has been hosted in Microsoft Belgium offices near Brussels, thanks to Tom Crombez (aka &lt;a href="https://twitter.com/artymoony"&gt;@artymoony&lt;/a&gt;) and Windows Azure.&lt;/p&gt;  &lt;p&gt;There were 3 presentations:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Mine, about deploying a MongoDB powered Node.js app on Windows Azure: a walkthrough of the steps needed to deploy the app.&lt;/li&gt;    &lt;li&gt;Then another talk on how to build your own “cloud-like” environment on Linux, using &lt;strong&gt;systemd&lt;/strong&gt;. Talk by &lt;a href="https://twitter.com/rubenv"&gt;Ruben Vermeersch&lt;/a&gt;.&lt;/li&gt;    &lt;li&gt;Finally &lt;a href="https://twitter.com/#!/jbpros"&gt;Julien Biezemans&lt;/a&gt;, lead developer of &lt;a href="https://github.com/cucumber/cucumber-js"&gt;cucumber.js&lt;/a&gt;, gave an introduction of BDD and cucumber.js&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;It was really a nice event, with good catering and good discussion (and for the first time almost 50/50 French speaking / Dutch speaking).&lt;/p&gt;  &lt;p&gt;For those who are interested, you can see my presentation online: &lt;a title="https://bitly.com/njug_be_azure" href="http://bitly.com/njug_be_azure"&gt;http://bitly.com/njug_be_azure&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;The first step to test azure is of course to create an account. You can do it following that link: &lt;a href="http://aka.ms/azurebenug"&gt;http://aka.ms/azurebenug&lt;/a&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:53e4228e-b54c-4472-87b6-bf47776a0049" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/node.js/default.aspx" rel="tag"&gt;node.js&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/njugbe/default.aspx" rel="tag"&gt;njugbe&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/presentation/default.aspx" rel="tag"&gt;presentation&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/998.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=_Uv9sqIuTyY:460tFtA1K2I:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=_Uv9sqIuTyY:460tFtA1K2I:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=_Uv9sqIuTyY:460tFtA1K2I:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=_Uv9sqIuTyY:460tFtA1K2I:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=_Uv9sqIuTyY:460tFtA1K2I:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=_Uv9sqIuTyY:460tFtA1K2I:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=_Uv9sqIuTyY:460tFtA1K2I:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=_Uv9sqIuTyY:460tFtA1K2I:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/_Uv9sqIuTyY" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2013/01/18/Deploying-a-MongoDB-powered-Node-js-app-on-Windows-Azure.aspx</guid>
            <pubDate>Fri, 18 Jan 2013 14:23:10 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2013/01/18/Deploying-a-MongoDB-powered-Node-js-app-on-Windows-Azure.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/998.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2013/01/18/Deploying-a-MongoDB-powered-Node-js-app-on-Windows-Azure.aspx</feedburner:origLink></item>
        <item>
            <title>Christmas present for you: Announcing Web.NET Conf 2013 in Paris</title>
            <category>Community Life</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/oPKxaIIgj-s/Christmas-present-for-you-Announcing-Web-NET-Conf-2013-in.aspx</link>
            <description>&lt;p style="text-align: center;"&gt;&lt;br /&gt;
&lt;img src="/images/codeclimber_net_nz/merry-christmas-2012.jpg" width="480" height="250" alt="merry-christmas-2012.jpg" /&gt;&lt;/p&gt;
&lt;p&gt;Together with the traditional Christmas and New Year wishes, I wanted to give all European developer a small Xmas present:&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="http://webnetconf.eu/"&gt;Web.NET Conference&lt;/a&gt; 2013 will be held in Paris, around the end of May&lt;/p&gt;
&lt;p&gt;This year's edition is possible thanks to the help of &lt;a href="http://www.codedistillers.com/"&gt;Rui Carvalho&lt;/a&gt;, which already came to &lt;a href="http://webnetconf.eu/#/Home/SessionDetails/14"&gt;talk at last Web.NET Conference&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So, let's look forward to an amazing 2013!!&lt;/p&gt;

&lt;div class="posttagsblock"&gt;&lt;a href="http://technorati.com/tag/webnetconf" rel="tag"&gt;webnetconf&lt;/a&gt;, &lt;a href="http://technorati.com/tag/xmas" rel="tag"&gt;xmas&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/997.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=oPKxaIIgj-s:rOoQHMrPEHg:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=oPKxaIIgj-s:rOoQHMrPEHg:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=oPKxaIIgj-s:rOoQHMrPEHg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=oPKxaIIgj-s:rOoQHMrPEHg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=oPKxaIIgj-s:rOoQHMrPEHg:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=oPKxaIIgj-s:rOoQHMrPEHg:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=oPKxaIIgj-s:rOoQHMrPEHg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=oPKxaIIgj-s:rOoQHMrPEHg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/oPKxaIIgj-s" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/12/25/Christmas-present-for-you-Announcing-Web-NET-Conf-2013-in.aspx</guid>
            <pubDate>Tue, 25 Dec 2012 18:52:04 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/12/25/Christmas-present-for-you-Announcing-Web-NET-Conf-2013-in.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/997.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/12/25/Christmas-present-for-you-Announcing-Web-NET-Conf-2013-in.aspx</feedburner:origLink></item>
        <item>
            <title>How to return a CSV file with ASP.NET MVC</title>
            <category>ASP.NET MVC</category>
            <category>.NET</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/bD2adE8aS_I/How-to-return-a-CSV-file-with-ASP-NET-MVC.aspx</link>
            <description>&lt;p&gt;Continuing with my series of posts inspired by the work done on the &lt;a href="http://webnetconf.eu" target="_blank"&gt;Web.NET Conference&lt;/a&gt; web site, after telling you &lt;a href="http://codeclimber.net.nz/archive/2012/11/19/Why-you-should-never-use-a-boolean-field-use-an.aspx" target="_blank"&gt;why you should not use Boolean fields when modeling your objects&lt;/a&gt;, today I want to share with you an ActionResult I wrote to get a CSV from a generic list of object.&lt;/p&gt;  &lt;p&gt;I needed to download the list of all attendees in csv format so that I could import them into Excel for doing various free-form analysis: I looked around the net to see if something was available but I found nothing, so I decided to write it myself and do it the most reusable way possible.&lt;/p&gt;  &lt;p&gt;I’m not just going to give you the code, but I’d also try and comment the most important part of the class.&lt;/p&gt;  &lt;h3&gt;Extend ActionResult&lt;/h3&gt;  &lt;p&gt;Obviously, being used as result returned from an action, the class has to extend &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.actionresult%28v=vs.108%29.aspx" target="_blank"&gt;ActionResult&lt;/a&gt;, and in this case, since what I’m returning is a file, I’m extending &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult%28v=vs.108%29.aspx" target="_blank"&gt;FileResult&lt;/a&gt;: this provides all the standard file-related tasks, like setting the content type and setting the filename that will be suggested when saving it.&lt;/p&gt;  &lt;h4&gt;Constructor and declaration&lt;/h4&gt;  &lt;p&gt;The values for these two properties will be set in the ActionResult’s constructor:&lt;/p&gt;  &lt;div class="dropshadow code"&gt;   &lt;div class="innerbox"&gt;     &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; CsvActionResult&amp;lt;T&amp;gt; : FileResult
{
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; IList&amp;lt;T&amp;gt; _list;
    &lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;readonly&lt;/span&gt; &lt;span class="kwrd"&gt;char&lt;/span&gt; _separator;

    &lt;span class="kwrd"&gt;public&lt;/span&gt; CsvActionResult(IList&amp;lt;T&amp;gt; list,
        &lt;span class="kwrd"&gt;string&lt;/span&gt; fileDownloadName, 
        &lt;span class="kwrd"&gt;char&lt;/span&gt; separator=&lt;span class="str"&gt;','&lt;/span&gt;)
        : &lt;span class="kwrd"&gt;base&lt;/span&gt;(&lt;span class="str"&gt;"text/csv"&lt;/span&gt;)
    {
        _list = list;
        FileDownloadName = fileDownloadName;
        _separator = separator;
    }
...&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;I’m also passing in an optional separator because in many countries the the separator for fields is not a comma, but a semi-column.&lt;/p&gt;

&lt;h4&gt;Override WriteFile&lt;/h4&gt;

&lt;p&gt;In order to extend FileResult, you also need to override the &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.mvc.fileresult.writefile%28v=vs.108%29.aspx" target="_blank"&gt;WriteFile&lt;/a&gt; method, which is the one responsible of getting the value of the file and sending it to the user. The standard implementation just takes a file from the disk and send it to the browser: in this case I have to write to the OutputStream directly the value of my list of objects.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteFile(HttpResponseBase response)
{
    var outputStream = response.OutputStream;
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (var memoryStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream())
    {
        WriteList(memoryStream);
        outputStream.Write(memoryStream.GetBuffer(), 0, (&lt;span class="kwrd"&gt;int&lt;/span&gt;)memoryStream.Length);
    }
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Discovering the property names at runtime&lt;/h3&gt;

&lt;p&gt;The csv file needs to have the list of all the columns’ names so that Excel can give a name to it once imported: since the action results accepts any object I needed to find out the name of the property. This was easily done via reflection and passed to a function that writes it in the OutputStream of the response.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (MemberInfo member &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).GetProperties())
{
    WriteValue(streamWriter, member.Name);
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;The write value method is an utility method that formats the value in the proper way and with the correct separator. I’ll show this later in the post.&lt;/p&gt;

&lt;h3&gt;Writing each object of the list&lt;/h3&gt;

&lt;p&gt;After having written the header, always via reflection I get the values of the properties, and write them in the OutputStream.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;foreach&lt;/span&gt; (T line &lt;span class="kwrd"&gt;in&lt;/span&gt; _list)
{
    &lt;span class="kwrd"&gt;foreach&lt;/span&gt; (MemberInfo member &lt;span class="kwrd"&gt;in&lt;/span&gt; &lt;span class="kwrd"&gt;typeof&lt;/span&gt;(T).GetProperties())
    {
        WriteValue(streamWriter, GetPropertyValue(line, member.Name));
    }
    streamWriter.WriteLine();
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;p&gt;If a property is of a complex type, and you still want to export it into the csv file, all you need to do is override the ToString method to format it into a string. Here is the GetPropertyValue method that does the actual work of retrieving the value from object.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetPropertyValue(&lt;span class="kwrd"&gt;object&lt;/span&gt; src, &lt;span class="kwrd"&gt;string&lt;/span&gt; propName)
{
    &lt;span class="kwrd"&gt;return&lt;/span&gt; src.GetType().GetProperty(propName).GetValue(src, &lt;span class="kwrd"&gt;null&lt;/span&gt;).ToString()??&lt;span class="str"&gt;""&lt;/span&gt;;
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Formatting the property value&lt;/h3&gt;

&lt;p&gt;Care must be given when writing the actual string otherwise Excel (or any other csv parser) will not be able to get the data correctly: the value must be enclosed in double quotes, and all double quotes inside the value must be escaped. And furthermore the separator has to be different based on the culture of the user, but to make it simple I take the value supplied during the instantiation of the action result.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;private&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; WriteValue(StreamWriter writer, String &lt;span class="kwrd"&gt;value&lt;/span&gt;)
{
    writer.Write(&lt;span class="str"&gt;"\""&lt;/span&gt;);
    writer.Write(&lt;span class="kwrd"&gt;value&lt;/span&gt;.Replace(&lt;span class="str"&gt;"\""&lt;/span&gt;, &lt;span class="str"&gt;"\"\""&lt;/span&gt;));
    writer.Write(&lt;span class="str"&gt;"\""&lt;/span&gt; + _separator);
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;How to use it&lt;/h3&gt;

&lt;p&gt;Using the action result is pretty easy: you just create a new instance of the class, and pass it a IList of something. And then return the class in you action method.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; ActionResult CsvList()
{
    var model = CreateUserListViewModel();
    &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; CsvActionResult&amp;lt;UserListViewModelItem&amp;gt;(model.Items, &lt;span class="str"&gt;"UserExport.csv"&lt;/span&gt;);
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Get the complete code&lt;/h3&gt;

&lt;p&gt;You can get the &lt;a href="https://gist.github.com/4104490" target="_blank"&gt;complete code of the class on this gist&lt;/a&gt;. I’ll be creating a NuGet package with binaries and some enhancements soon.&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:23f32dc4-7c00-41f4-9138-978c9bbaaff3" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/actionresult/default.aspx" rel="tag"&gt;actionresult&lt;/a&gt;

, &lt;a href="http://codeclimber.net.nz/tags/aspnetmvc/default.aspx" rel="tag"&gt;aspnetmvc&lt;/a&gt;

, &lt;a href="http://codeclimber.net.nz/tags/extensibility/default.aspx" rel="tag"&gt;extensibility&lt;/a&gt;

, &lt;a href="http://codeclimber.net.nz/tags/CSV/default.aspx" rel="tag"&gt;CSV&lt;/a&gt;

&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/995.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=bD2adE8aS_I:UBrICES5b_M:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=bD2adE8aS_I:UBrICES5b_M:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=bD2adE8aS_I:UBrICES5b_M:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=bD2adE8aS_I:UBrICES5b_M:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=bD2adE8aS_I:UBrICES5b_M:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=bD2adE8aS_I:UBrICES5b_M:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=bD2adE8aS_I:UBrICES5b_M:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=bD2adE8aS_I:UBrICES5b_M:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/bD2adE8aS_I" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/11/22/How-to-return-a-CSV-file-with-ASP-NET-MVC.aspx</guid>
            <pubDate>Thu, 22 Nov 2012 10:48:00 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/11/22/How-to-return-a-CSV-file-with-ASP-NET-MVC.aspx#feedback</comments>
            <slash:comments>3</slash:comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/995.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/11/22/How-to-return-a-CSV-file-with-ASP-NET-MVC.aspx</feedburner:origLink></item>
        <item>
            <title>Why you should never use a boolean field (use an Enum instead)</title>
            <category>.NET</category>
            <category>C#</category>
            <category>Community Life</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/nns15WwuOE4/Why-you-should-never-use-a-boolean-field-use-an.aspx</link>
            <description>&lt;p&gt;Over the last few months I worked, on my spare time, on a new web development project: the site for the &lt;a href="http://webnetconf.eu" target="_blank"&gt;Web.NET Conference&lt;/a&gt;. It was a refreshing experience, going back working on custom development on ASP.NET MVC 4 and all the latest bits of technology.&lt;/p&gt;  &lt;p&gt;That gave me quite a few ideas for posts, so over the next weeks I'm going to blog about some of the bits and pieces of code that I think are worth sharing with the community, like ActionResults, HtmlHelpers together with my first real-coding experiences with RavenDb.&lt;/p&gt;  &lt;p&gt;As first post I’m not focusing on something about a technology, but I want to tell why you should never model a data field as Boolean, and instead start directly with an Enum.&lt;/p&gt;  &lt;h3&gt;How the problem started&lt;/h3&gt;  &lt;p&gt;I'm going to tell you what happened during the development of the registration and payment parts of the Web.NET Conference.&lt;/p&gt;  &lt;p&gt;I needed to keep track of whether someone has paid or not, so I started modeling that field as a simple boolean value, &lt;font face="Courier New"&gt;HasPaid&lt;/font&gt;. I also wanted to show them a different message depending on whether they paid or not, to remind them they had to pay in order to get the meal they ordered. To achieve that I checked the value of the &lt;font face="Courier New"&gt;HasPaid&lt;/font&gt; field: after a while I realized that also people that didn't order a meal had the &lt;font face="Courier New"&gt;HasPaid&lt;/font&gt; to &lt;strong&gt;false&lt;/strong&gt;, as indeed they didn't pay because they didn't have to.   &lt;br /&gt;So in this confirmation screen I also checked whether the total of what they had to pay was different from 0. And it was still manageable.&lt;/p&gt;  &lt;p&gt;After a while someone asked if they could pay at the registration desk as in their country PayPal was not operating: so I moved them manually to &lt;font face="Courier New"&gt;HasPaid=true&lt;/font&gt; and added in the note field that they will pay at the desk, so that their lunch and were taken into account.&lt;/p&gt;  &lt;p&gt;Then again something else happened: someone that has already paid unregistered and left what he paid as donation for the conference. Now I needed to filter out their meals, their participation at the conference, but still keep their payment in the count of the donations received, unlike the ones that asked for a refund for which I need to filter out also the payment: this was becoming a nightmare to handle with the original &lt;font face="Courier New"&gt;HasPaid&lt;/font&gt; field.&lt;/p&gt;  &lt;h3&gt;On with the refactoring&lt;/h3&gt;  &lt;p&gt;One evening I sat down, and refactored the payment procedure and all reports to go from a simple boolean to an Enum with the following options:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;strong&gt;Undefined&lt;/strong&gt; &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;DidntPay&lt;/strong&gt; (the original &lt;font face="Courier New"&gt;HasPaid=&lt;/font&gt;&lt;strong&gt;false&lt;/strong&gt;) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;NoNeedToPay&lt;/strong&gt; (for those how didn't reserve a meal or gave no donation) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Paid&lt;/strong&gt; (the original &lt;font face="Courier New"&gt;HasPaid=&lt;/font&gt;&lt;strong&gt;true&lt;/strong&gt;) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;PaysAtRegistration&lt;/strong&gt; (for the guys who couldn't pay online) &lt;/li&gt;    &lt;li&gt;&lt;strong&gt;Refunded&lt;/strong&gt; (if someone cancels, and wants his money back) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;And after the refactoring and making sure all reports and state transitions were using the new Enum, I also had to build a small script to convert all the data inside the RavenDb repository (and this is something interesting I’d probably write a blog post about).&lt;/p&gt;  &lt;h3&gt;Another example of the same problem&lt;/h3&gt;  &lt;p&gt;The same problem occurred with the registration status: it started with 2 booleans, &lt;font face="Courier New"&gt;IsRegistered&lt;/font&gt; and &lt;font face="Courier New"&gt;IsWaitlist&lt;/font&gt;, then expanded with &lt;font face="Courier New"&gt;HasCancelled&lt;/font&gt; and &lt;font face="Courier New"&gt;WasApprovedFromWaitList&lt;/font&gt; and all crazy combinations of boolean expressions to understand his real status, and then, in that very same refactoring session, it all became a more clear and easier with that Enum:&lt;/p&gt;  &lt;div class="dropshadow code"&gt;   &lt;div class="innerbox"&gt;     &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;enum&lt;/span&gt; RegistrationStatus
{
    Undefined,
    Confirmed,
    WaitingForPayment,
    Waitlist,
    Cancelled,
    Approved,
    ApprovalNotConfirmed
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;State Machine/Workflow&lt;/h3&gt;

&lt;p&gt;The benefit of this approach is that both registration and payment became two state machines, and it was much more easy to implement a very simple workflow with the possibility to set allowed and forbidden transition (for example, someone in waitlist couldn’t become “confirmed” without passing from the “approved” status), and action that needs to be done when a given state transition happens. Here is an example of what the transition rules look like: previously with the combination of booleans it was crazy, and very easy to make logical mistakes.&lt;/p&gt;

&lt;div class="dropshadow code"&gt;
  &lt;div class="innerbox"&gt;
    &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RegistrationFlow
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; RegistrationStatusTransition(RegistrationStatus newStatus,
        Registration registration)
    {
        &lt;span class="kwrd"&gt;switch&lt;/span&gt; (newStatus)
        {
        ...
        &lt;span class="kwrd"&gt;case&lt;/span&gt; RegistrationStatus.WaitingForPayement:
            &lt;span class="kwrd"&gt;if&lt;/span&gt;(registration.RegistrationStatus!=RegistrationStatus.Undefined &amp;amp;&amp;amp;
            registration.RegistrationStatus!=RegistrationStatus.Approved)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentOutOfRangeException(&lt;span class="str"&gt;"newStatus"&lt;/span&gt;,
                String.Format(&lt;span class="str"&gt;"{0} -&amp;gt; WaitingForPayement not allowed"&lt;/span&gt;,
                registration.RegistrationStatus));
            &lt;span class="kwrd"&gt;if&lt;/span&gt;(registration.PaymentStatus==PaymentStatus.NoNeedToPay)
                registration.RegistrationStatus = RegistrationStatus.Confirmed;
            &lt;span class="kwrd"&gt;else&lt;/span&gt;
                registration.RegistrationStatus = RegistrationStatus.WaitingForPayement;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        &lt;span class="kwrd"&gt;case&lt;/span&gt; RegistrationStatus.Confirmed:
            &lt;span class="kwrd"&gt;if&lt;/span&gt;(registration.RegistrationStatus!=RegistrationStatus.Undefined &amp;amp;&amp;amp;
            registration.RegistrationStatus!=RegistrationStatus.WaitingForPayement &amp;amp;&amp;amp;
            registration.RegistrationStatus!=RegistrationStatus.Approved)
                &lt;span class="kwrd"&gt;throw&lt;/span&gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; ArgumentOutOfRangeException(&lt;span class="str"&gt;"newStatus"&lt;/span&gt;,
                String.Format(&lt;span class="str"&gt;"{0} -&amp;gt; Confirmed not allowed"&lt;/span&gt;,
                registration.RegistrationStatus));

            registration.RegistrationStatus = RegistrationStatus.Confirmed;
            &lt;span class="kwrd"&gt;break&lt;/span&gt;;
        ...
        }
    }
}&lt;/pre&gt;
  &lt;/div&gt;
&lt;/div&gt;

&lt;h3&gt;Lesson Learned&lt;/h3&gt;

&lt;p&gt;When I tweeted about this while I was refactoring, someone told me: &lt;em&gt;“Using a boolean is an antipattern”&lt;/em&gt;… well… now I experienced it myself.&lt;/p&gt;

&lt;p&gt;From this experience, in the future, I’ll never use a Boolean field again, and always start with an Enum, especially with a Document database where migrating data is a bit more complex than with relational databases. &lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE&lt;/strong&gt;: Given the comments received I’d like to clarify a bit my position. I’m not saying booleans are not to be used at all: booleans have value, just not when the the thing you are trying to model is a state and not just a real/physically boolean value.&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:1bce348c-cd51-4828-878e-0738528474a8" class="wlWriterSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/webnetconf/default.aspx" rel="tag"&gt;webnetconf&lt;/a&gt; , &lt;a href="http://codeclimber.net.nz/tags/boolean/default.aspx" rel="tag"&gt;boolean&lt;/a&gt; , &lt;a href="http://codeclimber.net.nz/tags/enum/default.aspx" rel="tag"&gt;enum&lt;/a&gt; , &lt;a href="http://codeclimber.net.nz/tags/architecture/default.aspx" rel="tag"&gt;architecture&lt;/a&gt; &lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/994.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nns15WwuOE4:os3Uta_IaJs:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nns15WwuOE4:os3Uta_IaJs:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nns15WwuOE4:os3Uta_IaJs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nns15WwuOE4:os3Uta_IaJs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nns15WwuOE4:os3Uta_IaJs:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nns15WwuOE4:os3Uta_IaJs:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nns15WwuOE4:os3Uta_IaJs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nns15WwuOE4:os3Uta_IaJs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/nns15WwuOE4" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/11/19/Why-you-should-never-use-a-boolean-field-use-an.aspx</guid>
            <pubDate>Mon, 19 Nov 2012 09:29:00 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/11/19/Why-you-should-never-use-a-boolean-field-use-an.aspx#feedback</comments>
            <slash:comments>21</slash:comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/994.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/11/19/Why-you-should-never-use-a-boolean-field-use-an.aspx</feedburner:origLink></item>
        <item>
            <title>OpenROV at Node.js Conf Italy and Maker Italy</title>
            <category>Me, Myself &amp; I</category>
            <category>Community Life</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/8xY8kivYtnA/OpenROV-at-Node-js-Conf-Italy-and-Maker-Italy.aspx</link>
            <description>&lt;p&gt;On the 11 of November I had the pleasure to present at the &lt;a href="http://www.nodejsconf.it/"&gt;Node.js Conference Italy&lt;/a&gt; the work I’ve been doing with &lt;a href="http://www.codewithpassion.com/" rel="met colleague"&gt;Dominik&lt;/a&gt; and a bunch of other guys in the San Francisco area on the “brain” of the robotic submarine called &lt;a href="http://openrov.com/"&gt;OpenROV&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;On my way back from Brescia I stopped by at the first &lt;a href="http://www.makersitaly.it/"&gt;Italian Maker Faire&lt;/a&gt;, held in the big expo area of Milano Rho, where I wandered among stands full of flying drones, biped robots, 3D printers, FabLabs and electronics shops.&lt;/p&gt;  &lt;p&gt;Together with web development, the makers and open hardware movement is something &lt;a href="http://codeclimber.net.nz/archive/2012/07/24/Open-Hardware-Drones-and-ROVs-artistic-project.aspx"&gt;I’m getting interested in&lt;/a&gt;, and after few months dedicated totally to &lt;a href="http://webnetconf.eu/"&gt;web development&lt;/a&gt;, this was a weekend totally devoted to these two new interests.&lt;/p&gt;  &lt;h3&gt;Slide and resource of my OpenROV presentation at Node.js Conference&lt;/h3&gt;  &lt;p&gt;During the 30 minutes presentation I went over the &lt;a href="https://dl.dropbox.com/u/1554948/OpenROV-nodejsconfit/index.html#/1/1"&gt;physical design&lt;/a&gt; of the OpenROV, the &lt;a href="https://dl.dropbox.com/u/1554948/OpenROV-nodejsconfit/index.html#/1/3"&gt;reasons why it has been build in the first place&lt;/a&gt;, and an overview of the &lt;a href="https://dl.dropbox.com/u/1554948/OpenROV-nodejsconfit/index.html#/2"&gt;architecture of the software&lt;/a&gt; that runs on the small board inside the robot itself.&lt;/p&gt;  &lt;p&gt;I was the only one doing a presentation in JavaScript, using &lt;a href="http://lab.hakim.se/reveal-js/"&gt;Reveal.js&lt;/a&gt;, which was shocking being it a conference on JavaScript: the slides are available both as &lt;a href="https://dl.dropbox.com/u/1554948/OpenROV-nodejsconfit/index.html"&gt;JavaScript presentation&lt;/a&gt; but also published on &lt;a href="http://www.slideshare.net/simonech/openrov-nodejs-takes-a-dive-into-the-ocean"&gt;Slideshare&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;On my other &lt;a href="http://dronesandrovs.wordpress.com/"&gt;blog about all things HW&lt;/a&gt; and makers I also wrote a &lt;a href="http://dronesandrovs.wordpress.com/2012/11/10/how-the-openrov-software-works-my-presentation-at-the-node-js-conference-italy/"&gt;blog post with a bit more of resources and a longer commentary of the event&lt;/a&gt;.&lt;/p&gt;  &lt;h3&gt;The Italian Maker Faire&lt;/h3&gt;  &lt;p&gt;On my way back home, after the Node.js conference hackathon, I spent a few hours wandering among the stands at &lt;a href="http://www.makersitaly.it/"&gt;Makers Italy&lt;/a&gt;: the maker movement is invading Italy too… finally!&lt;/p&gt;  &lt;p&gt;Not only robots and drones, but also a lot of stands on digital fabrication tools (3D printers above everything) and of small makers’ founded companies making various items like custom skateboards, guitars, bags, jewelries and so on.&lt;/p&gt;  &lt;p&gt;Not sure if that movement will bring innovation or it’s just yet another trend, but for the moment it seems like a lot of people are getting interested, building tools for makers, and it won’t be long before digital fabrication tools will land in every house. Already now, 3D printers are less expensive of a low level PC 10 years ago, and I guess they’ll reach the cost of an entry level laptop.&lt;/p&gt;  &lt;p&gt;Again on my &lt;a href="http://dronesandrovs.wordpress.com/"&gt;drones&amp;amp;rovs blog&lt;/a&gt; I wrote &lt;a href="http://dronesandrovs.wordpress.com/2012/11/12/makers-italy-the-italian-makers-faire/"&gt;my impressions and a small review of the stands I found more interesting&lt;/a&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:222a8cd5-f5b8-4b93-94c1-0ff82b1bd8e8" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/makersitaly/default.aspx" rel="tag"&gt;makersitaly&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/nodejs/default.aspx" rel="tag"&gt;nodejs&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/openrov/default.aspx" rel="tag"&gt;openrov&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/conference/default.aspx" rel="tag"&gt;conference&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/993.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=8xY8kivYtnA:Xv_JeIrP20Q:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=8xY8kivYtnA:Xv_JeIrP20Q:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=8xY8kivYtnA:Xv_JeIrP20Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=8xY8kivYtnA:Xv_JeIrP20Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=8xY8kivYtnA:Xv_JeIrP20Q:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=8xY8kivYtnA:Xv_JeIrP20Q:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=8xY8kivYtnA:Xv_JeIrP20Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=8xY8kivYtnA:Xv_JeIrP20Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/8xY8kivYtnA" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/11/13/OpenROV-at-Node-js-Conf-Italy-and-Maker-Italy.aspx</guid>
            <pubDate>Tue, 13 Nov 2012 11:09:39 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/11/13/OpenROV-at-Node-js-Conf-Italy-and-Maker-Italy.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/993.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/11/13/OpenROV-at-Node-js-Conf-Italy-and-Maker-Italy.aspx</feedburner:origLink></item>
        <item>
            <title>Web.NET Conference: find it on social media</title>
            <category>Community Life</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/nGP4dUREQSQ/Web-NET-Conference-find-in-on-social-media.aspx</link>
            <description>&lt;p&gt;Apart from the obvious &lt;a href="https://twitter.com/webnetconf"&gt;twitter&lt;/a&gt; and &lt;a href="https://www.facebook.com/WebnetConf"&gt;facebook&lt;/a&gt;, the Web.NET Conference is using a few specific social networks. We are also on:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;a href="https://geekli.st/WebNETConf"&gt;Geekli.st&lt;/a&gt; – A social network for “geeks”&lt;/li&gt;    &lt;li&gt;&lt;a href="http://oleapark.com/events/4ff30c8f7c93dd14e5000002"&gt;OleaPark&lt;/a&gt; – A conference specific networking app&lt;/li&gt;    &lt;li&gt;&lt;a href="http://lanyrd.com/2012/webnet12/"&gt;Lanyrd&lt;/a&gt; – A conference social directory&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;I’m going to explain a bit more what they are, and for we have decided to use them.&lt;/p&gt;  &lt;h3&gt;Geekli.st&lt;/h3&gt;  &lt;p&gt;Probably I should have added &lt;a href="https://geekli.st/"&gt;geekli.st&lt;/a&gt; in the first line of this post, next to twitter and facebook after the adjective “obvious”. If you are a developer you should at least know &lt;a href="https://geekli.st/about"&gt;what it is&lt;/a&gt;, or already have a profile over there (if you don’t, &lt;a href="https://geekli.st/simonech/invite/1AD4ED198E"&gt;you can join geekli.st&lt;/a&gt;). Basically it’s social network were developers can share their accomplishments, talk about what they are building and doing but always staying on “geek talk”. But it’s also becoming the new way of seeking and offering jobs.&lt;/p&gt;  &lt;p&gt;Geekli.st is also one of the main sponsors of the conference (&lt;a href="https://geekli.st/WebNETConf/we-have-free-t-shirts-for-everyone-sponsored-by-geeklist"&gt;they also offered T-Shirt for everyone&lt;/a&gt;) and it might be that &lt;a href="https://geekli.st/csanz"&gt;Christian Sanz&lt;/a&gt;, the CTO and co-founder of Geekli.st comes and give a presentation at the conference.&lt;/p&gt;  &lt;p&gt;You can find the Web.NET Conference on Geekli.st at: &lt;a title="https://geekli.st/WebNETConf" href="https://geekli.st/WebNETConf"&gt;https://geekli.st/WebNETConf&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;OleaPark&lt;/h3&gt;  &lt;p&gt;This Berlin-based French startup has built a new way for people attending conferences to connect one another: you go to the &lt;a href="http://oleapark.com/events/4ff30c8f7c93dd14e5000002"&gt;event page&lt;/a&gt;, you download the app (&lt;a href="http://itunes.apple.com/us/app/oleapark-app/id444993184?mt=8&amp;amp;ls=1"&gt;iPhone&lt;/a&gt;, &lt;a href="https://market.android.com/details?id=com.branchu1&amp;amp;feature=search_result"&gt;Android&lt;/a&gt; and soon mobile site) and can see who is attending the conference, their profiles and if you see someone that can be a interesting person, you can contact him via the app. And on the day of the event people can checkin at the conference, and you can see how is there and start talking to them. To understand better, there is a &lt;a href="http://oleapark.com/participants"&gt;video that explains everything&lt;/a&gt; on their site.&lt;/p&gt;  &lt;p&gt;You can join the conference on OleaPark at: &lt;a title="http://oleapark.com/events/4ff30c8f7c93dd14e5000002" href="http://oleapark.com/events/4ff30c8f7c93dd14e5000002"&gt;http://oleapark.com/events/4ff30c8f7c93dd14e5000002&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Lanyrd&lt;/h3&gt;  &lt;p&gt;And finally the Web.NET Conference is also on Lanyrd. That is yet another way to see who is attending the conference, but also to see the history of each speaker and get a feeling of the type of audience that will be at the conference. And if you are someone that easily forget dates and times, you can &lt;a href="http://lanyrd.com/2012/webnet12/save-to-calendar/"&gt;add the conference’s schedule to your calendar&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;Lanyrd also provides a nice &lt;a href="http://m.lanyrd.com/2012/webnet12/"&gt;mobile-optimized version of the agenda&lt;/a&gt;.&lt;/p&gt;  &lt;p&gt;If you use Lanyrd, you can join the event at: &lt;a href="http://lanyrd.com/2012/webnet12/"&gt;http://lanyrd.com/2012/webnet12/&lt;/a&gt;&lt;/p&gt;  &lt;h3&gt;Twitter and Facebook&lt;/h3&gt;  &lt;p&gt;Even if “obvious” the conference is on twitter and facebook, so don’t forget to follow &lt;a href="https://twitter.com/webnetconf"&gt;@webnetconf&lt;/a&gt; to get real-time info and updates on the conference, &lt;a href="https://www.facebook.com/WebnetConf/"&gt;like the conference’s page&lt;/a&gt; on Facebook and &lt;a href="https://www.facebook.com/events/382110041859771/"&gt;join the FB event&lt;/a&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:9f25f411-65f4-4d8e-8a33-dbcfd4ba26cb" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/webnet12/default.aspx" rel="tag"&gt;webnet12&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/conference/default.aspx" rel="tag"&gt;conference&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/twitter/default.aspx" rel="tag"&gt;twitter&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/geeklist/default.aspx" rel="tag"&gt;geeklist&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/social+media/default.aspx" rel="tag"&gt;social media&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/992.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nGP4dUREQSQ:BQPOWVrvgRE:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nGP4dUREQSQ:BQPOWVrvgRE:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nGP4dUREQSQ:BQPOWVrvgRE:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nGP4dUREQSQ:BQPOWVrvgRE:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nGP4dUREQSQ:BQPOWVrvgRE:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nGP4dUREQSQ:BQPOWVrvgRE:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=nGP4dUREQSQ:BQPOWVrvgRE:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=nGP4dUREQSQ:BQPOWVrvgRE:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/nGP4dUREQSQ" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/10/04/Web-NET-Conference-find-in-on-social-media.aspx</guid>
            <pubDate>Thu, 04 Oct 2012 16:27:55 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/10/04/Web-NET-Conference-find-in-on-social-media.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/992.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/10/04/Web-NET-Conference-find-in-on-social-media.aspx</feedburner:origLink></item>
        <item>
            <title>Web.NET European Conference: sold out in 2hrs and now the agenda is available</title>
            <category>Community Life</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/HTQa5Ed5oFA/Web-NET-European-Conference-agenda-available-and-sold-out-in.aspx</link>
            <description>&lt;p&gt;I have to say that lately all my spare time has been dedicated to the organization of the &lt;a href="http://webnetconf.eu/"&gt;Web.NET Conference&lt;/a&gt;: I firmly believe that the &lt;a href="http://webnetconf.eu/#web-net"&gt;future of web development&lt;/a&gt; will move away from the enterprise features and the needless over-engineering typical of the last decade. That’s why I’m putting so much effort in this conference. And I’m super happy of how it’s rolling out.&lt;/p&gt;  &lt;h3&gt;Registration: Sold out and waitlist is open&lt;/h3&gt;  &lt;p&gt;We opened registration the 18 of September, at midday, and by 2:30PM all the 120 places available have been given out: that means 120 seats in 2:30. The previous record for the other conference I organized was 120 seats in one day, and it was already a big accomplishment.&lt;/p&gt;  &lt;p&gt;At the moment &lt;a href="http://webnetconf.eu/#registration"&gt;only the waitlist is open&lt;/a&gt;, and there are already 40 persons in it: from experience we usually recall 40 people from the waitlist (if people registered are nice and tell us if they planning on not coming anymore), so if you register quickly chances are you might take part in the conference anyway.&lt;/p&gt;  &lt;h3&gt;Agenda&lt;/h3&gt;  &lt;p&gt;I want to thank all the people that &lt;a href="http://codeclimber.net.nz/archive/2012/08/06/Vote-for-the-sessions-you-want-to-attend-at-the.aspx"&gt;voted&lt;/a&gt; during the month of August as they really helped shape the conference: we have received &lt;strong&gt;45&lt;/strong&gt; proposals from &lt;strong&gt;30&lt;/strong&gt; speakers all of which where super interesting, and would have been really difficult for us to choose the 20 sessions for the agenda. Here is the beautiful design of the agenda, designed by the guys of &lt;a href="http://www.greenbubble.it/"&gt;GreenBubble&lt;/a&gt;, an Italian web agency that jumped both feet together with us on this project (click on the image to read the &lt;a href="http://webnetconf.eu/#agenda"&gt;agenda&lt;/a&gt;):&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://webnetconf.eu/#agenda"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="webnetconf-agenda" border="0" alt="webnetconf-agenda" src="http://codeclimber.net.nz/images/codeclimber_net_nz/WindowsLiveWriter/Web.NETEuropeanConference_9190/webnetconf-agenda_3.png" width="404" height="635" /&gt;&lt;/a&gt; &lt;/p&gt;  &lt;p&gt;There will be a lot of international speakers and they’ll talk about WebAPI, REST, OWIN, advanced JavaScript frameworks, and more: all topics strictly related to “simplicity” and lightweight approach in building web applications.&lt;/p&gt;  &lt;p&gt;Now 3 more weeks and the conference will kickoff: it will be a busy period, but really looking forward to meeting in person everyone that made this possible: the speakers, the sponsors and the attendees.&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:84e6c66e-72e0-4433-b0d1-41c5daf789c5" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/webnet12/default.aspx" rel="tag"&gt;webnet12&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/conference/default.aspx" rel="tag"&gt;conference&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/future+of+web/default.aspx" rel="tag"&gt;future of web&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/991.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=HTQa5Ed5oFA:GSEHPbiM8OA:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=HTQa5Ed5oFA:GSEHPbiM8OA:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=HTQa5Ed5oFA:GSEHPbiM8OA:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=HTQa5Ed5oFA:GSEHPbiM8OA:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=HTQa5Ed5oFA:GSEHPbiM8OA:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=HTQa5Ed5oFA:GSEHPbiM8OA:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=HTQa5Ed5oFA:GSEHPbiM8OA:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=HTQa5Ed5oFA:GSEHPbiM8OA:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/HTQa5Ed5oFA" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/09/27/Web-NET-European-Conference-agenda-available-and-sold-out-in.aspx</guid>
            <pubDate>Thu, 27 Sep 2012 09:31:50 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/09/27/Web-NET-European-Conference-agenda-available-and-sold-out-in.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/991.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/09/27/Web-NET-European-Conference-agenda-available-and-sold-out-in.aspx</feedburner:origLink></item>
        <item>
            <title>Vote for the sessions you want to attend at the Web.NET Conference</title>
            <category>Community Life</category>
            <category>ASP.NET</category>
            <category>ASP.NET MVC</category>
            <link>http://feedproxy.google.com/~r/Codeclimber/~3/r5HM0ELRd7Y/Vote-for-the-sessions-you-want-to-attend-at-the.aspx</link>
            <description>&lt;p&gt;Over the month of July, &lt;strong&gt;29&lt;/strong&gt; speaker submitted &lt;strong&gt;44&lt;/strong&gt; presentations' proposals. But we have only 19 slots, so even limiting to one session per speaker we will not be able to accept all the speakers that submitted a proposal.&lt;/p&gt;  &lt;p&gt;Today we are opening the voting phase: till the beginning of September &lt;a href="http://webnetconf.eu/Proposals/Vote"&gt;you’ll be able to vote&lt;/a&gt; for the 5 sessions you’d like to attend to at the Web.NET Conference on the 20 October.&lt;/p&gt;  &lt;p&gt;Speakers are coming from all Europe (and beyond), like &lt;a href="http://nelm.io/pierre"&gt;Pierre Spring&lt;/a&gt; from Switzerland, Niels Hartvig from &lt;a href="http://umbraco.com"&gt;Umbraco&lt;/a&gt;, &lt;a href="http://www.jakobmattsson.se"&gt;Jakob Mattsson&lt;/a&gt; from Sweden, &lt;a href="http://blog.maartenballiauw.be"&gt;Maarten Balliauw&lt;/a&gt;, &lt;a href="http://www.krisvandermast.com"&gt;Kris van der Mast&lt;/a&gt; and &lt;a href="http://jefclaes.be"&gt;Jef Claes&lt;/a&gt; from Belgium, &lt;a href="ayende@ayende.com"&gt;Ayende&lt;/a&gt; from Israel, &lt;a href="http://horsdal.blogspot.com"&gt;Christian Horsdal&lt;/a&gt; from Denmark (first proposal received), &lt;a href="http://code-inside.de"&gt;Robert Mühsig&lt;/a&gt; from Germany. Of course also a lot of Italian, like Roberto Messora, Raffaele Rialdi, Massimiliano Mantione (which is now working on the Chrome’s V8 Javascript compiler) and many more.&lt;/p&gt;  &lt;h3&gt;Which topics have been proposed?&lt;/h3&gt;  &lt;p&gt;Just to give you a taste of what has been proposed, here is a quick list of the topics:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;ASP.NET Web API &lt;/li&gt;    &lt;li&gt;NancyFx, OpenRASTA, FubuMVC &lt;/li&gt;    &lt;li&gt;HTML5, CSS3, Responsive Design &lt;/li&gt;    &lt;li&gt;Owin, SignalR &lt;/li&gt;    &lt;li&gt;Backbone.js and Knockout.js &lt;/li&gt;    &lt;li&gt;Django, Node.js, Sinatra &lt;/li&gt;    &lt;li&gt;Orchard, Umbraco and Sharepoint &lt;/li&gt;    &lt;li&gt;Azure and cloud computing in general &lt;/li&gt;    &lt;li&gt;Javascript performance tips (from someone that builds the V8 compiler for Chrome) &lt;/li&gt;    &lt;li&gt;and much more&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;To get the full list of speaker and topics, just go the &lt;a href="http://webnetconf.eu/"&gt;Web.NET Conference web site&lt;/a&gt;, &lt;a href="http://webnetconf.eu/Auth/Login"&gt;login&lt;/a&gt; with your Twitter or Facebook account, and &lt;a href="http://webnetconf.eu/Proposals/Vote"&gt;vote for the 5 sessions&lt;/a&gt; you would like to attend.&lt;/p&gt;  &lt;p&gt;The voting will stay open till beginning of September. And then we’ll open the registrations to the conference.&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:0e61cfb2-fdaf-4f42-bc25-b0707545b0ab" class="wlWriterEditableSmartContent"&gt;Tags: &lt;a href="http://codeclimber.net.nz/tags/webnet12/default.aspx" rel="tag"&gt;webnet12&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/conference/default.aspx" rel="tag"&gt;conference&lt;/a&gt;, &lt;a href="http://codeclimber.net.nz/tags/voting/default.aspx" rel="tag"&gt;voting&lt;/a&gt;&lt;/div&gt;&lt;img src="http://codeclimber.net.nz/aggbug/990.aspx" width="1" height="1" /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=r5HM0ELRd7Y:Ax5uEvVwiek:D7DqB2pKExk"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=r5HM0ELRd7Y:Ax5uEvVwiek:D7DqB2pKExk" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=r5HM0ELRd7Y:Ax5uEvVwiek:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=r5HM0ELRd7Y:Ax5uEvVwiek:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=r5HM0ELRd7Y:Ax5uEvVwiek:G79ilh31hkQ"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=G79ilh31hkQ" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=r5HM0ELRd7Y:Ax5uEvVwiek:dnMXMwOfBR0"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?d=dnMXMwOfBR0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/Codeclimber?a=r5HM0ELRd7Y:Ax5uEvVwiek:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/Codeclimber?i=r5HM0ELRd7Y:Ax5uEvVwiek:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/Codeclimber/~4/r5HM0ELRd7Y" height="1" width="1"/&gt;</description>
            <dc:creator>Simone Chiaretta</dc:creator>
            <guid isPermaLink="false">http://codeclimber.net.nz/archive/2012/08/06/Vote-for-the-sessions-you-want-to-attend-at-the.aspx</guid>
            <pubDate>Mon, 06 Aug 2012 12:48:13 GMT</pubDate>
            <comments>http://codeclimber.net.nz/archive/2012/08/06/Vote-for-the-sessions-you-want-to-attend-at-the.aspx#feedback</comments>
            <wfw:commentRss>http://codeclimber.net.nz/comments/commentRss/990.aspx</wfw:commentRss>
        <feedburner:origLink>http://codeclimber.net.nz/archive/2012/08/06/Vote-for-the-sessions-you-want-to-attend-at-the.aspx</feedburner:origLink></item>
    </channel>
</rss>
