<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20117988</id><updated>2026-03-21T16:33:41.918+05:30</updated><category term="Azure"/><category term="angular"/><category term="angularjs"/><category term="ASP.Net"/><category term="Architecture"/><category term="IronFoundry"/><category term="MVC"/><category term="webapi"/><category term=".Net"/><category term="Appharbor"/><category term="Cloud"/><category term="Cloud Computing"/><category term="PaaS"/><category term="REST"/><category term="Error"/><category term="Exception"/><category term="Google Talk"/><category term="HTTP"/><category term="Iron Foundry"/><category term="Namespace"/><category term="Nerddinner"/><category term="Silverlight"/><category term="Visual Studio"/><category term="WCF"/><category term="XML"/><category term="XMPP"/><category term="c#"/><category term="deployment"/><category term="directives"/><category term="javascript"/><category term="notifications"/><category term="API"/><category term="Acrobat"/><category term="ActiveX"/><category term="Agile"/><category term="Algorithm"/><category term="Architect"/><category term="Azure Automated Deployment Errors"/><category term="Billing"/><category term="Blob"/><category term="Build"/><category term="Build Action"/><category term="CQRS"/><category term="Cache"/><category term="Cloud Foundry"/><category term="Converter"/><category term="Data Structures."/><category term="Databinding"/><category term="Debugging"/><category term="DefaultServiceVersion"/><category term="Developer"/><category term="Distributed Applications"/><category term="ELMAH"/><category term="Encode"/><category term="Escape"/><category term="File Type"/><category term="GET"/><category term="GIT"/><category term="Google;Software Development;GDD"/><category term="Gtalk"/><category term="HTTP Range"/><category term="HttpUtility"/><category term="IIS"/><category term="IT"/><category term="Icon"/><category term="Image"/><category term="Installer"/><category term="Integration"/><category term="Isolated Storage"/><category term="Longest Increasing Sequence"/><category term="Nuget"/><category term="PDF"/><category term="POST"/><category term="Patience Sort"/><category term="ProjectLocker"/><category term="Registry"/><category term="Remote Login"/><category term="Repository"/><category term="SVN"/><category term="VMC"/><category term="Video"/><category term="WPF"/><category term="Web Services"/><category term="Windows Phone"/><category term="alias"/><category term="autofac"/><category term="book"/><category term="checklist"/><category term="data modeling"/><category term="database"/><category term="document database"/><category term="html"/><category term="internet"/><category term="interview"/><category term="job"/><category term="mongodb"/><category term="nosql"/><category term="software"/><category term="url rewrite"/><category term="validation"/><category term="x64"/><title type='text'>Random Thoughts</title><subtitle type='html'>My experiments with technology !</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default?redirect=false'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default?start-index=26&amp;max-results=25&amp;redirect=false'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>46</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20117988.post-2131097279348433647</id><published>2015-04-01T09:49:00.000+05:30</published><updated>2015-04-01T09:51:46.694+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="book"/><title type='text'>AngularJS by Example - My new book on AngularJS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
For some time now i have been blogging on &lt;a href=&quot;http://blog.technovert.com/author/chander/&quot; target=&quot;_blank&quot;&gt;my corporate blog&lt;/a&gt; instead of my personal one. But this is something that i should share on my personal blog too as it is big :)&lt;br /&gt;
&lt;br /&gt;
I have a book out there &quot;&lt;i&gt;AngularJS by Example&lt;/i&gt;&quot;! Published by Packt this book targets beginners to intermediate audience.&lt;br /&gt;
&lt;br /&gt;
Head over to my blog post &lt;a href=&quot;http://blog.technovert.com/2015/03/angularjs-by-example/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; to learn more about the book.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
You can also checkout and buy the book on &lt;a href=&quot;https://www.packtpub.com/web-development/angularjs-example&quot; target=&quot;_blank&quot;&gt;Packt website&lt;/a&gt;. &lt;br /&gt;
&lt;br /&gt;
Happy reading!&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/2131097279348433647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/2131097279348433647' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2131097279348433647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2131097279348433647'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2015/04/angularjs-by-example-my-new-book-on.html' title='AngularJS by Example - My new book on AngularJS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total><georss:featurename>Hyderabad, Telangana, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>16.9002155 77.841224 17.8698725 79.132118</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1805581877753928591</id><published>2014-03-10T09:31:00.003+05:30</published><updated>2014-03-10T09:31:53.558+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="directives"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><category scheme="http://www.blogger.com/atom/ns#" term="validation"/><title type='text'>AngularJS validation directives library</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I wrote a set of directives that make validation in AngularJS a tad simpler.&lt;br /&gt;
&lt;br /&gt;
The directives are available at&lt;br /&gt;
&lt;a href=&quot;https://www.blogger.com/goog_898328946&quot;&gt;&lt;br /&gt;&lt;/a&gt;
&lt;a href=&quot;https://github.com/technovert/angular-validation&quot;&gt;https://github.com/technovert/angular-validation&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
I have detailed about the directives on my &lt;a href=&quot;http://www.technovert.com/&quot; target=&quot;_blank&quot;&gt;company website&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;https://www.blogger.com/goog_898328948&quot;&gt;&lt;br /&gt;&lt;/a&gt;
&lt;a href=&quot;http://blog.technovert.com/2014/03/angularjs-form-validation-library-directives/&quot;&gt;http://blog.technovert.com/2014/03/angularjs-form-validation-library-directives/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
and there is also a jsfiddle to play with&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://jsfiddle.net/3vxgy/1/&quot;&gt;http://jsfiddle.net/3vxgy/1/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
or&lt;br /&gt;
&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot; height=&quot;300&quot; src=&quot;http://jsfiddle.net/3vxgy/1/embedded/&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1805581877753928591/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1805581877753928591' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1805581877753928591'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1805581877753928591'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2014/03/angularjs-validation-directives-library.html' title='AngularJS validation directives library'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-4894725646515194018</id><published>2014-02-12T11:40:00.001+05:30</published><updated>2014-02-12T11:40:20.209+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><title type='text'>Common Pitfalls using AngularJS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I recently blogged about some common pitfalls using AngularJS on my companies blog. Anyone interested in the details should visit my post at.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blog.technovert.com/2014/02/common-pitfalls-angularjs/&quot;&gt;http://blog.technovert.com/2014/02/common-pitfalls-angularjs/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
You can also subscribe to my feed &lt;a href=&quot;http://blog.technovert.com/author/chander/feed&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Happy Reading :)&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/4894725646515194018/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/4894725646515194018' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/4894725646515194018'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/4894725646515194018'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2014/02/common-pitfalls-using-angularjs.html' title='Common Pitfalls using AngularJS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-3711577933869817392</id><published>2013-12-05T09:59:00.001+05:30</published><updated>2013-12-05T10:02:21.271+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="webapi"/><title type='text'>Integrating ASP.Net MVC with AngularJS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
We recently released a Project Template for ASP.Net MVC and AngularJS &lt;a href=&quot;http://visualstudiogallery.msdn.microsoft.com/cc6c9c5f-2846-4822-899f-a6c295cd4f2b&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt; and &lt;a href=&quot;https://angularstart.codeplex.com/&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
I did a follow up post detailing how the project template has been setup and how to make AngularJS and MVC play well together on my &lt;a href=&quot;http://blog.technovert.com/2013/12/setting-up-angularjs-for-asp-net-mvc-n-webapi-project/&quot; target=&quot;_blank&quot;&gt;company blog&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
If you are interested in understanding how the template works head over to &lt;a href=&quot;http://blog.technovert.com/2013/12/setting-up-angularjs-for-asp-net-mvc-n-webapi-project/&quot; target=&quot;_blank&quot;&gt;my blog post&lt;/a&gt; and read it!&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/3711577933869817392/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/3711577933869817392' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/3711577933869817392'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/3711577933869817392'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/12/integrating-aspnet-mvc-with-angularjs.html' title='Integrating ASP.Net MVC with AngularJS'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total><georss:featurename>New Delhi, Delhi, India</georss:featurename><georss:point>28.635308 77.22496000000001</georss:point><georss:box>28.1893855 76.579513 29.081230499999997 77.870407000000014</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-8087684674938733087</id><published>2013-09-23T18:07:00.000+05:30</published><updated>2013-09-23T18:07:53.896+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Visual Studio"/><category scheme="http://www.blogger.com/atom/ns#" term="webapi"/><title type='text'>Visual Studio Project Template for AngularJS SPA + ASP.Net MVC \ Webapi</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I am very exited to announce that our team at &lt;a href=&quot;http://www.technovert.com/&quot; target=&quot;_blank&quot;&gt;Technovert&lt;/a&gt; has release a Visual Studio project template for &lt;a href=&quot;http://angularjs.org/&quot; target=&quot;_blank&quot;&gt;AngularJS&lt;/a&gt;. More details on how to install and use this template are available on the &lt;a href=&quot;http://blog.technovert.com/2013/09/integrating-angularjs-with-asp-net-mvc-and-webapi/&quot; target=&quot;_blank&quot;&gt;Technovert Blog&lt;/a&gt;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
Knockout.js has been a standard library that .Net devs have been using for creating rich interactive business apps. But AngularJS from Google provides a more complete framework and is gaining a lot of dev community support. This project template can help you get up and running with AngularJS in no time and evaluate it for your future needs.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/8087684674938733087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/8087684674938733087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/8087684674938733087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/8087684674938733087'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/09/aspnet-mvc-template-for-angularjs-spa.html' title='Visual Studio Project Template for AngularJS SPA + ASP.Net MVC \ Webapi'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-4601300808849264483</id><published>2013-08-06T17:27:00.002+05:30</published><updated>2013-08-06T17:32:18.061+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="javascript"/><title type='text'>AngularJS  Model - ViewModel</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Recently Robin Ward did a &lt;a href=&quot;http://eviltrout.com/2013/06/15/ember-vs-angular.html&quot; target=&quot;_blank&quot;&gt;comparison&lt;/a&gt; between AngularJS and Ember (both the post and the comments are interesting read). One of the complaint that Robin had that AngularJS does not provide any specialized model class. As described in the blog&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;
There is no standard &lt;code&gt;Model&lt;/code&gt; base class, nor is there a component or interface in AngularJS that defines what a model is supposed to be.&lt;/blockquote&gt;
&lt;br /&gt;
What that means is that anything defined on $scope can acts as model, as this sample on the blog describes&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/chandermani/6000081.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
For some (like me) this is the flexibility where as for others who want a more structural approach this is a &lt;span class=&quot;hw&quot;&gt;nuisance.AngularJS does not even provide any definite guidelines around how the model should be actually designed to be effective with AngularJS&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;span class=&quot;hw&quot;&gt;This leads to what we call as $scope pollution.  We define multitude of properties on the $scope object and managing it becomes difficult.&amp;nbsp; Looking at the code one cannot tell what is the actual model and what properties are just to support UI logic.&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;hw&quot;&gt;Model Design - Convention &lt;/span&gt;&lt;/h4&gt;
&lt;span class=&quot;hw&quot;&gt;We have been using AngularJS for some time now and we have devised a convention which&amp;nbsp; has helped us to keep $scope pollution under control. Here is how we organize our model.&lt;/span&gt;&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class=&quot;hw&quot;&gt;On the Controller scope we create a object viewModel. ViewModel according to us is a model which has been tailored to support a specific UI, helping in easing data binding.&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span class=&quot;hw&quot;&gt;We define a property model on either the controller scope or on the viewModel defined above. This model is something that is loaded from the server and updated back on edits.&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;span class=&quot;hw&quot;&gt;This is how a sample controller looks&amp;nbsp;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;hw&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class=&quot;hw&quot;&gt;&lt;script src=&quot;https://gist.github.com/chandermani/6c1591e3c93200aca058.js&quot;&gt;&lt;/script&gt;&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;hw&quot;&gt;So any controller defines only one or two property directly on the $scope and that&#39;s it !&lt;/span&gt;&lt;br /&gt;
&lt;span class=&quot;hw&quot;&gt;&lt;br /&gt;&lt;/span&gt;
&lt;span class=&quot;hw&quot;&gt;What could be the advantage of this small convention? Many :)&lt;/span&gt;&lt;span class=&quot;hw&quot;&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
&lt;span class=&quot;hw&quot;&gt;Readability &lt;/span&gt;&lt;/h4&gt;
&lt;span class=&quot;hw&quot;&gt;To start with, anyone reading the code can know what the model is and what variable are just used to support AngularJS data binding (such variables are created on viewModel object).&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;h4 style=&quot;text-align: left;&quot;&gt;
Ease of passing model around &lt;/h4&gt;
Any decent size angular app/page would consist of multiple partial views and directives working together to provide the necessary functionality. One of the challenge in such setup is how to keep partial views and directives as independent as possible.&lt;br /&gt;
&lt;br /&gt;
For partial views (views loaded using ng-include) here is how we define our template and main view.&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/chandermani/6163744.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
As you can see, any template that requires a model to work on, gets it through ng-init. Just looking at the ng-init assignment one can determine what does a partial template require. Passing model around to these sub views become easier. Each of these partials can have their own controller and create their own viewModel object.&lt;br /&gt;
&lt;br /&gt;
For directive, this is what we can do&lt;br /&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/chandermani/6163807.js&quot;&gt;&lt;/script&gt;&lt;br /&gt;
&lt;br /&gt;
For directives it becomes easier for us to create isolated scope, which has great benefits in terms of re-usability.&lt;br /&gt;
&lt;br /&gt;
As you can see in both cases dependencies are clearly defined and there is a single root object at all levels. &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/4601300808849264483/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/4601300808849264483' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/4601300808849264483'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/4601300808849264483'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/08/angularjs-model-viewmodel.html' title='AngularJS  Model - ViewModel'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total><georss:featurename>New Delhi, Delhi, India</georss:featurename><georss:point>28.635308 77.22496000000001</georss:point><georss:box>28.1893855 76.579513 29.081230499999997 77.870407000000014</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-5603349288592371397</id><published>2013-05-03T12:32:00.000+05:30</published><updated>2015-01-18T19:08:09.718+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="IIS"/><category scheme="http://www.blogger.com/atom/ns#" term="url rewrite"/><title type='text'>IIS Url Rewrite and HTTP POST data</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
If you play around with IIS Url Rewriting rules and try to do redirects on an HTTP POST you loose your POST data.&lt;br /&gt;
&lt;br /&gt;
To make sure you get the post data you have to set the `redirectType` to `Temporary` within your rules. So the action configuration looks like this&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&amp;lt;action redirectType=&quot;&lt;b&gt;Temporary&lt;/b&gt;&quot; type=&quot;Redirect&quot; url=&quot;http://{HTTP_HOST}{REQUEST_URI}&quot;&amp;gt; &amp;lt;/action&amp;gt;&lt;/blockquote&gt;
&lt;br /&gt;
You may think what scenario warrant a POST request redirect. We faced one such scenario while doing SSO with a federated Identity Provider (IP)&amp;nbsp; such as Google, Azure AD. In federated authentication scenario once the user is authenticated by the IP, it redirects back to your site with claim tokens in a POST request over secure channel (https). In our case we wanted to redirect to user back http after receiving the request. But any redirects were causing loss of token. By doing a 307 (Temporary) redirect we were able to preserve the post data.&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/5603349288592371397/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/5603349288592371397' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/5603349288592371397'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/5603349288592371397'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/05/iis-url-rewrite-and-http-post-data.html' title='IIS Url Rewrite and HTTP POST data'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>16.9002075 77.841224 17.8698805 79.132118</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-5701802060637040580</id><published>2013-05-02T10:04:00.000+05:30</published><updated>2013-05-02T10:04:08.050+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Debugging"/><category scheme="http://www.blogger.com/atom/ns#" term="deployment"/><category scheme="http://www.blogger.com/atom/ns#" term="Remote Login"/><title type='text'>Remote login on Azure Roles</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
In case you do not follow this &lt;a href=&quot;http://weblogs.asp.net/scottgu&quot; target=&quot;_blank&quot;&gt;guy &lt;/a&gt;:), there has been one significant change to Azure which would make developers life much easier while debugging and testing an azure deployment.&lt;br /&gt;
&lt;br /&gt;
You can now enable remote login into azure deployment without requiring you to enable it during the package creation. This means even if the deployment happened with Remote login not enable, you can still enable remote login from azure management portal directly. More details are available &lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2013/04/26/windows-azure-improvements-to-virtual-networks-virtual-machines-cloud-services-and-a-new-ruby-sdk.aspx&quot; target=&quot;_blank&quot;&gt;here&amp;nbsp;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
So no more forgetting remote login option. Just do a deployment and if required enable remote login from &lt;a href=&quot;https://manage.windowsazure.com/&quot; target=&quot;_blank&quot;&gt;azure management portal&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/5701802060637040580/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/5701802060637040580' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/5701802060637040580'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/5701802060637040580'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/05/remote-login-on-azure-roles.html' title='Remote login on Azure Roles'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>16.900204000000002 77.841224 17.869884 79.132118</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-2618978077228049940</id><published>2013-01-18T17:34:00.001+05:30</published><updated>2013-01-18T17:34:32.323+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Exception"/><title type='text'>Logging .Net Exception Details with Complete Stack</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I learned today that in .Net doing a ex.ToString() would log the complete exception details including any inner exception details. The important thing here is that it would do this recursively so if there is an InnerException it would call ToString() on it, which in turn can call ToString() on the next level hence forming a recursive chain.&lt;br /&gt;
&lt;br /&gt;
So we can do away with such format string&lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
System.Diagnostics.Trace.TraceError(&quot;The error was {0}. Stack Trace {1}. InnerException Details {2}&quot;,ex.Message, ex.StackTrace,ex.InnerException.Message);&lt;/blockquote&gt;
&amp;nbsp;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/2618978077228049940/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/2618978077228049940' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2618978077228049940'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2618978077228049940'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/01/logging-net-exception-details-with.html' title='Logging .Net Exception Details with Complete Stack'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1314396657539813538</id><published>2013-01-10T19:45:00.001+05:30</published><updated>2017-02-03T17:22:34.468+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Developer"/><category scheme="http://www.blogger.com/atom/ns#" term="Google;Software Development;GDD"/><title type='text'>Google Driven Development GDD</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
In this era of TDD, BDD, DDD and all other&amp;nbsp;&lt;a href=&quot;https://dlutzy.wordpress.com/2011/08/21/driven-development/&quot; target=&quot;_blank&quot;&gt; *DDs&lt;/a&gt;, we have a breed of developers doing Google Driven Development (GDD). Sounds interesting, indeed it is :).&lt;br /&gt;
&lt;br /&gt;
Here is how to identify a GDD guy&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;This person does not believe in writing anything on his own, copy/paste from blogs, articles, source code is a way of life. And since I have not written it I don&#39;t care how it works as long as I see something working. His best friends are Ctrl-C, Ctrl-V and Google. &lt;/li&gt;
&lt;li&gt;Cannot write 5 lines of code or code for 5 minutes without doing a Google search.&lt;/li&gt;
&lt;li&gt;His productivity is directly related to performance of corporate network, and how fast Google searches. If the network is down, it&#39;s better to go for a coffee. &lt;/li&gt;
&lt;li&gt;Search hours on Google for &quot;&lt;a href=&quot;https://www.google.com/search?q=object+not+set+to+an+instance&quot; target=&quot;_blank&quot;&gt;Object reference not set to an instance of an object&lt;/a&gt;&quot; and then believes that the whole world is facing the same issue. Who cares what the context of problem is.&lt;/li&gt;
&lt;li&gt;To solve the error&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;He then tries each and every solution that Google GOD provides.&lt;/li&gt;
&lt;li&gt;If by fluke he is able to fix or camouflage the issue, he considers himself something special, but in his heart he knows he has no clue what happened. Thanks Google for saving his day and continues his pursuit to become a better GDDer. &lt;/li&gt;
&lt;li&gt;If not, then it&#39;s time for the Lead, the next GOD in Line. The Lead should be able to fix this issue, What else are Leads there for :) &lt;/li&gt;
&lt;/ul&gt;
&lt;li&gt;Reading documentation is so very lame ! Documentation is for sissies,&amp;nbsp; real developers do Google.&lt;/li&gt;
&lt;li&gt;Religiously believes that all results returned by Google are correct. Google has employed a huge workforce just to make sure results are correct.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Feel free to comment and tell me more such traits of a GDDer and i would add to my post :)&lt;br /&gt;
&lt;br /&gt;
I may have exaggerated a bit, but what to do, I am seeing such people all too often.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1314396657539813538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1314396657539813538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1314396657539813538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1314396657539813538'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/01/google-driven-development-gdd.html' title='Google Driven Development GDD'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-7478086522377973201</id><published>2013-01-06T16:10:00.000+05:30</published><updated>2013-01-06T16:10:19.569+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="deployment"/><title type='text'>Azure and Package Deployment for Specific Roles</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
When a single Azure Subscription Service has multiple roles (Web and Worker) in it, updates to the role cannot be selective. Time and again I have had scenarios where I wanted to update the one role but did not want to touch the other. But as Azure deployment works, there is a single package and it updates all roles in the subscription.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
While doing an update today I was pleasantly surprise that now while updating the site I do have an option to select which specific role to update. Here is what the dialog looks like now&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIhNIihj-NqUyng2Uifg3KGazINoLkeGWKHxltf9HKC8VpjIH8JpkRfrrRjT7QChxj_e7gTo55mE5FiNJ8G-fBKtcF43FIyfp2cv9V4j4Bxpe61eCWGOruiCDsyBJTBlJrMCw-7A/s1600/SelectiveRoleUpdate.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;514&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIhNIihj-NqUyng2Uifg3KGazINoLkeGWKHxltf9HKC8VpjIH8JpkRfrrRjT7QChxj_e7gTo55mE5FiNJ8G-fBKtcF43FIyfp2cv9V4j4Bxpe61eCWGOruiCDsyBJTBlJrMCw-7A/s1600/SelectiveRoleUpdate.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So now we can update specific roles without touching other ones. Great!!!&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Things to keep in mind here would be, once deployment is complete you cannot tell which role was updated and which is still running on a older version. But the deployment name does change. So i think this is a good feature for some quick fixes, else we should stick to simultaneous updates only.&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/7478086522377973201/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/7478086522377973201' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7478086522377973201'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7478086522377973201'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2013/01/azure-and-package-deployment-for.html' title='Azure and Package Deployment for Specific Roles'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgIhNIihj-NqUyng2Uifg3KGazINoLkeGWKHxltf9HKC8VpjIH8JpkRfrrRjT7QChxj_e7gTo55mE5FiNJ8G-fBKtcF43FIyfp2cv9V4j4Bxpe61eCWGOruiCDsyBJTBlJrMCw-7A/s72-c/SelectiveRoleUpdate.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Andhra Pradesh, India</georss:featurename><georss:point>17.424028633877878 78.5357666015625</georss:point><georss:box>16.939187133877876 77.8903196015625 17.90887013387788 79.1812136015625</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-2918881983160318701</id><published>2012-12-15T16:06:00.000+05:30</published><updated>2014-02-12T11:32:35.554+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="angular"/><category scheme="http://www.blogger.com/atom/ns#" term="angularjs"/><category scheme="http://www.blogger.com/atom/ns#" term="directives"/><category scheme="http://www.blogger.com/atom/ns#" term="html"/><title type='text'>Angularjs and inplace edit</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;a href=&quot;http://angularjs.org/&quot; target=&quot;_blank&quot;&gt;AngularJS &lt;/a&gt;is an awesome framework and Angular &lt;a href=&quot;http://docs.angularjs.org/guide/directive&quot; target=&quot;_blank&quot;&gt;Directives&lt;/a&gt; make this framework super awesome :)&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
AngularJS&amp;nbsp; directives help us extend the existing HTML DSL. You can create new tags, extend functionality using existing tag and create reusable component.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I recently created a Inplace editable control in AngularJS. It basically allows to do in place editing for elements like H1, H2, H3 div etc, basically all read only control. I took the initial idea from &lt;a href=&quot;http://jsfiddle.net/cmyworld/6gMXL/&quot; target=&quot;_blank&quot;&gt;this fiddle&lt;/a&gt; and added&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Text selection on edit.&lt;/li&gt;
&lt;li&gt;Cursor positioning&lt;/li&gt;
&lt;li&gt;Handle the Enter key press. &lt;/li&gt;
&lt;/ul&gt;
Here is my fiddle&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;allowfullscreen&quot; frameborder=&quot;0&quot; height=&quot;300&quot; src=&quot;http://jsfiddle.net/cmyworld/6gMXL/embedded/&quot; width=&quot;100%&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/2918881983160318701/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/2918881983160318701' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2918881983160318701'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2918881983160318701'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/12/angularjs-and-inplace-edit.html' title='Angularjs and inplace edit'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-7253287725154532791</id><published>2012-12-02T13:40:00.000+05:30</published><updated>2012-12-02T13:42:13.445+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="ASP.Net"/><category scheme="http://www.blogger.com/atom/ns#" term="autofac"/><category scheme="http://www.blogger.com/atom/ns#" term="MVC"/><category scheme="http://www.blogger.com/atom/ns#" term="Nuget"/><category scheme="http://www.blogger.com/atom/ns#" term="webapi"/><title type='text'>Integrate ASP.Net MVC + WebAPI with Autofac in 5 mins</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Recently i configured &lt;a href=&quot;https://code.google.com/p/autofac/&quot; target=&quot;_blank&quot;&gt;Autofac &lt;/a&gt;with &lt;a href=&quot;http://www.asp.net/mvc&quot; target=&quot;_blank&quot;&gt;ASP.Net MVC 4&lt;/a&gt; and &lt;a href=&quot;http://asp.net/webapi&quot; target=&quot;_blank&quot;&gt;WebAPI&lt;/a&gt;. Here are the steps required to configure Autofac&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Install package Autofac.MVC4&lt;/li&gt;
&lt;li&gt;Install package Autofac.WebApi&lt;/li&gt;
&lt;li&gt;Add a class AutofacBootstrap. Use this class to configure the dependencies within your project. &lt;script src=&quot;https://gist.github.com/4187637.js&quot;&gt; &lt;/script&gt;&lt;/li&gt;
&lt;li&gt;Open Global.asax file and add a method like &lt;script src=&quot;https://gist.github.com/4187627.js&quot;&gt; &lt;/script&gt; &lt;/li&gt;
&lt;li&gt;&amp;nbsp;Call the method from Application_Start&lt;/li&gt;
&lt;li&gt;And you are done !! &lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/7253287725154532791/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/7253287725154532791' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7253287725154532791'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7253287725154532791'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/12/integrate-mvc-webapi-with-autofac-in-5.html' title='Integrate ASP.Net MVC + WebAPI with Autofac in 5 mins'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-7749832793953382080</id><published>2012-09-16T16:12:00.001+05:30</published><updated>2012-09-16T16:12:08.021+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Appharbor"/><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Talk"/><category scheme="http://www.blogger.com/atom/ns#" term="notifications"/><category scheme="http://www.blogger.com/atom/ns#" term="webapi"/><category scheme="http://www.blogger.com/atom/ns#" term="XMPP"/><title type='text'>Appharbor build notification using Google Talk (XMPP) - Implementation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
In my &lt;a href=&quot;http://chandermani.blogspot.in/2012/07/appharbor-build-notification-using.html&quot; target=&quot;_blank&quot;&gt;last post&lt;/a&gt; about creating an Appharbor notification bot, I described about the problem domain, the solution approaches and how the end to end scenario works.This post would dig deeper into the implementation aspects of the solution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To start with we need to understand the two esential ingredients for this recipe &lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li style=&quot;text-align: justify;&quot;&gt;&lt;b&gt;&lt;a href=&quot;https://appharbor.com/page/how-it-works&quot; target=&quot;_blank&quot;&gt;Appharbor Service hooks&lt;/a&gt;:&lt;/b&gt; Appharbor Service hooks are the building block for the solution. Appharbor provides capability, where it can post to any public url with status of a build on completion. Service hooks are available for events &lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;Build Success.&lt;/li&gt;
&lt;li&gt;Build failure.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: justify;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://xmpp.org/&quot; target=&quot;_blank&quot;&gt;&lt;b&gt;XMPP protocol&lt;/b&gt;&lt;/a&gt;: XMPP is a protocol used for Instant Messaging (IM) communication. It allows us to relay messages to the users IM client using XMPP servers (in our case Google Talk messaging servers).&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
With the understanding on these two concept we are ready to dive into the nitty gritty&amp;nbsp; of the solution.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Assuming that the user did the initial configurations to setup notifications (see my &lt;a href=&quot;http://chandermani.blogspot.in/2012/07/appharbor-build-notification-using.html&quot; target=&quot;_blank&quot;&gt;earlier post&lt;/a&gt;), here is what happens behind the scenes when a build notification is triggered from Appharbor&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyhsirxgDq1g5H5c2BakA8np0I7bDj1SkBxBEWXri_Kvx0EcOMfB0udtG37rnMzd1mgOLDz6Ii-V3ryu9fhFw2OYYy7RZSO6LDuTbCMyvB1rwK50-oCm51j4N8noaZiyAbEa7bQ/s1600/AppharborbotArch.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyhsirxgDq1g5H5c2BakA8np0I7bDj1SkBxBEWXri_Kvx0EcOMfB0udtG37rnMzd1mgOLDz6Ii-V3ryu9fhFw2OYYy7RZSO6LDuTbCMyvB1rwK50-oCm51j4N8noaZiyAbEa7bQ/s1600/AppharborbotArch.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
One may find it odd that parts of the solution are hosted on AppHarbor and parts on Windows Azure worker role.&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The reason for this was, inability for IIS to host the XMPP client and allow it to keep persistent connections to XMPP server. Whenever i was trying to instantiate a XMPP client (&lt;a href=&quot;http://www.ag-software.de/agsxmpp-sdk/&quot; target=&quot;_blank&quot;&gt;agsXMPP&lt;/a&gt;) the call silently failed when hosted in IIS. In a console app it worked fine. I did not dwell much into the issue but based on my initial research the XMPP client tries to create a persistent connection to XMPP server (in our case Google Talk) but IIS does not allow this.&lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Since AppHarbor provide more of a web endpoint (presumably in IIS) the solution did not work when hosted in AppHarbor(even in Azure webrole). I had to create a Azure Worker Role and expose a web endpoint from the worker role. Using &lt;a href=&quot;http://www.asp.net/web-api&quot; target=&quot;_blank&quot;&gt;ASP.Net Web API&lt;/a&gt; &lt;a href=&quot;http://www.asp.net/web-api/overview/hosting-aspnet-web-api/self-host-a-web-api&quot; target=&quot;_blank&quot;&gt;Self hosted&lt;/a&gt; feature, I was able to host a http endpoint within the worker role, but it did require some configuration changes for the worker role.&amp;nbsp; &lt;/div&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
To know more about the implementation details look at the source code available on &lt;a href=&quot;https://github.com/chandermani/AppharborBot&quot; target=&quot;_blank&quot;&gt;GitHub&lt;/a&gt;.&amp;nbsp;&lt;/div&gt;
Project &lt;i&gt;Appharborbot.Webhost&lt;/i&gt; contains the bot web site code.&lt;br /&gt;
Project &lt;i&gt;Apphraborbot.Worker&lt;/i&gt; contains the Azure worker role code.&lt;br /&gt;
&lt;br /&gt;
Overall this was an interesting exercise which showed how multiple technology\tools can be combined to create a quick n smart solution. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/7749832793953382080/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/7749832793953382080' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7749832793953382080'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/7749832793953382080'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/09/appharbor-build-notification-using.html' title='Appharbor build notification using Google Talk (XMPP) - Implementation'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhyyhsirxgDq1g5H5c2BakA8np0I7bDj1SkBxBEWXri_Kvx0EcOMfB0udtG37rnMzd1mgOLDz6Ii-V3ryu9fhFw2OYYy7RZSO6LDuTbCMyvB1rwK50-oCm51j4N8noaZiyAbEa7bQ/s72-c/AppharborbotArch.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-215764020164950958</id><published>2012-07-22T14:47:00.000+05:30</published><updated>2012-07-23T12:12:09.151+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Appharbor"/><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Google Talk"/><category scheme="http://www.blogger.com/atom/ns#" term="Gtalk"/><category scheme="http://www.blogger.com/atom/ns#" term="notifications"/><category scheme="http://www.blogger.com/atom/ns#" term="XMPP"/><title type='text'>Appharbor build notification using Google Talk (XMPP)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;http://www.appharbor.com/&quot; target=&quot;_blank&quot;&gt;Appharbor&lt;/a&gt; recently ran a &lt;a href=&quot;http://blog.appharbor.com/2012/06/18/appharbor-api-contest&quot; target=&quot;_blank&quot;&gt;contest&lt;/a&gt; to encourage developers to use their &lt;a href=&quot;http://support.appharbor.com/kb/api/api-overview&quot; target=&quot;_blank&quot;&gt;API &lt;/a&gt;and showcase the API capabilities.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Based on some ideas floated by the Appharbor team I too decided to build something useful\interesting for Appharbor platform.I decided to create a desktop notification client which can notify user when the build is complete, its status in terms of success or failure.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
How Appharbor works is that you push your code to a git repo supported by Appharbor (&lt;a href=&quot;http://github.com/&quot; target=&quot;_blank&quot;&gt;github&lt;/a&gt;, bitbucket etc). As soon as the checkin is done, Appharbor pulls the code base build it, and updates the running website. It&#39;s like a single click deployment!&lt;/div&gt;
&lt;br /&gt;
I started to explore my option for a desktop client and some of the options I though of were&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Build a desktop windows app and integrate with the Appharbor API.&amp;nbsp; This approach was the most flexible approach. I have full control of features and capabilities, but would take a good amount of time to develop.&lt;/li&gt;
&lt;li&gt;Use third party desktop notification apps like &lt;a href=&quot;http://www.growlforwindows.com/gfw/&quot; target=&quot;_blank&quot;&gt;Growl for Windows&lt;/a&gt; and use the Growl API to integrate with Appharbor. The shortcoming with this approach is that the user needs to install Growl for Windows on his machine, but it is better than the first approach as i can make use its existing notification capabilities&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
What i finally decided was to create a solution that uses &lt;a href=&quot;http://www.google.com/talk/&quot; target=&quot;_blank&quot;&gt;Google Talk&lt;/a&gt; as the&amp;nbsp; notification client. The advantages of this approach were&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Easy to build and within a short time span.&lt;/li&gt;
&lt;li&gt;No extra installation required. Now a days most people have these messenger clients installed.&lt;/li&gt;
&lt;li&gt;Cross platform \&amp;nbsp; Cross browser compatible.&amp;nbsp; Works on Mac, Linux, Windows i.e on any system that supports a XMPP client. &lt;/li&gt;
&lt;li&gt;It seems cool :)&lt;/li&gt;
&lt;li&gt;This approach can support any &lt;a href=&quot;http://xmpp.org/&quot; target=&quot;_blank&quot;&gt;XMPP&lt;/a&gt; based client.Google Talk being one of them. This &lt;a href=&quot;https://en.wikipedia.org/wiki/Comparison_of_instant_messaging_clients#Protocol_support&quot; target=&quot;_blank&quot;&gt;wiki entry&lt;/a&gt; details about the existing clients supporting XMPP.&lt;/li&gt;
&lt;/ul&gt;
The disadvantage with this approach is that you are limited by Google Talk + XMPP protocol capabilities.&lt;br /&gt;
&lt;br /&gt;
So after dabbling for few days i created a working prototype. Here is how it works.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMTfTa-XUkIWqZgIE_j7MzE-svWWnYEEmJpNTi9Xp_CNerEaXfbZyRZhAHxgrosmvxJvExp5CCgZAHpTHKocIYYo4aVz4i6fOFtYbLQUULbX31ADB5hEGqO1hD5jqXJvaBQ0GfEA/s1600/Flow.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;341&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMTfTa-XUkIWqZgIE_j7MzE-svWWnYEEmJpNTi9Xp_CNerEaXfbZyRZhAHxgrosmvxJvExp5CCgZAHpTHKocIYYo4aVz4i6fOFtYbLQUULbX31ADB5hEGqO1hD5jqXJvaBQ0GfEA/s400/Flow.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;User creates an Appharbor Application.&lt;/li&gt;
&lt;li&gt;Navigates to http://appharborbot.apphb.com/ to generate Service hook url.&lt;/li&gt;
&lt;li&gt;Generates the Service hook url from this site.&lt;/li&gt;
&lt;li&gt;Adds the generated Service Hook url to his Appharbor app under the Service Hook section.&lt;/li&gt;
&lt;li&gt;Adds contact appharbornotificationservice@gmail.com to his Google Talk&lt;/li&gt;
&lt;li&gt;Receives all build notifications in his Google Talk!!!&lt;/li&gt;
&lt;/ol&gt;
The final outcome, user now gets all build completion and failure notifications. This is how&amp;nbsp; notifications look &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf341a44mCydtY2n8jXEK6aJxReb0Bkup4bq96TIz5PRODWRmde1ia1ZRUxmpeAE6QKsgDGVdeF5cRlUWGaW_5gXd7Vyz-n12PqBiOGF1cSNiVRkB5_IzampjloxmRRjsxeEBwhw/s1600/Appharborbot.pptx+-+Microsoft+PowerPoint_2012-07-02_10-20-38.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;295&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjf341a44mCydtY2n8jXEK6aJxReb0Bkup4bq96TIz5PRODWRmde1ia1ZRUxmpeAE6QKsgDGVdeF5cRlUWGaW_5gXd7Vyz-n12PqBiOGF1cSNiVRkB5_IzampjloxmRRjsxeEBwhw/s400/Appharborbot.pptx+-+Microsoft+PowerPoint_2012-07-02_10-20-38.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
I would be soon publishing the second part in this series, where I would talk about the technical aspect of the solution, which is as interesting as the solution. This solution is an amalgamation of Windows Azure and Appharbor so just watch out for my future post. &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/215764020164950958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/215764020164950958' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/215764020164950958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/215764020164950958'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/07/appharbor-build-notification-using.html' title='Appharbor build notification using Google Talk (XMPP)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMTfTa-XUkIWqZgIE_j7MzE-svWWnYEEmJpNTi9Xp_CNerEaXfbZyRZhAHxgrosmvxJvExp5CCgZAHpTHKocIYYo4aVz4i6fOFtYbLQUULbX31ADB5hEGqO1hD5jqXJvaBQ0GfEA/s72-c/Flow.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1291413436424339141</id><published>2012-06-19T18:30:00.000+05:30</published><updated>2012-06-19T18:31:30.720+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="API"/><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Blob"/><category scheme="http://www.blogger.com/atom/ns#" term="DefaultServiceVersion"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP Range"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><title type='text'>Azure Blob file download not resuming !</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;a href=&quot;https://www.windowsazure.com/en-us/home/features/data-management/&quot; target=&quot;_blank&quot;&gt;Azure Blobs&lt;/a&gt; are a scalable infrastructure to host\store files. I was working on understanding the behavior of large file uploads and downloads and create a reasonable strategy to support both scenarios in our application.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Azure blob file can be downloaded using any browser or internet download manager. For a public blob the url of file would suffice, but for downloading a private blob one needs to create a url containing the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/ee395415.aspx&quot; target=&quot;_blank&quot;&gt;Secured Access Signature&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
While testing downloads I realized that in case I pause and resume the download in Firefox or Chrome or any download manager the download restarts !!! I was expecting that the download should start from the place it paused. Imagine the scenario where we have uploaded half of a 2GB file and resuming the download would start over again !!! Clearly the Azure Blob storage was not supporting &lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html#sec14.35&quot; target=&quot;_blank&quot;&gt;HTTP Range header&lt;/a&gt;.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
As it turns out the Azure blob service is not a trivial file server. It is more of a Storage Application Server. It exposes an &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/dd135733.aspx&quot; target=&quot;_blank&quot;&gt;REST API&lt;/a&gt; to interact with it. The ability to support Range header(hence resume) was added in a later version of&amp;nbsp; Blob API.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The default API version that we interact with is &lt;b&gt;2009-09-19&lt;/b&gt;. This is the version used in case we do not specify any (version can be added in HTTP header &lt;i&gt;x-ms-version&lt;/i&gt;). Since the browser does not send any custom version header while making the GET request we do not get the resume support.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
The fix here was to update the blob service properties for our account using the &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/hh452235.aspx&quot; target=&quot;_blank&quot;&gt;Set Blob Service Properties&lt;/a&gt; API method. This method takes a parameter &lt;i&gt;&lt;b&gt;DefaultServiceVersion&lt;/b&gt;&lt;/i&gt;. This parameter defines the default version of blob API to use in case API version is not specified in the HTTP header. Setting this value to &lt;b&gt;2011-08-18&lt;/b&gt; fixed the resume problem.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Now the browser was able resume broken downloads and download managers could even download in multiple chunks to improve download speed.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I did not find any option in the Azure Management portal that allows us to set the the above property so I had to do it using the REST API. I am sharing the code that I used to update the API version below&lt;/div&gt;
&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/2953898.js?file=DefaultServiceVersion.cs&quot;&gt;
&lt;/script&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1291413436424339141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1291413436424339141' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1291413436424339141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1291413436424339141'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/06/azure-blob-file-download-not-resuming.html' title='Azure Blob file download not resuming !'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142652000000002 78.170814000000007 17.627436 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-8676441999779936448</id><published>2012-05-24T18:32:00.000+05:30</published><updated>2012-05-24T18:34:52.868+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term=".Net"/><category scheme="http://www.blogger.com/atom/ns#" term="Algorithm"/><category scheme="http://www.blogger.com/atom/ns#" term="c#"/><category scheme="http://www.blogger.com/atom/ns#" term="Data Structures."/><category scheme="http://www.blogger.com/atom/ns#" term="Longest Increasing Sequence"/><category scheme="http://www.blogger.com/atom/ns#" term="Patience Sort"/><title type='text'>Alogorithm: Finding Longest Increasing Subsequence using Patience Sort in C#</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Finding the &lt;a href=&quot;https://en.wikipedia.org/wiki/Longest_increasing_subsequence&quot; target=&quot;_blank&quot;&gt;Longest Increasing Sequence&lt;/a&gt; is an interesting problem and there are multiple solutions available with varying time complexity. The solution that i plan to share today is the uses of &lt;a href=&quot;https://en.wikipedia.org/wiki/Patience_sorting&quot; target=&quot;_blank&quot;&gt;Patience Sort&amp;nbsp;&lt;/a&gt; to find such a sequence. The solution finds &lt;u&gt;&lt;b&gt;a particular longest increasing sub-sequence&lt;/b&gt;&lt;/u&gt; as the original sequence may contain more than one such sequence.&lt;br /&gt;
&lt;br /&gt;
In 1999 The Bulletin of the American Mathematical Society published &lt;a href=&quot;http://www.ams.org/bull/1999-36-04/S0273-0979-99-00796-X/home.html&quot; target=&quot;_blank&quot;&gt;a paper&lt;/a&gt; by David Aldous and Persi Diaconis entitled: “Longest Increasing Subsequences: From Patience Sorting to the Baik-Deift-Johansson Theorem”.&lt;br /&gt;
&lt;br /&gt;
I have implemented this solution in C# and derived it from this excellent &lt;a href=&quot;http://wordaligned.org/articles/patience-sort&quot; target=&quot;_blank&quot;&gt;article&lt;/a&gt; which provides a Python implementation for the same.&lt;br /&gt;
&lt;br /&gt;
This is how patience sort works&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Take a deck of cards
 labeled 1, 2, 3, … , n. The deck is shuffled, cards are turned up one 
at a time and dealt into piles on the table, according to the rule&lt;/li&gt;
&lt;li&gt;A
 low card may be placed on a higher card (e.g. 2 may be placed on 7), or
 may be put into a new pile to the right of the existing piles.&lt;/li&gt;
&lt;li&gt;At
 each stage we see the top card on each pile. If the turned up card is 
higher than the cards showing, then it must be put into a new pile to 
the right of the others.&amp;nbsp;&lt;/li&gt;
&lt;/ul&gt;
I have left out the part that returns the sorted list of numbers as it is not relevant for the longest sub-sequence problem.&lt;br /&gt;
&lt;br /&gt;
The first thing to note here is &lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;Once the cards\numbers are organized into piles. The total number of piles denote the size of longest sub-sequence.&lt;/b&gt;&lt;/blockquote&gt;
&amp;nbsp;To get the longest sequence some extra book keeping is required. According to the paper&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;br /&gt;&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;span style=&quot;font-size: x-small;&quot;&gt;&amp;nbsp;&amp;nbsp;&lt;span style=&quot;font-family: &amp;quot;Courier New&amp;quot;,Courier,monospace; font-size: x-small;&quot;&gt;&amp;nbsp; &lt;b&gt;Lemma 1&lt;/b&gt;. With deck π, patience sorting played with the greedy strategy ends with exactly L(π) piles. Furthermore, the game played with any legal strategy ends with at least L(π) piles. So the greedy strategy is optimal and cannot be improved by any look-ahead strategy.&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;b&gt;Proof&lt;/b&gt;. If cards a1 &amp;lt; a2 &amp;lt; … &amp;lt; al appear in increasing order, then under any legal strategy each ai must be placed in some pile to the right of the pile containing ai-1, because the card number on top of that pile can only decrease. Thus the final number of piles is at least l, and hence at least L(π). &lt;b&gt;Conversely, using the greedy strategy, when a card c is placed in a pile other than the first pile, put a pointer from that card to the currently top card c′ &amp;lt; c in the pile to the left. At the end of the game, let al be the card on top of the rightmost pile l. The sequence a1 ← a2 ← … ← al-1 ← al obtained by following the pointers is an increasing subsequence whose length is the number of piles.&lt;/b&gt;&lt;/span&gt;&lt;/span&gt;&lt;/blockquote&gt;
&lt;br /&gt;
What this means is whenever a card is added to a stack (except first stack), the card should keep a back pointer to the topmost card on the pile on the left.&lt;br /&gt;
&lt;br /&gt;
To get a better understanding of the above logic, i have created a diagram detailing the links that get created during the patience sort process for the list of numbers&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;31,16,7,39,5,12,32,18,9,1&lt;/b&gt;&lt;/blockquote&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXlFVrY59ma4r-guUK32JvG1kZ74h6ibtdvgFx6AX7BjInHy7hulczgp4zWwn1q-q34sBR1OsgkMeRIutaaN7WQ_wWuOLNWaSSKL4VWR721IlIpnGu17NSPGwOcRbsmhT4mKw2zg/s1600/PatienceSortFlow.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;236&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXlFVrY59ma4r-guUK32JvG1kZ74h6ibtdvgFx6AX7BjInHy7hulczgp4zWwn1q-q34sBR1OsgkMeRIutaaN7WQ_wWuOLNWaSSKL4VWR721IlIpnGu17NSPGwOcRbsmhT4mKw2zg/s400/PatienceSortFlow.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
The longest increasing sub-sequence using the above algorithm is &lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&lt;b&gt;5,12,18&lt;/b&gt;&lt;/blockquote&gt;
&lt;/div&gt;
The gist for the implementation is available here&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/2775849.js?file=LongestIncreasingSequence.cs&quot;&gt;
&lt;/script&gt; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/8676441999779936448/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/8676441999779936448' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/8676441999779936448'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/8676441999779936448'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/05/alogorithm-finding-longest-increasing.html' title='Alogorithm: Finding Longest Increasing Subsequence using Patience Sort in C#'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXlFVrY59ma4r-guUK32JvG1kZ74h6ibtdvgFx6AX7BjInHy7hulczgp4zWwn1q-q34sBR1OsgkMeRIutaaN7WQ_wWuOLNWaSSKL4VWR721IlIpnGu17NSPGwOcRbsmhT4mKw2zg/s72-c/PatienceSortFlow.png" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-164934034164983085</id><published>2012-05-13T18:55:00.000+05:30</published><updated>2012-05-13T19:05:25.844+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Cache"/><category scheme="http://www.blogger.com/atom/ns#" term="Converter"/><category scheme="http://www.blogger.com/atom/ns#" term="Image"/><category scheme="http://www.blogger.com/atom/ns#" term="internet"/><category scheme="http://www.blogger.com/atom/ns#" term="Isolated Storage"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Phone"/><title type='text'>Caching Images downloaded from web on Windows Phone Isolated storage</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=20117988&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;a href=&quot;http://www.blogger.com/blogger.g?blogID=20117988&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;I was helping on a Windows Phone application where the requirement was to cache the images the phone downloads on the isolated storage for offline viewing.&lt;br /&gt;
I wanted a solution which was simple and as transparent as possible. While researching I found&amp;nbsp; someone wrote a Silverlight converter for loading images from isolated storage. Taking that as a base I created a converted which can&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Load image from web (http + https), and persist it to isolated storage.&lt;/li&gt;
&lt;li&gt;In case of network connectivity issues can load the same image from isolated storage. It does that by mapping the http url to a isolated storage location.&lt;/li&gt;
&lt;li&gt;In case the network is down and the image is neither there in cache, loads a default image, passed as parameter to converter.&lt;/li&gt;
&lt;/ol&gt;
&lt;a href=&quot;https://gist.github.com/2688372&quot; target=&quot;_blank&quot;&gt;Here&lt;/a&gt; is the gist for the implementation.&lt;br /&gt;
&lt;script src=&quot;https://gist.github.com/2688372.js?file=CacheImageFileConverter.cs&quot;&gt;
&lt;/script&gt; &lt;br /&gt;
&lt;br /&gt;
To use the converter&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Import the name space.&lt;/li&gt;
&lt;li&gt;Declare the converter as resource.&lt;/li&gt;
&lt;li&gt;Set the Image Source Property to use this converter like this&amp;nbsp;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygbSkNdDxtHKBA-FTV82X1INPVkA3mVJvhOv9xa-X5EPOcebcTjvD3Ewogw7594AmIJXX9xrncIEtaYd07L57gFWijYDAa637hOxL8ZqHuCi9ZVbLzMY-5_Z000mAeG73C6HIDg/s1600/Converter.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;27&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygbSkNdDxtHKBA-FTV82X1INPVkA3mVJvhOv9xa-X5EPOcebcTjvD3Ewogw7594AmIJXX9xrncIEtaYd07L57gFWijYDAa637hOxL8ZqHuCi9ZVbLzMY-5_Z000mAeG73C6HIDg/s400/Converter.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;/ol&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;/ol&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/164934034164983085/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/164934034164983085' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/164934034164983085'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/164934034164983085'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/05/caching-images-downloaded-from-web-on.html' title='Caching Images downloaded from web on Windows Phone Isolated storage'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhygbSkNdDxtHKBA-FTV82X1INPVkA3mVJvhOv9xa-X5EPOcebcTjvD3Ewogw7594AmIJXX9xrncIEtaYd07L57gFWijYDAa637hOxL8ZqHuCi9ZVbLzMY-5_Z000mAeG73C6HIDg/s72-c/Converter.png" height="72" width="72"/><thr:total>8</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1946713029289940010</id><published>2012-04-24T23:24:00.000+05:30</published><updated>2012-04-24T23:26:38.567+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Agile"/><category scheme="http://www.blogger.com/atom/ns#" term="Architect"/><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><title type='text'>Architect? Give me a break :)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;a href=&quot;http://davybrion.com/blog/&quot; target=&quot;_blank&quot;&gt;Davy Brion&lt;/a&gt; has posted &lt;a href=&quot;http://davybrion.com/blog/2012/04/most-valuable-professionals-give-me-a-break/&quot; target=&quot;_blank&quot;&gt;some rants&lt;/a&gt; about the Microsoft MVP program and the type of people that are attracted to it.&lt;br /&gt;
What David has mentioned holds true in some other areas of IT industry too.&lt;br /&gt;
&quot;Architect&quot;
 another cool but severely abused title :) If you take David&#39;s post and 
