<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;CUANQ38-eip7ImA9WhVbEE4.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299</id><updated>2012-05-26T15:03:12.152+03:00</updated><category term="Speeches" /><category term="Approvals" /><category term="Reading" /><category term="Mocks" /><category term="Hackatone" /><category term="MVC" /><category term="CS101" /><category term="AJAX" /><category term="UI" /><category term="ITJam" /><category term="Candidate" /><category term="Udacity" /><category term="ELMAH.MVC" /><category term="Retrospective" /><category term="Open source" /><category term="TDD" /><category term="Git" /><category term="Conference" /><category term="DDD" /><category term="Applications" /><category term="Clean Code" /><category term="Video" /><category term="DAL" /><category term="Cloud" /><category term="Mobile" /><category term="Social" /><category term="Code Kata" /><category term="Foundstyles" /><category term="Trackyt.net" /><category term="CSS" /><category term="REST" /><category term="Continuous" /><category term="GitSVN" /><category term="Design" /><category term="Tips" /><category term="BeerNCode" /><category term="E-conomic" /><category term="Refactoring" /><category term="KievAltNet" /><category term="Mind" /><category term="Life" /><category term="Stanford" /><category term="GitHub" /><category term="NuGet" /><category term="Agile" /><category term="Linq" /><category term="HTML" /><category term="InsideMVC" /><category term="Tools" /><category term="asp.net" /><category term="CSharp" /><category term="SearchEngine" /><category term="JavaScript" /><title>Alexander Beletsky's Development Blog</title><subtitle type="html">Issues of development, testing, maintenance and &lt;a href="http://trackyt.net"&gt;management&lt;/a&gt;</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://www.beletsky.net/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://www.beletsky.net/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>153</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/abeletskyblog" /><feedburner:info uri="abeletskyblog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry gd:etag="W/&quot;CUANQ38-cCp7ImA9WhVbEE4.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-3505004777011800088</id><published>2012-05-26T15:03:00.000+03:00</published><updated>2012-05-26T15:03:12.158+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T15:03:12.158+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Code Kata" /><category scheme="http://www.blogger.com/atom/ns#" term="Mind" /><title>The Limit of Keystrokes</title><content type="html">&lt;p&gt;Some time ago I've posted an article called &lt;a href="http://www.beletsky.net/2011/07/how-to-be-better-developer-or-3.html"&gt;How to be better developer or 3 accounts rule&lt;/a&gt; where I shared my vision on importance of having some accounts if you care about professionalism and mastery. The basic idea there is you have to produce a lot, you have to write a lot. You have to write code, write blog posts and help people on forums.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;If you have seen one of the latest Scott Hanselman's &lt;a href="http://www.hanselman.com/blog/ItsNotWhatYouReadItsWhatYouIgnoreVideoOfScottHanselmansPersonalProductivityTips.aspx"&gt;Productivity Tips&lt;/a&gt; video, you probably heard nice metaphor about the "Limit of Keystrokes". It sounds really funny, Scott saying - "everybody is having limited count of keystokes, if you reach you count - you dead". That means, we have to think on each keystroke we do with much care. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;And the most efficient usage of keystrokes is for learning. Reading is very important, but nowadays there are so many information that you just not able to consume everything. That's why recently I've unsubscribed a lot of RSS channels in my Google Reader, I think I will filter the Twitter as well. Instead, I try to read as few things as possible. Not only read, but try them on practice. Just write some small code to try the idea, pattern, approach of framework. Turning the theory in practice is something that gives me much fun and satisfaction.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Yesterday, we were doing Coding Dojo with good friend of mine &lt;a href="http://twitter.com/skalinets"&gt;@skalinets&lt;/a&gt; on &lt;a href="http://agilebasecamp.org/"&gt;Agile Base Camp&lt;/a&gt; conference. Instead of going my default language (which is C# for now) I paired the PHP guy. We were doing String Calculator kata in PHP. It was so great! First of all, I amazed how much PHP improved since the last time I looked on it (about 10 years ago), second is that I used my keystrokes to learn something new. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Writing the code for fun and learning has a huge value. This is definitely good investment of the keystrokes.  &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-3505004777011800088?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=Ud9NEVS38nI:OJSfdLVvso0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=Ud9NEVS38nI:OJSfdLVvso0:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=Ud9NEVS38nI:OJSfdLVvso0:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=Ud9NEVS38nI:OJSfdLVvso0:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/Ud9NEVS38nI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/3505004777011800088?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/3505004777011800088?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/Ud9NEVS38nI/limit-of-keystrokes.html" title="The Limit of Keystrokes" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/05/limit-of-keystrokes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CUcNQXk9fip7ImA9WhVUFk4.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-8086704085478450735</id><published>2012-05-21T23:44:00.001+03:00</published><updated>2012-05-21T23:44:50.766+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-21T23:44:50.766+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GitHub" /><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><title>Github for Windows - Yay!</title><content type="html">&lt;p&gt;        For quite long time Windows users of github had a huge envy towards &lt;a href="http://mac.github.com/"&gt;Github for Mac&lt;/a&gt; - the application that makes work with github based repositories as simple as possible. A lot of people, especially ones who are not familiar with Git, experiencing some issues with github initially. No surprise, extensive command-line, SSH, public/private keys - might sound scary for GUI addicted persons. &lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;       December 2011, Phil Haack &lt;a href="http://haacked.com/archive/2011/12/07/hello-github.aspx"&gt;joined&lt;/a&gt; github.. so, the world hold the breath, to see what actually will be done by Phil and team to improve overall Github experience on Windows. And the day has come! Today &lt;a href="http://windows.github.com/"&gt;Github:Windows&lt;/a&gt; is officially shipped.&lt;br /&gt;
    &lt;/p&gt;    &lt;h2&gt;What's the point?&lt;/h2&gt;    &lt;p&gt;        As well as Mac users, Windows users are also much got used to UI. For long time, if you want to deal with Git on windows, you have to go and install &lt;a href="http://code.google.com/p/msysgit/"&gt;msysgit&lt;/a&gt;. It's a great product and works great actually, but you have to spend some time of learning of Git to do very basics operations. Moreover, if you hadn't had any experience with distributed version control systems - you'll be to much confused by new words like: pull, push, clone, fork, cherry-pick and so on. &lt;a href="http://windows.github.com/"&gt;Github for Windows&lt;/a&gt; is about to fix that.&lt;br /&gt;
    &lt;/p&gt;    &lt;h2&gt;Go ahead and install it&lt;/h2&gt;    &lt;p&gt;        Installation is very easy. Just click the &lt;a href="http://github-windows.s3.amazonaws.com/setup.exe"&gt;download&lt;/a&gt; link, to get web setup file. Two things are gonna installed on you machine: Github client itself and Git shell - the powershell command line for git.&lt;br /&gt;
    &lt;/p&gt;    &lt;h2&gt;        Github for Windows client&lt;br /&gt;
    &lt;/h2&gt;    &lt;p&gt;        At the first run it will do some configuration stuff. It will ask you for github credentials.&lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh6.googleusercontent.com/-b82cqlo96-4/T7qZuUkKYeI/AAAAAAAAIuA/JeqiYMu_sNM/s1024/page-1.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        As you logged on, it will show you some basic account information.&lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh3.googleusercontent.com/-cF3gaHlxPYE/T7qZuqR6clI/AAAAAAAAIuI/gE6-xxhKd58/s1024/page-2.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        It will also add new public SSH key your account. That was a little unexpected as I received email notification for github about that. The information that it's gonna do that, probably should be mentioned during setup. &lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;        Then it tries to locate all repositories. It scans the home folder, but I don't keeping repositories there (just some temp copies), so I unselected everything.&lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh6.googleusercontent.com/-E-6YmkuP9M8/T7qZufRug-I/AAAAAAAAIuE/ifq-o89_Eio/s1024/page-3.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        As I tried to go straight and create new repository the application crashed. Oppps.. It reproduced several times, but after gone. Anyway, I contacted &lt;a href="mailto:support@github.com"&gt;support@github.com&lt;/a&gt; with detailed steps and info.    &lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh3.googleusercontent.com/-v4EcFQZzPeo/T7qZvPSQdmI/AAAAAAAAIuQ/FYaM5NvP8_c/s1024/page-4.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        Finally, after I changed the default folder and wait till it's completed scanned (that took about 3 mins on my machine), I got client working.&lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh3.googleusercontent.com/-VWSpIa020_g/T7qZvVqLnTI/AAAAAAAAIuc/xSuOGL0NWJs/s1024/page-6.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        Even if I'm not huge fan of METRO style - I was really pleased with UI. It looks very nice, application works fast and responsive. It takes almost no effort to overview application features.. everything is very intuitive.&lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;        It's of course not the perfect. I tried to do some commits, that seems to be fine.. but sync of the repo failed. It also fails to switch the branches in 95% cases.&lt;br /&gt;
    &lt;/p&gt;    &lt;h2&gt;Git Shell for command line&lt;/h2&gt;    &lt;p&gt;        Next good addition is Git Shell, powered by PowerShell (nice!). It utilizes famous &lt;a href="https://github.com/dahlbyk/posh-git"&gt;posh-git&lt;/a&gt; project. The most useful features for me now: 'Tab' support that provides suggestion for the command and 'Stats' that are shown at command prompt, showing current repository state. There are probably a lot of other cool things there, that I haven't discovered yet.&lt;br /&gt;
    &lt;/p&gt;    &lt;img src="https://lh4.googleusercontent.com/-HOCSvGnNXnQ/T7qhpOr91rI/AAAAAAAAIu0/xwFjs8dvw_Q/s678/page-7.png" style="width: 620px" /&gt;&lt;br /&gt;
    &lt;p&gt;        If you are fan of Bash, or pure Cmd.. or custom stuff (as &lt;a href="http://sourceforge.net/projects/console/"&gt;Console 2&lt;/a&gt;) it very easy to change that, right in application configuration.&lt;br /&gt;
    &lt;/p&gt;    &lt;h2&gt;Conclusions&lt;/h2&gt;    &lt;p&gt;        Even if it's just first release, it's very solid and a lot of features already there. Issues exist, but I hope it will be cleared out soon.&lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;        What make me a little wonder, that the project is not open sourced? I hope it's just the question of time, I'm pretty sure that a lot of people are waiting to see what's inside and submit some pull requests.&lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;        Will I personally use that product? Probably, not. I've spent too many time in Command-line of my favorite &lt;a href="http://www.farmanager.com/download.php?l=en"&gt;Far Manager&lt;/a&gt;, that UI is more noise that help. What I will use is Git Shell, thought. I've heard a lot about posh-git, now it's  time to try.&lt;br /&gt;
    &lt;/p&gt;    &lt;p&gt;    But for all people, who are just starting using Github on Window - &lt;a href="http://windows.github.com/"&gt;Github:Windows&lt;/a&gt; would be my first recommendation.&lt;br /&gt;
    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-8086704085478450735?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=bfUFPBUozYs:DAHJvfe9Tf4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=bfUFPBUozYs:DAHJvfe9Tf4:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=bfUFPBUozYs:DAHJvfe9Tf4:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=bfUFPBUozYs:DAHJvfe9Tf4:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/bfUFPBUozYs" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8086704085478450735?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8086704085478450735?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/bfUFPBUozYs/github-for-windows-yay.html" title="Github for Windows - Yay!" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-b82cqlo96-4/T7qZuUkKYeI/AAAAAAAAIuA/JeqiYMu_sNM/s72-c/page-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/05/github-for-windows-yay.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MDSXc-eCp7ImA9WhVbEE8.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-8294001109941963019</id><published>2012-05-20T14:50:00.000+03:00</published><updated>2012-05-26T13:51:18.950+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T13:51:18.950+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SearchEngine" /><category scheme="http://www.blogger.com/atom/ns#" term="Udacity" /><category scheme="http://www.blogger.com/atom/ns#" term="CS101" /><title>CS101 Building a Search Engine: Week 4</title><content type="html">&lt;p&gt;&lt;small&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this blog post expresses some impressions and details of Udacity CS101 "Building a Search Engine" online course. If you are either currently participating it or plan to do so in nearest future, this blog post could be a spoiler. Even though, I'm trying to make it generic as possible and do not spoil important things.&lt;br /&gt;
