<?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:blogChannel="http://backend.userland.com/blogChannelModule" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" 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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>ngeor.net | blog</title>
    <description>Proudly under construction since 2010</description>
    <link>http://ngeor.net/blog/</link>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>BlogEngine.NET 2.7.0.0</generator>
    <language>en-US</language>
    <blogChannel:blogRoll>http://ngeor.net/blog/opml.axd</blogChannel:blogRoll>
    <blogChannel:blink>http://www.dotnetblogengine.net/syndication.axd</blogChannel:blink>
    <dc:creator>Nikolaos Georgiou</dc:creator>
    <dc:title>ngeor.net | blog</dc:title>
    <geo:lat>0.000000</geo:lat>
    <geo:long>0.000000</geo:long>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ngeor-blog" /><feedburner:info uri="ngeor-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Installing Ruby on Rails on Windows 8</title>
      <description>&lt;p&gt;I had some problems installing Ruby on Rails on Windows 8 so I'm writing this down as a summary.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Use &lt;a href="http://rubyinstaller.org/downloads/"&gt;RubyInstaller&lt;/a&gt;. I recommend version 1.9.3. With version 2, I run into various problems trying to build native gems (e.g. libiconv not found). By default this will install Ruby at C:\Ruby193. I also recommend selecting the Add Ruby to the PATH during installation, no need to do it manually later.&lt;/li&gt;
&lt;li&gt;From the same site, download DevKit. It's a self extracting archive and you need to extract it to its final location. I extracted it under C:\Ruby193\devkit so it's together with ruby.&lt;/li&gt;
&lt;li&gt;Install DevKit: from a command prompt, go to C:\Ruby193\devkit and run &lt;code&gt;ruby dk.rb init&lt;/code&gt; and then &lt;code&gt;ruby dk.rb install&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Update gem to latest and greatest with &lt;code&gt;gem update --system&lt;/code&gt; and then &lt;code&gt;gem update&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install rails with &lt;code&gt;gem install rails&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Install sqlite3 with &lt;code&gt;gem install sqlite3&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;So far so good. At this point we're ready to start going through the tutorial &lt;a href="http://guides.rubyonrails.org/getting_started.html"&gt;Getting Started with Rails&lt;/a&gt; to create our first application. Let's to that with the command &lt;code&gt;rails new blog&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Among other things in the output, you'll notice that some gems are already present (e.g. json, rails) while others are being installed at that moment (e.g. execjs, coffee-script).&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Installing coffee-script-source (1.6.2)
Installing execjs (1.4.0)
Installing coffee-script (2.2.0)
Using rack-ssl (1.3.3)
Using json (1.7.7)
Installing rdoc (3.12.2)
Using thor (0.18.1)
Using railties (3.2.13)
Installing coffee-rails (3.2.2)
Installing jquery-rails (2.2.1)
Using rails (3.2.13)
Installing sass (3.2.7)
Installing sass-rails (3.2.6)
Using sqlite3 (1.3.7)
Installing uglifier (2.0.1)
Your bundle is complete!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We can run the application at this point with &lt;code&gt;rails server&lt;/code&gt; and indeed it will load the default index.html. Following the tutorial, we can create our first home controller and delete the index.html. The command to do that is &lt;code&gt;rails generate controller home index&lt;/code&gt;. You also need to delete index.html and setup home#index as the default route.&lt;/p&gt;

&lt;p&gt;This is where I had most of the problems. Instead of seeing my hello world message in this very simple controller, I ended up with the following error message in the command prompt:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Completed 500 Internal Server Error in 208ms

ActionView::Template::Error (
  (in C:/Users/nikolaos/Projects/blog/app/assets/javascripts/home.js.coffee)):
    3: &amp;lt;head&amp;gt;
    4:   &amp;lt;title&amp;gt;Blog&amp;lt;/title&amp;gt;
    5:   &amp;lt;%= stylesheet_link_tag    "application", :media =&amp;gt; "all" %&amp;gt;
    6:   &amp;lt;%= javascript_include_tag "application" %&amp;gt;
    7:   &amp;lt;%= csrf_meta_tags %&amp;gt;
    8: &amp;lt;/head&amp;gt;
    9: &amp;lt;body&amp;gt;
  app/views/layouts/application.html.erb:6:in `_app_views_layouts_application_html_erb___564660063_19500504'


  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_trace
.erb (1.0ms)
  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/_reque
st_and_response.erb (1.0ms)
  Rendered C:/Ruby193/lib/ruby/gems/1.9.1/gems/actionpack-3.2.13/lib/action_dispatch/middleware/templates/rescues/templa
te_error.erb within rescues/layout (11.0ms)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;And this is the error message that the browser showed:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; ExecJS::RuntimeError in Home#index

Showing C:/Users/nikolaos/Projects/blog/app/views/layouts/application.html.erb where line #6 raised:


  (in C:/Users/nikolaos/Projects/blog/app/assets/javascripts/home.js.coffee)

Extracted source (around line #6):

3: &amp;lt;head&amp;gt;
4:   &amp;lt;title&amp;gt;Blog&amp;lt;/title&amp;gt;
5:   &amp;lt;%= stylesheet_link_tag    "application", :media =&amp;gt; "all" %&amp;gt;
6:   &amp;lt;%= javascript_include_tag "application" %&amp;gt;
7:   &amp;lt;%= csrf_meta_tags %&amp;gt;
8: &amp;lt;/head&amp;gt;
9: &amp;lt;body&amp;gt;

Rails.root: C:/Users/nikolaos/Projects/blog
Application Trace | Framework Trace | Full Trace

app/views/layouts/application.html.erb:6:in `_app_views_layouts_application_html_erb___564660063_19500504'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Not very descriptive and a bit disappointing that the hello world tutorial doesn't "just work". The error has something to do with CoffeeScript, since the file it complains about is home.js.coffee. CoffeeScript is a nice little language that compiles into Javascript. Rails comes with out of the box support for this (or at least it claims it does). It uses ExecJS, another gem, to compile CoffeeScript into Javascript. ExecJS relies on the presence of a Javascript runtime in order to be able to do that. A lot of people suggested to bypass this problem by "simply installing node.js". However, &lt;a href="https://github.com/sstephenson/execjs"&gt;ExecJS says that on Windows it just uses Microsoft Windows Script Host&lt;/a&gt;. So I decided to keep on searching for a solution. After some more digging I found a &lt;a href="https://github.com/sstephenson/execjs/issues/81"&gt;thread claiming that this problem is specific to Windows 8&lt;/a&gt; and the solution is to modify ExecJS's code... scary to say the least and, again, very disappointing experience but it did the trick.&lt;/p&gt;

