<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link rel="hub" href="http://tumblr.superfeedr.com/" xmlns:atom="http://www.w3.org/2005/Atom"/><description>…. technology, business, technology in business, business in technology and more ….</description><title>Yatendra Khandelwal</title><generator>Tumblr (3.0; @yatendra1)</generator><link>http://yatendra.com/</link><item><title>Easy tricks for improving performance of an ASP.Net MVC site</title><description>&lt;p&gt;When creating an app in ASP.Net MVC and using IIS 7 to host it, there are some easy tricks that can be used to improve its performance. I have used these in Live Post &lt;a href="http://livepost.in" target="_blank"&gt;http://livepost.in&lt;/a&gt; which is a news aggregator for India related news. A few of these suggestions might not be helpful for enterprise apps that are highly transactional and displaying latest data is more important than displaying 10 min old data but displaying it very fast.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1.  Enable caching static files&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Doing this tells browsers that they can cache specified files and don&amp;#8217;t need to download them from the server again when needed. To do this add following in web.config file&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;  &amp;lt;system.webServer&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;caching&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;profiles&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;add extension=&amp;#8221;.gif&amp;#8221; policy=&amp;#8221;CacheUntilChange&amp;#8221; kernelCachePolicy=&amp;#8221;DontCache&amp;#8221; location=&amp;#8221;Client&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;add extension=&amp;#8221;.jpg&amp;#8221; policy=&amp;#8221;CacheUntilChange&amp;#8221; kernelCachePolicy=&amp;#8221;DontCache&amp;#8221; location=&amp;#8221;Client&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;add extension=&amp;#8221;.png&amp;#8221; policy=&amp;#8221;CacheUntilChange&amp;#8221; kernelCachePolicy=&amp;#8221;DontCache&amp;#8221; location=&amp;#8221;Client&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;add extension=&amp;#8221;.css&amp;#8221; policy=&amp;#8221;CacheUntilChange&amp;#8221; kernelCachePolicy=&amp;#8221;DontCache&amp;#8221; location=&amp;#8221;Client&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;add extension=&amp;#8221;.js&amp;#8221; policy=&amp;#8221;CacheUntilChange&amp;#8221; kernelCachePolicy=&amp;#8221;DontCache&amp;#8221; location=&amp;#8221;Client&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;/profiles&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/caching&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;staticContent&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;clientCache cacheControlCustom=&amp;#8221;public&amp;#8221; cacheControlMaxAge=&amp;#8221;30.00:00:00&amp;#8221; cacheControlMode=&amp;#8221;UseMaxAge&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/staticContent&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/system.webServer&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;2. Enable compression&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;GZip compression is supported by all modern browser. Enabling GZip compression reduces transfer size and thus reducing the latency. This can be done simply by adding following in web.config file - &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;  &amp;lt;system.webServer&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;urlCompression doDynamicCompression=&amp;#8221;true&amp;#8221; doStaticCompression=&amp;#8221;true&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;httpCompression dynamicCompressionEnableCpuUsage=&amp;#8221;80&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;staticContent&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;remove fileExtension=&amp;#8221;.js&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;mimeMap fileExtension=&amp;#8221;.js&amp;#8221; mimeType=&amp;#8221;text/javascript&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/staticContent&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/system.webServer&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;3. Enable keep alive&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This keeps the http connection open for future requests from same session and thus saving round trip time (RTT) and time spent in opening and closing connections. It can be done by adding following code in web.config file - &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;  &amp;lt;system.webServer&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;httpProtocol allowKeepAlive=&amp;#8221;true&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;  &amp;lt;/system.webServer&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;4. Output caching&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This might not be suitable to enterprise apps where displaying latest transactional  data is more important then displaying few min old data very fast. To do this define a profile by adding following xml snippet in web.config file and associate that profile with any action as follows - &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt; &amp;lt;system.web&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;caching&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;outputCacheSettings&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;outputCacheProfiles&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;clear /&amp;gt;&lt;/p&gt;
&lt;p&gt;          &amp;lt;add name=&amp;#8221;MyCacheProfile&amp;#8221; duration=&amp;#8221;300&amp;#8221; /&amp;gt;&lt;/p&gt;
&lt;p&gt;        &amp;lt;/outputCacheProfiles&amp;gt;&lt;/p&gt;
&lt;p&gt;      &amp;lt;/outputCacheSettings&amp;gt;&lt;/p&gt;
&lt;p&gt;    &amp;lt;/caching&amp;gt;&lt;/p&gt;
&lt;p&gt;&amp;lt;system.web&amp;gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;blockquote&gt;
&lt;p&gt;        [OutputCache(CacheProfile = &amp;#8220;MyCacheProfile&amp;#8221;)]&lt;/p&gt;
&lt;p&gt;        public ActionResult Index()&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            &amp;#8230;.&lt;/p&gt;
&lt;p&gt;            return View();&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;strong&gt;5. Refreshing cache in background thread&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This can only be applied where there is finite and know set of items that need to be cached. For example in live post there is a caching layer between database and app server and there is fixed number of news categories and subcategories. In the app I run a thread in the background that refreshes the in memory cache with data for these news categories. To avoid using threading code I have used CacheItemRemovedCallback provided by HttpRuntime.Cache to get a call back after  specified interval and refresh the cache on receiving callback. It all starts on Applicaiton_Start() method in Global.asax file that is called when the application starts in the web server.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;protected void Application_Start()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;       &amp;#8230;..&lt;/p&gt;
&lt;p&gt;       RegisterCallback();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private void RegisterCallback()&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;            HttpRuntime.Cache.Add(&amp;#8220;expiryKey&amp;#8221;, &amp;#8220;any value&amp;#8221;, null, DateTime.MaxValue, TimeSpan.FromMilliseconds(60000), CacheItemPriority.Normal, new CacheItemRemovedCallback(MyCallback));&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;p&gt;private void MyCallback(string key, object value, CacheItemRemovedReason reason)&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;            RefreshCache();&lt;/p&gt;
&lt;p&gt;            RegisterCallback();&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://yatendra.com/post/22202914929</link><guid>http://yatendra.com/post/22202914929</guid><pubDate>Wed, 02 May 2012 13:01:00 -0400</pubDate></item><item><title>Handling sub-domains in ASP.Net MVC</title><description>&lt;p&gt;In &lt;a href="http://yatendra.github.com/saasapp" title="SaasApp" target="_blank"&gt;SaasApp&lt;/a&gt; which is framework for mulituser-multitenant SAAS framework for ASP.Net MVC, what I wanted was that when user types the url without a subdomain my app should display the website where user can get details about the product and plans, select a plan and register an account (in this post account refers to say a company that can have multiple users) with selected plan. Once an account is created their users should be able to go to their selected subdomain like myaccount.[SAAS app domain].com, login and access the product. I wanted the subbdomain &amp;#8220;myaccount&amp;#8221; to be forwarded as a parameter to required actions in the controller to identify the account I am dealing with. &lt;/p&gt;
&lt;p&gt;Demo: &lt;a href="http://saasapp.yatendra.com" title="SaasApp" target="_blank"&gt;&lt;a href="http://saasapp.yatendra.com" target="_blank"&gt;http://saasapp.yatendra.com&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ASP.Net MVC has a sophisticated and flexible routing mechanism. It allows developers to create their own customized routing system by extending RouteBase class and providing your own implementation of GetRouteData(HttpContextBase) function.&lt;/p&gt;
&lt;p&gt;Following is what I have used - &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Web;&lt;/p&gt;
&lt;p&gt;using System.Web.Mvc;&lt;/p&gt;
&lt;p&gt;using SaasApp.Utility;&lt;/p&gt;
&lt;p&gt;namespace System.Web.Routing&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;    public class DomainRoute&amp;#160;: RouteBase&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        public override RouteData GetRouteData(HttpContextBase httpContext)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;    //get subdomain, the string before first dot in the url&lt;/p&gt;
&lt;p&gt;            string subdomain = UtilityHelper.GetSubdomain(httpContext.Request.Headers[&amp;#8220;HOST&amp;#8221;]);&lt;/p&gt;
&lt;p&gt;            RouteData routeData = new RouteData(this, new MvcRouteHandler());&lt;/p&gt;
&lt;p&gt;            if (!string.IsNullOrEmpty(subdomain))&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;//url has subdomain&lt;/p&gt;
&lt;p&gt;                routeData.Values.Add(&amp;#8220;account&amp;#8221;, subdomain);&lt;/p&gt;
&lt;p&gt;                string filepath = httpContext.Request.FilePath;&lt;/p&gt;
&lt;p&gt;                string[] parts = filepath.Split(&amp;#8216;/&amp;#8217;);&lt;/p&gt;
&lt;p&gt;                switch (parts[1].ToLower())&lt;/p&gt;
&lt;p&gt;                {&lt;/p&gt;
&lt;p&gt;                    case &amp;#8220;app&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                        routeData.Values.Add(&amp;#8220;controller&amp;#8221;, &amp;#8220;App&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        if (parts.Length &amp;gt; 2)&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            switch (parts[2].ToLower())&lt;/p&gt;
&lt;p&gt;                            {&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;index&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;about&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;About&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                default:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                            }&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        else&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        break;&lt;/p&gt;
&lt;p&gt;                    case &amp;#8220;account&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                        routeData.Values.Add(&amp;#8220;controller&amp;#8221;, &amp;#8220;Account&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        if (parts.Length &amp;gt; 2)&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            switch (parts[2].ToLower())&lt;/p&gt;
&lt;p&gt;                            {&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;login&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Login&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;logout&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Logout&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                            }&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        break;&lt;/p&gt;
&lt;p&gt;                    default:&lt;/p&gt;
&lt;p&gt;                        if (httpContext.Request.IsAuthenticated)&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            httpContext.Response.Redirect(&amp;#8220;/App/Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        httpContext.Response.Redirect(&amp;#8220;/Account/Login&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        break;&lt;/p&gt;
&lt;p&gt;                }&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;            else&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;&lt;span&gt; &lt;/span&gt;//url does not have subdomain&lt;/p&gt;
&lt;p&gt;                string filepath = httpContext.Request.FilePath;&lt;/p&gt;
&lt;p&gt;                string[] parts = filepath.Split(&amp;#8216;/&amp;#8217;);&lt;/p&gt;
&lt;p&gt;                switch (parts[1].ToLower())&lt;/p&gt;
&lt;p&gt;                {&lt;/p&gt;
&lt;p&gt;                    case &amp;#8220;home&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                        routeData.Values.Add(&amp;#8220;controller&amp;#8221;, &amp;#8220;Home&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        if (parts.Length &amp;gt; 2)&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            switch (parts[2].ToLower())&lt;/p&gt;
&lt;p&gt;                            {&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;index&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;plans&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Plans&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;selectplan&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;SelectPlan&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    if (parts.Length &amp;gt; 3)&lt;/p&gt;
&lt;p&gt;                                    {&lt;/p&gt;
&lt;p&gt;                                        routeData.Values.Add(&amp;#8220;planType&amp;#8221;, parts[3]);&lt;/p&gt;
&lt;p&gt;                                    }&lt;/p&gt;
&lt;p&gt;                                    else&lt;/p&gt;
&lt;p&gt;                                    {&lt;/p&gt;
&lt;p&gt;                                        routeData.Values.Add(&amp;#8220;planType&amp;#8221;, &amp;#8220;1&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    }&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;selectaplan&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;SelectAPlan&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;accountcreated&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;AccountCreated&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    if (parts.Length &amp;gt; 3)&lt;/p&gt;
&lt;p&gt;                                    {&lt;/p&gt;
&lt;p&gt;                                        routeData.Values.Add(&amp;#8220;accountName&amp;#8221;, parts[3]);&lt;/p&gt;
&lt;p&gt;                                    }&lt;/p&gt;
&lt;p&gt;                                    else&lt;/p&gt;
&lt;p&gt;                                    {&lt;/p&gt;
&lt;p&gt;                                        routeData.Values.Add(&amp;#8220;accountName&amp;#8221;, &amp;#8220;&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    }&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                case &amp;#8220;about&amp;#8221;:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;About&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                                default:&lt;/p&gt;
&lt;p&gt;                                    routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                                    break;&lt;/p&gt;
&lt;p&gt;                            }&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        else&lt;/p&gt;
&lt;p&gt;                        {&lt;/p&gt;
&lt;p&gt;                            routeData.Values.Add(&amp;#8220;action&amp;#8221;, &amp;#8220;Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        }&lt;/p&gt;
&lt;p&gt;                        break;&lt;/p&gt;
&lt;p&gt;                    default:&lt;/p&gt;
&lt;p&gt;                        httpContext.Response.Redirect(&amp;#8220;/Home/Index&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                        break;&lt;/p&gt;
&lt;p&gt;                }&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;            return routeData;&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            //Implement your formating Url formating here&lt;/p&gt;
&lt;p&gt;            return null;&lt;/p&gt;
&lt;p&gt;        } &lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://yatendra.com/post/13784849508</link><guid>http://yatendra.com/post/13784849508</guid><pubDate>Mon, 05 Dec 2011 13:03:00 -0500</pubDate></item><item><title>Compressing HTML output in ASP.Net / ASP.Net MVC</title><description>&lt;p&gt;Most modern browsers have capability to get output from webservers in compressed form. This reduces number of bytes to be transferred and thus making transmission faster. Browsers that support this functionality specify supported compression type as value of &amp;#8220;Accept-Encoding&amp;#8221; attribute for example &amp;#8220;Accept-Encoding: gzip, deflate&amp;#8221;. &lt;a href="http://en.wikipedia.org/wiki/Gzip" title="gzip" target="_blank"&gt;gzip&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/DEFLATE" title="deflate" target="_blank"&gt;deflate&lt;/a&gt; being two most commonly supported compression types. This can be configured at web server level but if you want to do have a lot of control over we server configuration like in shared hosting environment you can implement IHttpModule and set it up for your application as follows - &lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;using System;&lt;/p&gt;
&lt;p&gt;using System.Collections.Generic;&lt;/p&gt;
&lt;p&gt;using System.Linq;&lt;/p&gt;
&lt;p&gt;using System.Text;&lt;/p&gt;
&lt;p&gt;using System.Web;&lt;/p&gt;
&lt;p&gt;using System.IO.Compression;&lt;/p&gt;
&lt;p&gt;namespace MyPackage&lt;/p&gt;
&lt;p&gt;{&lt;/p&gt;
&lt;p&gt;    public class HttpCompressionModule&amp;#160;: IHttpModule&lt;/p&gt;
&lt;p&gt;    {&lt;/p&gt;
&lt;p&gt;        #region IHttpModule Members&lt;/p&gt;
&lt;p&gt;        void IHttpModule.Dispose()&lt;/p&gt;
&lt;p&gt;        {            &lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        void IHttpModule.Init(HttpApplication context)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            context.PostAcquireRequestState += new EventHandler(context_PostAcquireRequestState);&lt;/p&gt;
&lt;p&gt;            context.EndRequest += new EventHandler(context_EndRequest);&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        void context_EndRequest(object sender, EventArgs e)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            HttpApplication context = sender as HttpApplication;&lt;/p&gt;
&lt;p&gt;            context.PostAcquireRequestState -= new EventHandler(context_PostAcquireRequestState);&lt;/p&gt;
&lt;p&gt;            context.EndRequest -= new EventHandler(context_EndRequest);&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        void context_PostAcquireRequestState(object sender, EventArgs e)&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            this.RegisterCompressFilter();    &lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        private void RegisterCompressFilter()&lt;/p&gt;
&lt;p&gt;        {&lt;/p&gt;
&lt;p&gt;            HttpContext context = HttpContext.Current;&lt;/p&gt;
&lt;p&gt;            if (context.Handler is StaticFileHandler &lt;/p&gt;
&lt;p&gt;                || context.Handler is DefaultHttpHandler) return;&lt;/p&gt;
&lt;p&gt;            HttpRequest request = context.Request;            &lt;/p&gt;
&lt;p&gt;            string acceptEncoding = request.Headers[&amp;#8220;Accept-Encoding&amp;#8221;];&lt;/p&gt;
&lt;p&gt;            if (string.IsNullOrEmpty(acceptEncoding)) return;&lt;/p&gt;
&lt;p&gt;            //if (request.FilePath.EndsWith(&amp;#8220;.ashx&amp;#8221;)) return;&lt;/p&gt;
&lt;p&gt;            if (request.FilePath.Contains(&amp;#8220;.&amp;#8221;))&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;                return;&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;            acceptEncoding = acceptEncoding.ToUpperInvariant();&lt;/p&gt;
&lt;p&gt;            HttpResponse response = HttpContext.Current.Response;&lt;/p&gt;
&lt;p&gt;            if (acceptEncoding.Contains(&amp;#8220;GZIP&amp;#8221;))&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;                response.AppendHeader(&amp;#8220;Content-encoding&amp;#8221;, &amp;#8220;gzip&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;            else if (acceptEncoding.Contains(&amp;#8220;DEFLATE&amp;#8221;))&lt;/p&gt;
&lt;p&gt;            {&lt;/p&gt;
&lt;p&gt;                response.AppendHeader(&amp;#8220;Content-encoding&amp;#8221;, &amp;#8220;deflate&amp;#8221;);&lt;/p&gt;
&lt;p&gt;                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);&lt;/p&gt;
&lt;p&gt;            }&lt;/p&gt;
&lt;p&gt;        }&lt;/p&gt;
&lt;p&gt;        #endregion&lt;/p&gt;
&lt;p&gt;    }&lt;/p&gt;
&lt;p&gt;}&lt;/p&gt;
&lt;/blockquote&gt;</description><link>http://yatendra.com/post/11420993424</link><guid>http://yatendra.com/post/11420993424</guid><pubDate>Thu, 13 Oct 2011 22:12:00 -0400</pubDate><category>ASP.Net MVC</category><category>http</category><category>compression</category></item><item><title>MongoDB @ KhojKhabar</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 7/12/2011)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;
&lt;p&gt;These days NoSQL databases are getting very popular. These databases don&amp;#8217;t have a SQL interface for querying data and a lot of times don&amp;#8217;t store data as collections of rows and tables. &lt;a title="MongoDB" target="_blank" href="http://www.mongodb.org/"&gt;MongoDB&lt;/a&gt; is one such database that stores data in form of BSON(a form of JSON) documents and collections. The data in MongoDB can be queried using a REST API. It has a &lt;a title="MongoDB .Net driver" target="_blank" href="http://www.mongodb.org/display/DOCS/CSharp+Language+Center"&gt;.Net driver available&lt;/a&gt; and there are a couple of hosted MongoDB cloud hosted providers with a free plan so I thought I will try to convert &lt;a title="Khoj Khabar" target="_blank" href="http://khojkhabar.in/"&gt;KhojKhabar&lt;/a&gt; data store from SQLite to MongoDB.&lt;/p&gt;
&lt;p&gt;Out of &lt;a title="MongoHQ" target="_blank" href="http://mongohq.com/"&gt;MongoHQ&lt;/a&gt; and &lt;a title="MongoLab" target="_blank" href="http://mongolab.com/"&gt;MongoLab&lt;/a&gt; I decided to use MongoLab as it allows 240&amp;#160;MB (vs 16&amp;#160;MB by MongoHQ). MongoLab also provides an option to host your MongoDB instance on Amazon or Rackspace cloud. So if your app is hosted on one of these providers you can reduce latency by hosting MongoDB on the same provider. Moving data storage of khojkhabar to MongoDB was not that difficult as the driver usage is like a combination of dataset style programming and fluid function calls (like used in subsonic 2), so someone with experience these can pick it up easily. There is also a good &lt;a title="MongoDB tutorial" target="_blank" href="http://www.mongodb.org/display/DOCS/CSharp+Driver+Tutorial"&gt;tutorial available at MongoDb.org&lt;/a&gt;, which was very helpful. Now the live &lt;a title="Khoj Khabar" target="_blank" href="http://khojkhabar.in/"&gt;khojkhabar&lt;/a&gt; site is using MongoLab as the data store.In khojkhabar right now I store the news data of last 10 days only so I think 240&amp;#160;MB storage quota should be fine for now.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;</description><link>http://yatendra.com/post/11029997229</link><guid>http://yatendra.com/post/11029997229</guid><pubDate>Tue, 04 Oct 2011 16:00:39 -0400</pubDate><category>khojkhabar</category><category>mongodb</category><category>mongolab</category></item><item><title>AppHarbor - Heroku like service for ASP.Net</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 2/17/2011)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;I recently came across &lt;a target="_blank" href="http://www.appharbor.com/"&gt;AppHarbor&lt;/a&gt;. It looks like another interesting startup to come out of  &lt;a target="_blank" href="http://www.ycombinator.com/"&gt;YCombinator&lt;/a&gt;. Its a Heroku like service that builds, runs unit tests and deploys your ASP.Net code for you. It works with Git so to upload the code all you need to do is git push. They provide shared and dedicated databases with option of MS SQL server and MySQL.  Whats cool is that they provide a free application instance per applicaiton. So you pay only if your app grows to need another instance. Now if you need to test or host your next ASP.Net MVC app you know where to go.&lt;/p&gt;
&lt;p&gt;Tonight I plan to play with it and see how it works for an ASP.Net MVC app I have been working on using Subsonic and SQLite. Details later.&lt;/p&gt;</description><link>http://yatendra.com/post/11029920967</link><guid>http://yatendra.com/post/11029920967</guid><pubDate>Tue, 04 Oct 2011 15:58:00 -0400</pubDate><category>appharbor</category><category>asp.net</category></item><item><title>jQuery ListCollapse</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 1/9/2011)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;This plugin is meant to collapse/expand a list of items that grows beyond certain predefined number of items. It filters and collapses a list when data is bound, added or removed. If number of items are more than specified number n it displays first n items and displays an expand(customizable) link. When a user clicks on this link it displays the entire list and changes this link to collapse(customizable).&lt;/p&gt;
&lt;p&gt;&lt;a title="Download listcollapse" target="_blank" href="https://github.com/yatendra/ListCollapse"&gt;Download listcollapse&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(Note: This plugin is based on Collapsorz 1.1 created by &lt;a href="http://jquery.kuzemchak.net/collapsorz.php" target="_blank"&gt;Aaron Kuzemchak&lt;/a&gt;. I have customized it to be able to be called whenever an item is added or removed and some minor modifications is think were required for dynamic list where items are added and removed on the fly)&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-size: 26px;"&gt;Usage&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;$(listelement).listcollapse();&lt;/p&gt;
&lt;p&gt;$(listelement).listcollapse(options);&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-size: 26px;"&gt;Options&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;(All parameters are optional)&lt;/p&gt;
&lt;h3&gt;toggle&lt;/h3&gt;
&lt;p&gt;To select elements that you wish to collapse. By default it will collapse all direct children of the list selected.&lt;/p&gt;
&lt;h3&gt;maximum&lt;/h3&gt;
&lt;p&gt;Maximum number of elements to show. Collapses all items beyond this number. It defaults to 5.&lt;/p&gt;
&lt;h3&gt;showText&lt;/h3&gt;
&lt;p&gt;Text to be shown for the expand link. It defaults to Show.&lt;/p&gt;
&lt;h3&gt;hideText&lt;/h3&gt;
&lt;p&gt;Text to be shown for the collapse link. It defaults to Hide.&lt;/p&gt;
&lt;h3&gt;linkLocation&lt;/h3&gt;
&lt;p&gt;Whether to display expand/collapse link before or after the selected list. You can choose one of the following settings:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;after&lt;/strong&gt;—Places the link after the list. This is the default setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;before&lt;/strong&gt;—Places the link before the list.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;defaultState&lt;/h3&gt;
&lt;p&gt;Whether the list should be displayed expanded or collapsed by default.&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;&lt;strong&gt;collapsed&lt;/strong&gt;—List will be collapsed by default. This is the default setting.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;expanded&lt;/strong&gt;—List will be expanded by default.&lt;/li&gt;
&lt;/ul&gt;&lt;h3&gt;wrapLink&lt;/h3&gt;
&lt;p&gt;HTML to wrap around the link.&lt;/p&gt;</description><link>http://yatendra.com/post/11029732076</link><guid>http://yatendra.com/post/11029732076</guid><pubDate>Tue, 04 Oct 2011 15:53:00 -0400</pubDate><category>jquery</category></item><item><title>Load balancing</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 12/22/2010)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;
&lt;p&gt;I read an interesting article today about load balancing. Its a must read for anyone looking to scale a website or anyone just simple interested in knowing how these high traffic websites scale on the web server side. This documents explains different ways of doing it like hardware based approach and software based approach. It also explains various related factors like cookie persistence and using SSL certs in load balancing.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.exceliance.fr/en/ART-2006-making%20applications%20scalable%20with%20LB.pdf" target="_blank"&gt;&lt;a href="http://www.exceliance.fr/en/ART-2006-making%20applications%20scalable%20with%20LB.pdf" target="_blank"&gt;http://www.exceliance.fr/en/ART-2006-making%20applications%20scalable%20with%20LB.pdf&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;</description><link>http://yatendra.com/post/11029610118</link><guid>http://yatendra.com/post/11029610118</guid><pubDate>Tue, 04 Oct 2011 15:50:19 -0400</pubDate><category>load balancing</category></item><item><title>Adding a new volume to EC2 linux instance</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 12/22/2010)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;
&lt;p&gt;Our postgres EC2 linux instance ran out of disk space so I had to add another volume to the server. Following is what I did -&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Login to &lt;a href="http://aws.amazon.com" target="_blank"&gt;http://aws.amazon.com&lt;/a&gt; and go to EC2 tab.&lt;/li&gt;
&lt;li&gt;Go to volumes section and create a new volume.&lt;/li&gt;
&lt;li&gt;Enter the size of volume and select the availability zone. I generally skip creating a snapshot unless there is explicit need.&lt;/li&gt;
&lt;li&gt;Once the volume is created and its status is available, select it and click attach button. Select instance id of the instance to which it needs to be associated and map it to /dev/sda2&lt;/li&gt;
&lt;li&gt;Login to the server as root and execute following commands -&lt;/li&gt;
&lt;/ol&gt;&lt;pre&gt;&lt;code&gt;       mkfs -t ext3 /dev/sda2   #dont do it if creating from an existing snapshot
       echo "/dev/sda2  /disk2  ext3     noatime  0 0" &amp;gt;&amp;gt; /etc/fstab
       mkdir /disk2
       mount /disk2
       df -h #you should now see /disk2 as a new volume&lt;/code&gt;&lt;/pre&gt;
&lt;/span&gt;&lt;/p&gt;</description><link>http://yatendra.com/post/11029462001</link><guid>http://yatendra.com/post/11029462001</guid><pubDate>Tue, 04 Oct 2011 15:46:20 -0400</pubDate><category>EBS</category><category>EC2</category></item><item><title>Moving postgres data folder</title><description>&lt;p&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 12/22/2010)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Our postgres server ran out of disk space on our EC2 server so we figured we should move the postgres data folder to a new bigger volume. We created an additional volume mounted to /disk2 and then moved the data folder as follows -&lt;/p&gt;
&lt;p&gt;1. Login to shell as root. Stop the Postgres if running&lt;/p&gt;
&lt;p&gt;$service postgresql-9.0 stop&lt;/p&gt;
&lt;p&gt;2. Copy the data folder to new location&lt;/p&gt;
&lt;p&gt;$cp -R /var/lib/pgsql/9.0/data  /disk2/pgdata/&lt;/p&gt;
&lt;p&gt;3. Modify postgres startup script to point to new data directory&lt;/p&gt;
&lt;p&gt;In  /etc/init.d/postgresql  file,  change the value of  PGDATA  variable to new location  which is /disk2/pgdata/data&lt;/p&gt;
&lt;p&gt;4. Start the db server&lt;/p&gt;
&lt;p&gt;$ service postgresql start&lt;/p&gt;</description><link>http://yatendra.com/post/11029482702</link><guid>http://yatendra.com/post/11029482702</guid><pubDate>Tue, 04 Oct 2011 15:46:00 -0400</pubDate><category>postgres</category></item><item><title>Setting up replication in Postgres 9.0</title><description>&lt;p&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;(Migrated from old wordpress blog post dated 12/22/2010)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;For &lt;a href="http://www.picksie.com/" target="_blank"&gt;picksie&lt;/a&gt; I had to set up streaming replication in Postgres 9.0. We have a master server which is used for read/write and a hot standby where we want the data to updated using streaming replication. Following is a summary of what I did&lt;/p&gt;
&lt;p&gt;1. Install postgres on both master and standby&lt;/p&gt;
&lt;p&gt;2. Allow standby server to connect to the master by editing pg_hba.conf&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;host replication postgres 192.168.0.20/22 trust&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;3. Setup streaming on master by updating postgresql.conf&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;wal_level = hot_standby&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;max_wal_senders = 5&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;wal_keep_segments = 32&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;archive_mode = on&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;archive_command = &amp;#8216;cp %p /path_to/archive/%f&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;4. Start postgres on master&lt;/p&gt;
&lt;p&gt;5. Make base backup on master&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;$ psql -c &amp;#8220;SELECT pg_start_backup(&amp;#8216;label&amp;#8217;, true)&amp;#8221;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;$ rsync -a ${PGDATA}/ standby:/srv/pgsql/standby/ &amp;#8212;exclude postmaster.pid&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;$ psql -c &amp;#8220;SELECT pg_stop_backup()&amp;#8221;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;6. Do authentication and streaming related configuration in postgresql.conf and pg_hba.conf in standby server so that when needed it can be promoted as master with less effort.&lt;/p&gt;
&lt;p&gt;7. Set standby server as a hot standby by updating postgresql.conf&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;hot_standby = on&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;8. Create recovery.conf with following configuration on standby server in same folder as postgresql.conf&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;standby_mode = &amp;#8216;on&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;primary_conninfo = &amp;#8216;host=192.168.0.10 port=5432 user=postgres&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;trigger_file = &amp;#8216;/path_to/trigger&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;span data-mce-style="font-family: Consolas, Monaco, 'Courier New', Courier, monospace; line-height: 13px; font-size: 12px; white-space: pre;"&gt;restore_command = &amp;#8216;cp /path_to/archive/%f &amp;#8220;%p&amp;#8221;&amp;#8217;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;Note: trigger file is the file, presence of which will make the standby server to stop replication and failover&lt;/p&gt;
&lt;p&gt;9. Start postgres service on standby and it will start replication&lt;/p&gt;
&lt;p&gt;Reference: &lt;a href="http://wiki.postgresql.org/wiki/Streaming_Replication" target="_blank"&gt;&lt;a href="http://wiki.postgresql.org/wiki/Streaming_Replication" target="_blank"&gt;http://wiki.postgresql.org/wiki/Streaming_Replication&lt;/a&gt;&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;$ $EDITOR postgresql.conf

listen_addresses = '192.168.0.10'

$ $EDITOR pg_hba.conf

# The standby server must have superuser access privileges.
host  replication  postgres  192.168.0.20/22  trust&lt;/pre&gt;</description><link>http://yatendra.com/post/11029324780</link><guid>http://yatendra.com/post/11029324780</guid><pubDate>Tue, 04 Oct 2011 15:42:00 -0400</pubDate><category>postgres</category><category>replication</category></item><item><title>Interesting projects at work</title><description>&lt;p&gt;&lt;span&gt;
&lt;p&gt;(Migrated from old wordpress blog post dated 9/21/2010)&lt;/p&gt;
&lt;p&gt;Cloud, iPad and SAAS are some of the most sought after buzz words of software industry right now.  Apart from looking after the IT infrastructure, my work involves projects bridge and picksie that together involve all of these.&lt;/p&gt;
&lt;p&gt;Bridge is a product targeting enterprise collaboration space, built on my stack of choice for web apps these days ASP.Net/Subsonic/MySQL. We are looking into SAASifying this app and see if we can host it on the cloud using some knowledge that I have gained working on picksie.&lt;/p&gt;
&lt;p&gt;Picksie is a web app for iPad, hosted on the cloud. My involvement is designing the infrastructure, making sure it is scalable and easily managable. Infrastructure of a consumer web app is really a completely different ballgame compared to enterprise IT infrastructure. So I am really getting to learn alot as picksie moves from demo to beta and from a simple 3 server setup to a more elaborate and load balanced and more elaborate setup.&lt;/p&gt;
&lt;/span&gt;&lt;/p&gt;</description><link>http://yatendra.com/post/11029106556</link><guid>http://yatendra.com/post/11029106556</guid><pubDate>Tue, 04 Oct 2011 15:36:33 -0400</pubDate><category>cloud</category><category>ipad</category><category>saas</category><category>work</category></item></channel></rss>

