<?xml version="1.0" encoding="UTF-8" ?>
<?xml-stylesheet type="text/xsl" href="http://msmvps.com/utility/FeedStylesheets/rss.xsl" media="screen"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"><channel><title>Omar AL Zabir blog on ASP.NET Ajax and .NET 3.5 : pageflakes</title><link>http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx</link><description>Tags: pageflakes</description><dc:language>en</dc:language><generator>CommunityServer 2008.5 SP2 (Build: 40407.4157)</generator><item><title>99.99% available ASP.NET and SQL Server SaaS Production Architecture</title><link>http://msmvps.com/blogs/omar/archive/2008/12/10/99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx</link><pubDate>Wed, 10 Dec 2008 08:39:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1656383</guid><dc:creator>omar</dc:creator><slash:comments>4</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1656383</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/12/10/99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx#comments</comments><description>&lt;p&gt;You have a hot ASP.NET+SQL Server product, growing at thousand users per day and you have hit the limit of your own garage hosting capability. Now that you have enough VC money in your pocket, you are planning to go out and host on some real hosting facility, maybe a colocation or managed hosting. So, you are thinking, how to design a physical architecture that will ensure performance, scalability, security and availability of your product? How can you achieve four-nine (99.99%) availability? How do you securely let your development team connect to production servers? How do you choose the right hardware for web and database server? Should you use Storage Area Network (SAN) or just local disks on RAID? How do you securely connect your office computers to production environment?&lt;/p&gt;
&lt;p&gt;Here I will answer all these queries. Let me first show you a diagram that I made for &lt;a href="http://www.pageflakes.com"&gt;Pageflakes&lt;/a&gt; where we ensured we get four-nine availability. Since Pageflakes is a &lt;a href="http://en.wikipedia.org/wiki/Software_as_a_service"&gt;Level 3 SaaS&lt;/a&gt;, it&amp;rsquo;s absolutely important that we build a high performance, highly available product that can be used from anywhere in the world 24/7 and end-user gets quick access to their content with complete personalization and customization of content and can share it with others and to the world. So, you can take this production architecture as a very good candidate for Level 3 SaaS: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/Hosting_5F00_environment_5F00_7C36AD9E.png"&gt;&lt;img title="Hosting_environment" style="border-top-width:0px;display:inline;border-left-width:0px;border-bottom-width:0px;border-right-width:0px;" alt="Hosting_environment" src="http://msmvps.com/cfs-file.ashx/__key/CommunityServer.Blogs.Components.WeblogFiles/omar/Hosting_5F00_environment_5F00_thumb_5F00_45D55FC2.png" border="0" height="832" width="600" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;rsquo;s a CodeProject article that explains all the ideas:&lt;/p&gt;
&lt;p&gt;&lt;a title="99.99% available ASP.NET and SQL Server SaaS Production Architecture" href="http://www.codeproject.com/KB/aspnet/ProdArch.aspx" target="_blank"&gt;99.99% available ASP.NET and SQL Server SaaS Production Architecture&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hope you like it. Appreciate your vote.&lt;/p&gt;
&lt;div class="wlWriterSmartContent" id="scid:B3E14793-948F-49af-A347-D19C374A7C4F:25404c3d-2014-4892-a108-bf1cfc5d1ff8" style="padding-right:0px;display:inline;padding-left:0px;float:none;padding-bottom:0px;margin:0px;padding-top:0px;"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script src="http://digg.com/tools/diggthis.js" type="text/javascript"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;div class="wlWriterHeaderFooter" style="text-align:left;margin:0px;padding:4px 4px 4px 4px;"&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script type="text/javascript"&gt;&lt;/script&gt;
&lt;script language="javascript" src="http://widgets.dzone.com/widgets/zoneit.js"&gt;&lt;/script&gt;
&lt;/div&gt;
&lt;p&gt;
&lt;a href="http://www.dotnetkicks.com/kick/?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f12%2f10%2f99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx"&gt;&lt;img src="http://www.dotnetkicks.com/Services/Images/KickItImageGenerator.ashx?url=http%3a%2f%2fmsmvps.com%2fblogs%2fomar%2farchive%2f2008%2f12%2f10%2f99-99-available-asp-net-and-sql-server-saas-production-architecture.aspx" alt="kick it on DotNetKicks.com" border="0" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1656383" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/architecture/default.aspx">architecture</category></item><item><title>Fast, Streaming AJAX proxy - continuously download from cross domain</title><link>http://msmvps.com/blogs/omar/archive/2008/04/14/fast-streaming-ajax-proxy-continuously-download-from-cross-domain.aspx</link><pubDate>Mon, 14 Apr 2008 07:29:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1586081</guid><dc:creator>omar</dc:creator><slash:comments>15</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1586081</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/04/14/fast-streaming-ajax-proxy-continuously-download-from-cross-domain.aspx#comments</comments><description>&lt;p&gt;&lt;span id="intelliTXT"&gt;Due to browser&amp;#39;s prohibition on cross domain
XMLHTTP call, all AJAX
websites must have server side proxy to fetch content from external
domain like Flickr or Digg. From client side javascript code, an
XMLHTTP call goes to the server side proxy hosted on the same domain
and then the proxy downloads the content from the external server and
sends back to the browser. In general, all AJAX websites on the
Internet that are showing content from external domains are following
this proxy approach except some rare ones who are using JSONP. Such a
proxy gets a very large number of hits when a lot of component on the
website are downloading content from external domains. So, it becomes a
scalability issue when the proxy starts getting millions of hits.
Moreover, web page&amp;#39;s overall load performance largely depends on the
performance of the proxy as it delivers content to the page. In this
article, we will take a look how we can take a conventional AJAX Proxy
and make it faster, asynchronous, continuously stream content and thus
make it more scalable.&lt;/span&gt; &lt;/p&gt; &lt;p&gt;You can see such a proxy in action when you go to &lt;a href="http://www.pageflakes.com/"&gt;Pageflakes.com&lt;/a&gt;. You will see flakes (widgets) loading many different content like weather feed, flickr photo, youtube videos, RSS from many different external domains. All these are done via a &lt;i&gt;Content Proxy&lt;/i&gt;. Content Proxy served about &lt;b&gt;42.3 million URLs&lt;/b&gt; last month which is quite an engineering challenge for us to make it both fast and scalable. Sometimes Content Proxy serves megabytes of data, which poses even greater engineering challenge. As such proxy gets large number of hits, if we can save on an average 100ms from each call, we can save &lt;b&gt;4.23 million seconds&lt;/b&gt; of download/upload/processing time every month. That&amp;#39;s about 1175 man hours wasted throughout the world by millions of people staring at browser waiting for content to download.&lt;/p&gt; &lt;p&gt;Such a content proxy takes an external server&amp;#39;s URL as a query parameter. It downloads the content from the URL and then writes the content as response back to browser. &lt;/p&gt; &lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image1.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image1_thumb.png" alt="image" border="0" height="107" width="532" /&gt;&lt;/a&gt;&lt;br /&gt;Figure: Content Proxy working as a middleman between browser and external domain &lt;/p&gt; &lt;p&gt;The above timeline shows how request goes to the server and then server makes a request to external server, downloads the response and then transmits back to the browser. The response arrow from proxy to browser is larger than the response arrow from external server to proxy because generally proxy server&amp;#39;s hosting environment has better download speed than the user&amp;#39;s Internet connectivity.&lt;/p&gt; &lt;p&gt;Such a content proxy is also available in my open source Ajax Web Portal &lt;a href="http://www.dropthings.com/"&gt;Dropthings.com&lt;/a&gt;. You can see from &lt;a href="http://www.codeplex.com/dropthings"&gt;its code&lt;/a&gt; how such a proxy is implemented.&lt;/p&gt; &lt;p&gt;The following is a very simple synchronous, non-streaming, blocking Proxy:&lt;/p&gt; &lt;div class="csharpcode-wrapper" style="width:94.38%;height:192px;"&gt;&lt;pre class="csharpcode" style="width:63.65%;height:176px;"&gt;[WebMethod]&lt;br /&gt;[ScriptMethod(UseHttpGet=&lt;span class="kwrd"&gt;true&lt;/span&gt;)]&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; GetString(&lt;span class="kwrd"&gt;string&lt;/span&gt; url)&lt;br /&gt;{&lt;br /&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (WebClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient())&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; response = client.DownloadString(url);&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; response;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Although it shows the general principle, but it&amp;#39;s no where close to a real proxy because:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It&amp;#39;s a synchronous proxy and thus not scalable. Every call to this web method causes the ASP.NET thread to wait until the call to the external URL completes. 
&lt;/li&gt;&lt;li&gt;It&amp;#39;s &lt;b&gt;non streaming&lt;/b&gt;. It first downloads the entire content on the server, storing it in a string and then uploading that entire content to the browser. If you pass &lt;a href="http://msdn.microsoft.com/rss.xml"&gt;MSDN feed URL&lt;/a&gt;, it will download that gigantic 220 KB RSS XML on the server and store it on a 220 KB long string (actually double the size as .NET strings are all Unicode string) and then write 220 KB to&amp;nbsp; ASP.NET Response buffer, consuming another 220 KB UTF8 byte array in memory. Then that 220 KB will be passed to IIS in chunks so that it can transmit it to the browser. 
&lt;/li&gt;&lt;li&gt;It does not produce proper response header to cache the response on the server. Nor does it deliver important headers like &lt;i&gt;Content-Type&lt;/i&gt; from the source. 
&lt;/li&gt;&lt;li&gt;If external URL is providing gzipped content, it decompresses the content into a string representation and thus wastes server memory. 
&lt;/li&gt;&lt;li&gt;It does not cache the content on the server. So, repeated call to the same external URL within the same second or minute will download content from the external URL and thus waste bandwidth on your server. &lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;So, we need an asynchronous &lt;b&gt;streaming proxy&lt;/b&gt; that transmits the content to the browser while it downloads from the external domain server. So, it will download bytes from external URL in small chunks and immediately transmit that to the browser. As a result, browser will see a continuous transmission of bytes right after calling the web service. There will be no delay while the content is fully downloaded on the server.&lt;/p&gt;
&lt;p&gt;Before I show you the complex streaming proxy code, let&amp;#39;s take an evolutionary approach. Let&amp;#39;s build a better Content Proxy that the one shown above, which is synchronous, non-streaming but does not have the other problems mentioned above. We will build a HTTP Handler named &lt;u&gt;RegularProxy.ashx&lt;/u&gt; which will take &lt;u&gt;url&lt;/u&gt; as a query parameter. It will also take &lt;u&gt;cache&lt;/u&gt; as a query parameter which it will use to produce proper response headers in order to cache the content on the browser. Thus it will save browser from downloading the same content again and again.&lt;/p&gt;
&lt;div&gt;&lt;pre class="csharpcode"&gt;&amp;lt;%@ WebHandler Language=&lt;span class="str"&gt;&amp;quot;C#&amp;quot;&lt;/span&gt; Class=&lt;span class="str"&gt;&amp;quot;RegularProxy&amp;quot;&lt;/span&gt; %&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Web.Caching;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; System.Net;&lt;br /&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; ProxyHelpers;&lt;br /&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; RegularProxy : IHttpHandler {&lt;br /&gt;        &lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessRequest (HttpContext context) {&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; url = context.Request[&lt;span class="str"&gt;&amp;quot;url&amp;quot;&lt;/span&gt;];&lt;br /&gt;        &lt;span class="kwrd"&gt;int&lt;/span&gt; cacheDuration = Convert.ToInt32(context.Request[&lt;span class="str"&gt;&amp;quot;cache&amp;quot;&lt;/span&gt;]?? &lt;span class="str"&gt;&amp;quot;0&amp;quot;&lt;/span&gt;);&lt;br /&gt;        &lt;span class="kwrd"&gt;string&lt;/span&gt; contentType = context.Request[&lt;span class="str"&gt;&amp;quot;type&amp;quot;&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;        &lt;span class="rem"&gt;// We don&amp;#39;t want to buffer because we want to save memory&lt;/span&gt;&lt;br /&gt;        context.Response.Buffer = &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;        &lt;span class="rem"&gt;// Serve from cache if available&lt;/span&gt;&lt;br /&gt;        &lt;span class="kwrd"&gt;if&lt;/span&gt; (context.Cache[url] != &lt;span class="kwrd"&gt;null&lt;/span&gt;)&lt;br /&gt;        {&lt;br /&gt;            context.Response.BinaryWrite(context.Cache[url] &lt;span class="kwrd"&gt;as&lt;/span&gt; &lt;span class="kwrd"&gt;byte&lt;/span&gt;[]);&lt;br /&gt;            context.Response.Flush();&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;        &lt;span class="kwrd"&gt;using&lt;/span&gt; (WebClient client = &lt;span class="kwrd"&gt;new&lt;/span&gt; WebClient())&lt;br /&gt;        {&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(contentType))&lt;br /&gt;                client.Headers[&lt;span class="str"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;] = contentType;&lt;br /&gt;            &lt;br /&gt;            client.Headers[&lt;span class="str"&gt;&amp;quot;Accept-Encoding&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;gzip&amp;quot;&lt;/span&gt;;&lt;br /&gt;            client.Headers[&lt;span class="str"&gt;&amp;quot;Accept&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;*/*&amp;quot;&lt;/span&gt;;&lt;br /&gt;            client.Headers[&lt;span class="str"&gt;&amp;quot;Accept-Language&amp;quot;&lt;/span&gt;] = &lt;span class="str"&gt;&amp;quot;en-US&amp;quot;&lt;/span&gt;;&lt;br /&gt;            client.Headers[&lt;span class="str"&gt;&amp;quot;User-Agent&amp;quot;&lt;/span&gt;] = &lt;br /&gt;&lt;span class="str"&gt;&amp;quot;Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.8.1.6) Gecko/20070725 Firefox/2.0.0.6&amp;quot;&lt;/span&gt;;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;byte&lt;/span&gt;[] data = client.DownloadData(url);&lt;br /&gt;&lt;br /&gt;            context.Cache.Insert(url, data, &lt;span class="kwrd"&gt;null&lt;/span&gt;,&lt;br /&gt;                        Cache.NoAbsoluteExpiration,&lt;br /&gt;                        TimeSpan.FromMinutes(cacheDuration),&lt;br /&gt;                        CacheItemPriority.Normal, &lt;span class="kwrd"&gt;null&lt;/span&gt;); &lt;br /&gt;            &lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!context.Response.IsClientConnected) &lt;span class="kwrd"&gt;return&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;            &lt;br /&gt;            &lt;span class="rem"&gt;// Deliver content type, encoding and length as it is received from the external URL&lt;/span&gt;&lt;br /&gt;            context.Response.ContentType = client.ResponseHeaders[&lt;span class="str"&gt;&amp;quot;Content-Type&amp;quot;&lt;/span&gt;];&lt;br /&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; contentEncoding = client.ResponseHeaders[&lt;span class="str"&gt;&amp;quot;Content-Encoding&amp;quot;&lt;/span&gt;];&lt;br /&gt;            &lt;span class="kwrd"&gt;string&lt;/span&gt; contentLength = client.ResponseHeaders[&lt;span class="str"&gt;&amp;quot;Content-Length&amp;quot;&lt;/span&gt;];&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(contentEncoding))&lt;br /&gt;                context.Response.AppendHeader(&lt;span class="str"&gt;&amp;quot;Content-Encoding&amp;quot;&lt;/span&gt;, contentEncoding);&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (!&lt;span class="kwrd"&gt;string&lt;/span&gt;.IsNullOrEmpty(contentLength))&lt;br /&gt;                context.Response.AppendHeader(&lt;span class="str"&gt;&amp;quot;Content-Length&amp;quot;&lt;/span&gt;, contentLength);&lt;br /&gt;&lt;br /&gt;            &lt;span class="kwrd"&gt;if&lt;/span&gt; (cacheDuration &amp;gt; 0)&lt;br /&gt;                HttpHelper.CacheResponse(context, cacheDuration);&lt;br /&gt;            &lt;br /&gt;            &lt;span class="rem"&gt;// Transmit the exact bytes downloaded&lt;/span&gt;&lt;br /&gt;            context.Response.BinaryWrite(data);&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt; &lt;br /&gt;    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;bool&lt;/span&gt; IsReusable {&lt;br /&gt;        get {&lt;br /&gt;            &lt;span class="kwrd"&gt;return&lt;/span&gt; &lt;span class="kwrd"&gt;false&lt;/span&gt;;&lt;br /&gt;        }&lt;br /&gt;    }&lt;br /&gt;&lt;br /&gt;}&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;There are two enhancements in this proxy:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;It allows server side caching of content. Same URL requested by a different browser within a time period will not be downloaded on server again, instead it will be served from cache. 
&lt;/li&gt;&lt;li&gt;It generates proper response cache header so that the content can be cached on browser. 
&lt;/li&gt;&lt;li&gt;It does not decompress the downloaded content in memory. It keeps the original byte stream intact. This saves memory allocation. 
&lt;/li&gt;&lt;li&gt;It transmits the data in non-buffered fashion, which means ASP.NET Response object does not buffer the response and thus saves memory&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;However, this is a blocking proxy. We need to make a streaming asynchronous proxy for better performance. Here&amp;#39;s why:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_8.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_thumb_3.png" alt="image" border="0" height="128" width="497" /&gt;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;Figure: Continuous streaming proxy&lt;/p&gt;
&lt;p&gt;As you see, when data is transmitted from server to browser while server downloads the content, the delay for server side download is eliminated. So, if server takes 300ms to download something from external source, and then 700ms to send it back to browser, you can save up to 300ms Network Latency between server and browser. The situation gets even better when the external server that serves the content is slow and takes quite some time to deliver the content. The slower external site is, the more saving you get in this continuous streaming approach. This is significantly faster than blocking approach when the external server is in Asia or Australia and your server is in USA. &lt;/p&gt;
&lt;p&gt;The approach for continuous proxy is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Read bytes from external server in chunks of 8KB from a separate thread (Reader thread) so that it&amp;#39;s not blocked 
&lt;/li&gt;&lt;li&gt;Store the chunks in an in-memory Queue 
&lt;/li&gt;&lt;li&gt;Write the chunks to ASP.NET Response from that same queue 
&lt;/li&gt;&lt;li&gt;If the queue is finished, wait until more bytes are downloaded by the reader thread&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image15.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image15_thumb.png" alt="image" border="0" height="180" width="551" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;The Pipe Stream needs to be thread safe and it needs to support blocking Read. By blocking read it means, if a thread tries to read a chunk from it and the stream is empty, it will suspend that thread until another thread writes something on the stream. Once a write happens, it will resume the reader thread and allow it to read. I have taken the code of &lt;u&gt;PipeStream&lt;/u&gt; from &lt;a href="http://www.codeproject.com/KB/threads/PipeStream.aspx"&gt;CodeProject article by James Kolpack&lt;/a&gt; and extended it to make sure it&amp;#39;s high performance, supports chunks of bytes to be stored instead of single bytes, support timeout on waits and so on. &lt;/p&gt;
&lt;p&gt;A did some comparison between Regular proxy (blocking, synchronous, download all then deliver) and Streaming Proxy (continuous transmission from external server to browser). Both proxy downloads the MSDN feed and delivers it to the browser. The time taken here shows the total duration of browser making the request to the proxy and then getting the entire response.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_14.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_thumb_4.png" alt="image" border="0" height="230" width="381" /&gt;&lt;/a&gt; &lt;br /&gt;Figure: Time taken by Streaming Proxy vs Regular Proxy while downloading MSDN feed&lt;/p&gt;
&lt;p&gt;Not a very scientific graph and response time varies on the link speed between the browser and the proxy server and then from proxy server to the external server. But it shows that most of the time, Streaming Proxy outperformed Regular proxy.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_18.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_thumb_7.png" alt="image" border="0" height="373" width="457" /&gt;&lt;/a&gt; &lt;br /&gt;Figure: Test client to compare between Regular Proxy and Streaming Proxy&lt;/p&gt;
&lt;p&gt;You can also test both proxy&amp;#39;s response time by going to &lt;a href="http://labs.dropthings.com/AjaxStreamingProxy"&gt;http://labs.dropthings.com/AjaxStreamingProxy&lt;/a&gt;. Put your URL and hit Regular/Stream button and see the &amp;quot;Statistics&amp;quot; text box for the total duration. You can turn on &amp;quot;Cache response&amp;quot; and hit a URL from one browser. Then go to another browser and hit the URL to see the response coming from server cache directly. Also if you hit the URL again on the same browser, you will see response comes instantly without ever making call to the server. That&amp;#39;s browser cache at work.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Learn more about Http Response caching from my blog post:&lt;br /&gt;&lt;a href="http://feeds.feedburner.com/%7Er/OmarAlZabirBlog/%7E3/267239050/making-best-use-of-cache-for-high-performance-website.aspx"&gt;Making best use of cache for high performance website&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;h3&gt;&lt;/h3&gt;
&lt;p&gt;A Visual Studio Web Test run inside a Load Test shows a better picture:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_24.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_thumb_10.png" alt="image" border="0" height="200" width="512" /&gt;&lt;/a&gt;&amp;nbsp;&lt;br /&gt;Figure: Regular Proxy load test result shows &lt;b&gt;Average Requests/Sec 0.79&lt;/b&gt; and &lt;b&gt;Avg Response Time 2.5 sec&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_26.png"&gt;&lt;img src="http://msmvps.com/blogs/omar/WindowsLiveWriter/FastStreamingAJAXproxy_A628/image_thumb_11.png" alt="image" border="0" height="214" width="506" /&gt;&lt;/a&gt;&lt;br /&gt;Figure: Streaming Proxy load test result shows &lt;b&gt;Avg Req/Sec is 1.08&lt;/b&gt; and &lt;b&gt;Avg Response Time 1.8 sec&lt;/b&gt;.&lt;/p&gt;
&lt;p&gt;From the above load test results, Streaming Proxy is &lt;b&gt;26% better Request/Sec and Average Response Time is 29% better&lt;/b&gt;. The numbers may sound small, but at Pageflakes, 29% better response time means &lt;b&gt;1.29 million seconds&lt;/b&gt; saved per month for all the users on the website. So, we are effectively saving 353 man hours per month which was wasted staring at browser screen while it downloads content.&lt;/p&gt;
&lt;h3&gt;Building the Streaming Proxy&lt;/h3&gt;&lt;p&gt;The details how the Streaming Proxy is built is quite long and not suitable for a blog post. So, I have written a CodeProject article:&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.codeproject.com/KB/ajax/ajaxproxy.aspx"&gt;Fast, Scalable, Streaming AJAX Proxy - continuously deliver data from cross domain&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Please read the article and please vote for me if your find it useful. &amp;nbsp;&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1586081" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net+ajax/default.aspx">asp.net ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category></item><item><title>My first book - Building a Web 2.0 Portal with ASP.NET 3.5</title><link>http://msmvps.com/blogs/omar/archive/2008/01/13/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx</link><pubDate>Sun, 13 Jan 2008 20:23:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1461326</guid><dc:creator>omar</dc:creator><slash:comments>44</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1461326</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2008/01/13/my-first-book-building-a-web-2-0-portal-with-asp-net-3-5.aspx#comments</comments><description>&lt;p&gt;My first book &amp;quot;&lt;a href="http://www.oreilly.com/catalog/9780596510503/" target="_blank"&gt;Building a Web 2.0 Portal with ASP.NET 3.5&lt;/a&gt;&amp;quot; from O&amp;#39;Reilly is published and available in the stores. This book explains in detail the architecture design, development, test, deployment, performance and scalability challenges of my open source web portal &lt;a href="http://www.dropthings.com" target="_blank"&gt;Dropthings.com&lt;/a&gt;. Dropthings is a prototype of a web portal similar to &lt;a href="http://www.google.com/ig" target="_blank"&gt;iGoogle&lt;/a&gt; or &lt;a href="http://www.pageflakes.com" target="_blank"&gt;Pageflakes&lt;/a&gt;. But this portal is developed using recently released brand new technologies like ASP.NET 3.5, C# 3.0, Linq to Sql, Linq to XML, and Windows Workflow foundation. It makes heavy use of ASP.NET AJAX 1.0. Throughout my career I have built several state-of-the-art &lt;a href="http://omar.mvps.org" target="_blank"&gt;personal&lt;/a&gt;, educational, enterprise and &lt;a href="http://www.pageflakes.com" target="_blank"&gt;mass consumer web portals&lt;/a&gt;. This book collects my experience in building all of those portals.&lt;/p&gt;&lt;p&gt;O&amp;#39;Reilly Website:&lt;br /&gt;&lt;a href="http://www.oreilly.com/catalog/9780596510503/"&gt;http://www.oreilly.com/catalog/9780596510503/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Amazon:&lt;br /&gt;&lt;a href="http://www.amazon.com/Building-Web-2-0-Portal-ASP-NET/dp/0596510500"&gt;http://www.amazon.com/Building-Web-2-0-Portal-ASP-NET/dp/0596510500&lt;/a&gt;&lt;br /&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;Disclaimer: This book does not show you how to build Pageflakes. Dropthings is entirely different in terms of architecture, implementation and the technologies involved.&lt;/p&gt; &lt;p&gt;You learn how to: &lt;/p&gt; &lt;ul&gt; &lt;li&gt;Implement a highly decoupled architecture following the popular n-tier, widget-based application model  &lt;/li&gt;&lt;li&gt;Provide drag-and-drop functionality, and use ASP.NET 3.5 to build the server-side part of the web layer  &lt;/li&gt;&lt;li&gt;Use LINQ to build the data access layer, and Windows Workflow Foundation to build the business layer as a collection of workflows  &lt;/li&gt;&lt;li&gt;Build client-side widgets using JavaScript for faster performance and better caching  &lt;/li&gt;&lt;li&gt;Get maximum performance out of the ASP.NET AJAX Framework for faster, more dynamic, and scalable sites  &lt;/li&gt;&lt;li&gt;Build a custom web service call handler to overcome shortcomings in ASP.NET AJAX 1.0 for asynchronous, transactional, cache-friendly web services  &lt;/li&gt;&lt;li&gt;Overcome JavaScript performance problems, and help the user interface load faster and be more responsive  &lt;/li&gt;&lt;li&gt;Solve various scalability and security problems as your site grows from hundreds to millions of users  &lt;/li&gt;&lt;li&gt;Deploy and run a high-volume production site while solving software, hardware, hosting, and Internet infrastructure problems &lt;/li&gt;&lt;/ul&gt;If you&amp;#39;re ready to build state-of-the art, high-volume web applications that can withstand millions of hits per day, this book has exactly what you need.&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1461326" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/asp.net/default.aspx">asp.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/linq/default.aspx">linq</category><category domain="http://msmvps.com/blogs/omar/archive/tags/workflow/default.aspx">workflow</category><category domain="http://msmvps.com/blogs/omar/archive/tags/ajax/default.aspx">ajax</category><category domain="http://msmvps.com/blogs/omar/archive/tags/.net/default.aspx">.net</category><category domain="http://msmvps.com/blogs/omar/archive/tags/IIS/default.aspx">IIS</category></item><item><title>A significant part of sql server process memory has been paged out. This may result in performance degradation</title><link>http://msmvps.com/blogs/omar/archive/2007/09/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx</link><pubDate>Wed, 19 Sep 2007 07:46:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:1205524</guid><dc:creator>omar</dc:creator><slash:comments>31</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=1205524</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/09/19/a-significant-part-of-sql-server-process-memory-has-been-paged-out-this-may-result-in-performance-degradation.aspx#comments</comments><description>&lt;p&gt;If you are using SQL Sever Server standard edition 64 bit on a Windows 2003 64bit, you will frequently encounter this problem where SQL Server says:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;A significant part of sql server process memory has been paged out. This may result in performance degradation. Duration 0 seconds. Working set (KB) 25432, committed (KB) 11296912, memory utilization 0%&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;The number in working set and duration will vary. What happens here is SQL Server is forced to release memory to operating system because some other application or OS itself needs to allocate RAM.&lt;/p&gt; &lt;p&gt;We went through many support articles like:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/918483"&gt;918483&lt;/a&gt;: How to reduce paging of buffer pool memory in the 64-bit version of SQL Server 2005  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/905865/"&gt;905865&lt;/a&gt;: The sizes of the working sets of all the processes in a console session may be trimmed when you use Terminal Services to log on to or log off from a computer that is running Windows Server 2003  &lt;li&gt;&lt;a href="http://support.microsoft.com/kb/920739/"&gt;920739&lt;/a&gt;: You may experience a decrease in overall system performance when you are copying files that are larger than approximately 500 MB in Windows Server 2003 Service Pack 1 &lt;/li&gt;&lt;/ul&gt; &lt;p&gt;But nothing solved the problem. We still have the page out problem happening every day.&lt;/p&gt; &lt;p&gt;The server has 16 GB RAM where 12 GB is maximum limit allocated to SQL Server. 4 GB is left to OS and and other application. We have also turned off antivirus and any large backup job. 12 GB RAM should be plenty because there&amp;#39;s no other app running on the dedicated SQL Server box. But the page out still happens. When this happens, SQL Server becomes very slow. Queries timeout, website throws error, transactions abort. Sometimes this problems goes on for 30 to 40 minutes and website becomes slow/unresponsive during that time.&lt;/p&gt; &lt;p&gt;I have found what causes SQL Server to page out. File System cache somehow gets really high and forces SQL Server to trim down.&lt;/p&gt; &lt;p&gt;&lt;img height="663" alt="clip_image002" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image002.jpg" width="557" /&gt; &lt;/p&gt; &lt;p&gt;You see the System cache resident bytes are very high. During this time SQL Server gets much less RAM than it needs. Queries timeout at very high rate like 15 per sec. Moreover, there&amp;#39;s high SQL Lock Timeout/sec (around 15/sec not captured in screen shot).&lt;/p&gt; &lt;p&gt;&lt;img height="191" alt="clip_image004" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image004.jpg" width="549" /&gt; &lt;/p&gt; &lt;p&gt;SQL Server max memory is configured 12 GB. But here it shows it’s getting less than 8 GB.&lt;/p&gt; &lt;p&gt;While the file system cache is really high, there’s no process that’s taking significant RAM.&lt;/p&gt; &lt;p&gt;&lt;img height="648" alt="clip_image006" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image006.jpg" width="340" /&gt; &lt;/p&gt; &lt;p&gt;After I used SysInternal’s &lt;a href="http://www.microsoft.com/technet/sysinternals/FileAndDisk/CacheSet.mspx"&gt;CacheSet&lt;/a&gt; to reset file system cache and set around 500 MB as max limit, memory started to free up.&lt;/p&gt; &lt;p&gt;&lt;img height="285" alt="clip_image008" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image008.jpg" width="557" /&gt; &lt;/p&gt; &lt;p&gt;SQL Server started to see more RAM free:&lt;/p&gt; &lt;p&gt;&lt;img height="92" alt="clip_image010" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image010.jpg" width="564" /&gt; &lt;/p&gt; &lt;p&gt;Then I hit the “Clear” button to clear file system cache and it came down dramatically.&lt;/p&gt; &lt;p&gt;&lt;img height="668" alt="clip_image012" src="http://omar.mvps.org/images/SQLServerhaspagedoutsignificant_10B/clip_image012.jpg" width="553" /&gt; &lt;/p&gt; &lt;p&gt;Paging stopped. System cache was around 175 MB only. SQL Server lock timeout came back to zero. Everything went back to normal.&lt;/p&gt; &lt;p&gt;So, I believe there&amp;#39;s either some faulty driver or the OS itself is leaking file system cache in 64bit environment.&lt;/p&gt; &lt;p&gt;What we have done is, we have a dedicated person who goes to production database servers every hour, runs the CacheSet program and clicks &amp;quot;Clear&amp;quot; button. This clears the file system cache and prevents it from growing too high.&lt;/p&gt; &lt;p&gt;There are lots of articles written about this problem. However, the most informative one I have found is from the SQL Server PSS team:&lt;/p&gt; &lt;p&gt;&lt;a title="http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx" href="http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx"&gt;http://blogs.msdn.com/psssql/archive/2007/05/31/the-sql-server-working-set-message.aspx&lt;/a&gt; &lt;/p&gt; &lt;p&gt;&lt;strong&gt;UPDATE - THE FINAL SOLUTION!&lt;/strong&gt;&lt;/p&gt; &lt;p&gt;The final solution is to run this program on Windows Startup:&lt;/p&gt; &lt;p&gt;SetSystemFileCacheSize 128 256&lt;/p&gt; &lt;p&gt;This sets the lower and higher limit for the System Cache. You need to run this on every windows startup because a restart will undo the cache setting to unlimited.&lt;/p&gt; &lt;p&gt;You can run the program without any parameter to see what is the current setting.&lt;/p&gt; &lt;p&gt;Download the program from this page:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.uwe-sieber.de/ntcacheset_e.html" href="http://www.uwe-sieber.de/ntcacheset_e.html"&gt;http://www.uwe-sieber.de/ntcacheset_e.html&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Go to the end and you will get the link to the SetSystemFileCacheSize.zip&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=1205524" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/sql+server/default.aspx">sql server</category><category domain="http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx">performance</category><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category><category domain="http://msmvps.com/blogs/omar/archive/tags/production/default.aspx">production</category><category domain="http://msmvps.com/blogs/omar/archive/tags/optimize/default.aspx">optimize</category></item><item><title>Gartner: Pageflakes is the "Cool Web 2.0" Personalized Homepage</title><link>http://msmvps.com/blogs/omar/archive/2007/04/11/gartner-pageflakes-is-the-cool-web-2-0-personalized-homepage.aspx</link><pubDate>Wed, 11 Apr 2007 10:40:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:782106</guid><dc:creator>omar</dc:creator><slash:comments>26</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=782106</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/04/11/gartner-pageflakes-is-the-cool-web-2-0-personalized-homepage.aspx#comments</comments><description>&lt;p&gt;
&lt;img hspace="10" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Blog_71&amp;amp;fileName=gartner_award_logo.jpg&amp;amp;cacheDuration=10080" align="right" border="0" alt="" /&gt;It&amp;#39;s been an award-winning
spring season for 
&lt;a href="http://www.pageflakes.com/"&gt;Pageflakes&lt;/a&gt;!&amp;nbsp; This
time 
&lt;a href="http://www.gartner.com"&gt;Gartner&lt;/a&gt;, the highly respected
technology industry analysis and research firm, has named
Pageflakes the 
&lt;a href="http://home.businesswire.com/portal/site/home/index.jsp?epi-content=GENERIC&amp;amp;newsId=20070410005470&amp;amp;ndmHsc=v2*A1173697200000*B1176304559000*DgroupByDate*J2*L1*N1000837*Zpageflakes&amp;amp;newsLang=en&amp;amp;beanID=202776713&amp;amp;viewID=news_view"&gt;
&amp;quot;Cool Web 2.0&amp;quot; personalized homepage for 2007&lt;/a&gt;.&amp;nbsp; Many
Business and enterprise users have discovered&amp;nbsp;our group
collaboration and page publishing features, and are using
Pageflakes for all kind of interesting applications at work such as
internal company intranets and managing teams and
projects.&amp;nbsp;&amp;nbsp;Plus, they&amp;#39;re&amp;nbsp;doing this with&amp;nbsp;no
technical skills, no IT department approvals, no waiting - and no
cost.&lt;/p&gt;
&lt;p&gt;Gartner has taken notice, and in its &amp;quot;Cool Web 2.0 Vendors 2007&amp;quot;