replace &quot;Microsoft MVP&quot; with the word &quot;Architect&quot; you would find 
everything still holds true. I am a strong believer that &quot;Architect&quot; as a
 designation\title should be done away with.&lt;br /&gt;
&lt;br /&gt;
In my 8+ years of IT experience I have seen quite a few of this 
breed :) With exception of few I found most of them just good with &lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;UML modelling tools (such as Visio)&lt;/li&gt;
&lt;li&gt;Generating high quality project artifacts (Such as Function Specs, Design documents)&lt;/li&gt;
&lt;li&gt;Buzz word mongers.&lt;/li&gt;
&lt;li&gt;Smooth talkers&lt;/li&gt;
&lt;/ul&gt;
These maybe important qualities to have in an Architect but a sound technical background is a non negotiable. Everyone knows what is the end result if you engage such people. Such Architects mostly produce things that look impressive on paper but implementing them most often then not becomes infeasible.&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;/ul&gt;
Well, its not the Architects fault always. In a typical engagement this is how the Architect works. At the start of the project the Architect&lt;br /&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Understands the problem domain.&lt;/li&gt;
&lt;li&gt;Talks to the client coming up with a solution approach.&lt;/li&gt;
&lt;li&gt;Shares the solution approach with the client and key stakeholders.&lt;/li&gt;
&lt;li&gt;Gets their feedback. &lt;br /&gt;
  &lt;/li&gt;