&lt;/small&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I've got completed Unit 4 of course during this week. It's getting more and more interesting and the crawler we building there getting more complicated. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;This week we got through the basic data structures, mainly based on lists. The most interesting thing was an index data structure, thought. We've built the simple page indexer. Now the result of crawling is not simply the list of crawled links, but instead is index that keeps track of content (as word) and the URL where the word is mention. If some of you don't know what the index is, the simplest explanation is get just to open any technical book. At the end of the book you will see "Index" section. By looking for information you have to option. Either go from one page to another, finding keyword appearance.. or go to index and see exact pages, where this keyword is mentioned. Indices are essential for quick search of data.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The index that my crawler produce, crawling the &lt;a href="http://www.udacity.com/cs101x/index.html"&gt;test page&lt;/a&gt; is:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;[['This', ['http://www.udacity.com/cs101x/index.html']], 
   ['is', ['http://www.udacity.com/cs101x/index.html']], 
   ['a', ['http://www.udacity.com/cs101x/index.html']], 
   ['test', ['http://www.udacity.com/cs101x/index.html']], 
   ['page', ['http://www.udacity.com/cs101x/index.html']], 
   ['for', ['http://www.udacity.com/cs101x/index.html']], 
   ['learning', ['http://www.udacity.com/cs101x/index.html']], 
   ['to', ['http://www.udacity.com/cs101x/index.html', 'http://www.udacity.com/cs101x/crawling.html']], 
   ['crawl!', ['http://www.udacity.com/cs101x/index.html']]
   # ...
    &lt;/pre&gt;&lt;p&gt;I went a little above the given task and improved the crawler with "clean-up html tags" functionality. So, I get the body part of document, strip out all HTML tags and then index the content. The latest version of crawler is in this &lt;a href="https://gist.github.com/2757731"&gt;gist&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;We also looked on some Internet fundamentals as: bandwidth, latency, traceroutes and protocols. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I haven't yet started any project on python except the crawler one. With implementing the of more complex applications I start to feel the lack of IDE with debugger. I currently use Sublime Text 2 + print statement as my IDE and debugger tool. It might be time to look for something better.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Everything is going fine so far, except the fact I'm being late for one week. The final exam is going to be posted at 27th of May and it will take one week to have a change to pass it. So, I've got a goal to complete 2 units through this week. The half of course is done! &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-8294001109941963019?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3pBBLKhE0mI:A9hIw-f-R4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3pBBLKhE0mI:A9hIw-f-R4Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3pBBLKhE0mI:A9hIw-f-R4Y:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=3pBBLKhE0mI:A9hIw-f-R4Y:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/3pBBLKhE0mI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8294001109941963019?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8294001109941963019?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/3pBBLKhE0mI/cs101-building-search-engine-week-4.html" title="CS101 Building a Search Engine: Week 4" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/05/cs101-building-search-engine-week-4.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEEQHk6cSp7ImA9WhVUFUw.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-9127526178307846032</id><published>2012-05-20T13:43:00.000+03:00</published><updated>2012-05-20T13:43:21.719+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-20T13:43:21.719+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="GitHub" /><category scheme="http://www.blogger.com/atom/ns#" term="Git" /><category scheme="http://www.blogger.com/atom/ns#" term="E-conomic" /><category scheme="http://www.blogger.com/atom/ns#" term="GitSVN" /><title>A year with Git</title><content type="html">&lt;p&gt;    It's almost a year ago, I've posted the article &lt;a href="http://www.beletsky.net/2011/06/how-to-start-using-git-in-svn-based.html"&gt;How to start using Git in SVN-based organization&lt;/a&gt;. It has been viewed more than 3,000 times on my blog and more than 9,000 times on &lt;a href="http://java.dzone.com/articles/how-start-using-git-svn-based"&gt;re-post&lt;/a&gt; by DZONE.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;    Time has passed and some of you might be interesting, what happed next? A lot, actually.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;    I think we followed "Baby steps to.." strategy of Git adoption. Our baby steps to Git, were small, accurate and quite long. But at the end of the day, I'm happy to say - we are pure Git organization now. Moreover, some of our projects are hosted as public and private repositories under the &lt;a href="https://github.com/organizations/e-conomic"&gt;e-conomic&lt;/a&gt; organization github account.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Retrospective&lt;/h2&gt;&lt;p&gt;    So, let's make a kind of retrospective seeing what things were happening.&lt;br /&gt;
&lt;/p&gt;&lt;ol&gt;    &lt;li&gt;&lt;strong&gt;Git-SVN mode&lt;/strong&gt;. As described in original article, the best way to try Git inside the organization is go to Git-SVN mode. It will allow to use SVN as primary repo, but allow Git features like local branching, cool merging, stashes and other stuff described &lt;a href="http://www.beletsky.net/2011/07/git-with-svn-what-benefits-are.html"&gt;here&lt;/a&gt;.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;People awareness&lt;/strong&gt;. Started by just few developers the information about the Git had spread along mates in our department. Some were very enthusiastic about that, some not. But anyway, it got attention of our many people including our CTO. The greatest thing is that initiative has not been cancelled, instead we start to think of some kind of plan that might bring us into pure Git world. &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Planning&lt;/strong&gt;. Our plan including different evaluations, choosing between Git or HG, local or cloud hosting, Centralized or De-centralized mode etc. During this planning sessions we also identified some infrastructure dependencies that blocked switch to Git. We have so called "Language System" the application helping our copyrighters and translators to change the content of app. It's been creating assuming that SVN used, doing checkouts and commits where. Another thing is that our deployment procedure happened to be SVN dependent. Obviously, it have to be changed to work with Git. But the most priority had "Education" task. Everybody should be able to work with Git. &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Execution&lt;/strong&gt;. Planning is easy, execution is hard. We did initial education as a series of meetings were the basics are described. Fortunately, almost as teams contained the git-aware person who were initial knowledge keeper. Some important details being moved to company's Wiki. The problems we start to have local infrastructure setup. Being Windows organization we tried to setup primary repository and server on Windows box. Keeping that short, I just say - don't do that. It's not trivial at all, to configure Git server there, setup the accounts and permissions and make it work with TeamCity. We tried different scenarios of Git hosting on IIS, including &lt;a href="https://github.com/jakubgarfield/Bonobo-Git-Server"&gt;Bonobo-Git-Server&lt;/a&gt; or &lt;a href="https://github.com/JeremySkinner/git-dot-aspx"&gt;Git-Dot&lt;/a&gt; but all had it's own limitations, blocking us of full-feature Git usage.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Trying github&lt;/strong&gt;. In parallel, one team that was starting out new project and was quite independent tried to host sources in cloud. Github is obvious choice here. I think, that was a great experience and this project is still hosted on github. We tried, so called &lt;a href="https://github.com/blog/674-introducing-organizations"&gt;"organization"&lt;/a&gt; mode. It ideally fits small software development shops. Easy start, easy go.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Linux local server&lt;/strong&gt;. Failed to run it properly on Windows we had to switch to Linux box. It's being deployed as virtual box, that is more than enough for Git server. That solved a lot of infrastructural issues, including authentications &amp; permissions as well as CI problems. As I can see the effort to setup it was not so big (if compare to effort spend to make the same on Windows, it would be closer to 0). Setup once, it just start to work.  &lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Mirroring repositories&lt;/strong&gt;. The setup of local central server was the first great milestone. Even if all the developers might start to use it instead of SVN, the infrastructural problems that I mentioned in #3 were not yet solved. So, we did a partial decision. The developers are switching to Git repository, but the deployments and language works are still done on SVN repository. So it's not so frequent operations, it's possible to synchronize the Git and SVN between each other. It means, all new code started to appear in Git, but once a week (or often) all changes set are being pushed to SVN. This is of course an overhead and required some manual work.. But it was only one way for us.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Fixing the dependencies&lt;/strong&gt;. It took some time while everybody got comfortable with Git. Our Wiki has extended with some policies of working with Git. We mainly follow &lt;a href="http://nvie.com/posts/a-successful-git-branching-model/"&gt;"A successful Git branching model"&lt;/a&gt; keeping the feature in local branches, having remote branches for code review etc. After our deployment dependency has been fixed, we were able to push the code to production very fast. I think it's almost a year passed to now clearly understand benefit of Git not just theoretically, but practically. And that was amazing experience, as so for me.&lt;br /&gt;
    &lt;/li&gt;
    &lt;li&gt;&lt;strong&gt;Pure git world&lt;/strong&gt;. After the last dependency has been fixed, we happily entered the "Pure Git Environment" world. The SVN server has been stopped. All developers, DevOps and copyrighters are Git users now.&lt;br /&gt;
    &lt;/li&gt;
&lt;/ol&gt;&lt;h2&gt;It took a while...&lt;/h2&gt;&lt;p&gt;Yeah, it took awhile but we never had this migration as top priority item in our backlog. The process were long and smooth, allowing us to do our primary job of bringing value to product, but the same time improving the internal infrastructure.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Not being hurry is also good option, sometimes. The whole transition took a lot of efforts of different person along the way. I say thank you, guys - for making this happening.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;What's next?&lt;/h2&gt;&lt;p&gt;The things are stabilized now. We are on one solid solution, working very nice. As I said, we have both local and github environments. If I pretend to be a medium and see the future, I would say we go to "pure Github" environment from here. Sure, now this transaction having it's own dependencies. But let's see what's happen during next year. &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-9127526178307846032?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=vmhTb3exdxY:LAMbWfxQYmg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=vmhTb3exdxY:LAMbWfxQYmg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=vmhTb3exdxY:LAMbWfxQYmg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=vmhTb3exdxY:LAMbWfxQYmg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/vmhTb3exdxY" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9127526178307846032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9127526178307846032?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/vmhTb3exdxY/year-with-git.html" title="A year with Git" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/05/year-with-git.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08FRHk-fyp7ImA9WhVbEE8.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-6372908305093323585</id><published>2012-05-07T12:58:00.000+03:00</published><updated>2012-05-26T13:56:55.757+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T13:56:55.757+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SearchEngine" /><category scheme="http://www.blogger.com/atom/ns#" term="Udacity" /><category scheme="http://www.blogger.com/atom/ns#" term="CS101" /><title>CS101 Building a Search Engine: Week 3</title><content type="html">&lt;p&gt;&lt;small&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this blog post expresses some impressions and details of Udacity CS101 "Building a Search Engine" online course. If you are either currently participating it or plan to do so in nearest future, this blog post could be a spoiler. Even though, I'm trying to make it generic as possible and do not spoil important things.&lt;br /&gt;
&lt;/small&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Yesterday, I've concluded Unit 3 of &lt;a href="http://www.udacity.com/"&gt;CS101 Building Search Engine&lt;/a&gt; class. I had a little lag, since I've been to little vacation at the beginning of previous week, so got a chance to get back to class only Thursday. So, I still have one homework task in my to-do list.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;It's been an interesting unit, through it's still very basic one. I'm little more confident with Python, getting powered by knowledge of collections, indexes etc. Again, I'm really pleased with language simplicity. Just few code snippets I like,&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;# creates generic list
        some_list = []
        
        # add something inside
        some_list.append(1)
        some_list.append('z')
        some_list.append([3,2,1])
        
        # iterate by for loop
        for e in some_list:
            pass
            
        # or with while
        while some_list:
            e = some_list.pop()
        
        # get index of element
        index = some_list.index(1)
    &lt;/pre&gt;&lt;p&gt;I also started to familiarize with functional style of Python programming. You can find some good inputs &lt;a href="http://docs.python.org/howto/functional.html"&gt;here&lt;/a&gt;. Everything look very interesting so far.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;This week we moved further with "real" implementation of web crawler. Instead of going by the set of quizzes I went my own path and created my implementation of simple crawler. So, what it does currently is go from 'seed' page and collect all links it's able to find on target pages and related pages. I went a little far, since I made it run on real web requests, instead of test data that current unit supposes. If you are interested code could be found &lt;a href="https://gist.github.com/2626946"&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Still I pretend as CS101 student trying to apply only knowledge I got through latest weeks. It's great exercise I believe, showing some gaps in my education or concept understanding.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Homework was interesting as well. &lt;a href="http://www.crunchbase.com/person/anna-patterson"&gt;Anna Patterson&lt;/a&gt; was a starring guest for homework session. Together with Anna we tried to improve crawler with some real life requirements, like max_pages and max_depth parameter to prevent crawler to stay in indefinite loop. Anna is great expert in this field, so for each homework task I highly recommend to check the answer, a lot of interesting details there.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-6372908305093323585?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ExA0v1bWWQw:XMbaSXhh_8g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ExA0v1bWWQw:XMbaSXhh_8g:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ExA0v1bWWQw:XMbaSXhh_8g:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=ExA0v1bWWQw:XMbaSXhh_8g:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/ExA0v1bWWQw" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/6372908305093323585?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/6372908305093323585?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/ExA0v1bWWQw/cs101-building-search-engine-week-3.html" title="CS101 Building a Search Engine: Week 3" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/05/cs101-building-search-engine-week-3.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08HR30yeip7ImA9WhVbEE8.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-5001244343081783351</id><published>2012-04-28T11:31:00.000+03:00</published><updated>2012-05-26T13:57:16.392+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T13:57:16.392+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="SearchEngine" /><category scheme="http://www.blogger.com/atom/ns#" term="Udacity" /><category scheme="http://www.blogger.com/atom/ns#" term="CS101" /><title>CS101 Building a Search Engine: Week 2</title><content type="html">&lt;p&gt;&lt;small&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this blog post expresses some impressions and details of Udacity CS101 "Building a Search Engine" online course. If you are either currently participating it or plan to do so in nearest future, this blog post could be a spoiler. Even though, I'm trying to make it generic as possible and do not spoil important things.&lt;br /&gt;
&lt;/small&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;This week I've concluded Unit 2 of &lt;a href="http://www.udacity.com/"&gt;CS101 Building Search Engine&lt;/a&gt; class. As a previous one it was very basic. We did went thought programming fundamentals on &lt;code&gt;if&lt;/code&gt; statements, &lt;code&gt;while&lt;/code&gt; loops, conditions and boolean operations. In contrast to Unit 1, I haven't got any really new information for me. All the information given very nicely, preparing listener to do some more serious stuff. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I think I started to get used to Python a little bit. Unfortunately I do not practice it much now, so I have to find simple project that I could accomplish in Python, besides the search engine. As always doing code katas is very nice for introduction to any new language, so I can do that. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Homework was simple enough, but again as last time I got one problem that made me think some extra time. This is "median search" issue. Say, you are given 3 numbers - (1,2,3). Median is the one between bigger and smaller number, in this case it's "2". In (9,3,6) it's "6" and in (7,8,7) it's "7". As a previous time I started with something I don't suppose to know, like lists and sorting. Solving this problem just with knowledge I got so far more problematic. So, I spent some time on that.. and was really happy than I found simple and nice solution for that. You should try to solve that, pretending you know only procedures and conditional operations.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Now, I'm looking forward for Unit 3. It's still basic, but there we suppose to create some simple crawler. I hope it will be fun!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-5001244343081783351?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=jEYswbwCaAU:8zIliRP6qc8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=jEYswbwCaAU:8zIliRP6qc8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=jEYswbwCaAU:8zIliRP6qc8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=jEYswbwCaAU:8zIliRP6qc8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/jEYswbwCaAU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/5001244343081783351?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/5001244343081783351?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/jEYswbwCaAU/cs101-building-search-engine-week-2.html" title="CS101 Building a Search Engine: Week 2" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/04/cs101-building-search-engine-week-2.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YBQn44eip7ImA9WhVWFEg.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-9089508635532476189</id><published>2012-04-26T09:39:00.000+03:00</published><updated>2012-04-26T19:52:33.032+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-26T19:52:33.032+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>JSON Model Binding to IDictionary&lt;&gt; is Broken</title><content type="html">&lt;p&gt;Yesterday, I've been creating small web service based on existing ASP.NET MVC infrastructure. The task was really simple. Web service itself should be just a proxy for existing internal API. The API method takes a &lt;code&gt;Dictionary&lt;/code&gt; that contains some fields. So, I've created a data model like that.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class Notification
{
 public int Id { get; set; }
 public string Recipient { get; set; }
 public IDictionary&amp;lt;string, string&amp;gt; Fields { get; set; }
}
    &lt;/pre&gt;&lt;p&gt;and simple HttpPost handler, like&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;[HttpPost]
public ActionResult Send(string token, Notification notification)
{
    // ...
}
    &lt;/pre&gt;&lt;p&gt;the payload posted to method is:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;{"id":32,"recipient":"a@a.com","fields": { "EMAIL": "a@a.com"} }

    &lt;/pre&gt;&lt;p&gt;I've tried to test the method, but the &lt;code&gt;Fields&lt;/code&gt; property of model was always &lt;code&gt;null&lt;/code&gt;. First I thought I got a problem somewhere in JSON payload, but after sometime I saw that everything is correct. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Google showed I'm not alone, so the issue been &lt;a href="http://stackoverflow.com/questions/4710729/post-json-dictionary"&gt;raised&lt;/a&gt; on SO. Darin Dimitrov responded that this is a bug of &lt;code&gt;JsonValueProviderFactory&lt;/code&gt;. In the same time, some comments below contained the link for a bug &lt;a href="http://connect.microsoft.com/VisualStudio/feedback/details/636647/make-jsonvalueproviderfactory-work-with-dictionary-types-in-asp-net-mvc"&gt;reported&lt;/a&gt;, that was already stated as Fixed. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I forgot to mention that I did that stuff on ASP.NET MVC 2. I decided to try that on ASP.NET MVC 3, since I got the sources and if it works I can try to backport the fix into our MVC 2 infrastructure. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;With my great disappointment it fails in exactly same way for ASP.NET MVC 3. That's not funny anymore. I blamed &lt;code&gt;JavaScriptSerializer&lt;/code&gt;, JSON serializer that used inside the &lt;code&gt;JsonValueProviderFactory&lt;/code&gt; that it simply not able to handle Dictionaries right. I knew that ASP.NET Web API is using Newtonsoft JSON.NET framework, which is really powerful for serialization/deserialization of JSON.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, I run VS 2011 and create test &lt;code&gt;ApiController&lt;/code&gt; that receives the model with &lt;code&gt;IDictionary&lt;/code&gt; inside. What do you think happen? Ok, the model is no longer &lt;code&gt;null&lt;/code&gt;, but it contains Dictionary with count of elements equals to zero. Fail.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public void Post(Notification notification)
{
    // ...
}
    &lt;/pre&gt;&lt;p&gt;I re-raised &lt;a href="http://aspnetwebstack.codeplex.com/workitem/99"&gt;issue&lt;/a&gt; again, now on ASP.NET Web Stack site on &lt;a href="http://aspnetwebstack.codeplex.com/"&gt;Codeplex&lt;/a&gt;. I also tried to quickly write the unit test that show the existence of problem, but it's not that easy to do that, so it requires some time. Hope I can do that later.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-9089508635532476189?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=CjOXrGv_-pk:2GufieCQG4Y:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=CjOXrGv_-pk:2GufieCQG4Y:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=CjOXrGv_-pk:2GufieCQG4Y:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=CjOXrGv_-pk:2GufieCQG4Y:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/CjOXrGv_-pk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9089508635532476189?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9089508635532476189?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/CjOXrGv_-pk/json-model-binding-to-idictionary-is.html" title="JSON Model Binding to IDictionary&amp;lt;&amp;gt; is Broken" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/04/json-model-binding-to-idictionary-is.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A08BRXk6fSp7ImA9WhVbEE8.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-9168587177130447299</id><published>2012-04-21T20:54:00.000+03:00</published><updated>2012-05-26T13:57:34.715+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-05-26T13:57:34.715+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Stanford" /><category scheme="http://www.blogger.com/atom/ns#" term="SearchEngine" /><category scheme="http://www.blogger.com/atom/ns#" term="Udacity" /><category scheme="http://www.blogger.com/atom/ns#" term="CS101" /><title>CS101 Building a Search Engine: Week 1</title><content type="html">&lt;p&gt;&lt;small&gt;&lt;strong&gt;Disclaimer:&lt;/strong&gt; this blog post expresses some impressions and details of Udacity CS101 "Building a Search Engine" online course. If you are either currently participating it or plan to do so in nearest future, this blog post could be a spoiler. Even though, I'm trying to make it generic as possible and do not spoil important things.&lt;br /&gt;
&lt;/small&gt;&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;CS101 is fundamental course that supposes you have no background in programming at all. That's why all lectures was very-very basic and sometimes I felt really bored. If you fell the same, that's probably ok, since the most interesting stuff is about to start from Unit 3. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;In the same time, for guys who has no programming skill's that might be even a little tough. To be honest, I had really tough moment during my first homework, that should not be a problem for professional programmer, but I'll describe it later. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Unit 1: Basics, Python, Numbers and Strings&lt;/h2&gt;&lt;p&gt;What I understood from my entire career is that: backing to basics is always great. The years of enterprise development makes you strong in technologies and frameworks, but I managed to lost almost everything I got during my university days. Restoring that knowledge is very good brain exercise, constant repetition of basic is the way to mastery.    &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, even that simple unit gave me a lot of things to remember, plus I learned some elementary of Python language.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Backus Naur Form&lt;/h2&gt;&lt;p&gt;What was really interesting to me during Unit 1 is so called &lt;a href="http://en.wikipedia.org/wiki/Backus%E2%80%93Naur_Form"&gt;Backus-Naur Form&lt;/a&gt;, for describing the computer language grammar. This is a method of formalizing any (probably) computer language syntaxes. It has been invented by &lt;a href="http://en.wikipedia.org/wiki/John_W._Backus"&gt;John Backus&lt;/a&gt; American scientist, how is famous as creator of FORTRAN and ALGOL computer languages, as well as his researches in &lt;a href="http://en.wikipedia.org/wiki/Function-level_programming"&gt;functional programming&lt;/a&gt;. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Backus-Naur form is really simple and really powerful. It is described by the set of &lt;code&gt;non-terminals&lt;/code&gt; and &lt;code&gt;terminals&lt;/code&gt;. Each language expression is derived from BN form. Let's take and example,&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= &amp;lt;subject&amp;gt; &amp;lt;verb&amp;gt; &amp;lt;object&amp;gt;
        &amp;lt;subject&amp;gt; ::= &amp;lt;noun&amp;gt;
        &amp;lt;object&amp;gt; ::= &amp;lt;noun&amp;gt;
    &lt;/pre&gt;&lt;p&gt;Here is the primitive BNF for English language. Each sentence in English should contain Subject, Verb, Object to be complete and have a meaning. Of course, BNF is not suppose to describe natural languages as English or Russian, since it much more complex.. but it works very fine with computer languages, which are strict. So, everything in brackets are so called &lt;code&gt;non-terminals&lt;/code&gt;, it simply means that expression could not be terminated (completed) based on them. To complete we need &lt;code&gt;terminals&lt;/code&gt;. Each &lt;code&gt;non-terminal&lt;/code&gt; is replaced by &lt;code&gt;terminal&lt;/code&gt; till it's done.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= &amp;lt;subject&amp;gt; &amp;lt;verb&amp;gt; &amp;lt;object&amp;gt;
        &amp;lt;subject&amp;gt; ::= &amp;lt;noun&amp;gt;
        &amp;lt;object&amp;gt; ::= &amp;lt;noun&amp;gt;
        noun ::= I
        noun ::= Python
        noun ::= Cookies
        verb ::= Eat
        verb ::= Like
    &lt;/pre&gt;&lt;p&gt;Now, the form is completed, so we can try to derive expression out of it. Let's try that. So, we start from the top line&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= &amp;lt;subject&amp;gt; &amp;lt;verb&amp;gt; &amp;lt;object&amp;gt;
    &lt;/pre&gt;&lt;p&gt;Derive all non-terminals from expression&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= &amp;lt;noun&amp;gt; &amp;lt;verb&amp;gt; &amp;lt;noun&amp;gt;    
    &lt;/pre&gt;&lt;p&gt;First "noun" is still non-terminal, so we proceed. Due to form, noun could be any of three (I, Python, Cookies) - so I can pick up any.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= I &amp;lt;verb&amp;gt; &amp;lt;noun&amp;gt;    
    &lt;/pre&gt;&lt;p&gt;"I" is the terminal, so we process next non terminal which is verb. Verb could be any of (Eat, Like). I'll take "Like".&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= I Like &amp;lt;noun&amp;gt;    
    &lt;/pre&gt;&lt;p&gt;The last non-terminal is noun again. The same three options (I, Python, Cookies). Let's pick "Python".&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= I Like Python    
    &lt;/pre&gt;&lt;p&gt;All non-terminals are replaced with terminals, that means we derieved the expression completely. Based on that simple algorithm I can derive other expressions that would be valid for that form.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;&amp;lt;sentence&amp;gt; ::= I Like Cookies    
        &amp;lt;sentence&amp;gt; ::= I Like I    
        &amp;lt;sentence&amp;gt; ::= I Eat Python    
        &amp;lt;sentence&amp;gt; ::= Python Like Cookies
        &amp;lt;sentence&amp;gt; ::= Python Eat I
    &lt;/pre&gt;&lt;p&gt;As you can see, some of them are completely non-sense, but still they are totally valid expressions. If you are curious, you can find BNF's for many know languages &lt;a href="http://goldparser.org/grammars/index.htm"&gt;here&lt;/a&gt;. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Starting up Python&lt;/h2&gt;&lt;p&gt;Start with Python programming language was one of my goals, dusted for quite long time on goals shelf. Hope that CS101 and further courses would be motivating enough to finally learn it. So, if you are like me - .NET, no Python background - don't worry, that's easy enough. Basically, all you need is Python interpreter and some text editor.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I really like &lt;a href="http://chocolatey.org/"&gt;Chocolatey&lt;/a&gt; for installing that stuff. Chocolatey is like NuGet package manager, but for software. I encourage you to try. So, instead of going to site, looking for latest version etc. I just opened my Power Shell command like and put:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;cinst python
    &lt;/pre&gt;&lt;p&gt;In 3 minutes, Python was on my machine. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The editor, you can pick up any you like. I prefer &lt;a href="http://www.sublimetext.com/2"&gt;Sublime Text 2&lt;/a&gt;, it's really cool. Again, you can install it by Chocolatey.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;cinst sublimetext2
    &lt;/pre&gt;&lt;p&gt;After that you are almost Python developer. Just need to learn the language.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Strings, Find in strings&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;The rest of Unit 1, was mostly string operations in Python. And I was surprised how easy Python syntax is. First, you don't need to 'mark' varible declaration anyhow.. No types, no 'var' just the name and value.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;s = "Hello World"
    &lt;/pre&gt;&lt;p&gt;You can access each char inside the string just with [] operator.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;s = "Hello World"
        print s[0]
    &lt;/pre&gt;&lt;p&gt;It would print "H" char into console. It's not really cool, what cool is - substrings by index and negative indexes.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;print s[0:5] # -&gt; Hello
        print s[:5]  # -&gt; Hello
        print s[6:]  # -&gt; World
        print s[:]   # -&gt; Hello World
        print s[-1]  # -&gt; d
        print s[:-5] # -&gt; Hello     
    &lt;/pre&gt;&lt;p&gt;The find operation is very similar to what we have in C++ and C#. It, tried to find substring in string if it's find, position returned or -1.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;print s.find('World') # -&gt; 6
        print s.find('o')  # -&gt; 4
        print s.find('o', 5) # -&gt; 7
    &lt;/pre&gt;&lt;p&gt;The last thing in the unit was &lt;code&gt;str()&lt;/code&gt; method, that able convert any number (integer or float) into string representation.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;print str(3.14)  # -&gt; 3.14
        print str(100)  # -&gt; 100
    &lt;/pre&gt;&lt;p&gt;That's it. Based on that knowledge I suppose to complete my homework.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Homework&lt;/h2&gt;&lt;p&gt;Again, as whole unit - there was really simple problems. The 'real' tough guy to me was very simple problem - "Rounding numbers". So, you are given with float number and you have to return it's integer representation. If numbers fraction is greater than 0.5, it should go ceil otherwise it goes floor. Not big deal I thought to my self and start to write code..&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I spend around 10 minutes to create code like that:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: python"&gt;number_as_string = str(x)
        dot_position = number_as_string.find('.')
        if dot_position != -1:
         integer_part = int(number_as_string[0:dot_position])
         decimal_part = int(number_as_string[dot_position + 1:])
         decimal_length = len(number_as_string[dot_position + 1:]) 
         dividor = pow(10, decimal_length - 1) * 5 

         if decimal_part &gt;= dividor :
          integer_part += 1

         print integer_part
    &lt;/pre&gt;&lt;p&gt;While writing that I had a bad feeling, that I'm using something that I'm not supposed to know, actually. The code worked and I submitted the solution. I received a response, that it actually giving right answer.. but, I was asked to create solution without &lt;code&gt;if&lt;/code&gt;, &lt;code&gt;int()&lt;/code&gt; or &lt;code&gt;round()&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Believe me or not, but I really frustrated on that task. I just didn't understood how it's possible to do not use any &lt;code&gt;if&lt;/code&gt; here, but I have a condition inside the problem. I spend additional 10 minutes, starting to think it's just impossible. It's really funny, but indeed I thought it's something strange and had a great temptation to go and check for correct answer. Fortunately, I got this this online &lt;a href="http://forums.udacity.com/cs101-april2012/questions/345/rounding-without-an-if-statement?page=1&amp;focusedAnswerId=386#386"&gt;discussion&lt;/a&gt; (each course has it's discussion board, where student's can share the info). It turns out I'm not alone, some professional programmers did the look like I did with if's and calls to other functions.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Finally, I just tried to concentrate and really pretend to be a person how is just listen to that material first time, using the only knowledge I got in Unit 1. And solution came up to my mind! It was sooo easy, so I felt really ashamed for the code I wrote above. It's 3 lines of code, using just &lt;code&gt;str()&lt;/code&gt; and &lt;code&gt;find()&lt;/code&gt; method, so simple.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;That was definitely facepalm situation. But, it really encourage me to continue!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-9168587177130447299?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=14LOu08_XmA:EMhWR2xwP0o:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=14LOu08_XmA:EMhWR2xwP0o:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=14LOu08_XmA:EMhWR2xwP0o:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=14LOu08_XmA:EMhWR2xwP0o:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/14LOu08_XmA" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9168587177130447299?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9168587177130447299?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/14LOu08_XmA/cs101-building-search-engine-week-1.html" title="CS101 Building a Search Engine: Week 1" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/04/cs101-building-search-engine-week-1.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkYBRHs8fCp7ImA9WhVXFko.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-4093942169942101385</id><published>2012-04-17T18:55:00.000+03:00</published><updated>2012-04-17T18:55:55.574+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-17T18:55:55.574+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Stanford" /><category scheme="http://www.blogger.com/atom/ns#" term="SearchEngine" /><title>I Enrolled to Udacity 'Build Search Engine' Online Course</title><content type="html">&lt;p&gt;I'm astonished how many opportunities we have now to learn and self-improve there days. One of the greatest things was announcement of online courses by Stanford. Stanford is the world class university with best professors and highest reputation. Then I first time heard that some of Stanford courses are online with videos, quizzes and materials - I thought to my self, - I would not miss the thing. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;With a great support of &lt;a href="http://www.coursera.org/"&gt;Coursera&lt;/a&gt; and &lt;a href="http://www.udacity.com/"&gt;Udacity&lt;/a&gt; now we have great list of interesting &lt;a href="http://www.class-central.com/"&gt;courses&lt;/a&gt;, including programming, artificial intelligence, cryptography etc. Lead by well known specialists those courses are just price-less, nevertheless they are available for free.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I have enrolled for new course by &lt;a href="http://www.udacity.com/"&gt;Udacity&lt;/a&gt; - &lt;a href="http://www.udacity.com/overview/Course/cs101/CourseRev/apr2012"&gt;CS101: Building a Search Engine&lt;/a&gt; that has been started 16 Apr 2012, by David Evans and Sebastian Thrun. This should be interesting journey inside the web crawling, data mining, ranking etc. What is good for me it would not evolve hardcode-math and also does some good introduction into Python programming language. By the way, CS101 does not assume you know any computer language before or any special math knowledge. So, my assumptions that this course should not take hours of digging into the difference between &lt;code&gt;o(n)&lt;/code&gt; and &lt;code&gt;O(n)&lt;/code&gt; but rather has more practical aspects. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, why I'm writing that?.. Millions of people are joining them, a lot of people already got successful records for several courses already. OK, let's look in eyes of truth. I enrolled for several ones already (ml-class and saas). But neither I successfully completed. Due to my business (read as laziness) I quickly went out of schedule and it was to difficult to line up again. I don't want it happen again.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I have some small goals for a next 7 weeks:&lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;
Start up learning new language&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
Lean something new in data mining and data processing&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
Improve my self learning discipline&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
Encourage myself for next online courses&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;I think &lt;a href="http://www.udacity.com/overview/Course/cs101/CourseRev/apr2012"&gt;CS101: Building a Search Engine&lt;/a&gt; is vey nice candidate, because: &lt;br /&gt;
&lt;/p&gt;&lt;ul&gt;&lt;li&gt;&lt;br /&gt;
As I said it should not include very complex math (that I already manage to forgot)&lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
It has no strict deadlines for units &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;br /&gt;
It is interesting enough to do not be bored in a middle (at least I hope so)&lt;br /&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;Moreover, I'll be doing a weekly blog post (Saturday) about highlighting the things I learned through week. If you are interested, please jump in since that train is still not gone. I'm sure it will be great experience.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Let's do that together!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-4093942169942101385?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=LVLNanxv9yc:ZgZIHU9D9cE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=LVLNanxv9yc:ZgZIHU9D9cE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=LVLNanxv9yc:ZgZIHU9D9cE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=LVLNanxv9yc:ZgZIHU9D9cE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/LVLNanxv9yc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/4093942169942101385?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/4093942169942101385?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/LVLNanxv9yc/i-enrolled-to-udacity-build-search.html" title="I Enrolled to Udacity 'Build Search Engine' Online Course" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/04/i-enrolled-to-udacity-build-search.html</feedburner:origLink></entry><entry gd:etag="W/&quot;AkEAQXo6eyp7ImA9WhVXEk4.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-2956553896528190000</id><published>2012-04-12T16:50:00.000+03:00</published><updated>2012-04-12T16:50:40.413+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-12T16:50:40.413+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Mobile" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>ASP.NET Articles Mobile Application</title><content type="html">&lt;p&gt;Do you like &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; web site content? Do you enjoy reading fine selected articles about ASP.NET and related technologies? Me too, but I spent most of the reading from my iPad. And unfortunately &lt;a href="http://asp.net"&gt;asp.net&lt;/a&gt; is not that mobile friendly yet, moreover articles are just a bunch of links to developers blogs, that might not so be adapted for mobile devices as well. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, I would like to introduce mobile application that I created to close the gap. Please welcome &lt;a href="http://aspnetmobile.apphb.com/"&gt;http://aspnetmobile.apphb.com/&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh4.googleusercontent.com/-OG7PCIOHvgg/T4bc0YDkssI/AAAAAAAAIYs/Ml5GW6dmmAg/s720/image-1.png"&gt;&lt;br /&gt;
    &lt;img src="https://lh4.googleusercontent.com/-OG7PCIOHvgg/T4bc0YDkssI/AAAAAAAAIYs/Ml5GW6dmmAg/s720/image-1.png" style="width: 620px"/&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://aspnetmobile.apphb.com/"&gt;aspnet.mobile&lt;/a&gt; is rather simple application. Despite of many similar apps that uses RSS channel, it goes for ASP.NET portal simple external API. RSS is bad in the way that you are limited with initial content (typically up to 25 articles on channel). With &lt;a href="http://aspnetmobile.apphb.com/"&gt;aspnet.mobile&lt;/a&gt; you freely can access any article ever posted on ASP.NET.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;It's powered by &lt;a href="http://jquerymobile.com/"&gt;jQuery Mobile&lt;/a&gt; that currently provides more "iOS-look" interface. I'm happy with that currently but I plan to have native look for Android and WP7 as well, so I thinking either to change the framework or to create custom one. But it currently looks and works great on iPad.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-ieAlxaf1ltM/T4bc0oHZBaI/AAAAAAAAIYw/qzKfJmSfi2A/s720/image-2.PNG"&gt;&lt;br /&gt;
    &lt;img src="https://lh6.googleusercontent.com/-ieAlxaf1ltM/T4bc0oHZBaI/AAAAAAAAIYw/qzKfJmSfi2A/s720/image-2.PNG" style="width: 620px"/&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;I didn't want to just refer reader to developers blog, for the reason above. Instead, I much inspired by iOS 5.0 Safari feature called 'Reader'. A bit of googling and I found that Safari using technology called &lt;a href="http://www.readability.com/"&gt;Readability&lt;/a&gt;. There are different ports of that technology for a different platforms: Ruby, PHP, Python, Node.js.. and I was happy to find great implementation of &lt;a href="https://github.com/marek-stoj/NReadability"&gt;NReadability&lt;/a&gt; by &lt;a href="http://about.me/marekstoj"&gt;Marek Stoj&lt;/a&gt;. Basically, it allowed me to render nice looking pages, like:&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-D5ZD6S532PE/T4bc0XPGX1I/AAAAAAAAIYo/oVBo505PNXI/s720/image-3.PNG"&gt;&lt;br /&gt;
    &lt;img src="https://lh6.googleusercontent.com/-D5ZD6S532PE/T4bc0XPGX1I/AAAAAAAAIYo/oVBo505PNXI/s720/image-3.PNG" style="width: 620px"/&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Besides of that it has a basic support of offline mode. All read articles are stored in Local Storage, so once the application offine it will provide proper behavior and propose some content.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I will be happy if you try and let me know your impression. Feel free to check sources at &lt;a href="https://github.com/alexanderbeletsky/aspnet.mobile"&gt;github&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-2956553896528190000?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=4c6jk8lBzKc:iXDo11fmqwE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=4c6jk8lBzKc:iXDo11fmqwE:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=4c6jk8lBzKc:iXDo11fmqwE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=4c6jk8lBzKc:iXDo11fmqwE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/4c6jk8lBzKc" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2956553896528190000?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2956553896528190000?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/4c6jk8lBzKc/aspnet-articles-mobile-application.html" title="ASP.NET Articles Mobile Application" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-OG7PCIOHvgg/T4bc0YDkssI/AAAAAAAAIYs/Ml5GW6dmmAg/s72-c/image-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/04/aspnet-articles-mobile-application.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEMR3c8fip7ImA9WhVXEkw.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-4245095659809407410</id><published>2012-04-10T21:35:00.000+03:00</published><updated>2012-04-12T09:38:06.976+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-12T09:38:06.976+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>New in ASP.NET MVC4: Razor changes</title><content type="html">&lt;p&gt;Razor has been changed a little with ASP.NET MVC 4 beta. It's not a kind of radical changes, but rather improvements that make developers happier. As for me, developers happier then you need to write less code to get the same function. It reminded me a ideal device, which is part of &lt;a href="http://www.mindtools.com/pages/article/newCT_92.htm"&gt;TRIZ&lt;/a&gt; theory. Ideal device is a device that does not exit, but does it function. By analogy, ideal code is the code that not exist but it's function exist. Razor is not that ideal, through.. But it's "more ideal" than previous version. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;No more @Url.Content&lt;/h2&gt;&lt;p&gt;I got used to @Url.Content and used that for all CSS and JS references. Since it's to commonly used, developers decided to include it on a level of engine. Now, instead of&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;script src=&amp;quot;@Url.Content(&amp;quot;~/Scripts/Controls.js&amp;quot;)&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;p&gt;You simply can write,&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;script src=&amp;quot;~/Scripts/Controls.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;p&gt;If Razor detects ~/ it would created an output identical to @Url.Content. Just got rid of several bytes within view files.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conditions&lt;/h2&gt;&lt;p&gt;Conditions in attributes were pretty noisy. Have you ever create something like this?&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;div @{if (myClass != null) { &amp;lt;text&amp;gt;class=&amp;quot;@myClass&amp;quot;&amp;lt;/text&amp;gt; } }&amp;gt;Content&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;p&gt;I had and I did not like it much. I usually ended up with creation of some simple HTML helper instead. With new Razor it a little simpler, not you can write&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;div class=&amp;quot;@myClass&amp;quot;&amp;gt;Content&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;p&gt;If @myClass is null, it won't output class attribute at all. Very handy.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;And a little more&lt;/h2&gt;&lt;p&gt;This is an update section I created after this post has been &lt;a href="https://twitter.com/#!/scottgu/status/190133254060388352"&gt;twitted&lt;/a&gt; by &lt;a href="https://twitter.com/#!/scottgu"&gt;Scott Guthrie&lt;/a&gt; and some valuable comments has been received.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;&lt;a href="https://twitter.com/#!/bradwilson"&gt;Brad Wilson&lt;/a&gt; stated, conditions does not only support nullable types, but also booleans. Say, I have code:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;input checked=&amp;quot;@ViewBag.Checked&amp;quot; type=&amp;quot;checkbox&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;p&gt;If the @ViewBag.Checked in null or false, it will be rendered as:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;input type=&amp;quot;checkbox&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;p&gt;Else if @ViewBag.Checked is true, it will be rendered as:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;input checked=&amp;quot;checked&amp;quot; type=&amp;quot;checkbox&amp;quot;/&amp;gt;
&lt;/pre&gt;&lt;p&gt;&lt;a href="https://twitter.com/#!/HumanCompiler"&gt;Erik Porter&lt;/a&gt; also mentioned the custom support for &lt;code&gt;data-*&lt;/code&gt; attributes. Data attributes are little special, so even if you missing particular value you still want to have those as empty &lt;code&gt;data-role = ""&lt;/code&gt;. So, if you have code like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;ul data-role=&amp;quot;@ViewBag.ListRole&amp;quot;&amp;gt;
&amp;lt;/ul&amp;gt;
&lt;/pre&gt;&lt;p&gt;and @ViewBag.ListRole is null or false, data attribute will be eliminated. That's how it work in Beta. But for next releases &lt;code&gt;data-*&lt;/code&gt; attributes will be treated specially, so even if value is null or false they will be rendered as empty ones.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;I haven't noticed any more changes so far. It's great to see that Razor has not been "frozen" and still improving. I like that view engine first of all by it's simplicity. So making it even more simple would definitely make it more attractive.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-4245095659809407410?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9gXVCZaZHoo:WdRcFhOWZKk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9gXVCZaZHoo:WdRcFhOWZKk:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9gXVCZaZHoo:WdRcFhOWZKk:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=9gXVCZaZHoo:WdRcFhOWZKk:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/9gXVCZaZHoo" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/4245095659809407410?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/4245095659809407410?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/9gXVCZaZHoo/new-in-aspnet-mvc4-razor-changes.html" title="New in ASP.NET MVC4: Razor changes" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/04/new-in-aspnet-mvc4-razor-changes.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0MARng4fip7ImA9WhVQFUg.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-7885407407926975805</id><published>2012-04-04T18:32:00.000+03:00</published><updated>2012-04-04T20:10:47.636+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-04T20:10:47.636+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>Why I'm Not Using Bundling.. Yet</title><content type="html">&lt;p&gt;Last time I a &lt;a href="http://www.beletsky.net/2012/04/new-in-aspnet-mvc4-bundling-and.html"&gt;posted&lt;/a&gt; some initial info about Bundling and Minification abilities of MVC4. In this post, I describe some concerns that prevents me of using it right now. Let me remind that I'm doing review of MVC 4 beta and I hope some of those concern would not be actual at the time of release. This is only personal considerations, you might not agree with everything here.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;It's contra-intuitive&lt;/h2&gt;&lt;p&gt;Maybe the 'contra-intuitive' is not exact word that reflects my frustration. What I mean, it does not do what you might expect by default. Remember I described two methods RegisterTemplateBundles() and EnableDefaultBundles()? It was really unclear to me what they do until I looked into code. Modern frameworks tend to be as less surprise as possible, but not in case of &lt;code&gt;System.Web.Optimizations&lt;/code&gt;. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Development and production mode&lt;/h2&gt;&lt;p&gt;The fact it does not take into account 'Debug' and 'Release' mode is also very confusing. As same as in point above, I have a different expectations how it should behave. For 'Debug' mode it simply should do nothing - no optimization, no compression. For release mode it should do as much as possible to minify the number of HTTP request. It turns out that you have to create some code on your own to make it happen. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Bundling is bad during debugging&lt;/h2&gt;&lt;p&gt;While you in development mode you do debug, no surprise here. Having FireBug or Chrome Development tools it's very easy to debug javascript, you can pick up any file and place breakpoint inside.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-gVLbEPHXI40/T3xo1NZddXI/AAAAAAAAIUQ/ZYjIwH4W1Tw/s619/image-1.png"&gt;&lt;br /&gt;
&lt;img src="https://lh6.googleusercontent.com/-gVLbEPHXI40/T3xo1NZddXI/AAAAAAAAIUQ/ZYjIwH4W1Tw/s619/image-1.png" alt="chrome development" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;It is no so easy with bundling, cause it will package all your files in one big chunk, so you need to open and find right place there. Since the total number of line could be huge there, it's turns to be big deal.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;As a workaround you have to have a copies of references, one you using on development and ones you use on production.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;&amp;lt;!-- Development --&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/jquery-1.6.4.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/jquery.mobile-1.0b3.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/knockout-2.0.0.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/underscore.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/App/CacheInit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;     

&amp;lt;!-- Production 
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&amp;quot;~/Scripts/js&amp;quot;)&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
--&amp;gt;
&lt;/pre&gt;&lt;h2&gt;It's not well ironed&lt;/h2&gt;&lt;p&gt;Since it's very young obviously it has some problems. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Be honest, I haven't seen on my own but one of the comments in my previous post described the issue with minification of CSS files that include &lt;code&gt;-ie-&lt;/code&gt; specific selectors. That's probably not only one issue found.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;What did I expect?&lt;/h2&gt;&lt;p&gt;To do not have only critics I try to put some constructive part in post as well. Ok, so I see it should work to meet my needs? &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;First of all, it should be implemented as simple HTML razor helpers. You just specify the name of bundle there, like "scripts/js" and that's it. Helper is smart enough to understand what is active environment at the moment. In case of 'Debug' it expanded to a bunch of script references or links, for JS and CSS respectively. In 'Release' mode it's indeed refers the bundle, so it's packaged and minified for best performance.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;You might say, that 1. this is out of scope for &lt;code&gt;System.Web.Optimization&lt;/code&gt; framework 2. you can create this behavior easily on your own. This is right, but in the same time if you deal with ASP.NET MVC4 you have some expectation that is should work right and you are not forced to invent the wheel again, so you have kind of consistency between numerous projects.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I've been thinking about to create something like that, but during the chat with fellow developer &lt;a href=""&gt;@andrexx&lt;/a&gt; about bundling and he showed me something interesting. &lt;a href="https://twitter.com/#!/tdupont750"&gt;Tom DuPont&lt;/a&gt; has already implemented something that's really reflects my needs. It's the &lt;a href="http://www.tomdupont.net/2012/03/configuring-bundles-in-mvc-4.html"&gt;way&lt;/a&gt; of configuring bundles both from code and web.config. It looks like a very handy tool.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-7885407407926975805?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=2PH0ClsKn1c:6TOLwtADjqQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=2PH0ClsKn1c:6TOLwtADjqQ:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=2PH0ClsKn1c:6TOLwtADjqQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=2PH0ClsKn1c:6TOLwtADjqQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/2PH0ClsKn1c" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7885407407926975805?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7885407407926975805?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/2PH0ClsKn1c/why-im-not-using-bundling-yet.html" title="Why I'm Not Using Bundling.. Yet" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-gVLbEPHXI40/T3xo1NZddXI/AAAAAAAAIUQ/ZYjIwH4W1Tw/s72-c/image-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/04/why-im-not-using-bundling-yet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0cNQ3k4cCp7ImA9WhVQE0k.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-7737414809459035053</id><published>2012-04-02T09:44:00.000+03:00</published><updated>2012-04-02T09:44:52.738+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-04-02T09:44:52.738+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="JavaScript" /><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><title>New in ASP.NET MVC4: Bundling and Minification</title><content type="html">&lt;p&gt;Next new feature that appeared in MVC 4 beta is bundling and minification. Idea is simple: modern web application contains of many static resources, especially css and javascript files. To load the page browser have to load each resource. Each resource is being requested by HTTP request. Browser have to make as many request as page refers, wait till all are completed and only after that render the page.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The problem is, each HTTP request takes time. One of the most critical Yahoo web applications performance recommendation says - &lt;a href="http://developer.yahoo.com/performance/rules.html"&gt;Minimize HTTP request&lt;/a&gt;. As few HTTP requests you need to load application as better.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;System.Web.Optimization&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;Bundling and minification is located in it's own namespace &lt;code&gt;System.Web.Optimization&lt;/code&gt; and resides in assembly named &lt;code&gt;Microsoft.Web.Optimization&lt;/code&gt;, which is installed by default with new ASP.NET MVC4 application template as NuGet package. Since it's still in beta, namespaces and class names are probably be changing, but let's look on that we have now.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;What is bundle?&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;Bundle is simply logical group of files that could be referenced by unique name and being loaded with one HTTP request. Suppose, we have a Layout.cshtml that might look something like that:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;

&amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt; 
        
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/jquery.mobile-1.0b3.min.css&amp;quot; /&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/reset.css&amp;quot; /&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/foundation.css&amp;quot; /&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/Fonts.css&amp;quot; /&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/Site.Layout.css&amp;quot; /&amp;gt;
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;~/Content/Site.Mobile.css&amp;quot; /&amp;gt;

&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/jquery-1.6.4.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/jquery.mobile-1.0b3.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/knockout-2.0.0.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/underscore.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;~/Scripts/App/CacheInit.js&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;        
&lt;/pre&gt;&lt;p&gt;You can see, that's a lot of css and javascript that will be loaded for page. With bundling we can rewrite it with very simple code&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;meta charset=&amp;quot;utf-8&amp;quot; /&amp;gt;

&amp;lt;title&amp;gt;@ViewBag.Title&amp;lt;/title&amp;gt; 
        
&amp;lt;link rel=&amp;quot;stylesheet&amp;quot; href=&amp;quot;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&amp;quot;~/Content/css&amp;quot;)&amp;quot; /&amp;gt;

&amp;lt;script type=&amp;quot;text/javascript&amp;quot; src=&amp;quot;@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl(&amp;quot;~/Scripts/js&amp;quot;)&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;p&gt;In this case &lt;code&gt;"~/Content/css"&lt;/code&gt; and &lt;code&gt;"~/Scripts/js"&lt;/code&gt; are no longer virtual paths, but bundle names. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The the browser would load this page, rendered HTML would look like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;link href=&amp;quot;/Content/css?v=q_sftc19r22licIM8-Ar58FwviyWry1JuYbA-iATm4M1&amp;quot; rel=&amp;quot;stylesheet&amp;quot; type=&amp;quot;text/css&amp;quot; /&amp;gt;
&amp;lt;script src=&amp;quot;/Scripts/js?v=_8kyYWxz-Je_VE0p3_w5nbcjAhq0Qj4vZiNxvYU_oBg1&amp;quot;&amp;gt;&amp;lt;/script&amp;gt;
&lt;/pre&gt;&lt;p&gt;Note, it would reference the bundle with version. The version is a kind of hash taken on all files in bundle content. This enables browser caching, if content of bundle is not change browser will take it from cache, which is much faster. In case of changes, new version token is generated, so browser would be forced to reload bundle.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh4.googleusercontent.com/-XZFZlvPjPoE/T3lKUgcghZI/AAAAAAAAIS4/_8RlXLXOx24/s619/image-1.png"&gt;&lt;br /&gt;
    &lt;img src="https://lh4.googleusercontent.com/-XZFZlvPjPoE/T3lKUgcghZI/AAAAAAAAIS4/_8RlXLXOx24/s619/image-1.png" alt="chrome development tools" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Bundle registration&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;In &lt;code&gt;global.asax&lt;/code&gt; file you will see new line:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    BundleTable.Bundles.RegisterTemplateBundles();
