<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" version="2.0">

<channel>
	<title>R&amp;D</title>
	
	<link>http://blog.adnanmasood.com</link>
	<description>Adnan on Technology, Research &amp; Development</description>
	<lastBuildDate>Fri, 24 Feb 2012 07:52:41 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/adnanmasood/VkJg" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="adnanmasood/vkjg" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Optimizing Collatz Sequence with Dynamic Programming</title>
		<link>http://blog.adnanmasood.com/2012/02/23/optimizing-collatz-sequence-with-dynamic-programming/</link>
		<comments>http://blog.adnanmasood.com/2012/02/23/optimizing-collatz-sequence-with-dynamic-programming/#comments</comments>
		<pubDate>Fri, 24 Feb 2012 07:01:44 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research & Development]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=742</guid>
		<description><![CDATA[Even though Kurtz and Simon proved that a natural generalization of the Collatz problem is algorithmically undecidable, it is still fairly easy to brute force the 3n+1 conjecture with large values of n and empirically see it converge. Project Euler&#8217;s problem 14 queries about which starting number, under one million, produces the longest sequence? Since Premature optimization is often considered root [...]]]></description>
			<content:encoded><![CDATA[<p>Even though <a href="http://books.google.com/books?id=mhrOkx-xyJIC&amp;pg=PA542" target="_blank">Kurtz and Simon</a> proved that a natural generalization of the<a href="http://en.wikipedia.org/wiki/Collatz_conjecture" target="_blank"> Collatz problem</a> is <a href="http://books.google.com/books?id=mhrOkx-xyJIC&amp;pg=PA542" target="_blank">algorithmically undecidable</a>, it is still fairly easy to brute force the <a href="http://acm.uva.es/p/v1/100.html" target="_blank">3n+1</a> conjecture with large values of n and empirically see it converge. Project Euler&#8217;s <a href="http://projecteuler.net/problem=14" target="_blank">problem 14</a> queries about which starting number, under one million, produces the longest sequence?</p>
<p>Since Premature optimization is often considered root of all evil, a brute force way to approach this problem would be as simple as follows.</p>
<pre  class="brush: csharp;" lang="C#">private static void CollatzSequence (ulong max)
        {
                ulong startingNum = 0;
                ulong longestSequence = 0;

                for (ulong i = 1; i &lt; max; i++)
                {
                    ulong member = i;
                    ulong sequenceCnt = 0;

                    while (member != 1)
                    {
                        if (member%2 == 0)
                            member = member/2;
                        else
                            member = 3*member + 1;

                        sequenceCnt++;
                    }

                    if (longestSequence &lt; sequenceCnt)
                    {
                        longestSequence = sequenceCnt;
                        startingNum = i;
                    }
                }
            Console.WriteLine("Sequence Starter:" + startingNum + " - Longest Sequence=" + longestSequence);
        }</pre>
<p>&nbsp;</p>
<p>The core of the algorithm is within the convergence test stated below</p>
<pre  class="brush: csharp;" lang="C#">while (member != 1)
                    {
                        if (member%2 == 0)
                            member = member/2;
                        else
                            member = 3*member + 1;

                        sequenceCnt++;
                    }</pre>
<p>This executes in 5601.2944 ms or approx 5.6 seconds resulting in starting element to be 83779 with the longest sequence 524 elements. Not bad but this can definitely be optimized.</p>
<p>By looking at the pattern of sequence generated, it&#8217;s clear that there is constant repetition or cycle which occurs within the sequence before converging to 1. Therefore, if we can break down this execution into segments by storing the length of repeated cycles, these segments can then be &#8220;appended&#8221; later to count the total steps in the convergence path. This is essentially the application of <a href="http://www.cs.berkeley.edu/~vazirani/algorithms/chap6.pdf" target="_blank">dynamic programming</a> which is a very powerful algorithmic paradigm. In DP, a problem is solved by identifying a collection of sub problems (segments) and handling them one by one, smallest ﬁrst, using the answers to small problems to help ﬁgure out larger ones. Some good <a href="http://people.csail.mit.edu/bdean/6.046/dp/" target="_blank">dynamic programming problems</a> can be found here.</p>
<p>In order to record and retrieve the earlier steps as segments, I decided to use a simple hashtable. This hashtable will store an element in sequence as a key and the count of elements in the path as value. Therefore, whenever a familiar recurrence happen, we can easily find the segment and stop the processing to move on.</p>
<pre  class="brush: csharp;" lang="C#">if (dynPrg.ContainsKey(member))
                    {
                        sequenceCnt += ulong.Parse(dynPrg[member].ToString());
                        member = 1;
                    }</pre>
<p>By using this approach, we get the same results in about 4 seconds however there is a time-space trade-off. There are approx 91K entries in the hashtable now; Hashtable can be pruned for further optimization. The complete listing follows.</p>
<pre  class="brush: csharp;" lang="C#">        private static void CollatzSequenceDP(ulong max)
        {
            ulong startingNum = 0;
            ulong longestSequence = 0;
            var dynPrg = new Hashtable();            

            for (ulong i = 1; i &lt; max; i++)
            {
                ulong member = i;
                ulong sequenceCnt = 0;
                ulong firstterm = 0;

                while (member != 1)
                {
                    if (member % 2 == 0)
                        member = member / 2;
                    else
                        member = 3 * member + 1;

                    if (firstterm == 0)
                        firstterm = member;

                    if (dynPrg.ContainsKey(member))
                    {
                        sequenceCnt += ulong.Parse(dynPrg[member].ToString());
                        member = 1;
                    }

                    sequenceCnt++;
                }

                if (longestSequence &lt; sequenceCnt)
                {
                    longestSequence = sequenceCnt;
                    startingNum = i;
                }

                if (!dynPrg.ContainsKey(firstterm))
                    dynPrg.Add(firstterm, sequenceCnt-1);

            }
            Console.WriteLine("Sequence Starter:" + startingNum + " - Longest Sequence=" + longestSequence + " " + dynPrg.Count);
        }</pre>
<p>Comparing the results of regular execution and one with dynamic programming approach, we see in the graph below that DM easily out performs unoptimized brute force in time as the execution path gets longer. Following graph is plotted with over 1000 data points for values of n ranging from 10-1000000 step 1000.</p>
<p>&nbsp;</p>
<p><a href="http://blog.adnanmasood.com/wp-content/uploads/2012/02/sequence-time-dm.png"><img class="aligncenter size-medium wp-image-750" title="sequence-time-dm" src="http://blog.adnanmasood.com/wp-content/uploads/2012/02/sequence-time-dm-300x185.png" alt="" width="300" height="185" /></a></p>
<p>Further improvements include parallelization of the algorithm and introducing prime sieves. I will be revisiting it with the <a href="http://msdn.microsoft.com/en-us/library/system.threading.tasks.parallel.for.aspx" target="_blank">Parallel.For</a> construct.</p>
<p>Last but not least, speaking of Dynamic Programming, let&#8217;s not confuse this with term with computer programming. The term was chosen by<a href="http://en.wikipedia.org/wiki/Richard_E._Bellman" target="_blank"> Richard Bellmen</a>, the inventor of paradigm to describe schedule. The idea has its roots in mathematics and is a general technique for solving complex optimization problems which can be decomposed into smaller overlapping sub problems.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F23%2Foptimizing-collatz-sequence-with-dynamic-programming%2F&amp;title=Optimizing%20Collatz%20Sequence%20with%20Dynamic%20Programming" id="wpa2a_2"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/23/optimizing-collatz-sequence-with-dynamic-programming/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Bayesian inference – A simple example</title>
		<link>http://blog.adnanmasood.com/2012/02/22/bayesian-inference-a-simple-example/</link>
		<comments>http://blog.adnanmasood.com/2012/02/22/bayesian-inference-a-simple-example/#comments</comments>
		<pubDate>Thu, 23 Feb 2012 04:34:08 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Research & Development]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=720</guid>
		<description><![CDATA[Illustration of the main idea of Bayesian inference, in the simple case of a univariate Gaussian with a Gaussian prior on the mean (and known variances).]]></description>
			<content:encoded><![CDATA[<p>Illustration of the main idea of Bayesian inference, in the simple case of a univariate Gaussian with a Gaussian prior on the mean (and known variances).</p>
<p><object width="560" height="315"><param name="movie" value="http://www.youtube-nocookie.com/v/0LQmZXCWMFI?version=3&amp;hl=en_US"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube-nocookie.com/v/0LQmZXCWMFI?version=3&amp;hl=en_US" type="application/x-shockwave-flash" width="560" height="315" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F22%2Fbayesian-inference-a-simple-example%2F&amp;title=Bayesian%20inference%20%26%238211%3B%20A%20simple%20example" id="wpa2a_4"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/22/bayesian-inference-a-simple-example/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Thriving with Paradigm Shifts (or how not to become a dinosaur)</title>
		<link>http://blog.adnanmasood.com/2012/02/16/coping-with-paradigm-shifts-or-how-not-to-become-a-dinosaur/</link>
		<comments>http://blog.adnanmasood.com/2012/02/16/coping-with-paradigm-shifts-or-how-not-to-become-a-dinosaur/#comments</comments>
		<pubDate>Thu, 16 Feb 2012 08:15:07 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Generic]]></category>
		<category><![CDATA[Life]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Research & Development]]></category>
		<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=724</guid>
		<description><![CDATA[Like most production systems, life happens in real time; and there has been several major paradigm shifts happening lately. It&#8217;s easy to shrug AJAX off as revamped XMLHTTP from late 90&#8242;s but we all know this isn&#8217;t exactly the case. With the thought process, frameworks and development around emerging technologies, sands are shifting faster than [...]]]></description>
			<content:encoded><![CDATA[<p>Like most production systems, life happens in real time; and there has been several major paradigm shifts happening lately. It&#8217;s easy to shrug AJAX off as revamped XMLHTTP from late 90&#8242;s but we all know this isn&#8217;t exactly the case. With the thought process, frameworks and development around emerging technologies, sands are shifting faster than ever before.</p>
<p>For an outside viewer, changes are huge. What follows is not absolute technology-counterpart-comparison but rather area under the drift. Traditional RDBMS to NoSQL, traditional Web Servers to Node and nginx, from typesafe languages to dynamic typing, tradional MVC (spring/<a href="http://asp.net/" target="_blank">asp.net</a>) to full stack scaffoldings (RoR), HTTP/SOAP to REST/JSON, postbacks to async, scaling up to Hadoop, ACID to CAP, proprietary data centers to cloud and the list goes on. Again, this list is not necessarily an absolute comparison of technology counterparts but these analogies have definitely come a long way since Tim O&#8217;Reilly did his famous <a href="http://oreilly.com/web2/archive/what-is-web-20.html" target="_blank">what is web 2.0 definition and table (see below) in 2005</a>.</p>
<div></div>
<div>
<table width="500" border="0" cellspacing="0" cellpadding="0">
<tbody>
<tr>
<th style="text-align: center;" scope="col" align="right" width="200">Web 1.0</th>
<th style="text-align: center;" scope="col" align="center" width="59"></th>
<th style="text-align: center;" scope="col" align="left" width="241">Web 2.0</th>
</tr>
<tr>
<td align="right">DoubleClick</td>
<td align="center">&#8211;&gt;</td>
<td>Google AdSense</td>
</tr>
<tr>
<td align="right">Ofoto</td>
<td align="center">&#8211;&gt;</td>
<td>Flickr</td>
</tr>
<tr>
<td align="right">Akamai</td>
<td align="center">&#8211;&gt;</td>
<td>BitTorrent</td>
</tr>
<tr>
<td align="right">mp3.com</td>
<td align="center">&#8211;&gt;</td>
<td>Napster</td>
</tr>
<tr>
<td align="right">Britannica Online</td>
<td align="center">&#8211;&gt;</td>
<td>Wikipedia</td>
</tr>
<tr>
<td align="right">personal websites</td>
<td align="center">&#8211;&gt;</td>
<td>blogging</td>
</tr>
<tr>
<td align="right">evite</td>
<td align="center">&#8211;&gt;</td>
<td>upcoming.org and EVDB</td>
</tr>
<tr>
<td align="right">domain name speculation</td>
<td align="center">&#8211;&gt;</td>
<td>search engine optimization</td>
</tr>
<tr>
<td align="right">page views</td>
<td align="center">&#8211;&gt;</td>
<td>cost per click</td>
</tr>
<tr>
<td align="right">screen scraping</td>
<td align="center">&#8211;&gt;</td>
<td>web services</td>
</tr>
<tr>
<td align="right">publishing</td>
<td align="center">&#8211;&gt;</td>
<td>participation</td>
</tr>
<tr>
<td align="right">content management systems</td>
<td align="center">&#8211;&gt;</td>
<td>wikis</td>
</tr>
<tr>
<td align="right">directories (taxonomy)</td>
<td align="center">&#8211;&gt;</td>
<td>tagging (&#8220;folksonomy&#8221;)</td>
</tr>
<tr>
<td align="right">stickiness</td>
<td align="center">&#8211;&gt;</td>
<td>syndication</td>
</tr>
</tbody>
</table>
</div>
<p>For computer scientists and software engineers with sound foundation in algorithms, operating systems, database systems (including distributed databases), computer networking and enterprise architecture, the situation isn&#8217;t quite hostile. There is no need to feel threatened by falling behind the learning curve due to lack of fundamental understanding and aptitude. However one should definitely be concerned if it&#8217;s due to, in Seth Godin&#8217;s terms, lizard brain laziness in learning and prototyping about these up and coming changes.</p>
<p>The fundamentals of distributed databases hasn&#8217;t changed much; however the ever-networked nature of world wide web has made it more plausible then ever to use them in practice. To draw an analogy from OSI model, majority of delta is happening in the application layer. This learning curve can only be overcome through training activities learning and persistent efforts. The same way we have avoided architectural astronauts and anti-patterns by writing code and optimizing it to solve real business and technology problems, it would be bridged by coding up mapreduce or improve technical vocabulary while idling through yet another View Model implementation. At least that&#8217;s how I envision it.</p>
<blockquote>
<div>&#8220;Once a new technology rolls over you, if you&#8217;re not part of the steamroller, you&#8217;re part of the road.&#8221;</div>
<div>-Stewart Brand<br />
<strong><br />
</strong></div>
</blockquote>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F16%2Fcoping-with-paradigm-shifts-or-how-not-to-become-a-dinosaur%2F&amp;title=Thriving%20with%20Paradigm%20Shifts%20%28or%20how%20not%20to%20become%20a%20dinosaur%29" id="wpa2a_6"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/16/coping-with-paradigm-shifts-or-how-not-to-become-a-dinosaur/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Feb 15th – Learn Command Query Responsibility Segregation and Mercurial</title>
		<link>http://blog.adnanmasood.com/2012/02/13/feb-15th-learn-command-query-responsibility-segregation-and-mercurial/</link>
		<comments>http://blog.adnanmasood.com/2012/02/13/feb-15th-learn-command-query-responsibility-segregation-and-mercurial/#comments</comments>
		<pubDate>Tue, 14 Feb 2012 03:02:13 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=686</guid>
		<description><![CDATA[San Gabriel Valley .NET Developers group&#8217;s next meeting is Wed Feb 15th. Please swing by to learn more about Command Query Responsibility Segregation and Mercurial source control usage in a team environment. See details below or on the sgv.net user group website Abstract: Command Query Responsibility Segregation (CQRS) is an approach, a mindset to reduce complexities [...]]]></description>
			<content:encoded><![CDATA[<p>San Gabriel Valley .NET Developers group&#8217;s next meeting is Wed Feb 15th. Please swing by to learn more about Command Query Responsibility Segregation and Mercurial source control usage in a team environment. See details below or on the <a href="http://sgvdotnet.org">sgv.net user group website</a></p>
<p>Abstract: Command Query Responsibility Segregation (CQRS) is an approach, a mindset to reduce complexities in application development. In its essence, CQRS is the creation of two objects where there was previously only one. CQRS is a very simple pattern that enables opportunities for architecture that may otherwise not exists. I will discuss what CQRS is in its simplest form and how it can be used to; capture business intent, data warehousing, event sourcing, and help reduce application complexity. After giving a brief overview of CQRS, I walk through developing a simple application using DDD and CQRS.</p>
<p>&nbsp;</p>
<p>Abstract: Working with Mercurial in a team<br />
Mercurial is a cross-platform, distributed revision control tool for software developers. Mercurial’s major design goals include high performance and scalability, decentralized, fully distributed collaborative development, robust handling of both plain text and binary files, and advanced branching and merging capabilities, while remaining conceptually simple. This discussion will give an introduction to Mercurial, as well as the client tools fully integrated in Visual Studio, and various work flows that can be used with Mercurial in your team.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F13%2Ffeb-15th-learn-command-query-responsibility-segregation-and-mercurial%2F&amp;title=Feb%2015th%20%E2%80%93%20Learn%20Command%20Query%20Responsibility%20Segregation%20and%20Mercurial" id="wpa2a_8"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/13/feb-15th-learn-command-query-responsibility-segregation-and-mercurial/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>On Unit testing Bentley’s binary search overflow condition</title>
		<link>http://blog.adnanmasood.com/2012/02/09/on-bentleys-binary-search-overflow-condition/</link>
		<comments>http://blog.adnanmasood.com/2012/02/09/on-bentleys-binary-search-overflow-condition/#comments</comments>
		<pubDate>Thu, 09 Feb 2012 15:51:05 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=691</guid>
		<description><![CDATA[One of the few unit tests one would write for a simple arithmetic operation such as addition is a check for overflow i.e. if the resulting value is of the operand type and therefore does not cause overflow error. More often than not, programmers mistakenly consider this issue to be GC&#8217;s responsibility in case of [...]]]></description>
			<content:encoded><![CDATA[<p>One of the few unit tests one would write for a simple arithmetic operation such as addition is a check for <a href="http://en.wikipedia.org/wiki/Integer_overflow" target="_blank">overflow </a>i.e. if the resulting value is of the operand type and therefore does not cause overflow error. More often than not, programmers mistakenly consider this issue to be GC&#8217;s responsibility in case of managed code languages (C#, Java). The examples below are in C# adapted from java implementations in <a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html" target="_blank">Joshua Bloch&#8217;s post</a>.</p>
<p>A classic case of <a href="http://googleresearch.blogspot.com/2006/06/extra-extra-read-all-about-it-nearly.html" target="_blank">uncaught overflow</a> which remain undiscovered for 20 years was in Jon Bentley&#8217;s amazing <a href="http://www.cs.bell-labs.com/cm/cs/pearls/" target="_blank">Programming Pearls</a> book <a href="http://www.cs.bell-labs.com/cm/cs/pearls/sketch04.html" target="_blank">implementation of binary search</a>. (The book by the way is a highly recommended reading for every engineer!). The erroneous code follows.</p>
<p>&nbsp;</p>
<pre class="brush: csharp;" lang="C#">public static int BinarySearch(int[] a, int key)
        {
            int low = 0;
            int high = a.Length - 1;

            while (low  key)
                    high = mid - 1;
                else
                    return mid; // key found
            }
            return -(low + 1); // key not found.
        }</pre>
<p>The bug resides in the addition line #6 where int mid = (low + high) / 2; i.e. in case of int.Max. Modern compilers are intelligent enough to detect these errors during compile time</p>
<p>So for example, all the following three statements will &#8220;Overflow in constant value computation&#8221;</p>
<pre class="brush: csharp;" lang="C#">int a = int.MaxValue + 1;
var a = int.MaxValue + 1;
dynamic a = int.MaxValue + 1;</pre>
<p>However, the compiler would not protect you from shooting your own foot if you insist on doing things like</p>
<pre class="brush: csharp;" lang="C#">int max = int.MaxValue;
            int a = max + 1;</pre>
<p>In this case, what you get in the value a is -2147483648 which is int.MinValue. If developer thinks var would protect him, think again because CLI considers int+int as int. Therefore, the following will result in int.MinValue as well.</p>
<pre class="brush: csharp;" lang="C#"> int max = int.MaxValue;
var a = max + 1;
as well as
dynamic a = max + 1;</pre>
<p>Now get back to the original topic of binary search overflow. A simple test to get this value would be</p>
<pre class="brush: csharp;" lang="C#">BinarySearch(Enumerable.Range(0, int.MaxValue - 1).ToArray(), new Random().Next());</pre>
<p>where you would create a large array of pseudo random numbers. However, an effort to create an array of size in.Max would result in an out of memory exception. A test method stub looks like follows.</p>
<pre class="brush: csharp;" lang="C#">        [TestMethod()]
        public void BinarySearchTest()
        {
            int[] a = Enumerable.Range(0, int.MaxValue - 1).ToArray();
            int key = 0; // TODO: Initialize to an appropriate value
            int expected = 0; // TODO: Initialize to an appropriate value
            int actual;
            actual = Program.BinarySearch(a, key);
            Assert.AreEqual(expected, actual);
            Assert.Inconclusive("Verify the correctness of this test method.");
        }</pre>
<p>Trying to simulate this with shorts is still hard because counter intuitively, the sum of shorts is actually an integer. Therefore, the following statement results in a compile time error.</p>
<pre class="brush: csharp;" lang="C#">short c = 10, d = 10;
short e = c + d;</pre>
<p>Therefore you cannot simulate the condition unless you cast it back</p>
<pre class="brush: csharp;" lang="C#">short mid = (short)((low + high)/2);</pre>
<p>which kind of makes it a moot point anymore. And this is the reason why this bug has manifested itself without resolution for such a long time in a popular algorithm like binary search. The fixed version substitutes</p>
<pre class="brush: csharp;" lang="C#">short mid = (short)((low + high)/2);</pre>
<p>with</p>
<pre class="brush: csharp;" lang="C#">int mid = low + ((high - low) / 2);</pre>
<p>which are both functionally equivalent but the second statement does not go out of bounds since the subtraction operation along with division guarantees the int.Max bound.</p>
<pre class="brush: csharp;" lang="C#">        public static int BinarySearchFixed(int[] a, int key)
        {
            int low = 0;
            int high = a.Length - 1;
            while (low  key)
                    high = mid - 1;
                else
                    return mid; // key found
            }
            return -(low + 1); // key not found.
        }</pre>
<p>It can be optimized by using the <a href="http://msdn.microsoft.com/en-us/library/aa691377(v=vs.71).aspx" target="_blank">bitwise shift operator</a> &gt;&gt; in C# for dividing by 2. Since we don&#8217;t have an unsigned shift, there would be some casting needed to unsigned int essentially increasing the range.</p>
<pre class="brush: csharp;" lang="C#">
public static int BinarySearchOptimized(int[] a, int key)
        {
            int low = 0;
            int high = a.Length - 1;

            while (low &lt;= high)
            {
                int mid = (int)(((uint) high + (uint) low) &gt;&gt; 1);
                int midVal = a[mid];

                if (midVal &lt; key)
                    low = mid + 1;
                else if (midVal &gt; key)
                    high = mid - 1;
                else
                    return mid; // key found
            }
            return -(low + 1); // key not found.
        }</pre>
<p>Is this perfect? May be. How about uint to int casting here, is this downsizing going to work. In most cases, it would. In order to test, the empirical testing and formal methods would help but nothing is guaranteed and hence the iterative process of static code analysis and peer code reviews.<br />
<a href='http://blog.adnanmasood.com/wp-content/uploads/2012/02/BinarySearch.rar'>BinarySearch VS.NET 2010 Solution Download</a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F09%2Fon-bentleys-binary-search-overflow-condition%2F&amp;title=On%20Unit%20testing%20Bentley%26%238217%3Bs%20binary%20search%20overflow%20condition" id="wpa2a_10"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/09/on-bentleys-binary-search-overflow-condition/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Developer’s Contest hosted by UCLA Anderson School of Management</title>
		<link>http://blog.adnanmasood.com/2012/02/05/developers-contest-hosted-by-ucla-anderson-school-of-management/</link>
		<comments>http://blog.adnanmasood.com/2012/02/05/developers-contest-hosted-by-ucla-anderson-school-of-management/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 19:56:11 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Events]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=689</guid>
		<description><![CDATA[WHAT:The Developer’s Contest hosted by the Entrepreneur Association @ the UCLA Anderson School of Management HOW IT WORKS:You and a team (up to three people) develop a business idea from scratch over a single weekend to win cash prizes. WHEN:February 24 &#8211; February 26 WHY: Develop a business idea from inception Show off your programming [...]]]></description>
			<content:encoded><![CDATA[<p>WHAT:The Developer’s Contest hosted by the Entrepreneur Association @ the UCLA Anderson School of Management</p>
<p>HOW IT WORKS:You and a team (up to three people) develop a business idea from scratch over a single weekend to win cash prizes.</p>
<p>WHEN:February 24 &#8211; February 26</p>
<p>WHY:</p>
<ul>
<li>Develop a business idea from inception</li>
<li>Show off your programming talent</li>
<li>Meet potential employers and aspiring entrepreneurs</li>
<li>Develop your resume</li>
</ul>
<p>Format in brief:<br />
Up to 10 UCLA Anderson students will give a 1-minute pitch of their business idea to a group of developers at the Developer Contest kickoff on Friday. After the developers have heard all 10 pitches, they will then vote for the idea that they want to develop that weekend.</p>
<p>After the vote, the pitching Anderson student who received the most votes will have 20-30 minutes to answer Q&amp;A with the developers about the idea and go into further detail. The developers may form teams of up to 3 members, with the option of selecting an Anderson student as a consultant.</p>
<p>The developer teams are given the weekend to develop a prototype and to prepare a presentation of their final product. Sunday evening each developer team will present to a board of judges. The winning team/developer will be selected by the judges and will receive cash and/or other prizes.</p>
<p>UCLA Anderson School of Management, 110 Westwood Plaza, Los Angeles, CA 90095</p>
<p>MORE INFORMATION AND RSVP ONLINE: <a href="http://bit.ly/EAdevContest" target="_blank">http://bit.ly/<wbr>EAdevContest</wbr></a></p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F05%2Fdevelopers-contest-hosted-by-ucla-anderson-school-of-management%2F&amp;title=Developer%26%238217%3Bs%20Contest%20hosted%20by%20UCLA%20Anderson%20School%20of%20Management" id="wpa2a_12"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/05/developers-contest-hosted-by-ucla-anderson-school-of-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>How to tweet (or blog) in Urdu</title>
		<link>http://blog.adnanmasood.com/2012/02/03/how-to-tweet-or-blog-in-urdu/</link>
		<comments>http://blog.adnanmasood.com/2012/02/03/how-to-tweet-or-blog-in-urdu/#comments</comments>
		<pubDate>Fri, 03 Feb 2012 15:04:16 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Generic]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=676</guid>
		<description><![CDATA[Gone are the days of inpage; now writing Urdu universally in unicode is rather easy on both mac and PC (and Linux). Yesterday I was asked by a friend regarding how to tweet in Urdu. Here is a short 3 step guide without reinventing the wheel. 1. If you are not familiar with Urdu phonetic [...]]]></description>
			<content:encoded><![CDATA[<p>Gone are the days of inpage; now writing Urdu universally in unicode is rather easy on both mac and PC (and Linux). Yesterday I was asked by a friend regarding how to tweet in Urdu. Here is a short 3 step guide without reinventing the wheel.</p>
<p>1. If you are not familiar with Urdu phonetic keyboard, the quickest way is to use Google Transliterate <a href="http://www.google.com/transliterate/Urdu" target="_blank">http://www.google.com/transliterate/Urdu</a></p>
<p>2. Urdu keyboard is quite easy to learn. If you want native support of Urdu in your operating system, follow the steps according to your OS.</p>
<ul>
<li><a href="http://patriot.net/~abdali/urdumac.html" target="_blank">Urdu Keyboard installation instructions for MAC</a></li>
<li><a href="http://www.crulp.org/software/localization/keyboards/crulpphonetickbv1.1.html" target="_blank">Urdu Keyboard installation instructions for PC</a></li>
</ul>
<p>Since I use both MAC and PC for native urdu support, I have tried and tested both the mechanisms and they work just fine.</p>
<p>3. If you are using transliteration, you would copy and paste the Urdu text into your favorite twitter / blogging client. Not all clients support unicode; tweetdeck didn&#8217;t use to but twitter.com does support Unicode.</p>
<p>Happy tweeting / blogging.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F03%2Fhow-to-tweet-or-blog-in-urdu%2F&amp;title=How%20to%20tweet%20%28or%20blog%29%20in%20Urdu" id="wpa2a_14"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/03/how-to-tweet-or-blog-in-urdu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Session Notes – Practical AppFarbic @ Southern California .NET Developers Group</title>
		<link>http://blog.adnanmasood.com/2012/02/02/session-notes-practical-appfarbic-southern-california-net-developers-group/</link>
		<comments>http://blog.adnanmasood.com/2012/02/02/session-notes-practical-appfarbic-southern-california-net-developers-group/#comments</comments>
		<pubDate>Thu, 02 Feb 2012 15:34:54 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Speaking]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=681</guid>
		<description><![CDATA[Last night I presented on appfabric at Southern California .NET Developers Group in Buena Park. This talk was an expanded version of my earlier talk in the code camp talk last weekend. I get a chance to talk a little more about network topology and enterprise load balancing scenarios where appfabric caching and session management really [...]]]></description>
			<content:encoded><![CDATA[<p>Last night I presented on <a href="http://msdn.microsoft.com/en-us/windowsserver/ee695849" target="_blank">appfabric </a>at <a href="http://www.socaldotnet.org/Home/tabid/80/ctl/Details/Mid/524/ItemID/7863/Default.aspx" target="_blank">Southern California .NET Developers Group</a> in Buena Park. This talk was an expanded version of <a href="http://blog.adnanmasood.com/2012/01/30/session-notes-practical-appfarbic-socal-code-camp-fullerton/" target="_blank">my earlier talk in the code camp talk</a> last weekend. I get a chance to talk a little more about network topology and enterprise load balancing scenarios where appfabric caching and session management really helps. I also touched upon few topics including <a href="http://mdcadmintool.codeplex.com/" target="_blank">AppFabric Caching Admin tool</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790890.aspx" target="_blank">Concurrency Models (Windows Server AppFabric Caching)</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790849.aspx" target="_blank">Windows Server AppFabric Caching Concepts</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790849.aspx" target="_blank">Windows Server AppFabric Caching Logical Architecture</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790849.aspx" target="_blank">Windows Server AppFabric Caching Physical Architecture</a>  and <a href="http://msdn.microsoft.com/en-us/library/ee790849.aspx" target="_blank">Concepts and Architecture</a> for app fabric design and deployment. My recently submitted tip on code project regarding <a href="Windows Server AppFabric Service Validation http://www.codeproject.com/Tips/322682/Windows-Server-AppFabric-Service-Validation " target="_blank">Windows Server AppFabric Service Validation</a> was also demonstrated.</p>
<p><a href="http://blog.adnanmasood.com/wp-content/uploads/2012/02/powershell.png"><img class="aligncenter" title="powershell" src="http://blog.adnanmasood.com/wp-content/uploads/2012/02/powershell-300x195.png" alt="" width="300" height="195" /></a></p>
<p>Last but not least, one of the attendees brought up an excellent question of how to handle HIPAA and PCI compliant data in the cloud. To the best of my knowledge, based on my last conversations at the cloud summit in LA, the best approach is to do a hybrid cloud implementation i.e. public cloud CDN Style for the public facing sites while keep the sensetive data in-house where your internal data center is PCI/HIPAA compliant. Feel free to check with <a href="http://lynnlangit.wordpress.com/" target="_blank">Lynn</a> since she has been following this area closely.</p>
<p>Thanks to the great audience including celebrities like <a href="http://www.jeremybytes.com/" target="_blank">Jeremy Clark </a>. Special thanks to Art Villa and <a href="http://www.linkedin.com/groups/Announcement-from-Southern-California-NET-121338.S.92123041?qid=a2149dbc-ed73-4cef-a4ec-68371a064226&amp;goback=%2Egna_121338" target="_blank">Janet Chung</a> for the speaking opportunity. For links and code sample, please <a href="http://blog.adnanmasood.com/2012/01/30/session-notes-practical-appfarbic-socal-code-camp-fullerton/" target="_blank">see my previous talk</a>.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F02%2F02%2Fsession-notes-practical-appfarbic-southern-california-net-developers-group%2F&amp;title=Session%20Notes%20%E2%80%93%20Practical%20AppFarbic%20%40%20Southern%20California%20.NET%20Developers%20Group" id="wpa2a_16"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/02/02/session-notes-practical-appfarbic-southern-california-net-developers-group/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>“Web 2.0 Architectures” – A Big Picture Architectural Overview of the Web 2.0</title>
		<link>http://blog.adnanmasood.com/2012/01/31/web-2-0-architectures-a-big-picture-architectural-overview-of-the-web-2-0/</link>
		<comments>http://blog.adnanmasood.com/2012/01/31/web-2-0-architectures-a-big-picture-architectural-overview-of-the-web-2-0/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 20:30:18 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[Enterprise Architecture]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=661</guid>
		<description><![CDATA[If you are trying to decipher web 2.0 related terms, acronyms and buzzwords, you are definitely not alone. It is hard to quantify what exactly a web 2.0 design entails; “I know it when I see it” does not help explaining the characteristic features of modern web architecture including design patterns, core models, reference architectures [...]]]></description>
			<content:encoded><![CDATA[<p>If you are trying to decipher web 2.0 related terms, acronyms and buzzwords, you are definitely not alone. It is hard to quantify what exactly a web 2.0 design entails; “I know it when I see it” does not help explaining the characteristic features of modern web architecture including design patterns, core models, reference architectures and solution patterns. “<a href="http://shop.oreilly.com/product/9780596514433.do?sortby=bestSellers" target="_blank">Web 2.0 Architectures</a>” by <a href="http://www.redmonk.com/jgovernor/" target="_blank">Governor</a>, <a href="http://www.zdnet.com/blog/hinchcliffe" target="_blank">Hinchcliffe </a>and <a href="http://technoracle.blogspot.com/2009/05/book-web-20-architectures.html" target="_blank">Nickull </a>attempts to crack the code of web 2.0 jargon and strives to help reader make sense of this ever changing web ecosystem.</p>
<p><a href="http://www.amazon.com/gp/product/0596514433/ref=cm_cr_mts_prod_img" target="_blank"><img class="aligncenter size-medium wp-image-677" title="web 2.0 architectures" src="http://blog.adnanmasood.com/wp-content/uploads/2012/01/web-2.0-architectures-240x300.jpg" alt="" width="240" height="300" /></a><br />
The well written and organized book is divided into eight chapters which discuss design patterns, reference models and architecture artifacts. The web 2.0 patterns discussed in the book includes Service Oriented Architecture (SOA), Collaborative Tagging (folksonomy), Synchronized Web, SaaS (cloud computing), Persistent Rights Management, Mashup, Rich User Experience, Participation/Collaboration, Asynchronous Particle Update, ,Semantic Web Grounding and Structured Information. This categorization helps distinguish salient features of a web 2.0 architecture and help define what richness actually means in a rich internet application.<br />
If you have been working in the field long enough, the meme map on page # 63 will help skimming through chapter 3 (which contains web 2.0 example sites) so you can get to the core of the book. Chapters 4 to 7 discuss specific patterns for web 2.0, models, and reference architectures. As mentioned in the book’s title as well as title of this review, “web 2.0 architectures” is focused on big picture architectural overview of the Web 2.0. Even though it’s not a 10000 ft. abstract overview whitepaper, it also does not converse nitty gritty details of building a 2.0 app using jquery and node.js. This text is about concepts, models, reference architectures and common recurring themes in web 2.0 sites. It does not concern itself with specific technologies and implementation details but rather talk about the common paradigm. Therefore, if you are considering it as a cookbook/recipes book for web 2.0 applications, you will be sorely disappointed. However, if you are a web engineer / architect or a technologist interested in the underlying design patterns and attributes of web 2.0, <a href="http://shop.oreilly.com/product/9780596514433.do?sortby=bestSellers" target="_blank">this book</a> is for you.</p>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F01%2F31%2Fweb-2-0-architectures-a-big-picture-architectural-overview-of-the-web-2-0%2F&amp;title=%26%238220%3BWeb%202.0%20Architectures%26%238221%3B%20%26%238211%3B%20A%20Big%20Picture%20Architectural%20Overview%20of%20the%20Web%202.0" id="wpa2a_18"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/01/31/web-2-0-architectures-a-big-picture-architectural-overview-of-the-web-2-0/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Session Notes – Practical AppFarbic @ SoCal Code Camp Fullerton</title>
		<link>http://blog.adnanmasood.com/2012/01/30/session-notes-practical-appfarbic-socal-code-camp-fullerton/</link>
		<comments>http://blog.adnanmasood.com/2012/01/30/session-notes-practical-appfarbic-socal-code-camp-fullerton/#comments</comments>
		<pubDate>Tue, 31 Jan 2012 04:00:30 +0000</pubDate>
		<dc:creator>Adnan Masood</dc:creator>
				<category><![CDATA[Events]]></category>
		<category><![CDATA[Speaking]]></category>

		<guid isPermaLink="false">http://blog.adnanmasood.com/?p=665</guid>
		<description><![CDATA[One of the great benefits of speaking to a group of peer developers and engineers is the valuable feedback and learning. In my yesterday&#8217;s session on Practical AppFabric Caching, there were various great questions from audience pertaining to app fabric development, deployment and configuration in the wild. The questions were about use of local cache, appfabric security [...]]]></description>
			<content:encoded><![CDATA[<p>One of the great benefits of speaking to a group of peer developers and engineers is the valuable feedback and learning. In my yesterday&#8217;s session on <a href="http://www.socalcodecamp.com/session.aspx?sid=798e6b5c-8ec7-49bc-aa5a-e4f804293855" target="_blank">Practical AppFabric Caching</a>, there were various great questions from audience pertaining to app fabric development, deployment and configuration in the wild. The questions were about <a href="http://msdn.microsoft.com/en-us/library/ee790983.aspx" target="_blank">use of local cache</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790983.aspx" target="_blank">appfabric security model</a>, <a href="http://stackoverflow.com/questions/3018089/question-about-how-appfabrics-cache-feature-can-be-used" target="_blank">local cache vs. global cache scenarios</a>, <a href="http://msdn.microsoft.com/en-us/library/ee790974.aspx" target="_blank">high availability</a>,  <a href="http://msdn.microsoft.com/en-us/library/ff637725.aspx" target="_blank">performance monitoring</a> and <a href="http://msdn.microsoft.com/en-us/library/ff921010.aspx" target="_blank">health monitoring / SCOM</a> in appfabric. I am planning to do detailed blog posts on these topics in near future; but for now, these links should answer the immediate concerns.</p>
<p>As discussed, <a href="http://www.microsoft.com/download/en/details.aspx?id=27115" target="_blank">AppFabric 1.1 can be downloaded from here</a> which introduces read-through and write-behind provider support, graceful shutdown, domain account support, new ASP.NET session state and output caching providers, compression and multiple cache client application configuration sections to the existing appfabric feature-set. The sample app can be downloaded from here. <a href="http://blog.adnanmasood.com/wp-content/uploads/2012/01/CacheWebAppSample.rar">CacheWebAppSample</a>.</p>
<p>Links</p>
<ul>
<li><a href="http://msdn.microsoft.com/en-us/windowsserver/ee695849" target="_blank">AppFabric Home @ Microsoft</a></li>
<li><a href="http://en.wikipedia.org/wiki/Cache_algorithms" target="_blank">Caching Algorithms</a></li>
<li><a href="www.hanselman.com/blog/InstallingConfiguringAndUsingWindowsServerAppFabricAndTheVelocityMemoryCacheIn10Minutes.aspx" target="_blank">Installing, Configuring and Using Windows Server AppFabric and the &#8220;Velocity&#8221; Memory Cache in 10 minutes</a></li>
<li><a href="http://www.packtpub.com/microsoft-windows-server-appfabric-cookbook/book" target="_blank">Microsoft Windows Server AppFabric Cookbook</a></li>
<li><a href="http://toddrobinson.com/appfabric/appfabric-cache-feature-comparisons/" target="_blank">AppFabric Cache Feature Comparisons</a></li>
<li><a href="http://download.microsoft.com%2Fdownload%2F1%2Fb%2F2%2F1b21d4a1-c84c-4cb8-923a-740bd927cdeb%2Fvelocity%2520benchmark%2520white%2520paper.docx&amp;ei=s-omT--0OuHaiQKWxv37Bw&amp;usg=AFQjCNFj81YVtkqgVCmSzG90TIDRhizZQg" target="_blank">Velocity vs. HA Velocity</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/aa139633.aspx" target="_blank">Windows Server AppFabric Introduction</a></li>
<li><a href="http://msdn.microsoft.com/en-us/library/ff425062(v=WS.10).aspx" target="_blank">AppFabric Client API</a></li>
<li><a href="http://msdn.microsoft.com/en-us/windowsserver/ee695849.aspx" target="_blank">Windows Server AppFabric  Learning Center</a></li>
</ul>
<p><a class="a2a_dd a2a_target addtoany_share_save" href="http://www.addtoany.com/share_save#url=http%3A%2F%2Fblog.adnanmasood.com%2F2012%2F01%2F30%2Fsession-notes-practical-appfarbic-socal-code-camp-fullerton%2F&amp;title=Session%20Notes%20%26%238211%3B%20Practical%20AppFarbic%20%40%20SoCal%20Code%20Camp%20Fullerton" id="wpa2a_20"><img src="http://blog.adnanmasood.com/wp-content/plugins/add-to-any/share_save_171_16.png" width="171" height="16" alt="Share"/></a></p>]]></content:encoded>
			<wfw:commentRss>http://blog.adnanmasood.com/2012/01/30/session-notes-practical-appfarbic-socal-code-camp-fullerton/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