&lt;p&gt;You have to modify the file runtimes.rb (assuming you've kept the default paths, it is under C:\Ruby193\lib\ruby\gems\1.9.1\gems\execjs-1.4.0\lib\execjs) and find the block that declares the JScript external runtime (that's Microsoft Windows Script Host) and change it into this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;JScript = ExternalRuntime.new(
  :name        =&amp;gt; "JScript",
  :command     =&amp;gt; "cscript //E:jscript //Nologo",
  :runner_path =&amp;gt; ExecJS.root + "/support/jscript_runner.js",
  :encoding    =&amp;gt; 'UTF-8'
)
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;After this change, my hello world controller worked. I've tried the above procedure in both Windows 8 32 and 64 bits. I was also able to follow the tutorial a bit more by generating the post scaffold and I didn't run into any problems with sqlite, it seems to work. I stopped at the point where he adds a second model, so I don't know if there are any further pitfalls ahead...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/vM6ZYG1sh40" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/vM6ZYG1sh40/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/04/16/Installing-Ruby-on-Rails-on-Windows-8.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=de65e9a4-957f-4728-b144-13725ade06b2</guid>
      <pubDate>Tue, 16 Apr 2013 10:33:00 +0300</pubDate>
      <category>Tech</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=de65e9a4-957f-4728-b144-13725ade06b2</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=de65e9a4-957f-4728-b144-13725ade06b2</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/04/16/Installing-Ruby-on-Rails-on-Windows-8.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=de65e9a4-957f-4728-b144-13725ade06b2</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=de65e9a4-957f-4728-b144-13725ade06b2</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET MVC - Progress update</title>
      <description>&lt;p&gt;Here's a short update on what I've been working on. Time is a bit limited but I like to hack around in this project and that's what it's all about!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Implemented Category and Tag pages&lt;/li&gt;
&lt;li&gt;Initial implementation for RSS feed&lt;/li&gt;
&lt;li&gt;Showing comments in the post page&lt;/li&gt;
&lt;li&gt;Implemented Add, Edit, Delete, Restore and Purge actions for Posts and Pages&lt;/li&gt;
&lt;li&gt;Started working on a blog settings page&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I'm thinking of perhaps setting up an issue tracker to maintain a log of what needs to be done and what has already been done. I don't think I can do that in CodePlex, because that would have to be a tracker just for my branch and I don't think that's supported. Or maybe set up some rough goals like milestones of the project. I'll see how it goes...&lt;/p&gt;