&lt;/pre&gt;&lt;p&gt;It's only one small line of code that enables bundling and minification framework.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;RegisterTemplateBundles() vs. EnableDefaultBundles()&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;It looks fine so far, so I tried to add new javascript file into Scripts folder. Unfortunately, my application did not work. I think this is first very contra-intuitive fact of bundling framework. Googling a bit I found quick solution, change RegisterTemplateBundles() to EnableDefaultBundles().. I tried that and it really works.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Since the &lt;code&gt;System.Web.Optimization&lt;/code&gt; has not been opened sourced yet (in case you haven't heard - ASP.NET web stack is &lt;a href="http://weblogs.asp.net/scottgu/archive/2012/03/27/asp-net-mvc-web-api-razor-and-open-source.aspx"&gt;open source&lt;/a&gt;, even with accepting pull request) I had to go to &lt;a href="http://www.telerik.com/products/decompiler.aspx"&gt;JustDecompile&lt;/a&gt; to understand why is that.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, RegisterTemplateBundles() is looks like that,&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public void RegisterTemplateBundles()
{
    bool flag;
    bool flag2;
    bool flag3;
    bool flag4;
    bool flag5;
    bool flag6;
    bool flag7;
    Bundle bundle1 = new Bundle("~/Scripts/js", new JsMinify());
    bool flag8 = false.AddDirectory("~/Scripts", "jquery-*", flag, flag8);
    bool flag9 = false.AddDirectory("~/Scripts", "jquery.mobile*", flag2, flag9);
    bool flag10 = false.AddDirectory("~/Scripts", "jquery-ui*", flag3, flag10);
    bool flag11 = false.AddDirectory("~/Scripts", "jquery.unobtrusive*", flag4, flag11);
    bool flag12 = false.AddDirectory("~/Scripts", "jquery.validate*", flag5, flag12);
    bool flag13 = false.AddFile("~/Scripts/MicrosoftAjax.js", flag13);
    bool flag14 = false.AddFile("~/Scripts/MicrosoftMvc.js", flag14);
    bool flag15 = false.AddDirectory("~/Scripts", "modernizr*", flag6, flag15);
    bool flag16 = false.AddFile("~/Scripts/AjaxLogin.js", flag16);
    this.Add(bundle1);
    Bundle bundle2 = new Bundle("~/Content/css", new CssMinify());
    bool flag17 = false.AddFile("~/Content/site.css", flag17);
    bool flag18 = false.AddDirectory("~/Content/", "jquery.mobile*", flag7, flag18);
    this.Add(bundle2);
    Bundle bundle3 = new Bundle("~/Content/themes/base/css", new CssMinify());
    bool flag19 = false.AddFile("~/Content/themes/base/jquery.ui.core.css", flag19);
    bool flag20 = false.AddFile("~/Content/themes/base/jquery.ui.resizable.css", flag20);
    bool flag21 = false.AddFile("~/Content/themes/base/jquery.ui.selectable.css", flag21);
    bool flag22 = false.AddFile("~/Content/themes/base/jquery.ui.accordion.css", flag22);
    bool flag23 = false.AddFile("~/Content/themes/base/jquery.ui.autocomplete.css", flag23);
    bool flag24 = false.AddFile("~/Content/themes/base/jquery.ui.button.css", flag24);
    bool flag25 = false.AddFile("~/Content/themes/base/jquery.ui.dialog.css", flag25);
    bool flag26 = false.AddFile("~/Content/themes/base/jquery.ui.slider.css", flag26);
    bool flag27 = false.AddFile("~/Content/themes/base/jquery.ui.tabs.css", flag27);
    bool flag28 = false.AddFile("~/Content/themes/base/jquery.ui.datepicker.css", flag28);
    bool flag29 = false.AddFile("~/Content/themes/base/jquery.ui.progressbar.css", flag29);
    bool flag30 = false.AddFile("~/Content/themes/base/jquery.ui.theme.css", flag30);
    this.Add(bundle3);
}
&lt;/pre&gt;&lt;p&gt;As you can see it adds all recourses that came just in template, including jQuery Mobile and jQuery UI. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;In the same time, EnableDefaultBundles()&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public void EnableDefaultBundles()
{
    this.Add(new DynamicFolderBundle("js", JsMinify.Instance, "*.js"));
    this.Add(new DynamicFolderBundle("css", CssMinify.Instance, "*.css"));
}
&lt;/pre&gt;&lt;p&gt;So, what it does - it matches all javascript and css files in project, minify them and create to bundles out of it.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;As you can see &lt;code&gt;EnableDefaultBundles()&lt;/code&gt; is also uses Minification policy for bundle content.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;How add my own custom bundle?&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;As simple as create new &lt;code&gt;Bundle&lt;/code&gt; object, put files inside and then add it to Bundles collection.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;var bundle = new Bundle("~/Scripts/libs", new JsMinify());
bundle.AddFile("~/Scripts/knockout-2.0.0.js");
BundleTable.Bundles.Add(bundle);
&lt;/pre&gt;&lt;p&gt;But there two issues here. First of all, you don't always want to minify. Second, adding bundles with many files will make global.aspx.cs looks messy. I really liked approached proposed by Scott K. Allen in his &lt;a href="http://odetocode.com/Blogs/scott/archive/2012/03/20/yet-another-bundling-approach-for-mvc-4.aspx"&gt;Yet Another Bundling Approach for MVC 4&lt;/a&gt; blog post. He does it in more object-oriented way including smart code to decide, should the bundle be minified or not. All you need is just take code he created and after you are able to make bundles like that.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class JsLibsBundle : JsBundle
{
    public JsLibsBundle() : base("~/js/libs")
    {
        AddFiles(
            "~/Scripts/jquery-1.6.4-vsdoc.js",
            "~/Scripts/jquery-1.6.4.js",
            "~/Scripts/jquery.mobile-1.0b3.js",
            "~/Scripts/knockout-2.0.0.js",
            "~/Scripts/modernizr-2.0.6-development-only.js",
            "~/Scripts/underscore.js"
        );
    }
}

public class CssAppBundle : CssBundle
{
    public CssAppBundle() : base("~/css/mobile")
    {
        AddFiles(
            "~/Content/jquery.mobile-1.0b3.css",
            "~/Content/Site.Mobile.css"
        );
    }
}
&lt;/pre&gt;&lt;p&gt;And put them to registered those classes in global.asax.cs&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    BundleTable.Bundles.Add(new JsLibsBundle());
    BundleTable.Bundles.Add(new CssAppBundle());
&lt;/pre&gt;&lt;h2&gt;Ok, how all that stuff works?&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;Now let's do a really brief look under the hood. Again, &lt;a href="http://www.telerik.com/products/decompiler.aspx"&gt;JustDecompile&lt;/a&gt; is our friend here. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;It was interesting to me to find out new cool way of registration modules in ASP.NET. No longer entry points in web.config or other magic. You can have a special class &lt;code&gt;PreApplicationStartCode&lt;/code&gt; that would be called then assembly is loaded, but before application is stated.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public static class PreApplicationStartCode
{
    private static bool _startWasCalled;

    public static void Start();
}
&lt;/pre&gt;&lt;p&gt;Here &lt;code&gt;System.Web.Optimization&lt;/code&gt; register it's own module, called &lt;code&gt;BundleModule&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public static void Start()
{
    if (PreApplicationStartCode._startWasCalled)
    {
        return;
    }
    PreApplicationStartCode._startWasCalled = 1;
    DynamicModuleUtility.RegisterModule(typeof(BundleModule));
}
&lt;/pre&gt;&lt;p&gt;Then the module is intialized, it subscribes for event called &lt;a href="http://msdn.microsoft.com/en-us/library/system.web.httpapplication.postresolverequestcache(v=vs.90).aspx"&gt;HttpApplication.PostResolveRequestCache&lt;/a&gt; and inside the callback it would register the &lt;code&gt;BundleHandler&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;private void OnApplicationPostResolveRequestCache(object sender, EventArgs e)
{
    HttpApplication httpApplication = (HttpApplication)sender;
    if (BundleTable.Bundles.Count &gt; 0)
    {
        BundleHandler.RemapHandlerForBundleRequests(httpApplication);
    }
}
&lt;/pre&gt;&lt;p&gt;The handler is now responsible for dirty job. Through the &lt;code&gt;RequestBundle&lt;/code&gt; class it finally comes to &lt;code&gt;ProcessRequest&lt;/code&gt; method.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;internal void ProcessRequest(BundleContext context)
{
    context.EnableInstrumentation = Bundle.GetInstrumentationMode(context.HttpContext);
    BundleResponse bundleResponse = this.GetBundleResponse(context);
    Bundle.SetHeaders(bundleResponse, context);
    context.HttpContext.Response.Write(bundleResponse.Content);
}
&lt;/pre&gt;&lt;p&gt;So, the &lt;code&gt;GetBundleResponse&lt;/code&gt; is there magic is happens. &lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;private BundleResponse GetBundleResponse(BundleContext context)
{
    BundleResponse bundleResponse = Bundle.CacheLookup(context);
    if (bundleResponse == null || context.EnableInstrumentation)
    {
        bundleResponse = this.GenerateBundleResponse(context);
        if (!context.EnableInstrumentation)
        {
            Bundle.UpdateCache(context, bundleResponse);
        }
    }
    return bundleResponse;
}
&lt;/pre&gt;&lt;p&gt;What's important here is that it uses cache. So, it makes bundling rather efficient. In case if there are no cached result, it will run the &lt;code&gt;GenerateBundleResponse&lt;/code&gt; to generate actual response:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public virtual BundleResponse GenerateBundleResponse(BundleContext context)
{
    if (context == null)
    {
        throw new ArgumentNullException("context");
    }
    IEnumerable&amp;lt;FileInfo&amp;gt; fileInfos = this.EnumerateFiles(context);
    fileInfos = context.BundleCollection.IgnoreList.FilterIgnoredFiles(fileInfos);
    fileInfos = this.Orderer.OrderFiles(context, fileInfos);
    fileInfos = this.ReplaceFileExtensions(context, fileInfos);
    string str = this.Builder.BuildBundleContent(this, context, fileInfos);
    BundleResponse bundleResponse = new BundleResponse(str, fileInfos);
    this.Transform.Process(context, bundleResponse);
    return bundleResponse;
}
&lt;/pre&gt;&lt;p&gt;Yet another interesting finding here is &lt;code&gt;this.Orderer&lt;/code&gt;. Sometime ago I did smalltalk on &lt;a href="http://kievalt.net"&gt;Kiev ALT.NET&lt;/a&gt; meeting about new stuff in VS2011 and being asked a question, how is possible to order the files. I didn't know answer then. It is actually possible to setup the order of files inside bundle, in case you have cross-file dependencies:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public interface IBundleOrderer
{
 IEnumerable&amp;lt;FileInfo&amp;gt; OrderFiles(BundleContext context, IEnumerable&amp;lt;FileInfo&amp;gt; files);
}
&lt;/pre&gt;&lt;p&gt;That's it, the generated response than just being written to &lt;code&gt;context.HttpContext.Response&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;Bundling and minification is something that I personally wanted so much, to appear in new MVC framework. Now it's there, it works.. but I would not say I'm 100% happy. There are several things that makes it a little difficult to use, as for me. I did want to place it in this post, but appeared to big.. So, I'll probably do a separate one on this matter. &lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-7737414809459035053?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=097aUQmeRMU:P4jAbReWB28:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=097aUQmeRMU:P4jAbReWB28:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=097aUQmeRMU:P4jAbReWB28:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=097aUQmeRMU:P4jAbReWB28:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/097aUQmeRMU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7737414809459035053?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7737414809459035053?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/097aUQmeRMU/new-in-aspnet-mvc4-bundling-and.html" title="New in ASP.NET MVC4: Bundling and Minification" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh4.googleusercontent.com/-XZFZlvPjPoE/T3lKUgcghZI/AAAAAAAAIS4/_8RlXLXOx24/s72-c/image-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/04/new-in-aspnet-mvc4-bundling-and.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUIFQ38-fCp7ImA9WhVRGEk.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-1463102575063567265</id><published>2012-03-27T09:26:00.000+03:00</published><updated>2012-03-27T14:25:12.154+03:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-27T14:25:12.154+03:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Speeches" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><title>MS SWIT 2012</title><content type="html">&lt;p&gt;The 22-23 of March this year I had a chance to participate biggest event organized by Microsoft Ukraine - &lt;a href="http://www.msswit.in.ua/eng/"&gt;MS SWIT 2012&lt;/a&gt;. &lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh3.googleusercontent.com/-cRLz5_WgVdQ/T3FcfX8ELjI/AAAAAAAAIOk/uSY2Pa50ryc/s1024/image-1.png"&gt;&lt;br /&gt;
&lt;img src="https://lh3.googleusercontent.com/-cRLz5_WgVdQ/T3FcfX8ELjI/AAAAAAAAIOk/uSY2Pa50ryc/s1024/image-1.png" alt="ms swit 2012" style="width: 620px"/&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;It's been almost two years ago I visited MS SWIT 2010. If the primary topic of last conference was cloud technologies - Azure, SQL etc. This time I would say the buzz was around Windows 8, Market Place and Metro-style applications. Of cause, there was still a lot of attention to Azure as well.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I really much enjoyed the Keynote of first day by &lt;a href="http://www.linkedin.com/pub/wolfgang-ebermann/4/825/278"&gt;Wolfgang Ebermann&lt;/a&gt;. Indeed, Microsoft opens pretty much interesting opportunities for developers on Windows 8 and Windows Phone markets. Not long time ago Ukraine officially is a part of MarketPlace, so no time to wait - go and create you first Metro style app. And with new Microsoft policies regarding adoption of open standards like HTLM5, EcmaScript - it looks really attractive to me.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Big attention was also about new recent releases like: Share Point, SQL Server Denali, Windows Server 8 etc. I would not say this is exactly interesting to me, since I more focus on web technologies, but it's always good to be aware what's going on around. First day of conference got a lot  people moving around, so if you wanted to listen for some interesting speech you have to be in time to get free sit. Second day was not so overcrowded as for me, so the people who didn't come have to be sorry, cause Second day was much more interesting. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;My talk was about new stuff in ASP.NET MVC4, with more focus to mobile web applications. That was the biggest audience I ever speak to. There was almost no free sits.. I don't know for sure it contained 150-200 people.. Huge!&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Being much inspired by Steve Sanderson &lt;a href="http://channel9.msdn.com/Events/TechDays/TechDays-2012-Belgium/199"&gt;talk&lt;/a&gt; on TechDays 2012, I decided to make something similar. I came up with idea of simple mobile web application, namely it is a web client to &lt;a href="http://asp.net"&gt;http://asp.net&lt;/a&gt; portal and develop it just during the speech. I had several issue's there, first one I did a little more longer introduction and then some issues with internet that made me a little nervous and I lose tempo a bit. That forced me to skip the last part of talk regarding Offline mode for apps. Anyway, I hope I was able to show new sweet available stuff like CSS3 Media Queries, Display Modes and jQuery Mobile framework. &lt;br /&gt;
&lt;/p&gt;&lt;script src="http://speakerdeck.com/embed/4f6c7d411388a6002101e8f1.js"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;Thanks a lot for everyone who listened to me and came up with questions. I appreciate your attention and hope my talk was useful for you.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh3.googleusercontent.com/-bLh_7pAn2gY/T3FcfXZctCI/AAAAAAAAIOc/76pxYKZvujQ/s733/image-2.png"&gt;&lt;br /&gt;
&lt;img src="https://lh3.googleusercontent.com/-bLh_7pAn2gY/T3FcfXZctCI/AAAAAAAAIOc/76pxYKZvujQ/s733/image-2.png" alt="asp.net portal mobile" style="width: 620px"/&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Regarding the app, I polished it a bit and going to release closer to the end of next week. The sources are hosted on &lt;a href="https://github.com/alexanderbeletsky/aspnet.mobile"&gt;https://github.com/alexanderbeletsky/aspnet.mobile&lt;/a&gt;, feel free to clone and send a pull request.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-1463102575063567265?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=AV6hO7fWPtU:tUqob2PDuG8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=AV6hO7fWPtU:tUqob2PDuG8:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=AV6hO7fWPtU:tUqob2PDuG8:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=AV6hO7fWPtU:tUqob2PDuG8:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/AV6hO7fWPtU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1463102575063567265?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1463102575063567265?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/AV6hO7fWPtU/ms-swit-2012.html" title="MS SWIT 2012" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-cRLz5_WgVdQ/T3FcfX8ELjI/AAAAAAAAIOk/uSY2Pa50ryc/s72-c/image-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/03/ms-swit-2012.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMCR3oyfyp7ImA9WhVREks.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-2094890111776844795</id><published>2012-03-20T18:54:00.000+02:00</published><updated>2012-03-20T18:54:26.497+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-20T18:54:26.497+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="asp.net" /><title>New in ASP.NET MVC4 Beta: Web API</title><content type="html">&lt;p&gt;This is a high level overview of new stuff that appeared within VS2011 release. So, let's briefly look inside. Today will take a look on changes appeared to Web API.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Web API&lt;/h2&gt;&lt;p&gt;The biggest and most important change as for me is integration of Web API into ASP.NET. Web API is most known as WCF Web API - an attempt of .NET team build framework for creation of RESTfull services based on WCF infrastructure. There was several releases of WCF Web API made and general feedback from community was - "it's good enough". Since when, Microsoft did a strategic change, merged WCF Web API and ASP.NET teams together, so both products to be developed in sync. From now Web API is integral part of ASP.NET (and does not have any WCF prefix any more) and called ASP.NET Web API. It is not just re-branding, but it reflects changes both the programming model and processing architecture.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Simple Start&lt;/h2&gt;&lt;p&gt;If we create a new ASP.NET MVC4 application, we see the following change into &lt;code&gt;global.asax&lt;/code&gt; file.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;routes.MapHttpRoute(
    name: "DefaultApi",
    routeTemplate: "api/{controller}/{id}",
    defaults: new { id = RouteParameter.Optional }
);
&lt;/pre&gt;&lt;p&gt;&lt;code&gt;MapHttpRoute&lt;/code&gt; is new extension method for &lt;code&gt;RouteCollection&lt;/code&gt;. Similarly to ASP.NET MVC routing definition, it maps HTTP request with matching URL into corresponding API controller action. By default, the are all prefixed with "api" to do not "interfere" to ASP.NET MVC routing. It's not a problem to change that prefix to anything you want, like "services", "methods" etc.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    /api/contacts/      &lt;- Web API
    /api/contacts/1     &lt;- Web API
    /contacts/1         &lt;- ASP.NET MVC
