<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>William Jacobson (.com)</title>
	<atom:link href="http://williamjacobson.com/weblog/feed/" rel="self" type="application/rss+xml" />
	<link>http://williamjacobson.com/weblog</link>
	<description>The Stuff That Falls Out Of My Head When I Shake It</description>
	<lastBuildDate>Fri, 10 Apr 2009 03:15:32 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title></title>
		<link>http://williamjacobson.com/weblog/277/</link>
		<comments>http://williamjacobson.com/weblog/277/#comments</comments>
		<pubDate>Fri, 10 Apr 2009 03:15:32 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/277/</guid>
		<description><![CDATA[]]></description>
			<content:encoded><![CDATA[<p><a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/04/quiz-dork.png"><img class="aligncenter size-medium wp-image-276" title="quiz-dork" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/04/quiz-dork-300x225.png" alt="quiz-dork" width="300" height="225" /></a></p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F277%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/277/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ActionScript 3 vs Pixel Bender on Cellular Automata</title>
		<link>http://williamjacobson.com/weblog/actionscript-3-vs-pixel-bender-on-cellual-automata/</link>
		<comments>http://williamjacobson.com/weblog/actionscript-3-vs-pixel-bender-on-cellual-automata/#comments</comments>
		<pubDate>Thu, 26 Mar 2009 17:49:21 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Flex/Flash/ActionScript]]></category>
		<category><![CDATA[Bitmap]]></category>
		<category><![CDATA[BitmapData]]></category>
		<category><![CDATA[CA]]></category>
		<category><![CDATA[Cellular Automata]]></category>
		<category><![CDATA[Pixel Bender]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=204</guid>
		<description><![CDATA[Flash 10, Flex 3, and ActionScript 3 have their limitations. For one, the Flash 10 Player is not multithreaded nor does it take advantage of multiple CPUs. This is a limitation that can hopefully be eliminated in future versions of Flash. But for now, this means that if you create an ActionScript program and want [...]]]></description>
			<content:encoded><![CDATA[<p>Flash 10, Flex 3, and ActionScript 3 have their limitations. For one, the Flash 10 Player is not multithreaded nor does it take advantage of multiple CPUs. This is a limitation that can hopefully be eliminated in future versions of Flash. But for now, this means that if you create an ActionScript program and want users to be able to click buttons and interact with the user interface while other work (like rendering large images) is done at the same time, you have to break big tasks into little chunks and &#8220;simulate&#8221; multithreading. Nonetheless, you&#8217;ll still only ever get one CPU attacking a problem.</p>
<ul>
</ul>
<p>So if you want to do some serious calculations in Flash/Flex (which you often have to do to make anything <em>really </em>interesting happen), you will likely be disappointed by the performance.</p>
<p>Enter <a href="http://labs.adobe.com/technologies/pixelbender/">Adobe Pixel Bender</a>. As the name suggests, this tool lets developers write programs (called kernels) to &#8220;bend&#8221; pixels to their will and have them do all sorts of crazy things. Pixel Bender lets you write fills, filters, and blenders that you can use inside Photoshop, After Effects, and Flash 10. Gaussian Blurs, Color Channel Swapping, Multiply Mode Image Blending, and a slew of fancy custom algorithms are pretty easy to implement with Pixel Bender.</p>
<p>The nice thing is that Pixel Bender doesn&#8217;t really care too much if the input is a JPEG image of flowers, a big matrix of MP3 sound file data, or (in the example below) the state of cells in a <a href="http://en.wikipedia.org/wiki/Cellular_automata">cellular automata</a>. What matters is that <strong>Pixel Bender lets us take advantage of a little Flash loophole: Flash 10 is able to run filters/shaders/blenders multithreaded AND on multiple CPUs.</strong> So if you can figure out how to describe a problem in such a way as to allow Pixel Bender to work on it, you can stand to speed up the computations by a factor of 2 to 10 or more.</p>
<p>The program below demonstrates some speed gain. It implements <a href="http://en.wikipedia.org/wiki/Conway%27s_Game_of_Life">Conway&#8217;s Game of Life</a>. In each image, white pixels are &#8220;alive&#8221; and black pixels are &#8220;dead&#8221;. One tab runs the program in pure ActionScript. The second tab runs the algorithm using a Pixel Bender kernel. Run each one and see how long it takes to execute 25 generations. There are two additional options:</p>
<p><strong>Refresh Display:</strong> When unchecked, the field will not be redrawn each generation. This allows the update algorithm to run as quickly as possible, without the expense of drawing the image each time.</p>
<p><strong>No Conditionals: </strong>The most basic Game of Life algorithm uses a series of if-then-else conditionals to decide what the next state of a cell should be. For example, if the cell is alive and has more than three living neighbors, the cell should die. <span style="text-decoration: line-through;">As my friend <a href="http://www.zensoft.com/company_staff_bob.html">Robert Sundling</a> pointed out to me, these conditionals cause a problem in Pixel Bender. When the conditionals are compiled they intersperse the code with jump instructions. These jump instructions create multiple code paths and limit the processors ability to utilize SSE instructions and effectively process several pixels at once.</span> (EDIT NOTE: I didn&#8217;t quite make the change my friend Bob had suggested. I still need to change my Pixel Bender code to utilize float4 rather than floats. Then those operations can run on all four floats at once. Will do that soon. So the rest of this paragraph doesn&#8217;t make a ton of sense. But it&#8217;s still faster, so I&#8217;m leaving it for now.) To address this, the simple if-then-else-based Game of Life algorithm was replaced with one that does not use conditionals, just mathematics. For symmetry, the AS3 algorithm was also rewritten without conditionals so it would use the same mathematics (namely, absolute value, multiplication, addition). However, although Pixel Bender can execute an absolute value calculation quite quickly, the same cannot be said for AS3. The Math.abs(x) function is slow compared to a simple (x&lt;0) ? -1*x : x statement. So, to avoid needlessly penalizing the AS3 code, I used the quicker version. You will note that the AS3 code without conditionals is a bit slower than the AS3 with them. I suspect this is mainly due to the fact that the conditionals prevent large chunks of code from being run depending on the pixel. This saving cannot make up for the speed boost realized by Pixel Bender even though it executes all code for every pixel.</p>
<p>I tried to be sure that the algorithm was implemented the same way in both ActionScript and Pixel Bender (aside from the exceptions regarding conditionals in place of Math library calls)  so that the performance comparison is valid. However, I did not attempt to optimize the algorithm overall. For example, each pixel (a 32 bit value) represents a single cell that is either living or dead. Clearly, a more efficient algorithm could store the state of many cells in a single integer. It would also be better to use a lookup table for determining the next state for 4&#215;4 (or larger) regions, rather than using a series of if-then-else statements or math functions for each pixel. There are many ways one could make a Game of Life simulation much faster, even before considering Pixel Bender, but this was not the goal for this experiment.</p>
<p>Also, this is a 768&#215;768 simulation. Since Pixel Bender helps most by speeding up access to pixels and running kernels in parallel on multiple CPUs, running the simulation on larger grids for fewer generations will show a larger speed gain than running on tiny grids for many generations (even though the total number of pixels &#8220;touched&#8221; in each case is the same).</p>
<p>Here it is:</p>
<p><a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/03/GameOfLife.html"><img class="aligncenter size-full wp-image-242" title="gameoflife" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/03/gameoflife.png" alt="gameoflife" width="500" height="600" /></a></p>
<p style="text-align: center;"><a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/03/GameOfLife.html" target="_blank">Game Of Life: ActionScript vs Pixel Bender (open in new window)</a></p>
<p style="text-align: left;">View Source has been enabled and you can see both the ActionScript and Pixel Bender code. I ran this application on three of my computers (all Firefox with non-debugging Flash Player, Refresh Display option turned off so UI redraws wouldn&#8217;t be counted in the run times, with both conditional and non-conditional versions of the algorithm) and saw the following results after averaging 10 runs of 25 generations each:</p>
<p style="text-align: left;">
<table style="width: 510px; height: 218px;" border="0" cellspacing="4" cellpadding="4">
<tbody>
<tr>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">CPU</span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">AS3 (cond)<br />
 </span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">PB (cond)<br />
 </span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">% Improvement</span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">AS3 (no cond)</span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">PB (no cond)</span></span></strong></td>
<td><strong><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">% Improvement</span></span></strong></td>
</tr>
<tr>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Intel Core 2 6600 @ 2.4GHz (2 CPU)</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">2.92</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">2.30</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">27.0%</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">3.54</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">0.96</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">269%</span></span></td>
</tr>
<tr>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Intel T2500 @ 2.0GHz (2 CPU)</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">4.28</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">3.44</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">24.4%</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">5.20</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">1.96</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">165%</span></span></td>
</tr>
<tr>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">Intel P4 @ 2.4GHz (1 CPU)</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">8.22</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">17.88</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">-54.0%</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">9.25</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">4.72</span></span></td>
<td><span style="font-family: arial,helvetica,sans-serif;"><span style="font-size: x-small;">96.0%</span></span></td>
</tr>
</tbody>
</table>
<p>Some interesting results here:</p>
<ol>
<li>The greatest gain is for faster multicore computers when effort is made to remove conditional branching from the kernel code (don&#8217;t use if statements), even though this might mean executing more instructions overall in the kernel. </li>
<li>Removing conditional branching from AS3 code can easily be counter-productive. If the conditionals allow you to skip over large chunks of code, they are likely worth keeping.</li>
<li>On slower, single core computers, using Pixel Bender unwisely can hurt you rather than help. Since you don&#8217;t benefit from leveraging multiple cores, the overhead of using Pixel Bender can kill you. </li>
<li>However, even on slower machines, if you can strip out conditionals from your kernel, you can see dramatic improvements in execution time.</li>
</ol>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=ActionScript%203%20vs%20Pixel%20Bender%20on%20Cellular%20Automata&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Factionscript-3-vs-pixel-bender-on-cellual-automata%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/actionscript-3-vs-pixel-bender-on-cellual-automata/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Photo Decrapifier</title>
		<link>http://williamjacobson.com/weblog/test-data-for-photogarithms/</link>
		<comments>http://williamjacobson.com/weblog/test-data-for-photogarithms/#comments</comments>
		<pubDate>Tue, 27 Jan 2009 23:45:35 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Flex/Flash/ActionScript]]></category>
		<category><![CDATA[Image Processing]]></category>
		<category><![CDATA[Clustering]]></category>
		<category><![CDATA[Photo]]></category>
		<category><![CDATA[Remove Clutter]]></category>
		<category><![CDATA[Remove Tourists]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=88</guid>
		<description><![CDATA[Introduction The following application generates a single &#8220;flawless&#8221; composite image by ignoring transient elements detected in multiple images and stitching together the remaining static features. For example, suppose you wanted to capture a photo of a popular beach or city street, but do not want crowds of random people in the image. Unless you can [...]]]></description>
			<content:encoded><![CDATA[<h3>Introduction</h3>
<p>The following application generates a single &#8220;flawless&#8221; composite image by ignoring transient elements detected in multiple images and stitching together the remaining static features.</p>
<p>For example, suppose you wanted to capture a photo of a popular beach or city street, but do not want crowds of random people in the image. Unless you can arrange for the beach or boulevard to be deserted during the shoot, you are likely going to have to retouch the photo to remove the unwanted clutter. For example, you could use the manual process described at <a href="http://dsphotographic.com/articles/how-to-remove-tourists-from-your-photos/">dsphotographic.com</a> to mask out flaws or, if you happen to have Photoshop CS3 or CS4 Extended, the more automated &#8220;image stack&#8221; method described at <a href="http://www.aecbytes.com/tipsandtricks/2008/issue27-photoshop.html">aecbytes.com</a>. Another option is to use the free tool below&#8230;</p>
<h3>Instructions</h3>
<ol>
<li>Serious users should <a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/photogarithms4.swf">Run Photo Decrapifier in a new window (useful since it can be resized)</a>.</li>
<li>Enter up to five URLs for images (the images must be online; you cannot upload from your PC through this version of the application). The images must be the same size and should be taken of the same scene, separated by enough time so that moving elements shift position substantially. Photos should ideally be taken using a tripod or this <a href="http://blog.wired.com/gadgets/2008/01/make-your-own-t.html">cheap substitute</a>; this version does not correct for image offset due to jitter. If necessary, align the images to each other as best as you can in Photoshop (or whatever) first. <strong>The URLs of the five images shown above are set as default.</strong></li>
<li>Click the &#8220;Load&#8221; button. The images should be visible in the preview panel.</li>
<li>Adjust the settings (explained below). For good results, just accept the defaults (leave setting alone).</li>
<li>Click the &#8220;Process&#8221; button. The program will analyze the images, extract static features, and composite them to a new image.</li>
<li>Continue reading below for an explanation of the algorithms used in more detail.</li>
</ol>
<p style="text-align: center;">(1)<a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0004_11.jpg"><img class="alignnone size-full wp-image-107" title="yard_0004_11" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0004_11.jpg" alt="" width="144" height="106" /></a> (2)<a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0003_2.jpg"><img class="alignnone size-full wp-image-109" title="yard_0003_2" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0003_2.jpg" alt="" width="144" height="106" /></a> (3)<a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0002_3.jpg"><img class="alignnone size-full wp-image-110" title="yard_0002_3" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0002_3.jpg" alt="" width="144" height="106" /></a></p>
<p style="text-align: center;">(4)<a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0001_4.jpg"><img class="alignnone size-full wp-image-113" title="yard_0001_4" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0001_4.jpg" alt="" width="144" height="106" /></a> (5)<a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0000_5.jpg"><img class="alignnone size-full wp-image-115" title="yard_0000_5" src="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/yard_0000_5.jpg" alt="" width="144" height="106" /></a></p>
<p style="text-align: center;"><a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/photogarithms5.swf"><object width="500" height="500" data="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/photogarithms5.swf" type="application/x-shockwave-flash"><param name="src" value="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/photogarithms5.swf" /></object></a></p>
<p style="text-align: center;"><a href="http://williamjacobson.com/weblog/wp-content/uploads/2009/01/photogarithms5.swf">Run Photo Decrapifier in a new window (useful since it can be resized)</a></p>
<h3 style="text-align: left;">Behind the Scenes</h3>
<p style="text-align: left;">In this version, there are three algorithms: Median, Modified Median, and Cluster. Median is the first method I tried, simply because it was simpler to implement. The median algorithm looks at corresponding pixels from each image and calculates the RGB distance of each pixel from white (0&#215;000000). It then sorts the pixels by distance and chooses the middle point (median). The following simplified example with non-RGB color values illustrates the algorithm.</p>
<p style="text-align: left;">Example 1:  Three desired/static and two undesired/transient pixels</p>
<pre style="text-align: left;">Pixel color values: 20, 25, 30, 250, 250
Mean Pixel: 115 (bad)
Median Pixel: 30 (good)</pre>
<p style="text-align: left;">Example 2:  Two desired/static and three undesired/transient pixels</p>
<pre>Pixel color values: 20, 25, 100, 175, 250
Mean Pixel: 114 (bad)
Median Pixel: 100 (bad)</pre>
<p>Notice that the median pixel algorithm can <em>usually</em> provide a good answer as long as there are more desired pixels than undesired pixels in the set. It can still fail though when two very different colors—one desired and one undesired—are both nearly the same RGB distance from white.</p>
<p>The modified median algorithm starts by calculating an average (mean) RGB value for the set of pixels. It then calculates the distance of each pixel from that average value and chooses the pixel closest to it. Again, the results are mediocre at best. As long as there are sufficiently more static than transient pixels, it&#8217;s fine, but as this method tends to err toward choosing the pixel closest to 50% gray, it is easy for undesired pixels at the edges of transient features (where antialiasing and blending occur) to be chosen. It can also suffer when very bright or dark pixels shift the value of the mean far away from the value of the static pixels. Both median and modified median algorithms fail easily when there are fewer total static pixels than transient ones.</p>
<p style="text-align: left;">To solve these deficiencies, I implemented a straightforward <a href="http://en.wikipedia.org/wiki/Agglomerative_hierarchical_clustering#Agglomerative_hierarchical_clustering">a</a><span class="mw-headline"><a href="http://en.wikipedia.org/wiki/Agglomerative_hierarchical_clustering#Agglomerative_hierarchical_clustering">gglomerative hierarchical clustering</a> algorithm. First, the RGB distances between each pair of image pixels is calculated. Then the two nearest pixels in RGB space are grouped into a cluster. The color of the cluster is updated to be the average of the colors of pixels in the cluster, and the distances of the other points to the cluster are updated. Then the next smallest distance between a pair is chosen. This could be a distance between two lone pixels, between an existing cluster and a lone pixel, or between two clusters. These  are then further clustered. This process is repeated until no two pixels (or clusters) are closer together than a threshold distance. </span></p>
<p style="text-align: left;"><span class="mw-headline">The algorithm then looks for the largest single cluster, which we assume will contain static pixels. It then draws the average color for the cluster. Note that it is no longer necessary that there be more total static pixels than total transient pixels. It is simply necessary that the size of a cluster of static pixels be larger then the next largest cluster, as the previous example demonstrates: </span></p>
<p style="text-align: left;">Example 2:  Two desired/static and three undesired/transient pixels</p>
<pre>Pixel color values: 20, 25, 100, 175, 250
Mean Pixel: 114 (bad)
Median Pixel: 100 (bad)
Clusters: (20, 25), (100), (175), (250)
Cluster Pixel: 22.5 (the average of 20 and 25) <strong>GOOD!</strong></pre>
<p>The cluster algorithm returns a much better color value than either the median or modified median algorithm. As long as the threshold value chosen is larger than 5 and smaller than 75, the static pixels will belong to the largest cluster, even though there are more total transient pixels. This is therefore a more robust algorithm.</p>
<p style="text-align: left;">
<h3 style="text-align: left;">Settings</h3>
<p style="text-align: left;">Distance Metric: Choose either the <a href="http://en.wikipedia.org/wiki/Manhattan_distance">Manhattan distance</a> or <a title="Euclidean distance" href="http://en.wikipedia.org/wiki/Euclidean_distance#Three-dimensional_distance">3D Euclidean_distance</a>.</p>
<p style="text-align: left;">Algorithm: Choose Median, Modified Median, or Cluster</p>
<p style="text-align: left;">Threshold: The percent of the maximum distance (the distance between white and black) beyond which two points will not be considered as being part of the same cluster. Small threshold values will result in many clusters with only a single pixel. Large values will create large clusters (possibly one cluster), and provide an average of both static and transient pixels (the result will simply be a blending of all images).</p>
<p style="text-align: left;">Show Unclustered: If checked, pixels drawn that were not part of a cluster of two or more pixels are colored pure blue. This is to help you choose the optimal threshold.</p>
<h3 style="text-align: left;">Possible Future Improvements</h3>
<ol>
<li> Try different color spaces than RGB, such as <a href="http://en.wikipedia.org/wiki/YUV">YUV</a>, which are theoretically more tuned to a person&#8217;s subjective perception of color than RGB.</li>
<li>Use a different <a href="http://en.wikipedia.org/wiki/Cluster_Analysis">clustering algorithm</a> such as spectral clustering or DBSCAN.</li>
<li>Add intelligence that takes into account the clustering choices made for pixels neighboring the one currently being evaluated. Use neighbor information to reduce discontinuities or act as a prior for choosing cluster points.</li>
</ol>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Photo%20Decrapifier&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Ftest-data-for-photogarithms%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/test-data-for-photogarithms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Drawing BitmapData to a Flex Canvas</title>
		<link>http://williamjacobson.com/weblog/drawing-bitmapdata-to-a-flex-canvas/</link>
		<comments>http://williamjacobson.com/weblog/drawing-bitmapdata-to-a-flex-canvas/#comments</comments>
		<pubDate>Sun, 25 Jan 2009 18:58:56 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Flex/Flash/ActionScript]]></category>
		<category><![CDATA[ActionScript3]]></category>
		<category><![CDATA[Bitmap]]></category>
		<category><![CDATA[BitmapData]]></category>
		<category><![CDATA[Canvas]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Image]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=117</guid>
		<description><![CDATA[I was having a hard time drawing a Flex BitmapData object (or Bitmap) to a canvas. Since neither of these objects are UIComponents, they cannot be added directly as children to a Canvas using the AddChild method-you&#8217;ll get a runtime error. After poking around the web, I quickly found a suggestion to simply add the [...]]]></description>
			<content:encoded><![CDATA[<p>I was having a hard time drawing a Flex BitmapData object (or Bitmap) to a canvas. Since neither of these objects are UIComponents, they cannot be added directly as children to a Canvas using the AddChild method-you&#8217;ll get a runtime error. After poking around the web, I quickly found a suggestion to simply add the Bitmap to a UIComponent like Sprite or Image and then add <em>that</em> to the Canvas. Like this:</p>
<pre>var myBitmap:Bitmap = new Bitmap(myBitmapData);
var myImage:Image = new Image();
myImage.addChild(myBitmap);
myCanvas.addChild(myImage);</pre>
<p>So this method will get your Bitmap/BitmapData onto the canvas. But then we have a new problem: if the image is larger than the canvas, the image will extend outside the limits of the canvas, even if the canvas has scrollbars enabled (the large image does not even activate the canvas scrollbars). This was no good for me. I wanted to be able to scroll the canvas to view the entire image.</p>
<p>The solution that worked better than the AddChild method above was to instead set the Image.source property to the Bitmap.  Like this:</p>
<pre>var myBitmap:Bitmap = new Bitmap(myBitmapData);
var myImage:Image = new Image();
myImage.source = myBitmap;
myCanvas.addChild(myImage);</pre>
<p>Presto! The BitmapData is displayed in the canvas and we get nice scrollbars.</p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Drawing%20BitmapData%20to%20a%20Flex%20Canvas&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Fdrawing-bitmapdata-to-a-flex-canvas%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/drawing-bitmapdata-to-a-flex-canvas/feed/</wfw:commentRss>
		<slash:comments>17</slash:comments>
		</item>
		<item>
		<title>Super Obama World on Rachel Maddow</title>
		<link>http://williamjacobson.com/weblog/super-obama-world-on-rachel-maddow/</link>
		<comments>http://williamjacobson.com/weblog/super-obama-world-on-rachel-maddow/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 15:07:52 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Super Obama World]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=72</guid>
		<description><![CDATA[You know you&#8217;ve reached the pinnacle of left-wing liberalism when you can get mentioned on MSNBC&#8217;s The Rachel Maddow Show. During the Just Enough segment near the end of the show, Kent Jones shows off Super Obama World. Hits to the Super Obama World website spike in response. Or, see the video clip here: Super [...]]]></description>
			<content:encoded><![CDATA[<p>You know you&#8217;ve reached the pinnacle of left-wing liberalism when you can get mentioned on MSNBC&#8217;s The Rachel Maddow Show. During the Just Enough segment near the end of the show, Kent Jones shows off Super Obama World. Hits to the Super Obama World website spike in response.</p>
<p><iframe height="339" width="425" src="http://www.msnbc.msn.com/id/22425001/vp/27601392#27601392" frameborder="0" scrolling="no"></iframe></p>
<p>Or, see the video clip here: <a title="Super Obama World on The Rachel Maddow Show" href="http://http://www.msnbc.msn.com/id/26315908/#27601392">Super Obama World on The Rachel Maddow Show</a></p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Super%20Obama%20World%20on%20Rachel%20Maddow&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Fsuper-obama-world-on-rachel-maddow%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/super-obama-world-on-rachel-maddow/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Super Obama World is Born</title>
		<link>http://williamjacobson.com/weblog/super-obama-world-is-born/</link>
		<comments>http://williamjacobson.com/weblog/super-obama-world-is-born/#comments</comments>
		<pubDate>Tue, 04 Nov 2008 15:38:20 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Super Obama World]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=66</guid>
		<description><![CDATA[Our newest project over at ZenSoft is Super Obama World (SOW). It&#8217;s done in the style of Super Mario World (SMW) which was released by Nintendo in 1990 and sold over 20 million copies. So even though technology has advanced somewhat since then, we wanted to preserve the quaint look and feel of SMW. For [...]]]></description>
			<content:encoded><![CDATA[<p>Our newest project over at <a title="Zensoft" href="http://www.zensoft.com">ZenSoft</a> is <a title="Super Obama World" href="http://superobamaworld.com">Super Obama World</a> (SOW). It&#8217;s done in the style of <a title="Super Mario World" href="http://http://en.wikipedia.org/wiki/Super_Mario_World">Super Mario World</a> (SMW) which was released by Nintendo in 1990 and sold over 20 million copies. So even though technology has advanced somewhat since then, we wanted to preserve the quaint look and feel of SMW.</p>
<div id="attachment_67" class="wp-caption aligncenter" style="width: 310px"><a href="http://williamjacobson.com/weblog/wp-content/uploads/2008/11/sow-title-640x480.png"><img class="size-medium wp-image-67" title="Super Obama World" src="http://williamjacobson.com/weblog/wp-content/uploads/2008/11/sow-title-640x480-300x225.png" alt="Title screen for Super Obama World" width="300" height="225" /></a><p class="wp-caption-text">Title screen for Super Obama World</p></div>
<p>For additional screenshots, visit the <a title="Super Obama World Screenshot Gallery" href="http://http://www.zensoft.com/games_online_sow_shots.html">Super Obama World Gallery</a>. I&#8217;ll save the details behind the game&#8217;s creation for a later post, but suffice it to say, my partner at ZenSoft, Robert Sundling, developed some amazing tools that let us do it.</p>
<p>After some long hours, we released the game on Tuesday, Novemeber 4, 2008. Election Day.</p>
<p>This first set of levels takes place in Alaska where Barack Obama pursues a rogue Sarah Palin. The three levels included in the Election Day Release include:</p>
<ul>
<li>&#8220;Thanks, But No Thanks&#8221; &#8211; Obama must avoid pigs with lipstick and lobbyists. Features the infamous <a title="Bridge To Nowhere" href="http://http://en.wikipedia.org/wiki/Gravina_Island_Bridge">Bridge to Nowhere</a>.</li>
</ul>
<ul>
<li>&#8220;For Everything Else, There&#8217;s The RNC&#8221; &#8211; A spoof on the Mastercard slogan, this is a reference to the reported $150,000 clothing purchases for Sarah Palin and her family. Watch out for the clothing salespeople. Features storefronts of Macy&#8217;s, Neiman Marcus, and Saks Fifth Avenue.</li>
</ul>
<ul>
<li>&#8220;I Can See Russia From My House&#8221; &#8211; Sarah Palin famously mentioned how one could see Russia from Alaska (<a title="You Can See Russia From Alaska" href="http://http://www.slate.com/id/2200155/">technically true</a>), so we created a level where St. Basil&#8217;s Cathedral features prominently. Avoid pit bulls with lipstick and obnoxious Russians. Sarah Palin herself makes an appearance (foreshadowing) on her &#8220;snow machine&#8221;.</li>
</ul>
<p>We intend to add a few more levels and a few features to this initial set of levels. I&#8217;ll write about them soon.</p>
<p>The first few levels we released include &#8220;Thanks, But No Thanks&#8221; (featuring a</p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Super%20Obama%20World%20is%20Born&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Fsuper-obama-world-is-born%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/super-obama-world-is-born/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pictoart in People Magazine</title>
		<link>http://williamjacobson.com/weblog/pictoart-in-people-magazine/</link>
		<comments>http://williamjacobson.com/weblog/pictoart-in-people-magazine/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 20:02:48 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Pictoart]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=59</guid>
		<description><![CDATA[Pictoart.com was mentioned in the June, 2008 People Magazine Country Special Issue. They were doing a story about Clint Black&#8217;s house (the article is several pages long, not all shown here, because, really, who cares about Clint Black?) and wanted to include a space-filler about how you (someone with less money than Clint Black) can [...]]]></description>
			<content:encoded><![CDATA[<p>Pictoart.com was mentioned in the June, 2008 People Magazine Country Special Issue. They were doing a story about Clint Black&#8217;s house  (the article is several pages long, not all shown here, because, really, who cares about Clint Black?) and wanted to include a space-filler about how you (someone with less money than Clint Black) can have some of the random elements from Clint Black&#8217;s house even though you are not famous, rich, or important. Enter Pictoart.com. Although Clint Black spent thousands to have an original pop art painting done of his family, you can get something similar for a fraction of the price!</p>
<p>Anyway, any publicity is worth it, particularly the kind in a national magazine that doesn&#8217;t cost you anything.</p>
<p><a title="cover.jpg" href="http://williamjacobson.com/weblog/wp-content/uploads/2008/06/cover.jpg"><img src="http://williamjacobson.com/weblog/wp-content/uploads/2008/06/cover.jpg" alt="cover.jpg" width="486" height="648" /></a></p>
<p><a title="page.jpg" href="http://williamjacobson.com/weblog/wp-content/uploads/2008/06/page.jpg"><img src="http://williamjacobson.com/weblog/wp-content/uploads/2008/06/page.jpg" alt="page.jpg" width="480" height="643" /></a></p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Pictoart%20in%20People%20Magazine&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Fpictoart-in-people-magazine%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/pictoart-in-people-magazine/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Dinosaurs!</title>
		<link>http://williamjacobson.com/weblog/dinosaurs/</link>
		<comments>http://williamjacobson.com/weblog/dinosaurs/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 12:14:35 +0000</pubDate>
		<dc:creator>braincog</dc:creator>
				<category><![CDATA[Family Journal]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=43</guid>
		<description><![CDATA[The Matthews Record wanted an article about the new Dinosaur Exhibit at Discovery Place. So I volunteered. Special thanks to Bob Sundling for the good turkey foot joke.]]></description>
			<content:encoded><![CDATA[<p>The Matthews Record wanted an article about the new Dinosaur Exhibit at Discovery Place. So I volunteered. Special thanks to Bob Sundling for the good turkey foot joke.</p>
<p><a title="Dinoarticle" href="http://williamjacobson.com/weblog/wp-content/uploads/2008/04/dinoarticle.jpg"><img src="http://williamjacobson.com/weblog/wp-content/uploads/2008/04/dinoarticle.jpg" alt="Dinoarticle" width="420" height="652" /></a></p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Dinosaurs%21&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Fdinosaurs%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/dinosaurs/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Amanda&#8217;s Adventure in the Middle East &#8211; Final!</title>
		<link>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-final/</link>
		<comments>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-final/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 02:44:10 +0000</pubDate>
		<dc:creator>Amanda</dc:creator>
				<category><![CDATA[Amanda's India Trip]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=29</guid>
		<description><![CDATA[I woke up at 6am. Sounds better than 4 or 5 am, but remember I didn’t get to sleep until 1:15am. I was still pretty tired. Today is going to be a pretty big day. We were heading to a strategic partner of the bank’s and then an afternoon of interviewing all of the bank [...]]]></description>
			<content:encoded><![CDATA[<p>I woke up at 6am. Sounds better than 4 or 5 am, but remember I didn’t get to sleep until 1:15am. I was still pretty tired. Today is going to be a pretty big day. We were heading to a strategic partner of the bank’s and then an afternoon of interviewing all of the bank associates living in Bangalore. Then David and I were flying out at 2am in the morning. I was so excited. I got dressed and put on my fancy pearls that I bought yesterday. I headed down to breakfast at 8:15 and met up with the rest of my party. Thankfully it wasn’t raining anymore so I was able to enjoy a leisurely walk to the main building. I made a mental note to look around the grounds later that day. Breakfast was okay. I was tired of eggs and toast every day but decided since I couldn’t have the fruit that it would have to do for one more day.</p>
<p>We headed out to the cars at 9:15 and drove to the building for our morning meeting. It was about 10 minutes away, which was great. We entered and had to go through security to get in. Then they did a little ceremony for us by putting stuff on our forehead and giving us a pashmina. (Little did they know that we had gone shopping for pashminas the day before and knew that they had given us the cheapest kind.) We had decided to go visit the production floors first and then we headed back to the conference room for discussion. The meetings finished and we headed back to the hotel. We were meeting up with seven folks for lunch that are ex-patriots for the Bank living in Bangalore. We headed for the hotel conference room and introduced ourselves. I was already starting to feel a little icky. I asked where the bathroom was and found out that it was a door in the conference room itself. I could NOT go to the bathroom in there right next to where everyone was sitting. And of course I was the only female again. No surprises there. We had lunch and had our meeting. I was dying in the meeting but refused to use the bathroom. Thank gosh they finally had a break. I took the opportunity to run to my hotel room. The meeting wrapped up about an hour later. I was ready to be alone for a while. I said my good-byes to everyone that we had met and to the rest of the party that we had traveled with from Hyderabad.</p>
<p>Everyone except David and I were heading to Gurgaon. David and I decided to meet around 5:30 at the hotel bar. That was a whole hour and a half of alone time. I pulled out more Chex Mix but I was just feeling kind of queasy. Every time I ate, my stomach would make weird noises and would feel icky. I didn’t think too much of it as I watched American sitcoms. I was so ready to leave and be back in my own house. I showered, changed and went out for a look around the the grounds before meeting David. We went to the outdoor bar and enjoyed some drinks and good conversation. During the drinks, the restaurant decided to fumigate for mosquitoes. They never even asked us to move. We and our drinks ended up surrounded by toxic chemicals. I am sure that shaved at least a day off my life. We decided to eat at the open air Vietnamese restaurant next to the bar. It was pretty good and an enjoyable last meal in India. But we were definitely ready to go home. We headed back to our rooms to finish packing. We met back at the main hotel building to check-out at 10:30.</p>
<p>We took our final ride to the airport. It was pretty uneventful. The action started when we arrived at the airport. The traffic was terrible, but I have come to realize that the airports are the grand central stations of the cities in India. There are always so many people there! We sat in traffic for a while and finally got out of the car and walked the rest of the way to the international terminal. We showed our itineraries to get into the terminal and headed for the checked baggage security booth. Then we headed to check-in. It was here that I found out that I could only take one carry-on bag and that it could only be a certain weight. So I had to transfer stuff to checked luggage in the middle of the floor in the airport before they would let me check-in. But I still had two bags. So then I had to squeeze my laptop bag into my other bag before they would even think about letting me by. I got the evil eye when the bag wouldn&#8217;t zip but at least they let me through. Then it was off to immigration. We made it through without any issues and then it was to the security checkpoint. Again it was the same thing, separate lines for men and women. I made it through in about 5 minutes while it took David about 20 minutes. Then it was time to wait and wait and wait and wait. By this time it was 11:45 and we still had over two hours before we boarded the plane. I was not feeling that well and unfortunately for me, I ended up feeling really terrible while we sat there. I used the bathroom once but it was an even worse experience than the first airport bathroom excursion. So for the rest of the wait it was breathing exercises and small 5 min catnaps.</p>
<p>Finally it was time to board the plane. I was so tired and sick by this point, I could hardly stand up. I found my seat and fell asleep almost right after take off. I slept for about 6 of the 8 hours of the flight. They would bring food but I couldn&#8217;t even take the smell let alone eat it. We arrived in Frankfurt Germany at about 7:30 in the morning. We headed to the business lounge again for some breakfast, bathrooms, and comfy chairs. I tried to eat half of a banana but that didn&#8217;t go that well. I was so sick. The layover was only 3 hours but felt like a lifetime. Finally it was time to board for the second flight from Frankfurt to Charlotte. This flight was the longest flight of my life. It was clear to me that I was extremely sick. I couldn&#8217;t eat, sleep, watch TV, or listen to music. Everything that I did (and that includes moving from side to side, adjusting the chair, etc) would cause me to be more sick. I spent the entire flight going to the bathroom and holding the vomit bag.</p>
<p>By the time I got off of the flight, I couldn&#8217;t stand up straight. David was extremely nice and carried my carry-ons for me until I got to immigration. Then I headed as fast as I could through baggage claim and to the bus pick-up for the remote lot. I was delirious by this point. I probably shouldn&#8217;t have driven home but I just wanted to be there as fast as possible. Everything is better when you are with your family and in your own home. I called Bill and talked to him the entire way home. I think that is the only way I made it. I was doubled over in pain and crying the entire drive.</p>
<p>I&#8217;ll bet that you were expecting a really happy ending to my trip with full resolution and closure. I should be talking about all of the things that I was yearning to eat for the entire trip and how great it was to get back and eat anything that I wanted. Well, I hope that David got his Diet Pepsi with ice that very weekend. I finally got to eat a burrito and drink some Smirnoff Ice just this past weekend, 4 weekends after I returned. Finally, I have closure to my great adventure!</p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Amanda%26%238217%3Bs%20Adventure%20in%20the%20Middle%20East%20%26%238211%3B%20Final%21&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Famandas-adventure-in-the-middle-east-final%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-final/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Amanda&#8217;s Adventure in the Middle East &#8211; Part 7</title>
		<link>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-part-7/</link>
		<comments>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-part-7/#comments</comments>
		<pubDate>Wed, 22 Aug 2007 01:29:29 +0000</pubDate>
		<dc:creator>Amanda</dc:creator>
				<category><![CDATA[Amanda's India Trip]]></category>

		<guid isPermaLink="false">http://williamjacobson.com/weblog/?p=24</guid>
		<description><![CDATA[Thursday morning I was up early again at 5am. I read and tried to get more sleep but it wasn&#8217;t happening. So I got up and packed. We were leaving today to fly to Bangalore. Do you how you get to a certain point in a trip and you know that it is time to [...]]]></description>
			<content:encoded><![CDATA[<p>Thursday morning I was up early again at 5am.  I read and tried to get more sleep but it wasn&#8217;t happening.  So I got up and packed.  We were leaving today to fly to Bangalore.</p>
<p>Do you how you get to a certain point in a trip and you know that it is time to go home?  Well today was the day for me.  I was so tired from not being able to sleep the entire night, I was feeling sick, and I was ready to see my family.  Even now writing this, I remember how ready I was. We packed our bags into the car and headed to the office.  I wanted to make the most of the hour drive to the office so I decided today was the day to take as many pictures as I could on the drive.  This was good because it allowed me get pictures that I wouldn&#8217;t be able to get any other time during the day.  It was also REALLY bad.   It turns out that taking tons of pictures while the car is moving, having a history of car sickness, and already feeling a bit sick, MAKES YOU FEEL VERY SICK! About 2/3 of the way through the drive, I had to stop taking pictures, roll down the window and start breathing exercises.</p>
<p>Luckily I made it through the car drive but as soon as we got to the building, I had to go to the bathroom.  But it is not that easy.  First you have to make it through security.  Everything needs to be tagged and checked.  I asked the security guard where the bathroom was but he didn&#8217;t understand me and took us to the conference room instead.  Then I had to ask another person where the bathroom was on this floor.  But as soon as I got into the bathroom the smell was so bad that I couldn&#8217;t be in there either because it just made me more nauseous.  So the only thing that I could do was sit in the conference room and let it pass.  Luckily, David came in the conference room only a short time later bringing some water.  That helped a ton. <span style="font-family: Georgia">So I could tell that it was going to be a long day.  We had our meetings and unfortunately several did not go well.  We were late for lunch but got it just before they took it away.  I&#8217;ll bet that you couldn&#8217;t guess what was on the menu&#8230;. Indian food anyone?  By now, I couldn&#8217;t tolerate Indian food so I picked out three pieces of bread.  But wouldn&#8217;t you know it, even eating bread has a story.  None of the lunches that we had at work provided knives.  I asked if there were any knives and they said no.  Typically, their food doesn&#8217;t require the extensive use of knives and a they don&#8217;t eat alot of bread and butter.  So I had to literally dip my bread into small butter packets to get butter on my bread.  It was par for the course.</span></p>
<p>The rest of the meetings didn&#8217;t get any better.  I really wanted to get a picture of the Q&amp;P team so we had to figure out how to do it.  I brought my camera but they wouldn&#8217;t let me use it.  So we had to use security&#8217;s camera and a security guard had to actually take the pictures.  But at least we were able to get some pics out of the deal. David and I had decided earlier in the week that we would have to leave a bit early to go shopping this afternoon before we headed to the airport one more time.  We hadn&#8217;t picked up stuff for our families yet.  So today was the day.  After our picture, we said our goodbyes and headed out to the car.  The admin had given directions to the driver for the two places we were going shopping.  Hopefully the driver would do better than he did driving us to the Waterfront last night.</p>
<p>He got us to the first place.  It was a little shop in a long line of shops.  It had the usual Indian tourist stuff, elephants, jewelry boxes, rugs, and pashminas.  All of the lights were off and as we entered the lower level lights all came on and several people appeared to help us out.  They would show us anything and everything.  I really wanted a pashmina so I was led upstairs.  The room was completely covered with scarves.  Piles all over the floor, on shelves and on showcases.  It was incredible.  The salesman started to tell us all of the different scarves.  Each was a different blend of wool and cotton.  He showed us silk ones, printed ones and single color ones.  There was a never ending sample of colors for each type of scarf.  It was so overwhelming.  I selected a high end scarf in a beautiful brown color. I had decided that this trip that I was not going to by crap.  I wanted to buy good quality items that I would continue to have as keepsakes.  I don&#8217;t know if I will ever get a chance to head to India again.</p>
<p>I headed downstairs with my first choice.  I was now on a mission for something for Ashelynn and Bill.  I found some cute little jewelry boxes made out of mud.  They had been dyed and decorated with stones.  It was lined with a beautiful red fabric.  It worked for Ashelynn.  Then was the biggest problem.  What do I get Bill?  He is tough because he doesn&#8217;t like stuff just for the sake of getting something.  And nothing seemed special or right.  I finally broke down and asked David what he would like and mentioned that one of the sales people that worked with him had shown him some meditation bowls.  This could be a possibility.  The salesperson pulled out several types of mediation bowls and showed me how it worked.  Each bowl comes with a wooden stick and together they looked like a mortar and pestle.  He held the bowl in his palm with no fingers touching and then used the wooden stick to circle the outside of the lip of the bowl.  It started to make a high pitched sound and you could feel the vibration going up your arm.  This was great!  This was exactly the right gift for Bill.  Unfortunately, now the salesperson started to try and upsell me.  There were a number of different types of bowls ranging in price up to about $300.  I couldn&#8217;t spend that much so I decided to head to the lower end of the scale.  I had to be firm otherwise I would still be standing there now.  This guy was so persistent. We paid for our items and then headed to the next shop.  It was time to shop for pearls.</p>
<p>Hyderabad is known for its pearls so everyone who visits has to go through this ritual.  We were taken to the shop that gives a Bank of America discount.  We were quickly ushered inside to a part of a table.  We had one main salesman that had two helpers that jumped at his beck and call. First it was bracelets.  All different colors, sizes of pearls in different configurations.  Everything was configurable on the spot.  I found a beautiful bracelet and passed on the other bracelet choices.  Next it was necklaces.  I really did not want a strand of pearls.  I am not the kind of person who can wear a strand of pearls.  So I asked for other configurations with pearls spread out around the necklace.  He pulled out styles after styles.  Then he started adding earrings to the mix.  Box after box was taken out.  Finally I found a necklace that was my style.  It was what I had asked for earlier but I didn&#8217;t communicate it appropriately.  I tried it on and they said that it was too long.  So one of the lackies took off two pearls and some of the gold and brought it back in 10 mins.  I tried it on again and he decided to take off alittle bit more.  Once more they brought it back and decided that it just needed two gold extenders added.  Finally it was perfect.  We paid for it and headed for the door.</p>
<p>The driver took us to the airport.  It was our turn to negotiate the Indian airports by ourselves.  Some of our team would be meeting us at the airport to fly with us, but we were arriving separately.  Luckily, we remembered to have the admin check us in beforehand so we had our tickets to get into the airport.  We looked for the security areas to put our checked luggage through.  Then someone grabbed my bags to help me to the check-out area.  But I didn&#8217;t want any help so I didn&#8217;t tip him.  I was tired of all of the tipping.  We didn&#8217;t have to show any id this time to drop off our checked luggage and get tags for our carry-ons.  Then we headed to the carry-on security area.  Again there were separate lines for women and men.  We headed through and found a place to sit.  We were about 45 minutes early.  So we pulled out our computers and started working. I went to the bathroom before we boarded the plane and it was what I thought was the worst bathroom experience that I have ever had.  I know that I complained about those bathrooms on the way to the Taj but they didn&#8217;t hold a candle to the nastiness of the public bathrooms at the airport.  There was again a personal attendant in the bathroom but as far as I could tell she was NOT doing her job.  There was filth everywhere.  I didn&#8217;t want to sit on the toilet and there was NO toilet paper or paper towels.  There was NO soap either.  I was not tipping for this.  I felt so violated.  I ran back to David to ask for his baby wipes and hand sanitizer.  Note to self, NEVER use the airport bathroom!!!!</p>
<p>Finally they called our plane and we got in the lone disorderly line and headed for the buses that take you to the tarmac.  It was a tiny, tiny plane.  We boarded and got our mango juice and headed to our seats.  There was no way that I was drinking this or eating anything on this flight.  I listened to my MP3 player and read.  I still wasn&#8217;t feeling the best and it was an uncomfortable flight.  I was feeling faint so I decided to at least have some water.  That made me feel a bit better.  Finally we landed and headed to get our bags.  Our colleagues had made the flight so we caught up with them at the baggage claim.  Our hotel was already there to escort us to our cars.  Bangalore was exactly the same as the other cities from an airport point of view.  Lots of people and lots of cars honking outside.  We were waiting for our cars when it start thundering.  Our hotel actually brought an umbrella for us to stand under just as it started raining.  Now it is the monsoon season in July but I was already exhausted from the trip and didn&#8217;t need the additional complexity of rain at this point.  But I was over ruled by the gods and just dealt with it.  The first car came and Ruben and I rode together.  We chatted as we raced down the street.  It was already dark so there was not much looking at the sights.</p>
<p>Once we arrived at the hotel 30 mins later, we were in a downpour.  This normally would not be an issue but the <a href="http://www.tajhotels.com/Luxury/THE%20TAJ%20WEST%20END,BANGALORE/" target="_blank" title="Taj West End">Taj West End </a>was a British style hotel with villa like buildings placed throughout its lush acreage. We waited until the porte-cochere was clear then we drove under. We checked into the hotel and headed for the bar. Unfortunately, the bar closed at 11:30. I was feeling pretty tired but it is always good to socialize with your business partners. We headed out at around 12:15. There was no way to get to our rooms without notifying the hotel staff. No rooms were actually attached to the main building. Ruben and I had different rooms in the same bungalow so they loaded all of our luggage into a car and we were off.<br />
It was just a short drive later when we reached our building. The hotel staff was running around with umbrellas trying to get us in the building without getting wet. The building was all open in the middle with rooms on either side. There was also a staircase to the second floor with rooms on either side again. We climbed the very wet stairs and headed for our rooms. The hotel guy tried to get me in my room first but guess what? You guessed it, my key didn’t work again! Ruben’s did so he was in his room enjoying some alone time and I was waiting for the hotel guy to go all the way back to the main building to get me another key. I had to go to the bathroom VERY badly but instead I was sitting on a wet wicker chair, watching the rain and waiting for the key. 10 minutes later, the hotel guy was back and I was finally ushered into my room. But of course the hotel guy couldn’t just let me be. He had to show me around. Finally, he left and I was alone! I hadn’t eaten anything except bread at lunchtime so I was so hungry. I pulled out the Chex Mix and a granola bar for dinner. I was planning on getting a good night’s sleep and I didn’t want to be waking up because I was hungry. Finally at 1:15, I was able to go to sleep. I dreamt that I was heading home… tomorrow is the last day! Yeah!</p>
<div class="addtoany_share_save_container"><ul class="addtoany_list"><li><a class="a2a_dd addtoany_share_save" href="http://www.addtoany.com/share_save?sitename=William%20Jacobson%20%28.com%29&amp;siteurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2F&amp;linkname=Amanda%26%238217%3Bs%20Adventure%20in%20the%20Middle%20East%20%26%238211%3B%20Part%207&amp;linkurl=http%3A%2F%2Fwilliamjacobson.com%2Fweblog%2Famandas-adventure-in-the-middle-east-part-7%2F"><img src="http://williamjacobson.com/weblog/wp-content/plugins/add-to-any/share_save_256_24.png" width="256" height="24" alt="Share/Save/Bookmark"/></a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://williamjacobson.com/weblog/amandas-adventure-in-the-middle-east-part-7/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