&lt;a href="http://http://www.gartner.com/it/products/research/cool_vendors/cvendors.jsp"&gt;
research report&amp;nbsp;($)&lt;/a&gt;, analyst David Gootzit says
&amp;quot;Pageflakes differentiates itself by adding some community building
features&amp;quot; and &amp;quot;Pageflakes users can publish tabs from their own
start pages to the general Pageflakes community or select groups of
users. This feature enables Pageflakes users without programming
know-how to design their own Web sites.&amp;quot; The report goes on to say
that, &amp;ldquo;Enterprise users should examine Pageflakes as a
tactical collaboration tool&amp;rdquo; and that Pageflakes features
&amp;rdquo;are also easily leveraged by the average enterprise user and
require no monetary investment.&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Thanks to Gartner and to all of our users working that are
working hard at the office. We&amp;#39;re glad to hear that&amp;nbsp;Pageflakes
is making life a little easier and more fun at work.&lt;/p&gt;
&lt;img src="http://msmvps.com/aggbug.aspx?PostID=782106" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item><item><title>And the winner is ... Pageflakes. Duh!</title><link>http://msmvps.com/blogs/omar/archive/2007/04/03/and-the-winner-is-pageflakes-duh.aspx</link><pubDate>Tue, 03 Apr 2007 17:54:06 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:748280</guid><dc:creator>omar</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=748280</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/04/03/and-the-winner-is-pageflakes-duh.aspx#comments</comments><description>&lt;p&gt;Two weeks back, Read Write Web started a poll on who&amp;#39;s the most popular Start Page in the world now. The result is astonishing:&lt;/p&gt; &lt;p&gt;&lt;img height="402" src="http://omar.mvps.org/images/Andthewinneris...Pageflakes.Duh_C204/image04.png" width="251" alt="" /&gt; &lt;/p&gt; &lt;p&gt;Pageflakes has got 30% vote, ahead of Google&amp;#39;s Personalized Homepage (26%)&amp;nbsp;and way ahead of Netvibes (21%). Many doubted this poll and thought it must have been an arranged poll by Pageflakes guys. But Read Write Web has declared Google to be the winner and Pageflakes #2 for some reason.&amp;nbsp;Well, no problem. The mighty PC World has declared Pageflakes to be the #1 Start Page!&lt;/p&gt; &lt;p&gt;&lt;img height="458" src="http://omar.mvps.org/images/Andthewinneris...Pageflakes.Duh_C204/image05.png" width="288" alt="" /&gt; &lt;/p&gt; &lt;p&gt;&lt;a href="http://www.pcworld.com/article/id,130045-page,4-c,freeware/article.html"&gt;Read the article here.&lt;/a&gt;&lt;/p&gt; &lt;p&gt;Let&amp;#39;s see now, how many awards we got so far. First there was the &lt;a href="http://web2.0awards.org/"&gt;Web 2.0 awards by SEOMoz&lt;/a&gt;&amp;nbsp;where Pageflakes raked #1 Start Page ahead of Google IG and Microsoft Live.com. Then there was the &amp;quot;Ajax King&amp;quot; award by &lt;a href="http://www.informationweek.com/management/showArticle.jhtml?articleID=192203311&amp;amp;pgno=6"&gt;InformationWeek&lt;/a&gt;&amp;nbsp;which said Google is no longer the Ajax King, Pageflakes is. Then we got highest vote on ReadWriteWeb poll. Recently we won #1&amp;nbsp;Start Page&amp;nbsp;title in PC World. Soon we hope to win the Emmy Awards, the Oscar, Miss Universe ...&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=748280" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item><item><title>Believe it or not - Head of MyYahoo! joins Pageflakes!</title><link>http://msmvps.com/blogs/omar/archive/2007/02/02/believe-it-or-not-head-of-myyahoo-joined-pageflakes.aspx</link><pubDate>Fri, 02 Feb 2007 04:39:21 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:535822</guid><dc:creator>omar</dc:creator><slash:comments>8</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=535822</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/02/02/believe-it-or-not-head-of-myyahoo-joined-pageflakes.aspx#comments</comments><description>&lt;p&gt;I generally do not talk about Corporate stuffs and try to keep my readers entertained with hot technologies. But this is too cool to hold back. &lt;/p&gt; &lt;p&gt;Dan Cohen has joined Pageflakes as CEO. As a serial startup entrepreneur and former head of MyYahoo!, Dan shares our passion for creating cutting-edge products that are easy to use, and he has vast expertise with personalized homepages, having also worked on the Google personalized homepage. Above all, Dan is a great guy and a lot of fun to work with. He&amp;#39;s also a pretty good drummer :-)&lt;/p&gt; &lt;p&gt;Dan will be working out of our new U.S. headquarters in San Francisco, but will of course be spending plenty of time working with our teams in Europe and Asia. He&amp;#39;ll of course be staying on top of his interests and hobbies using Pageflakes - &lt;a href="http://www.pageflakes.com/dan11.ashx?page=7878328"&gt;check out his public personalized homepage right here&lt;/a&gt;.  &lt;p&gt;P.S.: To read more about Dan&amp;#39;s joining, check out our &lt;a href="http://home.businesswire.com/portal/site/google/index.jsp?ndmViewId=news_view&amp;amp;newsId=20070129006370&amp;amp;newsLang=en"&gt;press release&lt;/a&gt;.  &lt;p&gt;Pageflakes is now becoming a really cool company to work for. We are always looking for talented developers who have excellent skill on HTML, CSS, JavaScript, ASP.NET 2.0 and Ajax. If you have the right skill set, come on in. Join the elite team of developers who are working behind the scene at Pageflakes bringing new innovations to the Start Page market almost every month.&lt;/p&gt; &lt;p&gt;Starting from Bangladesh back at 2005, Pageflakes offices now have spread over USA, Germany, London and Malaysia. The development team is at Bangladesh and Malaysia right now. But contract developers from all over the world work for Pageflakes. So, if you are interested, please send me your resume and your cool works on web at this email: omar at pageflakes dot com.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=535822" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item><item><title>Eat cornflakes, use Pageflakes</title><link>http://msmvps.com/blogs/omar/archive/2007/01/10/eat-cornflakes-use-pageflakes.aspx</link><pubDate>Wed, 10 Jan 2007 10:51:41 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:481164</guid><dc:creator>omar</dc:creator><slash:comments>7</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=481164</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2007/01/10/eat-cornflakes-use-pageflakes.aspx#comments</comments><description>&lt;p&gt;This is what I do every morning when I wake up. I take cornflakes and milk in a bowl and start my laptop and visit my &amp;quot;Reading&amp;quot; page. I eat cornflakes and read my &lt;a href="http://www.pageflakes.com/omar.ashx"&gt;Pageflakes&lt;/a&gt; page:&lt;/p&gt; &lt;p&gt;&lt;a href="http://omar.mvps.org/images/EatcornflakesusePageflakes_E878/image05.png"&gt;&lt;img src="http://omar.mvps.org/images/EatcornflakesusePageflakes_E878/image0_thumb5.png" alt="" /&gt;&lt;/a&gt; &lt;/p&gt; &lt;p&gt;This gives me daily nutrition for both my body and mind. Start Page is a really good productivity tool for infotainment. It saves me from going to all these sites in order to see what&amp;#39;s new. I read news feeds, stories from Digg, new bookmarks from Del.icio.us -&amp;nbsp;all from the same page. It saves so much of my time every single day and keeps me informed of things which is essential to maintain my core competency.&lt;/p&gt; &lt;p&gt;I have made my &amp;quot;Reading&amp;quot; page public, so you can also see what I am reading everyday by going to this URL:&lt;/p&gt; &lt;p&gt;&lt;a title="http://www.pageflakes.com/omar.ashx" href="http://www.pageflakes.com/omar.ashx"&gt;http://www.pageflakes.com/omar.ashx&lt;/a&gt;&lt;/p&gt; &lt;p&gt;If you have some cool pages that you have setup on Pageflakes, please make them public and let me know the URL. We can share our interests with each other and find out cool news things.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=481164" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item><item><title>Pageflakes - the AJAX king</title><link>http://msmvps.com/blogs/omar/archive/2006/08/25/pageflakes-the-ajax-king.aspx</link><pubDate>Fri, 25 Aug 2006 04:43:52 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:109416</guid><dc:creator>omar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=109416</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/08/25/pageflakes-the-ajax-king.aspx#comments</comments><description>&lt;p&gt;Here&amp;#39;s what a Digg article says:&lt;/p&gt; &lt;p&gt;&lt;a href="http://digg.com/tech_news/Pageflakes_and_YouOs_not_Google_are_the_Ajax_Kings"&gt;&lt;strong&gt;Pageflakes and YouOS - not Google - are the Ajax Kings&lt;/strong&gt;&lt;/a&gt;&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;InformationWeek took a close look at Google and about 20 startups to find out who&amp;#39;s the Ajax King. In the &amp;quot;webtop&amp;quot; or &amp;quot;personalized startpage&amp;quot; category - arguably the most important of all categories - the winners are Pageflakes and YouOs, ahead of Google and Microsoft.&lt;/p&gt;&lt;/blockquote&gt; &lt;p&gt;&amp;nbsp;&lt;/p&gt; &lt;p&gt;I am very happy to see we again got recognized as the best Webtop ahead of Microsoft and Google. The first one was on &lt;a href="http://web2.0awards.org"&gt;Web 2.0 Awards&lt;/a&gt;. Pleeeeeeeeeease give us a Digg and don&amp;#39;t miss the article on InformationWeek.&lt;/p&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=109416" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item><item><title>Pageflakes #1 Start page in Web 2.0 awards</title><link>http://msmvps.com/blogs/omar/archive/2006/05/04/pageflakes-1-start-page-in-web-2-0-awards.aspx</link><pubDate>Thu, 04 May 2006 10:01:00 GMT</pubDate><guid isPermaLink="false">d67277c4-116b-43f1-b688-e9ef184ea916:93461</guid><dc:creator>omar</dc:creator><slash:comments>2</slash:comments><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://msmvps.com/blogs/omar/rsscomments.aspx?PostID=93461</wfw:commentRss><comments>http://msmvps.com/blogs/omar/archive/2006/05/04/pageflakes-1-start-page-in-web-2-0-awards.aspx#comments</comments><description>&lt;p&gt;&lt;a href="http://www.pageflakes.com/"&gt;Pageflakes&lt;/a&gt; won the Web 2.0 Award for #1 Start Page. See the &amp;quot;Start Page&amp;quot; category from: &lt;/p&gt;
&lt;p&gt;&lt;a href="http://web2.0awards.org/"&gt;http://web2.0awards.org&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;#2 is Google&amp;#39;s IG and #3 is Microsoft&amp;#39;s Windows Live.&lt;/p&gt;
&lt;p&gt;Pageflakes is developed using ASP.NET 2.0 and Microsoft Atlas. &lt;/p&gt;
&lt;p&gt;Here&amp;#39;s what Pageflakes say:&lt;/p&gt;
&lt;p&gt;Pageflakes is your personalized Internet. You can add what you like and remove what you don&amp;#39;t like - and it&amp;#39;s totally simple. What you see on the site right now is just a selection of a few standard modules (&amp;quot;flakes&amp;quot;, as we call them) that allow you to read blogs, do web searches, create a to-do list, check your Gmail account and read the latest news. Normally you&amp;#39;d have to go to a different web page for each of those things. With Pageflakes, you have it all on one page! And it&amp;#39;s all free. &lt;/p&gt;
&lt;p&gt;Note: You can now create public sites and share your page with your friends! Setup a personal site very easily and collaboratively work together&lt;/p&gt;&lt;div style="clear:both;"&gt;&lt;/div&gt;&lt;img src="http://msmvps.com/aggbug.aspx?PostID=93461" width="1" height="1"&gt;</description><category domain="http://msmvps.com/blogs/omar/archive/tags/pageflakes/default.aspx">pageflakes</category></item></channel></rss>