&lt;/pre&gt;
&lt;p&gt;The API controllers are really similar to ASP.NET MVC controllers. Instead of inherit from &lt;code&gt;Controller&lt;/code&gt; class, they inherited from &lt;code&gt;ApiController&lt;/code&gt; class. Instead of returning &lt;code&gt;ActionResult&lt;/code&gt; from action, in API controllers you return either &lt;code&gt;IEnumerable&lt;/code&gt; or concrete instance, like &lt;code&gt;Product&lt;/code&gt; (there are some more dedicated scenarios with returning types, we will see later).
&lt;/p&gt;&lt;p&gt;By just looking into example from project template it is very easy to understand, what's going on. There are some small details you should know before API controller usage.
&lt;/p&gt;&lt;h3&gt;Action methods naming&lt;/h3&gt;&lt;p&gt;API controllers are "Convention over configuration" based. The actual HTTP verb that action handles could be specified in method name.
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class ProductsController : ApiController
{
    // Handles GET
    public IEnumerable&amp;lt;Product&amp;gt; Get() { }
    // Handles POST
 public Product Post(Product product) { }
    // Handles PUT
 public Product Put(Product product) { }
    // Handles DELETE
 public void Delete(int id) { }
}
&lt;/pre&gt;&lt;p&gt;This convention applies only to GET, POST, PUT, and DELETE methods. You might be more specific in methods names, like &lt;code&gt;GetProducts&lt;/code&gt; or &lt;code&gt;DeleteProduct&lt;/code&gt;, the important is the prefix (Get, Post, Put etc.) of method.
&lt;/p&gt;&lt;p&gt;If you don't want to rely of named based conventions, you can explicitly specify target HTTP verb by decorating methods with HttpGet, HttpPut, HttpPost, or HttpDelete attribute.
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class ProductsController : ApiController
{
    [HttpGet]
    public IEnumerable&amp;lt;Product&amp;gt; AllProducts() { }
    [HttpPost]
 public Product CreateProduc(Product product) { }
    [HttpPut]
 public Product UpdateProduct(Product product) { }
    [HttpDelete]
 public void DeleteProduct(int id) { }
}
&lt;/pre&gt;&lt;h3&gt;One handler per one controller&lt;/h3&gt;&lt;p&gt;API Controller are different from ASP.NET MVC controller. The main difference is that API controller handles exactly one HTTP request belongs to particular entity.
&lt;/p&gt;&lt;p&gt;If you try to create the code like:
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class ProductsController : ApiController
{
    public IEnumerable&amp;lt;Product&amp;gt; Get() { }
    public IEnumerable&amp;lt;Product&amp;gt; GetAnother() { }
}
&lt;/pre&gt;&lt;p&gt;It would be build OK, but on a runtime if you try to access '/api/products', you will get an exception:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;"Multiple actions were found that match the request: 
\u000d\u000aSystem.Collections.Generic.IEnumerable`1[MvcApplication7.Api.Controllers.Product] 
Get() on type MvcApplication7.Api.Controllers.ProductsController\u000d\u000aSystem.Collections.Generic.IEnumerable`1[MvcApplication7.Api.Controllers.Product] 
GetAnother() on type MvcApplication7.Api.Controllers.ProductsController"
&lt;/pre&gt;&lt;p&gt;The less stuff is very similar to something we get used in ASP.NET MVC. And you might think - why do we need this Web API at all, I can do exactly the same stuff with good-n-old ASP.NET MVC controllers? Not exactly. Web API has several killer features that makes it favorite for data oriented API's. Let's go on.
&lt;/p&gt;&lt;h2&gt;Content Negotiation&lt;/h2&gt;&lt;p&gt;Content Negotiation is the process for mutual agreement between client and server about the received/sent data formats. Good news here, Web API does a lot of job for you, leaving content negotiation internals behind the scene. Let's take a brief look of how things happen.
&lt;/p&gt;&lt;p&gt;When client sends HTTP request to server, besides the query string and payload it also provides different kind information. This information is being placed into HTTP header and provides server with specific details for better understanding each other. In particular, it contains &lt;code&gt;Accept&lt;/code&gt; header field which specifies client preferences on response format. I'm going use Fiddler to check how Web API behaves on different conditions.
&lt;/p&gt;&lt;p&gt;First, let's do not specify the &lt;code&gt;Accept&lt;/code&gt; field at all. So, the payload we going to send to server from our client (Fiddler) will be like:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    GET /api/products HTTP/1.1
    User-Agent: Fiddler
    Host: localhost:5589
&lt;/pre&gt;&lt;p&gt;For that request, we will receive the response like:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: application/json; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/7.5
    X-AspNet-Version: 4.0.30319
    X-SourceFiles: =?UTF-8?B?RDpcRGV2ZWxvcG1lbnRcUHJvamVjdHNcZXhwZXJpbWVudHNcTXZjQXBwbGljYXRpb243XE12Y0FwcGxpY2F0aW9uN1xhcGlccHJvZHVjdHM=?=
    X-Powered-By: ASP.NET
    Date: Mon, 19 Mar 2012 17:31:23 GMT
    Content-Length: 88

    [{"Description":"iPad","Id":1,"Price":1000},{"Description":"iPhone","Id":2,"Price":500}]
&lt;/pre&gt;&lt;p&gt;As you can see, the default Content-Type is "application/json; charset=utf-8", there is a json string in HTTP response payload.
&lt;/p&gt;&lt;p&gt;Let's make our request a little more specific. 
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    GET /api/products HTTP/1.1
    User-Agent: Fiddler
    Host: localhost:5589
    Accept: text/xml
&lt;/pre&gt;&lt;p&gt;The corresponsing response:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    HTTP/1.1 200 OK
    Cache-Control: no-cache
    Pragma: no-cache
    Content-Type: text/xml; charset=utf-8
    Expires: -1
    Server: Microsoft-IIS/7.5
    X-AspNet-Version: 4.0.30319
    X-SourceFiles: =?UTF-8?B?RDpcRGV2ZWxvcG1lbnRcUHJvamVjdHNcZXhwZXJpbWVudHNcTXZjQXBwbGljYXRpb243XE12Y0FwcGxpY2F0aW9uN1xhcGlccHJvZHVjdHM=?=
    X-Powered-By: ASP.NET
    Date: Mon, 19 Mar 2012 17:33:34 GMT
    Content-Length: 329

    &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;utf-8&amp;quot;?&amp;gt;&amp;lt;ArrayOfProduct xmlns:xsi=&amp;quot;http://www.w3.org/2001/XMLSchema-instance&amp;quot; xmlns:xsd=&amp;quot;http://www.w3.org/2001/XMLSchema&amp;quot;&amp;gt;&amp;lt;Product&amp;gt;&amp;lt;Id&amp;gt;1&amp;lt;/Id&amp;gt;&amp;lt;Description&amp;gt;iPad&amp;lt;/Description&amp;gt;&amp;lt;Price&amp;gt;1000&amp;lt;/Price&amp;gt;&amp;lt;/Product&amp;gt;&amp;lt;Product&amp;gt;&amp;lt;Id&amp;gt;2&amp;lt;/Id&amp;gt;&amp;lt;Description&amp;gt;iPhone&amp;lt;/Description&amp;gt;&amp;lt;Price&amp;gt;500&amp;lt;/Price&amp;gt;&amp;lt;/Product&amp;gt;&amp;lt;/ArrayOfProduct&amp;gt;