&lt;li&gt;and finally creates artifacts for the team to get started.&lt;/li&gt;
&lt;/ol&gt;
What starts of as a full time gig for the Architect, gets reduced to a advisory role as
 the project progresses. And 
after some time the Architect is gone, entrusting people like us the 
responsibility of implementing their grand vision. This is where I believe the 
problem lies.&lt;br /&gt;
&lt;br /&gt;
When we are working in an Agile age where requirements evolve, designs evolve, technology evolves, mandating a design at the start of the project is incorrect. The time where Architectural decisions are made, are times of maximum uncertainly as the project is getting off ground. What ends up happening is that Architectural document\guidelines gets sidelined and the solution evolves based on what the immediate requirements are. This is shear waste of resources. &lt;br /&gt;
&lt;br /&gt;
There is another problem with this approach. Where is the accountability? If I am not going to develop something I am architecting \ designing, I can virtually propose anything. Literally anything !! If things work out fine I can always take the credit else I can always pass the blame to others. Works well for me! I can keep on doing that project after project and keep going up in the organization ladder, with virtual little or no real contribution to any project I work on.&lt;br /&gt;
&lt;br /&gt;
At the end I am not going to present any solution for this situation but point my readers to an excellent &lt;a href=&quot;http://www.infoq.com/presentations/The-Frustrated-Architect&quot; target=&quot;_blank&quot;&gt;presentation &lt;/a&gt;by Simon Brown where Simon discusses the role of the software architect, challenging some of the current assumptions and trying to redefine it in the context of Agile development.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1946713029289940010/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1946713029289940010' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1946713029289940010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1946713029289940010'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/04/architect-give-me-break.html' title='Architect? Give me a break :)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1898436185573794807</id><published>2012-04-05T20:23:00.002+05:30</published><updated>2012-04-05T20:23:30.690+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="checklist"/><category scheme="http://www.blogger.com/atom/ns#" term="interview"/><category scheme="http://www.blogger.com/atom/ns#" term="IT"/><category scheme="http://www.blogger.com/atom/ns#" term="job"/><category scheme="http://www.blogger.com/atom/ns#" term="software"/><title type='text'>So you got a job offer !!!</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXILWP45DGf-psYGtSpDEf_FRFEiGyyiYC23ArxxOVAB1csngmnL0sq8TPM_Lscx1DQl2UGOOsli3IXJRQ6Pv03cC9JRMOoNRsY87Q-GI3zpXirgIkNOwUeia8ghDyIMt9BUh9cg/s1600/Job-Offer-Acceptance-Letter-400x361.jpg&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;288&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXILWP45DGf-psYGtSpDEf_FRFEiGyyiYC23ArxxOVAB1csngmnL0sq8TPM_Lscx1DQl2UGOOsli3IXJRQ6Pv03cC9JRMOoNRsY87Q-GI3zpXirgIkNOwUeia8ghDyIMt9BUh9cg/s320/Job-Offer-Acceptance-Letter-400x361.jpg&quot; width=&quot;320&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
So you got a job offer !!! It always a great feeling
irrespective of ones experience level. You start envisioning about your fatter
pay-cheque, your role, your growth prospects, may be a new city (in case you are
transferring).&amp;nbsp; During this euphoria we
may throw caution to the wind and not do a thorough check about the organization, type of work, work culture. The consequence of our carelessness can
cost us, sometimes dearly.&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
Through this post I just want to highlight things one should
consider while looking out for jobs and while accepting any job offer. &lt;u&gt;&lt;i&gt;&lt;b&gt;Since i
am an IT professional i can and would only talk about IT companies and jobs.&lt;/b&gt;&lt;/i&gt;&lt;/u&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Product Company vs
Services Company&lt;/b&gt;: Many may not have any preferences on this but this
distinction has an affect. Services company is all about billing and one almost always works under deadline pressure, delivery pressure. The story is different in product companies where activities revolve around the product. Time to market is important in product development organizations too but not as important as services organization.&lt;b&gt; &lt;/b&gt;&lt;/li&gt;
&lt;br /&gt;
&lt;li&gt;&lt;b&gt;Company&#39;s IT
division vs Pure IT company&lt;/b&gt;: If you are driven by technology,&amp;nbsp; IT division within a large organization may
not suite you. One needs to understand, non IT companies are driven by business
needs not technology needs. As always there are exceptions to this rule too, but one should be aware of this. &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Background Check&lt;/b&gt;:
Background check is very important before you accept any offer or join a
company. Try to extract as much data about the company&#39;s background, the type of
work it does, the work culture, company policies. Some of the avenues for such
research are&amp;nbsp;&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Your Friends&lt;/b&gt;:
Check with you friends, and try to see if someone has some experience with the
company. Many a times you friend may get you connected to someone who can help
you better in the research.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;LinkedIn&lt;/b&gt;:
&lt;a href=&quot;http://www.linkedin.com/&quot; target=&quot;_blank&quot;&gt;LinkedIn &lt;/a&gt;is a professional network, where one can find about any company, it&#39;s
current and previous employees. There is a wealth of information available on
LinkedIn. You can look for your connections within the company. You could find
1st, 2nd or 3rd level connection, so go ahead and leverage these connections.
Try to gain insight into the company. If possible find connection who have been
past employees with the company.&amp;nbsp;&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Company Review
Sites&lt;/b&gt;: I know about two such sites &lt;a href=&quot;http://www.jobeehive.com/&quot;&gt;www.jobeehive.com&lt;/a&gt; and &lt;a href=&quot;http://www.glassdoor.com/&quot;&gt;www.glassdoor.com&lt;/a&gt;.
Check if someone has posted reviews about the company. Number may not be
reliable but if there is a general trend of low numbers and bad reviews, that is
a clear RED flag&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Interview Process&lt;/b&gt;:
The complete interview process is about selecting\rejecting a candidate. The
company assess a prospective candidate through these interviews. What we may not
realize is that, other way round is also true. Interviewing is a good time for
us to judge the company as well. While interactive with the company employees
we can get a fair idea about their talent base, their culture. Some of the
things that should make you circumspect&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Having things
too easy&lt;/b&gt;: A good company tried to push the candidate to his limits. They don&#39;t
want to make things easy for you. Always strive to work with people who are
smarter than you. If the interview was too easy for you that may mean you are over
qualified for the job.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Having Single
Technical Round&lt;/b&gt;: Unless you are directly interview by Director, CEO, CTO etc,
single technical round selection is strictly no no.Good companies do not rely
on single person feedback. The more the merrier.&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
This is what I have currently. I would continue to update this list over time. I want this list to be exhaustive collection of tips\links that highlights what to check for in ones prospective employer.&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;MsoNormal&quot; style=&quot;text-align: justify;&quot;&gt;
&lt;ul&gt;&lt;ul&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1898436185573794807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1898436185573794807' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1898436185573794807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1898436185573794807'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/04/so-you-got-job-offer.html' title='So you got a job offer !!!'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiXILWP45DGf-psYGtSpDEf_FRFEiGyyiYC23ArxxOVAB1csngmnL0sq8TPM_Lscx1DQl2UGOOsli3IXJRQ6Pv03cC9JRMOoNRsY87Q-GI3zpXirgIkNOwUeia8ghDyIMt9BUh9cg/s72-c/Job-Offer-Acceptance-Letter-400x361.jpg" height="72" width="72"/><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142614000000002 78.170814000000007 17.627474 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-6197013745410138511</id><published>2012-03-26T12:17:00.000+05:30</published><updated>2012-03-26T12:46:46.722+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Error"/><category scheme="http://www.blogger.com/atom/ns#" term="Installer"/><category scheme="http://www.blogger.com/atom/ns#" term="Iron Foundry"/><category scheme="http://www.blogger.com/atom/ns#" term="IronFoundry"/><category scheme="http://www.blogger.com/atom/ns#" term="VMC"/><title type='text'>Case of missing Iron Foundry VMC client</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
While installing the latest &lt;a href=&quot;http://ironfoundry.org/&quot; target=&quot;_blank&quot;&gt;Iron Foundry&lt;/a&gt; VMC client and Cloud Foundry Explorer there is an installation issue. Due to this VMC client install gets lost if both the VMC Client and CF Explorer are installed irrespective of the location of the install. &lt;br /&gt;
&lt;br /&gt;
As it turns out, if you install VMC client first and CF Explorer next, installer would delete the VMC install directory.&lt;br /&gt;
&lt;br /&gt;
If you install CF Explorer first and try to install VMC client later you get this error &lt;br /&gt;
&lt;br /&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
&quot;This version or newer version of VMC Command Line Tool is already installed.&quot;&amp;nbsp;&lt;/blockquote&gt;
&lt;br /&gt;
Current workaround would be copy the installed folder for VMC before starting CF Explorer install.&lt;br /&gt;
&lt;br /&gt;
Hope it helps.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/6197013745410138511/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/6197013745410138511' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/6197013745410138511'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/6197013745410138511'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/03/iron-foundry-vmc-installer-error.html' title='Case of missing Iron Foundry VMC client'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-2480828411194812398</id><published>2012-03-25T19:12:00.001+05:30</published><updated>2012-10-01T17:55:50.256+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="data modeling"/><category scheme="http://www.blogger.com/atom/ns#" term="database"/><category scheme="http://www.blogger.com/atom/ns#" term="document database"/><category scheme="http://www.blogger.com/atom/ns#" term="mongodb"/><category scheme="http://www.blogger.com/atom/ns#" term="nosql"/><title type='text'>NoSQL Data Modelling</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Recently in one of the project we planned to use some &lt;a href=&quot;https://en.wikipedia.org/wiki/NoSQL&quot; target=&quot;_blank&quot;&gt;NoSQL&lt;/a&gt;&amp;nbsp; &lt;a href=&quot;http://ayende.com/blog/4459/that-no-sql-thing-document-databases&quot; target=&quot;_blank&quot;&gt;Document database&lt;/a&gt;. One of the reasons we though document database would be a great fit was that we could get started without setting up any DB schema and start shoving entities into the document database.&lt;/div&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
Nothing can be further from the truth. Data modeling is as essential and as fundamental an exercise for NoSQL stores as it is for RDBMS. It is just that the concepts are different as compared to RDBMS where &lt;a href=&quot;https://en.wikipedia.org/wiki/Database_normalization&quot; target=&quot;_blank&quot;&gt;normalization\de-normalization&lt;/a&gt; provide some guidance. In my pursuit to understand how to model data for a document database i came across some great reference material that i want to share here.&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/Schema+Design&quot; target=&quot;_blank&quot;&gt;MongoDB Schema Design&lt;/a&gt; : Great resource from MongoDB. Start with this one first.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.fiesta.cc/post/11319522700/walkthrough-mongodb-data-modeling&quot; target=&quot;_blank&quot;&gt;MongoDB Data Modeling&lt;/a&gt;: A quick read but explains some important concepts related to modelling. Embedding vs Linking.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.mongodb.org/display/DOCS/MongoDB+Data+Modeling+and+Rails&quot; target=&quot;_blank&quot;&gt;MongoDB Data Modeling and Rails&lt;/a&gt;: Covers an example to make things more clear.&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/&quot; target=&quot;_blank&quot;&gt;NoSQL Data Modelling Techniques&lt;/a&gt;: A great post that explains about data modelling techniques for all NoSQL type stores.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div style=&quot;text-align: justify;&quot;&gt;
I believe this is enough content for one to have a decent understanding on the topic and get going with the real modeling.&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/2480828411194812398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/2480828411194812398' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2480828411194812398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/2480828411194812398'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/03/nosql-data-modelling.html' title='NoSQL Data Modelling'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-689244679226735046</id><published>2012-03-13T18:27:00.001+05:30</published><updated>2012-03-13T20:08:01.549+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Architecture"/><category scheme="http://www.blogger.com/atom/ns#" term="GET"/><category scheme="http://www.blogger.com/atom/ns#" term="HTTP"/><category scheme="http://www.blogger.com/atom/ns#" term="POST"/><category scheme="http://www.blogger.com/atom/ns#" term="REST"/><category scheme="http://www.blogger.com/atom/ns#" term="WCF"/><category scheme="http://www.blogger.com/atom/ns#" term="Web Services"/><title type='text'>Trying to make sense of REST (over HTTP)</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div&gt;
People who come from WCF/ Web Services background and&amp;nbsp; transition to RESTish type communication infrastructure make mistakes that follow a common pattern. I have seen it with people who are new to REST and with people who have spent some time working with RESTful services. (Throughout the post where every I mention REST I mean REST over HTTP)&amp;nbsp; The common misconceptions&amp;nbsp; are&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Not understanding the difference between HTTP POST and GET, in fact having too little or no clue about HTTP Verbs. For most devs interaction with server involves calling a client proxy method, handling the request on server, sending a response back from server, handling the response on client. This abstraction means no one knows what happens at infrastructure level. When programming for HTTP one cannot ignore the abstraction, else we cannot take full advantage of the medium. &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;The manifestation of the above affect is, either every call becomes a POST or every call becomes a GET. &lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;&lt;ul&gt;
&lt;li&gt;When every call becomes GET. All CRUD are done through url. I have seen people trying to do crazy stuff with urls just to pass data from client to server.&lt;/li&gt;
&lt;li&gt;When every call becomes POST (easy to do as compared to GET) , we fail to leverage the advantages of GET.&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Assuming making HTTP call via GET\POST makes a service RESTful. This is a very common misconception and I too am culprit of thinking the same. But as I read more about REST and looked at examples I realize how far was I from a real RESTful implementation. I highly recommend &lt;a href=&quot;http://amzn.to/A7ujeE&quot; target=&quot;_blank&quot;&gt;REST In Practice&lt;/a&gt; book which is a great resource if one is serious about understanding REST.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Thinking the performance gains comes due to absence of SOAP envelop. The real performance gains come when data gets cached.&amp;nbsp; This caching can occur at different locations starting from the servers network (reverse proxies), intermediaries, client network&amp;nbsp; (proxies) and client browser. &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Creating RESTful service and marking most of GET&#39;s as non cacheable. The common cause of this is not understanding the cache expiration in HTTP and therefore not taking advantage of it.&amp;nbsp; Moreover during debugging cycles cached data is a pain to work with when one wants to test his\her fix.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
These are some of the patterns that are at top of my head. What else can be added?&lt;br /&gt;
&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/689244679226735046/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/689244679226735046' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/689244679226735046'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/689244679226735046'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/03/trying-to-make-sense-of-rest-over-http.html' title='Trying to make sense of REST (over HTTP)'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total><georss:featurename>Hyderabad, Andhra Pradesh, India</georss:featurename><georss:point>17.385044 78.486671</georss:point><georss:box>17.142593 78.170814000000007 17.627495 78.802528</georss:box></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-1683187405665267610</id><published>2012-03-06T11:59:00.000+05:30</published><updated>2012-03-06T11:59:40.167+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud Computing"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud Foundry"/><category scheme="http://www.blogger.com/atom/ns#" term="Iron Foundry"/><category scheme="http://www.blogger.com/atom/ns#" term="IronFoundry"/><category scheme="http://www.blogger.com/atom/ns#" term="PaaS"/><title type='text'>Contrasting Azure and IronFoundry Deployment Behaviour</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
I have been exploring &lt;a href=&quot;http://ironfoundry.org/&quot; target=&quot;_blank&quot;&gt;Iron Foundry&lt;/a&gt; a PaaS player in .Net space for the last few weeks. One of the things I liked about Iron Foundry was, how fast deployments happened. One of the reasons for this is how binary\file package gets uploaded to the cloud infrastructure. The Iron Foundry \ &lt;a href=&quot;http://cloudfoundry.org/&quot; target=&quot;_blank&quot;&gt;Cloud Foundry &lt;/a&gt;approach (since Iron Foundry is port of CF) of only uploading change-set instead of complete binary\file package makes this step of deployment quite fast.&lt;br /&gt;
&lt;br /&gt;
What happens in Azure is &lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;You create a package file (cspkg) using either Visual Studio (VS) or command line tool cspack&lt;/li&gt;
&lt;li&gt;The generated package file contains the complete set of binaries and other resources such as images, css, javasripts etc&amp;nbsp;&lt;/li&gt;
&lt;li&gt;This package is then uploaded to Azure infrastructure and then deployed by the Fabric Controller.&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
In contrast the process that Cloud Foundry follows to decide what it should send to cloud follows a multi-stage process. When an application is ready to be pushed to Cloud Foundry the client and Cloud Foundry servers perform a number of steps to make sure only the required amount of binaries\files are uploaded. These steps include&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Creating a metadata file.This metadata file contains Application Name, Url, Framework, Runtime, Instance Required, Memory reservation (this is similar to Azure configuration files cscfg)&lt;/li&gt;
&lt;/ul&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Look at components (Decide what gems, libraries, npms, etc. are used in preparation for the next step.)&lt;/li&gt;
&lt;li&gt;File based Fingerprinting (This is where a Manifest of files is built along with a SHA-1 hash associated with that file).&lt;/li&gt;
&lt;li&gt;Send manifest to Cloud Foundry&lt;/li&gt;
&lt;li&gt;The Cloud Foundry then responds with a manifest. This manifest lists only the files that Cloud Foundry needs, not all of the files that make up the application.&lt;/li&gt;
&lt;li&gt;The client based on the manifest response creates a packages (compressed) which contains only the files that have changes.&lt;/li&gt;
&lt;li&gt;The client then uploads the package&amp;nbsp; &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
If you compare the process above the optimization that Cloud Foundry does as compared to Azure reduces the deployment time considerably.&lt;br /&gt;
&lt;br /&gt;
With Azure I have time and again faced issues where we miss some file\code fixed and that required us to upload the complete package again. Imagine doing it for package of 200MB+ size on a slow network. &lt;br /&gt;
&lt;br /&gt;
Windows Azure has improved this process a bit by supporting &lt;a href=&quot;https://www.iis.net/download/webdeploy&quot; target=&quot;_blank&quot;&gt;Web Deploy&lt;/a&gt;. This allows us to do incremental\differential upgrades as supported by Web Deploy model. But this approach again has it&#39;s own set of limitations as detailed &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/ff683672.aspx&quot; target=&quot;_blank&quot;&gt;here.&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
This posts only talks about the packaging and upload process for Azure and Cloud Foundry. If you want to know more about how Cloud Foundry deployment works look at these posts&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;The client Part: &lt;a href=&quot;http://blog.cloudfoundry.com/post/4737632136/what-happens-when-you-vmc-push-an-application-to-cloud-foundry&quot;&gt;http://blog.cloudfoundry.com/post/4737632136/what-happens-when-you-vmc-push-an-application-to-cloud-foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;The server part: &lt;a href=&quot;http://blog.cloudfoundry.com/post/5223861703/how-cloud-foundry-works-when-a-new-application-is-deployed&quot;&gt;http://blog.cloudfoundry.com/post/5223861703/how-cloud-foundry-works-when-a-new-application-is-deployed&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
All in all Azure can still improve this part of their deployment process to reap good performance benefits and improve development experience. &lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/1683187405665267610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/1683187405665267610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1683187405665267610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/1683187405665267610'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/03/contrasting-azure-and-ironfoundry.html' title='Contrasting Azure and IronFoundry Deployment Behaviour'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20117988.post-6222616940636555596</id><published>2012-03-03T11:23:00.001+05:30</published><updated>2012-07-22T14:48:14.068+05:30</updated><category scheme="http://www.blogger.com/atom/ns#" term="Appharbor"/><category scheme="http://www.blogger.com/atom/ns#" term="Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud"/><category scheme="http://www.blogger.com/atom/ns#" term="Cloud Computing"/><category scheme="http://www.blogger.com/atom/ns#" term="IronFoundry"/><category scheme="http://www.blogger.com/atom/ns#" term="Nerddinner"/><category scheme="http://www.blogger.com/atom/ns#" term="PaaS"/><title type='text'>Nerddinner on Appharbor</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
My &lt;a href=&quot;http://chandermani.blogspot.in/2012/02/porting-nerddinner-on-ironfoundry.html&quot; target=&quot;_blank&quot;&gt;last exercise&lt;/a&gt; on deploying &lt;a href=&quot;http://nerddinner.codeplex.com/&quot; target=&quot;_blank&quot;&gt;Nerddinner &lt;/a&gt;on &lt;a href=&quot;http://ironfoundry.org/&quot; target=&quot;_blank&quot;&gt;IronFoundry &lt;/a&gt;helped me a lot to understand the platforms capabilities. Time to do the same thing on &lt;a href=&quot;http://www.appharbor.com/&quot; target=&quot;_blank&quot;&gt;AppHarbor&lt;/a&gt;, another PaaS player in .Net space. AppHarbor tries to emulate &lt;a href=&quot;http://www.heroku.com/&quot; target=&quot;_blank&quot;&gt;Heroku &lt;/a&gt;in .Net space. They are the &#39;&lt;i&gt;Azure done right&lt;/i&gt; &#39; brigade. &lt;br /&gt;
&lt;br /&gt;
As a developer I just needs to push code either to AppHarbor or some of the supported repositories such as CodePlex, GitHub, BitBucket and AppHarbor does the rest. &lt;span id=&quot;goog_771315216&quot;&gt;&lt;/span&gt;AppHarbor&lt;span id=&quot;goog_771315217&quot;&gt;&lt;/span&gt;&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Builds the code.&lt;/li&gt;
&lt;li&gt;Runs unit tests&lt;/li&gt;
&lt;li&gt;Deploys the application on AppHarbor’s application servers (backed by &lt;a href=&quot;http://aws.amazon.com/ec2/&quot; target=&quot;_blank&quot;&gt;Amazon EC2&lt;/a&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Other than that it also provides all the standard benefits as provided by most PaaS players.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
To gain first hand experience on AppHarbor I decided to port Nerddinner onto AppHarbor. I already had the Nerddinner codebase in github so i could start right away.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Creating Account&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
The first step was to register my account with AppHarbor. Once registration is complete we get a single instance under the free tier. That was good enough for me to complete this exercise.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Linking to Repository&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
To use the AppHarbor infrastructure I had to link my github project with my AppHarbor account.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
The first step here is to create an application from the AppHarbor dashboard.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRRvejCOr7UzXelzvhi-4nlT_oD9PM550Opbx8mm0o2vY_6SIoG0_p6sDmWABWVwtCxpQg-EsG2-Q6gS1-D5TCJUbMgp7ZL5rwJy44DUJMS0ehWpPmqcv85BURF6V-0NckCYc5Q/s1600/CreateApplication.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;124&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRRvejCOr7UzXelzvhi-4nlT_oD9PM550Opbx8mm0o2vY_6SIoG0_p6sDmWABWVwtCxpQg-EsG2-Q6gS1-D5TCJUbMgp7ZL5rwJy44DUJMS0ehWpPmqcv85BURF6V-0NckCYc5Q/s640/CreateApplication.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Then link that application with the code repository (github in my case). I would not detail this process here as details are already available on AppHarbor. Things to note here are&lt;/div&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;AppHarbor repository are Git based repositories. Therefore if you plan to use AppHarbor repository you need to setup you git account locally, More details are available &lt;a href=&quot;http://support.appharbor.com/kb/getting-started/deploying-your-first-application-using-git&quot; target=&quot;_blank&quot;&gt;here&lt;/a&gt;&amp;nbsp;&lt;/li&gt;
&lt;li&gt;If you are using a third party repository such as CodePlex, GitHub or BitBucket you can look into the respecitve guides to help you integrate with you AppHarbor account.The guides are available at&lt;/li&gt;
&lt;ul&gt;
&lt;li&gt;BitBucket: &lt;a href=&quot;http://support.appharbor.com/kb/api/integrating-with-bitbucket&quot;&gt;http://support.appharbor.com/kb/api/integrating-with-bitbucket&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Codeplex:&amp;nbsp; &lt;a href=&quot;http://support.appharbor.com/kb/api/integrating-with-codeplex&quot;&gt;http://support.appharbor.com/kb/api/integrating-with-codeplex&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;GitHub: &lt;a href=&quot;http://blog.appharbor.com/2011/10/13/announcing-github-support&quot;&gt;http://blog.appharbor.com/2011/10/13/announcing-github-support&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/ul&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
In my case since I was using my public github repository, hence went ahead and configured the link between my github repo and AppHarbor.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Deploying the Application&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
This is where AppHarbor shines.&lt;br /&gt;
&lt;br /&gt;
I made some changes to my app on the local clone and pushed the changes to my remote github repository.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
I went back to my dashboard on AppHarbor and I could see the application being built.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
It failed for me for the first time due to some missing file but I was able to fix is promptly.&lt;/div&gt;
&lt;blockquote class=&quot;tr_bq&quot;&gt;
AppHarbor makes the build logs available for every build performed. These logs can come in handy while debugging the build failures.&lt;/blockquote&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
I did a remote push again and the build kicked it again, this time succeeding. I fired the browser and navigated to the application &lt;a href=&quot;http://nerddinner-4.apphb.com/&quot;&gt;http://nerddinner-4.apphb.com&lt;/a&gt; to verify the deployment. Nerddinner was up and running.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
Not it was time for database integration.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Database Deployment&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Nerddinner requires SQL Server to store its data and therefore I had to provision a SQL Server instance in AppHarbor.&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
AppHarbor provides free shared SQL Server instance add-on with 20 MB storage. That was enough for me to get started. I provisioned my SQL Server from AppHarbor addon page&amp;nbsp;&lt;a href=&quot;https://appharbor.com/applications/nerddinner-4/addons&quot;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
Once provisioned the next step was to get the details of the new SQL Server instance. These details can be easily retrieved from the application dashboard. More details are available later in the post.&lt;br /&gt;
&lt;br /&gt;
Since AppHarbor SQL Server instance is exposed to internet, I was able to connect to it from SQL Management Studio and execute the scripts for Nerddinner and aspnet DB (part of code-base).&lt;br /&gt;
&lt;br /&gt;
Database was ready, application was up and running. Now was the time to link these two pieces&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;Linking Database to Application&lt;/span&gt;&lt;/b&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
In AppHarbor this linkage is achieved through Configuration Variables (CV). CV are variable defined for each application in AppHarbor. Once defined the variable names are matched with appsettings key names in configuration file (web.config) and value replacement done during deployment.&lt;br /&gt;
&lt;br /&gt;
The following Configuration Variables are created automatically when SQL Server instance is provisioned&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wOv7k_1qxsVOKU8e38o868MEv95e6AZQGxcu3ti9j8BOiftmqM0ZeWXKTrQoG0rdye8GDMdPcikdlHKm-PSTOQY5egModvvlgqxTifjPfhC6pq6OXMkULm5T-8_2-WLRwuj0Hw/s1600/ConfigurationVariables.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;80&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEj3wOv7k_1qxsVOKU8e38o868MEv95e6AZQGxcu3ti9j8BOiftmqM0ZeWXKTrQoG0rdye8GDMdPcikdlHKm-PSTOQY5egModvvlgqxTifjPfhC6pq6OXMkULm5T-8_2-WLRwuj0Hw/s400/ConfigurationVariables.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
Variable &lt;i&gt;SQLSERVER_CONNECTION_STRING_ALIAS&lt;/i&gt; is of interest to us. The value of this variable determines which connectionstring (in our config file) would be replaced by the value of variable &lt;i&gt;SQLSERVER_CONNECTION_STRING&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
Nerddinner config file has two connection strings &#39;&lt;i&gt;NerdDinners&lt;/i&gt;&#39; and &#39;&lt;i&gt;ApplicationServices&lt;/i&gt;&#39;. Since I had just one database and just one variable replacement available I had to ignore one of the connection string (&#39;&lt;i&gt;ApplicationServices&lt;/i&gt;&#39; in this case). &lt;br /&gt;
&lt;br /&gt;
I achieved this using &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/dd465326.aspx&quot; target=&quot;_blank&quot;&gt;Config transformations&lt;/a&gt;. Since AppHarbor builds the solution in Release mode (currently no other mode supported) and also supports configuration transformations. I updated web.release.config with the correct transformations.&lt;br /&gt;
&lt;br /&gt;
On AppHarbor front I had to set the &lt;i&gt;SQLSERVER_CONNECTION_STRING_ALIAS&lt;/i&gt; value to ‘&lt;i&gt;NerdDinners&lt;/i&gt;’ to achieve the desired linkage.&amp;nbsp; The above variable is not directly editable from the Configuration Variables interface and requires one to dwell into the SQL Server add-on configuration.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Here is how this is done&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Go to the application dashboard and click “SQL Server” add-on link&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlEKM6YkdmP6X1p8UIaZDgaaROUT6PrhY6ixH0QIpI0cqFgiza51kzDB7wHumbAvfWmQOuTiMObmzO9g4Ubj-kVcRKGij3Imq-ovzHoYxpXVE2f9VK8m65rYB4rOVEWHwDrks5tA/s1600/SQL+Server+Addon.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;306&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjlEKM6YkdmP6X1p8UIaZDgaaROUT6PrhY6ixH0QIpI0cqFgiza51kzDB7wHumbAvfWmQOuTiMObmzO9g4Ubj-kVcRKGij3Imq-ovzHoYxpXVE2f9VK8m65rYB4rOVEWHwDrks5tA/s640/SQL+Server+Addon.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Click ‘Go to SQL Server’ link on the subsequent page.&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_y7lA9Ge9awI2Cxm4RLhx_tgrrReHvIk-MaHfTPfxS_OJ4XzUjAxmJniLTf4PbK06hcwSK4qKGDx1bhZhS4Pqmx8nywMoMF9K8ukRkNWVINZt2jRTeFXyNsDmxn-iKduRb7alw/s1600/GotoSqlServer.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;77&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiV_y7lA9Ge9awI2Cxm4RLhx_tgrrReHvIk-MaHfTPfxS_OJ4XzUjAxmJniLTf4PbK06hcwSK4qKGDx1bhZhS4Pqmx8nywMoMF9K8ukRkNWVINZt2jRTeFXyNsDmxn-iKduRb7alw/s400/GotoSqlServer.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;This brings up the details for the provisioned SQL Server. Here we can change the alias&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkt5MuttDC5Hb9hoNoOPXan7OqM1-RYaDzHpkSEznHYVeTP6Xybdjod1VSGWfolT1yeKCCxtjMKKlgTrUOoJMVklvqOlyFzr8OEFy68GrQr-WX44SM2_ilZAWQXJGcTC5XzEhaGg/s1600/UpdateAlias.png&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;102&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhkt5MuttDC5Hb9hoNoOPXan7OqM1-RYaDzHpkSEznHYVeTP6Xybdjod1VSGWfolT1yeKCCxtjMKKlgTrUOoJMVklvqOlyFzr8OEFy68GrQr-WX44SM2_ilZAWQXJGcTC5XzEhaGg/s400/UpdateAlias.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Once I had changed my alias, I pushed my config changes to remote repository and automatic build process kicked in. The site was updated within a matter of seconds and I had a fully functional Nerddinner up and running.&lt;br /&gt;
&lt;br /&gt;
The site is available here &lt;a href=&quot;http://nerddinner-4.apphb.com/&quot;&gt;http://nerddinner-4.apphb.com/&lt;/a&gt; The code base is available here &lt;a href=&quot;https://github.com/chandermani/NerdDinner70027&quot;&gt;https://github.com/chandermani/NerdDinner70027&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div style=&quot;font-family: &amp;quot;Trebuchet MS&amp;quot;,sans-serif;&quot;&gt;
&lt;b&gt;Final Thought&lt;/b&gt;&lt;/div&gt;
&lt;br /&gt;
I &lt;a href=&quot;http://chandermani.blogspot.in/2012/02/porting-nerddinner-on-ironfoundry.html&quot; target=&quot;_blank&quot;&gt;recently deployed&lt;/a&gt; Nerddinner on IronFoundry, and now on AppHarbor. If you look at developer friendliness, AppHarbor wins hands down. The integration with code repository, easy\fast deployment, add-on services are some of the highlights of AppHarbor. Its deployment model is much superior to Windows Azure and Azure team can take some learning out of AppHarbor experience.&lt;br /&gt;
&lt;br /&gt;
AppHarbor provides its infrastructure on per month rather than per hour billing. The same is true for AppHarbor add-ons too.&lt;br /&gt;
&lt;br /&gt;
&lt;i&gt;&lt;b&gt;Update:&lt;/b&gt; As Rune commented&amp;nbsp; &#39;AppHarbor actually prorates the monthly infrastructure and add-on prices  down to the millisecond, so you only pay for the time you use it (even  more fine-grained than EC2) &#39;&lt;/i&gt;&lt;br /&gt;
&lt;br /&gt;
IronFoundry still is in its nascent stage and a direct comparison would be unfair. Since IronFoundry is open source there is an opportunity to incorporate the good parts of AppHarbor and Windows Azure into IronFoundry platform.&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://chandermani.blogspot.com/feeds/6222616940636555596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/20117988/6222616940636555596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/6222616940636555596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20117988/posts/default/6222616940636555596'/><link rel='alternate' type='text/html' href='http://chandermani.blogspot.com/2012/03/nerddinner-on-appharbor.html' title='Nerddinner on Appharbor'/><author><name>Unknown</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='https://img1.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjCRRvejCOr7UzXelzvhi-4nlT_oD9PM550Opbx8mm0o2vY_6SIoG0_p6sDmWABWVwtCxpQg-EsG2-Q6gS1-D5TCJUbMgp7ZL5rwJy44DUJMS0ehWpPmqcv85BURF6V-0NckCYc5Q/s72-c/CreateApplication.png" height="72" width="72"/><thr:total>0</thr:total></entry></feed>