&lt;p&gt;One comment on the Restore and Purge actions: in BlogEngine.NET, when you delete a post or a page it doesn't get completely deleted. It is marked as deleted, but the post file is still there (if you're using the default file based storage). To really delete it, you need to empty the recycle bin in the admin UI. I have taken a different approach in the pages that show lists of posts (homepage, category page, tag page, etc):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;you see all the posts (or pages) you're allowed to based on your permissions&lt;/li&gt;
&lt;li&gt;that includes deleted posts too!&lt;/li&gt;
&lt;li&gt;unpublished and deleted items are presented with a small text label that indicates their status&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I find this view a bit simpler, at least for now... of course the recycle bin concept is probably better (you delete a post for a reason, you don't want to see it in your face all the time) but that will come later.&lt;/p&gt;

&lt;p&gt;Things to come up next:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;pagination for homepage and similar pages&lt;/li&gt;
&lt;li&gt;submitting comments&lt;/li&gt;
&lt;li&gt;uploading images to a post (I want to use &lt;a href="http://imageresizing.net/"&gt;ImageResizing.Net&lt;/a&gt; here)&lt;/li&gt;
&lt;li&gt;implement contact form&lt;/li&gt;
&lt;li&gt;implement blog settings page (only settings that are used).&lt;/li&gt;
&lt;li&gt;support markdown formatting in posts and pages&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;and more, much more!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/42O0WDW1ilQ" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/42O0WDW1ilQ/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/03/13/BlogEngineNET-MVC-Progress-update.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=e47ac295-5d3b-4971-87c9-055db44ac82f</guid>
      <pubDate>Wed, 13 Mar 2013 09:39:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=e47ac295-5d3b-4971-87c9-055db44ac82f</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=e47ac295-5d3b-4971-87c9-055db44ac82f</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/03/13/BlogEngineNET-MVC-Progress-update.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=e47ac295-5d3b-4971-87c9-055db44ac82f</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=e47ac295-5d3b-4971-87c9-055db44ac82f</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET MVC - Posts and Pages</title>
      <description>&lt;p&gt;In the latest commit on BlogEngine.NET MVC, which is &lt;a href="https://blogengine.codeplex.com/SourceControl/network/forks/NikolaosGeorgiou/blogenginemvc"&gt;always available here&lt;/a&gt;, the following have been added:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Page controller. Pages have URLs like http://localhost/page/my-page or http://localhost/secondary-blog/page/my-page if it's on a secondary blog&lt;/li&gt;
&lt;li&gt;Post controller. Post URLs are similar to pages, but the URL segment 'page' changes into 'post'. In addition, BlogEngine.NET supports two versions of URLs: simple (the ones we just described) and timestamped, where the post slug is prefixed by the date of the post. The latter looks like http://localhost/post/2013/03/09/my-post. This preference is set in blog settings and it's already been taken into account in BlogEngine.NET MVC! Depending on the preference, the correct post URL will be generated. Also, the 'incorrect' URL will redirect to the correct one to ensure we don't end up with duplicate URLs (for SEO reasons).&lt;/li&gt;
&lt;li&gt;Stub Archive, Contact and Feed views, so that all the URLs of the homepage point to somewhere.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;Mapping the post URL&lt;/h3&gt;

&lt;p&gt;Mapping the post route is quite simple:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// map posts, with timestamped links
MapBlogRoute(routes,
    name: "PostWithTimestamp",
    url: "post/{year}/{month}/{day}/{slug}/{action}",
    defaults: new { controller = "Post", action = "Index" },
    constraints: new { year = @"\d\d\d\d", month = @"[0-1]\d", day = @"[0-3]\d" }
    ); 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;MapBlogRoute is a helper method that maps the route twice, once for the primary blog and once for the secondary blogs. The constraints make sure we match only numerical values for year, month and day. For month and day, we also make sure the first digit is in the expected range. So if someone tries to access http://localhost/post/2013/20/01/my-post, MVC won't even bother to find the post because no route will match the URL.&lt;/p&gt;

&lt;p&gt;We also need to map the post URL without the timestamp. This is the same situation we saw with the blog name parameter: because the date parameters are in the middle of the URL, they can't be simply ignored.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;// map posts, without timestamped links
MapBlogRoute(routes,
    name: "PostWithoutTimestamp",
    url: "post/{slug}/{action}",
    defaults: new { controller = "Post", action = "Index" }
    ); 
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Simple enough!&lt;/p&gt;

&lt;h3&gt;Generating URLs to posts&lt;/h3&gt;

&lt;p&gt;In the views, we'll be generating links to posts. We want a simple way of passing a post and getting a URL to that post. Plus, the URL should respect the blog settings regarding whether the user wants timestamped post URLs or plain URLs. This is best done in a view helper. Here's the method that does the trick. It's inside HtmlHelpers/UrlHelpers, were more extension methods like these can be put:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Gets the URL of a post.
/// &amp;lt;/summary&amp;gt;
/// &amp;lt;remarks&amp;gt;
/// &amp;lt;see cref="BlogSettings.TimeStampPostLinks"/&amp;gt; controls if the URL
/// will contain the date of the post or not.
/// &amp;lt;/remarks&amp;gt;
/// &amp;lt;param name="urlHelper"&amp;gt;The url helper.&amp;lt;/param&amp;gt;
/// &amp;lt;param name="post"&amp;gt;The post.&amp;lt;/param&amp;gt;
/// &amp;lt;returns&amp;gt;The URL of the post.&amp;lt;/returns&amp;gt;
public static string PostUrl(this UrlHelper urlHelper, Post post)
{
    BlogSettings blogSettings = BlogSettings.GetInstanceSettings(post.Blog);
    object defaults;
    if (blogSettings.TimeStampPostLinks)
    {
        defaults = new
        {
            blogName = BlogNameInRoute(post.Blog),
            year = post.DateCreated.ToString("yyyy"),
            month = post.DateCreated.ToString("MM"),
            day = post.DateCreated.ToString("dd"),
            slug = post.Slug
        };
    }
    else
    {
        defaults = new
        {
            blogName = BlogNameInRoute(post.Blog),
            slug = post.Slug
        };
    }

    return urlHelper.Action("Index", "Post", defaults);
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;To use this helper, we need to import it in the view. It's just an extension method, so basically you just need to import the namespace. Here it is in action inside the updated homepage view:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;@using BlogEngine.Core
@using BlogEngine.Mvc.Helpers
@{
    ViewBag.Title = BlogSettings.Instance.Name;
}

&amp;lt;h2&amp;gt;@ViewBag.Title&amp;lt;/h2&amp;gt;
&amp;lt;ul&amp;gt;
    @foreach (Post post in ViewBag.Posts)
    {
        &amp;lt;li&amp;gt;&amp;lt;a href="@Url.PostUrl(post)"&amp;gt;@post.Title&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
    }
&amp;lt;/ul&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What's next? Since we have posts and pages and &lt;a href="http://ngeor.net/blog/post/2013/03/07/BlogEngineNET-MVC-Login-time.aspx"&gt;we're able to login&lt;/a&gt;, maybe next time we can edit a post...&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/dRKElN_yKFs" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/dRKElN_yKFs/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/03/09/BlogEngineNET-MVC-Posts-and-Pages.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=cef5d3bf-6089-4dcf-b244-9f52d7c0b9b8</guid>
      <pubDate>Sat, 09 Mar 2013 10:18:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=cef5d3bf-6089-4dcf-b244-9f52d7c0b9b8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=cef5d3bf-6089-4dcf-b244-9f52d7c0b9b8</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/03/09/BlogEngineNET-MVC-Posts-and-Pages.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=cef5d3bf-6089-4dcf-b244-9f52d7c0b9b8</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=cef5d3bf-6089-4dcf-b244-9f52d7c0b9b8</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET MVC - Login time</title>
      <description>&lt;p&gt;It's not difficult to implement a basic login system. BlogEngine.NET comes with its own membership and roles providers, so all we need to do is create a controller that uses the standard Membership features of .NET.&lt;/p&gt;

&lt;p&gt;To speed things up, I copy pasted the AccountController that is generated when you create a new MVC project in Visual Studio and select the template Internet Application. That controller actually does a whole lot more than what we need (e.g. authenticate via Facebook), so I removed the extra parts, keeping only the login functionality.&lt;/p&gt;

&lt;p&gt;The login form does look a bit crappy, but I'm not interested in styling anything so far:&lt;/p&gt;

&lt;p&gt;&lt;img src=/blog/thumbs/medium/2013/03/blogengine-mvc-login.png alt="" /&gt;&lt;/p&gt;

&lt;p&gt;And after logging in with admin admin (the default credentials of BlogEngine.NET), you get a nice welcome message in the homepage:&lt;/p&gt;

&lt;p&gt;&lt;img src=/blog/thumbs/medium/2013/03/blogengine-mvc-logged-in.png alt="" /&gt;&lt;/p&gt;

&lt;p&gt;We're logged in!&lt;/p&gt;

&lt;h3&gt;But wait, there's more!&lt;/h3&gt;

&lt;p&gt;I added some HTML into the layout (it seems that's the name for master pages in ASP.NET MVC) of the site that is dependent on the current blog. That means that for every view that is been rendered, it is important we don't forget to set the Blog.InstanceIdOverride property, otherwise BlogEngine.NET will attempt to figure out the current blog on its own.&lt;/p&gt;

&lt;p&gt;Now, we could go and make some base controller class that has that functionality as a method, but it's too soon to start building class hierarchies that we might later regret (although the base controller will probably come in handy later). Plus, ASP.NET MVC has a cool feature called &lt;a href="http://www.asp.net/mvc/tutorials/older-versions/controllers-and-routing/understanding-action-filters-cs"&gt;action filters&lt;/a&gt;. You can create a .NET attribute and decorate an action or even a controller and affect the executing action.&lt;/p&gt;

&lt;p&gt;With that in mind, I implemented a SetCurrentBlogAttribute and I decorated my two controllers (HomeController and AccountController). The attribute intercepts each executing action and determines what the current blog is. The implementation is based on the GetBlog method we saw in the &lt;a href="http://ngeor.net/blog/post/2013/03/06/BlogEngineNET-MVC-Hello-world.aspx"&gt;previous post&lt;/a&gt;. The whole attribute implementation looks like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = false, Inherited = true)]
public class SetCurrentBlogAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        base.OnActionExecuting(filterContext);

        string blogName = null;
        if (filterContext.RouteData.Values.ContainsKey("blogName"))
        {
            blogName = filterContext.RouteData.Values["blogName"] as string;
        }

        Blog blog;
        if (string.IsNullOrWhiteSpace(blogName))
        {
            // we're loading the primary blog
            blog = Blog.Blogs.Find(b =&amp;gt; b.IsActive &amp;amp;&amp;amp; b.IsPrimary &amp;amp;&amp;amp; !b.IsDeleted);
        }
        else
        {
            // we're loading a secondary blog
            blog = Blog.Blogs.Find(b =&amp;gt; b.IsActive
                &amp;amp;&amp;amp; !b.IsPrimary
                &amp;amp;&amp;amp; !b.IsDeleted
                &amp;amp;&amp;amp; string.Equals(blogName, b.Name, StringComparison.InvariantCultureIgnoreCase));
        }

        if (blog == null)
        {
            // TODO: return 404 instead
            throw new InvalidOperationException("Blog not found");
        }

        // important: this will make BlogEngine.Core use this blog as the 'current' blog
        // and don't make any assumptions using the URL etc
        Blog.InstanceIdOverride = blog.Id;
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, as long as there is a 'blogName' parameter in the route, the correct blog will be set as current blog and we'll be able to seamlessly use the standard BlogEngine.Core API.&lt;/p&gt;

&lt;p&gt;Coming up next? Building up post and page links... stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/Ooc3zo4gWcI" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/Ooc3zo4gWcI/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/03/07/BlogEngineNET-MVC-Login-time.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=887e2918-6d4e-4c5f-af41-cb738f84b5fe</guid>
      <pubDate>Thu, 07 Mar 2013 10:11:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=887e2918-6d4e-4c5f-af41-cb738f84b5fe</pingback:target>
      <slash:comments>1</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=887e2918-6d4e-4c5f-af41-cb738f84b5fe</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/03/07/BlogEngineNET-MVC-Login-time.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=887e2918-6d4e-4c5f-af41-cb738f84b5fe</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=887e2918-6d4e-4c5f-af41-cb738f84b5fe</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET MVC - Hello world</title>
      <description>&lt;p&gt;So, to share a bit more of my excitement, here's a screenshot of the classic ASP.NET and the MVC versions running side by side:&lt;/p&gt;

&lt;p&gt;&lt;a href=/blog/thumbs/full/2013/03/blogengine-mvc-side-by-side.png&gt;&lt;img src=/blog/thumbs/medium/2013/03/blogengine-mvc-side-by-side.png alt="" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;So we got a homepage working! Hurray! Keep on reading for more in depth details.&lt;/p&gt;

&lt;h3&gt;Copy pasting from the website&lt;/h3&gt;

&lt;p&gt;Before we even start, we need to copy paste a few things from the website project into the MVC project:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;copy pasted the App_Data folder into the MVC project. We have in this way the same start up sample data as the web site project.&lt;/li&gt;
&lt;li&gt;modified the Web.config to have the necessary BlogEngine sections, the BlogEngine related app settings and the BlogEngine Membership and Roles providers.&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;Routing&lt;/h3&gt;

&lt;p&gt;For rendering the blog's homepage, we need to map two routes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;one route for the primary blog that corresponds to the root URL e.g. http://myhost/&lt;/li&gt;
&lt;li&gt;one route for all the secondary blogs that correspond to URLs like http://myhost/myblog/&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;BlogEngine.NET supports multiple blogs (in fact my site is built with that feature) so we're going to support this feature. Unfortunately, the 'myblog' URL segment is in the beginning of the URL so, after a short investigation I did, it seems that optional URL parameters only work at the end of the URL.&lt;/p&gt;

&lt;p&gt;The problem is clearer when you think of the URLs that we'll be building next, for instance the URLs of posts and pages. So http://myhost/page/mypage and http://myhost/myblog/page/myotherpage need to be two different routes:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;page/{pageName}/{action} (primary blog's pages route)&lt;/li&gt;
&lt;li&gt;{blogName}/page/{pageName}/{action} (secondary blog's pages route)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;because the {blogName} parameter appears in the beginning of the URL.&lt;/p&gt;

&lt;p&gt;Of course there's going to be only one controller handling this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;public class PageController
{

    public ActionResult Index(string blogName, string pageName)
    {
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;I'll try again to see if it's possible to do it with a single route definition, but it's not really a problem, just an annoying detail of implementation.&lt;/p&gt;

&lt;h3&gt;Routing constraint&lt;/h3&gt;

&lt;p&gt;To make sure our secondary blog route doesn't collide with action names, we're going to use a custom routing constraint. Here's how the secondary blog's homepage is mapped:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;routes.MapRoute(
    name: "SecondaryHome",
    url: "{blogName}/{action}",
    defaults: new { controller = "Home", action = "Index" },
    constraints: new { blogName = new BlogNameConstraint() }
    );
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;and here's the implementation of the constraint:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;/// &amp;lt;summary&amp;gt;
/// Routing constraint that matches a secondary blog name.
/// &amp;lt;/summary&amp;gt;
public class BlogNameConstraint : IRouteConstraint
{
    public bool Match(HttpContextBase httpContext,
            Route route,
            string parameterName,
            RouteValueDictionary values,
            RouteDirection routeDirection)
    {
        // match if the blog is active, not deleted, not primary and the name matches of course
        string blogName = (string)values[parameterName];
        return !string.IsNullOrWhiteSpace(blogName) &amp;amp;&amp;amp;
               Blog.Blogs.Any(
                   b =&amp;gt; !b.IsDeleted
                       &amp;amp;&amp;amp; !b.IsPrimary
                       &amp;amp;&amp;amp; b.IsActive
                       &amp;amp;&amp;amp; string.Equals(b.Name, blogName, StringComparison.InvariantCultureIgnoreCase));
    }
}
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;With this constraint, the URL:&lt;/p&gt;

&lt;p&gt;http://myhost/Feed will be interpreted as the primary blog's RSS feed (action = Feed).&lt;/p&gt;

&lt;p&gt;but this URL:&lt;/p&gt;

&lt;p&gt;http://myhost/blog will be interpreted as the secondary blog's homepage (action = Index), and not as the non-existing 'blog' action of the primary blog route.&lt;/p&gt;

&lt;p&gt;Unless of course... you chose to name your secondary blog after an existing action of the HomeController. Let's say our HomeController has an action called Feed that renders the RSS feed of the blog (we're probably going to built it). If you call your secondary blog 'Feed', it will be impossible to determine if the URL:&lt;/p&gt;

&lt;p&gt;http://myhost/Feed&lt;/p&gt;

&lt;p&gt;is supposed to be the primary blog's RSS feed or the secondary blog's homepage.&lt;/p&gt;

&lt;p&gt;So the conclusion is: you must not name your secondary blogs after actions of the homepage controller. Also, you shouldn't shoot yourself in the foot, but you already knew that.&lt;/p&gt;

&lt;h3&gt;Controller implementation&lt;/h3&gt;

&lt;p&gt;The controller's default implementation is very simple:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    public ActionResult Index(string blogName)
    {
        Blog blog = GetBlog(blogName);
        ViewBag.Blog = blog;
        ViewBag.Posts = Post.Posts.Take(BlogSettings.Instance.PostsPerPage).ToArray();
        return View();
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;this should look familiar to a person who's used BlogEngine before. The important work is happening of course in that GetBlog method. Let's have a look:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;    private Blog GetBlog(string blogName)
    {
        Blog blog;
        if (string.IsNullOrWhiteSpace(blogName))
        {
            // we're loading the primary blog
            blog = Blog.Blogs.FirstOrDefault(b =&amp;gt; b.IsActive &amp;amp;&amp;amp; b.IsPrimary &amp;amp;&amp;amp; !b.IsDeleted);
        }
        else
        {
            // we're loading a secondary blog
            blog = Blog.Blogs.FirstOrDefault(b =&amp;gt; b.IsActive 
                    &amp;amp;&amp;amp; !b.IsPrimary
                    &amp;amp;&amp;amp; !b.IsDeleted
                    &amp;amp;&amp;amp; string.Equals(blogName, b.Name, StringComparison.InvariantCultureIgnoreCase));
        }

        if (blog == null)
        {
            // TODO: return 404 instead
            throw new InvalidOperationException("Blog not found");
        }

        // important: this will make BlogEngine.Core use this blog as the 'current' blog
        // and don't make any assumptions using the URL etc
        Blog.InstanceIdOverride = blog.Id;
        return blog;
    }
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So, like I said before, the blogName can indicate we're loading a secondary blog. If it's missing, then we're loading the primary blog of the site.&lt;/p&gt;

&lt;p&gt;The BlogEngine API heavily relies on Blog.CurrentInstance, which indicates what the current blog is. When you're loading Posts, it is loading Posts for the current blog. When you're loading blog settings, it is loading the settings of the current blog, and so on. Figuring out what the current blog is, is something that is heavily intertwined with the current HttpContent, the URLs, the request, etc. We really don't want to use that plumbing, because it's not MVC and because we already know what the current blog is based on MVC routing. Luckily, there's an InstanceIdOverride property that we can use to tell BlogEngine.NET what the current blog is. If that property is set, the default logic that evaluates the current blog is never executed.&lt;/p&gt;

&lt;p&gt;The code is &lt;a href="https://blogengine.codeplex.com/SourceControl/network/forks/NikolaosGeorgiou/blogenginemvc"&gt;available on Codeplex&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/pGQ2yw0w0Z8" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/pGQ2yw0w0Z8/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/03/06/BlogEngineNET-MVC-Hello-world.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=aad593c4-318a-4b64-bf64-8a4894777a97</guid>
      <pubDate>Wed, 06 Mar 2013 16:02:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=aad593c4-318a-4b64-bf64-8a4894777a97</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=aad593c4-318a-4b64-bf64-8a4894777a97</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/03/06/BlogEngineNET-MVC-Hello-world.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=aad593c4-318a-4b64-bf64-8a4894777a97</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=aad593c4-318a-4b64-bf64-8a4894777a97</feedburner:origLink></item>
    <item>
      <title>BlogEngine.NET MVC</title>
      <description>&lt;p&gt;Finally, I got to play with ASP.NET MVC for a real project at work. I really enjoyed it, but it lasted only for a few weeks.&lt;/p&gt;

&lt;p&gt;I decided to dig into it a bit more, as a learning exercise at first. I started working on implementing BlogEngine.NET as an MVC project, keeping the same core but with a different frontend. I coded away a little bit during the weekend and made great progress fast.&lt;/p&gt;

&lt;p&gt;I'll try to re-create that work publicly and extend it, on a fork available &lt;a href="http://blogengine.codeplex.com/SourceControl/network/forks/NikolaosGeorgiou/blogenginemvc"&gt;on CodePlex&lt;/a&gt;. As I add more code, I'll be blogging about it here.&lt;/p&gt;

&lt;p&gt;The code committed so far contains pretty much nothing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;an empty MVC project&lt;/li&gt;
&lt;li&gt;the solution upgraded to Visual Studio 2012 format&lt;/li&gt;
&lt;li&gt;the existing web project using IIS Express&lt;/li&gt;
&lt;li&gt;NuGet Package Restore enabled (to avoid committing all the package binaries)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In the end of this project, if it is successful, I'll use it to run my site (eat your own dogfood and all that).&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/UA-5CNBDkGw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/UA-5CNBDkGw/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/03/06/BlogEngineNET-MVC.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=e8d2140b-93ec-4e20-9d6f-2823fb5f9654</guid>
      <pubDate>Wed, 06 Mar 2013 14:16:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=e8d2140b-93ec-4e20-9d6f-2823fb5f9654</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=e8d2140b-93ec-4e20-9d6f-2823fb5f9654</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/03/06/BlogEngineNET-MVC.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=e8d2140b-93ec-4e20-9d6f-2823fb5f9654</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=e8d2140b-93ec-4e20-9d6f-2823fb5f9654</feedburner:origLink></item>
    <item>
      <title>w3c-nant version 1.2.0 released</title>
      <description>&lt;p&gt;Version 1.2.0 of w3c-nant was released today. This version contains some improvements submitted by Rob Richardson:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ability to store the status code of an FTP task in a property, using the new resultproperty attribute&lt;/li&gt;
&lt;li&gt;better handling of exceptions&lt;/li&gt;
&lt;li&gt;ftpUpload task exposes the overwritecondition attribute, which was previously only available through the core API. This way you can control when remote file will be overwritten during upload.&lt;/li&gt;
&lt;li&gt;less messages in the log file, unless verbose is turned on&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Also a small bug was fixed regarding the Never value of overwrite condition: instead of uploading only files that don't exist remotely, this mode would instead always overwrite remote files and never upload new ones.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/3AXwOKO5CDw" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/3AXwOKO5CDw/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/02/16/w3c-nant-version-1-2-0-released.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=fdb826b6-95e7-4c70-967f-63a27ad69506</guid>
      <pubDate>Sat, 16 Feb 2013 17:14:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=fdb826b6-95e7-4c70-967f-63a27ad69506</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=fdb826b6-95e7-4c70-967f-63a27ad69506</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/02/16/w3c-nant-version-1-2-0-released.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=fdb826b6-95e7-4c70-967f-63a27ad69506</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=fdb826b6-95e7-4c70-967f-63a27ad69506</feedburner:origLink></item>
    <item>
      <title>Ακόμα πιο νέο ανεπίσημο podcast για Ελληνοφρένεια</title>
      <description>&lt;p&gt;Διαθέσιμο εδώ:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://ngeor.net/ellinofreneia/rssnew.xml"&gt;http://ngeor.net/ellinofreneia/rssnew.xml&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Το παλιό podcast βασίζεται στο real.gr και υπάρχουν δύο προβλήματα κατά καιρούς:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;καμιά φορά (όπως σήμερα) δεν ανεβάζουν τις εκπομπές εκεί εγκαίρως ή και καθόλου&lt;/li&gt;
&lt;li&gt;περιστασιακά μπορεί η HTML που ανεβάζουν (είναι προφανώς με το χέρι κάθε φορά) να περιέχει μικρές διαφορές (ή ακόμα και λάθη τύπου λατινικό M στη θέση του ελληνικού Μ) που «μπερδεύουν» το πρόγραμμά μου που ανιχνεύει τις εκπομπές...&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Το "ακόμα πιο νέο" ανεπίσημο podcast τσιμπάει τις εκπομπές από το ellinofreneia.net. Ελπίζω αυτό να πάει καλύτερα.&lt;/p&gt;

&lt;p&gt;Τα παλιά URLs θα εξακολουθούν να ενημερώνονται μέχρι νεωτέρας.&lt;/p&gt;

&lt;h2&gt;Πώς να βάλετε το "ακόμα πιο νέο" ανεπίσημο podcast της Ελληνοφρένειας στο iTunes&lt;/h2&gt;

&lt;p&gt;Ακολουθώντας τα παρακάτω βήματα:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Ανοίξτε το iTunes&lt;/li&gt;
&lt;li&gt;Πηγαίνετε στο μενού File, επιλέξτε Subscribe to Podcast&lt;/li&gt;
&lt;li&gt;Στο παραθυράκι που ζητάει το URL, δώστε το URL που υπάρχει στην αρχή αυτού του post&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Αν όλα πάνε καλά, θα το αναγνωρίσει και θα αρχίσει να κατεβάζει την τελευταία εκπομπή.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/7mevHg94XcE" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/7mevHg94XcE/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2013/02/07/ellinofreneia-v3.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=12a868b6-b7e4-4761-917c-fc8e166326d6</guid>
      <pubDate>Thu, 07 Feb 2013 00:36:00 +0300</pubDate>
      <category>Projects</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=12a868b6-b7e4-4761-917c-fc8e166326d6</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=12a868b6-b7e4-4761-917c-fc8e166326d6</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2013/02/07/ellinofreneia-v3.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=12a868b6-b7e4-4761-917c-fc8e166326d6</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=12a868b6-b7e4-4761-917c-fc8e166326d6</feedburner:origLink></item>
    <item>
      <title>State of Greece, October 2012</title>
      <description>&lt;p&gt;A lot of things are happening in Greece and they're happening fast. People are worried that Greece will leave the eurozone because of the economy. But I think they should be worried that Greece will leave the EU because of its constant decline from a state of law and order. Instead of solving the economy's problems, the applied policies are turning the uneducated masses to fascism at numbers never seen in the past.&lt;/p&gt;

&lt;h2&gt;Police&lt;/h2&gt;

&lt;p&gt;In the western world, the police is usually an impartial tool that is used to keep law and order. Their motto is "to serve and protect" (at least in American TV shows). In Greece that motto is becoming "to serve and protect our neo-nazi friends".&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In the recent elections, &lt;a href="http://rt.com/news/greek-police-vote-nazis-350/"&gt;neo-nazi party got more votes in the designated polling stations where riot police officers vote&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;People are been preemptively detained by the police before scheduled protests.&lt;/li&gt;
&lt;li&gt;Police started publishing photos of people they arrest during protests online on the police website. What is funny here is that they don't even hesitate posting photos of people they've previously beaten up, making sometimes their website look like a hospital website...&lt;/li&gt;
&lt;li&gt;The most shocking report (shocking to people who didn't see this coming) was Guardian's report of &lt;a href="http://www.guardian.co.uk/world/2012/oct/09/greek-antifascist-protesters-torture-police"&gt;Abu Ghraib style tortures in Attica General Police Directorate (GADA)&lt;/a&gt;. Minister's response? He's thinking of suing the Guardian. Maybe he should also sue organizations that report Greece as #4 in the list of human rights violations. Greek media have completely buried this story.&lt;/li&gt;
&lt;li&gt;In general, the police seems to operate beyond the law. They always had, but not as open as this. Another story by the Guardian where a &lt;a href="http://www.guardian.co.uk/world/2012/oct/11/greek-police-protester-human-shield"&gt;riot police officer used a protestor as a human shield&lt;/a&gt; passed by without any reaction by the police or the government.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Neo-nazis escalate violence&lt;/h2&gt;

&lt;p&gt;In the western world, these people belong in prison. In Germany, their symbols are illegal. In Greece, these street thugs and night life criminals are now members of the parliament. As any other parliament party, they get free money (probably EU money since Greece is bankrupt). From a zero point nothing percent in the previous elections, they rose to a whopping 7 percent. According to the polls, their popularity is soaring and they appear to be at 10 percent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Children are stopped on streets by motorcycle gangs asked to prove they're Greek by reciting the alphabet or so. These reports allegedly come from complaints on embassies in Greece that the victims made.&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.euronews.com/2012/08/01/no-non-greeks-athens-exclusive-food-bank/"&gt;Food drive for Greeks only&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.reuters.com/article/2012/07/12/us-greece-blood-idUSBRE86B0TN20120712"&gt;Blood drive for Greeks only&lt;/a&gt; (this idea was rejected by doctors as racist)&lt;/li&gt;
&lt;li&gt;Petrol bombing of immigrant houses, beating up random immigrants based on their skin tone. The police role in this is typically to ignore the victim's complain and check out if they have a permit.&lt;/li&gt;
&lt;li&gt;Attacking benches of immigrants in flea markets, assuming the role of the police (with the presence of neo-nazi MPs).&lt;/li&gt;
&lt;li&gt;Meanwhile, I understand that Greek TV is presenting the neo-nazi in the life style section as a harmless sensation. I don't watch Greek TV (or any TV) so I don't know the extent of this.&lt;/li&gt;
&lt;li&gt;Most recent absurdity: the government was fast to comply to a neo-nazi MP's question about how many foreign children exist in public kindergartens. Local authorities refused to reply to the government with that data. One of the promises of the neo-nazi party before the elections was that they will enter hospitals and schools to kick out foreigners.&lt;/li&gt;
&lt;li&gt;Most recent stunt: neo-nazi MPs together with fanatic Christians cancel the premiere of a 'blaspheme' theater play. In that incident a journalist got beaten up by a neo-nazi MP in front of the police.&lt;/li&gt;
&lt;li&gt;They're spreading their hate speech &lt;a href="http://www.nytimes.com/2012/10/01/world/europe/amid-greeces-worries-the-rise-of-right-wing-extremists.html"&gt;even in New York&lt;/a&gt;. At least there the Greek community was swift to condemn them.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Economy&lt;/h2&gt;

&lt;p&gt;Nothing good here either. Lending money from the EU and IMF in order to solve the money lending problem. It's usually quiet until the time comes where Greece has to receive the next loan installment and then everyone starts running around panicking.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Unemployment continues to rise constantly, &lt;a href="http://www.bbc.co.uk/news/business-19911058"&gt;reaching around 25%&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Economy to enter the &lt;a href="http://www.reuters.com/article/2012/10/01/us-greece-budget-idUSBRE88R0OI20121001"&gt;6th year of recession&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;MPs &lt;a href="http://www.athensnews.gr/portal/1/57573"&gt;continue to get jobs for their children in the parliament&lt;/a&gt;, just like in the good old days.&lt;/li&gt;
&lt;li&gt;No real reforms. Only new taxes upon taxes. People who could tax evade will continue to tax evade.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;Summary&lt;/h2&gt;

&lt;p&gt;The economy is not doing very well, but it is exposing the backward side of Greece. Institutions don't live up to their role. In the collapse of the organized state, if there ever was one, the gap is been filled by nationalists. The rule of law is losing to the rule of might. Unless the official state decides to uphold the law, things will only get worse.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/wqyrBaIgdKc" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/wqyrBaIgdKc/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2012/10/14/State-of-Greece-October-2012.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=fb5e1e44-2bc3-470a-a1a9-c4d6580be5d8</guid>
      <pubDate>Sun, 14 Oct 2012 09:41:00 +0300</pubDate>
      <category>News and Politics</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=fb5e1e44-2bc3-470a-a1a9-c4d6580be5d8</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=fb5e1e44-2bc3-470a-a1a9-c4d6580be5d8</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2012/10/14/State-of-Greece-October-2012.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=fb5e1e44-2bc3-470a-a1a9-c4d6580be5d8</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=fb5e1e44-2bc3-470a-a1a9-c4d6580be5d8</feedburner:origLink></item>
    <item>
      <title>Run dotCover from msbuild and ccnet</title>
      <description>&lt;p&gt;TeamCity is a very nice tool that I use at home. Unfortunately the free license allows up to 20 configurations. That's why I'm experimenting also with another free tool, CruiseControl. It's definitely not as easy as TeamCity, you have to edit (which means learn) an XML file that the server picks up. In general, it probably supports what TeamCity supports, but you have to make everything yourself with a lot of work. Then again, it's completely free.&lt;/p&gt;

&lt;p&gt;What I wanted to setup is code coverage. TeamCity offers its own tool out of the box, dotCover. Since that tool is just a command line program, I figured I could reuse it in CruiseControl.&lt;/p&gt;

&lt;h2&gt;dotCover&lt;/h2&gt;

&lt;p&gt;dotCover is the tool that does the work behind the scenes. In order to invoke it manually, in combination with NUnit, you'll have to run the dotCover executable like this (&lt;strong&gt;all command lines are broken down to multiple lines for readability, should be in a single line&lt;/strong&gt;):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dotCover analyse
    /TargetExecutable:nunit-console.exe
    /TargetArguments:MyProject.Tests.dll
    /TargetWorkingDir:MyProject.Tests\bin\Debug
    /Output:report.xml
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This command will run the tests in the MyProject.Tests.dll with nunit and produce an XML code coverage report in report.xml. The XML report can be useful for generating graphs and statistics (haven't experimented with that yet). It is however possible to generate a much more friendly HTML report by running the command like this:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;dotCover analyse
    /TargetExecutable:nunit-console.exe
    /TargetArguments:MyProject.Tests.dll
    /TargetWorkingDir:MyProject.Tests\bin\Debug
    /ReportType:HTML
    /Output:report.html
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This will generate the report.html file and a folder with CSS and JS that provide a pretty code coverage report.&lt;/p&gt;

&lt;p&gt;&lt;img src=/blog/thumbs/medium/2012/09/dotCover-report.png alt="dotCover HTML report" title="dotCover HTML report" /&gt;&lt;/p&gt;

&lt;p&gt;It is also possible to generate both the XML and HTML reports. To do that, you only need to run the time consuming dotCover coverage part just once. Then, you run dotCover again twice to generate the two reports, telling it to work on the intermediate coverage report file produced on the first run. We'll use that in our build file.&lt;/p&gt;

&lt;h2&gt;Environment Variables&lt;/h2&gt;

&lt;p&gt;The previous examples of course assume that the dotCover and nunit-console executables are in the same folder or in the PATH. Usually, that's not the case. To make our setup more robust, we'll introduce two environment variables before going any further:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;DOTCOVER_HOME -&gt; C:\TeamCity\buildAgent\tools\dotCover&lt;/li&gt;
&lt;li&gt;NUNIT_HOME -&gt; C:\Program Files (x86)\NUnit 2.5.10\bin\net-2.0&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The first path is the path where dotCover.exe resides. The second path is where nunit-console.exe should be found.&lt;/p&gt;

&lt;h2&gt;MSBuild&lt;/h2&gt;

&lt;p&gt;Now is the time to hack into our csproj file. We could do this directly in CruiseControl's ccnet.config file actually. However, I prefer modifying the csproj file because:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;the syntax is simpler&lt;/li&gt;
&lt;li&gt;I can run it from my development machine as well as from my build server&lt;/li&gt;
&lt;li&gt;even if I switch to a different build server, it will work (provided it supports msbuild)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;We'll use the AfterBuild target. Also, because we typically don't want to run dotCover on every build on our development machine (or maybe you do, your call), we'll only launch dotCover if a certain parameter is passed to msbuild, e.g. RunDotCover=true.&lt;/p&gt;

&lt;p&gt;We need to configure the exec task. It accepts a single command line. Because it's likely that our executables (dotCover and nunit-console) are in paths that contain spaces, we need to wrap these paths in quotes. In MSBuild that is actually done in an ugly way, using the &lt;code&gt;&amp;amp;quot;&lt;/code&gt; escape:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;Exec Command="&amp;amp;quot;$(DOTCOVER_HOME)\dotCover&amp;amp;quot;
     /TargetExecutable:&amp;amp;quot;$(NUNIT_HOME)\nunit-console.exe&amp;amp;quot;" /&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Let's define some properties first to keep things a bit neat:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;PropertyGroup&amp;gt;
    &amp;lt;DotCoverOutputPath&amp;gt;$(OutputPath)dotCover\&amp;lt;/DotCoverOutputPath&amp;gt;
    &amp;lt;DotCoverExe&amp;gt;&amp;amp;quot;$(DOTCOVER_HOME)\dotCover.exe&amp;amp;quot;&amp;lt;/DotCoverExe&amp;gt;
    &amp;lt;NUnitConsoleExe&amp;gt;&amp;amp;quot;$(NUNIT_HOME)\nunit-console.exe&amp;amp;quot;&amp;lt;/NUnitConsoleExe&amp;gt;
    &amp;lt;DotCoverFilters&amp;gt;+:MyProject*;-:nunit*&amp;lt;/DotCoverFilters&amp;gt;
&amp;lt;/PropertyGroup&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;The properties we just defined are:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DotCoverOutputPath&lt;/strong&gt;. The path where dotCover will place its reports. That's typically bin\Debug\dotCover. Notice that we're building on top of the existing OutputPath property, so if we're targeting 64bit build the path will adjust itself to bin\x64\Debug\dotCover.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DotCoverExe&lt;/strong&gt;. This is the full path of the dotCover.exe. Notice how we're using the DOTCOVER_HOME environment variable.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;NUnitConsoleExe&lt;/strong&gt;. This is the full path of the nunit-console.exe. Again, we're building on top of the environment variable we defined earlier. No need to worry if it's under Program Files or Program Files (x86) or a custom location.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DotCoverFilters&lt;/strong&gt;. This is going to be used as the Filters argument to the dotCover call. It has a strange syntax (you can read about it in dotCover's help message) that allows you to include or exclude assemblies and namespaces from the final report. The value specified in the above code block says we want to keep anything that starts with "MyProject" and we want to exclude nunit from the report (by default it gets included too).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;With these properties, let's see how our AfterBuild target looks like now:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;Target Name="AfterBuild" Condition="$(RunDotCover) != ''"&amp;gt;
    &amp;lt;Message Text="Running dotCover" /&amp;gt;
    &amp;lt;Exec Command="$(DotCoverExe) cover /TargetExecutable:$(NUnitConsoleExe)
        /TargetArguments=$(AssemblyName).dll
        /TargetWorkingDir=$(OutputPath)
        /Output=$(DotCoverOutputPath)$(AssemblyName).cover
        /Filters=$(DotCoverFilters)" /&amp;gt;
    &amp;lt;Message Text="Creating XML report" /&amp;gt;
    &amp;lt;Exec Command="$(DotCoverExe) report
        /Source:$(DotCoverOutputPath)$(AssemblyName).cover
        /Output:$(DotCoverOutputPath)$(AssemblyName).xml" /&amp;gt;    
    &amp;lt;Message Text="Creating HTML report" /&amp;gt;
    &amp;lt;Exec Command="$(DotCoverExe) report
        /Source:$(DotCoverOutputPath)$(AssemblyName).cover
        /Output:$(DotCoverOutputPath)$(AssemblyName).html
        /ReportType:HTML" /&amp;gt;
&amp;lt;/Target&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;We're reusing the AssemblyName property. So if our test project is called MyProject.Tests, we'll end up with a folder bin\Debug\dotCover containing the following:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;MyProject.Tests.cover - dotCover's code coverage report (the intermediate file needed to generate the text reports)&lt;/li&gt;
&lt;li&gt;MyProject.Tests.xml - the XML report&lt;/li&gt;
&lt;li&gt;MyProject.Tests.html (and a subfolder with CSS and JS) - the HTML report&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Notice also that the target will only run if the &lt;strong&gt;RunDotCover&lt;/strong&gt; parameter has been set. So by default when you're just building in Visual Studio this target won't get invoked. We'll be passing that parameter through CCNet (short for CruiseControl.NET).&lt;/p&gt;

&lt;h2&gt;CCNet&lt;/h2&gt;

&lt;p&gt;Let's now have a look at CruiseControl's configuration.&lt;/p&gt;

&lt;h3&gt;msbuild task&lt;/h3&gt;

&lt;p&gt;We'll need a msbuild task in CCNet:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;msbuild&amp;gt;
    &amp;lt;targets&amp;gt;Rebuild&amp;lt;/targets&amp;gt;
    &amp;lt;projectFile&amp;gt;$(ProjectName).sln&amp;lt;/projectFile&amp;gt;
    &amp;lt;executable&amp;gt;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe&amp;lt;/executable&amp;gt;
    &amp;lt;buildArgs&amp;gt;/p:BUILD_NUMBER=$[$CCNetLabel] /p:RunDotCover=true&amp;lt;/buildArgs&amp;gt;
&amp;lt;/msbuild&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that we're passing the RunDotCover argument to msbuild. The /p: syntax is basically that same as if you would invoke msbuild from the command line. That's all there is to it, if we run the build now in CCNet, it will invoke dotCover and it will generate the code coverage report. &lt;strong&gt;ProjectName&lt;/strong&gt; is a variable I have defined to make this block reusable: it's basically the solution name without the sln file name extension. We can do the same for the RunDotCover argument:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;msbuild&amp;gt;
    &amp;lt;targets&amp;gt;Rebuild&amp;lt;/targets&amp;gt;
    &amp;lt;projectFile&amp;gt;$(ProjectName).sln&amp;lt;/projectFile&amp;gt;
    &amp;lt;executable&amp;gt;C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe&amp;lt;/executable&amp;gt;
    &amp;lt;buildArgs&amp;gt;/p:BUILD_NUMBER=$[$CCNetLabel] /p:RunDotCover=$(RunDotCover)&amp;lt;/buildArgs&amp;gt;
&amp;lt;/msbuild&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;So we can reuse this block even for projects that don't need dotCover. In that case, we simply won't define the RunDotCover argument in that project's scope.&lt;/p&gt;

&lt;h3&gt;Using the XML report&lt;/h3&gt;

&lt;p&gt;It's a good idea to include the report of nunit (TestResult.xml) and dotCover's XML into the build log. This way you can write an XSLT file to present the results nicely in the Web Dashboard. You can do that with a merge publisher.&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;merge&amp;gt;
    &amp;lt;files&amp;gt;
        &amp;lt;!-- nunit report --&amp;gt;
        &amp;lt;file&amp;gt;$(ProjectName).Tests$(binDebug)\TestResult.xml&amp;lt;/file&amp;gt;
        &amp;lt;!-- dotCover report --&amp;gt;
        &amp;lt;file&amp;gt;$(ProjectName).Tests$(binDebug)\dotCover\$(ProjectName).Tests.xml&amp;lt;/file&amp;gt;
    &amp;lt;/files&amp;gt;
&amp;lt;/merge&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that I'm using the ProjectName variable again, assuming that test project is called &lt;code&gt;$(ProjectName).Tests&lt;/code&gt;. This is typically the case (e.g. MyProject.Tests) and it shows that if you stick to &lt;strong&gt;naming conventions&lt;/strong&gt; you can easily reuse these blocks in ccnet's configuration file.&lt;/p&gt;

&lt;p&gt;Another idea for using the XML report is to fail the build if code coverage drops below a certain percentage. Again, I haven't done this, and it will probably need some custom code (a standard TeamCity feature by the way).&lt;/p&gt;

&lt;h3&gt;Using the HTML report&lt;/h3&gt;

&lt;p&gt;Publish dotCover's HTML report in the artifacts folder and you'll get the nice HTML report available through your web server (assuming you're publishing artifacts through the web server that is):&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;cb:if expr="'$(RunDotCover)' == 'true'"&amp;gt;
    &amp;lt;buildpublisher&amp;gt;
        &amp;lt;sourceDir&amp;gt;$[$CCNetWorkingDirectory]\$(ProjectName).Tests$(OutputPath)\dotCover&amp;lt;/sourceDir&amp;gt;
        &amp;lt;publishDir&amp;gt;$(WorkingMainDir)$(ArtifactsDir)$(ProjectName)\dotCover&amp;lt;/publishDir&amp;gt;
        &amp;lt;useLabelSubDirectory&amp;gt;true&amp;lt;/useLabelSubDirectory&amp;gt;
        &amp;lt;alwaysPublish&amp;gt;false&amp;lt;/alwaysPublish&amp;gt;                    
    &amp;lt;/buildpublisher&amp;gt;
&amp;lt;/cb:if&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;What is happening here:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;We only invoke this publisher when the RunDotCover variable was set to &lt;code&gt;true&lt;/code&gt;. This way we make this block reusable even for projects that don't need dotCover.&lt;/li&gt;
&lt;li&gt;There's a &lt;code&gt;$(OutputPath)&lt;/code&gt; variable that needs to be defined, same as in msbuild. It's also supposed to contain the &lt;code&gt;bin\Debug&lt;/code&gt; path. Keeping the same variable names as msbuild whenever possible is a good idea to avoid confusion.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;publishDir&lt;/code&gt; points to the standard artifacts publishing folder, with an extra dotCover subfolder in order to keep reports contained under the same root folder.&lt;/li&gt;
&lt;li&gt;The &lt;code&gt;useLabelSubDirectory&lt;/code&gt; is set to &lt;code&gt;true&lt;/code&gt; so that reports will be divided per build and also we can keep the old reports as a reference.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In my case, the final result is that my pretty HTML report is found at:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;http://myserver/artifacts/MyProject/dotCover/1.0.0.0/MyProject.Tests.html&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h1&gt;Conclusion&lt;/h1&gt;

&lt;p&gt;This took a lot of work to figure out and it helped me learn a few things about msbuild and dotCover. In the end, the extra benefit of tools like ccnet is that you'll have to dive into it and in the process you'll learn about a lot of things that you don't normally need to know. On the other hand, the benefit of tools like TeamCity is that you can accomplish these things with a few clicks of the mouse :)&lt;/p&gt;

&lt;p&gt;Hope this helps.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ngeor-blog/~4/jQ09zk6h-5g" height="1" width="1"/&gt;</description>
      <link>http://feedproxy.google.com/~r/ngeor-blog/~3/jQ09zk6h-5g/post.aspx</link>
      <comments>http://ngeor.net/blog/post/2012/09/02/run-dotCover-from-msbuild-and-ccnet.aspx#comment</comments>
      <guid isPermaLink="false">http://ngeor.net/blog/post.aspx?id=c2b2b313-1bcb-4308-9a8f-2ca104b374f4</guid>
      <pubDate>Sun, 02 Sep 2012 09:52:00 +0300</pubDate>
      <category>Tech</category>
      <dc:publisher>NikosGeorgiou</dc:publisher>
      <pingback:server>http://ngeor.net/blog/pingback.axd</pingback:server>
      <pingback:target>http://ngeor.net/blog/post.aspx?id=c2b2b313-1bcb-4308-9a8f-2ca104b374f4</pingback:target>
      <slash:comments>0</slash:comments>
      <trackback:ping>http://ngeor.net/blog/trackback.axd?id=c2b2b313-1bcb-4308-9a8f-2ca104b374f4</trackback:ping>
      <wfw:comment>http://ngeor.net/blog/post/2012/09/02/run-dotCover-from-msbuild-and-ccnet.aspx#comment</wfw:comment>
      <wfw:commentRss>http://ngeor.net/blog/syndication.axd?post=c2b2b313-1bcb-4308-9a8f-2ca104b374f4</wfw:commentRss>
    <feedburner:origLink>http://ngeor.net/blog/post.aspx?id=c2b2b313-1bcb-4308-9a8f-2ca104b374f4</feedburner:origLink></item>
  </channel>
</rss>