&lt;/pre&gt;&lt;p&gt;As you can see, without any code changes we made it "adapt" for particular client needs. This is a very decent feature of Web API and available for use, just from the box. You even don't need to care about it at all. Leave the content negotiation for the infrastructure.
&lt;/p&gt;&lt;h2&gt;IQueryable&amp;lt;T&amp;gt; Support&lt;/h2&gt;&lt;p&gt;Next cool feature is IQueryable&amp;lt;T&amp;gt; support. If you need to, instead of returning "plain" IEnumerable objects from the API action, you might return IQueryable&amp;lt;T&amp;gt;. Why?
&lt;/p&gt;&lt;p&gt;Remember the times we implemented paging &amp; sorting with ASP.NET MVC application. It was possible of cause, but it required a lot of manual job. Actions had to be extended with additional parameters, code have to respect those parameters and return exact portion of data we require to. The same story with sorting. In Web API it much simpler.
&lt;/p&gt;&lt;p&gt;Change the signature and return type to IQueryable.
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public IQueryable&amp;lt;Product&amp;gt; Get()
{
    return _storage.AsQueryable();
}
&lt;/pre&gt;&lt;p&gt;Now, if Web API sees the method like that, it will allow to access with with Open Data Protocol (OData) query string parameters. OData provides support for following queries: $filter, $orderby, $skip, $top.
&lt;/p&gt;&lt;p&gt;Now, if I do the request:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    http://localhost:5589/api/products?$top=3
&lt;/pre&gt;&lt;p&gt;I will receive, 3 top products. Or something like,
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    http://localhost:5589/api/products?$skip=2&amp;$top=3
&lt;/pre&gt;&lt;p&gt;I will skip 2 and take rest 3. In short, having IQueryable and 4 OData query parameters it's much more easy to do the stuff required more time before.
&lt;/p&gt;&lt;h2&gt;Hosting&lt;/h2&gt;&lt;p&gt;Hosting is a feature of Web API allow to run service inside the different hosts. What does it mean?
&lt;/p&gt;&lt;p&gt;We are much get used to ASP.NET hosting as default. I saw no problem with that at all till working on one of my recent &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;projects&lt;/a&gt;. The problem is for ASP.NET pipeline you need to have a web server (IIS), but web server always have some limitations (permissions and stuff). For simple things, that does not require any IIS benefits it is easier to host application just in .exe assembly. It's now possible with Web API.
&lt;/p&gt;&lt;p&gt;We have several hosting providers out of the box: self-hosting and web-hosting. Besides of that there are already some provided by community &lt;a href="http://whereslou.com/2012/02/20/gate-adds-owin-support-for-the-new-asp-net-web-api-beta"&gt;Louis DeJardin created a host on top of OWIN&lt;/a&gt; and &lt;a href="https://github.com/pmhsfelix/WebApi.Explorations.ServiceBusRelayHost"&gt;Pedro Félix host for Azure&lt;/a&gt;.
&lt;/p&gt;&lt;p&gt;Also, there is a great article by Pedro Felix about &lt;a href="http://pfelix.wordpress.com/2012/03/05/asp-net-web-api-in-memory-hosting/"&gt;in-memory&lt;/a&gt; hosting. This is very useful type of hosting for unit testing of services. 
&lt;/p&gt;&lt;h2&gt;IoC improvements&lt;/h2&gt;&lt;p&gt;Since Web API now is inside ASP.NET MVC, it uses the same strategy of resolving types by &lt;a href="http://www.beletsky.net/2011/10/inside-aspnet-mvc-idependencyresolver.html"&gt;IDependencyResolver&lt;/a&gt;. That means that Web API classes are now supporting same IoC style as ASP.NET MVC controller classes. Being setup once you can put different dependencies inside API class constructor.
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class ProductsController : ApiController
{
 public ProductsController(IServiceProvider service, IRepository&amp;lt;Product&amp;gt; productRepository)
 {
  // .. 
 }

&lt;/pre&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;This is not everything, but very light overview of new stuff coming within ASP.NET MVC4. ASP.NET Web API is very nice addition to framework. There are already some &lt;a href="http://ayende.com/blog/155137/thoughts-after-using-asp-net-web-api-beta-in-anger-for-a-week"&gt;good&lt;/a&gt; feedback, so let's hope it will be even more improved toward release.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-2094890111776844795?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=n486vCY_MmU:UyGaxgyMKCg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=n486vCY_MmU:UyGaxgyMKCg:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=n486vCY_MmU:UyGaxgyMKCg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=n486vCY_MmU:UyGaxgyMKCg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/n486vCY_MmU" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2094890111776844795?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2094890111776844795?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/n486vCY_MmU/new-in-aspnet-mvc4-beta-web-api.html" title="New in ASP.NET MVC4 Beta: Web API" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/03/new-in-aspnet-mvc4-beta-web-api.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CE4ASHk-fyp7ImA9WhVSGE0.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-1209024082410168754</id><published>2012-03-15T11:15:00.000+02:00</published><updated>2012-03-15T11:15:49.757+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-15T11:15:49.757+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Mind" /><title>VS2011 Beta is Ready for Review</title><content type="html">&lt;p&gt;29 February (leap day and huge failure of Azure Cloud) is the day then VS2011 Beta community preview has been released. As a lot of geeks around the globe I've downloaded installation image and tried it on my computer. With VS2011 Beta we also received .NET 4.5 framework and (drums here) - ASP.NET MVC4 Beta, that I really wanted to try since first CTP is out. I would not say I spent too much time with both products, but I already have some initial opinion on that.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;VS2011 installation..&lt;/h2&gt;&lt;p&gt;Well, I had some not really good experience with beta versions of VS2010 and compatibility between two visual studios on the same machine. Situation is different with VS2011. Installation very pretty smooth, I just run it on background while was working through RDP on another machine and it installed without any interaction. Whole process took about 40 minutes.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;VS2010 and VS2011 beta could happily leave together without any interference. Moreover, you can freely work with your existing VS2010 solutions. Solutions for .NET 4, 3.5 and 2.0 are still supported in the same good way. &lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;.. and first launch&lt;/h3&gt;&lt;p&gt;VS2011 "cold" start up is a faster (about 40 seconds against 90 seconds, on my machine). The only one reason I see is VS2011 is not yet overloaded with different plugins I use in VS2010. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;First very noticeable change is of cause the design. There were many blog posts with preview of VS2011 design before the beta release. And you know, I really liked what I saw on images. I changed my opinion on first launch. Probably it's just the matter of taste or habits, but new VS design looks awful to me (especially in Dark Theme - 80's monochrome display back!). It's totally grey, with no colors in icons at all. Fonts are in METRO style (all uppercase) looks very unusual. Solution explorer contains grey icons, it's a little difficult to distinguish between project types and file types inside. So, fellow developer - get ready to order new glasses since you decide to switch to VS2011.  &lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-kD1OpPYEcJY/T2GxpBjYlQI/AAAAAAAAIB0/IApm8gGFf6k/s620/image-3.png"&gt;&lt;br /&gt;
&lt;img src="https://lh6.googleusercontent.com/-kD1OpPYEcJY/T2GxpBjYlQI/AAAAAAAAIB0/IApm8gGFf6k/s620/image-3.png" style="width: 620px" alt="vs2011 solution" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Nevertheless, I was happy to open my exiting solution, press Ctrl + Shift + B and it successfully built. The good thing is .sln file has not been transformed (except the &lt;code&gt;Format Version 11.00&lt;/code&gt; has been changed to &lt;code&gt;Format Version 12.00&lt;/code&gt;) so it's still can be opened both VS2010 and VS2011. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;It also has been imported all my VS2010 settings. It is really nice, since you don't need to spent much time setting up favorite color scheme and key bindings.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I haven't seen any noticeable performance changes. Sometimes VS2011 works a little slower as for me (please note, this is only subjective feelings, does not pretend to be absolute truth). Looks like VS2011 has much larger memory footprint.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh5.googleusercontent.com/-GvxigiUfINs/T2GxpL273FI/AAAAAAAAIBw/FjTLSQN6KUQ/s800/image-1.png"&gt;&lt;br /&gt;
&lt;img src="https://lh5.googleusercontent.com/-GvxigiUfINs/T2GxpL273FI/AAAAAAAAIBw/FjTLSQN6KUQ/s800/image-1.png" style="width: 620px" alt="vs2011 memory usage" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;And for some mystical reason it spawns second &lt;code&gt;devenv.exe&lt;/code&gt; process in a while, even if I have only one VS instance running.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-GMrPaWLfxxQ/T2GxpGYIY5I/AAAAAAAAIBs/wu29YT2sHfg/s854/image-2.png"&gt;&lt;br /&gt;
&lt;img src="https://lh6.googleusercontent.com/-GMrPaWLfxxQ/T2GxpGYIY5I/AAAAAAAAIBs/wu29YT2sHfg/s854/image-2.png" style="width: 620px" alt="vs2011 spawns process" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;h3&gt;Code editing&lt;/h3&gt;&lt;p&gt;Code editor is almost the same. No new refactoring tools, no support of 3rd parties Unit Test systems (NUnit, XUnit etc.) from the box.  Still Visual Studio requires to have ReSharper for more productive coding. My dream of using clean VS with minimum plugins installed seems not gonna come true with VS2011.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Some few nice moments I noticed for HTML/Razor/CSS editors. First of all, it updates closing HTML tag if you changed opening one (and vice versa). For CSS, it has much more better InteliSence + nice feature of picking colors.   &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I haven't noticed any significant changes to JS editor. Except the fact, that there are no 'Update JScript Intellisense' menu command, so I suppose that now it's done automatically. Still, it's very primitive and does not work all the time. For instance, I haven't managed to get any InteliSense during working with Knockout.js library, maybe I'm just doing something wrong.&lt;br /&gt;
&lt;/p&gt;&lt;h3&gt;I want my plugings&lt;/h3&gt;&lt;p&gt;So, VS2011 is generally OK, so I would prefer to use it. Hope a lot of new fixes and some feature still will be included in RC.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;What I personally lack is 2 plugins. ReSharper and NCrunch. Fortunately both appeared very fast. Remco Mulder released &lt;a href="http://www.ncrunch.net/download.htm"&gt;NCrunch 1.38b&lt;/a&gt; and JetBrains are came with &lt;a href="http://blogs.jetbrains.com/dotnet/2012/03/resharper-70-eap-visual-studio-11-beta-edition-is-nowopen/"&gt;ReSharper 7 EAP&lt;/a&gt; which is free for download and evaluation. Both plugins works really fine. Having good refactoring tools as ReSharper gives and having the power of Continuous Tests with NCrunch, makes the VS2011 ready to use IDE. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;The beta looks very promising.. and in general it works fine! Except the design, nothing really new to IDE as for me. Probably I spent to few time to feel the power, so I'll be updating if I see some cool or bad features. The most sweet things with new VS is surely updated .NET framework and MVC. I'm now trying to play with new stuff and much as I can, already checked some new nice stuff of MVC4 framework.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-1209024082410168754?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=yunWP5pKMe0:MYkPbmyceig:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=yunWP5pKMe0:MYkPbmyceig:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=yunWP5pKMe0:MYkPbmyceig:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=yunWP5pKMe0:MYkPbmyceig:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/yunWP5pKMe0" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1209024082410168754?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1209024082410168754?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/yunWP5pKMe0/vs2011-beta-is-ready-for-review.html" title="VS2011 Beta is Ready for Review" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-kD1OpPYEcJY/T2GxpBjYlQI/AAAAAAAAIB0/IApm8gGFf6k/s72-c/image-3.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/03/vs2011-beta-is-ready-for-review.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkMEQH05eip7ImA9WhVSFks.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-8709447761900453134</id><published>2012-03-13T19:40:00.000+02:00</published><updated>2012-03-13T19:40:01.322+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-13T19:40:01.322+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="E-conomic" /><category scheme="http://www.blogger.com/atom/ns#" term="Life" /><title>Second Year of E-conomic</title><content type="html">&lt;p&gt;Yeah, it's been 2 years since I joined the &lt;a href="http://www.e-conomic.com/"&gt;e-conomic&lt;/a&gt; company. As it was &lt;a href="http://www.beletsky.net/2011/03/my-first-year-in-company.html"&gt;last year&lt;/a&gt;, this year e-conomic still plays very important role in my life, so I'll spent some time to write this blog post.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Well, a lot of things changed I would say. Some people came, some people left. Teams rotating all the time, I'm no longer work with guys I used to work last year. We are doing revolutionary things there, no doubts. It doesn't mean, we are creating new search engines or inventing new type of computer. No, we are revolutionizing ourselves much.. doing the same type of products, but doing it differently.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Remember I wrote about how &lt;a href="http://www.beletsky.net/2011/12/why-new-technologies-move-your-product.html"&gt;technologies helps to move product faster&lt;/a&gt; - that was an example of radical changes in framework and tools we did to successfully deliver the product. I believe something happened last year, something that gave much pulse for changes. And that pulse still affects us. We went much further of changing for Web Forms to MVC or jQuery to Backbone.js. Recently our back-end team finished up POC of using &lt;a href="http://nodejs.org/"&gt;node.js&lt;/a&gt; + &lt;a href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; as our perspective server side technology stack. And they actually proved that it will work for us. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;From my perspective, e-conomic much improved in this year. And this is of cause happened, because people how work in e-conomic improved. Without any hesitate, I would say that currently we have the strongest team ever. Both Danish and Ukrainian parts. It's amazing how smooth the technologies change was, how fast new concepts been adopted, how motivated and hardworking guys joined together. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;We've been empowered not only by engineers, but also with our newly assembled UI/UX team. No secret, everybody want to work with beautiful things. I equally appreciate both the quality of code and quality of design. And this is want UI/UX team care about. And this is fantastic job as for me. We are changing the design quite regularly and each iteration it turns better and better. Colors, fonts, usability tricks - that's something that gives a life to modern web applications.   &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;As usually the developers see only the tip of iceberg of whole company business, but I really hope that all good stuff that's happening inside engineering department will find it's reflection in quality of service, usability and user happiness.. that at the end of the day bring the company more users and more money. Sure, the things are moved not only by developers. I would say, we are doing the easiest job. Our PO's and Stakeholders - that's where ideas are coming from. The quality of those "ideas" are directly proportional to output quality. And this quality is getting better and better each day.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;We are doing finishing strokes on new product, called &lt;a href="http://debitoor.com/"&gt;Debitoor.com&lt;/a&gt;. It's amazing application and I hope it will find it's audience very fast. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;So, I'll say goodbye to the past year and look forward for new journeys in next one.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-8709447761900453134?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9hlyjiDud-Q:LAKfqbSSHts:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9hlyjiDud-Q:LAKfqbSSHts:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=9hlyjiDud-Q:LAKfqbSSHts:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=9hlyjiDud-Q:LAKfqbSSHts:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/9hlyjiDud-Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8709447761900453134?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8709447761900453134?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/9hlyjiDud-Q/second-year-of-e-conomic.html" title="Second Year of E-conomic" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/03/second-year-of-e-conomic.html</feedburner:origLink></entry><entry gd:etag="W/&quot;Dk8DSHwyfip7ImA9WhVSEU8.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-8392933773217053473</id><published>2012-03-07T14:54:00.000+02:00</published><updated>2012-03-07T14:54:39.296+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-03-07T14:54:39.296+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Foundstyles" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="Design" /><title>Foundstyles.com - Ready to use styles based on Foundation</title><content type="html">&lt;p&gt;&lt;a href="http://foundstyles.com/"&gt;Foundstyles.com&lt;/a&gt; is a little project I've been working for last week. The idea is very simple. Remember, I blogged about &lt;a href="http://www.beletsky.net/2012/02/foundation-framework-for-web-sites.html"&gt;Foundation Framework&lt;/a&gt; that works pretty nice for me. So, I've decided to do something similar that exist for twitter bootstrap framework - &lt;a href="http://bootswatch.com/"&gt;bootswatch&lt;/a&gt; ready to pickup .css that could be easily integrated to your site. Today the site is available!&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh5.googleusercontent.com/-U17a7t15HJI/T1dZpe6E4gI/AAAAAAAAIBQ/82EugHUbFLI/s1024/image-1.png"&gt;&lt;br /&gt;
    &lt;img src="https://lh5.googleusercontent.com/-U17a7t15HJI/T1dZpe6E4gI/AAAAAAAAIBQ/82EugHUbFLI/s1024/image-1.png" alt="foundstyles.com" style="width: 620px" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Unfortunately Foundation does not support LESS from the package, so I need to move colors and layout into corresponding .LESS files, so after it's just possible to have a basic &lt;a href="https://github.com/alexanderbeletsky/foundstyles/tree/master/default"&gt;template&lt;/a&gt; which is possible to customize with own colors.  &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;As for now, I've created only 3 templates: &lt;a href="http://foundstyles.com/bladesofsteel/"&gt;Blades Of Steel&lt;/a&gt;, &lt;a href="http://foundstyles.com/evergreen/"&gt;Evergreen Tree&lt;/a&gt; and &lt;a href="http://foundstyles.com/coffeenmilk/"&gt;Coffee and Milk&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh5.googleusercontent.com/-y-jpR-k1dJ8/T1dZpkgbnDI/AAAAAAAAIBU/0GzBc1l-vWE/s1089/image-2.png"&gt;&lt;br /&gt;
    &lt;img src="https://lh5.googleusercontent.com/-y-jpR-k1dJ8/T1dZpkgbnDI/AAAAAAAAIBU/0GzBc1l-vWE/s1089/image-2.png" alt="foundstyles.com" style="width: 620px" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;I had a lot of joy making those styles. Making web designs and playing with colors is my next hobby, I think. Through, those styles are really simple ones, I'm going to add more eventually. Since the project is just hosted on &lt;a href="https://github.com/alexanderbeletsky/foundstyles"&gt;github&lt;/a&gt; you are able to push you own styles. If you feel inspired, I would be really happy for submissions.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Nearest plans are apply some fixes for IE (both site and styles) and just go ahead and produce some more. Hope it could be useful for you guys.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-8392933773217053473?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3sv3lNroq_w:1JvZT_b3oLw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3sv3lNroq_w:1JvZT_b3oLw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=3sv3lNroq_w:1JvZT_b3oLw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=3sv3lNroq_w:1JvZT_b3oLw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/3sv3lNroq_w" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8392933773217053473?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8392933773217053473?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/3sv3lNroq_w/foundstylescom-ready-to-use-styles.html" title="Foundstyles.com - Ready to use styles based on Foundation" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-U17a7t15HJI/T1dZpe6E4gI/AAAAAAAAIBQ/82EugHUbFLI/s72-c/image-1.png" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/03/foundstylescom-ready-to-use-styles.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkEESX4zeip7ImA9WhVTFUw.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-1525552586590970086</id><published>2012-02-29T12:16:00.000+02:00</published><updated>2012-02-29T12:16:48.082+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-29T12:16:48.082+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Open source" /><title>NancyFX Migration from 0.9 to 0.10</title><content type="html">&lt;p&gt;Recently, I've &lt;a href="https://github.com/Code52/Ideastrike/pull/92"&gt;upgraded&lt;/a&gt; IdeaStrike project from NancyFX 0.9 to the latest 0.10 version. There were some very unclear moments, fortunately due to great support of &lt;a href=""&gt;@thecodejunkie&lt;/a&gt; and &lt;a href=""&gt;@grumpydev&lt;/a&gt; they are solved. As a result, the &lt;a href="https://github.com/NancyFx/Nancy/issues/520"&gt;issue 520&lt;/a&gt; was born, that contains a lot of text inside. I'll try to sum up all important things into one blog post.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Running update&lt;/h2&gt;&lt;p&gt;With NuGet updating dependencies is very easy, just run in package manager console:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    PM&gt; update-package
&lt;/pre&gt;&lt;p&gt;It will give you the information about the upgrade process, it should be very smooth, so the end you will see:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;Successfully uninstalled 'Nancy.Hosting.Aspnet 0.9.0'.
Updating 'Nancy.Testing' from version '0.9.0' to '0.10.0' in project 'IdeaStrike.Tests'.
Successfully removed 'Nancy.Testing 0.9.0' from IdeaStrike.Tests.
Successfully removed 'Nancy 0.9.0' from IdeaStrike.Tests.
Successfully added 'Nancy 0.10.0' to IdeaStrike.Tests.
Successfully installed 'Nancy.Testing 0.10.0'.
Successfully added 'Nancy.Testing 0.10.0' to IdeaStrike.Tests.
Successfully uninstalled 'Nancy.Testing 0.9.0'.
The directory is not empty.

Successfully uninstalled 'Nancy 0.9.0'.
&lt;/pre&gt;&lt;h2&gt;Fixing compilation errors&lt;/h2&gt;&lt;p&gt;As you try to build the project after upgrade, it would fail because of compilation issues.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;If you using Nancy bootstrapper and overriding &lt;code&gt;RequestStratup&lt;/code&gt; method, you will see that method had changed the signature: &lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    // in 0.9
    protected override void RequestStartup(ILifetimeScope container, IPipelines pipelines);

    // in 0.10
    protected override void RequestStartup(ILifetimeScope container, IPipelines pipelines, NancyContext context)
&lt;/pre&gt;&lt;p&gt;So, it now receives additional parameter - NancyContext.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Next compilation errors is inside the &lt;code&gt;Request.Headers.AcceptLanguage&lt;/code&gt;. &lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    // in 0.9
    public IEnumerable&amp;lt;string&amp;gt; AcceptLanguage { get; }
    
    // in 0.10
    public IEnumerable&amp;lt;Tuple&amp;lt;string, decimal&amp;gt;&amp;gt; AcceptLanguage { get; }
&lt;/pre&gt;&lt;p&gt;Both of these compilation errors are really easy to fix. See changes to &lt;code&gt;src/Ideastrike.Nancy/IdeastrikeBootstrapper.cs&lt;/code&gt; in this &lt;a href="https://github.com/alexanderbeletsky/Ideastrike/commit/a2bba73869292c076639d8b87a3d9d73cd97abf8"&gt;commit&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;After that, the compilation will be fine. I had to restart my Visual Studio after, since NCrunch was failing to compile the application. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Fixing failing unit tests&lt;/h2&gt;&lt;p&gt;After VS is restarted and NCrunch able to pick up changes, I got 3 unit tests failures. All of them with the similar exception, like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    System.Exception: System.Exception : ConfigurableBootstrapper Exception
    ---- Nancy.RequestExecutionException : Oh noes!
    -------- Nancy.ViewEngines.ViewNotFoundException : Unable to locate view '404'. Currently available view engine extensions: sshtml,html,htm,cshtml,vbhtml
    at Nancy.Testing.PassThroughErrorHandler.Handle(HttpStatusCode statusCode, NancyContext context)
    at Nancy.NancyEngine.CheckErrorHandler(NancyContext context)
    at Nancy.NancyEngine.HandleRequest(Request request)
    at Nancy.Testing.Browser.HandleRequest(String method, String path, Action1 browserContext)
    at Nancy.Testing.Browser.Get(String path, Action1 browserContext)
    at IdeaStrike.Tests.IdeaStrikeSpecBase1.Get(String path, Action1 browserContext) in D:\Development\Projects\Ideastrike\tests\IdeaStrike.Tests\IdeaStrikeSpecBase.cs:line 85
&lt;/pre&gt;&lt;p&gt;That was a mystery. All of those tests were fine, but suddenly stopped to work in 0.10. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The reason was very interesting. Those tests for views were actually &lt;a href="https://github.com/NancyFx/Nancy/issues/520#issuecomment-4157010"&gt;never run&lt;/a&gt;. It's been unseen for 2 reasons: Nancy 0.9 failed silently about missing view, IdeaStrike unit tests never tested view content.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;To make those run, the &lt;code&gt;IdeaStrikeSpecBase&lt;/code&gt; have to be setup with &lt;code&gt;IRootPathProvider&lt;/code&gt;. IRootPathProvider, provides the path root for modules, so views could be located, based on default conventions. I finished up with this implementation:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public class CustomRootPathProvider : IRootPathProvider
{
    public string GetRootPath()
    {
        return Path.GetDirectoryName(typeof(IdeastrikeBootstrapper).Assembly.Location);
    }
}
&lt;/pre&gt;&lt;p&gt;This root provider is used with spec base class configuration:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public IdeaStrikeSpecBase()
{
 Bootstrapper = new ConfigurableBootstrapper(with =&amp;gt;
 {
  with.Module&amp;lt;TModule&amp;gt;();
  with.Dependencies(_Users.Object, _Ideas.Object, _Features.Object, _Activity.Object, _Settings.Object, _Images.Object);
  with.DisableAutoRegistration();
  with.NancyEngine&amp;lt;NancyEngine&amp;gt;();
  with.RootPathProvider&amp;lt;CustomRootPathProvider&amp;gt;(); // &lt;- Here
 });
}
&lt;/pre&gt;
&lt;p&gt;So, we are saying that root is the same folder as IdeaStike assembly. The problem is that location depends on actual Test runner. In case of NCrunch, it would be some deeply hidden folder in user\AppData\Local\Temp, in case of ReSharper runner it would be temp ASP.NET folder. That's a little annoying.
&lt;/p&gt;&lt;p&gt;Tests were still red, since neither NCrush nor ReSharper is copying actual views into target folder. Fortunately, I found this great &lt;a href="http://iamnotmyself.com/2012/01/03/testing-rendered-output-of-nancyfx-with-the-razor-view-engine-gotchas/"&gt;article&lt;/a&gt;, explaining NancyFX view testing gotchas. I ended up with just saying “Copy if newer” for views under test, so they are in the same folder as target binary. That's not cool, but currently I see no other option.
&lt;/p&gt;&lt;p&gt;After those changes, tests became green, so I run the application. No surprise, it failed to start.
&lt;/p&gt;&lt;h2&gt;Fixing runtime errors&lt;/h2&gt;&lt;p&gt;At the first run, I got nothing more as bunch of Razor compilation errors:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    Error Compiling Template: (51, 18) The name 'Url' does not exist in the current context)
    Error Compiling Template: (61, 33) The name 'Model' does not exist in the current context)
    Error Compiling Template: (68, 26) The name 'Model' does not exist in the current context)
    Error Compiling Template: (78, 7) The name 'Model' does not exist in the current context)
    Error Compiling Template: (83, 31) The name 'Model' does not exist in the current context)
    Error Compiling Template: (88, 14) The name 'Model' does not exist in the current context)
    Error Compiling Template: (103, 14) The name 'Model' does not exist in the current context)
    Error Compiling Template: (118, 14) The name 'Model' does not exist in the current context)
    Error Compiling Template: (132, 25) The name 'Model' does not exist in the current context)
    Error Compiling Template: (234, 19) The name 'Url' does not exist in the current context)
&lt;/pre&gt;&lt;p&gt;The proposed &lt;a href="https://github.com/NancyFx/Nancy/issues/520#issuecomment-4153006"&gt;solution&lt;/a&gt; that NancyRazorViewBase should always be specified with generic parameter.
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    // in 0.9
    @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase

    // in 0.10 
    @inherits Nancy.ViewEngines.Razor.NancyRazorViewBase&amp;lt;dynamic&amp;gt;
    &amp;ensp;
&lt;/pre&gt;&lt;p&gt;OK, that helped a little, but right after that error saying &lt;code&gt;System.Web.IHtmlString&lt;/code&gt; type is not references:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;    Error Compiling Template: (83, 1) The type 'System.Web.IHtmlString' is defined in an assembly that is not referenced. You must add a reference to assembly 'System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a'.)
&lt;/pre&gt;&lt;p&gt;NancyFX is being developed to be independent of &lt;code&gt;System.Web&lt;/code&gt;. It was not totally true for 0.9 with Razor support, but it has been fixed in 0.10. That of cause, brings some surprises. So, if your application is using Razor view engine, you need to do &lt;a href=""&gt;following&lt;/a&gt;:
&lt;/p&gt;&lt;ul&gt;    &lt;li&gt;update all usages of IHtmlString to use Nancy.ViewEngines.Razor.IHtmlString&lt;/li&gt;
    &lt;li&gt;update all usages of McvHtmlString to use Nancy.ViewEngines.Razor.NonEncodedHtmlString&lt;/li&gt;
    &lt;li&gt;let the razor engine know about system.web (in case if HttpContext is used in layout)&lt;/li&gt;
&lt;/ul&gt;&lt;pre class="brush: plain"&gt;&amp;lt;razor disableAutoIncludeModelNamespace=&amp;quot;false&amp;quot;&amp;gt;
    &amp;lt;assemblies&amp;gt;
        &amp;lt;add assembly=&amp;quot;System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a&amp;quot; /&amp;gt;
    &amp;lt;/assemblies&amp;gt;
    &amp;lt;namespaces&amp;gt;
        &amp;lt;add namespace=&amp;quot;System.Web&amp;quot; /&amp;gt;
    &amp;lt;/namespaces&amp;gt;
&amp;lt;/razor&amp;gt;
&lt;/pre&gt;&lt;h2&gt;Changing the Partial views&lt;/h2&gt;&lt;p&gt;After these steps were done, application finally started. But some page gave runtime exception:
&lt;/p&gt;&lt;pre class="brush: plain"&gt;Server Error in '/' Application.

Sequence contains no elements

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.InvalidOperationException: Sequence contains no elements
&lt;/pre&gt;&lt;p&gt;My dump analisys showed, that it works fine as soon as I removing partial views:
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;    @Html.Partial("Shared/Templates/upload.html")
    @Html.Partial("Shared/Templates/download.html")
&lt;/pre&gt;&lt;p&gt;The reason turned out to be really &lt;a href="https://github.com/NancyFx/Nancy/issues/520#issuecomment-4179548"&gt;simple&lt;/a&gt;. All templates in IdeaStrike project were using .html extension. For 0.10 it required to be .cshtml. So, renaming from .html to .cshtml made the IdeaStrike up and running again.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-1525552586590970086?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=fRaaRIAPaRk:8Mdm2ZnhoUw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=fRaaRIAPaRk:8Mdm2ZnhoUw:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=fRaaRIAPaRk:8Mdm2ZnhoUw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=fRaaRIAPaRk:8Mdm2ZnhoUw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/fRaaRIAPaRk" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1525552586590970086?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/1525552586590970086?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/fRaaRIAPaRk/nancyfx-migration-from-09-to-010.html" title="NancyFX Migration from 0.9 to 0.10" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/02/nancyfx-migration-from-09-to-010.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0MHSXY_fSp7ImA9WhVTE04.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-7453606019239937063</id><published>2012-02-27T10:30:00.000+02:00</published><updated>2012-02-27T10:30:38.845+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-27T10:30:38.845+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ELMAH.MVC" /><category scheme="http://www.blogger.com/atom/ns#" term="Continuous" /><category scheme="http://www.blogger.com/atom/ns#" term="KievAltNet" /><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><title>Speeches Hat-Trick For This Weekend</title><content type="html">&lt;p&gt;It's been great weekend. It started Friday evening with Kiev ALT.NET &lt;a href="http://blog.kievalt.net/post/17767271242/ncrunch-nancyfx-fubumvc-event"&gt;meet-up&lt;/a&gt; which been in idle for a while and everybody missed that. There was a three planned speeches: by &lt;a href="http://twitter.com/_TLK"&gt;@_TKL&lt;/a&gt; on Continuous Testing (NCrunch, MightyMoose), NancyFX framework by me and FubuMVC by &lt;a href="http://twitter.com/skalinets"&gt;@skalinets&lt;/a&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I would not say I got great experience on Nancy so far. But I'm pretty exited on frameworks features and super-dupper-happy-path. Almost all knowledge I gathered thought hacking of &lt;a href="https://github.com/alexanderbeletsky/Ideastrike"&gt;IdeaStrike&lt;/a&gt;, listening to Herding Code &lt;a href="http://herdingcode.com/?p=350"&gt;episode&lt;/a&gt; and reading &lt;a href="https://github.com/NancyFx/Nancy/wiki/Documentation"&gt;documentation&lt;/a&gt;. But anyway, I believe it turns out to be good introductory presentation.   &lt;br /&gt;
&lt;/p&gt;&lt;script src="http://speakerdeck.com/embed/4f47e42f8448db0022000bf4.js"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;Right after my Nancy talk I moved to central train station, since I was about to visit &lt;a href="http://www.ciklum.net/join/community/Ciklum-NET-Saturday-25-02/"&gt;Ciklum .NET Saturday&lt;/a&gt; in Dnepropetrovsk. .NET Saturday's is just great initiative by Ciklum company. I's free event, everybody welcome, content is usually nice. I highly recommend to follow their events. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I had two talks there. First one about "Continuous Delivery" that I did on &lt;a href="http://www.beletsky.net/2012/01/agile-base-camp-2012.html"&gt;Agile Base Camp 2012&lt;/a&gt;. Besides of the talk I also did a quick and improvised demo of &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;Candidate&lt;/a&gt; application. Even if I had some technical issues the demo went fine.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Another one is for logging and tracking unhandled exceptions in ASP.NET / ASP.NET MVC application based on ELMAH. I showed some basics features as well easiness of ELMAH integration to ASP.NET MVC with &lt;a href="http://nuget.org/packages/Elmah.MVC"&gt;ELMAH.MVC&lt;/a&gt; NuGet package. It was very light and funny talk, especially discussing Troy Hunt's &lt;a href="http://www.troyhunt.com/2012/01/aspnet-session-hijacking-with-google.html"&gt;ELMAH attack&lt;/a&gt;. &lt;br /&gt;
&lt;script src="http://speakerdeck.com/embed/4f49e9bd2270a2002200a29c.js"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;I also really much enjoyed &lt;a href="http://samarskyy.blogspot.com/"&gt;Anton Samarskyy&lt;/a&gt; talk on jQuery deffered objects and Vitaly Koval did great hacking session of WinRT.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I some of you been listening to me on those speeches and still have any questions or concerns, feel free to contact me by comments or through &lt;a href="http://twitter.com/alexbeletsky"&gt;twitter&lt;/a&gt;. See you next time!&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-7453606019239937063?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ppNp-7bKlng:x0RcFDz12Ps:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ppNp-7bKlng:x0RcFDz12Ps:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ppNp-7bKlng:x0RcFDz12Ps:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=ppNp-7bKlng:x0RcFDz12Ps:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/ppNp-7bKlng" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7453606019239937063?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/7453606019239937063?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/ppNp-7bKlng/speeches-hat-trick-for-this-weekend.html" title="Speeches Hat-Trick For This Weekend" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><feedburner:origLink>http://www.beletsky.net/2012/02/speeches-hat-trick-for-this-weekend.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0ABQ3wyfyp7ImA9WhRaGEw.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-2658070700940330598</id><published>2012-02-21T11:15:00.001+02:00</published><updated>2012-02-21T11:15:52.297+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-21T11:15:52.297+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Open source" /><category scheme="http://www.blogger.com/atom/ns#" term="CSS" /><category scheme="http://www.blogger.com/atom/ns#" term="UI" /><category scheme="http://www.blogger.com/atom/ns#" term="HTML" /><title>Foundation Framework for Web Sites Production</title><content type="html">&lt;p&gt;The &lt;a href="http://foundation.zurb.com/"&gt;Foundation&lt;/a&gt; framework is something I discovered by accident browsing through some github project pages. I really liked how one of the sites looked on my iPad. I was also pleased to see how HTML crafted, using clear names for classes and HTML5 semantics. As it turned out, that site was using Foundation Framework by &lt;a href="http://www.zurb.com/"&gt;Zurb&lt;/a&gt; - design agency in San Francisco Bay area.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I checked out the &lt;a href="http://foundation.zurb.com/docs/"&gt;documentation&lt;/a&gt; and Foundation appears to be pretty solid framework for web applications prototyping and production. It contained everything needed: &lt;a href="http://foundation.zurb.com/docs/grid.php"&gt;Grid Layouts&lt;/a&gt;, &lt;a href="http://foundation.zurb.com/docs/buttons.php"&gt;Buttons&lt;/a&gt;, &lt;a href="http://foundation.zurb.com/docs/forms.php"&gt;Forms&lt;/a&gt; and &lt;a href="http://foundation.zurb.com/docs/ui.php"&gt;UI&lt;/a&gt;. And of cause, all of that is open source hosted on github.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;During my preparation of project page for &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;candidate&lt;/a&gt; I decided to try it out. I was really happy of the experience. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Object Oriented CSS&lt;/h2&gt;&lt;p&gt;Have you heard of &lt;a href="https://github.com/stubbornella/oocss/wiki"&gt;OOCSS&lt;/a&gt;? Initially I thought that idea is almost non-sense, but I'm changing my opinion now. I think Foundation fully conforms to OOCSS style of development - each behavior or UI you want to apply to HTML element is done by applying of corresponding class. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Great thing is that you see how it's done in framework and do same in your code as well. I remember the times I started to do HTML/CSS and I higly used #id's, applying the styles by element Id. The code was awful and styles applied on #id's were not re-usable at all, so if I needed the same margin/padding or text color I have to copy the section of CSS and move it into next &lt;code&gt;#some-id { ... }&lt;/code&gt;.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;With OOCSS you rely on classed. Here some example,&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;div class=&amp;quot;container darker-grey light-border small-padding&amp;quot;&amp;gt;
 &amp;lt;div class=&amp;quot;row smaller-fonts&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;four columns&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;four columns&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
  &amp;lt;div class=&amp;quot;four columns&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;
 &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;p&gt;Look, no #id's - classes only. With classes I control: position, colors, borders and margin/paddings. This is really cool, since all of that classes are easy reusable in any part of page.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Grid system&lt;/h2&gt;&lt;p&gt;Grid systems is really cool concept and allows to develop much faster. Instead of writing own CSS that would position elements, you stick to Grid System. The classical grid system is probably &lt;a href="http://960.gs/"&gt;960.gs&lt;/a&gt;. It's really great and blown my mind as I first time tried it, but currently it little outdated: 960px wide is small for modern monitor and it is not adaptive. Modern web design demands site looks great both on PC and Mobile devices, adapt it's content based on screen size.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Here is a quote of Foundation documentation.&lt;br /&gt;
&lt;/p&gt;&lt;blockquote&gt;The grid is built around three key elements: containers, rows, and columns. Containers create base padding for the page; rows create a max-width and contain the columns; and columns create the final structure. Everything on your page that you don't give a specific structural style to should be within a container, row and column.&lt;br /&gt;
&lt;/blockquote&gt;&lt;p&gt;You develop the layout based on planned number of row and columns that compose the row. Again, code is done in OOCSS way with clean classes names, so you write almost "plain" English in HTML.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: html"&gt;&amp;lt;div class=&amp;quot;container&amp;quot;&amp;gt;
  &amp;lt;div class=&amp;quot;row&amp;quot;&amp;gt;
    &amp;lt;div class=&amp;quot;eight columns&amp;quot;&amp;gt;
      Eight columns
    &amp;lt;/div&amp;gt;
    &amp;lt;div class=&amp;quot;four columns&amp;quot;&amp;gt;
      Four columns     
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/pre&gt;&lt;p&gt;After design is ready, you just open it on iPad and.. Surprise, it looks great there! Text and columns are adaptively fits the screen size. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Buttons and Forms&lt;/h2&gt;&lt;p&gt;Buttons and Forms are same important as Colors and Fonts in your web site. You can't get good site appearance if buttons and forms are ugly. I usually spend a lot of time on "beautifying" those, but still unhappy with results at the end of the day. With Foundation it's easier. You got nice styles from the box. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Forms:&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh5.googleusercontent.com/-r0XbF8NN5Zo/T0NfEXYwg6I/AAAAAAAAH4Q/4yZ8y3OqCMM/s620/image-1.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh5.googleusercontent.com/-r0XbF8NN5Zo/T0NfEXYwg6I/AAAAAAAAH4Q/4yZ8y3OqCMM/s620/image-1.jpg" alt="foundation forms" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Buttons:&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-TNxDQv_m1Oc/T0NfGrGMXDI/AAAAAAAAH4Y/HYjq_XxDbGs/s620/image-2.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh6.googleusercontent.com/-TNxDQv_m1Oc/T0NfGrGMXDI/AAAAAAAAH4Y/HYjq_XxDbGs/s620/image-2.jpg" alt="foundation buttons" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;Recently, I've &lt;a href="https://github.com/zurb/foundation/pull/313"&gt;submitted&lt;/a&gt; green button style, so I hope it will be available soon.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;UI stuff&lt;/h2&gt;&lt;p&gt;Besides those primary things you got nice bonus. That's different UI elements commonly used through different web sites. It includes: Alerts, Labels, Warnings, Tooltips, Tabs etc. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;For &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;candidate&lt;/a&gt; site I successfully used Pagination UI element. &lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh3.googleusercontent.com/-_5240sOGkko/T0NfHuydwUI/AAAAAAAAH4g/jE3ft2nAAeM/s620/image-3.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh3.googleusercontent.com/-_5240sOGkko/T0NfHuydwUI/AAAAAAAAH4g/jE3ft2nAAeM/s620/image-3.jpg" alt="foundation ui" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;Currently &lt;a href="http://twitter.github.com/bootstrap"&gt;Bootstrap&lt;/a&gt; from Twitter is obvious leader in that niche. But I really think Foundation will get it's place. Easy to use, great documentation &lt;a href="https://github.com/zurb/foundation"&gt;repository&lt;/a&gt; is very active, so we might expected further great features in Foundation.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;And by the way.. To payback Foundation, I got idea for small product: inspired by &lt;a href="http://bootswatch.com/"&gt;Bootswatch&lt;/a&gt; I'm about to create bunch of "ready-to-use" Foundation themes, that you just download and start to use immediately. It will work great for people who are about to create one page product presentation or simple blog. Hope it will go fine and I release it soon.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-2658070700940330598?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=8Gm_UHMpDUI:tYJ0Mip8jWo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=8Gm_UHMpDUI:tYJ0Mip8jWo:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=8Gm_UHMpDUI:tYJ0Mip8jWo:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=8Gm_UHMpDUI:tYJ0Mip8jWo:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/8Gm_UHMpDUI" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2658070700940330598?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2658070700940330598?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/8Gm_UHMpDUI/foundation-framework-for-web-sites.html" title="Foundation Framework for Web Sites Production" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-r0XbF8NN5Zo/T0NfEXYwg6I/AAAAAAAAH4Q/4yZ8y3OqCMM/s72-c/image-1.jpg" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/02/foundation-framework-for-web-sites.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DU8CQXo-fCp7ImA9WhRaEUQ.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-9068944886551298648</id><published>2012-02-14T07:37:00.000+02:00</published><updated>2012-02-14T07:37:40.454+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-14T07:37:40.454+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Continuous" /><category scheme="http://www.blogger.com/atom/ns#" term="Candidate" /><category scheme="http://www.blogger.com/atom/ns#" term="Open source" /><title>Candidate v.0.0.1rc - Released</title><content type="html">&lt;p&gt;  You may notice that I stick to original project name at the end of the day, even thought I wish to change it. That happened for 2 reasons: first, I really get used to candidate and it's good enough project name.. second, I spent some hours of brainstorming but found out nothing better that existing.&lt;br /&gt;
 &lt;/p&gt; &lt;p&gt;  This weekend I also finally concluded project web site and hosted it as github pages - &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;http://alexanderbeletsky.github.com/candidate/&lt;/a&gt;. So, ladies and gentlemen - please welcome, &lt;a href="https://github.com/downloads/alexanderbeletsky/candidate/candidate-v.0.0.1rc.zip"&gt;Candidate v0.0.1rc&lt;/a&gt; is ready to be shown to the world. &lt;br /&gt;
 &lt;/p&gt; &lt;a href="http://alexanderbeletsky.github.com/candidate/"&gt;&lt;br /&gt;
  &lt;img src="https://lh5.googleusercontent.com/-WIUMqyz3naI/TznyBp-dQbI/AAAAAAAAH4A/exqlfJUQr8o/s1024/screenshot-1.jpg" alt="candidate web site" style="width: 620px;" /&gt;&lt;br /&gt;
 &lt;/a&gt;&lt;br /&gt;
 &lt;h2&gt;  What's the goal?&lt;br /&gt;
 &lt;/h2&gt; &lt;p&gt;  Thinking about nearest "competitors" in this area I would re-call &lt;a href="http://www.paulstovell.com/octopus/intro"&gt;Octopus&lt;/a&gt; by &lt;a href="https://twitter.com/#!/paulstovell"&gt;Paul Stovell&lt;/a&gt;. Octopus uses Build Server / Tentacle (Agent) architecture principal, while Candidate is simple Agent architecture - you host it the same machine as your environment is (stage, production) providing both integration and deployment functionality.&lt;br /&gt;
 &lt;/p&gt; &lt;p&gt;  My goal is stabilize and improve Candidate through this year, so it fulfill different requirements including performance and scalability. I switched all my projects to use Candidate now, so it would give me some initial feedback.&lt;br /&gt;
 &lt;/p&gt; &lt;p&gt;  Nevertheless, Candidate may turn out to be a powerful deployment application I'm still thinking about "Deployement as Service" product like &lt;a href="https://appharbor.com/"&gt;AppHabor&lt;/a&gt; and &lt;a href="http://www.heroku.com/"&gt;Heroku&lt;/a&gt; or &lt;a href="http://travis-ci.org/"&gt;Travis-CI&lt;/a&gt; as it was &lt;a href=
  "http://www.beletsky.net/2011/06/candidatenet-application-i-made-on.html"&gt;original&lt;/a&gt; idea.&lt;br /&gt;
 &lt;/p&gt; &lt;h2&gt;  What's next?&lt;br /&gt;
 &lt;/h2&gt; &lt;p&gt;  Following the principle "Build product X to learn technology Y" I'm going to proceed with Candidate to shape following areas that I wish to improve now:&lt;br /&gt;
 &lt;/p&gt; &lt;ul&gt;  &lt;li&gt;Processes, threads, synchronization in .NET&lt;/li&gt;
  &lt;li&gt;Async, Tasks library&lt;/li&gt;
  &lt;li&gt;Robust applications architecture&lt;/li&gt;
  &lt;li&gt;Different deployment scenarios for .NET platform&lt;/li&gt;
 &lt;/ul&gt; &lt;p&gt;  Technological stack is still ASP.NET MVC3 / C#/ jQuery. Currently application requires to be hosted on IIS, with application pool Process Identity equals to Admin. This does not suite all users. So, I'm looking forward to create self-hosted version using &lt;a href="https://github.com/NancyFx/Nancy"&gt;NancyFX&lt;/a&gt;. &lt;br /&gt;
 &lt;/p&gt; &lt;p&gt;  I also try to target UI / UX issues as much as possible.&lt;br /&gt;
 &lt;/p&gt; &lt;h2&gt;Wanna join?&lt;/h2&gt; &lt;p&gt;  I would be happy to. I'll much encourage you to download application, install it, perform simple testing (scenario could be found &lt;a href="https://github.com/alexanderbeletsky/candidate/wiki/Quick-start-instructions"&gt;here&lt;/a&gt;). Let me know what you think, that would be great initial contribution. As for any github hosted project, you are absolutely free to fork, hack it out and send pull request.&lt;br /&gt;
 &lt;/p&gt; &lt;p&gt;  Thanks for you help.&lt;br /&gt;
 &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-9068944886551298648?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=DrtxY95HrhM:yJYmGXS3oig:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=DrtxY95HrhM:yJYmGXS3oig:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=DrtxY95HrhM:yJYmGXS3oig:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=DrtxY95HrhM:yJYmGXS3oig:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/DrtxY95HrhM" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9068944886551298648?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/9068944886551298648?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/DrtxY95HrhM/candidate-v001rc-released.html" title="Candidate v.0.0.1rc - Released" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh5.googleusercontent.com/-WIUMqyz3naI/TznyBp-dQbI/AAAAAAAAH4A/exqlfJUQr8o/s72-c/screenshot-1.jpg" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/02/candidate-v001rc-released.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0EHQH48fip7ImA9WhRbGEw.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-8102180680633602498</id><published>2012-02-09T20:20:00.000+02:00</published><updated>2012-02-09T20:20:31.076+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-09T20:20:31.076+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Applications" /><category scheme="http://www.blogger.com/atom/ns#" term="GitHub" /><category scheme="http://www.blogger.com/atom/ns#" term="Open source" /><title>Few Things I Learned From IdeaStrike Project</title><content type="html">&lt;p&gt;First of all, I have to say &lt;a href=""&gt;Code52&lt;/a&gt; team is doing just amazing job. It's very original initiative, cool ideas and highly productive team. Each time they announce next thing to build I have "product envy" inside me. Check out their &lt;a href=""&gt;blog&lt;/a&gt; or &lt;a href=""&gt;github&lt;/a&gt; account to be updated.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;My attention this time was attracted by &lt;a href=""&gt;IdeaStrike&lt;/a&gt; project. It suppose to be analog of &lt;a href=""&gt;uservoice&lt;/a&gt; for OS community. As always, first release was very fast and I was very curious what's inside. So, I cloned the &lt;a href="https://github.com/Code52/Ideastrike"&gt;repo&lt;/a&gt; and did small hacker session. I've spend some hours with it and would like to share some initial thoughts.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Build script is small and clean&lt;/h2&gt;&lt;p&gt;Project contains &lt;code&gt;build.cmd&lt;/code&gt; as I run it downloaded all dependencies by NuGet, build web site and run all unit test. Basically, all you need for any small project. Then I looked inside, it turns out like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: plain"&gt;@echo Off
set config=%1
if "%config%" == "" (
   set config=Debug
)

%WINDIR%\Microsoft.NET\Framework\v4.0.30319\msbuild build.proj /p:Configuration="%config%" /t:AppHarbor /m /v:M /fl /flp:LogFile=msbuild.log;Verbosity=Normal /nr:false
&lt;/pre&gt;&lt;p&gt;At the time I first looked in it also contained small script for running tests, but later they moved that to .csproj as separate target. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Use NuGet without committing to SCM&lt;/h2&gt;&lt;p&gt;I was amazed, how fast git repository was cloned and as I checked out &lt;code&gt;packages&lt;/code&gt; folder with all dependencies were just empty. How can it be? As I said in #1 as I run build script they just automatically downloaded for me. As it turns out, this is feature of NuGet that allows to work with dependencies, without real necessity of committing those to SCM. This is very cool, especially if you have big project, so cloning and branching appears to be prolonged operations. The implementation details is on &lt;a href="http://docs.nuget.org/docs/workflows/using-nuget-without-committing-packages"&gt;nuget&lt;/a&gt; site.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Deploy application DB at first launch&lt;/h2&gt;&lt;p&gt;IdeaStrike is based on &lt;a href="http://blogs.msdn.com/b/adonet/archive/2012/01/12/ef-4-3-beta-1-released.aspx"&gt;EF 4.3 Beta 1&lt;/a&gt; currently, using Code First approach. EF Code First also includes very cool feature called Migrations. This is something I really lack first time I tried EF Code First approach. You define the  &lt;a href="https://github.com/alexanderbeletsky/Ideastrike/blob/master/src/Ideastrike.Nancy/Models/IdeastrikeContext.cs"&gt;Context&lt;/a&gt;, &lt;a href="https://github.com/alexanderbeletsky/Ideastrike/blob/master/src/Ideastrike.Nancy/Migrations/IdeastrikeDbConfiguration.cs"&gt;DbConfiguration&lt;/a&gt; class and &lt;a href="https://github.com/alexanderbeletsky/Ideastrike/tree/master/src/Ideastrike.Nancy/Migrations"&gt;migration scripts&lt;/a&gt; (that's also, just a C# code), so at application bootstrap you call the code like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;private static void DoMigrations()
{
    var settings = new IdeastrikeDbConfiguration();
    var migrator = new DbMigrator(settings);
    migrator.Update();
}
&lt;/pre&gt;&lt;p&gt;The database and schema will be automatically deployed on first application run.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Social login with Janrain&lt;/h2&gt;&lt;p&gt;As I clicked to Sign In button, I've been showed nice dialog to select my existing social account to login. &lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh6.googleusercontent.com/-eJTIkFUrCtA/TzQNiXlAayI/AAAAAAAAH34/gFt_Gn8vAME/s620/image-1.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh6.googleusercontent.com/-eJTIkFUrCtA/TzQNiXlAayI/AAAAAAAAH34/gFt_Gn8vAME/s620/image-1.jpg" alt="social login" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;&lt;a href="http://www.janrain.com/products/engage/engage-introduction?utm_source=login.janrain.com&amp;utm_medium=partner&amp;utm_campaign=attribution"&gt;JanRain&lt;/a&gt; is very cool solution. I remember I tried to investigate something like that for ASP.NET MVC and was really disappointed, because I actually found nothing. For all of existing solutions you have to read OAuth spec and write own code. JanRain does all dirty job for you. As user authorized you receive POST on given URL, with a special token. By given token you request the details about the user, like name and email and so on (see &lt;a href="https://github.com/alexanderbeletsky/Ideastrike/blob/master/src/Ideastrike.Nancy/Modules/LoginModule.cs"&gt;LoginModule.cs&lt;/a&gt;). It has fair &lt;a href="http://www.janrain.com/products/engage/pricing"&gt;plans&lt;/a&gt; for hobby projects and bloggers.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Bootstrap your CSS and HTML&lt;/h2&gt;&lt;p&gt;&lt;a href="http://twitter.github.com/bootstrap/"&gt;Bootstrap&lt;/a&gt; neither new nor very unique, at least I know several good CSS/HTML frameworks. But IdeaStrike proved one more time - it has no sense to invent the wheel. Take advantage of results produced by people who are smarter than you, that's the rule of pragmatic programmer.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt; Dear future me, please never ever again start your application with HTML/CSS from scratch, you can build nothing more as shit. Bootstrap is great for different kind of projects and prototypes. Taking into account number of watches and forks on &lt;a href="https://github.com/twitter/bootstrap/"&gt;github&lt;/a&gt; I expect even more improvements and features in future. &lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Nancy as web framework&lt;/h2&gt;&lt;p&gt;I've heard about Nancy many times, but it's only now I got a change to touch it. For me it's just alternative reality comparing to ASP.NET MVC. It is not hard to understand what the code does. It is not hard to apply changes there. You are very explicit of what you are doing, by specifying HTTP verb, route and action as lambda. First class citizen in Nancy is Module, all module's logic is placed inside the constructor:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;public FeatureModule(IIdeaRepository ideas, IFeatureRepository features, IUserRepository users)
    : base("/idea")
{
    _ideas = ideas;
    _features = features;

    this.RequiresAuthentication();

    Post["/{idea}/feature"] = _ =&gt;
    {
        int id = _.Idea;
        var feature = new Feature
                        {
                            Time = DateTime.UtcNow,
                            Text = Request.Form.feature,
                            User = Context.GetCurrentUser(users)
                        };
        _features.Add(id, feature);

        return Response.AsRedirect(string.Format("/idea/{0}#{1}", id, feature.Id));
    };
}
&lt;/pre&gt;&lt;p&gt;Nancy application could be hosted as ASP.NET / WCF / Self hosted runtimes, it supports different View Engines (including Razor). In short, it is great ALT.NET tool and will find a lot of applications in different projects. More details on &lt;a href="https://github.com/NancyFx/Nancy"&gt;Nancy&lt;/a&gt; github account.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;IdeaStrike is great example of open source project you can learn something from. I would not say I got only positive impressions, moreover there are some obstacles that block me from my normal development flow. I'll try to share my observations on next blog posts.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;NancyFX, probably be my next web framework to learn, since I need to move out of ASP.NET MVC which is comfortable zone for me now. I'll be keep looking for IdeaStrike and hope to do some pull requests as well.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-8102180680633602498?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ceOdTiB-f2Q:7_drDDsTE8U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ceOdTiB-f2Q:7_drDDsTE8U:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=ceOdTiB-f2Q:7_drDDsTE8U:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=ceOdTiB-f2Q:7_drDDsTE8U:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/ceOdTiB-f2Q" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8102180680633602498?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/8102180680633602498?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/ceOdTiB-f2Q/few-things-i-learned-from-ideastrike.html" title="Few Things I Learned From IdeaStrike Project" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh6.googleusercontent.com/-eJTIkFUrCtA/TzQNiXlAayI/AAAAAAAAH34/gFt_Gn8vAME/s72-c/image-1.jpg" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/02/few-things-i-learned-from-ideastrike.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkUMSXwyeip7ImA9WhRbFUg.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-6050812006309126471</id><published>2012-02-02T11:36:00.000+02:00</published><updated>2012-02-06T19:44:48.292+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-02-06T19:44:48.292+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Tools" /><category scheme="http://www.blogger.com/atom/ns#" term="Mocks" /><category scheme="http://www.blogger.com/atom/ns#" term="Clean Code" /><category scheme="http://www.blogger.com/atom/ns#" term="TDD" /><title>New Tools in My TDD Arsenal</title><content type="html">&lt;p&gt;Recently my TDD arsenal has been enhanced with 3 new cool tools, which I'm about to share with you. More precisely it one tool and two frameworks. Let's go for it.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;NCrunch&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.ncrunch.net/"&gt;NCrunch&lt;/a&gt; is just amazing extension for Visual Studio created by &lt;a href="https://twitter.com/#!/remcomulder"&gt;@remcomulder&lt;/a&gt;. It automatically detects all your tests and re-running those as soon as source code changes happen. Forget about manual test re-running, it's just waste of time. You even do not need to press Ctrl + S, just continue coding as you usually do. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Initially I had big doubts about such kind of tools, but NCrunch changed my mind. It supports major unit test frameworks NUnit, XUnit, MSpec etc. Besides of that it allows to collect code coverage metrics (and show it just in VS editor), run tests under debugger, supports multi-core systems etc.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;In short, NCruch is something that makes your TDD very smooth, allowing to focusing on important things and forgot about some routine.&lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh3.googleusercontent.com/-SG_xDY5wvDo/TypXmx-VFGI/AAAAAAAAH3o/S46jODLRr5Q/s620/image-1.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh3.googleusercontent.com/-SG_xDY5wvDo/TypXmx-VFGI/AAAAAAAAH3o/S46jODLRr5Q/s620/image-1.jpg" alt="ncrunch" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;h2&gt;NSubstitute&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;I stick to &lt;a href="http://code.google.com/p/moq/"&gt;Moq&lt;/a&gt; for quite awhile and saw no reason to switch it.. Till I saw &lt;a href="http://nsubstitute.github.com/"&gt;NSubsitute&lt;/a&gt;. I hardly could imagine someone who staring "yet another mocking framework project", it looks like absolute non-sense.. But &lt;a href="https://github.com/nsubstitute"&gt;those&lt;/a&gt; guys proves me wrong.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Well, what's so new there? First of all it have very clean API. No more &lt;code&gt;new Mock()&lt;/code&gt; or &lt;code&gt;MockGenerator.GenerateMock()&lt;/code&gt;, creation of test doubles are nothing more as &lt;code&gt;Substitute.For&amp;lt;IEntityToMock&amp;gt;()&lt;/code&gt;. Mocking properties, multiple return values, events etc. in very easy fashion. Check out their &lt;a href="http://nsubstitute.github.com/help/getting-started/"&gt;getting started&lt;/a&gt; materials for further info. &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;Best feature as for me, that by using extension methods they got rid of lambdas for setting up mocks. It makes test code more readable and clean. See this small &lt;a href="https://gist.github.com/1722396"&gt;gist&lt;/a&gt; there I placed just some Moq and NSubstitue tests together.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I would not say that Rhino or Moq is now much worse that NSubstitute.. No, I would just say NSubstitute is a little better. Even same functionality, with less amount of code is already big argument for me.&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;[Test]
public void should_send_an_email_if_users_signs_up_nsub()
{ 
 // arrange
 var emailService = Substitute.For&amp;lt;IEMailService&amp;gt;();
 var controller = new LoginController(emailService);

 // act
 controller.SignUp(new SignUpModel { Email = &amp;quot;a@a.com&amp;quot;, Password = &amp;quot;xxx&amp;quot; });

 // assert
 emailService.Received().SendEmail(Arg.Any&amp;lt;EmailMessage&amp;gt;(), &amp;quot;current&amp;quot;);
}
&lt;/pre&gt;&lt;h2&gt;FluentAssertions&lt;br /&gt;
&lt;/h2&gt;&lt;p&gt;Again, for years I followed classic NUnit's &lt;code&gt;Assert.That()&lt;/code&gt; method. I also played a bit with &lt;a href="http://sharptestex.codeplex.com/"&gt;SharpTestsEx&lt;/a&gt;, but FluentAssertions by &lt;a href="https://twitter.com/#!/ddoomen"&gt;@ddoomen&lt;/a&gt; is going to change that.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;FluentAssertions are based on extension methods and allows you to get rid of Assert.That call and just wrote your assertion directly to object. Here some example: &lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;{
    // NUnit.Assert style..
    Assert.That(result, Is.EqualTo(3));

    // FluentAssert style..
    result.Should().Be(3);
}
&lt;/pre&gt;&lt;p&gt;This is very simple example. The power of FluentAssertions arise then you need to have either multiple assertions or assertions on complex objects. Multiple assertion could be combined by &lt;code&gt;And&lt;/code&gt;, like:&lt;br /&gt;
&lt;/p&gt;&lt;pre class="brush: csharp"&gt;{
    "somestring".Should().Contain("some").And.HaveLength(10);
}
&lt;/pre&gt;&lt;p&gt;It also provides great support for working with Collections, DateTimes, Guids, Exceptions, XML etc. Project is hosted on codeplex, here is &lt;a href="http://fluentassertions.codeplex.com/documentation"&gt;documentation&lt;/a&gt;. Easy start, easy go.&lt;br /&gt;
&lt;/p&gt;&lt;h2&gt;Conclusions&lt;/h2&gt;&lt;p&gt;Now, I'm sharpening my axe on those tools and have very nice impressions so far. Special thanks goes to &lt;a href="https://twitter.com/#!/skalinets"&gt;@skalinets&lt;/a&gt; who introduced me with those tools.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-6050812006309126471?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=7Mti79Nqfpg:MTpkx0t3KnY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=7Mti79Nqfpg:MTpkx0t3KnY:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=7Mti79Nqfpg:MTpkx0t3KnY:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=7Mti79Nqfpg:MTpkx0t3KnY:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/7Mti79Nqfpg" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/6050812006309126471?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/6050812006309126471?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/7Mti79Nqfpg/new-tools-in-my-tdd-arsenal.html" title="New Tools in My TDD Arsenal" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-SG_xDY5wvDo/TypXmx-VFGI/AAAAAAAAH3o/S46jODLRr5Q/s72-c/image-1.jpg" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/02/new-tools-in-my-tdd-arsenal.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0ENQ3g6eSp7ImA9WhRUGUk.&quot;"><id>tag:blogger.com,1999:blog-3980660135707078299.post-2703396961247537333</id><published>2012-01-30T20:54:00.000+02:00</published><updated>2012-01-30T20:54:52.611+02:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2012-01-30T20:54:52.611+02:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="Continuous" /><category scheme="http://www.blogger.com/atom/ns#" term="Conference" /><title>Agile Base Camp 2012</title><content type="html">&lt;p&gt;Past Saturday I was a part of big Ukrainian event &lt;a href="http://agilebasecamp.org/"&gt;Agile Base Camp: From Idea to Product&lt;/a&gt;. It's been organized by &lt;a href="http://www.scrumguides.com/"&gt;ScrumGuides&lt;/a&gt;, pioneers on Agile in Ukraine and organizers of famous &lt;a href="http://www.beletsky.net/search/label/Agile"&gt;Agilee&lt;/a&gt; series of conferences.&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;The conference named "From Idea to Product" and focused on product development issues. There was 3 stages there: Main, XP, UX. Main is for more or less common topics as budgeting, motivation etc.. XP is practical stage for developers and UX for user experience engineers. The program of conference was really interesting, but I spend all my day on XP stage (no surprise).&lt;br /&gt;
&lt;/p&gt;&lt;p&gt;There were great speeches by &lt;a href="http://twitter.com/dmytromindra"&gt;Dmytro Mindra&lt;/a&gt;, &lt;a href="http://twitter.com/skaninets"&gt;Sergey Kalinets&lt;/a&gt;. Probably most valuable for me were ones by &lt;a href="http://twitter.com/vitaliystakhov"&gt;Vitaliy Stakhov&lt;/a&gt; and &lt;a href="http://twitter.com/_TLK"&gt;Anatoly Kolesnik&lt;/a&gt;, Vitaliy shared Hypermedia concepts of RESTfull systems and that looks very promising. Anatoly did great NoSQL introduction that is very actual at the moment. I also enjoyed &lt;a href="https://twitter.com/defimenko"&gt;Dmitry Efimenko&lt;/a&gt; speech about testing in product company. He did it in quite tough style, so crowd was a little shocked and kept silence till the last words. I got some interesting points for myself.     &lt;br /&gt;
&lt;/p&gt;&lt;p&gt;I did a talk about - Continues Delivery / Deployment / Production. This practical field is very interesting to me not only because I'm trying to &lt;a href="http://www.beletsky.net/2012/01/pre-announce-of-release-candidate.html"&gt;build a product&lt;/a&gt; for that and I want to adapt for all project I work to.   &lt;br /&gt;
&lt;/p&gt;&lt;a href="https://lh3.googleusercontent.com/-pNWAtW5oWu8/TybgzFR4zWI/AAAAAAAAH3g/HxLkTCyvV1A/s720/395323_283771048348762_248481618544372_777581_1168321183_n.jpg"&gt;&lt;br /&gt;
&lt;img src="https://lh3.googleusercontent.com/-pNWAtW5oWu8/TybgzFR4zWI/AAAAAAAAH3g/HxLkTCyvV1A/s620/395323_283771048348762_248481618544372_777581_1168321183_n.jpg" alt="alexander beletsky" /&gt;&lt;br /&gt;
&lt;/a&gt;&lt;br /&gt;
&lt;p&gt;I've got very nice feedback and questions after my speech, totally collected 15 donuts (a special cards that listeners give to speaker if they like the speech), so I was quite happy about. If you interested, here is my &lt;a href="http://speakerdeck.com/u/alexanderbeletsky/p/when"&gt;slides&lt;/a&gt; on speaker deck.&lt;br /&gt;
&lt;/p&gt;&lt;script src="http://speakerdeck.com/embed/4f225b72a0a84d001f019c7b.js" type="text/javascript"&gt;&lt;/script&gt;&lt;br /&gt;
&lt;p&gt;I really much enjoyed after party and evening we spent in Work'N'Roll, the co-working office of &lt;a href="http://www.scrumguides.com/"&gt;ScrumGuides&lt;/a&gt;. Appreciate organizers for that job and wish you good luck of all next events.&lt;br /&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3980660135707078299-2703396961247537333?l=www.beletsky.net' alt='' /&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=L_6sZ0Isvu8:svMdvxn031A:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=L_6sZ0Isvu8:svMdvxn031A:63t7Ie-LG7Y"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?d=63t7Ie-LG7Y" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/abeletskyblog?a=L_6sZ0Isvu8:svMdvxn031A:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/abeletskyblog?i=L_6sZ0Isvu8:svMdvxn031A:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/abeletskyblog/~4/L_6sZ0Isvu8" height="1" width="1"/&gt;</content><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2703396961247537333?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/3980660135707078299/posts/default/2703396961247537333?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/abeletskyblog/~3/L_6sZ0Isvu8/agile-base-camp-2012.html" title="Agile Base Camp 2012" /><author><name>Alexander Beletsky</name><uri>https://profiles.google.com/104123427697898813533</uri><email>noreply@blogger.com</email><gd:image rel="http://schemas.google.com/g/2005#thumbnail" width="32" height="32" src="//lh5.googleusercontent.com/-WqHPxmC8QfM/AAAAAAAAAAI/AAAAAAAAHi4/tX9CTF-Dzy8/s512-c/photo.jpg" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://lh3.googleusercontent.com/-pNWAtW5oWu8/TybgzFR4zWI/AAAAAAAAH3g/HxLkTCyvV1A/s72-c/395323_283771048348762_248481618544372_777581_1168321183_n.jpg" height="72" width="72" /><feedburner:origLink>http://www.beletsky.net/2012/01/agile-base-camp-2012.html</feedburner:origLink></entry></feed>

